From 81b81cf60b2c1771791b92250f07bcbee86190d4 Mon Sep 17 00:00:00 2001 From: Alonso Guevara Date: Mon, 1 Jul 2024 15:25:30 -0600 Subject: [PATCH] Initial Release --- .github/dependabot.yml | 19 + .github/pull_request_template.md | 36 + .github/workflows/gh-pages.yml | 95 + .github/workflows/javascript-ci.yml | 30 + .github/workflows/python-ci.yml | 122 + .github/workflows/python-publish.yml | 56 + .github/workflows/semver.yml | 15 + .github/workflows/spellcheck.yml | 15 + .gitignore | 67 + .../minor-20240701200021928520.json | 4 + .vscode/extensions.json | 11 + .vscode/launch.json | 12 + .vscode/settings.json | 52 + .vsts-ci.yml | 41 + CODEOWNERS | 6 + CODE_OF_CONDUCT.md | 9 + CONTRIBUTING.md | 79 + DEVELOPING.md | 85 + LICENSE | 21 + RAI_TRANSPARENCY.md | 41 + README.md | 52 + SECURITY.md | 37 + SUPPORT.md | 27 + cspell.config.yaml | 33 + dictionary.txt | 143 + docsite/.eleventy.js | 25 + docsite/.eleventyignore | 2 + docsite/.gitignore | 6 + docsite/.yarn/releases/yarn-4.0.2.cjs | 893 +++ docsite/.yarn/sdks/integrations.yml | 5 + docsite/.yarnrc.yml | 7 + docsite/_includes/page.css | 115 + docsite/_includes/page.njk | 164 + docsite/data/operation_dulce/ABOUT.md | 3 + .../operation_dulce/Operation Dulce v2 1 1.md | 970 ++++ docsite/img/GraphRag-Figure1.jpg | Bin 0 -> 62215 bytes docsite/img/pipeline-running.png | Bin 0 -> 96578 bytes docsite/index.md | 61 + docsite/nbdocsite_template/conf.json | 5 + docsite/nbdocsite_template/index.md.j2 | 94 + docsite/package.json | 18 + docsite/posts/config/custom.md | 168 + docsite/posts/config/env_vars.md | 217 + docsite/posts/config/init.md | 38 + docsite/posts/config/json_yaml.md | 221 + docsite/posts/config/overview.md | 21 + docsite/posts/config/template.md | 174 + docsite/posts/developing.md | 90 + docsite/posts/get_started.md | 130 + docsite/posts/index/0-architecture.md | 73 + docsite/posts/index/1-default_dataflow.md | 218 + docsite/posts/index/2-cli.md | 26 + docsite/posts/index/overview.md | 82 + .../posts/prompt_tuning/auto_prompt_tuning.md | 72 + .../prompt_tuning/manual_prompt_tuning.md | 60 + docsite/posts/prompt_tuning/overview.md | 26 + docsite/posts/query/0-global_search.md | 78 + docsite/posts/query/1-local_search.md | 67 + docsite/posts/query/2-question_generation.md | 28 + docsite/posts/query/3-cli.md | 48 + docsite/posts/query/notebooks/overview.md | 13 + docsite/posts/query/overview.md | 31 + docsite/yarn.lock | 2793 +++++++++ examples/README.md | 19 + examples/__init__.py | 2 + examples/custom_input/__init__.py | 2 + examples/custom_input/pipeline.yml | 24 + examples/custom_input/run.py | 46 + .../custom_set_of_available_verbs/__init__.py | 2 + .../custom_verb_definitions.py | 22 + .../pipeline.yml | 7 + examples/custom_set_of_available_verbs/run.py | 84 + .../__init__.py | 2 + .../custom_workflow_definitions.py | 36 + .../pipeline.yml | 4 + .../custom_set_of_available_workflows/run.py | 85 + examples/entity_extraction/__init__.py | 2 + .../with_graph_intelligence/__init__.py | 2 + .../with_graph_intelligence/pipeline.yml | 16 + .../with_graph_intelligence/run.py | 111 + .../entity_extraction/with_nltk/__init__.py | 2 + .../entity_extraction/with_nltk/pipeline.yml | 6 + examples/entity_extraction/with_nltk/run.py | 78 + examples/interdependent_workflows/__init__.py | 2 + .../interdependent_workflows/pipeline.yml | 23 + examples/interdependent_workflows/run.py | 102 + examples/multiple_workflows/__init__.py | 2 + examples/multiple_workflows/pipeline.yml | 4 + examples/multiple_workflows/run.py | 43 + .../workflows/shared/shared_fill_value.txt | 1 + .../workflows/workflow_1.yml | 6 + .../workflows/workflow_2.yml | 17 + .../workflows/workflow_3.yml | 6 + examples/single_verb/__init__.py | 2 + examples/single_verb/input/data.csv | 3 + examples/single_verb/pipeline.yml | 12 + examples/single_verb/run.py | 77 + examples/use_built_in_workflows/__init__.py | 2 + examples/use_built_in_workflows/pipeline.yml | 23 + examples/use_built_in_workflows/run.py | 117 + .../various_levels_of_configs/__init__.py | 2 + .../pipelines/workflows_and_inputs.yml | 64 + .../pipelines/workflows_only.yml | 46 + .../workflows_and_inputs.py | 40 + ...rkflows_and_inputs_with_custom_handlers.py | 131 + .../workflows_only.py | 59 + examples_notebooks/global_search.ipynb | 264 + .../inputs/operation dulce/ABOUT.md | 3 + .../operation dulce/Operation Dulce v2 1 1.md | 970 ++++ .../create_final_community_reports.parquet | Bin 0 -> 71337 bytes .../create_final_covariates.parquet | Bin 0 -> 38473 bytes .../create_final_entities.parquet | Bin 0 -> 2271498 bytes .../create_final_nodes.parquet | Bin 0 -> 54835 bytes .../create_final_relationships.parquet | Bin 0 -> 20389 bytes .../create_final_text_units.parquet | Bin 0 -> 94690 bytes examples_notebooks/local_search.ipynb | 465 ++ graphrag/__init__.py | 4 + graphrag/config/__init__.py | 123 + graphrag/config/create_graphrag_config.py | 610 ++ graphrag/config/defaults.py | 97 + graphrag/config/enums.py | 115 + graphrag/config/environment_reader.py | 154 + graphrag/config/errors.py | 40 + graphrag/config/input_models/__init__.py | 50 + .../config/input_models/cache_config_input.py | 18 + .../input_models/chunking_config_input.py | 15 + .../claim_extraction_config_input.py | 18 + .../cluster_graph_config_input.py | 13 + .../community_reports_config_input.py | 17 + .../input_models/embed_graph_config_input.py | 18 + .../entity_extraction_config_input.py | 17 + .../global_search_config_input.py | 16 + .../input_models/graphrag_config_input.py | 49 + .../config/input_models/input_config_input.py | 27 + .../config/input_models/llm_config_input.py | 18 + .../input_models/llm_parameters_input.py | 31 + .../input_models/local_search_config_input.py | 18 + .../parallelization_parameters_input.py | 13 + .../input_models/reporting_config_input.py | 18 + .../input_models/snapshots_config_input.py | 14 + .../input_models/storage_config_input.py | 18 + .../summarize_descriptions_config_input.py | 16 + .../text_embedding_config_input.py | 23 + .../config/input_models/umap_config_input.py | 12 + graphrag/config/models/__init__.py | 48 + graphrag/config/models/cache_config.py | 29 + graphrag/config/models/chunking_config.py | 36 + .../config/models/claim_extraction_config.py | 51 + .../config/models/cluster_graph_config.py | 28 + .../config/models/community_reports_config.py | 46 + graphrag/config/models/embed_graph_config.py | 48 + .../config/models/entity_extraction_config.py | 48 + .../config/models/global_search_config.py | 33 + graphrag/config/models/graph_rag_config.py | 146 + graphrag/config/models/input_config.py | 60 + graphrag/config/models/llm_config.py | 27 + graphrag/config/models/llm_parameters.py | 75 + graphrag/config/models/local_search_config.py | 39 + .../models/parallelization_parameters.py | 21 + graphrag/config/models/reporting_config.py | 30 + graphrag/config/models/snapshots_config.py | 25 + graphrag/config/models/storage_config.py | 30 + .../models/summarize_descriptions_config.py | 41 + .../config/models/text_embedding_config.py | 46 + graphrag/config/models/umap_config.py | 17 + graphrag/config/read_dotenv.py | 25 + graphrag/index/__init__.py | 78 + graphrag/index/__main__.py | 80 + graphrag/index/bootstrap.py | 28 + graphrag/index/cache/__init__.py | 18 + graphrag/index/cache/json_pipeline_cache.py | 64 + graphrag/index/cache/load_cache.py | 51 + graphrag/index/cache/memory_pipeline_cache.py | 83 + graphrag/index/cache/noop_pipeline_cache.py | 65 + graphrag/index/cache/pipeline_cache.py | 67 + graphrag/index/cli.py | 293 + graphrag/index/config/__init__.py | 69 + graphrag/index/config/cache.py | 82 + graphrag/index/config/input.py | 120 + graphrag/index/config/pipeline.py | 64 + graphrag/index/config/reporting.py | 77 + graphrag/index/config/storage.py | 72 + graphrag/index/config/workflow.py | 34 + graphrag/index/context.py | 42 + graphrag/index/create_pipeline_config.py | 548 ++ graphrag/index/emit/__init__.py | 21 + graphrag/index/emit/csv_table_emitter.py | 33 + graphrag/index/emit/factories.py | 41 + graphrag/index/emit/json_table_emitter.py | 34 + graphrag/index/emit/parquet_table_emitter.py | 54 + graphrag/index/emit/table_emitter.py | 15 + graphrag/index/emit/types.py | 14 + graphrag/index/errors.py | 25 + graphrag/index/graph/__init__.py | 4 + graphrag/index/graph/embedding/__init__.py | 8 + graphrag/index/graph/embedding/embedding.py | 41 + graphrag/index/graph/extractors/__init__.py | 20 + .../index/graph/extractors/claims/__init__.py | 9 + .../extractors/claims/claim_extractor.py | 245 + .../index/graph/extractors/claims/prompts.py | 61 + .../extractors/community_reports/__init__.py | 35 + .../community_reports/build_mixed_context.py | 69 + .../community_reports_extractor.py | 107 + .../prep_community_report_context.py | 181 + .../extractors/community_reports/prompts.py | 150 + .../extractors/community_reports/schemas.py | 52 + .../community_reports/sort_context.py | 156 + .../extractors/community_reports/utils.py | 53 + .../index/graph/extractors/graph/__init__.py | 18 + .../graph/extractors/graph/graph_extractor.py | 300 + .../index/graph/extractors/graph/prompts.py | 107 + .../graph/extractors/summarize/__init__.py | 12 + .../description_summary_extractor.py | 135 + .../graph/extractors/summarize/prompts.py | 19 + graphrag/index/graph/utils/__init__.py | 9 + .../index/graph/utils/normalize_node_names.py | 14 + graphrag/index/graph/utils/stable_lcc.py | 60 + .../index/graph/visualization/__init__.py | 14 + .../visualization/compute_umap_positions.py | 144 + graphrag/index/graph/visualization/typing.py | 27 + graphrag/index/init_content.py | 156 + graphrag/index/input/__init__.py | 8 + graphrag/index/input/csv.py | 131 + graphrag/index/input/load_input.py | 85 + graphrag/index/input/text.py | 55 + graphrag/index/llm/__init__.py | 14 + graphrag/index/llm/load_llm.py | 311 + graphrag/index/llm/types.py | 10 + graphrag/index/load_pipeline_config.py | 79 + graphrag/index/progress/__init__.py | 8 + graphrag/index/progress/rich.py | 165 + graphrag/index/progress/types.py | 128 + graphrag/index/py.typed | 2 + graphrag/index/reporting/__init__.py | 18 + .../reporting/blob_workflow_callbacks.py | 108 + .../reporting/console_workflow_callbacks.py | 32 + .../reporting/file_workflow_callbacks.py | 67 + .../index/reporting/load_pipeline_reporter.py | 47 + .../reporting/progress_workflow_callbacks.py | 54 + graphrag/index/run.py | 463 ++ graphrag/index/storage/__init__.py | 19 + .../index/storage/blob_pipeline_storage.py | 371 ++ .../index/storage/file_pipeline_storage.py | 163 + graphrag/index/storage/load_storage.py | 40 + .../index/storage/memory_pipeline_storage.py | 79 + graphrag/index/storage/typing.py | 80 + graphrag/index/text_splitting/__init__.py | 34 + .../index/text_splitting/check_token_limit.py | 15 + .../index/text_splitting/text_splitting.py | 244 + graphrag/index/typing.py | 20 + graphrag/index/utils/__init__.py | 27 + graphrag/index/utils/dataframes.py | 61 + graphrag/index/utils/dicts.py | 18 + graphrag/index/utils/ds_util.py | 32 + graphrag/index/utils/hashing.py | 14 + graphrag/index/utils/is_null.py | 19 + graphrag/index/utils/json.py | 25 + graphrag/index/utils/load_graph.py | 11 + graphrag/index/utils/string.py | 19 + graphrag/index/utils/tokens.py | 33 + graphrag/index/utils/topological_sort.py | 12 + graphrag/index/utils/uuid.py | 14 + graphrag/index/verbs/__init__.py | 50 + graphrag/index/verbs/covariates/__init__.py | 8 + .../covariates/extract_covariates/__init__.py | 8 + .../extract_covariates/extract_covariates.py | 110 + .../extract_covariates/strategies/__init__.py | 4 + .../strategies/graph_intelligence/__init__.py | 8 + .../strategies/graph_intelligence/defaults.py | 21 + .../run_gi_extract_claims.py | 105 + graphrag/index/verbs/covariates/typing.py | 52 + graphrag/index/verbs/entities/__init__.py | 9 + .../verbs/entities/extraction/__init__.py | 8 + .../entities/extraction/entity_extract.py | 202 + .../extraction/strategies/__init__.py | 4 + .../strategies/graph_intelligence/__init__.py | 8 + .../strategies/graph_intelligence/defaults.py | 25 + .../run_graph_intelligence.py | 141 + .../entities/extraction/strategies/nltk.py | 61 + .../entities/extraction/strategies/typing.py | 44 + .../verbs/entities/summarize/__init__.py | 8 + .../summarize/description_summarize.py | 207 + .../entities/summarize/strategies/__init__.py | 8 + .../strategies/graph_intelligence/__init__.py | 8 + .../strategies/graph_intelligence/defaults.py | 17 + .../run_graph_intelligence.py | 70 + .../entities/summarize/strategies/typing.py | 34 + graphrag/index/verbs/genid.py | 66 + graphrag/index/verbs/graph/__init__.py | 36 + .../index/verbs/graph/clustering/__init__.py | 8 + .../verbs/graph/clustering/cluster_graph.py | 176 + .../graph/clustering/strategies/__init__.py | 4 + .../graph/clustering/strategies/leiden.py | 69 + .../index/verbs/graph/clustering/typing.py | 6 + .../graph/compute_edge_combined_degree.py | 70 + graphrag/index/verbs/graph/create.py | 135 + graphrag/index/verbs/graph/embed/__init__.py | 8 + .../index/verbs/graph/embed/embed_graph.py | 98 + .../verbs/graph/embed/strategies/__init__.py | 4 + .../graph/embed/strategies/node_2_vec.py | 34 + graphrag/index/verbs/graph/embed/typing.py | 12 + graphrag/index/verbs/graph/layout/__init__.py | 8 + .../index/verbs/graph/layout/layout_graph.py | 139 + .../verbs/graph/layout/methods/__init__.py | 4 + .../index/verbs/graph/layout/methods/umap.py | 82 + .../index/verbs/graph/layout/methods/zero.py | 63 + graphrag/index/verbs/graph/merge/__init__.py | 8 + graphrag/index/verbs/graph/merge/defaults.py | 21 + .../index/verbs/graph/merge/merge_graphs.py | 217 + graphrag/index/verbs/graph/merge/typing.py | 49 + graphrag/index/verbs/graph/report/__init__.py | 25 + .../graph/report/create_community_reports.py | 131 + .../graph/report/prepare_community_reports.py | 187 + .../prepare_community_reports_claims.py | 50 + .../report/prepare_community_reports_edges.py | 48 + .../report/prepare_community_reports_nodes.py | 46 + .../report/restore_community_hierarchy.py | 78 + .../verbs/graph/report/strategies/__init__.py | 4 + .../strategies/graph_intelligence/__init__.py | 8 + .../strategies/graph_intelligence/defaults.py | 26 + .../run_graph_intelligence.py | 95 + .../verbs/graph/report/strategies/typing.py | 52 + graphrag/index/verbs/graph/unpack.py | 107 + graphrag/index/verbs/overrides/__init__.py | 10 + graphrag/index/verbs/overrides/aggregate.py | 90 + graphrag/index/verbs/overrides/concat.py | 27 + graphrag/index/verbs/overrides/merge.py | 78 + graphrag/index/verbs/snapshot.py | 30 + graphrag/index/verbs/snapshot_rows.py | 86 + graphrag/index/verbs/spread_json.py | 55 + graphrag/index/verbs/text/__init__.py | 18 + graphrag/index/verbs/text/chunk/__init__.py | 8 + .../verbs/text/chunk/strategies/__init__.py | 4 + .../verbs/text/chunk/strategies/sentence.py | 26 + .../verbs/text/chunk/strategies/tokens.py | 83 + .../verbs/text/chunk/strategies/typing.py | 17 + graphrag/index/verbs/text/chunk/text_chunk.py | 162 + graphrag/index/verbs/text/chunk/typing.py | 19 + graphrag/index/verbs/text/embed/__init__.py | 8 + .../verbs/text/embed/strategies/__init__.py | 4 + .../index/verbs/text/embed/strategies/mock.py | 34 + .../verbs/text/embed/strategies/openai.py | 180 + .../verbs/text/embed/strategies/typing.py | 29 + graphrag/index/verbs/text/embed/text_embed.py | 263 + graphrag/index/verbs/text/replace/__init__.py | 8 + graphrag/index/verbs/text/replace/replace.py | 47 + graphrag/index/verbs/text/replace/typing.py | 14 + graphrag/index/verbs/text/split.py | 54 + .../index/verbs/text/translate/__init__.py | 8 + .../text/translate/strategies/__init__.py | 9 + .../text/translate/strategies/defaults.py | 8 + .../verbs/text/translate/strategies/mock.py | 28 + .../verbs/text/translate/strategies/openai.py | 92 + .../verbs/text/translate/strategies/typing.py | 25 + .../verbs/text/translate/text_translate.py | 120 + graphrag/index/verbs/unzip.py | 25 + graphrag/index/verbs/zip.py | 51 + graphrag/index/workflows/__init__.py | 25 + graphrag/index/workflows/default_workflows.py | 121 + graphrag/index/workflows/load.py | 171 + graphrag/index/workflows/typing.py | 33 + graphrag/index/workflows/v1/__init__.py | 4 + .../workflows/v1/create_base_documents.py | 105 + .../workflows/v1/create_base_entity_graph.py | 91 + .../v1/create_base_extracted_entities.py | 95 + .../workflows/v1/create_base_text_units.py | 112 + .../workflows/v1/create_final_communities.py | 172 + .../v1/create_final_community_reports.py | 133 + .../workflows/v1/create_final_covariates.py | 90 + .../workflows/v1/create_final_documents.py | 41 + .../workflows/v1/create_final_entities.py | 133 + .../index/workflows/v1/create_final_nodes.py | 116 + .../v1/create_final_relationships.py | 94 + .../workflows/v1/create_final_text_units.py | 161 + .../v1/create_summarized_entities.py | 47 + .../v1/join_text_units_to_covariate_ids.py | 44 + .../v1/join_text_units_to_entity_ids.py | 50 + .../v1/join_text_units_to_relationship_ids.py | 55 + graphrag/llm/__init__.py | 91 + graphrag/llm/base/__init__.py | 10 + graphrag/llm/base/_create_cache_key.py | 34 + graphrag/llm/base/base_llm.py | 65 + graphrag/llm/base/caching_llm.py | 107 + graphrag/llm/base/rate_limiting_llm.py | 208 + graphrag/llm/errors.py | 12 + graphrag/llm/limiting/__init__.py | 18 + graphrag/llm/limiting/composite_limiter.py | 26 + graphrag/llm/limiting/create_limiters.py | 29 + graphrag/llm/limiting/llm_limiter.py | 19 + graphrag/llm/limiting/noop_llm_limiter.py | 19 + graphrag/llm/limiting/tpm_rpm_limiter.py | 34 + graphrag/llm/mock/__init__.py | 12 + graphrag/llm/mock/mock_chat_llm.py | 52 + graphrag/llm/mock/mock_completion_llm.py | 37 + graphrag/llm/openai/__init__.py | 28 + graphrag/llm/openai/_json.py | 25 + graphrag/llm/openai/_prompts.py | 39 + graphrag/llm/openai/create_openai_client.py | 65 + graphrag/llm/openai/factories.py | 140 + graphrag/llm/openai/json_parsing_llm.py | 37 + graphrag/llm/openai/openai_chat_llm.py | 152 + graphrag/llm/openai/openai_completion_llm.py | 43 + graphrag/llm/openai/openai_configuration.py | 288 + graphrag/llm/openai/openai_embeddings_llm.py | 40 + .../llm/openai/openai_history_tracking_llm.py | 38 + .../llm/openai/openai_token_replacing_llm.py | 37 + graphrag/llm/openai/types.py | 11 + graphrag/llm/openai/utils.py | 113 + graphrag/llm/types/__init__.py | 46 + graphrag/llm/types/llm.py | 28 + graphrag/llm/types/llm_cache.py | 22 + graphrag/llm/types/llm_callbacks.py | 20 + graphrag/llm/types/llm_config.py | 35 + graphrag/llm/types/llm_invocation_result.py | 35 + graphrag/llm/types/llm_io.py | 50 + graphrag/llm/types/llm_types.py | 16 + graphrag/model/__init__.py | 31 + graphrag/model/community.py | 54 + graphrag/model/community_report.py | 64 + graphrag/model/covariate.py | 61 + graphrag/model/document.py | 64 + graphrag/model/entity.py | 79 + graphrag/model/identified.py | 17 + graphrag/model/named.py | 16 + graphrag/model/relationship.py | 65 + graphrag/model/text_unit.py | 67 + graphrag/model/types.py | 8 + graphrag/prompt_tune/__init__.py | 4 + graphrag/prompt_tune/__main__.py | 111 + graphrag/prompt_tune/cli.py | 226 + graphrag/prompt_tune/generator/__init__.py | 26 + .../community_report_summarization.py | 40 + .../generator/community_reporter_role.py | 35 + graphrag/prompt_tune/generator/defaults.py | 10 + graphrag/prompt_tune/generator/domain.py | 27 + .../generator/entity_extraction_prompt.py | 100 + .../generator/entity_relationship.py | 62 + .../generator/entity_summarization_prompt.py | 34 + .../prompt_tune/generator/entity_types.py | 45 + graphrag/prompt_tune/generator/persona.py | 27 + graphrag/prompt_tune/loader/__init__.py | 14 + graphrag/prompt_tune/loader/config.py | 43 + graphrag/prompt_tune/loader/input.py | 59 + graphrag/prompt_tune/prompt/__init__.py | 28 + .../prompt/community_reporter_role.py | 20 + graphrag/prompt_tune/prompt/domain.py | 12 + .../prompt_tune/prompt/entity_relationship.py | 132 + graphrag/prompt_tune/prompt/entity_types.py | 89 + graphrag/prompt_tune/prompt/persona.py | 13 + graphrag/prompt_tune/template/__init__.py | 24 + .../community_report_summarization.py | 96 + .../prompt_tune/template/entity_extraction.py | 136 + .../template/entity_summarization.py | 22 + graphrag/query/__init__.py | 4 + graphrag/query/__main__.py | 91 + graphrag/query/cli.py | 212 + graphrag/query/context_builder/__init__.py | 4 + graphrag/query/context_builder/builders.py | 35 + .../context_builder/community_context.py | 241 + .../context_builder/conversation_history.py | 212 + .../context_builder/entity_extraction.py | 159 + .../query/context_builder/local_context.py | 346 ++ .../query/context_builder/source_context.py | 110 + graphrag/query/factories.py | 190 + graphrag/query/indexer_adapters.py | 141 + graphrag/query/input/__init__.py | 4 + graphrag/query/input/loaders/__init__.py | 4 + graphrag/query/input/loaders/dfs.py | 340 ++ graphrag/query/input/loaders/utils.py | 245 + graphrag/query/input/retrieval/__init__.py | 4 + .../input/retrieval/community_reports.py | 74 + graphrag/query/input/retrieval/covariates.py | 52 + graphrag/query/input/retrieval/entities.py | 93 + .../query/input/retrieval/relationships.py | 173 + graphrag/query/input/retrieval/text_units.py | 52 + graphrag/query/llm/__init__.py | 4 + graphrag/query/llm/base.py | 54 + graphrag/query/llm/oai/__init__.py | 21 + graphrag/query/llm/oai/base.py | 187 + graphrag/query/llm/oai/chat_openai.py | 196 + graphrag/query/llm/oai/embedding.py | 182 + graphrag/query/llm/oai/openai.py | 171 + graphrag/query/llm/oai/typing.py | 23 + graphrag/query/llm/text_utils.py | 42 + graphrag/query/progress.py | 43 + graphrag/query/question_gen/__init__.py | 4 + graphrag/query/question_gen/base.py | 65 + graphrag/query/question_gen/local_gen.py | 194 + graphrag/query/question_gen/system_prompt.py | 28 + graphrag/query/structured_search/__init__.py | 4 + graphrag/query/structured_search/base.py | 69 + .../global_search/__init__.py | 4 + .../global_search/callbacks.py | 24 + .../global_search/community_context.py | 99 + .../global_search/map_system_prompt.py | 82 + .../global_search/reduce_system_prompt.py | 88 + .../structured_search/global_search/search.py | 347 ++ .../local_search/__init__.py | 4 + .../local_search/mixed_context.py | 497 ++ .../structured_search/local_search/search.py | 159 + .../local_search/system_prompt.py | 69 + graphrag/vector_stores/__init__.py | 19 + graphrag/vector_stores/azure_ai_search.py | 194 + graphrag/vector_stores/base.py | 81 + graphrag/vector_stores/lancedb.py | 121 + graphrag/vector_stores/typing.py | 44 + poetry.lock | 5105 +++++++++++++++++ pyproject.toml | 254 + scripts/e2e-test.sh | 4 + scripts/semver-check.sh | 10 + scripts/spellcheck.sh | 2 + scripts/start-azurite.sh | 2 + tests/__init__.py | 2 + tests/conftest.py | 6 + tests/fixtures/azure/config.json | 13 + tests/fixtures/azure/input/ABOUT.md | 3 + tests/fixtures/azure/input/dulce.txt | 970 ++++ tests/fixtures/azure/settings.yml | 38 + tests/fixtures/min-csv/config.json | 155 + tests/fixtures/min-csv/input/ABOUT.md | 3 + tests/fixtures/min-csv/input/dulce.csv | 959 ++++ tests/fixtures/min-csv/input/dulce.txt | 970 ++++ tests/fixtures/min-csv/settings.yml | 20 + tests/fixtures/text/config.json | 182 + tests/fixtures/text/input/ABOUT.md | 3 + tests/fixtures/text/input/dulce.txt | 970 ++++ tests/fixtures/text/settings.yml | 14 + tests/integration/__init__.py | 2 + tests/integration/_pipeline/__init__.py | 2 + tests/integration/_pipeline/megapipeline.yml | 72 + tests/integration/_pipeline/test_run.py | 75 + tests/notebook/__init__.py | 2 + tests/notebook/test_notebooks.py | 48 + tests/smoke/__init__.py | 2 + tests/smoke/test_fixtures.py | 302 + tests/unit/__init__.py | 2 + tests/unit/config/__init__.py | 2 + tests/unit/config/prompt-a.txt | 1 + tests/unit/config/prompt-b.txt | 1 + tests/unit/config/prompt-c.txt | 1 + tests/unit/config/prompt-d.txt | 1 + tests/unit/config/test_default_config.py | 928 +++ tests/unit/indexing/__init__.py | 2 + tests/unit/indexing/cache/__init__.py | 2 + .../cache/test_file_pipeline_cache.py | 76 + tests/unit/indexing/config/__init__.py | 2 + ...ault_config_with_everything_overridden.yml | 20 + .../default_config_with_overridden_input.yml | 5 + ...fault_config_with_overridden_workflows.yml | 6 + tests/unit/indexing/config/helpers.py | 59 + tests/unit/indexing/config/test_load.py | 121 + tests/unit/indexing/graph/__init__.py | 2 + .../indexing/graph/extractors/__init__.py | 2 + .../extractors/community_reports/__init__.py | 2 + .../community_reports/test_sort_context.py | 204 + tests/unit/indexing/graph/utils/__init__.py | 2 + .../indexing/graph/utils/test_stable_lcc.py | 71 + tests/unit/indexing/storage/__init__.py | 2 + .../storage/test_blob_pipeline_storage.py | 96 + .../storage/test_file_pipeline_storage.py | 50 + tests/unit/indexing/test_exports.py | 13 + tests/unit/indexing/test_init_content.py | 33 + tests/unit/indexing/verbs/__init__.py | 2 + .../unit/indexing/verbs/entities/__init__.py | 2 + .../verbs/entities/extraction/__init__.py | 2 + .../extraction/strategies/__init__.py | 2 + .../strategies/graph_intelligence/__init__.py | 2 + .../test_gi_entity_extraction.py | 221 + tests/unit/indexing/verbs/helpers/__init__.py | 2 + tests/unit/indexing/verbs/helpers/mock_llm.py | 10 + tests/unit/indexing/verbs/text/__init__.py | 2 + tests/unit/indexing/verbs/text/test_split.py | 51 + tests/unit/indexing/workflows/__init__.py | 2 + tests/unit/indexing/workflows/helpers.py | 31 + tests/unit/indexing/workflows/test_load.py | 237 + 575 files changed, 50648 insertions(+) create mode 100644 .github/dependabot.yml create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/gh-pages.yml create mode 100644 .github/workflows/javascript-ci.yml create mode 100644 .github/workflows/python-ci.yml create mode 100644 .github/workflows/python-publish.yml create mode 100644 .github/workflows/semver.yml create mode 100644 .github/workflows/spellcheck.yml create mode 100644 .gitignore create mode 100644 .semversioner/next-release/minor-20240701200021928520.json create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vsts-ci.yml create mode 100644 CODEOWNERS create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 DEVELOPING.md create mode 100644 LICENSE create mode 100644 RAI_TRANSPARENCY.md create mode 100644 README.md create mode 100644 SECURITY.md create mode 100644 SUPPORT.md create mode 100644 cspell.config.yaml create mode 100644 dictionary.txt create mode 100644 docsite/.eleventy.js create mode 100644 docsite/.eleventyignore create mode 100644 docsite/.gitignore create mode 100644 docsite/.yarn/releases/yarn-4.0.2.cjs create mode 100644 docsite/.yarn/sdks/integrations.yml create mode 100644 docsite/.yarnrc.yml create mode 100644 docsite/_includes/page.css create mode 100644 docsite/_includes/page.njk create mode 100644 docsite/data/operation_dulce/ABOUT.md create mode 100644 docsite/data/operation_dulce/Operation Dulce v2 1 1.md create mode 100644 docsite/img/GraphRag-Figure1.jpg create mode 100644 docsite/img/pipeline-running.png create mode 100644 docsite/index.md create mode 100644 docsite/nbdocsite_template/conf.json create mode 100644 docsite/nbdocsite_template/index.md.j2 create mode 100644 docsite/package.json create mode 100644 docsite/posts/config/custom.md create mode 100644 docsite/posts/config/env_vars.md create mode 100644 docsite/posts/config/init.md create mode 100644 docsite/posts/config/json_yaml.md create mode 100644 docsite/posts/config/overview.md create mode 100644 docsite/posts/config/template.md create mode 100644 docsite/posts/developing.md create mode 100644 docsite/posts/get_started.md create mode 100644 docsite/posts/index/0-architecture.md create mode 100644 docsite/posts/index/1-default_dataflow.md create mode 100644 docsite/posts/index/2-cli.md create mode 100644 docsite/posts/index/overview.md create mode 100644 docsite/posts/prompt_tuning/auto_prompt_tuning.md create mode 100644 docsite/posts/prompt_tuning/manual_prompt_tuning.md create mode 100644 docsite/posts/prompt_tuning/overview.md create mode 100644 docsite/posts/query/0-global_search.md create mode 100644 docsite/posts/query/1-local_search.md create mode 100644 docsite/posts/query/2-question_generation.md create mode 100644 docsite/posts/query/3-cli.md create mode 100644 docsite/posts/query/notebooks/overview.md create mode 100644 docsite/posts/query/overview.md create mode 100644 docsite/yarn.lock create mode 100644 examples/README.md create mode 100644 examples/__init__.py create mode 100644 examples/custom_input/__init__.py create mode 100644 examples/custom_input/pipeline.yml create mode 100644 examples/custom_input/run.py create mode 100644 examples/custom_set_of_available_verbs/__init__.py create mode 100644 examples/custom_set_of_available_verbs/custom_verb_definitions.py create mode 100644 examples/custom_set_of_available_verbs/pipeline.yml create mode 100644 examples/custom_set_of_available_verbs/run.py create mode 100644 examples/custom_set_of_available_workflows/__init__.py create mode 100644 examples/custom_set_of_available_workflows/custom_workflow_definitions.py create mode 100644 examples/custom_set_of_available_workflows/pipeline.yml create mode 100644 examples/custom_set_of_available_workflows/run.py create mode 100644 examples/entity_extraction/__init__.py create mode 100644 examples/entity_extraction/with_graph_intelligence/__init__.py create mode 100644 examples/entity_extraction/with_graph_intelligence/pipeline.yml create mode 100644 examples/entity_extraction/with_graph_intelligence/run.py create mode 100644 examples/entity_extraction/with_nltk/__init__.py create mode 100644 examples/entity_extraction/with_nltk/pipeline.yml create mode 100644 examples/entity_extraction/with_nltk/run.py create mode 100644 examples/interdependent_workflows/__init__.py create mode 100644 examples/interdependent_workflows/pipeline.yml create mode 100644 examples/interdependent_workflows/run.py create mode 100644 examples/multiple_workflows/__init__.py create mode 100644 examples/multiple_workflows/pipeline.yml create mode 100644 examples/multiple_workflows/run.py create mode 100644 examples/multiple_workflows/workflows/shared/shared_fill_value.txt create mode 100644 examples/multiple_workflows/workflows/workflow_1.yml create mode 100644 examples/multiple_workflows/workflows/workflow_2.yml create mode 100644 examples/multiple_workflows/workflows/workflow_3.yml create mode 100644 examples/single_verb/__init__.py create mode 100644 examples/single_verb/input/data.csv create mode 100644 examples/single_verb/pipeline.yml create mode 100644 examples/single_verb/run.py create mode 100644 examples/use_built_in_workflows/__init__.py create mode 100644 examples/use_built_in_workflows/pipeline.yml create mode 100644 examples/use_built_in_workflows/run.py create mode 100644 examples/various_levels_of_configs/__init__.py create mode 100644 examples/various_levels_of_configs/pipelines/workflows_and_inputs.yml create mode 100644 examples/various_levels_of_configs/pipelines/workflows_only.yml create mode 100644 examples/various_levels_of_configs/workflows_and_inputs.py create mode 100644 examples/various_levels_of_configs/workflows_and_inputs_with_custom_handlers.py create mode 100644 examples/various_levels_of_configs/workflows_only.py create mode 100644 examples_notebooks/global_search.ipynb create mode 100644 examples_notebooks/inputs/operation dulce/ABOUT.md create mode 100644 examples_notebooks/inputs/operation dulce/Operation Dulce v2 1 1.md create mode 100644 examples_notebooks/inputs/operation dulce/create_final_community_reports.parquet create mode 100644 examples_notebooks/inputs/operation dulce/create_final_covariates.parquet create mode 100644 examples_notebooks/inputs/operation dulce/create_final_entities.parquet create mode 100644 examples_notebooks/inputs/operation dulce/create_final_nodes.parquet create mode 100644 examples_notebooks/inputs/operation dulce/create_final_relationships.parquet create mode 100644 examples_notebooks/inputs/operation dulce/create_final_text_units.parquet create mode 100644 examples_notebooks/local_search.ipynb create mode 100644 graphrag/__init__.py create mode 100644 graphrag/config/__init__.py create mode 100644 graphrag/config/create_graphrag_config.py create mode 100644 graphrag/config/defaults.py create mode 100644 graphrag/config/enums.py create mode 100644 graphrag/config/environment_reader.py create mode 100644 graphrag/config/errors.py create mode 100644 graphrag/config/input_models/__init__.py create mode 100644 graphrag/config/input_models/cache_config_input.py create mode 100644 graphrag/config/input_models/chunking_config_input.py create mode 100644 graphrag/config/input_models/claim_extraction_config_input.py create mode 100644 graphrag/config/input_models/cluster_graph_config_input.py create mode 100644 graphrag/config/input_models/community_reports_config_input.py create mode 100644 graphrag/config/input_models/embed_graph_config_input.py create mode 100644 graphrag/config/input_models/entity_extraction_config_input.py create mode 100644 graphrag/config/input_models/global_search_config_input.py create mode 100644 graphrag/config/input_models/graphrag_config_input.py create mode 100644 graphrag/config/input_models/input_config_input.py create mode 100644 graphrag/config/input_models/llm_config_input.py create mode 100644 graphrag/config/input_models/llm_parameters_input.py create mode 100644 graphrag/config/input_models/local_search_config_input.py create mode 100644 graphrag/config/input_models/parallelization_parameters_input.py create mode 100644 graphrag/config/input_models/reporting_config_input.py create mode 100644 graphrag/config/input_models/snapshots_config_input.py create mode 100644 graphrag/config/input_models/storage_config_input.py create mode 100644 graphrag/config/input_models/summarize_descriptions_config_input.py create mode 100644 graphrag/config/input_models/text_embedding_config_input.py create mode 100644 graphrag/config/input_models/umap_config_input.py create mode 100644 graphrag/config/models/__init__.py create mode 100644 graphrag/config/models/cache_config.py create mode 100644 graphrag/config/models/chunking_config.py create mode 100644 graphrag/config/models/claim_extraction_config.py create mode 100644 graphrag/config/models/cluster_graph_config.py create mode 100644 graphrag/config/models/community_reports_config.py create mode 100644 graphrag/config/models/embed_graph_config.py create mode 100644 graphrag/config/models/entity_extraction_config.py create mode 100644 graphrag/config/models/global_search_config.py create mode 100644 graphrag/config/models/graph_rag_config.py create mode 100644 graphrag/config/models/input_config.py create mode 100644 graphrag/config/models/llm_config.py create mode 100644 graphrag/config/models/llm_parameters.py create mode 100644 graphrag/config/models/local_search_config.py create mode 100644 graphrag/config/models/parallelization_parameters.py create mode 100644 graphrag/config/models/reporting_config.py create mode 100644 graphrag/config/models/snapshots_config.py create mode 100644 graphrag/config/models/storage_config.py create mode 100644 graphrag/config/models/summarize_descriptions_config.py create mode 100644 graphrag/config/models/text_embedding_config.py create mode 100644 graphrag/config/models/umap_config.py create mode 100644 graphrag/config/read_dotenv.py create mode 100644 graphrag/index/__init__.py create mode 100644 graphrag/index/__main__.py create mode 100644 graphrag/index/bootstrap.py create mode 100644 graphrag/index/cache/__init__.py create mode 100644 graphrag/index/cache/json_pipeline_cache.py create mode 100644 graphrag/index/cache/load_cache.py create mode 100644 graphrag/index/cache/memory_pipeline_cache.py create mode 100644 graphrag/index/cache/noop_pipeline_cache.py create mode 100644 graphrag/index/cache/pipeline_cache.py create mode 100644 graphrag/index/cli.py create mode 100644 graphrag/index/config/__init__.py create mode 100644 graphrag/index/config/cache.py create mode 100644 graphrag/index/config/input.py create mode 100644 graphrag/index/config/pipeline.py create mode 100644 graphrag/index/config/reporting.py create mode 100644 graphrag/index/config/storage.py create mode 100644 graphrag/index/config/workflow.py create mode 100644 graphrag/index/context.py create mode 100644 graphrag/index/create_pipeline_config.py create mode 100644 graphrag/index/emit/__init__.py create mode 100644 graphrag/index/emit/csv_table_emitter.py create mode 100644 graphrag/index/emit/factories.py create mode 100644 graphrag/index/emit/json_table_emitter.py create mode 100644 graphrag/index/emit/parquet_table_emitter.py create mode 100644 graphrag/index/emit/table_emitter.py create mode 100644 graphrag/index/emit/types.py create mode 100644 graphrag/index/errors.py create mode 100644 graphrag/index/graph/__init__.py create mode 100644 graphrag/index/graph/embedding/__init__.py create mode 100644 graphrag/index/graph/embedding/embedding.py create mode 100644 graphrag/index/graph/extractors/__init__.py create mode 100644 graphrag/index/graph/extractors/claims/__init__.py create mode 100644 graphrag/index/graph/extractors/claims/claim_extractor.py create mode 100644 graphrag/index/graph/extractors/claims/prompts.py create mode 100644 graphrag/index/graph/extractors/community_reports/__init__.py create mode 100644 graphrag/index/graph/extractors/community_reports/build_mixed_context.py create mode 100644 graphrag/index/graph/extractors/community_reports/community_reports_extractor.py create mode 100644 graphrag/index/graph/extractors/community_reports/prep_community_report_context.py create mode 100644 graphrag/index/graph/extractors/community_reports/prompts.py create mode 100644 graphrag/index/graph/extractors/community_reports/schemas.py create mode 100644 graphrag/index/graph/extractors/community_reports/sort_context.py create mode 100644 graphrag/index/graph/extractors/community_reports/utils.py create mode 100644 graphrag/index/graph/extractors/graph/__init__.py create mode 100644 graphrag/index/graph/extractors/graph/graph_extractor.py create mode 100644 graphrag/index/graph/extractors/graph/prompts.py create mode 100644 graphrag/index/graph/extractors/summarize/__init__.py create mode 100644 graphrag/index/graph/extractors/summarize/description_summary_extractor.py create mode 100644 graphrag/index/graph/extractors/summarize/prompts.py create mode 100644 graphrag/index/graph/utils/__init__.py create mode 100644 graphrag/index/graph/utils/normalize_node_names.py create mode 100644 graphrag/index/graph/utils/stable_lcc.py create mode 100644 graphrag/index/graph/visualization/__init__.py create mode 100644 graphrag/index/graph/visualization/compute_umap_positions.py create mode 100644 graphrag/index/graph/visualization/typing.py create mode 100644 graphrag/index/init_content.py create mode 100644 graphrag/index/input/__init__.py create mode 100644 graphrag/index/input/csv.py create mode 100644 graphrag/index/input/load_input.py create mode 100644 graphrag/index/input/text.py create mode 100644 graphrag/index/llm/__init__.py create mode 100644 graphrag/index/llm/load_llm.py create mode 100644 graphrag/index/llm/types.py create mode 100644 graphrag/index/load_pipeline_config.py create mode 100644 graphrag/index/progress/__init__.py create mode 100644 graphrag/index/progress/rich.py create mode 100644 graphrag/index/progress/types.py create mode 100644 graphrag/index/py.typed create mode 100644 graphrag/index/reporting/__init__.py create mode 100644 graphrag/index/reporting/blob_workflow_callbacks.py create mode 100644 graphrag/index/reporting/console_workflow_callbacks.py create mode 100644 graphrag/index/reporting/file_workflow_callbacks.py create mode 100644 graphrag/index/reporting/load_pipeline_reporter.py create mode 100644 graphrag/index/reporting/progress_workflow_callbacks.py create mode 100644 graphrag/index/run.py create mode 100644 graphrag/index/storage/__init__.py create mode 100644 graphrag/index/storage/blob_pipeline_storage.py create mode 100644 graphrag/index/storage/file_pipeline_storage.py create mode 100644 graphrag/index/storage/load_storage.py create mode 100644 graphrag/index/storage/memory_pipeline_storage.py create mode 100644 graphrag/index/storage/typing.py create mode 100644 graphrag/index/text_splitting/__init__.py create mode 100644 graphrag/index/text_splitting/check_token_limit.py create mode 100644 graphrag/index/text_splitting/text_splitting.py create mode 100644 graphrag/index/typing.py create mode 100644 graphrag/index/utils/__init__.py create mode 100644 graphrag/index/utils/dataframes.py create mode 100644 graphrag/index/utils/dicts.py create mode 100644 graphrag/index/utils/ds_util.py create mode 100644 graphrag/index/utils/hashing.py create mode 100644 graphrag/index/utils/is_null.py create mode 100644 graphrag/index/utils/json.py create mode 100644 graphrag/index/utils/load_graph.py create mode 100644 graphrag/index/utils/string.py create mode 100644 graphrag/index/utils/tokens.py create mode 100644 graphrag/index/utils/topological_sort.py create mode 100644 graphrag/index/utils/uuid.py create mode 100644 graphrag/index/verbs/__init__.py create mode 100644 graphrag/index/verbs/covariates/__init__.py create mode 100644 graphrag/index/verbs/covariates/extract_covariates/__init__.py create mode 100644 graphrag/index/verbs/covariates/extract_covariates/extract_covariates.py create mode 100644 graphrag/index/verbs/covariates/extract_covariates/strategies/__init__.py create mode 100644 graphrag/index/verbs/covariates/extract_covariates/strategies/graph_intelligence/__init__.py create mode 100644 graphrag/index/verbs/covariates/extract_covariates/strategies/graph_intelligence/defaults.py create mode 100644 graphrag/index/verbs/covariates/extract_covariates/strategies/graph_intelligence/run_gi_extract_claims.py create mode 100644 graphrag/index/verbs/covariates/typing.py create mode 100644 graphrag/index/verbs/entities/__init__.py create mode 100644 graphrag/index/verbs/entities/extraction/__init__.py create mode 100644 graphrag/index/verbs/entities/extraction/entity_extract.py create mode 100644 graphrag/index/verbs/entities/extraction/strategies/__init__.py create mode 100644 graphrag/index/verbs/entities/extraction/strategies/graph_intelligence/__init__.py create mode 100644 graphrag/index/verbs/entities/extraction/strategies/graph_intelligence/defaults.py create mode 100644 graphrag/index/verbs/entities/extraction/strategies/graph_intelligence/run_graph_intelligence.py create mode 100644 graphrag/index/verbs/entities/extraction/strategies/nltk.py create mode 100644 graphrag/index/verbs/entities/extraction/strategies/typing.py create mode 100644 graphrag/index/verbs/entities/summarize/__init__.py create mode 100644 graphrag/index/verbs/entities/summarize/description_summarize.py create mode 100644 graphrag/index/verbs/entities/summarize/strategies/__init__.py create mode 100644 graphrag/index/verbs/entities/summarize/strategies/graph_intelligence/__init__.py create mode 100644 graphrag/index/verbs/entities/summarize/strategies/graph_intelligence/defaults.py create mode 100644 graphrag/index/verbs/entities/summarize/strategies/graph_intelligence/run_graph_intelligence.py create mode 100644 graphrag/index/verbs/entities/summarize/strategies/typing.py create mode 100644 graphrag/index/verbs/genid.py create mode 100644 graphrag/index/verbs/graph/__init__.py create mode 100644 graphrag/index/verbs/graph/clustering/__init__.py create mode 100644 graphrag/index/verbs/graph/clustering/cluster_graph.py create mode 100644 graphrag/index/verbs/graph/clustering/strategies/__init__.py create mode 100644 graphrag/index/verbs/graph/clustering/strategies/leiden.py create mode 100644 graphrag/index/verbs/graph/clustering/typing.py create mode 100644 graphrag/index/verbs/graph/compute_edge_combined_degree.py create mode 100644 graphrag/index/verbs/graph/create.py create mode 100644 graphrag/index/verbs/graph/embed/__init__.py create mode 100644 graphrag/index/verbs/graph/embed/embed_graph.py create mode 100644 graphrag/index/verbs/graph/embed/strategies/__init__.py create mode 100644 graphrag/index/verbs/graph/embed/strategies/node_2_vec.py create mode 100644 graphrag/index/verbs/graph/embed/typing.py create mode 100644 graphrag/index/verbs/graph/layout/__init__.py create mode 100644 graphrag/index/verbs/graph/layout/layout_graph.py create mode 100644 graphrag/index/verbs/graph/layout/methods/__init__.py create mode 100644 graphrag/index/verbs/graph/layout/methods/umap.py create mode 100644 graphrag/index/verbs/graph/layout/methods/zero.py create mode 100644 graphrag/index/verbs/graph/merge/__init__.py create mode 100644 graphrag/index/verbs/graph/merge/defaults.py create mode 100644 graphrag/index/verbs/graph/merge/merge_graphs.py create mode 100644 graphrag/index/verbs/graph/merge/typing.py create mode 100644 graphrag/index/verbs/graph/report/__init__.py create mode 100644 graphrag/index/verbs/graph/report/create_community_reports.py create mode 100644 graphrag/index/verbs/graph/report/prepare_community_reports.py create mode 100644 graphrag/index/verbs/graph/report/prepare_community_reports_claims.py create mode 100644 graphrag/index/verbs/graph/report/prepare_community_reports_edges.py create mode 100644 graphrag/index/verbs/graph/report/prepare_community_reports_nodes.py create mode 100644 graphrag/index/verbs/graph/report/restore_community_hierarchy.py create mode 100644 graphrag/index/verbs/graph/report/strategies/__init__.py create mode 100644 graphrag/index/verbs/graph/report/strategies/graph_intelligence/__init__.py create mode 100644 graphrag/index/verbs/graph/report/strategies/graph_intelligence/defaults.py create mode 100644 graphrag/index/verbs/graph/report/strategies/graph_intelligence/run_graph_intelligence.py create mode 100644 graphrag/index/verbs/graph/report/strategies/typing.py create mode 100644 graphrag/index/verbs/graph/unpack.py create mode 100644 graphrag/index/verbs/overrides/__init__.py create mode 100644 graphrag/index/verbs/overrides/aggregate.py create mode 100644 graphrag/index/verbs/overrides/concat.py create mode 100644 graphrag/index/verbs/overrides/merge.py create mode 100644 graphrag/index/verbs/snapshot.py create mode 100644 graphrag/index/verbs/snapshot_rows.py create mode 100644 graphrag/index/verbs/spread_json.py create mode 100644 graphrag/index/verbs/text/__init__.py create mode 100644 graphrag/index/verbs/text/chunk/__init__.py create mode 100644 graphrag/index/verbs/text/chunk/strategies/__init__.py create mode 100644 graphrag/index/verbs/text/chunk/strategies/sentence.py create mode 100644 graphrag/index/verbs/text/chunk/strategies/tokens.py create mode 100644 graphrag/index/verbs/text/chunk/strategies/typing.py create mode 100644 graphrag/index/verbs/text/chunk/text_chunk.py create mode 100644 graphrag/index/verbs/text/chunk/typing.py create mode 100644 graphrag/index/verbs/text/embed/__init__.py create mode 100644 graphrag/index/verbs/text/embed/strategies/__init__.py create mode 100644 graphrag/index/verbs/text/embed/strategies/mock.py create mode 100644 graphrag/index/verbs/text/embed/strategies/openai.py create mode 100644 graphrag/index/verbs/text/embed/strategies/typing.py create mode 100644 graphrag/index/verbs/text/embed/text_embed.py create mode 100644 graphrag/index/verbs/text/replace/__init__.py create mode 100644 graphrag/index/verbs/text/replace/replace.py create mode 100644 graphrag/index/verbs/text/replace/typing.py create mode 100644 graphrag/index/verbs/text/split.py create mode 100644 graphrag/index/verbs/text/translate/__init__.py create mode 100644 graphrag/index/verbs/text/translate/strategies/__init__.py create mode 100644 graphrag/index/verbs/text/translate/strategies/defaults.py create mode 100644 graphrag/index/verbs/text/translate/strategies/mock.py create mode 100644 graphrag/index/verbs/text/translate/strategies/openai.py create mode 100644 graphrag/index/verbs/text/translate/strategies/typing.py create mode 100644 graphrag/index/verbs/text/translate/text_translate.py create mode 100644 graphrag/index/verbs/unzip.py create mode 100644 graphrag/index/verbs/zip.py create mode 100644 graphrag/index/workflows/__init__.py create mode 100644 graphrag/index/workflows/default_workflows.py create mode 100644 graphrag/index/workflows/load.py create mode 100644 graphrag/index/workflows/typing.py create mode 100644 graphrag/index/workflows/v1/__init__.py create mode 100644 graphrag/index/workflows/v1/create_base_documents.py create mode 100644 graphrag/index/workflows/v1/create_base_entity_graph.py create mode 100644 graphrag/index/workflows/v1/create_base_extracted_entities.py create mode 100644 graphrag/index/workflows/v1/create_base_text_units.py create mode 100644 graphrag/index/workflows/v1/create_final_communities.py create mode 100644 graphrag/index/workflows/v1/create_final_community_reports.py create mode 100644 graphrag/index/workflows/v1/create_final_covariates.py create mode 100644 graphrag/index/workflows/v1/create_final_documents.py create mode 100644 graphrag/index/workflows/v1/create_final_entities.py create mode 100644 graphrag/index/workflows/v1/create_final_nodes.py create mode 100644 graphrag/index/workflows/v1/create_final_relationships.py create mode 100644 graphrag/index/workflows/v1/create_final_text_units.py create mode 100644 graphrag/index/workflows/v1/create_summarized_entities.py create mode 100644 graphrag/index/workflows/v1/join_text_units_to_covariate_ids.py create mode 100644 graphrag/index/workflows/v1/join_text_units_to_entity_ids.py create mode 100644 graphrag/index/workflows/v1/join_text_units_to_relationship_ids.py create mode 100644 graphrag/llm/__init__.py create mode 100644 graphrag/llm/base/__init__.py create mode 100644 graphrag/llm/base/_create_cache_key.py create mode 100644 graphrag/llm/base/base_llm.py create mode 100644 graphrag/llm/base/caching_llm.py create mode 100644 graphrag/llm/base/rate_limiting_llm.py create mode 100644 graphrag/llm/errors.py create mode 100644 graphrag/llm/limiting/__init__.py create mode 100644 graphrag/llm/limiting/composite_limiter.py create mode 100644 graphrag/llm/limiting/create_limiters.py create mode 100644 graphrag/llm/limiting/llm_limiter.py create mode 100644 graphrag/llm/limiting/noop_llm_limiter.py create mode 100644 graphrag/llm/limiting/tpm_rpm_limiter.py create mode 100644 graphrag/llm/mock/__init__.py create mode 100644 graphrag/llm/mock/mock_chat_llm.py create mode 100644 graphrag/llm/mock/mock_completion_llm.py create mode 100644 graphrag/llm/openai/__init__.py create mode 100644 graphrag/llm/openai/_json.py create mode 100644 graphrag/llm/openai/_prompts.py create mode 100644 graphrag/llm/openai/create_openai_client.py create mode 100644 graphrag/llm/openai/factories.py create mode 100644 graphrag/llm/openai/json_parsing_llm.py create mode 100644 graphrag/llm/openai/openai_chat_llm.py create mode 100644 graphrag/llm/openai/openai_completion_llm.py create mode 100644 graphrag/llm/openai/openai_configuration.py create mode 100644 graphrag/llm/openai/openai_embeddings_llm.py create mode 100644 graphrag/llm/openai/openai_history_tracking_llm.py create mode 100644 graphrag/llm/openai/openai_token_replacing_llm.py create mode 100644 graphrag/llm/openai/types.py create mode 100644 graphrag/llm/openai/utils.py create mode 100644 graphrag/llm/types/__init__.py create mode 100644 graphrag/llm/types/llm.py create mode 100644 graphrag/llm/types/llm_cache.py create mode 100644 graphrag/llm/types/llm_callbacks.py create mode 100644 graphrag/llm/types/llm_config.py create mode 100644 graphrag/llm/types/llm_invocation_result.py create mode 100644 graphrag/llm/types/llm_io.py create mode 100644 graphrag/llm/types/llm_types.py create mode 100644 graphrag/model/__init__.py create mode 100644 graphrag/model/community.py create mode 100644 graphrag/model/community_report.py create mode 100644 graphrag/model/covariate.py create mode 100644 graphrag/model/document.py create mode 100644 graphrag/model/entity.py create mode 100644 graphrag/model/identified.py create mode 100644 graphrag/model/named.py create mode 100644 graphrag/model/relationship.py create mode 100644 graphrag/model/text_unit.py create mode 100644 graphrag/model/types.py create mode 100644 graphrag/prompt_tune/__init__.py create mode 100644 graphrag/prompt_tune/__main__.py create mode 100644 graphrag/prompt_tune/cli.py create mode 100644 graphrag/prompt_tune/generator/__init__.py create mode 100644 graphrag/prompt_tune/generator/community_report_summarization.py create mode 100644 graphrag/prompt_tune/generator/community_reporter_role.py create mode 100644 graphrag/prompt_tune/generator/defaults.py create mode 100644 graphrag/prompt_tune/generator/domain.py create mode 100644 graphrag/prompt_tune/generator/entity_extraction_prompt.py create mode 100644 graphrag/prompt_tune/generator/entity_relationship.py create mode 100644 graphrag/prompt_tune/generator/entity_summarization_prompt.py create mode 100644 graphrag/prompt_tune/generator/entity_types.py create mode 100644 graphrag/prompt_tune/generator/persona.py create mode 100644 graphrag/prompt_tune/loader/__init__.py create mode 100644 graphrag/prompt_tune/loader/config.py create mode 100644 graphrag/prompt_tune/loader/input.py create mode 100644 graphrag/prompt_tune/prompt/__init__.py create mode 100644 graphrag/prompt_tune/prompt/community_reporter_role.py create mode 100644 graphrag/prompt_tune/prompt/domain.py create mode 100644 graphrag/prompt_tune/prompt/entity_relationship.py create mode 100644 graphrag/prompt_tune/prompt/entity_types.py create mode 100644 graphrag/prompt_tune/prompt/persona.py create mode 100644 graphrag/prompt_tune/template/__init__.py create mode 100644 graphrag/prompt_tune/template/community_report_summarization.py create mode 100644 graphrag/prompt_tune/template/entity_extraction.py create mode 100644 graphrag/prompt_tune/template/entity_summarization.py create mode 100644 graphrag/query/__init__.py create mode 100644 graphrag/query/__main__.py create mode 100644 graphrag/query/cli.py create mode 100644 graphrag/query/context_builder/__init__.py create mode 100644 graphrag/query/context_builder/builders.py create mode 100644 graphrag/query/context_builder/community_context.py create mode 100644 graphrag/query/context_builder/conversation_history.py create mode 100644 graphrag/query/context_builder/entity_extraction.py create mode 100644 graphrag/query/context_builder/local_context.py create mode 100644 graphrag/query/context_builder/source_context.py create mode 100644 graphrag/query/factories.py create mode 100644 graphrag/query/indexer_adapters.py create mode 100644 graphrag/query/input/__init__.py create mode 100644 graphrag/query/input/loaders/__init__.py create mode 100644 graphrag/query/input/loaders/dfs.py create mode 100644 graphrag/query/input/loaders/utils.py create mode 100644 graphrag/query/input/retrieval/__init__.py create mode 100644 graphrag/query/input/retrieval/community_reports.py create mode 100644 graphrag/query/input/retrieval/covariates.py create mode 100644 graphrag/query/input/retrieval/entities.py create mode 100644 graphrag/query/input/retrieval/relationships.py create mode 100644 graphrag/query/input/retrieval/text_units.py create mode 100644 graphrag/query/llm/__init__.py create mode 100644 graphrag/query/llm/base.py create mode 100644 graphrag/query/llm/oai/__init__.py create mode 100644 graphrag/query/llm/oai/base.py create mode 100644 graphrag/query/llm/oai/chat_openai.py create mode 100644 graphrag/query/llm/oai/embedding.py create mode 100644 graphrag/query/llm/oai/openai.py create mode 100644 graphrag/query/llm/oai/typing.py create mode 100644 graphrag/query/llm/text_utils.py create mode 100644 graphrag/query/progress.py create mode 100644 graphrag/query/question_gen/__init__.py create mode 100644 graphrag/query/question_gen/base.py create mode 100644 graphrag/query/question_gen/local_gen.py create mode 100644 graphrag/query/question_gen/system_prompt.py create mode 100644 graphrag/query/structured_search/__init__.py create mode 100644 graphrag/query/structured_search/base.py create mode 100644 graphrag/query/structured_search/global_search/__init__.py create mode 100644 graphrag/query/structured_search/global_search/callbacks.py create mode 100644 graphrag/query/structured_search/global_search/community_context.py create mode 100644 graphrag/query/structured_search/global_search/map_system_prompt.py create mode 100644 graphrag/query/structured_search/global_search/reduce_system_prompt.py create mode 100644 graphrag/query/structured_search/global_search/search.py create mode 100644 graphrag/query/structured_search/local_search/__init__.py create mode 100644 graphrag/query/structured_search/local_search/mixed_context.py create mode 100644 graphrag/query/structured_search/local_search/search.py create mode 100644 graphrag/query/structured_search/local_search/system_prompt.py create mode 100644 graphrag/vector_stores/__init__.py create mode 100644 graphrag/vector_stores/azure_ai_search.py create mode 100644 graphrag/vector_stores/base.py create mode 100644 graphrag/vector_stores/lancedb.py create mode 100644 graphrag/vector_stores/typing.py create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100755 scripts/e2e-test.sh create mode 100755 scripts/semver-check.sh create mode 100755 scripts/spellcheck.sh create mode 100755 scripts/start-azurite.sh create mode 100644 tests/__init__.py create mode 100644 tests/conftest.py create mode 100644 tests/fixtures/azure/config.json create mode 100644 tests/fixtures/azure/input/ABOUT.md create mode 100644 tests/fixtures/azure/input/dulce.txt create mode 100644 tests/fixtures/azure/settings.yml create mode 100644 tests/fixtures/min-csv/config.json create mode 100644 tests/fixtures/min-csv/input/ABOUT.md create mode 100644 tests/fixtures/min-csv/input/dulce.csv create mode 100644 tests/fixtures/min-csv/input/dulce.txt create mode 100644 tests/fixtures/min-csv/settings.yml create mode 100644 tests/fixtures/text/config.json create mode 100644 tests/fixtures/text/input/ABOUT.md create mode 100644 tests/fixtures/text/input/dulce.txt create mode 100644 tests/fixtures/text/settings.yml create mode 100644 tests/integration/__init__.py create mode 100644 tests/integration/_pipeline/__init__.py create mode 100644 tests/integration/_pipeline/megapipeline.yml create mode 100644 tests/integration/_pipeline/test_run.py create mode 100644 tests/notebook/__init__.py create mode 100644 tests/notebook/test_notebooks.py create mode 100644 tests/smoke/__init__.py create mode 100644 tests/smoke/test_fixtures.py create mode 100644 tests/unit/__init__.py create mode 100644 tests/unit/config/__init__.py create mode 100644 tests/unit/config/prompt-a.txt create mode 100644 tests/unit/config/prompt-b.txt create mode 100644 tests/unit/config/prompt-c.txt create mode 100644 tests/unit/config/prompt-d.txt create mode 100644 tests/unit/config/test_default_config.py create mode 100644 tests/unit/indexing/__init__.py create mode 100644 tests/unit/indexing/cache/__init__.py create mode 100644 tests/unit/indexing/cache/test_file_pipeline_cache.py create mode 100644 tests/unit/indexing/config/__init__.py create mode 100644 tests/unit/indexing/config/default_config_with_everything_overridden.yml create mode 100644 tests/unit/indexing/config/default_config_with_overridden_input.yml create mode 100644 tests/unit/indexing/config/default_config_with_overridden_workflows.yml create mode 100644 tests/unit/indexing/config/helpers.py create mode 100644 tests/unit/indexing/config/test_load.py create mode 100644 tests/unit/indexing/graph/__init__.py create mode 100644 tests/unit/indexing/graph/extractors/__init__.py create mode 100644 tests/unit/indexing/graph/extractors/community_reports/__init__.py create mode 100644 tests/unit/indexing/graph/extractors/community_reports/test_sort_context.py create mode 100644 tests/unit/indexing/graph/utils/__init__.py create mode 100644 tests/unit/indexing/graph/utils/test_stable_lcc.py create mode 100644 tests/unit/indexing/storage/__init__.py create mode 100644 tests/unit/indexing/storage/test_blob_pipeline_storage.py create mode 100644 tests/unit/indexing/storage/test_file_pipeline_storage.py create mode 100644 tests/unit/indexing/test_exports.py create mode 100644 tests/unit/indexing/test_init_content.py create mode 100644 tests/unit/indexing/verbs/__init__.py create mode 100644 tests/unit/indexing/verbs/entities/__init__.py create mode 100644 tests/unit/indexing/verbs/entities/extraction/__init__.py create mode 100644 tests/unit/indexing/verbs/entities/extraction/strategies/__init__.py create mode 100644 tests/unit/indexing/verbs/entities/extraction/strategies/graph_intelligence/__init__.py create mode 100644 tests/unit/indexing/verbs/entities/extraction/strategies/graph_intelligence/test_gi_entity_extraction.py create mode 100644 tests/unit/indexing/verbs/helpers/__init__.py create mode 100644 tests/unit/indexing/verbs/helpers/mock_llm.py create mode 100644 tests/unit/indexing/verbs/text/__init__.py create mode 100644 tests/unit/indexing/verbs/text/test_split.py create mode 100644 tests/unit/indexing/workflows/__init__.py create mode 100644 tests/unit/indexing/workflows/helpers.py create mode 100644 tests/unit/indexing/workflows/test_load.py diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..3da41ebe --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,19 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file +version: 2 +updates: + - package-ecosystem: "npm" # See documentation for possible values + directory: "docsite/" # Location of package manifests + schedule: + interval: "weekly" + - package-ecosystem: "pip" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" + - package-ecosystem: "github-actions" + # Workflow files stored in the default location of `.github/workflows`. (You don't need to specify `/.github/workflows` for `directory`. You can use `directory: "/"`.) + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..49ceff49 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,36 @@ + + +## Description + +[Provide a brief description of the changes made in this pull request.] + +## Related Issues + +[Reference any related issues or tasks that this pull request addresses.] + +## Proposed Changes + +[List the specific changes made in this pull request.] + +## Checklist + +- [ ] I have tested these changes locally. +- [ ] I have reviewed the code changes. +- [ ] I have updated the documentation (if necessary). +- [ ] I have added appropriate unit tests (if applicable). + +## Additional Notes + +[Add any additional notes or context that may be helpful for the reviewer(s).] diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml new file mode 100644 index 00000000..22d1de63 --- /dev/null +++ b/.github/workflows/gh-pages.yml @@ -0,0 +1,95 @@ +name: gh-pages +on: + push: + branches: [main] + +permissions: + contents: write + +env: + POETRY_VERSION: 1.8.3 + PYTHON_VERSION: '3.11' + NODE_VERSION: 18.x + +jobs: + build: + runs-on: ubuntu-latest + env: + GH_PAGES: 1 + DEBUG: 1 + GRAPHRAG_LLM_TYPE: "azure_openai_chat" + GRAPHRAG_EMBEDDING_TYPE: "azure_openai_embedding" + GRAPHRAG_API_KEY: ${{ secrets.OPENAI_API_KEY }} + GRAPHRAG_API_BASE: ${{ secrets.GRAPHRAG_API_BASE }} + GRAPHRAG_API_VERSION: ${{ secrets.GRAPHRAG_API_VERSION }} + GRAPHRAG_LLM_DEPLOYMENT_NAME: ${{ secrets.GRAPHRAG_LLM_DEPLOYMENT_NAME }} + GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME: ${{ secrets.GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME }} + GRAPHRAG_CACHE_TYPE: "blob" + GRAPHRAG_CACHE_CONNECTION_STRING: ${{ secrets.BLOB_STORAGE_CONNECTION_STRING }} + GRAPHRAG_CACHE_CONTAINER_NAME: "cicache" + GRAPHRAG_CACHE_BASE_DIR": "cache" + GRAPHRAG_LLM_MODEL: gpt-3.5-turbo-16k + GRAPHRAG_EMBEDDING_MODEL: text-embedding-ada-002 + # We have Windows + Linux runners in 3.10 and 3.11, so we need to divide the rate limits by 4 + GRAPHRAG_LLM_TPM: 45_000 # 180,000 / 4 + GRAPHRAG_LLM_RPM: 270 # 1,080 / 4 + GRAPHRAG_EMBEDDING_TPM: 87_500 # 350,000 / 4 + GRAPHRAG_EMBEDDING_RPM: 525 # 2,100 / 4 + GRAPHRAG_CHUNK_SIZE: 1200 + GRAPHRAG_CHUNK_OVERLAP: 0 + # Azure AI Search config + AZURE_AI_SEARCH_URL_ENDPOINT: ${{ secrets.AZURE_AI_SEARCH_URL_ENDPOINT }} + AZURE_AI_SEARCH_API_KEY: ${{ secrets.AZURE_AI_SEARCH_API_KEY }} + + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + + - name: Set up Python ${{ env.PYTHON_VERSION }} + uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + + - name: Install Poetry ${{ env.POETRY_VERSION }} + uses: abatilo/actions-poetry@v3.0.0 + with: + poetry-version: ${{ env.POETRY_VERSION }} + + - name: Use Node ${{ env.NODE_VERSION }} + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Install Yarn dependencies + run: yarn install + working-directory: docsite + + - name: Install Poetry dependencies + run: poetry install + + - name: Install Azurite + id: azuright + uses: potatoqualitee/azuright@v1.1 + + - name: Generate Indexer Outputs + run: | + poetry run poe test_smoke + zip -jrm docsite/data/operation_dulce/dataset.zip tests/fixtures/min-csv/output/*/artifacts/*.parquet + + - name: Build Jupyter Notebooks + run: poetry run poe convert_docsite_notebooks + + - name: Build docsite + run: yarn build + working-directory: docsite + + - name: List docsite files + run: find docsite/_site + + - name: Deploy to GitHub Pages + uses: JamesIves/github-pages-deploy-action@v4.6.1 + with: + branch: gh-pages + folder: docsite/_site + clean: true diff --git a/.github/workflows/javascript-ci.yml b/.github/workflows/javascript-ci.yml new file mode 100644 index 00000000..e1d45c6f --- /dev/null +++ b/.github/workflows/javascript-ci.yml @@ -0,0 +1,30 @@ +name: JavaScript CI +on: + push: + branches: [main] + pull_request: + branches: [main] + +env: + NODE_VERSION: 18.x + +jobs: + javascript-ci: + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - name: Use Node ${{ env.NODE_VERSION }} + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + + - uses: actions/checkout@v4 + + - run: yarn install + working-directory: docsite + name: Install Dependencies + + - run: yarn build + working-directory: docsite + name: Build Docsite \ No newline at end of file diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml new file mode 100644 index 00000000..243f2cf0 --- /dev/null +++ b/.github/workflows/python-ci.yml @@ -0,0 +1,122 @@ +name: Python CI +on: + push: + branches: [main] + pull_request: + branches: [main] + +permissions: + contents: read + pull-requests: read + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + # Only run the for the latest commit + cancel-in-progress: true + +env: + POETRY_VERSION: 1.8.3 + +jobs: + python-ci: + strategy: + matrix: + python-version: ["3.10", "3.11", "3.12"] + os: [ubuntu-latest, windows-latest] + env: + DEBUG: 1 + GRAPHRAG_LLM_TYPE: "azure_openai_chat" + GRAPHRAG_EMBEDDING_TYPE: "azure_openai_embedding" + GRAPHRAG_API_KEY: ${{ secrets.OPENAI_API_KEY }} + GRAPHRAG_API_BASE: ${{ secrets.GRAPHRAG_API_BASE }} + GRAPHRAG_API_VERSION: ${{ secrets.GRAPHRAG_API_VERSION }} + GRAPHRAG_LLM_DEPLOYMENT_NAME: ${{ secrets.GRAPHRAG_LLM_DEPLOYMENT_NAME }} + GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME: ${{ secrets.GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME }} + GRAPHRAG_CACHE_TYPE: "blob" + GRAPHRAG_CACHE_CONNECTION_STRING: ${{ secrets.BLOB_STORAGE_CONNECTION_STRING }} + GRAPHRAG_CACHE_CONTAINER_NAME: "cicache" + GRAPHRAG_CACHE_BASE_DIR": "cache" + GRAPHRAG_LLM_MODEL: gpt-3.5-turbo-16k + GRAPHRAG_EMBEDDING_MODEL: text-embedding-ada-002 + # We have Windows + Linux runners in 3.10 and 3.11, so we need to divide the rate limits by 4 + GRAPHRAG_LLM_TPM: 45_000 # 180,000 / 4 + GRAPHRAG_LLM_RPM: 270 # 1,080 / 4 + GRAPHRAG_EMBEDDING_TPM: 87_500 # 350,000 / 4 + GRAPHRAG_EMBEDDING_RPM: 525 # 2,100 / 4 + GRAPHRAG_CHUNK_SIZE: 1200 + GRAPHRAG_CHUNK_OVERLAP: 0 + # Azure AI Search config + AZURE_AI_SEARCH_URL_ENDPOINT: ${{ secrets.AZURE_AI_SEARCH_URL_ENDPOINT }} + AZURE_AI_SEARCH_API_KEY: ${{ secrets.AZURE_AI_SEARCH_API_KEY }} + + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + + - uses: dorny/paths-filter@v3 + id: changes + with: + filters: | + python: + - 'graphrag/**/*' + - 'poetry.lock' + - 'pyproject.toml' + - '**/*.py' + - '**/*.toml' + - '**/*.ipynb' + - '.github/workflows/python*.yml' + - 'tests/smoke/*' + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install Poetry + uses: abatilo/actions-poetry@v3.0.0 + with: + poetry-version: $POETRY_VERSION + + - name: Install dependencies + shell: bash + run: poetry self add setuptools && poetry run python -m pip install gensim && poetry install + + - name: Check Semversioner + run: | + poetry run semversioner check + + - name: Check + run: | + poetry run poe check + + - name: Build + run: | + poetry build + + - name: Install Azurite + id: azuright + uses: potatoqualitee/azuright@v1.1 + + - name: Unit Test + run: | + poetry run poe test_unit + + - name: Integration Test + run: | + poetry run poe test_integration + + - name: Smoke Test + if: steps.changes.outputs.python == 'true' + run: | + poetry run poe test_smoke + + - uses: actions/upload-artifact@v4 + if: always() + with: + name: smoke-test-artifacts-${{ matrix.python-version }}-${{ matrix.poetry-version }}-${{ runner.os }} + path: tests/fixtures/*/output + + - name: E2E Test + if: steps.changes.outputs.python == 'true' + run: | + ./scripts/e2e-test.sh diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml new file mode 100644 index 00000000..ce015b50 --- /dev/null +++ b/.github/workflows/python-publish.yml @@ -0,0 +1,56 @@ +name: Python Publish +on: + release: + types: [created] + push: + branches: [main] + +env: + POETRY_VERSION: 1.8.3 + PYTHON_VERSION: 3.10 + +jobs: + publish: + name: Upload release to PyPI + if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/p/graphrag + permissions: + id-token: write # IMPORTANT: this permission is mandatory for trusted publishing + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + fetch-tags: true + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: $PYTHON_VERSION + + - name: Install Poetry + uses: abatilo/actions-poetry@v3.0.0 + with: + poetry-version: $POETRY_VERSION + + - name: Add poetry-dynamic-versioning plugin + run: poetry self add "poetry-dynamic-versioning[plugin]" + + - name: Install dependencies + shell: bash + run: poetry install + + - name: Build Distributable + shell: bash + run: poetry build + + - name: Publish package distributions to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + packages-dir: dist + skip-existing: true + verbose: true + \ No newline at end of file diff --git a/.github/workflows/semver.yml b/.github/workflows/semver.yml new file mode 100644 index 00000000..139b759a --- /dev/null +++ b/.github/workflows/semver.yml @@ -0,0 +1,15 @@ +name: Semver Check +on: + pull_request: + branches: [main] + +jobs: + semver: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Check Semver + run: ./scripts/semver-check.sh \ No newline at end of file diff --git a/.github/workflows/spellcheck.yml b/.github/workflows/spellcheck.yml new file mode 100644 index 00000000..bbf2be9d --- /dev/null +++ b/.github/workflows/spellcheck.yml @@ -0,0 +1,15 @@ +name: Spellcheck +on: + push: + branches: [main] + pull_request: + paths: + - '**/*' +jobs: + spellcheck: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Spellcheck + run: ./scripts/spellcheck.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..da5c47c6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,67 @@ +# Node Artifacts +*/node_modules/ +docsite/*/src/**/*.js +docsite/*/lib/ +docsite/*/storybook-static/ +docsite/*/docsTemp/ +docsite/*/build/ +.swc/ +dist/ +# https://yarnpkg.com/advanced/qa#which-files-should-be-gitignored +docsite/.yarn/* +!docsite/.yarn/patches +!docsite/.yarn/releases +!docsite/.yarn/plugins +!docsite/.yarn/sdks +!docsite/.yarn/versions +docsite/.pnp.* + +.yarn/* +!.yarn/patches +!.yarn/releases +!.yarn/plugins +!.yarn/sdks +!.yarn/versions +.pnp.* + +# Python Artifacts +python/*/lib/ +# Test Output +.coverage +coverage/ +licenses.txt +examples_notebooks/*/lancedb +examples_notebooks/*/data +tests/fixtures/cache +tests/fixtures/*/cache +tests/fixtures/*/output +lancedb/ + +# Random +.DS_Store +*.log* +.venv +.conda +.tmp + + +.env +build.zip + +.turbo + +__pycache__ + +.pipeline + +# Azurite +temp_azurite/ +__azurite*.json +__blobstorage*.json +__blobstorage__/ + +# Getting started example +ragtest/ +.ragtest/ +.pipelines +.pipeline \ No newline at end of file diff --git a/.semversioner/next-release/minor-20240701200021928520.json b/.semversioner/next-release/minor-20240701200021928520.json new file mode 100644 index 00000000..30e29ca0 --- /dev/null +++ b/.semversioner/next-release/minor-20240701200021928520.json @@ -0,0 +1,4 @@ +{ + "type": "minor", + "description": "Initial Release" +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..6eb0e910 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,11 @@ +{ + "recommendations": [ + "arcanis.vscode-zipfs", + "ms-python.python", + "charliermarsh.ruff", + "ms-python.vscode-pylance", + "bierner.markdown-mermaid", + "streetsidesoftware.code-spell-checker", + "ronnidc.nunjucks" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..909771b8 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,12 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Attach to Node Functions", + "type": "node", + "request": "attach", + "port": 9229, + "preLaunchTask": "func: host start" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..ee8ded1e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,52 @@ +{ + "search.exclude": { + "**/.yarn": true, + "**/.pnp.*": true + }, + "eslint.nodePath": ".yarn/sdks", + "typescript.tsdk": ".yarn/sdks/typescript/lib", + "typescript.enablePromptUseWorkspaceTsdk": true, + "javascript.preferences.importModuleSpecifier": "relative", + "javascript.preferences.importModuleSpecifierEnding": "js", + "typescript.preferences.importModuleSpecifier": "relative", + "typescript.preferences.importModuleSpecifierEnding": "js", + "explorer.fileNesting.enabled": true, + "explorer.fileNesting.patterns": { + "*.ts": "${capture}.ts, ${capture}.hooks.ts, ${capture}.hooks.tsx, ${capture}.contexts.ts, ${capture}.stories.tsx, ${capture}.story.tsx, ${capture}.spec.tsx, ${capture}.base.ts, ${capture}.base.tsx, ${capture}.types.ts, ${capture}.styles.ts, ${capture}.styles.tsx, ${capture}.utils.ts, ${capture}.utils.tsx, ${capture}.constants.ts, ${capture}.module.scss, ${capture}.module.css, ${capture}.md", + "*.js": "${capture}.js.map, ${capture}.min.js, ${capture}.d.ts", + "*.jsx": "${capture}.js", + "*.tsx": "${capture}.ts, ${capture}.hooks.ts, ${capture}.hooks.tsx, ${capture}.contexts.ts, ${capture}.stories.tsx, ${capture}.story.tsx, ${capture}.spec.tsx, ${capture}.base.ts, ${capture}.base.tsx, ${capture}.types.ts, ${capture}.styles.ts, ${capture}.styles.tsx, ${capture}.utils.ts, ${capture}.utils.tsx, ${capture}.constants.ts, ${capture}.module.scss, ${capture}.module.css, ${capture}.md, ${capture}.css", + "tsconfig.json": "tsconfig.*.json", + "package.json": "package-lock.json, turbo.json, tsconfig.json, rome.json, biome.json, .npmignore, dictionary.txt, cspell.config.yaml", + "README.md": "*.md, LICENSE, CODEOWNERS", + ".eslintrc": ".eslintignore", + ".prettierrc": ".prettierignore", + ".gitattributes": ".gitignore", + ".yarnrc.yml": "yarn.lock, .pnp.*", + "jest.config.js": "jest.setup.mjs", + "pyproject.toml": "poetry.lock, poetry.toml", + "cspell.config.yaml": "dictionary.txt" + }, + "azureFunctions.postDeployTask": "npm install (functions)", + "azureFunctions.projectLanguage": "TypeScript", + "azureFunctions.projectRuntime": "~4", + "debug.internalConsoleOptions": "neverOpen", + "azureFunctions.preDeployTask": "npm prune (functions)", + "appService.zipIgnorePattern": [ + "node_modules{,/**}", + ".vscode{,/**}" + ], + "python.defaultInterpreterPath": "python/services/.venv/bin/python", + "python.languageServer": "Pylance", + "python.analysis.typeCheckingMode": "basic", + "cSpell.customDictionaries": { + "project-words": { + "name": "project-words", + "path": "${workspaceRoot}/dictionary.txt", + "description": "Words used in this project", + "addWords": true + }, + "custom": true, // Enable the `custom` dictionary + "internal-terms": true // Disable the `internal-terms` dictionary + } +} diff --git a/.vsts-ci.yml b/.vsts-ci.yml new file mode 100644 index 00000000..2a1e0964 --- /dev/null +++ b/.vsts-ci.yml @@ -0,0 +1,41 @@ +name: GraphRAG CI +pool: + vmImage: ubuntu-latest + +trigger: + batch: true + branches: + include: + - main + +variables: + isMain: $[eq(variables['Build.SourceBranch'], 'refs/heads/main')] + pythonVersion: "3.10" + poetryVersion: "1.6.1" + nodeVersion: "18.x" + artifactsFullFeedName: "Resilience/resilience_python" + +stages: + - stage: Compliance + dependsOn: [] + jobs: + - job: compliance + displayName: Compliance + pool: + vmImage: windows-latest + steps: + - task: CredScan@3 + inputs: + outputFormat: sarif + debugMode: false + + - task: ComponentGovernanceComponentDetection@0 + inputs: + scanType: "Register" + verbosity: "Verbose" + alertWarningLevel: "High" + + - task: PublishSecurityAnalysisLogs@3 + inputs: + ArtifactName: "CodeAnalysisLogs" + ArtifactType: "Container" \ No newline at end of file diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 00000000..c5612f27 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,6 @@ +# These owners will be the default owners for everything in +# the repo. Unless a later match takes precedence, +# @global-owner1 and @global-owner2 will be requested for +# review when someone opens a pull request. +* @microsoft/societal-resilience + diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..f9ba8cf6 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,9 @@ +# Microsoft Open Source Code of Conduct + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). + +Resources: + +- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) +- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) +- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..5f01e4bc --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,79 @@ +# Contributing to GraphRAG + +Thank you for your interest in contributing to GraphRAG! We welcome contributions from the community to help improve the project. + +## Code of Conduct + +This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) +declaring that you have the right to, and actually do, grant us the rights to use your contribution. +For details, visit https://cla.microsoft.com. + +When you submit a pull request, a CLA-bot will automatically determine whether you need +to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the +instructions provided by the bot. You will only need to do this once across all repositories using our CLA. + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) +or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. + +## How to Contribute + +1. Fork the repository and clone it to your local machine. +2. Create a new branch for your contribution: `git checkout -b my-contribution`. +3. Make your changes and ensure that the code passes all tests. +4. Commit your changes: `git commit -m "Add my contribution"`. +5. Create and commit a semver impact document by running `poetry run semversioner add-change -t -d `. +6. Push your changes to your forked repository: `git push origin my-contribution`. +7. Open a pull request to the main repository. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** Instead, please report them to the Microsoft Security Response Center (MSRC). +See [SECURITY.md](./SECURITY.md) for more information. + +## Before you start, file an issue + +Please follow this simple rule to help us eliminate any unnecessary wasted effort & frustration, and ensure an efficient and effective use of everyone's time - yours, ours, and other community members': + +> 👉 If you have a question, think you've discovered an issue, would like to propose a new feature, etc., then find/file an issue **BEFORE** starting work to fix/implement it. + +### Search existing issues first + +Before filing a new issue, search existing open and closed issues first: This project is moving fast! It is likely someone else has found the problem you're seeing, and someone may be working on or have already contributed a fix! + +If no existing item describes your issue/feature, great - please file a new issue: + +### File a new Issue + +- Don't know whether you're reporting an issue or requesting a feature? File an issue +- Have a question that you don't see answered in docs, videos, etc.? File an issue +- Want to know if we're planning on building a particular feature? File an issue +- Got a great idea for a new feature? File an issue/request/idea +- Don't understand how to do something? File an issue +- Found an existing issue that describes yours? Great - upvote and add additional commentary / info / repro-steps / etc. + +If from the previous guide you find yourself in the need of file an Issue please use the [issue tracker](https://github.com/microsoft/graphrag/issues). +Provide as much detail as possible to help us understand and address the problem. + +### Add information + +**Complete the new Issue form, providing as much information as possible**. The more information you provide, the more likely your issue/ask will be understood and implemented. Helpful information includes: + +- What device you're running (inc. CPU type, memory, disk, etc.) +- What OS your device is running +- What tools and apps you're using (e.g. VS 2022, VSCode, etc.) +- **We LOVE detailed repro steps!** What steps do we need to take to reproduce the issue? Assume we love to read repro steps. As much detail as you can stand is probably _barely_ enough detail for us! +- Prefer error message text where possible or screenshots of errors if text cannot be captured +- **If you intend to implement the fix/feature yourself then say so!** If you do not indicate otherwise we will assume that the issue is our to solve, or may label the issue as `Help-Wanted`. + +### DO NOT post "+1" comments + +> ⚠ DO NOT post "+1", "me too", or similar comments - they just add noise to an issue. + +If you don't have any additional info/context to add but would like to indicate that you're affected by the issue, upvote the original issue by clicking its [+😊] button and hitting 👍 (+1) icon. This way we can actually measure how impactful an issue is. + +--- + +## Thank you + +We appreciate your contributions to GraphRAG! diff --git a/DEVELOPING.md b/DEVELOPING.md new file mode 100644 index 00000000..dd1763ef --- /dev/null +++ b/DEVELOPING.md @@ -0,0 +1,85 @@ +# GraphRAG Development + +# Requirements + +| Name | Installation | Purpose | +| ------------------- | ------------------------------------------------------------ | ----------------------------------------------------------------------------------- | +| Python 3.10 or 3.11 | [Download](https://www.python.org/downloads/) | The library is Python-based. | +| Poetry | [Instructions](https://python-poetry.org/docs/#installation) | Poetry is used for package management and virtualenv management in Python codebases | + +# Getting Started + +## Install Dependencies + +```sh +# Install Python dependencies. +poetry install +``` + +## Execute the Indexing Engine + +```sh +poetry run poe index <...args> +``` + +## Executing Queries + +```sh +poetry run poe query <...args> +``` + +# Azurite + +Some unit and smoke tests use Azurite to emulate Azure resources. This can be started by running: + +```sh +./scripts/start-azurite.sh +``` + +or by simply running `azurite` in the terminal if already installed globally. See the [Azurite documentation](https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite) for more information about how to install and use Azurite. + +# Lifecycle Scripts + +Our Python package utilizes Poetry to manage dependencies and [poethepoet](https://pypi.org/project/poethepoet/) to manage build scripts. + +Available scripts are: + +- `poetry run poe index` - Run the Indexing CLI +- `poetry run poe query` - Run the Query CLI +- `poetry build` - This invokes `poetry build`, which will build a wheel file and other distributable artifacts. +- `poetry run poe test` - This will execute all tests. +- `poetry run poe test_unit` - This will execute unit tests. +- `poetry run poe test_integration` - This will execute integration tests. +- `poetry run poe test_smoke` - This will execute smoke tests. +- `poetry run poe check` - This will perform a suite of static checks across the package, including: + - formatting + - documentation formatting + - linting + - security patterns + - type-checking +- `poetry run poe fix` - This will apply any available auto-fixes to the package. Usually this is just formatting fixes. +- `poetry run poe fix_unsafe` - This will apply any available auto-fixes to the package, including those that may be unsafe. +- `poetry run poe format` - Explicitly run the formatter across the package. + +## Troubleshooting + +### "RuntimeError: llvm-config failed executing, please point LLVM_CONFIG to the path for llvm-config" when running poetry install + +Make sure llvm-9 and llvm-9-dev are installed: + +`sudo apt-get install llvm-9 llvm-9-dev` + +and then in your bashrc, add + +`export LLVM_CONFIG=/usr/bin/llvm-config-9` + +### "numba/\_pymodule.h:6:10: fatal error: Python.h: No such file or directory" when running poetry install + +Make sure you have python3.10-dev installed or more generally `python-dev` + +`sudo apt-get install python3.10-dev` + +### LLM call constantly exceeds TPM, RPM or time limits + +`GRAPHRAG_LLM_THREAD_COUNT` and `GRAPHRAG_EMBEDDING_THREAD_COUNT` are both set to 50 by default. You can modify this values +to reduce concurrency. Please refer to the [Configuration Documents](https://microsoft.github.io/graphrag/posts/config/overview/) diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..9e841e7a --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/RAI_TRANSPARENCY.md b/RAI_TRANSPARENCY.md new file mode 100644 index 00000000..1a789aed --- /dev/null +++ b/RAI_TRANSPARENCY.md @@ -0,0 +1,41 @@ +# GraphRAG: Responsible AI FAQ + +## What is GraphRAG? + +GraphRAG is an AI-based content interpretation and search capability. Using LLMs, it parses data to create a knowledge graph and answer user questions about a user-provided private dataset. + +## What can GraphRAG do? + +GraphRAG is able to connect information across large volumes of information and use these connections to answer questions that are difficult or impossible to answer using keyword and vector-based search mechanisms. Building on the previous question, provide semi-technical, high-level information on how the system offers functionality for various uses. This lets a system using GraphRAG to answer questions where the answers span many documents as well as thematic questions such as “what are the top themes in this dataset?.” + +## What are GraphRAG’s intended use(s)? + +* GraphRAG is intended to support critical information discovery and analysis use cases where the information required to arrive at a useful insight spans many documents, is noisy, is mixed with mis and/or dis-information, or when the questions users aim to answer are more abstract or thematic than the underlying data can directly answer. +* GraphRAG is designed to be used in settings where users are already trained on responsible analytic approaches and critical reasoning is expected. GraphRAG is capable of providing high degrees of insight on complex information topics, however human analysis by a domain expert of the answers is needed in order to verify and augment GraphRAG’s generated responses. +* GraphRAG is intended to be deployed and used with a domain specific corpus of text data. GraphRAG itself does not collect user data, but users are encouraged to verify data privacy policies of the chosen LLM used to configure GraphRAG. + +## How was GraphRAG evaluated? What metrics are used to measure performance? + +GraphRAG has been evaluated in multiple ways. The primary concerns are 1) accurate representation of the data set, 2) providing transparency and groundedness of responses, 3) resilience to prompt and data corpus injection attacks, and 4) low hallucination rates. Details on how each of these has been evaluated is outlined below by number. + +1) Accurate representation of the dataset has been tested by both manual inspection and automated testing against a “gold answer” that is created from randomly selected subsets of a test corpus. + +2) Transparency and groundedness of responses is tested via automated answer coverage evaluation and human inspection of the underlying context returned. + +3) We test both user prompt injection attacks (“jailbreaks”) and cross prompt injection attacks (“data attacks”) using manual and semi-automated techniques. + +4) Hallucination rates are evaluated using claim coverage metrics, manual inspection of answer and source, and adversarial attacks to attempt a forced hallucination through adversarial and exceptionally challenging datasets. + +## What are the limitations of GraphRAG? How can users minimize the impact of GraphRAG’s limitations when using the system? + +GraphRAG depends on a well-constructed indexing examples. For general applications (e.g. content oriented around people, places, organizations, things, etc.) we provide example indexing prompts. For unique datasets effective indexing can depend on proper identification of domain-specific concepts. + +Indexing is a relatively expensive operation; a best practice to mitigate indexing is to create a small test dataset in the target domain to ensure indexer performance prior to large indexing operations. + +## What operational factors and settings allow for effective and responsible use of GraphRAG? + +GraphRAG is designed for use by users with domain sophistication and experience working through difficult information challenges. While the approach is generally robust to injection attacks and identifying conflicting sources of information, the system is designed for trusted users. Proper human analysis of responses is important to generate reliable insights, and the provenance of information should be traced to ensure human agreement with the inferences made as part of the answer generation. + +GraphRAG yields the most effective results on natural language text data that is collectively focused on an overall topic or theme, and that is entity rich – entities being people, places, things, or objects that can be uniquely identified. + +While GraphRAG has been evaluated for its resilience to prompt and data corpus injection attacks, and has been probed for specific types of harms, the LLM that the user configures with GraphRAG may produce inappropriate or offensive content, which may make it inappropriate to deploy for sensitive contexts without additional mitigations that are specific to the use case and model. Developers should assess outputs for their context and use available safety classifiers, model specific safety filters and features (such as https://azure.microsoft.com/en-us/products/ai-services/ai-content-safety), or custom solutions appropriate for their use case. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..f14e33a8 --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# GraphRAG + +👉 [Use the GraphRAG Accelerator solution](https://github.com/Azure-Samples/graphrag-accelerator) +👉 [Microsoft Research Blog Post](https://www.microsoft.com/en-us/research/blog/graphrag-unlocking-llm-discovery-on-narrative-private-data/) +👉 [Read the docs](https://microsoft.github.io/graphrag) + +## Overview + +The GraphRAG project is a data pipeline and transformation suite that is designed to extract meaningful, structured data from unstructured text using the power of LLMs. + +To learn more about GraphRAG and how it can be used to enhance your LLMs ability to reason about your private data, please visit the Microsoft Research Blog Post. + +## Quickstart + +To get started with the GraphRAG system we recommend trying the [Solution Accelerator](https://github.com/Azure-Samples/graphrag-accelerator) package. This provides a user-friendly end-to-end experience with Azure resources. + +## Repository Guidance + +This repository presents a methodology for using knowledge graph memory structures to enhance LLM outputs. Please note that the provided code serves as a demonstration and is not an officially supported Microsoft offering. + +## Diving Deeper + +- To learn about our contribution guidelines, see [CONTRIBUTING.md](./CONTRIBUTING.md) +- To start developing _GraphRAG_, see [DEVELOPING.md](./DEVELOPING.md) + +## Prompt Tuning + +Using _GraphRAG_ with your data out of the box may not yield the best possible results. +We strongly recommend to fine-tune your prompts following the [Prompt Tuning Guide](https://microsoft.github.io/graphrag/posts/prompt_tuning/overview/) in our documentation. + +## Responsible AI FAQ + +See [RAI_TRANSPARENCY.md](./RAI_TRANSPARENCY.md) + +- [What is GraphRAG?](./RAI_TRANSPARENCY.md#what-is-graphrag) +- [What can GraphRAG do?](./RAI_TRANSPARENCY.md#what-can-graphrag-do) +- [What are GraphRAG’s intended use(s)?](./RAI_TRANSPARENCY.md#what-are-graphrags-intended-uses) +- [How was GraphRAG evaluated? What metrics are used to measure performance?](./RAI_TRANSPARENCY.md#how-was-graphrag-evaluated-what-metrics-are-used-to-measure-performance) +- [What are the limitations of GraphRAG? How can users minimize the impact of GraphRAG’s limitations when using the system?](./RAI_TRANSPARENCY.md#what-are-the-limitations-of-graphrag-how-can-users-minimize-the-impact-of-graphrags-limitations-when-using-the-system) +- [What operational factors and settings allow for effective and responsible use of GraphRAG?](./RAI_TRANSPARENCY.md#what-operational-factors-and-settings-allow-for-effective-and-responsible-use-of-graphrag) + +## Trademarks + +This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft +trademarks or logos is subject to and must follow +[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). +Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. +Any use of third-party trademarks or logos are subject to those third-party's policies. + +## Privacy + +[Microsoft Privacy Statement](https://privacy.microsoft.com/en-us/privacystatement) diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..e5c7ae54 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,37 @@ +## Security + +Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). + +If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc751383(v=technet.10)), please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). + +If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). + +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) page for more details about our active programs. + +## Preferred Languages + +We prefer all communications to be in English. + +## Policy + +Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd). \ No newline at end of file diff --git a/SUPPORT.md b/SUPPORT.md new file mode 100644 index 00000000..2c18260c --- /dev/null +++ b/SUPPORT.md @@ -0,0 +1,27 @@ +# Support + +## How to file issues and get help + +This project uses GitHub Issues to track bugs and feature requests. Please search the existing +issues before filing new issues to avoid duplicates. For new issues, file your bug or +feature request as a new Issue. + +For help and questions about using this project, please create a GitHub issue with your question. + +## Microsoft Support Policy + +# Support for this **PROJECT or PRODUCT** is limited to the resources listed above. + +# Support + +## How to file issues and get help + +This project uses GitHub Issues to track bugs and feature requests. Please search the existing +issues before filing new issues to avoid duplicates. For new issues, file your bug or +feature request as a new Issue. + +For help and questions about using this project, please file an issue on the repo. + +## Microsoft Support Policy + +Support for this project is limited to the resources listed above. diff --git a/cspell.config.yaml b/cspell.config.yaml new file mode 100644 index 00000000..daa90e48 --- /dev/null +++ b/cspell.config.yaml @@ -0,0 +1,33 @@ +$schema: https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json +version: "0.2" +allowCompoundWords: true +dictionaryDefinitions: + - name: dictionary + path: "./dictionary.txt" + addWords: true +dictionaries: + - dictionary +ignorePaths: + - cspell.config.yaml + - node_modules + - _site + - /project-words.txt + - default_pipeline.yml + - .turbo + - output/ + - dist/ + - temp_azurite/ + - __pycache__ + - pyproject.toml + - entity_extraction.txt + - package.json + - tests/fixtures/ + - docsite/data/ + - docsite/nbdocsite_template/ + - docsite/posts/query/notebooks/inputs/ + - examples_notebooks/inputs/ + - "*.csv" + - "*.parquet" + - "*.faiss" + - "*.ipynb" + - "*.log" diff --git a/dictionary.txt b/dictionary.txt new file mode 100644 index 00000000..65328e09 --- /dev/null +++ b/dictionary.txt @@ -0,0 +1,143 @@ +# Team +Alonso + +# Pythonisms +PYTHONPATH +pycache +nopython +virtualenv +Pythonisms +pyproject +ipynb +pymodule +virtualenv +virtualenvs +signum +ospath +msecs +asdict +isna +getcwd +fillna +noqa + +# Azure +abfs +Hnsw +odata + +# NLTK Terms +chunker +wordnet +maxent +punkt + +# Libraries +Langchain +networkx +graspologic +graphml +dataframe +dataframes +nltk +datashaper +numba +graphintelligence +dotenv +tiktoken +pydantic +faiss +pyarrow +pyaml +Chakra +poethepoet +pyodbc +lancedb +httpx +pymongo +uvloop +aiofiles +asyncio +numpy +pypi +nbformat +semversioner + +# Library Methods +iterrows +rprint +ndarray +nprobe +astype +monkeypatches +nlist +ntotal +quantizer +arun +tiktokens +dtype +linewidths +asearch +iloc +itertuples +isin +nocache +nbconvert + +# Verbs +binarize +prechunked +openai +genid +umap +concat +unhot +groupby +retryer +agenerate +aembed +dedupe + +# LLM Terms +AOAI +embedder +llm +llms + +# Galaxy-Brain Terms +Unipartite +idempotently +covariate +covariates +logit +confusors + +# Charting +plottable +scatterplot + +# Resilience Team Terms +megapipeline +columnwise +docstore +datasource +devcontainers +codebases + +# Microsoft +MSRC + +# Broken Upstream +# TODO FIX IN DATASHAPER +Arrary + +# Prompt Inputs +dulce +Asadi +ABILA +Abila +POKRALLY + +# English +skippable +upvote \ No newline at end of file diff --git a/docsite/.eleventy.js b/docsite/.eleventy.js new file mode 100644 index 00000000..11141917 --- /dev/null +++ b/docsite/.eleventy.js @@ -0,0 +1,25 @@ +const { EleventyHtmlBasePlugin } = require("@11ty/eleventy"); +const syntaxHighlight = require("@11ty/eleventy-plugin-syntaxhighlight"); +const codeClipboard = require("eleventy-plugin-code-clipboard"); +const pluginMermaid = require("@kevingimbel/eleventy-plugin-mermaid"); +const markdownIt = require('markdown-it'); + +module.exports = (eleventyConfig) => { + eleventyConfig.addPlugin(syntaxHighlight); + eleventyConfig.addPlugin(codeClipboard); + eleventyConfig.addPlugin(pluginMermaid); + eleventyConfig.addPlugin(EleventyHtmlBasePlugin, { + baseHref: process.env.DOCSITE_BASE_URL || "" + }); + eleventyConfig.addPassthroughCopy("data"); + eleventyConfig.addPassthroughCopy("img"); + // Ignore auto-generated content + eleventyConfig.setUseGitIgnore(false); + + const markdownLibrary = markdownIt({ + html: true + }).use(codeClipboard.markdownItCopyButton); + + eleventyConfig.setLibrary("md", markdownLibrary); + +}; \ No newline at end of file diff --git a/docsite/.eleventyignore b/docsite/.eleventyignore new file mode 100644 index 00000000..f4c3c5d9 --- /dev/null +++ b/docsite/.eleventyignore @@ -0,0 +1,2 @@ +!posts/index/verbs/*.md +!posts/index/workflows/*.md diff --git a/docsite/.gitignore b/docsite/.gitignore new file mode 100644 index 00000000..845c745a --- /dev/null +++ b/docsite/.gitignore @@ -0,0 +1,6 @@ +_site +_posts +posts/query/notebooks/*.ipynb +posts/query/notebooks/*_nb.md +*.parquet +*.zip \ No newline at end of file diff --git a/docsite/.yarn/releases/yarn-4.0.2.cjs b/docsite/.yarn/releases/yarn-4.0.2.cjs new file mode 100644 index 00000000..f12c120e --- /dev/null +++ b/docsite/.yarn/releases/yarn-4.0.2.cjs @@ -0,0 +1,893 @@ +#!/usr/bin/env node +/* eslint-disable */ +//prettier-ignore +(()=>{var n_e=Object.create;var MT=Object.defineProperty;var i_e=Object.getOwnPropertyDescriptor;var s_e=Object.getOwnPropertyNames;var o_e=Object.getPrototypeOf,a_e=Object.prototype.hasOwnProperty;var Be=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+t+'" is not supported')});var Et=(t,e)=>()=>(t&&(e=t(t=0)),e);var _=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),Kt=(t,e)=>{for(var r in e)MT(t,r,{get:e[r],enumerable:!0})},l_e=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of s_e(e))!a_e.call(t,a)&&a!==r&&MT(t,a,{get:()=>e[a],enumerable:!(o=i_e(e,a))||o.enumerable});return t};var $e=(t,e,r)=>(r=t!=null?n_e(o_e(t)):{},l_e(e||!t||!t.__esModule?MT(r,"default",{value:t,enumerable:!0}):r,t));var vi={};Kt(vi,{SAFE_TIME:()=>F7,S_IFDIR:()=>wD,S_IFLNK:()=>ID,S_IFMT:()=>Mu,S_IFREG:()=>Hw});var Mu,wD,Hw,ID,F7,T7=Et(()=>{Mu=61440,wD=16384,Hw=32768,ID=40960,F7=456789e3});var ar={};Kt(ar,{EBADF:()=>Io,EBUSY:()=>c_e,EEXIST:()=>g_e,EINVAL:()=>A_e,EISDIR:()=>h_e,ENOENT:()=>f_e,ENOSYS:()=>u_e,ENOTDIR:()=>p_e,ENOTEMPTY:()=>m_e,EOPNOTSUPP:()=>y_e,EROFS:()=>d_e,ERR_DIR_CLOSED:()=>OT});function Rl(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}function c_e(t){return Rl("EBUSY",t)}function u_e(t,e){return Rl("ENOSYS",`${t}, ${e}`)}function A_e(t){return Rl("EINVAL",`invalid argument, ${t}`)}function Io(t){return Rl("EBADF",`bad file descriptor, ${t}`)}function f_e(t){return Rl("ENOENT",`no such file or directory, ${t}`)}function p_e(t){return Rl("ENOTDIR",`not a directory, ${t}`)}function h_e(t){return Rl("EISDIR",`illegal operation on a directory, ${t}`)}function g_e(t){return Rl("EEXIST",`file already exists, ${t}`)}function d_e(t){return Rl("EROFS",`read-only filesystem, ${t}`)}function m_e(t){return Rl("ENOTEMPTY",`directory not empty, ${t}`)}function y_e(t){return Rl("EOPNOTSUPP",`operation not supported, ${t}`)}function OT(){return Rl("ERR_DIR_CLOSED","Directory handle was closed")}var BD=Et(()=>{});var Ea={};Kt(Ea,{BigIntStatsEntry:()=>ey,DEFAULT_MODE:()=>HT,DirEntry:()=>UT,StatEntry:()=>$m,areStatsEqual:()=>jT,clearStats:()=>vD,convertToBigIntStats:()=>C_e,makeDefaultStats:()=>R7,makeEmptyStats:()=>E_e});function R7(){return new $m}function E_e(){return vD(R7())}function vD(t){for(let e in t)if(Object.hasOwn(t,e)){let r=t[e];typeof r=="number"?t[e]=0:typeof r=="bigint"?t[e]=BigInt(0):_T.types.isDate(r)&&(t[e]=new Date(0))}return t}function C_e(t){let e=new ey;for(let r in t)if(Object.hasOwn(t,r)){let o=t[r];typeof o=="number"?e[r]=BigInt(o):_T.types.isDate(o)&&(e[r]=new Date(o))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function jT(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs||t.blksize!==e.blksize||t.blocks!==e.blocks||t.ctimeMs!==e.ctimeMs||t.dev!==e.dev||t.gid!==e.gid||t.ino!==e.ino||t.isBlockDevice()!==e.isBlockDevice()||t.isCharacterDevice()!==e.isCharacterDevice()||t.isDirectory()!==e.isDirectory()||t.isFIFO()!==e.isFIFO()||t.isFile()!==e.isFile()||t.isSocket()!==e.isSocket()||t.isSymbolicLink()!==e.isSymbolicLink()||t.mode!==e.mode||t.mtimeMs!==e.mtimeMs||t.nlink!==e.nlink||t.rdev!==e.rdev||t.size!==e.size||t.uid!==e.uid)return!1;let r=t,o=e;return!(r.atimeNs!==o.atimeNs||r.mtimeNs!==o.mtimeNs||r.ctimeNs!==o.ctimeNs||r.birthtimeNs!==o.birthtimeNs)}var _T,HT,UT,$m,ey,qT=Et(()=>{_T=$e(Be("util")),HT=33188,UT=class{constructor(){this.name="";this.path="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},$m=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=HT;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},ey=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(HT);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(61440))===BigInt(16384)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(61440))===BigInt(32768)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(61440))===BigInt(40960)}}});function D_e(t){let e,r;if(e=t.match(B_e))t=e[1];else if(r=t.match(v_e))t=`\\\\${r[1]?".\\":""}${r[2]}`;else return t;return t.replace(/\//g,"\\")}function P_e(t){t=t.replace(/\\/g,"/");let e,r;return(e=t.match(w_e))?t=`/${e[1]}`:(r=t.match(I_e))&&(t=`/unc/${r[1]?".dot/":""}${r[2]}`),t}function DD(t,e){return t===ue?L7(e):GT(e)}var jw,Bt,dr,ue,K,N7,w_e,I_e,B_e,v_e,GT,L7,Ca=Et(()=>{jw=$e(Be("path")),Bt={root:"/",dot:".",parent:".."},dr={home:"~",nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",pnpData:".pnp.data.json",pnpEsmLoader:".pnp.loader.mjs",rc:".yarnrc.yml",env:".env"},ue=Object.create(jw.default),K=Object.create(jw.default.posix);ue.cwd=()=>process.cwd();K.cwd=process.platform==="win32"?()=>GT(process.cwd()):process.cwd;process.platform==="win32"&&(K.resolve=(...t)=>t.length>0&&K.isAbsolute(t[0])?jw.default.posix.resolve(...t):jw.default.posix.resolve(K.cwd(),...t));N7=function(t,e,r){return e=t.normalize(e),r=t.normalize(r),e===r?".":(e.endsWith(t.sep)||(e=e+t.sep),r.startsWith(e)?r.slice(e.length):null)};ue.contains=(t,e)=>N7(ue,t,e);K.contains=(t,e)=>N7(K,t,e);w_e=/^([a-zA-Z]:.*)$/,I_e=/^\/\/(\.\/)?(.*)$/,B_e=/^\/([a-zA-Z]:.*)$/,v_e=/^\/unc\/(\.dot\/)?(.*)$/;GT=process.platform==="win32"?P_e:t=>t,L7=process.platform==="win32"?D_e:t=>t;ue.fromPortablePath=L7;ue.toPortablePath=GT});async function PD(t,e){let r="0123456789abcdef";await t.mkdirPromise(e.indexPath,{recursive:!0});let o=[];for(let a of r)for(let n of r)o.push(t.mkdirPromise(t.pathUtils.join(e.indexPath,`${a}${n}`),{recursive:!0}));return await Promise.all(o),e.indexPath}async function M7(t,e,r,o,a){let n=t.pathUtils.normalize(e),u=r.pathUtils.normalize(o),A=[],p=[],{atime:h,mtime:E}=a.stableTime?{atime:Lg,mtime:Lg}:await r.lstatPromise(u);await t.mkdirpPromise(t.pathUtils.dirname(e),{utimes:[h,E]}),await YT(A,p,t,n,r,u,{...a,didParentExist:!0});for(let I of A)await I();await Promise.all(p.map(I=>I()))}async function YT(t,e,r,o,a,n,u){let A=u.didParentExist?await O7(r,o):null,p=await a.lstatPromise(n),{atime:h,mtime:E}=u.stableTime?{atime:Lg,mtime:Lg}:p,I;switch(!0){case p.isDirectory():I=await x_e(t,e,r,o,A,a,n,p,u);break;case p.isFile():I=await Q_e(t,e,r,o,A,a,n,p,u);break;case p.isSymbolicLink():I=await F_e(t,e,r,o,A,a,n,p,u);break;default:throw new Error(`Unsupported file type (${p.mode})`)}return(u.linkStrategy?.type!=="HardlinkFromIndex"||!p.isFile())&&((I||A?.mtime?.getTime()!==E.getTime()||A?.atime?.getTime()!==h.getTime())&&(e.push(()=>r.lutimesPromise(o,h,E)),I=!0),(A===null||(A.mode&511)!==(p.mode&511))&&(e.push(()=>r.chmodPromise(o,p.mode&511)),I=!0)),I}async function O7(t,e){try{return await t.lstatPromise(e)}catch{return null}}async function x_e(t,e,r,o,a,n,u,A,p){if(a!==null&&!a.isDirectory())if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;let h=!1;a===null&&(t.push(async()=>{try{await r.mkdirPromise(o,{mode:A.mode})}catch(v){if(v.code!=="EEXIST")throw v}}),h=!0);let E=await n.readdirPromise(u),I=p.didParentExist&&!a?{...p,didParentExist:!1}:p;if(p.stableSort)for(let v of E.sort())await YT(t,e,r,r.pathUtils.join(o,v),n,n.pathUtils.join(u,v),I)&&(h=!0);else(await Promise.all(E.map(async b=>{await YT(t,e,r,r.pathUtils.join(o,b),n,n.pathUtils.join(u,b),I)}))).some(b=>b)&&(h=!0);return h}async function b_e(t,e,r,o,a,n,u,A,p,h){let E=await n.checksumFilePromise(u,{algorithm:"sha1"}),I=r.pathUtils.join(h.indexPath,E.slice(0,2),`${E}.dat`),v;(te=>(te[te.Lock=0]="Lock",te[te.Rename=1]="Rename"))(v||={});let b=1,C=await O7(r,I);if(a){let U=C&&a.dev===C.dev&&a.ino===C.ino,J=C?.mtimeMs!==S_e;if(U&&J&&h.autoRepair&&(b=0,C=null),!U)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1}let T=!C&&b===1?`${I}.${Math.floor(Math.random()*4294967296).toString(16).padStart(8,"0")}`:null,L=!1;return t.push(async()=>{if(!C&&(b===0&&await r.lockPromise(I,async()=>{let U=await n.readFilePromise(u);await r.writeFilePromise(I,U)}),b===1&&T)){let U=await n.readFilePromise(u);await r.writeFilePromise(T,U);try{await r.linkPromise(T,I)}catch(J){if(J.code==="EEXIST")L=!0,await r.unlinkPromise(T);else throw J}}a||await r.linkPromise(I,o)}),e.push(async()=>{C||await r.lutimesPromise(I,Lg,Lg),T&&!L&&await r.unlinkPromise(T)}),!1}async function k_e(t,e,r,o,a,n,u,A,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;return t.push(async()=>{let h=await n.readFilePromise(u);await r.writeFilePromise(o,h)}),!0}async function Q_e(t,e,r,o,a,n,u,A,p){return p.linkStrategy?.type==="HardlinkFromIndex"?b_e(t,e,r,o,a,n,u,A,p,p.linkStrategy):k_e(t,e,r,o,a,n,u,A,p)}async function F_e(t,e,r,o,a,n,u,A,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;return t.push(async()=>{await r.symlinkPromise(DD(r.pathUtils,await n.readlinkPromise(u)),o)}),!0}var Lg,S_e,WT=Et(()=>{Ca();Lg=new Date(456789e3*1e3),S_e=Lg.getTime()});function SD(t,e,r,o){let a=()=>{let n=r.shift();if(typeof n>"u")return null;let u=t.pathUtils.join(e,n);return Object.assign(t.statSync(u),{name:n,path:void 0})};return new qw(e,a,o)}var qw,U7=Et(()=>{BD();qw=class{constructor(e,r,o={}){this.path=e;this.nextDirent=r;this.opts=o;this.closed=!1}throwIfClosed(){if(this.closed)throw OT()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let r=this.readSync();return typeof e<"u"?e(null,r):Promise.resolve(r)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e<"u"?e(null):Promise.resolve()}closeSync(){this.throwIfClosed(),this.opts.onClose?.(),this.closed=!0}}});function _7(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${t}'`)}var H7,ty,j7=Et(()=>{H7=Be("events");qT();ty=class extends H7.EventEmitter{constructor(r,o,{bigint:a=!1}={}){super();this.status="ready";this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=r,this.path=o,this.bigint=a,this.lastStats=this.stat()}static create(r,o,a){let n=new ty(r,o,a);return n.start(),n}start(){_7(this.status,"ready"),this.status="running",this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit("change",this.lastStats,this.lastStats)},3)}stop(){_7(this.status,"running"),this.status="stopped",this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit("stop")}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch{let o=this.bigint?new ey:new $m;return vD(o)}}makeInterval(r){let o=setInterval(()=>{let a=this.stat(),n=this.lastStats;jT(a,n)||(this.lastStats=a,this.emit("change",a,n))},r.interval);return r.persistent?o:o.unref()}registerChangeListener(r,o){this.addListener("change",r),this.changeListeners.set(r,this.makeInterval(o))}unregisterChangeListener(r){this.removeListener("change",r);let o=this.changeListeners.get(r);typeof o<"u"&&clearInterval(o),this.changeListeners.delete(r)}unregisterAllChangeListeners(){for(let r of this.changeListeners.keys())this.unregisterChangeListener(r)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let r of this.changeListeners.values())r.ref();return this}unref(){for(let r of this.changeListeners.values())r.unref();return this}}});function ry(t,e,r,o){let a,n,u,A;switch(typeof r){case"function":a=!1,n=!0,u=5007,A=r;break;default:({bigint:a=!1,persistent:n=!0,interval:u=5007}=r),A=o;break}let p=xD.get(t);typeof p>"u"&&xD.set(t,p=new Map);let h=p.get(e);return typeof h>"u"&&(h=ty.create(t,e,{bigint:a}),p.set(e,h)),h.registerChangeListener(A,{persistent:n,interval:u}),h}function Mg(t,e,r){let o=xD.get(t);if(typeof o>"u")return;let a=o.get(e);typeof a>"u"||(typeof r>"u"?a.unregisterAllChangeListeners():a.unregisterChangeListener(r),a.hasChangeListeners()||(a.stop(),o.delete(e)))}function Og(t){let e=xD.get(t);if(!(typeof e>"u"))for(let r of e.keys())Mg(t,r)}var xD,VT=Et(()=>{j7();xD=new WeakMap});function T_e(t){let e=t.match(/\r?\n/g);if(e===null)return G7.EOL;let r=e.filter(a=>a===`\r +`).length,o=e.length-r;return r>o?`\r +`:` +`}function Ug(t,e){return e.replace(/\r?\n/g,T_e(t))}var q7,G7,hf,Ou,_g=Et(()=>{q7=Be("crypto"),G7=Be("os");WT();Ca();hf=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:r=!1}={}){let o=[e];for(;o.length>0;){let a=o.shift();if((await this.lstatPromise(a)).isDirectory()){let u=await this.readdirPromise(a);if(r)for(let A of u.sort())o.push(this.pathUtils.join(a,A));else throw new Error("Not supported")}else yield a}}async checksumFilePromise(e,{algorithm:r="sha512"}={}){let o=await this.openPromise(e,"r");try{let n=Buffer.allocUnsafeSlow(65536),u=(0,q7.createHash)(r),A=0;for(;(A=await this.readPromise(o,n,0,65536))!==0;)u.update(A===65536?n:n.slice(0,A));return u.digest("hex")}finally{await this.closePromise(o)}}async removePromise(e,{recursive:r=!0,maxRetries:o=5}={}){let a;try{a=await this.lstatPromise(e)}catch(n){if(n.code==="ENOENT")return;throw n}if(a.isDirectory()){if(r){let n=await this.readdirPromise(e);await Promise.all(n.map(u=>this.removePromise(this.pathUtils.resolve(e,u))))}for(let n=0;n<=o;n++)try{await this.rmdirPromise(e);break}catch(u){if(u.code!=="EBUSY"&&u.code!=="ENOTEMPTY")throw u;nsetTimeout(A,n*100))}}else await this.unlinkPromise(e)}removeSync(e,{recursive:r=!0}={}){let o;try{o=this.lstatSync(e)}catch(a){if(a.code==="ENOENT")return;throw a}if(o.isDirectory()){if(r)for(let a of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,a));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:r,utimes:o}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let u=2;u<=a.length;++u){let A=a.slice(0,u).join(this.pathUtils.sep);if(!this.existsSync(A)){try{await this.mkdirPromise(A)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??=A,r!=null&&await this.chmodPromise(A,r),o!=null)await this.utimesPromise(A,o[0],o[1]);else{let p=await this.statPromise(this.pathUtils.dirname(A));await this.utimesPromise(A,p.atime,p.mtime)}}}return n}mkdirpSync(e,{chmod:r,utimes:o}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let u=2;u<=a.length;++u){let A=a.slice(0,u).join(this.pathUtils.sep);if(!this.existsSync(A)){try{this.mkdirSync(A)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??=A,r!=null&&this.chmodSync(A,r),o!=null)this.utimesSync(A,o[0],o[1]);else{let p=this.statSync(this.pathUtils.dirname(A));this.utimesSync(A,p.atime,p.mtime)}}}return n}async copyPromise(e,r,{baseFs:o=this,overwrite:a=!0,stableSort:n=!1,stableTime:u=!1,linkStrategy:A=null}={}){return await M7(this,e,o,r,{overwrite:a,stableSort:n,stableTime:u,linkStrategy:A})}copySync(e,r,{baseFs:o=this,overwrite:a=!0}={}){let n=o.lstatSync(r),u=this.existsSync(e);if(n.isDirectory()){this.mkdirpSync(e);let p=o.readdirSync(r);for(let h of p)this.copySync(this.pathUtils.join(e,h),o.pathUtils.join(r,h),{baseFs:o,overwrite:a})}else if(n.isFile()){if(!u||a){u&&this.removeSync(e);let p=o.readFileSync(r);this.writeFileSync(e,p)}}else if(n.isSymbolicLink()){if(!u||a){u&&this.removeSync(e);let p=o.readlinkSync(r);this.symlinkSync(DD(this.pathUtils,p),e)}}else throw new Error(`Unsupported file type (file: ${r}, mode: 0o${n.mode.toString(8).padStart(6,"0")})`);let A=n.mode&511;this.chmodSync(e,A)}async changeFilePromise(e,r,o={}){return Buffer.isBuffer(r)?this.changeFileBufferPromise(e,r,o):this.changeFileTextPromise(e,r,o)}async changeFileBufferPromise(e,r,{mode:o}={}){let a=Buffer.alloc(0);try{a=await this.readFilePromise(e)}catch{}Buffer.compare(a,r)!==0&&await this.writeFilePromise(e,r,{mode:o})}async changeFileTextPromise(e,r,{automaticNewlines:o,mode:a}={}){let n="";try{n=await this.readFilePromise(e,"utf8")}catch{}let u=o?Ug(n,r):r;n!==u&&await this.writeFilePromise(e,u,{mode:a})}changeFileSync(e,r,o={}){return Buffer.isBuffer(r)?this.changeFileBufferSync(e,r,o):this.changeFileTextSync(e,r,o)}changeFileBufferSync(e,r,{mode:o}={}){let a=Buffer.alloc(0);try{a=this.readFileSync(e)}catch{}Buffer.compare(a,r)!==0&&this.writeFileSync(e,r,{mode:o})}changeFileTextSync(e,r,{automaticNewlines:o=!1,mode:a}={}){let n="";try{n=this.readFileSync(e,"utf8")}catch{}let u=o?Ug(n,r):r;n!==u&&this.writeFileSync(e,u,{mode:a})}async movePromise(e,r){try{await this.renamePromise(e,r)}catch(o){if(o.code==="EXDEV")await this.copyPromise(r,e),await this.removePromise(e);else throw o}}moveSync(e,r){try{this.renameSync(e,r)}catch(o){if(o.code==="EXDEV")this.copySync(r,e),this.removeSync(e);else throw o}}async lockPromise(e,r){let o=`${e}.flock`,a=1e3/60,n=Date.now(),u=null,A=async()=>{let p;try{[p]=await this.readJsonPromise(o)}catch{return Date.now()-n<500}try{return process.kill(p,0),!0}catch{return!1}};for(;u===null;)try{u=await this.openPromise(o,"wx")}catch(p){if(p.code==="EEXIST"){if(!await A())try{await this.unlinkPromise(o);continue}catch{}if(Date.now()-n<60*1e3)await new Promise(h=>setTimeout(h,a));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${o})`)}else throw p}await this.writePromise(u,JSON.stringify([process.pid]));try{return await r()}finally{try{await this.closePromise(u),await this.unlinkPromise(o)}catch{}}}async readJsonPromise(e){let r=await this.readFilePromise(e,"utf8");try{return JSON.parse(r)}catch(o){throw o.message+=` (in ${e})`,o}}readJsonSync(e){let r=this.readFileSync(e,"utf8");try{return JSON.parse(r)}catch(o){throw o.message+=` (in ${e})`,o}}async writeJsonPromise(e,r,{compact:o=!1}={}){let a=o?0:2;return await this.writeFilePromise(e,`${JSON.stringify(r,null,a)} +`)}writeJsonSync(e,r,{compact:o=!1}={}){let a=o?0:2;return this.writeFileSync(e,`${JSON.stringify(r,null,a)} +`)}async preserveTimePromise(e,r){let o=await this.lstatPromise(e),a=await r();typeof a<"u"&&(e=a),await this.lutimesPromise(e,o.atime,o.mtime)}async preserveTimeSync(e,r){let o=this.lstatSync(e),a=r();typeof a<"u"&&(e=a),this.lutimesSync(e,o.atime,o.mtime)}},Ou=class extends hf{constructor(){super(K)}}});var Ps,gf=Et(()=>{_g();Ps=class extends hf{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,r,o){return this.baseFs.openPromise(this.mapToBase(e),r,o)}openSync(e,r,o){return this.baseFs.openSync(this.mapToBase(e),r,o)}async opendirPromise(e,r){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),r),{path:e})}opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),r),{path:e})}async readPromise(e,r,o,a,n){return await this.baseFs.readPromise(e,r,o,a,n)}readSync(e,r,o,a,n){return this.baseFs.readSync(e,r,o,a,n)}async writePromise(e,r,o,a,n){return typeof r=="string"?await this.baseFs.writePromise(e,r,o):await this.baseFs.writePromise(e,r,o,a,n)}writeSync(e,r,o,a,n){return typeof r=="string"?this.baseFs.writeSync(e,r,o):this.baseFs.writeSync(e,r,o,a,n)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,r)}createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,r)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,r){return this.baseFs.accessSync(this.mapToBase(e),r)}async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase(e),r)}async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}fstatSync(e,r){return this.baseFs.fstatSync(e,r)}lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}async fchmodPromise(e,r){return this.baseFs.fchmodPromise(e,r)}fchmodSync(e,r){return this.baseFs.fchmodSync(e,r)}async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e),r)}chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}async fchownPromise(e,r,o){return this.baseFs.fchownPromise(e,r,o)}fchownSync(e,r,o){return this.baseFs.fchownSync(e,r,o)}async chownPromise(e,r,o){return this.baseFs.chownPromise(this.mapToBase(e),r,o)}chownSync(e,r,o){return this.baseFs.chownSync(this.mapToBase(e),r,o)}async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(r))}renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(r))}async copyFilePromise(e,r,o=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(r),o)}copyFileSync(e,r,o=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(r),o)}async appendFilePromise(e,r,o){return this.baseFs.appendFilePromise(this.fsMapToBase(e),r,o)}appendFileSync(e,r,o){return this.baseFs.appendFileSync(this.fsMapToBase(e),r,o)}async writeFilePromise(e,r,o){return this.baseFs.writeFilePromise(this.fsMapToBase(e),r,o)}writeFileSync(e,r,o){return this.baseFs.writeFileSync(this.fsMapToBase(e),r,o)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,r,o){return this.baseFs.utimesPromise(this.mapToBase(e),r,o)}utimesSync(e,r,o){return this.baseFs.utimesSync(this.mapToBase(e),r,o)}async lutimesPromise(e,r,o){return this.baseFs.lutimesPromise(this.mapToBase(e),r,o)}lutimesSync(e,r,o){return this.baseFs.lutimesSync(this.mapToBase(e),r,o)}async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e),r)}mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e),r)}rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(r))}linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(r))}async symlinkPromise(e,r,o){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),a,o);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),u=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkPromise(u,a,o)}symlinkSync(e,r,o){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),a,o);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),u=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkSync(u,a,o)}async readFilePromise(e,r){return this.baseFs.readFilePromise(this.fsMapToBase(e),r)}readFileSync(e,r){return this.baseFs.readFileSync(this.fsMapToBase(e),r)}readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,r){return this.baseFs.truncatePromise(this.mapToBase(e),r)}truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}async ftruncatePromise(e,r){return this.baseFs.ftruncatePromise(e,r)}ftruncateSync(e,r){return this.baseFs.ftruncateSync(e,r)}watch(e,r,o){return this.baseFs.watch(this.mapToBase(e),r,o)}watchFile(e,r,o){return this.baseFs.watchFile(this.mapToBase(e),r,o)}unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}}});var Uu,Y7=Et(()=>{gf();Uu=class extends Ps{constructor(r,{baseFs:o,pathUtils:a}){super(a);this.target=r,this.baseFs=o}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(r){return r}mapToBase(r){return r}}});function W7(t){let e=t;return typeof t.path=="string"&&(e.path=ue.toPortablePath(t.path)),e}var V7,Rn,Hg=Et(()=>{V7=$e(Be("fs"));_g();Ca();Rn=class extends Ou{constructor(r=V7.default){super();this.realFs=r}getExtractHint(){return!1}getRealPath(){return Bt.root}resolve(r){return K.resolve(r)}async openPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.open(ue.fromPortablePath(r),o,a,this.makeCallback(n,u))})}openSync(r,o,a){return this.realFs.openSync(ue.fromPortablePath(r),o,a)}async opendirPromise(r,o){return await new Promise((a,n)=>{typeof o<"u"?this.realFs.opendir(ue.fromPortablePath(r),o,this.makeCallback(a,n)):this.realFs.opendir(ue.fromPortablePath(r),this.makeCallback(a,n))}).then(a=>{let n=a;return Object.defineProperty(n,"path",{value:r,configurable:!0,writable:!0}),n})}opendirSync(r,o){let n=typeof o<"u"?this.realFs.opendirSync(ue.fromPortablePath(r),o):this.realFs.opendirSync(ue.fromPortablePath(r));return Object.defineProperty(n,"path",{value:r,configurable:!0,writable:!0}),n}async readPromise(r,o,a=0,n=0,u=-1){return await new Promise((A,p)=>{this.realFs.read(r,o,a,n,u,(h,E)=>{h?p(h):A(E)})})}readSync(r,o,a,n,u){return this.realFs.readSync(r,o,a,n,u)}async writePromise(r,o,a,n,u){return await new Promise((A,p)=>typeof o=="string"?this.realFs.write(r,o,a,this.makeCallback(A,p)):this.realFs.write(r,o,a,n,u,this.makeCallback(A,p)))}writeSync(r,o,a,n,u){return typeof o=="string"?this.realFs.writeSync(r,o,a):this.realFs.writeSync(r,o,a,n,u)}async closePromise(r){await new Promise((o,a)=>{this.realFs.close(r,this.makeCallback(o,a))})}closeSync(r){this.realFs.closeSync(r)}createReadStream(r,o){let a=r!==null?ue.fromPortablePath(r):r;return this.realFs.createReadStream(a,o)}createWriteStream(r,o){let a=r!==null?ue.fromPortablePath(r):r;return this.realFs.createWriteStream(a,o)}async realpathPromise(r){return await new Promise((o,a)=>{this.realFs.realpath(ue.fromPortablePath(r),{},this.makeCallback(o,a))}).then(o=>ue.toPortablePath(o))}realpathSync(r){return ue.toPortablePath(this.realFs.realpathSync(ue.fromPortablePath(r),{}))}async existsPromise(r){return await new Promise(o=>{this.realFs.exists(ue.fromPortablePath(r),o)})}accessSync(r,o){return this.realFs.accessSync(ue.fromPortablePath(r),o)}async accessPromise(r,o){return await new Promise((a,n)=>{this.realFs.access(ue.fromPortablePath(r),o,this.makeCallback(a,n))})}existsSync(r){return this.realFs.existsSync(ue.fromPortablePath(r))}async statPromise(r,o){return await new Promise((a,n)=>{o?this.realFs.stat(ue.fromPortablePath(r),o,this.makeCallback(a,n)):this.realFs.stat(ue.fromPortablePath(r),this.makeCallback(a,n))})}statSync(r,o){return o?this.realFs.statSync(ue.fromPortablePath(r),o):this.realFs.statSync(ue.fromPortablePath(r))}async fstatPromise(r,o){return await new Promise((a,n)=>{o?this.realFs.fstat(r,o,this.makeCallback(a,n)):this.realFs.fstat(r,this.makeCallback(a,n))})}fstatSync(r,o){return o?this.realFs.fstatSync(r,o):this.realFs.fstatSync(r)}async lstatPromise(r,o){return await new Promise((a,n)=>{o?this.realFs.lstat(ue.fromPortablePath(r),o,this.makeCallback(a,n)):this.realFs.lstat(ue.fromPortablePath(r),this.makeCallback(a,n))})}lstatSync(r,o){return o?this.realFs.lstatSync(ue.fromPortablePath(r),o):this.realFs.lstatSync(ue.fromPortablePath(r))}async fchmodPromise(r,o){return await new Promise((a,n)=>{this.realFs.fchmod(r,o,this.makeCallback(a,n))})}fchmodSync(r,o){return this.realFs.fchmodSync(r,o)}async chmodPromise(r,o){return await new Promise((a,n)=>{this.realFs.chmod(ue.fromPortablePath(r),o,this.makeCallback(a,n))})}chmodSync(r,o){return this.realFs.chmodSync(ue.fromPortablePath(r),o)}async fchownPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.fchown(r,o,a,this.makeCallback(n,u))})}fchownSync(r,o,a){return this.realFs.fchownSync(r,o,a)}async chownPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.chown(ue.fromPortablePath(r),o,a,this.makeCallback(n,u))})}chownSync(r,o,a){return this.realFs.chownSync(ue.fromPortablePath(r),o,a)}async renamePromise(r,o){return await new Promise((a,n)=>{this.realFs.rename(ue.fromPortablePath(r),ue.fromPortablePath(o),this.makeCallback(a,n))})}renameSync(r,o){return this.realFs.renameSync(ue.fromPortablePath(r),ue.fromPortablePath(o))}async copyFilePromise(r,o,a=0){return await new Promise((n,u)=>{this.realFs.copyFile(ue.fromPortablePath(r),ue.fromPortablePath(o),a,this.makeCallback(n,u))})}copyFileSync(r,o,a=0){return this.realFs.copyFileSync(ue.fromPortablePath(r),ue.fromPortablePath(o),a)}async appendFilePromise(r,o,a){return await new Promise((n,u)=>{let A=typeof r=="string"?ue.fromPortablePath(r):r;a?this.realFs.appendFile(A,o,a,this.makeCallback(n,u)):this.realFs.appendFile(A,o,this.makeCallback(n,u))})}appendFileSync(r,o,a){let n=typeof r=="string"?ue.fromPortablePath(r):r;a?this.realFs.appendFileSync(n,o,a):this.realFs.appendFileSync(n,o)}async writeFilePromise(r,o,a){return await new Promise((n,u)=>{let A=typeof r=="string"?ue.fromPortablePath(r):r;a?this.realFs.writeFile(A,o,a,this.makeCallback(n,u)):this.realFs.writeFile(A,o,this.makeCallback(n,u))})}writeFileSync(r,o,a){let n=typeof r=="string"?ue.fromPortablePath(r):r;a?this.realFs.writeFileSync(n,o,a):this.realFs.writeFileSync(n,o)}async unlinkPromise(r){return await new Promise((o,a)=>{this.realFs.unlink(ue.fromPortablePath(r),this.makeCallback(o,a))})}unlinkSync(r){return this.realFs.unlinkSync(ue.fromPortablePath(r))}async utimesPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.utimes(ue.fromPortablePath(r),o,a,this.makeCallback(n,u))})}utimesSync(r,o,a){this.realFs.utimesSync(ue.fromPortablePath(r),o,a)}async lutimesPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.lutimes(ue.fromPortablePath(r),o,a,this.makeCallback(n,u))})}lutimesSync(r,o,a){this.realFs.lutimesSync(ue.fromPortablePath(r),o,a)}async mkdirPromise(r,o){return await new Promise((a,n)=>{this.realFs.mkdir(ue.fromPortablePath(r),o,this.makeCallback(a,n))})}mkdirSync(r,o){return this.realFs.mkdirSync(ue.fromPortablePath(r),o)}async rmdirPromise(r,o){return await new Promise((a,n)=>{o?this.realFs.rmdir(ue.fromPortablePath(r),o,this.makeCallback(a,n)):this.realFs.rmdir(ue.fromPortablePath(r),this.makeCallback(a,n))})}rmdirSync(r,o){return this.realFs.rmdirSync(ue.fromPortablePath(r),o)}async linkPromise(r,o){return await new Promise((a,n)=>{this.realFs.link(ue.fromPortablePath(r),ue.fromPortablePath(o),this.makeCallback(a,n))})}linkSync(r,o){return this.realFs.linkSync(ue.fromPortablePath(r),ue.fromPortablePath(o))}async symlinkPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.symlink(ue.fromPortablePath(r.replace(/\/+$/,"")),ue.fromPortablePath(o),a,this.makeCallback(n,u))})}symlinkSync(r,o,a){return this.realFs.symlinkSync(ue.fromPortablePath(r.replace(/\/+$/,"")),ue.fromPortablePath(o),a)}async readFilePromise(r,o){return await new Promise((a,n)=>{let u=typeof r=="string"?ue.fromPortablePath(r):r;this.realFs.readFile(u,o,this.makeCallback(a,n))})}readFileSync(r,o){let a=typeof r=="string"?ue.fromPortablePath(r):r;return this.realFs.readFileSync(a,o)}async readdirPromise(r,o){return await new Promise((a,n)=>{o?o.recursive&&process.platform==="win32"?o.withFileTypes?this.realFs.readdir(ue.fromPortablePath(r),o,this.makeCallback(u=>a(u.map(W7)),n)):this.realFs.readdir(ue.fromPortablePath(r),o,this.makeCallback(u=>a(u.map(ue.toPortablePath)),n)):this.realFs.readdir(ue.fromPortablePath(r),o,this.makeCallback(a,n)):this.realFs.readdir(ue.fromPortablePath(r),this.makeCallback(a,n))})}readdirSync(r,o){return o?o.recursive&&process.platform==="win32"?o.withFileTypes?this.realFs.readdirSync(ue.fromPortablePath(r),o).map(W7):this.realFs.readdirSync(ue.fromPortablePath(r),o).map(ue.toPortablePath):this.realFs.readdirSync(ue.fromPortablePath(r),o):this.realFs.readdirSync(ue.fromPortablePath(r))}async readlinkPromise(r){return await new Promise((o,a)=>{this.realFs.readlink(ue.fromPortablePath(r),this.makeCallback(o,a))}).then(o=>ue.toPortablePath(o))}readlinkSync(r){return ue.toPortablePath(this.realFs.readlinkSync(ue.fromPortablePath(r)))}async truncatePromise(r,o){return await new Promise((a,n)=>{this.realFs.truncate(ue.fromPortablePath(r),o,this.makeCallback(a,n))})}truncateSync(r,o){return this.realFs.truncateSync(ue.fromPortablePath(r),o)}async ftruncatePromise(r,o){return await new Promise((a,n)=>{this.realFs.ftruncate(r,o,this.makeCallback(a,n))})}ftruncateSync(r,o){return this.realFs.ftruncateSync(r,o)}watch(r,o,a){return this.realFs.watch(ue.fromPortablePath(r),o,a)}watchFile(r,o,a){return this.realFs.watchFile(ue.fromPortablePath(r),o,a)}unwatchFile(r,o){return this.realFs.unwatchFile(ue.fromPortablePath(r),o)}makeCallback(r,o){return(a,n)=>{a?o(a):r(n)}}}});var gn,K7=Et(()=>{Hg();gf();Ca();gn=class extends Ps{constructor(r,{baseFs:o=new Rn}={}){super(K);this.target=this.pathUtils.normalize(r),this.baseFs=o}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(r){return this.pathUtils.isAbsolute(r)?K.normalize(r):this.baseFs.resolve(K.join(this.target,r))}mapFromBase(r){return r}mapToBase(r){return this.pathUtils.isAbsolute(r)?r:this.pathUtils.join(this.target,r)}}});var J7,_u,z7=Et(()=>{Hg();gf();Ca();J7=Bt.root,_u=class extends Ps{constructor(r,{baseFs:o=new Rn}={}){super(K);this.target=this.pathUtils.resolve(Bt.root,r),this.baseFs=o}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(Bt.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(r){let o=this.pathUtils.normalize(r);if(this.pathUtils.isAbsolute(r))return this.pathUtils.resolve(this.target,this.pathUtils.relative(J7,r));if(o.match(/^\.\.\/?/))throw new Error(`Resolving this path (${r}) would escape the jail`);return this.pathUtils.resolve(this.target,r)}mapFromBase(r){return this.pathUtils.resolve(J7,this.pathUtils.relative(this.target,r))}}});var ny,X7=Et(()=>{gf();ny=class extends Ps{constructor(r,o){super(o);this.instance=null;this.factory=r}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(r){this.instance=r}mapFromBase(r){return r}mapToBase(r){return r}}});var jg,wa,_p,Z7=Et(()=>{jg=Be("fs");_g();Hg();VT();BD();Ca();wa=4278190080,_p=class extends Ou{constructor({baseFs:r=new Rn,filter:o=null,magicByte:a=42,maxOpenFiles:n=1/0,useCache:u=!0,maxAge:A=5e3,typeCheck:p=jg.constants.S_IFREG,getMountPoint:h,factoryPromise:E,factorySync:I}){if(Math.floor(a)!==a||!(a>1&&a<=127))throw new Error("The magic byte must be set to a round value between 1 and 127 included");super();this.fdMap=new Map;this.nextFd=3;this.isMount=new Set;this.notMount=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.baseFs=r,this.mountInstances=u?new Map:null,this.factoryPromise=E,this.factorySync=I,this.filter=o,this.getMountPoint=h,this.magic=a<<24,this.maxAge=A,this.maxOpenFiles=n,this.typeCheck=p}getExtractHint(r){return this.baseFs.getExtractHint(r)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(Og(this),this.mountInstances)for(let[r,{childFs:o}]of this.mountInstances.entries())o.saveAndClose?.(),this.mountInstances.delete(r)}discardAndClose(){if(Og(this),this.mountInstances)for(let[r,{childFs:o}]of this.mountInstances.entries())o.discardAndClose?.(),this.mountInstances.delete(r)}resolve(r){return this.baseFs.resolve(r)}remapFd(r,o){let a=this.nextFd++|this.magic;return this.fdMap.set(a,[r,o]),a}async openPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.openPromise(r,o,a),async(n,{subPath:u})=>this.remapFd(n,await n.openPromise(u,o,a)))}openSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.openSync(r,o,a),(n,{subPath:u})=>this.remapFd(n,n.openSync(u,o,a)))}async opendirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.opendirPromise(r,o),async(a,{subPath:n})=>await a.opendirPromise(n,o),{requireSubpath:!1})}opendirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.opendirSync(r,o),(a,{subPath:n})=>a.opendirSync(n,o),{requireSubpath:!1})}async readPromise(r,o,a,n,u){if((r&wa)!==this.magic)return await this.baseFs.readPromise(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw Io("read");let[p,h]=A;return await p.readPromise(h,o,a,n,u)}readSync(r,o,a,n,u){if((r&wa)!==this.magic)return this.baseFs.readSync(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw Io("readSync");let[p,h]=A;return p.readSync(h,o,a,n,u)}async writePromise(r,o,a,n,u){if((r&wa)!==this.magic)return typeof o=="string"?await this.baseFs.writePromise(r,o,a):await this.baseFs.writePromise(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw Io("write");let[p,h]=A;return typeof o=="string"?await p.writePromise(h,o,a):await p.writePromise(h,o,a,n,u)}writeSync(r,o,a,n,u){if((r&wa)!==this.magic)return typeof o=="string"?this.baseFs.writeSync(r,o,a):this.baseFs.writeSync(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw Io("writeSync");let[p,h]=A;return typeof o=="string"?p.writeSync(h,o,a):p.writeSync(h,o,a,n,u)}async closePromise(r){if((r&wa)!==this.magic)return await this.baseFs.closePromise(r);let o=this.fdMap.get(r);if(typeof o>"u")throw Io("close");this.fdMap.delete(r);let[a,n]=o;return await a.closePromise(n)}closeSync(r){if((r&wa)!==this.magic)return this.baseFs.closeSync(r);let o=this.fdMap.get(r);if(typeof o>"u")throw Io("closeSync");this.fdMap.delete(r);let[a,n]=o;return a.closeSync(n)}createReadStream(r,o){return r===null?this.baseFs.createReadStream(r,o):this.makeCallSync(r,()=>this.baseFs.createReadStream(r,o),(a,{archivePath:n,subPath:u})=>{let A=a.createReadStream(u,o);return A.path=ue.fromPortablePath(this.pathUtils.join(n,u)),A})}createWriteStream(r,o){return r===null?this.baseFs.createWriteStream(r,o):this.makeCallSync(r,()=>this.baseFs.createWriteStream(r,o),(a,{subPath:n})=>a.createWriteStream(n,o))}async realpathPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.realpathPromise(r),async(o,{archivePath:a,subPath:n})=>{let u=this.realPaths.get(a);return typeof u>"u"&&(u=await this.baseFs.realpathPromise(a),this.realPaths.set(a,u)),this.pathUtils.join(u,this.pathUtils.relative(Bt.root,await o.realpathPromise(n)))})}realpathSync(r){return this.makeCallSync(r,()=>this.baseFs.realpathSync(r),(o,{archivePath:a,subPath:n})=>{let u=this.realPaths.get(a);return typeof u>"u"&&(u=this.baseFs.realpathSync(a),this.realPaths.set(a,u)),this.pathUtils.join(u,this.pathUtils.relative(Bt.root,o.realpathSync(n)))})}async existsPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.existsPromise(r),async(o,{subPath:a})=>await o.existsPromise(a))}existsSync(r){return this.makeCallSync(r,()=>this.baseFs.existsSync(r),(o,{subPath:a})=>o.existsSync(a))}async accessPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.accessPromise(r,o),async(a,{subPath:n})=>await a.accessPromise(n,o))}accessSync(r,o){return this.makeCallSync(r,()=>this.baseFs.accessSync(r,o),(a,{subPath:n})=>a.accessSync(n,o))}async statPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.statPromise(r,o),async(a,{subPath:n})=>await a.statPromise(n,o))}statSync(r,o){return this.makeCallSync(r,()=>this.baseFs.statSync(r,o),(a,{subPath:n})=>a.statSync(n,o))}async fstatPromise(r,o){if((r&wa)!==this.magic)return this.baseFs.fstatPromise(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw Io("fstat");let[n,u]=a;return n.fstatPromise(u,o)}fstatSync(r,o){if((r&wa)!==this.magic)return this.baseFs.fstatSync(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw Io("fstatSync");let[n,u]=a;return n.fstatSync(u,o)}async lstatPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.lstatPromise(r,o),async(a,{subPath:n})=>await a.lstatPromise(n,o))}lstatSync(r,o){return this.makeCallSync(r,()=>this.baseFs.lstatSync(r,o),(a,{subPath:n})=>a.lstatSync(n,o))}async fchmodPromise(r,o){if((r&wa)!==this.magic)return this.baseFs.fchmodPromise(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw Io("fchmod");let[n,u]=a;return n.fchmodPromise(u,o)}fchmodSync(r,o){if((r&wa)!==this.magic)return this.baseFs.fchmodSync(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw Io("fchmodSync");let[n,u]=a;return n.fchmodSync(u,o)}async chmodPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.chmodPromise(r,o),async(a,{subPath:n})=>await a.chmodPromise(n,o))}chmodSync(r,o){return this.makeCallSync(r,()=>this.baseFs.chmodSync(r,o),(a,{subPath:n})=>a.chmodSync(n,o))}async fchownPromise(r,o,a){if((r&wa)!==this.magic)return this.baseFs.fchownPromise(r,o,a);let n=this.fdMap.get(r);if(typeof n>"u")throw Io("fchown");let[u,A]=n;return u.fchownPromise(A,o,a)}fchownSync(r,o,a){if((r&wa)!==this.magic)return this.baseFs.fchownSync(r,o,a);let n=this.fdMap.get(r);if(typeof n>"u")throw Io("fchownSync");let[u,A]=n;return u.fchownSync(A,o,a)}async chownPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.chownPromise(r,o,a),async(n,{subPath:u})=>await n.chownPromise(u,o,a))}chownSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.chownSync(r,o,a),(n,{subPath:u})=>n.chownSync(u,o,a))}async renamePromise(r,o){return await this.makeCallPromise(r,async()=>await this.makeCallPromise(o,async()=>await this.baseFs.renamePromise(r,o),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(a,{subPath:n})=>await this.makeCallPromise(o,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(u,{subPath:A})=>{if(a!==u)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await a.renamePromise(n,A)}))}renameSync(r,o){return this.makeCallSync(r,()=>this.makeCallSync(o,()=>this.baseFs.renameSync(r,o),()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(a,{subPath:n})=>this.makeCallSync(o,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(u,{subPath:A})=>{if(a!==u)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return a.renameSync(n,A)}))}async copyFilePromise(r,o,a=0){let n=async(u,A,p,h)=>{if((a&jg.constants.COPYFILE_FICLONE_FORCE)!==0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${A}' -> ${h}'`),{code:"EXDEV"});if(a&jg.constants.COPYFILE_EXCL&&await this.existsPromise(A))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${A}' -> '${h}'`),{code:"EEXIST"});let E;try{E=await u.readFilePromise(A)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${A}' -> '${h}'`),{code:"EINVAL"})}await p.writeFilePromise(h,E)};return await this.makeCallPromise(r,async()=>await this.makeCallPromise(o,async()=>await this.baseFs.copyFilePromise(r,o,a),async(u,{subPath:A})=>await n(this.baseFs,r,u,A)),async(u,{subPath:A})=>await this.makeCallPromise(o,async()=>await n(u,A,this.baseFs,o),async(p,{subPath:h})=>u!==p?await n(u,A,p,h):await u.copyFilePromise(A,h,a)))}copyFileSync(r,o,a=0){let n=(u,A,p,h)=>{if((a&jg.constants.COPYFILE_FICLONE_FORCE)!==0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${A}' -> ${h}'`),{code:"EXDEV"});if(a&jg.constants.COPYFILE_EXCL&&this.existsSync(A))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${A}' -> '${h}'`),{code:"EEXIST"});let E;try{E=u.readFileSync(A)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${A}' -> '${h}'`),{code:"EINVAL"})}p.writeFileSync(h,E)};return this.makeCallSync(r,()=>this.makeCallSync(o,()=>this.baseFs.copyFileSync(r,o,a),(u,{subPath:A})=>n(this.baseFs,r,u,A)),(u,{subPath:A})=>this.makeCallSync(o,()=>n(u,A,this.baseFs,o),(p,{subPath:h})=>u!==p?n(u,A,p,h):u.copyFileSync(A,h,a)))}async appendFilePromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.appendFilePromise(r,o,a),async(n,{subPath:u})=>await n.appendFilePromise(u,o,a))}appendFileSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.appendFileSync(r,o,a),(n,{subPath:u})=>n.appendFileSync(u,o,a))}async writeFilePromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.writeFilePromise(r,o,a),async(n,{subPath:u})=>await n.writeFilePromise(u,o,a))}writeFileSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.writeFileSync(r,o,a),(n,{subPath:u})=>n.writeFileSync(u,o,a))}async unlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.unlinkPromise(r),async(o,{subPath:a})=>await o.unlinkPromise(a))}unlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.unlinkSync(r),(o,{subPath:a})=>o.unlinkSync(a))}async utimesPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.utimesPromise(r,o,a),async(n,{subPath:u})=>await n.utimesPromise(u,o,a))}utimesSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.utimesSync(r,o,a),(n,{subPath:u})=>n.utimesSync(u,o,a))}async lutimesPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.lutimesPromise(r,o,a),async(n,{subPath:u})=>await n.lutimesPromise(u,o,a))}lutimesSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.lutimesSync(r,o,a),(n,{subPath:u})=>n.lutimesSync(u,o,a))}async mkdirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.mkdirPromise(r,o),async(a,{subPath:n})=>await a.mkdirPromise(n,o))}mkdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.mkdirSync(r,o),(a,{subPath:n})=>a.mkdirSync(n,o))}async rmdirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.rmdirPromise(r,o),async(a,{subPath:n})=>await a.rmdirPromise(n,o))}rmdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.rmdirSync(r,o),(a,{subPath:n})=>a.rmdirSync(n,o))}async linkPromise(r,o){return await this.makeCallPromise(o,async()=>await this.baseFs.linkPromise(r,o),async(a,{subPath:n})=>await a.linkPromise(r,n))}linkSync(r,o){return this.makeCallSync(o,()=>this.baseFs.linkSync(r,o),(a,{subPath:n})=>a.linkSync(r,n))}async symlinkPromise(r,o,a){return await this.makeCallPromise(o,async()=>await this.baseFs.symlinkPromise(r,o,a),async(n,{subPath:u})=>await n.symlinkPromise(r,u))}symlinkSync(r,o,a){return this.makeCallSync(o,()=>this.baseFs.symlinkSync(r,o,a),(n,{subPath:u})=>n.symlinkSync(r,u))}async readFilePromise(r,o){return this.makeCallPromise(r,async()=>await this.baseFs.readFilePromise(r,o),async(a,{subPath:n})=>await a.readFilePromise(n,o))}readFileSync(r,o){return this.makeCallSync(r,()=>this.baseFs.readFileSync(r,o),(a,{subPath:n})=>a.readFileSync(n,o))}async readdirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.readdirPromise(r,o),async(a,{subPath:n})=>await a.readdirPromise(n,o),{requireSubpath:!1})}readdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.readdirSync(r,o),(a,{subPath:n})=>a.readdirSync(n,o),{requireSubpath:!1})}async readlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.readlinkPromise(r),async(o,{subPath:a})=>await o.readlinkPromise(a))}readlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.readlinkSync(r),(o,{subPath:a})=>o.readlinkSync(a))}async truncatePromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.truncatePromise(r,o),async(a,{subPath:n})=>await a.truncatePromise(n,o))}truncateSync(r,o){return this.makeCallSync(r,()=>this.baseFs.truncateSync(r,o),(a,{subPath:n})=>a.truncateSync(n,o))}async ftruncatePromise(r,o){if((r&wa)!==this.magic)return this.baseFs.ftruncatePromise(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw Io("ftruncate");let[n,u]=a;return n.ftruncatePromise(u,o)}ftruncateSync(r,o){if((r&wa)!==this.magic)return this.baseFs.ftruncateSync(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw Io("ftruncateSync");let[n,u]=a;return n.ftruncateSync(u,o)}watch(r,o,a){return this.makeCallSync(r,()=>this.baseFs.watch(r,o,a),(n,{subPath:u})=>n.watch(u,o,a))}watchFile(r,o,a){return this.makeCallSync(r,()=>this.baseFs.watchFile(r,o,a),()=>ry(this,r,o,a))}unwatchFile(r,o){return this.makeCallSync(r,()=>this.baseFs.unwatchFile(r,o),()=>Mg(this,r,o))}async makeCallPromise(r,o,a,{requireSubpath:n=!0}={}){if(typeof r!="string")return await o();let u=this.resolve(r),A=this.findMount(u);return A?n&&A.subPath==="/"?await o():await this.getMountPromise(A.archivePath,async p=>await a(p,A)):await o()}makeCallSync(r,o,a,{requireSubpath:n=!0}={}){if(typeof r!="string")return o();let u=this.resolve(r),A=this.findMount(u);return!A||n&&A.subPath==="/"?o():this.getMountSync(A.archivePath,p=>a(p,A))}findMount(r){if(this.filter&&!this.filter.test(r))return null;let o="";for(;;){let a=r.substring(o.length),n=this.getMountPoint(a,o);if(!n)return null;if(o=this.pathUtils.join(o,n),!this.isMount.has(o)){if(this.notMount.has(o))continue;try{if(this.typeCheck!==null&&(this.baseFs.lstatSync(o).mode&jg.constants.S_IFMT)!==this.typeCheck){this.notMount.add(o);continue}}catch{return null}this.isMount.add(o)}return{archivePath:o,subPath:this.pathUtils.join(Bt.root,r.substring(o.length))}}}limitOpenFiles(r){if(this.mountInstances===null)return;let o=Date.now(),a=o+this.maxAge,n=r===null?0:this.mountInstances.size-r;for(let[u,{childFs:A,expiresAt:p,refCount:h}]of this.mountInstances.entries())if(!(h!==0||A.hasOpenFileHandles?.())){if(o>=p){A.saveAndClose?.(),this.mountInstances.delete(u),n-=1;continue}else if(r===null||n<=0){a=p;break}A.saveAndClose?.(),this.mountInstances.delete(u),n-=1}this.limitOpenFilesTimeout===null&&(r===null&&this.mountInstances.size>0||r!==null)&&isFinite(a)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},a-o).unref())}async getMountPromise(r,o){if(this.mountInstances){let a=this.mountInstances.get(r);if(!a){let n=await this.factoryPromise(this.baseFs,r);a=this.mountInstances.get(r),a||(a={childFs:n(),expiresAt:0,refCount:0})}this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,a.refCount+=1;try{return await o(a.childFs)}finally{a.refCount-=1}}else{let a=(await this.factoryPromise(this.baseFs,r))();try{return await o(a)}finally{a.saveAndClose?.()}}}getMountSync(r,o){if(this.mountInstances){let a=this.mountInstances.get(r);return a||(a={childFs:this.factorySync(this.baseFs,r),expiresAt:0,refCount:0}),this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,o(a.childFs)}else{let a=this.factorySync(this.baseFs,r);try{return o(a)}finally{a.saveAndClose?.()}}}}});var Zt,KT,Gw,$7=Et(()=>{_g();Ca();Zt=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"}),KT=class extends hf{constructor(){super(K)}getExtractHint(){throw Zt()}getRealPath(){throw Zt()}resolve(){throw Zt()}async openPromise(){throw Zt()}openSync(){throw Zt()}async opendirPromise(){throw Zt()}opendirSync(){throw Zt()}async readPromise(){throw Zt()}readSync(){throw Zt()}async writePromise(){throw Zt()}writeSync(){throw Zt()}async closePromise(){throw Zt()}closeSync(){throw Zt()}createWriteStream(){throw Zt()}createReadStream(){throw Zt()}async realpathPromise(){throw Zt()}realpathSync(){throw Zt()}async readdirPromise(){throw Zt()}readdirSync(){throw Zt()}async existsPromise(e){throw Zt()}existsSync(e){throw Zt()}async accessPromise(){throw Zt()}accessSync(){throw Zt()}async statPromise(){throw Zt()}statSync(){throw Zt()}async fstatPromise(e){throw Zt()}fstatSync(e){throw Zt()}async lstatPromise(e){throw Zt()}lstatSync(e){throw Zt()}async fchmodPromise(){throw Zt()}fchmodSync(){throw Zt()}async chmodPromise(){throw Zt()}chmodSync(){throw Zt()}async fchownPromise(){throw Zt()}fchownSync(){throw Zt()}async chownPromise(){throw Zt()}chownSync(){throw Zt()}async mkdirPromise(){throw Zt()}mkdirSync(){throw Zt()}async rmdirPromise(){throw Zt()}rmdirSync(){throw Zt()}async linkPromise(){throw Zt()}linkSync(){throw Zt()}async symlinkPromise(){throw Zt()}symlinkSync(){throw Zt()}async renamePromise(){throw Zt()}renameSync(){throw Zt()}async copyFilePromise(){throw Zt()}copyFileSync(){throw Zt()}async appendFilePromise(){throw Zt()}appendFileSync(){throw Zt()}async writeFilePromise(){throw Zt()}writeFileSync(){throw Zt()}async unlinkPromise(){throw Zt()}unlinkSync(){throw Zt()}async utimesPromise(){throw Zt()}utimesSync(){throw Zt()}async lutimesPromise(){throw Zt()}lutimesSync(){throw Zt()}async readFilePromise(){throw Zt()}readFileSync(){throw Zt()}async readlinkPromise(){throw Zt()}readlinkSync(){throw Zt()}async truncatePromise(){throw Zt()}truncateSync(){throw Zt()}async ftruncatePromise(e,r){throw Zt()}ftruncateSync(e,r){throw Zt()}watch(){throw Zt()}watchFile(){throw Zt()}unwatchFile(){throw Zt()}},Gw=KT;Gw.instance=new KT});var Hp,eY=Et(()=>{gf();Ca();Hp=class extends Ps{constructor(r){super(ue);this.baseFs=r}mapFromBase(r){return ue.fromPortablePath(r)}mapToBase(r){return ue.toPortablePath(r)}}});var R_e,JT,N_e,mi,tY=Et(()=>{Hg();gf();Ca();R_e=/^[0-9]+$/,JT=/^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,N_e=/^([^/]+-)?[a-f0-9]+$/,mi=class extends Ps{constructor({baseFs:r=new Rn}={}){super(K);this.baseFs=r}static makeVirtualPath(r,o,a){if(K.basename(r)!=="__virtual__")throw new Error('Assertion failed: Virtual folders must be named "__virtual__"');if(!K.basename(o).match(N_e))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");let u=K.relative(K.dirname(r),a).split("/"),A=0;for(;A{zT=$e(Be("buffer")),kD=Be("url"),rY=Be("util");gf();Ca();bD=class extends Ps{constructor(r){super(ue);this.baseFs=r}mapFromBase(r){return r}mapToBase(r){if(typeof r=="string")return r;if(r instanceof kD.URL)return(0,kD.fileURLToPath)(r);if(Buffer.isBuffer(r)){let o=r.toString();if(!L_e(r,o))throw new Error("Non-utf8 buffers are not supported at the moment. Please upvote the following issue if you encounter this error: https://github.com/yarnpkg/berry/issues/4942");return o}throw new Error(`Unsupported path type: ${(0,rY.inspect)(r)}`)}}});var iY,Bo,df,jp,QD,FD,iy,Rc,Nc,M_e,O_e,U_e,__e,Yw,sY=Et(()=>{iY=Be("readline"),Bo=Symbol("kBaseFs"),df=Symbol("kFd"),jp=Symbol("kClosePromise"),QD=Symbol("kCloseResolve"),FD=Symbol("kCloseReject"),iy=Symbol("kRefs"),Rc=Symbol("kRef"),Nc=Symbol("kUnref"),Yw=class{constructor(e,r){this[M_e]=1;this[O_e]=void 0;this[U_e]=void 0;this[__e]=void 0;this[Bo]=r,this[df]=e}get fd(){return this[df]}async appendFile(e,r){try{this[Rc](this.appendFile);let o=(typeof r=="string"?r:r?.encoding)??void 0;return await this[Bo].appendFilePromise(this.fd,e,o?{encoding:o}:void 0)}finally{this[Nc]()}}async chown(e,r){try{return this[Rc](this.chown),await this[Bo].fchownPromise(this.fd,e,r)}finally{this[Nc]()}}async chmod(e){try{return this[Rc](this.chmod),await this[Bo].fchmodPromise(this.fd,e)}finally{this[Nc]()}}createReadStream(e){return this[Bo].createReadStream(null,{...e,fd:this.fd})}createWriteStream(e){return this[Bo].createWriteStream(null,{...e,fd:this.fd})}datasync(){throw new Error("Method not implemented.")}sync(){throw new Error("Method not implemented.")}async read(e,r,o,a){try{this[Rc](this.read);let n;return Buffer.isBuffer(e)?n=e:(e??={},n=e.buffer??Buffer.alloc(16384),r=e.offset||0,o=e.length??n.byteLength,a=e.position??null),r??=0,o??=0,o===0?{bytesRead:o,buffer:n}:{bytesRead:await this[Bo].readPromise(this.fd,n,r,o,a),buffer:n}}finally{this[Nc]()}}async readFile(e){try{this[Rc](this.readFile);let r=(typeof e=="string"?e:e?.encoding)??void 0;return await this[Bo].readFilePromise(this.fd,r)}finally{this[Nc]()}}readLines(e){return(0,iY.createInterface)({input:this.createReadStream(e),crlfDelay:1/0})}async stat(e){try{return this[Rc](this.stat),await this[Bo].fstatPromise(this.fd,e)}finally{this[Nc]()}}async truncate(e){try{return this[Rc](this.truncate),await this[Bo].ftruncatePromise(this.fd,e)}finally{this[Nc]()}}utimes(e,r){throw new Error("Method not implemented.")}async writeFile(e,r){try{this[Rc](this.writeFile);let o=(typeof r=="string"?r:r?.encoding)??void 0;await this[Bo].writeFilePromise(this.fd,e,o)}finally{this[Nc]()}}async write(...e){try{if(this[Rc](this.write),ArrayBuffer.isView(e[0])){let[r,o,a,n]=e;return{bytesWritten:await this[Bo].writePromise(this.fd,r,o??void 0,a??void 0,n??void 0),buffer:r}}else{let[r,o,a]=e;return{bytesWritten:await this[Bo].writePromise(this.fd,r,o,a),buffer:r}}}finally{this[Nc]()}}async writev(e,r){try{this[Rc](this.writev);let o=0;if(typeof r<"u")for(let a of e){let n=await this.write(a,void 0,void 0,r);o+=n.bytesWritten,r+=n.bytesWritten}else for(let a of e){let n=await this.write(a);o+=n.bytesWritten}return{buffers:e,bytesWritten:o}}finally{this[Nc]()}}readv(e,r){throw new Error("Method not implemented.")}close(){if(this[df]===-1)return Promise.resolve();if(this[jp])return this[jp];if(this[iy]--,this[iy]===0){let e=this[df];this[df]=-1,this[jp]=this[Bo].closePromise(e).finally(()=>{this[jp]=void 0})}else this[jp]=new Promise((e,r)=>{this[QD]=e,this[FD]=r}).finally(()=>{this[jp]=void 0,this[FD]=void 0,this[QD]=void 0});return this[jp]}[(Bo,df,M_e=iy,O_e=jp,U_e=QD,__e=FD,Rc)](e){if(this[df]===-1){let r=new Error("file closed");throw r.code="EBADF",r.syscall=e.name,r}this[iy]++}[Nc](){if(this[iy]--,this[iy]===0){let e=this[df];this[df]=-1,this[Bo].closePromise(e).then(this[QD],this[FD])}}}});function Ww(t,e){e=new bD(e);let r=(o,a,n)=>{let u=o[a];o[a]=n,typeof u?.[sy.promisify.custom]<"u"&&(n[sy.promisify.custom]=u[sy.promisify.custom])};{r(t,"exists",(o,...a)=>{let u=typeof a[a.length-1]=="function"?a.pop():()=>{};process.nextTick(()=>{e.existsPromise(o).then(A=>{u(A)},()=>{u(!1)})})}),r(t,"read",(...o)=>{let[a,n,u,A,p,h]=o;if(o.length<=3){let E={};o.length<3?h=o[1]:(E=o[1],h=o[2]),{buffer:n=Buffer.alloc(16384),offset:u=0,length:A=n.byteLength,position:p}=E}if(u==null&&(u=0),A|=0,A===0){process.nextTick(()=>{h(null,0,n)});return}p==null&&(p=-1),process.nextTick(()=>{e.readPromise(a,n,u,A,p).then(E=>{h(null,E,n)},E=>{h(E,0,n)})})});for(let o of oY){let a=o.replace(/Promise$/,"");if(typeof t[a]>"u")continue;let n=e[o];if(typeof n>"u")continue;r(t,a,(...A)=>{let h=typeof A[A.length-1]=="function"?A.pop():()=>{};process.nextTick(()=>{n.apply(e,A).then(E=>{h(null,E)},E=>{h(E)})})})}t.realpath.native=t.realpath}{r(t,"existsSync",o=>{try{return e.existsSync(o)}catch{return!1}}),r(t,"readSync",(...o)=>{let[a,n,u,A,p]=o;return o.length<=3&&({offset:u=0,length:A=n.byteLength,position:p}=o[2]||{}),u==null&&(u=0),A|=0,A===0?0:(p==null&&(p=-1),e.readSync(a,n,u,A,p))});for(let o of H_e){let a=o;if(typeof t[a]>"u")continue;let n=e[o];typeof n>"u"||r(t,a,n.bind(e))}t.realpathSync.native=t.realpathSync}{let o=t.promises;for(let a of oY){let n=a.replace(/Promise$/,"");if(typeof o[n]>"u")continue;let u=e[a];typeof u>"u"||a!=="open"&&r(o,n,(A,...p)=>A instanceof Yw?A[n].apply(A,p):u.call(e,A,...p))}r(o,"open",async(...a)=>{let n=await e.openPromise(...a);return new Yw(n,e)})}t.read[sy.promisify.custom]=async(o,a,...n)=>({bytesRead:await e.readPromise(o,a,...n),buffer:a}),t.write[sy.promisify.custom]=async(o,a,...n)=>({bytesWritten:await e.writePromise(o,a,...n),buffer:a})}function TD(t,e){let r=Object.create(t);return Ww(r,e),r}var sy,H_e,oY,aY=Et(()=>{sy=Be("util");nY();sY();H_e=new Set(["accessSync","appendFileSync","createReadStream","createWriteStream","chmodSync","fchmodSync","chownSync","fchownSync","closeSync","copyFileSync","linkSync","lstatSync","fstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","statSync","symlinkSync","truncateSync","ftruncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),oY=new Set(["accessPromise","appendFilePromise","fchmodPromise","chmodPromise","fchownPromise","chownPromise","closePromise","copyFilePromise","linkPromise","fstatPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","statPromise","symlinkPromise","truncatePromise","ftruncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"])});function lY(t){let e=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,"0");return`${t}${e}`}function cY(){if(XT)return XT;let t=ue.toPortablePath(uY.default.tmpdir()),e=oe.realpathSync(t);return process.once("exit",()=>{oe.rmtempSync()}),XT={tmpdir:t,realTmpdir:e}}var uY,Lc,XT,oe,AY=Et(()=>{uY=$e(Be("os"));Hg();Ca();Lc=new Set,XT=null;oe=Object.assign(new Rn,{detachTemp(t){Lc.delete(t)},mktempSync(t){let{tmpdir:e,realTmpdir:r}=cY();for(;;){let o=lY("xfs-");try{this.mkdirSync(K.join(e,o))}catch(n){if(n.code==="EEXIST")continue;throw n}let a=K.join(r,o);if(Lc.add(a),typeof t>"u")return a;try{return t(a)}finally{if(Lc.has(a)){Lc.delete(a);try{this.removeSync(a)}catch{}}}}},async mktempPromise(t){let{tmpdir:e,realTmpdir:r}=cY();for(;;){let o=lY("xfs-");try{await this.mkdirPromise(K.join(e,o))}catch(n){if(n.code==="EEXIST")continue;throw n}let a=K.join(r,o);if(Lc.add(a),typeof t>"u")return a;try{return await t(a)}finally{if(Lc.has(a)){Lc.delete(a);try{await this.removePromise(a)}catch{}}}}},async rmtempPromise(){await Promise.all(Array.from(Lc.values()).map(async t=>{try{await oe.removePromise(t,{maxRetries:0}),Lc.delete(t)}catch{}}))},rmtempSync(){for(let t of Lc)try{oe.removeSync(t),Lc.delete(t)}catch{}}})});var Vw={};Kt(Vw,{AliasFS:()=>Uu,BasePortableFakeFS:()=>Ou,CustomDir:()=>qw,CwdFS:()=>gn,FakeFS:()=>hf,Filename:()=>dr,JailFS:()=>_u,LazyFS:()=>ny,MountFS:()=>_p,NoFS:()=>Gw,NodeFS:()=>Rn,PortablePath:()=>Bt,PosixFS:()=>Hp,ProxiedFS:()=>Ps,VirtualFS:()=>mi,constants:()=>vi,errors:()=>ar,extendFs:()=>TD,normalizeLineEndings:()=>Ug,npath:()=>ue,opendir:()=>SD,patchFs:()=>Ww,ppath:()=>K,setupCopyIndex:()=>PD,statUtils:()=>Ea,unwatchAllFiles:()=>Og,unwatchFile:()=>Mg,watchFile:()=>ry,xfs:()=>oe});var Pt=Et(()=>{T7();BD();qT();WT();U7();VT();_g();Ca();Ca();Y7();_g();K7();z7();X7();Z7();$7();Hg();eY();gf();tY();aY();AY()});var dY=_((axt,gY)=>{gY.exports=hY;hY.sync=q_e;var fY=Be("fs");function j_e(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!r||(r=r.split(";"),r.indexOf("")!==-1))return!0;for(var o=0;o{CY.exports=yY;yY.sync=G_e;var mY=Be("fs");function yY(t,e,r){mY.stat(t,function(o,a){r(o,o?!1:EY(a,e))})}function G_e(t,e){return EY(mY.statSync(t),e)}function EY(t,e){return t.isFile()&&Y_e(t,e)}function Y_e(t,e){var r=t.mode,o=t.uid,a=t.gid,n=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),u=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),A=parseInt("100",8),p=parseInt("010",8),h=parseInt("001",8),E=A|p,I=r&h||r&p&&a===u||r&A&&o===n||r&E&&n===0;return I}});var BY=_((uxt,IY)=>{var cxt=Be("fs"),RD;process.platform==="win32"||global.TESTING_WINDOWS?RD=dY():RD=wY();IY.exports=ZT;ZT.sync=W_e;function ZT(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(o,a){ZT(t,e||{},function(n,u){n?a(n):o(u)})})}RD(t,e||{},function(o,a){o&&(o.code==="EACCES"||e&&e.ignoreErrors)&&(o=null,a=!1),r(o,a)})}function W_e(t,e){try{return RD.sync(t,e||{})}catch(r){if(e&&e.ignoreErrors||r.code==="EACCES")return!1;throw r}}});var kY=_((Axt,bY)=>{var oy=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",vY=Be("path"),V_e=oy?";":":",DY=BY(),PY=t=>Object.assign(new Error(`not found: ${t}`),{code:"ENOENT"}),SY=(t,e)=>{let r=e.colon||V_e,o=t.match(/\//)||oy&&t.match(/\\/)?[""]:[...oy?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(r)],a=oy?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",n=oy?a.split(r):[""];return oy&&t.indexOf(".")!==-1&&n[0]!==""&&n.unshift(""),{pathEnv:o,pathExt:n,pathExtExe:a}},xY=(t,e,r)=>{typeof e=="function"&&(r=e,e={}),e||(e={});let{pathEnv:o,pathExt:a,pathExtExe:n}=SY(t,e),u=[],A=h=>new Promise((E,I)=>{if(h===o.length)return e.all&&u.length?E(u):I(PY(t));let v=o[h],b=/^".*"$/.test(v)?v.slice(1,-1):v,C=vY.join(b,t),T=!b&&/^\.[\\\/]/.test(t)?t.slice(0,2)+C:C;E(p(T,h,0))}),p=(h,E,I)=>new Promise((v,b)=>{if(I===a.length)return v(A(E+1));let C=a[I];DY(h+C,{pathExt:n},(T,L)=>{if(!T&&L)if(e.all)u.push(h+C);else return v(h+C);return v(p(h,E,I+1))})});return r?A(0).then(h=>r(null,h),r):A(0)},K_e=(t,e)=>{e=e||{};let{pathEnv:r,pathExt:o,pathExtExe:a}=SY(t,e),n=[];for(let u=0;u{"use strict";var QY=(t={})=>{let e=t.env||process.env;return(t.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(o=>o.toUpperCase()==="PATH")||"Path"};$T.exports=QY;$T.exports.default=QY});var LY=_((pxt,NY)=>{"use strict";var TY=Be("path"),J_e=kY(),z_e=FY();function RY(t,e){let r=t.options.env||process.env,o=process.cwd(),a=t.options.cwd!=null,n=a&&process.chdir!==void 0&&!process.chdir.disabled;if(n)try{process.chdir(t.options.cwd)}catch{}let u;try{u=J_e.sync(t.command,{path:r[z_e({env:r})],pathExt:e?TY.delimiter:void 0})}catch{}finally{n&&process.chdir(o)}return u&&(u=TY.resolve(a?t.options.cwd:"",u)),u}function X_e(t){return RY(t)||RY(t,!0)}NY.exports=X_e});var MY=_((hxt,tR)=>{"use strict";var eR=/([()\][%!^"`<>&|;, *?])/g;function Z_e(t){return t=t.replace(eR,"^$1"),t}function $_e(t,e){return t=`${t}`,t=t.replace(/(\\*)"/g,'$1$1\\"'),t=t.replace(/(\\*)$/,"$1$1"),t=`"${t}"`,t=t.replace(eR,"^$1"),e&&(t=t.replace(eR,"^$1")),t}tR.exports.command=Z_e;tR.exports.argument=$_e});var UY=_((gxt,OY)=>{"use strict";OY.exports=/^#!(.*)/});var HY=_((dxt,_Y)=>{"use strict";var e8e=UY();_Y.exports=(t="")=>{let e=t.match(e8e);if(!e)return null;let[r,o]=e[0].replace(/#! ?/,"").split(" "),a=r.split("/").pop();return a==="env"?o:o?`${a} ${o}`:a}});var qY=_((mxt,jY)=>{"use strict";var rR=Be("fs"),t8e=HY();function r8e(t){let r=Buffer.alloc(150),o;try{o=rR.openSync(t,"r"),rR.readSync(o,r,0,150,0),rR.closeSync(o)}catch{}return t8e(r.toString())}jY.exports=r8e});var VY=_((yxt,WY)=>{"use strict";var n8e=Be("path"),GY=LY(),YY=MY(),i8e=qY(),s8e=process.platform==="win32",o8e=/\.(?:com|exe)$/i,a8e=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function l8e(t){t.file=GY(t);let e=t.file&&i8e(t.file);return e?(t.args.unshift(t.file),t.command=e,GY(t)):t.file}function c8e(t){if(!s8e)return t;let e=l8e(t),r=!o8e.test(e);if(t.options.forceShell||r){let o=a8e.test(e);t.command=n8e.normalize(t.command),t.command=YY.command(t.command),t.args=t.args.map(n=>YY.argument(n,o));let a=[t.command].concat(t.args).join(" ");t.args=["/d","/s","/c",`"${a}"`],t.command=process.env.comspec||"cmd.exe",t.options.windowsVerbatimArguments=!0}return t}function u8e(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[],r=Object.assign({},r);let o={command:t,args:e,options:r,file:void 0,original:{command:t,args:e}};return r.shell?o:c8e(o)}WY.exports=u8e});var zY=_((Ext,JY)=>{"use strict";var nR=process.platform==="win32";function iR(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function A8e(t,e){if(!nR)return;let r=t.emit;t.emit=function(o,a){if(o==="exit"){let n=KY(a,e,"spawn");if(n)return r.call(t,"error",n)}return r.apply(t,arguments)}}function KY(t,e){return nR&&t===1&&!e.file?iR(e.original,"spawn"):null}function f8e(t,e){return nR&&t===1&&!e.file?iR(e.original,"spawnSync"):null}JY.exports={hookChildProcess:A8e,verifyENOENT:KY,verifyENOENTSync:f8e,notFoundError:iR}});var aR=_((Cxt,ay)=>{"use strict";var XY=Be("child_process"),sR=VY(),oR=zY();function ZY(t,e,r){let o=sR(t,e,r),a=XY.spawn(o.command,o.args,o.options);return oR.hookChildProcess(a,o),a}function p8e(t,e,r){let o=sR(t,e,r),a=XY.spawnSync(o.command,o.args,o.options);return a.error=a.error||oR.verifyENOENTSync(a.status,o),a}ay.exports=ZY;ay.exports.spawn=ZY;ay.exports.sync=p8e;ay.exports._parse=sR;ay.exports._enoent=oR});var eW=_((wxt,$Y)=>{"use strict";function h8e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function qg(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,qg)}h8e(qg,Error);qg.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",I;for(I=0;I0){for(I=1,v=1;I>",S=Br(">>",!1),y=">&",F=Br(">&",!1),z=">",X=Br(">",!1),Z="<<<",ie=Br("<<<",!1),Se="<&",Ne=Br("<&",!1),ot="<",dt=Br("<",!1),jt=function(N){return{type:"argument",segments:[].concat(...N)}},$t=function(N){return N},xt="$'",an=Br("$'",!1),Qr="'",mr=Br("'",!1),xr=function(N){return[{type:"text",text:N}]},Wr='""',Vn=Br('""',!1),Ns=function(){return{type:"text",text:""}},Ri='"',ps=Br('"',!1),io=function(N){return N},Si=function(N){return{type:"arithmetic",arithmetic:N,quoted:!0}},Ls=function(N){return{type:"shell",shell:N,quoted:!0}},so=function(N){return{type:"variable",...N,quoted:!0}},cc=function(N){return{type:"text",text:N}},cu=function(N){return{type:"arithmetic",arithmetic:N,quoted:!1}},ap=function(N){return{type:"shell",shell:N,quoted:!1}},lp=function(N){return{type:"variable",...N,quoted:!1}},Ms=function(N){return{type:"glob",pattern:N}},Dn=/^[^']/,oo=Cs(["'"],!0,!1),Os=function(N){return N.join("")},ml=/^[^$"]/,yl=Cs(["$",'"'],!0,!1),ao=`\\ +`,Kn=Br(`\\ +`,!1),Mn=function(){return""},Ni="\\",On=Br("\\",!1),_i=/^[\\$"`]/,tr=Cs(["\\","$",'"',"`"],!1,!1),Me=function(N){return N},ii="\\a",Oa=Br("\\a",!1),hr=function(){return"a"},uc="\\b",uu=Br("\\b",!1),Ac=function(){return"\b"},El=/^[Ee]/,vA=Cs(["E","e"],!1,!1),Au=function(){return"\x1B"},Ce="\\f",Tt=Br("\\f",!1),fc=function(){return"\f"},Hi="\\n",fu=Br("\\n",!1),Yt=function(){return` +`},Cl="\\r",DA=Br("\\r",!1),cp=function(){return"\r"},pc="\\t",PA=Br("\\t",!1),Qn=function(){return" "},hi="\\v",hc=Br("\\v",!1),SA=function(){return"\v"},sa=/^[\\'"?]/,Li=Cs(["\\","'",'"',"?"],!1,!1),_o=function(N){return String.fromCharCode(parseInt(N,16))},Ze="\\x",lo=Br("\\x",!1),gc="\\u",pu=Br("\\u",!1),ji="\\U",hu=Br("\\U",!1),xA=function(N){return String.fromCodePoint(parseInt(N,16))},Ua=/^[0-7]/,dc=Cs([["0","7"]],!1,!1),hs=/^[0-9a-fA-f]/,_t=Cs([["0","9"],["a","f"],["A","f"]],!1,!1),Fn=cg(),Ci="{}",oa=Br("{}",!1),co=function(){return"{}"},Us="-",aa=Br("-",!1),la="+",Ho=Br("+",!1),wi=".",gs=Br(".",!1),ds=function(N,V,re){return{type:"number",value:(N==="-"?-1:1)*parseFloat(V.join("")+"."+re.join(""))}},ms=function(N,V){return{type:"number",value:(N==="-"?-1:1)*parseInt(V.join(""))}},_s=function(N){return{type:"variable",...N}},Un=function(N){return{type:"variable",name:N}},Pn=function(N){return N},ys="*",We=Br("*",!1),tt="/",It=Br("/",!1),nr=function(N,V,re){return{type:V==="*"?"multiplication":"division",right:re}},$=function(N,V){return V.reduce((re,he)=>({left:re,...he}),N)},me=function(N,V,re){return{type:V==="+"?"addition":"subtraction",right:re}},Le="$((",ft=Br("$((",!1),pt="))",Rt=Br("))",!1),er=function(N){return N},Zr="$(",qi=Br("$(",!1),es=function(N){return N},xi="${",jo=Br("${",!1),bA=":-",kA=Br(":-",!1),up=function(N,V){return{name:N,defaultValue:V}},ng=":-}",gu=Br(":-}",!1),ig=function(N){return{name:N,defaultValue:[]}},du=":+",uo=Br(":+",!1),QA=function(N,V){return{name:N,alternativeValue:V}},mc=":+}",ca=Br(":+}",!1),sg=function(N){return{name:N,alternativeValue:[]}},yc=function(N){return{name:N}},Pm="$",og=Br("$",!1),$n=function(N){return e.isGlobPattern(N)},Ap=function(N){return N},ag=/^[a-zA-Z0-9_]/,FA=Cs([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),Hs=function(){return lg()},mu=/^[$@*?#a-zA-Z0-9_\-]/,Ha=Cs(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),Gi=/^[()}<>$|&; \t"']/,ua=Cs(["(",")","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),yu=/^[<>&; \t"']/,Es=Cs(["<",">","&",";"," "," ",'"',"'"],!1,!1),Ec=/^[ \t]/,Cc=Cs([" "," "],!1,!1),G=0,Dt=0,wl=[{line:1,column:1}],bi=0,wc=[],ct=0,Eu;if("startRule"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=o[e.startRule]}function lg(){return t.substring(Dt,G)}function mw(){return Ic(Dt,G)}function TA(N,V){throw V=V!==void 0?V:Ic(Dt,G),fg([Ag(N)],t.substring(Dt,G),V)}function fp(N,V){throw V=V!==void 0?V:Ic(Dt,G),Sm(N,V)}function Br(N,V){return{type:"literal",text:N,ignoreCase:V}}function Cs(N,V,re){return{type:"class",parts:N,inverted:V,ignoreCase:re}}function cg(){return{type:"any"}}function ug(){return{type:"end"}}function Ag(N){return{type:"other",description:N}}function pp(N){var V=wl[N],re;if(V)return V;for(re=N-1;!wl[re];)re--;for(V=wl[re],V={line:V.line,column:V.column};rebi&&(bi=G,wc=[]),wc.push(N))}function Sm(N,V){return new qg(N,null,null,V)}function fg(N,V,re){return new qg(qg.buildMessage(N,V),N,V,re)}function pg(){var N,V,re;for(N=G,V=[],re=Qt();re!==r;)V.push(re),re=Qt();return V!==r?(re=Cu(),re===r&&(re=null),re!==r?(Dt=N,V=n(re),N=V):(G=N,N=r)):(G=N,N=r),N}function Cu(){var N,V,re,he,ze;if(N=G,V=wu(),V!==r){for(re=[],he=Qt();he!==r;)re.push(he),he=Qt();re!==r?(he=hg(),he!==r?(ze=xm(),ze===r&&(ze=null),ze!==r?(Dt=N,V=u(V,he,ze),N=V):(G=N,N=r)):(G=N,N=r)):(G=N,N=r)}else G=N,N=r;if(N===r)if(N=G,V=wu(),V!==r){for(re=[],he=Qt();he!==r;)re.push(he),he=Qt();re!==r?(he=hg(),he===r&&(he=null),he!==r?(Dt=N,V=A(V,he),N=V):(G=N,N=r)):(G=N,N=r)}else G=N,N=r;return N}function xm(){var N,V,re,he,ze;for(N=G,V=[],re=Qt();re!==r;)V.push(re),re=Qt();if(V!==r)if(re=Cu(),re!==r){for(he=[],ze=Qt();ze!==r;)he.push(ze),ze=Qt();he!==r?(Dt=N,V=p(re),N=V):(G=N,N=r)}else G=N,N=r;else G=N,N=r;return N}function hg(){var N;return t.charCodeAt(G)===59?(N=h,G++):(N=r,ct===0&&Ct(E)),N===r&&(t.charCodeAt(G)===38?(N=I,G++):(N=r,ct===0&&Ct(v))),N}function wu(){var N,V,re;return N=G,V=Aa(),V!==r?(re=yw(),re===r&&(re=null),re!==r?(Dt=N,V=b(V,re),N=V):(G=N,N=r)):(G=N,N=r),N}function yw(){var N,V,re,he,ze,mt,fr;for(N=G,V=[],re=Qt();re!==r;)V.push(re),re=Qt();if(V!==r)if(re=bm(),re!==r){for(he=[],ze=Qt();ze!==r;)he.push(ze),ze=Qt();if(he!==r)if(ze=wu(),ze!==r){for(mt=[],fr=Qt();fr!==r;)mt.push(fr),fr=Qt();mt!==r?(Dt=N,V=C(re,ze),N=V):(G=N,N=r)}else G=N,N=r;else G=N,N=r}else G=N,N=r;else G=N,N=r;return N}function bm(){var N;return t.substr(G,2)===T?(N=T,G+=2):(N=r,ct===0&&Ct(L)),N===r&&(t.substr(G,2)===U?(N=U,G+=2):(N=r,ct===0&&Ct(J))),N}function Aa(){var N,V,re;return N=G,V=gg(),V!==r?(re=Bc(),re===r&&(re=null),re!==r?(Dt=N,V=te(V,re),N=V):(G=N,N=r)):(G=N,N=r),N}function Bc(){var N,V,re,he,ze,mt,fr;for(N=G,V=[],re=Qt();re!==r;)V.push(re),re=Qt();if(V!==r)if(re=Il(),re!==r){for(he=[],ze=Qt();ze!==r;)he.push(ze),ze=Qt();if(he!==r)if(ze=Aa(),ze!==r){for(mt=[],fr=Qt();fr!==r;)mt.push(fr),fr=Qt();mt!==r?(Dt=N,V=le(re,ze),N=V):(G=N,N=r)}else G=N,N=r;else G=N,N=r}else G=N,N=r;else G=N,N=r;return N}function Il(){var N;return t.substr(G,2)===pe?(N=pe,G+=2):(N=r,ct===0&&Ct(Ae)),N===r&&(t.charCodeAt(G)===124?(N=ye,G++):(N=r,ct===0&&Ct(ae))),N}function Iu(){var N,V,re,he,ze,mt;if(N=G,V=Eg(),V!==r)if(t.charCodeAt(G)===61?(re=we,G++):(re=r,ct===0&&Ct(Pe)),re!==r)if(he=qo(),he!==r){for(ze=[],mt=Qt();mt!==r;)ze.push(mt),mt=Qt();ze!==r?(Dt=N,V=g(V,he),N=V):(G=N,N=r)}else G=N,N=r;else G=N,N=r;else G=N,N=r;if(N===r)if(N=G,V=Eg(),V!==r)if(t.charCodeAt(G)===61?(re=we,G++):(re=r,ct===0&&Ct(Pe)),re!==r){for(he=[],ze=Qt();ze!==r;)he.push(ze),ze=Qt();he!==r?(Dt=N,V=Ee(V),N=V):(G=N,N=r)}else G=N,N=r;else G=N,N=r;return N}function gg(){var N,V,re,he,ze,mt,fr,Cr,yn,oi,Mi;for(N=G,V=[],re=Qt();re!==r;)V.push(re),re=Qt();if(V!==r)if(t.charCodeAt(G)===40?(re=De,G++):(re=r,ct===0&&Ct(ce)),re!==r){for(he=[],ze=Qt();ze!==r;)he.push(ze),ze=Qt();if(he!==r)if(ze=Cu(),ze!==r){for(mt=[],fr=Qt();fr!==r;)mt.push(fr),fr=Qt();if(mt!==r)if(t.charCodeAt(G)===41?(fr=ne,G++):(fr=r,ct===0&&Ct(ee)),fr!==r){for(Cr=[],yn=Qt();yn!==r;)Cr.push(yn),yn=Qt();if(Cr!==r){for(yn=[],oi=ja();oi!==r;)yn.push(oi),oi=ja();if(yn!==r){for(oi=[],Mi=Qt();Mi!==r;)oi.push(Mi),Mi=Qt();oi!==r?(Dt=N,V=Ie(ze,yn),N=V):(G=N,N=r)}else G=N,N=r}else G=N,N=r}else G=N,N=r;else G=N,N=r}else G=N,N=r;else G=N,N=r}else G=N,N=r;else G=N,N=r;if(N===r){for(N=G,V=[],re=Qt();re!==r;)V.push(re),re=Qt();if(V!==r)if(t.charCodeAt(G)===123?(re=ke,G++):(re=r,ct===0&&Ct(ht)),re!==r){for(he=[],ze=Qt();ze!==r;)he.push(ze),ze=Qt();if(he!==r)if(ze=Cu(),ze!==r){for(mt=[],fr=Qt();fr!==r;)mt.push(fr),fr=Qt();if(mt!==r)if(t.charCodeAt(G)===125?(fr=H,G++):(fr=r,ct===0&&Ct(lt)),fr!==r){for(Cr=[],yn=Qt();yn!==r;)Cr.push(yn),yn=Qt();if(Cr!==r){for(yn=[],oi=ja();oi!==r;)yn.push(oi),oi=ja();if(yn!==r){for(oi=[],Mi=Qt();Mi!==r;)oi.push(Mi),Mi=Qt();oi!==r?(Dt=N,V=Re(ze,yn),N=V):(G=N,N=r)}else G=N,N=r}else G=N,N=r}else G=N,N=r;else G=N,N=r}else G=N,N=r;else G=N,N=r}else G=N,N=r;else G=N,N=r;if(N===r){for(N=G,V=[],re=Qt();re!==r;)V.push(re),re=Qt();if(V!==r){for(re=[],he=Iu();he!==r;)re.push(he),he=Iu();if(re!==r){for(he=[],ze=Qt();ze!==r;)he.push(ze),ze=Qt();if(he!==r){if(ze=[],mt=hp(),mt!==r)for(;mt!==r;)ze.push(mt),mt=hp();else ze=r;if(ze!==r){for(mt=[],fr=Qt();fr!==r;)mt.push(fr),fr=Qt();mt!==r?(Dt=N,V=Qe(re,ze),N=V):(G=N,N=r)}else G=N,N=r}else G=N,N=r}else G=N,N=r}else G=N,N=r;if(N===r){for(N=G,V=[],re=Qt();re!==r;)V.push(re),re=Qt();if(V!==r){if(re=[],he=Iu(),he!==r)for(;he!==r;)re.push(he),he=Iu();else re=r;if(re!==r){for(he=[],ze=Qt();ze!==r;)he.push(ze),ze=Qt();he!==r?(Dt=N,V=be(re),N=V):(G=N,N=r)}else G=N,N=r}else G=N,N=r}}}return N}function RA(){var N,V,re,he,ze;for(N=G,V=[],re=Qt();re!==r;)V.push(re),re=Qt();if(V!==r){if(re=[],he=gp(),he!==r)for(;he!==r;)re.push(he),he=gp();else re=r;if(re!==r){for(he=[],ze=Qt();ze!==r;)he.push(ze),ze=Qt();he!==r?(Dt=N,V=_e(re),N=V):(G=N,N=r)}else G=N,N=r}else G=N,N=r;return N}function hp(){var N,V,re;for(N=G,V=[],re=Qt();re!==r;)V.push(re),re=Qt();if(V!==r?(re=ja(),re!==r?(Dt=N,V=Te(re),N=V):(G=N,N=r)):(G=N,N=r),N===r){for(N=G,V=[],re=Qt();re!==r;)V.push(re),re=Qt();V!==r?(re=gp(),re!==r?(Dt=N,V=Te(re),N=V):(G=N,N=r)):(G=N,N=r)}return N}function ja(){var N,V,re,he,ze;for(N=G,V=[],re=Qt();re!==r;)V.push(re),re=Qt();return V!==r?(Je.test(t.charAt(G))?(re=t.charAt(G),G++):(re=r,ct===0&&Ct(He)),re===r&&(re=null),re!==r?(he=dg(),he!==r?(ze=gp(),ze!==r?(Dt=N,V=x(re,he,ze),N=V):(G=N,N=r)):(G=N,N=r)):(G=N,N=r)):(G=N,N=r),N}function dg(){var N;return t.substr(G,2)===w?(N=w,G+=2):(N=r,ct===0&&Ct(S)),N===r&&(t.substr(G,2)===y?(N=y,G+=2):(N=r,ct===0&&Ct(F)),N===r&&(t.charCodeAt(G)===62?(N=z,G++):(N=r,ct===0&&Ct(X)),N===r&&(t.substr(G,3)===Z?(N=Z,G+=3):(N=r,ct===0&&Ct(ie)),N===r&&(t.substr(G,2)===Se?(N=Se,G+=2):(N=r,ct===0&&Ct(Ne)),N===r&&(t.charCodeAt(G)===60?(N=ot,G++):(N=r,ct===0&&Ct(dt))))))),N}function gp(){var N,V,re;for(N=G,V=[],re=Qt();re!==r;)V.push(re),re=Qt();return V!==r?(re=qo(),re!==r?(Dt=N,V=Te(re),N=V):(G=N,N=r)):(G=N,N=r),N}function qo(){var N,V,re;if(N=G,V=[],re=ws(),re!==r)for(;re!==r;)V.push(re),re=ws();else V=r;return V!==r&&(Dt=N,V=jt(V)),N=V,N}function ws(){var N,V;return N=G,V=Ii(),V!==r&&(Dt=N,V=$t(V)),N=V,N===r&&(N=G,V=km(),V!==r&&(Dt=N,V=$t(V)),N=V,N===r&&(N=G,V=Qm(),V!==r&&(Dt=N,V=$t(V)),N=V,N===r&&(N=G,V=Go(),V!==r&&(Dt=N,V=$t(V)),N=V))),N}function Ii(){var N,V,re,he;return N=G,t.substr(G,2)===xt?(V=xt,G+=2):(V=r,ct===0&&Ct(an)),V!==r?(re=ln(),re!==r?(t.charCodeAt(G)===39?(he=Qr,G++):(he=r,ct===0&&Ct(mr)),he!==r?(Dt=N,V=xr(re),N=V):(G=N,N=r)):(G=N,N=r)):(G=N,N=r),N}function km(){var N,V,re,he;return N=G,t.charCodeAt(G)===39?(V=Qr,G++):(V=r,ct===0&&Ct(mr)),V!==r?(re=mp(),re!==r?(t.charCodeAt(G)===39?(he=Qr,G++):(he=r,ct===0&&Ct(mr)),he!==r?(Dt=N,V=xr(re),N=V):(G=N,N=r)):(G=N,N=r)):(G=N,N=r),N}function Qm(){var N,V,re,he;if(N=G,t.substr(G,2)===Wr?(V=Wr,G+=2):(V=r,ct===0&&Ct(Vn)),V!==r&&(Dt=N,V=Ns()),N=V,N===r)if(N=G,t.charCodeAt(G)===34?(V=Ri,G++):(V=r,ct===0&&Ct(ps)),V!==r){for(re=[],he=NA();he!==r;)re.push(he),he=NA();re!==r?(t.charCodeAt(G)===34?(he=Ri,G++):(he=r,ct===0&&Ct(ps)),he!==r?(Dt=N,V=io(re),N=V):(G=N,N=r)):(G=N,N=r)}else G=N,N=r;return N}function Go(){var N,V,re;if(N=G,V=[],re=dp(),re!==r)for(;re!==r;)V.push(re),re=dp();else V=r;return V!==r&&(Dt=N,V=io(V)),N=V,N}function NA(){var N,V;return N=G,V=Gr(),V!==r&&(Dt=N,V=Si(V)),N=V,N===r&&(N=G,V=yp(),V!==r&&(Dt=N,V=Ls(V)),N=V,N===r&&(N=G,V=Dc(),V!==r&&(Dt=N,V=so(V)),N=V,N===r&&(N=G,V=mg(),V!==r&&(Dt=N,V=cc(V)),N=V))),N}function dp(){var N,V;return N=G,V=Gr(),V!==r&&(Dt=N,V=cu(V)),N=V,N===r&&(N=G,V=yp(),V!==r&&(Dt=N,V=ap(V)),N=V,N===r&&(N=G,V=Dc(),V!==r&&(Dt=N,V=lp(V)),N=V,N===r&&(N=G,V=Ew(),V!==r&&(Dt=N,V=Ms(V)),N=V,N===r&&(N=G,V=pa(),V!==r&&(Dt=N,V=cc(V)),N=V)))),N}function mp(){var N,V,re;for(N=G,V=[],Dn.test(t.charAt(G))?(re=t.charAt(G),G++):(re=r,ct===0&&Ct(oo));re!==r;)V.push(re),Dn.test(t.charAt(G))?(re=t.charAt(G),G++):(re=r,ct===0&&Ct(oo));return V!==r&&(Dt=N,V=Os(V)),N=V,N}function mg(){var N,V,re;if(N=G,V=[],re=fa(),re===r&&(ml.test(t.charAt(G))?(re=t.charAt(G),G++):(re=r,ct===0&&Ct(yl))),re!==r)for(;re!==r;)V.push(re),re=fa(),re===r&&(ml.test(t.charAt(G))?(re=t.charAt(G),G++):(re=r,ct===0&&Ct(yl)));else V=r;return V!==r&&(Dt=N,V=Os(V)),N=V,N}function fa(){var N,V,re;return N=G,t.substr(G,2)===ao?(V=ao,G+=2):(V=r,ct===0&&Ct(Kn)),V!==r&&(Dt=N,V=Mn()),N=V,N===r&&(N=G,t.charCodeAt(G)===92?(V=Ni,G++):(V=r,ct===0&&Ct(On)),V!==r?(_i.test(t.charAt(G))?(re=t.charAt(G),G++):(re=r,ct===0&&Ct(tr)),re!==r?(Dt=N,V=Me(re),N=V):(G=N,N=r)):(G=N,N=r)),N}function ln(){var N,V,re;for(N=G,V=[],re=Ao(),re===r&&(Dn.test(t.charAt(G))?(re=t.charAt(G),G++):(re=r,ct===0&&Ct(oo)));re!==r;)V.push(re),re=Ao(),re===r&&(Dn.test(t.charAt(G))?(re=t.charAt(G),G++):(re=r,ct===0&&Ct(oo)));return V!==r&&(Dt=N,V=Os(V)),N=V,N}function Ao(){var N,V,re;return N=G,t.substr(G,2)===ii?(V=ii,G+=2):(V=r,ct===0&&Ct(Oa)),V!==r&&(Dt=N,V=hr()),N=V,N===r&&(N=G,t.substr(G,2)===uc?(V=uc,G+=2):(V=r,ct===0&&Ct(uu)),V!==r&&(Dt=N,V=Ac()),N=V,N===r&&(N=G,t.charCodeAt(G)===92?(V=Ni,G++):(V=r,ct===0&&Ct(On)),V!==r?(El.test(t.charAt(G))?(re=t.charAt(G),G++):(re=r,ct===0&&Ct(vA)),re!==r?(Dt=N,V=Au(),N=V):(G=N,N=r)):(G=N,N=r),N===r&&(N=G,t.substr(G,2)===Ce?(V=Ce,G+=2):(V=r,ct===0&&Ct(Tt)),V!==r&&(Dt=N,V=fc()),N=V,N===r&&(N=G,t.substr(G,2)===Hi?(V=Hi,G+=2):(V=r,ct===0&&Ct(fu)),V!==r&&(Dt=N,V=Yt()),N=V,N===r&&(N=G,t.substr(G,2)===Cl?(V=Cl,G+=2):(V=r,ct===0&&Ct(DA)),V!==r&&(Dt=N,V=cp()),N=V,N===r&&(N=G,t.substr(G,2)===pc?(V=pc,G+=2):(V=r,ct===0&&Ct(PA)),V!==r&&(Dt=N,V=Qn()),N=V,N===r&&(N=G,t.substr(G,2)===hi?(V=hi,G+=2):(V=r,ct===0&&Ct(hc)),V!==r&&(Dt=N,V=SA()),N=V,N===r&&(N=G,t.charCodeAt(G)===92?(V=Ni,G++):(V=r,ct===0&&Ct(On)),V!==r?(sa.test(t.charAt(G))?(re=t.charAt(G),G++):(re=r,ct===0&&Ct(Li)),re!==r?(Dt=N,V=Me(re),N=V):(G=N,N=r)):(G=N,N=r),N===r&&(N=LA()))))))))),N}function LA(){var N,V,re,he,ze,mt,fr,Cr,yn,oi,Mi,wg;return N=G,t.charCodeAt(G)===92?(V=Ni,G++):(V=r,ct===0&&Ct(On)),V!==r?(re=qa(),re!==r?(Dt=N,V=_o(re),N=V):(G=N,N=r)):(G=N,N=r),N===r&&(N=G,t.substr(G,2)===Ze?(V=Ze,G+=2):(V=r,ct===0&&Ct(lo)),V!==r?(re=G,he=G,ze=qa(),ze!==r?(mt=si(),mt!==r?(ze=[ze,mt],he=ze):(G=he,he=r)):(G=he,he=r),he===r&&(he=qa()),he!==r?re=t.substring(re,G):re=he,re!==r?(Dt=N,V=_o(re),N=V):(G=N,N=r)):(G=N,N=r),N===r&&(N=G,t.substr(G,2)===gc?(V=gc,G+=2):(V=r,ct===0&&Ct(pu)),V!==r?(re=G,he=G,ze=si(),ze!==r?(mt=si(),mt!==r?(fr=si(),fr!==r?(Cr=si(),Cr!==r?(ze=[ze,mt,fr,Cr],he=ze):(G=he,he=r)):(G=he,he=r)):(G=he,he=r)):(G=he,he=r),he!==r?re=t.substring(re,G):re=he,re!==r?(Dt=N,V=_o(re),N=V):(G=N,N=r)):(G=N,N=r),N===r&&(N=G,t.substr(G,2)===ji?(V=ji,G+=2):(V=r,ct===0&&Ct(hu)),V!==r?(re=G,he=G,ze=si(),ze!==r?(mt=si(),mt!==r?(fr=si(),fr!==r?(Cr=si(),Cr!==r?(yn=si(),yn!==r?(oi=si(),oi!==r?(Mi=si(),Mi!==r?(wg=si(),wg!==r?(ze=[ze,mt,fr,Cr,yn,oi,Mi,wg],he=ze):(G=he,he=r)):(G=he,he=r)):(G=he,he=r)):(G=he,he=r)):(G=he,he=r)):(G=he,he=r)):(G=he,he=r)):(G=he,he=r),he!==r?re=t.substring(re,G):re=he,re!==r?(Dt=N,V=xA(re),N=V):(G=N,N=r)):(G=N,N=r)))),N}function qa(){var N;return Ua.test(t.charAt(G))?(N=t.charAt(G),G++):(N=r,ct===0&&Ct(dc)),N}function si(){var N;return hs.test(t.charAt(G))?(N=t.charAt(G),G++):(N=r,ct===0&&Ct(_t)),N}function pa(){var N,V,re,he,ze;if(N=G,V=[],re=G,t.charCodeAt(G)===92?(he=Ni,G++):(he=r,ct===0&&Ct(On)),he!==r?(t.length>G?(ze=t.charAt(G),G++):(ze=r,ct===0&&Ct(Fn)),ze!==r?(Dt=re,he=Me(ze),re=he):(G=re,re=r)):(G=re,re=r),re===r&&(re=G,t.substr(G,2)===Ci?(he=Ci,G+=2):(he=r,ct===0&&Ct(oa)),he!==r&&(Dt=re,he=co()),re=he,re===r&&(re=G,he=G,ct++,ze=Fm(),ct--,ze===r?he=void 0:(G=he,he=r),he!==r?(t.length>G?(ze=t.charAt(G),G++):(ze=r,ct===0&&Ct(Fn)),ze!==r?(Dt=re,he=Me(ze),re=he):(G=re,re=r)):(G=re,re=r))),re!==r)for(;re!==r;)V.push(re),re=G,t.charCodeAt(G)===92?(he=Ni,G++):(he=r,ct===0&&Ct(On)),he!==r?(t.length>G?(ze=t.charAt(G),G++):(ze=r,ct===0&&Ct(Fn)),ze!==r?(Dt=re,he=Me(ze),re=he):(G=re,re=r)):(G=re,re=r),re===r&&(re=G,t.substr(G,2)===Ci?(he=Ci,G+=2):(he=r,ct===0&&Ct(oa)),he!==r&&(Dt=re,he=co()),re=he,re===r&&(re=G,he=G,ct++,ze=Fm(),ct--,ze===r?he=void 0:(G=he,he=r),he!==r?(t.length>G?(ze=t.charAt(G),G++):(ze=r,ct===0&&Ct(Fn)),ze!==r?(Dt=re,he=Me(ze),re=he):(G=re,re=r)):(G=re,re=r)));else V=r;return V!==r&&(Dt=N,V=Os(V)),N=V,N}function vc(){var N,V,re,he,ze,mt;if(N=G,t.charCodeAt(G)===45?(V=Us,G++):(V=r,ct===0&&Ct(aa)),V===r&&(t.charCodeAt(G)===43?(V=la,G++):(V=r,ct===0&&Ct(Ho))),V===r&&(V=null),V!==r){if(re=[],Je.test(t.charAt(G))?(he=t.charAt(G),G++):(he=r,ct===0&&Ct(He)),he!==r)for(;he!==r;)re.push(he),Je.test(t.charAt(G))?(he=t.charAt(G),G++):(he=r,ct===0&&Ct(He));else re=r;if(re!==r)if(t.charCodeAt(G)===46?(he=wi,G++):(he=r,ct===0&&Ct(gs)),he!==r){if(ze=[],Je.test(t.charAt(G))?(mt=t.charAt(G),G++):(mt=r,ct===0&&Ct(He)),mt!==r)for(;mt!==r;)ze.push(mt),Je.test(t.charAt(G))?(mt=t.charAt(G),G++):(mt=r,ct===0&&Ct(He));else ze=r;ze!==r?(Dt=N,V=ds(V,re,ze),N=V):(G=N,N=r)}else G=N,N=r;else G=N,N=r}else G=N,N=r;if(N===r){if(N=G,t.charCodeAt(G)===45?(V=Us,G++):(V=r,ct===0&&Ct(aa)),V===r&&(t.charCodeAt(G)===43?(V=la,G++):(V=r,ct===0&&Ct(Ho))),V===r&&(V=null),V!==r){if(re=[],Je.test(t.charAt(G))?(he=t.charAt(G),G++):(he=r,ct===0&&Ct(He)),he!==r)for(;he!==r;)re.push(he),Je.test(t.charAt(G))?(he=t.charAt(G),G++):(he=r,ct===0&&Ct(He));else re=r;re!==r?(Dt=N,V=ms(V,re),N=V):(G=N,N=r)}else G=N,N=r;if(N===r&&(N=G,V=Dc(),V!==r&&(Dt=N,V=_s(V)),N=V,N===r&&(N=G,V=Ga(),V!==r&&(Dt=N,V=Un(V)),N=V,N===r)))if(N=G,t.charCodeAt(G)===40?(V=De,G++):(V=r,ct===0&&Ct(ce)),V!==r){for(re=[],he=Qt();he!==r;)re.push(he),he=Qt();if(re!==r)if(he=ts(),he!==r){for(ze=[],mt=Qt();mt!==r;)ze.push(mt),mt=Qt();ze!==r?(t.charCodeAt(G)===41?(mt=ne,G++):(mt=r,ct===0&&Ct(ee)),mt!==r?(Dt=N,V=Pn(he),N=V):(G=N,N=r)):(G=N,N=r)}else G=N,N=r;else G=N,N=r}else G=N,N=r}return N}function Bl(){var N,V,re,he,ze,mt,fr,Cr;if(N=G,V=vc(),V!==r){for(re=[],he=G,ze=[],mt=Qt();mt!==r;)ze.push(mt),mt=Qt();if(ze!==r)if(t.charCodeAt(G)===42?(mt=ys,G++):(mt=r,ct===0&&Ct(We)),mt===r&&(t.charCodeAt(G)===47?(mt=tt,G++):(mt=r,ct===0&&Ct(It))),mt!==r){for(fr=[],Cr=Qt();Cr!==r;)fr.push(Cr),Cr=Qt();fr!==r?(Cr=vc(),Cr!==r?(Dt=he,ze=nr(V,mt,Cr),he=ze):(G=he,he=r)):(G=he,he=r)}else G=he,he=r;else G=he,he=r;for(;he!==r;){for(re.push(he),he=G,ze=[],mt=Qt();mt!==r;)ze.push(mt),mt=Qt();if(ze!==r)if(t.charCodeAt(G)===42?(mt=ys,G++):(mt=r,ct===0&&Ct(We)),mt===r&&(t.charCodeAt(G)===47?(mt=tt,G++):(mt=r,ct===0&&Ct(It))),mt!==r){for(fr=[],Cr=Qt();Cr!==r;)fr.push(Cr),Cr=Qt();fr!==r?(Cr=vc(),Cr!==r?(Dt=he,ze=nr(V,mt,Cr),he=ze):(G=he,he=r)):(G=he,he=r)}else G=he,he=r;else G=he,he=r}re!==r?(Dt=N,V=$(V,re),N=V):(G=N,N=r)}else G=N,N=r;return N}function ts(){var N,V,re,he,ze,mt,fr,Cr;if(N=G,V=Bl(),V!==r){for(re=[],he=G,ze=[],mt=Qt();mt!==r;)ze.push(mt),mt=Qt();if(ze!==r)if(t.charCodeAt(G)===43?(mt=la,G++):(mt=r,ct===0&&Ct(Ho)),mt===r&&(t.charCodeAt(G)===45?(mt=Us,G++):(mt=r,ct===0&&Ct(aa))),mt!==r){for(fr=[],Cr=Qt();Cr!==r;)fr.push(Cr),Cr=Qt();fr!==r?(Cr=Bl(),Cr!==r?(Dt=he,ze=me(V,mt,Cr),he=ze):(G=he,he=r)):(G=he,he=r)}else G=he,he=r;else G=he,he=r;for(;he!==r;){for(re.push(he),he=G,ze=[],mt=Qt();mt!==r;)ze.push(mt),mt=Qt();if(ze!==r)if(t.charCodeAt(G)===43?(mt=la,G++):(mt=r,ct===0&&Ct(Ho)),mt===r&&(t.charCodeAt(G)===45?(mt=Us,G++):(mt=r,ct===0&&Ct(aa))),mt!==r){for(fr=[],Cr=Qt();Cr!==r;)fr.push(Cr),Cr=Qt();fr!==r?(Cr=Bl(),Cr!==r?(Dt=he,ze=me(V,mt,Cr),he=ze):(G=he,he=r)):(G=he,he=r)}else G=he,he=r;else G=he,he=r}re!==r?(Dt=N,V=$(V,re),N=V):(G=N,N=r)}else G=N,N=r;return N}function Gr(){var N,V,re,he,ze,mt;if(N=G,t.substr(G,3)===Le?(V=Le,G+=3):(V=r,ct===0&&Ct(ft)),V!==r){for(re=[],he=Qt();he!==r;)re.push(he),he=Qt();if(re!==r)if(he=ts(),he!==r){for(ze=[],mt=Qt();mt!==r;)ze.push(mt),mt=Qt();ze!==r?(t.substr(G,2)===pt?(mt=pt,G+=2):(mt=r,ct===0&&Ct(Rt)),mt!==r?(Dt=N,V=er(he),N=V):(G=N,N=r)):(G=N,N=r)}else G=N,N=r;else G=N,N=r}else G=N,N=r;return N}function yp(){var N,V,re,he;return N=G,t.substr(G,2)===Zr?(V=Zr,G+=2):(V=r,ct===0&&Ct(qi)),V!==r?(re=Cu(),re!==r?(t.charCodeAt(G)===41?(he=ne,G++):(he=r,ct===0&&Ct(ee)),he!==r?(Dt=N,V=es(re),N=V):(G=N,N=r)):(G=N,N=r)):(G=N,N=r),N}function Dc(){var N,V,re,he,ze,mt;return N=G,t.substr(G,2)===xi?(V=xi,G+=2):(V=r,ct===0&&Ct(jo)),V!==r?(re=Ga(),re!==r?(t.substr(G,2)===bA?(he=bA,G+=2):(he=r,ct===0&&Ct(kA)),he!==r?(ze=RA(),ze!==r?(t.charCodeAt(G)===125?(mt=H,G++):(mt=r,ct===0&&Ct(lt)),mt!==r?(Dt=N,V=up(re,ze),N=V):(G=N,N=r)):(G=N,N=r)):(G=N,N=r)):(G=N,N=r)):(G=N,N=r),N===r&&(N=G,t.substr(G,2)===xi?(V=xi,G+=2):(V=r,ct===0&&Ct(jo)),V!==r?(re=Ga(),re!==r?(t.substr(G,3)===ng?(he=ng,G+=3):(he=r,ct===0&&Ct(gu)),he!==r?(Dt=N,V=ig(re),N=V):(G=N,N=r)):(G=N,N=r)):(G=N,N=r),N===r&&(N=G,t.substr(G,2)===xi?(V=xi,G+=2):(V=r,ct===0&&Ct(jo)),V!==r?(re=Ga(),re!==r?(t.substr(G,2)===du?(he=du,G+=2):(he=r,ct===0&&Ct(uo)),he!==r?(ze=RA(),ze!==r?(t.charCodeAt(G)===125?(mt=H,G++):(mt=r,ct===0&&Ct(lt)),mt!==r?(Dt=N,V=QA(re,ze),N=V):(G=N,N=r)):(G=N,N=r)):(G=N,N=r)):(G=N,N=r)):(G=N,N=r),N===r&&(N=G,t.substr(G,2)===xi?(V=xi,G+=2):(V=r,ct===0&&Ct(jo)),V!==r?(re=Ga(),re!==r?(t.substr(G,3)===mc?(he=mc,G+=3):(he=r,ct===0&&Ct(ca)),he!==r?(Dt=N,V=sg(re),N=V):(G=N,N=r)):(G=N,N=r)):(G=N,N=r),N===r&&(N=G,t.substr(G,2)===xi?(V=xi,G+=2):(V=r,ct===0&&Ct(jo)),V!==r?(re=Ga(),re!==r?(t.charCodeAt(G)===125?(he=H,G++):(he=r,ct===0&&Ct(lt)),he!==r?(Dt=N,V=yc(re),N=V):(G=N,N=r)):(G=N,N=r)):(G=N,N=r),N===r&&(N=G,t.charCodeAt(G)===36?(V=Pm,G++):(V=r,ct===0&&Ct(og)),V!==r?(re=Ga(),re!==r?(Dt=N,V=yc(re),N=V):(G=N,N=r)):(G=N,N=r)))))),N}function Ew(){var N,V,re;return N=G,V=yg(),V!==r?(Dt=G,re=$n(V),re?re=void 0:re=r,re!==r?(Dt=N,V=Ap(V),N=V):(G=N,N=r)):(G=N,N=r),N}function yg(){var N,V,re,he,ze;if(N=G,V=[],re=G,he=G,ct++,ze=Cg(),ct--,ze===r?he=void 0:(G=he,he=r),he!==r?(t.length>G?(ze=t.charAt(G),G++):(ze=r,ct===0&&Ct(Fn)),ze!==r?(Dt=re,he=Me(ze),re=he):(G=re,re=r)):(G=re,re=r),re!==r)for(;re!==r;)V.push(re),re=G,he=G,ct++,ze=Cg(),ct--,ze===r?he=void 0:(G=he,he=r),he!==r?(t.length>G?(ze=t.charAt(G),G++):(ze=r,ct===0&&Ct(Fn)),ze!==r?(Dt=re,he=Me(ze),re=he):(G=re,re=r)):(G=re,re=r);else V=r;return V!==r&&(Dt=N,V=Os(V)),N=V,N}function Eg(){var N,V,re;if(N=G,V=[],ag.test(t.charAt(G))?(re=t.charAt(G),G++):(re=r,ct===0&&Ct(FA)),re!==r)for(;re!==r;)V.push(re),ag.test(t.charAt(G))?(re=t.charAt(G),G++):(re=r,ct===0&&Ct(FA));else V=r;return V!==r&&(Dt=N,V=Hs()),N=V,N}function Ga(){var N,V,re;if(N=G,V=[],mu.test(t.charAt(G))?(re=t.charAt(G),G++):(re=r,ct===0&&Ct(Ha)),re!==r)for(;re!==r;)V.push(re),mu.test(t.charAt(G))?(re=t.charAt(G),G++):(re=r,ct===0&&Ct(Ha));else V=r;return V!==r&&(Dt=N,V=Hs()),N=V,N}function Fm(){var N;return Gi.test(t.charAt(G))?(N=t.charAt(G),G++):(N=r,ct===0&&Ct(ua)),N}function Cg(){var N;return yu.test(t.charAt(G))?(N=t.charAt(G),G++):(N=r,ct===0&&Ct(Es)),N}function Qt(){var N,V;if(N=[],Ec.test(t.charAt(G))?(V=t.charAt(G),G++):(V=r,ct===0&&Ct(Cc)),V!==r)for(;V!==r;)N.push(V),Ec.test(t.charAt(G))?(V=t.charAt(G),G++):(V=r,ct===0&&Ct(Cc));else N=r;return N}if(Eu=a(),Eu!==r&&G===t.length)return Eu;throw Eu!==r&&G!1}){try{return(0,tW.parse)(t,e)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function ly(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:o},a)=>`${MD(r)}${o===";"?a!==t.length-1||e?";":"":" &"}`).join(" ")}function MD(t){return`${cy(t.chain)}${t.then?` ${lR(t.then)}`:""}`}function lR(t){return`${t.type} ${MD(t.line)}`}function cy(t){return`${uR(t)}${t.then?` ${cR(t.then)}`:""}`}function cR(t){return`${t.type} ${cy(t.chain)}`}function uR(t){switch(t.type){case"command":return`${t.envs.length>0?`${t.envs.map(e=>ND(e)).join(" ")} `:""}${t.args.map(e=>AR(e)).join(" ")}`;case"subshell":return`(${ly(t.subshell)})${t.args.length>0?` ${t.args.map(e=>Kw(e)).join(" ")}`:""}`;case"group":return`{ ${ly(t.group,{endSemicolon:!0})} }${t.args.length>0?` ${t.args.map(e=>Kw(e)).join(" ")}`:""}`;case"envs":return t.envs.map(e=>ND(e)).join(" ");default:throw new Error(`Unsupported command type: "${t.type}"`)}}function ND(t){return`${t.name}=${t.args[0]?Gg(t.args[0]):""}`}function AR(t){switch(t.type){case"redirection":return Kw(t);case"argument":return Gg(t);default:throw new Error(`Unsupported argument type: "${t.type}"`)}}function Kw(t){return`${t.subtype} ${t.args.map(e=>Gg(e)).join(" ")}`}function Gg(t){return t.segments.map(e=>fR(e)).join("")}function fR(t){let e=(o,a)=>a?`"${o}"`:o,r=o=>o===""?"''":o.match(/[()}<>$|&;"'\n\t ]/)?o.match(/['\t\p{C}]/u)?o.match(/'/)?`"${o.replace(/["$\t\p{C}]/u,m8e)}"`:`$'${o.replace(/[\t\p{C}]/u,nW)}'`:`'${o}'`:o;switch(t.type){case"text":return r(t.text);case"glob":return t.pattern;case"shell":return e(`\${${ly(t.shell)}}`,t.quoted);case"variable":return e(typeof t.defaultValue>"u"?typeof t.alternativeValue>"u"?`\${${t.name}}`:t.alternativeValue.length===0?`\${${t.name}:+}`:`\${${t.name}:+${t.alternativeValue.map(o=>Gg(o)).join(" ")}}`:t.defaultValue.length===0?`\${${t.name}:-}`:`\${${t.name}:-${t.defaultValue.map(o=>Gg(o)).join(" ")}}`,t.quoted);case"arithmetic":return`$(( ${OD(t.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: "${t.type}"`)}}function OD(t){let e=a=>{switch(a){case"addition":return"+";case"subtraction":return"-";case"multiplication":return"*";case"division":return"/";default:throw new Error(`Can't extract operator from arithmetic expression of type "${a}"`)}},r=(a,n)=>n?`( ${a} )`:a,o=a=>r(OD(a),!["number","variable"].includes(a.type));switch(t.type){case"number":return String(t.value);case"variable":return t.name;default:return`${o(t.left)} ${e(t.type)} ${o(t.right)}`}}var tW,rW,d8e,nW,m8e,iW=Et(()=>{tW=$e(eW());rW=new Map([["\f","\\f"],[` +`,"\\n"],["\r","\\r"],[" ","\\t"],["\v","\\v"],["\0","\\0"]]),d8e=new Map([["\\","\\\\"],["$","\\$"],['"','\\"'],...Array.from(rW,([t,e])=>[t,`"$'${e}'"`])]),nW=t=>rW.get(t)??`\\x${t.charCodeAt(0).toString(16).padStart(2,"0")}`,m8e=t=>d8e.get(t)??`"$'${nW(t)}'"`});var oW=_((Nxt,sW)=>{"use strict";function y8e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function Yg(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Yg)}y8e(Yg,Error);Yg.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",I;for(I=0;I0){for(I=1,v=1;Ipe&&(pe=J,Ae=[]),Ae.push(He))}function lt(He,x){return new Yg(He,null,null,x)}function Re(He,x,w){return new Yg(Yg.buildMessage(He,x),He,x,w)}function Qe(){var He,x,w,S;return He=J,x=be(),x!==r?(t.charCodeAt(J)===47?(w=n,J++):(w=r,ye===0&&H(u)),w!==r?(S=be(),S!==r?(te=He,x=A(x,S),He=x):(J=He,He=r)):(J=He,He=r)):(J=He,He=r),He===r&&(He=J,x=be(),x!==r&&(te=He,x=p(x)),He=x),He}function be(){var He,x,w,S;return He=J,x=_e(),x!==r?(t.charCodeAt(J)===64?(w=h,J++):(w=r,ye===0&&H(E)),w!==r?(S=Je(),S!==r?(te=He,x=I(x,S),He=x):(J=He,He=r)):(J=He,He=r)):(J=He,He=r),He===r&&(He=J,x=_e(),x!==r&&(te=He,x=v(x)),He=x),He}function _e(){var He,x,w,S,y;return He=J,t.charCodeAt(J)===64?(x=h,J++):(x=r,ye===0&&H(E)),x!==r?(w=Te(),w!==r?(t.charCodeAt(J)===47?(S=n,J++):(S=r,ye===0&&H(u)),S!==r?(y=Te(),y!==r?(te=He,x=b(),He=x):(J=He,He=r)):(J=He,He=r)):(J=He,He=r)):(J=He,He=r),He===r&&(He=J,x=Te(),x!==r&&(te=He,x=b()),He=x),He}function Te(){var He,x,w;if(He=J,x=[],C.test(t.charAt(J))?(w=t.charAt(J),J++):(w=r,ye===0&&H(T)),w!==r)for(;w!==r;)x.push(w),C.test(t.charAt(J))?(w=t.charAt(J),J++):(w=r,ye===0&&H(T));else x=r;return x!==r&&(te=He,x=b()),He=x,He}function Je(){var He,x,w;if(He=J,x=[],L.test(t.charAt(J))?(w=t.charAt(J),J++):(w=r,ye===0&&H(U)),w!==r)for(;w!==r;)x.push(w),L.test(t.charAt(J))?(w=t.charAt(J),J++):(w=r,ye===0&&H(U));else x=r;return x!==r&&(te=He,x=b()),He=x,He}if(ae=a(),ae!==r&&J===t.length)return ae;throw ae!==r&&J{aW=$e(oW())});var Vg=_((Mxt,Wg)=>{"use strict";function cW(t){return typeof t>"u"||t===null}function C8e(t){return typeof t=="object"&&t!==null}function w8e(t){return Array.isArray(t)?t:cW(t)?[]:[t]}function I8e(t,e){var r,o,a,n;if(e)for(n=Object.keys(e),r=0,o=n.length;r{"use strict";function Jw(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}Jw.prototype=Object.create(Error.prototype);Jw.prototype.constructor=Jw;Jw.prototype.toString=function(e){var r=this.name+": ";return r+=this.reason||"(unknown reason)",!e&&this.mark&&(r+=" "+this.mark.toString()),r};uW.exports=Jw});var pW=_((Uxt,fW)=>{"use strict";var AW=Vg();function pR(t,e,r,o,a){this.name=t,this.buffer=e,this.position=r,this.line=o,this.column=a}pR.prototype.getSnippet=function(e,r){var o,a,n,u,A;if(!this.buffer)return null;for(e=e||4,r=r||75,o="",a=this.position;a>0&&`\0\r +\x85\u2028\u2029`.indexOf(this.buffer.charAt(a-1))===-1;)if(a-=1,this.position-a>r/2-1){o=" ... ",a+=5;break}for(n="",u=this.position;ur/2-1){n=" ... ",u-=5;break}return A=this.buffer.slice(a,u),AW.repeat(" ",e)+o+A+n+` +`+AW.repeat(" ",e+this.position-a+o.length)+"^"};pR.prototype.toString=function(e){var r,o="";return this.name&&(o+='in "'+this.name+'" '),o+="at line "+(this.line+1)+", column "+(this.column+1),e||(r=this.getSnippet(),r&&(o+=`: +`+r)),o};fW.exports=pR});var os=_((_xt,gW)=>{"use strict";var hW=uy(),D8e=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],P8e=["scalar","sequence","mapping"];function S8e(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(o){e[String(o)]=r})}),e}function x8e(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(D8e.indexOf(r)===-1)throw new hW('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=S8e(e.styleAliases||null),P8e.indexOf(this.kind)===-1)throw new hW('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}gW.exports=x8e});var Kg=_((Hxt,mW)=>{"use strict";var dW=Vg(),HD=uy(),b8e=os();function hR(t,e,r){var o=[];return t.include.forEach(function(a){r=hR(a,e,r)}),t[e].forEach(function(a){r.forEach(function(n,u){n.tag===a.tag&&n.kind===a.kind&&o.push(u)}),r.push(a)}),r.filter(function(a,n){return o.indexOf(n)===-1})}function k8e(){var t={scalar:{},sequence:{},mapping:{},fallback:{}},e,r;function o(a){t[a.kind][a.tag]=t.fallback[a.tag]=a}for(e=0,r=arguments.length;e{"use strict";var Q8e=os();yW.exports=new Q8e("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return t!==null?t:""}})});var wW=_((qxt,CW)=>{"use strict";var F8e=os();CW.exports=new F8e("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return t!==null?t:[]}})});var BW=_((Gxt,IW)=>{"use strict";var T8e=os();IW.exports=new T8e("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return t!==null?t:{}}})});var jD=_((Yxt,vW)=>{"use strict";var R8e=Kg();vW.exports=new R8e({explicit:[EW(),wW(),BW()]})});var PW=_((Wxt,DW)=>{"use strict";var N8e=os();function L8e(t){if(t===null)return!0;var e=t.length;return e===1&&t==="~"||e===4&&(t==="null"||t==="Null"||t==="NULL")}function M8e(){return null}function O8e(t){return t===null}DW.exports=new N8e("tag:yaml.org,2002:null",{kind:"scalar",resolve:L8e,construct:M8e,predicate:O8e,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var xW=_((Vxt,SW)=>{"use strict";var U8e=os();function _8e(t){if(t===null)return!1;var e=t.length;return e===4&&(t==="true"||t==="True"||t==="TRUE")||e===5&&(t==="false"||t==="False"||t==="FALSE")}function H8e(t){return t==="true"||t==="True"||t==="TRUE"}function j8e(t){return Object.prototype.toString.call(t)==="[object Boolean]"}SW.exports=new U8e("tag:yaml.org,2002:bool",{kind:"scalar",resolve:_8e,construct:H8e,predicate:j8e,represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"})});var kW=_((Kxt,bW)=>{"use strict";var q8e=Vg(),G8e=os();function Y8e(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}function W8e(t){return 48<=t&&t<=55}function V8e(t){return 48<=t&&t<=57}function K8e(t){if(t===null)return!1;var e=t.length,r=0,o=!1,a;if(!e)return!1;if(a=t[r],(a==="-"||a==="+")&&(a=t[++r]),a==="0"){if(r+1===e)return!0;if(a=t[++r],a==="b"){for(r++;r=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0"+t.toString(8):"-0"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var TW=_((Jxt,FW)=>{"use strict";var QW=Vg(),X8e=os(),Z8e=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function $8e(t){return!(t===null||!Z8e.test(t)||t[t.length-1]==="_")}function eHe(t){var e,r,o,a;return e=t.replace(/_/g,"").toLowerCase(),r=e[0]==="-"?-1:1,a=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(n){a.unshift(parseFloat(n,10))}),e=0,o=1,a.forEach(function(n){e+=n*o,o*=60}),r*e):r*parseFloat(e,10)}var tHe=/^[-+]?[0-9]+e/;function rHe(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(QW.isNegativeZero(t))return"-0.0";return r=t.toString(10),tHe.test(r)?r.replace("e",".e"):r}function nHe(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!==0||QW.isNegativeZero(t))}FW.exports=new X8e("tag:yaml.org,2002:float",{kind:"scalar",resolve:$8e,construct:eHe,predicate:nHe,represent:rHe,defaultStyle:"lowercase"})});var gR=_((zxt,RW)=>{"use strict";var iHe=Kg();RW.exports=new iHe({include:[jD()],implicit:[PW(),xW(),kW(),TW()]})});var dR=_((Xxt,NW)=>{"use strict";var sHe=Kg();NW.exports=new sHe({include:[gR()]})});var UW=_((Zxt,OW)=>{"use strict";var oHe=os(),LW=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),MW=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function aHe(t){return t===null?!1:LW.exec(t)!==null||MW.exec(t)!==null}function lHe(t){var e,r,o,a,n,u,A,p=0,h=null,E,I,v;if(e=LW.exec(t),e===null&&(e=MW.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],o=+e[2]-1,a=+e[3],!e[4])return new Date(Date.UTC(r,o,a));if(n=+e[4],u=+e[5],A=+e[6],e[7]){for(p=e[7].slice(0,3);p.length<3;)p+="0";p=+p}return e[9]&&(E=+e[10],I=+(e[11]||0),h=(E*60+I)*6e4,e[9]==="-"&&(h=-h)),v=new Date(Date.UTC(r,o,a,n,u,A,p)),h&&v.setTime(v.getTime()-h),v}function cHe(t){return t.toISOString()}OW.exports=new oHe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:aHe,construct:lHe,instanceOf:Date,represent:cHe})});var HW=_(($xt,_W)=>{"use strict";var uHe=os();function AHe(t){return t==="<<"||t===null}_W.exports=new uHe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:AHe})});var GW=_((ebt,qW)=>{"use strict";var Jg;try{jW=Be,Jg=jW("buffer").Buffer}catch{}var jW,fHe=os(),mR=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= +\r`;function pHe(t){if(t===null)return!1;var e,r,o=0,a=t.length,n=mR;for(r=0;r64)){if(e<0)return!1;o+=6}return o%8===0}function hHe(t){var e,r,o=t.replace(/[\r\n=]/g,""),a=o.length,n=mR,u=0,A=[];for(e=0;e>16&255),A.push(u>>8&255),A.push(u&255)),u=u<<6|n.indexOf(o.charAt(e));return r=a%4*6,r===0?(A.push(u>>16&255),A.push(u>>8&255),A.push(u&255)):r===18?(A.push(u>>10&255),A.push(u>>2&255)):r===12&&A.push(u>>4&255),Jg?Jg.from?Jg.from(A):new Jg(A):A}function gHe(t){var e="",r=0,o,a,n=t.length,u=mR;for(o=0;o>18&63],e+=u[r>>12&63],e+=u[r>>6&63],e+=u[r&63]),r=(r<<8)+t[o];return a=n%3,a===0?(e+=u[r>>18&63],e+=u[r>>12&63],e+=u[r>>6&63],e+=u[r&63]):a===2?(e+=u[r>>10&63],e+=u[r>>4&63],e+=u[r<<2&63],e+=u[64]):a===1&&(e+=u[r>>2&63],e+=u[r<<4&63],e+=u[64],e+=u[64]),e}function dHe(t){return Jg&&Jg.isBuffer(t)}qW.exports=new fHe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:pHe,construct:hHe,predicate:dHe,represent:gHe})});var WW=_((rbt,YW)=>{"use strict";var mHe=os(),yHe=Object.prototype.hasOwnProperty,EHe=Object.prototype.toString;function CHe(t){if(t===null)return!0;var e=[],r,o,a,n,u,A=t;for(r=0,o=A.length;r{"use strict";var IHe=os(),BHe=Object.prototype.toString;function vHe(t){if(t===null)return!0;var e,r,o,a,n,u=t;for(n=new Array(u.length),e=0,r=u.length;e{"use strict";var PHe=os(),SHe=Object.prototype.hasOwnProperty;function xHe(t){if(t===null)return!0;var e,r=t;for(e in r)if(SHe.call(r,e)&&r[e]!==null)return!1;return!0}function bHe(t){return t!==null?t:{}}JW.exports=new PHe("tag:yaml.org,2002:set",{kind:"mapping",resolve:xHe,construct:bHe})});var fy=_((sbt,XW)=>{"use strict";var kHe=Kg();XW.exports=new kHe({include:[dR()],implicit:[UW(),HW()],explicit:[GW(),WW(),KW(),zW()]})});var $W=_((obt,ZW)=>{"use strict";var QHe=os();function FHe(){return!0}function THe(){}function RHe(){return""}function NHe(t){return typeof t>"u"}ZW.exports=new QHe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:FHe,construct:THe,predicate:NHe,represent:RHe})});var tV=_((abt,eV)=>{"use strict";var LHe=os();function MHe(t){if(t===null||t.length===0)return!1;var e=t,r=/\/([gim]*)$/.exec(t),o="";return!(e[0]==="/"&&(r&&(o=r[1]),o.length>3||e[e.length-o.length-1]!=="/"))}function OHe(t){var e=t,r=/\/([gim]*)$/.exec(t),o="";return e[0]==="/"&&(r&&(o=r[1]),e=e.slice(1,e.length-o.length-1)),new RegExp(e,o)}function UHe(t){var e="/"+t.source+"/";return t.global&&(e+="g"),t.multiline&&(e+="m"),t.ignoreCase&&(e+="i"),e}function _He(t){return Object.prototype.toString.call(t)==="[object RegExp]"}eV.exports=new LHe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:MHe,construct:OHe,predicate:_He,represent:UHe})});var iV=_((lbt,nV)=>{"use strict";var qD;try{rV=Be,qD=rV("esprima")}catch{typeof window<"u"&&(qD=window.esprima)}var rV,HHe=os();function jHe(t){if(t===null)return!1;try{var e="("+t+")",r=qD.parse(e,{range:!0});return!(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")}catch{return!1}}function qHe(t){var e="("+t+")",r=qD.parse(e,{range:!0}),o=[],a;if(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return r.body[0].expression.params.forEach(function(n){o.push(n.name)}),a=r.body[0].expression.body.range,r.body[0].expression.body.type==="BlockStatement"?new Function(o,e.slice(a[0]+1,a[1]-1)):new Function(o,"return "+e.slice(a[0],a[1]))}function GHe(t){return t.toString()}function YHe(t){return Object.prototype.toString.call(t)==="[object Function]"}nV.exports=new HHe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:jHe,construct:qHe,predicate:YHe,represent:GHe})});var zw=_((ubt,oV)=>{"use strict";var sV=Kg();oV.exports=sV.DEFAULT=new sV({include:[fy()],explicit:[$W(),tV(),iV()]})});var DV=_((Abt,Xw)=>{"use strict";var mf=Vg(),pV=uy(),WHe=pW(),hV=fy(),VHe=zw(),Gp=Object.prototype.hasOwnProperty,GD=1,gV=2,dV=3,YD=4,yR=1,KHe=2,aV=3,JHe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,zHe=/[\x85\u2028\u2029]/,XHe=/[,\[\]\{\}]/,mV=/^(?:!|!!|![a-z\-]+!)$/i,yV=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function lV(t){return Object.prototype.toString.call(t)}function Hu(t){return t===10||t===13}function Xg(t){return t===9||t===32}function Ia(t){return t===9||t===32||t===10||t===13}function py(t){return t===44||t===91||t===93||t===123||t===125}function ZHe(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-97+10:-1)}function $He(t){return t===120?2:t===117?4:t===85?8:0}function e6e(t){return 48<=t&&t<=57?t-48:-1}function cV(t){return t===48?"\0":t===97?"\x07":t===98?"\b":t===116||t===9?" ":t===110?` +`:t===118?"\v":t===102?"\f":t===114?"\r":t===101?"\x1B":t===32?" ":t===34?'"':t===47?"/":t===92?"\\":t===78?"\x85":t===95?"\xA0":t===76?"\u2028":t===80?"\u2029":""}function t6e(t){return t<=65535?String.fromCharCode(t):String.fromCharCode((t-65536>>10)+55296,(t-65536&1023)+56320)}var EV=new Array(256),CV=new Array(256);for(zg=0;zg<256;zg++)EV[zg]=cV(zg)?1:0,CV[zg]=cV(zg);var zg;function r6e(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||VHe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function wV(t,e){return new pV(e,new WHe(t.filename,t.input,t.position,t.line,t.position-t.lineStart))}function Sr(t,e){throw wV(t,e)}function WD(t,e){t.onWarning&&t.onWarning.call(null,wV(t,e))}var uV={YAML:function(e,r,o){var a,n,u;e.version!==null&&Sr(e,"duplication of %YAML directive"),o.length!==1&&Sr(e,"YAML directive accepts exactly one argument"),a=/^([0-9]+)\.([0-9]+)$/.exec(o[0]),a===null&&Sr(e,"ill-formed argument of the YAML directive"),n=parseInt(a[1],10),u=parseInt(a[2],10),n!==1&&Sr(e,"unacceptable YAML version of the document"),e.version=o[0],e.checkLineBreaks=u<2,u!==1&&u!==2&&WD(e,"unsupported YAML version of the document")},TAG:function(e,r,o){var a,n;o.length!==2&&Sr(e,"TAG directive accepts exactly two arguments"),a=o[0],n=o[1],mV.test(a)||Sr(e,"ill-formed tag handle (first argument) of the TAG directive"),Gp.call(e.tagMap,a)&&Sr(e,'there is a previously declared suffix for "'+a+'" tag handle'),yV.test(n)||Sr(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[a]=n}};function qp(t,e,r,o){var a,n,u,A;if(e1&&(t.result+=mf.repeat(` +`,e-1))}function n6e(t,e,r){var o,a,n,u,A,p,h,E,I=t.kind,v=t.result,b;if(b=t.input.charCodeAt(t.position),Ia(b)||py(b)||b===35||b===38||b===42||b===33||b===124||b===62||b===39||b===34||b===37||b===64||b===96||(b===63||b===45)&&(a=t.input.charCodeAt(t.position+1),Ia(a)||r&&py(a)))return!1;for(t.kind="scalar",t.result="",n=u=t.position,A=!1;b!==0;){if(b===58){if(a=t.input.charCodeAt(t.position+1),Ia(a)||r&&py(a))break}else if(b===35){if(o=t.input.charCodeAt(t.position-1),Ia(o))break}else{if(t.position===t.lineStart&&VD(t)||r&&py(b))break;if(Hu(b))if(p=t.line,h=t.lineStart,E=t.lineIndent,Wi(t,!1,-1),t.lineIndent>=e){A=!0,b=t.input.charCodeAt(t.position);continue}else{t.position=u,t.line=p,t.lineStart=h,t.lineIndent=E;break}}A&&(qp(t,n,u,!1),CR(t,t.line-p),n=u=t.position,A=!1),Xg(b)||(u=t.position+1),b=t.input.charCodeAt(++t.position)}return qp(t,n,u,!1),t.result?!0:(t.kind=I,t.result=v,!1)}function i6e(t,e){var r,o,a;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,o=a=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(qp(t,o,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)o=t.position,t.position++,a=t.position;else return!0;else Hu(r)?(qp(t,o,a,!0),CR(t,Wi(t,!1,e)),o=a=t.position):t.position===t.lineStart&&VD(t)?Sr(t,"unexpected end of the document within a single quoted scalar"):(t.position++,a=t.position);Sr(t,"unexpected end of the stream within a single quoted scalar")}function s6e(t,e){var r,o,a,n,u,A;if(A=t.input.charCodeAt(t.position),A!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=o=t.position;(A=t.input.charCodeAt(t.position))!==0;){if(A===34)return qp(t,r,t.position,!0),t.position++,!0;if(A===92){if(qp(t,r,t.position,!0),A=t.input.charCodeAt(++t.position),Hu(A))Wi(t,!1,e);else if(A<256&&EV[A])t.result+=CV[A],t.position++;else if((u=$He(A))>0){for(a=u,n=0;a>0;a--)A=t.input.charCodeAt(++t.position),(u=ZHe(A))>=0?n=(n<<4)+u:Sr(t,"expected hexadecimal character");t.result+=t6e(n),t.position++}else Sr(t,"unknown escape sequence");r=o=t.position}else Hu(A)?(qp(t,r,o,!0),CR(t,Wi(t,!1,e)),r=o=t.position):t.position===t.lineStart&&VD(t)?Sr(t,"unexpected end of the document within a double quoted scalar"):(t.position++,o=t.position)}Sr(t,"unexpected end of the stream within a double quoted scalar")}function o6e(t,e){var r=!0,o,a=t.tag,n,u=t.anchor,A,p,h,E,I,v={},b,C,T,L;if(L=t.input.charCodeAt(t.position),L===91)p=93,I=!1,n=[];else if(L===123)p=125,I=!0,n={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=n),L=t.input.charCodeAt(++t.position);L!==0;){if(Wi(t,!0,e),L=t.input.charCodeAt(t.position),L===p)return t.position++,t.tag=a,t.anchor=u,t.kind=I?"mapping":"sequence",t.result=n,!0;r||Sr(t,"missed comma between flow collection entries"),C=b=T=null,h=E=!1,L===63&&(A=t.input.charCodeAt(t.position+1),Ia(A)&&(h=E=!0,t.position++,Wi(t,!0,e))),o=t.line,gy(t,e,GD,!1,!0),C=t.tag,b=t.result,Wi(t,!0,e),L=t.input.charCodeAt(t.position),(E||t.line===o)&&L===58&&(h=!0,L=t.input.charCodeAt(++t.position),Wi(t,!0,e),gy(t,e,GD,!1,!0),T=t.result),I?hy(t,n,v,C,b,T):h?n.push(hy(t,null,v,C,b,T)):n.push(b),Wi(t,!0,e),L=t.input.charCodeAt(t.position),L===44?(r=!0,L=t.input.charCodeAt(++t.position)):r=!1}Sr(t,"unexpected end of the stream within a flow collection")}function a6e(t,e){var r,o,a=yR,n=!1,u=!1,A=e,p=0,h=!1,E,I;if(I=t.input.charCodeAt(t.position),I===124)o=!1;else if(I===62)o=!0;else return!1;for(t.kind="scalar",t.result="";I!==0;)if(I=t.input.charCodeAt(++t.position),I===43||I===45)yR===a?a=I===43?aV:KHe:Sr(t,"repeat of a chomping mode identifier");else if((E=e6e(I))>=0)E===0?Sr(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):u?Sr(t,"repeat of an indentation width identifier"):(A=e+E-1,u=!0);else break;if(Xg(I)){do I=t.input.charCodeAt(++t.position);while(Xg(I));if(I===35)do I=t.input.charCodeAt(++t.position);while(!Hu(I)&&I!==0)}for(;I!==0;){for(ER(t),t.lineIndent=0,I=t.input.charCodeAt(t.position);(!u||t.lineIndentA&&(A=t.lineIndent),Hu(I)){p++;continue}if(t.lineIndente)&&p!==0)Sr(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(gy(t,e,YD,!0,a)&&(C?v=t.result:b=t.result),C||(hy(t,h,E,I,v,b,n,u),I=v=b=null),Wi(t,!0,-1),L=t.input.charCodeAt(t.position)),t.lineIndent>e&&L!==0)Sr(t,"bad indentation of a mapping entry");else if(t.lineIndente?p=1:t.lineIndent===e?p=0:t.lineIndente?p=1:t.lineIndent===e?p=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),I=0,v=t.implicitTypes.length;I tag; it should be "'+b.kind+'", not "'+t.kind+'"'),b.resolve(t.result)?(t.result=b.construct(t.result),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):Sr(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")):Sr(t,"unknown tag !<"+t.tag+">");return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||E}function f6e(t){var e=t.position,r,o,a,n=!1,u;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap={},t.anchorMap={};(u=t.input.charCodeAt(t.position))!==0&&(Wi(t,!0,-1),u=t.input.charCodeAt(t.position),!(t.lineIndent>0||u!==37));){for(n=!0,u=t.input.charCodeAt(++t.position),r=t.position;u!==0&&!Ia(u);)u=t.input.charCodeAt(++t.position);for(o=t.input.slice(r,t.position),a=[],o.length<1&&Sr(t,"directive name must not be less than one character in length");u!==0;){for(;Xg(u);)u=t.input.charCodeAt(++t.position);if(u===35){do u=t.input.charCodeAt(++t.position);while(u!==0&&!Hu(u));break}if(Hu(u))break;for(r=t.position;u!==0&&!Ia(u);)u=t.input.charCodeAt(++t.position);a.push(t.input.slice(r,t.position))}u!==0&&ER(t),Gp.call(uV,o)?uV[o](t,o,a):WD(t,'unknown document directive "'+o+'"')}if(Wi(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,Wi(t,!0,-1)):n&&Sr(t,"directives end mark is expected"),gy(t,t.lineIndent-1,YD,!1,!0),Wi(t,!0,-1),t.checkLineBreaks&&zHe.test(t.input.slice(e,t.position))&&WD(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&VD(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,Wi(t,!0,-1));return}if(t.position"u"&&(r=e,e=null);var o=IV(t,r);if(typeof e!="function")return o;for(var a=0,n=o.length;a"u"&&(r=e,e=null),BV(t,e,mf.extend({schema:hV},r))}function h6e(t,e){return vV(t,mf.extend({schema:hV},e))}Xw.exports.loadAll=BV;Xw.exports.load=vV;Xw.exports.safeLoadAll=p6e;Xw.exports.safeLoad=h6e});var KV=_((fbt,vR)=>{"use strict";var $w=Vg(),eI=uy(),g6e=zw(),d6e=fy(),TV=Object.prototype.toString,RV=Object.prototype.hasOwnProperty,m6e=9,Zw=10,y6e=13,E6e=32,C6e=33,w6e=34,NV=35,I6e=37,B6e=38,v6e=39,D6e=42,LV=44,P6e=45,MV=58,S6e=61,x6e=62,b6e=63,k6e=64,OV=91,UV=93,Q6e=96,_V=123,F6e=124,HV=125,vo={};vo[0]="\\0";vo[7]="\\a";vo[8]="\\b";vo[9]="\\t";vo[10]="\\n";vo[11]="\\v";vo[12]="\\f";vo[13]="\\r";vo[27]="\\e";vo[34]='\\"';vo[92]="\\\\";vo[133]="\\N";vo[160]="\\_";vo[8232]="\\L";vo[8233]="\\P";var T6e=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function R6e(t,e){var r,o,a,n,u,A,p;if(e===null)return{};for(r={},o=Object.keys(e),a=0,n=o.length;a0?t.charCodeAt(n-1):null,v=v&&xV(u,A)}else{for(n=0;no&&t[I+1]!==" ",I=n);else if(!dy(u))return KD;A=n>0?t.charCodeAt(n-1):null,v=v&&xV(u,A)}h=h||E&&n-I-1>o&&t[I+1]!==" "}return!p&&!h?v&&!a(t)?qV:GV:r>9&&jV(t)?KD:h?WV:YV}function _6e(t,e,r,o){t.dump=function(){if(e.length===0)return"''";if(!t.noCompatMode&&T6e.indexOf(e)!==-1)return"'"+e+"'";var a=t.indent*Math.max(1,r),n=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-a),u=o||t.flowLevel>-1&&r>=t.flowLevel;function A(p){return L6e(t,p)}switch(U6e(e,u,t.indent,n,A)){case qV:return e;case GV:return"'"+e.replace(/'/g,"''")+"'";case YV:return"|"+bV(e,t.indent)+kV(SV(e,a));case WV:return">"+bV(e,t.indent)+kV(SV(H6e(e,n),a));case KD:return'"'+j6e(e,n)+'"';default:throw new eI("impossible error: invalid scalar style")}}()}function bV(t,e){var r=jV(t)?String(e):"",o=t[t.length-1]===` +`,a=o&&(t[t.length-2]===` +`||t===` +`),n=a?"+":o?"":"-";return r+n+` +`}function kV(t){return t[t.length-1]===` +`?t.slice(0,-1):t}function H6e(t,e){for(var r=/(\n+)([^\n]*)/g,o=function(){var h=t.indexOf(` +`);return h=h!==-1?h:t.length,r.lastIndex=h,QV(t.slice(0,h),e)}(),a=t[0]===` +`||t[0]===" ",n,u;u=r.exec(t);){var A=u[1],p=u[2];n=p[0]===" ",o+=A+(!a&&!n&&p!==""?` +`:"")+QV(p,e),a=n}return o}function QV(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,o,a=0,n,u=0,A=0,p="";o=r.exec(t);)A=o.index,A-a>e&&(n=u>a?u:A,p+=` +`+t.slice(a,n),a=n+1),u=A;return p+=` +`,t.length-a>e&&u>a?p+=t.slice(a,u)+` +`+t.slice(u+1):p+=t.slice(a),p.slice(1)}function j6e(t){for(var e="",r,o,a,n=0;n=55296&&r<=56319&&(o=t.charCodeAt(n+1),o>=56320&&o<=57343)){e+=PV((r-55296)*1024+o-56320+65536),n++;continue}a=vo[r],e+=!a&&dy(r)?t[n]:a||PV(r)}return e}function q6e(t,e,r){var o="",a=t.tag,n,u;for(n=0,u=r.length;n1024&&(E+="? "),E+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),Zg(t,e,h,!1,!1)&&(E+=t.dump,o+=E));t.tag=a,t.dump="{"+o+"}"}function W6e(t,e,r,o){var a="",n=t.tag,u=Object.keys(r),A,p,h,E,I,v;if(t.sortKeys===!0)u.sort();else if(typeof t.sortKeys=="function")u.sort(t.sortKeys);else if(t.sortKeys)throw new eI("sortKeys must be a boolean or a function");for(A=0,p=u.length;A1024,I&&(t.dump&&Zw===t.dump.charCodeAt(0)?v+="?":v+="? "),v+=t.dump,I&&(v+=wR(t,e)),Zg(t,e+1,E,!0,I)&&(t.dump&&Zw===t.dump.charCodeAt(0)?v+=":":v+=": ",v+=t.dump,a+=v));t.tag=n,t.dump=a||"{}"}function FV(t,e,r){var o,a,n,u,A,p;for(a=r?t.explicitTypes:t.implicitTypes,n=0,u=a.length;n tag resolver accepts not "'+p+'" style');t.dump=o}return!0}return!1}function Zg(t,e,r,o,a,n){t.tag=null,t.dump=r,FV(t,r,!1)||FV(t,r,!0);var u=TV.call(t.dump);o&&(o=t.flowLevel<0||t.flowLevel>e);var A=u==="[object Object]"||u==="[object Array]",p,h;if(A&&(p=t.duplicates.indexOf(r),h=p!==-1),(t.tag!==null&&t.tag!=="?"||h||t.indent!==2&&e>0)&&(a=!1),h&&t.usedDuplicates[p])t.dump="*ref_"+p;else{if(A&&h&&!t.usedDuplicates[p]&&(t.usedDuplicates[p]=!0),u==="[object Object]")o&&Object.keys(t.dump).length!==0?(W6e(t,e,t.dump,a),h&&(t.dump="&ref_"+p+t.dump)):(Y6e(t,e,t.dump),h&&(t.dump="&ref_"+p+" "+t.dump));else if(u==="[object Array]"){var E=t.noArrayIndent&&e>0?e-1:e;o&&t.dump.length!==0?(G6e(t,E,t.dump,a),h&&(t.dump="&ref_"+p+t.dump)):(q6e(t,E,t.dump),h&&(t.dump="&ref_"+p+" "+t.dump))}else if(u==="[object String]")t.tag!=="?"&&_6e(t,t.dump,e,n);else{if(t.skipInvalid)return!1;throw new eI("unacceptable kind of an object to dump "+u)}t.tag!==null&&t.tag!=="?"&&(t.dump="!<"+t.tag+"> "+t.dump)}return!0}function V6e(t,e){var r=[],o=[],a,n;for(IR(t,r,o),a=0,n=o.length;a{"use strict";var JD=DV(),JV=KV();function zD(t){return function(){throw new Error("Function "+t+" is deprecated and cannot be used.")}}ki.exports.Type=os();ki.exports.Schema=Kg();ki.exports.FAILSAFE_SCHEMA=jD();ki.exports.JSON_SCHEMA=gR();ki.exports.CORE_SCHEMA=dR();ki.exports.DEFAULT_SAFE_SCHEMA=fy();ki.exports.DEFAULT_FULL_SCHEMA=zw();ki.exports.load=JD.load;ki.exports.loadAll=JD.loadAll;ki.exports.safeLoad=JD.safeLoad;ki.exports.safeLoadAll=JD.safeLoadAll;ki.exports.dump=JV.dump;ki.exports.safeDump=JV.safeDump;ki.exports.YAMLException=uy();ki.exports.MINIMAL_SCHEMA=jD();ki.exports.SAFE_SCHEMA=fy();ki.exports.DEFAULT_SCHEMA=zw();ki.exports.scan=zD("scan");ki.exports.parse=zD("parse");ki.exports.compose=zD("compose");ki.exports.addConstructor=zD("addConstructor")});var ZV=_((hbt,XV)=>{"use strict";var J6e=zV();XV.exports=J6e});var eK=_((gbt,$V)=>{"use strict";function z6e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function $g(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,$g)}z6e($g,Error);$g.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",I;for(I=0;I0){for(I=1,v=1;I({[ft]:Le})))},pe=function($){return $},Ae=function($){return $},ye=sa("correct indentation"),ae=" ",we=Qn(" ",!1),Pe=function($){return $.length===nr*It},g=function($){return $.length===(nr+1)*It},Ee=function(){return nr++,!0},De=function(){return nr--,!0},ce=function(){return DA()},ne=sa("pseudostring"),ee=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,Ie=hi(["\r",` +`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),ke=/^[^\r\n\t ,\][{}:#"']/,ht=hi(["\r",` +`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),H=function(){return DA().replace(/^ *| *$/g,"")},lt="--",Re=Qn("--",!1),Qe=/^[a-zA-Z\/0-9]/,be=hi([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),_e=/^[^\r\n\t :,]/,Te=hi(["\r",` +`," "," ",":",","],!0,!1),Je="null",He=Qn("null",!1),x=function(){return null},w="true",S=Qn("true",!1),y=function(){return!0},F="false",z=Qn("false",!1),X=function(){return!1},Z=sa("string"),ie='"',Se=Qn('"',!1),Ne=function(){return""},ot=function($){return $},dt=function($){return $.join("")},jt=/^[^"\\\0-\x1F\x7F]/,$t=hi(['"',"\\",["\0",""],"\x7F"],!0,!1),xt='\\"',an=Qn('\\"',!1),Qr=function(){return'"'},mr="\\\\",xr=Qn("\\\\",!1),Wr=function(){return"\\"},Vn="\\/",Ns=Qn("\\/",!1),Ri=function(){return"/"},ps="\\b",io=Qn("\\b",!1),Si=function(){return"\b"},Ls="\\f",so=Qn("\\f",!1),cc=function(){return"\f"},cu="\\n",ap=Qn("\\n",!1),lp=function(){return` +`},Ms="\\r",Dn=Qn("\\r",!1),oo=function(){return"\r"},Os="\\t",ml=Qn("\\t",!1),yl=function(){return" "},ao="\\u",Kn=Qn("\\u",!1),Mn=function($,me,Le,ft){return String.fromCharCode(parseInt(`0x${$}${me}${Le}${ft}`))},Ni=/^[0-9a-fA-F]/,On=hi([["0","9"],["a","f"],["A","F"]],!1,!1),_i=sa("blank space"),tr=/^[ \t]/,Me=hi([" "," "],!1,!1),ii=sa("white space"),Oa=/^[ \t\n\r]/,hr=hi([" "," ",` +`,"\r"],!1,!1),uc=`\r +`,uu=Qn(`\r +`,!1),Ac=` +`,El=Qn(` +`,!1),vA="\r",Au=Qn("\r",!1),Ce=0,Tt=0,fc=[{line:1,column:1}],Hi=0,fu=[],Yt=0,Cl;if("startRule"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=o[e.startRule]}function DA(){return t.substring(Tt,Ce)}function cp(){return _o(Tt,Ce)}function pc($,me){throw me=me!==void 0?me:_o(Tt,Ce),gc([sa($)],t.substring(Tt,Ce),me)}function PA($,me){throw me=me!==void 0?me:_o(Tt,Ce),lo($,me)}function Qn($,me){return{type:"literal",text:$,ignoreCase:me}}function hi($,me,Le){return{type:"class",parts:$,inverted:me,ignoreCase:Le}}function hc(){return{type:"any"}}function SA(){return{type:"end"}}function sa($){return{type:"other",description:$}}function Li($){var me=fc[$],Le;if(me)return me;for(Le=$-1;!fc[Le];)Le--;for(me=fc[Le],me={line:me.line,column:me.column};Le<$;)t.charCodeAt(Le)===10?(me.line++,me.column=1):me.column++,Le++;return fc[$]=me,me}function _o($,me){var Le=Li($),ft=Li(me);return{start:{offset:$,line:Le.line,column:Le.column},end:{offset:me,line:ft.line,column:ft.column}}}function Ze($){CeHi&&(Hi=Ce,fu=[]),fu.push($))}function lo($,me){return new $g($,null,null,me)}function gc($,me,Le){return new $g($g.buildMessage($,me),$,me,Le)}function pu(){var $;return $=xA(),$}function ji(){var $,me,Le;for($=Ce,me=[],Le=hu();Le!==r;)me.push(Le),Le=hu();return me!==r&&(Tt=$,me=n(me)),$=me,$}function hu(){var $,me,Le,ft,pt;return $=Ce,me=hs(),me!==r?(t.charCodeAt(Ce)===45?(Le=u,Ce++):(Le=r,Yt===0&&Ze(A)),Le!==r?(ft=Pn(),ft!==r?(pt=dc(),pt!==r?(Tt=$,me=p(pt),$=me):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r),$}function xA(){var $,me,Le;for($=Ce,me=[],Le=Ua();Le!==r;)me.push(Le),Le=Ua();return me!==r&&(Tt=$,me=h(me)),$=me,$}function Ua(){var $,me,Le,ft,pt,Rt,er,Zr,qi;if($=Ce,me=Pn(),me===r&&(me=null),me!==r){if(Le=Ce,t.charCodeAt(Ce)===35?(ft=E,Ce++):(ft=r,Yt===0&&Ze(I)),ft!==r){if(pt=[],Rt=Ce,er=Ce,Yt++,Zr=tt(),Yt--,Zr===r?er=void 0:(Ce=er,er=r),er!==r?(t.length>Ce?(Zr=t.charAt(Ce),Ce++):(Zr=r,Yt===0&&Ze(v)),Zr!==r?(er=[er,Zr],Rt=er):(Ce=Rt,Rt=r)):(Ce=Rt,Rt=r),Rt!==r)for(;Rt!==r;)pt.push(Rt),Rt=Ce,er=Ce,Yt++,Zr=tt(),Yt--,Zr===r?er=void 0:(Ce=er,er=r),er!==r?(t.length>Ce?(Zr=t.charAt(Ce),Ce++):(Zr=r,Yt===0&&Ze(v)),Zr!==r?(er=[er,Zr],Rt=er):(Ce=Rt,Rt=r)):(Ce=Rt,Rt=r);else pt=r;pt!==r?(ft=[ft,pt],Le=ft):(Ce=Le,Le=r)}else Ce=Le,Le=r;if(Le===r&&(Le=null),Le!==r){if(ft=[],pt=We(),pt!==r)for(;pt!==r;)ft.push(pt),pt=We();else ft=r;ft!==r?(Tt=$,me=b(),$=me):(Ce=$,$=r)}else Ce=$,$=r}else Ce=$,$=r;if($===r&&($=Ce,me=hs(),me!==r?(Le=oa(),Le!==r?(ft=Pn(),ft===r&&(ft=null),ft!==r?(t.charCodeAt(Ce)===58?(pt=C,Ce++):(pt=r,Yt===0&&Ze(T)),pt!==r?(Rt=Pn(),Rt===r&&(Rt=null),Rt!==r?(er=dc(),er!==r?(Tt=$,me=L(Le,er),$=me):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r),$===r&&($=Ce,me=hs(),me!==r?(Le=co(),Le!==r?(ft=Pn(),ft===r&&(ft=null),ft!==r?(t.charCodeAt(Ce)===58?(pt=C,Ce++):(pt=r,Yt===0&&Ze(T)),pt!==r?(Rt=Pn(),Rt===r&&(Rt=null),Rt!==r?(er=dc(),er!==r?(Tt=$,me=L(Le,er),$=me):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r),$===r))){if($=Ce,me=hs(),me!==r)if(Le=co(),Le!==r)if(ft=Pn(),ft!==r)if(pt=aa(),pt!==r){if(Rt=[],er=We(),er!==r)for(;er!==r;)Rt.push(er),er=We();else Rt=r;Rt!==r?(Tt=$,me=L(Le,pt),$=me):(Ce=$,$=r)}else Ce=$,$=r;else Ce=$,$=r;else Ce=$,$=r;else Ce=$,$=r;if($===r)if($=Ce,me=hs(),me!==r)if(Le=co(),Le!==r){if(ft=[],pt=Ce,Rt=Pn(),Rt===r&&(Rt=null),Rt!==r?(t.charCodeAt(Ce)===44?(er=U,Ce++):(er=r,Yt===0&&Ze(J)),er!==r?(Zr=Pn(),Zr===r&&(Zr=null),Zr!==r?(qi=co(),qi!==r?(Tt=pt,Rt=te(Le,qi),pt=Rt):(Ce=pt,pt=r)):(Ce=pt,pt=r)):(Ce=pt,pt=r)):(Ce=pt,pt=r),pt!==r)for(;pt!==r;)ft.push(pt),pt=Ce,Rt=Pn(),Rt===r&&(Rt=null),Rt!==r?(t.charCodeAt(Ce)===44?(er=U,Ce++):(er=r,Yt===0&&Ze(J)),er!==r?(Zr=Pn(),Zr===r&&(Zr=null),Zr!==r?(qi=co(),qi!==r?(Tt=pt,Rt=te(Le,qi),pt=Rt):(Ce=pt,pt=r)):(Ce=pt,pt=r)):(Ce=pt,pt=r)):(Ce=pt,pt=r);else ft=r;ft!==r?(pt=Pn(),pt===r&&(pt=null),pt!==r?(t.charCodeAt(Ce)===58?(Rt=C,Ce++):(Rt=r,Yt===0&&Ze(T)),Rt!==r?(er=Pn(),er===r&&(er=null),er!==r?(Zr=dc(),Zr!==r?(Tt=$,me=le(Le,ft,Zr),$=me):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)}else Ce=$,$=r;else Ce=$,$=r}return $}function dc(){var $,me,Le,ft,pt,Rt,er;if($=Ce,me=Ce,Yt++,Le=Ce,ft=tt(),ft!==r?(pt=_t(),pt!==r?(t.charCodeAt(Ce)===45?(Rt=u,Ce++):(Rt=r,Yt===0&&Ze(A)),Rt!==r?(er=Pn(),er!==r?(ft=[ft,pt,Rt,er],Le=ft):(Ce=Le,Le=r)):(Ce=Le,Le=r)):(Ce=Le,Le=r)):(Ce=Le,Le=r),Yt--,Le!==r?(Ce=me,me=void 0):me=r,me!==r?(Le=We(),Le!==r?(ft=Fn(),ft!==r?(pt=ji(),pt!==r?(Rt=Ci(),Rt!==r?(Tt=$,me=pe(pt),$=me):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r),$===r&&($=Ce,me=tt(),me!==r?(Le=Fn(),Le!==r?(ft=xA(),ft!==r?(pt=Ci(),pt!==r?(Tt=$,me=pe(ft),$=me):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r),$===r))if($=Ce,me=Us(),me!==r){if(Le=[],ft=We(),ft!==r)for(;ft!==r;)Le.push(ft),ft=We();else Le=r;Le!==r?(Tt=$,me=Ae(me),$=me):(Ce=$,$=r)}else Ce=$,$=r;return $}function hs(){var $,me,Le;for(Yt++,$=Ce,me=[],t.charCodeAt(Ce)===32?(Le=ae,Ce++):(Le=r,Yt===0&&Ze(we));Le!==r;)me.push(Le),t.charCodeAt(Ce)===32?(Le=ae,Ce++):(Le=r,Yt===0&&Ze(we));return me!==r?(Tt=Ce,Le=Pe(me),Le?Le=void 0:Le=r,Le!==r?(me=[me,Le],$=me):(Ce=$,$=r)):(Ce=$,$=r),Yt--,$===r&&(me=r,Yt===0&&Ze(ye)),$}function _t(){var $,me,Le;for($=Ce,me=[],t.charCodeAt(Ce)===32?(Le=ae,Ce++):(Le=r,Yt===0&&Ze(we));Le!==r;)me.push(Le),t.charCodeAt(Ce)===32?(Le=ae,Ce++):(Le=r,Yt===0&&Ze(we));return me!==r?(Tt=Ce,Le=g(me),Le?Le=void 0:Le=r,Le!==r?(me=[me,Le],$=me):(Ce=$,$=r)):(Ce=$,$=r),$}function Fn(){var $;return Tt=Ce,$=Ee(),$?$=void 0:$=r,$}function Ci(){var $;return Tt=Ce,$=De(),$?$=void 0:$=r,$}function oa(){var $;return $=ds(),$===r&&($=la()),$}function co(){var $,me,Le;if($=ds(),$===r){if($=Ce,me=[],Le=Ho(),Le!==r)for(;Le!==r;)me.push(Le),Le=Ho();else me=r;me!==r&&(Tt=$,me=ce()),$=me}return $}function Us(){var $;return $=wi(),$===r&&($=gs(),$===r&&($=ds(),$===r&&($=la()))),$}function aa(){var $;return $=wi(),$===r&&($=ds(),$===r&&($=Ho())),$}function la(){var $,me,Le,ft,pt,Rt;if(Yt++,$=Ce,ee.test(t.charAt(Ce))?(me=t.charAt(Ce),Ce++):(me=r,Yt===0&&Ze(Ie)),me!==r){for(Le=[],ft=Ce,pt=Pn(),pt===r&&(pt=null),pt!==r?(ke.test(t.charAt(Ce))?(Rt=t.charAt(Ce),Ce++):(Rt=r,Yt===0&&Ze(ht)),Rt!==r?(pt=[pt,Rt],ft=pt):(Ce=ft,ft=r)):(Ce=ft,ft=r);ft!==r;)Le.push(ft),ft=Ce,pt=Pn(),pt===r&&(pt=null),pt!==r?(ke.test(t.charAt(Ce))?(Rt=t.charAt(Ce),Ce++):(Rt=r,Yt===0&&Ze(ht)),Rt!==r?(pt=[pt,Rt],ft=pt):(Ce=ft,ft=r)):(Ce=ft,ft=r);Le!==r?(Tt=$,me=H(),$=me):(Ce=$,$=r)}else Ce=$,$=r;return Yt--,$===r&&(me=r,Yt===0&&Ze(ne)),$}function Ho(){var $,me,Le,ft,pt;if($=Ce,t.substr(Ce,2)===lt?(me=lt,Ce+=2):(me=r,Yt===0&&Ze(Re)),me===r&&(me=null),me!==r)if(Qe.test(t.charAt(Ce))?(Le=t.charAt(Ce),Ce++):(Le=r,Yt===0&&Ze(be)),Le!==r){for(ft=[],_e.test(t.charAt(Ce))?(pt=t.charAt(Ce),Ce++):(pt=r,Yt===0&&Ze(Te));pt!==r;)ft.push(pt),_e.test(t.charAt(Ce))?(pt=t.charAt(Ce),Ce++):(pt=r,Yt===0&&Ze(Te));ft!==r?(Tt=$,me=H(),$=me):(Ce=$,$=r)}else Ce=$,$=r;else Ce=$,$=r;return $}function wi(){var $,me;return $=Ce,t.substr(Ce,4)===Je?(me=Je,Ce+=4):(me=r,Yt===0&&Ze(He)),me!==r&&(Tt=$,me=x()),$=me,$}function gs(){var $,me;return $=Ce,t.substr(Ce,4)===w?(me=w,Ce+=4):(me=r,Yt===0&&Ze(S)),me!==r&&(Tt=$,me=y()),$=me,$===r&&($=Ce,t.substr(Ce,5)===F?(me=F,Ce+=5):(me=r,Yt===0&&Ze(z)),me!==r&&(Tt=$,me=X()),$=me),$}function ds(){var $,me,Le,ft;return Yt++,$=Ce,t.charCodeAt(Ce)===34?(me=ie,Ce++):(me=r,Yt===0&&Ze(Se)),me!==r?(t.charCodeAt(Ce)===34?(Le=ie,Ce++):(Le=r,Yt===0&&Ze(Se)),Le!==r?(Tt=$,me=Ne(),$=me):(Ce=$,$=r)):(Ce=$,$=r),$===r&&($=Ce,t.charCodeAt(Ce)===34?(me=ie,Ce++):(me=r,Yt===0&&Ze(Se)),me!==r?(Le=ms(),Le!==r?(t.charCodeAt(Ce)===34?(ft=ie,Ce++):(ft=r,Yt===0&&Ze(Se)),ft!==r?(Tt=$,me=ot(Le),$=me):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)),Yt--,$===r&&(me=r,Yt===0&&Ze(Z)),$}function ms(){var $,me,Le;if($=Ce,me=[],Le=_s(),Le!==r)for(;Le!==r;)me.push(Le),Le=_s();else me=r;return me!==r&&(Tt=$,me=dt(me)),$=me,$}function _s(){var $,me,Le,ft,pt,Rt;return jt.test(t.charAt(Ce))?($=t.charAt(Ce),Ce++):($=r,Yt===0&&Ze($t)),$===r&&($=Ce,t.substr(Ce,2)===xt?(me=xt,Ce+=2):(me=r,Yt===0&&Ze(an)),me!==r&&(Tt=$,me=Qr()),$=me,$===r&&($=Ce,t.substr(Ce,2)===mr?(me=mr,Ce+=2):(me=r,Yt===0&&Ze(xr)),me!==r&&(Tt=$,me=Wr()),$=me,$===r&&($=Ce,t.substr(Ce,2)===Vn?(me=Vn,Ce+=2):(me=r,Yt===0&&Ze(Ns)),me!==r&&(Tt=$,me=Ri()),$=me,$===r&&($=Ce,t.substr(Ce,2)===ps?(me=ps,Ce+=2):(me=r,Yt===0&&Ze(io)),me!==r&&(Tt=$,me=Si()),$=me,$===r&&($=Ce,t.substr(Ce,2)===Ls?(me=Ls,Ce+=2):(me=r,Yt===0&&Ze(so)),me!==r&&(Tt=$,me=cc()),$=me,$===r&&($=Ce,t.substr(Ce,2)===cu?(me=cu,Ce+=2):(me=r,Yt===0&&Ze(ap)),me!==r&&(Tt=$,me=lp()),$=me,$===r&&($=Ce,t.substr(Ce,2)===Ms?(me=Ms,Ce+=2):(me=r,Yt===0&&Ze(Dn)),me!==r&&(Tt=$,me=oo()),$=me,$===r&&($=Ce,t.substr(Ce,2)===Os?(me=Os,Ce+=2):(me=r,Yt===0&&Ze(ml)),me!==r&&(Tt=$,me=yl()),$=me,$===r&&($=Ce,t.substr(Ce,2)===ao?(me=ao,Ce+=2):(me=r,Yt===0&&Ze(Kn)),me!==r?(Le=Un(),Le!==r?(ft=Un(),ft!==r?(pt=Un(),pt!==r?(Rt=Un(),Rt!==r?(Tt=$,me=Mn(Le,ft,pt,Rt),$=me):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)))))))))),$}function Un(){var $;return Ni.test(t.charAt(Ce))?($=t.charAt(Ce),Ce++):($=r,Yt===0&&Ze(On)),$}function Pn(){var $,me;if(Yt++,$=[],tr.test(t.charAt(Ce))?(me=t.charAt(Ce),Ce++):(me=r,Yt===0&&Ze(Me)),me!==r)for(;me!==r;)$.push(me),tr.test(t.charAt(Ce))?(me=t.charAt(Ce),Ce++):(me=r,Yt===0&&Ze(Me));else $=r;return Yt--,$===r&&(me=r,Yt===0&&Ze(_i)),$}function ys(){var $,me;if(Yt++,$=[],Oa.test(t.charAt(Ce))?(me=t.charAt(Ce),Ce++):(me=r,Yt===0&&Ze(hr)),me!==r)for(;me!==r;)$.push(me),Oa.test(t.charAt(Ce))?(me=t.charAt(Ce),Ce++):(me=r,Yt===0&&Ze(hr));else $=r;return Yt--,$===r&&(me=r,Yt===0&&Ze(ii)),$}function We(){var $,me,Le,ft,pt,Rt;if($=Ce,me=tt(),me!==r){for(Le=[],ft=Ce,pt=Pn(),pt===r&&(pt=null),pt!==r?(Rt=tt(),Rt!==r?(pt=[pt,Rt],ft=pt):(Ce=ft,ft=r)):(Ce=ft,ft=r);ft!==r;)Le.push(ft),ft=Ce,pt=Pn(),pt===r&&(pt=null),pt!==r?(Rt=tt(),Rt!==r?(pt=[pt,Rt],ft=pt):(Ce=ft,ft=r)):(Ce=ft,ft=r);Le!==r?(me=[me,Le],$=me):(Ce=$,$=r)}else Ce=$,$=r;return $}function tt(){var $;return t.substr(Ce,2)===uc?($=uc,Ce+=2):($=r,Yt===0&&Ze(uu)),$===r&&(t.charCodeAt(Ce)===10?($=Ac,Ce++):($=r,Yt===0&&Ze(El)),$===r&&(t.charCodeAt(Ce)===13?($=vA,Ce++):($=r,Yt===0&&Ze(Au)))),$}let It=2,nr=0;if(Cl=a(),Cl!==r&&Ce===t.length)return Cl;throw Cl!==r&&Ce"u"?!0:typeof t=="object"&&t!==null&&!Array.isArray(t)?Object.keys(t).every(e=>iK(t[e])):!1}function DR(t,e,r){if(t===null)return`null +`;if(typeof t=="number"||typeof t=="boolean")return`${t.toString()} +`;if(typeof t=="string")return`${rK(t)} +`;if(Array.isArray(t)){if(t.length===0)return`[] +`;let o=" ".repeat(e);return` +${t.map(n=>`${o}- ${DR(n,e+1,!1)}`).join("")}`}if(typeof t=="object"&&t){let[o,a]=t instanceof XD?[t.data,!1]:[t,!0],n=" ".repeat(e),u=Object.keys(o);a&&u.sort((p,h)=>{let E=tK.indexOf(p),I=tK.indexOf(h);return E===-1&&I===-1?ph?1:0:E!==-1&&I===-1?-1:E===-1&&I!==-1?1:E-I});let A=u.filter(p=>!iK(o[p])).map((p,h)=>{let E=o[p],I=rK(p),v=DR(E,e+1,!0),b=h>0||r?n:"",C=I.length>1024?`? ${I} +${b}:`:`${I}:`,T=v.startsWith(` +`)?v:` ${v}`;return`${b}${C}${T}`}).join(e===0?` +`:"")||` +`;return r?` +${A}`:`${A}`}throw new Error(`Unsupported value type (${t})`)}function Ba(t){try{let e=DR(t,0,!1);return e!==` +`?e:""}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}function $6e(t){return t.endsWith(` +`)||(t+=` +`),(0,nK.parse)(t)}function tje(t){if(eje.test(t))return $6e(t);let e=(0,ZD.safeLoad)(t,{schema:ZD.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!="object")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return e}function Vi(t){return tje(t)}var ZD,nK,Z6e,tK,XD,eje,sK=Et(()=>{ZD=$e(ZV()),nK=$e(eK()),Z6e=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,tK=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"],XD=class{constructor(e){this.data=e}};Ba.PreserveOrdering=XD;eje=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i});var tI={};Kt(tI,{parseResolution:()=>UD,parseShell:()=>LD,parseSyml:()=>Vi,stringifyArgument:()=>AR,stringifyArgumentSegment:()=>fR,stringifyArithmeticExpression:()=>OD,stringifyCommand:()=>uR,stringifyCommandChain:()=>cy,stringifyCommandChainThen:()=>cR,stringifyCommandLine:()=>MD,stringifyCommandLineThen:()=>lR,stringifyEnvSegment:()=>ND,stringifyRedirectArgument:()=>Kw,stringifyResolution:()=>_D,stringifyShell:()=>ly,stringifyShellLine:()=>ly,stringifySyml:()=>Ba,stringifyValueArgument:()=>Gg});var Nl=Et(()=>{iW();lW();sK()});var aK=_((Cbt,PR)=>{"use strict";var rje=t=>{let e=!1,r=!1,o=!1;for(let a=0;a{if(!(typeof t=="string"||Array.isArray(t)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let r=a=>e.pascalCase?a.charAt(0).toUpperCase()+a.slice(1):a;return Array.isArray(t)?t=t.map(a=>a.trim()).filter(a=>a.length).join("-"):t=t.trim(),t.length===0?"":t.length===1?e.pascalCase?t.toUpperCase():t.toLowerCase():(t!==t.toLowerCase()&&(t=rje(t)),t=t.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(a,n)=>n.toUpperCase()).replace(/\d+(\w|$)/g,a=>a.toUpperCase()),r(t))};PR.exports=oK;PR.exports.default=oK});var lK=_((wbt,nje)=>{nje.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vercel",constant:"VERCEL",env:"NOW_BUILDER"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"}]});var ed=_(Xa=>{"use strict";var uK=lK(),ju=process.env;Object.defineProperty(Xa,"_vendors",{value:uK.map(function(t){return t.constant})});Xa.name=null;Xa.isPR=null;uK.forEach(function(t){let r=(Array.isArray(t.env)?t.env:[t.env]).every(function(o){return cK(o)});if(Xa[t.constant]=r,r)switch(Xa.name=t.name,typeof t.pr){case"string":Xa.isPR=!!ju[t.pr];break;case"object":"env"in t.pr?Xa.isPR=t.pr.env in ju&&ju[t.pr.env]!==t.pr.ne:"any"in t.pr?Xa.isPR=t.pr.any.some(function(o){return!!ju[o]}):Xa.isPR=cK(t.pr);break;default:Xa.isPR=null}});Xa.isCI=!!(ju.CI||ju.CONTINUOUS_INTEGRATION||ju.BUILD_NUMBER||ju.RUN_ID||Xa.name);function cK(t){return typeof t=="string"?!!ju[t]:Object.keys(t).every(function(e){return ju[e]===t[e]})}});var Hn,cn,td,SR,$D,AK,xR,bR,eP=Et(()=>{(function(t){t.StartOfInput="\0",t.EndOfInput="",t.EndOfPartialInput=""})(Hn||(Hn={}));(function(t){t[t.InitialNode=0]="InitialNode",t[t.SuccessNode=1]="SuccessNode",t[t.ErrorNode=2]="ErrorNode",t[t.CustomNode=3]="CustomNode"})(cn||(cn={}));td=-1,SR=/^(-h|--help)(?:=([0-9]+))?$/,$D=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,AK=/^-[a-zA-Z]{2,}$/,xR=/^([^=]+)=([\s\S]*)$/,bR=process.env.DEBUG_CLI==="1"});var it,my,tP,kR,rP=Et(()=>{eP();it=class extends Error{constructor(e){super(e),this.clipanion={type:"usage"},this.name="UsageError"}},my=class extends Error{constructor(e,r){if(super(),this.input=e,this.candidates=r,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(o=>o.reason!==null&&o.reason===r[0].reason)){let[{reason:o}]=this.candidates;this.message=`${o} + +${this.candidates.map(({usage:a})=>`$ ${a}`).join(` +`)}`}else if(this.candidates.length===1){let[{usage:o}]=this.candidates;this.message=`Command not found; did you mean: + +$ ${o} +${kR(e)}`}else this.message=`Command not found; did you mean one of: + +${this.candidates.map(({usage:o},a)=>`${`${a}.`.padStart(4)} ${o}`).join(` +`)} + +${kR(e)}`}},tP=class extends Error{constructor(e,r){super(),this.input=e,this.usages=r,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives: + +${this.usages.map((o,a)=>`${`${a}.`.padStart(4)} ${o}`).join(` +`)} + +${kR(e)}`}},kR=t=>`While running ${t.filter(e=>e!==Hn.EndOfInput&&e!==Hn.EndOfPartialInput).map(e=>{let r=JSON.stringify(e);return e.match(/\s/)||e.length===0||r!==`"${e}"`?r:e}).join(" ")}`});function ije(t){let e=t.split(` +`),r=e.filter(a=>a.match(/\S/)),o=r.length>0?r.reduce((a,n)=>Math.min(a,n.length-n.trimStart().length),Number.MAX_VALUE):0;return e.map(a=>a.slice(o).trimRight()).join(` +`)}function Do(t,{format:e,paragraphs:r}){return t=t.replace(/\r\n?/g,` +`),t=ije(t),t=t.replace(/^\n+|\n+$/g,""),t=t.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2 + +`),t=t.replace(/\n(\n)?\n*/g,(o,a)=>a||" "),r&&(t=t.split(/\n/).map(o=>{let a=o.match(/^\s*[*-][\t ]+(.*)/);if(!a)return o.match(/(.{1,80})(?: |$)/g).join(` +`);let n=o.length-o.trimStart().length;return a[1].match(new RegExp(`(.{1,${78-n}})(?: |$)`,"g")).map((u,A)=>" ".repeat(n)+(A===0?"- ":" ")+u).join(` +`)}).join(` + +`)),t=t.replace(/(`+)((?:.|[\n])*?)\1/g,(o,a,n)=>e.code(a+n+a)),t=t.replace(/(\*\*)((?:.|[\n])*?)\1/g,(o,a,n)=>e.bold(a+n+a)),t?`${t} +`:""}var QR,fK,pK,FR=Et(()=>{QR=Array(80).fill("\u2501");for(let t=0;t<=24;++t)QR[QR.length-t]=`\x1B[38;5;${232+t}m\u2501`;fK={header:t=>`\x1B[1m\u2501\u2501\u2501 ${t}${t.length<80-5?` ${QR.slice(t.length+5).join("")}`:":"}\x1B[0m`,bold:t=>`\x1B[1m${t}\x1B[22m`,error:t=>`\x1B[31m\x1B[1m${t}\x1B[22m\x1B[39m`,code:t=>`\x1B[36m${t}\x1B[39m`},pK={header:t=>t,bold:t=>t,error:t=>t,code:t=>t}});function Vo(t){return{...t,[rI]:!0}}function qu(t,e){return typeof t>"u"?[t,e]:typeof t=="object"&&t!==null&&!Array.isArray(t)?[void 0,t]:[t,e]}function nP(t,{mergeName:e=!1}={}){let r=t.match(/^([^:]+): (.*)$/m);if(!r)return"validation failed";let[,o,a]=r;return e&&(a=a[0].toLowerCase()+a.slice(1)),a=o!=="."||!e?`${o.replace(/^\.(\[|$)/,"$1")}: ${a}`:`: ${a}`,a}function nI(t,e){return e.length===1?new it(`${t}${nP(e[0],{mergeName:!0})}`):new it(`${t}: +${e.map(r=>` +- ${nP(r)}`).join("")}`)}function rd(t,e,r){if(typeof r>"u")return e;let o=[],a=[],n=A=>{let p=e;return e=A,n.bind(null,p)};if(!r(e,{errors:o,coercions:a,coercion:n}))throw nI(`Invalid value for ${t}`,o);for(let[,A]of a)A();return e}var rI,yf=Et(()=>{rP();rI=Symbol("clipanion/isOption")});var Ko={};Kt(Ko,{KeyRelationship:()=>Gu,TypeAssertionError:()=>Wp,applyCascade:()=>oI,as:()=>Bje,assert:()=>Cje,assertWithErrors:()=>wje,cascade:()=>aP,fn:()=>vje,hasAtLeastOneKey:()=>UR,hasExactLength:()=>yK,hasForbiddenKeys:()=>qje,hasKeyRelationship:()=>lI,hasMaxLength:()=>Pje,hasMinLength:()=>Dje,hasMutuallyExclusiveKeys:()=>Gje,hasRequiredKeys:()=>jje,hasUniqueItems:()=>Sje,isArray:()=>iP,isAtLeast:()=>MR,isAtMost:()=>kje,isBase64:()=>Oje,isBoolean:()=>fje,isDate:()=>hje,isDict:()=>mje,isEnum:()=>Vs,isHexColor:()=>Mje,isISO8601:()=>Lje,isInExclusiveRange:()=>Fje,isInInclusiveRange:()=>Qje,isInstanceOf:()=>Eje,isInteger:()=>OR,isJSON:()=>Uje,isLiteral:()=>gK,isLowerCase:()=>Tje,isMap:()=>dje,isNegative:()=>xje,isNullable:()=>Hje,isNumber:()=>NR,isObject:()=>dK,isOneOf:()=>LR,isOptional:()=>_je,isPartial:()=>yje,isPayload:()=>pje,isPositive:()=>bje,isRecord:()=>oP,isSet:()=>gje,isString:()=>Ey,isTuple:()=>sP,isUUID4:()=>Nje,isUnknown:()=>RR,isUpperCase:()=>Rje,makeTrait:()=>mK,makeValidator:()=>Hr,matchesRegExp:()=>sI,softAssert:()=>Ije});function jn(t){return t===null?"null":t===void 0?"undefined":t===""?"an empty string":typeof t=="symbol"?`<${t.toString()}>`:Array.isArray(t)?"an array":JSON.stringify(t)}function yy(t,e){if(t.length===0)return"nothing";if(t.length===1)return jn(t[0]);let r=t.slice(0,-1),o=t[t.length-1],a=t.length>2?`, ${e} `:` ${e} `;return`${r.map(n=>jn(n)).join(", ")}${a}${jn(o)}`}function Yp(t,e){var r,o,a;return typeof e=="number"?`${(r=t?.p)!==null&&r!==void 0?r:"."}[${e}]`:sje.test(e)?`${(o=t?.p)!==null&&o!==void 0?o:""}.${e}`:`${(a=t?.p)!==null&&a!==void 0?a:"."}[${JSON.stringify(e)}]`}function TR(t,e,r){return t===1?e:r}function pr({errors:t,p:e}={},r){return t?.push(`${e??"."}: ${r}`),!1}function uje(t,e){return r=>{t[e]=r}}function Yu(t,e){return r=>{let o=t[e];return t[e]=r,Yu(t,e).bind(null,o)}}function iI(t,e,r){let o=()=>(t(r()),a),a=()=>(t(e),o);return o}function RR(){return Hr({test:(t,e)=>!0})}function gK(t){return Hr({test:(e,r)=>e!==t?pr(r,`Expected ${jn(t)} (got ${jn(e)})`):!0})}function Ey(){return Hr({test:(t,e)=>typeof t!="string"?pr(e,`Expected a string (got ${jn(t)})`):!0})}function Vs(t){let e=Array.isArray(t)?t:Object.values(t),r=e.every(a=>typeof a=="string"||typeof a=="number"),o=new Set(e);return o.size===1?gK([...o][0]):Hr({test:(a,n)=>o.has(a)?!0:r?pr(n,`Expected one of ${yy(e,"or")} (got ${jn(a)})`):pr(n,`Expected a valid enumeration value (got ${jn(a)})`)})}function fje(){return Hr({test:(t,e)=>{var r;if(typeof t!="boolean"){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return pr(e,"Unbound coercion result");let o=Aje.get(t);if(typeof o<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,o)]),!0}return pr(e,`Expected a boolean (got ${jn(t)})`)}return!0}})}function NR(){return Hr({test:(t,e)=>{var r;if(typeof t!="number"){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return pr(e,"Unbound coercion result");let o;if(typeof t=="string"){let a;try{a=JSON.parse(t)}catch{}if(typeof a=="number")if(JSON.stringify(a)===t)o=a;else return pr(e,`Received a number that can't be safely represented by the runtime (${t})`)}if(typeof o<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,o)]),!0}return pr(e,`Expected a number (got ${jn(t)})`)}return!0}})}function pje(t){return Hr({test:(e,r)=>{var o;if(typeof r?.coercions>"u")return pr(r,"The isPayload predicate can only be used with coercion enabled");if(typeof r.coercion>"u")return pr(r,"Unbound coercion result");if(typeof e!="string")return pr(r,`Expected a string (got ${jn(e)})`);let a;try{a=JSON.parse(e)}catch{return pr(r,`Expected a JSON string (got ${jn(e)})`)}let n={value:a};return t(a,Object.assign(Object.assign({},r),{coercion:Yu(n,"value")}))?(r.coercions.push([(o=r.p)!==null&&o!==void 0?o:".",r.coercion.bind(null,n.value)]),!0):!1}})}function hje(){return Hr({test:(t,e)=>{var r;if(!(t instanceof Date)){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return pr(e,"Unbound coercion result");let o;if(typeof t=="string"&&hK.test(t))o=new Date(t);else{let a;if(typeof t=="string"){let n;try{n=JSON.parse(t)}catch{}typeof n=="number"&&(a=n)}else typeof t=="number"&&(a=t);if(typeof a<"u")if(Number.isSafeInteger(a)||!Number.isSafeInteger(a*1e3))o=new Date(a*1e3);else return pr(e,`Received a timestamp that can't be safely represented by the runtime (${t})`)}if(typeof o<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,o)]),!0}return pr(e,`Expected a date (got ${jn(t)})`)}return!0}})}function iP(t,{delimiter:e}={}){return Hr({test:(r,o)=>{var a;let n=r;if(typeof r=="string"&&typeof e<"u"&&typeof o?.coercions<"u"){if(typeof o?.coercion>"u")return pr(o,"Unbound coercion result");r=r.split(e)}if(!Array.isArray(r))return pr(o,`Expected an array (got ${jn(r)})`);let u=!0;for(let A=0,p=r.length;A{var n,u;if(Object.getPrototypeOf(o).toString()==="[object Set]")if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return pr(a,"Unbound coercion result");let A=[...o],p=[...o];if(!r(p,Object.assign(Object.assign({},a),{coercion:void 0})))return!1;let h=()=>p.some((E,I)=>E!==A[I])?new Set(p):o;return a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",iI(a.coercion,o,h)]),!0}else{let A=!0;for(let p of o)if(A=t(p,Object.assign({},a))&&A,!A&&a?.errors==null)break;return A}if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return pr(a,"Unbound coercion result");let A={value:o};return r(o,Object.assign(Object.assign({},a),{coercion:Yu(A,"value")}))?(a.coercions.push([(u=a.p)!==null&&u!==void 0?u:".",iI(a.coercion,o,()=>new Set(A.value))]),!0):!1}return pr(a,`Expected a set (got ${jn(o)})`)}})}function dje(t,e){let r=iP(sP([t,e])),o=oP(e,{keys:t});return Hr({test:(a,n)=>{var u,A,p;if(Object.getPrototypeOf(a).toString()==="[object Map]")if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return pr(n,"Unbound coercion result");let h=[...a],E=[...a];if(!r(E,Object.assign(Object.assign({},n),{coercion:void 0})))return!1;let I=()=>E.some((v,b)=>v[0]!==h[b][0]||v[1]!==h[b][1])?new Map(E):a;return n.coercions.push([(u=n.p)!==null&&u!==void 0?u:".",iI(n.coercion,a,I)]),!0}else{let h=!0;for(let[E,I]of a)if(h=t(E,Object.assign({},n))&&h,!h&&n?.errors==null||(h=e(I,Object.assign(Object.assign({},n),{p:Yp(n,E)}))&&h,!h&&n?.errors==null))break;return h}if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return pr(n,"Unbound coercion result");let h={value:a};return Array.isArray(a)?r(a,Object.assign(Object.assign({},n),{coercion:void 0}))?(n.coercions.push([(A=n.p)!==null&&A!==void 0?A:".",iI(n.coercion,a,()=>new Map(h.value))]),!0):!1:o(a,Object.assign(Object.assign({},n),{coercion:Yu(h,"value")}))?(n.coercions.push([(p=n.p)!==null&&p!==void 0?p:".",iI(n.coercion,a,()=>new Map(Object.entries(h.value)))]),!0):!1}return pr(n,`Expected a map (got ${jn(a)})`)}})}function sP(t,{delimiter:e}={}){let r=yK(t.length);return Hr({test:(o,a)=>{var n;if(typeof o=="string"&&typeof e<"u"&&typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return pr(a,"Unbound coercion result");o=o.split(e),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,o)])}if(!Array.isArray(o))return pr(a,`Expected a tuple (got ${jn(o)})`);let u=r(o,Object.assign({},a));for(let A=0,p=o.length;A{var n;if(Array.isArray(o)&&typeof a?.coercions<"u")return typeof a?.coercion>"u"?pr(a,"Unbound coercion result"):r(o,Object.assign(Object.assign({},a),{coercion:void 0}))?(o=Object.fromEntries(o),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,o)]),!0):!1;if(typeof o!="object"||o===null)return pr(a,`Expected an object (got ${jn(o)})`);let u=Object.keys(o),A=!0;for(let p=0,h=u.length;p{if(typeof a!="object"||a===null)return pr(n,`Expected an object (got ${jn(a)})`);let u=new Set([...r,...Object.keys(a)]),A={},p=!0;for(let h of u){if(h==="constructor"||h==="__proto__")p=pr(Object.assign(Object.assign({},n),{p:Yp(n,h)}),"Unsafe property name");else{let E=Object.prototype.hasOwnProperty.call(t,h)?t[h]:void 0,I=Object.prototype.hasOwnProperty.call(a,h)?a[h]:void 0;typeof E<"u"?p=E(I,Object.assign(Object.assign({},n),{p:Yp(n,h),coercion:Yu(a,h)}))&&p:e===null?p=pr(Object.assign(Object.assign({},n),{p:Yp(n,h)}),`Extraneous property (got ${jn(I)})`):Object.defineProperty(A,h,{enumerable:!0,get:()=>I,set:uje(a,h)})}if(!p&&n?.errors==null)break}return e!==null&&(p||n?.errors!=null)&&(p=e(A,n)&&p),p}});return Object.assign(o,{properties:t})}function yje(t){return dK(t,{extra:oP(RR())})}function mK(t){return()=>t}function Hr({test:t}){return mK(t)()}function Cje(t,e){if(!e(t))throw new Wp}function wje(t,e){let r=[];if(!e(t,{errors:r}))throw new Wp({errors:r})}function Ije(t,e){}function Bje(t,e,{coerce:r=!1,errors:o,throw:a}={}){let n=o?[]:void 0;if(!r){if(e(t,{errors:n}))return a?t:{value:t,errors:void 0};if(a)throw new Wp({errors:n});return{value:void 0,errors:n??!0}}let u={value:t},A=Yu(u,"value"),p=[];if(!e(t,{errors:n,coercion:A,coercions:p})){if(a)throw new Wp({errors:n});return{value:void 0,errors:n??!0}}for(let[,h]of p)h();return a?u.value:{value:u.value,errors:void 0}}function vje(t,e){let r=sP(t);return(...o)=>{if(!r(o))throw new Wp;return e(...o)}}function Dje(t){return Hr({test:(e,r)=>e.length>=t?!0:pr(r,`Expected to have a length of at least ${t} elements (got ${e.length})`)})}function Pje(t){return Hr({test:(e,r)=>e.length<=t?!0:pr(r,`Expected to have a length of at most ${t} elements (got ${e.length})`)})}function yK(t){return Hr({test:(e,r)=>e.length!==t?pr(r,`Expected to have a length of exactly ${t} elements (got ${e.length})`):!0})}function Sje({map:t}={}){return Hr({test:(e,r)=>{let o=new Set,a=new Set;for(let n=0,u=e.length;nt<=0?!0:pr(e,`Expected to be negative (got ${t})`)})}function bje(){return Hr({test:(t,e)=>t>=0?!0:pr(e,`Expected to be positive (got ${t})`)})}function MR(t){return Hr({test:(e,r)=>e>=t?!0:pr(r,`Expected to be at least ${t} (got ${e})`)})}function kje(t){return Hr({test:(e,r)=>e<=t?!0:pr(r,`Expected to be at most ${t} (got ${e})`)})}function Qje(t,e){return Hr({test:(r,o)=>r>=t&&r<=e?!0:pr(o,`Expected to be in the [${t}; ${e}] range (got ${r})`)})}function Fje(t,e){return Hr({test:(r,o)=>r>=t&&re!==Math.round(e)?pr(r,`Expected to be an integer (got ${e})`):!t&&!Number.isSafeInteger(e)?pr(r,`Expected to be a safe integer (got ${e})`):!0})}function sI(t){return Hr({test:(e,r)=>t.test(e)?!0:pr(r,`Expected to match the pattern ${t.toString()} (got ${jn(e)})`)})}function Tje(){return Hr({test:(t,e)=>t!==t.toLowerCase()?pr(e,`Expected to be all-lowercase (got ${t})`):!0})}function Rje(){return Hr({test:(t,e)=>t!==t.toUpperCase()?pr(e,`Expected to be all-uppercase (got ${t})`):!0})}function Nje(){return Hr({test:(t,e)=>cje.test(t)?!0:pr(e,`Expected to be a valid UUID v4 (got ${jn(t)})`)})}function Lje(){return Hr({test:(t,e)=>hK.test(t)?!0:pr(e,`Expected to be a valid ISO 8601 date string (got ${jn(t)})`)})}function Mje({alpha:t=!1}){return Hr({test:(e,r)=>(t?oje.test(e):aje.test(e))?!0:pr(r,`Expected to be a valid hexadecimal color string (got ${jn(e)})`)})}function Oje(){return Hr({test:(t,e)=>lje.test(t)?!0:pr(e,`Expected to be a valid base 64 string (got ${jn(t)})`)})}function Uje(t=RR()){return Hr({test:(e,r)=>{let o;try{o=JSON.parse(e)}catch{return pr(r,`Expected to be a valid JSON string (got ${jn(e)})`)}return t(o,r)}})}function aP(t,...e){let r=Array.isArray(e[0])?e[0]:e;return Hr({test:(o,a)=>{var n,u;let A={value:o},p=typeof a?.coercions<"u"?Yu(A,"value"):void 0,h=typeof a?.coercions<"u"?[]:void 0;if(!t(o,Object.assign(Object.assign({},a),{coercion:p,coercions:h})))return!1;let E=[];if(typeof h<"u")for(let[,I]of h)E.push(I());try{if(typeof a?.coercions<"u"){if(A.value!==o){if(typeof a?.coercion>"u")return pr(a,"Unbound coercion result");a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,A.value)])}(u=a?.coercions)===null||u===void 0||u.push(...h)}return r.every(I=>I(A.value,a))}finally{for(let I of E)I()}}})}function oI(t,...e){let r=Array.isArray(e[0])?e[0]:e;return aP(t,r)}function _je(t){return Hr({test:(e,r)=>typeof e>"u"?!0:t(e,r)})}function Hje(t){return Hr({test:(e,r)=>e===null?!0:t(e,r)})}function jje(t,e){var r;let o=new Set(t),a=aI[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Hr({test:(n,u)=>{let A=new Set(Object.keys(n)),p=[];for(let h of o)a(A,h,n)||p.push(h);return p.length>0?pr(u,`Missing required ${TR(p.length,"property","properties")} ${yy(p,"and")}`):!0}})}function UR(t,e){var r;let o=new Set(t),a=aI[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Hr({test:(n,u)=>Object.keys(n).some(h=>a(o,h,n))?!0:pr(u,`Missing at least one property from ${yy(Array.from(o),"or")}`)})}function qje(t,e){var r;let o=new Set(t),a=aI[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Hr({test:(n,u)=>{let A=new Set(Object.keys(n)),p=[];for(let h of o)a(A,h,n)&&p.push(h);return p.length>0?pr(u,`Forbidden ${TR(p.length,"property","properties")} ${yy(p,"and")}`):!0}})}function Gje(t,e){var r;let o=new Set(t),a=aI[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Hr({test:(n,u)=>{let A=new Set(Object.keys(n)),p=[];for(let h of o)a(A,h,n)&&p.push(h);return p.length>1?pr(u,`Mutually exclusive properties ${yy(p,"and")}`):!0}})}function lI(t,e,r,o){var a,n;let u=new Set((a=o?.ignore)!==null&&a!==void 0?a:[]),A=aI[(n=o?.missingIf)!==null&&n!==void 0?n:"missing"],p=new Set(r),h=Yje[e],E=e===Gu.Forbids?"or":"and";return Hr({test:(I,v)=>{let b=new Set(Object.keys(I));if(!A(b,t,I)||u.has(I[t]))return!0;let C=[];for(let T of p)(A(b,T,I)&&!u.has(I[T]))!==h.expect&&C.push(T);return C.length>=1?pr(v,`Property "${t}" ${h.message} ${TR(C.length,"property","properties")} ${yy(C,E)}`):!0}})}var sje,oje,aje,lje,cje,hK,Aje,Eje,LR,Wp,aI,Gu,Yje,Za=Et(()=>{sje=/^[a-zA-Z_][a-zA-Z0-9_]*$/;oje=/^#[0-9a-f]{6}$/i,aje=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,lje=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,cje=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,hK=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/;Aje=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]);Eje=t=>Hr({test:(e,r)=>e instanceof t?!0:pr(r,`Expected an instance of ${t.name} (got ${jn(e)})`)}),LR=(t,{exclusive:e=!1}={})=>Hr({test:(r,o)=>{var a,n,u;let A=[],p=typeof o?.errors<"u"?[]:void 0;for(let h=0,E=t.length;h1?pr(o,`Expected to match exactly a single predicate (matched ${A.join(", ")})`):(u=o?.errors)===null||u===void 0||u.push(...p),!1}});Wp=class extends Error{constructor({errors:e}={}){let r="Type mismatch";if(e&&e.length>0){r+=` +`;for(let o of e)r+=` +- ${o}`}super(r)}};aI={missing:(t,e)=>t.has(e),undefined:(t,e,r)=>t.has(e)&&typeof r[e]<"u",nil:(t,e,r)=>t.has(e)&&r[e]!=null,falsy:(t,e,r)=>t.has(e)&&!!r[e]};(function(t){t.Forbids="Forbids",t.Requires="Requires"})(Gu||(Gu={}));Yje={[Gu.Forbids]:{expect:!1,message:"forbids using"},[Gu.Requires]:{expect:!0,message:"requires using"}}});var nt,Vp=Et(()=>{yf();nt=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let r=this.constructor.schema;if(Array.isArray(r)){let{isDict:a,isUnknown:n,applyCascade:u}=await Promise.resolve().then(()=>(Za(),Ko)),A=u(a(n()),r),p=[],h=[];if(!A(this,{errors:p,coercions:h}))throw nI("Invalid option schema",p);for(let[,I]of h)I()}else if(r!=null)throw new Error("Invalid command schema");let o=await this.execute();return typeof o<"u"?o:0}};nt.isOption=rI;nt.Default=[]});function va(t){bR&&console.log(t)}function CK(){let t={nodes:[]};for(let e=0;e{if(e.has(o))return;e.add(o);let a=t.nodes[o];for(let u of Object.values(a.statics))for(let{to:A}of u)r(A);for(let[,{to:u}]of a.dynamics)r(u);for(let{to:u}of a.shortcuts)r(u);let n=new Set(a.shortcuts.map(({to:u})=>u));for(;a.shortcuts.length>0;){let{to:u}=a.shortcuts.shift(),A=t.nodes[u];for(let[p,h]of Object.entries(A.statics)){let E=Object.prototype.hasOwnProperty.call(a.statics,p)?a.statics[p]:a.statics[p]=[];for(let I of h)E.some(({to:v})=>I.to===v)||E.push(I)}for(let[p,h]of A.dynamics)a.dynamics.some(([E,{to:I}])=>p===E&&h.to===I)||a.dynamics.push([p,h]);for(let p of A.shortcuts)n.has(p.to)||(a.shortcuts.push(p),n.add(p.to))}};r(cn.InitialNode)}function Kje(t,{prefix:e=""}={}){if(bR){va(`${e}Nodes are:`);for(let r=0;rE!==cn.ErrorNode).map(({state:E})=>({usage:E.candidateUsage,reason:null})));if(h.every(({node:E})=>E===cn.ErrorNode))throw new my(e,h.map(({state:E})=>({usage:E.candidateUsage,reason:E.errorMessage})));o=Xje(h)}if(o.length>0){va(" Results:");for(let n of o)va(` - ${n.node} -> ${JSON.stringify(n.state)}`)}else va(" No results");return o}function zje(t,e,{endToken:r=Hn.EndOfInput}={}){let o=Jje(t,[...e,r]);return Zje(e,o.map(({state:a})=>a))}function Xje(t){let e=0;for(let{state:r}of t)r.path.length>e&&(e=r.path.length);return t.filter(({state:r})=>r.path.length===e)}function Zje(t,e){let r=e.filter(v=>v.selectedIndex!==null),o=r.filter(v=>!v.partial);if(o.length>0&&(r=o),r.length===0)throw new Error;let a=r.filter(v=>v.selectedIndex===td||v.requiredOptions.every(b=>b.some(C=>v.options.find(T=>T.name===C))));if(a.length===0)throw new my(t,r.map(v=>({usage:v.candidateUsage,reason:null})));let n=0;for(let v of a)v.path.length>n&&(n=v.path.length);let u=a.filter(v=>v.path.length===n),A=v=>v.positionals.filter(({extra:b})=>!b).length+v.options.length,p=u.map(v=>({state:v,positionalCount:A(v)})),h=0;for(let{positionalCount:v}of p)v>h&&(h=v);let E=p.filter(({positionalCount:v})=>v===h).map(({state:v})=>v),I=$je(E);if(I.length>1)throw new tP(t,I.map(v=>v.candidateUsage));return I[0]}function $je(t){let e=[],r=[];for(let o of t)o.selectedIndex===td?r.push(o):e.push(o);return r.length>0&&e.push({...EK,path:wK(...r.map(o=>o.path)),options:r.reduce((o,a)=>o.concat(a.options),[])}),e}function wK(t,e,...r){return e===void 0?Array.from(t):wK(t.filter((o,a)=>o===e[a]),...r)}function $a(){return{dynamics:[],shortcuts:[],statics:{}}}function IK(t){return t===cn.SuccessNode||t===cn.ErrorNode}function _R(t,e=0){return{to:IK(t.to)?t.to:t.to>=cn.CustomNode?t.to+e-cn.CustomNode+1:t.to+e,reducer:t.reducer}}function eqe(t,e=0){let r=$a();for(let[o,a]of t.dynamics)r.dynamics.push([o,_R(a,e)]);for(let o of t.shortcuts)r.shortcuts.push(_R(o,e));for(let[o,a]of Object.entries(t.statics))r.statics[o]=a.map(n=>_R(n,e));return r}function Ss(t,e,r,o,a){t.nodes[e].dynamics.push([r,{to:o,reducer:a}])}function Cy(t,e,r,o){t.nodes[e].shortcuts.push({to:r,reducer:o})}function Jo(t,e,r,o,a){(Object.prototype.hasOwnProperty.call(t.nodes[e].statics,r)?t.nodes[e].statics[r]:t.nodes[e].statics[r]=[]).push({to:o,reducer:a})}function lP(t,e,r,o,a){if(Array.isArray(e)){let[n,...u]=e;return t[n](r,o,a,...u)}else return t[e](r,o,a)}var EK,tqe,HR,el,jR,wy,cP=Et(()=>{eP();rP();EK={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:td,partial:!1,tokens:[]};tqe={always:()=>!0,isOptionLike:(t,e)=>!t.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(t,e)=>t.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(t,e,r,o)=>!t.ignoreOptions&&e===o,isBatchOption:(t,e,r,o)=>!t.ignoreOptions&&AK.test(e)&&[...e.slice(1)].every(a=>o.has(`-${a}`)),isBoundOption:(t,e,r,o,a)=>{let n=e.match(xR);return!t.ignoreOptions&&!!n&&$D.test(n[1])&&o.has(n[1])&&a.filter(u=>u.nameSet.includes(n[1])).every(u=>u.allowBinding)},isNegatedOption:(t,e,r,o)=>!t.ignoreOptions&&e===`--no-${o.slice(2)}`,isHelp:(t,e)=>!t.ignoreOptions&&SR.test(e),isUnsupportedOption:(t,e,r,o)=>!t.ignoreOptions&&e.startsWith("-")&&$D.test(e)&&!o.has(e),isInvalidOption:(t,e)=>!t.ignoreOptions&&e.startsWith("-")&&!$D.test(e)},HR={setCandidateState:(t,e,r,o)=>({...t,...o}),setSelectedIndex:(t,e,r,o)=>({...t,selectedIndex:o}),setPartialIndex:(t,e,r,o)=>({...t,selectedIndex:o,partial:!0}),pushBatch:(t,e,r,o)=>{let a=t.options.slice(),n=t.tokens.slice();for(let u=1;u{let[,o,a]=e.match(xR),n=t.options.concat({name:o,value:a}),u=t.tokens.concat([{segmentIndex:r,type:"option",slice:[0,o.length],option:o},{segmentIndex:r,type:"assign",slice:[o.length,o.length+1]},{segmentIndex:r,type:"value",slice:[o.length+1,o.length+a.length+1]}]);return{...t,options:n,tokens:u}},pushPath:(t,e,r)=>{let o=t.path.concat(e),a=t.tokens.concat({segmentIndex:r,type:"path"});return{...t,path:o,tokens:a}},pushPositional:(t,e,r)=>{let o=t.positionals.concat({value:e,extra:!1}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:o,tokens:a}},pushExtra:(t,e,r)=>{let o=t.positionals.concat({value:e,extra:!0}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:o,tokens:a}},pushExtraNoLimits:(t,e,r)=>{let o=t.positionals.concat({value:e,extra:el}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:o,tokens:a}},pushTrue:(t,e,r,o)=>{let a=t.options.concat({name:o,value:!0}),n=t.tokens.concat({segmentIndex:r,type:"option",option:o});return{...t,options:a,tokens:n}},pushFalse:(t,e,r,o)=>{let a=t.options.concat({name:o,value:!1}),n=t.tokens.concat({segmentIndex:r,type:"option",option:o});return{...t,options:a,tokens:n}},pushUndefined:(t,e,r,o)=>{let a=t.options.concat({name:e,value:void 0}),n=t.tokens.concat({segmentIndex:r,type:"option",option:e});return{...t,options:a,tokens:n}},pushStringValue:(t,e,r)=>{var o;let a=t.options[t.options.length-1],n=t.options.slice(),u=t.tokens.concat({segmentIndex:r,type:"value"});return a.value=((o=a.value)!==null&&o!==void 0?o:[]).concat([e]),{...t,options:n,tokens:u}},setStringValue:(t,e,r)=>{let o=t.options[t.options.length-1],a=t.options.slice(),n=t.tokens.concat({segmentIndex:r,type:"value"});return o.value=e,{...t,options:a,tokens:n}},inhibateOptions:t=>({...t,ignoreOptions:!0}),useHelp:(t,e,r,o)=>{let[,,a]=e.match(SR);return typeof a<"u"?{...t,options:[{name:"-c",value:String(o)},{name:"-i",value:a}]}:{...t,options:[{name:"-c",value:String(o)}]}},setError:(t,e,r,o)=>e===Hn.EndOfInput||e===Hn.EndOfPartialInput?{...t,errorMessage:`${o}.`}:{...t,errorMessage:`${o} ("${e}").`},setOptionArityError:(t,e)=>{let r=t.options[t.options.length-1];return{...t,errorMessage:`Not enough arguments to option ${r.name}.`}}},el=Symbol(),jR=class{constructor(e,r){this.allOptionNames=new Map,this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=r}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:r=this.arity.trailing,extra:o=this.arity.extra,proxy:a=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:r,extra:o,proxy:a})}addPositional({name:e="arg",required:r=!0}={}){if(!r&&this.arity.extra===el)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!r&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!r&&this.arity.extra!==el?this.arity.extra.push(e):this.arity.extra!==el&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:r=0}={}){if(this.arity.extra===el)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let o=0;o1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(o))throw new Error(`The arity must be an integer, got ${o}`);if(o<0)throw new Error(`The arity must be positive, got ${o}`);let A=e.reduce((p,h)=>h.length>p.length?h:p,"");for(let p of e)this.allOptionNames.set(p,A);this.options.push({preferredName:A,nameSet:e,description:r,arity:o,hidden:a,required:n,allowBinding:u})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:r=!0}={}){let o=[this.cliOpts.binaryName],a=[];if(this.paths.length>0&&o.push(...this.paths[0]),e){for(let{preferredName:u,nameSet:A,arity:p,hidden:h,description:E,required:I}of this.options){if(h)continue;let v=[];for(let C=0;C`:`[${b}]`)}o.push(...this.arity.leading.map(u=>`<${u}>`)),this.arity.extra===el?o.push("..."):o.push(...this.arity.extra.map(u=>`[${u}]`)),o.push(...this.arity.trailing.map(u=>`<${u}>`))}return{usage:o.join(" "),options:a}}compile(){if(typeof this.context>"u")throw new Error("Assertion failed: No context attached");let e=CK(),r=cn.InitialNode,o=this.usage().usage,a=this.options.filter(A=>A.required).map(A=>A.nameSet);r=Mc(e,$a()),Jo(e,cn.InitialNode,Hn.StartOfInput,r,["setCandidateState",{candidateUsage:o,requiredOptions:a}]);let n=this.arity.proxy?"always":"isNotOptionLike",u=this.paths.length>0?this.paths:[[]];for(let A of u){let p=r;if(A.length>0){let v=Mc(e,$a());Cy(e,p,v),this.registerOptions(e,v),p=v}for(let v=0;v0||!this.arity.proxy){let v=Mc(e,$a());Ss(e,p,"isHelp",v,["useHelp",this.cliIndex]),Ss(e,v,"always",v,"pushExtra"),Jo(e,v,Hn.EndOfInput,cn.SuccessNode,["setSelectedIndex",td]),this.registerOptions(e,p)}this.arity.leading.length>0&&(Jo(e,p,Hn.EndOfInput,cn.ErrorNode,["setError","Not enough positional arguments"]),Jo(e,p,Hn.EndOfPartialInput,cn.SuccessNode,["setPartialIndex",this.cliIndex]));let h=p;for(let v=0;v0||v+1!==this.arity.leading.length)&&(Jo(e,b,Hn.EndOfInput,cn.ErrorNode,["setError","Not enough positional arguments"]),Jo(e,b,Hn.EndOfPartialInput,cn.SuccessNode,["setPartialIndex",this.cliIndex])),Ss(e,h,"isNotOptionLike",b,"pushPositional"),h=b}let E=h;if(this.arity.extra===el||this.arity.extra.length>0){let v=Mc(e,$a());if(Cy(e,h,v),this.arity.extra===el){let b=Mc(e,$a());this.arity.proxy||this.registerOptions(e,b),Ss(e,h,n,b,"pushExtraNoLimits"),Ss(e,b,n,b,"pushExtraNoLimits"),Cy(e,b,v)}else for(let b=0;b0)&&this.registerOptions(e,C),Ss(e,E,n,C,"pushExtra"),Cy(e,C,v),E=C}E=v}this.arity.trailing.length>0&&(Jo(e,E,Hn.EndOfInput,cn.ErrorNode,["setError","Not enough positional arguments"]),Jo(e,E,Hn.EndOfPartialInput,cn.SuccessNode,["setPartialIndex",this.cliIndex]));let I=E;for(let v=0;v=0&&e{let u=n?Hn.EndOfPartialInput:Hn.EndOfInput;return zje(o,a,{endToken:u})}}}}});function vK(){return uP.default&&"getColorDepth"in uP.default.WriteStream.prototype?uP.default.WriteStream.prototype.getColorDepth():process.env.FORCE_COLOR==="0"?1:process.env.FORCE_COLOR==="1"||typeof process.stdout<"u"&&process.stdout.isTTY?8:1}function DK(t){let e=BK;if(typeof e>"u"){if(t.stdout===process.stdout&&t.stderr===process.stderr)return null;let{AsyncLocalStorage:r}=Be("async_hooks");e=BK=new r;let o=process.stdout._write;process.stdout._write=function(n,u,A){let p=e.getStore();return typeof p>"u"?o.call(this,n,u,A):p.stdout.write(n,u,A)};let a=process.stderr._write;process.stderr._write=function(n,u,A){let p=e.getStore();return typeof p>"u"?a.call(this,n,u,A):p.stderr.write(n,u,A)}}return r=>e.run(t,r)}var uP,BK,PK=Et(()=>{uP=$e(Be("tty"),1)});var Iy,SK=Et(()=>{Vp();Iy=class extends nt{constructor(e){super(),this.contexts=e,this.commands=[]}static from(e,r){let o=new Iy(r);o.path=e.path;for(let a of e.options)switch(a.name){case"-c":o.commands.push(Number(a.value));break;case"-i":o.index=Number(a.value);break}return o}async execute(){let e=this.commands;if(typeof this.index<"u"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection: +`),this.context.stdout.write(` +`);let r=0;for(let o of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[o].commandClass,{prefix:`${r++}. `.padStart(5)}));this.context.stdout.write(` +`),this.context.stdout.write(`Run again with -h= to see the longer details of any of those commands. +`)}}}});async function kK(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:o,resolvedContext:a}=FK(t);return as.from(r,e).runExit(o,a)}async function QK(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:o,resolvedContext:a}=FK(t);return as.from(r,e).run(o,a)}function FK(t){let e,r,o,a;switch(typeof process<"u"&&typeof process.argv<"u"&&(o=process.argv.slice(2)),t.length){case 1:r=t[0];break;case 2:t[0]&&t[0].prototype instanceof nt||Array.isArray(t[0])?(r=t[0],Array.isArray(t[1])?o=t[1]:a=t[1]):(e=t[0],r=t[1]);break;case 3:Array.isArray(t[2])?(e=t[0],r=t[1],o=t[2]):t[0]&&t[0].prototype instanceof nt||Array.isArray(t[0])?(r=t[0],o=t[1],a=t[2]):(e=t[0],r=t[1],a=t[2]);break;default:e=t[0],r=t[1],o=t[2],a=t[3];break}if(typeof o>"u")throw new Error("The argv parameter must be provided when running Clipanion outside of a Node context");return{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:o,resolvedContext:a}}function bK(t){return t()}var xK,as,TK=Et(()=>{eP();cP();FR();PK();Vp();SK();xK=Symbol("clipanion/errorCommand");as=class{constructor({binaryLabel:e,binaryName:r="...",binaryVersion:o,enableCapture:a=!1,enableColors:n}={}){this.registrations=new Map,this.builder=new wy({binaryName:r}),this.binaryLabel=e,this.binaryName=r,this.binaryVersion=o,this.enableCapture=a,this.enableColors=n}static from(e,r={}){let o=new as(r),a=Array.isArray(e)?e:[e];for(let n of a)o.register(n);return o}register(e){var r;let o=new Map,a=new e;for(let p in a){let h=a[p];typeof h=="object"&&h!==null&&h[nt.isOption]&&o.set(p,h)}let n=this.builder.command(),u=n.cliIndex,A=(r=e.paths)!==null&&r!==void 0?r:a.paths;if(typeof A<"u")for(let p of A)n.addPath(p);this.registrations.set(e,{specs:o,builder:n,index:u});for(let[p,{definition:h}]of o.entries())h(n,p);n.setContext({commandClass:e})}process(e,r){let{input:o,context:a,partial:n}=typeof e=="object"&&Array.isArray(e)?{input:e,context:r}:e,{contexts:u,process:A}=this.builder.compile(),p=A(o,{partial:n}),h={...as.defaultContext,...a};switch(p.selectedIndex){case td:{let E=Iy.from(p,u);return E.context=h,E.tokens=p.tokens,E}default:{let{commandClass:E}=u[p.selectedIndex],I=this.registrations.get(E);if(typeof I>"u")throw new Error("Assertion failed: Expected the command class to have been registered.");let v=new E;v.context=h,v.tokens=p.tokens,v.path=p.path;try{for(let[b,{transformer:C}]of I.specs.entries())v[b]=C(I.builder,b,p,h);return v}catch(b){throw b[xK]=v,b}}break}}async run(e,r){var o,a;let n,u={...as.defaultContext,...r},A=(o=this.enableColors)!==null&&o!==void 0?o:u.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e,u)}catch(E){return u.stdout.write(this.error(E,{colored:A})),1}if(n.help)return u.stdout.write(this.usage(n,{colored:A,detailed:!0})),0;n.context=u,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),definition:E=>this.definition(E),error:(E,I)=>this.error(E,I),format:E=>this.format(E),process:(E,I)=>this.process(E,{...u,...I}),run:(E,I)=>this.run(E,{...u,...I}),usage:(E,I)=>this.usage(E,I)};let p=this.enableCapture&&(a=DK(u))!==null&&a!==void 0?a:bK,h;try{h=await p(()=>n.validateAndExecute().catch(E=>n.catch(E).then(()=>0)))}catch(E){return u.stdout.write(this.error(E,{colored:A,command:n})),1}return h}async runExit(e,r){process.exitCode=await this.run(e,r)}definition(e,{colored:r=!1}={}){if(!e.usage)return null;let{usage:o}=this.getUsageByRegistration(e,{detailed:!1}),{usage:a,options:n}=this.getUsageByRegistration(e,{detailed:!0,inlineOptions:!1}),u=typeof e.usage.category<"u"?Do(e.usage.category,{format:this.format(r),paragraphs:!1}):void 0,A=typeof e.usage.description<"u"?Do(e.usage.description,{format:this.format(r),paragraphs:!1}):void 0,p=typeof e.usage.details<"u"?Do(e.usage.details,{format:this.format(r),paragraphs:!0}):void 0,h=typeof e.usage.examples<"u"?e.usage.examples.map(([E,I])=>[Do(E,{format:this.format(r),paragraphs:!1}),I.replace(/\$0/g,this.binaryName)]):void 0;return{path:o,usage:a,category:u,description:A,details:p,examples:h,options:n}}definitions({colored:e=!1}={}){let r=[];for(let o of this.registrations.keys()){let a=this.definition(o,{colored:e});!a||r.push(a)}return r}usage(e=null,{colored:r,detailed:o=!1,prefix:a="$ "}={}){var n;if(e===null){for(let p of this.registrations.keys()){let h=p.paths,E=typeof p.usage<"u";if(!h||h.length===0||h.length===1&&h[0].length===0||((n=h?.some(b=>b.length===0))!==null&&n!==void 0?n:!1))if(e){e=null;break}else e=p;else if(E){e=null;continue}}e&&(o=!0)}let u=e!==null&&e instanceof nt?e.constructor:e,A="";if(u)if(o){let{description:p="",details:h="",examples:E=[]}=u.usage||{};p!==""&&(A+=Do(p,{format:this.format(r),paragraphs:!1}).replace(/^./,b=>b.toUpperCase()),A+=` +`),(h!==""||E.length>0)&&(A+=`${this.format(r).header("Usage")} +`,A+=` +`);let{usage:I,options:v}=this.getUsageByRegistration(u,{inlineOptions:!1});if(A+=`${this.format(r).bold(a)}${I} +`,v.length>0){A+=` +`,A+=`${this.format(r).header("Options")} +`;let b=v.reduce((C,T)=>Math.max(C,T.definition.length),0);A+=` +`;for(let{definition:C,description:T}of v)A+=` ${this.format(r).bold(C.padEnd(b))} ${Do(T,{format:this.format(r),paragraphs:!1})}`}if(h!==""&&(A+=` +`,A+=`${this.format(r).header("Details")} +`,A+=` +`,A+=Do(h,{format:this.format(r),paragraphs:!0})),E.length>0){A+=` +`,A+=`${this.format(r).header("Examples")} +`;for(let[b,C]of E)A+=` +`,A+=Do(b,{format:this.format(r),paragraphs:!1}),A+=`${C.replace(/^/m,` ${this.format(r).bold(a)}`).replace(/\$0/g,this.binaryName)} +`}}else{let{usage:p}=this.getUsageByRegistration(u);A+=`${this.format(r).bold(a)}${p} +`}else{let p=new Map;for(let[v,{index:b}]of this.registrations.entries()){if(typeof v.usage>"u")continue;let C=typeof v.usage.category<"u"?Do(v.usage.category,{format:this.format(r),paragraphs:!1}):null,T=p.get(C);typeof T>"u"&&p.set(C,T=[]);let{usage:L}=this.getUsageByIndex(b);T.push({commandClass:v,usage:L})}let h=Array.from(p.keys()).sort((v,b)=>v===null?-1:b===null?1:v.localeCompare(b,"en",{usage:"sort",caseFirst:"upper"})),E=typeof this.binaryLabel<"u",I=typeof this.binaryVersion<"u";E||I?(E&&I?A+=`${this.format(r).header(`${this.binaryLabel} - ${this.binaryVersion}`)} + +`:E?A+=`${this.format(r).header(`${this.binaryLabel}`)} +`:A+=`${this.format(r).header(`${this.binaryVersion}`)} +`,A+=` ${this.format(r).bold(a)}${this.binaryName} +`):A+=`${this.format(r).bold(a)}${this.binaryName} +`;for(let v of h){let b=p.get(v).slice().sort((T,L)=>T.usage.localeCompare(L.usage,"en",{usage:"sort",caseFirst:"upper"})),C=v!==null?v.trim():"General commands";A+=` +`,A+=`${this.format(r).header(`${C}`)} +`;for(let{commandClass:T,usage:L}of b){let U=T.usage.description||"undocumented";A+=` +`,A+=` ${this.format(r).bold(L)} +`,A+=` ${Do(U,{format:this.format(r),paragraphs:!1})}`}}A+=` +`,A+=Do("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(r),paragraphs:!0})}return A}error(e,r){var o,{colored:a,command:n=(o=e[xK])!==null&&o!==void 0?o:null}=r===void 0?{}:r;(!e||typeof e!="object"||!("stack"in e))&&(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let u="",A=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");A==="Error"&&(A="Internal Error"),u+=`${this.format(a).error(A)}: ${e.message} +`;let p=e.clipanion;return typeof p<"u"?p.type==="usage"&&(u+=` +`,u+=this.usage(n)):e.stack&&(u+=`${e.stack.replace(/^.*\n/,"")} +`),u}format(e){var r;return((r=e??this.enableColors)!==null&&r!==void 0?r:as.defaultContext.colorDepth>1)?fK:pK}getUsageByRegistration(e,r){let o=this.registrations.get(e);if(typeof o>"u")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(o.index,r)}getUsageByIndex(e,r){return this.builder.getBuilderByIndex(e).usage(r)}};as.defaultContext={env:process.env,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:vK()}});var cI,RK=Et(()=>{Vp();cI=class extends nt{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)} +`)}};cI.paths=[["--clipanion=definitions"]]});var uI,NK=Et(()=>{Vp();uI=class extends nt{async execute(){this.context.stdout.write(this.cli.usage())}};uI.paths=[["-h"],["--help"]]});function AP(t={}){return Vo({definition(e,r){var o;e.addProxy({name:(o=t.name)!==null&&o!==void 0?o:r,required:t.required})},transformer(e,r,o){return o.positionals.map(({value:a})=>a)}})}var qR=Et(()=>{yf()});var AI,LK=Et(()=>{Vp();qR();AI=class extends nt{constructor(){super(...arguments),this.args=AP()}async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.process(this.args).tokens,null,2)} +`)}};AI.paths=[["--clipanion=tokens"]]});var fI,MK=Et(()=>{Vp();fI=class extends nt{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:""} +`)}};fI.paths=[["-v"],["--version"]]});var GR={};Kt(GR,{DefinitionsCommand:()=>cI,HelpCommand:()=>uI,TokensCommand:()=>AI,VersionCommand:()=>fI});var OK=Et(()=>{RK();NK();LK();MK()});function UK(t,e,r){let[o,a]=qu(e,r??{}),{arity:n=1}=a,u=t.split(","),A=new Set(u);return Vo({definition(p){p.addOption({names:u,arity:n,hidden:a?.hidden,description:a?.description,required:a.required})},transformer(p,h,E){let I,v=typeof o<"u"?[...o]:void 0;for(let{name:b,value:C}of E.options)!A.has(b)||(I=b,v=v??[],v.push(C));return typeof v<"u"?rd(I??h,v,a.validator):v}})}var _K=Et(()=>{yf()});function HK(t,e,r){let[o,a]=qu(e,r??{}),n=t.split(","),u=new Set(n);return Vo({definition(A){A.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(A,p,h){let E=o;for(let{name:I,value:v}of h.options)!u.has(I)||(E=v);return E}})}var jK=Et(()=>{yf()});function qK(t,e,r){let[o,a]=qu(e,r??{}),n=t.split(","),u=new Set(n);return Vo({definition(A){A.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(A,p,h){let E=o;for(let{name:I,value:v}of h.options)!u.has(I)||(E??(E=0),v?E+=1:E=0);return E}})}var GK=Et(()=>{yf()});function YK(t={}){return Vo({definition(e,r){var o;e.addRest({name:(o=t.name)!==null&&o!==void 0?o:r,required:t.required})},transformer(e,r,o){let a=u=>{let A=o.positionals[u];return A.extra===el||A.extra===!1&&uu)}})}var WK=Et(()=>{cP();yf()});function rqe(t,e,r){let[o,a]=qu(e,r??{}),{arity:n=1}=a,u=t.split(","),A=new Set(u);return Vo({definition(p){p.addOption({names:u,arity:a.tolerateBoolean?0:n,hidden:a.hidden,description:a.description,required:a.required})},transformer(p,h,E,I){let v,b=o;typeof a.env<"u"&&I.env[a.env]&&(v=a.env,b=I.env[a.env]);for(let{name:C,value:T}of E.options)!A.has(C)||(v=C,b=T);return typeof b=="string"?rd(v??h,b,a.validator):b}})}function nqe(t={}){let{required:e=!0}=t;return Vo({definition(r,o){var a;r.addPositional({name:(a=t.name)!==null&&a!==void 0?a:o,required:t.required})},transformer(r,o,a){var n;for(let u=0;u{cP();yf()});var ge={};Kt(ge,{Array:()=>UK,Boolean:()=>HK,Counter:()=>qK,Proxy:()=>AP,Rest:()=>YK,String:()=>VK,applyValidator:()=>rd,cleanValidationError:()=>nP,formatError:()=>nI,isOptionSymbol:()=>rI,makeCommandOption:()=>Vo,rerouteArguments:()=>qu});var JK=Et(()=>{yf();qR();_K();jK();GK();WK();KK()});var pI={};Kt(pI,{Builtins:()=>GR,Cli:()=>as,Command:()=>nt,Option:()=>ge,UsageError:()=>it,formatMarkdownish:()=>Do,run:()=>QK,runExit:()=>kK});var qt=Et(()=>{rP();FR();Vp();TK();OK();JK()});var zK=_((xkt,iqe)=>{iqe.exports={name:"dotenv",version:"16.3.1",description:"Loads environment variables from .env file",main:"lib/main.js",types:"lib/main.d.ts",exports:{".":{types:"./lib/main.d.ts",require:"./lib/main.js",default:"./lib/main.js"},"./config":"./config.js","./config.js":"./config.js","./lib/env-options":"./lib/env-options.js","./lib/env-options.js":"./lib/env-options.js","./lib/cli-options":"./lib/cli-options.js","./lib/cli-options.js":"./lib/cli-options.js","./package.json":"./package.json"},scripts:{"dts-check":"tsc --project tests/types/tsconfig.json",lint:"standard","lint-readme":"standard-markdown",pretest:"npm run lint && npm run dts-check",test:"tap tests/*.js --100 -Rspec",prerelease:"npm test",release:"standard-version"},repository:{type:"git",url:"git://github.com/motdotla/dotenv.git"},funding:"https://github.com/motdotla/dotenv?sponsor=1",keywords:["dotenv","env",".env","environment","variables","config","settings"],readmeFilename:"README.md",license:"BSD-2-Clause",devDependencies:{"@definitelytyped/dtslint":"^0.0.133","@types/node":"^18.11.3",decache:"^4.6.1",sinon:"^14.0.1",standard:"^17.0.0","standard-markdown":"^7.1.0","standard-version":"^9.5.0",tap:"^16.3.0",tar:"^6.1.11",typescript:"^4.8.4"},engines:{node:">=12"},browser:{fs:!1}}});var eJ=_((bkt,Ef)=>{var XK=Be("fs"),WR=Be("path"),sqe=Be("os"),oqe=Be("crypto"),aqe=zK(),VR=aqe.version,lqe=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;function cqe(t){let e={},r=t.toString();r=r.replace(/\r\n?/mg,` +`);let o;for(;(o=lqe.exec(r))!=null;){let a=o[1],n=o[2]||"";n=n.trim();let u=n[0];n=n.replace(/^(['"`])([\s\S]*)\1$/mg,"$2"),u==='"'&&(n=n.replace(/\\n/g,` +`),n=n.replace(/\\r/g,"\r")),e[a]=n}return e}function uqe(t){let e=$K(t),r=xs.configDotenv({path:e});if(!r.parsed)throw new Error(`MISSING_DATA: Cannot parse ${e} for an unknown reason`);let o=ZK(t).split(","),a=o.length,n;for(let u=0;u=a)throw A}return xs.parse(n)}function Aqe(t){console.log(`[dotenv@${VR}][INFO] ${t}`)}function fqe(t){console.log(`[dotenv@${VR}][WARN] ${t}`)}function YR(t){console.log(`[dotenv@${VR}][DEBUG] ${t}`)}function ZK(t){return t&&t.DOTENV_KEY&&t.DOTENV_KEY.length>0?t.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:""}function pqe(t,e){let r;try{r=new URL(e)}catch(A){throw A.code==="ERR_INVALID_URL"?new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenv.org/vault/.env.vault?environment=development"):A}let o=r.password;if(!o)throw new Error("INVALID_DOTENV_KEY: Missing key part");let a=r.searchParams.get("environment");if(!a)throw new Error("INVALID_DOTENV_KEY: Missing environment part");let n=`DOTENV_VAULT_${a.toUpperCase()}`,u=t.parsed[n];if(!u)throw new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${n} in your .env.vault file.`);return{ciphertext:u,key:o}}function $K(t){let e=WR.resolve(process.cwd(),".env");return t&&t.path&&t.path.length>0&&(e=t.path),e.endsWith(".vault")?e:`${e}.vault`}function hqe(t){return t[0]==="~"?WR.join(sqe.homedir(),t.slice(1)):t}function gqe(t){Aqe("Loading env from encrypted .env.vault");let e=xs._parseVault(t),r=process.env;return t&&t.processEnv!=null&&(r=t.processEnv),xs.populate(r,e,t),{parsed:e}}function dqe(t){let e=WR.resolve(process.cwd(),".env"),r="utf8",o=Boolean(t&&t.debug);t&&(t.path!=null&&(e=hqe(t.path)),t.encoding!=null&&(r=t.encoding));try{let a=xs.parse(XK.readFileSync(e,{encoding:r})),n=process.env;return t&&t.processEnv!=null&&(n=t.processEnv),xs.populate(n,a,t),{parsed:a}}catch(a){return o&&YR(`Failed to load ${e} ${a.message}`),{error:a}}}function mqe(t){let e=$K(t);return ZK(t).length===0?xs.configDotenv(t):XK.existsSync(e)?xs._configVault(t):(fqe(`You set DOTENV_KEY but you are missing a .env.vault file at ${e}. Did you forget to build it?`),xs.configDotenv(t))}function yqe(t,e){let r=Buffer.from(e.slice(-64),"hex"),o=Buffer.from(t,"base64"),a=o.slice(0,12),n=o.slice(-16);o=o.slice(12,-16);try{let u=oqe.createDecipheriv("aes-256-gcm",r,a);return u.setAuthTag(n),`${u.update(o)}${u.final()}`}catch(u){let A=u instanceof RangeError,p=u.message==="Invalid key length",h=u.message==="Unsupported state or unable to authenticate data";if(A||p){let E="INVALID_DOTENV_KEY: It must be 64 characters long (or more)";throw new Error(E)}else if(h){let E="DECRYPTION_FAILED: Please check your DOTENV_KEY";throw new Error(E)}else throw console.error("Error: ",u.code),console.error("Error: ",u.message),u}}function Eqe(t,e,r={}){let o=Boolean(r&&r.debug),a=Boolean(r&&r.override);if(typeof e!="object")throw new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");for(let n of Object.keys(e))Object.prototype.hasOwnProperty.call(t,n)?(a===!0&&(t[n]=e[n]),o&&YR(a===!0?`"${n}" is already defined and WAS overwritten`:`"${n}" is already defined and was NOT overwritten`)):t[n]=e[n]}var xs={configDotenv:dqe,_configVault:gqe,_parseVault:uqe,config:mqe,decrypt:yqe,parse:cqe,populate:Eqe};Ef.exports.configDotenv=xs.configDotenv;Ef.exports._configVault=xs._configVault;Ef.exports._parseVault=xs._parseVault;Ef.exports.config=xs.config;Ef.exports.decrypt=xs.decrypt;Ef.exports.parse=xs.parse;Ef.exports.populate=xs.populate;Ef.exports=xs});var rJ=_((kkt,tJ)=>{"use strict";tJ.exports=(t,...e)=>new Promise(r=>{r(t(...e))})});var nd=_((Qkt,KR)=>{"use strict";var Cqe=rJ(),nJ=t=>{if(t<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],r=0,o=()=>{r--,e.length>0&&e.shift()()},a=(A,p,...h)=>{r++;let E=Cqe(A,...h);p(E),E.then(o,o)},n=(A,p,...h)=>{rnew Promise(h=>n(A,h,...p));return Object.defineProperties(u,{activeCount:{get:()=>r},pendingCount:{get:()=>e.length}}),u};KR.exports=nJ;KR.exports.default=nJ});function Wu(t){return`YN${t.toString(10).padStart(4,"0")}`}function fP(t){let e=Number(t.slice(2));if(typeof wr[e]>"u")throw new Error(`Unknown message name: "${t}"`);return e}var wr,pP=Et(()=>{wr=(Me=>(Me[Me.UNNAMED=0]="UNNAMED",Me[Me.EXCEPTION=1]="EXCEPTION",Me[Me.MISSING_PEER_DEPENDENCY=2]="MISSING_PEER_DEPENDENCY",Me[Me.CYCLIC_DEPENDENCIES=3]="CYCLIC_DEPENDENCIES",Me[Me.DISABLED_BUILD_SCRIPTS=4]="DISABLED_BUILD_SCRIPTS",Me[Me.BUILD_DISABLED=5]="BUILD_DISABLED",Me[Me.SOFT_LINK_BUILD=6]="SOFT_LINK_BUILD",Me[Me.MUST_BUILD=7]="MUST_BUILD",Me[Me.MUST_REBUILD=8]="MUST_REBUILD",Me[Me.BUILD_FAILED=9]="BUILD_FAILED",Me[Me.RESOLVER_NOT_FOUND=10]="RESOLVER_NOT_FOUND",Me[Me.FETCHER_NOT_FOUND=11]="FETCHER_NOT_FOUND",Me[Me.LINKER_NOT_FOUND=12]="LINKER_NOT_FOUND",Me[Me.FETCH_NOT_CACHED=13]="FETCH_NOT_CACHED",Me[Me.YARN_IMPORT_FAILED=14]="YARN_IMPORT_FAILED",Me[Me.REMOTE_INVALID=15]="REMOTE_INVALID",Me[Me.REMOTE_NOT_FOUND=16]="REMOTE_NOT_FOUND",Me[Me.RESOLUTION_PACK=17]="RESOLUTION_PACK",Me[Me.CACHE_CHECKSUM_MISMATCH=18]="CACHE_CHECKSUM_MISMATCH",Me[Me.UNUSED_CACHE_ENTRY=19]="UNUSED_CACHE_ENTRY",Me[Me.MISSING_LOCKFILE_ENTRY=20]="MISSING_LOCKFILE_ENTRY",Me[Me.WORKSPACE_NOT_FOUND=21]="WORKSPACE_NOT_FOUND",Me[Me.TOO_MANY_MATCHING_WORKSPACES=22]="TOO_MANY_MATCHING_WORKSPACES",Me[Me.CONSTRAINTS_MISSING_DEPENDENCY=23]="CONSTRAINTS_MISSING_DEPENDENCY",Me[Me.CONSTRAINTS_INCOMPATIBLE_DEPENDENCY=24]="CONSTRAINTS_INCOMPATIBLE_DEPENDENCY",Me[Me.CONSTRAINTS_EXTRANEOUS_DEPENDENCY=25]="CONSTRAINTS_EXTRANEOUS_DEPENDENCY",Me[Me.CONSTRAINTS_INVALID_DEPENDENCY=26]="CONSTRAINTS_INVALID_DEPENDENCY",Me[Me.CANT_SUGGEST_RESOLUTIONS=27]="CANT_SUGGEST_RESOLUTIONS",Me[Me.FROZEN_LOCKFILE_EXCEPTION=28]="FROZEN_LOCKFILE_EXCEPTION",Me[Me.CROSS_DRIVE_VIRTUAL_LOCAL=29]="CROSS_DRIVE_VIRTUAL_LOCAL",Me[Me.FETCH_FAILED=30]="FETCH_FAILED",Me[Me.DANGEROUS_NODE_MODULES=31]="DANGEROUS_NODE_MODULES",Me[Me.NODE_GYP_INJECTED=32]="NODE_GYP_INJECTED",Me[Me.AUTHENTICATION_NOT_FOUND=33]="AUTHENTICATION_NOT_FOUND",Me[Me.INVALID_CONFIGURATION_KEY=34]="INVALID_CONFIGURATION_KEY",Me[Me.NETWORK_ERROR=35]="NETWORK_ERROR",Me[Me.LIFECYCLE_SCRIPT=36]="LIFECYCLE_SCRIPT",Me[Me.CONSTRAINTS_MISSING_FIELD=37]="CONSTRAINTS_MISSING_FIELD",Me[Me.CONSTRAINTS_INCOMPATIBLE_FIELD=38]="CONSTRAINTS_INCOMPATIBLE_FIELD",Me[Me.CONSTRAINTS_EXTRANEOUS_FIELD=39]="CONSTRAINTS_EXTRANEOUS_FIELD",Me[Me.CONSTRAINTS_INVALID_FIELD=40]="CONSTRAINTS_INVALID_FIELD",Me[Me.AUTHENTICATION_INVALID=41]="AUTHENTICATION_INVALID",Me[Me.PROLOG_UNKNOWN_ERROR=42]="PROLOG_UNKNOWN_ERROR",Me[Me.PROLOG_SYNTAX_ERROR=43]="PROLOG_SYNTAX_ERROR",Me[Me.PROLOG_EXISTENCE_ERROR=44]="PROLOG_EXISTENCE_ERROR",Me[Me.STACK_OVERFLOW_RESOLUTION=45]="STACK_OVERFLOW_RESOLUTION",Me[Me.AUTOMERGE_FAILED_TO_PARSE=46]="AUTOMERGE_FAILED_TO_PARSE",Me[Me.AUTOMERGE_IMMUTABLE=47]="AUTOMERGE_IMMUTABLE",Me[Me.AUTOMERGE_SUCCESS=48]="AUTOMERGE_SUCCESS",Me[Me.AUTOMERGE_REQUIRED=49]="AUTOMERGE_REQUIRED",Me[Me.DEPRECATED_CLI_SETTINGS=50]="DEPRECATED_CLI_SETTINGS",Me[Me.PLUGIN_NAME_NOT_FOUND=51]="PLUGIN_NAME_NOT_FOUND",Me[Me.INVALID_PLUGIN_REFERENCE=52]="INVALID_PLUGIN_REFERENCE",Me[Me.CONSTRAINTS_AMBIGUITY=53]="CONSTRAINTS_AMBIGUITY",Me[Me.CACHE_OUTSIDE_PROJECT=54]="CACHE_OUTSIDE_PROJECT",Me[Me.IMMUTABLE_INSTALL=55]="IMMUTABLE_INSTALL",Me[Me.IMMUTABLE_CACHE=56]="IMMUTABLE_CACHE",Me[Me.INVALID_MANIFEST=57]="INVALID_MANIFEST",Me[Me.PACKAGE_PREPARATION_FAILED=58]="PACKAGE_PREPARATION_FAILED",Me[Me.INVALID_RANGE_PEER_DEPENDENCY=59]="INVALID_RANGE_PEER_DEPENDENCY",Me[Me.INCOMPATIBLE_PEER_DEPENDENCY=60]="INCOMPATIBLE_PEER_DEPENDENCY",Me[Me.DEPRECATED_PACKAGE=61]="DEPRECATED_PACKAGE",Me[Me.INCOMPATIBLE_OS=62]="INCOMPATIBLE_OS",Me[Me.INCOMPATIBLE_CPU=63]="INCOMPATIBLE_CPU",Me[Me.FROZEN_ARTIFACT_EXCEPTION=64]="FROZEN_ARTIFACT_EXCEPTION",Me[Me.TELEMETRY_NOTICE=65]="TELEMETRY_NOTICE",Me[Me.PATCH_HUNK_FAILED=66]="PATCH_HUNK_FAILED",Me[Me.INVALID_CONFIGURATION_VALUE=67]="INVALID_CONFIGURATION_VALUE",Me[Me.UNUSED_PACKAGE_EXTENSION=68]="UNUSED_PACKAGE_EXTENSION",Me[Me.REDUNDANT_PACKAGE_EXTENSION=69]="REDUNDANT_PACKAGE_EXTENSION",Me[Me.AUTO_NM_SUCCESS=70]="AUTO_NM_SUCCESS",Me[Me.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK=71]="NM_CANT_INSTALL_EXTERNAL_SOFT_LINK",Me[Me.NM_PRESERVE_SYMLINKS_REQUIRED=72]="NM_PRESERVE_SYMLINKS_REQUIRED",Me[Me.UPDATE_LOCKFILE_ONLY_SKIP_LINK=73]="UPDATE_LOCKFILE_ONLY_SKIP_LINK",Me[Me.NM_HARDLINKS_MODE_DOWNGRADED=74]="NM_HARDLINKS_MODE_DOWNGRADED",Me[Me.PROLOG_INSTANTIATION_ERROR=75]="PROLOG_INSTANTIATION_ERROR",Me[Me.INCOMPATIBLE_ARCHITECTURE=76]="INCOMPATIBLE_ARCHITECTURE",Me[Me.GHOST_ARCHITECTURE=77]="GHOST_ARCHITECTURE",Me[Me.RESOLUTION_MISMATCH=78]="RESOLUTION_MISMATCH",Me[Me.PROLOG_LIMIT_EXCEEDED=79]="PROLOG_LIMIT_EXCEEDED",Me[Me.NETWORK_DISABLED=80]="NETWORK_DISABLED",Me[Me.NETWORK_UNSAFE_HTTP=81]="NETWORK_UNSAFE_HTTP",Me[Me.RESOLUTION_FAILED=82]="RESOLUTION_FAILED",Me[Me.AUTOMERGE_GIT_ERROR=83]="AUTOMERGE_GIT_ERROR",Me[Me.CONSTRAINTS_CHECK_FAILED=84]="CONSTRAINTS_CHECK_FAILED",Me[Me.UPDATED_RESOLUTION_RECORD=85]="UPDATED_RESOLUTION_RECORD",Me[Me.EXPLAIN_PEER_DEPENDENCIES_CTA=86]="EXPLAIN_PEER_DEPENDENCIES_CTA",Me[Me.MIGRATION_SUCCESS=87]="MIGRATION_SUCCESS",Me[Me.VERSION_NOTICE=88]="VERSION_NOTICE",Me[Me.TIPS_NOTICE=89]="TIPS_NOTICE",Me[Me.OFFLINE_MODE_ENABLED=90]="OFFLINE_MODE_ENABLED",Me))(wr||{})});var hI=_((Tkt,iJ)=>{var wqe="2.0.0",Iqe=Number.MAX_SAFE_INTEGER||9007199254740991,Bqe=16,vqe=256-6,Dqe=["major","premajor","minor","preminor","patch","prepatch","prerelease"];iJ.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:Bqe,MAX_SAFE_BUILD_LENGTH:vqe,MAX_SAFE_INTEGER:Iqe,RELEASE_TYPES:Dqe,SEMVER_SPEC_VERSION:wqe,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var gI=_((Rkt,sJ)=>{var Pqe=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...t)=>console.error("SEMVER",...t):()=>{};sJ.exports=Pqe});var By=_((Cf,oJ)=>{var{MAX_SAFE_COMPONENT_LENGTH:JR,MAX_SAFE_BUILD_LENGTH:Sqe,MAX_LENGTH:xqe}=hI(),bqe=gI();Cf=oJ.exports={};var kqe=Cf.re=[],Qqe=Cf.safeRe=[],lr=Cf.src=[],cr=Cf.t={},Fqe=0,zR="[a-zA-Z0-9-]",Tqe=[["\\s",1],["\\d",xqe],[zR,Sqe]],Rqe=t=>{for(let[e,r]of Tqe)t=t.split(`${e}*`).join(`${e}{0,${r}}`).split(`${e}+`).join(`${e}{1,${r}}`);return t},Jr=(t,e,r)=>{let o=Rqe(e),a=Fqe++;bqe(t,a,e),cr[t]=a,lr[a]=e,kqe[a]=new RegExp(e,r?"g":void 0),Qqe[a]=new RegExp(o,r?"g":void 0)};Jr("NUMERICIDENTIFIER","0|[1-9]\\d*");Jr("NUMERICIDENTIFIERLOOSE","\\d+");Jr("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${zR}*`);Jr("MAINVERSION",`(${lr[cr.NUMERICIDENTIFIER]})\\.(${lr[cr.NUMERICIDENTIFIER]})\\.(${lr[cr.NUMERICIDENTIFIER]})`);Jr("MAINVERSIONLOOSE",`(${lr[cr.NUMERICIDENTIFIERLOOSE]})\\.(${lr[cr.NUMERICIDENTIFIERLOOSE]})\\.(${lr[cr.NUMERICIDENTIFIERLOOSE]})`);Jr("PRERELEASEIDENTIFIER",`(?:${lr[cr.NUMERICIDENTIFIER]}|${lr[cr.NONNUMERICIDENTIFIER]})`);Jr("PRERELEASEIDENTIFIERLOOSE",`(?:${lr[cr.NUMERICIDENTIFIERLOOSE]}|${lr[cr.NONNUMERICIDENTIFIER]})`);Jr("PRERELEASE",`(?:-(${lr[cr.PRERELEASEIDENTIFIER]}(?:\\.${lr[cr.PRERELEASEIDENTIFIER]})*))`);Jr("PRERELEASELOOSE",`(?:-?(${lr[cr.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${lr[cr.PRERELEASEIDENTIFIERLOOSE]})*))`);Jr("BUILDIDENTIFIER",`${zR}+`);Jr("BUILD",`(?:\\+(${lr[cr.BUILDIDENTIFIER]}(?:\\.${lr[cr.BUILDIDENTIFIER]})*))`);Jr("FULLPLAIN",`v?${lr[cr.MAINVERSION]}${lr[cr.PRERELEASE]}?${lr[cr.BUILD]}?`);Jr("FULL",`^${lr[cr.FULLPLAIN]}$`);Jr("LOOSEPLAIN",`[v=\\s]*${lr[cr.MAINVERSIONLOOSE]}${lr[cr.PRERELEASELOOSE]}?${lr[cr.BUILD]}?`);Jr("LOOSE",`^${lr[cr.LOOSEPLAIN]}$`);Jr("GTLT","((?:<|>)?=?)");Jr("XRANGEIDENTIFIERLOOSE",`${lr[cr.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);Jr("XRANGEIDENTIFIER",`${lr[cr.NUMERICIDENTIFIER]}|x|X|\\*`);Jr("XRANGEPLAIN",`[v=\\s]*(${lr[cr.XRANGEIDENTIFIER]})(?:\\.(${lr[cr.XRANGEIDENTIFIER]})(?:\\.(${lr[cr.XRANGEIDENTIFIER]})(?:${lr[cr.PRERELEASE]})?${lr[cr.BUILD]}?)?)?`);Jr("XRANGEPLAINLOOSE",`[v=\\s]*(${lr[cr.XRANGEIDENTIFIERLOOSE]})(?:\\.(${lr[cr.XRANGEIDENTIFIERLOOSE]})(?:\\.(${lr[cr.XRANGEIDENTIFIERLOOSE]})(?:${lr[cr.PRERELEASELOOSE]})?${lr[cr.BUILD]}?)?)?`);Jr("XRANGE",`^${lr[cr.GTLT]}\\s*${lr[cr.XRANGEPLAIN]}$`);Jr("XRANGELOOSE",`^${lr[cr.GTLT]}\\s*${lr[cr.XRANGEPLAINLOOSE]}$`);Jr("COERCE",`(^|[^\\d])(\\d{1,${JR}})(?:\\.(\\d{1,${JR}}))?(?:\\.(\\d{1,${JR}}))?(?:$|[^\\d])`);Jr("COERCERTL",lr[cr.COERCE],!0);Jr("LONETILDE","(?:~>?)");Jr("TILDETRIM",`(\\s*)${lr[cr.LONETILDE]}\\s+`,!0);Cf.tildeTrimReplace="$1~";Jr("TILDE",`^${lr[cr.LONETILDE]}${lr[cr.XRANGEPLAIN]}$`);Jr("TILDELOOSE",`^${lr[cr.LONETILDE]}${lr[cr.XRANGEPLAINLOOSE]}$`);Jr("LONECARET","(?:\\^)");Jr("CARETTRIM",`(\\s*)${lr[cr.LONECARET]}\\s+`,!0);Cf.caretTrimReplace="$1^";Jr("CARET",`^${lr[cr.LONECARET]}${lr[cr.XRANGEPLAIN]}$`);Jr("CARETLOOSE",`^${lr[cr.LONECARET]}${lr[cr.XRANGEPLAINLOOSE]}$`);Jr("COMPARATORLOOSE",`^${lr[cr.GTLT]}\\s*(${lr[cr.LOOSEPLAIN]})$|^$`);Jr("COMPARATOR",`^${lr[cr.GTLT]}\\s*(${lr[cr.FULLPLAIN]})$|^$`);Jr("COMPARATORTRIM",`(\\s*)${lr[cr.GTLT]}\\s*(${lr[cr.LOOSEPLAIN]}|${lr[cr.XRANGEPLAIN]})`,!0);Cf.comparatorTrimReplace="$1$2$3";Jr("HYPHENRANGE",`^\\s*(${lr[cr.XRANGEPLAIN]})\\s+-\\s+(${lr[cr.XRANGEPLAIN]})\\s*$`);Jr("HYPHENRANGELOOSE",`^\\s*(${lr[cr.XRANGEPLAINLOOSE]})\\s+-\\s+(${lr[cr.XRANGEPLAINLOOSE]})\\s*$`);Jr("STAR","(<|>)?=?\\s*\\*");Jr("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");Jr("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var hP=_((Nkt,aJ)=>{var Nqe=Object.freeze({loose:!0}),Lqe=Object.freeze({}),Mqe=t=>t?typeof t!="object"?Nqe:t:Lqe;aJ.exports=Mqe});var XR=_((Lkt,uJ)=>{var lJ=/^[0-9]+$/,cJ=(t,e)=>{let r=lJ.test(t),o=lJ.test(e);return r&&o&&(t=+t,e=+e),t===e?0:r&&!o?-1:o&&!r?1:tcJ(e,t);uJ.exports={compareIdentifiers:cJ,rcompareIdentifiers:Oqe}});var Po=_((Mkt,hJ)=>{var gP=gI(),{MAX_LENGTH:AJ,MAX_SAFE_INTEGER:dP}=hI(),{safeRe:fJ,t:pJ}=By(),Uqe=hP(),{compareIdentifiers:vy}=XR(),tl=class{constructor(e,r){if(r=Uqe(r),e instanceof tl){if(e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof e}".`);if(e.length>AJ)throw new TypeError(`version is longer than ${AJ} characters`);gP("SemVer",e,r),this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease;let o=e.trim().match(r.loose?fJ[pJ.LOOSE]:fJ[pJ.FULL]);if(!o)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+o[1],this.minor=+o[2],this.patch=+o[3],this.major>dP||this.major<0)throw new TypeError("Invalid major version");if(this.minor>dP||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>dP||this.patch<0)throw new TypeError("Invalid patch version");o[4]?this.prerelease=o[4].split(".").map(a=>{if(/^[0-9]+$/.test(a)){let n=+a;if(n>=0&&n=0;)typeof this.prerelease[n]=="number"&&(this.prerelease[n]++,n=-2);if(n===-1){if(r===this.prerelease.join(".")&&o===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(a)}}if(r){let n=[r,a];o===!1&&(n=[r]),vy(this.prerelease[0],r)===0?isNaN(this.prerelease[1])&&(this.prerelease=n):this.prerelease=n}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};hJ.exports=tl});var id=_((Okt,dJ)=>{var gJ=Po(),_qe=(t,e,r=!1)=>{if(t instanceof gJ)return t;try{return new gJ(t,e)}catch(o){if(!r)return null;throw o}};dJ.exports=_qe});var yJ=_((Ukt,mJ)=>{var Hqe=id(),jqe=(t,e)=>{let r=Hqe(t,e);return r?r.version:null};mJ.exports=jqe});var CJ=_((_kt,EJ)=>{var qqe=id(),Gqe=(t,e)=>{let r=qqe(t.trim().replace(/^[=v]+/,""),e);return r?r.version:null};EJ.exports=Gqe});var BJ=_((Hkt,IJ)=>{var wJ=Po(),Yqe=(t,e,r,o,a)=>{typeof r=="string"&&(a=o,o=r,r=void 0);try{return new wJ(t instanceof wJ?t.version:t,r).inc(e,o,a).version}catch{return null}};IJ.exports=Yqe});var PJ=_((jkt,DJ)=>{var vJ=id(),Wqe=(t,e)=>{let r=vJ(t,null,!0),o=vJ(e,null,!0),a=r.compare(o);if(a===0)return null;let n=a>0,u=n?r:o,A=n?o:r,p=!!u.prerelease.length;if(!!A.prerelease.length&&!p)return!A.patch&&!A.minor?"major":u.patch?"patch":u.minor?"minor":"major";let E=p?"pre":"";return r.major!==o.major?E+"major":r.minor!==o.minor?E+"minor":r.patch!==o.patch?E+"patch":"prerelease"};DJ.exports=Wqe});var xJ=_((qkt,SJ)=>{var Vqe=Po(),Kqe=(t,e)=>new Vqe(t,e).major;SJ.exports=Kqe});var kJ=_((Gkt,bJ)=>{var Jqe=Po(),zqe=(t,e)=>new Jqe(t,e).minor;bJ.exports=zqe});var FJ=_((Ykt,QJ)=>{var Xqe=Po(),Zqe=(t,e)=>new Xqe(t,e).patch;QJ.exports=Zqe});var RJ=_((Wkt,TJ)=>{var $qe=id(),eGe=(t,e)=>{let r=$qe(t,e);return r&&r.prerelease.length?r.prerelease:null};TJ.exports=eGe});var Ll=_((Vkt,LJ)=>{var NJ=Po(),tGe=(t,e,r)=>new NJ(t,r).compare(new NJ(e,r));LJ.exports=tGe});var OJ=_((Kkt,MJ)=>{var rGe=Ll(),nGe=(t,e,r)=>rGe(e,t,r);MJ.exports=nGe});var _J=_((Jkt,UJ)=>{var iGe=Ll(),sGe=(t,e)=>iGe(t,e,!0);UJ.exports=sGe});var mP=_((zkt,jJ)=>{var HJ=Po(),oGe=(t,e,r)=>{let o=new HJ(t,r),a=new HJ(e,r);return o.compare(a)||o.compareBuild(a)};jJ.exports=oGe});var GJ=_((Xkt,qJ)=>{var aGe=mP(),lGe=(t,e)=>t.sort((r,o)=>aGe(r,o,e));qJ.exports=lGe});var WJ=_((Zkt,YJ)=>{var cGe=mP(),uGe=(t,e)=>t.sort((r,o)=>cGe(o,r,e));YJ.exports=uGe});var dI=_(($kt,VJ)=>{var AGe=Ll(),fGe=(t,e,r)=>AGe(t,e,r)>0;VJ.exports=fGe});var yP=_((eQt,KJ)=>{var pGe=Ll(),hGe=(t,e,r)=>pGe(t,e,r)<0;KJ.exports=hGe});var ZR=_((tQt,JJ)=>{var gGe=Ll(),dGe=(t,e,r)=>gGe(t,e,r)===0;JJ.exports=dGe});var $R=_((rQt,zJ)=>{var mGe=Ll(),yGe=(t,e,r)=>mGe(t,e,r)!==0;zJ.exports=yGe});var EP=_((nQt,XJ)=>{var EGe=Ll(),CGe=(t,e,r)=>EGe(t,e,r)>=0;XJ.exports=CGe});var CP=_((iQt,ZJ)=>{var wGe=Ll(),IGe=(t,e,r)=>wGe(t,e,r)<=0;ZJ.exports=IGe});var eN=_((sQt,$J)=>{var BGe=ZR(),vGe=$R(),DGe=dI(),PGe=EP(),SGe=yP(),xGe=CP(),bGe=(t,e,r,o)=>{switch(e){case"===":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t===r;case"!==":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t!==r;case"":case"=":case"==":return BGe(t,r,o);case"!=":return vGe(t,r,o);case">":return DGe(t,r,o);case">=":return PGe(t,r,o);case"<":return SGe(t,r,o);case"<=":return xGe(t,r,o);default:throw new TypeError(`Invalid operator: ${e}`)}};$J.exports=bGe});var tz=_((oQt,ez)=>{var kGe=Po(),QGe=id(),{safeRe:wP,t:IP}=By(),FGe=(t,e)=>{if(t instanceof kGe)return t;if(typeof t=="number"&&(t=String(t)),typeof t!="string")return null;e=e||{};let r=null;if(!e.rtl)r=t.match(wP[IP.COERCE]);else{let o;for(;(o=wP[IP.COERCERTL].exec(t))&&(!r||r.index+r[0].length!==t.length);)(!r||o.index+o[0].length!==r.index+r[0].length)&&(r=o),wP[IP.COERCERTL].lastIndex=o.index+o[1].length+o[2].length;wP[IP.COERCERTL].lastIndex=-1}return r===null?null:QGe(`${r[2]}.${r[3]||"0"}.${r[4]||"0"}`,e)};ez.exports=FGe});var nz=_((aQt,rz)=>{"use strict";rz.exports=function(t){t.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var BP=_((lQt,iz)=>{"use strict";iz.exports=Cn;Cn.Node=sd;Cn.create=Cn;function Cn(t){var e=this;if(e instanceof Cn||(e=new Cn),e.tail=null,e.head=null,e.length=0,t&&typeof t.forEach=="function")t.forEach(function(a){e.push(a)});else if(arguments.length>0)for(var r=0,o=arguments.length;r1)r=e;else if(this.head)o=this.head.next,r=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=0;o!==null;a++)r=t(r,o.value,a),o=o.next;return r};Cn.prototype.reduceReverse=function(t,e){var r,o=this.tail;if(arguments.length>1)r=e;else if(this.tail)o=this.tail.prev,r=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=this.length-1;o!==null;a--)r=t(r,o.value,a),o=o.prev;return r};Cn.prototype.toArray=function(){for(var t=new Array(this.length),e=0,r=this.head;r!==null;e++)t[e]=r.value,r=r.next;return t};Cn.prototype.toArrayReverse=function(){for(var t=new Array(this.length),e=0,r=this.tail;r!==null;e++)t[e]=r.value,r=r.prev;return t};Cn.prototype.slice=function(t,e){e=e||this.length,e<0&&(e+=this.length),t=t||0,t<0&&(t+=this.length);var r=new Cn;if(ethis.length&&(e=this.length);for(var o=0,a=this.head;a!==null&&othis.length&&(e=this.length);for(var o=this.length,a=this.tail;a!==null&&o>e;o--)a=a.prev;for(;a!==null&&o>t;o--,a=a.prev)r.push(a.value);return r};Cn.prototype.splice=function(t,e,...r){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);for(var o=0,a=this.head;a!==null&&o{"use strict";var LGe=BP(),od=Symbol("max"),If=Symbol("length"),Dy=Symbol("lengthCalculator"),yI=Symbol("allowStale"),ad=Symbol("maxAge"),wf=Symbol("dispose"),sz=Symbol("noDisposeOnSet"),bs=Symbol("lruList"),Oc=Symbol("cache"),az=Symbol("updateAgeOnGet"),tN=()=>1,nN=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let r=this[od]=e.max||1/0,o=e.length||tN;if(this[Dy]=typeof o!="function"?tN:o,this[yI]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[ad]=e.maxAge||0,this[wf]=e.dispose,this[sz]=e.noDisposeOnSet||!1,this[az]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[od]=e||1/0,mI(this)}get max(){return this[od]}set allowStale(e){this[yI]=!!e}get allowStale(){return this[yI]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[ad]=e,mI(this)}get maxAge(){return this[ad]}set lengthCalculator(e){typeof e!="function"&&(e=tN),e!==this[Dy]&&(this[Dy]=e,this[If]=0,this[bs].forEach(r=>{r.length=this[Dy](r.value,r.key),this[If]+=r.length})),mI(this)}get lengthCalculator(){return this[Dy]}get length(){return this[If]}get itemCount(){return this[bs].length}rforEach(e,r){r=r||this;for(let o=this[bs].tail;o!==null;){let a=o.prev;oz(this,e,o,r),o=a}}forEach(e,r){r=r||this;for(let o=this[bs].head;o!==null;){let a=o.next;oz(this,e,o,r),o=a}}keys(){return this[bs].toArray().map(e=>e.key)}values(){return this[bs].toArray().map(e=>e.value)}reset(){this[wf]&&this[bs]&&this[bs].length&&this[bs].forEach(e=>this[wf](e.key,e.value)),this[Oc]=new Map,this[bs]=new LGe,this[If]=0}dump(){return this[bs].map(e=>vP(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[bs]}set(e,r,o){if(o=o||this[ad],o&&typeof o!="number")throw new TypeError("maxAge must be a number");let a=o?Date.now():0,n=this[Dy](r,e);if(this[Oc].has(e)){if(n>this[od])return Py(this,this[Oc].get(e)),!1;let p=this[Oc].get(e).value;return this[wf]&&(this[sz]||this[wf](e,p.value)),p.now=a,p.maxAge=o,p.value=r,this[If]+=n-p.length,p.length=n,this.get(e),mI(this),!0}let u=new iN(e,r,n,a,o);return u.length>this[od]?(this[wf]&&this[wf](e,r),!1):(this[If]+=u.length,this[bs].unshift(u),this[Oc].set(e,this[bs].head),mI(this),!0)}has(e){if(!this[Oc].has(e))return!1;let r=this[Oc].get(e).value;return!vP(this,r)}get(e){return rN(this,e,!0)}peek(e){return rN(this,e,!1)}pop(){let e=this[bs].tail;return e?(Py(this,e),e.value):null}del(e){Py(this,this[Oc].get(e))}load(e){this.reset();let r=Date.now();for(let o=e.length-1;o>=0;o--){let a=e[o],n=a.e||0;if(n===0)this.set(a.k,a.v);else{let u=n-r;u>0&&this.set(a.k,a.v,u)}}}prune(){this[Oc].forEach((e,r)=>rN(this,r,!1))}},rN=(t,e,r)=>{let o=t[Oc].get(e);if(o){let a=o.value;if(vP(t,a)){if(Py(t,o),!t[yI])return}else r&&(t[az]&&(o.value.now=Date.now()),t[bs].unshiftNode(o));return a.value}},vP=(t,e)=>{if(!e||!e.maxAge&&!t[ad])return!1;let r=Date.now()-e.now;return e.maxAge?r>e.maxAge:t[ad]&&r>t[ad]},mI=t=>{if(t[If]>t[od])for(let e=t[bs].tail;t[If]>t[od]&&e!==null;){let r=e.prev;Py(t,e),e=r}},Py=(t,e)=>{if(e){let r=e.value;t[wf]&&t[wf](r.key,r.value),t[If]-=r.length,t[Oc].delete(r.key),t[bs].removeNode(e)}},iN=class{constructor(e,r,o,a,n){this.key=e,this.value=r,this.length=o,this.now=a,this.maxAge=n||0}},oz=(t,e,r,o)=>{let a=r.value;vP(t,a)&&(Py(t,r),t[yI]||(a=void 0)),a&&e.call(o,a.value,a.key,t)};lz.exports=nN});var Ml=_((uQt,pz)=>{var ld=class{constructor(e,r){if(r=OGe(r),e instanceof ld)return e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease?e:new ld(e.raw,r);if(e instanceof sN)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease,this.raw=e.trim().split(/\s+/).join(" "),this.set=this.raw.split("||").map(o=>this.parseRange(o.trim())).filter(o=>o.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let o=this.set[0];if(this.set=this.set.filter(a=>!Az(a[0])),this.set.length===0)this.set=[o];else if(this.set.length>1){for(let a of this.set)if(a.length===1&&YGe(a[0])){this.set=[a];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){let o=((this.options.includePrerelease&&qGe)|(this.options.loose&&GGe))+":"+e,a=uz.get(o);if(a)return a;let n=this.options.loose,u=n?Da[zo.HYPHENRANGELOOSE]:Da[zo.HYPHENRANGE];e=e.replace(u,t5e(this.options.includePrerelease)),ci("hyphen replace",e),e=e.replace(Da[zo.COMPARATORTRIM],_Ge),ci("comparator trim",e),e=e.replace(Da[zo.TILDETRIM],HGe),ci("tilde trim",e),e=e.replace(Da[zo.CARETTRIM],jGe),ci("caret trim",e);let A=e.split(" ").map(I=>WGe(I,this.options)).join(" ").split(/\s+/).map(I=>e5e(I,this.options));n&&(A=A.filter(I=>(ci("loose invalid filter",I,this.options),!!I.match(Da[zo.COMPARATORLOOSE])))),ci("range list",A);let p=new Map,h=A.map(I=>new sN(I,this.options));for(let I of h){if(Az(I))return[I];p.set(I.value,I)}p.size>1&&p.has("")&&p.delete("");let E=[...p.values()];return uz.set(o,E),E}intersects(e,r){if(!(e instanceof ld))throw new TypeError("a Range is required");return this.set.some(o=>fz(o,r)&&e.set.some(a=>fz(a,r)&&o.every(n=>a.every(u=>n.intersects(u,r)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new UGe(e,this.options)}catch{return!1}for(let r=0;rt.value==="<0.0.0-0",YGe=t=>t.value==="",fz=(t,e)=>{let r=!0,o=t.slice(),a=o.pop();for(;r&&o.length;)r=o.every(n=>a.intersects(n,e)),a=o.pop();return r},WGe=(t,e)=>(ci("comp",t,e),t=JGe(t,e),ci("caret",t),t=VGe(t,e),ci("tildes",t),t=XGe(t,e),ci("xrange",t),t=$Ge(t,e),ci("stars",t),t),Xo=t=>!t||t.toLowerCase()==="x"||t==="*",VGe=(t,e)=>t.trim().split(/\s+/).map(r=>KGe(r,e)).join(" "),KGe=(t,e)=>{let r=e.loose?Da[zo.TILDELOOSE]:Da[zo.TILDE];return t.replace(r,(o,a,n,u,A)=>{ci("tilde",t,o,a,n,u,A);let p;return Xo(a)?p="":Xo(n)?p=`>=${a}.0.0 <${+a+1}.0.0-0`:Xo(u)?p=`>=${a}.${n}.0 <${a}.${+n+1}.0-0`:A?(ci("replaceTilde pr",A),p=`>=${a}.${n}.${u}-${A} <${a}.${+n+1}.0-0`):p=`>=${a}.${n}.${u} <${a}.${+n+1}.0-0`,ci("tilde return",p),p})},JGe=(t,e)=>t.trim().split(/\s+/).map(r=>zGe(r,e)).join(" "),zGe=(t,e)=>{ci("caret",t,e);let r=e.loose?Da[zo.CARETLOOSE]:Da[zo.CARET],o=e.includePrerelease?"-0":"";return t.replace(r,(a,n,u,A,p)=>{ci("caret",t,a,n,u,A,p);let h;return Xo(n)?h="":Xo(u)?h=`>=${n}.0.0${o} <${+n+1}.0.0-0`:Xo(A)?n==="0"?h=`>=${n}.${u}.0${o} <${n}.${+u+1}.0-0`:h=`>=${n}.${u}.0${o} <${+n+1}.0.0-0`:p?(ci("replaceCaret pr",p),n==="0"?u==="0"?h=`>=${n}.${u}.${A}-${p} <${n}.${u}.${+A+1}-0`:h=`>=${n}.${u}.${A}-${p} <${n}.${+u+1}.0-0`:h=`>=${n}.${u}.${A}-${p} <${+n+1}.0.0-0`):(ci("no pr"),n==="0"?u==="0"?h=`>=${n}.${u}.${A}${o} <${n}.${u}.${+A+1}-0`:h=`>=${n}.${u}.${A}${o} <${n}.${+u+1}.0-0`:h=`>=${n}.${u}.${A} <${+n+1}.0.0-0`),ci("caret return",h),h})},XGe=(t,e)=>(ci("replaceXRanges",t,e),t.split(/\s+/).map(r=>ZGe(r,e)).join(" ")),ZGe=(t,e)=>{t=t.trim();let r=e.loose?Da[zo.XRANGELOOSE]:Da[zo.XRANGE];return t.replace(r,(o,a,n,u,A,p)=>{ci("xRange",t,o,a,n,u,A,p);let h=Xo(n),E=h||Xo(u),I=E||Xo(A),v=I;return a==="="&&v&&(a=""),p=e.includePrerelease?"-0":"",h?a===">"||a==="<"?o="<0.0.0-0":o="*":a&&v?(E&&(u=0),A=0,a===">"?(a=">=",E?(n=+n+1,u=0,A=0):(u=+u+1,A=0)):a==="<="&&(a="<",E?n=+n+1:u=+u+1),a==="<"&&(p="-0"),o=`${a+n}.${u}.${A}${p}`):E?o=`>=${n}.0.0${p} <${+n+1}.0.0-0`:I&&(o=`>=${n}.${u}.0${p} <${n}.${+u+1}.0-0`),ci("xRange return",o),o})},$Ge=(t,e)=>(ci("replaceStars",t,e),t.trim().replace(Da[zo.STAR],"")),e5e=(t,e)=>(ci("replaceGTE0",t,e),t.trim().replace(Da[e.includePrerelease?zo.GTE0PRE:zo.GTE0],"")),t5e=t=>(e,r,o,a,n,u,A,p,h,E,I,v,b)=>(Xo(o)?r="":Xo(a)?r=`>=${o}.0.0${t?"-0":""}`:Xo(n)?r=`>=${o}.${a}.0${t?"-0":""}`:u?r=`>=${r}`:r=`>=${r}${t?"-0":""}`,Xo(h)?p="":Xo(E)?p=`<${+h+1}.0.0-0`:Xo(I)?p=`<${h}.${+E+1}.0-0`:v?p=`<=${h}.${E}.${I}-${v}`:t?p=`<${h}.${E}.${+I+1}-0`:p=`<=${p}`,`${r} ${p}`.trim()),r5e=(t,e,r)=>{for(let o=0;o0){let a=t[o].semver;if(a.major===e.major&&a.minor===e.minor&&a.patch===e.patch)return!0}return!1}return!0}});var EI=_((AQt,Ez)=>{var CI=Symbol("SemVer ANY"),Sy=class{static get ANY(){return CI}constructor(e,r){if(r=hz(r),e instanceof Sy){if(e.loose===!!r.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),aN("comparator",e,r),this.options=r,this.loose=!!r.loose,this.parse(e),this.semver===CI?this.value="":this.value=this.operator+this.semver.version,aN("comp",this)}parse(e){let r=this.options.loose?gz[dz.COMPARATORLOOSE]:gz[dz.COMPARATOR],o=e.match(r);if(!o)throw new TypeError(`Invalid comparator: ${e}`);this.operator=o[1]!==void 0?o[1]:"",this.operator==="="&&(this.operator=""),o[2]?this.semver=new mz(o[2],this.options.loose):this.semver=CI}toString(){return this.value}test(e){if(aN("Comparator.test",e,this.options.loose),this.semver===CI||e===CI)return!0;if(typeof e=="string")try{e=new mz(e,this.options)}catch{return!1}return oN(e,this.operator,this.semver,this.options)}intersects(e,r){if(!(e instanceof Sy))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new yz(e.value,r).test(this.value):e.operator===""?e.value===""?!0:new yz(this.value,r).test(e.semver):(r=hz(r),r.includePrerelease&&(this.value==="<0.0.0-0"||e.value==="<0.0.0-0")||!r.includePrerelease&&(this.value.startsWith("<0.0.0")||e.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&e.operator.startsWith(">")||this.operator.startsWith("<")&&e.operator.startsWith("<")||this.semver.version===e.semver.version&&this.operator.includes("=")&&e.operator.includes("=")||oN(this.semver,"<",e.semver,r)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||oN(this.semver,">",e.semver,r)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};Ez.exports=Sy;var hz=hP(),{safeRe:gz,t:dz}=By(),oN=eN(),aN=gI(),mz=Po(),yz=Ml()});var wI=_((fQt,Cz)=>{var n5e=Ml(),i5e=(t,e,r)=>{try{e=new n5e(e,r)}catch{return!1}return e.test(t)};Cz.exports=i5e});var Iz=_((pQt,wz)=>{var s5e=Ml(),o5e=(t,e)=>new s5e(t,e).set.map(r=>r.map(o=>o.value).join(" ").trim().split(" "));wz.exports=o5e});var vz=_((hQt,Bz)=>{var a5e=Po(),l5e=Ml(),c5e=(t,e,r)=>{let o=null,a=null,n=null;try{n=new l5e(e,r)}catch{return null}return t.forEach(u=>{n.test(u)&&(!o||a.compare(u)===-1)&&(o=u,a=new a5e(o,r))}),o};Bz.exports=c5e});var Pz=_((gQt,Dz)=>{var u5e=Po(),A5e=Ml(),f5e=(t,e,r)=>{let o=null,a=null,n=null;try{n=new A5e(e,r)}catch{return null}return t.forEach(u=>{n.test(u)&&(!o||a.compare(u)===1)&&(o=u,a=new u5e(o,r))}),o};Dz.exports=f5e});var bz=_((dQt,xz)=>{var lN=Po(),p5e=Ml(),Sz=dI(),h5e=(t,e)=>{t=new p5e(t,e);let r=new lN("0.0.0");if(t.test(r)||(r=new lN("0.0.0-0"),t.test(r)))return r;r=null;for(let o=0;o{let A=new lN(u.semver.version);switch(u.operator){case">":A.prerelease.length===0?A.patch++:A.prerelease.push(0),A.raw=A.format();case"":case">=":(!n||Sz(A,n))&&(n=A);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${u.operator}`)}}),n&&(!r||Sz(r,n))&&(r=n)}return r&&t.test(r)?r:null};xz.exports=h5e});var Qz=_((mQt,kz)=>{var g5e=Ml(),d5e=(t,e)=>{try{return new g5e(t,e).range||"*"}catch{return null}};kz.exports=d5e});var DP=_((yQt,Nz)=>{var m5e=Po(),Rz=EI(),{ANY:y5e}=Rz,E5e=Ml(),C5e=wI(),Fz=dI(),Tz=yP(),w5e=CP(),I5e=EP(),B5e=(t,e,r,o)=>{t=new m5e(t,o),e=new E5e(e,o);let a,n,u,A,p;switch(r){case">":a=Fz,n=w5e,u=Tz,A=">",p=">=";break;case"<":a=Tz,n=I5e,u=Fz,A="<",p="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(C5e(t,e,o))return!1;for(let h=0;h{b.semver===y5e&&(b=new Rz(">=0.0.0")),I=I||b,v=v||b,a(b.semver,I.semver,o)?I=b:u(b.semver,v.semver,o)&&(v=b)}),I.operator===A||I.operator===p||(!v.operator||v.operator===A)&&n(t,v.semver))return!1;if(v.operator===p&&u(t,v.semver))return!1}return!0};Nz.exports=B5e});var Mz=_((EQt,Lz)=>{var v5e=DP(),D5e=(t,e,r)=>v5e(t,e,">",r);Lz.exports=D5e});var Uz=_((CQt,Oz)=>{var P5e=DP(),S5e=(t,e,r)=>P5e(t,e,"<",r);Oz.exports=S5e});var jz=_((wQt,Hz)=>{var _z=Ml(),x5e=(t,e,r)=>(t=new _z(t,r),e=new _z(e,r),t.intersects(e,r));Hz.exports=x5e});var Gz=_((IQt,qz)=>{var b5e=wI(),k5e=Ll();qz.exports=(t,e,r)=>{let o=[],a=null,n=null,u=t.sort((E,I)=>k5e(E,I,r));for(let E of u)b5e(E,e,r)?(n=E,a||(a=E)):(n&&o.push([a,n]),n=null,a=null);a&&o.push([a,null]);let A=[];for(let[E,I]of o)E===I?A.push(E):!I&&E===u[0]?A.push("*"):I?E===u[0]?A.push(`<=${I}`):A.push(`${E} - ${I}`):A.push(`>=${E}`);let p=A.join(" || "),h=typeof e.raw=="string"?e.raw:String(e);return p.length{var Yz=Ml(),uN=EI(),{ANY:cN}=uN,II=wI(),AN=Ll(),Q5e=(t,e,r={})=>{if(t===e)return!0;t=new Yz(t,r),e=new Yz(e,r);let o=!1;e:for(let a of t.set){for(let n of e.set){let u=T5e(a,n,r);if(o=o||u!==null,u)continue e}if(o)return!1}return!0},F5e=[new uN(">=0.0.0-0")],Wz=[new uN(">=0.0.0")],T5e=(t,e,r)=>{if(t===e)return!0;if(t.length===1&&t[0].semver===cN){if(e.length===1&&e[0].semver===cN)return!0;r.includePrerelease?t=F5e:t=Wz}if(e.length===1&&e[0].semver===cN){if(r.includePrerelease)return!0;e=Wz}let o=new Set,a,n;for(let b of t)b.operator===">"||b.operator===">="?a=Vz(a,b,r):b.operator==="<"||b.operator==="<="?n=Kz(n,b,r):o.add(b.semver);if(o.size>1)return null;let u;if(a&&n){if(u=AN(a.semver,n.semver,r),u>0)return null;if(u===0&&(a.operator!==">="||n.operator!=="<="))return null}for(let b of o){if(a&&!II(b,String(a),r)||n&&!II(b,String(n),r))return null;for(let C of e)if(!II(b,String(C),r))return!1;return!0}let A,p,h,E,I=n&&!r.includePrerelease&&n.semver.prerelease.length?n.semver:!1,v=a&&!r.includePrerelease&&a.semver.prerelease.length?a.semver:!1;I&&I.prerelease.length===1&&n.operator==="<"&&I.prerelease[0]===0&&(I=!1);for(let b of e){if(E=E||b.operator===">"||b.operator===">=",h=h||b.operator==="<"||b.operator==="<=",a){if(v&&b.semver.prerelease&&b.semver.prerelease.length&&b.semver.major===v.major&&b.semver.minor===v.minor&&b.semver.patch===v.patch&&(v=!1),b.operator===">"||b.operator===">="){if(A=Vz(a,b,r),A===b&&A!==a)return!1}else if(a.operator===">="&&!II(a.semver,String(b),r))return!1}if(n){if(I&&b.semver.prerelease&&b.semver.prerelease.length&&b.semver.major===I.major&&b.semver.minor===I.minor&&b.semver.patch===I.patch&&(I=!1),b.operator==="<"||b.operator==="<="){if(p=Kz(n,b,r),p===b&&p!==n)return!1}else if(n.operator==="<="&&!II(n.semver,String(b),r))return!1}if(!b.operator&&(n||a)&&u!==0)return!1}return!(a&&h&&!n&&u!==0||n&&E&&!a&&u!==0||v||I)},Vz=(t,e,r)=>{if(!t)return e;let o=AN(t.semver,e.semver,r);return o>0?t:o<0||e.operator===">"&&t.operator===">="?e:t},Kz=(t,e,r)=>{if(!t)return e;let o=AN(t.semver,e.semver,r);return o<0?t:o>0||e.operator==="<"&&t.operator==="<="?e:t};Jz.exports=Q5e});var zn=_((vQt,$z)=>{var fN=By(),Xz=hI(),R5e=Po(),Zz=XR(),N5e=id(),L5e=yJ(),M5e=CJ(),O5e=BJ(),U5e=PJ(),_5e=xJ(),H5e=kJ(),j5e=FJ(),q5e=RJ(),G5e=Ll(),Y5e=OJ(),W5e=_J(),V5e=mP(),K5e=GJ(),J5e=WJ(),z5e=dI(),X5e=yP(),Z5e=ZR(),$5e=$R(),e9e=EP(),t9e=CP(),r9e=eN(),n9e=tz(),i9e=EI(),s9e=Ml(),o9e=wI(),a9e=Iz(),l9e=vz(),c9e=Pz(),u9e=bz(),A9e=Qz(),f9e=DP(),p9e=Mz(),h9e=Uz(),g9e=jz(),d9e=Gz(),m9e=zz();$z.exports={parse:N5e,valid:L5e,clean:M5e,inc:O5e,diff:U5e,major:_5e,minor:H5e,patch:j5e,prerelease:q5e,compare:G5e,rcompare:Y5e,compareLoose:W5e,compareBuild:V5e,sort:K5e,rsort:J5e,gt:z5e,lt:X5e,eq:Z5e,neq:$5e,gte:e9e,lte:t9e,cmp:r9e,coerce:n9e,Comparator:i9e,Range:s9e,satisfies:o9e,toComparators:a9e,maxSatisfying:l9e,minSatisfying:c9e,minVersion:u9e,validRange:A9e,outside:f9e,gtr:p9e,ltr:h9e,intersects:g9e,simplifyRange:d9e,subset:m9e,SemVer:R5e,re:fN.re,src:fN.src,tokens:fN.t,SEMVER_SPEC_VERSION:Xz.SEMVER_SPEC_VERSION,RELEASE_TYPES:Xz.RELEASE_TYPES,compareIdentifiers:Zz.compareIdentifiers,rcompareIdentifiers:Zz.rcompareIdentifiers}});var tX=_((DQt,eX)=>{"use strict";function y9e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function cd(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,cd)}y9e(cd,Error);cd.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",I;for(I=0;I0){for(I=1,v=1;I{switch(Ne[1]){case"|":return Se|Ne[3];case"&":return Se&Ne[3];case"^":return Se^Ne[3]}},Z)},v="!",b=Re("!",!1),C=function(Z){return!Z},T="(",L=Re("(",!1),U=")",J=Re(")",!1),te=function(Z){return Z},le=/^[^ \t\n\r()!|&\^]/,pe=Qe([" "," ",` +`,"\r","(",")","!","|","&","^"],!0,!1),Ae=function(Z){return e.queryPattern.test(Z)},ye=function(Z){return e.checkFn(Z)},ae=Te("whitespace"),we=/^[ \t\n\r]/,Pe=Qe([" "," ",` +`,"\r"],!1,!1),g=0,Ee=0,De=[{line:1,column:1}],ce=0,ne=[],ee=0,Ie;if("startRule"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=o[e.startRule]}function ke(){return t.substring(Ee,g)}function ht(){return He(Ee,g)}function H(Z,ie){throw ie=ie!==void 0?ie:He(Ee,g),S([Te(Z)],t.substring(Ee,g),ie)}function lt(Z,ie){throw ie=ie!==void 0?ie:He(Ee,g),w(Z,ie)}function Re(Z,ie){return{type:"literal",text:Z,ignoreCase:ie}}function Qe(Z,ie,Se){return{type:"class",parts:Z,inverted:ie,ignoreCase:Se}}function be(){return{type:"any"}}function _e(){return{type:"end"}}function Te(Z){return{type:"other",description:Z}}function Je(Z){var ie=De[Z],Se;if(ie)return ie;for(Se=Z-1;!De[Se];)Se--;for(ie=De[Se],ie={line:ie.line,column:ie.column};Sece&&(ce=g,ne=[]),ne.push(Z))}function w(Z,ie){return new cd(Z,null,null,ie)}function S(Z,ie,Se){return new cd(cd.buildMessage(Z,ie),Z,ie,Se)}function y(){var Z,ie,Se,Ne,ot,dt,jt,$t;if(Z=g,ie=F(),ie!==r){for(Se=[],Ne=g,ot=X(),ot!==r?(t.charCodeAt(g)===124?(dt=n,g++):(dt=r,ee===0&&x(u)),dt===r&&(t.charCodeAt(g)===38?(dt=A,g++):(dt=r,ee===0&&x(p)),dt===r&&(t.charCodeAt(g)===94?(dt=h,g++):(dt=r,ee===0&&x(E)))),dt!==r?(jt=X(),jt!==r?($t=F(),$t!==r?(ot=[ot,dt,jt,$t],Ne=ot):(g=Ne,Ne=r)):(g=Ne,Ne=r)):(g=Ne,Ne=r)):(g=Ne,Ne=r);Ne!==r;)Se.push(Ne),Ne=g,ot=X(),ot!==r?(t.charCodeAt(g)===124?(dt=n,g++):(dt=r,ee===0&&x(u)),dt===r&&(t.charCodeAt(g)===38?(dt=A,g++):(dt=r,ee===0&&x(p)),dt===r&&(t.charCodeAt(g)===94?(dt=h,g++):(dt=r,ee===0&&x(E)))),dt!==r?(jt=X(),jt!==r?($t=F(),$t!==r?(ot=[ot,dt,jt,$t],Ne=ot):(g=Ne,Ne=r)):(g=Ne,Ne=r)):(g=Ne,Ne=r)):(g=Ne,Ne=r);Se!==r?(Ee=Z,ie=I(ie,Se),Z=ie):(g=Z,Z=r)}else g=Z,Z=r;return Z}function F(){var Z,ie,Se,Ne,ot,dt;return Z=g,t.charCodeAt(g)===33?(ie=v,g++):(ie=r,ee===0&&x(b)),ie!==r?(Se=F(),Se!==r?(Ee=Z,ie=C(Se),Z=ie):(g=Z,Z=r)):(g=Z,Z=r),Z===r&&(Z=g,t.charCodeAt(g)===40?(ie=T,g++):(ie=r,ee===0&&x(L)),ie!==r?(Se=X(),Se!==r?(Ne=y(),Ne!==r?(ot=X(),ot!==r?(t.charCodeAt(g)===41?(dt=U,g++):(dt=r,ee===0&&x(J)),dt!==r?(Ee=Z,ie=te(Ne),Z=ie):(g=Z,Z=r)):(g=Z,Z=r)):(g=Z,Z=r)):(g=Z,Z=r)):(g=Z,Z=r),Z===r&&(Z=z())),Z}function z(){var Z,ie,Se,Ne,ot;if(Z=g,ie=X(),ie!==r){if(Se=g,Ne=[],le.test(t.charAt(g))?(ot=t.charAt(g),g++):(ot=r,ee===0&&x(pe)),ot!==r)for(;ot!==r;)Ne.push(ot),le.test(t.charAt(g))?(ot=t.charAt(g),g++):(ot=r,ee===0&&x(pe));else Ne=r;Ne!==r?Se=t.substring(Se,g):Se=Ne,Se!==r?(Ee=g,Ne=Ae(Se),Ne?Ne=void 0:Ne=r,Ne!==r?(Ee=Z,ie=ye(Se),Z=ie):(g=Z,Z=r)):(g=Z,Z=r)}else g=Z,Z=r;return Z}function X(){var Z,ie;for(ee++,Z=[],we.test(t.charAt(g))?(ie=t.charAt(g),g++):(ie=r,ee===0&&x(Pe));ie!==r;)Z.push(ie),we.test(t.charAt(g))?(ie=t.charAt(g),g++):(ie=r,ee===0&&x(Pe));return ee--,Z===r&&(ie=r,ee===0&&x(ae)),Z}if(Ie=a(),Ie!==r&&g===t.length)return Ie;throw Ie!==r&&g{var{parse:C9e}=tX();PP.makeParser=(t=/[a-z]+/)=>(e,r)=>C9e(e,{queryPattern:t,checkFn:r});PP.parse=PP.makeParser()});var iX=_((SQt,nX)=>{"use strict";nX.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var pN=_((xQt,oX)=>{var BI=iX(),sX={};for(let t of Object.keys(BI))sX[BI[t]]=t;var Ar={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};oX.exports=Ar;for(let t of Object.keys(Ar)){if(!("channels"in Ar[t]))throw new Error("missing channels property: "+t);if(!("labels"in Ar[t]))throw new Error("missing channel labels property: "+t);if(Ar[t].labels.length!==Ar[t].channels)throw new Error("channel and label counts mismatch: "+t);let{channels:e,labels:r}=Ar[t];delete Ar[t].channels,delete Ar[t].labels,Object.defineProperty(Ar[t],"channels",{value:e}),Object.defineProperty(Ar[t],"labels",{value:r})}Ar.rgb.hsl=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(e,r,o),n=Math.max(e,r,o),u=n-a,A,p;n===a?A=0:e===n?A=(r-o)/u:r===n?A=2+(o-e)/u:o===n&&(A=4+(e-r)/u),A=Math.min(A*60,360),A<0&&(A+=360);let h=(a+n)/2;return n===a?p=0:h<=.5?p=u/(n+a):p=u/(2-n-a),[A,p*100,h*100]};Ar.rgb.hsv=function(t){let e,r,o,a,n,u=t[0]/255,A=t[1]/255,p=t[2]/255,h=Math.max(u,A,p),E=h-Math.min(u,A,p),I=function(v){return(h-v)/6/E+1/2};return E===0?(a=0,n=0):(n=E/h,e=I(u),r=I(A),o=I(p),u===h?a=o-r:A===h?a=1/3+e-o:p===h&&(a=2/3+r-e),a<0?a+=1:a>1&&(a-=1)),[a*360,n*100,h*100]};Ar.rgb.hwb=function(t){let e=t[0],r=t[1],o=t[2],a=Ar.rgb.hsl(t)[0],n=1/255*Math.min(e,Math.min(r,o));return o=1-1/255*Math.max(e,Math.max(r,o)),[a,n*100,o*100]};Ar.rgb.cmyk=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(1-e,1-r,1-o),n=(1-e-a)/(1-a)||0,u=(1-r-a)/(1-a)||0,A=(1-o-a)/(1-a)||0;return[n*100,u*100,A*100,a*100]};function w9e(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}Ar.rgb.keyword=function(t){let e=sX[t];if(e)return e;let r=1/0,o;for(let a of Object.keys(BI)){let n=BI[a],u=w9e(t,n);u.04045?((e+.055)/1.055)**2.4:e/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,o=o>.04045?((o+.055)/1.055)**2.4:o/12.92;let a=e*.4124+r*.3576+o*.1805,n=e*.2126+r*.7152+o*.0722,u=e*.0193+r*.1192+o*.9505;return[a*100,n*100,u*100]};Ar.rgb.lab=function(t){let e=Ar.rgb.xyz(t),r=e[0],o=e[1],a=e[2];r/=95.047,o/=100,a/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,o=o>.008856?o**(1/3):7.787*o+16/116,a=a>.008856?a**(1/3):7.787*a+16/116;let n=116*o-16,u=500*(r-o),A=200*(o-a);return[n,u,A]};Ar.hsl.rgb=function(t){let e=t[0]/360,r=t[1]/100,o=t[2]/100,a,n,u;if(r===0)return u=o*255,[u,u,u];o<.5?a=o*(1+r):a=o+r-o*r;let A=2*o-a,p=[0,0,0];for(let h=0;h<3;h++)n=e+1/3*-(h-1),n<0&&n++,n>1&&n--,6*n<1?u=A+(a-A)*6*n:2*n<1?u=a:3*n<2?u=A+(a-A)*(2/3-n)*6:u=A,p[h]=u*255;return p};Ar.hsl.hsv=function(t){let e=t[0],r=t[1]/100,o=t[2]/100,a=r,n=Math.max(o,.01);o*=2,r*=o<=1?o:2-o,a*=n<=1?n:2-n;let u=(o+r)/2,A=o===0?2*a/(n+a):2*r/(o+r);return[e,A*100,u*100]};Ar.hsv.rgb=function(t){let e=t[0]/60,r=t[1]/100,o=t[2]/100,a=Math.floor(e)%6,n=e-Math.floor(e),u=255*o*(1-r),A=255*o*(1-r*n),p=255*o*(1-r*(1-n));switch(o*=255,a){case 0:return[o,p,u];case 1:return[A,o,u];case 2:return[u,o,p];case 3:return[u,A,o];case 4:return[p,u,o];case 5:return[o,u,A]}};Ar.hsv.hsl=function(t){let e=t[0],r=t[1]/100,o=t[2]/100,a=Math.max(o,.01),n,u;u=(2-r)*o;let A=(2-r)*a;return n=r*a,n/=A<=1?A:2-A,n=n||0,u/=2,[e,n*100,u*100]};Ar.hwb.rgb=function(t){let e=t[0]/360,r=t[1]/100,o=t[2]/100,a=r+o,n;a>1&&(r/=a,o/=a);let u=Math.floor(6*e),A=1-o;n=6*e-u,(u&1)!==0&&(n=1-n);let p=r+n*(A-r),h,E,I;switch(u){default:case 6:case 0:h=A,E=p,I=r;break;case 1:h=p,E=A,I=r;break;case 2:h=r,E=A,I=p;break;case 3:h=r,E=p,I=A;break;case 4:h=p,E=r,I=A;break;case 5:h=A,E=r,I=p;break}return[h*255,E*255,I*255]};Ar.cmyk.rgb=function(t){let e=t[0]/100,r=t[1]/100,o=t[2]/100,a=t[3]/100,n=1-Math.min(1,e*(1-a)+a),u=1-Math.min(1,r*(1-a)+a),A=1-Math.min(1,o*(1-a)+a);return[n*255,u*255,A*255]};Ar.xyz.rgb=function(t){let e=t[0]/100,r=t[1]/100,o=t[2]/100,a,n,u;return a=e*3.2406+r*-1.5372+o*-.4986,n=e*-.9689+r*1.8758+o*.0415,u=e*.0557+r*-.204+o*1.057,a=a>.0031308?1.055*a**(1/2.4)-.055:a*12.92,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,u=u>.0031308?1.055*u**(1/2.4)-.055:u*12.92,a=Math.min(Math.max(0,a),1),n=Math.min(Math.max(0,n),1),u=Math.min(Math.max(0,u),1),[a*255,n*255,u*255]};Ar.xyz.lab=function(t){let e=t[0],r=t[1],o=t[2];e/=95.047,r/=100,o/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,o=o>.008856?o**(1/3):7.787*o+16/116;let a=116*r-16,n=500*(e-r),u=200*(r-o);return[a,n,u]};Ar.lab.xyz=function(t){let e=t[0],r=t[1],o=t[2],a,n,u;n=(e+16)/116,a=r/500+n,u=n-o/200;let A=n**3,p=a**3,h=u**3;return n=A>.008856?A:(n-16/116)/7.787,a=p>.008856?p:(a-16/116)/7.787,u=h>.008856?h:(u-16/116)/7.787,a*=95.047,n*=100,u*=108.883,[a,n,u]};Ar.lab.lch=function(t){let e=t[0],r=t[1],o=t[2],a;a=Math.atan2(o,r)*360/2/Math.PI,a<0&&(a+=360);let u=Math.sqrt(r*r+o*o);return[e,u,a]};Ar.lch.lab=function(t){let e=t[0],r=t[1],a=t[2]/360*2*Math.PI,n=r*Math.cos(a),u=r*Math.sin(a);return[e,n,u]};Ar.rgb.ansi16=function(t,e=null){let[r,o,a]=t,n=e===null?Ar.rgb.hsv(t)[2]:e;if(n=Math.round(n/50),n===0)return 30;let u=30+(Math.round(a/255)<<2|Math.round(o/255)<<1|Math.round(r/255));return n===2&&(u+=60),u};Ar.hsv.ansi16=function(t){return Ar.rgb.ansi16(Ar.hsv.rgb(t),t[2])};Ar.rgb.ansi256=function(t){let e=t[0],r=t[1],o=t[2];return e===r&&r===o?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(r/255*5)+Math.round(o/255*5)};Ar.ansi16.rgb=function(t){let e=t%10;if(e===0||e===7)return t>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let r=(~~(t>50)+1)*.5,o=(e&1)*r*255,a=(e>>1&1)*r*255,n=(e>>2&1)*r*255;return[o,a,n]};Ar.ansi256.rgb=function(t){if(t>=232){let n=(t-232)*10+8;return[n,n,n]}t-=16;let e,r=Math.floor(t/36)/5*255,o=Math.floor((e=t%36)/6)/5*255,a=e%6/5*255;return[r,o,a]};Ar.rgb.hex=function(t){let r=(((Math.round(t[0])&255)<<16)+((Math.round(t[1])&255)<<8)+(Math.round(t[2])&255)).toString(16).toUpperCase();return"000000".substring(r.length)+r};Ar.hex.rgb=function(t){let e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let r=e[0];e[0].length===3&&(r=r.split("").map(A=>A+A).join(""));let o=parseInt(r,16),a=o>>16&255,n=o>>8&255,u=o&255;return[a,n,u]};Ar.rgb.hcg=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.max(Math.max(e,r),o),n=Math.min(Math.min(e,r),o),u=a-n,A,p;return u<1?A=n/(1-u):A=0,u<=0?p=0:a===e?p=(r-o)/u%6:a===r?p=2+(o-e)/u:p=4+(e-r)/u,p/=6,p%=1,[p*360,u*100,A*100]};Ar.hsl.hcg=function(t){let e=t[1]/100,r=t[2]/100,o=r<.5?2*e*r:2*e*(1-r),a=0;return o<1&&(a=(r-.5*o)/(1-o)),[t[0],o*100,a*100]};Ar.hsv.hcg=function(t){let e=t[1]/100,r=t[2]/100,o=e*r,a=0;return o<1&&(a=(r-o)/(1-o)),[t[0],o*100,a*100]};Ar.hcg.rgb=function(t){let e=t[0]/360,r=t[1]/100,o=t[2]/100;if(r===0)return[o*255,o*255,o*255];let a=[0,0,0],n=e%1*6,u=n%1,A=1-u,p=0;switch(Math.floor(n)){case 0:a[0]=1,a[1]=u,a[2]=0;break;case 1:a[0]=A,a[1]=1,a[2]=0;break;case 2:a[0]=0,a[1]=1,a[2]=u;break;case 3:a[0]=0,a[1]=A,a[2]=1;break;case 4:a[0]=u,a[1]=0,a[2]=1;break;default:a[0]=1,a[1]=0,a[2]=A}return p=(1-r)*o,[(r*a[0]+p)*255,(r*a[1]+p)*255,(r*a[2]+p)*255]};Ar.hcg.hsv=function(t){let e=t[1]/100,r=t[2]/100,o=e+r*(1-e),a=0;return o>0&&(a=e/o),[t[0],a*100,o*100]};Ar.hcg.hsl=function(t){let e=t[1]/100,o=t[2]/100*(1-e)+.5*e,a=0;return o>0&&o<.5?a=e/(2*o):o>=.5&&o<1&&(a=e/(2*(1-o))),[t[0],a*100,o*100]};Ar.hcg.hwb=function(t){let e=t[1]/100,r=t[2]/100,o=e+r*(1-e);return[t[0],(o-e)*100,(1-o)*100]};Ar.hwb.hcg=function(t){let e=t[1]/100,o=1-t[2]/100,a=o-e,n=0;return a<1&&(n=(o-a)/(1-a)),[t[0],a*100,n*100]};Ar.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]};Ar.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]};Ar.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]};Ar.gray.hsl=function(t){return[0,0,t[0]]};Ar.gray.hsv=Ar.gray.hsl;Ar.gray.hwb=function(t){return[0,100,t[0]]};Ar.gray.cmyk=function(t){return[0,0,0,t[0]]};Ar.gray.lab=function(t){return[t[0],0,0]};Ar.gray.hex=function(t){let e=Math.round(t[0]/100*255)&255,o=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(o.length)+o};Ar.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}});var lX=_((bQt,aX)=>{var SP=pN();function I9e(){let t={},e=Object.keys(SP);for(let r=e.length,o=0;o{var hN=pN(),P9e=lX(),xy={},S9e=Object.keys(hN);function x9e(t){let e=function(...r){let o=r[0];return o==null?o:(o.length>1&&(r=o),t(r))};return"conversion"in t&&(e.conversion=t.conversion),e}function b9e(t){let e=function(...r){let o=r[0];if(o==null)return o;o.length>1&&(r=o);let a=t(r);if(typeof a=="object")for(let n=a.length,u=0;u{xy[t]={},Object.defineProperty(xy[t],"channels",{value:hN[t].channels}),Object.defineProperty(xy[t],"labels",{value:hN[t].labels});let e=P9e(t);Object.keys(e).forEach(o=>{let a=e[o];xy[t][o]=b9e(a),xy[t][o].raw=x9e(a)})});cX.exports=xy});var vI=_((QQt,gX)=>{"use strict";var AX=(t,e)=>(...r)=>`\x1B[${t(...r)+e}m`,fX=(t,e)=>(...r)=>{let o=t(...r);return`\x1B[${38+e};5;${o}m`},pX=(t,e)=>(...r)=>{let o=t(...r);return`\x1B[${38+e};2;${o[0]};${o[1]};${o[2]}m`},xP=t=>t,hX=(t,e,r)=>[t,e,r],by=(t,e,r)=>{Object.defineProperty(t,e,{get:()=>{let o=r();return Object.defineProperty(t,e,{value:o,enumerable:!0,configurable:!0}),o},enumerable:!0,configurable:!0})},gN,ky=(t,e,r,o)=>{gN===void 0&&(gN=uX());let a=o?10:0,n={};for(let[u,A]of Object.entries(gN)){let p=u==="ansi16"?"ansi":u;u===e?n[p]=t(r,a):typeof A=="object"&&(n[p]=t(A[e],a))}return n};function k9e(){let t=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[r,o]of Object.entries(e)){for(let[a,n]of Object.entries(o))e[a]={open:`\x1B[${n[0]}m`,close:`\x1B[${n[1]}m`},o[a]=e[a],t.set(n[0],n[1]);Object.defineProperty(e,r,{value:o,enumerable:!1})}return Object.defineProperty(e,"codes",{value:t,enumerable:!1}),e.color.close="\x1B[39m",e.bgColor.close="\x1B[49m",by(e.color,"ansi",()=>ky(AX,"ansi16",xP,!1)),by(e.color,"ansi256",()=>ky(fX,"ansi256",xP,!1)),by(e.color,"ansi16m",()=>ky(pX,"rgb",hX,!1)),by(e.bgColor,"ansi",()=>ky(AX,"ansi16",xP,!0)),by(e.bgColor,"ansi256",()=>ky(fX,"ansi256",xP,!0)),by(e.bgColor,"ansi16m",()=>ky(pX,"rgb",hX,!0)),e}Object.defineProperty(gX,"exports",{enumerable:!0,get:k9e})});var mX=_((FQt,dX)=>{"use strict";dX.exports=(t,e=process.argv)=>{let r=t.startsWith("-")?"":t.length===1?"-":"--",o=e.indexOf(r+t),a=e.indexOf("--");return o!==-1&&(a===-1||o{"use strict";var Q9e=Be("os"),yX=Be("tty"),Ol=mX(),{env:ls}=process,Kp;Ol("no-color")||Ol("no-colors")||Ol("color=false")||Ol("color=never")?Kp=0:(Ol("color")||Ol("colors")||Ol("color=true")||Ol("color=always"))&&(Kp=1);"FORCE_COLOR"in ls&&(ls.FORCE_COLOR==="true"?Kp=1:ls.FORCE_COLOR==="false"?Kp=0:Kp=ls.FORCE_COLOR.length===0?1:Math.min(parseInt(ls.FORCE_COLOR,10),3));function dN(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function mN(t,e){if(Kp===0)return 0;if(Ol("color=16m")||Ol("color=full")||Ol("color=truecolor"))return 3;if(Ol("color=256"))return 2;if(t&&!e&&Kp===void 0)return 0;let r=Kp||0;if(ls.TERM==="dumb")return r;if(process.platform==="win32"){let o=Q9e.release().split(".");return Number(o[0])>=10&&Number(o[2])>=10586?Number(o[2])>=14931?3:2:1}if("CI"in ls)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(o=>o in ls)||ls.CI_NAME==="codeship"?1:r;if("TEAMCITY_VERSION"in ls)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(ls.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in ls)return 1;if(ls.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in ls){let o=parseInt((ls.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(ls.TERM_PROGRAM){case"iTerm.app":return o>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(ls.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(ls.TERM)||"COLORTERM"in ls?1:r}function F9e(t){let e=mN(t,t&&t.isTTY);return dN(e)}EX.exports={supportsColor:F9e,stdout:dN(mN(!0,yX.isatty(1))),stderr:dN(mN(!0,yX.isatty(2)))}});var wX=_((RQt,CX)=>{"use strict";var T9e=(t,e,r)=>{let o=t.indexOf(e);if(o===-1)return t;let a=e.length,n=0,u="";do u+=t.substr(n,o-n)+e+r,n=o+a,o=t.indexOf(e,n);while(o!==-1);return u+=t.substr(n),u},R9e=(t,e,r,o)=>{let a=0,n="";do{let u=t[o-1]==="\r";n+=t.substr(a,(u?o-1:o)-a)+e+(u?`\r +`:` +`)+r,a=o+1,o=t.indexOf(` +`,a)}while(o!==-1);return n+=t.substr(a),n};CX.exports={stringReplaceAll:T9e,stringEncaseCRLFWithFirstIndex:R9e}});var PX=_((NQt,DX)=>{"use strict";var N9e=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,IX=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,L9e=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,M9e=/\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.)|([^\\])/gi,O9e=new Map([["n",` +`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e","\x1B"],["a","\x07"]]);function vX(t){let e=t[0]==="u",r=t[1]==="{";return e&&!r&&t.length===5||t[0]==="x"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):O9e.get(t)||t}function U9e(t,e){let r=[],o=e.trim().split(/\s*,\s*/g),a;for(let n of o){let u=Number(n);if(!Number.isNaN(u))r.push(u);else if(a=n.match(L9e))r.push(a[2].replace(M9e,(A,p,h)=>p?vX(p):h));else throw new Error(`Invalid Chalk template style argument: ${n} (in style '${t}')`)}return r}function _9e(t){IX.lastIndex=0;let e=[],r;for(;(r=IX.exec(t))!==null;){let o=r[1];if(r[2]){let a=U9e(o,r[2]);e.push([o].concat(a))}else e.push([o])}return e}function BX(t,e){let r={};for(let a of e)for(let n of a.styles)r[n[0]]=a.inverse?null:n.slice(1);let o=t;for(let[a,n]of Object.entries(r))if(!!Array.isArray(n)){if(!(a in o))throw new Error(`Unknown Chalk style: ${a}`);o=n.length>0?o[a](...n):o[a]}return o}DX.exports=(t,e)=>{let r=[],o=[],a=[];if(e.replace(N9e,(n,u,A,p,h,E)=>{if(u)a.push(vX(u));else if(p){let I=a.join("");a=[],o.push(r.length===0?I:BX(t,r)(I)),r.push({inverse:A,styles:_9e(p)})}else if(h){if(r.length===0)throw new Error("Found extraneous } in Chalk template literal");o.push(BX(t,r)(a.join(""))),a=[],r.pop()}else a.push(E)}),o.push(a.join("")),r.length>0){let n=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?"":"s"} (\`}\`)`;throw new Error(n)}return o.join("")}});var vN=_((LQt,kX)=>{"use strict";var DI=vI(),{stdout:CN,stderr:wN}=yN(),{stringReplaceAll:H9e,stringEncaseCRLFWithFirstIndex:j9e}=wX(),SX=["ansi","ansi","ansi256","ansi16m"],Qy=Object.create(null),q9e=(t,e={})=>{if(e.level>3||e.level<0)throw new Error("The `level` option should be an integer from 0 to 3");let r=CN?CN.level:0;t.level=e.level===void 0?r:e.level},IN=class{constructor(e){return xX(e)}},xX=t=>{let e={};return q9e(e,t),e.template=(...r)=>W9e(e.template,...r),Object.setPrototypeOf(e,bP.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=IN,e.template};function bP(t){return xX(t)}for(let[t,e]of Object.entries(DI))Qy[t]={get(){let r=kP(this,BN(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};Qy.visible={get(){let t=kP(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:t}),t}};var bX=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let t of bX)Qy[t]={get(){let{level:e}=this;return function(...r){let o=BN(DI.color[SX[e]][t](...r),DI.color.close,this._styler);return kP(this,o,this._isEmpty)}}};for(let t of bX){let e="bg"+t[0].toUpperCase()+t.slice(1);Qy[e]={get(){let{level:r}=this;return function(...o){let a=BN(DI.bgColor[SX[r]][t](...o),DI.bgColor.close,this._styler);return kP(this,a,this._isEmpty)}}}}var G9e=Object.defineProperties(()=>{},{...Qy,level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}}),BN=(t,e,r)=>{let o,a;return r===void 0?(o=t,a=e):(o=r.openAll+t,a=e+r.closeAll),{open:t,close:e,openAll:o,closeAll:a,parent:r}},kP=(t,e,r)=>{let o=(...a)=>Y9e(o,a.length===1?""+a[0]:a.join(" "));return o.__proto__=G9e,o._generator=t,o._styler=e,o._isEmpty=r,o},Y9e=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?"":e;let r=t._styler;if(r===void 0)return e;let{openAll:o,closeAll:a}=r;if(e.indexOf("\x1B")!==-1)for(;r!==void 0;)e=H9e(e,r.close,r.open),r=r.parent;let n=e.indexOf(` +`);return n!==-1&&(e=j9e(e,a,o,n)),o+e+a},EN,W9e=(t,...e)=>{let[r]=e;if(!Array.isArray(r))return e.join(" ");let o=e.slice(1),a=[r.raw[0]];for(let n=1;n{"use strict";Ul.isInteger=t=>typeof t=="number"?Number.isInteger(t):typeof t=="string"&&t.trim()!==""?Number.isInteger(Number(t)):!1;Ul.find=(t,e)=>t.nodes.find(r=>r.type===e);Ul.exceedsLimit=(t,e,r=1,o)=>o===!1||!Ul.isInteger(t)||!Ul.isInteger(e)?!1:(Number(e)-Number(t))/Number(r)>=o;Ul.escapeNode=(t,e=0,r)=>{let o=t.nodes[e];!o||(r&&o.type===r||o.type==="open"||o.type==="close")&&o.escaped!==!0&&(o.value="\\"+o.value,o.escaped=!0)};Ul.encloseBrace=t=>t.type!=="brace"?!1:t.commas>>0+t.ranges>>0===0?(t.invalid=!0,!0):!1;Ul.isInvalidBrace=t=>t.type!=="brace"?!1:t.invalid===!0||t.dollar?!0:t.commas>>0+t.ranges>>0===0||t.open!==!0||t.close!==!0?(t.invalid=!0,!0):!1;Ul.isOpenOrClose=t=>t.type==="open"||t.type==="close"?!0:t.open===!0||t.close===!0;Ul.reduce=t=>t.reduce((e,r)=>(r.type==="text"&&e.push(r.value),r.type==="range"&&(r.type="text"),e),[]);Ul.flatten=(...t)=>{let e=[],r=o=>{for(let a=0;a{"use strict";var QX=QP();FX.exports=(t,e={})=>{let r=(o,a={})=>{let n=e.escapeInvalid&&QX.isInvalidBrace(a),u=o.invalid===!0&&e.escapeInvalid===!0,A="";if(o.value)return(n||u)&&QX.isOpenOrClose(o)?"\\"+o.value:o.value;if(o.value)return o.value;if(o.nodes)for(let p of o.nodes)A+=r(p);return A};return r(t)}});var RX=_((UQt,TX)=>{"use strict";TX.exports=function(t){return typeof t=="number"?t-t===0:typeof t=="string"&&t.trim()!==""?Number.isFinite?Number.isFinite(+t):isFinite(+t):!1}});var qX=_((_Qt,jX)=>{"use strict";var NX=RX(),ud=(t,e,r)=>{if(NX(t)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(e===void 0||t===e)return String(t);if(NX(e)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let o={relaxZeros:!0,...r};typeof o.strictZeros=="boolean"&&(o.relaxZeros=o.strictZeros===!1);let a=String(o.relaxZeros),n=String(o.shorthand),u=String(o.capture),A=String(o.wrap),p=t+":"+e+"="+a+n+u+A;if(ud.cache.hasOwnProperty(p))return ud.cache[p].result;let h=Math.min(t,e),E=Math.max(t,e);if(Math.abs(h-E)===1){let T=t+"|"+e;return o.capture?`(${T})`:o.wrap===!1?T:`(?:${T})`}let I=HX(t)||HX(e),v={min:t,max:e,a:h,b:E},b=[],C=[];if(I&&(v.isPadded=I,v.maxLen=String(v.max).length),h<0){let T=E<0?Math.abs(E):1;C=LX(T,Math.abs(h),v,o),h=v.a=0}return E>=0&&(b=LX(h,E,v,o)),v.negatives=C,v.positives=b,v.result=V9e(C,b,o),o.capture===!0?v.result=`(${v.result})`:o.wrap!==!1&&b.length+C.length>1&&(v.result=`(?:${v.result})`),ud.cache[p]=v,v.result};function V9e(t,e,r){let o=DN(t,e,"-",!1,r)||[],a=DN(e,t,"",!1,r)||[],n=DN(t,e,"-?",!0,r)||[];return o.concat(n).concat(a).join("|")}function K9e(t,e){let r=1,o=1,a=OX(t,r),n=new Set([e]);for(;t<=a&&a<=e;)n.add(a),r+=1,a=OX(t,r);for(a=UX(e+1,o)-1;t1&&A.count.pop(),A.count.push(E.count[0]),A.string=A.pattern+_X(A.count),u=h+1;continue}r.isPadded&&(I=$9e(h,r,o)),E.string=I+E.pattern+_X(E.count),n.push(E),u=h+1,A=E}return n}function DN(t,e,r,o,a){let n=[];for(let u of t){let{string:A}=u;!o&&!MX(e,"string",A)&&n.push(r+A),o&&MX(e,"string",A)&&n.push(r+A)}return n}function z9e(t,e){let r=[];for(let o=0;oe?1:e>t?-1:0}function MX(t,e,r){return t.some(o=>o[e]===r)}function OX(t,e){return Number(String(t).slice(0,-e)+"9".repeat(e))}function UX(t,e){return t-t%Math.pow(10,e)}function _X(t){let[e=0,r=""]=t;return r||e>1?`{${e+(r?","+r:"")}}`:""}function Z9e(t,e,r){return`[${t}${e-t===1?"":"-"}${e}]`}function HX(t){return/^-?(0+)\d/.test(t)}function $9e(t,e,r){if(!e.isPadded)return t;let o=Math.abs(e.maxLen-String(t).length),a=r.relaxZeros!==!1;switch(o){case 0:return"";case 1:return a?"0?":"0";case 2:return a?"0{0,2}":"00";default:return a?`0{0,${o}}`:`0{${o}}`}}ud.cache={};ud.clearCache=()=>ud.cache={};jX.exports=ud});var xN=_((HQt,XX)=>{"use strict";var e7e=Be("util"),WX=qX(),GX=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),t7e=t=>e=>t===!0?Number(e):String(e),PN=t=>typeof t=="number"||typeof t=="string"&&t!=="",SI=t=>Number.isInteger(+t),SN=t=>{let e=`${t}`,r=-1;if(e[0]==="-"&&(e=e.slice(1)),e==="0")return!1;for(;e[++r]==="0";);return r>0},r7e=(t,e,r)=>typeof t=="string"||typeof e=="string"?!0:r.stringify===!0,n7e=(t,e,r)=>{if(e>0){let o=t[0]==="-"?"-":"";o&&(t=t.slice(1)),t=o+t.padStart(o?e-1:e,"0")}return r===!1?String(t):t},YX=(t,e)=>{let r=t[0]==="-"?"-":"";for(r&&(t=t.slice(1),e--);t.length{t.negatives.sort((u,A)=>uA?1:0),t.positives.sort((u,A)=>uA?1:0);let r=e.capture?"":"?:",o="",a="",n;return t.positives.length&&(o=t.positives.join("|")),t.negatives.length&&(a=`-(${r}${t.negatives.join("|")})`),o&&a?n=`${o}|${a}`:n=o||a,e.wrap?`(${r}${n})`:n},VX=(t,e,r,o)=>{if(r)return WX(t,e,{wrap:!1,...o});let a=String.fromCharCode(t);if(t===e)return a;let n=String.fromCharCode(e);return`[${a}-${n}]`},KX=(t,e,r)=>{if(Array.isArray(t)){let o=r.wrap===!0,a=r.capture?"":"?:";return o?`(${a}${t.join("|")})`:t.join("|")}return WX(t,e,r)},JX=(...t)=>new RangeError("Invalid range arguments: "+e7e.inspect(...t)),zX=(t,e,r)=>{if(r.strictRanges===!0)throw JX([t,e]);return[]},s7e=(t,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step "${t}" to be a number`);return[]},o7e=(t,e,r=1,o={})=>{let a=Number(t),n=Number(e);if(!Number.isInteger(a)||!Number.isInteger(n)){if(o.strictRanges===!0)throw JX([t,e]);return[]}a===0&&(a=0),n===0&&(n=0);let u=a>n,A=String(t),p=String(e),h=String(r);r=Math.max(Math.abs(r),1);let E=SN(A)||SN(p)||SN(h),I=E?Math.max(A.length,p.length,h.length):0,v=E===!1&&r7e(t,e,o)===!1,b=o.transform||t7e(v);if(o.toRegex&&r===1)return VX(YX(t,I),YX(e,I),!0,o);let C={negatives:[],positives:[]},T=J=>C[J<0?"negatives":"positives"].push(Math.abs(J)),L=[],U=0;for(;u?a>=n:a<=n;)o.toRegex===!0&&r>1?T(a):L.push(n7e(b(a,U),I,v)),a=u?a-r:a+r,U++;return o.toRegex===!0?r>1?i7e(C,o):KX(L,null,{wrap:!1,...o}):L},a7e=(t,e,r=1,o={})=>{if(!SI(t)&&t.length>1||!SI(e)&&e.length>1)return zX(t,e,o);let a=o.transform||(v=>String.fromCharCode(v)),n=`${t}`.charCodeAt(0),u=`${e}`.charCodeAt(0),A=n>u,p=Math.min(n,u),h=Math.max(n,u);if(o.toRegex&&r===1)return VX(p,h,!1,o);let E=[],I=0;for(;A?n>=u:n<=u;)E.push(a(n,I)),n=A?n-r:n+r,I++;return o.toRegex===!0?KX(E,null,{wrap:!1,options:o}):E},TP=(t,e,r,o={})=>{if(e==null&&PN(t))return[t];if(!PN(t)||!PN(e))return zX(t,e,o);if(typeof r=="function")return TP(t,e,1,{transform:r});if(GX(r))return TP(t,e,0,r);let a={...o};return a.capture===!0&&(a.wrap=!0),r=r||a.step||1,SI(r)?SI(t)&&SI(e)?o7e(t,e,r,a):a7e(t,e,Math.max(Math.abs(r),1),a):r!=null&&!GX(r)?s7e(r,a):TP(t,e,1,r)};XX.exports=TP});var eZ=_((jQt,$X)=>{"use strict";var l7e=xN(),ZX=QP(),c7e=(t,e={})=>{let r=(o,a={})=>{let n=ZX.isInvalidBrace(a),u=o.invalid===!0&&e.escapeInvalid===!0,A=n===!0||u===!0,p=e.escapeInvalid===!0?"\\":"",h="";if(o.isOpen===!0||o.isClose===!0)return p+o.value;if(o.type==="open")return A?p+o.value:"(";if(o.type==="close")return A?p+o.value:")";if(o.type==="comma")return o.prev.type==="comma"?"":A?o.value:"|";if(o.value)return o.value;if(o.nodes&&o.ranges>0){let E=ZX.reduce(o.nodes),I=l7e(...E,{...e,wrap:!1,toRegex:!0});if(I.length!==0)return E.length>1&&I.length>1?`(${I})`:I}if(o.nodes)for(let E of o.nodes)h+=r(E,o);return h};return r(t)};$X.exports=c7e});var nZ=_((qQt,rZ)=>{"use strict";var u7e=xN(),tZ=FP(),Fy=QP(),Ad=(t="",e="",r=!1)=>{let o=[];if(t=[].concat(t),e=[].concat(e),!e.length)return t;if(!t.length)return r?Fy.flatten(e).map(a=>`{${a}}`):e;for(let a of t)if(Array.isArray(a))for(let n of a)o.push(Ad(n,e,r));else for(let n of e)r===!0&&typeof n=="string"&&(n=`{${n}}`),o.push(Array.isArray(n)?Ad(a,n,r):a+n);return Fy.flatten(o)},A7e=(t,e={})=>{let r=e.rangeLimit===void 0?1e3:e.rangeLimit,o=(a,n={})=>{a.queue=[];let u=n,A=n.queue;for(;u.type!=="brace"&&u.type!=="root"&&u.parent;)u=u.parent,A=u.queue;if(a.invalid||a.dollar){A.push(Ad(A.pop(),tZ(a,e)));return}if(a.type==="brace"&&a.invalid!==!0&&a.nodes.length===2){A.push(Ad(A.pop(),["{}"]));return}if(a.nodes&&a.ranges>0){let I=Fy.reduce(a.nodes);if(Fy.exceedsLimit(...I,e.step,r))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let v=u7e(...I,e);v.length===0&&(v=tZ(a,e)),A.push(Ad(A.pop(),v)),a.nodes=[];return}let p=Fy.encloseBrace(a),h=a.queue,E=a;for(;E.type!=="brace"&&E.type!=="root"&&E.parent;)E=E.parent,h=E.queue;for(let I=0;I{"use strict";iZ.exports={MAX_LENGTH:1024*64,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:` +`,CHAR_NO_BREAK_SPACE:"\xA0",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:" ",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\uFEFF"}});var uZ=_((YQt,cZ)=>{"use strict";var f7e=FP(),{MAX_LENGTH:oZ,CHAR_BACKSLASH:bN,CHAR_BACKTICK:p7e,CHAR_COMMA:h7e,CHAR_DOT:g7e,CHAR_LEFT_PARENTHESES:d7e,CHAR_RIGHT_PARENTHESES:m7e,CHAR_LEFT_CURLY_BRACE:y7e,CHAR_RIGHT_CURLY_BRACE:E7e,CHAR_LEFT_SQUARE_BRACKET:aZ,CHAR_RIGHT_SQUARE_BRACKET:lZ,CHAR_DOUBLE_QUOTE:C7e,CHAR_SINGLE_QUOTE:w7e,CHAR_NO_BREAK_SPACE:I7e,CHAR_ZERO_WIDTH_NOBREAK_SPACE:B7e}=sZ(),v7e=(t,e={})=>{if(typeof t!="string")throw new TypeError("Expected a string");let r=e||{},o=typeof r.maxLength=="number"?Math.min(oZ,r.maxLength):oZ;if(t.length>o)throw new SyntaxError(`Input length (${t.length}), exceeds max characters (${o})`);let a={type:"root",input:t,nodes:[]},n=[a],u=a,A=a,p=0,h=t.length,E=0,I=0,v,b={},C=()=>t[E++],T=L=>{if(L.type==="text"&&A.type==="dot"&&(A.type="text"),A&&A.type==="text"&&L.type==="text"){A.value+=L.value;return}return u.nodes.push(L),L.parent=u,L.prev=A,A=L,L};for(T({type:"bos"});E0){if(u.ranges>0){u.ranges=0;let L=u.nodes.shift();u.nodes=[L,{type:"text",value:f7e(u)}]}T({type:"comma",value:v}),u.commas++;continue}if(v===g7e&&I>0&&u.commas===0){let L=u.nodes;if(I===0||L.length===0){T({type:"text",value:v});continue}if(A.type==="dot"){if(u.range=[],A.value+=v,A.type="range",u.nodes.length!==3&&u.nodes.length!==5){u.invalid=!0,u.ranges=0,A.type="text";continue}u.ranges++,u.args=[];continue}if(A.type==="range"){L.pop();let U=L[L.length-1];U.value+=A.value+v,A=U,u.ranges--;continue}T({type:"dot",value:v});continue}T({type:"text",value:v})}do if(u=n.pop(),u.type!=="root"){u.nodes.forEach(J=>{J.nodes||(J.type==="open"&&(J.isOpen=!0),J.type==="close"&&(J.isClose=!0),J.nodes||(J.type="text"),J.invalid=!0)});let L=n[n.length-1],U=L.nodes.indexOf(u);L.nodes.splice(U,1,...u.nodes)}while(n.length>0);return T({type:"eos"}),a};cZ.exports=v7e});var pZ=_((WQt,fZ)=>{"use strict";var AZ=FP(),D7e=eZ(),P7e=nZ(),S7e=uZ(),rl=(t,e={})=>{let r=[];if(Array.isArray(t))for(let o of t){let a=rl.create(o,e);Array.isArray(a)?r.push(...a):r.push(a)}else r=[].concat(rl.create(t,e));return e&&e.expand===!0&&e.nodupes===!0&&(r=[...new Set(r)]),r};rl.parse=(t,e={})=>S7e(t,e);rl.stringify=(t,e={})=>AZ(typeof t=="string"?rl.parse(t,e):t,e);rl.compile=(t,e={})=>(typeof t=="string"&&(t=rl.parse(t,e)),D7e(t,e));rl.expand=(t,e={})=>{typeof t=="string"&&(t=rl.parse(t,e));let r=P7e(t,e);return e.noempty===!0&&(r=r.filter(Boolean)),e.nodupes===!0&&(r=[...new Set(r)]),r};rl.create=(t,e={})=>t===""||t.length<3?[t]:e.expand!==!0?rl.compile(t,e):rl.expand(t,e);fZ.exports=rl});var xI=_((VQt,yZ)=>{"use strict";var x7e=Be("path"),Vu="\\\\/",hZ=`[^${Vu}]`,Bf="\\.",b7e="\\+",k7e="\\?",RP="\\/",Q7e="(?=.)",gZ="[^/]",kN=`(?:${RP}|$)`,dZ=`(?:^|${RP})`,QN=`${Bf}{1,2}${kN}`,F7e=`(?!${Bf})`,T7e=`(?!${dZ}${QN})`,R7e=`(?!${Bf}{0,1}${kN})`,N7e=`(?!${QN})`,L7e=`[^.${RP}]`,M7e=`${gZ}*?`,mZ={DOT_LITERAL:Bf,PLUS_LITERAL:b7e,QMARK_LITERAL:k7e,SLASH_LITERAL:RP,ONE_CHAR:Q7e,QMARK:gZ,END_ANCHOR:kN,DOTS_SLASH:QN,NO_DOT:F7e,NO_DOTS:T7e,NO_DOT_SLASH:R7e,NO_DOTS_SLASH:N7e,QMARK_NO_DOT:L7e,STAR:M7e,START_ANCHOR:dZ},O7e={...mZ,SLASH_LITERAL:`[${Vu}]`,QMARK:hZ,STAR:`${hZ}*?`,DOTS_SLASH:`${Bf}{1,2}(?:[${Vu}]|$)`,NO_DOT:`(?!${Bf})`,NO_DOTS:`(?!(?:^|[${Vu}])${Bf}{1,2}(?:[${Vu}]|$))`,NO_DOT_SLASH:`(?!${Bf}{0,1}(?:[${Vu}]|$))`,NO_DOTS_SLASH:`(?!${Bf}{1,2}(?:[${Vu}]|$))`,QMARK_NO_DOT:`[^.${Vu}]`,START_ANCHOR:`(?:^|[${Vu}])`,END_ANCHOR:`(?:[${Vu}]|$)`},U7e={alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};yZ.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:U7e,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:x7e.sep,extglobChars(t){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${t.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(t){return t===!0?O7e:mZ}}});var bI=_(Pa=>{"use strict";var _7e=Be("path"),H7e=process.platform==="win32",{REGEX_BACKSLASH:j7e,REGEX_REMOVE_BACKSLASH:q7e,REGEX_SPECIAL_CHARS:G7e,REGEX_SPECIAL_CHARS_GLOBAL:Y7e}=xI();Pa.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);Pa.hasRegexChars=t=>G7e.test(t);Pa.isRegexChar=t=>t.length===1&&Pa.hasRegexChars(t);Pa.escapeRegex=t=>t.replace(Y7e,"\\$1");Pa.toPosixSlashes=t=>t.replace(j7e,"/");Pa.removeBackslashes=t=>t.replace(q7e,e=>e==="\\"?"":e);Pa.supportsLookbehinds=()=>{let t=process.version.slice(1).split(".").map(Number);return t.length===3&&t[0]>=9||t[0]===8&&t[1]>=10};Pa.isWindows=t=>t&&typeof t.windows=="boolean"?t.windows:H7e===!0||_7e.sep==="\\";Pa.escapeLast=(t,e,r)=>{let o=t.lastIndexOf(e,r);return o===-1?t:t[o-1]==="\\"?Pa.escapeLast(t,e,o-1):`${t.slice(0,o)}\\${t.slice(o)}`};Pa.removePrefix=(t,e={})=>{let r=t;return r.startsWith("./")&&(r=r.slice(2),e.prefix="./"),r};Pa.wrapOutput=(t,e={},r={})=>{let o=r.contains?"":"^",a=r.contains?"":"$",n=`${o}(?:${t})${a}`;return e.negated===!0&&(n=`(?:^(?!${n}).*$)`),n}});var PZ=_((JQt,DZ)=>{"use strict";var EZ=bI(),{CHAR_ASTERISK:FN,CHAR_AT:W7e,CHAR_BACKWARD_SLASH:kI,CHAR_COMMA:V7e,CHAR_DOT:TN,CHAR_EXCLAMATION_MARK:RN,CHAR_FORWARD_SLASH:vZ,CHAR_LEFT_CURLY_BRACE:NN,CHAR_LEFT_PARENTHESES:LN,CHAR_LEFT_SQUARE_BRACKET:K7e,CHAR_PLUS:J7e,CHAR_QUESTION_MARK:CZ,CHAR_RIGHT_CURLY_BRACE:z7e,CHAR_RIGHT_PARENTHESES:wZ,CHAR_RIGHT_SQUARE_BRACKET:X7e}=xI(),IZ=t=>t===vZ||t===kI,BZ=t=>{t.isPrefix!==!0&&(t.depth=t.isGlobstar?1/0:1)},Z7e=(t,e)=>{let r=e||{},o=t.length-1,a=r.parts===!0||r.scanToEnd===!0,n=[],u=[],A=[],p=t,h=-1,E=0,I=0,v=!1,b=!1,C=!1,T=!1,L=!1,U=!1,J=!1,te=!1,le=!1,pe=!1,Ae=0,ye,ae,we={value:"",depth:0,isGlob:!1},Pe=()=>h>=o,g=()=>p.charCodeAt(h+1),Ee=()=>(ye=ae,p.charCodeAt(++h));for(;h0&&(ce=p.slice(0,E),p=p.slice(E),I-=E),De&&C===!0&&I>0?(De=p.slice(0,I),ne=p.slice(I)):C===!0?(De="",ne=p):De=p,De&&De!==""&&De!=="/"&&De!==p&&IZ(De.charCodeAt(De.length-1))&&(De=De.slice(0,-1)),r.unescape===!0&&(ne&&(ne=EZ.removeBackslashes(ne)),De&&J===!0&&(De=EZ.removeBackslashes(De)));let ee={prefix:ce,input:t,start:E,base:De,glob:ne,isBrace:v,isBracket:b,isGlob:C,isExtglob:T,isGlobstar:L,negated:te,negatedExtglob:le};if(r.tokens===!0&&(ee.maxDepth=0,IZ(ae)||u.push(we),ee.tokens=u),r.parts===!0||r.tokens===!0){let Ie;for(let ke=0;ke{"use strict";var NP=xI(),nl=bI(),{MAX_LENGTH:LP,POSIX_REGEX_SOURCE:$7e,REGEX_NON_SPECIAL_CHARS:eYe,REGEX_SPECIAL_CHARS_BACKREF:tYe,REPLACEMENTS:SZ}=NP,rYe=(t,e)=>{if(typeof e.expandRange=="function")return e.expandRange(...t,e);t.sort();let r=`[${t.join("-")}]`;try{new RegExp(r)}catch{return t.map(a=>nl.escapeRegex(a)).join("..")}return r},Ty=(t,e)=>`Missing ${t}: "${e}" - use "\\\\${e}" to match literal characters`,MN=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");t=SZ[t]||t;let r={...e},o=typeof r.maxLength=="number"?Math.min(LP,r.maxLength):LP,a=t.length;if(a>o)throw new SyntaxError(`Input length: ${a}, exceeds maximum allowed length: ${o}`);let n={type:"bos",value:"",output:r.prepend||""},u=[n],A=r.capture?"":"?:",p=nl.isWindows(e),h=NP.globChars(p),E=NP.extglobChars(h),{DOT_LITERAL:I,PLUS_LITERAL:v,SLASH_LITERAL:b,ONE_CHAR:C,DOTS_SLASH:T,NO_DOT:L,NO_DOT_SLASH:U,NO_DOTS_SLASH:J,QMARK:te,QMARK_NO_DOT:le,STAR:pe,START_ANCHOR:Ae}=h,ye=x=>`(${A}(?:(?!${Ae}${x.dot?T:I}).)*?)`,ae=r.dot?"":L,we=r.dot?te:le,Pe=r.bash===!0?ye(r):pe;r.capture&&(Pe=`(${Pe})`),typeof r.noext=="boolean"&&(r.noextglob=r.noext);let g={input:t,index:-1,start:0,dot:r.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:u};t=nl.removePrefix(t,g),a=t.length;let Ee=[],De=[],ce=[],ne=n,ee,Ie=()=>g.index===a-1,ke=g.peek=(x=1)=>t[g.index+x],ht=g.advance=()=>t[++g.index]||"",H=()=>t.slice(g.index+1),lt=(x="",w=0)=>{g.consumed+=x,g.index+=w},Re=x=>{g.output+=x.output!=null?x.output:x.value,lt(x.value)},Qe=()=>{let x=1;for(;ke()==="!"&&(ke(2)!=="("||ke(3)==="?");)ht(),g.start++,x++;return x%2===0?!1:(g.negated=!0,g.start++,!0)},be=x=>{g[x]++,ce.push(x)},_e=x=>{g[x]--,ce.pop()},Te=x=>{if(ne.type==="globstar"){let w=g.braces>0&&(x.type==="comma"||x.type==="brace"),S=x.extglob===!0||Ee.length&&(x.type==="pipe"||x.type==="paren");x.type!=="slash"&&x.type!=="paren"&&!w&&!S&&(g.output=g.output.slice(0,-ne.output.length),ne.type="star",ne.value="*",ne.output=Pe,g.output+=ne.output)}if(Ee.length&&x.type!=="paren"&&(Ee[Ee.length-1].inner+=x.value),(x.value||x.output)&&Re(x),ne&&ne.type==="text"&&x.type==="text"){ne.value+=x.value,ne.output=(ne.output||"")+x.value;return}x.prev=ne,u.push(x),ne=x},Je=(x,w)=>{let S={...E[w],conditions:1,inner:""};S.prev=ne,S.parens=g.parens,S.output=g.output;let y=(r.capture?"(":"")+S.open;be("parens"),Te({type:x,value:w,output:g.output?"":C}),Te({type:"paren",extglob:!0,value:ht(),output:y}),Ee.push(S)},He=x=>{let w=x.close+(r.capture?")":""),S;if(x.type==="negate"){let y=Pe;if(x.inner&&x.inner.length>1&&x.inner.includes("/")&&(y=ye(r)),(y!==Pe||Ie()||/^\)+$/.test(H()))&&(w=x.close=`)$))${y}`),x.inner.includes("*")&&(S=H())&&/^\.[^\\/.]+$/.test(S)){let F=MN(S,{...e,fastpaths:!1}).output;w=x.close=`)${F})${y})`}x.prev.type==="bos"&&(g.negatedExtglob=!0)}Te({type:"paren",extglob:!0,value:ee,output:w}),_e("parens")};if(r.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(t)){let x=!1,w=t.replace(tYe,(S,y,F,z,X,Z)=>z==="\\"?(x=!0,S):z==="?"?y?y+z+(X?te.repeat(X.length):""):Z===0?we+(X?te.repeat(X.length):""):te.repeat(F.length):z==="."?I.repeat(F.length):z==="*"?y?y+z+(X?Pe:""):Pe:y?S:`\\${S}`);return x===!0&&(r.unescape===!0?w=w.replace(/\\/g,""):w=w.replace(/\\+/g,S=>S.length%2===0?"\\\\":S?"\\":"")),w===t&&r.contains===!0?(g.output=t,g):(g.output=nl.wrapOutput(w,g,e),g)}for(;!Ie();){if(ee=ht(),ee==="\0")continue;if(ee==="\\"){let S=ke();if(S==="/"&&r.bash!==!0||S==="."||S===";")continue;if(!S){ee+="\\",Te({type:"text",value:ee});continue}let y=/^\\+/.exec(H()),F=0;if(y&&y[0].length>2&&(F=y[0].length,g.index+=F,F%2!==0&&(ee+="\\")),r.unescape===!0?ee=ht():ee+=ht(),g.brackets===0){Te({type:"text",value:ee});continue}}if(g.brackets>0&&(ee!=="]"||ne.value==="["||ne.value==="[^")){if(r.posix!==!1&&ee===":"){let S=ne.value.slice(1);if(S.includes("[")&&(ne.posix=!0,S.includes(":"))){let y=ne.value.lastIndexOf("["),F=ne.value.slice(0,y),z=ne.value.slice(y+2),X=$7e[z];if(X){ne.value=F+X,g.backtrack=!0,ht(),!n.output&&u.indexOf(ne)===1&&(n.output=C);continue}}}(ee==="["&&ke()!==":"||ee==="-"&&ke()==="]")&&(ee=`\\${ee}`),ee==="]"&&(ne.value==="["||ne.value==="[^")&&(ee=`\\${ee}`),r.posix===!0&&ee==="!"&&ne.value==="["&&(ee="^"),ne.value+=ee,Re({value:ee});continue}if(g.quotes===1&&ee!=='"'){ee=nl.escapeRegex(ee),ne.value+=ee,Re({value:ee});continue}if(ee==='"'){g.quotes=g.quotes===1?0:1,r.keepQuotes===!0&&Te({type:"text",value:ee});continue}if(ee==="("){be("parens"),Te({type:"paren",value:ee});continue}if(ee===")"){if(g.parens===0&&r.strictBrackets===!0)throw new SyntaxError(Ty("opening","("));let S=Ee[Ee.length-1];if(S&&g.parens===S.parens+1){He(Ee.pop());continue}Te({type:"paren",value:ee,output:g.parens?")":"\\)"}),_e("parens");continue}if(ee==="["){if(r.nobracket===!0||!H().includes("]")){if(r.nobracket!==!0&&r.strictBrackets===!0)throw new SyntaxError(Ty("closing","]"));ee=`\\${ee}`}else be("brackets");Te({type:"bracket",value:ee});continue}if(ee==="]"){if(r.nobracket===!0||ne&&ne.type==="bracket"&&ne.value.length===1){Te({type:"text",value:ee,output:`\\${ee}`});continue}if(g.brackets===0){if(r.strictBrackets===!0)throw new SyntaxError(Ty("opening","["));Te({type:"text",value:ee,output:`\\${ee}`});continue}_e("brackets");let S=ne.value.slice(1);if(ne.posix!==!0&&S[0]==="^"&&!S.includes("/")&&(ee=`/${ee}`),ne.value+=ee,Re({value:ee}),r.literalBrackets===!1||nl.hasRegexChars(S))continue;let y=nl.escapeRegex(ne.value);if(g.output=g.output.slice(0,-ne.value.length),r.literalBrackets===!0){g.output+=y,ne.value=y;continue}ne.value=`(${A}${y}|${ne.value})`,g.output+=ne.value;continue}if(ee==="{"&&r.nobrace!==!0){be("braces");let S={type:"brace",value:ee,output:"(",outputIndex:g.output.length,tokensIndex:g.tokens.length};De.push(S),Te(S);continue}if(ee==="}"){let S=De[De.length-1];if(r.nobrace===!0||!S){Te({type:"text",value:ee,output:ee});continue}let y=")";if(S.dots===!0){let F=u.slice(),z=[];for(let X=F.length-1;X>=0&&(u.pop(),F[X].type!=="brace");X--)F[X].type!=="dots"&&z.unshift(F[X].value);y=rYe(z,r),g.backtrack=!0}if(S.comma!==!0&&S.dots!==!0){let F=g.output.slice(0,S.outputIndex),z=g.tokens.slice(S.tokensIndex);S.value=S.output="\\{",ee=y="\\}",g.output=F;for(let X of z)g.output+=X.output||X.value}Te({type:"brace",value:ee,output:y}),_e("braces"),De.pop();continue}if(ee==="|"){Ee.length>0&&Ee[Ee.length-1].conditions++,Te({type:"text",value:ee});continue}if(ee===","){let S=ee,y=De[De.length-1];y&&ce[ce.length-1]==="braces"&&(y.comma=!0,S="|"),Te({type:"comma",value:ee,output:S});continue}if(ee==="/"){if(ne.type==="dot"&&g.index===g.start+1){g.start=g.index+1,g.consumed="",g.output="",u.pop(),ne=n;continue}Te({type:"slash",value:ee,output:b});continue}if(ee==="."){if(g.braces>0&&ne.type==="dot"){ne.value==="."&&(ne.output=I);let S=De[De.length-1];ne.type="dots",ne.output+=ee,ne.value+=ee,S.dots=!0;continue}if(g.braces+g.parens===0&&ne.type!=="bos"&&ne.type!=="slash"){Te({type:"text",value:ee,output:I});continue}Te({type:"dot",value:ee,output:I});continue}if(ee==="?"){if(!(ne&&ne.value==="(")&&r.noextglob!==!0&&ke()==="("&&ke(2)!=="?"){Je("qmark",ee);continue}if(ne&&ne.type==="paren"){let y=ke(),F=ee;if(y==="<"&&!nl.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(ne.value==="("&&!/[!=<:]/.test(y)||y==="<"&&!/<([!=]|\w+>)/.test(H()))&&(F=`\\${ee}`),Te({type:"text",value:ee,output:F});continue}if(r.dot!==!0&&(ne.type==="slash"||ne.type==="bos")){Te({type:"qmark",value:ee,output:le});continue}Te({type:"qmark",value:ee,output:te});continue}if(ee==="!"){if(r.noextglob!==!0&&ke()==="("&&(ke(2)!=="?"||!/[!=<:]/.test(ke(3)))){Je("negate",ee);continue}if(r.nonegate!==!0&&g.index===0){Qe();continue}}if(ee==="+"){if(r.noextglob!==!0&&ke()==="("&&ke(2)!=="?"){Je("plus",ee);continue}if(ne&&ne.value==="("||r.regex===!1){Te({type:"plus",value:ee,output:v});continue}if(ne&&(ne.type==="bracket"||ne.type==="paren"||ne.type==="brace")||g.parens>0){Te({type:"plus",value:ee});continue}Te({type:"plus",value:v});continue}if(ee==="@"){if(r.noextglob!==!0&&ke()==="("&&ke(2)!=="?"){Te({type:"at",extglob:!0,value:ee,output:""});continue}Te({type:"text",value:ee});continue}if(ee!=="*"){(ee==="$"||ee==="^")&&(ee=`\\${ee}`);let S=eYe.exec(H());S&&(ee+=S[0],g.index+=S[0].length),Te({type:"text",value:ee});continue}if(ne&&(ne.type==="globstar"||ne.star===!0)){ne.type="star",ne.star=!0,ne.value+=ee,ne.output=Pe,g.backtrack=!0,g.globstar=!0,lt(ee);continue}let x=H();if(r.noextglob!==!0&&/^\([^?]/.test(x)){Je("star",ee);continue}if(ne.type==="star"){if(r.noglobstar===!0){lt(ee);continue}let S=ne.prev,y=S.prev,F=S.type==="slash"||S.type==="bos",z=y&&(y.type==="star"||y.type==="globstar");if(r.bash===!0&&(!F||x[0]&&x[0]!=="/")){Te({type:"star",value:ee,output:""});continue}let X=g.braces>0&&(S.type==="comma"||S.type==="brace"),Z=Ee.length&&(S.type==="pipe"||S.type==="paren");if(!F&&S.type!=="paren"&&!X&&!Z){Te({type:"star",value:ee,output:""});continue}for(;x.slice(0,3)==="/**";){let ie=t[g.index+4];if(ie&&ie!=="/")break;x=x.slice(3),lt("/**",3)}if(S.type==="bos"&&Ie()){ne.type="globstar",ne.value+=ee,ne.output=ye(r),g.output=ne.output,g.globstar=!0,lt(ee);continue}if(S.type==="slash"&&S.prev.type!=="bos"&&!z&&Ie()){g.output=g.output.slice(0,-(S.output+ne.output).length),S.output=`(?:${S.output}`,ne.type="globstar",ne.output=ye(r)+(r.strictSlashes?")":"|$)"),ne.value+=ee,g.globstar=!0,g.output+=S.output+ne.output,lt(ee);continue}if(S.type==="slash"&&S.prev.type!=="bos"&&x[0]==="/"){let ie=x[1]!==void 0?"|$":"";g.output=g.output.slice(0,-(S.output+ne.output).length),S.output=`(?:${S.output}`,ne.type="globstar",ne.output=`${ye(r)}${b}|${b}${ie})`,ne.value+=ee,g.output+=S.output+ne.output,g.globstar=!0,lt(ee+ht()),Te({type:"slash",value:"/",output:""});continue}if(S.type==="bos"&&x[0]==="/"){ne.type="globstar",ne.value+=ee,ne.output=`(?:^|${b}|${ye(r)}${b})`,g.output=ne.output,g.globstar=!0,lt(ee+ht()),Te({type:"slash",value:"/",output:""});continue}g.output=g.output.slice(0,-ne.output.length),ne.type="globstar",ne.output=ye(r),ne.value+=ee,g.output+=ne.output,g.globstar=!0,lt(ee);continue}let w={type:"star",value:ee,output:Pe};if(r.bash===!0){w.output=".*?",(ne.type==="bos"||ne.type==="slash")&&(w.output=ae+w.output),Te(w);continue}if(ne&&(ne.type==="bracket"||ne.type==="paren")&&r.regex===!0){w.output=ee,Te(w);continue}(g.index===g.start||ne.type==="slash"||ne.type==="dot")&&(ne.type==="dot"?(g.output+=U,ne.output+=U):r.dot===!0?(g.output+=J,ne.output+=J):(g.output+=ae,ne.output+=ae),ke()!=="*"&&(g.output+=C,ne.output+=C)),Te(w)}for(;g.brackets>0;){if(r.strictBrackets===!0)throw new SyntaxError(Ty("closing","]"));g.output=nl.escapeLast(g.output,"["),_e("brackets")}for(;g.parens>0;){if(r.strictBrackets===!0)throw new SyntaxError(Ty("closing",")"));g.output=nl.escapeLast(g.output,"("),_e("parens")}for(;g.braces>0;){if(r.strictBrackets===!0)throw new SyntaxError(Ty("closing","}"));g.output=nl.escapeLast(g.output,"{"),_e("braces")}if(r.strictSlashes!==!0&&(ne.type==="star"||ne.type==="bracket")&&Te({type:"maybe_slash",value:"",output:`${b}?`}),g.backtrack===!0){g.output="";for(let x of g.tokens)g.output+=x.output!=null?x.output:x.value,x.suffix&&(g.output+=x.suffix)}return g};MN.fastpaths=(t,e)=>{let r={...e},o=typeof r.maxLength=="number"?Math.min(LP,r.maxLength):LP,a=t.length;if(a>o)throw new SyntaxError(`Input length: ${a}, exceeds maximum allowed length: ${o}`);t=SZ[t]||t;let n=nl.isWindows(e),{DOT_LITERAL:u,SLASH_LITERAL:A,ONE_CHAR:p,DOTS_SLASH:h,NO_DOT:E,NO_DOTS:I,NO_DOTS_SLASH:v,STAR:b,START_ANCHOR:C}=NP.globChars(n),T=r.dot?I:E,L=r.dot?v:E,U=r.capture?"":"?:",J={negated:!1,prefix:""},te=r.bash===!0?".*?":b;r.capture&&(te=`(${te})`);let le=ae=>ae.noglobstar===!0?te:`(${U}(?:(?!${C}${ae.dot?h:u}).)*?)`,pe=ae=>{switch(ae){case"*":return`${T}${p}${te}`;case".*":return`${u}${p}${te}`;case"*.*":return`${T}${te}${u}${p}${te}`;case"*/*":return`${T}${te}${A}${p}${L}${te}`;case"**":return T+le(r);case"**/*":return`(?:${T}${le(r)}${A})?${L}${p}${te}`;case"**/*.*":return`(?:${T}${le(r)}${A})?${L}${te}${u}${p}${te}`;case"**/.*":return`(?:${T}${le(r)}${A})?${u}${p}${te}`;default:{let we=/^(.*?)\.(\w+)$/.exec(ae);if(!we)return;let Pe=pe(we[1]);return Pe?Pe+u+we[2]:void 0}}},Ae=nl.removePrefix(t,J),ye=pe(Ae);return ye&&r.strictSlashes!==!0&&(ye+=`${A}?`),ye};xZ.exports=MN});var QZ=_((XQt,kZ)=>{"use strict";var nYe=Be("path"),iYe=PZ(),ON=bZ(),UN=bI(),sYe=xI(),oYe=t=>t&&typeof t=="object"&&!Array.isArray(t),Oi=(t,e,r=!1)=>{if(Array.isArray(t)){let E=t.map(v=>Oi(v,e,r));return v=>{for(let b of E){let C=b(v);if(C)return C}return!1}}let o=oYe(t)&&t.tokens&&t.input;if(t===""||typeof t!="string"&&!o)throw new TypeError("Expected pattern to be a non-empty string");let a=e||{},n=UN.isWindows(e),u=o?Oi.compileRe(t,e):Oi.makeRe(t,e,!1,!0),A=u.state;delete u.state;let p=()=>!1;if(a.ignore){let E={...e,ignore:null,onMatch:null,onResult:null};p=Oi(a.ignore,E,r)}let h=(E,I=!1)=>{let{isMatch:v,match:b,output:C}=Oi.test(E,u,e,{glob:t,posix:n}),T={glob:t,state:A,regex:u,posix:n,input:E,output:C,match:b,isMatch:v};return typeof a.onResult=="function"&&a.onResult(T),v===!1?(T.isMatch=!1,I?T:!1):p(E)?(typeof a.onIgnore=="function"&&a.onIgnore(T),T.isMatch=!1,I?T:!1):(typeof a.onMatch=="function"&&a.onMatch(T),I?T:!0)};return r&&(h.state=A),h};Oi.test=(t,e,r,{glob:o,posix:a}={})=>{if(typeof t!="string")throw new TypeError("Expected input to be a string");if(t==="")return{isMatch:!1,output:""};let n=r||{},u=n.format||(a?UN.toPosixSlashes:null),A=t===o,p=A&&u?u(t):t;return A===!1&&(p=u?u(t):t,A=p===o),(A===!1||n.capture===!0)&&(n.matchBase===!0||n.basename===!0?A=Oi.matchBase(t,e,r,a):A=e.exec(p)),{isMatch:Boolean(A),match:A,output:p}};Oi.matchBase=(t,e,r,o=UN.isWindows(r))=>(e instanceof RegExp?e:Oi.makeRe(e,r)).test(nYe.basename(t));Oi.isMatch=(t,e,r)=>Oi(e,r)(t);Oi.parse=(t,e)=>Array.isArray(t)?t.map(r=>Oi.parse(r,e)):ON(t,{...e,fastpaths:!1});Oi.scan=(t,e)=>iYe(t,e);Oi.compileRe=(t,e,r=!1,o=!1)=>{if(r===!0)return t.output;let a=e||{},n=a.contains?"":"^",u=a.contains?"":"$",A=`${n}(?:${t.output})${u}`;t&&t.negated===!0&&(A=`^(?!${A}).*$`);let p=Oi.toRegex(A,e);return o===!0&&(p.state=t),p};Oi.makeRe=(t,e={},r=!1,o=!1)=>{if(!t||typeof t!="string")throw new TypeError("Expected a non-empty string");let a={negated:!1,fastpaths:!0};return e.fastpaths!==!1&&(t[0]==="."||t[0]==="*")&&(a.output=ON.fastpaths(t,e)),a.output||(a=ON(t,e)),Oi.compileRe(a,e,r,o)};Oi.toRegex=(t,e)=>{try{let r=e||{};return new RegExp(t,r.flags||(r.nocase?"i":""))}catch(r){if(e&&e.debug===!0)throw r;return/$^/}};Oi.constants=sYe;kZ.exports=Oi});var TZ=_((ZQt,FZ)=>{"use strict";FZ.exports=QZ()});var Zo=_(($Qt,MZ)=>{"use strict";var NZ=Be("util"),LZ=pZ(),Ku=TZ(),_N=bI(),RZ=t=>t===""||t==="./",yi=(t,e,r)=>{e=[].concat(e),t=[].concat(t);let o=new Set,a=new Set,n=new Set,u=0,A=E=>{n.add(E.output),r&&r.onResult&&r.onResult(E)};for(let E=0;E!o.has(E));if(r&&h.length===0){if(r.failglob===!0)throw new Error(`No matches found for "${e.join(", ")}"`);if(r.nonull===!0||r.nullglob===!0)return r.unescape?e.map(E=>E.replace(/\\/g,"")):e}return h};yi.match=yi;yi.matcher=(t,e)=>Ku(t,e);yi.isMatch=(t,e,r)=>Ku(e,r)(t);yi.any=yi.isMatch;yi.not=(t,e,r={})=>{e=[].concat(e).map(String);let o=new Set,a=[],n=A=>{r.onResult&&r.onResult(A),a.push(A.output)},u=new Set(yi(t,e,{...r,onResult:n}));for(let A of a)u.has(A)||o.add(A);return[...o]};yi.contains=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${NZ.inspect(t)}"`);if(Array.isArray(e))return e.some(o=>yi.contains(t,o,r));if(typeof e=="string"){if(RZ(t)||RZ(e))return!1;if(t.includes(e)||t.startsWith("./")&&t.slice(2).includes(e))return!0}return yi.isMatch(t,e,{...r,contains:!0})};yi.matchKeys=(t,e,r)=>{if(!_N.isObject(t))throw new TypeError("Expected the first argument to be an object");let o=yi(Object.keys(t),e,r),a={};for(let n of o)a[n]=t[n];return a};yi.some=(t,e,r)=>{let o=[].concat(t);for(let a of[].concat(e)){let n=Ku(String(a),r);if(o.some(u=>n(u)))return!0}return!1};yi.every=(t,e,r)=>{let o=[].concat(t);for(let a of[].concat(e)){let n=Ku(String(a),r);if(!o.every(u=>n(u)))return!1}return!0};yi.all=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${NZ.inspect(t)}"`);return[].concat(e).every(o=>Ku(o,r)(t))};yi.capture=(t,e,r)=>{let o=_N.isWindows(r),n=Ku.makeRe(String(t),{...r,capture:!0}).exec(o?_N.toPosixSlashes(e):e);if(n)return n.slice(1).map(u=>u===void 0?"":u)};yi.makeRe=(...t)=>Ku.makeRe(...t);yi.scan=(...t)=>Ku.scan(...t);yi.parse=(t,e)=>{let r=[];for(let o of[].concat(t||[]))for(let a of LZ(String(o),e))r.push(Ku.parse(a,e));return r};yi.braces=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return e&&e.nobrace===!0||!/\{.*\}/.test(t)?[t]:LZ(t,e)};yi.braceExpand=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return yi.braces(t,{...e,expand:!0})};MZ.exports=yi});var UZ=_((eFt,OZ)=>{"use strict";OZ.exports=({onlyFirst:t=!1}={})=>{let e=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(e,t?void 0:"g")}});var MP=_((tFt,_Z)=>{"use strict";var aYe=UZ();_Z.exports=t=>typeof t=="string"?t.replace(aYe(),""):t});var jZ=_((rFt,HZ)=>{function lYe(){this.__data__=[],this.size=0}HZ.exports=lYe});var Ry=_((nFt,qZ)=>{function cYe(t,e){return t===e||t!==t&&e!==e}qZ.exports=cYe});var QI=_((iFt,GZ)=>{var uYe=Ry();function AYe(t,e){for(var r=t.length;r--;)if(uYe(t[r][0],e))return r;return-1}GZ.exports=AYe});var WZ=_((sFt,YZ)=>{var fYe=QI(),pYe=Array.prototype,hYe=pYe.splice;function gYe(t){var e=this.__data__,r=fYe(e,t);if(r<0)return!1;var o=e.length-1;return r==o?e.pop():hYe.call(e,r,1),--this.size,!0}YZ.exports=gYe});var KZ=_((oFt,VZ)=>{var dYe=QI();function mYe(t){var e=this.__data__,r=dYe(e,t);return r<0?void 0:e[r][1]}VZ.exports=mYe});var zZ=_((aFt,JZ)=>{var yYe=QI();function EYe(t){return yYe(this.__data__,t)>-1}JZ.exports=EYe});var ZZ=_((lFt,XZ)=>{var CYe=QI();function wYe(t,e){var r=this.__data__,o=CYe(r,t);return o<0?(++this.size,r.push([t,e])):r[o][1]=e,this}XZ.exports=wYe});var FI=_((cFt,$Z)=>{var IYe=jZ(),BYe=WZ(),vYe=KZ(),DYe=zZ(),PYe=ZZ();function Ny(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var SYe=FI();function xYe(){this.__data__=new SYe,this.size=0}e$.exports=xYe});var n$=_((AFt,r$)=>{function bYe(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}r$.exports=bYe});var s$=_((fFt,i$)=>{function kYe(t){return this.__data__.get(t)}i$.exports=kYe});var a$=_((pFt,o$)=>{function QYe(t){return this.__data__.has(t)}o$.exports=QYe});var HN=_((hFt,l$)=>{var FYe=typeof global=="object"&&global&&global.Object===Object&&global;l$.exports=FYe});var _l=_((gFt,c$)=>{var TYe=HN(),RYe=typeof self=="object"&&self&&self.Object===Object&&self,NYe=TYe||RYe||Function("return this")();c$.exports=NYe});var fd=_((dFt,u$)=>{var LYe=_l(),MYe=LYe.Symbol;u$.exports=MYe});var h$=_((mFt,p$)=>{var A$=fd(),f$=Object.prototype,OYe=f$.hasOwnProperty,UYe=f$.toString,TI=A$?A$.toStringTag:void 0;function _Ye(t){var e=OYe.call(t,TI),r=t[TI];try{t[TI]=void 0;var o=!0}catch{}var a=UYe.call(t);return o&&(e?t[TI]=r:delete t[TI]),a}p$.exports=_Ye});var d$=_((yFt,g$)=>{var HYe=Object.prototype,jYe=HYe.toString;function qYe(t){return jYe.call(t)}g$.exports=qYe});var pd=_((EFt,E$)=>{var m$=fd(),GYe=h$(),YYe=d$(),WYe="[object Null]",VYe="[object Undefined]",y$=m$?m$.toStringTag:void 0;function KYe(t){return t==null?t===void 0?VYe:WYe:y$&&y$ in Object(t)?GYe(t):YYe(t)}E$.exports=KYe});var il=_((CFt,C$)=>{function JYe(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}C$.exports=JYe});var OP=_((wFt,w$)=>{var zYe=pd(),XYe=il(),ZYe="[object AsyncFunction]",$Ye="[object Function]",eWe="[object GeneratorFunction]",tWe="[object Proxy]";function rWe(t){if(!XYe(t))return!1;var e=zYe(t);return e==$Ye||e==eWe||e==ZYe||e==tWe}w$.exports=rWe});var B$=_((IFt,I$)=>{var nWe=_l(),iWe=nWe["__core-js_shared__"];I$.exports=iWe});var P$=_((BFt,D$)=>{var jN=B$(),v$=function(){var t=/[^.]+$/.exec(jN&&jN.keys&&jN.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();function sWe(t){return!!v$&&v$ in t}D$.exports=sWe});var qN=_((vFt,S$)=>{var oWe=Function.prototype,aWe=oWe.toString;function lWe(t){if(t!=null){try{return aWe.call(t)}catch{}try{return t+""}catch{}}return""}S$.exports=lWe});var b$=_((DFt,x$)=>{var cWe=OP(),uWe=P$(),AWe=il(),fWe=qN(),pWe=/[\\^$.*+?()[\]{}|]/g,hWe=/^\[object .+?Constructor\]$/,gWe=Function.prototype,dWe=Object.prototype,mWe=gWe.toString,yWe=dWe.hasOwnProperty,EWe=RegExp("^"+mWe.call(yWe).replace(pWe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function CWe(t){if(!AWe(t)||uWe(t))return!1;var e=cWe(t)?EWe:hWe;return e.test(fWe(t))}x$.exports=CWe});var Q$=_((PFt,k$)=>{function wWe(t,e){return t?.[e]}k$.exports=wWe});var Jp=_((SFt,F$)=>{var IWe=b$(),BWe=Q$();function vWe(t,e){var r=BWe(t,e);return IWe(r)?r:void 0}F$.exports=vWe});var UP=_((xFt,T$)=>{var DWe=Jp(),PWe=_l(),SWe=DWe(PWe,"Map");T$.exports=SWe});var RI=_((bFt,R$)=>{var xWe=Jp(),bWe=xWe(Object,"create");R$.exports=bWe});var M$=_((kFt,L$)=>{var N$=RI();function kWe(){this.__data__=N$?N$(null):{},this.size=0}L$.exports=kWe});var U$=_((QFt,O$)=>{function QWe(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}O$.exports=QWe});var H$=_((FFt,_$)=>{var FWe=RI(),TWe="__lodash_hash_undefined__",RWe=Object.prototype,NWe=RWe.hasOwnProperty;function LWe(t){var e=this.__data__;if(FWe){var r=e[t];return r===TWe?void 0:r}return NWe.call(e,t)?e[t]:void 0}_$.exports=LWe});var q$=_((TFt,j$)=>{var MWe=RI(),OWe=Object.prototype,UWe=OWe.hasOwnProperty;function _We(t){var e=this.__data__;return MWe?e[t]!==void 0:UWe.call(e,t)}j$.exports=_We});var Y$=_((RFt,G$)=>{var HWe=RI(),jWe="__lodash_hash_undefined__";function qWe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=HWe&&e===void 0?jWe:e,this}G$.exports=qWe});var V$=_((NFt,W$)=>{var GWe=M$(),YWe=U$(),WWe=H$(),VWe=q$(),KWe=Y$();function Ly(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var K$=V$(),JWe=FI(),zWe=UP();function XWe(){this.size=0,this.__data__={hash:new K$,map:new(zWe||JWe),string:new K$}}J$.exports=XWe});var Z$=_((MFt,X$)=>{function ZWe(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}X$.exports=ZWe});var NI=_((OFt,$$)=>{var $We=Z$();function eVe(t,e){var r=t.__data__;return $We(e)?r[typeof e=="string"?"string":"hash"]:r.map}$$.exports=eVe});var tee=_((UFt,eee)=>{var tVe=NI();function rVe(t){var e=tVe(this,t).delete(t);return this.size-=e?1:0,e}eee.exports=rVe});var nee=_((_Ft,ree)=>{var nVe=NI();function iVe(t){return nVe(this,t).get(t)}ree.exports=iVe});var see=_((HFt,iee)=>{var sVe=NI();function oVe(t){return sVe(this,t).has(t)}iee.exports=oVe});var aee=_((jFt,oee)=>{var aVe=NI();function lVe(t,e){var r=aVe(this,t),o=r.size;return r.set(t,e),this.size+=r.size==o?0:1,this}oee.exports=lVe});var _P=_((qFt,lee)=>{var cVe=z$(),uVe=tee(),AVe=nee(),fVe=see(),pVe=aee();function My(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var hVe=FI(),gVe=UP(),dVe=_P(),mVe=200;function yVe(t,e){var r=this.__data__;if(r instanceof hVe){var o=r.__data__;if(!gVe||o.length{var EVe=FI(),CVe=t$(),wVe=n$(),IVe=s$(),BVe=a$(),vVe=uee();function Oy(t){var e=this.__data__=new EVe(t);this.size=e.size}Oy.prototype.clear=CVe;Oy.prototype.delete=wVe;Oy.prototype.get=IVe;Oy.prototype.has=BVe;Oy.prototype.set=vVe;Aee.exports=Oy});var pee=_((WFt,fee)=>{var DVe="__lodash_hash_undefined__";function PVe(t){return this.__data__.set(t,DVe),this}fee.exports=PVe});var gee=_((VFt,hee)=>{function SVe(t){return this.__data__.has(t)}hee.exports=SVe});var mee=_((KFt,dee)=>{var xVe=_P(),bVe=pee(),kVe=gee();function jP(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new xVe;++e{function QVe(t,e){for(var r=-1,o=t==null?0:t.length;++r{function FVe(t,e){return t.has(e)}Cee.exports=FVe});var GN=_((XFt,Iee)=>{var TVe=mee(),RVe=Eee(),NVe=wee(),LVe=1,MVe=2;function OVe(t,e,r,o,a,n){var u=r&LVe,A=t.length,p=e.length;if(A!=p&&!(u&&p>A))return!1;var h=n.get(t),E=n.get(e);if(h&&E)return h==e&&E==t;var I=-1,v=!0,b=r&MVe?new TVe:void 0;for(n.set(t,e),n.set(e,t);++I{var UVe=_l(),_Ve=UVe.Uint8Array;Bee.exports=_Ve});var Dee=_(($Ft,vee)=>{function HVe(t){var e=-1,r=Array(t.size);return t.forEach(function(o,a){r[++e]=[a,o]}),r}vee.exports=HVe});var See=_((eTt,Pee)=>{function jVe(t){var e=-1,r=Array(t.size);return t.forEach(function(o){r[++e]=o}),r}Pee.exports=jVe});var Fee=_((tTt,Qee)=>{var xee=fd(),bee=YN(),qVe=Ry(),GVe=GN(),YVe=Dee(),WVe=See(),VVe=1,KVe=2,JVe="[object Boolean]",zVe="[object Date]",XVe="[object Error]",ZVe="[object Map]",$Ve="[object Number]",eKe="[object RegExp]",tKe="[object Set]",rKe="[object String]",nKe="[object Symbol]",iKe="[object ArrayBuffer]",sKe="[object DataView]",kee=xee?xee.prototype:void 0,WN=kee?kee.valueOf:void 0;function oKe(t,e,r,o,a,n,u){switch(r){case sKe:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case iKe:return!(t.byteLength!=e.byteLength||!n(new bee(t),new bee(e)));case JVe:case zVe:case $Ve:return qVe(+t,+e);case XVe:return t.name==e.name&&t.message==e.message;case eKe:case rKe:return t==e+"";case ZVe:var A=YVe;case tKe:var p=o&VVe;if(A||(A=WVe),t.size!=e.size&&!p)return!1;var h=u.get(t);if(h)return h==e;o|=KVe,u.set(t,e);var E=GVe(A(t),A(e),o,a,n,u);return u.delete(t),E;case nKe:if(WN)return WN.call(t)==WN.call(e)}return!1}Qee.exports=oKe});var qP=_((rTt,Tee)=>{function aKe(t,e){for(var r=-1,o=e.length,a=t.length;++r{var lKe=Array.isArray;Ree.exports=lKe});var VN=_((iTt,Nee)=>{var cKe=qP(),uKe=Hl();function AKe(t,e,r){var o=e(t);return uKe(t)?o:cKe(o,r(t))}Nee.exports=AKe});var Mee=_((sTt,Lee)=>{function fKe(t,e){for(var r=-1,o=t==null?0:t.length,a=0,n=[];++r{function pKe(){return[]}Oee.exports=pKe});var GP=_((aTt,_ee)=>{var hKe=Mee(),gKe=KN(),dKe=Object.prototype,mKe=dKe.propertyIsEnumerable,Uee=Object.getOwnPropertySymbols,yKe=Uee?function(t){return t==null?[]:(t=Object(t),hKe(Uee(t),function(e){return mKe.call(t,e)}))}:gKe;_ee.exports=yKe});var jee=_((lTt,Hee)=>{function EKe(t,e){for(var r=-1,o=Array(t);++r{function CKe(t){return t!=null&&typeof t=="object"}qee.exports=CKe});var Yee=_((uTt,Gee)=>{var wKe=pd(),IKe=Ju(),BKe="[object Arguments]";function vKe(t){return IKe(t)&&wKe(t)==BKe}Gee.exports=vKe});var LI=_((ATt,Kee)=>{var Wee=Yee(),DKe=Ju(),Vee=Object.prototype,PKe=Vee.hasOwnProperty,SKe=Vee.propertyIsEnumerable,xKe=Wee(function(){return arguments}())?Wee:function(t){return DKe(t)&&PKe.call(t,"callee")&&!SKe.call(t,"callee")};Kee.exports=xKe});var zee=_((fTt,Jee)=>{function bKe(){return!1}Jee.exports=bKe});var OI=_((MI,Uy)=>{var kKe=_l(),QKe=zee(),$ee=typeof MI=="object"&&MI&&!MI.nodeType&&MI,Xee=$ee&&typeof Uy=="object"&&Uy&&!Uy.nodeType&&Uy,FKe=Xee&&Xee.exports===$ee,Zee=FKe?kKe.Buffer:void 0,TKe=Zee?Zee.isBuffer:void 0,RKe=TKe||QKe;Uy.exports=RKe});var UI=_((pTt,ete)=>{var NKe=9007199254740991,LKe=/^(?:0|[1-9]\d*)$/;function MKe(t,e){var r=typeof t;return e=e??NKe,!!e&&(r=="number"||r!="symbol"&&LKe.test(t))&&t>-1&&t%1==0&&t{var OKe=9007199254740991;function UKe(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=OKe}tte.exports=UKe});var nte=_((gTt,rte)=>{var _Ke=pd(),HKe=YP(),jKe=Ju(),qKe="[object Arguments]",GKe="[object Array]",YKe="[object Boolean]",WKe="[object Date]",VKe="[object Error]",KKe="[object Function]",JKe="[object Map]",zKe="[object Number]",XKe="[object Object]",ZKe="[object RegExp]",$Ke="[object Set]",eJe="[object String]",tJe="[object WeakMap]",rJe="[object ArrayBuffer]",nJe="[object DataView]",iJe="[object Float32Array]",sJe="[object Float64Array]",oJe="[object Int8Array]",aJe="[object Int16Array]",lJe="[object Int32Array]",cJe="[object Uint8Array]",uJe="[object Uint8ClampedArray]",AJe="[object Uint16Array]",fJe="[object Uint32Array]",ui={};ui[iJe]=ui[sJe]=ui[oJe]=ui[aJe]=ui[lJe]=ui[cJe]=ui[uJe]=ui[AJe]=ui[fJe]=!0;ui[qKe]=ui[GKe]=ui[rJe]=ui[YKe]=ui[nJe]=ui[WKe]=ui[VKe]=ui[KKe]=ui[JKe]=ui[zKe]=ui[XKe]=ui[ZKe]=ui[$Ke]=ui[eJe]=ui[tJe]=!1;function pJe(t){return jKe(t)&&HKe(t.length)&&!!ui[_Ke(t)]}rte.exports=pJe});var WP=_((dTt,ite)=>{function hJe(t){return function(e){return t(e)}}ite.exports=hJe});var VP=_((_I,_y)=>{var gJe=HN(),ste=typeof _I=="object"&&_I&&!_I.nodeType&&_I,HI=ste&&typeof _y=="object"&&_y&&!_y.nodeType&&_y,dJe=HI&&HI.exports===ste,JN=dJe&&gJe.process,mJe=function(){try{var t=HI&&HI.require&&HI.require("util").types;return t||JN&&JN.binding&&JN.binding("util")}catch{}}();_y.exports=mJe});var KP=_((mTt,lte)=>{var yJe=nte(),EJe=WP(),ote=VP(),ate=ote&&ote.isTypedArray,CJe=ate?EJe(ate):yJe;lte.exports=CJe});var zN=_((yTt,cte)=>{var wJe=jee(),IJe=LI(),BJe=Hl(),vJe=OI(),DJe=UI(),PJe=KP(),SJe=Object.prototype,xJe=SJe.hasOwnProperty;function bJe(t,e){var r=BJe(t),o=!r&&IJe(t),a=!r&&!o&&vJe(t),n=!r&&!o&&!a&&PJe(t),u=r||o||a||n,A=u?wJe(t.length,String):[],p=A.length;for(var h in t)(e||xJe.call(t,h))&&!(u&&(h=="length"||a&&(h=="offset"||h=="parent")||n&&(h=="buffer"||h=="byteLength"||h=="byteOffset")||DJe(h,p)))&&A.push(h);return A}cte.exports=bJe});var JP=_((ETt,ute)=>{var kJe=Object.prototype;function QJe(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||kJe;return t===r}ute.exports=QJe});var XN=_((CTt,Ate)=>{function FJe(t,e){return function(r){return t(e(r))}}Ate.exports=FJe});var pte=_((wTt,fte)=>{var TJe=XN(),RJe=TJe(Object.keys,Object);fte.exports=RJe});var gte=_((ITt,hte)=>{var NJe=JP(),LJe=pte(),MJe=Object.prototype,OJe=MJe.hasOwnProperty;function UJe(t){if(!NJe(t))return LJe(t);var e=[];for(var r in Object(t))OJe.call(t,r)&&r!="constructor"&&e.push(r);return e}hte.exports=UJe});var jI=_((BTt,dte)=>{var _Je=OP(),HJe=YP();function jJe(t){return t!=null&&HJe(t.length)&&!_Je(t)}dte.exports=jJe});var zP=_((vTt,mte)=>{var qJe=zN(),GJe=gte(),YJe=jI();function WJe(t){return YJe(t)?qJe(t):GJe(t)}mte.exports=WJe});var ZN=_((DTt,yte)=>{var VJe=VN(),KJe=GP(),JJe=zP();function zJe(t){return VJe(t,JJe,KJe)}yte.exports=zJe});var wte=_((PTt,Cte)=>{var Ete=ZN(),XJe=1,ZJe=Object.prototype,$Je=ZJe.hasOwnProperty;function eze(t,e,r,o,a,n){var u=r&XJe,A=Ete(t),p=A.length,h=Ete(e),E=h.length;if(p!=E&&!u)return!1;for(var I=p;I--;){var v=A[I];if(!(u?v in e:$Je.call(e,v)))return!1}var b=n.get(t),C=n.get(e);if(b&&C)return b==e&&C==t;var T=!0;n.set(t,e),n.set(e,t);for(var L=u;++I{var tze=Jp(),rze=_l(),nze=tze(rze,"DataView");Ite.exports=nze});var Dte=_((xTt,vte)=>{var ize=Jp(),sze=_l(),oze=ize(sze,"Promise");vte.exports=oze});var Ste=_((bTt,Pte)=>{var aze=Jp(),lze=_l(),cze=aze(lze,"Set");Pte.exports=cze});var bte=_((kTt,xte)=>{var uze=Jp(),Aze=_l(),fze=uze(Aze,"WeakMap");xte.exports=fze});var qI=_((QTt,Lte)=>{var $N=Bte(),eL=UP(),tL=Dte(),rL=Ste(),nL=bte(),Nte=pd(),Hy=qN(),kte="[object Map]",pze="[object Object]",Qte="[object Promise]",Fte="[object Set]",Tte="[object WeakMap]",Rte="[object DataView]",hze=Hy($N),gze=Hy(eL),dze=Hy(tL),mze=Hy(rL),yze=Hy(nL),hd=Nte;($N&&hd(new $N(new ArrayBuffer(1)))!=Rte||eL&&hd(new eL)!=kte||tL&&hd(tL.resolve())!=Qte||rL&&hd(new rL)!=Fte||nL&&hd(new nL)!=Tte)&&(hd=function(t){var e=Nte(t),r=e==pze?t.constructor:void 0,o=r?Hy(r):"";if(o)switch(o){case hze:return Rte;case gze:return kte;case dze:return Qte;case mze:return Fte;case yze:return Tte}return e});Lte.exports=hd});var Gte=_((FTt,qte)=>{var iL=HP(),Eze=GN(),Cze=Fee(),wze=wte(),Mte=qI(),Ote=Hl(),Ute=OI(),Ize=KP(),Bze=1,_te="[object Arguments]",Hte="[object Array]",XP="[object Object]",vze=Object.prototype,jte=vze.hasOwnProperty;function Dze(t,e,r,o,a,n){var u=Ote(t),A=Ote(e),p=u?Hte:Mte(t),h=A?Hte:Mte(e);p=p==_te?XP:p,h=h==_te?XP:h;var E=p==XP,I=h==XP,v=p==h;if(v&&Ute(t)){if(!Ute(e))return!1;u=!0,E=!1}if(v&&!E)return n||(n=new iL),u||Ize(t)?Eze(t,e,r,o,a,n):Cze(t,e,p,r,o,a,n);if(!(r&Bze)){var b=E&&jte.call(t,"__wrapped__"),C=I&&jte.call(e,"__wrapped__");if(b||C){var T=b?t.value():t,L=C?e.value():e;return n||(n=new iL),a(T,L,r,o,n)}}return v?(n||(n=new iL),wze(t,e,r,o,a,n)):!1}qte.exports=Dze});var Kte=_((TTt,Vte)=>{var Pze=Gte(),Yte=Ju();function Wte(t,e,r,o,a){return t===e?!0:t==null||e==null||!Yte(t)&&!Yte(e)?t!==t&&e!==e:Pze(t,e,r,o,Wte,a)}Vte.exports=Wte});var zte=_((RTt,Jte)=>{var Sze=Kte();function xze(t,e){return Sze(t,e)}Jte.exports=xze});var sL=_((NTt,Xte)=>{var bze=Jp(),kze=function(){try{var t=bze(Object,"defineProperty");return t({},"",{}),t}catch{}}();Xte.exports=kze});var ZP=_((LTt,$te)=>{var Zte=sL();function Qze(t,e,r){e=="__proto__"&&Zte?Zte(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}$te.exports=Qze});var oL=_((MTt,ere)=>{var Fze=ZP(),Tze=Ry();function Rze(t,e,r){(r!==void 0&&!Tze(t[e],r)||r===void 0&&!(e in t))&&Fze(t,e,r)}ere.exports=Rze});var rre=_((OTt,tre)=>{function Nze(t){return function(e,r,o){for(var a=-1,n=Object(e),u=o(e),A=u.length;A--;){var p=u[t?A:++a];if(r(n[p],p,n)===!1)break}return e}}tre.exports=Nze});var ire=_((UTt,nre)=>{var Lze=rre(),Mze=Lze();nre.exports=Mze});var aL=_((GI,jy)=>{var Oze=_l(),lre=typeof GI=="object"&&GI&&!GI.nodeType&&GI,sre=lre&&typeof jy=="object"&&jy&&!jy.nodeType&&jy,Uze=sre&&sre.exports===lre,ore=Uze?Oze.Buffer:void 0,are=ore?ore.allocUnsafe:void 0;function _ze(t,e){if(e)return t.slice();var r=t.length,o=are?are(r):new t.constructor(r);return t.copy(o),o}jy.exports=_ze});var $P=_((_Tt,ure)=>{var cre=YN();function Hze(t){var e=new t.constructor(t.byteLength);return new cre(e).set(new cre(t)),e}ure.exports=Hze});var lL=_((HTt,Are)=>{var jze=$P();function qze(t,e){var r=e?jze(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}Are.exports=qze});var eS=_((jTt,fre)=>{function Gze(t,e){var r=-1,o=t.length;for(e||(e=Array(o));++r{var Yze=il(),pre=Object.create,Wze=function(){function t(){}return function(e){if(!Yze(e))return{};if(pre)return pre(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}();hre.exports=Wze});var tS=_((GTt,dre)=>{var Vze=XN(),Kze=Vze(Object.getPrototypeOf,Object);dre.exports=Kze});var cL=_((YTt,mre)=>{var Jze=gre(),zze=tS(),Xze=JP();function Zze(t){return typeof t.constructor=="function"&&!Xze(t)?Jze(zze(t)):{}}mre.exports=Zze});var Ere=_((WTt,yre)=>{var $ze=jI(),eXe=Ju();function tXe(t){return eXe(t)&&$ze(t)}yre.exports=tXe});var uL=_((VTt,wre)=>{var rXe=pd(),nXe=tS(),iXe=Ju(),sXe="[object Object]",oXe=Function.prototype,aXe=Object.prototype,Cre=oXe.toString,lXe=aXe.hasOwnProperty,cXe=Cre.call(Object);function uXe(t){if(!iXe(t)||rXe(t)!=sXe)return!1;var e=nXe(t);if(e===null)return!0;var r=lXe.call(e,"constructor")&&e.constructor;return typeof r=="function"&&r instanceof r&&Cre.call(r)==cXe}wre.exports=uXe});var AL=_((KTt,Ire)=>{function AXe(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="__proto__")return t[e]}Ire.exports=AXe});var rS=_((JTt,Bre)=>{var fXe=ZP(),pXe=Ry(),hXe=Object.prototype,gXe=hXe.hasOwnProperty;function dXe(t,e,r){var o=t[e];(!(gXe.call(t,e)&&pXe(o,r))||r===void 0&&!(e in t))&&fXe(t,e,r)}Bre.exports=dXe});var gd=_((zTt,vre)=>{var mXe=rS(),yXe=ZP();function EXe(t,e,r,o){var a=!r;r||(r={});for(var n=-1,u=e.length;++n{function CXe(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);return e}Dre.exports=CXe});var xre=_((ZTt,Sre)=>{var wXe=il(),IXe=JP(),BXe=Pre(),vXe=Object.prototype,DXe=vXe.hasOwnProperty;function PXe(t){if(!wXe(t))return BXe(t);var e=IXe(t),r=[];for(var o in t)o=="constructor"&&(e||!DXe.call(t,o))||r.push(o);return r}Sre.exports=PXe});var qy=_(($Tt,bre)=>{var SXe=zN(),xXe=xre(),bXe=jI();function kXe(t){return bXe(t)?SXe(t,!0):xXe(t)}bre.exports=kXe});var Qre=_((eRt,kre)=>{var QXe=gd(),FXe=qy();function TXe(t){return QXe(t,FXe(t))}kre.exports=TXe});var Mre=_((tRt,Lre)=>{var Fre=oL(),RXe=aL(),NXe=lL(),LXe=eS(),MXe=cL(),Tre=LI(),Rre=Hl(),OXe=Ere(),UXe=OI(),_Xe=OP(),HXe=il(),jXe=uL(),qXe=KP(),Nre=AL(),GXe=Qre();function YXe(t,e,r,o,a,n,u){var A=Nre(t,r),p=Nre(e,r),h=u.get(p);if(h){Fre(t,r,h);return}var E=n?n(A,p,r+"",t,e,u):void 0,I=E===void 0;if(I){var v=Rre(p),b=!v&&UXe(p),C=!v&&!b&&qXe(p);E=p,v||b||C?Rre(A)?E=A:OXe(A)?E=LXe(A):b?(I=!1,E=RXe(p,!0)):C?(I=!1,E=NXe(p,!0)):E=[]:jXe(p)||Tre(p)?(E=A,Tre(A)?E=GXe(A):(!HXe(A)||_Xe(A))&&(E=MXe(p))):I=!1}I&&(u.set(p,E),a(E,p,o,n,u),u.delete(p)),Fre(t,r,E)}Lre.exports=YXe});var _re=_((rRt,Ure)=>{var WXe=HP(),VXe=oL(),KXe=ire(),JXe=Mre(),zXe=il(),XXe=qy(),ZXe=AL();function Ore(t,e,r,o,a){t!==e&&KXe(e,function(n,u){if(a||(a=new WXe),zXe(n))JXe(t,e,u,r,Ore,o,a);else{var A=o?o(ZXe(t,u),n,u+"",t,e,a):void 0;A===void 0&&(A=n),VXe(t,u,A)}},XXe)}Ure.exports=Ore});var fL=_((nRt,Hre)=>{function $Xe(t){return t}Hre.exports=$Xe});var qre=_((iRt,jre)=>{function eZe(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}jre.exports=eZe});var pL=_((sRt,Yre)=>{var tZe=qre(),Gre=Math.max;function rZe(t,e,r){return e=Gre(e===void 0?t.length-1:e,0),function(){for(var o=arguments,a=-1,n=Gre(o.length-e,0),u=Array(n);++a{function nZe(t){return function(){return t}}Wre.exports=nZe});var zre=_((aRt,Jre)=>{var iZe=Vre(),Kre=sL(),sZe=fL(),oZe=Kre?function(t,e){return Kre(t,"toString",{configurable:!0,enumerable:!1,value:iZe(e),writable:!0})}:sZe;Jre.exports=oZe});var Zre=_((lRt,Xre)=>{var aZe=800,lZe=16,cZe=Date.now;function uZe(t){var e=0,r=0;return function(){var o=cZe(),a=lZe-(o-r);if(r=o,a>0){if(++e>=aZe)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}Xre.exports=uZe});var hL=_((cRt,$re)=>{var AZe=zre(),fZe=Zre(),pZe=fZe(AZe);$re.exports=pZe});var tne=_((uRt,ene)=>{var hZe=fL(),gZe=pL(),dZe=hL();function mZe(t,e){return dZe(gZe(t,e,hZe),t+"")}ene.exports=mZe});var nne=_((ARt,rne)=>{var yZe=Ry(),EZe=jI(),CZe=UI(),wZe=il();function IZe(t,e,r){if(!wZe(r))return!1;var o=typeof e;return(o=="number"?EZe(r)&&CZe(e,r.length):o=="string"&&e in r)?yZe(r[e],t):!1}rne.exports=IZe});var sne=_((fRt,ine)=>{var BZe=tne(),vZe=nne();function DZe(t){return BZe(function(e,r){var o=-1,a=r.length,n=a>1?r[a-1]:void 0,u=a>2?r[2]:void 0;for(n=t.length>3&&typeof n=="function"?(a--,n):void 0,u&&vZe(r[0],r[1],u)&&(n=a<3?void 0:n,a=1),e=Object(e);++o{var PZe=_re(),SZe=sne(),xZe=SZe(function(t,e,r,o){PZe(t,e,r,o)});one.exports=xZe});var je={};Kt(je,{AsyncActions:()=>mL,BufferStream:()=>dL,CachingStrategy:()=>Ene,DefaultStream:()=>yL,allSettledSafe:()=>Uc,assertNever:()=>CL,bufferStream:()=>Vy,buildIgnorePattern:()=>NZe,convertMapsToIndexableObjects:()=>iS,dynamicRequire:()=>vf,escapeRegExp:()=>kZe,getArrayWithDefault:()=>Gy,getFactoryWithDefault:()=>ol,getMapWithDefault:()=>Yy,getSetWithDefault:()=>dd,groupBy:()=>BL,isIndexableObject:()=>gL,isPathLike:()=>LZe,isTaggedYarnVersion:()=>bZe,makeDeferred:()=>dne,mapAndFilter:()=>sl,mapAndFind:()=>WI,mergeIntoTarget:()=>wne,overrideType:()=>QZe,parseBoolean:()=>VI,parseInt:()=>Ky,parseOptionalBoolean:()=>Cne,plural:()=>nS,prettifyAsyncErrors:()=>Wy,prettifySyncErrors:()=>wL,releaseAfterUseAsync:()=>TZe,replaceEnvVariables:()=>sS,sortMap:()=>ks,toMerged:()=>MZe,tryParseOptionalBoolean:()=>IL,validateEnum:()=>FZe});function bZe(t){return!!(pne.default.valid(t)&&t.match(/^[^-]+(-rc\.[0-9]+)?$/))}function nS(t,{one:e,more:r,zero:o=r}){return t===0?o:t===1?e:r}function kZe(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function QZe(t){}function CL(t){throw new Error(`Assertion failed: Unexpected object '${t}'`)}function FZe(t,e){let r=Object.values(t);if(!r.includes(e))throw new it(`Invalid value for enumeration: ${JSON.stringify(e)} (expected one of ${r.map(o=>JSON.stringify(o)).join(", ")})`);return e}function sl(t,e){let r=[];for(let o of t){let a=e(o);a!==hne&&r.push(a)}return r}function WI(t,e){for(let r of t){let o=e(r);if(o!==gne)return o}}function gL(t){return typeof t=="object"&&t!==null}async function Uc(t){let e=await Promise.allSettled(t),r=[];for(let o of e){if(o.status==="rejected")throw o.reason;r.push(o.value)}return r}function iS(t){if(t instanceof Map&&(t=Object.fromEntries(t)),gL(t))for(let e of Object.keys(t)){let r=t[e];gL(r)&&(t[e]=iS(r))}return t}function ol(t,e,r){let o=t.get(e);return typeof o>"u"&&t.set(e,o=r()),o}function Gy(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=[]),r}function dd(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=new Set),r}function Yy(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=new Map),r}async function TZe(t,e){if(e==null)return await t();try{return await t()}finally{await e()}}async function Wy(t,e){try{return await t()}catch(r){throw r.message=e(r.message),r}}function wL(t,e){try{return t()}catch(r){throw r.message=e(r.message),r}}async function Vy(t){return await new Promise((e,r)=>{let o=[];t.on("error",a=>{r(a)}),t.on("data",a=>{o.push(a)}),t.on("end",()=>{e(Buffer.concat(o))})})}function dne(){let t,e;return{promise:new Promise((o,a)=>{t=o,e=a}),resolve:t,reject:e}}function mne(t){return YI(ue.fromPortablePath(t))}function yne(path){let physicalPath=ue.fromPortablePath(path),currentCacheEntry=YI.cache[physicalPath];delete YI.cache[physicalPath];let result;try{result=mne(physicalPath);let freshCacheEntry=YI.cache[physicalPath],dynamicModule=eval("module"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{YI.cache[physicalPath]=currentCacheEntry}return result}function RZe(t){let e=lne.get(t),r=oe.statSync(t);if(e?.mtime===r.mtimeMs)return e.instance;let o=yne(t);return lne.set(t,{mtime:r.mtimeMs,instance:o}),o}function vf(t,{cachingStrategy:e=2}={}){switch(e){case 0:return yne(t);case 1:return RZe(t);case 2:return mne(t);default:throw new Error("Unsupported caching strategy")}}function ks(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let o=[];for(let n of e)o.push(r.map(u=>n(u)));let a=r.map((n,u)=>u);return a.sort((n,u)=>{for(let A of o){let p=A[n]A[u]?1:0;if(p!==0)return p}return 0}),a.map(n=>r[n])}function NZe(t){return t.length===0?null:t.map(e=>`(${Ane.default.makeRe(e,{windows:!1,dot:!0}).source})`).join("|")}function sS(t,{env:e}){let r=/\${(?[\d\w_]+)(?:)?(?:-(?[^}]*))?}/g;return t.replace(r,(...o)=>{let{variableName:a,colon:n,fallback:u}=o[o.length-1],A=Object.hasOwn(e,a),p=e[a];if(p||A&&!n)return p;if(u!=null)return u;throw new it(`Environment variable not found (${a})`)})}function VI(t){switch(t){case"true":case"1":case 1:case!0:return!0;case"false":case"0":case 0:case!1:return!1;default:throw new Error(`Couldn't parse "${t}" as a boolean`)}}function Cne(t){return typeof t>"u"?t:VI(t)}function IL(t){try{return Cne(t)}catch{return null}}function LZe(t){return!!(ue.isAbsolute(t)||t.match(/^(\.{1,2}|~)\//))}function wne(t,...e){let r=u=>({value:u}),o=r(t),a=e.map(u=>r(u)),{value:n}=(0,une.default)(o,...a,(u,A)=>{if(Array.isArray(u)&&Array.isArray(A)){for(let p of A)u.find(h=>(0,cne.default)(h,p))||u.push(p);return u}});return n}function MZe(...t){return wne({},...t)}function BL(t,e){let r=Object.create(null);for(let o of t){let a=o[e];r[a]??=[],r[a].push(o)}return r}function Ky(t){return typeof t=="string"?Number.parseInt(t,10):t}var cne,une,Ane,fne,pne,EL,hne,gne,dL,mL,yL,YI,lne,Ene,jl=Et(()=>{Pt();qt();cne=$e(zte()),une=$e(ane()),Ane=$e(Zo()),fne=$e(nd()),pne=$e(zn()),EL=Be("stream");hne=Symbol();sl.skip=hne;gne=Symbol();WI.skip=gne;dL=class extends EL.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(r,o,a){if(o!=="buffer"||!Buffer.isBuffer(r))throw new Error("Assertion failed: BufferStream only accept buffers");this.chunks.push(r),a(null,null)}_flush(r){r(null,Buffer.concat(this.chunks))}};mL=class{constructor(e){this.deferred=new Map;this.promises=new Map;this.limit=(0,fne.default)(e)}set(e,r){let o=this.deferred.get(e);typeof o>"u"&&this.deferred.set(e,o=dne());let a=this.limit(()=>r());return this.promises.set(e,a),a.then(()=>{this.promises.get(e)===a&&o.resolve()},n=>{this.promises.get(e)===a&&o.reject(n)}),o.promise}reduce(e,r){let o=this.promises.get(e)??Promise.resolve();this.set(e,()=>r(o))}async wait(){await Promise.all(this.promises.values())}},yL=class extends EL.Transform{constructor(r=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=r}_transform(r,o,a){if(o!=="buffer"||!Buffer.isBuffer(r))throw new Error("Assertion failed: DefaultStream only accept buffers");this.active=!1,a(null,r)}_flush(r){this.active&&this.ifEmpty.length>0?r(null,this.ifEmpty):r(null)}},YI=eval("require");lne=new Map;Ene=(o=>(o[o.NoCache=0]="NoCache",o[o.FsTime=1]="FsTime",o[o.Node=2]="Node",o))(Ene||{})});var Jy,vL,DL,Ine=Et(()=>{Jy=(r=>(r.HARD="HARD",r.SOFT="SOFT",r))(Jy||{}),vL=(o=>(o.Dependency="Dependency",o.PeerDependency="PeerDependency",o.PeerDependencyMeta="PeerDependencyMeta",o))(vL||{}),DL=(o=>(o.Inactive="inactive",o.Redundant="redundant",o.Active="active",o))(DL||{})});var de={};Kt(de,{LogLevel:()=>uS,Style:()=>aS,Type:()=>yt,addLogFilterSupport:()=>zI,applyColor:()=>Ks,applyHyperlink:()=>Xy,applyStyle:()=>md,json:()=>yd,jsonOrPretty:()=>_Ze,mark:()=>kL,pretty:()=>Ot,prettyField:()=>zu,prettyList:()=>bL,prettyTruncatedLocatorList:()=>cS,stripAnsi:()=>zy.default,supportsColor:()=>lS,supportsHyperlinks:()=>xL,tuple:()=>_c});function Bne(t){let e=["KiB","MiB","GiB","TiB"],r=e.length;for(;r>1&&t<1024**r;)r-=1;let o=1024**r;return`${Math.floor(t*100/o)/100} ${e[r-1]}`}function _c(t,e){return[e,t]}function md(t,e,r){return t.get("enableColors")&&r&2&&(e=JI.default.bold(e)),e}function Ks(t,e,r){if(!t.get("enableColors"))return e;let o=OZe.get(r);if(o===null)return e;let a=typeof o>"u"?r:SL.level>=3?o[0]:o[1],n=typeof a=="number"?PL.ansi256(a):a.startsWith("#")?PL.hex(a):PL[a];if(typeof n!="function")throw new Error(`Invalid format type ${a}`);return n(e)}function Xy(t,e,r){return t.get("enableHyperlinks")?UZe?`\x1B]8;;${r}\x1B\\${e}\x1B]8;;\x1B\\`:`\x1B]8;;${r}\x07${e}\x1B]8;;\x07`:e}function Ot(t,e,r){if(e===null)return Ks(t,"null",yt.NULL);if(Object.hasOwn(oS,r))return oS[r].pretty(t,e);if(typeof e!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return Ks(t,e,r)}function bL(t,e,r,{separator:o=", "}={}){return[...e].map(a=>Ot(t,a,r)).join(o)}function yd(t,e){if(t===null)return null;if(Object.hasOwn(oS,e))return oS[e].json(t);if(typeof t!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof t}`);return t}function _Ze(t,e,[r,o]){return t?yd(r,o):Ot(e,r,o)}function kL(t){return{Check:Ks(t,"\u2713","green"),Cross:Ks(t,"\u2718","red"),Question:Ks(t,"?","cyan")}}function zu(t,{label:e,value:[r,o]}){return`${Ot(t,e,yt.CODE)}: ${Ot(t,r,o)}`}function cS(t,e,r){let o=[],a=[...e],n=r;for(;a.length>0;){let h=a[0],E=`${jr(t,h)}, `,I=QL(h).length+2;if(o.length>0&&nh).join("").slice(0,-2);let u="X".repeat(a.length.toString().length),A=`and ${u} more.`,p=a.length;for(;o.length>1&&nh).join(""),A.replace(u,Ot(t,p,yt.NUMBER))].join("")}function zI(t,{configuration:e}){let r=e.get("logFilters"),o=new Map,a=new Map,n=[];for(let I of r){let v=I.get("level");if(typeof v>"u")continue;let b=I.get("code");typeof b<"u"&&o.set(b,v);let C=I.get("text");typeof C<"u"&&a.set(C,v);let T=I.get("pattern");typeof T<"u"&&n.push([vne.default.matcher(T,{contains:!0}),v])}n.reverse();let u=(I,v,b)=>{if(I===null||I===0)return b;let C=a.size>0||n.length>0?(0,zy.default)(v):v;if(a.size>0){let T=a.get(C);if(typeof T<"u")return T??b}if(n.length>0){for(let[T,L]of n)if(T(C))return L??b}if(o.size>0){let T=o.get(Wu(I));if(typeof T<"u")return T??b}return b},A=t.reportInfo,p=t.reportWarning,h=t.reportError,E=function(I,v,b,C){switch(u(v,b,C)){case"info":A.call(I,v,b);break;case"warning":p.call(I,v??0,b);break;case"error":h.call(I,v??0,b);break}};t.reportInfo=function(...I){return E(this,...I,"info")},t.reportWarning=function(...I){return E(this,...I,"warning")},t.reportError=function(...I){return E(this,...I,"error")}}var JI,KI,vne,zy,Dne,yt,aS,SL,lS,xL,PL,OZe,So,oS,UZe,uS,ql=Et(()=>{Pt();JI=$e(vN()),KI=$e(ed());qt();vne=$e(Zo()),zy=$e(MP()),Dne=Be("util");pP();xo();yt={NO_HINT:"NO_HINT",ID:"ID",NULL:"NULL",SCOPE:"SCOPE",NAME:"NAME",RANGE:"RANGE",REFERENCE:"REFERENCE",NUMBER:"NUMBER",PATH:"PATH",URL:"URL",ADDED:"ADDED",REMOVED:"REMOVED",CODE:"CODE",INSPECT:"INSPECT",DURATION:"DURATION",SIZE:"SIZE",SIZE_DIFF:"SIZE_DIFF",IDENT:"IDENT",DESCRIPTOR:"DESCRIPTOR",LOCATOR:"LOCATOR",RESOLUTION:"RESOLUTION",DEPENDENT:"DEPENDENT",PACKAGE_EXTENSION:"PACKAGE_EXTENSION",SETTING:"SETTING",MARKDOWN:"MARKDOWN",MARKDOWN_INLINE:"MARKDOWN_INLINE"},aS=(e=>(e[e.BOLD=2]="BOLD",e))(aS||{}),SL=KI.default.GITHUB_ACTIONS?{level:2}:JI.default.supportsColor?{level:JI.default.supportsColor.level}:{level:0},lS=SL.level!==0,xL=lS&&!KI.default.GITHUB_ACTIONS&&!KI.default.CIRCLE&&!KI.default.GITLAB,PL=new JI.default.Instance(SL),OZe=new Map([[yt.NO_HINT,null],[yt.NULL,["#a853b5",129]],[yt.SCOPE,["#d75f00",166]],[yt.NAME,["#d7875f",173]],[yt.RANGE,["#00afaf",37]],[yt.REFERENCE,["#87afff",111]],[yt.NUMBER,["#ffd700",220]],[yt.PATH,["#d75fd7",170]],[yt.URL,["#d75fd7",170]],[yt.ADDED,["#5faf00",70]],[yt.REMOVED,["#ff3131",160]],[yt.CODE,["#87afff",111]],[yt.SIZE,["#ffd700",220]]]),So=t=>t;oS={[yt.ID]:So({pretty:(t,e)=>typeof e=="number"?Ks(t,`${e}`,yt.NUMBER):Ks(t,e,yt.CODE),json:t=>t}),[yt.INSPECT]:So({pretty:(t,e)=>(0,Dne.inspect)(e,{depth:1/0,colors:t.get("enableColors"),compact:!0,breakLength:1/0}),json:t=>t}),[yt.NUMBER]:So({pretty:(t,e)=>Ks(t,`${e}`,yt.NUMBER),json:t=>t}),[yt.IDENT]:So({pretty:(t,e)=>cs(t,e),json:t=>fn(t)}),[yt.LOCATOR]:So({pretty:(t,e)=>jr(t,e),json:t=>xa(t)}),[yt.DESCRIPTOR]:So({pretty:(t,e)=>qn(t,e),json:t=>Sa(t)}),[yt.RESOLUTION]:So({pretty:(t,{descriptor:e,locator:r})=>XI(t,e,r),json:({descriptor:t,locator:e})=>({descriptor:Sa(t),locator:e!==null?xa(e):null})}),[yt.DEPENDENT]:So({pretty:(t,{locator:e,descriptor:r})=>FL(t,e,r),json:({locator:t,descriptor:e})=>({locator:xa(t),descriptor:Sa(e)})}),[yt.PACKAGE_EXTENSION]:So({pretty:(t,e)=>{switch(e.type){case"Dependency":return`${cs(t,e.parentDescriptor)} \u27A4 ${Ks(t,"dependencies",yt.CODE)} \u27A4 ${cs(t,e.descriptor)}`;case"PeerDependency":return`${cs(t,e.parentDescriptor)} \u27A4 ${Ks(t,"peerDependencies",yt.CODE)} \u27A4 ${cs(t,e.descriptor)}`;case"PeerDependencyMeta":return`${cs(t,e.parentDescriptor)} \u27A4 ${Ks(t,"peerDependenciesMeta",yt.CODE)} \u27A4 ${cs(t,Js(e.selector))} \u27A4 ${Ks(t,e.key,yt.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:t=>{switch(t.type){case"Dependency":return`${fn(t.parentDescriptor)} > ${fn(t.descriptor)}`;case"PeerDependency":return`${fn(t.parentDescriptor)} >> ${fn(t.descriptor)}`;case"PeerDependencyMeta":return`${fn(t.parentDescriptor)} >> ${t.selector} / ${t.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${t.type}`)}}}),[yt.SETTING]:So({pretty:(t,e)=>(t.get(e),Xy(t,Ks(t,e,yt.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:t=>t}),[yt.DURATION]:So({pretty:(t,e)=>{if(e>1e3*60){let r=Math.floor(e/1e3/60),o=Math.ceil((e-r*60*1e3)/1e3);return o===0?`${r}m`:`${r}m ${o}s`}else{let r=Math.floor(e/1e3),o=e-r*1e3;return o===0?`${r}s`:`${r}s ${o}ms`}},json:t=>t}),[yt.SIZE]:So({pretty:(t,e)=>Ks(t,Bne(e),yt.NUMBER),json:t=>t}),[yt.SIZE_DIFF]:So({pretty:(t,e)=>{let r=e>=0?"+":"-",o=r==="+"?yt.REMOVED:yt.ADDED;return Ks(t,`${r} ${Bne(Math.max(Math.abs(e),1))}`,o)},json:t=>t}),[yt.PATH]:So({pretty:(t,e)=>Ks(t,ue.fromPortablePath(e),yt.PATH),json:t=>ue.fromPortablePath(t)}),[yt.MARKDOWN]:So({pretty:(t,{text:e,format:r,paragraphs:o})=>Do(e,{format:r,paragraphs:o}),json:({text:t})=>t}),[yt.MARKDOWN_INLINE]:So({pretty:(t,e)=>(e=e.replace(/(`+)((?:.|[\n])*?)\1/g,(r,o,a)=>Ot(t,o+a+o,yt.CODE)),e=e.replace(/(\*\*)((?:.|[\n])*?)\1/g,(r,o,a)=>md(t,a,2)),e),json:t=>t})};UZe=!!process.env.KONSOLE_VERSION;uS=(a=>(a.Error="error",a.Warning="warning",a.Info="info",a.Discard="discard",a))(uS||{})});var Pne=_(Zy=>{"use strict";Object.defineProperty(Zy,"__esModule",{value:!0});Zy.splitWhen=Zy.flatten=void 0;function HZe(t){return t.reduce((e,r)=>[].concat(e,r),[])}Zy.flatten=HZe;function jZe(t,e){let r=[[]],o=0;for(let a of t)e(a)?(o++,r[o]=[]):r[o].push(a);return r}Zy.splitWhen=jZe});var Sne=_(AS=>{"use strict";Object.defineProperty(AS,"__esModule",{value:!0});AS.isEnoentCodeError=void 0;function qZe(t){return t.code==="ENOENT"}AS.isEnoentCodeError=qZe});var xne=_(fS=>{"use strict";Object.defineProperty(fS,"__esModule",{value:!0});fS.createDirentFromStats=void 0;var TL=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function GZe(t,e){return new TL(t,e)}fS.createDirentFromStats=GZe});var bne=_(Xu=>{"use strict";Object.defineProperty(Xu,"__esModule",{value:!0});Xu.removeLeadingDotSegment=Xu.escape=Xu.makeAbsolute=Xu.unixify=void 0;var YZe=Be("path"),WZe=2,VZe=/(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g;function KZe(t){return t.replace(/\\/g,"/")}Xu.unixify=KZe;function JZe(t,e){return YZe.resolve(t,e)}Xu.makeAbsolute=JZe;function zZe(t){return t.replace(VZe,"\\$2")}Xu.escape=zZe;function XZe(t){if(t.charAt(0)==="."){let e=t.charAt(1);if(e==="/"||e==="\\")return t.slice(WZe)}return t}Xu.removeLeadingDotSegment=XZe});var Qne=_((xRt,kne)=>{kne.exports=function(e){if(typeof e!="string"||e==="")return!1;for(var r;r=/(\\).|([@?!+*]\(.*\))/g.exec(e);){if(r[2])return!0;e=e.slice(r.index+r[0].length)}return!1}});var Rne=_((bRt,Tne)=>{var ZZe=Qne(),Fne={"{":"}","(":")","[":"]"},$Ze=function(t){if(t[0]==="!")return!0;for(var e=0,r=-2,o=-2,a=-2,n=-2,u=-2;ee&&(u===-1||u>o||(u=t.indexOf("\\",e),u===-1||u>o)))||a!==-1&&t[e]==="{"&&t[e+1]!=="}"&&(a=t.indexOf("}",e),a>e&&(u=t.indexOf("\\",e),u===-1||u>a))||n!==-1&&t[e]==="("&&t[e+1]==="?"&&/[:!=]/.test(t[e+2])&&t[e+3]!==")"&&(n=t.indexOf(")",e),n>e&&(u=t.indexOf("\\",e),u===-1||u>n))||r!==-1&&t[e]==="("&&t[e+1]!=="|"&&(rr&&(u=t.indexOf("\\",r),u===-1||u>n))))return!0;if(t[e]==="\\"){var A=t[e+1];e+=2;var p=Fne[A];if(p){var h=t.indexOf(p,e);h!==-1&&(e=h+1)}if(t[e]==="!")return!0}else e++}return!1},e$e=function(t){if(t[0]==="!")return!0;for(var e=0;e{"use strict";var t$e=Rne(),r$e=Be("path").posix.dirname,n$e=Be("os").platform()==="win32",RL="/",i$e=/\\/g,s$e=/[\{\[].*[\}\]]$/,o$e=/(^|[^\\])([\{\[]|\([^\)]+$)/,a$e=/\\([\!\*\?\|\[\]\(\)\{\}])/g;Nne.exports=function(e,r){var o=Object.assign({flipBackslashes:!0},r);o.flipBackslashes&&n$e&&e.indexOf(RL)<0&&(e=e.replace(i$e,RL)),s$e.test(e)&&(e+=RL),e+="a";do e=r$e(e);while(t$e(e)||o$e.test(e));return e.replace(a$e,"$1")}});var Gne=_(qr=>{"use strict";Object.defineProperty(qr,"__esModule",{value:!0});qr.matchAny=qr.convertPatternsToRe=qr.makeRe=qr.getPatternParts=qr.expandBraceExpansion=qr.expandPatternsWithBraceExpansion=qr.isAffectDepthOfReadingPattern=qr.endsWithSlashGlobStar=qr.hasGlobStar=qr.getBaseDirectory=qr.isPatternRelatedToParentDirectory=qr.getPatternsOutsideCurrentDirectory=qr.getPatternsInsideCurrentDirectory=qr.getPositivePatterns=qr.getNegativePatterns=qr.isPositivePattern=qr.isNegativePattern=qr.convertToNegativePattern=qr.convertToPositivePattern=qr.isDynamicPattern=qr.isStaticPattern=void 0;var l$e=Be("path"),c$e=Lne(),NL=Zo(),Mne="**",u$e="\\",A$e=/[*?]|^!/,f$e=/\[[^[]*]/,p$e=/(?:^|[^!*+?@])\([^(]*\|[^|]*\)/,h$e=/[!*+?@]\([^(]*\)/,g$e=/,|\.\./;function One(t,e={}){return!Une(t,e)}qr.isStaticPattern=One;function Une(t,e={}){return t===""?!1:!!(e.caseSensitiveMatch===!1||t.includes(u$e)||A$e.test(t)||f$e.test(t)||p$e.test(t)||e.extglob!==!1&&h$e.test(t)||e.braceExpansion!==!1&&d$e(t))}qr.isDynamicPattern=Une;function d$e(t){let e=t.indexOf("{");if(e===-1)return!1;let r=t.indexOf("}",e+1);if(r===-1)return!1;let o=t.slice(e,r);return g$e.test(o)}function m$e(t){return pS(t)?t.slice(1):t}qr.convertToPositivePattern=m$e;function y$e(t){return"!"+t}qr.convertToNegativePattern=y$e;function pS(t){return t.startsWith("!")&&t[1]!=="("}qr.isNegativePattern=pS;function _ne(t){return!pS(t)}qr.isPositivePattern=_ne;function E$e(t){return t.filter(pS)}qr.getNegativePatterns=E$e;function C$e(t){return t.filter(_ne)}qr.getPositivePatterns=C$e;function w$e(t){return t.filter(e=>!LL(e))}qr.getPatternsInsideCurrentDirectory=w$e;function I$e(t){return t.filter(LL)}qr.getPatternsOutsideCurrentDirectory=I$e;function LL(t){return t.startsWith("..")||t.startsWith("./..")}qr.isPatternRelatedToParentDirectory=LL;function B$e(t){return c$e(t,{flipBackslashes:!1})}qr.getBaseDirectory=B$e;function v$e(t){return t.includes(Mne)}qr.hasGlobStar=v$e;function Hne(t){return t.endsWith("/"+Mne)}qr.endsWithSlashGlobStar=Hne;function D$e(t){let e=l$e.basename(t);return Hne(t)||One(e)}qr.isAffectDepthOfReadingPattern=D$e;function P$e(t){return t.reduce((e,r)=>e.concat(jne(r)),[])}qr.expandPatternsWithBraceExpansion=P$e;function jne(t){return NL.braces(t,{expand:!0,nodupes:!0})}qr.expandBraceExpansion=jne;function S$e(t,e){let{parts:r}=NL.scan(t,Object.assign(Object.assign({},e),{parts:!0}));return r.length===0&&(r=[t]),r[0].startsWith("/")&&(r[0]=r[0].slice(1),r.unshift("")),r}qr.getPatternParts=S$e;function qne(t,e){return NL.makeRe(t,e)}qr.makeRe=qne;function x$e(t,e){return t.map(r=>qne(r,e))}qr.convertPatternsToRe=x$e;function b$e(t,e){return e.some(r=>r.test(t))}qr.matchAny=b$e});var Kne=_((FRt,Vne)=>{"use strict";var k$e=Be("stream"),Yne=k$e.PassThrough,Q$e=Array.prototype.slice;Vne.exports=F$e;function F$e(){let t=[],e=Q$e.call(arguments),r=!1,o=e[e.length-1];o&&!Array.isArray(o)&&o.pipe==null?e.pop():o={};let a=o.end!==!1,n=o.pipeError===!0;o.objectMode==null&&(o.objectMode=!0),o.highWaterMark==null&&(o.highWaterMark=64*1024);let u=Yne(o);function A(){for(let E=0,I=arguments.length;E0||(r=!1,p())}function b(C){function T(){C.removeListener("merge2UnpipeEnd",T),C.removeListener("end",T),n&&C.removeListener("error",L),v()}function L(U){u.emit("error",U)}if(C._readableState.endEmitted)return v();C.on("merge2UnpipeEnd",T),C.on("end",T),n&&C.on("error",L),C.pipe(u,{end:!1}),C.resume()}for(let C=0;C{"use strict";Object.defineProperty(hS,"__esModule",{value:!0});hS.merge=void 0;var T$e=Kne();function R$e(t){let e=T$e(t);return t.forEach(r=>{r.once("error",o=>e.emit("error",o))}),e.once("close",()=>Jne(t)),e.once("end",()=>Jne(t)),e}hS.merge=R$e;function Jne(t){t.forEach(e=>e.emit("close"))}});var Xne=_($y=>{"use strict";Object.defineProperty($y,"__esModule",{value:!0});$y.isEmpty=$y.isString=void 0;function N$e(t){return typeof t=="string"}$y.isString=N$e;function L$e(t){return t===""}$y.isEmpty=L$e});var Df=_(bo=>{"use strict";Object.defineProperty(bo,"__esModule",{value:!0});bo.string=bo.stream=bo.pattern=bo.path=bo.fs=bo.errno=bo.array=void 0;var M$e=Pne();bo.array=M$e;var O$e=Sne();bo.errno=O$e;var U$e=xne();bo.fs=U$e;var _$e=bne();bo.path=_$e;var H$e=Gne();bo.pattern=H$e;var j$e=zne();bo.stream=j$e;var q$e=Xne();bo.string=q$e});var eie=_(ko=>{"use strict";Object.defineProperty(ko,"__esModule",{value:!0});ko.convertPatternGroupToTask=ko.convertPatternGroupsToTasks=ko.groupPatternsByBaseDirectory=ko.getNegativePatternsAsPositive=ko.getPositivePatterns=ko.convertPatternsToTasks=ko.generate=void 0;var Pf=Df();function G$e(t,e){let r=Zne(t),o=$ne(t,e.ignore),a=r.filter(p=>Pf.pattern.isStaticPattern(p,e)),n=r.filter(p=>Pf.pattern.isDynamicPattern(p,e)),u=ML(a,o,!1),A=ML(n,o,!0);return u.concat(A)}ko.generate=G$e;function ML(t,e,r){let o=[],a=Pf.pattern.getPatternsOutsideCurrentDirectory(t),n=Pf.pattern.getPatternsInsideCurrentDirectory(t),u=OL(a),A=OL(n);return o.push(...UL(u,e,r)),"."in A?o.push(_L(".",n,e,r)):o.push(...UL(A,e,r)),o}ko.convertPatternsToTasks=ML;function Zne(t){return Pf.pattern.getPositivePatterns(t)}ko.getPositivePatterns=Zne;function $ne(t,e){return Pf.pattern.getNegativePatterns(t).concat(e).map(Pf.pattern.convertToPositivePattern)}ko.getNegativePatternsAsPositive=$ne;function OL(t){let e={};return t.reduce((r,o)=>{let a=Pf.pattern.getBaseDirectory(o);return a in r?r[a].push(o):r[a]=[o],r},e)}ko.groupPatternsByBaseDirectory=OL;function UL(t,e,r){return Object.keys(t).map(o=>_L(o,t[o],e,r))}ko.convertPatternGroupsToTasks=UL;function _L(t,e,r,o){return{dynamic:o,positive:e,negative:r,base:t,patterns:[].concat(e,r.map(Pf.pattern.convertToNegativePattern))}}ko.convertPatternGroupToTask=_L});var rie=_(eE=>{"use strict";Object.defineProperty(eE,"__esModule",{value:!0});eE.removeDuplicateSlashes=eE.transform=void 0;var Y$e=/(?!^)\/{2,}/g;function W$e(t){return t.map(e=>tie(e))}eE.transform=W$e;function tie(t){return t.replace(Y$e,"/")}eE.removeDuplicateSlashes=tie});var iie=_(gS=>{"use strict";Object.defineProperty(gS,"__esModule",{value:!0});gS.read=void 0;function V$e(t,e,r){e.fs.lstat(t,(o,a)=>{if(o!==null){nie(r,o);return}if(!a.isSymbolicLink()||!e.followSymbolicLink){HL(r,a);return}e.fs.stat(t,(n,u)=>{if(n!==null){if(e.throwErrorOnBrokenSymbolicLink){nie(r,n);return}HL(r,a);return}e.markSymbolicLink&&(u.isSymbolicLink=()=>!0),HL(r,u)})})}gS.read=V$e;function nie(t,e){t(e)}function HL(t,e){t(null,e)}});var sie=_(dS=>{"use strict";Object.defineProperty(dS,"__esModule",{value:!0});dS.read=void 0;function K$e(t,e){let r=e.fs.lstatSync(t);if(!r.isSymbolicLink()||!e.followSymbolicLink)return r;try{let o=e.fs.statSync(t);return e.markSymbolicLink&&(o.isSymbolicLink=()=>!0),o}catch(o){if(!e.throwErrorOnBrokenSymbolicLink)return r;throw o}}dS.read=K$e});var oie=_(zp=>{"use strict";Object.defineProperty(zp,"__esModule",{value:!0});zp.createFileSystemAdapter=zp.FILE_SYSTEM_ADAPTER=void 0;var mS=Be("fs");zp.FILE_SYSTEM_ADAPTER={lstat:mS.lstat,stat:mS.stat,lstatSync:mS.lstatSync,statSync:mS.statSync};function J$e(t){return t===void 0?zp.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},zp.FILE_SYSTEM_ADAPTER),t)}zp.createFileSystemAdapter=J$e});var aie=_(qL=>{"use strict";Object.defineProperty(qL,"__esModule",{value:!0});var z$e=oie(),jL=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=z$e.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,r){return e??r}};qL.default=jL});var Ed=_(Xp=>{"use strict";Object.defineProperty(Xp,"__esModule",{value:!0});Xp.statSync=Xp.stat=Xp.Settings=void 0;var lie=iie(),X$e=sie(),YL=aie();Xp.Settings=YL.default;function Z$e(t,e,r){if(typeof e=="function"){lie.read(t,WL(),e);return}lie.read(t,WL(e),r)}Xp.stat=Z$e;function $$e(t,e){let r=WL(e);return X$e.read(t,r)}Xp.statSync=$$e;function WL(t={}){return t instanceof YL.default?t:new YL.default(t)}});var uie=_((qRt,cie)=>{cie.exports=eet;function eet(t,e){var r,o,a,n=!0;Array.isArray(t)?(r=[],o=t.length):(a=Object.keys(t),r={},o=a.length);function u(p){function h(){e&&e(p,r),e=null}n?process.nextTick(h):h()}function A(p,h,E){r[p]=E,(--o===0||h)&&u(h)}o?a?a.forEach(function(p){t[p](function(h,E){A(p,h,E)})}):t.forEach(function(p,h){p(function(E,I){A(h,E,I)})}):u(null),n=!1}});var VL=_(ES=>{"use strict";Object.defineProperty(ES,"__esModule",{value:!0});ES.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var yS=process.versions.node.split(".");if(yS[0]===void 0||yS[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var Aie=Number.parseInt(yS[0],10),tet=Number.parseInt(yS[1],10),fie=10,ret=10,net=Aie>fie,iet=Aie===fie&&tet>=ret;ES.IS_SUPPORT_READDIR_WITH_FILE_TYPES=net||iet});var pie=_(CS=>{"use strict";Object.defineProperty(CS,"__esModule",{value:!0});CS.createDirentFromStats=void 0;var KL=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function set(t,e){return new KL(t,e)}CS.createDirentFromStats=set});var JL=_(wS=>{"use strict";Object.defineProperty(wS,"__esModule",{value:!0});wS.fs=void 0;var oet=pie();wS.fs=oet});var zL=_(IS=>{"use strict";Object.defineProperty(IS,"__esModule",{value:!0});IS.joinPathSegments=void 0;function aet(t,e,r){return t.endsWith(r)?t+e:t+r+e}IS.joinPathSegments=aet});var Eie=_(Zp=>{"use strict";Object.defineProperty(Zp,"__esModule",{value:!0});Zp.readdir=Zp.readdirWithFileTypes=Zp.read=void 0;var cet=Ed(),hie=uie(),uet=VL(),gie=JL(),die=zL();function Aet(t,e,r){if(!e.stats&&uet.IS_SUPPORT_READDIR_WITH_FILE_TYPES){mie(t,e,r);return}yie(t,e,r)}Zp.read=Aet;function mie(t,e,r){e.fs.readdir(t,{withFileTypes:!0},(o,a)=>{if(o!==null){BS(r,o);return}let n=a.map(A=>({dirent:A,name:A.name,path:die.joinPathSegments(t,A.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){XL(r,n);return}let u=n.map(A=>fet(A,e));hie(u,(A,p)=>{if(A!==null){BS(r,A);return}XL(r,p)})})}Zp.readdirWithFileTypes=mie;function fet(t,e){return r=>{if(!t.dirent.isSymbolicLink()){r(null,t);return}e.fs.stat(t.path,(o,a)=>{if(o!==null){if(e.throwErrorOnBrokenSymbolicLink){r(o);return}r(null,t);return}t.dirent=gie.fs.createDirentFromStats(t.name,a),r(null,t)})}}function yie(t,e,r){e.fs.readdir(t,(o,a)=>{if(o!==null){BS(r,o);return}let n=a.map(u=>{let A=die.joinPathSegments(t,u,e.pathSegmentSeparator);return p=>{cet.stat(A,e.fsStatSettings,(h,E)=>{if(h!==null){p(h);return}let I={name:u,path:A,dirent:gie.fs.createDirentFromStats(u,E)};e.stats&&(I.stats=E),p(null,I)})}});hie(n,(u,A)=>{if(u!==null){BS(r,u);return}XL(r,A)})})}Zp.readdir=yie;function BS(t,e){t(e)}function XL(t,e){t(null,e)}});var vie=_($p=>{"use strict";Object.defineProperty($p,"__esModule",{value:!0});$p.readdir=$p.readdirWithFileTypes=$p.read=void 0;var pet=Ed(),het=VL(),Cie=JL(),wie=zL();function get(t,e){return!e.stats&&het.IS_SUPPORT_READDIR_WITH_FILE_TYPES?Iie(t,e):Bie(t,e)}$p.read=get;function Iie(t,e){return e.fs.readdirSync(t,{withFileTypes:!0}).map(o=>{let a={dirent:o,name:o.name,path:wie.joinPathSegments(t,o.name,e.pathSegmentSeparator)};if(a.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let n=e.fs.statSync(a.path);a.dirent=Cie.fs.createDirentFromStats(a.name,n)}catch(n){if(e.throwErrorOnBrokenSymbolicLink)throw n}return a})}$p.readdirWithFileTypes=Iie;function Bie(t,e){return e.fs.readdirSync(t).map(o=>{let a=wie.joinPathSegments(t,o,e.pathSegmentSeparator),n=pet.statSync(a,e.fsStatSettings),u={name:o,path:a,dirent:Cie.fs.createDirentFromStats(o,n)};return e.stats&&(u.stats=n),u})}$p.readdir=Bie});var Die=_(eh=>{"use strict";Object.defineProperty(eh,"__esModule",{value:!0});eh.createFileSystemAdapter=eh.FILE_SYSTEM_ADAPTER=void 0;var tE=Be("fs");eh.FILE_SYSTEM_ADAPTER={lstat:tE.lstat,stat:tE.stat,lstatSync:tE.lstatSync,statSync:tE.statSync,readdir:tE.readdir,readdirSync:tE.readdirSync};function det(t){return t===void 0?eh.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},eh.FILE_SYSTEM_ADAPTER),t)}eh.createFileSystemAdapter=det});var Pie=_($L=>{"use strict";Object.defineProperty($L,"__esModule",{value:!0});var met=Be("path"),yet=Ed(),Eet=Die(),ZL=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=Eet.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,met.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new yet.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e??r}};$L.default=ZL});var vS=_(th=>{"use strict";Object.defineProperty(th,"__esModule",{value:!0});th.Settings=th.scandirSync=th.scandir=void 0;var Sie=Eie(),Cet=vie(),eM=Pie();th.Settings=eM.default;function wet(t,e,r){if(typeof e=="function"){Sie.read(t,tM(),e);return}Sie.read(t,tM(e),r)}th.scandir=wet;function Iet(t,e){let r=tM(e);return Cet.read(t,r)}th.scandirSync=Iet;function tM(t={}){return t instanceof eM.default?t:new eM.default(t)}});var bie=_(($Rt,xie)=>{"use strict";function Bet(t){var e=new t,r=e;function o(){var n=e;return n.next?e=n.next:(e=new t,r=e),n.next=null,n}function a(n){r.next=n,r=n}return{get:o,release:a}}xie.exports=Bet});var Qie=_((eNt,rM)=>{"use strict";var vet=bie();function kie(t,e,r){if(typeof t=="function"&&(r=e,e=t,t=null),r<1)throw new Error("fastqueue concurrency must be greater than 1");var o=vet(Det),a=null,n=null,u=0,A=null,p={push:T,drain:Gl,saturated:Gl,pause:E,paused:!1,concurrency:r,running:h,resume:b,idle:C,length:I,getQueue:v,unshift:L,empty:Gl,kill:J,killAndDrain:te,error:le};return p;function h(){return u}function E(){p.paused=!0}function I(){for(var pe=a,Ae=0;pe;)pe=pe.next,Ae++;return Ae}function v(){for(var pe=a,Ae=[];pe;)Ae.push(pe.value),pe=pe.next;return Ae}function b(){if(!!p.paused){p.paused=!1;for(var pe=0;pe{"use strict";Object.defineProperty(Zu,"__esModule",{value:!0});Zu.joinPathSegments=Zu.replacePathSegmentSeparator=Zu.isAppliedFilter=Zu.isFatalError=void 0;function xet(t,e){return t.errorFilter===null?!0:!t.errorFilter(e)}Zu.isFatalError=xet;function bet(t,e){return t===null||t(e)}Zu.isAppliedFilter=bet;function ket(t,e){return t.split(/[/\\]/).join(e)}Zu.replacePathSegmentSeparator=ket;function Qet(t,e,r){return t===""?e:t.endsWith(r)?t+e:t+r+e}Zu.joinPathSegments=Qet});var sM=_(iM=>{"use strict";Object.defineProperty(iM,"__esModule",{value:!0});var Fet=DS(),nM=class{constructor(e,r){this._root=e,this._settings=r,this._root=Fet.replacePathSegmentSeparator(e,r.pathSegmentSeparator)}};iM.default=nM});var lM=_(aM=>{"use strict";Object.defineProperty(aM,"__esModule",{value:!0});var Tet=Be("events"),Ret=vS(),Net=Qie(),PS=DS(),Let=sM(),oM=class extends Let.default{constructor(e,r){super(e,r),this._settings=r,this._scandir=Ret.scandir,this._emitter=new Tet.EventEmitter,this._queue=Net(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit("end")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}get isDestroyed(){return this._isDestroyed}destroy(){if(this._isDestroyed)throw new Error("The reader is already destroyed");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on("entry",e)}onError(e){this._emitter.once("error",e)}onEnd(e){this._emitter.once("end",e)}_pushToQueue(e,r){let o={directory:e,base:r};this._queue.push(o,a=>{a!==null&&this._handleError(a)})}_worker(e,r){this._scandir(e.directory,this._settings.fsScandirSettings,(o,a)=>{if(o!==null){r(o,void 0);return}for(let n of a)this._handleEntry(n,e.base);r(null,void 0)})}_handleError(e){this._isDestroyed||!PS.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit("error",e))}_handleEntry(e,r){if(this._isDestroyed||this._isFatalError)return;let o=e.path;r!==void 0&&(e.path=PS.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),PS.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&PS.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(o,r===void 0?void 0:e.path)}_emitEntry(e){this._emitter.emit("entry",e)}};aM.default=oM});var Fie=_(uM=>{"use strict";Object.defineProperty(uM,"__esModule",{value:!0});var Met=lM(),cM=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new Met.default(this._root,this._settings),this._storage=[]}read(e){this._reader.onError(r=>{Oet(e,r)}),this._reader.onEntry(r=>{this._storage.push(r)}),this._reader.onEnd(()=>{Uet(e,this._storage)}),this._reader.read()}};uM.default=cM;function Oet(t,e){t(e)}function Uet(t,e){t(null,e)}});var Tie=_(fM=>{"use strict";Object.defineProperty(fM,"__esModule",{value:!0});var _et=Be("stream"),Het=lM(),AM=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new Het.default(this._root,this._settings),this._stream=new _et.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}read(){return this._reader.onError(e=>{this._stream.emit("error",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}};fM.default=AM});var Rie=_(hM=>{"use strict";Object.defineProperty(hM,"__esModule",{value:!0});var jet=vS(),SS=DS(),qet=sM(),pM=class extends qet.default{constructor(){super(...arguments),this._scandir=jet.scandirSync,this._storage=[],this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),this._storage}_pushToQueue(e,r){this._queue.add({directory:e,base:r})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,r){try{let o=this._scandir(e,this._settings.fsScandirSettings);for(let a of o)this._handleEntry(a,r)}catch(o){this._handleError(o)}}_handleError(e){if(!!SS.isFatalError(this._settings,e))throw e}_handleEntry(e,r){let o=e.path;r!==void 0&&(e.path=SS.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),SS.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&SS.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(o,r===void 0?void 0:e.path)}_pushToStorage(e){this._storage.push(e)}};hM.default=pM});var Nie=_(dM=>{"use strict";Object.defineProperty(dM,"__esModule",{value:!0});var Get=Rie(),gM=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new Get.default(this._root,this._settings)}read(){return this._reader.read()}};dM.default=gM});var Lie=_(yM=>{"use strict";Object.defineProperty(yM,"__esModule",{value:!0});var Yet=Be("path"),Wet=vS(),mM=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,Yet.sep),this.fsScandirSettings=new Wet.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e??r}};yM.default=mM});var bS=_($u=>{"use strict";Object.defineProperty($u,"__esModule",{value:!0});$u.Settings=$u.walkStream=$u.walkSync=$u.walk=void 0;var Mie=Fie(),Vet=Tie(),Ket=Nie(),EM=Lie();$u.Settings=EM.default;function Jet(t,e,r){if(typeof e=="function"){new Mie.default(t,xS()).read(e);return}new Mie.default(t,xS(e)).read(r)}$u.walk=Jet;function zet(t,e){let r=xS(e);return new Ket.default(t,r).read()}$u.walkSync=zet;function Xet(t,e){let r=xS(e);return new Vet.default(t,r).read()}$u.walkStream=Xet;function xS(t={}){return t instanceof EM.default?t:new EM.default(t)}});var kS=_(wM=>{"use strict";Object.defineProperty(wM,"__esModule",{value:!0});var Zet=Be("path"),$et=Ed(),Oie=Df(),CM=class{constructor(e){this._settings=e,this._fsStatSettings=new $et.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return Zet.resolve(this._settings.cwd,e)}_makeEntry(e,r){let o={name:r,path:r,dirent:Oie.fs.createDirentFromStats(r,e)};return this._settings.stats&&(o.stats=e),o}_isFatalError(e){return!Oie.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};wM.default=CM});var vM=_(BM=>{"use strict";Object.defineProperty(BM,"__esModule",{value:!0});var ett=Be("stream"),ttt=Ed(),rtt=bS(),ntt=kS(),IM=class extends ntt.default{constructor(){super(...arguments),this._walkStream=rtt.walkStream,this._stat=ttt.stat}dynamic(e,r){return this._walkStream(e,r)}static(e,r){let o=e.map(this._getFullEntryPath,this),a=new ett.PassThrough({objectMode:!0});a._write=(n,u,A)=>this._getEntry(o[n],e[n],r).then(p=>{p!==null&&r.entryFilter(p)&&a.push(p),n===o.length-1&&a.end(),A()}).catch(A);for(let n=0;nthis._makeEntry(a,r)).catch(a=>{if(o.errorFilter(a))return null;throw a})}_getStat(e){return new Promise((r,o)=>{this._stat(e,this._fsStatSettings,(a,n)=>a===null?r(n):o(a))})}};BM.default=IM});var Uie=_(PM=>{"use strict";Object.defineProperty(PM,"__esModule",{value:!0});var itt=bS(),stt=kS(),ott=vM(),DM=class extends stt.default{constructor(){super(...arguments),this._walkAsync=itt.walk,this._readerStream=new ott.default(this._settings)}dynamic(e,r){return new Promise((o,a)=>{this._walkAsync(e,r,(n,u)=>{n===null?o(u):a(n)})})}async static(e,r){let o=[],a=this._readerStream.static(e,r);return new Promise((n,u)=>{a.once("error",u),a.on("data",A=>o.push(A)),a.once("end",()=>n(o))})}};PM.default=DM});var _ie=_(xM=>{"use strict";Object.defineProperty(xM,"__esModule",{value:!0});var rE=Df(),SM=class{constructor(e,r,o){this._patterns=e,this._settings=r,this._micromatchOptions=o,this._storage=[],this._fillStorage()}_fillStorage(){let e=rE.pattern.expandPatternsWithBraceExpansion(this._patterns);for(let r of e){let o=this._getPatternSegments(r),a=this._splitSegmentsIntoSections(o);this._storage.push({complete:a.length<=1,pattern:r,segments:o,sections:a})}}_getPatternSegments(e){return rE.pattern.getPatternParts(e,this._micromatchOptions).map(o=>rE.pattern.isDynamicPattern(o,this._settings)?{dynamic:!0,pattern:o,patternRe:rE.pattern.makeRe(o,this._micromatchOptions)}:{dynamic:!1,pattern:o})}_splitSegmentsIntoSections(e){return rE.array.splitWhen(e,r=>r.dynamic&&rE.pattern.hasGlobStar(r.pattern))}};xM.default=SM});var Hie=_(kM=>{"use strict";Object.defineProperty(kM,"__esModule",{value:!0});var att=_ie(),bM=class extends att.default{match(e){let r=e.split("/"),o=r.length,a=this._storage.filter(n=>!n.complete||n.segments.length>o);for(let n of a){let u=n.sections[0];if(!n.complete&&o>u.length||r.every((p,h)=>{let E=n.segments[h];return!!(E.dynamic&&E.patternRe.test(p)||!E.dynamic&&E.pattern===p)}))return!0}return!1}};kM.default=bM});var jie=_(FM=>{"use strict";Object.defineProperty(FM,"__esModule",{value:!0});var QS=Df(),ltt=Hie(),QM=class{constructor(e,r){this._settings=e,this._micromatchOptions=r}getFilter(e,r,o){let a=this._getMatcher(r),n=this._getNegativePatternsRe(o);return u=>this._filter(e,u,a,n)}_getMatcher(e){return new ltt.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let r=e.filter(QS.pattern.isAffectDepthOfReadingPattern);return QS.pattern.convertPatternsToRe(r,this._micromatchOptions)}_filter(e,r,o,a){if(this._isSkippedByDeep(e,r.path)||this._isSkippedSymbolicLink(r))return!1;let n=QS.path.removeLeadingDotSegment(r.path);return this._isSkippedByPositivePatterns(n,o)?!1:this._isSkippedByNegativePatterns(n,a)}_isSkippedByDeep(e,r){return this._settings.deep===1/0?!1:this._getEntryLevel(e,r)>=this._settings.deep}_getEntryLevel(e,r){let o=r.split("/").length;if(e==="")return o;let a=e.split("/").length;return o-a}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_isSkippedByPositivePatterns(e,r){return!this._settings.baseNameMatch&&!r.match(e)}_isSkippedByNegativePatterns(e,r){return!QS.pattern.matchAny(e,r)}};FM.default=QM});var qie=_(RM=>{"use strict";Object.defineProperty(RM,"__esModule",{value:!0});var Cd=Df(),TM=class{constructor(e,r){this._settings=e,this._micromatchOptions=r,this.index=new Map}getFilter(e,r){let o=Cd.pattern.convertPatternsToRe(e,this._micromatchOptions),a=Cd.pattern.convertPatternsToRe(r,this._micromatchOptions);return n=>this._filter(n,o,a)}_filter(e,r,o){if(this._settings.unique&&this._isDuplicateEntry(e)||this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(e.path,o))return!1;let a=this._settings.baseNameMatch?e.name:e.path,n=e.dirent.isDirectory(),u=this._isMatchToPatterns(a,r,n)&&!this._isMatchToPatterns(e.path,o,n);return this._settings.unique&&u&&this._createIndexRecord(e),u}_isDuplicateEntry(e){return this.index.has(e.path)}_createIndexRecord(e){this.index.set(e.path,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,r){if(!this._settings.absolute)return!1;let o=Cd.path.makeAbsolute(this._settings.cwd,e);return Cd.pattern.matchAny(o,r)}_isMatchToPatterns(e,r,o){let a=Cd.path.removeLeadingDotSegment(e),n=Cd.pattern.matchAny(a,r);return!n&&o?Cd.pattern.matchAny(a+"/",r):n}};RM.default=TM});var Gie=_(LM=>{"use strict";Object.defineProperty(LM,"__esModule",{value:!0});var ctt=Df(),NM=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return ctt.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};LM.default=NM});var Wie=_(OM=>{"use strict";Object.defineProperty(OM,"__esModule",{value:!0});var Yie=Df(),MM=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let r=e.path;return this._settings.absolute&&(r=Yie.path.makeAbsolute(this._settings.cwd,r),r=Yie.path.unixify(r)),this._settings.markDirectories&&e.dirent.isDirectory()&&(r+="/"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:r}):r}};OM.default=MM});var TS=_(_M=>{"use strict";Object.defineProperty(_M,"__esModule",{value:!0});var utt=Be("path"),Att=jie(),ftt=qie(),ptt=Gie(),htt=Wie(),UM=class{constructor(e){this._settings=e,this.errorFilter=new ptt.default(this._settings),this.entryFilter=new ftt.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new Att.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new htt.default(this._settings)}_getRootDirectory(e){return utt.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let r=e.base==="."?"":e.base;return{basePath:r,pathSegmentSeparator:"/",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(r,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}};_M.default=UM});var Vie=_(jM=>{"use strict";Object.defineProperty(jM,"__esModule",{value:!0});var gtt=Uie(),dtt=TS(),HM=class extends dtt.default{constructor(){super(...arguments),this._reader=new gtt.default(this._settings)}async read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e);return(await this.api(r,e,o)).map(n=>o.transform(n))}api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.static(r.patterns,o)}};jM.default=HM});var Kie=_(GM=>{"use strict";Object.defineProperty(GM,"__esModule",{value:!0});var mtt=Be("stream"),ytt=vM(),Ett=TS(),qM=class extends Ett.default{constructor(){super(...arguments),this._reader=new ytt.default(this._settings)}read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e),a=this.api(r,e,o),n=new mtt.Readable({objectMode:!0,read:()=>{}});return a.once("error",u=>n.emit("error",u)).on("data",u=>n.emit("data",o.transform(u))).once("end",()=>n.emit("end")),n.once("close",()=>a.destroy()),n}api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.static(r.patterns,o)}};GM.default=qM});var Jie=_(WM=>{"use strict";Object.defineProperty(WM,"__esModule",{value:!0});var Ctt=Ed(),wtt=bS(),Itt=kS(),YM=class extends Itt.default{constructor(){super(...arguments),this._walkSync=wtt.walkSync,this._statSync=Ctt.statSync}dynamic(e,r){return this._walkSync(e,r)}static(e,r){let o=[];for(let a of e){let n=this._getFullEntryPath(a),u=this._getEntry(n,a,r);u===null||!r.entryFilter(u)||o.push(u)}return o}_getEntry(e,r,o){try{let a=this._getStat(e);return this._makeEntry(a,r)}catch(a){if(o.errorFilter(a))return null;throw a}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};WM.default=YM});var zie=_(KM=>{"use strict";Object.defineProperty(KM,"__esModule",{value:!0});var Btt=Jie(),vtt=TS(),VM=class extends vtt.default{constructor(){super(...arguments),this._reader=new Btt.default(this._settings)}read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e);return this.api(r,e,o).map(o.transform)}api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.static(r.patterns,o)}};KM.default=VM});var Xie=_(iE=>{"use strict";Object.defineProperty(iE,"__esModule",{value:!0});iE.DEFAULT_FILE_SYSTEM_ADAPTER=void 0;var nE=Be("fs"),Dtt=Be("os"),Ptt=Math.max(Dtt.cpus().length,1);iE.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:nE.lstat,lstatSync:nE.lstatSync,stat:nE.stat,statSync:nE.statSync,readdir:nE.readdir,readdirSync:nE.readdirSync};var JM=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,Ptt),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,1/0),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0)}_getValue(e,r){return e===void 0?r:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},iE.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};iE.default=JM});var RS=_((DNt,ese)=>{"use strict";var Zie=eie(),$ie=rie(),Stt=Vie(),xtt=Kie(),btt=zie(),zM=Xie(),wd=Df();async function XM(t,e){sE(t);let r=ZM(t,Stt.default,e),o=await Promise.all(r);return wd.array.flatten(o)}(function(t){function e(u,A){sE(u);let p=ZM(u,btt.default,A);return wd.array.flatten(p)}t.sync=e;function r(u,A){sE(u);let p=ZM(u,xtt.default,A);return wd.stream.merge(p)}t.stream=r;function o(u,A){sE(u);let p=$ie.transform([].concat(u)),h=new zM.default(A);return Zie.generate(p,h)}t.generateTasks=o;function a(u,A){sE(u);let p=new zM.default(A);return wd.pattern.isDynamicPattern(u,p)}t.isDynamicPattern=a;function n(u){return sE(u),wd.path.escape(u)}t.escapePath=n})(XM||(XM={}));function ZM(t,e,r){let o=$ie.transform([].concat(t)),a=new zM.default(r),n=Zie.generate(o,a),u=new e(a);return n.map(u.read,u)}function sE(t){if(![].concat(t).every(o=>wd.string.isString(o)&&!wd.string.isEmpty(o)))throw new TypeError("Patterns must be a string (non empty) or an array of strings")}ese.exports=XM});var wn={};Kt(wn,{checksumFile:()=>LS,checksumPattern:()=>MS,makeHash:()=>zs});function zs(...t){let e=(0,NS.createHash)("sha512"),r="";for(let o of t)typeof o=="string"?r+=o:o&&(r&&(e.update(r),r=""),e.update(o));return r&&e.update(r),e.digest("hex")}async function LS(t,{baseFs:e,algorithm:r}={baseFs:oe,algorithm:"sha512"}){let o=await e.openPromise(t,"r");try{let n=Buffer.allocUnsafeSlow(65536),u=(0,NS.createHash)(r),A=0;for(;(A=await e.readPromise(o,n,0,65536))!==0;)u.update(A===65536?n:n.slice(0,A));return u.digest("hex")}finally{await e.closePromise(o)}}async function MS(t,{cwd:e}){let o=(await(0,$M.default)(t,{cwd:ue.fromPortablePath(e),onlyDirectories:!0})).map(A=>`${A}/**/*`),a=await(0,$M.default)([t,...o],{cwd:ue.fromPortablePath(e),onlyFiles:!1});a.sort();let n=await Promise.all(a.map(async A=>{let p=[Buffer.from(A)],h=ue.toPortablePath(A),E=await oe.lstatPromise(h);return E.isSymbolicLink()?p.push(Buffer.from(await oe.readlinkPromise(h))):E.isFile()&&p.push(await oe.readFilePromise(h)),p.join("\0")})),u=(0,NS.createHash)("sha512");for(let A of n)u.update(A);return u.digest("hex")}var NS,$M,rh=Et(()=>{Pt();NS=Be("crypto"),$M=$e(RS())});var W={};Kt(W,{areDescriptorsEqual:()=>sse,areIdentsEqual:()=>r1,areLocatorsEqual:()=>n1,areVirtualPackagesEquivalent:()=>Ott,bindDescriptor:()=>Ltt,bindLocator:()=>Mtt,convertDescriptorToLocator:()=>OS,convertLocatorToDescriptor:()=>tO,convertPackageToLocator:()=>Ttt,convertToIdent:()=>Ftt,convertToManifestRange:()=>Ktt,copyPackage:()=>$I,devirtualizeDescriptor:()=>e1,devirtualizeLocator:()=>t1,ensureDevirtualizedDescriptor:()=>Rtt,ensureDevirtualizedLocator:()=>Ntt,getIdentVendorPath:()=>sO,isPackageCompatible:()=>qS,isVirtualDescriptor:()=>Sf,isVirtualLocator:()=>Hc,makeDescriptor:()=>In,makeIdent:()=>eA,makeLocator:()=>Qs,makeRange:()=>HS,parseDescriptor:()=>nh,parseFileStyleRange:()=>Wtt,parseIdent:()=>Js,parseLocator:()=>xf,parseRange:()=>Id,prettyDependent:()=>FL,prettyDescriptor:()=>qn,prettyIdent:()=>cs,prettyLocator:()=>jr,prettyLocatorNoColors:()=>QL,prettyRange:()=>lE,prettyReference:()=>s1,prettyResolution:()=>XI,prettyWorkspace:()=>o1,renamePackage:()=>rO,slugifyIdent:()=>eO,slugifyLocator:()=>aE,sortDescriptors:()=>cE,stringifyDescriptor:()=>Sa,stringifyIdent:()=>fn,stringifyLocator:()=>xa,tryParseDescriptor:()=>i1,tryParseIdent:()=>ose,tryParseLocator:()=>_S,tryParseRange:()=>Ytt,virtualizeDescriptor:()=>nO,virtualizePackage:()=>iO});function eA(t,e){if(t?.startsWith("@"))throw new Error("Invalid scope: don't prefix it with '@'");return{identHash:zs(t,e),scope:t,name:e}}function In(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:zs(t.identHash,e),range:e}}function Qs(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:zs(t.identHash,e),reference:e}}function Ftt(t){return{identHash:t.identHash,scope:t.scope,name:t.name}}function OS(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.descriptorHash,reference:t.range}}function tO(t){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:t.locatorHash,range:t.reference}}function Ttt(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.locatorHash,reference:t.reference}}function rO(t,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:t.version,languageName:t.languageName,linkType:t.linkType,conditions:t.conditions,dependencies:new Map(t.dependencies),peerDependencies:new Map(t.peerDependencies),dependenciesMeta:new Map(t.dependenciesMeta),peerDependenciesMeta:new Map(t.peerDependenciesMeta),bin:new Map(t.bin)}}function $I(t){return rO(t,t)}function nO(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return In(t,`virtual:${e}#${t.range}`)}function iO(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return rO(t,Qs(t,`virtual:${e}#${t.reference}`))}function Sf(t){return t.range.startsWith(ZI)}function Hc(t){return t.reference.startsWith(ZI)}function e1(t){if(!Sf(t))throw new Error("Not a virtual descriptor");return In(t,t.range.replace(US,""))}function t1(t){if(!Hc(t))throw new Error("Not a virtual descriptor");return Qs(t,t.reference.replace(US,""))}function Rtt(t){return Sf(t)?In(t,t.range.replace(US,"")):t}function Ntt(t){return Hc(t)?Qs(t,t.reference.replace(US,"")):t}function Ltt(t,e){return t.range.includes("::")?t:In(t,`${t.range}::${oE.default.stringify(e)}`)}function Mtt(t,e){return t.reference.includes("::")?t:Qs(t,`${t.reference}::${oE.default.stringify(e)}`)}function r1(t,e){return t.identHash===e.identHash}function sse(t,e){return t.descriptorHash===e.descriptorHash}function n1(t,e){return t.locatorHash===e.locatorHash}function Ott(t,e){if(!Hc(t))throw new Error("Invalid package type");if(!Hc(e))throw new Error("Invalid package type");if(!r1(t,e)||t.dependencies.size!==e.dependencies.size)return!1;for(let r of t.dependencies.values()){let o=e.dependencies.get(r.identHash);if(!o||!sse(r,o))return!1}return!0}function Js(t){let e=ose(t);if(!e)throw new Error(`Invalid ident (${t})`);return e}function ose(t){let e=t.match(Utt);if(!e)return null;let[,r,o]=e;return eA(typeof r<"u"?r:null,o)}function nh(t,e=!1){let r=i1(t,e);if(!r)throw new Error(`Invalid descriptor (${t})`);return r}function i1(t,e=!1){let r=e?t.match(_tt):t.match(Htt);if(!r)return null;let[,o,a,n]=r;if(n==="unknown")throw new Error(`Invalid range (${t})`);let u=typeof o<"u"?o:null,A=typeof n<"u"?n:"unknown";return In(eA(u,a),A)}function xf(t,e=!1){let r=_S(t,e);if(!r)throw new Error(`Invalid locator (${t})`);return r}function _S(t,e=!1){let r=e?t.match(jtt):t.match(qtt);if(!r)return null;let[,o,a,n]=r;if(n==="unknown")throw new Error(`Invalid reference (${t})`);let u=typeof o<"u"?o:null,A=typeof n<"u"?n:"unknown";return Qs(eA(u,a),A)}function Id(t,e){let r=t.match(Gtt);if(r===null)throw new Error(`Invalid range (${t})`);let o=typeof r[1]<"u"?r[1]:null;if(typeof e?.requireProtocol=="string"&&o!==e.requireProtocol)throw new Error(`Invalid protocol (${o})`);if(e?.requireProtocol&&o===null)throw new Error(`Missing protocol (${o})`);let a=typeof r[3]<"u"?decodeURIComponent(r[2]):null;if(e?.requireSource&&a===null)throw new Error(`Missing source (${t})`);let n=typeof r[3]<"u"?decodeURIComponent(r[3]):decodeURIComponent(r[2]),u=e?.parseSelector?oE.default.parse(n):n,A=typeof r[4]<"u"?oE.default.parse(r[4]):null;return{protocol:o,source:a,selector:u,params:A}}function Ytt(t,e){try{return Id(t,e)}catch{return null}}function Wtt(t,{protocol:e}){let{selector:r,params:o}=Id(t,{requireProtocol:e,requireBindings:!0});if(typeof o.locator!="string")throw new Error(`Assertion failed: Invalid bindings for ${t}`);return{parentLocator:xf(o.locator,!0),path:r}}function tse(t){return t=t.replaceAll("%","%25"),t=t.replaceAll(":","%3A"),t=t.replaceAll("#","%23"),t}function Vtt(t){return t===null?!1:Object.entries(t).length>0}function HS({protocol:t,source:e,selector:r,params:o}){let a="";return t!==null&&(a+=`${t}`),e!==null&&(a+=`${tse(e)}#`),a+=tse(r),Vtt(o)&&(a+=`::${oE.default.stringify(o)}`),a}function Ktt(t){let{params:e,protocol:r,source:o,selector:a}=Id(t);for(let n in e)n.startsWith("__")&&delete e[n];return HS({protocol:r,source:o,params:e,selector:a})}function fn(t){return t.scope?`@${t.scope}/${t.name}`:`${t.name}`}function Sa(t){return t.scope?`@${t.scope}/${t.name}@${t.range}`:`${t.name}@${t.range}`}function xa(t){return t.scope?`@${t.scope}/${t.name}@${t.reference}`:`${t.name}@${t.reference}`}function eO(t){return t.scope!==null?`@${t.scope}-${t.name}`:t.name}function aE(t){let{protocol:e,selector:r}=Id(t.reference),o=e!==null?e.replace(Jtt,""):"exotic",a=rse.default.valid(r),n=a!==null?`${o}-${a}`:`${o}`,u=10;return t.scope?`${eO(t)}-${n}-${t.locatorHash.slice(0,u)}`:`${eO(t)}-${n}-${t.locatorHash.slice(0,u)}`}function cs(t,e){return e.scope?`${Ot(t,`@${e.scope}/`,yt.SCOPE)}${Ot(t,e.name,yt.NAME)}`:`${Ot(t,e.name,yt.NAME)}`}function jS(t){if(t.startsWith(ZI)){let e=jS(t.substring(t.indexOf("#")+1)),r=t.substring(ZI.length,ZI.length+ktt);return`${e} [${r}]`}else return t.replace(ztt,"?[...]")}function lE(t,e){return`${Ot(t,jS(e),yt.RANGE)}`}function qn(t,e){return`${cs(t,e)}${Ot(t,"@",yt.RANGE)}${lE(t,e.range)}`}function s1(t,e){return`${Ot(t,jS(e),yt.REFERENCE)}`}function jr(t,e){return`${cs(t,e)}${Ot(t,"@",yt.REFERENCE)}${s1(t,e.reference)}`}function QL(t){return`${fn(t)}@${jS(t.reference)}`}function cE(t){return ks(t,[e=>fn(e),e=>e.range])}function o1(t,e){return cs(t,e.anchoredLocator)}function XI(t,e,r){let o=Sf(e)?e1(e):e;return r===null?`${qn(t,o)} \u2192 ${kL(t).Cross}`:o.identHash===r.identHash?`${qn(t,o)} \u2192 ${s1(t,r.reference)}`:`${qn(t,o)} \u2192 ${jr(t,r)}`}function FL(t,e,r){return r===null?`${jr(t,e)}`:`${jr(t,e)} (via ${lE(t,r.range)})`}function sO(t){return`node_modules/${fn(t)}`}function qS(t,e){return t.conditions?Qtt(t.conditions,r=>{let[,o,a]=r.match(ise),n=e[o];return n?n.includes(a):!0}):!0}var oE,rse,nse,ZI,ktt,ise,Qtt,US,Utt,_tt,Htt,jtt,qtt,Gtt,Jtt,ztt,xo=Et(()=>{oE=$e(Be("querystring")),rse=$e(zn()),nse=$e(rX());ql();rh();jl();xo();ZI="virtual:",ktt=5,ise=/(os|cpu|libc)=([a-z0-9_-]+)/,Qtt=(0,nse.makeParser)(ise);US=/^[^#]*#/;Utt=/^(?:@([^/]+?)\/)?([^@/]+)$/;_tt=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))$/,Htt=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))?$/;jtt=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))$/,qtt=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))?$/;Gtt=/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/;Jtt=/:$/;ztt=/\?.*/});var ase,lse=Et(()=>{xo();ase={hooks:{reduceDependency:(t,e,r,o,{resolver:a,resolveOptions:n})=>{for(let{pattern:u,reference:A}of e.topLevelWorkspace.manifest.resolutions){if(u.from&&(u.from.fullName!==fn(r)||e.configuration.normalizeLocator(Qs(Js(u.from.fullName),u.from.description??r.reference)).locatorHash!==r.locatorHash)||u.descriptor.fullName!==fn(t)||e.configuration.normalizeDependency(In(xf(u.descriptor.fullName),u.descriptor.description??t.range)).descriptorHash!==t.descriptorHash)continue;return a.bindDescriptor(e.configuration.normalizeDependency(In(t,A)),e.topLevelWorkspace.anchoredLocator,n)}return t},validateProject:async(t,e)=>{for(let r of t.workspaces){let o=o1(t.configuration,r);await t.configuration.triggerHook(a=>a.validateWorkspace,r,{reportWarning:(a,n)=>e.reportWarning(a,`${o}: ${n}`),reportError:(a,n)=>e.reportError(a,`${o}: ${n}`)})}},validateWorkspace:async(t,e)=>{let{manifest:r}=t;r.resolutions.length&&t.cwd!==t.project.cwd&&r.errors.push(new Error("Resolutions field will be ignored"));for(let o of r.errors)e.reportWarning(57,o.message)}}}});var a1,Xn,Bd=Et(()=>{a1=class{supportsDescriptor(e,r){return!!(e.range.startsWith(a1.protocol)||r.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,r){return!!e.reference.startsWith(a1.protocol)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){return[o.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let o=r.project.getWorkspaceByCwd(e.reference.slice(a1.protocol.length));return{...e,version:o.manifest.version||"0.0.0",languageName:"unknown",linkType:"SOFT",conditions:null,dependencies:r.project.configuration.normalizeDependencyMap(new Map([...o.manifest.dependencies,...o.manifest.devDependencies])),peerDependencies:new Map([...o.manifest.peerDependencies]),dependenciesMeta:o.manifest.dependenciesMeta,peerDependenciesMeta:o.manifest.peerDependenciesMeta,bin:o.manifest.bin}}},Xn=a1;Xn.protocol="workspace:"});var kr={};Kt(kr,{SemVer:()=>pse.SemVer,clean:()=>Ztt,getComparator:()=>Ase,mergeComparators:()=>oO,satisfiesWithPrereleases:()=>bf,simplifyRanges:()=>aO,stringifyComparator:()=>fse,validRange:()=>ba});function bf(t,e,r=!1){if(!t)return!1;let o=`${e}${r}`,a=cse.get(o);if(typeof a>"u")try{a=new ih.default.Range(e,{includePrerelease:!0,loose:r})}catch{return!1}finally{cse.set(o,a||null)}else if(a===null)return!1;let n;try{n=new ih.default.SemVer(t,a)}catch{return!1}return a.test(n)?!0:(n.prerelease&&(n.prerelease=[]),a.set.some(u=>{for(let A of u)A.semver.prerelease&&(A.semver.prerelease=[]);return u.every(A=>A.test(n))}))}function ba(t){if(t.indexOf(":")!==-1)return null;let e=use.get(t);if(typeof e<"u")return e;try{e=new ih.default.Range(t)}catch{e=null}return use.set(t,e),e}function Ztt(t){let e=Xtt.exec(t);return e?e[1]:null}function Ase(t){if(t.semver===ih.default.Comparator.ANY)return{gt:null,lt:null};switch(t.operator){case"":return{gt:[">=",t.semver],lt:["<=",t.semver]};case">":case">=":return{gt:[t.operator,t.semver],lt:null};case"<":case"<=":return{gt:null,lt:[t.operator,t.semver]};default:throw new Error(`Assertion failed: Unexpected comparator operator (${t.operator})`)}}function oO(t){if(t.length===0)return null;let e=null,r=null;for(let o of t){if(o.gt){let a=e!==null?ih.default.compare(o.gt[1],e[1]):null;(a===null||a>0||a===0&&o.gt[0]===">")&&(e=o.gt)}if(o.lt){let a=r!==null?ih.default.compare(o.lt[1],r[1]):null;(a===null||a<0||a===0&&o.lt[0]==="<")&&(r=o.lt)}}if(e&&r){let o=ih.default.compare(e[1],r[1]);if(o===0&&(e[0]===">"||r[0]==="<")||o>0)return null}return{gt:e,lt:r}}function fse(t){if(t.gt&&t.lt){if(t.gt[0]===">="&&t.lt[0]==="<="&&t.gt[1].version===t.lt[1].version)return t.gt[1].version;if(t.gt[0]===">="&&t.lt[0]==="<"){if(t.lt[1].version===`${t.gt[1].major+1}.0.0-0`)return`^${t.gt[1].version}`;if(t.lt[1].version===`${t.gt[1].major}.${t.gt[1].minor+1}.0-0`)return`~${t.gt[1].version}`}}let e=[];return t.gt&&e.push(t.gt[0]+t.gt[1].version),t.lt&&e.push(t.lt[0]+t.lt[1].version),e.length?e.join(" "):"*"}function aO(t){let e=t.map(o=>ba(o).set.map(a=>a.map(n=>Ase(n)))),r=e.shift().map(o=>oO(o)).filter(o=>o!==null);for(let o of e){let a=[];for(let n of r)for(let u of o){let A=oO([n,...u]);A!==null&&a.push(A)}r=a}return r.length===0?null:r.map(o=>fse(o)).join(" || ")}var ih,pse,cse,use,Xtt,kf=Et(()=>{ih=$e(zn()),pse=$e(zn()),cse=new Map;use=new Map;Xtt=/^(?:[\sv=]*?)((0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)(?:\s*)$/});function hse(t){let e=t.match(/^[ \t]+/m);return e?e[0]:" "}function gse(t){return t.charCodeAt(0)===65279?t.slice(1):t}function $o(t){return t.replace(/\\/g,"/")}function GS(t,{yamlCompatibilityMode:e}){return e?IL(t):typeof t>"u"||typeof t=="boolean"?t:null}function dse(t,e){let r=e.search(/[^!]/);if(r===-1)return"invalid";let o=r%2===0?"":"!",a=e.slice(r);return`${o}${t}=${a}`}function lO(t,e){return e.length===1?dse(t,e[0]):`(${e.map(r=>dse(t,r)).join(" | ")})`}var mse,uE,Mt,AE=Et(()=>{Pt();Nl();mse=$e(zn());Bd();jl();kf();xo();uE=class{constructor(){this.indent=" ";this.name=null;this.version=null;this.os=null;this.cpu=null;this.libc=null;this.type=null;this.packageManager=null;this.private=!1;this.license=null;this.main=null;this.module=null;this.browser=null;this.languageName=null;this.bin=new Map;this.scripts=new Map;this.dependencies=new Map;this.devDependencies=new Map;this.peerDependencies=new Map;this.workspaceDefinitions=[];this.dependenciesMeta=new Map;this.peerDependenciesMeta=new Map;this.resolutions=[];this.files=null;this.publishConfig=null;this.installConfig=null;this.preferUnplugged=null;this.raw={};this.errors=[]}static async tryFind(e,{baseFs:r=new Rn}={}){let o=K.join(e,"package.json");try{return await uE.fromFile(o,{baseFs:r})}catch(a){if(a.code==="ENOENT")return null;throw a}}static async find(e,{baseFs:r}={}){let o=await uE.tryFind(e,{baseFs:r});if(o===null)throw new Error("Manifest not found");return o}static async fromFile(e,{baseFs:r=new Rn}={}){let o=new uE;return await o.loadFile(e,{baseFs:r}),o}static fromText(e){let r=new uE;return r.loadFromText(e),r}loadFromText(e){let r;try{r=JSON.parse(gse(e)||"{}")}catch(o){throw o.message+=` (when parsing ${e})`,o}this.load(r),this.indent=hse(e)}async loadFile(e,{baseFs:r=new Rn}){let o=await r.readFilePromise(e,"utf8"),a;try{a=JSON.parse(gse(o)||"{}")}catch(n){throw n.message+=` (when parsing ${e})`,n}this.load(a),this.indent=hse(o)}load(e,{yamlCompatibilityMode:r=!1}={}){if(typeof e!="object"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let o=[];if(this.name=null,typeof e.name=="string")try{this.name=Js(e.name)}catch{o.push(new Error("Parsing failed for the 'name' field"))}if(typeof e.version=="string"?this.version=e.version:this.version=null,Array.isArray(e.os)){let n=[];this.os=n;for(let u of e.os)typeof u!="string"?o.push(new Error("Parsing failed for the 'os' field")):n.push(u)}else this.os=null;if(Array.isArray(e.cpu)){let n=[];this.cpu=n;for(let u of e.cpu)typeof u!="string"?o.push(new Error("Parsing failed for the 'cpu' field")):n.push(u)}else this.cpu=null;if(Array.isArray(e.libc)){let n=[];this.libc=n;for(let u of e.libc)typeof u!="string"?o.push(new Error("Parsing failed for the 'libc' field")):n.push(u)}else this.libc=null;if(typeof e.type=="string"?this.type=e.type:this.type=null,typeof e.packageManager=="string"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private=="boolean"?this.private=e.private:this.private=!1,typeof e.license=="string"?this.license=e.license:this.license=null,typeof e.languageName=="string"?this.languageName=e.languageName:this.languageName=null,typeof e.main=="string"?this.main=$o(e.main):this.main=null,typeof e.module=="string"?this.module=$o(e.module):this.module=null,e.browser!=null)if(typeof e.browser=="string")this.browser=$o(e.browser);else{this.browser=new Map;for(let[n,u]of Object.entries(e.browser))this.browser.set($o(n),typeof u=="string"?$o(u):u)}else this.browser=null;if(this.bin=new Map,typeof e.bin=="string")e.bin.trim()===""?o.push(new Error("Invalid bin field")):this.name!==null?this.bin.set(this.name.name,$o(e.bin)):o.push(new Error("String bin field, but no attached package name"));else if(typeof e.bin=="object"&&e.bin!==null)for(let[n,u]of Object.entries(e.bin)){if(typeof u!="string"||u.trim()===""){o.push(new Error(`Invalid bin definition for '${n}'`));continue}let A=Js(n);this.bin.set(A.name,$o(u))}if(this.scripts=new Map,typeof e.scripts=="object"&&e.scripts!==null)for(let[n,u]of Object.entries(e.scripts)){if(typeof u!="string"){o.push(new Error(`Invalid script definition for '${n}'`));continue}this.scripts.set(n,u)}if(this.dependencies=new Map,typeof e.dependencies=="object"&&e.dependencies!==null)for(let[n,u]of Object.entries(e.dependencies)){if(typeof u!="string"){o.push(new Error(`Invalid dependency range for '${n}'`));continue}let A;try{A=Js(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=In(A,u);this.dependencies.set(p.identHash,p)}if(this.devDependencies=new Map,typeof e.devDependencies=="object"&&e.devDependencies!==null)for(let[n,u]of Object.entries(e.devDependencies)){if(typeof u!="string"){o.push(new Error(`Invalid dependency range for '${n}'`));continue}let A;try{A=Js(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=In(A,u);this.devDependencies.set(p.identHash,p)}if(this.peerDependencies=new Map,typeof e.peerDependencies=="object"&&e.peerDependencies!==null)for(let[n,u]of Object.entries(e.peerDependencies)){let A;try{A=Js(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}(typeof u!="string"||!u.startsWith(Xn.protocol)&&!ba(u))&&(o.push(new Error(`Invalid dependency range for '${n}'`)),u="*");let p=In(A,u);this.peerDependencies.set(p.identHash,p)}typeof e.workspaces=="object"&&e.workspaces!==null&&e.workspaces.nohoist&&o.push(new Error("'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead"));let a=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces=="object"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let n of a){if(typeof n!="string"){o.push(new Error(`Invalid workspace definition for '${n}'`));continue}this.workspaceDefinitions.push({pattern:n})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta=="object"&&e.dependenciesMeta!==null)for(let[n,u]of Object.entries(e.dependenciesMeta)){if(typeof u!="object"||u===null){o.push(new Error(`Invalid meta field for '${n}`));continue}let A=nh(n),p=this.ensureDependencyMeta(A),h=GS(u.built,{yamlCompatibilityMode:r});if(h===null){o.push(new Error(`Invalid built meta field for '${n}'`));continue}let E=GS(u.optional,{yamlCompatibilityMode:r});if(E===null){o.push(new Error(`Invalid optional meta field for '${n}'`));continue}let I=GS(u.unplugged,{yamlCompatibilityMode:r});if(I===null){o.push(new Error(`Invalid unplugged meta field for '${n}'`));continue}Object.assign(p,{built:h,optional:E,unplugged:I})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta=="object"&&e.peerDependenciesMeta!==null)for(let[n,u]of Object.entries(e.peerDependenciesMeta)){if(typeof u!="object"||u===null){o.push(new Error(`Invalid meta field for '${n}'`));continue}let A=nh(n),p=this.ensurePeerDependencyMeta(A),h=GS(u.optional,{yamlCompatibilityMode:r});if(h===null){o.push(new Error(`Invalid optional meta field for '${n}'`));continue}Object.assign(p,{optional:h})}if(this.resolutions=[],typeof e.resolutions=="object"&&e.resolutions!==null)for(let[n,u]of Object.entries(e.resolutions)){if(typeof u!="string"){o.push(new Error(`Invalid resolution entry for '${n}'`));continue}try{this.resolutions.push({pattern:UD(n),reference:u})}catch(A){o.push(A);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let n of e.files){if(typeof n!="string"){o.push(new Error(`Invalid files entry for '${n}'`));continue}this.files.add(n)}}else this.files=null;if(typeof e.publishConfig=="object"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access=="string"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main=="string"&&(this.publishConfig.main=$o(e.publishConfig.main)),typeof e.publishConfig.module=="string"&&(this.publishConfig.module=$o(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser=="string")this.publishConfig.browser=$o(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[n,u]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set($o(n),typeof u=="string"?$o(u):u)}if(typeof e.publishConfig.registry=="string"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.bin=="string")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,$o(e.publishConfig.bin)]]):o.push(new Error("String bin field, but no attached package name"));else if(typeof e.publishConfig.bin=="object"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[n,u]of Object.entries(e.publishConfig.bin)){if(typeof u!="string"){o.push(new Error(`Invalid bin definition for '${n}'`));continue}this.publishConfig.bin.set(n,$o(u))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let n of e.publishConfig.executableFiles){if(typeof n!="string"){o.push(new Error("Invalid executable file definition"));continue}this.publishConfig.executableFiles.add($o(n))}}}else this.publishConfig=null;if(typeof e.installConfig=="object"&&e.installConfig!==null){this.installConfig={};for(let n of Object.keys(e.installConfig))n==="hoistingLimits"?typeof e.installConfig.hoistingLimits=="string"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:o.push(new Error("Invalid hoisting limits definition")):n=="selfReferences"?typeof e.installConfig.selfReferences=="boolean"?this.installConfig.selfReferences=e.installConfig.selfReferences:o.push(new Error("Invalid selfReferences definition, must be a boolean value")):o.push(new Error(`Unrecognized installConfig key: ${n}`))}else this.installConfig=null;if(typeof e.optionalDependencies=="object"&&e.optionalDependencies!==null)for(let[n,u]of Object.entries(e.optionalDependencies)){if(typeof u!="string"){o.push(new Error(`Invalid dependency range for '${n}'`));continue}let A;try{A=Js(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=In(A,u);this.dependencies.set(p.identHash,p);let h=In(A,"unknown"),E=this.ensureDependencyMeta(h);Object.assign(E,{optional:!0})}typeof e.preferUnplugged=="boolean"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=o}getForScope(e){switch(e){case"dependencies":return this.dependencies;case"devDependencies":return this.devDependencies;case"peerDependencies":return this.peerDependencies;default:throw new Error(`Unsupported value ("${e}")`)}}hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||this.peerDependencies.has(e.identHash))}hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.devDependencies.has(e.identHash))}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDependency(e))}getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(lO("os",this.os)),this.cpu&&this.cpu.length>0&&e.push(lO("cpu",this.cpu)),this.libc&&this.libc.length>0&&e.push(lO("libc",this.libc)),e.length>0?e.join(" & "):null}ensureDependencyMeta(e){if(e.range!=="unknown"&&!mse.default.valid(e.range))throw new Error(`Invalid meta field range for '${Sa(e)}'`);let r=fn(e),o=e.range!=="unknown"?e.range:null,a=this.dependenciesMeta.get(r);a||this.dependenciesMeta.set(r,a=new Map);let n=a.get(o);return n||a.set(o,n={}),n}ensurePeerDependencyMeta(e){if(e.range!=="unknown")throw new Error(`Invalid meta field range for '${Sa(e)}'`);let r=fn(e),o=this.peerDependenciesMeta.get(r);return o||this.peerDependenciesMeta.set(r,o={}),o}setRawField(e,r,{after:o=[]}={}){let a=new Set(o.filter(n=>Object.hasOwn(this.raw,n)));if(a.size===0||Object.hasOwn(this.raw,e))this.raw[e]=r;else{let n=this.raw,u=this.raw={},A=!1;for(let p of Object.keys(n))u[p]=n[p],A||(a.delete(p),a.size===0&&(u[e]=r,A=!0))}}exportTo(e,{compatibilityMode:r=!0}={}){if(Object.assign(e,this.raw),this.name!==null?e.name=fn(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let n=this.browser;typeof n=="string"?e.browser=n:n instanceof Map&&(e.browser=Object.assign({},...Array.from(n.keys()).sort().map(u=>({[u]:n.get(u)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(n=>({[n]:this.bin.get(n)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces={...this.raw.workspaces,packages:this.workspaceDefinitions.map(({pattern:n})=>n)}:e.workspaces=this.workspaceDefinitions.map(({pattern:n})=>n):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let o=[],a=[];for(let n of this.dependencies.values()){let u=this.dependenciesMeta.get(fn(n)),A=!1;if(r&&u){let p=u.get(null);p&&p.optional&&(A=!0)}A?a.push(n):o.push(n)}o.length>0?e.dependencies=Object.assign({},...cE(o).map(n=>({[fn(n)]:n.range}))):delete e.dependencies,a.length>0?e.optionalDependencies=Object.assign({},...cE(a).map(n=>({[fn(n)]:n.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...cE(this.devDependencies.values()).map(n=>({[fn(n)]:n.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...cE(this.peerDependencies.values()).map(n=>({[fn(n)]:n.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[n,u]of ks(this.dependenciesMeta.entries(),([A,p])=>A))for(let[A,p]of ks(u.entries(),([h,E])=>h!==null?`0${h}`:"1")){let h=A!==null?Sa(In(Js(n),A)):n,E={...p};r&&A===null&&delete E.optional,Object.keys(E).length!==0&&(e.dependenciesMeta[h]=E)}if(Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...ks(this.peerDependenciesMeta.entries(),([n,u])=>n).map(([n,u])=>({[n]:u}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:n,reference:u})=>({[_D(n)]:u}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,this.scripts!==null&&this.scripts.size>0){e.scripts??={};for(let n of Object.keys(e.scripts))this.scripts.has(n)||delete e.scripts[n];for(let[n,u]of this.scripts.entries())e.scripts[n]=u}else delete e.scripts;return e}},Mt=uE;Mt.fileName="package.json",Mt.allDependencies=["dependencies","devDependencies","peerDependencies"],Mt.hardDependencies=["dependencies","devDependencies"]});var Ese=_((_Nt,yse)=>{var $tt=_l(),ert=function(){return $tt.Date.now()};yse.exports=ert});var wse=_((HNt,Cse)=>{var trt=/\s/;function rrt(t){for(var e=t.length;e--&&trt.test(t.charAt(e)););return e}Cse.exports=rrt});var Bse=_((jNt,Ise)=>{var nrt=wse(),irt=/^\s+/;function srt(t){return t&&t.slice(0,nrt(t)+1).replace(irt,"")}Ise.exports=srt});var fE=_((qNt,vse)=>{var ort=pd(),art=Ju(),lrt="[object Symbol]";function crt(t){return typeof t=="symbol"||art(t)&&ort(t)==lrt}vse.exports=crt});var xse=_((GNt,Sse)=>{var urt=Bse(),Dse=il(),Art=fE(),Pse=0/0,frt=/^[-+]0x[0-9a-f]+$/i,prt=/^0b[01]+$/i,hrt=/^0o[0-7]+$/i,grt=parseInt;function drt(t){if(typeof t=="number")return t;if(Art(t))return Pse;if(Dse(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=Dse(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=urt(t);var r=prt.test(t);return r||hrt.test(t)?grt(t.slice(2),r?2:8):frt.test(t)?Pse:+t}Sse.exports=drt});var Qse=_((YNt,kse)=>{var mrt=il(),cO=Ese(),bse=xse(),yrt="Expected a function",Ert=Math.max,Crt=Math.min;function wrt(t,e,r){var o,a,n,u,A,p,h=0,E=!1,I=!1,v=!0;if(typeof t!="function")throw new TypeError(yrt);e=bse(e)||0,mrt(r)&&(E=!!r.leading,I="maxWait"in r,n=I?Ert(bse(r.maxWait)||0,e):n,v="trailing"in r?!!r.trailing:v);function b(Ae){var ye=o,ae=a;return o=a=void 0,h=Ae,u=t.apply(ae,ye),u}function C(Ae){return h=Ae,A=setTimeout(U,e),E?b(Ae):u}function T(Ae){var ye=Ae-p,ae=Ae-h,we=e-ye;return I?Crt(we,n-ae):we}function L(Ae){var ye=Ae-p,ae=Ae-h;return p===void 0||ye>=e||ye<0||I&&ae>=n}function U(){var Ae=cO();if(L(Ae))return J(Ae);A=setTimeout(U,T(Ae))}function J(Ae){return A=void 0,v&&o?b(Ae):(o=a=void 0,u)}function te(){A!==void 0&&clearTimeout(A),h=0,o=p=a=A=void 0}function le(){return A===void 0?u:J(cO())}function pe(){var Ae=cO(),ye=L(Ae);if(o=arguments,a=this,p=Ae,ye){if(A===void 0)return C(p);if(I)return clearTimeout(A),A=setTimeout(U,e),b(p)}return A===void 0&&(A=setTimeout(U,e)),u}return pe.cancel=te,pe.flush=le,pe}kse.exports=wrt});var uO=_((WNt,Fse)=>{var Irt=Qse(),Brt=il(),vrt="Expected a function";function Drt(t,e,r){var o=!0,a=!0;if(typeof t!="function")throw new TypeError(vrt);return Brt(r)&&(o="leading"in r?!!r.leading:o,a="trailing"in r?!!r.trailing:a),Irt(t,e,{leading:o,maxWait:e,trailing:a})}Fse.exports=Drt});function Srt(t){return typeof t.reportCode<"u"}var Tse,Rse,Nse,Prt,zt,Xs,Yl=Et(()=>{Tse=$e(uO()),Rse=Be("stream"),Nse=Be("string_decoder"),Prt=15,zt=class extends Error{constructor(r,o,a){super(o);this.reportExtra=a;this.reportCode=r}};Xs=class{constructor(){this.cacheHits=new Set;this.cacheMisses=new Set;this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}getRecommendedLength(){return 180}reportCacheHit(e){this.cacheHits.add(e.locatorHash)}reportCacheMiss(e,r){this.cacheMisses.add(e.locatorHash)}static progressViaCounter(e){let r=0,o,a=new Promise(p=>{o=p}),n=p=>{let h=o;a=new Promise(E=>{o=E}),r=p,h()},u=(p=0)=>{n(r+1)},A=async function*(){for(;r{r=u}),a=(0,Tse.default)(u=>{let A=r;o=new Promise(p=>{r=p}),e=u,A()},1e3/Prt),n=async function*(){for(;;)await o,yield{title:e}}();return{[Symbol.asyncIterator](){return n},hasProgress:!1,hasTitle:!0,setTitle:a}}async startProgressPromise(e,r){let o=this.reportProgress(e);try{return await r(e)}finally{o.stop()}}startProgressSync(e,r){let o=this.reportProgress(e);try{return r(e)}finally{o.stop()}}reportInfoOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedInfos.has(a)||(this.reportedInfos.add(a),this.reportInfo(e,r),o?.reportExtra?.(this))}reportWarningOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedWarnings.has(a)||(this.reportedWarnings.add(a),this.reportWarning(e,r),o?.reportExtra?.(this))}reportErrorOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedErrors.has(a)||(this.reportedErrors.add(a),this.reportError(e,r),o?.reportExtra?.(this))}reportExceptionOnce(e){Srt(e)?this.reportErrorOnce(e.reportCode,e.message,{key:e,reportExtra:e.reportExtra}):this.reportErrorOnce(1,e.stack||e.message,{key:e})}createStreamReporter(e=null){let r=new Rse.PassThrough,o=new Nse.StringDecoder,a="";return r.on("data",n=>{let u=o.write(n),A;do if(A=u.indexOf(` +`),A!==-1){let p=a+u.substring(0,A);u=u.substring(A+1),a="",e!==null?this.reportInfo(null,`${e} ${p}`):this.reportInfo(null,p)}while(A!==-1);a+=u}),r.on("end",()=>{let n=o.end();n!==""&&(e!==null?this.reportInfo(null,`${e} ${n}`):this.reportInfo(null,n))}),r}}});var pE,AO=Et(()=>{Yl();xo();pE=class{constructor(e){this.fetchers=e}supports(e,r){return!!this.tryFetcher(e,r)}getLocalPath(e,r){return this.getFetcher(e,r).getLocalPath(e,r)}async fetch(e,r){return await this.getFetcher(e,r).fetch(e,r)}tryFetcher(e,r){let o=this.fetchers.find(a=>a.supports(e,r));return o||null}getFetcher(e,r){let o=this.fetchers.find(a=>a.supports(e,r));if(!o)throw new zt(11,`${jr(r.project.configuration,e)} isn't supported by any available fetcher`);return o}}});var vd,fO=Et(()=>{xo();vd=class{constructor(e){this.resolvers=e.filter(r=>r)}supportsDescriptor(e,r){return!!this.tryResolverByDescriptor(e,r)}supportsLocator(e,r){return!!this.tryResolverByLocator(e,r)}shouldPersistResolution(e,r){return this.getResolverByLocator(e,r).shouldPersistResolution(e,r)}bindDescriptor(e,r,o){return this.getResolverByDescriptor(e,o).bindDescriptor(e,r,o)}getResolutionDependencies(e,r){return this.getResolverByDescriptor(e,r).getResolutionDependencies(e,r)}async getCandidates(e,r,o){return await this.getResolverByDescriptor(e,o).getCandidates(e,r,o)}async getSatisfying(e,r,o,a){return this.getResolverByDescriptor(e,a).getSatisfying(e,r,o,a)}async resolve(e,r){return await this.getResolverByLocator(e,r).resolve(e,r)}tryResolverByDescriptor(e,r){let o=this.resolvers.find(a=>a.supportsDescriptor(e,r));return o||null}getResolverByDescriptor(e,r){let o=this.resolvers.find(a=>a.supportsDescriptor(e,r));if(!o)throw new Error(`${qn(r.project.configuration,e)} isn't supported by any available resolver`);return o}tryResolverByLocator(e,r){let o=this.resolvers.find(a=>a.supportsLocator(e,r));return o||null}getResolverByLocator(e,r){let o=this.resolvers.find(a=>a.supportsLocator(e,r));if(!o)throw new Error(`${jr(r.project.configuration,e)} isn't supported by any available resolver`);return o}}});var hE,pO=Et(()=>{Pt();xo();hE=class{supports(e){return!!e.reference.startsWith("virtual:")}getLocalPath(e,r){let o=e.reference.indexOf("#");if(o===-1)throw new Error("Invalid virtual package reference");let a=e.reference.slice(o+1),n=Qs(e,a);return r.fetcher.getLocalPath(n,r)}async fetch(e,r){let o=e.reference.indexOf("#");if(o===-1)throw new Error("Invalid virtual package reference");let a=e.reference.slice(o+1),n=Qs(e,a),u=await r.fetcher.fetch(n,r);return await this.ensureVirtualLink(e,u,r)}getLocatorFilename(e){return aE(e)}async ensureVirtualLink(e,r,o){let a=r.packageFs.getRealPath(),n=o.project.configuration.get("virtualFolder"),u=this.getLocatorFilename(e),A=mi.makeVirtualPath(n,u,a),p=new Uu(A,{baseFs:r.packageFs,pathUtils:K});return{...r,packageFs:p}}}});var gE,l1,Lse=Et(()=>{gE=class{static isVirtualDescriptor(e){return!!e.range.startsWith(gE.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(gE.protocol)}supportsDescriptor(e,r){return gE.isVirtualDescriptor(e)}supportsLocator(e,r){return gE.isVirtualLocator(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){throw new Error('Assertion failed: calling "bindDescriptor" on a virtual descriptor is unsupported')}getResolutionDependencies(e,r){throw new Error('Assertion failed: calling "getResolutionDependencies" on a virtual descriptor is unsupported')}async getCandidates(e,r,o){throw new Error('Assertion failed: calling "getCandidates" on a virtual descriptor is unsupported')}async getSatisfying(e,r,o,a){throw new Error('Assertion failed: calling "getSatisfying" on a virtual descriptor is unsupported')}async resolve(e,r){throw new Error('Assertion failed: calling "resolve" on a virtual locator is unsupported')}},l1=gE;l1.protocol="virtual:"});var dE,hO=Et(()=>{Pt();Bd();dE=class{supports(e){return!!e.reference.startsWith(Xn.protocol)}getLocalPath(e,r){return this.getWorkspace(e,r).cwd}async fetch(e,r){let o=this.getWorkspace(e,r).cwd;return{packageFs:new gn(o),prefixPath:Bt.dot,localPath:o}}getWorkspace(e,r){return r.project.getWorkspaceByCwd(e.reference.slice(Xn.protocol.length))}}});function c1(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Mse(t){return typeof t>"u"?3:c1(t)?0:Array.isArray(t)?1:2}function mO(t,e){return Object.hasOwn(t,e)}function brt(t){return c1(t)&&mO(t,"onConflict")&&typeof t.onConflict=="string"}function krt(t){if(typeof t>"u")return{onConflict:"default",value:t};if(!brt(t))return{onConflict:"default",value:t};if(mO(t,"value"))return t;let{onConflict:e,...r}=t;return{onConflict:e,value:r}}function Ose(t,e){let r=c1(t)&&mO(t,e)?t[e]:void 0;return krt(r)}function mE(t,e){return[t,e,Use]}function yO(t){return Array.isArray(t)?t[2]===Use:!1}function gO(t,e){if(c1(t)){let r={};for(let o of Object.keys(t))r[o]=gO(t[o],e);return mE(e,r)}return Array.isArray(t)?mE(e,t.map(r=>gO(r,e))):mE(e,t)}function dO(t,e,r,o,a){let n,u=[],A=a,p=0;for(let E=a-1;E>=o;--E){let[I,v]=t[E],{onConflict:b,value:C}=Ose(v,r),T=Mse(C);if(T!==3){if(n??=T,T!==n||b==="hardReset"){p=A;break}if(T===2)return mE(I,C);if(u.unshift([I,C]),b==="reset"){p=E;break}b==="extend"&&E===o&&(o=0),A=E}}if(typeof n>"u")return null;let h=u.map(([E])=>E).join(", ");switch(n){case 1:return mE(h,new Array().concat(...u.map(([E,I])=>I.map(v=>gO(v,E)))));case 0:{let E=Object.assign({},...u.map(([,T])=>T)),I=Object.keys(E),v={},b=t.map(([T,L])=>[T,Ose(L,r).value]),C=xrt(b,([T,L])=>{let U=Mse(L);return U!==0&&U!==3});if(C!==-1){let T=b.slice(C+1);for(let L of I)v[L]=dO(T,e,L,0,T.length)}else for(let T of I)v[T]=dO(b,e,T,p,b.length);return mE(h,v)}default:throw new Error("Assertion failed: Non-extendable value type")}}function _se(t){return dO(t.map(([e,r])=>[e,{["."]:r}]),[],".",0,t.length)}function u1(t){return yO(t)?t[1]:t}function YS(t){let e=yO(t)?t[1]:t;if(Array.isArray(e))return e.map(r=>YS(r));if(c1(e)){let r={};for(let[o,a]of Object.entries(e))r[o]=YS(a);return r}return e}function EO(t){return yO(t)?t[0]:null}var xrt,Use,Hse=Et(()=>{xrt=(t,e,r)=>{let o=[...t];return o.reverse(),o.findIndex(e,r)};Use=Symbol()});var WS={};Kt(WS,{getDefaultGlobalFolder:()=>wO,getHomeFolder:()=>yE,isFolderInside:()=>IO});function wO(){if(process.platform==="win32"){let t=ue.toPortablePath(process.env.LOCALAPPDATA||ue.join((0,CO.homedir)(),"AppData","Local"));return K.resolve(t,"Yarn/Berry")}if(process.env.XDG_DATA_HOME){let t=ue.toPortablePath(process.env.XDG_DATA_HOME);return K.resolve(t,"yarn/berry")}return K.resolve(yE(),".yarn/berry")}function yE(){return ue.toPortablePath((0,CO.homedir)()||"/usr/local/share")}function IO(t,e){let r=K.relative(e,t);return r&&!r.startsWith("..")&&!K.isAbsolute(r)}var CO,VS=Et(()=>{Pt();CO=Be("os")});var Yse=_(EE=>{"use strict";var sLt=Be("net"),Frt=Be("tls"),BO=Be("http"),jse=Be("https"),Trt=Be("events"),oLt=Be("assert"),Rrt=Be("util");EE.httpOverHttp=Nrt;EE.httpsOverHttp=Lrt;EE.httpOverHttps=Mrt;EE.httpsOverHttps=Ort;function Nrt(t){var e=new Qf(t);return e.request=BO.request,e}function Lrt(t){var e=new Qf(t);return e.request=BO.request,e.createSocket=qse,e.defaultPort=443,e}function Mrt(t){var e=new Qf(t);return e.request=jse.request,e}function Ort(t){var e=new Qf(t);return e.request=jse.request,e.createSocket=qse,e.defaultPort=443,e}function Qf(t){var e=this;e.options=t||{},e.proxyOptions=e.options.proxy||{},e.maxSockets=e.options.maxSockets||BO.Agent.defaultMaxSockets,e.requests=[],e.sockets=[],e.on("free",function(o,a,n,u){for(var A=Gse(a,n,u),p=0,h=e.requests.length;p=this.maxSockets){n.requests.push(u);return}n.createSocket(u,function(A){A.on("free",p),A.on("close",h),A.on("agentRemove",h),e.onSocket(A);function p(){n.emit("free",A,u)}function h(E){n.removeSocket(A),A.removeListener("free",p),A.removeListener("close",h),A.removeListener("agentRemove",h)}})};Qf.prototype.createSocket=function(e,r){var o=this,a={};o.sockets.push(a);var n=vO({},o.proxyOptions,{method:"CONNECT",path:e.host+":"+e.port,agent:!1,headers:{host:e.host+":"+e.port}});e.localAddress&&(n.localAddress=e.localAddress),n.proxyAuth&&(n.headers=n.headers||{},n.headers["Proxy-Authorization"]="Basic "+new Buffer(n.proxyAuth).toString("base64")),sh("making CONNECT request");var u=o.request(n);u.useChunkedEncodingByDefault=!1,u.once("response",A),u.once("upgrade",p),u.once("connect",h),u.once("error",E),u.end();function A(I){I.upgrade=!0}function p(I,v,b){process.nextTick(function(){h(I,v,b)})}function h(I,v,b){if(u.removeAllListeners(),v.removeAllListeners(),I.statusCode!==200){sh("tunneling socket could not be established, statusCode=%d",I.statusCode),v.destroy();var C=new Error("tunneling socket could not be established, statusCode="+I.statusCode);C.code="ECONNRESET",e.request.emit("error",C),o.removeSocket(a);return}if(b.length>0){sh("got illegal response body from proxy"),v.destroy();var C=new Error("got illegal response body from proxy");C.code="ECONNRESET",e.request.emit("error",C),o.removeSocket(a);return}return sh("tunneling connection has established"),o.sockets[o.sockets.indexOf(a)]=v,r(v)}function E(I){u.removeAllListeners(),sh(`tunneling socket could not be established, cause=%s +`,I.message,I.stack);var v=new Error("tunneling socket could not be established, cause="+I.message);v.code="ECONNRESET",e.request.emit("error",v),o.removeSocket(a)}};Qf.prototype.removeSocket=function(e){var r=this.sockets.indexOf(e);if(r!==-1){this.sockets.splice(r,1);var o=this.requests.shift();o&&this.createSocket(o,function(a){o.request.onSocket(a)})}};function qse(t,e){var r=this;Qf.prototype.createSocket.call(r,t,function(o){var a=t.request.getHeader("host"),n=vO({},r.options,{socket:o,servername:a?a.replace(/:.*$/,""):t.host}),u=Frt.connect(0,n);r.sockets[r.sockets.indexOf(o)]=u,e(u)})}function Gse(t,e,r){return typeof t=="string"?{host:t,port:e,localAddress:r}:t}function vO(t){for(var e=1,r=arguments.length;e{Wse.exports=Yse()});var Tf=_((Ff,KS)=>{"use strict";Object.defineProperty(Ff,"__esModule",{value:!0});var Kse=["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function Urt(t){return Kse.includes(t)}var _rt=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","FormData","URLSearchParams","HTMLElement",...Kse];function Hrt(t){return _rt.includes(t)}var jrt=["null","undefined","string","number","bigint","boolean","symbol"];function qrt(t){return jrt.includes(t)}function CE(t){return e=>typeof e===t}var{toString:Jse}=Object.prototype,A1=t=>{let e=Jse.call(t).slice(8,-1);if(/HTML\w+Element/.test(e)&&xe.domElement(t))return"HTMLElement";if(Hrt(e))return e},ei=t=>e=>A1(e)===t;function xe(t){if(t===null)return"null";switch(typeof t){case"undefined":return"undefined";case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"function":return"Function";case"bigint":return"bigint";case"symbol":return"symbol";default:}if(xe.observable(t))return"Observable";if(xe.array(t))return"Array";if(xe.buffer(t))return"Buffer";let e=A1(t);if(e)return e;if(t instanceof String||t instanceof Boolean||t instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}xe.undefined=CE("undefined");xe.string=CE("string");var Grt=CE("number");xe.number=t=>Grt(t)&&!xe.nan(t);xe.bigint=CE("bigint");xe.function_=CE("function");xe.null_=t=>t===null;xe.class_=t=>xe.function_(t)&&t.toString().startsWith("class ");xe.boolean=t=>t===!0||t===!1;xe.symbol=CE("symbol");xe.numericString=t=>xe.string(t)&&!xe.emptyStringOrWhitespace(t)&&!Number.isNaN(Number(t));xe.array=(t,e)=>Array.isArray(t)?xe.function_(e)?t.every(e):!0:!1;xe.buffer=t=>{var e,r,o,a;return(a=(o=(r=(e=t)===null||e===void 0?void 0:e.constructor)===null||r===void 0?void 0:r.isBuffer)===null||o===void 0?void 0:o.call(r,t))!==null&&a!==void 0?a:!1};xe.nullOrUndefined=t=>xe.null_(t)||xe.undefined(t);xe.object=t=>!xe.null_(t)&&(typeof t=="object"||xe.function_(t));xe.iterable=t=>{var e;return xe.function_((e=t)===null||e===void 0?void 0:e[Symbol.iterator])};xe.asyncIterable=t=>{var e;return xe.function_((e=t)===null||e===void 0?void 0:e[Symbol.asyncIterator])};xe.generator=t=>xe.iterable(t)&&xe.function_(t.next)&&xe.function_(t.throw);xe.asyncGenerator=t=>xe.asyncIterable(t)&&xe.function_(t.next)&&xe.function_(t.throw);xe.nativePromise=t=>ei("Promise")(t);var Yrt=t=>{var e,r;return xe.function_((e=t)===null||e===void 0?void 0:e.then)&&xe.function_((r=t)===null||r===void 0?void 0:r.catch)};xe.promise=t=>xe.nativePromise(t)||Yrt(t);xe.generatorFunction=ei("GeneratorFunction");xe.asyncGeneratorFunction=t=>A1(t)==="AsyncGeneratorFunction";xe.asyncFunction=t=>A1(t)==="AsyncFunction";xe.boundFunction=t=>xe.function_(t)&&!t.hasOwnProperty("prototype");xe.regExp=ei("RegExp");xe.date=ei("Date");xe.error=ei("Error");xe.map=t=>ei("Map")(t);xe.set=t=>ei("Set")(t);xe.weakMap=t=>ei("WeakMap")(t);xe.weakSet=t=>ei("WeakSet")(t);xe.int8Array=ei("Int8Array");xe.uint8Array=ei("Uint8Array");xe.uint8ClampedArray=ei("Uint8ClampedArray");xe.int16Array=ei("Int16Array");xe.uint16Array=ei("Uint16Array");xe.int32Array=ei("Int32Array");xe.uint32Array=ei("Uint32Array");xe.float32Array=ei("Float32Array");xe.float64Array=ei("Float64Array");xe.bigInt64Array=ei("BigInt64Array");xe.bigUint64Array=ei("BigUint64Array");xe.arrayBuffer=ei("ArrayBuffer");xe.sharedArrayBuffer=ei("SharedArrayBuffer");xe.dataView=ei("DataView");xe.directInstanceOf=(t,e)=>Object.getPrototypeOf(t)===e.prototype;xe.urlInstance=t=>ei("URL")(t);xe.urlString=t=>{if(!xe.string(t))return!1;try{return new URL(t),!0}catch{return!1}};xe.truthy=t=>Boolean(t);xe.falsy=t=>!t;xe.nan=t=>Number.isNaN(t);xe.primitive=t=>xe.null_(t)||qrt(typeof t);xe.integer=t=>Number.isInteger(t);xe.safeInteger=t=>Number.isSafeInteger(t);xe.plainObject=t=>{if(Jse.call(t)!=="[object Object]")return!1;let e=Object.getPrototypeOf(t);return e===null||e===Object.getPrototypeOf({})};xe.typedArray=t=>Urt(A1(t));var Wrt=t=>xe.safeInteger(t)&&t>=0;xe.arrayLike=t=>!xe.nullOrUndefined(t)&&!xe.function_(t)&&Wrt(t.length);xe.inRange=(t,e)=>{if(xe.number(e))return t>=Math.min(0,e)&&t<=Math.max(e,0);if(xe.array(e)&&e.length===2)return t>=Math.min(...e)&&t<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var Vrt=1,Krt=["innerHTML","ownerDocument","style","attributes","nodeValue"];xe.domElement=t=>xe.object(t)&&t.nodeType===Vrt&&xe.string(t.nodeName)&&!xe.plainObject(t)&&Krt.every(e=>e in t);xe.observable=t=>{var e,r,o,a;return t?t===((r=(e=t)[Symbol.observable])===null||r===void 0?void 0:r.call(e))||t===((a=(o=t)["@@observable"])===null||a===void 0?void 0:a.call(o)):!1};xe.nodeStream=t=>xe.object(t)&&xe.function_(t.pipe)&&!xe.observable(t);xe.infinite=t=>t===1/0||t===-1/0;var zse=t=>e=>xe.integer(e)&&Math.abs(e%2)===t;xe.evenInteger=zse(0);xe.oddInteger=zse(1);xe.emptyArray=t=>xe.array(t)&&t.length===0;xe.nonEmptyArray=t=>xe.array(t)&&t.length>0;xe.emptyString=t=>xe.string(t)&&t.length===0;xe.nonEmptyString=t=>xe.string(t)&&t.length>0;var Jrt=t=>xe.string(t)&&!/\S/.test(t);xe.emptyStringOrWhitespace=t=>xe.emptyString(t)||Jrt(t);xe.emptyObject=t=>xe.object(t)&&!xe.map(t)&&!xe.set(t)&&Object.keys(t).length===0;xe.nonEmptyObject=t=>xe.object(t)&&!xe.map(t)&&!xe.set(t)&&Object.keys(t).length>0;xe.emptySet=t=>xe.set(t)&&t.size===0;xe.nonEmptySet=t=>xe.set(t)&&t.size>0;xe.emptyMap=t=>xe.map(t)&&t.size===0;xe.nonEmptyMap=t=>xe.map(t)&&t.size>0;xe.propertyKey=t=>xe.any([xe.string,xe.number,xe.symbol],t);xe.formData=t=>ei("FormData")(t);xe.urlSearchParams=t=>ei("URLSearchParams")(t);var Xse=(t,e,r)=>{if(!xe.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(r.length===0)throw new TypeError("Invalid number of values");return t.call(r,e)};xe.any=(t,...e)=>(xe.array(t)?t:[t]).some(o=>Xse(Array.prototype.some,o,e));xe.all=(t,...e)=>Xse(Array.prototype.every,t,e);var Ht=(t,e,r,o={})=>{if(!t){let{multipleValues:a}=o,n=a?`received values of types ${[...new Set(r.map(u=>`\`${xe(u)}\``))].join(", ")}`:`received value of type \`${xe(r)}\``;throw new TypeError(`Expected value which is \`${e}\`, ${n}.`)}};Ff.assert={undefined:t=>Ht(xe.undefined(t),"undefined",t),string:t=>Ht(xe.string(t),"string",t),number:t=>Ht(xe.number(t),"number",t),bigint:t=>Ht(xe.bigint(t),"bigint",t),function_:t=>Ht(xe.function_(t),"Function",t),null_:t=>Ht(xe.null_(t),"null",t),class_:t=>Ht(xe.class_(t),"Class",t),boolean:t=>Ht(xe.boolean(t),"boolean",t),symbol:t=>Ht(xe.symbol(t),"symbol",t),numericString:t=>Ht(xe.numericString(t),"string with a number",t),array:(t,e)=>{Ht(xe.array(t),"Array",t),e&&t.forEach(e)},buffer:t=>Ht(xe.buffer(t),"Buffer",t),nullOrUndefined:t=>Ht(xe.nullOrUndefined(t),"null or undefined",t),object:t=>Ht(xe.object(t),"Object",t),iterable:t=>Ht(xe.iterable(t),"Iterable",t),asyncIterable:t=>Ht(xe.asyncIterable(t),"AsyncIterable",t),generator:t=>Ht(xe.generator(t),"Generator",t),asyncGenerator:t=>Ht(xe.asyncGenerator(t),"AsyncGenerator",t),nativePromise:t=>Ht(xe.nativePromise(t),"native Promise",t),promise:t=>Ht(xe.promise(t),"Promise",t),generatorFunction:t=>Ht(xe.generatorFunction(t),"GeneratorFunction",t),asyncGeneratorFunction:t=>Ht(xe.asyncGeneratorFunction(t),"AsyncGeneratorFunction",t),asyncFunction:t=>Ht(xe.asyncFunction(t),"AsyncFunction",t),boundFunction:t=>Ht(xe.boundFunction(t),"Function",t),regExp:t=>Ht(xe.regExp(t),"RegExp",t),date:t=>Ht(xe.date(t),"Date",t),error:t=>Ht(xe.error(t),"Error",t),map:t=>Ht(xe.map(t),"Map",t),set:t=>Ht(xe.set(t),"Set",t),weakMap:t=>Ht(xe.weakMap(t),"WeakMap",t),weakSet:t=>Ht(xe.weakSet(t),"WeakSet",t),int8Array:t=>Ht(xe.int8Array(t),"Int8Array",t),uint8Array:t=>Ht(xe.uint8Array(t),"Uint8Array",t),uint8ClampedArray:t=>Ht(xe.uint8ClampedArray(t),"Uint8ClampedArray",t),int16Array:t=>Ht(xe.int16Array(t),"Int16Array",t),uint16Array:t=>Ht(xe.uint16Array(t),"Uint16Array",t),int32Array:t=>Ht(xe.int32Array(t),"Int32Array",t),uint32Array:t=>Ht(xe.uint32Array(t),"Uint32Array",t),float32Array:t=>Ht(xe.float32Array(t),"Float32Array",t),float64Array:t=>Ht(xe.float64Array(t),"Float64Array",t),bigInt64Array:t=>Ht(xe.bigInt64Array(t),"BigInt64Array",t),bigUint64Array:t=>Ht(xe.bigUint64Array(t),"BigUint64Array",t),arrayBuffer:t=>Ht(xe.arrayBuffer(t),"ArrayBuffer",t),sharedArrayBuffer:t=>Ht(xe.sharedArrayBuffer(t),"SharedArrayBuffer",t),dataView:t=>Ht(xe.dataView(t),"DataView",t),urlInstance:t=>Ht(xe.urlInstance(t),"URL",t),urlString:t=>Ht(xe.urlString(t),"string with a URL",t),truthy:t=>Ht(xe.truthy(t),"truthy",t),falsy:t=>Ht(xe.falsy(t),"falsy",t),nan:t=>Ht(xe.nan(t),"NaN",t),primitive:t=>Ht(xe.primitive(t),"primitive",t),integer:t=>Ht(xe.integer(t),"integer",t),safeInteger:t=>Ht(xe.safeInteger(t),"integer",t),plainObject:t=>Ht(xe.plainObject(t),"plain object",t),typedArray:t=>Ht(xe.typedArray(t),"TypedArray",t),arrayLike:t=>Ht(xe.arrayLike(t),"array-like",t),domElement:t=>Ht(xe.domElement(t),"HTMLElement",t),observable:t=>Ht(xe.observable(t),"Observable",t),nodeStream:t=>Ht(xe.nodeStream(t),"Node.js Stream",t),infinite:t=>Ht(xe.infinite(t),"infinite number",t),emptyArray:t=>Ht(xe.emptyArray(t),"empty array",t),nonEmptyArray:t=>Ht(xe.nonEmptyArray(t),"non-empty array",t),emptyString:t=>Ht(xe.emptyString(t),"empty string",t),nonEmptyString:t=>Ht(xe.nonEmptyString(t),"non-empty string",t),emptyStringOrWhitespace:t=>Ht(xe.emptyStringOrWhitespace(t),"empty string or whitespace",t),emptyObject:t=>Ht(xe.emptyObject(t),"empty object",t),nonEmptyObject:t=>Ht(xe.nonEmptyObject(t),"non-empty object",t),emptySet:t=>Ht(xe.emptySet(t),"empty set",t),nonEmptySet:t=>Ht(xe.nonEmptySet(t),"non-empty set",t),emptyMap:t=>Ht(xe.emptyMap(t),"empty map",t),nonEmptyMap:t=>Ht(xe.nonEmptyMap(t),"non-empty map",t),propertyKey:t=>Ht(xe.propertyKey(t),"PropertyKey",t),formData:t=>Ht(xe.formData(t),"FormData",t),urlSearchParams:t=>Ht(xe.urlSearchParams(t),"URLSearchParams",t),evenInteger:t=>Ht(xe.evenInteger(t),"even integer",t),oddInteger:t=>Ht(xe.oddInteger(t),"odd integer",t),directInstanceOf:(t,e)=>Ht(xe.directInstanceOf(t,e),"T",t),inRange:(t,e)=>Ht(xe.inRange(t,e),"in range",t),any:(t,...e)=>Ht(xe.any(t,...e),"predicate returns truthy for any value",e,{multipleValues:!0}),all:(t,...e)=>Ht(xe.all(t,...e),"predicate returns truthy for all values",e,{multipleValues:!0})};Object.defineProperties(xe,{class:{value:xe.class_},function:{value:xe.function_},null:{value:xe.null_}});Object.defineProperties(Ff.assert,{class:{value:Ff.assert.class_},function:{value:Ff.assert.function_},null:{value:Ff.assert.null_}});Ff.default=xe;KS.exports=xe;KS.exports.default=xe;KS.exports.assert=Ff.assert});var Zse=_((cLt,DO)=>{"use strict";var JS=class extends Error{constructor(e){super(e||"Promise was canceled"),this.name="CancelError"}get isCanceled(){return!0}},wE=class{static fn(e){return(...r)=>new wE((o,a,n)=>{r.push(n),e(...r).then(o,a)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((r,o)=>{this._reject=o;let a=A=>{this._isPending=!1,r(A)},n=A=>{this._isPending=!1,o(A)},u=A=>{if(!this._isPending)throw new Error("The `onCancel` handler was attached after the promise settled.");this._cancelHandlers.push(A)};return Object.defineProperties(u,{shouldReject:{get:()=>this._rejectOnCancel,set:A=>{this._rejectOnCancel=A}}}),e(a,n,u)})}then(e,r){return this._promise.then(e,r)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let r of this._cancelHandlers)r()}catch(r){this._reject(r)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new JS(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(wE.prototype,Promise.prototype);DO.exports=wE;DO.exports.CancelError=JS});var $se=_((SO,xO)=>{"use strict";Object.defineProperty(SO,"__esModule",{value:!0});var zrt=Be("tls"),PO=(t,e)=>{let r;typeof e=="function"?r={connect:e}:r=e;let o=typeof r.connect=="function",a=typeof r.secureConnect=="function",n=typeof r.close=="function",u=()=>{o&&r.connect(),t instanceof zrt.TLSSocket&&a&&(t.authorized?r.secureConnect():t.authorizationError||t.once("secureConnect",r.secureConnect)),n&&t.once("close",r.close)};t.writable&&!t.connecting?u():t.connecting?t.once("connect",u):t.destroyed&&n&&r.close(t._hadError)};SO.default=PO;xO.exports=PO;xO.exports.default=PO});var eoe=_((kO,QO)=>{"use strict";Object.defineProperty(kO,"__esModule",{value:!0});var Xrt=$se(),Zrt=Number(process.versions.node.split(".")[0]),bO=t=>{let e={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};t.timings=e;let r=u=>{let A=u.emit.bind(u);u.emit=(p,...h)=>(p==="error"&&(e.error=Date.now(),e.phases.total=e.error-e.start,u.emit=A),A(p,...h))};r(t),t.prependOnceListener("abort",()=>{e.abort=Date.now(),(!e.response||Zrt>=13)&&(e.phases.total=Date.now()-e.start)});let o=u=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let A=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};u.prependOnceListener("lookup",A),Xrt.default(u,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(u.removeListener("lookup",A),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};t.socket?o(t.socket):t.prependOnceListener("socket",o);let a=()=>{var u;e.upload=Date.now(),e.phases.request=e.upload-(u=e.secureConnect,u??e.connect)};return(()=>typeof t.writableFinished=="boolean"?t.writableFinished:t.finished&&t.outputSize===0&&(!t.socket||t.socket.writableLength===0))()?a():t.prependOnceListener("finish",a),t.prependOnceListener("response",u=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,u.timings=e,r(u),u.prependOnceListener("end",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};kO.default=bO;QO.exports=bO;QO.exports.default=bO});var aoe=_((uLt,RO)=>{"use strict";var{V4MAPPED:$rt,ADDRCONFIG:ent,ALL:ooe,promises:{Resolver:toe},lookup:tnt}=Be("dns"),{promisify:FO}=Be("util"),rnt=Be("os"),IE=Symbol("cacheableLookupCreateConnection"),TO=Symbol("cacheableLookupInstance"),roe=Symbol("expires"),nnt=typeof ooe=="number",noe=t=>{if(!(t&&typeof t.createConnection=="function"))throw new Error("Expected an Agent instance as the first argument")},int=t=>{for(let e of t)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},ioe=()=>{let t=!1,e=!1;for(let r of Object.values(rnt.networkInterfaces()))for(let o of r)if(!o.internal&&(o.family==="IPv6"?e=!0:t=!0,t&&e))return{has4:t,has6:e};return{has4:t,has6:e}},snt=t=>Symbol.iterator in t,soe={ttl:!0},ont={all:!0},zS=class{constructor({cache:e=new Map,maxTtl:r=1/0,fallbackDuration:o=3600,errorTtl:a=.15,resolver:n=new toe,lookup:u=tnt}={}){if(this.maxTtl=r,this.errorTtl=a,this._cache=e,this._resolver=n,this._dnsLookup=FO(u),this._resolver instanceof toe?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=FO(this._resolver.resolve4.bind(this._resolver)),this._resolve6=FO(this._resolver.resolve6.bind(this._resolver))),this._iface=ioe(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,o<1)this._fallback=!1;else{this._fallback=!0;let A=setInterval(()=>{this._hostnamesToFallback.clear()},o*1e3);A.unref&&A.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.clear(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,r,o){if(typeof r=="function"?(o=r,r={}):typeof r=="number"&&(r={family:r}),!o)throw new Error("Callback must be a function.");this.lookupAsync(e,r).then(a=>{r.all?o(null,a):o(null,a.address,a.family,a.expires,a.ttl)},o)}async lookupAsync(e,r={}){typeof r=="number"&&(r={family:r});let o=await this.query(e);if(r.family===6){let a=o.filter(n=>n.family===6);r.hints&$rt&&(nnt&&r.hints&ooe||a.length===0)?int(o):o=a}else r.family===4&&(o=o.filter(a=>a.family===4));if(r.hints&ent){let{_iface:a}=this;o=o.filter(n=>n.family===6?a.has6:a.has4)}if(o.length===0){let a=new Error(`cacheableLookup ENOTFOUND ${e}`);throw a.code="ENOTFOUND",a.hostname=e,a}return r.all?o:o[0]}async query(e){let r=await this._cache.get(e);if(!r){let o=this._pending[e];if(o)r=await o;else{let a=this.queryAndCache(e);this._pending[e]=a,r=await a}}return r=r.map(o=>({...o})),r}async _resolve(e){let r=async h=>{try{return await h}catch(E){if(E.code==="ENODATA"||E.code==="ENOTFOUND")return[];throw E}},[o,a]=await Promise.all([this._resolve4(e,soe),this._resolve6(e,soe)].map(h=>r(h))),n=0,u=0,A=0,p=Date.now();for(let h of o)h.family=4,h.expires=p+h.ttl*1e3,n=Math.max(n,h.ttl);for(let h of a)h.family=6,h.expires=p+h.ttl*1e3,u=Math.max(u,h.ttl);return o.length>0?a.length>0?A=Math.min(n,u):A=n:A=u,{entries:[...o,...a],cacheTtl:A}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch{return{entries:[],cacheTtl:0}}}async _set(e,r,o){if(this.maxTtl>0&&o>0){o=Math.min(o,this.maxTtl)*1e3,r[roe]=Date.now()+o;try{await this._cache.set(e,r,o)}catch(a){this.lookupAsync=async()=>{let n=new Error("Cache Error. Please recreate the CacheableLookup instance.");throw n.cause=a,n}}snt(this._cache)&&this._tick(o)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,ont);try{let r=await this._resolve(e);r.entries.length===0&&this._fallback&&(r=await this._lookup(e),r.entries.length!==0&&this._hostnamesToFallback.add(e));let o=r.entries.length===0?this.errorTtl:r.cacheTtl;return await this._set(e,r.entries,o),delete this._pending[e],r.entries}catch(r){throw delete this._pending[e],r}}_tick(e){let r=this._nextRemovalTime;(!r||e{this._nextRemovalTime=!1;let o=1/0,a=Date.now();for(let[n,u]of this._cache){let A=u[roe];a>=A?this._cache.delete(n):A("lookup"in r||(r.lookup=this.lookup),e[IE](r,o))}uninstall(e){if(noe(e),e[IE]){if(e[TO]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");e.createConnection=e[IE],delete e[IE],delete e[TO]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=ioe(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};RO.exports=zS;RO.exports.default=zS});var uoe=_((ALt,NO)=>{"use strict";var ant=typeof URL>"u"?Be("url").URL:URL,lnt="text/plain",cnt="us-ascii",loe=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),unt=(t,{stripHash:e})=>{let r=t.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!r)throw new Error(`Invalid URL: ${t}`);let o=r[1].split(";"),a=r[2],n=e?"":r[3],u=!1;o[o.length-1]==="base64"&&(o.pop(),u=!0);let A=(o.shift()||"").toLowerCase(),h=[...o.map(E=>{let[I,v=""]=E.split("=").map(b=>b.trim());return I==="charset"&&(v=v.toLowerCase(),v===cnt)?"":`${I}${v?`=${v}`:""}`}).filter(Boolean)];return u&&h.push("base64"),(h.length!==0||A&&A!==lnt)&&h.unshift(A),`data:${h.join(";")},${u?a.trim():a}${n?`#${n}`:""}`},coe=(t,e)=>{if(e={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},Reflect.has(e,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(e,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(e,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(t=t.trim(),/^data:/i.test(t))return unt(t,e);let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let a=new ant(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&a.protocol==="https:"&&(a.protocol="http:"),e.forceHttps&&a.protocol==="http:"&&(a.protocol="https:"),e.stripAuthentication&&(a.username="",a.password=""),e.stripHash&&(a.hash=""),a.pathname&&(a.pathname=a.pathname.replace(/((?!:).|^)\/{2,}/g,(n,u)=>/^(?!\/)/g.test(u)?`${u}/`:"/")),a.pathname&&(a.pathname=decodeURI(a.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let n=a.pathname.split("/"),u=n[n.length-1];loe(u,e.removeDirectoryIndex)&&(n=n.slice(0,n.length-1),a.pathname=n.slice(1).join("/")+"/")}if(a.hostname&&(a.hostname=a.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let n of[...a.searchParams.keys()])loe(n,e.removeQueryParameters)&&a.searchParams.delete(n);return e.sortQueryParameters&&a.searchParams.sort(),e.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\/$/,"")),t=a.toString(),(e.removeTrailingSlash||a.pathname==="/")&&a.hash===""&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t};NO.exports=coe;NO.exports.default=coe});var poe=_((fLt,foe)=>{foe.exports=Aoe;function Aoe(t,e){if(t&&e)return Aoe(t)(e);if(typeof t!="function")throw new TypeError("need wrapper function");return Object.keys(t).forEach(function(o){r[o]=t[o]}),r;function r(){for(var o=new Array(arguments.length),a=0;a{var hoe=poe();LO.exports=hoe(XS);LO.exports.strict=hoe(goe);XS.proto=XS(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return XS(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return goe(this)},configurable:!0})});function XS(t){var e=function(){return e.called?e.value:(e.called=!0,e.value=t.apply(this,arguments))};return e.called=!1,e}function goe(t){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=t.apply(this,arguments)},r=t.name||"Function wrapped with `once`";return e.onceError=r+" shouldn't be called more than once",e.called=!1,e}});var OO=_((hLt,moe)=>{var Ant=MO(),fnt=function(){},pnt=function(t){return t.setHeader&&typeof t.abort=="function"},hnt=function(t){return t.stdio&&Array.isArray(t.stdio)&&t.stdio.length===3},doe=function(t,e,r){if(typeof e=="function")return doe(t,null,e);e||(e={}),r=Ant(r||fnt);var o=t._writableState,a=t._readableState,n=e.readable||e.readable!==!1&&t.readable,u=e.writable||e.writable!==!1&&t.writable,A=function(){t.writable||p()},p=function(){u=!1,n||r.call(t)},h=function(){n=!1,u||r.call(t)},E=function(C){r.call(t,C?new Error("exited with error code: "+C):null)},I=function(C){r.call(t,C)},v=function(){if(n&&!(a&&a.ended))return r.call(t,new Error("premature close"));if(u&&!(o&&o.ended))return r.call(t,new Error("premature close"))},b=function(){t.req.on("finish",p)};return pnt(t)?(t.on("complete",p),t.on("abort",v),t.req?b():t.on("request",b)):u&&!o&&(t.on("end",A),t.on("close",A)),hnt(t)&&t.on("exit",E),t.on("end",h),t.on("finish",p),e.error!==!1&&t.on("error",I),t.on("close",v),function(){t.removeListener("complete",p),t.removeListener("abort",v),t.removeListener("request",b),t.req&&t.req.removeListener("finish",p),t.removeListener("end",A),t.removeListener("close",A),t.removeListener("finish",p),t.removeListener("exit",E),t.removeListener("end",h),t.removeListener("error",I),t.removeListener("close",v)}};moe.exports=doe});var Coe=_((gLt,Eoe)=>{var gnt=MO(),dnt=OO(),UO=Be("fs"),f1=function(){},mnt=/^v?\.0/.test(process.version),ZS=function(t){return typeof t=="function"},ynt=function(t){return!mnt||!UO?!1:(t instanceof(UO.ReadStream||f1)||t instanceof(UO.WriteStream||f1))&&ZS(t.close)},Ent=function(t){return t.setHeader&&ZS(t.abort)},Cnt=function(t,e,r,o){o=gnt(o);var a=!1;t.on("close",function(){a=!0}),dnt(t,{readable:e,writable:r},function(u){if(u)return o(u);a=!0,o()});var n=!1;return function(u){if(!a&&!n){if(n=!0,ynt(t))return t.close(f1);if(Ent(t))return t.abort();if(ZS(t.destroy))return t.destroy();o(u||new Error("stream was destroyed"))}}},yoe=function(t){t()},wnt=function(t,e){return t.pipe(e)},Int=function(){var t=Array.prototype.slice.call(arguments),e=ZS(t[t.length-1]||f1)&&t.pop()||f1;if(Array.isArray(t[0])&&(t=t[0]),t.length<2)throw new Error("pump requires two streams per minimum");var r,o=t.map(function(a,n){var u=n0;return Cnt(a,u,A,function(p){r||(r=p),p&&o.forEach(yoe),!u&&(o.forEach(yoe),e(r))})});return t.reduce(wnt)};Eoe.exports=Int});var Ioe=_((dLt,woe)=>{"use strict";var{PassThrough:Bnt}=Be("stream");woe.exports=t=>{t={...t};let{array:e}=t,{encoding:r}=t,o=r==="buffer",a=!1;e?a=!(r||o):r=r||"utf8",o&&(r=null);let n=new Bnt({objectMode:a});r&&n.setEncoding(r);let u=0,A=[];return n.on("data",p=>{A.push(p),a?u=A.length:u+=p.length}),n.getBufferedValue=()=>e?A:o?Buffer.concat(A,u):A.join(""),n.getBufferedLength=()=>u,n}});var Boe=_((mLt,BE)=>{"use strict";var vnt=Coe(),Dnt=Ioe(),$S=class extends Error{constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}};async function ex(t,e){if(!t)return Promise.reject(new Error("Expected a stream"));e={maxBuffer:1/0,...e};let{maxBuffer:r}=e,o;return await new Promise((a,n)=>{let u=A=>{A&&(A.bufferedData=o.getBufferedValue()),n(A)};o=vnt(t,Dnt(e),A=>{if(A){u(A);return}a()}),o.on("data",()=>{o.getBufferedLength()>r&&u(new $S)})}),o.getBufferedValue()}BE.exports=ex;BE.exports.default=ex;BE.exports.buffer=(t,e)=>ex(t,{...e,encoding:"buffer"});BE.exports.array=(t,e)=>ex(t,{...e,array:!0});BE.exports.MaxBufferError=$S});var Doe=_((ELt,voe)=>{"use strict";var Pnt=new Set([200,203,204,206,300,301,404,405,410,414,501]),Snt=new Set([200,203,204,300,301,302,303,307,308,404,405,410,414,501]),xnt=new Set([500,502,503,504]),bnt={date:!0,connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},knt={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function Dd(t){let e=parseInt(t,10);return isFinite(e)?e:0}function Qnt(t){return t?xnt.has(t.status):!0}function _O(t){let e={};if(!t)return e;let r=t.trim().split(/\s*,\s*/);for(let o of r){let[a,n]=o.split(/\s*=\s*/,2);e[a]=n===void 0?!0:n.replace(/^"|"$/g,"")}return e}function Fnt(t){let e=[];for(let r in t){let o=t[r];e.push(o===!0?r:r+"="+o)}if(!!e.length)return e.join(", ")}voe.exports=class{constructor(e,r,{shared:o,cacheHeuristic:a,immutableMinTimeToLive:n,ignoreCargoCult:u,_fromObject:A}={}){if(A){this._fromObject(A);return}if(!r||!r.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=o!==!1,this._cacheHeuristic=a!==void 0?a:.1,this._immutableMinTtl=n!==void 0?n:24*3600*1e3,this._status="status"in r?r.status:200,this._resHeaders=r.headers,this._rescc=_O(r.headers["cache-control"]),this._method="method"in e?e.method:"GET",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=r.headers.vary?e.headers:null,this._reqcc=_O(e.headers["cache-control"]),u&&"pre-check"in this._rescc&&"post-check"in this._rescc&&(delete this._rescc["pre-check"],delete this._rescc["post-check"],delete this._rescc["no-cache"],delete this._rescc["no-store"],delete this._rescc["must-revalidate"],this._resHeaders=Object.assign({},this._resHeaders,{"cache-control":Fnt(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),r.headers["cache-control"]==null&&/no-cache/.test(r.headers.pragma)&&(this._rescc["no-cache"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||this._method==="HEAD"||this._method==="POST"&&this._hasExplicitExpiration())&&Snt.has(this._status)&&!this._rescc["no-store"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc["max-age"]||this._isShared&&this._rescc["s-maxage"]||this._rescc.public||Pnt.has(this._status)))}_hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]||this._rescc["max-age"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error("Request headers missing")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let r=_O(e.headers["cache-control"]);return r["no-cache"]||/no-cache/.test(e.headers.pragma)||r["max-age"]&&this.age()>r["max-age"]||r["min-fresh"]&&this.timeToLive()<1e3*r["min-fresh"]||this.stale()&&!(r["max-stale"]&&!this._rescc["must-revalidate"]&&(r["max-stale"]===!0||r["max-stale"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,r){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||r&&e.method==="HEAD")&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||this._rescc.public||this._rescc["s-maxage"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary==="*")return!1;let r=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);for(let o of r)if(e.headers[o]!==this._reqHeaders[o])return!1;return!0}_copyWithoutHopByHopHeaders(e){let r={};for(let o in e)bnt[o]||(r[o]=e[o]);if(e.connection){let o=e.connection.trim().split(/\s*,\s*/);for(let a of o)delete r[a]}if(r.warning){let o=r.warning.split(/,/).filter(a=>!/^\s*1[0-9][0-9]/.test(a));o.length?r.warning=o.join(",").trim():delete r.warning}return r}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),r=this.age();return r>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:"")+'113 - "rfc7234 5.5.4"'),e.age=`${Math.round(r)}`,e.date=new Date(this.now()).toUTCString(),e}date(){let e=Date.parse(this._resHeaders.date);return isFinite(e)?e:this._responseTime}age(){let e=this._ageValue(),r=(this.now()-this._responseTime)/1e3;return e+r}_ageValue(){return Dd(this._resHeaders.age)}maxAge(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&this._resHeaders["set-cookie"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary==="*")return 0;if(this._isShared){if(this._rescc["proxy-revalidate"])return 0;if(this._rescc["s-maxage"])return Dd(this._rescc["s-maxage"])}if(this._rescc["max-age"])return Dd(this._rescc["max-age"]);let e=this._rescc.immutable?this._immutableMinTtl:0,r=this.date();if(this._resHeaders.expires){let o=Date.parse(this._resHeaders.expires);return Number.isNaN(o)||oo)return Math.max(e,(r-o)/1e3*this._cacheHeuristic)}return e}timeToLive(){let e=this.maxAge()-this.age(),r=e+Dd(this._rescc["stale-if-error"]),o=e+Dd(this._rescc["stale-while-revalidate"]);return Math.max(0,e,r,o)*1e3}stale(){return this.maxAge()<=this.age()}_useStaleIfError(){return this.maxAge()+Dd(this._rescc["stale-if-error"])>this.age()}useStaleWhileRevalidate(){return this.maxAge()+Dd(this._rescc["stale-while-revalidate"])>this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e||e.v!==1)throw Error("Invalid serialization");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);let r=this._copyWithoutHopByHopHeaders(e.headers);if(delete r["if-range"],!this._requestMatches(e,!0)||!this.storable())return delete r["if-none-match"],delete r["if-modified-since"],r;if(this._resHeaders.etag&&(r["if-none-match"]=r["if-none-match"]?`${r["if-none-match"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),r["accept-ranges"]||r["if-match"]||r["if-unmodified-since"]||this._method&&this._method!="GET"){if(delete r["if-modified-since"],r["if-none-match"]){let a=r["if-none-match"].split(/,/).filter(n=>!/^\s*W\//.test(n));a.length?r["if-none-match"]=a.join(",").trim():delete r["if-none-match"]}}else this._resHeaders["last-modified"]&&!r["if-modified-since"]&&(r["if-modified-since"]=this._resHeaders["last-modified"]);return r}revalidatedPolicy(e,r){if(this._assertRequestHasHeaders(e),this._useStaleIfError()&&Qnt(r))return{modified:!1,matches:!1,policy:this};if(!r||!r.headers)throw Error("Response headers missing");let o=!1;if(r.status!==void 0&&r.status!=304?o=!1:r.headers.etag&&!/^\s*W\//.test(r.headers.etag)?o=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag:this._resHeaders.etag&&r.headers.etag?o=this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?o=this._resHeaders["last-modified"]===r.headers["last-modified"]:!this._resHeaders.etag&&!this._resHeaders["last-modified"]&&!r.headers.etag&&!r.headers["last-modified"]&&(o=!0),!o)return{policy:new this.constructor(e,r),modified:r.status!=304,matches:!1};let a={};for(let u in this._resHeaders)a[u]=u in r.headers&&!knt[u]?r.headers[u]:this._resHeaders[u];let n=Object.assign({},r,{status:this._status,method:this._method,headers:a});return{policy:new this.constructor(e,n,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl}),modified:!1,matches:!0}}}});var tx=_((CLt,Poe)=>{"use strict";Poe.exports=t=>{let e={};for(let[r,o]of Object.entries(t))e[r.toLowerCase()]=o;return e}});var xoe=_((wLt,Soe)=>{"use strict";var Tnt=Be("stream").Readable,Rnt=tx(),HO=class extends Tnt{constructor(e,r,o,a){if(typeof e!="number")throw new TypeError("Argument `statusCode` should be a number");if(typeof r!="object")throw new TypeError("Argument `headers` should be an object");if(!(o instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if(typeof a!="string")throw new TypeError("Argument `url` should be a string");super(),this.statusCode=e,this.headers=Rnt(r),this.body=o,this.url=a}_read(){this.push(this.body),this.push(null)}};Soe.exports=HO});var koe=_((ILt,boe)=>{"use strict";var Nnt=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];boe.exports=(t,e)=>{let r=new Set(Object.keys(t).concat(Nnt));for(let o of r)o in e||(e[o]=typeof t[o]=="function"?t[o].bind(t):t[o])}});var Foe=_((BLt,Qoe)=>{"use strict";var Lnt=Be("stream").PassThrough,Mnt=koe(),Ont=t=>{if(!(t&&t.pipe))throw new TypeError("Parameter `response` must be a response stream.");let e=new Lnt;return Mnt(t,e),t.pipe(e)};Qoe.exports=Ont});var Toe=_(jO=>{jO.stringify=function t(e){if(typeof e>"u")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(":base64:"+e.toString("base64"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e=="object"){var r="",o=Array.isArray(e);r=o?"[":"{";var a=!0;for(var n in e){var u=typeof e[n]=="function"||!o&&typeof e[n]>"u";Object.hasOwnProperty.call(e,n)&&!u&&(a||(r+=","),a=!1,o?e[n]==null?r+="null":r+=t(e[n]):e[n]!==void 0&&(r+=t(n)+":"+t(e[n])))}return r+=o?"]":"}",r}else return typeof e=="string"?JSON.stringify(/^:/.test(e)?":"+e:e):typeof e>"u"?"null":JSON.stringify(e)};jO.parse=function(t){return JSON.parse(t,function(e,r){return typeof r=="string"?/^:base64:/.test(r)?Buffer.from(r.substring(8),"base64"):/^:/.test(r)?r.substring(1):r:r})}});var Loe=_((DLt,Noe)=>{"use strict";var Unt=Be("events"),Roe=Toe(),_nt=t=>{let e={redis:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql"};if(t.adapter||t.uri){let r=t.adapter||/^[^:]*/.exec(t.uri)[0];return new(Be(e[r]))(t)}return new Map},qO=class extends Unt{constructor(e,r){if(super(),this.opts=Object.assign({namespace:"keyv",serialize:Roe.stringify,deserialize:Roe.parse},typeof e=="string"?{uri:e}:e,r),!this.opts.store){let o=Object.assign({},this.opts);this.opts.store=_nt(o)}typeof this.opts.store.on=="function"&&this.opts.store.on("error",o=>this.emit("error",o)),this.opts.store.namespace=this.opts.namespace}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}get(e,r){e=this._getKeyPrefix(e);let{store:o}=this.opts;return Promise.resolve().then(()=>o.get(e)).then(a=>typeof a=="string"?this.opts.deserialize(a):a).then(a=>{if(a!==void 0){if(typeof a.expires=="number"&&Date.now()>a.expires){this.delete(e);return}return r&&r.raw?a:a.value}})}set(e,r,o){e=this._getKeyPrefix(e),typeof o>"u"&&(o=this.opts.ttl),o===0&&(o=void 0);let{store:a}=this.opts;return Promise.resolve().then(()=>{let n=typeof o=="number"?Date.now()+o:null;return r={value:r,expires:n},this.opts.serialize(r)}).then(n=>a.set(e,n,o)).then(()=>!0)}delete(e){e=this._getKeyPrefix(e);let{store:r}=this.opts;return Promise.resolve().then(()=>r.delete(e))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}};Noe.exports=qO});var Uoe=_((SLt,Ooe)=>{"use strict";var Hnt=Be("events"),rx=Be("url"),jnt=uoe(),qnt=Boe(),GO=Doe(),Moe=xoe(),Gnt=tx(),Ynt=Foe(),Wnt=Loe(),jc=class{constructor(e,r){if(typeof e!="function")throw new TypeError("Parameter `request` must be a function");return this.cache=new Wnt({uri:typeof r=="string"&&r,store:typeof r!="string"&&r,namespace:"cacheable-request"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(r,o)=>{let a;if(typeof r=="string")a=YO(rx.parse(r)),r={};else if(r instanceof rx.URL)a=YO(rx.parse(r.toString())),r={};else{let[I,...v]=(r.path||"").split("?"),b=v.length>0?`?${v.join("?")}`:"";a=YO({...r,pathname:I,search:b})}r={headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1,...r,...Vnt(a)},r.headers=Gnt(r.headers);let n=new Hnt,u=jnt(rx.format(a),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),A=`${r.method}:${u}`,p=!1,h=!1,E=I=>{h=!0;let v=!1,b,C=new Promise(L=>{b=()=>{v||(v=!0,L())}}),T=L=>{if(p&&!I.forceRefresh){L.status=L.statusCode;let J=GO.fromObject(p.cachePolicy).revalidatedPolicy(I,L);if(!J.modified){let te=J.policy.responseHeaders();L=new Moe(p.statusCode,te,p.body,p.url),L.cachePolicy=J.policy,L.fromCache=!0}}L.fromCache||(L.cachePolicy=new GO(I,L,I),L.fromCache=!1);let U;I.cache&&L.cachePolicy.storable()?(U=Ynt(L),(async()=>{try{let J=qnt.buffer(L);if(await Promise.race([C,new Promise(Ae=>L.once("end",Ae))]),v)return;let te=await J,le={cachePolicy:L.cachePolicy.toObject(),url:L.url,statusCode:L.fromCache?p.statusCode:L.statusCode,body:te},pe=I.strictTtl?L.cachePolicy.timeToLive():void 0;I.maxTtl&&(pe=pe?Math.min(pe,I.maxTtl):I.maxTtl),await this.cache.set(A,le,pe)}catch(J){n.emit("error",new jc.CacheError(J))}})()):I.cache&&p&&(async()=>{try{await this.cache.delete(A)}catch(J){n.emit("error",new jc.CacheError(J))}})(),n.emit("response",U||L),typeof o=="function"&&o(U||L)};try{let L=e(I,T);L.once("error",b),L.once("abort",b),n.emit("request",L)}catch(L){n.emit("error",new jc.RequestError(L))}};return(async()=>{let I=async b=>{await Promise.resolve();let C=b.cache?await this.cache.get(A):void 0;if(typeof C>"u")return E(b);let T=GO.fromObject(C.cachePolicy);if(T.satisfiesWithoutRevalidation(b)&&!b.forceRefresh){let L=T.responseHeaders(),U=new Moe(C.statusCode,L,C.body,C.url);U.cachePolicy=T,U.fromCache=!0,n.emit("response",U),typeof o=="function"&&o(U)}else p=C,b.headers=T.revalidationHeaders(b),E(b)},v=b=>n.emit("error",new jc.CacheError(b));this.cache.once("error",v),n.on("response",()=>this.cache.removeListener("error",v));try{await I(r)}catch(b){r.automaticFailover&&!h&&E(r),n.emit("error",new jc.CacheError(b))}})(),n}}};function Vnt(t){let e={...t};return e.path=`${t.pathname||"/"}${t.search||""}`,delete e.pathname,delete e.search,e}function YO(t){return{protocol:t.protocol,auth:t.auth,hostname:t.hostname||t.host||"localhost",port:t.port,pathname:t.pathname,search:t.search}}jc.RequestError=class extends Error{constructor(t){super(t.message),this.name="RequestError",Object.assign(this,t)}};jc.CacheError=class extends Error{constructor(t){super(t.message),this.name="CacheError",Object.assign(this,t)}};Ooe.exports=jc});var Hoe=_((kLt,_oe)=>{"use strict";var Knt=["aborted","complete","headers","httpVersion","httpVersionMinor","httpVersionMajor","method","rawHeaders","rawTrailers","setTimeout","socket","statusCode","statusMessage","trailers","url"];_oe.exports=(t,e)=>{if(e._readableState.autoDestroy)throw new Error("The second stream must have the `autoDestroy` option set to `false`");let r=new Set(Object.keys(t).concat(Knt)),o={};for(let a of r)a in e||(o[a]={get(){let n=t[a];return typeof n=="function"?n.bind(t):n},set(n){t[a]=n},enumerable:!0,configurable:!1});return Object.defineProperties(e,o),t.once("aborted",()=>{e.destroy(),e.emit("aborted")}),t.once("close",()=>{t.complete&&e.readable?e.once("end",()=>{e.emit("close")}):e.emit("close")}),e}});var qoe=_((QLt,joe)=>{"use strict";var{Transform:Jnt,PassThrough:znt}=Be("stream"),WO=Be("zlib"),Xnt=Hoe();joe.exports=t=>{let e=(t.headers["content-encoding"]||"").toLowerCase();if(!["gzip","deflate","br"].includes(e))return t;let r=e==="br";if(r&&typeof WO.createBrotliDecompress!="function")return t.destroy(new Error("Brotli is not supported on Node.js < 12")),t;let o=!0,a=new Jnt({transform(A,p,h){o=!1,h(null,A)},flush(A){A()}}),n=new znt({autoDestroy:!1,destroy(A,p){t.destroy(),p(A)}}),u=r?WO.createBrotliDecompress():WO.createUnzip();return u.once("error",A=>{if(o&&!t.readable){n.end();return}n.destroy(A)}),Xnt(t,n),t.pipe(a).pipe(u).pipe(n),n}});var KO=_((FLt,Goe)=>{"use strict";var VO=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,r){if(this.cache.set(e,r),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction=="function")for(let[o,a]of this.oldCache.entries())this.onEviction(o,a);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let r=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,r),r}}set(e,r){return this.cache.has(e)?this.cache.set(e,r):this._set(e,r),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let r=this.cache.delete(e);return r&&this._size--,this.oldCache.delete(e)||r}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[r]=e;this.cache.has(r)||(yield e)}}get size(){let e=0;for(let r of this.oldCache.keys())this.cache.has(r)||e++;return Math.min(this._size+e,this.maxSize)}};Goe.exports=VO});var zO=_((TLt,Koe)=>{"use strict";var Znt=Be("events"),$nt=Be("tls"),eit=Be("http2"),tit=KO(),ea=Symbol("currentStreamsCount"),Yoe=Symbol("request"),Wl=Symbol("cachedOriginSet"),vE=Symbol("gracefullyClosing"),rit=["maxDeflateDynamicTableSize","maxSessionMemory","maxHeaderListPairs","maxOutstandingPings","maxReservedRemoteStreams","maxSendHeaderBlockLength","paddingStrategy","localAddress","path","rejectUnauthorized","minDHSize","ca","cert","clientCertEngine","ciphers","key","pfx","servername","minVersion","maxVersion","secureProtocol","crl","honorCipherOrder","ecdhCurve","dhparam","secureOptions","sessionIdContext"],nit=(t,e,r)=>{let o=0,a=t.length;for(;o>>1;r(t[n],e)?o=n+1:a=n}return o},iit=(t,e)=>t.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,JO=(t,e)=>{for(let r of t)r[Wl].lengthe[Wl].includes(o))&&r[ea]+e[ea]<=e.remoteSettings.maxConcurrentStreams&&Voe(r)},sit=(t,e)=>{for(let r of t)e[Wl].lengthr[Wl].includes(o))&&e[ea]+r[ea]<=r.remoteSettings.maxConcurrentStreams&&Voe(e)},Woe=({agent:t,isFree:e})=>{let r={};for(let o in t.sessions){let n=t.sessions[o].filter(u=>{let A=u[tA.kCurrentStreamsCount]{t[vE]=!0,t[ea]===0&&t.close()},tA=class extends Znt{constructor({timeout:e=6e4,maxSessions:r=1/0,maxFreeSessions:o=10,maxCachedTlsSessions:a=100}={}){super(),this.sessions={},this.queue={},this.timeout=e,this.maxSessions=r,this.maxFreeSessions=o,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new tit({maxSize:a})}static normalizeOrigin(e,r){return typeof e=="string"&&(e=new URL(e)),r&&e.hostname!==r&&(e.hostname=r),e.origin}normalizeOptions(e){let r="";if(e)for(let o of rit)e[o]&&(r+=`:${e[o]}`);return r}_tryToCreateNewSession(e,r){if(!(e in this.queue)||!(r in this.queue[e]))return;let o=this.queue[e][r];this._sessionsCount{Array.isArray(o)?(o=[...o],a()):o=[{resolve:a,reject:n}];let u=this.normalizeOptions(r),A=tA.normalizeOrigin(e,r&&r.servername);if(A===void 0){for(let{reject:E}of o)E(new TypeError("The `origin` argument needs to be a string or an URL object"));return}if(u in this.sessions){let E=this.sessions[u],I=-1,v=-1,b;for(let C of E){let T=C.remoteSettings.maxConcurrentStreams;if(T=T||C[vE]||C.destroyed)continue;b||(I=T),L>v&&(b=C,v=L)}}if(b){if(o.length!==1){for(let{reject:C}of o){let T=new Error(`Expected the length of listeners to be 1, got ${o.length}. +Please report this to https://github.com/szmarczak/http2-wrapper/`);C(T)}return}o[0].resolve(b);return}}if(u in this.queue){if(A in this.queue[u]){this.queue[u][A].listeners.push(...o),this._tryToCreateNewSession(u,A);return}}else this.queue[u]={};let p=()=>{u in this.queue&&this.queue[u][A]===h&&(delete this.queue[u][A],Object.keys(this.queue[u]).length===0&&delete this.queue[u])},h=()=>{let E=`${A}:${u}`,I=!1;try{let v=eit.connect(e,{createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(E),...r});v[ea]=0,v[vE]=!1;let b=()=>v[ea]{this.tlsSessionCache.set(E,L)}),v.once("error",L=>{for(let{reject:U}of o)U(L);this.tlsSessionCache.delete(E)}),v.setTimeout(this.timeout,()=>{v.destroy()}),v.once("close",()=>{if(I){C&&this._freeSessionsCount--,this._sessionsCount--;let L=this.sessions[u];L.splice(L.indexOf(v),1),L.length===0&&delete this.sessions[u]}else{let L=new Error("Session closed without receiving a SETTINGS frame");L.code="HTTP2WRAPPER_NOSETTINGS";for(let{reject:U}of o)U(L);p()}this._tryToCreateNewSession(u,A)});let T=()=>{if(!(!(u in this.queue)||!b())){for(let L of v[Wl])if(L in this.queue[u]){let{listeners:U}=this.queue[u][L];for(;U.length!==0&&b();)U.shift().resolve(v);let J=this.queue[u];if(J[L].listeners.length===0&&(delete J[L],Object.keys(J).length===0)){delete this.queue[u];break}if(!b())break}}};v.on("origin",()=>{v[Wl]=v.originSet,b()&&(T(),JO(this.sessions[u],v))}),v.once("remoteSettings",()=>{if(v.ref(),v.unref(),this._sessionsCount++,h.destroyed){let L=new Error("Agent has been destroyed");for(let U of o)U.reject(L);v.destroy();return}v[Wl]=v.originSet;{let L=this.sessions;if(u in L){let U=L[u];U.splice(nit(U,v,iit),0,v)}else L[u]=[v]}this._freeSessionsCount+=1,I=!0,this.emit("session",v),T(),p(),v[ea]===0&&this._freeSessionsCount>this.maxFreeSessions&&v.close(),o.length!==0&&(this.getSession(A,r,o),o.length=0),v.on("remoteSettings",()=>{T(),JO(this.sessions[u],v)})}),v[Yoe]=v.request,v.request=(L,U)=>{if(v[vE])throw new Error("The session is gracefully closing. No new streams are allowed.");let J=v[Yoe](L,U);return v.ref(),++v[ea],v[ea]===v.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,J.once("close",()=>{if(C=b(),--v[ea],!v.destroyed&&!v.closed&&(sit(this.sessions[u],v),b()&&!v.closed)){C||(this._freeSessionsCount++,C=!0);let te=v[ea]===0;te&&v.unref(),te&&(this._freeSessionsCount>this.maxFreeSessions||v[vE])?v.close():(JO(this.sessions[u],v),T())}}),J}}catch(v){for(let b of o)b.reject(v);p()}};h.listeners=o,h.completed=!1,h.destroyed=!1,this.queue[u][A]=h,this._tryToCreateNewSession(u,A)})}request(e,r,o,a){return new Promise((n,u)=>{this.getSession(e,r,[{reject:u,resolve:A=>{try{n(A.request(o,a))}catch(p){u(p)}}}])})}createConnection(e,r){return tA.connect(e,r)}static connect(e,r){r.ALPNProtocols=["h2"];let o=e.port||443,a=e.hostname||e.host;return typeof r.servername>"u"&&(r.servername=a),$nt.connect(o,a,r)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let r of e)r[ea]===0&&r.close()}destroy(e){for(let r of Object.values(this.sessions))for(let o of r)o.destroy(e);for(let r of Object.values(this.queue))for(let o of Object.values(r))o.destroyed=!0;this.queue={}}get freeSessions(){return Woe({agent:this,isFree:!0})}get busySessions(){return Woe({agent:this,isFree:!1})}};tA.kCurrentStreamsCount=ea;tA.kGracefullyClosing=vE;Koe.exports={Agent:tA,globalAgent:new tA}});var ZO=_((RLt,Joe)=>{"use strict";var{Readable:oit}=Be("stream"),XO=class extends oit{constructor(e,r){super({highWaterMark:r,autoDestroy:!1}),this.statusCode=null,this.statusMessage="",this.httpVersion="2.0",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,r){return this.req.setTimeout(e,r),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),this.resume())}_read(){this.req&&this.req._request.resume()}};Joe.exports=XO});var $O=_((NLt,zoe)=>{"use strict";zoe.exports=t=>{let e={protocol:t.protocol,hostname:typeof t.hostname=="string"&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return typeof t.port=="string"&&t.port.length!==0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var Zoe=_((LLt,Xoe)=>{"use strict";Xoe.exports=(t,e,r)=>{for(let o of r)t.on(o,(...a)=>e.emit(o,...a))}});var eae=_((MLt,$oe)=>{"use strict";$oe.exports=t=>{switch(t){case":method":case":scheme":case":authority":case":path":return!0;default:return!1}}});var rae=_((ULt,tae)=>{"use strict";var DE=(t,e,r)=>{tae.exports[e]=class extends t{constructor(...a){super(typeof r=="string"?r:r(a)),this.name=`${super.name} [${e}]`,this.code=e}}};DE(TypeError,"ERR_INVALID_ARG_TYPE",t=>{let e=t[0].includes(".")?"property":"argument",r=t[1],o=Array.isArray(r);return o&&(r=`${r.slice(0,-1).join(", ")} or ${r.slice(-1)}`),`The "${t[0]}" ${e} must be ${o?"one of":"of"} type ${r}. Received ${typeof t[2]}`});DE(TypeError,"ERR_INVALID_PROTOCOL",t=>`Protocol "${t[0]}" not supported. Expected "${t[1]}"`);DE(Error,"ERR_HTTP_HEADERS_SENT",t=>`Cannot ${t[0]} headers after they are sent to the client`);DE(TypeError,"ERR_INVALID_HTTP_TOKEN",t=>`${t[0]} must be a valid HTTP token [${t[1]}]`);DE(TypeError,"ERR_HTTP_INVALID_HEADER_VALUE",t=>`Invalid value "${t[0]} for header "${t[1]}"`);DE(TypeError,"ERR_INVALID_CHAR",t=>`Invalid character in ${t[0]} [${t[1]}]`)});var i4=_((_Lt,cae)=>{"use strict";var ait=Be("http2"),{Writable:lit}=Be("stream"),{Agent:nae,globalAgent:cit}=zO(),uit=ZO(),Ait=$O(),fit=Zoe(),pit=eae(),{ERR_INVALID_ARG_TYPE:e4,ERR_INVALID_PROTOCOL:hit,ERR_HTTP_HEADERS_SENT:iae,ERR_INVALID_HTTP_TOKEN:git,ERR_HTTP_INVALID_HEADER_VALUE:dit,ERR_INVALID_CHAR:mit}=rae(),{HTTP2_HEADER_STATUS:sae,HTTP2_HEADER_METHOD:oae,HTTP2_HEADER_PATH:aae,HTTP2_METHOD_CONNECT:yit}=ait.constants,Qo=Symbol("headers"),t4=Symbol("origin"),r4=Symbol("session"),lae=Symbol("options"),nx=Symbol("flushedHeaders"),p1=Symbol("jobs"),Eit=/^[\^`\-\w!#$%&*+.|~]+$/,Cit=/[^\t\u0020-\u007E\u0080-\u00FF]/,n4=class extends lit{constructor(e,r,o){super({autoDestroy:!1});let a=typeof e=="string"||e instanceof URL;if(a&&(e=Ait(e instanceof URL?e:new URL(e))),typeof r=="function"||r===void 0?(o=r,r=a?e:{...e}):r={...e,...r},r.h2session)this[r4]=r.h2session;else if(r.agent===!1)this.agent=new nae({maxFreeSessions:0});else if(typeof r.agent>"u"||r.agent===null)typeof r.createConnection=="function"?(this.agent=new nae({maxFreeSessions:0}),this.agent.createConnection=r.createConnection):this.agent=cit;else if(typeof r.agent.request=="function")this.agent=r.agent;else throw new e4("options.agent",["Agent-like Object","undefined","false"],r.agent);if(r.protocol&&r.protocol!=="https:")throw new hit(r.protocol,"https:");let n=r.port||r.defaultPort||this.agent&&this.agent.defaultPort||443,u=r.hostname||r.host||"localhost";delete r.hostname,delete r.host,delete r.port;let{timeout:A}=r;if(r.timeout=void 0,this[Qo]=Object.create(null),this[p1]=[],this.socket=null,this.connection=null,this.method=r.method||"GET",this.path=r.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,r.headers)for(let[p,h]of Object.entries(r.headers))this.setHeader(p,h);r.auth&&!("authorization"in this[Qo])&&(this[Qo].authorization="Basic "+Buffer.from(r.auth).toString("base64")),r.session=r.tlsSession,r.path=r.socketPath,this[lae]=r,n===443?(this[t4]=`https://${u}`,":authority"in this[Qo]||(this[Qo][":authority"]=u)):(this[t4]=`https://${u}:${n}`,":authority"in this[Qo]||(this[Qo][":authority"]=`${u}:${n}`)),A&&this.setTimeout(A),o&&this.once("response",o),this[nx]=!1}get method(){return this[Qo][oae]}set method(e){e&&(this[Qo][oae]=e.toUpperCase())}get path(){return this[Qo][aae]}set path(e){e&&(this[Qo][aae]=e)}get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"||this.method==="DELETE"}_write(e,r,o){if(this._mustNotHaveABody){o(new Error("The GET, HEAD and DELETE methods must NOT have a body"));return}this.flushHeaders();let a=()=>this._request.write(e,r,o);this._request?a():this[p1].push(a)}_final(e){if(this.destroyed)return;this.flushHeaders();let r=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?r():this[p1].push(r)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit("abort")),this.aborted=!0,this.destroy())}_destroy(e,r){this.res&&this.res._dump(),this._request&&this._request.destroy(),r(e)}async flushHeaders(){if(this[nx]||this.destroyed)return;this[nx]=!0;let e=this.method===yit,r=o=>{if(this._request=o,this.destroyed){o.destroy();return}e||fit(o,this,["timeout","continue","close","error"]);let a=u=>(...A)=>{!this.writable&&!this.destroyed?u(...A):this.once("finish",()=>{u(...A)})};o.once("response",a((u,A,p)=>{let h=new uit(this.socket,o.readableHighWaterMark);this.res=h,h.req=this,h.statusCode=u[sae],h.headers=u,h.rawHeaders=p,h.once("end",()=>{this.aborted?(h.aborted=!0,h.emit("aborted")):(h.complete=!0,h.socket=null,h.connection=null)}),e?(h.upgrade=!0,this.emit("connect",h,o,Buffer.alloc(0))?this.emit("close"):o.destroy()):(o.on("data",E=>{!h._dumped&&!h.push(E)&&o.pause()}),o.once("end",()=>{h.push(null)}),this.emit("response",h)||h._dump())})),o.once("headers",a(u=>this.emit("information",{statusCode:u[sae]}))),o.once("trailers",a((u,A,p)=>{let{res:h}=this;h.trailers=u,h.rawTrailers=p}));let{socket:n}=o.session;this.socket=n,this.connection=n;for(let u of this[p1])u();this.emit("socket",this.socket)};if(this[r4])try{r(this[r4].request(this[Qo]))}catch(o){this.emit("error",o)}else{this.reusedSocket=!0;try{r(await this.agent.request(this[t4],this[lae],this[Qo]))}catch(o){this.emit("error",o)}}}getHeader(e){if(typeof e!="string")throw new e4("name","string",e);return this[Qo][e.toLowerCase()]}get headersSent(){return this[nx]}removeHeader(e){if(typeof e!="string")throw new e4("name","string",e);if(this.headersSent)throw new iae("remove");delete this[Qo][e.toLowerCase()]}setHeader(e,r){if(this.headersSent)throw new iae("set");if(typeof e!="string"||!Eit.test(e)&&!pit(e))throw new git("Header name",e);if(typeof r>"u")throw new dit(r,e);if(Cit.test(r))throw new mit("header content",e);this[Qo][e.toLowerCase()]=r}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,r){let o=()=>this._request.setTimeout(e,r);return this._request?o():this[p1].push(o),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};cae.exports=n4});var Aae=_((HLt,uae)=>{"use strict";var wit=Be("tls");uae.exports=(t={})=>new Promise((e,r)=>{let o=wit.connect(t,()=>{t.resolveSocket?(o.off("error",r),e({alpnProtocol:o.alpnProtocol,socket:o})):(o.destroy(),e({alpnProtocol:o.alpnProtocol}))});o.on("error",r)})});var pae=_((jLt,fae)=>{"use strict";var Iit=Be("net");fae.exports=t=>{let e=t.host,r=t.headers&&t.headers.host;return r&&(r.startsWith("[")?r.indexOf("]")===-1?e=r:e=r.slice(1,-1):e=r.split(":",1)[0]),Iit.isIP(e)?"":e}});var dae=_((qLt,o4)=>{"use strict";var hae=Be("http"),s4=Be("https"),Bit=Aae(),vit=KO(),Dit=i4(),Pit=pae(),Sit=$O(),ix=new vit({maxSize:100}),h1=new Map,gae=(t,e,r)=>{e._httpMessage={shouldKeepAlive:!0};let o=()=>{t.emit("free",e,r)};e.on("free",o);let a=()=>{t.removeSocket(e,r)};e.on("close",a);let n=()=>{t.removeSocket(e,r),e.off("close",a),e.off("free",o),e.off("agentRemove",n)};e.on("agentRemove",n),t.emit("free",e,r)},xit=async t=>{let e=`${t.host}:${t.port}:${t.ALPNProtocols.sort()}`;if(!ix.has(e)){if(h1.has(e))return(await h1.get(e)).alpnProtocol;let{path:r,agent:o}=t;t.path=t.socketPath;let a=Bit(t);h1.set(e,a);try{let{socket:n,alpnProtocol:u}=await a;if(ix.set(e,u),t.path=r,u==="h2")n.destroy();else{let{globalAgent:A}=s4,p=s4.Agent.prototype.createConnection;o?o.createConnection===p?gae(o,n,t):n.destroy():A.createConnection===p?gae(A,n,t):n.destroy()}return h1.delete(e),u}catch(n){throw h1.delete(e),n}}return ix.get(e)};o4.exports=async(t,e,r)=>{if((typeof t=="string"||t instanceof URL)&&(t=Sit(new URL(t))),typeof e=="function"&&(r=e,e=void 0),e={ALPNProtocols:["h2","http/1.1"],...t,...e,resolveSocket:!0},!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error("The `ALPNProtocols` option must be an Array with at least one entry");e.protocol=e.protocol||"https:";let o=e.protocol==="https:";e.host=e.hostname||e.host||"localhost",e.session=e.tlsSession,e.servername=e.servername||Pit(e),e.port=e.port||(o?443:80),e._defaultAgent=o?s4.globalAgent:hae.globalAgent;let a=e.agent;if(a){if(a.addRequest)throw new Error("The `options.agent` object can contain only `http`, `https` or `http2` properties");e.agent=a[o?"https":"http"]}return o&&await xit(e)==="h2"?(a&&(e.agent=a.http2),new Dit(e,r)):hae.request(e,r)};o4.exports.protocolCache=ix});var yae=_((GLt,mae)=>{"use strict";var bit=Be("http2"),kit=zO(),a4=i4(),Qit=ZO(),Fit=dae(),Tit=(t,e,r)=>new a4(t,e,r),Rit=(t,e,r)=>{let o=new a4(t,e,r);return o.end(),o};mae.exports={...bit,ClientRequest:a4,IncomingMessage:Qit,...kit,request:Tit,get:Rit,auto:Fit}});var c4=_(l4=>{"use strict";Object.defineProperty(l4,"__esModule",{value:!0});var Eae=Tf();l4.default=t=>Eae.default.nodeStream(t)&&Eae.default.function_(t.getBoundary)});var Bae=_(u4=>{"use strict";Object.defineProperty(u4,"__esModule",{value:!0});var wae=Be("fs"),Iae=Be("util"),Cae=Tf(),Nit=c4(),Lit=Iae.promisify(wae.stat);u4.default=async(t,e)=>{if(e&&"content-length"in e)return Number(e["content-length"]);if(!t)return 0;if(Cae.default.string(t))return Buffer.byteLength(t);if(Cae.default.buffer(t))return t.length;if(Nit.default(t))return Iae.promisify(t.getLength.bind(t))();if(t instanceof wae.ReadStream){let{size:r}=await Lit(t.path);return r===0?void 0:r}}});var f4=_(A4=>{"use strict";Object.defineProperty(A4,"__esModule",{value:!0});function Mit(t,e,r){let o={};for(let a of r)o[a]=(...n)=>{e.emit(a,...n)},t.on(a,o[a]);return()=>{for(let a of r)t.off(a,o[a])}}A4.default=Mit});var vae=_(p4=>{"use strict";Object.defineProperty(p4,"__esModule",{value:!0});p4.default=()=>{let t=[];return{once(e,r,o){e.once(r,o),t.push({origin:e,event:r,fn:o})},unhandleAll(){for(let e of t){let{origin:r,event:o,fn:a}=e;r.removeListener(o,a)}t.length=0}}}});var Pae=_(g1=>{"use strict";Object.defineProperty(g1,"__esModule",{value:!0});g1.TimeoutError=void 0;var Oit=Be("net"),Uit=vae(),Dae=Symbol("reentry"),_it=()=>{},sx=class extends Error{constructor(e,r){super(`Timeout awaiting '${r}' for ${e}ms`),this.event=r,this.name="TimeoutError",this.code="ETIMEDOUT"}};g1.TimeoutError=sx;g1.default=(t,e,r)=>{if(Dae in t)return _it;t[Dae]=!0;let o=[],{once:a,unhandleAll:n}=Uit.default(),u=(I,v,b)=>{var C;let T=setTimeout(v,I,I,b);(C=T.unref)===null||C===void 0||C.call(T);let L=()=>{clearTimeout(T)};return o.push(L),L},{host:A,hostname:p}=r,h=(I,v)=>{t.destroy(new sx(I,v))},E=()=>{for(let I of o)I();n()};if(t.once("error",I=>{if(E(),t.listenerCount("error")===0)throw I}),t.once("close",E),a(t,"response",I=>{a(I,"end",E)}),typeof e.request<"u"&&u(e.request,h,"request"),typeof e.socket<"u"){let I=()=>{h(e.socket,"socket")};t.setTimeout(e.socket,I),o.push(()=>{t.removeListener("timeout",I)})}return a(t,"socket",I=>{var v;let{socketPath:b}=t;if(I.connecting){let C=Boolean(b??Oit.isIP((v=p??A)!==null&&v!==void 0?v:"")!==0);if(typeof e.lookup<"u"&&!C&&typeof I.address().address>"u"){let T=u(e.lookup,h,"lookup");a(I,"lookup",T)}if(typeof e.connect<"u"){let T=()=>u(e.connect,h,"connect");C?a(I,"connect",T()):a(I,"lookup",L=>{L===null&&a(I,"connect",T())})}typeof e.secureConnect<"u"&&r.protocol==="https:"&&a(I,"connect",()=>{let T=u(e.secureConnect,h,"secureConnect");a(I,"secureConnect",T)})}if(typeof e.send<"u"){let C=()=>u(e.send,h,"send");I.connecting?a(I,"connect",()=>{a(t,"upload-complete",C())}):a(t,"upload-complete",C())}}),typeof e.response<"u"&&a(t,"upload-complete",()=>{let I=u(e.response,h,"response");a(t,"response",I)}),E}});var xae=_(h4=>{"use strict";Object.defineProperty(h4,"__esModule",{value:!0});var Sae=Tf();h4.default=t=>{t=t;let e={protocol:t.protocol,hostname:Sae.default.string(t.hostname)&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return Sae.default.string(t.port)&&t.port.length>0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var bae=_(g4=>{"use strict";Object.defineProperty(g4,"__esModule",{value:!0});var Hit=Be("url"),jit=["protocol","host","hostname","port","pathname","search"];g4.default=(t,e)=>{var r,o;if(e.path){if(e.pathname)throw new TypeError("Parameters `path` and `pathname` are mutually exclusive.");if(e.search)throw new TypeError("Parameters `path` and `search` are mutually exclusive.");if(e.searchParams)throw new TypeError("Parameters `path` and `searchParams` are mutually exclusive.")}if(e.search&&e.searchParams)throw new TypeError("Parameters `search` and `searchParams` are mutually exclusive.");if(!t){if(!e.protocol)throw new TypeError("No URL protocol specified");t=`${e.protocol}//${(o=(r=e.hostname)!==null&&r!==void 0?r:e.host)!==null&&o!==void 0?o:""}`}let a=new Hit.URL(t);if(e.path){let n=e.path.indexOf("?");n===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,n),e.search=e.path.slice(n+1)),delete e.path}for(let n of jit)e[n]&&(a[n]=e[n].toString());return a}});var kae=_(m4=>{"use strict";Object.defineProperty(m4,"__esModule",{value:!0});var d4=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,r){typeof e=="object"?this.weakMap.set(e,r):this.map.set(e,r)}get(e){return typeof e=="object"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e=="object"?this.weakMap.has(e):this.map.has(e)}};m4.default=d4});var E4=_(y4=>{"use strict";Object.defineProperty(y4,"__esModule",{value:!0});var qit=async t=>{let e=[],r=0;for await(let o of t)e.push(o),r+=Buffer.byteLength(o);return Buffer.isBuffer(e[0])?Buffer.concat(e,r):Buffer.from(e.join(""))};y4.default=qit});var Fae=_(Pd=>{"use strict";Object.defineProperty(Pd,"__esModule",{value:!0});Pd.dnsLookupIpVersionToFamily=Pd.isDnsLookupIpVersion=void 0;var Qae={auto:0,ipv4:4,ipv6:6};Pd.isDnsLookupIpVersion=t=>t in Qae;Pd.dnsLookupIpVersionToFamily=t=>{if(Pd.isDnsLookupIpVersion(t))return Qae[t];throw new Error("Invalid DNS lookup IP version")}});var C4=_(ox=>{"use strict";Object.defineProperty(ox,"__esModule",{value:!0});ox.isResponseOk=void 0;ox.isResponseOk=t=>{let{statusCode:e}=t,r=t.request.options.followRedirect?299:399;return e>=200&&e<=r||e===304}});var Rae=_(w4=>{"use strict";Object.defineProperty(w4,"__esModule",{value:!0});var Tae=new Set;w4.default=t=>{Tae.has(t)||(Tae.add(t),process.emitWarning(`Got: ${t}`,{type:"DeprecationWarning"}))}});var Nae=_(I4=>{"use strict";Object.defineProperty(I4,"__esModule",{value:!0});var Ai=Tf(),Git=(t,e)=>{if(Ai.default.null_(t.encoding))throw new TypeError("To get a Buffer, set `options.responseType` to `buffer` instead");Ai.assert.any([Ai.default.string,Ai.default.undefined],t.encoding),Ai.assert.any([Ai.default.boolean,Ai.default.undefined],t.resolveBodyOnly),Ai.assert.any([Ai.default.boolean,Ai.default.undefined],t.methodRewriting),Ai.assert.any([Ai.default.boolean,Ai.default.undefined],t.isStream),Ai.assert.any([Ai.default.string,Ai.default.undefined],t.responseType),t.responseType===void 0&&(t.responseType="text");let{retry:r}=t;if(e?t.retry={...e.retry}:t.retry={calculateDelay:o=>o.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},Ai.default.object(r)?(t.retry={...t.retry,...r},t.retry.methods=[...new Set(t.retry.methods.map(o=>o.toUpperCase()))],t.retry.statusCodes=[...new Set(t.retry.statusCodes)],t.retry.errorCodes=[...new Set(t.retry.errorCodes)]):Ai.default.number(r)&&(t.retry.limit=r),Ai.default.undefined(t.retry.maxRetryAfter)&&(t.retry.maxRetryAfter=Math.min(...[t.timeout.request,t.timeout.connect].filter(Ai.default.number))),Ai.default.object(t.pagination)){e&&(t.pagination={...e.pagination,...t.pagination});let{pagination:o}=t;if(!Ai.default.function_(o.transform))throw new Error("`options.pagination.transform` must be implemented");if(!Ai.default.function_(o.shouldContinue))throw new Error("`options.pagination.shouldContinue` must be implemented");if(!Ai.default.function_(o.filter))throw new TypeError("`options.pagination.filter` must be implemented");if(!Ai.default.function_(o.paginate))throw new Error("`options.pagination.paginate` must be implemented")}return t.responseType==="json"&&t.headers.accept===void 0&&(t.headers.accept="application/json"),t};I4.default=Git});var Lae=_(d1=>{"use strict";Object.defineProperty(d1,"__esModule",{value:!0});d1.retryAfterStatusCodes=void 0;d1.retryAfterStatusCodes=new Set([413,429,503]);var Yit=({attemptCount:t,retryOptions:e,error:r,retryAfter:o})=>{if(t>e.limit)return 0;let a=e.methods.includes(r.options.method),n=e.errorCodes.includes(r.code),u=r.response&&e.statusCodes.includes(r.response.statusCode);if(!a||!n&&!u)return 0;if(r.response){if(o)return e.maxRetryAfter===void 0||o>e.maxRetryAfter?0:o;if(r.response.statusCode===413)return 0}let A=Math.random()*100;return 2**(t-1)*1e3+A};d1.default=Yit});var E1=_(Bn=>{"use strict";Object.defineProperty(Bn,"__esModule",{value:!0});Bn.UnsupportedProtocolError=Bn.ReadError=Bn.TimeoutError=Bn.UploadError=Bn.CacheError=Bn.HTTPError=Bn.MaxRedirectsError=Bn.RequestError=Bn.setNonEnumerableProperties=Bn.knownHookEvents=Bn.withoutBody=Bn.kIsNormalizedAlready=void 0;var Mae=Be("util"),Oae=Be("stream"),Wit=Be("fs"),oh=Be("url"),Uae=Be("http"),B4=Be("http"),Vit=Be("https"),Kit=eoe(),Jit=aoe(),_ae=Uoe(),zit=qoe(),Xit=yae(),Zit=tx(),st=Tf(),$it=Bae(),Hae=c4(),est=f4(),jae=Pae(),tst=xae(),qae=bae(),rst=kae(),nst=E4(),Gae=Fae(),ist=C4(),ah=Rae(),sst=Nae(),ost=Lae(),v4,Zs=Symbol("request"),cx=Symbol("response"),PE=Symbol("responseSize"),SE=Symbol("downloadedSize"),xE=Symbol("bodySize"),bE=Symbol("uploadedSize"),ax=Symbol("serverResponsesPiped"),Yae=Symbol("unproxyEvents"),Wae=Symbol("isFromCache"),D4=Symbol("cancelTimeouts"),Vae=Symbol("startedReading"),kE=Symbol("stopReading"),lx=Symbol("triggerRead"),lh=Symbol("body"),m1=Symbol("jobs"),Kae=Symbol("originalResponse"),Jae=Symbol("retryTimeout");Bn.kIsNormalizedAlready=Symbol("isNormalizedAlready");var ast=st.default.string(process.versions.brotli);Bn.withoutBody=new Set(["GET","HEAD"]);Bn.knownHookEvents=["init","beforeRequest","beforeRedirect","beforeError","beforeRetry","afterResponse"];function lst(t){for(let e in t){let r=t[e];if(!st.default.string(r)&&!st.default.number(r)&&!st.default.boolean(r)&&!st.default.null_(r)&&!st.default.undefined(r))throw new TypeError(`The \`searchParams\` value '${String(r)}' must be a string, number, boolean or null`)}}function cst(t){return st.default.object(t)&&!("statusCode"in t)}var P4=new rst.default,ust=async t=>new Promise((e,r)=>{let o=a=>{r(a)};t.pending||e(),t.once("error",o),t.once("ready",()=>{t.off("error",o),e()})}),Ast=new Set([300,301,302,303,304,307,308]),fst=["context","body","json","form"];Bn.setNonEnumerableProperties=(t,e)=>{let r={};for(let o of t)if(!!o)for(let a of fst)a in o&&(r[a]={writable:!0,configurable:!0,enumerable:!1,value:o[a]});Object.defineProperties(e,r)};var Ki=class extends Error{constructor(e,r,o){var a;if(super(e),Error.captureStackTrace(this,this.constructor),this.name="RequestError",this.code=r.code,o instanceof dx?(Object.defineProperty(this,"request",{enumerable:!1,value:o}),Object.defineProperty(this,"response",{enumerable:!1,value:o[cx]}),Object.defineProperty(this,"options",{enumerable:!1,value:o.options})):Object.defineProperty(this,"options",{enumerable:!1,value:o}),this.timings=(a=this.request)===null||a===void 0?void 0:a.timings,st.default.string(r.stack)&&st.default.string(this.stack)){let n=this.stack.indexOf(this.message)+this.message.length,u=this.stack.slice(n).split(` +`).reverse(),A=r.stack.slice(r.stack.indexOf(r.message)+r.message.length).split(` +`).reverse();for(;A.length!==0&&A[0]===u[0];)u.shift();this.stack=`${this.stack.slice(0,n)}${u.reverse().join(` +`)}${A.reverse().join(` +`)}`}}};Bn.RequestError=Ki;var ux=class extends Ki{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e),this.name="MaxRedirectsError"}};Bn.MaxRedirectsError=ux;var Ax=class extends Ki{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request),this.name="HTTPError"}};Bn.HTTPError=Ax;var fx=class extends Ki{constructor(e,r){super(e.message,e,r),this.name="CacheError"}};Bn.CacheError=fx;var px=class extends Ki{constructor(e,r){super(e.message,e,r),this.name="UploadError"}};Bn.UploadError=px;var hx=class extends Ki{constructor(e,r,o){super(e.message,e,o),this.name="TimeoutError",this.event=e.event,this.timings=r}};Bn.TimeoutError=hx;var y1=class extends Ki{constructor(e,r){super(e.message,e,r),this.name="ReadError"}};Bn.ReadError=y1;var gx=class extends Ki{constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e),this.name="UnsupportedProtocolError"}};Bn.UnsupportedProtocolError=gx;var pst=["socket","connect","continue","information","upgrade","timeout"],dx=class extends Oae.Duplex{constructor(e,r={},o){super({autoDestroy:!1,highWaterMark:0}),this[SE]=0,this[bE]=0,this.requestInitialized=!1,this[ax]=new Set,this.redirects=[],this[kE]=!1,this[lx]=!1,this[m1]=[],this.retryCount=0,this._progressCallbacks=[];let a=()=>this._unlockWrite(),n=()=>this._lockWrite();this.on("pipe",h=>{h.prependListener("data",a),h.on("data",n),h.prependListener("end",a),h.on("end",n)}),this.on("unpipe",h=>{h.off("data",a),h.off("data",n),h.off("end",a),h.off("end",n)}),this.on("pipe",h=>{h instanceof B4.IncomingMessage&&(this.options.headers={...h.headers,...this.options.headers})});let{json:u,body:A,form:p}=r;if((u||A||p)&&this._lockWrite(),Bn.kIsNormalizedAlready in r)this.options=r;else try{this.options=this.constructor.normalizeArguments(e,r,o)}catch(h){st.default.nodeStream(r.body)&&r.body.destroy(),this.destroy(h);return}(async()=>{var h;try{this.options.body instanceof Wit.ReadStream&&await ust(this.options.body);let{url:E}=this.options;if(!E)throw new TypeError("Missing `url` property");if(this.requestUrl=E.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(h=this[Zs])===null||h===void 0||h.destroy();return}for(let I of this[m1])I();this[m1].length=0,this.requestInitialized=!0}catch(E){if(E instanceof Ki){this._beforeError(E);return}this.destroyed||this.destroy(E)}})()}static normalizeArguments(e,r,o){var a,n,u,A,p;let h=r;if(st.default.object(e)&&!st.default.urlInstance(e))r={...o,...e,...r};else{if(e&&r&&r.url!==void 0)throw new TypeError("The `url` option is mutually exclusive with the `input` argument");r={...o,...r},e!==void 0&&(r.url=e),st.default.urlInstance(r.url)&&(r.url=new oh.URL(r.url.toString()))}if(r.cache===!1&&(r.cache=void 0),r.dnsCache===!1&&(r.dnsCache=void 0),st.assert.any([st.default.string,st.default.undefined],r.method),st.assert.any([st.default.object,st.default.undefined],r.headers),st.assert.any([st.default.string,st.default.urlInstance,st.default.undefined],r.prefixUrl),st.assert.any([st.default.object,st.default.undefined],r.cookieJar),st.assert.any([st.default.object,st.default.string,st.default.undefined],r.searchParams),st.assert.any([st.default.object,st.default.string,st.default.undefined],r.cache),st.assert.any([st.default.object,st.default.number,st.default.undefined],r.timeout),st.assert.any([st.default.object,st.default.undefined],r.context),st.assert.any([st.default.object,st.default.undefined],r.hooks),st.assert.any([st.default.boolean,st.default.undefined],r.decompress),st.assert.any([st.default.boolean,st.default.undefined],r.ignoreInvalidCookies),st.assert.any([st.default.boolean,st.default.undefined],r.followRedirect),st.assert.any([st.default.number,st.default.undefined],r.maxRedirects),st.assert.any([st.default.boolean,st.default.undefined],r.throwHttpErrors),st.assert.any([st.default.boolean,st.default.undefined],r.http2),st.assert.any([st.default.boolean,st.default.undefined],r.allowGetBody),st.assert.any([st.default.string,st.default.undefined],r.localAddress),st.assert.any([Gae.isDnsLookupIpVersion,st.default.undefined],r.dnsLookupIpVersion),st.assert.any([st.default.object,st.default.undefined],r.https),st.assert.any([st.default.boolean,st.default.undefined],r.rejectUnauthorized),r.https&&(st.assert.any([st.default.boolean,st.default.undefined],r.https.rejectUnauthorized),st.assert.any([st.default.function_,st.default.undefined],r.https.checkServerIdentity),st.assert.any([st.default.string,st.default.object,st.default.array,st.default.undefined],r.https.certificateAuthority),st.assert.any([st.default.string,st.default.object,st.default.array,st.default.undefined],r.https.key),st.assert.any([st.default.string,st.default.object,st.default.array,st.default.undefined],r.https.certificate),st.assert.any([st.default.string,st.default.undefined],r.https.passphrase),st.assert.any([st.default.string,st.default.buffer,st.default.array,st.default.undefined],r.https.pfx)),st.assert.any([st.default.object,st.default.undefined],r.cacheOptions),st.default.string(r.method)?r.method=r.method.toUpperCase():r.method="GET",r.headers===o?.headers?r.headers={...r.headers}:r.headers=Zit({...o?.headers,...r.headers}),"slashes"in r)throw new TypeError("The legacy `url.Url` has been deprecated. Use `URL` instead.");if("auth"in r)throw new TypeError("Parameter `auth` is deprecated. Use `username` / `password` instead.");if("searchParams"in r&&r.searchParams&&r.searchParams!==o?.searchParams){let b;if(st.default.string(r.searchParams)||r.searchParams instanceof oh.URLSearchParams)b=new oh.URLSearchParams(r.searchParams);else{lst(r.searchParams),b=new oh.URLSearchParams;for(let C in r.searchParams){let T=r.searchParams[C];T===null?b.append(C,""):T!==void 0&&b.append(C,T)}}(a=o?.searchParams)===null||a===void 0||a.forEach((C,T)=>{b.has(T)||b.append(T,C)}),r.searchParams=b}if(r.username=(n=r.username)!==null&&n!==void 0?n:"",r.password=(u=r.password)!==null&&u!==void 0?u:"",st.default.undefined(r.prefixUrl)?r.prefixUrl=(A=o?.prefixUrl)!==null&&A!==void 0?A:"":(r.prefixUrl=r.prefixUrl.toString(),r.prefixUrl!==""&&!r.prefixUrl.endsWith("/")&&(r.prefixUrl+="/")),st.default.string(r.url)){if(r.url.startsWith("/"))throw new Error("`input` must not start with a slash when using `prefixUrl`");r.url=qae.default(r.prefixUrl+r.url,r)}else(st.default.undefined(r.url)&&r.prefixUrl!==""||r.protocol)&&(r.url=qae.default(r.prefixUrl,r));if(r.url){"port"in r&&delete r.port;let{prefixUrl:b}=r;Object.defineProperty(r,"prefixUrl",{set:T=>{let L=r.url;if(!L.href.startsWith(T))throw new Error(`Cannot change \`prefixUrl\` from ${b} to ${T}: ${L.href}`);r.url=new oh.URL(T+L.href.slice(b.length)),b=T},get:()=>b});let{protocol:C}=r.url;if(C==="unix:"&&(C="http:",r.url=new oh.URL(`http://unix${r.url.pathname}${r.url.search}`)),r.searchParams&&(r.url.search=r.searchParams.toString()),C!=="http:"&&C!=="https:")throw new gx(r);r.username===""?r.username=r.url.username:r.url.username=r.username,r.password===""?r.password=r.url.password:r.url.password=r.password}let{cookieJar:E}=r;if(E){let{setCookie:b,getCookieString:C}=E;st.assert.function_(b),st.assert.function_(C),b.length===4&&C.length===0&&(b=Mae.promisify(b.bind(r.cookieJar)),C=Mae.promisify(C.bind(r.cookieJar)),r.cookieJar={setCookie:b,getCookieString:C})}let{cache:I}=r;if(I&&(P4.has(I)||P4.set(I,new _ae((b,C)=>{let T=b[Zs](b,C);return st.default.promise(T)&&(T.once=(L,U)=>{if(L==="error")T.catch(U);else if(L==="abort")(async()=>{try{(await T).once("abort",U)}catch{}})();else throw new Error(`Unknown HTTP2 promise event: ${L}`);return T}),T},I))),r.cacheOptions={...r.cacheOptions},r.dnsCache===!0)v4||(v4=new Jit.default),r.dnsCache=v4;else if(!st.default.undefined(r.dnsCache)&&!r.dnsCache.lookup)throw new TypeError(`Parameter \`dnsCache\` must be a CacheableLookup instance or a boolean, got ${st.default(r.dnsCache)}`);st.default.number(r.timeout)?r.timeout={request:r.timeout}:o&&r.timeout!==o.timeout?r.timeout={...o.timeout,...r.timeout}:r.timeout={...r.timeout},r.context||(r.context={});let v=r.hooks===o?.hooks;r.hooks={...r.hooks};for(let b of Bn.knownHookEvents)if(b in r.hooks)if(st.default.array(r.hooks[b]))r.hooks[b]=[...r.hooks[b]];else throw new TypeError(`Parameter \`${b}\` must be an Array, got ${st.default(r.hooks[b])}`);else r.hooks[b]=[];if(o&&!v)for(let b of Bn.knownHookEvents)o.hooks[b].length>0&&(r.hooks[b]=[...o.hooks[b],...r.hooks[b]]);if("family"in r&&ah.default('"options.family" was never documented, please use "options.dnsLookupIpVersion"'),o?.https&&(r.https={...o.https,...r.https}),"rejectUnauthorized"in r&&ah.default('"options.rejectUnauthorized" is now deprecated, please use "options.https.rejectUnauthorized"'),"checkServerIdentity"in r&&ah.default('"options.checkServerIdentity" was never documented, please use "options.https.checkServerIdentity"'),"ca"in r&&ah.default('"options.ca" was never documented, please use "options.https.certificateAuthority"'),"key"in r&&ah.default('"options.key" was never documented, please use "options.https.key"'),"cert"in r&&ah.default('"options.cert" was never documented, please use "options.https.certificate"'),"passphrase"in r&&ah.default('"options.passphrase" was never documented, please use "options.https.passphrase"'),"pfx"in r&&ah.default('"options.pfx" was never documented, please use "options.https.pfx"'),"followRedirects"in r)throw new TypeError("The `followRedirects` option does not exist. Use `followRedirect` instead.");if(r.agent){for(let b in r.agent)if(b!=="http"&&b!=="https"&&b!=="http2")throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${b}\``)}return r.maxRedirects=(p=r.maxRedirects)!==null&&p!==void 0?p:0,Bn.setNonEnumerableProperties([o,h],r),sst.default(r,o)}_lockWrite(){let e=()=>{throw new TypeError("The payload has been already provided")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){let{options:e}=this,{headers:r}=e,o=!st.default.undefined(e.form),a=!st.default.undefined(e.json),n=!st.default.undefined(e.body),u=o||a||n,A=Bn.withoutBody.has(e.method)&&!(e.method==="GET"&&e.allowGetBody);if(this._cannotHaveBody=A,u){if(A)throw new TypeError(`The \`${e.method}\` method cannot be used with a body`);if([n,o,a].filter(p=>p).length>1)throw new TypeError("The `body`, `json` and `form` options are mutually exclusive");if(n&&!(e.body instanceof Oae.Readable)&&!st.default.string(e.body)&&!st.default.buffer(e.body)&&!Hae.default(e.body))throw new TypeError("The `body` option must be a stream.Readable, string or Buffer");if(o&&!st.default.object(e.form))throw new TypeError("The `form` option must be an Object");{let p=!st.default.string(r["content-type"]);n?(Hae.default(e.body)&&p&&(r["content-type"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[lh]=e.body):o?(p&&(r["content-type"]="application/x-www-form-urlencoded"),this[lh]=new oh.URLSearchParams(e.form).toString()):(p&&(r["content-type"]="application/json"),this[lh]=e.stringifyJson(e.json));let h=await $it.default(this[lh],e.headers);st.default.undefined(r["content-length"])&&st.default.undefined(r["transfer-encoding"])&&!A&&!st.default.undefined(h)&&(r["content-length"]=String(h))}}else A?this._lockWrite():this._unlockWrite();this[xE]=Number(r["content-length"])||void 0}async _onResponseBase(e){let{options:r}=this,{url:o}=r;this[Kae]=e,r.decompress&&(e=zit(e));let a=e.statusCode,n=e;n.statusMessage=n.statusMessage?n.statusMessage:Uae.STATUS_CODES[a],n.url=r.url.toString(),n.requestUrl=this.requestUrl,n.redirectUrls=this.redirects,n.request=this,n.isFromCache=e.fromCache||!1,n.ip=this.ip,n.retryCount=this.retryCount,this[Wae]=n.isFromCache,this[PE]=Number(e.headers["content-length"])||void 0,this[cx]=e,e.once("end",()=>{this[PE]=this[SE],this.emit("downloadProgress",this.downloadProgress)}),e.once("error",A=>{e.destroy(),this._beforeError(new y1(A,this))}),e.once("aborted",()=>{this._beforeError(new y1({name:"Error",message:"The server aborted pending request",code:"ECONNRESET"},this))}),this.emit("downloadProgress",this.downloadProgress);let u=e.headers["set-cookie"];if(st.default.object(r.cookieJar)&&u){let A=u.map(async p=>r.cookieJar.setCookie(p,o.toString()));r.ignoreInvalidCookies&&(A=A.map(async p=>p.catch(()=>{})));try{await Promise.all(A)}catch(p){this._beforeError(p);return}}if(r.followRedirect&&e.headers.location&&Ast.has(a)){if(e.resume(),this[Zs]&&(this[D4](),delete this[Zs],this[Yae]()),(a===303&&r.method!=="GET"&&r.method!=="HEAD"||!r.methodRewriting)&&(r.method="GET","body"in r&&delete r.body,"json"in r&&delete r.json,"form"in r&&delete r.form,this[lh]=void 0,delete r.headers["content-length"]),this.redirects.length>=r.maxRedirects){this._beforeError(new ux(this));return}try{let p=Buffer.from(e.headers.location,"binary").toString(),h=new oh.URL(p,o),E=h.toString();decodeURI(E),h.hostname!==o.hostname||h.port!==o.port?("host"in r.headers&&delete r.headers.host,"cookie"in r.headers&&delete r.headers.cookie,"authorization"in r.headers&&delete r.headers.authorization,(r.username||r.password)&&(r.username="",r.password="")):(h.username=r.username,h.password=r.password),this.redirects.push(E),r.url=h;for(let I of r.hooks.beforeRedirect)await I(r,n);this.emit("redirect",n,r),await this._makeRequest()}catch(p){this._beforeError(p);return}return}if(r.isStream&&r.throwHttpErrors&&!ist.isResponseOk(n)){this._beforeError(new Ax(n));return}e.on("readable",()=>{this[lx]&&this._read()}),this.on("resume",()=>{e.resume()}),this.on("pause",()=>{e.pause()}),e.once("end",()=>{this.push(null)}),this.emit("response",e);for(let A of this[ax])if(!A.headersSent){for(let p in e.headers){let h=r.decompress?p!=="content-encoding":!0,E=e.headers[p];h&&A.setHeader(p,E)}A.statusCode=a}}async _onResponse(e){try{await this._onResponseBase(e)}catch(r){this._beforeError(r)}}_onRequest(e){let{options:r}=this,{timeout:o,url:a}=r;Kit.default(e),this[D4]=jae.default(e,o,a);let n=r.cache?"cacheableResponse":"response";e.once(n,p=>{this._onResponse(p)}),e.once("error",p=>{var h;e.destroy(),(h=e.res)===null||h===void 0||h.removeAllListeners("end"),p=p instanceof jae.TimeoutError?new hx(p,this.timings,this):new Ki(p.message,p,this),this._beforeError(p)}),this[Yae]=est.default(e,this,pst),this[Zs]=e,this.emit("uploadProgress",this.uploadProgress);let u=this[lh],A=this.redirects.length===0?this:e;st.default.nodeStream(u)?(u.pipe(A),u.once("error",p=>{this._beforeError(new px(p,this))})):(this._unlockWrite(),st.default.undefined(u)?(this._cannotHaveBody||this._noPipe)&&(A.end(),this._lockWrite()):(this._writeRequest(u,void 0,()=>{}),A.end(),this._lockWrite())),this.emit("request",e)}async _createCacheableRequest(e,r){return new Promise((o,a)=>{Object.assign(r,tst.default(e)),delete r.url;let n,u=P4.get(r.cache)(r,async A=>{A._readableState.autoDestroy=!1,n&&(await n).emit("cacheableResponse",A),o(A)});r.url=e,u.once("error",a),u.once("request",async A=>{n=A,o(n)})})}async _makeRequest(){var e,r,o,a,n;let{options:u}=this,{headers:A}=u;for(let U in A)if(st.default.undefined(A[U]))delete A[U];else if(st.default.null_(A[U]))throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${U}\` header`);if(u.decompress&&st.default.undefined(A["accept-encoding"])&&(A["accept-encoding"]=ast?"gzip, deflate, br":"gzip, deflate"),u.cookieJar){let U=await u.cookieJar.getCookieString(u.url.toString());st.default.nonEmptyString(U)&&(u.headers.cookie=U)}for(let U of u.hooks.beforeRequest){let J=await U(u);if(!st.default.undefined(J)){u.request=()=>J;break}}u.body&&this[lh]!==u.body&&(this[lh]=u.body);let{agent:p,request:h,timeout:E,url:I}=u;if(u.dnsCache&&!("lookup"in u)&&(u.lookup=u.dnsCache.lookup),I.hostname==="unix"){let U=/(?.+?):(?.+)/.exec(`${I.pathname}${I.search}`);if(U?.groups){let{socketPath:J,path:te}=U.groups;Object.assign(u,{socketPath:J,path:te,host:""})}}let v=I.protocol==="https:",b;u.http2?b=Xit.auto:b=v?Vit.request:Uae.request;let C=(e=u.request)!==null&&e!==void 0?e:b,T=u.cache?this._createCacheableRequest:C;p&&!u.http2&&(u.agent=p[v?"https":"http"]),u[Zs]=C,delete u.request,delete u.timeout;let L=u;if(L.shared=(r=u.cacheOptions)===null||r===void 0?void 0:r.shared,L.cacheHeuristic=(o=u.cacheOptions)===null||o===void 0?void 0:o.cacheHeuristic,L.immutableMinTimeToLive=(a=u.cacheOptions)===null||a===void 0?void 0:a.immutableMinTimeToLive,L.ignoreCargoCult=(n=u.cacheOptions)===null||n===void 0?void 0:n.ignoreCargoCult,u.dnsLookupIpVersion!==void 0)try{L.family=Gae.dnsLookupIpVersionToFamily(u.dnsLookupIpVersion)}catch{throw new Error("Invalid `dnsLookupIpVersion` option value")}u.https&&("rejectUnauthorized"in u.https&&(L.rejectUnauthorized=u.https.rejectUnauthorized),u.https.checkServerIdentity&&(L.checkServerIdentity=u.https.checkServerIdentity),u.https.certificateAuthority&&(L.ca=u.https.certificateAuthority),u.https.certificate&&(L.cert=u.https.certificate),u.https.key&&(L.key=u.https.key),u.https.passphrase&&(L.passphrase=u.https.passphrase),u.https.pfx&&(L.pfx=u.https.pfx));try{let U=await T(I,L);st.default.undefined(U)&&(U=b(I,L)),u.request=h,u.timeout=E,u.agent=p,u.https&&("rejectUnauthorized"in u.https&&delete L.rejectUnauthorized,u.https.checkServerIdentity&&delete L.checkServerIdentity,u.https.certificateAuthority&&delete L.ca,u.https.certificate&&delete L.cert,u.https.key&&delete L.key,u.https.passphrase&&delete L.passphrase,u.https.pfx&&delete L.pfx),cst(U)?this._onRequest(U):this.writable?(this.once("finish",()=>{this._onResponse(U)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(U)}catch(U){throw U instanceof _ae.CacheError?new fx(U,this):new Ki(U.message,U,this)}}async _error(e){try{for(let r of this.options.hooks.beforeError)e=await r(e)}catch(r){e=new Ki(r.message,r,this)}this.destroy(e)}_beforeError(e){if(this[kE])return;let{options:r}=this,o=this.retryCount+1;this[kE]=!0,e instanceof Ki||(e=new Ki(e.message,e,this));let a=e,{response:n}=a;(async()=>{if(n&&!n.body){n.setEncoding(this._readableState.encoding);try{n.rawBody=await nst.default(n),n.body=n.rawBody.toString()}catch{}}if(this.listenerCount("retry")!==0){let u;try{let A;n&&"retry-after"in n.headers&&(A=Number(n.headers["retry-after"]),Number.isNaN(A)?(A=Date.parse(n.headers["retry-after"])-Date.now(),A<=0&&(A=1)):A*=1e3),u=await r.retry.calculateDelay({attemptCount:o,retryOptions:r.retry,error:a,retryAfter:A,computedValue:ost.default({attemptCount:o,retryOptions:r.retry,error:a,retryAfter:A,computedValue:0})})}catch(A){this._error(new Ki(A.message,A,this));return}if(u){let A=async()=>{try{for(let p of this.options.hooks.beforeRetry)await p(this.options,a,o)}catch(p){this._error(new Ki(p.message,e,this));return}this.destroyed||(this.destroy(),this.emit("retry",o,e))};this[Jae]=setTimeout(A,u);return}}this._error(a)})()}_read(){this[lx]=!0;let e=this[cx];if(e&&!this[kE]){e.readableLength&&(this[lx]=!1);let r;for(;(r=e.read())!==null;){this[SE]+=r.length,this[Vae]=!0;let o=this.downloadProgress;o.percent<1&&this.emit("downloadProgress",o),this.push(r)}}}_write(e,r,o){let a=()=>{this._writeRequest(e,r,o)};this.requestInitialized?a():this[m1].push(a)}_writeRequest(e,r,o){this[Zs].destroyed||(this._progressCallbacks.push(()=>{this[bE]+=Buffer.byteLength(e,r);let a=this.uploadProgress;a.percent<1&&this.emit("uploadProgress",a)}),this[Zs].write(e,r,a=>{!a&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),o(a)}))}_final(e){let r=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(Zs in this)){e();return}if(this[Zs].destroyed){e();return}this[Zs].end(o=>{o||(this[xE]=this[bE],this.emit("uploadProgress",this.uploadProgress),this[Zs].emit("upload-complete")),e(o)})};this.requestInitialized?r():this[m1].push(r)}_destroy(e,r){var o;this[kE]=!0,clearTimeout(this[Jae]),Zs in this&&(this[D4](),!((o=this[cx])===null||o===void 0)&&o.complete||this[Zs].destroy()),e!==null&&!st.default.undefined(e)&&!(e instanceof Ki)&&(e=new Ki(e.message,e,this)),r(e)}get _isAboutToError(){return this[kE]}get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteAddress}get aborted(){var e,r,o;return((r=(e=this[Zs])===null||e===void 0?void 0:e.destroyed)!==null&&r!==void 0?r:this.destroyed)&&!(!((o=this[Kae])===null||o===void 0)&&o.complete)}get socket(){var e,r;return(r=(e=this[Zs])===null||e===void 0?void 0:e.socket)!==null&&r!==void 0?r:void 0}get downloadProgress(){let e;return this[PE]?e=this[SE]/this[PE]:this[PE]===this[SE]?e=1:e=0,{percent:e,transferred:this[SE],total:this[PE]}}get uploadProgress(){let e;return this[xE]?e=this[bE]/this[xE]:this[xE]===this[bE]?e=1:e=0,{percent:e,transferred:this[bE],total:this[xE]}}get timings(){var e;return(e=this[Zs])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[Wae]}pipe(e,r){if(this[Vae])throw new Error("Failed to pipe. The response has been emitted already.");return e instanceof B4.ServerResponse&&this[ax].add(e),super.pipe(e,r)}unpipe(e){return e instanceof B4.ServerResponse&&this[ax].delete(e),super.unpipe(e),this}};Bn.default=dx});var C1=_(qc=>{"use strict";var hst=qc&&qc.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),gst=qc&&qc.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&hst(e,t,r)};Object.defineProperty(qc,"__esModule",{value:!0});qc.CancelError=qc.ParseError=void 0;var zae=E1(),S4=class extends zae.RequestError{constructor(e,r){let{options:o}=r.request;super(`${e.message} in "${o.url.toString()}"`,e,r.request),this.name="ParseError"}};qc.ParseError=S4;var x4=class extends zae.RequestError{constructor(e){super("Promise was canceled",{},e),this.name="CancelError"}get isCanceled(){return!0}};qc.CancelError=x4;gst(E1(),qc)});var Zae=_(b4=>{"use strict";Object.defineProperty(b4,"__esModule",{value:!0});var Xae=C1(),dst=(t,e,r,o)=>{let{rawBody:a}=t;try{if(e==="text")return a.toString(o);if(e==="json")return a.length===0?"":r(a.toString());if(e==="buffer")return a;throw new Xae.ParseError({message:`Unknown body type '${e}'`,name:"Error"},t)}catch(n){throw new Xae.ParseError(n,t)}};b4.default=dst});var k4=_(ch=>{"use strict";var mst=ch&&ch.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),yst=ch&&ch.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&mst(e,t,r)};Object.defineProperty(ch,"__esModule",{value:!0});var Est=Be("events"),Cst=Tf(),wst=Zse(),mx=C1(),$ae=Zae(),ele=E1(),Ist=f4(),Bst=E4(),tle=C4(),vst=["request","response","redirect","uploadProgress","downloadProgress"];function rle(t){let e,r,o=new Est.EventEmitter,a=new wst((u,A,p)=>{let h=E=>{let I=new ele.default(void 0,t);I.retryCount=E,I._noPipe=!0,p(()=>I.destroy()),p.shouldReject=!1,p(()=>A(new mx.CancelError(I))),e=I,I.once("response",async C=>{var T;if(C.retryCount=E,C.request.aborted)return;let L;try{L=await Bst.default(I),C.rawBody=L}catch{return}if(I._isAboutToError)return;let U=((T=C.headers["content-encoding"])!==null&&T!==void 0?T:"").toLowerCase(),J=["gzip","deflate","br"].includes(U),{options:te}=I;if(J&&!te.decompress)C.body=L;else try{C.body=$ae.default(C,te.responseType,te.parseJson,te.encoding)}catch(le){if(C.body=L.toString(),tle.isResponseOk(C)){I._beforeError(le);return}}try{for(let[le,pe]of te.hooks.afterResponse.entries())C=await pe(C,async Ae=>{let ye=ele.default.normalizeArguments(void 0,{...Ae,retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1},te);ye.hooks.afterResponse=ye.hooks.afterResponse.slice(0,le);for(let we of ye.hooks.beforeRetry)await we(ye);let ae=rle(ye);return p(()=>{ae.catch(()=>{}),ae.cancel()}),ae})}catch(le){I._beforeError(new mx.RequestError(le.message,le,I));return}if(!tle.isResponseOk(C)){I._beforeError(new mx.HTTPError(C));return}r=C,u(I.options.resolveBodyOnly?C.body:C)});let v=C=>{if(a.isCanceled)return;let{options:T}=I;if(C instanceof mx.HTTPError&&!T.throwHttpErrors){let{response:L}=C;u(I.options.resolveBodyOnly?L.body:L);return}A(C)};I.once("error",v);let b=I.options.body;I.once("retry",(C,T)=>{var L,U;if(b===((L=T.request)===null||L===void 0?void 0:L.options.body)&&Cst.default.nodeStream((U=T.request)===null||U===void 0?void 0:U.options.body)){v(T);return}h(C)}),Ist.default(I,o,vst)};h(0)});a.on=(u,A)=>(o.on(u,A),a);let n=u=>{let A=(async()=>{await a;let{options:p}=r.request;return $ae.default(r,u,p.parseJson,p.encoding)})();return Object.defineProperties(A,Object.getOwnPropertyDescriptors(a)),A};return a.json=()=>{let{headers:u}=e.options;return!e.writableFinished&&u.accept===void 0&&(u.accept="application/json"),n("json")},a.buffer=()=>n("buffer"),a.text=()=>n("text"),a}ch.default=rle;yst(C1(),ch)});var nle=_(Q4=>{"use strict";Object.defineProperty(Q4,"__esModule",{value:!0});var Dst=C1();function Pst(t,...e){let r=(async()=>{if(t instanceof Dst.RequestError)try{for(let a of e)if(a)for(let n of a)t=await n(t)}catch(a){t=a}throw t})(),o=()=>r;return r.json=o,r.text=o,r.buffer=o,r.on=o,r}Q4.default=Pst});var ole=_(F4=>{"use strict";Object.defineProperty(F4,"__esModule",{value:!0});var ile=Tf();function sle(t){for(let e of Object.values(t))(ile.default.plainObject(e)||ile.default.array(e))&&sle(e);return Object.freeze(t)}F4.default=sle});var lle=_(ale=>{"use strict";Object.defineProperty(ale,"__esModule",{value:!0})});var T4=_(Kl=>{"use strict";var Sst=Kl&&Kl.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),xst=Kl&&Kl.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&Sst(e,t,r)};Object.defineProperty(Kl,"__esModule",{value:!0});Kl.defaultHandler=void 0;var cle=Tf(),Vl=k4(),bst=nle(),Ex=E1(),kst=ole(),Qst={RequestError:Vl.RequestError,CacheError:Vl.CacheError,ReadError:Vl.ReadError,HTTPError:Vl.HTTPError,MaxRedirectsError:Vl.MaxRedirectsError,TimeoutError:Vl.TimeoutError,ParseError:Vl.ParseError,CancelError:Vl.CancelError,UnsupportedProtocolError:Vl.UnsupportedProtocolError,UploadError:Vl.UploadError},Fst=async t=>new Promise(e=>{setTimeout(e,t)}),{normalizeArguments:yx}=Ex.default,ule=(...t)=>{let e;for(let r of t)e=yx(void 0,r,e);return e},Tst=t=>t.isStream?new Ex.default(void 0,t):Vl.default(t),Rst=t=>"defaults"in t&&"options"in t.defaults,Nst=["get","post","put","patch","head","delete"];Kl.defaultHandler=(t,e)=>e(t);var Ale=(t,e)=>{if(t)for(let r of t)r(e)},fle=t=>{t._rawHandlers=t.handlers,t.handlers=t.handlers.map(o=>(a,n)=>{let u,A=o(a,p=>(u=n(p),u));if(A!==u&&!a.isStream&&u){let p=A,{then:h,catch:E,finally:I}=p;Object.setPrototypeOf(p,Object.getPrototypeOf(u)),Object.defineProperties(p,Object.getOwnPropertyDescriptors(u)),p.then=h,p.catch=E,p.finally=I}return A});let e=(o,a={},n)=>{var u,A;let p=0,h=E=>t.handlers[p++](E,p===t.handlers.length?Tst:h);if(cle.default.plainObject(o)){let E={...o,...a};Ex.setNonEnumerableProperties([o,a],E),a=E,o=void 0}try{let E;try{Ale(t.options.hooks.init,a),Ale((u=a.hooks)===null||u===void 0?void 0:u.init,a)}catch(v){E=v}let I=yx(o,a,n??t.options);if(I[Ex.kIsNormalizedAlready]=!0,E)throw new Vl.RequestError(E.message,E,I);return h(I)}catch(E){if(a.isStream)throw E;return bst.default(E,t.options.hooks.beforeError,(A=a.hooks)===null||A===void 0?void 0:A.beforeError)}};e.extend=(...o)=>{let a=[t.options],n=[...t._rawHandlers],u;for(let A of o)Rst(A)?(a.push(A.defaults.options),n.push(...A.defaults._rawHandlers),u=A.defaults.mutableDefaults):(a.push(A),"handlers"in A&&n.push(...A.handlers),u=A.mutableDefaults);return n=n.filter(A=>A!==Kl.defaultHandler),n.length===0&&n.push(Kl.defaultHandler),fle({options:ule(...a),handlers:n,mutableDefaults:Boolean(u)})};let r=async function*(o,a){let n=yx(o,a,t.options);n.resolveBodyOnly=!1;let u=n.pagination;if(!cle.default.object(u))throw new TypeError("`options.pagination` must be implemented");let A=[],{countLimit:p}=u,h=0;for(;h{let n=[];for await(let u of r(o,a))n.push(u);return n},e.paginate.each=r,e.stream=(o,a)=>e(o,{...a,isStream:!0});for(let o of Nst)e[o]=(a,n)=>e(a,{...n,method:o}),e.stream[o]=(a,n)=>e(a,{...n,method:o,isStream:!0});return Object.assign(e,Qst),Object.defineProperty(e,"defaults",{value:t.mutableDefaults?t:kst.default(t),writable:t.mutableDefaults,configurable:t.mutableDefaults,enumerable:!0}),e.mergeOptions=ule,e};Kl.default=fle;xst(lle(),Kl)});var gle=_((Rf,Cx)=>{"use strict";var Lst=Rf&&Rf.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),ple=Rf&&Rf.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&Lst(e,t,r)};Object.defineProperty(Rf,"__esModule",{value:!0});var Mst=Be("url"),hle=T4(),Ost={options:{method:"GET",retry:{limit:2,methods:["GET","PUT","HEAD","DELETE","OPTIONS","TRACE"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:["ETIMEDOUT","ECONNRESET","EADDRINUSE","ECONNREFUSED","EPIPE","ENOTFOUND","ENETUNREACH","EAI_AGAIN"],maxRetryAfter:void 0,calculateDelay:({computedValue:t})=>t},timeout:{},headers:{"user-agent":"got (https://github.com/sindresorhus/got)"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:"text",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:"",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,https:void 0,pagination:{transform:t=>t.request.options.responseType==="json"?t.body:JSON.parse(t.body),paginate:t=>{if(!Reflect.has(t.headers,"link"))return!1;let e=t.headers.link.split(","),r;for(let o of e){let a=o.split(";");if(a[1].includes("next")){r=a[0].trimStart().trim(),r=r.slice(1,-1);break}}return r?{url:new Mst.URL(r)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:1/0,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:t=>JSON.parse(t),stringifyJson:t=>JSON.stringify(t),cacheOptions:{}},handlers:[hle.defaultHandler],mutableDefaults:!1},R4=hle.default(Ost);Rf.default=R4;Cx.exports=R4;Cx.exports.default=R4;Cx.exports.__esModule=!0;ple(T4(),Rf);ple(k4(),Rf)});var rn={};Kt(rn,{Method:()=>Ile,del:()=>qst,get:()=>O4,getNetworkSettings:()=>wle,post:()=>U4,put:()=>jst,request:()=>w1});function yle(t){let e=new wx.URL(t),r={host:e.hostname,headers:{}};return e.port&&(r.port=Number(e.port)),e.username&&e.password&&(r.proxyAuth=`${e.username}:${e.password}`),{proxy:r}}async function N4(t){return ol(mle,t,()=>oe.readFilePromise(t).then(e=>(mle.set(t,e),e)))}function Hst({statusCode:t,statusMessage:e},r){let o=Ot(r,t,yt.NUMBER),a=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${t}`;return Xy(r,`${o}${e?` (${e})`:""}`,a)}async function Ix(t,{configuration:e,customErrorMessage:r}){try{return await t}catch(o){if(o.name!=="HTTPError")throw o;let a=r?.(o,e)??o.response.body?.error;a==null&&(o.message.startsWith("Response code")?a="The remote server failed to provide the requested resource":a=o.message),o.code==="ETIMEDOUT"&&o.event==="socket"&&(a+=`(can be increased via ${Ot(e,"httpTimeout",yt.SETTING)})`);let n=new zt(35,a,u=>{o.response&&u.reportError(35,` ${zu(e,{label:"Response Code",value:_c(yt.NO_HINT,Hst(o.response,e))})}`),o.request&&(u.reportError(35,` ${zu(e,{label:"Request Method",value:_c(yt.NO_HINT,o.request.options.method)})}`),u.reportError(35,` ${zu(e,{label:"Request URL",value:_c(yt.URL,o.request.requestUrl)})}`)),o.request.redirects.length>0&&u.reportError(35,` ${zu(e,{label:"Request Redirects",value:_c(yt.NO_HINT,bL(e,o.request.redirects,yt.URL))})}`),o.request.retryCount===o.request.options.retry.limit&&u.reportError(35,` ${zu(e,{label:"Request Retry Count",value:_c(yt.NO_HINT,`${Ot(e,o.request.retryCount,yt.NUMBER)} (can be increased via ${Ot(e,"httpRetry",yt.SETTING)})`)})}`)});throw n.originalError=o,n}}function wle(t,e){let r=[...e.configuration.get("networkSettings")].sort(([u],[A])=>A.length-u.length),o={enableNetwork:void 0,httpsCaFilePath:void 0,httpProxy:void 0,httpsProxy:void 0,httpsKeyFilePath:void 0,httpsCertFilePath:void 0},a=Object.keys(o),n=typeof t=="string"?new wx.URL(t):t;for(let[u,A]of r)if(M4.default.isMatch(n.hostname,u))for(let p of a){let h=A.get(p);h!==null&&typeof o[p]>"u"&&(o[p]=h)}for(let u of a)typeof o[u]>"u"&&(o[u]=e.configuration.get(u));return o}async function w1(t,e,{configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u="GET",wrapNetworkRequest:A}){let p={target:t,body:e,configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u},h=async()=>await Gst(t,e,p),E=typeof A<"u"?await A(h,p):h;return await(await r.reduceHook(v=>v.wrapNetworkRequest,E,p))()}async function O4(t,{configuration:e,jsonResponse:r,customErrorMessage:o,wrapNetworkRequest:a,...n}){let u=()=>Ix(w1(t,null,{configuration:e,wrapNetworkRequest:a,...n}),{configuration:e,customErrorMessage:o}).then(p=>p.body),A=await(typeof a<"u"?u():ol(dle,t,()=>u().then(p=>(dle.set(t,p),p))));return r?JSON.parse(A.toString()):A}async function jst(t,e,{customErrorMessage:r,...o}){return(await Ix(w1(t,e,{...o,method:"PUT"}),{customErrorMessage:r,configuration:o.configuration})).body}async function U4(t,e,{customErrorMessage:r,...o}){return(await Ix(w1(t,e,{...o,method:"POST"}),{customErrorMessage:r,configuration:o.configuration})).body}async function qst(t,{customErrorMessage:e,...r}){return(await Ix(w1(t,null,{...r,method:"DELETE"}),{customErrorMessage:e,configuration:r.configuration})).body}async function Gst(t,e,{configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u="GET"}){let A=typeof t=="string"?new wx.URL(t):t,p=wle(A,{configuration:r});if(p.enableNetwork===!1)throw new zt(80,`Request to '${A.href}' has been blocked because of your configuration settings`);if(A.protocol==="http:"&&!M4.default.isMatch(A.hostname,r.get("unsafeHttpWhitelist")))throw new zt(81,`Unsafe http requests must be explicitly whitelisted in your configuration (${A.hostname})`);let E={agent:{http:p.httpProxy?L4.default.httpOverHttp(yle(p.httpProxy)):Ust,https:p.httpsProxy?L4.default.httpsOverHttp(yle(p.httpsProxy)):_st},headers:o,method:u};E.responseType=n?"json":"buffer",e!==null&&(Buffer.isBuffer(e)||!a&&typeof e=="string"?E.body=e:E.json=e);let I=r.get("httpTimeout"),v=r.get("httpRetry"),b=r.get("enableStrictSsl"),C=p.httpsCaFilePath,T=p.httpsCertFilePath,L=p.httpsKeyFilePath,{default:U}=await Promise.resolve().then(()=>$e(gle())),J=C?await N4(C):void 0,te=T?await N4(T):void 0,le=L?await N4(L):void 0,pe=U.extend({timeout:{socket:I},retry:v,https:{rejectUnauthorized:b,certificateAuthority:J,certificate:te,key:le},...E});return r.getLimit("networkConcurrency")(()=>pe(A))}var Ele,Cle,M4,L4,wx,dle,mle,Ust,_st,Ile,Bx=Et(()=>{Pt();Ele=Be("https"),Cle=Be("http"),M4=$e(Zo()),L4=$e(Vse()),wx=Be("url");Yl();ql();jl();dle=new Map,mle=new Map,Ust=new Cle.Agent({keepAlive:!0}),_st=new Ele.Agent({keepAlive:!0});Ile=(a=>(a.GET="GET",a.PUT="PUT",a.POST="POST",a.DELETE="DELETE",a))(Ile||{})});var Ji={};Kt(Ji,{availableParallelism:()=>H4,getArchitecture:()=>I1,getArchitectureName:()=>Jst,getArchitectureSet:()=>_4,getCaller:()=>$st,major:()=>Yst,openUrl:()=>Wst});function Kst(){if(process.platform==="darwin"||process.platform==="win32")return null;let t;try{t=oe.readFileSync(Vst)}catch{}if(typeof t<"u"){if(t&&t.includes("GLIBC"))return"glibc";if(t&&t.includes("musl"))return"musl"}let r=(process.report?.getReport()??{}).sharedObjects??[],o=/\/(?:(ld-linux-|[^/]+-linux-gnu\/)|(libc.musl-|ld-musl-))/;return WI(r,a=>{let n=a.match(o);if(!n)return WI.skip;if(n[1])return"glibc";if(n[2])return"musl";throw new Error("Assertion failed: Expected the libc variant to have been detected")})??null}function I1(){return vle=vle??{os:process.platform,cpu:process.arch,libc:Kst()}}function Jst(t=I1()){return t.libc?`${t.os}-${t.cpu}-${t.libc}`:`${t.os}-${t.cpu}`}function _4(){let t=I1();return Dle=Dle??{os:[t.os],cpu:[t.cpu],libc:t.libc?[t.libc]:[]}}function Zst(t){let e=zst.exec(t);if(!e)return null;let r=e[2]&&e[2].indexOf("native")===0,o=e[2]&&e[2].indexOf("eval")===0,a=Xst.exec(e[2]);return o&&a!=null&&(e[2]=a[1],e[3]=a[2],e[4]=a[3]),{file:r?null:e[2],methodName:e[1]||"",arguments:r?[e[2]]:[],line:e[3]?+e[3]:null,column:e[4]?+e[4]:null}}function $st(){let e=new Error().stack.split(` +`)[3];return Zst(e)}function H4(){return typeof vx.default.availableParallelism<"u"?vx.default.availableParallelism():Math.max(1,vx.default.cpus().length)}var vx,Yst,Ble,Wst,Vst,vle,Dle,zst,Xst,Dx=Et(()=>{Pt();vx=$e(Be("os"));Px();jl();Yst=Number(process.versions.node.split(".")[0]),Ble=new Map([["darwin","open"],["linux","xdg-open"],["win32","explorer.exe"]]).get(process.platform),Wst=typeof Ble<"u"?async t=>{try{return await j4(Ble,[t],{cwd:K.cwd()}),!0}catch{return!1}}:void 0,Vst="/usr/bin/ldd";zst=/^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||\/|[a-z]:\\|\\\\).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,Xst=/\((\S*)(?::(\d+))(?::(\d+))\)/});function V4(t,e,r,o,a){let n=u1(r);if(o.isArray||o.type==="ANY"&&Array.isArray(n))return Array.isArray(n)?n.map((u,A)=>q4(t,`${e}[${A}]`,u,o,a)):String(n).split(/,/).map(u=>q4(t,e,u,o,a));if(Array.isArray(n))throw new Error(`Non-array configuration settings "${e}" cannot be an array`);return q4(t,e,r,o,a)}function q4(t,e,r,o,a){let n=u1(r);switch(o.type){case"ANY":return YS(n);case"SHAPE":return not(t,e,r,o,a);case"MAP":return iot(t,e,r,o,a)}if(n===null&&!o.isNullable&&o.default!==null)throw new Error(`Non-nullable configuration settings "${e}" cannot be set to null`);if(o.values?.includes(n))return n;let A=(()=>{if(o.type==="BOOLEAN"&&typeof n!="string")return VI(n);if(typeof n!="string")throw new Error(`Expected configuration setting "${e}" to be a string, got ${typeof n}`);let p=sS(n,{env:t.env});switch(o.type){case"ABSOLUTE_PATH":{let h=a,E=EO(r);return E&&E[0]!=="<"&&(h=K.dirname(E)),K.resolve(h,ue.toPortablePath(p))}case"LOCATOR_LOOSE":return xf(p,!1);case"NUMBER":return parseInt(p);case"LOCATOR":return xf(p);case"BOOLEAN":return VI(p);default:return p}})();if(o.values&&!o.values.includes(A))throw new Error(`Invalid value, expected one of ${o.values.join(", ")}`);return A}function not(t,e,r,o,a){let n=u1(r);if(typeof n!="object"||Array.isArray(n))throw new it(`Object configuration settings "${e}" must be an object`);let u=K4(t,o,{ignoreArrays:!0});if(n===null)return u;for(let[A,p]of Object.entries(n)){let h=`${e}.${A}`;if(!o.properties[A])throw new it(`Unrecognized configuration settings found: ${e}.${A} - run "yarn config -v" to see the list of settings supported in Yarn`);u.set(A,V4(t,h,p,o.properties[A],a))}return u}function iot(t,e,r,o,a){let n=u1(r),u=new Map;if(typeof n!="object"||Array.isArray(n))throw new it(`Map configuration settings "${e}" must be an object`);if(n===null)return u;for(let[A,p]of Object.entries(n)){let h=o.normalizeKeys?o.normalizeKeys(A):A,E=`${e}['${h}']`,I=o.valueDefinition;u.set(h,V4(t,E,p,I,a))}return u}function K4(t,e,{ignoreArrays:r=!1}={}){switch(e.type){case"SHAPE":{if(e.isArray&&!r)return[];let o=new Map;for(let[a,n]of Object.entries(e.properties))o.set(a,K4(t,n));return o}case"MAP":return e.isArray&&!r?[]:new Map;case"ABSOLUTE_PATH":return e.default===null?null:t.projectCwd===null?Array.isArray(e.default)?e.default.map(o=>K.normalize(o)):K.isAbsolute(e.default)?K.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(o=>K.resolve(t.projectCwd,o)):K.resolve(t.projectCwd,e.default);default:return e.default}}function xx(t,e,r){if(e.type==="SECRET"&&typeof t=="string"&&r.hideSecrets)return rot;if(e.type==="ABSOLUTE_PATH"&&typeof t=="string"&&r.getNativePaths)return ue.fromPortablePath(t);if(e.isArray&&Array.isArray(t)){let o=[];for(let a of t)o.push(xx(a,e,r));return o}if(e.type==="MAP"&&t instanceof Map){if(t.size===0)return;let o=new Map;for(let[a,n]of t.entries()){let u=xx(n,e.valueDefinition,r);typeof u<"u"&&o.set(a,u)}return o}if(e.type==="SHAPE"&&t instanceof Map){if(t.size===0)return;let o=new Map;for(let[a,n]of t.entries()){let u=e.properties[a],A=xx(n,u,r);typeof A<"u"&&o.set(a,A)}return o}return t}function sot(){let t={};for(let[e,r]of Object.entries(process.env))e=e.toLowerCase(),e.startsWith(bx)&&(e=(0,Sle.default)(e.slice(bx.length)),t[e]=r);return t}function Y4(){let t=`${bx}rc_filename`;for(let[e,r]of Object.entries(process.env))if(e.toLowerCase()===t&&typeof r=="string")return r;return W4}async function Ple(t){try{return await oe.readFilePromise(t)}catch{return Buffer.of()}}async function oot(t,e){return Buffer.compare(...await Promise.all([Ple(t),Ple(e)]))===0}async function aot(t,e){let[r,o]=await Promise.all([oe.statPromise(t),oe.statPromise(e)]);return r.dev===o.dev&&r.ino===o.ino}async function cot({configuration:t,selfPath:e}){let r=t.get("yarnPath");return t.get("ignorePath")||r===null||r===e||await lot(r,e)?null:r}var Sle,Nf,xle,ble,kle,G4,eot,B1,tot,QE,bx,W4,rot,v1,Qle,kx,Sx,lot,rA,Ve,D1=Et(()=>{Pt();Nl();Sle=$e(aK()),Nf=$e(ed());qt();xle=$e(eJ()),ble=Be("module"),kle=$e(nd()),G4=Be("stream");lse();AE();AO();fO();pO();Lse();hO();Bd();Hse();VS();ql();rh();Bx();jl();Dx();kf();xo();eot=function(){if(!Nf.GITHUB_ACTIONS||!process.env.GITHUB_EVENT_PATH)return!1;let t=ue.toPortablePath(process.env.GITHUB_EVENT_PATH),e;try{e=oe.readJsonSync(t)}catch{return!1}return!(!("repository"in e)||!e.repository||(e.repository.private??!0))}(),B1=new Set(["@yarnpkg/plugin-constraints","@yarnpkg/plugin-exec","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools"]),tot=new Set(["isTestEnv","injectNpmUser","injectNpmPassword","injectNpm2FaToken","cacheCheckpointOverride","cacheVersionOverride","lockfileVersionOverride","binFolder","version","flags","profile","gpg","ignoreNode","wrapOutput","home","confDir","registry","ignoreCwd"]),QE=/^(?!v)[a-z0-9._-]+$/i,bx="yarn_",W4=".yarnrc.yml",rot="********",v1=(E=>(E.ANY="ANY",E.BOOLEAN="BOOLEAN",E.ABSOLUTE_PATH="ABSOLUTE_PATH",E.LOCATOR="LOCATOR",E.LOCATOR_LOOSE="LOCATOR_LOOSE",E.NUMBER="NUMBER",E.STRING="STRING",E.SECRET="SECRET",E.SHAPE="SHAPE",E.MAP="MAP",E))(v1||{}),Qle=yt,kx=(r=>(r.JUNCTIONS="junctions",r.SYMLINKS="symlinks",r))(kx||{}),Sx={lastUpdateCheck:{description:"Last timestamp we checked whether new Yarn versions were available",type:"STRING",default:null},yarnPath:{description:"Path to the local executable that must be used over the global one",type:"ABSOLUTE_PATH",default:null},ignorePath:{description:"If true, the local executable will be ignored when using the global one",type:"BOOLEAN",default:!1},globalFolder:{description:"Folder where all system-global files are stored",type:"ABSOLUTE_PATH",default:wO()},cacheFolder:{description:"Folder where the cache files must be written",type:"ABSOLUTE_PATH",default:"./.yarn/cache"},compressionLevel:{description:"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)",type:"NUMBER",values:["mixed",0,1,2,3,4,5,6,7,8,9],default:0},virtualFolder:{description:"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)",type:"ABSOLUTE_PATH",default:"./.yarn/__virtual__"},installStatePath:{description:"Path of the file where the install state will be persisted",type:"ABSOLUTE_PATH",default:"./.yarn/install-state.gz"},immutablePatterns:{description:"Array of glob patterns; files matching them won't be allowed to change during immutable installs",type:"STRING",default:[],isArray:!0},rcFilename:{description:"Name of the files where the configuration can be found",type:"STRING",default:Y4()},enableGlobalCache:{description:"If true, the system-wide cache folder will be used regardless of `cache-folder`",type:"BOOLEAN",default:!0},cacheMigrationMode:{description:"Defines the conditions under which Yarn upgrades should cause the cache archives to be regenerated.",type:"STRING",values:["always","match-spec","required-only"],default:"always"},enableColors:{description:"If true, the CLI is allowed to use colors in its output",type:"BOOLEAN",default:lS,defaultText:""},enableHyperlinks:{description:"If true, the CLI is allowed to use hyperlinks in its output",type:"BOOLEAN",default:xL,defaultText:""},enableInlineBuilds:{description:"If true, the CLI will print the build output on the command line",type:"BOOLEAN",default:Nf.isCI,defaultText:""},enableMessageNames:{description:"If true, the CLI will prefix most messages with codes suitable for search engines",type:"BOOLEAN",default:!0},enableProgressBars:{description:"If true, the CLI is allowed to show a progress bar for long-running events",type:"BOOLEAN",default:!Nf.isCI,defaultText:""},enableTimers:{description:"If true, the CLI is allowed to print the time spent executing commands",type:"BOOLEAN",default:!0},enableTips:{description:"If true, installs will print a helpful message every day of the week",type:"BOOLEAN",default:!Nf.isCI,defaultText:""},preferInteractive:{description:"If true, the CLI will automatically use the interactive mode when called from a TTY",type:"BOOLEAN",default:!1},preferTruncatedLines:{description:"If true, the CLI will truncate lines that would go beyond the size of the terminal",type:"BOOLEAN",default:!1},progressBarStyle:{description:"Which style of progress bar should be used (only when progress bars are enabled)",type:"STRING",default:void 0,defaultText:""},defaultLanguageName:{description:"Default language mode that should be used when a package doesn't offer any insight",type:"STRING",default:"node"},defaultProtocol:{description:"Default resolution protocol used when resolving pure semver and tag ranges",type:"STRING",default:"npm:"},enableTransparentWorkspaces:{description:"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol",type:"BOOLEAN",default:!0},supportedArchitectures:{description:"Architectures that Yarn will fetch and inject into the resolver",type:"SHAPE",properties:{os:{description:"Array of supported process.platform strings, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]},cpu:{description:"Array of supported process.arch strings, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]},libc:{description:"Array of supported libc libraries, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]}}},enableMirror:{description:"If true, the downloaded packages will be retrieved and stored in both the local and global folders",type:"BOOLEAN",default:!0},enableNetwork:{description:"If false, Yarn will refuse to use the network if required to",type:"BOOLEAN",default:!0},enableOfflineMode:{description:"If true, Yarn will attempt to retrieve files and metadata from the global cache rather than the network",type:"BOOLEAN",default:!1},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:"STRING",default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:"STRING",default:null},unsafeHttpWhitelist:{description:"List of the hostnames for which http queries are allowed (glob patterns are supported)",type:"STRING",default:[],isArray:!0},httpTimeout:{description:"Timeout of each http request in milliseconds",type:"NUMBER",default:6e4},httpRetry:{description:"Retry times on http failure",type:"NUMBER",default:3},networkConcurrency:{description:"Maximal number of concurrent requests",type:"NUMBER",default:50},taskPoolConcurrency:{description:"Maximal amount of concurrent heavy task processing",type:"NUMBER",default:H4()},taskPoolMode:{description:"Execution strategy for heavy tasks",type:"STRING",values:["async","workers"],default:"workers"},networkSettings:{description:"Network settings per hostname (glob patterns are supported)",type:"MAP",valueDefinition:{description:"",type:"SHAPE",properties:{httpsCaFilePath:{description:"Path to file containing one or multiple Certificate Authority signing certificates",type:"ABSOLUTE_PATH",default:null},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:"BOOLEAN",default:null},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:"STRING",default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:"STRING",default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:"ABSOLUTE_PATH",default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:"ABSOLUTE_PATH",default:null}}}},httpsCaFilePath:{description:"A path to a file containing one or multiple Certificate Authority signing certificates",type:"ABSOLUTE_PATH",default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:"ABSOLUTE_PATH",default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:"ABSOLUTE_PATH",default:null},enableStrictSsl:{description:"If false, SSL certificate errors will be ignored",type:"BOOLEAN",default:!0},logFilters:{description:"Overrides for log levels",type:"SHAPE",isArray:!0,concatenateValues:!0,properties:{code:{description:"Code of the messages covered by this override",type:"STRING",default:void 0},text:{description:"Code of the texts covered by this override",type:"STRING",default:void 0},pattern:{description:"Code of the patterns covered by this override",type:"STRING",default:void 0},level:{description:"Log level override, set to null to remove override",type:"STRING",values:Object.values(uS),isNullable:!0,default:void 0}}},enableTelemetry:{description:"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry",type:"BOOLEAN",default:!0},telemetryInterval:{description:"Minimal amount of time between two telemetry uploads, in days",type:"NUMBER",default:7},telemetryUserId:{description:"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.",type:"STRING",default:null},enableHardenedMode:{description:"If true, automatically enable --check-resolutions --refresh-lockfile on installs",type:"BOOLEAN",default:Nf.isPR&&eot,defaultText:""},enableScripts:{description:"If true, packages are allowed to have install scripts by default",type:"BOOLEAN",default:!0},enableStrictSettings:{description:"If true, unknown settings will cause Yarn to abort",type:"BOOLEAN",default:!0},enableImmutableCache:{description:"If true, the cache is reputed immutable and actions that would modify it will throw",type:"BOOLEAN",default:!1},checksumBehavior:{description:"Enumeration defining what to do when a checksum doesn't match expectations",type:"STRING",default:"throw"},injectEnvironmentFiles:{description:"List of all the environment files that Yarn should inject inside the process when it starts",type:"ABSOLUTE_PATH",default:[".env.yarn?"],isArray:!0},packageExtensions:{description:"Map of package corrections to apply on the dependency tree",type:"MAP",valueDefinition:{description:"The extension that will be applied to any package whose version matches the specified range",type:"SHAPE",properties:{dependencies:{description:"The set of dependencies that must be made available to the current package in order for it to work properly",type:"MAP",valueDefinition:{description:"A range",type:"STRING"}},peerDependencies:{description:"Inherited dependencies - the consumer of the package will be tasked to provide them",type:"MAP",valueDefinition:{description:"A semver range",type:"STRING"}},peerDependenciesMeta:{description:"Extra information related to the dependencies listed in the peerDependencies field",type:"MAP",valueDefinition:{description:"The peerDependency meta",type:"SHAPE",properties:{optional:{description:"If true, the selected peer dependency will be marked as optional by the package manager and the consumer omitting it won't be reported as an error",type:"BOOLEAN",default:!1}}}}}}}};lot=process.platform==="win32"?oot:aot;rA=class{constructor(e){this.isCI=Nf.isCI;this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.env={};this.limits=new Map;this.packageExtensions=null;this.startingCwd=e}static create(e,r,o){let a=new rA(e);typeof r<"u"&&!(r instanceof Map)&&(a.projectCwd=r),a.importSettings(Sx);let n=typeof o<"u"?o:r instanceof Map?r:new Map;for(let[u,A]of n)a.activatePlugin(u,A);return a}static async find(e,r,{strict:o=!0,usePathCheck:a=null,useRc:n=!0}={}){let u=sot();delete u.rcFilename;let A=new rA(e),p=await rA.findRcFiles(e),h=await rA.findFolderRcFile(yE());h&&(p.find(ye=>ye.path===h.path)||p.unshift(h));let E=_se(p.map(Ae=>[Ae.path,Ae.data])),I=Bt.dot,v=new Set(Object.keys(Sx)),b=({yarnPath:Ae,ignorePath:ye,injectEnvironmentFiles:ae})=>({yarnPath:Ae,ignorePath:ye,injectEnvironmentFiles:ae}),C=({yarnPath:Ae,ignorePath:ye,injectEnvironmentFiles:ae,...we})=>{let Pe={};for(let[g,Ee]of Object.entries(we))v.has(g)&&(Pe[g]=Ee);return Pe},T=({yarnPath:Ae,ignorePath:ye,...ae})=>{let we={};for(let[Pe,g]of Object.entries(ae))v.has(Pe)||(we[Pe]=g);return we};if(A.importSettings(b(Sx)),A.useWithSource("",b(u),e,{strict:!1}),E){let[Ae,ye]=E;A.useWithSource(Ae,b(ye),I,{strict:!1})}if(a){if(await cot({configuration:A,selfPath:a})!==null)return A;A.useWithSource("",{ignorePath:!0},e,{strict:!1,overwrite:!0})}let L=await rA.findProjectCwd(e);A.startingCwd=e,A.projectCwd=L;let U=Object.assign(Object.create(null),process.env);A.env=U;let J=await Promise.all(A.get("injectEnvironmentFiles").map(async Ae=>{let ye=Ae.endsWith("?")?await oe.readFilePromise(Ae.slice(0,-1),"utf8").catch(()=>""):await oe.readFilePromise(Ae,"utf8");return(0,xle.parse)(ye)}));for(let Ae of J)for(let[ye,ae]of Object.entries(Ae))A.env[ye]=sS(ae,{env:U});if(A.importSettings(C(Sx)),A.useWithSource("",C(u),e,{strict:o}),E){let[Ae,ye]=E;A.useWithSource(Ae,C(ye),I,{strict:o})}let te=Ae=>"default"in Ae?Ae.default:Ae,le=new Map([["@@core",ase]]);if(r!==null)for(let Ae of r.plugins.keys())le.set(Ae,te(r.modules.get(Ae)));for(let[Ae,ye]of le)A.activatePlugin(Ae,ye);let pe=new Map([]);if(r!==null){let Ae=new Map;for(let we of ble.builtinModules)Ae.set(we,()=>vf(we));for(let[we,Pe]of r.modules)Ae.set(we,()=>Pe);let ye=new Set,ae=async(we,Pe)=>{let{factory:g,name:Ee}=vf(we);if(!g||ye.has(Ee))return;let De=new Map(Ae),ce=ee=>{if(De.has(ee))return De.get(ee)();throw new it(`This plugin cannot access the package referenced via ${ee} which is neither a builtin, nor an exposed entry`)},ne=await Wy(async()=>te(await g(ce)),ee=>`${ee} (when initializing ${Ee}, defined in ${Pe})`);Ae.set(Ee,()=>ne),ye.add(Ee),pe.set(Ee,ne)};if(u.plugins)for(let we of u.plugins.split(";")){let Pe=K.resolve(e,ue.toPortablePath(we));await ae(Pe,"")}for(let{path:we,cwd:Pe,data:g}of p)if(!!n&&!!Array.isArray(g.plugins))for(let Ee of g.plugins){let De=typeof Ee!="string"?Ee.path:Ee,ce=Ee?.spec??"",ne=Ee?.checksum??"";if(B1.has(ce))continue;let ee=K.resolve(Pe,ue.toPortablePath(De));if(!await oe.existsPromise(ee)){if(!ce){let ht=Ot(A,K.basename(ee,".cjs"),yt.NAME),H=Ot(A,".gitignore",yt.NAME),lt=Ot(A,A.values.get("rcFilename"),yt.NAME),Re=Ot(A,"https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored",yt.URL);throw new it(`Missing source for the ${ht} plugin - please try to remove the plugin from ${lt} then reinstall it manually. This error usually occurs because ${H} is incorrect, check ${Re} to make sure your plugin folder isn't gitignored.`)}if(!ce.match(/^https?:/)){let ht=Ot(A,K.basename(ee,".cjs"),yt.NAME),H=Ot(A,A.values.get("rcFilename"),yt.NAME);throw new it(`Failed to recognize the source for the ${ht} plugin - please try to delete the plugin from ${H} then reinstall it manually.`)}let Ie=await O4(ce,{configuration:A}),ke=zs(Ie);if(ne&&ne!==ke){let ht=Ot(A,K.basename(ee,".cjs"),yt.NAME),H=Ot(A,A.values.get("rcFilename"),yt.NAME),lt=Ot(A,`yarn plugin import ${ce}`,yt.CODE);throw new it(`Failed to fetch the ${ht} plugin from its remote location: its checksum seems to have changed. If this is expected, please remove the plugin from ${H} then run ${lt} to reimport it.`)}await oe.mkdirPromise(K.dirname(ee),{recursive:!0}),await oe.writeFilePromise(ee,Ie)}await ae(ee,we)}}for(let[Ae,ye]of pe)A.activatePlugin(Ae,ye);if(A.useWithSource("",T(u),e,{strict:o}),E){let[Ae,ye]=E;A.useWithSource(Ae,T(ye),I,{strict:o})}return A.get("enableGlobalCache")&&(A.values.set("cacheFolder",`${A.get("globalFolder")}/cache`),A.sources.set("cacheFolder","")),A}static async findRcFiles(e){let r=Y4(),o=[],a=e,n=null;for(;a!==n;){n=a;let u=K.join(n,r);if(oe.existsSync(u)){let A=await oe.readFilePromise(u,"utf8"),p;try{p=Vi(A)}catch{let E="";throw A.match(/^\s+(?!-)[^:]+\s+\S+/m)&&(E=" (in particular, make sure you list the colons after each key name)"),new it(`Parse error when loading ${u}; please check it's proper Yaml${E}`)}o.unshift({path:u,cwd:n,data:p})}a=K.dirname(n)}return o}static async findFolderRcFile(e){let r=K.join(e,dr.rc),o;try{o=await oe.readFilePromise(r,"utf8")}catch(n){if(n.code==="ENOENT")return null;throw n}let a=Vi(o);return{path:r,cwd:e,data:a}}static async findProjectCwd(e){let r=null,o=e,a=null;for(;o!==a;){if(a=o,oe.existsSync(K.join(a,dr.lockfile)))return a;oe.existsSync(K.join(a,dr.manifest))&&(r=a),o=K.dirname(a)}return r}static async updateConfiguration(e,r,o={}){let a=Y4(),n=K.join(e,a),u=oe.existsSync(n)?Vi(await oe.readFilePromise(n,"utf8")):{},A=!1,p;if(typeof r=="function"){try{p=r(u)}catch{p=r({})}if(p===u)return!1}else{p=u;for(let h of Object.keys(r)){let E=u[h],I=r[h],v;if(typeof I=="function")try{v=I(E)}catch{v=I(void 0)}else v=I;E!==v&&(v===rA.deleteProperty?delete p[h]:p[h]=v,A=!0)}if(!A)return!1}return await oe.changeFilePromise(n,Ba(p),{automaticNewlines:!0}),!0}static async addPlugin(e,r){r.length!==0&&await rA.updateConfiguration(e,o=>{let a=o.plugins??[];if(a.length===0)return{...o,plugins:r};let n=[],u=[...r];for(let A of a){let p=typeof A!="string"?A.path:A,h=u.find(E=>E.path===p);h?(n.push(h),u=u.filter(E=>E!==h)):n.push(A)}return n.push(...u),{...o,plugins:n}})}static async updateHomeConfiguration(e){let r=yE();return await rA.updateConfiguration(r,e)}activatePlugin(e,r){this.plugins.set(e,r),typeof r.configuration<"u"&&this.importSettings(r.configuration)}importSettings(e){for(let[r,o]of Object.entries(e))if(o!=null){if(this.settings.has(r))throw new Error(`Cannot redefine settings "${r}"`);this.settings.set(r,o),this.values.set(r,K4(this,o))}}useWithSource(e,r,o,a){try{this.use(e,r,o,a)}catch(n){throw n.message+=` (in ${Ot(this,e,yt.PATH)})`,n}}use(e,r,o,{strict:a=!0,overwrite:n=!1}={}){a=a&&this.get("enableStrictSettings");for(let u of["enableStrictSettings",...Object.keys(r)]){let A=r[u],p=EO(A);if(p&&(e=p),typeof A>"u"||u==="plugins"||e===""&&tot.has(u))continue;if(u==="rcFilename")throw new it(`The rcFilename settings can only be set via ${`${bx}RC_FILENAME`.toUpperCase()}, not via a rc file`);let h=this.settings.get(u);if(!h){let I=yE(),v=e[0]!=="<"?K.dirname(e):null;if(a&&!(v!==null?I===v:!1))throw new it(`Unrecognized or legacy configuration settings found: ${u} - run "yarn config -v" to see the list of settings supported in Yarn`);this.invalid.set(u,e);continue}if(this.sources.has(u)&&!(n||h.type==="MAP"||h.isArray&&h.concatenateValues))continue;let E;try{E=V4(this,u,A,h,o)}catch(I){throw I.message+=` in ${Ot(this,e,yt.PATH)}`,I}if(u==="enableStrictSettings"&&e!==""){a=E;continue}if(h.type==="MAP"){let I=this.values.get(u);this.values.set(u,new Map(n?[...I,...E]:[...E,...I])),this.sources.set(u,`${this.sources.get(u)}, ${e}`)}else if(h.isArray&&h.concatenateValues){let I=this.values.get(u);this.values.set(u,n?[...I,...E]:[...E,...I]),this.sources.set(u,`${this.sources.get(u)}, ${e}`)}else this.values.set(u,E),this.sources.set(u,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key "${e}"`);return this.values.get(e)}getSpecial(e,{hideSecrets:r=!1,getNativePaths:o=!1}){let a=this.get(e),n=this.settings.get(e);if(typeof n>"u")throw new it(`Couldn't find a configuration settings named "${e}"`);return xx(a,n,{hideSecrets:r,getNativePaths:o})}getSubprocessStreams(e,{header:r,prefix:o,report:a}){let n,u,A=oe.createWriteStream(e);if(this.get("enableInlineBuilds")){let p=a.createStreamReporter(`${o} ${Ot(this,"STDOUT","green")}`),h=a.createStreamReporter(`${o} ${Ot(this,"STDERR","red")}`);n=new G4.PassThrough,n.pipe(p),n.pipe(A),u=new G4.PassThrough,u.pipe(h),u.pipe(A)}else n=A,u=A,typeof r<"u"&&n.write(`${r} +`);return{stdout:n,stderr:u}}makeResolver(){let e=[];for(let r of this.plugins.values())for(let o of r.resolvers||[])e.push(new o);return new vd([new l1,new Xn,...e])}makeFetcher(){let e=[];for(let r of this.plugins.values())for(let o of r.fetchers||[])e.push(new o);return new pE([new hE,new dE,...e])}getLinkers(){let e=[];for(let r of this.plugins.values())for(let o of r.linkers||[])e.push(new o);return e}getSupportedArchitectures(){let e=I1(),r=this.get("supportedArchitectures"),o=r.get("os");o!==null&&(o=o.map(u=>u==="current"?e.os:u));let a=r.get("cpu");a!==null&&(a=a.map(u=>u==="current"?e.cpu:u));let n=r.get("libc");return n!==null&&(n=sl(n,u=>u==="current"?e.libc??sl.skip:u)),{os:o,cpu:a,libc:n}}async getPackageExtensions(){if(this.packageExtensions!==null)return this.packageExtensions;this.packageExtensions=new Map;let e=this.packageExtensions,r=(o,a,{userProvided:n=!1}={})=>{if(!ba(o.range))throw new Error("Only semver ranges are allowed as keys for the packageExtensions setting");let u=new Mt;u.load(a,{yamlCompatibilityMode:!0});let A=Gy(e,o.identHash),p=[];A.push([o.range,p]);let h={status:"inactive",userProvided:n,parentDescriptor:o};for(let E of u.dependencies.values())p.push({...h,type:"Dependency",descriptor:E});for(let E of u.peerDependencies.values())p.push({...h,type:"PeerDependency",descriptor:E});for(let[E,I]of u.peerDependenciesMeta)for(let[v,b]of Object.entries(I))p.push({...h,type:"PeerDependencyMeta",selector:E,key:v,value:b})};await this.triggerHook(o=>o.registerPackageExtensions,this,r);for(let[o,a]of this.get("packageExtensions"))r(nh(o,!0),iS(a),{userProvided:!0});return e}normalizeLocator(e){return ba(e.reference)?Qs(e,`${this.get("defaultProtocol")}${e.reference}`):QE.test(e.reference)?Qs(e,`${this.get("defaultProtocol")}${e.reference}`):e}normalizeDependency(e){return ba(e.range)?In(e,`${this.get("defaultProtocol")}${e.range}`):QE.test(e.range)?In(e,`${this.get("defaultProtocol")}${e.range}`):e}normalizeDependencyMap(e){return new Map([...e].map(([r,o])=>[r,this.normalizeDependency(o)]))}normalizePackage(e,{packageExtensions:r}){let o=$I(e),a=r.get(e.identHash);if(typeof a<"u"){let u=e.version;if(u!==null){for(let[A,p]of a)if(!!bf(u,A))for(let h of p)switch(h.status==="inactive"&&(h.status="redundant"),h.type){case"Dependency":typeof o.dependencies.get(h.descriptor.identHash)>"u"&&(h.status="active",o.dependencies.set(h.descriptor.identHash,this.normalizeDependency(h.descriptor)));break;case"PeerDependency":typeof o.peerDependencies.get(h.descriptor.identHash)>"u"&&(h.status="active",o.peerDependencies.set(h.descriptor.identHash,h.descriptor));break;case"PeerDependencyMeta":{let E=o.peerDependenciesMeta.get(h.selector);(typeof E>"u"||!Object.hasOwn(E,h.key)||E[h.key]!==h.value)&&(h.status="active",ol(o.peerDependenciesMeta,h.selector,()=>({}))[h.key]=h.value)}break;default:CL(h)}}}let n=u=>u.scope?`${u.scope}__${u.name}`:`${u.name}`;for(let u of o.peerDependenciesMeta.keys()){let A=Js(u);o.peerDependencies.has(A.identHash)||o.peerDependencies.set(A.identHash,In(A,"*"))}for(let u of o.peerDependencies.values()){if(u.scope==="types")continue;let A=n(u),p=eA("types",A),h=fn(p);o.peerDependencies.has(p.identHash)||o.peerDependenciesMeta.has(h)||(o.peerDependencies.set(p.identHash,In(p,"*")),o.peerDependenciesMeta.set(h,{optional:!0}))}return o.dependencies=new Map(ks(o.dependencies,([,u])=>Sa(u))),o.peerDependencies=new Map(ks(o.peerDependencies,([,u])=>Sa(u))),o}getLimit(e){return ol(this.limits,e,()=>(0,kle.default)(this.get(e)))}async triggerHook(e,...r){for(let o of this.plugins.values()){let a=o.hooks;if(!a)continue;let n=e(a);!n||await n(...r)}}async triggerMultipleHooks(e,r){for(let o of r)await this.triggerHook(e,...o)}async reduceHook(e,r,...o){let a=r;for(let n of this.plugins.values()){let u=n.hooks;if(!u)continue;let A=e(u);!A||(a=await A(a,...o))}return a}async firstHook(e,...r){for(let o of this.plugins.values()){let a=o.hooks;if(!a)continue;let n=e(a);if(!n)continue;let u=await n(...r);if(typeof u<"u")return u}return null}},Ve=rA;Ve.deleteProperty=Symbol(),Ve.telemetry=null});var Ur={};Kt(Ur,{EndStrategy:()=>Z4,ExecError:()=>Qx,PipeError:()=>P1,execvp:()=>j4,pipevp:()=>Gc});function Sd(t){return t!==null&&typeof t.fd=="number"}function J4(){}function z4(){for(let t of xd)t.kill()}async function Gc(t,e,{cwd:r,env:o=process.env,strict:a=!1,stdin:n=null,stdout:u,stderr:A,end:p=2}){let h=["pipe","pipe","pipe"];n===null?h[0]="ignore":Sd(n)&&(h[0]=n),Sd(u)&&(h[1]=u),Sd(A)&&(h[2]=A);let E=(0,X4.default)(t,e,{cwd:ue.fromPortablePath(r),env:{...o,PWD:ue.fromPortablePath(r)},stdio:h});xd.add(E),xd.size===1&&(process.on("SIGINT",J4),process.on("SIGTERM",z4)),!Sd(n)&&n!==null&&n.pipe(E.stdin),Sd(u)||E.stdout.pipe(u,{end:!1}),Sd(A)||E.stderr.pipe(A,{end:!1});let I=()=>{for(let v of new Set([u,A]))Sd(v)||v.end()};return new Promise((v,b)=>{E.on("error",C=>{xd.delete(E),xd.size===0&&(process.off("SIGINT",J4),process.off("SIGTERM",z4)),(p===2||p===1)&&I(),b(C)}),E.on("close",(C,T)=>{xd.delete(E),xd.size===0&&(process.off("SIGINT",J4),process.off("SIGTERM",z4)),(p===2||p===1&&C!==0)&&I(),C===0||!a?v({code:$4(C,T)}):b(new P1({fileName:t,code:C,signal:T}))})})}async function j4(t,e,{cwd:r,env:o=process.env,encoding:a="utf8",strict:n=!1}){let u=["ignore","pipe","pipe"],A=[],p=[],h=ue.fromPortablePath(r);typeof o.PWD<"u"&&(o={...o,PWD:h});let E=(0,X4.default)(t,e,{cwd:h,env:o,stdio:u});return E.stdout.on("data",I=>{A.push(I)}),E.stderr.on("data",I=>{p.push(I)}),await new Promise((I,v)=>{E.on("error",b=>{let C=Ve.create(r),T=Ot(C,t,yt.PATH);v(new zt(1,`Process ${T} failed to spawn`,L=>{L.reportError(1,` ${zu(C,{label:"Thrown Error",value:_c(yt.NO_HINT,b.message)})}`)}))}),E.on("close",(b,C)=>{let T=a==="buffer"?Buffer.concat(A):Buffer.concat(A).toString(a),L=a==="buffer"?Buffer.concat(p):Buffer.concat(p).toString(a);b===0||!n?I({code:$4(b,C),stdout:T,stderr:L}):v(new Qx({fileName:t,code:b,signal:C,stdout:T,stderr:L}))})})}function $4(t,e){let r=uot.get(e);return typeof r<"u"?128+r:t??1}function Aot(t,e,{configuration:r,report:o}){o.reportError(1,` ${zu(r,t!==null?{label:"Exit Code",value:_c(yt.NUMBER,t)}:{label:"Exit Signal",value:_c(yt.CODE,e)})}`)}var X4,Z4,P1,Qx,xd,uot,Px=Et(()=>{Pt();X4=$e(aR());D1();Yl();ql();Z4=(o=>(o[o.Never=0]="Never",o[o.ErrorCode=1]="ErrorCode",o[o.Always=2]="Always",o))(Z4||{}),P1=class extends zt{constructor({fileName:r,code:o,signal:a}){let n=Ve.create(K.cwd()),u=Ot(n,r,yt.PATH);super(1,`Child ${u} reported an error`,A=>{Aot(o,a,{configuration:n,report:A})});this.code=$4(o,a)}},Qx=class extends P1{constructor({fileName:r,code:o,signal:a,stdout:n,stderr:u}){super({fileName:r,code:o,signal:a});this.stdout=n,this.stderr=u}};xd=new Set;uot=new Map([["SIGINT",2],["SIGQUIT",3],["SIGKILL",9],["SIGTERM",15]])});function Tle(t){Fle=t}function S1(){return typeof eU>"u"&&(eU=Fle()),eU}var eU,Fle,tU=Et(()=>{Fle=()=>{throw new Error("Assertion failed: No libzip instance is available, and no factory was configured")}});var Rle=_((Fx,nU)=>{var fot=Object.assign({},Be("fs")),rU=function(){var t=typeof document<"u"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename<"u"&&(t=t||__filename),function(e){e=e||{};var r=typeof e<"u"?e:{},o,a;r.ready=new Promise(function(We,tt){o=We,a=tt});var n={},u;for(u in r)r.hasOwnProperty(u)&&(n[u]=r[u]);var A=[],p="./this.program",h=function(We,tt){throw tt},E=!1,I=!0,v="";function b(We){return r.locateFile?r.locateFile(We,v):v+We}var C,T,L,U;I&&(E?v=Be("path").dirname(v)+"/":v=__dirname+"/",C=function(tt,It){var nr=ii(tt);return nr?It?nr:nr.toString():(L||(L=fot),U||(U=Be("path")),tt=U.normalize(tt),L.readFileSync(tt,It?null:"utf8"))},T=function(tt){var It=C(tt,!0);return It.buffer||(It=new Uint8Array(It)),Ee(It.buffer),It},process.argv.length>1&&(p=process.argv[1].replace(/\\/g,"/")),A=process.argv.slice(2),h=function(We){process.exit(We)},r.inspect=function(){return"[Emscripten Module object]"});var J=r.print||console.log.bind(console),te=r.printErr||console.warn.bind(console);for(u in n)n.hasOwnProperty(u)&&(r[u]=n[u]);n=null,r.arguments&&(A=r.arguments),r.thisProgram&&(p=r.thisProgram),r.quit&&(h=r.quit);var le=0,pe=function(We){le=We},Ae;r.wasmBinary&&(Ae=r.wasmBinary);var ye=r.noExitRuntime||!0;typeof WebAssembly!="object"&&Ri("no native wasm support detected");function ae(We,tt,It){switch(tt=tt||"i8",tt.charAt(tt.length-1)==="*"&&(tt="i32"),tt){case"i1":return _e[We>>0];case"i8":return _e[We>>0];case"i16":return lp((We>>1)*2);case"i32":return Ms((We>>2)*4);case"i64":return Ms((We>>2)*4);case"float":return cu((We>>2)*4);case"double":return ap((We>>3)*8);default:Ri("invalid type for getValue: "+tt)}return null}var we,Pe=!1,g;function Ee(We,tt){We||Ri("Assertion failed: "+tt)}function De(We){var tt=r["_"+We];return Ee(tt,"Cannot call unknown function "+We+", make sure it is exported"),tt}function ce(We,tt,It,nr,$){var me={string:function(es){var xi=0;if(es!=null&&es!==0){var jo=(es.length<<2)+1;xi=Un(jo),ht(es,xi,jo)}return xi},array:function(es){var xi=Un(es.length);return Re(es,xi),xi}};function Le(es){return tt==="string"?Ie(es):tt==="boolean"?Boolean(es):es}var ft=De(We),pt=[],Rt=0;if(nr)for(var er=0;er=It)&&Te[nr];)++nr;return ee.decode(Te.subarray(We,nr))}function ke(We,tt,It,nr){if(!(nr>0))return 0;for(var $=It,me=It+nr-1,Le=0;Le=55296&&ft<=57343){var pt=We.charCodeAt(++Le);ft=65536+((ft&1023)<<10)|pt&1023}if(ft<=127){if(It>=me)break;tt[It++]=ft}else if(ft<=2047){if(It+1>=me)break;tt[It++]=192|ft>>6,tt[It++]=128|ft&63}else if(ft<=65535){if(It+2>=me)break;tt[It++]=224|ft>>12,tt[It++]=128|ft>>6&63,tt[It++]=128|ft&63}else{if(It+3>=me)break;tt[It++]=240|ft>>18,tt[It++]=128|ft>>12&63,tt[It++]=128|ft>>6&63,tt[It++]=128|ft&63}}return tt[It]=0,It-$}function ht(We,tt,It){return ke(We,Te,tt,It)}function H(We){for(var tt=0,It=0;It=55296&&nr<=57343&&(nr=65536+((nr&1023)<<10)|We.charCodeAt(++It)&1023),nr<=127?++tt:nr<=2047?tt+=2:nr<=65535?tt+=3:tt+=4}return tt}function lt(We){var tt=H(We)+1,It=Li(tt);return It&&ke(We,_e,It,tt),It}function Re(We,tt){_e.set(We,tt)}function Qe(We,tt){return We%tt>0&&(We+=tt-We%tt),We}var be,_e,Te,Je,He,x,w,S,y,F;function z(We){be=We,r.HEAP_DATA_VIEW=F=new DataView(We),r.HEAP8=_e=new Int8Array(We),r.HEAP16=Je=new Int16Array(We),r.HEAP32=x=new Int32Array(We),r.HEAPU8=Te=new Uint8Array(We),r.HEAPU16=He=new Uint16Array(We),r.HEAPU32=w=new Uint32Array(We),r.HEAPF32=S=new Float32Array(We),r.HEAPF64=y=new Float64Array(We)}var X=r.INITIAL_MEMORY||16777216,Z,ie=[],Se=[],Ne=[],ot=!1;function dt(){if(r.preRun)for(typeof r.preRun=="function"&&(r.preRun=[r.preRun]);r.preRun.length;)xt(r.preRun.shift());oo(ie)}function jt(){ot=!0,oo(Se)}function $t(){if(r.postRun)for(typeof r.postRun=="function"&&(r.postRun=[r.postRun]);r.postRun.length;)Qr(r.postRun.shift());oo(Ne)}function xt(We){ie.unshift(We)}function an(We){Se.unshift(We)}function Qr(We){Ne.unshift(We)}var mr=0,xr=null,Wr=null;function Vn(We){mr++,r.monitorRunDependencies&&r.monitorRunDependencies(mr)}function Ns(We){if(mr--,r.monitorRunDependencies&&r.monitorRunDependencies(mr),mr==0&&(xr!==null&&(clearInterval(xr),xr=null),Wr)){var tt=Wr;Wr=null,tt()}}r.preloadedImages={},r.preloadedAudios={};function Ri(We){r.onAbort&&r.onAbort(We),We+="",te(We),Pe=!0,g=1,We="abort("+We+"). Build with -s ASSERTIONS=1 for more info.";var tt=new WebAssembly.RuntimeError(We);throw a(tt),tt}var ps="data:application/octet-stream;base64,";function io(We){return We.startsWith(ps)}var Si="data:application/octet-stream;base64,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QCAAKAJIIgEgASADaiADEAcaAkAgAyAAKAJsIgFNBEAgACABIANrNgJsDAELIABCADcCbAsgACAAKAJoIANrIgE2AmggACAAKAJYIANrNgJYIAEgACgChC5JBEAgACABNgKELgsgAEH8gAEoAgARAwAgAiADaiECCwJAIAAoAgAiASgCBCIERQ0AIAAoAjwhBSAAIAIgBCACIARJGyICBH8gACgCSCAAKAJoaiAFaiEFIAEgBCACazYCBAJAAkACQAJAIAEoAhwiBCgCFEEBaw4CAQACCyAEQaABaiAFIAEoAgAgAkHcgAEoAgARCAAMAgsgASABKAIwIAUgASgCACACQcSAASgCABEEADYCMAwBCyAFIAEoAgAgAhAHGgsgASABKAIAIAJqNgIAIAEgASgCCCACajYCCCAAKAI8BSAFCyACaiICNgI8AkAgACgChC4iASACakEDSQ0AIAAoAmggAWshAQJAIAAoAnRBgQhPBEAgACAAIAAoAkggAWoiAi0AACACLQABIAAoAnwRAAA2AlQMAQsgAUUNACAAIAFBAWsgACgChAERAgAaCyAAKAKELiAAKAI8IgJBAUZrIgRFDQAgACABIAQgACgCgAERBQAgACAAKAKELiAEazYChC4gACgCPCECCyACQYUCSw0AIAAoAgAoAgRFDQAgACgCMCEBDAELCwJAIAAoAkQiAiAAKAJAIgNNDQAgAAJ/IAAoAjwgACgCaGoiASADSwRAIAAoAkggAWpBACACIAFrIgNBggIgA0GCAkkbIgMQGSABIANqDAELIAFBggJqIgEgA00NASAAKAJIIANqQQAgAiADayICIAEgA2siAyACIANJGyIDEBkgACgCQCADags2AkALC50CAQF/AkAgAAJ/IAAoAqAuIgFBwABGBEAgACgCBCAAKAIQaiAAKQOYLjcAACAAQgA3A5guIAAgACgCEEEIajYCEEEADAELIAFBIE4EQCAAKAIEIAAoAhBqIAApA5guPgAAIAAgAEGcLmo1AgA3A5guIAAgACgCEEEEajYCECAAIAAoAqAuQSBrIgE2AqAuCyABQRBOBEAgACgCBCAAKAIQaiAAKQOYLj0AACAAIAAoAhBBAmo2AhAgACAAKQOYLkIQiDcDmC4gACAAKAKgLkEQayIBNgKgLgsgAUEISA0BIAAgACgCECIBQQFqNgIQ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KAJUIgEEfyABQQAgARAiEBkgACgCVAVBAAsQBiAAQQA2AlQLC9wMAgl/AX4jAEFAaiIGJAACQAJAAkACQAJAIAEoAjBBABAjIgVBAkZBACABKAI4QQAQIyIEQQFGGw0AIAVBAUZBACAEQQJGGw0AIAVBAkciAw0BIARBAkcNAQsgASABLwEMQYAQcjsBDEEAIQMMAQsgASABLwEMQf/vA3E7AQxBACEFIANFBEBB9eABIAEoAjAgAEEIahBpIgVFDQILIAJBgAJxBEAgBSEDDAELIARBAkcEQCAFIQMMAQtB9cYBIAEoAjggAEEIahBpIgNFBEAgBRAcDAILIAMgBTYCAAsgASABLwEMQf7/A3EgAS8BUiIFQQBHcjsBDAJAAkACQAJAAn8CQAJAIAEpAyhC/v///w9WDQAgASkDIEL+////D1YNACACQYAEcUUNASABKQNIQv////8PVA0BCyAFQYECa0H//wNxQQNJIQdBAQwBCyAFQYECa0H//wNxIQQgAkGACnFBgApHDQEgBEEDSSEHQQALIQkgBkIcEBciBEUEQCAAQQhqIgAEQCAAQQA2AgQgAEEONgIACyADEBwMBQsgAkGACHEhBQJAAkAgAkGAAnEEQAJAIAUNACABKQMgQv////8PVg0AIAEpAyhCgICAgBBUDQMLIAQgASkDKBAYIAEpAyAhDAwBCwJAAkACQCAFDQAgASkDIEL/////D1YNACABKQMoIgxC/////w9WDQEgASkDSEKAgICAEFQNBAsgASkDKCIMQv////8PVA0BCyAEIAwQGAsgASkDICIMQv////8PWgRAIAQgDBAYCyABKQNIIgxC/////w9UDQELIAQgDBAYCyAELQAARQRAIABBCGoiAARAIABBADYCBCAAQRQ2AgALIAQQCCADEBwMBQtBASEKQQEgBC0AAAR+IAQpAxAFQgALp0H//wNxIAYQRyEFIAQQCCAFIAM2AgAgBw0BDAILIAMhBSAEQQJLDQELIAZCBxAXIgRFBEAgAEEIaiIABEAgAEEANgIEIABBDjYCAAsgBRAcDAMLIARBAhANIARBhxJBAhAsIAQgAS0AUhBwIAQgAS8BEBANIAQtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAsgBBAIDAILQYGyAkEHIAYQRyEDIAQQCCADIAU2AgBBASEL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NgIEIABB7A42AhggGiEdDAMLIARB/wFxIgJBwABxRQRAIAggDSADLwECQQJ0aiAdp0F/IAJ0QX9zcUECdGoiAy0AASICayEIIB0gAq2IIR0gAy0AACIERQ0HDAELCyAEQSBxBEAgB0G//gA2AgQgASECDAgLIAdB0f4ANgIEIABB0A42AhggASECDAcLIB1BfyAGdEF/c62DIBt8IhunIQUgCCAEQQ9xIgNrIQggGiAErUIPg4ghHSABIBdrIgYgAjMBAiAaQX8gA3RBf3Otg3ynIgRPDQIgBCAGayIGIBlNDQEgBygCjEdFDQEgB0HR/gA2AgQgAEG5DDYCGAsgASECIAshBQwFCwJAIA5FBEAgDCARIAZraiEDDAELIAYgDk0EQCAMIA4gBmtqIQMMAQsgDCARIAYgDmsiBmtqIQMgBSAGTQ0AIAUgBmshBQJAAkAgASADTSABIA8gAWusIhogBq0iGyAaIBtUGyIapyIGaiICIANLcQ0AIAMgBmogAUsgASADT3ENACABIAMgBhAHGiACIQEMAQsgASADIAMgAWsiASABQR91IgFqIAFzIgIQByACaiEBIBogAq0iHn0iHFANACACIANqIQIDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgASACKQAANwAAIAEgAikAGDcAGCABIAIpABA3ABAgASACKQAINwAIIBpCIH0hGiACQSBqIQIgAUEgaiEBIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAEgAikAADcAACABIAIpABg3ABggASACKQAQNwAQIAEgAikACDcACCABIAIpADg3ADggASACKQAwNwAwIAEgAikAKDcAKCABIAIpACA3ACAgASACKQBYNwBYIAEgAikAUDcAUCABIAIpAEg3AEggASACKQBANwBAIAEgAikAYDcAYCABIAIpAGg3AGggASACKQBwNwBwIAEgAikAeDcAeCACQYABaiECIAFBgAFqIQEgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAEgAikAADcAACABIAIpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCABIAIpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCABIAIoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCABIAIvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCABIAItAAA6AAAgAkEBaiECIAFBAWohAQsgHEIAUg0ACwsgDiEGIAwhAwsgBSAGSwRAAkACQCABIANNIAEgDyABa6wiGiAGrSIbIBogG1QbIhqnIglqIgIgA0txDQAgAyAJaiABSyABIANPcQ0AIAEgAyAJEAcaDAELIAEgAyADIAFrIgEgAUEfdSIBaiABcyIBEAcgAWohAiAaIAGtIh59IhxQDQAgASADaiEBA0ACQCAcIB4gHCAeVBsiG0IgVARAIBshGgwBCyAbIhpCIH0iIEIFiEIBfEIDgyIfUEUEQANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCAaQiB9IRogAUEgaiEBIAJBIGohAiAfQgF9Ih9CAFINAAsLICBC4ABUDQADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggAiABKQA4NwA4IAIgASkAMDcAMCACIAEpACg3ACggAiABKQAgNwAgIAIgASkAWDcAWCACIAEpAFA3AFAgAiABKQBINwBIIAIgASkAQDcAQCACIAEpAGA3AGAgAiABKQBoNwBoIAIgASkAcDcAcCACIAEpAHg3AHggAUGAAWohASACQYABaiECIBpCgAF9IhpCH1YNAAsLIBpCEFoEQCACIAEpAAA3AAAgAiABKQAINwAIIBpCEH0hGiACQRBqIQIgAUEQaiEBCyAaQghaBEAgAiABKQAANwAAIBpCCH0hGiACQQhqIQIgAUEIaiEBCyAaQgRaBEAgAiABKAAANgAAIBpCBH0hGiACQQRqIQIgAUEEaiEBCyAaQgJaBEAgAiABLwAAOwAAIBpCAn0hGiACQQJqIQIgAUECaiEBCyAcIBt9IRwgGlBFBEAgAiABLQAAOgAAIAJBAWohAiABQQFqIQELIBxCAFINAAsLIAUgBmshAUEAIARrIQUCQCAEQQdLBEAgBCEDDAELIAEgBE0EQCAEIQMMAQsgAiAEayEFA0ACQCACIAUpAAA3AAAgBEEBdCEDIAEgBGshASACIARqIQIgBEEDSw0AIAMhBCABIANLDQELC0EAIANrIQULIAIgBWohBAJAIAUgDyACa6wiGiABrSIbIBogG1QbIhqnIgFIIAVBf0pxDQAgBUEBSCABIARqIAJLcQ0AIAIgBCABEAcgAWohAgwDCyACIAQgAyADQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANAiABIARqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAILAkAgASADTSABIA8gAWusIhogBa0iGyAaIBtUGyIapyIEaiICIANLcQ0AIAMgBGogAUsgASADT3ENACABIAMgBBAHGgwCCyABIAMgAyABayIBIAFBH3UiAWogAXMiARAHIAFqIQIgGiABrSIefSIcUA0BIAEgA2ohAQNAAkAgHCAeIBwgHlQbIhtCIFQEQCAbIRoMAQsgGyIaQiB9IiBCBYhCAXxCA4MiH1BFBEADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggGkIgfSEaIAFBIGohASACQSBqIQIgH0IBfSIfQgBSDQALCyAgQuAAVA0AA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIAIgASkAODcAOCACIAEpADA3ADAgAiABKQAoNwAoIAIgASkAIDcAICACIAEpAFg3AFggAiABKQBQNwBQIAIgASkASDcASCACIAEpAEA3AEAgAiABKQBgNwBgIAIgASkAaDcAaCACIAEpAHA3AHAgAiABKQB4NwB4IAFBgAFqIQEgAkGAAWohAiAaQoABfSIaQh9WDQALCyAaQhBaBEAgAiABKQAANwAAIAIgASkACDcACCAaQhB9IRogAkEQaiECIAFBEGohAQsgGkIIWgRAIAIgASkAADcAACAaQgh9IRogAkEIaiECIAFBCGohAQsgGkIEWgRAIAIgASgAADYAACAaQgR9IRogAkEEaiECIAFBBGohAQsgGkICWgRAIAIgAS8AADsAACAaQgJ9IRogAkECaiECIAFBAmohAQsgHCAbfSEcIBpQRQRAIAIgAS0AADoAACACQQFqIQIgAUEBaiEBCyAcUEUNAAsMAQsCQAJAIBYEQAJAIAQgBUkEQCAHKAKYRyAESw0BCyABIARrIQMCQEEAIARrIgVBf0ogDyABa6wiGiAbIBogG1QbIhqnIgIgBUpxDQAgBUEBSCACIANqIAFLcQ0AIAEgAyACEAcgAmohAgwFCyABIAMgBCAEQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANBCABIANqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAQLIBAgAWsiCUEBaiIGIAUgBSAGSxshAyABIARrIQIgAUEHcUUNAiADRQ0CIAEgAi0AADoAACACQQFqIQIgAUEBaiIGQQdxQQAgA0EBayIFGw0BIAYhASAFIQMgCSEGDAILAkAgBCAFSQRAIAcoAphHIARLDQELIAEgASAEayIGKQAANwAAIAEgBUEBa0EHcUEBaiIDaiECIAUgA2siBEUNAyADIAZqIQEDQCACIAEpAAA3AAAgAUEIaiEBIAJBCGohAiAEQQhrIgQNAAsMAwsgASAEIAUQPyECDAILIAEgAi0AADoAASAJQQFrIQYgA0ECayEFIAJBAWohAgJAIAFBAmoiCkEHcUUNACAFRQ0AIAEgAi0AADoAAiAJQQJrIQYgA0EDayEFIAJBAWohAgJAIAFBA2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAAyAJQQNrIQYgA0EEayEFIAJBAWohAgJAIAFBBGoiCkEHcUUNACAFRQ0AIAEgAi0AADoABCAJQQRrIQYgA0EFayEFIAJBAWohAgJAIAFBBWoiCkEHcUUNACAFRQ0AIAEgAi0AADoABSAJQQVrIQYgA0EGayEFIAJBAWohAgJAIAFBBmoiCkEHcUUNACAFRQ0AIAEgAi0AADoABiAJQQZrIQYgA0EHayEFIAJBAWohAgJAIAFBB2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAByAJQQdrIQYgA0EIayEDIAFBCGohASACQQFqIQIMBgsgCiEBIAUhAwwFCyAKIQEgBSEDDAQLIAohASAFIQMMAwsgCiEBIAUhAwwCCyAKIQEgBSEDDAELIAohASAFIQMLAkACQCAGQRdNBEAgA0UNASADQQFrIQUgA0EHcSIEBEADQCABIAItAAA6AAAgA0EBayEDIAFBAWohASACQQFqIQIgBEEBayIEDQALCyAFQQdJDQEDQCABIAItAAA6AAAgASACLQABOgABIAEgAi0AAjoAAiABIAItAAM6AAMgASACLQAEOgAEIAEgAi0ABToABSABIAItAAY6AAYgASACLQAHOgAHIAFBCGohASACQQhqIQIgA0EIayIDDQALDAELIAMNAQsgASECDAELIAEgBCADED8hAgsgCyEFDAELIAEgAy0AAjoAACABQQFqIQILIAUgFE8NACACIBNJDQELCyAAIAI2AgwgACAFIAhBA3ZrIgE2AgAgACATIAJrQYMCajYCECAAIBQgAWtBDmo2AgQgByAIQQdxIgA2AogBIAcgHUJ/IACthkJ/hYM+AoQBC+cFAQR/IAMgAiACIANLGyEEIAAgAWshAgJAIABBB3FFDQAgBEUNACAAIAItAAA6AAAgA0EBayEGIAJBAWohAiAAQQFqIgdBB3FBACAEQQFrIgUbRQRAIAchACAFIQQgBiEDDAELIAAgAi0AADoAASADQQJrIQYgBEECayEFIAJBAWohAgJAIABBAmoiB0EHcUUNACAFRQ0AIAAgAi0AADoAAiADQQNrIQYgBEEDayEFIAJBAWohAgJAIABBA2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAAyADQQRrIQYgBEEEayEFIAJBAWohAgJAIABBBGoiB0EHcUUNACAFRQ0AIAAgAi0AADoABCADQQVrIQYgBEEFayEFIAJBAWohAgJAIABBBWoiB0EHcUUNACAFRQ0AIAAgAi0AADoABSADQQZrIQYgBEEGayEFIAJBAWohAgJAIABBBmoiB0EHcUUNACAFRQ0AIAAgAi0AADoABiADQQdrIQYgBEEHayEFIAJBAWohAgJAIABBB2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAByADQQhrIQMgBEEIayEEIABBCGohACACQQFqIQIMBgsgByEAIAUhBCAGIQMMBQsgByEAIAUhBCAGIQMMBAsgByEAIAUhBCAGIQMMAwsgByEAIAUhBCAGIQMMAgsgByEAIAUhBCAGIQMMAQsgByEAIAUhBCAGIQMLAkAgA0EXTQRAIARFDQEgBEEBayEBIARBB3EiAwRAA0AgACACLQAAOgAAIARBAWshBCAAQQFqIQAgAkEBaiECIANBAWsiAw0ACwsgAUEHSQ0BA0AgACACLQAAOgAAIAAgAi0AAToAASAAIAItAAI6AAIgACACLQADOgADIAAgAi0ABDoABCAAIAItAAU6AAUgACACLQAGOgAGIAAgAi0ABzoAByAAQQhqIQAgAkEIaiECIARBCGsiBA0ACwwBCyAERQ0AIAAgASAEED8hAAsgAAvyCAEXfyAAKAJoIgwgACgCMEGGAmsiBWtBACAFIAxJGyENIAAoAnQhAiAAKAKQASEPIAAoAkgiDiAMaiIJIAAoAnAiBUECIAUbIgVBAWsiBmoiAy0AASESIAMtAAAhEyAGIA5qIQZBAyEDIAAoApQBIRYgACgCPCEUIAAoAkwhECAAKAI4IRECQAJ/IAVBA0kEQCANIQggDgwBCyAAIABBACAJLQABIAAoAnwRAAAgCS0AAiAAKAJ8EQAAIQoDQCAAIAogAyAJai0AACAAKAJ8EQAAIQogACgCUCAKQQF0ai8BACIIIAEgCCABQf//A3FJIggbIQEgA0ECayAHIAgbIQcgA0EBaiIDIAVNDQALIAFB//8DcSAHIA1qIghB//8DcU0NASAGIAdB//8DcSIDayEGIA4gA2sLIQMCQAJAIAwgAUH//wNxTQ0AIAIgAkECdiAFIA9JGyEKIA1B//8DcSEVIAlBAmohDyAJQQRrIRcDQAJAAkAgBiABQf//A3EiC2otAAAgE0cNACAGIAtBAWoiAWotAAAgEkcNACADIAtqIgItAAAgCS0AAEcNACABIANqLQAAIAktAAFGDQELIApBAWsiCkUNAiAQIAsgEXFBAXRqLwEAIgEgCEH//wNxSw0BDAILIAJBAmohAUEAIQQgDyECAkADQCACLQAAIAEtAABHDQEgAi0AASABLQABRwRAIARBAXIhBAwCCyACLQACIAEtAAJHBEAgBEECciEEDAILIAItAAMgAS0AA0cEQCAEQQNyIQQMAgsgAi0ABCABLQAERwRAIARBBHIhBAwCCyACLQAFIAEtAAVHBEAgBEEFciEEDAILIAItAAYgAS0ABkcEQCAEQQZyIQQMAgsgAi0AByABLQAHRwRAIARBB3IhBAwCCyABQQhqIQEgAkEIaiECIARB+AFJIRggBEEIaiEEIBgNAAtBgAIhBAsCQAJAIAUgBEECaiICSQRAIAAgCyAHQf//A3FrIgY2AmwgAiAUSwRAIBQPCyACIBZPBEAgAg8LIAkgBEEBaiIFaiIBLQABIRIgAS0AACETAkAgAkEESQ0AIAIgBmogDE8NACAGQf//A3EhCCAEQQFrIQtBACEDQQAhBwNAIBAgAyAIaiARcUEBdGovAQAiASAGQf//A3FJBEAgAyAVaiABTw0IIAMhByABIQYLIANBAWoiAyALTQ0ACyAAIAAgAEEAIAIgF2oiAS0AACAAKAJ8EQAAIAEtAAEgACgCfBEAACABLQACIAAoAnwRAAAhASAAKAJQIAFBAXRqLwEAIgEgBkH//wNxTwRAIAdB//8DcSEDIAYhAQwDCyAEQQJrIgdB//8DcSIDIBVqIAFPDQYMAgsgAyAFaiEGIAIhBQsgCkEBayIKRQ0DIBAgCyARcUEBdGovAQAiASAIQf//A3FNDQMMAQsgByANaiEIIA4gA2siAyAFaiEGIAIhBQsgDCABQf//A3FLDQALCyAFDwsgAiEFCyAFIAAoAjwiACAAIAVLGwuGBQETfyAAKAJ0IgMgA0ECdiAAKAJwIgNBAiADGyIDIAAoApABSRshByAAKAJoIgogACgCMEGGAmsiBWtB//8DcUEAIAUgCkkbIQwgACgCSCIIIApqIgkgA0EBayICaiIFLQABIQ0gBS0AACEOIAlBAmohBSACIAhqIQsgACgClAEhEiAAKAI8IQ8gACgCTCEQIAAoAjghESAAKAKIAUEFSCETA0ACQCAKIAFB//8DcU0NAANAAkACQCALIAFB//8DcSIGai0AACAORw0AIAsgBkEBaiIBai0AACANRw0AIAYgCGoiAi0AACAJLQAARw0AIAEgCGotAAAgCS0AAUYNAQsgB0EBayIHRQ0CIAwgECAGIBFxQQF0ai8BACIBSQ0BDAILCyACQQJqIQRBACECIAUhAQJAA0AgAS0AACAELQAARw0BIAEtAAEgBC0AAUcEQCACQQFyIQIMAgsgAS0AAiAELQACRwRAIAJBAnIhAgwCCyABLQADIAQtAANHBEAgAkEDciECDAILIAEtAAQgBC0ABEcEQCACQQRyIQIMAgsgAS0ABSAELQAFRwRAIAJBBXIhAgwCCyABLQAGIAQtAAZHBEAgAkEGciECDAILIAEtAAcgBC0AB0cEQCACQQdyIQIMAgsgBEEIaiEEIAFBCGohASACQfgBSSEUIAJBCGohAiAUDQALQYACIQILAkAgAyACQQJqIgFJBEAgACAGNgJsIAEgD0sEQCAPDwsgASASTwRAIAEPCyAIIAJBAWoiA2ohCyADIAlqIgMtAAEhDSADLQAAIQ4gASEDDAELIBMNAQsgB0EBayIHRQ0AIAwgECAGIBFxQQF0ai8BACIBSQ0BCwsgAwvLAQECfwJAA0AgAC0AACABLQAARw0BIAAtAAEgAS0AAUcEQCACQQFyDwsgAC0AAiABLQACRwRAIAJBAnIPCyAALQADIAEtAANHBEAgAkEDcg8LIAAtAAQgAS0ABEcEQCACQQRyDwsgAC0ABSABLQAFRwRAIAJBBXIPCyAALQAGIAEtAAZHBEAgAkEGcg8LIAAtAAcgAS0AB0cEQCACQQdyDwsgAUEIaiEBIABBCGohACACQfgBSSEDIAJBCGohAiADDQALQYACIQILIAIL5wwBB38gAEF/cyEAIAJBF08EQAJAIAFBA3FFDQAgAS0AACAAQf8BcXNBAnRB0BhqKAIAIABBCHZzIQAgAkEBayIEQQAgAUEBaiIDQQNxG0UEQCAEIQIgAyEBDAELIAEtAAEgAEH/AXFzQQJ0QdAYaigCACAAQQh2cyEAIAFBAmohAwJAIAJBAmsiBEUNACADQQNxRQ0AIAEtAAIgAEH/AXFzQQJ0QdAYaigCACAAQQh2cyEAIAFBA2ohAwJAIAJBA2siBEUNACADQQNxRQ0AIAEtAAMgAEH/AXFzQQJ0QdAYaigCACAAQQh2cyEAIAFBBGohASACQQRrIQIMAgsgBCECIAMhAQwBCyAEIQIgAyEBCyACQRRuIgNBbGwhCQJAIANBAWsiCEUEQEEAIQQMAQsgA0EUbCABakEUayEDQQAhBANAIAEoAhAgB3MiB0EWdkH8B3FB0DhqKAIAIAdBDnZB/AdxQdAwaigCACAHQQZ2QfwHcUHQKGooAgAgB0H/AXFBAnRB0CBqKAIAc3NzIQcgASgCDCAGcyIGQRZ2QfwHcUHQOGooAgAgBkEOdkH8B3FB0DBqKAIAIAZBBnZB/AdxQdAoaigCACAGQf8BcUECdEHQIGooAgBzc3MhBiABKAIIIAVzIgVBFnZB/AdxQdA4aigCACAFQQ52QfwHcUHQMGooAgAgBUEGdkH8B3FB0ChqKAIAIAVB/wFxQQJ0QdAgaigCAHNzcyEFIAEoAgQgBHMiBEEWdkH8B3FB0DhqKAIAIARBDnZB/AdxQdAwaigCACAEQQZ2QfwHcUHQKGooAgAgBEH/AXFBAnRB0CBqKAIAc3NzIQQgASgCACAAcyIAQRZ2QfwHcUHQOGooAgAgAEEOdkH8B3FB0DBqKAIAIABBBnZB/AdxQdAoaigCACAAQf8BcUECdEHQIGooAgBzc3MhACABQRRqIQEgCEEBayIIDQALIAMhAQsgAiAJaiECIAEoAhAgASgCDCABKAIIIAEoAgQgASgCACAAcyIAQQh2IABB/wFxQQJ0QdAYaigCAHMiAEEIdiAAQf8BcUECdEHQGGooAgBzIgBBCHYgAEH/AXFBAnRB0BhqKAIAcyIAQf8BcUECdEHQGGooAgAgBHNzIABBCHZzIgBBCHYgAEH/AXFBAnRB0BhqKAIAcyIAQQh2IABB/wFxQQJ0QdAYaigCAHMiAEEIdiAAQf8BcUECdEHQGGooAgBzIgBB/wFxQQJ0QdAYaigCACAFc3MgAEEIdnMiAEEIdiAAQf8BcUECdEHQGGooAgBzIgBBCHYgAEH/AXFBAnRB0BhqKAIAcyIAQQh2IABB/wFxQQJ0QdAYaigCAHMiAEH/AXFBAnRB0BhqKAIAIAZzcyAAQQh2cyIAQQh2IABB/wFxQQJ0QdAYaigCAHMiAEEIdiAAQf8BcUECdEHQGGooAgBzIgBBCHYgAEH/AXFBAnRB0BhqKAIAcyIAQf8BcUECdEHQGGooAgAgB3NzIABBCHZzIgBBCHYgAEH/AXFBAnRB0BhqKAIAcyIAQQh2IABB/wFxQQJ0QdAYaigCAHMiAEEIdiAAQf8BcUECdEHQGGooAgBzIgBBCHYgAEH/AXFBAnRB0BhqKAIAcyEAIAFBFGohAQsgAkEHSwRAA0AgAS0AByABLQAGIAEtAAUgAS0ABCABLQADIAEtAAIgAS0AASABLQAAIABB/wFxc0ECdEHQGGooAgAgAEEIdnMiAEH/AXFzQQJ0QdAYaigCACAAQQh2cyIAQf8BcXNBAnRB0BhqKAIAIABBCHZzIgBB/wFxc0ECdEHQGGooAgAgAEEIdnMiAEH/AXFzQQJ0QdAYaigCACAAQQh2cyIAQf8BcXNBAnRB0BhqKAIAIABBCHZzIgBB/wFxc0ECdEHQGGooAgAgAEEIdnMiAEH/AXFzQQJ0QdAYaigCACAAQQh2cyEAIAFBCGohASACQQhrIgJBB0sNAAsLAkAgAkUNACACQQFxBH8gAS0AACAAQf8BcXNBAnRB0BhqKAIAIABBCHZzIQAgAUEBaiEBIAJBAWsFIAILIQMgAkEBRg0AA0AgAS0AASABLQAAIABB/wFxc0ECdEHQGGooAgAgAEEIdnMiAEH/AXFzQQJ0QdAYaigCACAAQQh2cyEAIAFBAmohASADQQJrIgMNAAsLIABBf3MLwgIBA38jAEEQayIIJAACfwJAIAAEQCAEDQEgBVANAQsgBgRAIAZBADYCBCAGQRI2AgALQQAMAQtBgAEQCSIHRQRAIAYEQCAGQQA2AgQgBkEONgIAC0EADAELIAcgATcDCCAHQgA3AwAgB0EoaiIJECogByAFNwMYIAcgBDYCECAHIAM6AGAgB0EANgJsIAdCADcCZCAAKQMYIQEgCEF/NgIIIAhCjoCAgPAANwMAIAdBECAIECQgAUL/gQGDhCIBNwNwIAcgAadBBnZBAXE6AHgCQCACRQ0AIAkgAhBgQX9KDQAgBxAGQQAMAQsgBhBfIgIEQCAAIAAoAjBBAWo2AjAgAiAHNgIIIAJBATYCBCACIAA2AgAgAkI/IAAgB0EAQgBBDkEBEQoAIgEgAUIAUxs3AxgLIAILIQAgCEEQaiQAIAALYgEBf0E4EAkiAUUEQCAABEAgAEEANgIEIABBDjYCAAtBAA8LIAFBADYCCCABQgA3AwAgAUIANwMgIAFCgICAgBA3AiwgAUEAOgAoIAFBADYCFCABQgA3AgwgAUEAOwE0IAELuwEBAX4gASkDACICQgKDUEUEQCAAIAEpAxA3AxALIAJCBINQRQRAIAAgASkDGDcDGAsgAkIIg1BFBEAgACABKQMgNwMgCyACQhCDUEUEQCAAIAEoAig2AigLIAJCIINQRQRAIAAgASgCLDYCLAsgAkLAAINQRQRAIAAgAS8BMDsBMAsgAkKAAYNQRQRAIAAgAS8BMjsBMgsgAkKAAoNQRQRAIAAgASgCNDYCNAsgACAAKQMAIAKENwMAQQALGQAgAUUEQEEADwsgACABKAIAIAEzAQQQGws3AQJ/IABBACABG0UEQCAAIAFGDwsgAC8BBCIDIAEvAQRGBH8gACgCACABKAIAIAMQPQVBAQtFCyIBAX8gAUUEQEEADwsgARAJIgJFBEBBAA8LIAIgACABEAcLKQAgACABIAIgAyAEEEUiAEUEQEEADwsgACACQQAgBBA1IQEgABAGIAELcQEBfgJ/AkAgAkJ/VwRAIAMEQCADQQA2AgQgA0EUNgIACwwBCyAAIAEgAhARIgRCf1cEQCADBEAgAyAAKAIMNgIAIAMgACgCEDYCBAsMAQtBACACIARXDQEaIAMEQCADQQA2AgQgA0ERNgIACwtBfwsLNQAgACABIAJBABAmIgBFBEBBfw8LIAMEQCADIAAtAAk6AAALIAQEQCAEIAAoAkQ2AgALQQAL/AECAn8BfiMAQRBrIgMkAAJAIAAgA0EOaiABQYAGQQAQRiIARQRAIAIhAAwBCyADLwEOIgFBBUkEQCACIQAMAQsgAC0AAEEBRwRAIAIhAAwBCyAAIAGtQv//A4MQFyIBRQRAIAIhAAwBCyABEH0aAkAgARAVIAIEfwJ/IAIvAQQhAEEAIAIoAgAiBEUNABpBACAEIABB1IABKAIAEQAACwVBAAtHBEAgAiEADAELIAEgAS0AAAR+IAEpAwggASkDEH0FQgALIgVC//8DgxATIAWnQf//A3FBgBBBABA1IgBFBEAgAiEADAELIAIQEAsgARAICyADQRBqJAAgAAvmDwIIfwJ+IwBB4ABrIgckAEEeQS4gAxshCwJAAkAgAgRAIAIiBSIGLQAABH4gBikDCCAGKQMQfQVCAAsgC61aDQEgBARAIARBADYCBCAEQRM2AgALQn8hDQwCCyABIAutIAcgBBAtIgUNAEJ/IQ0MAQsgBUIEEBMoAABBoxJBqBIgAxsoAABHBEAgBARAIARBADYCBCAEQRM2AgALQn8hDSACDQEgBRAIDAELIABCADcDICAAQQA2AhggAEL/////DzcDECAAQQA7AQwgAEG/hig2AgggAEEBOgAGIABBADsBBCAAQQA2AgAgAEIANwNIIABBgIDYjXg2AkQgAEIANwMoIABCADcDMCAAQgA3AzggAEFAa0EAOwEAIABCADcDUCAAIAMEf0EABSAFEAwLOwEIIAAgBRAMOwEKIAAgBRAMOwEMIAAgBRAMNgIQIAUQDCEGIAUQDCEJIAdBADYCWCAHQgA3A1AgB0IANwNIIAcgCUEfcTYCPCAHIAZBC3Y2AjggByAGQQV2QT9xNgI0IAcgBkEBdEE+cTYCMCAHIAlBCXZB0ABqNgJEIAcgCUEFdkEPcUEBazYCQCAAIAdBMGoQBTYCFCAAIAUQFTYCGCAAIAUQFa03AyAgACAFEBWtNwMoIAUQDCEIIAUQDCEGIAACfiADBEBBACEJIABBADYCRCAAQQA7AUAgAEEANgI8QgAMAQsgBRAMIQkgACAFEAw2AjwgACAFEAw7AUAgACAFEBU2AkQgBRAVrQs3A0ggBS0AAEUEQCAEBEAgBEEANgIEIARBFDYCAAtCfyENIAINASAFEAgMAQsCQCAALwEMIgpBAXEEQCAKQcAAcQRAIABB//8DOwFSDAILIABBATsBUgwBCyAAQQA7AVILIABBADYCOCAAQgA3AzAgBiAIaiAJaiEKAkAgAgRAIAUtAAAEfiAFKQMIIAUpAxB9BUIACyAKrVoNASAEBEAgBEEANgIEIARBFTYCAAtCfyENDAILIAUQCCABIAqtQQAgBBAtIgUNAEJ/IQ0MAQsCQCAIRQ0AIAAgBSABIAhBASAEEGQiCDYCMCAIRQRAIAQoAgBBEUYEQCAEBEAgBEEANgIEIARBFTYCAAsLQn8hDSACDQIgBRAIDAILIAAtAA1BCHFFDQAgCEECECNBBUcNACAEBEAgBEEANgIEIARBFTYCAAtCfyENIAINASAFEAgMAQsgAEE0aiEIAkAgBkUNACAFIAEgBkEAIAQQRSIMRQRAQn8hDSACDQIgBRAIDAILIAwgBkGAAkGABCADGyAIIAQQbiEGIAwQBiAGRQRAQn8hDSACDQIgBRAIDAILIANFDQAgAEEBOgAECwJAIAlFDQAgACAFIAEgCUEAIAQQZCIBNgI4IAFFBEBCfyENIAINAiAFEAgMAgsgAC0ADUEIcUUNACABQQIQI0EFRw0AIAQEQCAEQQA2AgQgBEEVNgIAC0J/IQ0gAg0BIAUQCAwBCyAAIAAoAjRB9eABIAAoAjAQZzYCMCAAIAAoAjRB9cYBIAAoAjgQZzYCOAJAAkAgACkDKEL/////D1ENACAAKQMgQv////8PUQ0AIAApA0hC/////w9SDQELAkACQAJAIAgoAgAgB0EwakEBQYACQYAEIAMbIAQQRiIBRQRAIAJFDQEMAgsgASAHMwEwEBciAUUEQCAEBEAgBEEANgIEIARBDjYCAAsgAkUNAQwCCwJAIAApAyhC/////w9RBEAgACABEB03AygMAQsgA0UNAEEAIQYCQCABKQMQIg5CCHwiDSAOVA0AIAEpAwggDVQNACABIA03AxBBASEGCyABIAY6AAALIAApAyBC/////w9RBEAgACABEB03AyALAkAgAw0AIAApA0hC/////w9RBEAgACABEB03A0gLIAAoAjxB//8DRw0AIAAgARAVNgI8CyABLQAABH8gASkDECABKQMIUQVBAAsNAiAEBEAgBEEANgIEIARBFTYCAAsgARAIIAINAQsgBRAIC0J/IQ0MAgsgARAICyAFLQAARQRAIAQEQCAEQQA2AgQgBEEUNgIAC0J/IQ0gAg0BIAUQCAwBCyACRQRAIAUQCAtCfyENIAApA0hCf1cEQCAEBEAgBEEWNgIEIARBBDYCAAsMAQsjAEEQayIDJABBASEBAkAgACgCEEHjAEcNAEEAIQECQCAAKAI0IANBDmpBgbICQYAGQQAQRiICBEAgAy8BDiIFQQZLDQELIAQEQCAEQQA2AgQgBEEVNgIACwwBCyACIAWtQv//A4MQFyICRQRAIAQEQCAEQQA2AgQgBEEUNgIACwwBC0EBIQECQAJAAkAgAhAMQQFrDgICAQALQQAhASAEBEAgBEEANgIEIARBGDYCAAsgAhAIDAILIAApAyhCE1YhAQsgAkICEBMvAABBwYoBRwRAQQAhASAEBEAgBEEANgIEIARBGDYCAAsgAhAIDAELIAIQfUEBayIFQf8BcUEDTwRAQQAhASAEBEAgBEEANgIEIARBGDYCAAsgAhAIDAELIAMvAQ5BB0cEQEEAIQEgBARAIARBADYCBCAEQRU2AgALIAIQCAwBCyAAIAE6AAYgACAFQf8BcUGBAmo7AVIgACACEAw2AhAgAhAIQQEhAQsgA0EQaiQAIAFFDQAgCCAIKAIAEG02AgAgCiALaq0hDQsgB0HgAGokACANC4ECAQR/IwBBEGsiBCQAAkAgASAEQQxqQcAAQQAQJSIGRQ0AIAQoAgxBBWoiA0GAgARPBEAgAgRAIAJBADYCBCACQRI2AgALDAELQQAgA60QFyIDRQRAIAIEQCACQQA2AgQgAkEONgIACwwBCyADQQEQcCADIAEEfwJ/IAEvAQQhBUEAIAEoAgAiAUUNABpBACABIAVB1IABKAIAEQAACwVBAAsQEiADIAYgBCgCDBAsAn8gAy0AAEUEQCACBEAgAkEANgIEIAJBFDYCAAtBAAwBCyAAIAMtAAAEfiADKQMQBUIAC6dB//8DcSADKAIEEEcLIQUgAxAICyAEQRBqJAAgBQvgAQICfwF+QTAQCSICRQRAIAEEQCABQQA2AgQgAUEONgIAC0EADwsgAkIANwMIIAJBADYCACACQgA3AxAgAkIANwMYIAJCADcDICACQgA3ACUgAFAEQCACDwsCQCAAQv////8AVg0AIACnQQR0EAkiA0UNACACIAM2AgBBACEBQgEhBANAIAMgAUEEdGoiAUIANwIAIAFCADcABSAAIARSBEAgBKchASAEQgF8IQQMAQsLIAIgADcDCCACIAA3AxAgAg8LIAEEQCABQQA2AgQgAUEONgIAC0EAEBAgAhAGQQAL7gECA38BfiMAQRBrIgQkAAJAIARBDGpCBBAXIgNFBEBBfyECDAELAkAgAQRAIAJBgAZxIQUDQAJAIAUgASgCBHFFDQACQCADKQMIQgBUBEAgA0EAOgAADAELIANCADcDECADQQE6AAALIAMgAS8BCBANIAMgAS8BChANIAMtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAtBfyECDAQLQX8hAiAAIARBDGpCBBAbQQBIDQMgATMBCiIGUA0AIAAgASgCDCAGEBtBAEgNAwsgASgCACIBDQALC0EAIQILIAMQCAsgBEEQaiQAIAILPAEBfyAABEAgAUGABnEhAQNAIAEgACgCBHEEQCACIAAvAQpqQQRqIQILIAAoAgAiAA0ACwsgAkH//wNxC5wBAQN/IABFBEBBAA8LIAAhAwNAAn8CQAJAIAAvAQgiAUH04AFNBEAgAUEBRg0BIAFB9cYBRg0BDAILIAFBgbICRg0AIAFB9eABRw0BCyAAKAIAIQEgAEEANgIAIAAoAgwQBiAAEAYgASADIAAgA0YbIQMCQCACRQRAQQAhAgwBCyACIAE2AgALIAEMAQsgACICKAIACyIADQALIAMLsgQCBX8BfgJAAkACQCAAIAGtEBciAQRAIAEtAAANAUEAIQAMAgsgBARAIARBADYCBCAEQQ42AgALQQAPC0EAIQADQCABLQAABH4gASkDCCABKQMQfQVCAAtCBFQNASABEAwhByABIAEQDCIGrRATIghFBEBBACECIAQEQCAEQQA2AgQgBEEVNgIACyABEAggAEUNAwNAIAAoAgAhASAAKAIMEAYg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DCAAQRg2AggLDAMLIAAgBiAFLwFqQQAgBCABEQYAIQEgBhALIAFFDQILAkAgDUUEQCABIQMMAQsgACABIAUvAWgQgQEhAyABEAsgA0UNAQsCQCAJRSAMckUEQCADIQEMAQsgACADQQEQgAEhASADEAsgAUUNAQsgASEDDAELQQAhAwsgBUHwAGokACADC4UBAQF/IAFFBEAgAEEIaiIABEAgAEEANgIEIABBEjYCAAtBAA8LQTgQCSIDRQRAIABBCGoiAARAIABBADYCBCAAQQ42AgALQQAPCyADQQA2AhAgA0IANwIIIANCADcDKCADQQA2AgQgAyACNgIAIANCADcDGCADQQA2AjAgACABQTsgAxBCCw8AIAAgASACQQBBABCCAQusAgECfyABRQRAIABBCGoiAARAIABBADYCBCAAQRI2AgALQQAPCwJAIAJBfUsNACACQf//A3FBCEYNACAAQQhqIgAEQCAAQQA2AgQgAEEQNgIAC0EADwsCQEGwwAAQCSIFBEAgBUEANgIIIAVCADcCACAFQYiBAUGogQEgAxs2AqhAIAUgAjYCFCAFIAM6ABAgBUEAOgAPIAVBADsBDCAFIAMgAkF9SyIGcToADiAFQQggAiAGG0H//wNxIAQgBUGIgQFBqIEBIAMbKAIAEQAAIgI2AqxAIAINASAFEDEgBRAGCyAAQQhqIgAEQCAAQQA2AgQgAEEONgIAC0EADwsgACABQTogBRBCIgAEfyAABSAFKAKsQCAFKAKoQCgCBBEDACAFEDEgBRAGQQALC6ABAQF/IAIgACgCBCIDIAIgA0kbIgIEQCAAIAMgAms2AgQCQAJAAkACQCAAKAIcIgMoAhRBAWsOAgEAAgsgA0GgAWogASAAKAIAIAJB3IABKAIAEQgADAILIAAgACgCMCABIAAoAgAgAkHEgAEoAgARBAA2AjAMAQsgASAAKAIAIAIQBxoLIAAgACgCACACajYCACAAIAAoAgggAmo2AggLC7cCAQR/QX4hAgJAIABFDQAgACgCIEUNACAAKAIkIgRFDQAgACgCHCIBRQ0AIAEoAgAgAEcNAAJAAkAgASgCICIDQTlrDjkBAgICAgICAgICAgIBAgICAQICAgICAgICAgICAgICAgICAQICAgICAgICAgICAQICAgICAgICAgEACyADQZoFRg0AIANBKkcN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DCABajYCDCAGIAYoAgggAWo2AgggBSAFKAIUIAFqNgIUIAUgBSgCECABazYCECAGIAYoAhAgAWsiATYCECABDQAgBiAGKAIENgIIC0EAIQRBACEJIAMoAhBFDQAMCgsgAygCHCgCJCEGIAMgAygCGCIBQQFqNgIYIAEgBmotAAAhASADIARBAWo2AhAgAygCBCAEaiABOgAAIAEEQCADKAIQIQQMAQsLIAMoAhwoAixFDQAgAygCECIGIAlNDQAgBQJ/IAUoAjAhBEEAIAMoAgQgCWoiAUUNABogBCABIAYgCWtB1IABKAIAEQAACzYCMAsgA0HnADYCIAsCQCADKAIcKAIsBEAgAygCDCADKAIQIgFBAmpJBH8gBRAKIAMoAhANAkEABSABCyADKAIEaiAFKAIwOwAAIAMgAygCEEECajYCECADQaABakHkgAEoAgARAQAaCyADQfEANgIgIAUQCiADKAIQRQ0BDAcLDAYLIAUoAgQNAQsgAygCPA0AIApFDQEgAygCIEGaBUYNAQsCfyADKAKIASIBRQRAIAMgChCFAQwBCwJAAkACQCADKAKMAUECaw4CAAECCwJ/AkADQAJAAkAgAygCPA0AIAMQLyADKAI8DQAgCg0BQQAMBAsgAygCSCADKAJoai0AACEEIAMgAygC8C0iAUEBajYC8C0gASADKALsLWpBADoAACADIAMoAvAtIgFBAWo2AvAtIAEgAygC7C1qQQA6AAAgAyADKALwLSIBQQFqNgLwLSABIAMoAuwtaiAEOgAAIAMgBEECdGoiASABLwHkAUEBajsB5AEgAyADKAI8QQFrNgI8IAMgAygCaEEBaiIBNgJoIAMoAvAtIAMoAvQtRw0BQQAhBCADIAMoAlgiBkEATgR/IAMoAkggBmoFQQALIAEgBmtBABAPIAMgAygCaDYCWCADKAIAEAogAygCACgCEA0BDAILCyADQQA2AoQuIApBBEYEQCADIAMoAlgiAUEATgR/IAMoAkggAWoFQQALIAMoAmggAWtBARAPIAMgAygCaDYCWCADKAIAEApBA0ECIAMoAgAoAhAbDAILIAMoAvAtBEBBACEEIAMgAygCWCIBQQBOBH8gAygCSCABagVBAAsgAygCaCABa0EAEA8gAyADKAJoNgJYIAMoAgAQCiADKAIAKAIQRQ0BC0EBIQQLIAQL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bGl0ZXJhbC9sZW5ndGhzIHNldABpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQAdW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0AGludmFsaWQgZGlzdGFuY2VzIHNldABpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0AEZpbGUgYWxyZWFkeSBleGlzdHMAdG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMAaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocwAlcyVzJXMAYnVmZmVyIGVycm9yAE5vIGVycm9yAHN0cmVhbSBlcnJvcgBUZWxsIGVycm9yAEludGVybmFsIGVycm9yAFNlZWsgZXJyb3IAV3JpdGUgZXJyb3IAZmlsZSBlcnJvcgBSZWFkIGVycm9yAFpsaWIgZXJyb3IAZGF0YSBlcnJvcgBDUkMgZXJyb3IAaW5jb21wYXRpYmxlIHZlcnNpb24AaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGluY29ycmVjdCBoZWFkZXIgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBoZWFkZXIgY3JjIG1pc21hdGNoADEuMi4xMy56bGliLW5nAGludmFsaWQgd2luZG93IHNpemUAUmVhZC1vbmx5IGFyY2hpdmUATm90IGEgemlwIGFyY2hpdmUAUmVzb3VyY2Ugc3RpbGwgaW4gdXNlAE1hbGxvYyBmYWlsdXJlAGludmFsaWQgYmxvY2sgdHlwZQBGYWlsdXJlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZQBDYW4ndCBvcGVuIGZpbGUATm8gc3VjaCBmaWxlAFByZW1hdHVyZSBlbmQgb2YgZmlsZQBDYW4ndCByZW1vdmUgZmlsZQBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUAaW52YWxpZCBkaXN0YW5jZSBjb2RlAHVua25vd24gY29tcHJlc3Npb24gbWV0aG9kAHN0cmVhbSBlbmQAQ29tcHJlc3NlZCBkYXRhIGludmFsaWQATXVsdGktZGlzayB6aXAgYXJjaGl2ZXMgbm90IHN1cHBvcnRl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UgAIANIACAAyAAgAsgAIAHIACADyAAgACgAIAIoACABKAAgAygAIACoACACqAAgAagAIAOoACAAaAAgAmgAIAFoACADaAAgAOgAIALoACAB6AAgA+gAIAAYACACGAAgARgAIAMYACAAmAAgApgAIAGYACADmAAgAFgAIAJYACABWAAgA1gAIADYACAC2AAgAdgAIAPYACAAOAAgAjgAIAE4ACADOAAgALgAIAK4ACABuAAgA7gAIAB4ACACeAAgAXgAIAN4ACAA+AAgAvgAIAH4ACAD+AAgAAQAIAIEACABBAAgAwQAIACEACAChAAgAYQAIAOEACAARAAgAkQAIAFEACADRAAgAMQAIALEACABxAAgA8QAIAAkACACJAAgASQAIAMkACAApAAgAqQAIAGkACADpAAgAGQAIAJkACABZAAgA2QAIADkACAC5AAgAeQAIAPkACAAFAAgAhQAIAEUACADFAAgAJQAIAKUACABlAAgA5QAIABUACACVAAgAVQAIANUACAA1AAgAtQAIAHUACAD1AAgADQAIAI0ACABNAAgAzQAIAC0ACACtAAgAbQAIAO0ACAAdAAgAnQAIAF0ACADdAAgAPQAIAL0ACAB9AAgA/QAIABMACQATAQkAkwAJAJMBCQBTAAkAUwEJANMACQDTAQkAMwAJADMBCQCzAAkAswEJAHMACQBzAQkA8wAJAPMBCQALAAkACwEJAIsACQCLAQkASwAJAEsBCQDLAAkAywEJACsACQArAQkAqwAJAKsBCQBrAAkAawEJAOsACQDrAQkAGwAJABsBCQCbAAkAmwEJAFsACQBbAQkA2wAJANsBCQA7AAkAOwEJALsACQC7AQkAewAJAHsBCQD7AAkA+wEJAAcACQAHAQkAhwAJAIcBCQBHAAkARwEJAMcACQDHAQkAJwAJACcBCQCnAAkApwEJAGcACQBnAQkA5wAJAOcBCQAXAAkAFwEJAJcACQCXAQkAVwAJAFcBCQDXAAkA1wEJADcACQA3AQkAtwAJALcBCQB3AAkAdwEJAPcACQD3AQkADwAJAA8BCQCPAAkAjwEJAE8ACQBPAQkAzwAJAM8BCQAvAAkALwEJAK8ACQCvAQkAbwAJAG8BCQDvAAkA7wEJAB8ACQAfAQkAnwAJAJ8BCQBfAAkAXwEJAN8ACQDfAQkAPwAJAD8BCQC/AAkA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SXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AQcCAAQuFARMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAgERQADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAQfSCAQsCXEQAQbCDAQsQ/////////////////////w==";io(Si)||(Si=b(Si));function Ls(We){try{if(We==Si&&Ae)return new Uint8Array(Ae);var tt=ii(We);if(tt)return tt;if(T)return T(We);throw"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"}catch(It){Ri(It)}}function so(We,tt){var It,nr,$;try{$=Ls(We),nr=new WebAssembly.Module($),It=new WebAssembly.Instance(nr,tt)}catch(Le){var me=Le.toString();throw te("failed to compile wasm module: "+me),(me.includes("imported Memory")||me.includes("memory import"))&&te("Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)."),Le}return[It,nr]}function cc(){var We={a:Oa};function tt($,me){var Le=$.exports;r.asm=Le,we=r.asm.g,z(we.buffer),Z=r.asm.W,an(r.asm.h),Ns("wasm-instantiate")}if(Vn("wasm-instantiate"),r.instantiateWasm)try{var It=r.instantiateWasm(We,tt);return It}catch($){return te("Module.instantiateWasm callback failed with error: "+$),!1}var nr=so(Si,We);return tt(nr[0]),r.asm}function cu(We){return F.getFloat32(We,!0)}function ap(We){return F.getFloat64(We,!0)}function lp(We){return F.getInt16(We,!0)}function Ms(We){return F.getInt32(We,!0)}function Dn(We,tt){F.setInt32(We,tt,!0)}function oo(We){for(;We.length>0;){var tt=We.shift();if(typeof tt=="function"){tt(r);continue}var It=tt.func;typeof It=="number"?tt.arg===void 0?Z.get(It)():Z.get(It)(tt.arg):It(tt.arg===void 0?null:tt.arg)}}function Os(We,tt){var It=new Date(Ms((We>>2)*4)*1e3);Dn((tt>>2)*4,It.getUTCSeconds()),Dn((tt+4>>2)*4,It.getUTCMinutes()),Dn((tt+8>>2)*4,It.getUTCHours()),Dn((tt+12>>2)*4,It.getUTCDate()),Dn((tt+16>>2)*4,It.getUTCMonth()),Dn((tt+20>>2)*4,It.getUTCFullYear()-1900),Dn((tt+24>>2)*4,It.getUTCDay()),Dn((tt+36>>2)*4,0),Dn((tt+32>>2)*4,0);var nr=Date.UTC(It.getUTCFullYear(),0,1,0,0,0,0),$=(It.getTime()-nr)/(1e3*60*60*24)|0;return Dn((tt+28>>2)*4,$),Os.GMTString||(Os.GMTString=lt("GMT")),Dn((tt+40>>2)*4,Os.GMTString),tt}function ml(We,tt){return Os(We,tt)}function yl(We,tt,It){Te.copyWithin(We,tt,tt+It)}function ao(We){try{return we.grow(We-be.byteLength+65535>>>16),z(we.buffer),1}catch{}}function Kn(We){var tt=Te.length;We=We>>>0;var It=2147483648;if(We>It)return!1;for(var nr=1;nr<=4;nr*=2){var $=tt*(1+.2/nr);$=Math.min($,We+100663296);var me=Math.min(It,Qe(Math.max(We,$),65536)),Le=ao(me);if(Le)return!0}return!1}function Mn(We){pe(We)}function Ni(We){var tt=Date.now()/1e3|0;return We&&Dn((We>>2)*4,tt),tt}function On(){if(On.called)return;On.called=!0;var We=new Date().getFullYear(),tt=new Date(We,0,1),It=new Date(We,6,1),nr=tt.getTimezoneOffset(),$=It.getTimezoneOffset(),me=Math.max(nr,$);Dn((ds()>>2)*4,me*60),Dn((gs()>>2)*4,Number(nr!=$));function Le(Zr){var qi=Zr.toTimeString().match(/\(([A-Za-z ]+)\)$/);return qi?qi[1]:"GMT"}var ft=Le(tt),pt=Le(It),Rt=lt(ft),er=lt(pt);$>2)*4,Rt),Dn((wi()+4>>2)*4,er)):(Dn((wi()>>2)*4,er),Dn((wi()+4>>2)*4,Rt))}function _i(We){On();var tt=Date.UTC(Ms((We+20>>2)*4)+1900,Ms((We+16>>2)*4),Ms((We+12>>2)*4),Ms((We+8>>2)*4),Ms((We+4>>2)*4),Ms((We>>2)*4),0),It=new Date(tt);Dn((We+24>>2)*4,It.getUTCDay());var nr=Date.UTC(It.getUTCFullYear(),0,1,0,0,0,0),$=(It.getTime()-nr)/(1e3*60*60*24)|0;return Dn((We+28>>2)*4,$),It.getTime()/1e3|0}var tr=typeof atob=="function"?atob:function(We){var tt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",It="",nr,$,me,Le,ft,pt,Rt,er=0;We=We.replace(/[^A-Za-z0-9\+\/\=]/g,"");do Le=tt.indexOf(We.charAt(er++)),ft=tt.indexOf(We.charAt(er++)),pt=tt.indexOf(We.charAt(er++)),Rt=tt.indexOf(We.charAt(er++)),nr=Le<<2|ft>>4,$=(ft&15)<<4|pt>>2,me=(pt&3)<<6|Rt,It=It+String.fromCharCode(nr),pt!==64&&(It=It+String.fromCharCode($)),Rt!==64&&(It=It+String.fromCharCode(me));while(er0||(dt(),mr>0))return;function tt(){Pn||(Pn=!0,r.calledRun=!0,!Pe&&(jt(),o(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),$t()))}r.setStatus?(r.setStatus("Running..."),setTimeout(function(){setTimeout(function(){r.setStatus("")},1),tt()},1)):tt()}if(r.run=ys,r.preInit)for(typeof r.preInit=="function"&&(r.preInit=[r.preInit]);r.preInit.length>0;)r.preInit.pop()();return ys(),e}}();typeof Fx=="object"&&typeof nU=="object"?nU.exports=rU:typeof define=="function"&&define.amd?define([],function(){return rU}):typeof Fx=="object"&&(Fx.createModule=rU)});var Lf,Nle,Lle,Mle=Et(()=>{Lf=["number","number"],Nle=(ee=>(ee[ee.ZIP_ER_OK=0]="ZIP_ER_OK",ee[ee.ZIP_ER_MULTIDISK=1]="ZIP_ER_MULTIDISK",ee[ee.ZIP_ER_RENAME=2]="ZIP_ER_RENAME",ee[ee.ZIP_ER_CLOSE=3]="ZIP_ER_CLOSE",ee[ee.ZIP_ER_SEEK=4]="ZIP_ER_SEEK",ee[ee.ZIP_ER_READ=5]="ZIP_ER_READ",ee[ee.ZIP_ER_WRITE=6]="ZIP_ER_WRITE",ee[ee.ZIP_ER_CRC=7]="ZIP_ER_CRC",ee[ee.ZIP_ER_ZIPCLOSED=8]="ZIP_ER_ZIPCLOSED",ee[ee.ZIP_ER_NOENT=9]="ZIP_ER_NOENT",ee[ee.ZIP_ER_EXISTS=10]="ZIP_ER_EXISTS",ee[ee.ZIP_ER_OPEN=11]="ZIP_ER_OPEN",ee[ee.ZIP_ER_TMPOPEN=12]="ZIP_ER_TMPOPEN",ee[ee.ZIP_ER_ZLIB=13]="ZIP_ER_ZLIB",ee[ee.ZIP_ER_MEMORY=14]="ZIP_ER_MEMORY",ee[ee.ZIP_ER_CHANGED=15]="ZIP_ER_CHANGED",ee[ee.ZIP_ER_COMPNOTSUPP=16]="ZIP_ER_COMPNOTSUPP",ee[ee.ZIP_ER_EOF=17]="ZIP_ER_EOF",ee[ee.ZIP_ER_INVAL=18]="ZIP_ER_INVAL",ee[ee.ZIP_ER_NOZIP=19]="ZIP_ER_NOZIP",ee[ee.ZIP_ER_INTERNAL=20]="ZIP_ER_INTERNAL",ee[ee.ZIP_ER_INCONS=21]="ZIP_ER_INCONS",ee[ee.ZIP_ER_REMOVE=22]="ZIP_ER_REMOVE",ee[ee.ZIP_ER_DELETED=23]="ZIP_ER_DELETED",ee[ee.ZIP_ER_ENCRNOTSUPP=24]="ZIP_ER_ENCRNOTSUPP",ee[ee.ZIP_ER_RDONLY=25]="ZIP_ER_RDONLY",ee[ee.ZIP_ER_NOPASSWD=26]="ZIP_ER_NOPASSWD",ee[ee.ZIP_ER_WRONGPASSWD=27]="ZIP_ER_WRONGPASSWD",ee[ee.ZIP_ER_OPNOTSUPP=28]="ZIP_ER_OPNOTSUPP",ee[ee.ZIP_ER_INUSE=29]="ZIP_ER_INUSE",ee[ee.ZIP_ER_TELL=30]="ZIP_ER_TELL",ee[ee.ZIP_ER_COMPRESSED_DATA=31]="ZIP_ER_COMPRESSED_DATA",ee))(Nle||{}),Lle=t=>({get HEAPU8(){return t.HEAPU8},errors:Nle,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_EXCL:2,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_FL_COMPRESSED:4,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:t._malloc(1),uint32S:t._malloc(4),malloc:t._malloc,free:t._free,getValue:t.getValue,openFromSource:t.cwrap("zip_open_from_source","number",["number","number","number"]),close:t.cwrap("zip_close","number",["number"]),discard:t.cwrap("zip_discard",null,["number"]),getError:t.cwrap("zip_get_error","number",["number"]),getName:t.cwrap("zip_get_name","string",["number","number","number"]),getNumEntries:t.cwrap("zip_get_num_entries","number",["number","number"]),delete:t.cwrap("zip_delete","number",["number","number"]),statIndex:t.cwrap("zip_stat_index","number",["number",...Lf,"number","number"]),fopenIndex:t.cwrap("zip_fopen_index","number",["number",...Lf,"number"]),fread:t.cwrap("zip_fread","number",["number","number","number","number"]),fclose:t.cwrap("zip_fclose","number",["number"]),dir:{add:t.cwrap("zip_dir_add","number",["number","string"])},file:{add:t.cwrap("zip_file_add","number",["number","string","number","number"]),getError:t.cwrap("zip_file_get_error","number",["number"]),getExternalAttributes:t.cwrap("zip_file_get_external_attributes","number",["number",...Lf,"number","number","number"]),setExternalAttributes:t.cwrap("zip_file_set_external_attributes","number",["number",...Lf,"number","number","number"]),setMtime:t.cwrap("zip_file_set_mtime","number",["number",...Lf,"number","number"]),setCompression:t.cwrap("zip_set_file_compression","number",["number",...Lf,"number","number"])},ext:{countSymlinks:t.cwrap("zip_ext_count_symlinks","number",["number"])},error:{initWithCode:t.cwrap("zip_error_init_with_code",null,["number","number"]),strerror:t.cwrap("zip_error_strerror","string",["number"])},name:{locate:t.cwrap("zip_name_locate","number",["number","string","number"])},source:{fromUnattachedBuffer:t.cwrap("zip_source_buffer_create","number",["number",...Lf,"number","number"]),fromBuffer:t.cwrap("zip_source_buffer","number",["number","number",...Lf,"number"]),free:t.cwrap("zip_source_free",null,["number"]),keep:t.cwrap("zip_source_keep",null,["number"]),open:t.cwrap("zip_source_open","number",["number"]),close:t.cwrap("zip_source_close","number",["number"]),seek:t.cwrap("zip_source_seek","number",["number",...Lf,"number"]),tell:t.cwrap("zip_source_tell","number",["number"]),read:t.cwrap("zip_source_read","number",["number","number","number"]),error:t.cwrap("zip_source_error","number",["number"])},struct:{statS:t.cwrap("zipstruct_statS","number",[]),statSize:t.cwrap("zipstruct_stat_size","number",["number"]),statCompSize:t.cwrap("zipstruct_stat_comp_size","number",["number"]),statCompMethod:t.cwrap("zipstruct_stat_comp_method","number",["number"]),statMtime:t.cwrap("zipstruct_stat_mtime","number",["number"]),statCrc:t.cwrap("zipstruct_stat_crc","number",["number"]),errorS:t.cwrap("zipstruct_errorS","number",[]),errorCodeZip:t.cwrap("zipstruct_error_code_zip","number",["number"])}})});function iU(t,e){let r=t.indexOf(e);if(r<=0)return null;let o=r;for(;r>=0&&(o=r+e.length,t[o]!==K.sep);){if(t[r-1]===K.sep)return null;r=t.indexOf(e,o)}return t.length>o&&t[o]!==K.sep?null:t.slice(0,o)}var Jl,Ole=Et(()=>{Pt();Pt();nA();Jl=class extends _p{static async openPromise(e,r){let o=new Jl(r);try{return await e(o)}finally{o.saveAndClose()}}constructor(e={}){let r=e.fileExtensions,o=e.readOnlyArchives,a=typeof r>"u"?A=>iU(A,".zip"):A=>{for(let p of r){let h=iU(A,p);if(h)return h}return null},n=(A,p)=>new zi(p,{baseFs:A,readOnly:o,stats:A.statSync(p)}),u=async(A,p)=>{let h={baseFs:A,readOnly:o,stats:await A.statPromise(p)};return()=>new zi(p,h)};super({...e,factorySync:n,factoryPromise:u,getMountPoint:a})}}});function pot(t){if(typeof t=="string"&&String(+t)===t)return+t;if(typeof t=="number"&&Number.isFinite(t))return t<0?Date.now()/1e3:t;if(Ule.types.isDate(t))return t.getTime()/1e3;throw new Error("Invalid time")}function Tx(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var ta,sU,Ule,oU,_le,Rx,zi,aU=Et(()=>{Pt();Pt();Pt();Pt();Pt();Pt();ta=Be("fs"),sU=Be("stream"),Ule=Be("util"),oU=$e(Be("zlib"));tU();_le="mixed";Rx=class extends Error{constructor(r,o){super(r);this.name="Libzip Error",this.code=o}},zi=class extends Ou{constructor(r,o={}){super();this.listings=new Map;this.entries=new Map;this.fileSources=new Map;this.fds=new Map;this.nextFd=0;this.ready=!1;this.readOnly=!1;let a=o;if(this.level=typeof a.level<"u"?a.level:_le,r??=Tx(),typeof r=="string"){let{baseFs:A=new Rn}=a;this.baseFs=A,this.path=r}else this.path=null,this.baseFs=null;if(o.stats)this.stats=o.stats;else if(typeof r=="string")try{this.stats=this.baseFs.statSync(r)}catch(A){if(A.code==="ENOENT"&&a.create)this.stats=Ea.makeDefaultStats();else throw A}else this.stats=Ea.makeDefaultStats();this.libzip=S1();let n=this.libzip.malloc(4);try{let A=0;o.readOnly&&(A|=this.libzip.ZIP_RDONLY,this.readOnly=!0),typeof r=="string"&&(r=a.create?Tx():this.baseFs.readFileSync(r));let p=this.allocateUnattachedSource(r);try{this.zip=this.libzip.openFromSource(p,A,n),this.lzSource=p}catch(h){throw this.libzip.source.free(p),h}if(this.zip===0){let h=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(h,this.libzip.getValue(n,"i32")),this.makeLibzipError(h)}}finally{this.libzip.free(n)}this.listings.set(Bt.root,new Set);let u=this.libzip.getNumEntries(this.zip,0);for(let A=0;Ar)throw new Error("Overread");let n=this.libzip.HEAPU8.subarray(o,o+r);return Buffer.from(n)}finally{this.libzip.free(o)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),this.ready=!1}saveAndClose(){if(!this.path||!this.baseFs)throw new Error("ZipFS cannot be saved and must be discarded when loaded from a buffer");if(this.readOnly){this.discardAndClose();return}let r=this.baseFs.existsSync(this.path)||this.stats.mode===Ea.DEFAULT_MODE?void 0:this.stats.mode;this.baseFs.writeFileSync(this.path,this.getBufferAndClose(),{mode:r}),this.ready=!1}resolve(r){return K.resolve(Bt.root,r)}async openPromise(r,o,a){return this.openSync(r,o,a)}openSync(r,o,a){let n=this.nextFd++;return this.fds.set(n,{cursor:0,p:r}),n}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(r,o){return this.opendirSync(r,o)}opendirSync(r,o={}){let a=this.resolveFilename(`opendir '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw ar.ENOENT(`opendir '${r}'`);let n=this.listings.get(a);if(!n)throw ar.ENOTDIR(`opendir '${r}'`);let u=[...n],A=this.openSync(a,"r");return SD(this,a,u,{onClose:()=>{this.closeSync(A)}})}async readPromise(r,o,a,n,u){return this.readSync(r,o,a,n,u)}readSync(r,o,a=0,n=o.byteLength,u=-1){let A=this.fds.get(r);if(typeof A>"u")throw ar.EBADF("read");let p=u===-1||u===null?A.cursor:u,h=this.readFileSync(A.p);h.copy(o,a,p,p+n);let E=Math.max(0,Math.min(h.length-p,n));return(u===-1||u===null)&&(A.cursor+=E),E}async writePromise(r,o,a,n,u){return typeof o=="string"?this.writeSync(r,o,u):this.writeSync(r,o,a,n,u)}writeSync(r,o,a,n,u){throw typeof this.fds.get(r)>"u"?ar.EBADF("read"):new Error("Unimplemented")}async closePromise(r){return this.closeSync(r)}closeSync(r){if(typeof this.fds.get(r)>"u")throw ar.EBADF("read");this.fds.delete(r)}createReadStream(r,{encoding:o}={}){if(r===null)throw new Error("Unimplemented");let a=this.openSync(r,"r"),n=Object.assign(new sU.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(A,p)=>{clearImmediate(u),this.closeSync(a),p(A)}}),{close(){n.destroy()},bytesRead:0,path:r,pending:!1}),u=setImmediate(async()=>{try{let A=await this.readFilePromise(r,o);n.bytesRead=A.length,n.end(A)}catch(A){n.destroy(A)}});return n}createWriteStream(r,{encoding:o}={}){if(this.readOnly)throw ar.EROFS(`open '${r}'`);if(r===null)throw new Error("Unimplemented");let a=[],n=this.openSync(r,"w"),u=Object.assign(new sU.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(A,p)=>{try{A?p(A):(this.writeFileSync(r,Buffer.concat(a),o),p(null))}catch(h){p(h)}finally{this.closeSync(n)}}}),{close(){u.destroy()},bytesWritten:0,path:r,pending:!1});return u.on("data",A=>{let p=Buffer.from(A);u.bytesWritten+=p.length,a.push(p)}),u}async realpathPromise(r){return this.realpathSync(r)}realpathSync(r){let o=this.resolveFilename(`lstat '${r}'`,r);if(!this.entries.has(o)&&!this.listings.has(o))throw ar.ENOENT(`lstat '${r}'`);return o}async existsPromise(r){return this.existsSync(r)}existsSync(r){if(!this.ready)throw ar.EBUSY(`archive closed, existsSync '${r}'`);if(this.symlinkCount===0){let a=K.resolve(Bt.root,r);return this.entries.has(a)||this.listings.has(a)}let o;try{o=this.resolveFilename(`stat '${r}'`,r,void 0,!1)}catch{return!1}return o===void 0?!1:this.entries.has(o)||this.listings.has(o)}async accessPromise(r,o){return this.accessSync(r,o)}accessSync(r,o=ta.constants.F_OK){let a=this.resolveFilename(`access '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw ar.ENOENT(`access '${r}'`);if(this.readOnly&&o&ta.constants.W_OK)throw ar.EROFS(`access '${r}'`)}async statPromise(r,o={bigint:!1}){return o.bigint?this.statSync(r,{bigint:!0}):this.statSync(r)}statSync(r,o={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`stat '${r}'`,r,void 0,o.throwIfNoEntry);if(a!==void 0){if(!this.entries.has(a)&&!this.listings.has(a)){if(o.throwIfNoEntry===!1)return;throw ar.ENOENT(`stat '${r}'`)}if(r[r.length-1]==="/"&&!this.listings.has(a))throw ar.ENOTDIR(`stat '${r}'`);return this.statImpl(`stat '${r}'`,a,o)}}async fstatPromise(r,o){return this.fstatSync(r,o)}fstatSync(r,o){let a=this.fds.get(r);if(typeof a>"u")throw ar.EBADF("fstatSync");let{p:n}=a,u=this.resolveFilename(`stat '${n}'`,n);if(!this.entries.has(u)&&!this.listings.has(u))throw ar.ENOENT(`stat '${n}'`);if(n[n.length-1]==="/"&&!this.listings.has(u))throw ar.ENOTDIR(`stat '${n}'`);return this.statImpl(`fstat '${n}'`,u,o)}async lstatPromise(r,o={bigint:!1}){return o.bigint?this.lstatSync(r,{bigint:!0}):this.lstatSync(r)}lstatSync(r,o={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`lstat '${r}'`,r,!1,o.throwIfNoEntry);if(a!==void 0){if(!this.entries.has(a)&&!this.listings.has(a)){if(o.throwIfNoEntry===!1)return;throw ar.ENOENT(`lstat '${r}'`)}if(r[r.length-1]==="/"&&!this.listings.has(a))throw ar.ENOTDIR(`lstat '${r}'`);return this.statImpl(`lstat '${r}'`,a,o)}}statImpl(r,o,a={}){let n=this.entries.get(o);if(typeof n<"u"){let u=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,n,0,0,u)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let p=this.stats.uid,h=this.stats.gid,E=this.libzip.struct.statSize(u)>>>0,I=512,v=Math.ceil(E/I),b=(this.libzip.struct.statMtime(u)>>>0)*1e3,C=b,T=b,L=b,U=new Date(C),J=new Date(T),te=new Date(L),le=new Date(b),pe=this.listings.has(o)?ta.constants.S_IFDIR:this.isSymbolicLink(n)?ta.constants.S_IFLNK:ta.constants.S_IFREG,Ae=pe===ta.constants.S_IFDIR?493:420,ye=pe|this.getUnixMode(n,Ae)&511,ae=this.libzip.struct.statCrc(u),we=Object.assign(new Ea.StatEntry,{uid:p,gid:h,size:E,blksize:I,blocks:v,atime:U,birthtime:J,ctime:te,mtime:le,atimeMs:C,birthtimeMs:T,ctimeMs:L,mtimeMs:b,mode:ye,crc:ae});return a.bigint===!0?Ea.convertToBigIntStats(we):we}if(this.listings.has(o)){let u=this.stats.uid,A=this.stats.gid,p=0,h=512,E=0,I=this.stats.mtimeMs,v=this.stats.mtimeMs,b=this.stats.mtimeMs,C=this.stats.mtimeMs,T=new Date(I),L=new Date(v),U=new Date(b),J=new Date(C),te=ta.constants.S_IFDIR|493,le=0,pe=Object.assign(new Ea.StatEntry,{uid:u,gid:A,size:p,blksize:h,blocks:E,atime:T,birthtime:L,ctime:U,mtime:J,atimeMs:I,birthtimeMs:v,ctimeMs:b,mtimeMs:C,mode:te,crc:le});return a.bigint===!0?Ea.convertToBigIntStats(pe):pe}throw new Error("Unreachable")}getUnixMode(r,o){if(this.libzip.file.getExternalAttributes(this.zip,r,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?o:this.libzip.getValue(this.libzip.uint32S,"i32")>>>16}registerListing(r){let o=this.listings.get(r);if(o)return o;this.registerListing(K.dirname(r)).add(K.basename(r));let n=new Set;return this.listings.set(r,n),n}registerEntry(r,o){this.registerListing(K.dirname(r)).add(K.basename(r)),this.entries.set(r,o)}unregisterListing(r){this.listings.delete(r),this.listings.get(K.dirname(r))?.delete(K.basename(r))}unregisterEntry(r){this.unregisterListing(r);let o=this.entries.get(r);this.entries.delete(r),!(typeof o>"u")&&(this.fileSources.delete(o),this.isSymbolicLink(o)&&this.symlinkCount--)}deleteEntry(r,o){if(this.unregisterEntry(r),this.libzip.delete(this.zip,o)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}resolveFilename(r,o,a=!0,n=!0){if(!this.ready)throw ar.EBUSY(`archive closed, ${r}`);let u=K.resolve(Bt.root,o);if(u==="/")return Bt.root;let A=this.entries.get(u);if(a&&A!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(A)){let p=this.getFileSource(A).toString();return this.resolveFilename(r,K.resolve(K.dirname(u),p),!0,n)}else return u;for(;;){let p=this.resolveFilename(r,K.dirname(u),!0,n);if(p===void 0)return p;let h=this.listings.has(p),E=this.entries.has(p);if(!h&&!E){if(n===!1)return;throw ar.ENOENT(r)}if(!h)throw ar.ENOTDIR(r);if(u=K.resolve(p,K.basename(u)),!a||this.symlinkCount===0)break;let I=this.libzip.name.locate(this.zip,u.slice(1),0);if(I===-1)break;if(this.isSymbolicLink(I)){let v=this.getFileSource(I).toString();u=K.resolve(K.dirname(u),v)}else break}return u}allocateBuffer(r){Buffer.isBuffer(r)||(r=Buffer.from(r));let o=this.libzip.malloc(r.byteLength);if(!o)throw new Error("Couldn't allocate enough memory");return new Uint8Array(this.libzip.HEAPU8.buffer,o,r.byteLength).set(r),{buffer:o,byteLength:r.byteLength}}allocateUnattachedSource(r){let o=this.libzip.struct.errorS(),{buffer:a,byteLength:n}=this.allocateBuffer(r),u=this.libzip.source.fromUnattachedBuffer(a,n,0,1,o);if(u===0)throw this.libzip.free(o),this.makeLibzipError(o);return u}allocateSource(r){let{buffer:o,byteLength:a}=this.allocateBuffer(r),n=this.libzip.source.fromBuffer(this.zip,o,a,0,1);if(n===0)throw this.libzip.free(o),this.makeLibzipError(this.libzip.getError(this.zip));return n}setFileSource(r,o){let a=Buffer.isBuffer(o)?o:Buffer.from(o),n=K.relative(Bt.root,r),u=this.allocateSource(o);try{let A=this.libzip.file.add(this.zip,n,u,this.libzip.ZIP_FL_OVERWRITE);if(A===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.level!=="mixed"){let p=this.level===0?this.libzip.ZIP_CM_STORE:this.libzip.ZIP_CM_DEFLATE;if(this.libzip.file.setCompression(this.zip,A,0,p,this.level)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}return this.fileSources.set(A,a),A}catch(A){throw this.libzip.source.free(u),A}}isSymbolicLink(r){if(this.symlinkCount===0)return!1;if(this.libzip.file.getExternalAttributes(this.zip,r,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?!1:(this.libzip.getValue(this.libzip.uint32S,"i32")>>>16&ta.constants.S_IFMT)===ta.constants.S_IFLNK}getFileSource(r,o={asyncDecompress:!1}){let a=this.fileSources.get(r);if(typeof a<"u")return a;let n=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,r,0,0,n)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let A=this.libzip.struct.statCompSize(n),p=this.libzip.struct.statCompMethod(n),h=this.libzip.malloc(A);try{let E=this.libzip.fopenIndex(this.zip,r,0,this.libzip.ZIP_FL_COMPRESSED);if(E===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let I=this.libzip.fread(E,h,A,0);if(I===-1)throw this.makeLibzipError(this.libzip.file.getError(E));if(IA)throw new Error("Overread");let v=this.libzip.HEAPU8.subarray(h,h+A),b=Buffer.from(v);if(p===0)return this.fileSources.set(r,b),b;if(o.asyncDecompress)return new Promise((C,T)=>{oU.default.inflateRaw(b,(L,U)=>{L?T(L):(this.fileSources.set(r,U),C(U))})});{let C=oU.default.inflateRawSync(b);return this.fileSources.set(r,C),C}}finally{this.libzip.fclose(E)}}finally{this.libzip.free(h)}}async fchmodPromise(r,o){return this.chmodPromise(this.fdToPath(r,"fchmod"),o)}fchmodSync(r,o){return this.chmodSync(this.fdToPath(r,"fchmodSync"),o)}async chmodPromise(r,o){return this.chmodSync(r,o)}chmodSync(r,o){if(this.readOnly)throw ar.EROFS(`chmod '${r}'`);o&=493;let a=this.resolveFilename(`chmod '${r}'`,r,!1),n=this.entries.get(a);if(typeof n>"u")throw new Error(`Assertion failed: The entry should have been registered (${a})`);let A=this.getUnixMode(n,ta.constants.S_IFREG|0)&-512|o;if(this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,A<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async fchownPromise(r,o,a){return this.chownPromise(this.fdToPath(r,"fchown"),o,a)}fchownSync(r,o,a){return this.chownSync(this.fdToPath(r,"fchownSync"),o,a)}async chownPromise(r,o,a){return this.chownSync(r,o,a)}chownSync(r,o,a){throw new Error("Unimplemented")}async renamePromise(r,o){return this.renameSync(r,o)}renameSync(r,o){throw new Error("Unimplemented")}async copyFilePromise(r,o,a){let{indexSource:n,indexDest:u,resolvedDestP:A}=this.prepareCopyFile(r,o,a),p=await this.getFileSource(n,{asyncDecompress:!0}),h=this.setFileSource(A,p);h!==u&&this.registerEntry(A,h)}copyFileSync(r,o,a=0){let{indexSource:n,indexDest:u,resolvedDestP:A}=this.prepareCopyFile(r,o,a),p=this.getFileSource(n),h=this.setFileSource(A,p);h!==u&&this.registerEntry(A,h)}prepareCopyFile(r,o,a=0){if(this.readOnly)throw ar.EROFS(`copyfile '${r} -> '${o}'`);if((a&ta.constants.COPYFILE_FICLONE_FORCE)!==0)throw ar.ENOSYS("unsupported clone operation",`copyfile '${r}' -> ${o}'`);let n=this.resolveFilename(`copyfile '${r} -> ${o}'`,r),u=this.entries.get(n);if(typeof u>"u")throw ar.EINVAL(`copyfile '${r}' -> '${o}'`);let A=this.resolveFilename(`copyfile '${r}' -> ${o}'`,o),p=this.entries.get(A);if((a&(ta.constants.COPYFILE_EXCL|ta.constants.COPYFILE_FICLONE_FORCE))!==0&&typeof p<"u")throw ar.EEXIST(`copyfile '${r}' -> '${o}'`);return{indexSource:u,resolvedDestP:A,indexDest:p}}async appendFilePromise(r,o,a){if(this.readOnly)throw ar.EROFS(`open '${r}'`);return typeof a>"u"?a={flag:"a"}:typeof a=="string"?a={flag:"a",encoding:a}:typeof a.flag>"u"&&(a={flag:"a",...a}),this.writeFilePromise(r,o,a)}appendFileSync(r,o,a={}){if(this.readOnly)throw ar.EROFS(`open '${r}'`);return typeof a>"u"?a={flag:"a"}:typeof a=="string"?a={flag:"a",encoding:a}:typeof a.flag>"u"&&(a={flag:"a",...a}),this.writeFileSync(r,o,a)}fdToPath(r,o){let a=this.fds.get(r)?.p;if(typeof a>"u")throw ar.EBADF(o);return a}async writeFilePromise(r,o,a){let{encoding:n,mode:u,index:A,resolvedP:p}=this.prepareWriteFile(r,a);A!==void 0&&typeof a=="object"&&a.flag&&a.flag.includes("a")&&(o=Buffer.concat([await this.getFileSource(A,{asyncDecompress:!0}),Buffer.from(o)])),n!==null&&(o=o.toString(n));let h=this.setFileSource(p,o);h!==A&&this.registerEntry(p,h),u!==null&&await this.chmodPromise(p,u)}writeFileSync(r,o,a){let{encoding:n,mode:u,index:A,resolvedP:p}=this.prepareWriteFile(r,a);A!==void 0&&typeof a=="object"&&a.flag&&a.flag.includes("a")&&(o=Buffer.concat([this.getFileSource(A),Buffer.from(o)])),n!==null&&(o=o.toString(n));let h=this.setFileSource(p,o);h!==A&&this.registerEntry(p,h),u!==null&&this.chmodSync(p,u)}prepareWriteFile(r,o){if(typeof r=="number"&&(r=this.fdToPath(r,"read")),this.readOnly)throw ar.EROFS(`open '${r}'`);let a=this.resolveFilename(`open '${r}'`,r);if(this.listings.has(a))throw ar.EISDIR(`open '${r}'`);let n=null,u=null;typeof o=="string"?n=o:typeof o=="object"&&({encoding:n=null,mode:u=null}=o);let A=this.entries.get(a);return{encoding:n,mode:u,resolvedP:a,index:A}}async unlinkPromise(r){return this.unlinkSync(r)}unlinkSync(r){if(this.readOnly)throw ar.EROFS(`unlink '${r}'`);let o=this.resolveFilename(`unlink '${r}'`,r);if(this.listings.has(o))throw ar.EISDIR(`unlink '${r}'`);let a=this.entries.get(o);if(typeof a>"u")throw ar.EINVAL(`unlink '${r}'`);this.deleteEntry(o,a)}async utimesPromise(r,o,a){return this.utimesSync(r,o,a)}utimesSync(r,o,a){if(this.readOnly)throw ar.EROFS(`utimes '${r}'`);let n=this.resolveFilename(`utimes '${r}'`,r);this.utimesImpl(n,a)}async lutimesPromise(r,o,a){return this.lutimesSync(r,o,a)}lutimesSync(r,o,a){if(this.readOnly)throw ar.EROFS(`lutimes '${r}'`);let n=this.resolveFilename(`utimes '${r}'`,r,!1);this.utimesImpl(n,a)}utimesImpl(r,o){this.listings.has(r)&&(this.entries.has(r)||this.hydrateDirectory(r));let a=this.entries.get(r);if(a===void 0)throw new Error("Unreachable");if(this.libzip.file.setMtime(this.zip,a,0,pot(o),0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async mkdirPromise(r,o){return this.mkdirSync(r,o)}mkdirSync(r,{mode:o=493,recursive:a=!1}={}){if(a)return this.mkdirpSync(r,{chmod:o});if(this.readOnly)throw ar.EROFS(`mkdir '${r}'`);let n=this.resolveFilename(`mkdir '${r}'`,r);if(this.entries.has(n)||this.listings.has(n))throw ar.EEXIST(`mkdir '${r}'`);this.hydrateDirectory(n),this.chmodSync(n,o)}async rmdirPromise(r,o){return this.rmdirSync(r,o)}rmdirSync(r,{recursive:o=!1}={}){if(this.readOnly)throw ar.EROFS(`rmdir '${r}'`);if(o){this.removeSync(r);return}let a=this.resolveFilename(`rmdir '${r}'`,r),n=this.listings.get(a);if(!n)throw ar.ENOTDIR(`rmdir '${r}'`);if(n.size>0)throw ar.ENOTEMPTY(`rmdir '${r}'`);let u=this.entries.get(a);if(typeof u>"u")throw ar.EINVAL(`rmdir '${r}'`);this.deleteEntry(r,u)}hydrateDirectory(r){let o=this.libzip.dir.add(this.zip,K.relative(Bt.root,r));if(o===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.registerListing(r),this.registerEntry(r,o),o}async linkPromise(r,o){return this.linkSync(r,o)}linkSync(r,o){throw ar.EOPNOTSUPP(`link '${r}' -> '${o}'`)}async symlinkPromise(r,o){return this.symlinkSync(r,o)}symlinkSync(r,o){if(this.readOnly)throw ar.EROFS(`symlink '${r}' -> '${o}'`);let a=this.resolveFilename(`symlink '${r}' -> '${o}'`,o);if(this.listings.has(a))throw ar.EISDIR(`symlink '${r}' -> '${o}'`);if(this.entries.has(a))throw ar.EEXIST(`symlink '${r}' -> '${o}'`);let n=this.setFileSource(a,r);if(this.registerEntry(a,n),this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,(ta.constants.S_IFLNK|511)<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.symlinkCount+=1}async readFilePromise(r,o){typeof o=="object"&&(o=o?o.encoding:void 0);let a=await this.readFileBuffer(r,{asyncDecompress:!0});return o?a.toString(o):a}readFileSync(r,o){typeof o=="object"&&(o=o?o.encoding:void 0);let a=this.readFileBuffer(r);return o?a.toString(o):a}readFileBuffer(r,o={asyncDecompress:!1}){typeof r=="number"&&(r=this.fdToPath(r,"read"));let a=this.resolveFilename(`open '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw ar.ENOENT(`open '${r}'`);if(r[r.length-1]==="/"&&!this.listings.has(a))throw ar.ENOTDIR(`open '${r}'`);if(this.listings.has(a))throw ar.EISDIR("read");let n=this.entries.get(a);if(n===void 0)throw new Error("Unreachable");return this.getFileSource(n,o)}async readdirPromise(r,o){return this.readdirSync(r,o)}readdirSync(r,o){let a=this.resolveFilename(`scandir '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw ar.ENOENT(`scandir '${r}'`);let n=this.listings.get(a);if(!n)throw ar.ENOTDIR(`scandir '${r}'`);if(o?.recursive)if(o?.withFileTypes){let u=Array.from(n,A=>Object.assign(this.statImpl("lstat",K.join(r,A)),{name:A,path:Bt.dot}));for(let A of u){if(!A.isDirectory())continue;let p=K.join(A.path,A.name),h=this.listings.get(K.join(a,p));for(let E of h)u.push(Object.assign(this.statImpl("lstat",K.join(r,p,E)),{name:E,path:p}))}return u}else{let u=[...n];for(let A of u){let p=this.listings.get(K.join(a,A));if(!(typeof p>"u"))for(let h of p)u.push(K.join(A,h))}return u}else return o?.withFileTypes?Array.from(n,u=>Object.assign(this.statImpl("lstat",K.join(r,u)),{name:u,path:void 0})):[...n]}async readlinkPromise(r){let o=this.prepareReadlink(r);return(await this.getFileSource(o,{asyncDecompress:!0})).toString()}readlinkSync(r){let o=this.prepareReadlink(r);return this.getFileSource(o).toString()}prepareReadlink(r){let o=this.resolveFilename(`readlink '${r}'`,r,!1);if(!this.entries.has(o)&&!this.listings.has(o))throw ar.ENOENT(`readlink '${r}'`);if(r[r.length-1]==="/"&&!this.listings.has(o))throw ar.ENOTDIR(`open '${r}'`);if(this.listings.has(o))throw ar.EINVAL(`readlink '${r}'`);let a=this.entries.get(o);if(a===void 0)throw new Error("Unreachable");if(!this.isSymbolicLink(a))throw ar.EINVAL(`readlink '${r}'`);return a}async truncatePromise(r,o=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.entries.get(a);if(typeof n>"u")throw ar.EINVAL(`open '${r}'`);let u=await this.getFileSource(n,{asyncDecompress:!0}),A=Buffer.alloc(o,0);return u.copy(A),await this.writeFilePromise(r,A)}truncateSync(r,o=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.entries.get(a);if(typeof n>"u")throw ar.EINVAL(`open '${r}'`);let u=this.getFileSource(n),A=Buffer.alloc(o,0);return u.copy(A),this.writeFileSync(r,A)}async ftruncatePromise(r,o){return this.truncatePromise(this.fdToPath(r,"ftruncate"),o)}ftruncateSync(r,o){return this.truncateSync(this.fdToPath(r,"ftruncateSync"),o)}watch(r,o,a){let n;switch(typeof o){case"function":case"string":case"undefined":n=!0;break;default:({persistent:n=!0}=o);break}if(!n)return{on:()=>{},close:()=>{}};let u=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(u)}}}watchFile(r,o,a){let n=K.resolve(Bt.root,r);return ry(this,n,o,a)}unwatchFile(r,o){let a=K.resolve(Bt.root,r);return Mg(this,a,o)}}});function jle(t,e,r=Buffer.alloc(0),o){let a=new zi(r),n=I=>I===e||I.startsWith(`${e}/`)?I.slice(0,e.length):null,u=async(I,v)=>()=>a,A=(I,v)=>a,p={...t},h=new Rn(p),E=new _p({baseFs:h,getMountPoint:n,factoryPromise:u,factorySync:A,magicByte:21,maxAge:1/0,typeCheck:o?.typeCheck});return Ww(Hle.default,new Hp(E)),a}var Hle,qle=Et(()=>{Pt();Hle=$e(Be("fs"));aU()});var Gle=Et(()=>{Ole();aU();qle()});var x1={};Kt(x1,{DEFAULT_COMPRESSION_LEVEL:()=>_le,LibzipError:()=>Rx,ZipFS:()=>zi,ZipOpenFS:()=>Jl,getArchivePart:()=>iU,getLibzipPromise:()=>got,getLibzipSync:()=>hot,makeEmptyArchive:()=>Tx,mountMemoryDrive:()=>jle});function hot(){return S1()}async function got(){return S1()}var Yle,nA=Et(()=>{tU();Yle=$e(Rle());Mle();Gle();Tle(()=>{let t=(0,Yle.default)();return Lle(t)})});var FE,Wle=Et(()=>{Pt();qt();b1();FE=class extends nt{constructor(){super(...arguments);this.cwd=ge.String("--cwd",process.cwd(),{description:"The directory to run the command in"});this.commandName=ge.String();this.args=ge.Proxy()}async execute(){let r=this.args.length>0?`${this.commandName} ${this.args.join(" ")}`:this.commandName;return await TE(r,[],{cwd:ue.toPortablePath(this.cwd),stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}};FE.usage={description:"run a command using yarn's portable shell",details:` + This command will run a command using Yarn's portable shell. + + Make sure to escape glob patterns, redirections, and other features that might be expanded by your own shell. + + Note: To escape something from Yarn's shell, you might have to escape it twice, the first time from your own shell. + + Note: Don't use this command in Yarn scripts, as Yarn's shell is automatically used. + + For a list of features, visit: https://github.com/yarnpkg/berry/blob/master/packages/yarnpkg-shell/README.md. + `,examples:[["Run a simple command","$0 echo Hello"],["Run a command with a glob pattern","$0 echo '*.js'"],["Run a command with a redirection","$0 echo Hello World '>' hello.txt"],["Run a command with an escaped glob pattern (The double escape is needed in Unix shells)",`$0 echo '"*.js"'`],["Run a command with a variable (Double quotes are needed in Unix shells, to prevent them from expanding the variable)",'$0 "GREETING=Hello echo $GREETING World"']]}});var al,Vle=Et(()=>{al=class extends Error{constructor(e){super(e),this.name="ShellError"}}});var Mx={};Kt(Mx,{fastGlobOptions:()=>zle,isBraceExpansion:()=>lU,isGlobPattern:()=>dot,match:()=>mot,micromatchOptions:()=>Lx});function dot(t){if(!Nx.default.scan(t,Lx).isGlob)return!1;try{Nx.default.parse(t,Lx)}catch{return!1}return!0}function mot(t,{cwd:e,baseFs:r}){return(0,Kle.default)(t,{...zle,cwd:ue.fromPortablePath(e),fs:TD(Jle.default,new Hp(r))})}function lU(t){return Nx.default.scan(t,Lx).isBrace}var Kle,Jle,Nx,Lx,zle,Xle=Et(()=>{Pt();Kle=$e(RS()),Jle=$e(Be("fs")),Nx=$e(Zo()),Lx={strictBrackets:!0},zle={onlyDirectories:!1,onlyFiles:!1}});function cU(){}function uU(){for(let t of bd)t.kill()}function tce(t,e,r,o){return a=>{let n=a[0]instanceof iA.Transform?"pipe":a[0],u=a[1]instanceof iA.Transform?"pipe":a[1],A=a[2]instanceof iA.Transform?"pipe":a[2],p=(0,$le.default)(t,e,{...o,stdio:[n,u,A]});return bd.add(p),bd.size===1&&(process.on("SIGINT",cU),process.on("SIGTERM",uU)),a[0]instanceof iA.Transform&&a[0].pipe(p.stdin),a[1]instanceof iA.Transform&&p.stdout.pipe(a[1],{end:!1}),a[2]instanceof iA.Transform&&p.stderr.pipe(a[2],{end:!1}),{stdin:p.stdin,promise:new Promise(h=>{p.on("error",E=>{switch(bd.delete(p),bd.size===0&&(process.off("SIGINT",cU),process.off("SIGTERM",uU)),E.code){case"ENOENT":a[2].write(`command not found: ${t} +`),h(127);break;case"EACCES":a[2].write(`permission denied: ${t} +`),h(128);break;default:a[2].write(`uncaught error: ${E.message} +`),h(1);break}}),p.on("close",E=>{bd.delete(p),bd.size===0&&(process.off("SIGINT",cU),process.off("SIGTERM",uU)),h(E!==null?E:129)})})}}}function rce(t){return e=>{let r=e[0]==="pipe"?new iA.PassThrough:e[0];return{stdin:r,promise:Promise.resolve().then(()=>t({stdin:r,stdout:e[1],stderr:e[2]}))}}}function Ox(t,e){return RE.start(t,e)}function Zle(t,e=null){let r=new iA.PassThrough,o=new ece.StringDecoder,a="";return r.on("data",n=>{let u=o.write(n),A;do if(A=u.indexOf(` +`),A!==-1){let p=a+u.substring(0,A);u=u.substring(A+1),a="",t(e!==null?`${e} ${p}`:p)}while(A!==-1);a+=u}),r.on("end",()=>{let n=o.end();n!==""&&t(e!==null?`${e} ${n}`:n)}),r}function nce(t,{prefix:e}){return{stdout:Zle(r=>t.stdout.write(`${r} +`),t.stdout.isTTY?e:null),stderr:Zle(r=>t.stderr.write(`${r} +`),t.stderr.isTTY?e:null)}}var $le,iA,ece,bd,zl,AU,RE,fU=Et(()=>{$le=$e(aR()),iA=Be("stream"),ece=Be("string_decoder"),bd=new Set;zl=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},AU=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");return this.stream}},RE=class{constructor(e,r){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=r}static start(e,{stdin:r,stdout:o,stderr:a}){let n=new RE(null,e);return n.stdin=r,n.stdout=o,n.stderr=a,n}pipeTo(e,r=1){let o=new RE(this,e),a=new AU;return o.pipe=a,o.stdout=this.stdout,o.stderr=this.stderr,(r&1)===1?this.stdout=a:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(r&2)===2?this.stderr=a:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),o}async exec(){let e=["ignore","ignore","ignore"];if(this.pipe)e[0]="pipe";else{if(this.stdin===null)throw new Error("Assertion failed: No input stream registered");e[0]=this.stdin.get()}let r;if(this.stdout===null)throw new Error("Assertion failed: No output stream registered");r=this.stdout,e[1]=r.get();let o;if(this.stderr===null)throw new Error("Assertion failed: No error stream registered");o=this.stderr,e[2]=o.get();let a=this.implementation(e);return this.pipe&&this.pipe.attach(a.stdin),await a.promise.then(n=>(r.close(),o.close(),n))}async run(){let e=[];for(let o=this;o;o=o.ancestor)e.push(o.exec());return(await Promise.all(e))[0]}}});var T1={};Kt(T1,{EntryCommand:()=>FE,ShellError:()=>al,execute:()=>TE,globUtils:()=>Mx});function ice(t,e,r){let o=new ll.PassThrough({autoDestroy:!0});switch(t){case 0:(e&1)===1&&r.stdin.pipe(o,{end:!1}),(e&2)===2&&r.stdin instanceof ll.Writable&&o.pipe(r.stdin,{end:!1});break;case 1:(e&1)===1&&r.stdout.pipe(o,{end:!1}),(e&2)===2&&o.pipe(r.stdout,{end:!1});break;case 2:(e&1)===1&&r.stderr.pipe(o,{end:!1}),(e&2)===2&&o.pipe(r.stderr,{end:!1});break;default:throw new al(`Bad file descriptor: "${t}"`)}return o}function _x(t,e={}){let r={...t,...e};return r.environment={...t.environment,...e.environment},r.variables={...t.variables,...e.variables},r}async function Eot(t,e,r){let o=[],a=new ll.PassThrough;return a.on("data",n=>o.push(n)),await Hx(t,e,_x(r,{stdout:a})),Buffer.concat(o).toString().replace(/[\r\n]+$/,"")}async function sce(t,e,r){let o=t.map(async n=>{let u=await kd(n.args,e,r);return{name:n.name,value:u.join(" ")}});return(await Promise.all(o)).reduce((n,u)=>(n[u.name]=u.value,n),{})}function Ux(t){return t.match(/[^ \r\n\t]+/g)||[]}async function Ace(t,e,r,o,a=o){switch(t.name){case"$":o(String(process.pid));break;case"#":o(String(e.args.length));break;case"@":if(t.quoted)for(let n of e.args)a(n);else for(let n of e.args){let u=Ux(n);for(let A=0;A=0&&n"u"&&(t.defaultValue?u=(await kd(t.defaultValue,e,r)).join(" "):t.alternativeValue&&(u="")),typeof u>"u")throw A?new al(`Unbound argument #${n}`):new al(`Unbound variable "${t.name}"`);if(t.quoted)o(u);else{let p=Ux(u);for(let E=0;Eo.push(n));let a=Number(o.join(" "));return Number.isNaN(a)?k1({type:"variable",name:o.join(" ")},e,r):k1({type:"number",value:a},e,r)}else return Cot[t.type](await k1(t.left,e,r),await k1(t.right,e,r))}async function kd(t,e,r){let o=new Map,a=[],n=[],u=E=>{n.push(E)},A=()=>{n.length>0&&a.push(n.join("")),n=[]},p=E=>{u(E),A()},h=(E,I,v)=>{let b=JSON.stringify({type:E,fd:I}),C=o.get(b);typeof C>"u"&&o.set(b,C=[]),C.push(v)};for(let E of t){let I=!1;switch(E.type){case"redirection":{let v=await kd(E.args,e,r);for(let b of v)h(E.subtype,E.fd,b)}break;case"argument":for(let v of E.segments)switch(v.type){case"text":u(v.text);break;case"glob":u(v.pattern),I=!0;break;case"shell":{let b=await Eot(v.shell,e,r);if(v.quoted)u(b);else{let C=Ux(b);for(let T=0;T"u")throw new Error("Assertion failed: Expected a glob pattern to have been set");let b=await e.glob.match(v,{cwd:r.cwd,baseFs:e.baseFs});if(b.length===0){let C=lU(v)?". Note: Brace expansion of arbitrary strings isn't currently supported. For more details, please read this issue: https://github.com/yarnpkg/berry/issues/22":"";throw new al(`No matches found: "${v}"${C}`)}for(let C of b.sort())p(C)}}if(o.size>0){let E=[];for(let[I,v]of o.entries())E.splice(E.length,0,I,String(v.length),...v);a.splice(0,0,"__ysh_set_redirects",...E,"--")}return a}function Q1(t,e,r){e.builtins.has(t[0])||(t=["command",...t]);let o=ue.fromPortablePath(r.cwd),a=r.environment;typeof a.PWD<"u"&&(a={...a,PWD:o});let[n,...u]=t;if(n==="command")return tce(u[0],u.slice(1),e,{cwd:o,env:a});let A=e.builtins.get(n);if(typeof A>"u")throw new Error(`Assertion failed: A builtin should exist for "${n}"`);return rce(async({stdin:p,stdout:h,stderr:E})=>{let{stdin:I,stdout:v,stderr:b}=r;r.stdin=p,r.stdout=h,r.stderr=E;try{return await A(u,e,r)}finally{r.stdin=I,r.stdout=v,r.stderr=b}})}function wot(t,e,r){return o=>{let a=new ll.PassThrough,n=Hx(t,e,_x(r,{stdin:a}));return{stdin:a,promise:n}}}function Iot(t,e,r){return o=>{let a=new ll.PassThrough,n=Hx(t,e,r);return{stdin:a,promise:n}}}function oce(t,e,r,o){if(e.length===0)return t;{let a;do a=String(Math.random());while(Object.hasOwn(o.procedures,a));return o.procedures={...o.procedures},o.procedures[a]=t,Q1([...e,"__ysh_run_procedure",a],r,o)}}async function ace(t,e,r){let o=t,a=null,n=null;for(;o;){let u=o.then?{...r}:r,A;switch(o.type){case"command":{let p=await kd(o.args,e,r),h=await sce(o.envs,e,r);A=o.envs.length?Q1(p,e,_x(u,{environment:h})):Q1(p,e,u)}break;case"subshell":{let p=await kd(o.args,e,r),h=wot(o.subshell,e,u);A=oce(h,p,e,u)}break;case"group":{let p=await kd(o.args,e,r),h=Iot(o.group,e,u);A=oce(h,p,e,u)}break;case"envs":{let p=await sce(o.envs,e,r);u.environment={...u.environment,...p},A=Q1(["true"],e,u)}break}if(typeof A>"u")throw new Error("Assertion failed: An action should have been generated");if(a===null)n=Ox(A,{stdin:new zl(u.stdin),stdout:new zl(u.stdout),stderr:new zl(u.stderr)});else{if(n===null)throw new Error("Assertion failed: The execution pipeline should have been setup");switch(a){case"|":n=n.pipeTo(A,1);break;case"|&":n=n.pipeTo(A,3);break}}o.then?(a=o.then.type,o=o.then.chain):o=null}if(n===null)throw new Error("Assertion failed: The execution pipeline should have been setup");return await n.run()}async function Bot(t,e,r,{background:o=!1}={}){function a(n){let u=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],A=u[n%u.length];return lce.default.hex(A)}if(o){let n=r.nextBackgroundJobIndex++,u=a(n),A=`[${n}]`,p=u(A),{stdout:h,stderr:E}=nce(r,{prefix:p});return r.backgroundJobs.push(ace(t,e,_x(r,{stdout:h,stderr:E})).catch(I=>E.write(`${I.message} +`)).finally(()=>{r.stdout.isTTY&&r.stdout.write(`Job ${p}, '${u(cy(t))}' has ended +`)})),0}return await ace(t,e,r)}async function vot(t,e,r,{background:o=!1}={}){let a,n=A=>{a=A,r.variables["?"]=String(A)},u=async A=>{try{return await Bot(A.chain,e,r,{background:o&&typeof A.then>"u"})}catch(p){if(!(p instanceof al))throw p;return r.stderr.write(`${p.message} +`),1}};for(n(await u(t));t.then;){if(r.exitCode!==null)return r.exitCode;switch(t.then.type){case"&&":a===0&&n(await u(t.then.line));break;case"||":a!==0&&n(await u(t.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: "${t.then.type}"`)}t=t.then.line}return a}async function Hx(t,e,r){let o=r.backgroundJobs;r.backgroundJobs=[];let a=0;for(let{command:n,type:u}of t){if(a=await vot(n,e,r,{background:u==="&"}),r.exitCode!==null)return r.exitCode;r.variables["?"]=String(a)}return await Promise.all(r.backgroundJobs),r.backgroundJobs=o,a}function fce(t){switch(t.type){case"variable":return t.name==="@"||t.name==="#"||t.name==="*"||Number.isFinite(parseInt(t.name,10))||"defaultValue"in t&&!!t.defaultValue&&t.defaultValue.some(e=>F1(e))||"alternativeValue"in t&&!!t.alternativeValue&&t.alternativeValue.some(e=>F1(e));case"arithmetic":return pU(t.arithmetic);case"shell":return hU(t.shell);default:return!1}}function F1(t){switch(t.type){case"redirection":return t.args.some(e=>F1(e));case"argument":return t.segments.some(e=>fce(e));default:throw new Error(`Assertion failed: Unsupported argument type: "${t.type}"`)}}function pU(t){switch(t.type){case"variable":return fce(t);case"number":return!1;default:return pU(t.left)||pU(t.right)}}function hU(t){return t.some(({command:e})=>{for(;e;){let r=e.chain;for(;r;){let o;switch(r.type){case"subshell":o=hU(r.subshell);break;case"command":o=r.envs.some(a=>a.args.some(n=>F1(n)))||r.args.some(a=>F1(a));break}if(o)return!0;if(!r.then)break;r=r.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function TE(t,e=[],{baseFs:r=new Rn,builtins:o={},cwd:a=ue.toPortablePath(process.cwd()),env:n=process.env,stdin:u=process.stdin,stdout:A=process.stdout,stderr:p=process.stderr,variables:h={},glob:E=Mx}={}){let I={};for(let[C,T]of Object.entries(n))typeof T<"u"&&(I[C]=T);let v=new Map(yot);for(let[C,T]of Object.entries(o))v.set(C,T);u===null&&(u=new ll.PassThrough,u.end());let b=LD(t,E);if(!hU(b)&&b.length>0&&e.length>0){let{command:C}=b[b.length-1];for(;C.then;)C=C.then.line;let T=C.chain;for(;T.then;)T=T.then.chain;T.type==="command"&&(T.args=T.args.concat(e.map(L=>({type:"argument",segments:[{type:"text",text:L}]}))))}return await Hx(b,{args:e,baseFs:r,builtins:v,initialStdin:u,initialStdout:A,initialStderr:p,glob:E},{cwd:a,environment:I,exitCode:null,procedures:{},stdin:u,stdout:A,stderr:p,variables:Object.assign({},h,{["?"]:0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var lce,cce,ll,uce,yot,Cot,b1=Et(()=>{Pt();Nl();lce=$e(vN()),cce=Be("os"),ll=Be("stream"),uce=Be("timers/promises");Wle();Vle();Xle();fU();fU();yot=new Map([["cd",async([t=(0,cce.homedir)(),...e],r,o)=>{let a=K.resolve(o.cwd,ue.toPortablePath(t));if(!(await r.baseFs.statPromise(a).catch(u=>{throw u.code==="ENOENT"?new al(`cd: no such file or directory: ${t}`):u})).isDirectory())throw new al(`cd: not a directory: ${t}`);return o.cwd=a,0}],["pwd",async(t,e,r)=>(r.stdout.write(`${ue.fromPortablePath(r.cwd)} +`),0)],[":",async(t,e,r)=>0],["true",async(t,e,r)=>0],["false",async(t,e,r)=>1],["exit",async([t,...e],r,o)=>o.exitCode=parseInt(t??o.variables["?"],10)],["echo",async(t,e,r)=>(r.stdout.write(`${t.join(" ")} +`),0)],["sleep",async([t],e,r)=>{if(typeof t>"u")throw new al("sleep: missing operand");let o=Number(t);if(Number.isNaN(o))throw new al(`sleep: invalid time interval '${t}'`);return await(0,uce.setTimeout)(1e3*o,0)}],["__ysh_run_procedure",async(t,e,r)=>{let o=r.procedures[t[0]];return await Ox(o,{stdin:new zl(r.stdin),stdout:new zl(r.stdout),stderr:new zl(r.stderr)}).run()}],["__ysh_set_redirects",async(t,e,r)=>{let o=r.stdin,a=r.stdout,n=r.stderr,u=[],A=[],p=[],h=0;for(;t[h]!=="--";){let I=t[h++],{type:v,fd:b}=JSON.parse(I),C=J=>{switch(b){case null:case 0:u.push(J);break;default:throw new Error(`Unsupported file descriptor: "${b}"`)}},T=J=>{switch(b){case null:case 1:A.push(J);break;case 2:p.push(J);break;default:throw new Error(`Unsupported file descriptor: "${b}"`)}},L=Number(t[h++]),U=h+L;for(let J=h;Je.baseFs.createReadStream(K.resolve(r.cwd,ue.toPortablePath(t[J]))));break;case"<<<":C(()=>{let te=new ll.PassThrough;return process.nextTick(()=>{te.write(`${t[J]} +`),te.end()}),te});break;case"<&":C(()=>ice(Number(t[J]),1,r));break;case">":case">>":{let te=K.resolve(r.cwd,ue.toPortablePath(t[J]));T(te==="/dev/null"?new ll.Writable({autoDestroy:!0,emitClose:!0,write(le,pe,Ae){setImmediate(Ae)}}):e.baseFs.createWriteStream(te,v===">>"?{flags:"a"}:void 0))}break;case">&":T(ice(Number(t[J]),2,r));break;default:throw new Error(`Assertion failed: Unsupported redirection type: "${v}"`)}}if(u.length>0){let I=new ll.PassThrough;o=I;let v=b=>{if(b===u.length)I.end();else{let C=u[b]();C.pipe(I,{end:!1}),C.on("end",()=>{v(b+1)})}};v(0)}if(A.length>0){let I=new ll.PassThrough;a=I;for(let v of A)I.pipe(v)}if(p.length>0){let I=new ll.PassThrough;n=I;for(let v of p)I.pipe(v)}let E=await Ox(Q1(t.slice(h+1),e,r),{stdin:new zl(o),stdout:new zl(a),stderr:new zl(n)}).run();return await Promise.all(A.map(I=>new Promise((v,b)=>{I.on("error",C=>{b(C)}),I.on("close",()=>{v()}),I.end()}))),await Promise.all(p.map(I=>new Promise((v,b)=>{I.on("error",C=>{b(C)}),I.on("close",()=>{v()}),I.end()}))),E}]]);Cot={addition:(t,e)=>t+e,subtraction:(t,e)=>t-e,multiplication:(t,e)=>t*e,division:(t,e)=>Math.trunc(t/e)}});var jx=_((n4t,pce)=>{function Dot(t,e){for(var r=-1,o=t==null?0:t.length,a=Array(o);++r{var hce=fd(),Pot=jx(),Sot=Hl(),xot=fE(),bot=1/0,gce=hce?hce.prototype:void 0,dce=gce?gce.toString:void 0;function mce(t){if(typeof t=="string")return t;if(Sot(t))return Pot(t,mce)+"";if(xot(t))return dce?dce.call(t):"";var e=t+"";return e=="0"&&1/t==-bot?"-0":e}yce.exports=mce});var R1=_((s4t,Cce)=>{var kot=Ece();function Qot(t){return t==null?"":kot(t)}Cce.exports=Qot});var gU=_((o4t,wce)=>{function Fot(t,e,r){var o=-1,a=t.length;e<0&&(e=-e>a?0:a+e),r=r>a?a:r,r<0&&(r+=a),a=e>r?0:r-e>>>0,e>>>=0;for(var n=Array(a);++o{var Tot=gU();function Rot(t,e,r){var o=t.length;return r=r===void 0?o:r,!e&&r>=o?t:Tot(t,e,r)}Ice.exports=Rot});var dU=_((l4t,vce)=>{var Not="\\ud800-\\udfff",Lot="\\u0300-\\u036f",Mot="\\ufe20-\\ufe2f",Oot="\\u20d0-\\u20ff",Uot=Lot+Mot+Oot,_ot="\\ufe0e\\ufe0f",Hot="\\u200d",jot=RegExp("["+Hot+Not+Uot+_ot+"]");function qot(t){return jot.test(t)}vce.exports=qot});var Pce=_((c4t,Dce)=>{function Got(t){return t.split("")}Dce.exports=Got});var Rce=_((u4t,Tce)=>{var Sce="\\ud800-\\udfff",Yot="\\u0300-\\u036f",Wot="\\ufe20-\\ufe2f",Vot="\\u20d0-\\u20ff",Kot=Yot+Wot+Vot,Jot="\\ufe0e\\ufe0f",zot="["+Sce+"]",mU="["+Kot+"]",yU="\\ud83c[\\udffb-\\udfff]",Xot="(?:"+mU+"|"+yU+")",xce="[^"+Sce+"]",bce="(?:\\ud83c[\\udde6-\\uddff]){2}",kce="[\\ud800-\\udbff][\\udc00-\\udfff]",Zot="\\u200d",Qce=Xot+"?",Fce="["+Jot+"]?",$ot="(?:"+Zot+"(?:"+[xce,bce,kce].join("|")+")"+Fce+Qce+")*",eat=Fce+Qce+$ot,tat="(?:"+[xce+mU+"?",mU,bce,kce,zot].join("|")+")",rat=RegExp(yU+"(?="+yU+")|"+tat+eat,"g");function nat(t){return t.match(rat)||[]}Tce.exports=nat});var Lce=_((A4t,Nce)=>{var iat=Pce(),sat=dU(),oat=Rce();function aat(t){return sat(t)?oat(t):iat(t)}Nce.exports=aat});var Oce=_((f4t,Mce)=>{var lat=Bce(),cat=dU(),uat=Lce(),Aat=R1();function fat(t){return function(e){e=Aat(e);var r=cat(e)?uat(e):void 0,o=r?r[0]:e.charAt(0),a=r?lat(r,1).join(""):e.slice(1);return o[t]()+a}}Mce.exports=fat});var _ce=_((p4t,Uce)=>{var pat=Oce(),hat=pat("toUpperCase");Uce.exports=hat});var EU=_((h4t,Hce)=>{var gat=R1(),dat=_ce();function mat(t){return dat(gat(t).toLowerCase())}Hce.exports=mat});var jce=_((g4t,qx)=>{function yat(){var t=0,e=1,r=2,o=3,a=4,n=5,u=6,A=7,p=8,h=9,E=10,I=11,v=12,b=13,C=14,T=15,L=16,U=17,J=0,te=1,le=2,pe=3,Ae=4;function ye(g,Ee){return 55296<=g.charCodeAt(Ee)&&g.charCodeAt(Ee)<=56319&&56320<=g.charCodeAt(Ee+1)&&g.charCodeAt(Ee+1)<=57343}function ae(g,Ee){Ee===void 0&&(Ee=0);var De=g.charCodeAt(Ee);if(55296<=De&&De<=56319&&Ee=1){var ce=g.charCodeAt(Ee-1),ne=De;return 55296<=ce&&ce<=56319?(ce-55296)*1024+(ne-56320)+65536:ne}return De}function we(g,Ee,De){var ce=[g].concat(Ee).concat([De]),ne=ce[ce.length-2],ee=De,Ie=ce.lastIndexOf(C);if(Ie>1&&ce.slice(1,Ie).every(function(H){return H==o})&&[o,b,U].indexOf(g)==-1)return le;var ke=ce.lastIndexOf(a);if(ke>0&&ce.slice(1,ke).every(function(H){return H==a})&&[v,a].indexOf(ne)==-1)return ce.filter(function(H){return H==a}).length%2==1?pe:Ae;if(ne==t&&ee==e)return J;if(ne==r||ne==t||ne==e)return ee==C&&Ee.every(function(H){return H==o})?le:te;if(ee==r||ee==t||ee==e)return te;if(ne==u&&(ee==u||ee==A||ee==h||ee==E))return J;if((ne==h||ne==A)&&(ee==A||ee==p))return J;if((ne==E||ne==p)&&ee==p)return J;if(ee==o||ee==T)return J;if(ee==n)return J;if(ne==v)return J;var ht=ce.indexOf(o)!=-1?ce.lastIndexOf(o)-1:ce.length-2;return[b,U].indexOf(ce[ht])!=-1&&ce.slice(ht+1,-1).every(function(H){return H==o})&&ee==C||ne==T&&[L,U].indexOf(ee)!=-1?J:Ee.indexOf(a)!=-1?le:ne==a&&ee==a?J:te}this.nextBreak=function(g,Ee){if(Ee===void 0&&(Ee=0),Ee<0)return 0;if(Ee>=g.length-1)return g.length;for(var De=Pe(ae(g,Ee)),ce=[],ne=Ee+1;ne{var Eat=/^(.*?)(\x1b\[[^m]+m|\x1b\]8;;.*?(\x1b\\|\u0007))/,Gx;function Cat(){if(Gx)return Gx;if(typeof Intl.Segmenter<"u"){let t=new Intl.Segmenter("en",{granularity:"grapheme"});return Gx=e=>Array.from(t.segment(e),({segment:r})=>r)}else{let t=jce(),e=new t;return Gx=r=>e.splitGraphemes(r)}}qce.exports=(t,e=0,r=t.length)=>{if(e<0||r<0)throw new RangeError("Negative indices aren't supported by this implementation");let o=r-e,a="",n=0,u=0;for(;t.length>0;){let A=t.match(Eat)||[t,t,void 0],p=Cat()(A[1]),h=Math.min(e-n,p.length);p=p.slice(h);let E=Math.min(o-u,p.length);a+=p.slice(0,E).join(""),n+=h,u+=E,typeof A[2]<"u"&&(a+=A[2]),t=t.slice(A[0].length)}return a}});var tn,N1=Et(()=>{tn=process.env.YARN_IS_TEST_ENV?"0.0.0":"4.0.2"});function zce(t,{configuration:e,json:r}){if(!e.get("enableMessageNames"))return"";let a=Wu(t===null?0:t);return!r&&t===null?Ot(e,a,"grey"):a}function CU(t,{configuration:e,json:r}){let o=zce(t,{configuration:e,json:r});if(!o||t===null||t===0)return o;let a=wr[t],n=`https://yarnpkg.com/advanced/error-codes#${o}---${a}`.toLowerCase();return Xy(e,o,n)}async function NE({configuration:t,stdout:e,forceError:r},o){let a=await Nt.start({configuration:t,stdout:e,includeFooter:!1},async n=>{let u=!1,A=!1;for(let p of o)typeof p.option<"u"&&(p.error||r?(A=!0,n.reportError(50,p.message)):(u=!0,n.reportWarning(50,p.message)),p.callback?.());u&&!A&&n.reportSeparator()});return a.hasErrors()?a.exitCode():null}var Kce,Yx,wat,Yce,Wce,uh,Jce,Vce,Iat,Bat,Wx,vat,Nt,L1=Et(()=>{Kce=$e(Gce()),Yx=$e(ed());pP();Yl();N1();ql();wat="\xB7",Yce=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Wce=80,uh=Yx.default.GITHUB_ACTIONS?{start:t=>`::group::${t} +`,end:t=>`::endgroup:: +`}:Yx.default.TRAVIS?{start:t=>`travis_fold:start:${t} +`,end:t=>`travis_fold:end:${t} +`}:Yx.default.GITLAB?{start:t=>`section_start:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}[collapsed=true]\r\x1B[0K${t} +`,end:t=>`section_end:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}\r\x1B[0K`}:null,Jce=uh!==null,Vce=new Date,Iat=["iTerm.app","Apple_Terminal","WarpTerminal","vscode"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,Bat=t=>t,Wx=Bat({patrick:{date:[17,3],chars:["\u{1F340}","\u{1F331}"],size:40},simba:{date:[19,7],chars:["\u{1F981}","\u{1F334}"],size:40},jack:{date:[31,10],chars:["\u{1F383}","\u{1F987}"],size:40},hogsfather:{date:[31,12],chars:["\u{1F389}","\u{1F384}"],size:40},default:{chars:["=","-"],size:80}}),vat=Iat&&Object.keys(Wx).find(t=>{let e=Wx[t];return!(e.date&&(e.date[0]!==Vce.getDate()||e.date[1]!==Vce.getMonth()+1))})||"default";Nt=class extends Xs{constructor({configuration:r,stdout:o,json:a=!1,forceSectionAlignment:n=!1,includeNames:u=!0,includePrefix:A=!0,includeFooter:p=!0,includeLogs:h=!a,includeInfos:E=h,includeWarnings:I=h}){super();this.uncommitted=new Set;this.warningCount=0;this.errorCount=0;this.timerFooter=[];this.startTime=Date.now();this.indent=0;this.level=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.progressStyle=null;this.progressMaxScaledSize=null;if(zI(this,{configuration:r}),this.configuration=r,this.forceSectionAlignment=n,this.includeNames=u,this.includePrefix=A,this.includeFooter=p,this.includeInfos=E,this.includeWarnings=I,this.json=a,this.stdout=o,r.get("enableProgressBars")&&!a&&o.isTTY&&o.columns>22){let v=r.get("progressBarStyle")||vat;if(!Object.hasOwn(Wx,v))throw new Error("Assertion failed: Invalid progress bar style");this.progressStyle=Wx[v];let b=Math.min(this.getRecommendedLength(),80);this.progressMaxScaledSize=Math.floor(this.progressStyle.size*b/80)}}static async start(r,o){let a=new this(r),n=process.emitWarning;process.emitWarning=(u,A)=>{if(typeof u!="string"){let h=u;u=h.message,A=A??h.name}let p=typeof A<"u"?`${A}: ${u}`:u;a.reportWarning(0,p)},r.includeVersion&&a.reportInfo(0,md(r.configuration,`Yarn ${tn}`,2));try{await o(a)}catch(u){a.reportExceptionOnce(u)}finally{await a.finalize(),process.emitWarning=n}return a}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}getRecommendedLength(){let o=this.progressStyle!==null?this.stdout.columns-1:super.getRecommendedLength();return Math.max(40,o-12-this.indent*2)}startSectionSync({reportHeader:r,reportFooter:o,skipIfEmpty:a},n){let u={committed:!1,action:()=>{r?.()}};a?this.uncommitted.add(u):(u.action(),u.committed=!0);let A=Date.now();try{return n()}catch(p){throw this.reportExceptionOnce(p),p}finally{let p=Date.now();this.uncommitted.delete(u),u.committed&&o?.(p-A)}}async startSectionPromise({reportHeader:r,reportFooter:o,skipIfEmpty:a},n){let u={committed:!1,action:()=>{r?.()}};a?this.uncommitted.add(u):(u.action(),u.committed=!0);let A=Date.now();try{return await n()}catch(p){throw this.reportExceptionOnce(p),p}finally{let p=Date.now();this.uncommitted.delete(u),u.committed&&o?.(p-A)}}startTimerImpl(r,o,a){return{cb:typeof o=="function"?o:a,reportHeader:()=>{this.level+=1,this.reportInfo(null,`\u250C ${r}`),this.indent+=1,uh!==null&&!this.json&&this.includeInfos&&this.stdout.write(uh.start(r))},reportFooter:A=>{if(this.indent-=1,uh!==null&&!this.json&&this.includeInfos){this.stdout.write(uh.end(r));for(let p of this.timerFooter)p()}this.configuration.get("enableTimers")&&A>200?this.reportInfo(null,`\u2514 Completed in ${Ot(this.configuration,A,yt.DURATION)}`):this.reportInfo(null,"\u2514 Completed"),this.level-=1},skipIfEmpty:(typeof o=="function"?{}:o).skipIfEmpty}}startTimerSync(r,o,a){let{cb:n,...u}=this.startTimerImpl(r,o,a);return this.startSectionSync(u,n)}async startTimerPromise(r,o,a){let{cb:n,...u}=this.startTimerImpl(r,o,a);return this.startSectionPromise(u,n)}reportSeparator(){this.indent===0?this.writeLine(""):this.reportInfo(null,"")}reportInfo(r,o){if(!this.includeInfos)return;this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"",u=`${this.formatPrefix(n,"blueBright")}${o}`;this.json?this.reportJson({type:"info",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:o}):this.writeLine(u)}reportWarning(r,o){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"";this.json?this.reportJson({type:"warning",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:o}):this.writeLine(`${this.formatPrefix(n,"yellowBright")}${o}`)}reportError(r,o){this.errorCount+=1,this.timerFooter.push(()=>this.reportErrorImpl(r,o)),this.reportErrorImpl(r,o)}reportErrorImpl(r,o){this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"";this.json?this.reportJson({type:"error",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:o}):this.writeLine(`${this.formatPrefix(n,"redBright")}${o}`,{truncate:!1})}reportFold(r,o){if(!uh)return;let a=`${uh.start(r)}${o}${uh.end(r)}`;this.timerFooter.push(()=>this.stdout.write(a))}reportProgress(r){if(this.progressStyle===null)return{...Promise.resolve(),stop:()=>{}};if(r.hasProgress&&r.hasTitle)throw new Error("Unimplemented: Progress bars can't have both progress and titles.");let o=!1,a=Promise.resolve().then(async()=>{let u={progress:r.hasProgress?0:void 0,title:r.hasTitle?"":void 0};this.progress.set(r,{definition:u,lastScaledSize:r.hasProgress?-1:void 0,lastTitle:void 0}),this.refreshProgress({delta:-1});for await(let{progress:A,title:p}of r)o||u.progress===A&&u.title===p||(u.progress=A,u.title=p,this.refreshProgress());n()}),n=()=>{o||(o=!0,this.progress.delete(r),this.refreshProgress({delta:1}))};return{...a,stop:n}}reportJson(r){this.json&&this.writeLine(`${JSON.stringify(r)}`)}async finalize(){if(!this.includeFooter)return;let r="";this.errorCount>0?r="Failed with errors":this.warningCount>0?r="Done with warnings":r="Done";let o=Ot(this.configuration,Date.now()-this.startTime,yt.DURATION),a=this.configuration.get("enableTimers")?`${r} in ${o}`:r;this.errorCount>0?this.reportError(0,a):this.warningCount>0?this.reportWarning(0,a):this.reportInfo(0,a)}writeLine(r,{truncate:o}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(r,{truncate:o})} +`),this.writeProgress()}writeLines(r,{truncate:o}={}){this.clearProgress({delta:r.length});for(let a of r)this.stdout.write(`${this.truncate(a,{truncate:o})} +`);this.writeProgress()}commit(){let r=this.uncommitted;this.uncommitted=new Set;for(let o of r)o.committed=!0,o.action()}clearProgress({delta:r=0,clear:o=!1}){this.progressStyle!==null&&this.progress.size+r>0&&(this.stdout.write(`\x1B[${this.progress.size+r}A`),(r>0||o)&&this.stdout.write("\x1B[0J"))}writeProgress(){if(this.progressStyle===null||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let r=Date.now();r-this.progressTime>Wce&&(this.progressFrame=(this.progressFrame+1)%Yce.length,this.progressTime=r);let o=Yce[this.progressFrame];for(let a of this.progress.values()){let n="";if(typeof a.lastScaledSize<"u"){let h=this.progressStyle.chars[0].repeat(a.lastScaledSize),E=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-a.lastScaledSize);n=` ${h}${E}`}let u=this.formatName(null),A=u?`${u}: `:"",p=a.definition.title?` ${a.definition.title}`:"";this.stdout.write(`${Ot(this.configuration,"\u27A4","blueBright")} ${A}${o}${n}${p} +`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress({force:!0})},Wce)}refreshProgress({delta:r=0,force:o=!1}={}){let a=!1,n=!1;if(o||this.progress.size===0)a=!0;else for(let u of this.progress.values()){let A=typeof u.definition.progress<"u"?Math.trunc(this.progressMaxScaledSize*u.definition.progress):void 0,p=u.lastScaledSize;u.lastScaledSize=A;let h=u.lastTitle;if(u.lastTitle=u.definition.title,A!==p||(n=h!==u.definition.title)){a=!0;break}}a&&(this.clearProgress({delta:r,clear:n}),this.writeProgress())}truncate(r,{truncate:o}={}){return this.progressStyle===null&&(o=!1),typeof o>"u"&&(o=this.configuration.get("preferTruncatedLines")),o&&(r=(0,Kce.default)(r,0,this.stdout.columns-1)),r}formatName(r){return this.includeNames?zce(r,{configuration:this.configuration,json:this.json}):""}formatPrefix(r,o){return this.includePrefix?`${Ot(this.configuration,"\u27A4",o)} ${r}${this.formatIndent()}`:""}formatNameWithHyperlink(r){return this.includeNames?CU(r,{configuration:this.configuration,json:this.json}):""}formatIndent(){return this.level>0||!this.forceSectionAlignment?"\u2502 ".repeat(this.indent):`${wat} `}}});var un={};Kt(un,{PackageManager:()=>$ce,detectPackageManager:()=>eue,executePackageAccessibleBinary:()=>sue,executePackageScript:()=>Vx,executePackageShellcode:()=>wU,executeWorkspaceAccessibleBinary:()=>Qat,executeWorkspaceLifecycleScript:()=>nue,executeWorkspaceScript:()=>rue,getPackageAccessibleBinaries:()=>Kx,getWorkspaceAccessibleBinaries:()=>iue,hasPackageScript:()=>xat,hasWorkspaceScript:()=>IU,isNodeScript:()=>BU,makeScriptEnv:()=>M1,maybeExecuteWorkspaceLifecycleScript:()=>kat,prepareExternalProject:()=>Sat});async function Ah(t,e,r,o=[]){if(process.platform==="win32"){let a=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @"${r}" ${o.map(n=>`"${n.replace('"','""')}"`).join(" ")} %*`;await oe.writeFilePromise(K.format({dir:t,name:e,ext:".cmd"}),a)}await oe.writeFilePromise(K.join(t,e),`#!/bin/sh +exec "${r}" ${o.map(a=>`'${a.replace(/'/g,`'"'"'`)}'`).join(" ")} "$@" +`,{mode:493})}async function eue(t){let e=await Mt.tryFind(t);if(e?.packageManager){let o=_S(e.packageManager);if(o?.name){let a=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[n]=o.reference.split(".");switch(o.name){case"yarn":return{packageManagerField:!0,packageManager:Number(n)===1?"Yarn Classic":"Yarn",reason:a};case"npm":return{packageManagerField:!0,packageManager:"npm",reason:a};case"pnpm":return{packageManagerField:!0,packageManager:"pnpm",reason:a}}}}let r;try{r=await oe.readFilePromise(K.join(t,dr.lockfile),"utf8")}catch{}return r!==void 0?r.match(/^__metadata:$/m)?{packageManager:"Yarn",reason:'"__metadata" key found in yarn.lock'}:{packageManager:"Yarn Classic",reason:'"__metadata" key not found in yarn.lock, must be a Yarn classic lockfile'}:oe.existsSync(K.join(t,"package-lock.json"))?{packageManager:"npm",reason:`found npm's "package-lock.json" lockfile`}:oe.existsSync(K.join(t,"pnpm-lock.yaml"))?{packageManager:"pnpm",reason:`found pnpm's "pnpm-lock.yaml" lockfile`}:null}async function M1({project:t,locator:e,binFolder:r,ignoreCorepack:o,lifecycleScript:a,baseEnv:n=t?.configuration.env??process.env}){let u={};for(let[E,I]of Object.entries(n))typeof I<"u"&&(u[E.toLowerCase()!=="path"?E:"PATH"]=I);let A=ue.fromPortablePath(r);u.BERRY_BIN_FOLDER=ue.fromPortablePath(A);let p=process.env.COREPACK_ROOT&&!o?ue.join(process.env.COREPACK_ROOT,"dist/yarn.js"):process.argv[1];if(await Promise.all([Ah(r,"node",process.execPath),...tn!==null?[Ah(r,"run",process.execPath,[p,"run"]),Ah(r,"yarn",process.execPath,[p]),Ah(r,"yarnpkg",process.execPath,[p]),Ah(r,"node-gyp",process.execPath,[p,"run","--top-level","node-gyp"])]:[]]),t&&(u.INIT_CWD=ue.fromPortablePath(t.configuration.startingCwd),u.PROJECT_CWD=ue.fromPortablePath(t.cwd)),u.PATH=u.PATH?`${A}${ue.delimiter}${u.PATH}`:`${A}`,u.npm_execpath=`${A}${ue.sep}yarn`,u.npm_node_execpath=`${A}${ue.sep}node`,e){if(!t)throw new Error("Assertion failed: Missing project");let E=t.tryWorkspaceByLocator(e),I=E?E.manifest.version??"":t.storedPackages.get(e.locatorHash).version??"";u.npm_package_name=fn(e),u.npm_package_version=I;let v;if(E)v=E.cwd;else{let b=t.storedPackages.get(e.locatorHash);if(!b)throw new Error(`Package for ${jr(t.configuration,e)} not found in the project`);let C=t.configuration.getLinkers(),T={project:t,report:new Nt({stdout:new fh.PassThrough,configuration:t.configuration})},L=C.find(U=>U.supportsPackage(b,T));if(!L)throw new Error(`The package ${jr(t.configuration,b)} isn't supported by any of the available linkers`);v=await L.findPackageLocation(b,T)}u.npm_package_json=ue.fromPortablePath(K.join(v,dr.manifest))}let h=tn!==null?`yarn/${tn}`:`yarn/${vf("@yarnpkg/core").version}-core`;return u.npm_config_user_agent=`${h} npm/? node/${process.version} ${process.platform} ${process.arch}`,a&&(u.npm_lifecycle_event=a),t&&await t.configuration.triggerHook(E=>E.setupScriptEnvironment,t,u,async(E,I,v)=>await Ah(r,E,I,v)),u}async function Sat(t,e,{configuration:r,report:o,workspace:a=null,locator:n=null}){await Pat(async()=>{await oe.mktempPromise(async u=>{let A=K.join(u,"pack.log"),p=null,{stdout:h,stderr:E}=r.getSubprocessStreams(A,{prefix:ue.fromPortablePath(t),report:o}),I=n&&Hc(n)?t1(n):n,v=I?xa(I):"an external project";h.write(`Packing ${v} from sources +`);let b=await eue(t),C;b!==null?(h.write(`Using ${b.packageManager} for bootstrap. Reason: ${b.reason} + +`),C=b.packageManager):(h.write(`No package manager configuration detected; defaulting to Yarn + +`),C="Yarn");let T=C==="Yarn"&&!b?.packageManagerField;await oe.mktempPromise(async L=>{let U=await M1({binFolder:L,ignoreCorepack:T}),te=new Map([["Yarn Classic",async()=>{let pe=a!==null?["workspace",a]:[],Ae=K.join(t,dr.manifest),ye=await oe.readFilePromise(Ae),ae=await Gc(process.execPath,[process.argv[1],"set","version","classic","--only-if-needed","--yarn-path"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(ae.code!==0)return ae.code;await oe.writeFilePromise(Ae,ye),await oe.appendFilePromise(K.join(t,".npmignore"),`/.yarn +`),h.write(` +`),delete U.NODE_ENV;let we=await Gc("yarn",["install"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(we.code!==0)return we.code;h.write(` +`);let Pe=await Gc("yarn",[...pe,"pack","--filename",ue.fromPortablePath(e)],{cwd:t,env:U,stdin:p,stdout:h,stderr:E});return Pe.code!==0?Pe.code:0}],["Yarn",async()=>{let pe=a!==null?["workspace",a]:[];U.YARN_ENABLE_INLINE_BUILDS="1";let Ae=K.join(t,dr.lockfile);await oe.existsPromise(Ae)||await oe.writeFilePromise(Ae,"");let ye=await Gc("yarn",[...pe,"pack","--install-if-needed","--filename",ue.fromPortablePath(e)],{cwd:t,env:U,stdin:p,stdout:h,stderr:E});return ye.code!==0?ye.code:0}],["npm",async()=>{if(a!==null){let Ee=new fh.PassThrough,De=Vy(Ee);Ee.pipe(h,{end:!1});let ce=await Gc("npm",["--version"],{cwd:t,env:U,stdin:p,stdout:Ee,stderr:E,end:0});if(Ee.end(),ce.code!==0)return h.end(),E.end(),ce.code;let ne=(await De).toString().trim();if(!bf(ne,">=7.x")){let ee=eA(null,"npm"),Ie=In(ee,ne),ke=In(ee,">=7.x");throw new Error(`Workspaces aren't supported by ${qn(r,Ie)}; please upgrade to ${qn(r,ke)} (npm has been detected as the primary package manager for ${Ot(r,t,yt.PATH)})`)}}let pe=a!==null?["--workspace",a]:[];delete U.npm_config_user_agent,delete U.npm_config_production,delete U.NPM_CONFIG_PRODUCTION,delete U.NODE_ENV;let Ae=await Gc("npm",["install","--legacy-peer-deps"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(Ae.code!==0)return Ae.code;let ye=new fh.PassThrough,ae=Vy(ye);ye.pipe(h);let we=await Gc("npm",["pack","--silent",...pe],{cwd:t,env:U,stdin:p,stdout:ye,stderr:E});if(we.code!==0)return we.code;let Pe=(await ae).toString().trim().replace(/^.*\n/s,""),g=K.resolve(t,ue.toPortablePath(Pe));return await oe.renamePromise(g,e),0}]]).get(C);if(typeof te>"u")throw new Error("Assertion failed: Unsupported workflow");let le=await te();if(!(le===0||typeof le>"u"))throw oe.detachTemp(u),new zt(58,`Packing the package failed (exit code ${le}, logs can be found here: ${Ot(r,A,yt.PATH)})`)})})})}async function xat(t,e,{project:r}){let o=r.tryWorkspaceByLocator(t);if(o!==null)return IU(o,e);let a=r.storedPackages.get(t.locatorHash);if(!a)throw new Error(`Package for ${jr(r.configuration,t)} not found in the project`);return await Jl.openPromise(async n=>{let u=r.configuration,A=r.configuration.getLinkers(),p={project:r,report:new Nt({stdout:new fh.PassThrough,configuration:u})},h=A.find(b=>b.supportsPackage(a,p));if(!h)throw new Error(`The package ${jr(r.configuration,a)} isn't supported by any of the available linkers`);let E=await h.findPackageLocation(a,p),I=new gn(E,{baseFs:n});return(await Mt.find(Bt.dot,{baseFs:I})).scripts.has(e)})}async function Vx(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A}){return await oe.mktempPromise(async p=>{let{manifest:h,env:E,cwd:I}=await tue(t,{project:a,binFolder:p,cwd:o,lifecycleScript:e}),v=h.scripts.get(e);if(typeof v>"u")return 1;let b=async()=>await TE(v,r,{cwd:I,env:E,stdin:n,stdout:u,stderr:A});return await(await a.configuration.reduceHook(T=>T.wrapScriptExecution,b,a,t,e,{script:v,args:r,cwd:I,env:E,stdin:n,stdout:u,stderr:A}))()})}async function wU(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A}){return await oe.mktempPromise(async p=>{let{env:h,cwd:E}=await tue(t,{project:a,binFolder:p,cwd:o});return await TE(e,r,{cwd:E,env:h,stdin:n,stdout:u,stderr:A})})}async function bat(t,{binFolder:e,cwd:r,lifecycleScript:o}){let a=await M1({project:t.project,locator:t.anchoredLocator,binFolder:e,lifecycleScript:o});return await vU(e,await iue(t)),typeof r>"u"&&(r=K.dirname(await oe.realpathPromise(K.join(t.cwd,"package.json")))),{manifest:t.manifest,binFolder:e,env:a,cwd:r}}async function tue(t,{project:e,binFolder:r,cwd:o,lifecycleScript:a}){let n=e.tryWorkspaceByLocator(t);if(n!==null)return bat(n,{binFolder:r,cwd:o,lifecycleScript:a});let u=e.storedPackages.get(t.locatorHash);if(!u)throw new Error(`Package for ${jr(e.configuration,t)} not found in the project`);return await Jl.openPromise(async A=>{let p=e.configuration,h=e.configuration.getLinkers(),E={project:e,report:new Nt({stdout:new fh.PassThrough,configuration:p})},I=h.find(L=>L.supportsPackage(u,E));if(!I)throw new Error(`The package ${jr(e.configuration,u)} isn't supported by any of the available linkers`);let v=await M1({project:e,locator:t,binFolder:r,lifecycleScript:a});await vU(r,await Kx(t,{project:e}));let b=await I.findPackageLocation(u,E),C=new gn(b,{baseFs:A}),T=await Mt.find(Bt.dot,{baseFs:C});return typeof o>"u"&&(o=b),{manifest:T,binFolder:r,env:v,cwd:o}})}async function rue(t,e,r,{cwd:o,stdin:a,stdout:n,stderr:u}){return await Vx(t.anchoredLocator,e,r,{cwd:o,project:t.project,stdin:a,stdout:n,stderr:u})}function IU(t,e){return t.manifest.scripts.has(e)}async function nue(t,e,{cwd:r,report:o}){let{configuration:a}=t.project,n=null;await oe.mktempPromise(async u=>{let A=K.join(u,`${e}.log`),p=`# This file contains the result of Yarn calling the "${e}" lifecycle script inside a workspace ("${ue.fromPortablePath(t.cwd)}") +`,{stdout:h,stderr:E}=a.getSubprocessStreams(A,{report:o,prefix:jr(a,t.anchoredLocator),header:p});o.reportInfo(36,`Calling the "${e}" lifecycle script`);let I=await rue(t,e,[],{cwd:r,stdin:n,stdout:h,stderr:E});if(h.end(),E.end(),I!==0)throw oe.detachTemp(u),new zt(36,`${(0,Xce.default)(e)} script failed (exit code ${Ot(a,I,yt.NUMBER)}, logs can be found here: ${Ot(a,A,yt.PATH)}); run ${Ot(a,`yarn ${e}`,yt.CODE)} to investigate`)})}async function kat(t,e,r){IU(t,e)&&await nue(t,e,r)}function BU(t){let e=K.extname(t);if(e.match(/\.[cm]?[jt]sx?$/))return!0;if(e===".exe"||e===".bin")return!1;let r=Buffer.alloc(4),o;try{o=oe.openSync(t,"r")}catch{return!0}try{oe.readSync(o,r,0,r.length,0)}finally{oe.closeSync(o)}let a=r.readUint32BE();return!(a===3405691582||a===3489328638||a===2135247942||(a&4294901760)===1297743872)}async function Kx(t,{project:e}){let r=e.configuration,o=new Map,a=e.storedPackages.get(t.locatorHash);if(!a)throw new Error(`Package for ${jr(r,t)} not found in the project`);let n=new fh.Writable,u=r.getLinkers(),A={project:e,report:new Nt({configuration:r,stdout:n})},p=new Set([t.locatorHash]);for(let E of a.dependencies.values()){let I=e.storedResolutions.get(E.descriptorHash);if(!I)throw new Error(`Assertion failed: The resolution (${qn(r,E)}) should have been registered`);p.add(I)}let h=await Promise.all(Array.from(p,async E=>{let I=e.storedPackages.get(E);if(!I)throw new Error(`Assertion failed: The package (${E}) should have been registered`);if(I.bin.size===0)return sl.skip;let v=u.find(C=>C.supportsPackage(I,A));if(!v)return sl.skip;let b=null;try{b=await v.findPackageLocation(I,A)}catch(C){if(C.code==="LOCATOR_NOT_INSTALLED")return sl.skip;throw C}return{dependency:I,packageLocation:b}}));for(let E of h){if(E===sl.skip)continue;let{dependency:I,packageLocation:v}=E;for(let[b,C]of I.bin){let T=K.resolve(v,C);o.set(b,[I,ue.fromPortablePath(T),BU(T)])}}return o}async function iue(t){return await Kx(t.anchoredLocator,{project:t.project})}async function vU(t,e){await Promise.all(Array.from(e,([r,[,o,a]])=>a?Ah(t,r,process.execPath,[o]):Ah(t,r,o,[])))}async function sue(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A,nodeArgs:p=[],packageAccessibleBinaries:h}){h??=await Kx(t,{project:a});let E=h.get(e);if(!E)throw new Error(`Binary not found (${e}) for ${jr(a.configuration,t)}`);return await oe.mktempPromise(async I=>{let[,v]=E,b=await M1({project:a,locator:t,binFolder:I});await vU(b.BERRY_BIN_FOLDER,h);let C=BU(ue.toPortablePath(v))?Gc(process.execPath,[...p,v,...r],{cwd:o,env:b,stdin:n,stdout:u,stderr:A}):Gc(v,r,{cwd:o,env:b,stdin:n,stdout:u,stderr:A}),T;try{T=await C}finally{await oe.removePromise(b.BERRY_BIN_FOLDER)}return T.code})}async function Qat(t,e,r,{cwd:o,stdin:a,stdout:n,stderr:u,packageAccessibleBinaries:A}){return await sue(t.anchoredLocator,e,r,{project:t.project,cwd:o,stdin:a,stdout:n,stderr:u,packageAccessibleBinaries:A})}var Xce,Zce,fh,$ce,Dat,Pat,DU=Et(()=>{Pt();Pt();nA();b1();Xce=$e(EU()),Zce=$e(nd()),fh=Be("stream");AE();Yl();L1();N1();Px();ql();jl();kf();xo();$ce=(a=>(a.Yarn1="Yarn Classic",a.Yarn2="Yarn",a.Npm="npm",a.Pnpm="pnpm",a))($ce||{});Dat=2,Pat=(0,Zce.default)(Dat)});var LE=_((M4t,aue)=>{"use strict";var oue=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"]]);aue.exports=t=>t?Object.keys(t).map(e=>[oue.has(e)?oue.get(e):e,t[e]]).reduce((e,r)=>(e[r[0]]=r[1],e),Object.create(null)):{}});var OE=_((O4t,due)=>{"use strict";var lue=typeof process=="object"&&process?process:{stdout:null,stderr:null},Fat=Be("events"),cue=Be("stream"),uue=Be("string_decoder").StringDecoder,Mf=Symbol("EOF"),Of=Symbol("maybeEmitEnd"),ph=Symbol("emittedEnd"),Jx=Symbol("emittingEnd"),O1=Symbol("emittedError"),zx=Symbol("closed"),Aue=Symbol("read"),Xx=Symbol("flush"),fue=Symbol("flushChunk"),ka=Symbol("encoding"),Uf=Symbol("decoder"),Zx=Symbol("flowing"),U1=Symbol("paused"),ME=Symbol("resume"),Fs=Symbol("bufferLength"),PU=Symbol("bufferPush"),SU=Symbol("bufferShift"),Fo=Symbol("objectMode"),To=Symbol("destroyed"),xU=Symbol("emitData"),pue=Symbol("emitEnd"),bU=Symbol("emitEnd2"),_f=Symbol("async"),_1=t=>Promise.resolve().then(t),hue=global._MP_NO_ITERATOR_SYMBOLS_!=="1",Tat=hue&&Symbol.asyncIterator||Symbol("asyncIterator not implemented"),Rat=hue&&Symbol.iterator||Symbol("iterator not implemented"),Nat=t=>t==="end"||t==="finish"||t==="prefinish",Lat=t=>t instanceof ArrayBuffer||typeof t=="object"&&t.constructor&&t.constructor.name==="ArrayBuffer"&&t.byteLength>=0,Mat=t=>!Buffer.isBuffer(t)&&ArrayBuffer.isView(t),$x=class{constructor(e,r,o){this.src=e,this.dest=r,this.opts=o,this.ondrain=()=>e[ME](),r.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},kU=class extends $x{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(e,r,o){super(e,r,o),this.proxyErrors=a=>r.emit("error",a),e.on("error",this.proxyErrors)}};due.exports=class gue extends cue{constructor(e){super(),this[Zx]=!1,this[U1]=!1,this.pipes=[],this.buffer=[],this[Fo]=e&&e.objectMode||!1,this[Fo]?this[ka]=null:this[ka]=e&&e.encoding||null,this[ka]==="buffer"&&(this[ka]=null),this[_f]=e&&!!e.async||!1,this[Uf]=this[ka]?new uue(this[ka]):null,this[Mf]=!1,this[ph]=!1,this[Jx]=!1,this[zx]=!1,this[O1]=null,this.writable=!0,this.readable=!0,this[Fs]=0,this[To]=!1}get bufferLength(){return this[Fs]}get encoding(){return this[ka]}set encoding(e){if(this[Fo])throw new Error("cannot set encoding in objectMode");if(this[ka]&&e!==this[ka]&&(this[Uf]&&this[Uf].lastNeed||this[Fs]))throw new Error("cannot change encoding");this[ka]!==e&&(this[Uf]=e?new uue(e):null,this.buffer.length&&(this.buffer=this.buffer.map(r=>this[Uf].write(r)))),this[ka]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[Fo]}set objectMode(e){this[Fo]=this[Fo]||!!e}get async(){return this[_f]}set async(e){this[_f]=this[_f]||!!e}write(e,r,o){if(this[Mf])throw new Error("write after end");if(this[To])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof r=="function"&&(o=r,r="utf8"),r||(r="utf8");let a=this[_f]?_1:n=>n();return!this[Fo]&&!Buffer.isBuffer(e)&&(Mat(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):Lat(e)?e=Buffer.from(e):typeof e!="string"&&(this.objectMode=!0)),this[Fo]?(this.flowing&&this[Fs]!==0&&this[Xx](!0),this.flowing?this.emit("data",e):this[PU](e),this[Fs]!==0&&this.emit("readable"),o&&a(o),this.flowing):e.length?(typeof e=="string"&&!(r===this[ka]&&!this[Uf].lastNeed)&&(e=Buffer.from(e,r)),Buffer.isBuffer(e)&&this[ka]&&(e=this[Uf].write(e)),this.flowing&&this[Fs]!==0&&this[Xx](!0),this.flowing?this.emit("data",e):this[PU](e),this[Fs]!==0&&this.emit("readable"),o&&a(o),this.flowing):(this[Fs]!==0&&this.emit("readable"),o&&a(o),this.flowing)}read(e){if(this[To])return null;if(this[Fs]===0||e===0||e>this[Fs])return this[Of](),null;this[Fo]&&(e=null),this.buffer.length>1&&!this[Fo]&&(this.encoding?this.buffer=[this.buffer.join("")]:this.buffer=[Buffer.concat(this.buffer,this[Fs])]);let r=this[Aue](e||null,this.buffer[0]);return this[Of](),r}[Aue](e,r){return e===r.length||e===null?this[SU]():(this.buffer[0]=r.slice(e),r=r.slice(0,e),this[Fs]-=e),this.emit("data",r),!this.buffer.length&&!this[Mf]&&this.emit("drain"),r}end(e,r,o){return typeof e=="function"&&(o=e,e=null),typeof r=="function"&&(o=r,r="utf8"),e&&this.write(e,r),o&&this.once("end",o),this[Mf]=!0,this.writable=!1,(this.flowing||!this[U1])&&this[Of](),this}[ME](){this[To]||(this[U1]=!1,this[Zx]=!0,this.emit("resume"),this.buffer.length?this[Xx]():this[Mf]?this[Of]():this.emit("drain"))}resume(){return this[ME]()}pause(){this[Zx]=!1,this[U1]=!0}get destroyed(){return this[To]}get flowing(){return this[Zx]}get paused(){return this[U1]}[PU](e){this[Fo]?this[Fs]+=1:this[Fs]+=e.length,this.buffer.push(e)}[SU](){return this.buffer.length&&(this[Fo]?this[Fs]-=1:this[Fs]-=this.buffer[0].length),this.buffer.shift()}[Xx](e){do;while(this[fue](this[SU]()));!e&&!this.buffer.length&&!this[Mf]&&this.emit("drain")}[fue](e){return e?(this.emit("data",e),this.flowing):!1}pipe(e,r){if(this[To])return;let o=this[ph];return r=r||{},e===lue.stdout||e===lue.stderr?r.end=!1:r.end=r.end!==!1,r.proxyErrors=!!r.proxyErrors,o?r.end&&e.end():(this.pipes.push(r.proxyErrors?new kU(this,e,r):new $x(this,e,r)),this[_f]?_1(()=>this[ME]()):this[ME]()),e}unpipe(e){let r=this.pipes.find(o=>o.dest===e);r&&(this.pipes.splice(this.pipes.indexOf(r),1),r.unpipe())}addListener(e,r){return this.on(e,r)}on(e,r){let o=super.on(e,r);return e==="data"&&!this.pipes.length&&!this.flowing?this[ME]():e==="readable"&&this[Fs]!==0?super.emit("readable"):Nat(e)&&this[ph]?(super.emit(e),this.removeAllListeners(e)):e==="error"&&this[O1]&&(this[_f]?_1(()=>r.call(this,this[O1])):r.call(this,this[O1])),o}get emittedEnd(){return this[ph]}[Of](){!this[Jx]&&!this[ph]&&!this[To]&&this.buffer.length===0&&this[Mf]&&(this[Jx]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[zx]&&this.emit("close"),this[Jx]=!1)}emit(e,r,...o){if(e!=="error"&&e!=="close"&&e!==To&&this[To])return;if(e==="data")return r?this[_f]?_1(()=>this[xU](r)):this[xU](r):!1;if(e==="end")return this[pue]();if(e==="close"){if(this[zx]=!0,!this[ph]&&!this[To])return;let n=super.emit("close");return this.removeAllListeners("close"),n}else if(e==="error"){this[O1]=r;let n=super.emit("error",r);return this[Of](),n}else if(e==="resume"){let n=super.emit("resume");return this[Of](),n}else if(e==="finish"||e==="prefinish"){let n=super.emit(e);return this.removeAllListeners(e),n}let a=super.emit(e,r,...o);return this[Of](),a}[xU](e){for(let o of this.pipes)o.dest.write(e)===!1&&this.pause();let r=super.emit("data",e);return this[Of](),r}[pue](){this[ph]||(this[ph]=!0,this.readable=!1,this[_f]?_1(()=>this[bU]()):this[bU]())}[bU](){if(this[Uf]){let r=this[Uf].end();if(r){for(let o of this.pipes)o.dest.write(r);super.emit("data",r)}}for(let r of this.pipes)r.end();let e=super.emit("end");return this.removeAllListeners("end"),e}collect(){let e=[];this[Fo]||(e.dataLength=0);let r=this.promise();return this.on("data",o=>{e.push(o),this[Fo]||(e.dataLength+=o.length)}),r.then(()=>e)}concat(){return this[Fo]?Promise.reject(new Error("cannot concat in objectMode")):this.collect().then(e=>this[Fo]?Promise.reject(new Error("cannot concat in objectMode")):this[ka]?e.join(""):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,r)=>{this.on(To,()=>r(new Error("stream destroyed"))),this.on("error",o=>r(o)),this.on("end",()=>e())})}[Tat](){return{next:()=>{let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[Mf])return Promise.resolve({done:!0});let o=null,a=null,n=h=>{this.removeListener("data",u),this.removeListener("end",A),a(h)},u=h=>{this.removeListener("error",n),this.removeListener("end",A),this.pause(),o({value:h,done:!!this[Mf]})},A=()=>{this.removeListener("error",n),this.removeListener("data",u),o({done:!0})},p=()=>n(new Error("stream destroyed"));return new Promise((h,E)=>{a=E,o=h,this.once(To,p),this.once("error",n),this.once("end",A),this.once("data",u)})}}}[Rat](){return{next:()=>{let r=this.read();return{value:r,done:r===null}}}}destroy(e){return this[To]?(e?this.emit("error",e):this.emit(To),this):(this[To]=!0,this.buffer.length=0,this[Fs]=0,typeof this.close=="function"&&!this[zx]&&this.close(),e?this.emit("error",e):this.emit(To),this)}static isStream(e){return!!e&&(e instanceof gue||e instanceof cue||e instanceof Fat&&(typeof e.pipe=="function"||typeof e.write=="function"&&typeof e.end=="function"))}}});var yue=_((U4t,mue)=>{var Oat=Be("zlib").constants||{ZLIB_VERNUM:4736};mue.exports=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:1/0,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},Oat))});var WU=_(cl=>{"use strict";var NU=Be("assert"),hh=Be("buffer").Buffer,wue=Be("zlib"),Qd=cl.constants=yue(),Uat=OE(),Eue=hh.concat,Fd=Symbol("_superWrite"),_E=class extends Error{constructor(e){super("zlib: "+e.message),this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return"ZlibError"}},_at=Symbol("opts"),H1=Symbol("flushFlag"),Cue=Symbol("finishFlushFlag"),YU=Symbol("fullFlushFlag"),ti=Symbol("handle"),eb=Symbol("onError"),UE=Symbol("sawError"),QU=Symbol("level"),FU=Symbol("strategy"),TU=Symbol("ended"),_4t=Symbol("_defaultFullFlush"),tb=class extends Uat{constructor(e,r){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");super(e),this[UE]=!1,this[TU]=!1,this[_at]=e,this[H1]=e.flush,this[Cue]=e.finishFlush;try{this[ti]=new wue[r](e)}catch(o){throw new _E(o)}this[eb]=o=>{this[UE]||(this[UE]=!0,this.close(),this.emit("error",o))},this[ti].on("error",o=>this[eb](new _E(o))),this.once("end",()=>this.close)}close(){this[ti]&&(this[ti].close(),this[ti]=null,this.emit("close"))}reset(){if(!this[UE])return NU(this[ti],"zlib binding closed"),this[ti].reset()}flush(e){this.ended||(typeof e!="number"&&(e=this[YU]),this.write(Object.assign(hh.alloc(0),{[H1]:e})))}end(e,r,o){return e&&this.write(e,r),this.flush(this[Cue]),this[TU]=!0,super.end(null,null,o)}get ended(){return this[TU]}write(e,r,o){if(typeof r=="function"&&(o=r,r="utf8"),typeof e=="string"&&(e=hh.from(e,r)),this[UE])return;NU(this[ti],"zlib binding closed");let a=this[ti]._handle,n=a.close;a.close=()=>{};let u=this[ti].close;this[ti].close=()=>{},hh.concat=h=>h;let A;try{let h=typeof e[H1]=="number"?e[H1]:this[H1];A=this[ti]._processChunk(e,h),hh.concat=Eue}catch(h){hh.concat=Eue,this[eb](new _E(h))}finally{this[ti]&&(this[ti]._handle=a,a.close=n,this[ti].close=u,this[ti].removeAllListeners("error"))}this[ti]&&this[ti].on("error",h=>this[eb](new _E(h)));let p;if(A)if(Array.isArray(A)&&A.length>0){p=this[Fd](hh.from(A[0]));for(let h=1;h{this.flush(a),n()};try{this[ti].params(e,r)}finally{this[ti].flush=o}this[ti]&&(this[QU]=e,this[FU]=r)}}}},LU=class extends Hf{constructor(e){super(e,"Deflate")}},MU=class extends Hf{constructor(e){super(e,"Inflate")}},RU=Symbol("_portable"),OU=class extends Hf{constructor(e){super(e,"Gzip"),this[RU]=e&&!!e.portable}[Fd](e){return this[RU]?(this[RU]=!1,e[9]=255,super[Fd](e)):super[Fd](e)}},UU=class extends Hf{constructor(e){super(e,"Gunzip")}},_U=class extends Hf{constructor(e){super(e,"DeflateRaw")}},HU=class extends Hf{constructor(e){super(e,"InflateRaw")}},jU=class extends Hf{constructor(e){super(e,"Unzip")}},rb=class extends tb{constructor(e,r){e=e||{},e.flush=e.flush||Qd.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||Qd.BROTLI_OPERATION_FINISH,super(e,r),this[YU]=Qd.BROTLI_OPERATION_FLUSH}},qU=class extends rb{constructor(e){super(e,"BrotliCompress")}},GU=class extends rb{constructor(e){super(e,"BrotliDecompress")}};cl.Deflate=LU;cl.Inflate=MU;cl.Gzip=OU;cl.Gunzip=UU;cl.DeflateRaw=_U;cl.InflateRaw=HU;cl.Unzip=jU;typeof wue.BrotliCompress=="function"?(cl.BrotliCompress=qU,cl.BrotliDecompress=GU):cl.BrotliCompress=cl.BrotliDecompress=class{constructor(){throw new Error("Brotli is not supported in this version of Node.js")}}});var HE=_((q4t,Iue)=>{var Hat=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform;Iue.exports=Hat!=="win32"?t=>t:t=>t&&t.replace(/\\/g,"/")});var nb=_((Y4t,Bue)=>{"use strict";var jat=OE(),VU=HE(),KU=Symbol("slurp");Bue.exports=class extends jat{constructor(e,r,o){switch(super(),this.pause(),this.extended=r,this.globalExtended=o,this.header=e,this.startBlockSize=512*Math.ceil(e.size/512),this.blockRemain=this.startBlockSize,this.remain=e.size,this.type=e.type,this.meta=!1,this.ignore=!1,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}this.path=VU(e.path),this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=e.size,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=VU(e.linkpath),this.uname=e.uname,this.gname=e.gname,r&&this[KU](r),o&&this[KU](o,!0)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");let o=this.remain,a=this.blockRemain;return this.remain=Math.max(0,o-r),this.blockRemain=Math.max(0,a-r),this.ignore?!0:o>=r?super.write(e):super.write(e.slice(0,o))}[KU](e,r){for(let o in e)e[o]!==null&&e[o]!==void 0&&!(r&&o==="path")&&(this[o]=o==="path"||o==="linkpath"?VU(e[o]):e[o])}}});var JU=_(ib=>{"use strict";ib.name=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]);ib.code=new Map(Array.from(ib.name).map(t=>[t[1],t[0]]))});var Sue=_((V4t,Pue)=>{"use strict";var qat=(t,e)=>{if(Number.isSafeInteger(t))t<0?Yat(t,e):Gat(t,e);else throw Error("cannot encode number outside of javascript safe integer range");return e},Gat=(t,e)=>{e[0]=128;for(var r=e.length;r>1;r--)e[r-1]=t&255,t=Math.floor(t/256)},Yat=(t,e)=>{e[0]=255;var r=!1;t=t*-1;for(var o=e.length;o>1;o--){var a=t&255;t=Math.floor(t/256),r?e[o-1]=vue(a):a===0?e[o-1]=0:(r=!0,e[o-1]=Due(a))}},Wat=t=>{let e=t[0],r=e===128?Kat(t.slice(1,t.length)):e===255?Vat(t):null;if(r===null)throw Error("invalid base256 encoding");if(!Number.isSafeInteger(r))throw Error("parsed number outside of javascript safe integer range");return r},Vat=t=>{for(var e=t.length,r=0,o=!1,a=e-1;a>-1;a--){var n=t[a],u;o?u=vue(n):n===0?u=n:(o=!0,u=Due(n)),u!==0&&(r-=u*Math.pow(256,e-a-1))}return r},Kat=t=>{for(var e=t.length,r=0,o=e-1;o>-1;o--){var a=t[o];a!==0&&(r+=a*Math.pow(256,e-o-1))}return r},vue=t=>(255^t)&255,Due=t=>(255^t)+1&255;Pue.exports={encode:qat,parse:Wat}});var qE=_((K4t,bue)=>{"use strict";var zU=JU(),jE=Be("path").posix,xue=Sue(),XU=Symbol("slurp"),ul=Symbol("type"),e3=class{constructor(e,r,o,a){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!1,this.block=null,this.path=null,this.mode=null,this.uid=null,this.gid=null,this.size=null,this.mtime=null,this.cksum=null,this[ul]="0",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,r||0,o,a):e&&this.set(e)}decode(e,r,o,a){if(r||(r=0),!e||!(e.length>=r+512))throw new Error("need 512 bytes for header");if(this.path=Td(e,r,100),this.mode=gh(e,r+100,8),this.uid=gh(e,r+108,8),this.gid=gh(e,r+116,8),this.size=gh(e,r+124,12),this.mtime=ZU(e,r+136,12),this.cksum=gh(e,r+148,12),this[XU](o),this[XU](a,!0),this[ul]=Td(e,r+156,1),this[ul]===""&&(this[ul]="0"),this[ul]==="0"&&this.path.substr(-1)==="/"&&(this[ul]="5"),this[ul]==="5"&&(this.size=0),this.linkpath=Td(e,r+157,100),e.slice(r+257,r+265).toString()==="ustar\x0000")if(this.uname=Td(e,r+265,32),this.gname=Td(e,r+297,32),this.devmaj=gh(e,r+329,8),this.devmin=gh(e,r+337,8),e[r+475]!==0){let u=Td(e,r+345,155);this.path=u+"/"+this.path}else{let u=Td(e,r+345,130);u&&(this.path=u+"/"+this.path),this.atime=ZU(e,r+476,12),this.ctime=ZU(e,r+488,12)}let n=8*32;for(let u=r;u=r+512))throw new Error("need 512 bytes for header");let o=this.ctime||this.atime?130:155,a=Jat(this.path||"",o),n=a[0],u=a[1];this.needPax=a[2],this.needPax=Rd(e,r,100,n)||this.needPax,this.needPax=dh(e,r+100,8,this.mode)||this.needPax,this.needPax=dh(e,r+108,8,this.uid)||this.needPax,this.needPax=dh(e,r+116,8,this.gid)||this.needPax,this.needPax=dh(e,r+124,12,this.size)||this.needPax,this.needPax=$U(e,r+136,12,this.mtime)||this.needPax,e[r+156]=this[ul].charCodeAt(0),this.needPax=Rd(e,r+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",r+257,8),this.needPax=Rd(e,r+265,32,this.uname)||this.needPax,this.needPax=Rd(e,r+297,32,this.gname)||this.needPax,this.needPax=dh(e,r+329,8,this.devmaj)||this.needPax,this.needPax=dh(e,r+337,8,this.devmin)||this.needPax,this.needPax=Rd(e,r+345,o,u)||this.needPax,e[r+475]!==0?this.needPax=Rd(e,r+345,155,u)||this.needPax:(this.needPax=Rd(e,r+345,130,u)||this.needPax,this.needPax=$U(e,r+476,12,this.atime)||this.needPax,this.needPax=$U(e,r+488,12,this.ctime)||this.needPax);let A=8*32;for(let p=r;p{let o=t,a="",n,u=jE.parse(t).root||".";if(Buffer.byteLength(o)<100)n=[o,a,!1];else{a=jE.dirname(o),o=jE.basename(o);do Buffer.byteLength(o)<=100&&Buffer.byteLength(a)<=e?n=[o,a,!1]:Buffer.byteLength(o)>100&&Buffer.byteLength(a)<=e?n=[o.substr(0,100-1),a,!0]:(o=jE.join(jE.basename(a),o),a=jE.dirname(a));while(a!==u&&!n);n||(n=[t.substr(0,100-1),"",!0])}return n},Td=(t,e,r)=>t.slice(e,e+r).toString("utf8").replace(/\0.*/,""),ZU=(t,e,r)=>zat(gh(t,e,r)),zat=t=>t===null?null:new Date(t*1e3),gh=(t,e,r)=>t[e]&128?xue.parse(t.slice(e,e+r)):Zat(t,e,r),Xat=t=>isNaN(t)?null:t,Zat=(t,e,r)=>Xat(parseInt(t.slice(e,e+r).toString("utf8").replace(/\0.*$/,"").trim(),8)),$at={12:8589934591,8:2097151},dh=(t,e,r,o)=>o===null?!1:o>$at[r]||o<0?(xue.encode(o,t.slice(e,e+r)),!0):(elt(t,e,r,o),!1),elt=(t,e,r,o)=>t.write(tlt(o,r),e,r,"ascii"),tlt=(t,e)=>rlt(Math.floor(t).toString(8),e),rlt=(t,e)=>(t.length===e-1?t:new Array(e-t.length-1).join("0")+t+" ")+"\0",$U=(t,e,r,o)=>o===null?!1:dh(t,e,r,o.getTime()/1e3),nlt=new Array(156).join("\0"),Rd=(t,e,r,o)=>o===null?!1:(t.write(o+nlt,e,r,"utf8"),o.length!==Buffer.byteLength(o)||o.length>r);bue.exports=e3});var sb=_((J4t,kue)=>{"use strict";var ilt=qE(),slt=Be("path"),j1=class{constructor(e,r){this.atime=e.atime||null,this.charset=e.charset||null,this.comment=e.comment||null,this.ctime=e.ctime||null,this.gid=e.gid||null,this.gname=e.gname||null,this.linkpath=e.linkpath||null,this.mtime=e.mtime||null,this.path=e.path||null,this.size=e.size||null,this.uid=e.uid||null,this.uname=e.uname||null,this.dev=e.dev||null,this.ino=e.ino||null,this.nlink=e.nlink||null,this.global=r||!1}encode(){let e=this.encodeBody();if(e==="")return null;let r=Buffer.byteLength(e),o=512*Math.ceil(1+r/512),a=Buffer.allocUnsafe(o);for(let n=0;n<512;n++)a[n]=0;new ilt({path:("PaxHeader/"+slt.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:r,mtime:this.mtime||null,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime||null,ctime:this.ctime||null}).encode(a),a.write(e,512,r,"utf8");for(let n=r+512;n=Math.pow(10,n)&&(n+=1),n+a+o}};j1.parse=(t,e,r)=>new j1(olt(alt(t),e),r);var olt=(t,e)=>e?Object.keys(t).reduce((r,o)=>(r[o]=t[o],r),e):t,alt=t=>t.replace(/\n$/,"").split(` +`).reduce(llt,Object.create(null)),llt=(t,e)=>{let r=parseInt(e,10);if(r!==Buffer.byteLength(e)+1)return t;e=e.substr((r+" ").length);let o=e.split("="),a=o.shift().replace(/^SCHILY\.(dev|ino|nlink)/,"$1");if(!a)return t;let n=o.join("=");return t[a]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(a)?new Date(n*1e3):/^[0-9]+$/.test(n)?+n:n,t};kue.exports=j1});var GE=_((z4t,Que)=>{Que.exports=t=>{let e=t.length-1,r=-1;for(;e>-1&&t.charAt(e)==="/";)r=e,e--;return r===-1?t:t.slice(0,r)}});var ob=_((X4t,Fue)=>{"use strict";Fue.exports=t=>class extends t{warn(e,r,o={}){this.file&&(o.file=this.file),this.cwd&&(o.cwd=this.cwd),o.code=r instanceof Error&&r.code||e,o.tarCode=e,!this.strict&&o.recoverable!==!1?(r instanceof Error&&(o=Object.assign(r,o),r=r.message),this.emit("warn",o.tarCode,r,o)):r instanceof Error?this.emit("error",Object.assign(r,o)):this.emit("error",Object.assign(new Error(`${e}: ${r}`),o))}}});var r3=_(($4t,Tue)=>{"use strict";var ab=["|","<",">","?",":"],t3=ab.map(t=>String.fromCharCode(61440+t.charCodeAt(0))),clt=new Map(ab.map((t,e)=>[t,t3[e]])),ult=new Map(t3.map((t,e)=>[t,ab[e]]));Tue.exports={encode:t=>ab.reduce((e,r)=>e.split(r).join(clt.get(r)),t),decode:t=>t3.reduce((e,r)=>e.split(r).join(ult.get(r)),t)}});var n3=_((eUt,Nue)=>{var{isAbsolute:Alt,parse:Rue}=Be("path").win32;Nue.exports=t=>{let e="",r=Rue(t);for(;Alt(t)||r.root;){let o=t.charAt(0)==="/"&&t.slice(0,4)!=="//?/"?"/":r.root;t=t.substr(o.length),e+=o,r=Rue(t)}return[e,t]}});var Mue=_((tUt,Lue)=>{"use strict";Lue.exports=(t,e,r)=>(t&=4095,r&&(t=(t|384)&-19),e&&(t&256&&(t|=64),t&32&&(t|=8),t&4&&(t|=1)),t)});var p3=_((iUt,Xue)=>{"use strict";var Gue=OE(),Yue=sb(),Wue=qE(),oA=Be("fs"),Oue=Be("path"),sA=HE(),flt=GE(),Vue=(t,e)=>e?(t=sA(t).replace(/^\.(\/|$)/,""),flt(e)+"/"+t):sA(t),plt=16*1024*1024,Uue=Symbol("process"),_ue=Symbol("file"),Hue=Symbol("directory"),s3=Symbol("symlink"),jue=Symbol("hardlink"),q1=Symbol("header"),lb=Symbol("read"),o3=Symbol("lstat"),ub=Symbol("onlstat"),a3=Symbol("onread"),l3=Symbol("onreadlink"),c3=Symbol("openfile"),u3=Symbol("onopenfile"),mh=Symbol("close"),Ab=Symbol("mode"),A3=Symbol("awaitDrain"),i3=Symbol("ondrain"),aA=Symbol("prefix"),que=Symbol("hadError"),Kue=ob(),hlt=r3(),Jue=n3(),zue=Mue(),fb=Kue(class extends Gue{constructor(e,r){if(r=r||{},super(r),typeof e!="string")throw new TypeError("path is required");this.path=sA(e),this.portable=!!r.portable,this.myuid=process.getuid&&process.getuid()||0,this.myuser=process.env.USER||"",this.maxReadSize=r.maxReadSize||plt,this.linkCache=r.linkCache||new Map,this.statCache=r.statCache||new Map,this.preservePaths=!!r.preservePaths,this.cwd=sA(r.cwd||process.cwd()),this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.mtime=r.mtime||null,this.prefix=r.prefix?sA(r.prefix):null,this.fd=null,this.blockLen=null,this.blockRemain=null,this.buf=null,this.offset=null,this.length=null,this.pos=null,this.remain=null,typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let o=!1;if(!this.preservePaths){let[a,n]=Jue(this.path);a&&(this.path=n,o=a)}this.win32=!!r.win32||process.platform==="win32",this.win32&&(this.path=hlt.decode(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=sA(r.absolute||Oue.resolve(this.cwd,e)),this.path===""&&(this.path="./"),o&&this.warn("TAR_ENTRY_INFO",`stripping ${o} from absolute path`,{entry:this,path:o+this.path}),this.statCache.has(this.absolute)?this[ub](this.statCache.get(this.absolute)):this[o3]()}emit(e,...r){return e==="error"&&(this[que]=!0),super.emit(e,...r)}[o3](){oA.lstat(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[ub](r)})}[ub](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=dlt(e),this.emit("stat",e),this[Uue]()}[Uue](){switch(this.type){case"File":return this[_ue]();case"Directory":return this[Hue]();case"SymbolicLink":return this[s3]();default:return this.end()}}[Ab](e){return zue(e,this.type==="Directory",this.portable)}[aA](e){return Vue(e,this.prefix)}[q1](){this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.header=new Wue({path:this[aA](this.path),linkpath:this.type==="Link"?this[aA](this.linkpath):this.linkpath,mode:this[Ab](this.stat.mode),uid:this.portable?null:this.stat.uid,gid:this.portable?null:this.stat.gid,size:this.stat.size,mtime:this.noMtime?null:this.mtime||this.stat.mtime,type:this.type,uname:this.portable?null:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?null:this.stat.atime,ctime:this.portable?null:this.stat.ctime}),this.header.encode()&&!this.noPax&&super.write(new Yue({atime:this.portable?null:this.header.atime,ctime:this.portable?null:this.header.ctime,gid:this.portable?null:this.header.gid,mtime:this.noMtime?null:this.mtime||this.header.mtime,path:this[aA](this.path),linkpath:this.type==="Link"?this[aA](this.linkpath):this.linkpath,size:this.header.size,uid:this.portable?null:this.header.uid,uname:this.portable?null:this.header.uname,dev:this.portable?null:this.stat.dev,ino:this.portable?null:this.stat.ino,nlink:this.portable?null:this.stat.nlink}).encode()),super.write(this.header.block)}[Hue](){this.path.substr(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[q1](),this.end()}[s3](){oA.readlink(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[l3](r)})}[l3](e){this.linkpath=sA(e),this[q1](),this.end()}[jue](e){this.type="Link",this.linkpath=sA(Oue.relative(this.cwd,e)),this.stat.size=0,this[q1](),this.end()}[_ue](){if(this.stat.nlink>1){let e=this.stat.dev+":"+this.stat.ino;if(this.linkCache.has(e)){let r=this.linkCache.get(e);if(r.indexOf(this.cwd)===0)return this[jue](r)}this.linkCache.set(e,this.absolute)}if(this[q1](),this.stat.size===0)return this.end();this[c3]()}[c3](){oA.open(this.absolute,"r",(e,r)=>{if(e)return this.emit("error",e);this[u3](r)})}[u3](e){if(this.fd=e,this[que])return this[mh]();this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let r=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(r),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[lb]()}[lb](){let{fd:e,buf:r,offset:o,length:a,pos:n}=this;oA.read(e,r,o,a,n,(u,A)=>{if(u)return this[mh](()=>this.emit("error",u));this[a3](A)})}[mh](e){oA.close(this.fd,e)}[a3](e){if(e<=0&&this.remain>0){let a=new Error("encountered unexpected EOF");return a.path=this.absolute,a.syscall="read",a.code="EOF",this[mh](()=>this.emit("error",a))}if(e>this.remain){let a=new Error("did not encounter expected EOF");return a.path=this.absolute,a.syscall="read",a.code="EOF",this[mh](()=>this.emit("error",a))}if(e===this.remain)for(let a=e;athis[i3]())}[A3](e){this.once("drain",e)}write(e){if(this.blockRemaine?this.emit("error",e):this.end());this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[lb]()}}),f3=class extends fb{[o3](){this[ub](oA.lstatSync(this.absolute))}[s3](){this[l3](oA.readlinkSync(this.absolute))}[c3](){this[u3](oA.openSync(this.absolute,"r"))}[lb](){let e=!0;try{let{fd:r,buf:o,offset:a,length:n,pos:u}=this,A=oA.readSync(r,o,a,n,u);this[a3](A),e=!1}finally{if(e)try{this[mh](()=>{})}catch{}}}[A3](e){e()}[mh](e){oA.closeSync(this.fd),e()}},glt=Kue(class extends Gue{constructor(e,r){r=r||{},super(r),this.preservePaths=!!r.preservePaths,this.portable=!!r.portable,this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.readEntry=e,this.type=e.type,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.prefix=r.prefix||null,this.path=sA(e.path),this.mode=this[Ab](e.mode),this.uid=this.portable?null:e.uid,this.gid=this.portable?null:e.gid,this.uname=this.portable?null:e.uname,this.gname=this.portable?null:e.gname,this.size=e.size,this.mtime=this.noMtime?null:r.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=sA(e.linkpath),typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let o=!1;if(!this.preservePaths){let[a,n]=Jue(this.path);a&&(this.path=n,o=a)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new Wue({path:this[aA](this.path),linkpath:this.type==="Link"?this[aA](this.linkpath):this.linkpath,mode:this.mode,uid:this.portable?null:this.uid,gid:this.portable?null:this.gid,size:this.size,mtime:this.noMtime?null:this.mtime,type:this.type,uname:this.portable?null:this.uname,atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime}),o&&this.warn("TAR_ENTRY_INFO",`stripping ${o} from absolute path`,{entry:this,path:o+this.path}),this.header.encode()&&!this.noPax&&super.write(new Yue({atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime,gid:this.portable?null:this.gid,mtime:this.noMtime?null:this.mtime,path:this[aA](this.path),linkpath:this.type==="Link"?this[aA](this.linkpath):this.linkpath,size:this.size,uid:this.portable?null:this.uid,uname:this.portable?null:this.uname,dev:this.portable?null:this.readEntry.dev,ino:this.portable?null:this.readEntry.ino,nlink:this.portable?null:this.readEntry.nlink}).encode()),super.write(this.header.block),e.pipe(this)}[aA](e){return Vue(e,this.prefix)}[Ab](e){return zue(e,this.type==="Directory",this.portable)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(e)}end(){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),super.end()}});fb.Sync=f3;fb.Tar=glt;var dlt=t=>t.isFile()?"File":t.isDirectory()?"Directory":t.isSymbolicLink()?"SymbolicLink":"Unsupported";Xue.exports=fb});var wb=_((oUt,iAe)=>{"use strict";var Eb=class{constructor(e,r){this.path=e||"./",this.absolute=r,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},mlt=OE(),ylt=WU(),Elt=nb(),I3=p3(),Clt=I3.Sync,wlt=I3.Tar,Ilt=BP(),Zue=Buffer.alloc(1024),gb=Symbol("onStat"),pb=Symbol("ended"),lA=Symbol("queue"),YE=Symbol("current"),Nd=Symbol("process"),hb=Symbol("processing"),$ue=Symbol("processJob"),cA=Symbol("jobs"),h3=Symbol("jobDone"),db=Symbol("addFSEntry"),eAe=Symbol("addTarEntry"),y3=Symbol("stat"),E3=Symbol("readdir"),mb=Symbol("onreaddir"),yb=Symbol("pipe"),tAe=Symbol("entry"),g3=Symbol("entryOpt"),C3=Symbol("writeEntryClass"),nAe=Symbol("write"),d3=Symbol("ondrain"),Cb=Be("fs"),rAe=Be("path"),Blt=ob(),m3=HE(),B3=Blt(class extends mlt{constructor(e){super(e),e=e||Object.create(null),this.opt=e,this.file=e.file||"",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=m3(e.prefix||""),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[C3]=I3,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new ylt.Gzip(e.gzip),this.zip.on("data",r=>super.write(r)),this.zip.on("end",r=>super.end()),this.zip.on("drain",r=>this[d3]()),this.on("resume",r=>this.zip.resume())):this.on("drain",this[d3]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter=="function"?e.filter:r=>!0,this[lA]=new Ilt,this[cA]=0,this.jobs=+e.jobs||4,this[hb]=!1,this[pb]=!1}[nAe](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[pb]=!0,this[Nd](),this}write(e){if(this[pb])throw new Error("write after end");return e instanceof Elt?this[eAe](e):this[db](e),this.flowing}[eAe](e){let r=m3(rAe.resolve(this.cwd,e.path));if(!this.filter(e.path,e))e.resume();else{let o=new Eb(e.path,r,!1);o.entry=new wlt(e,this[g3](o)),o.entry.on("end",a=>this[h3](o)),this[cA]+=1,this[lA].push(o)}this[Nd]()}[db](e){let r=m3(rAe.resolve(this.cwd,e));this[lA].push(new Eb(e,r)),this[Nd]()}[y3](e){e.pending=!0,this[cA]+=1;let r=this.follow?"stat":"lstat";Cb[r](e.absolute,(o,a)=>{e.pending=!1,this[cA]-=1,o?this.emit("error",o):this[gb](e,a)})}[gb](e,r){this.statCache.set(e.absolute,r),e.stat=r,this.filter(e.path,r)||(e.ignore=!0),this[Nd]()}[E3](e){e.pending=!0,this[cA]+=1,Cb.readdir(e.absolute,(r,o)=>{if(e.pending=!1,this[cA]-=1,r)return this.emit("error",r);this[mb](e,o)})}[mb](e,r){this.readdirCache.set(e.absolute,r),e.readdir=r,this[Nd]()}[Nd](){if(!this[hb]){this[hb]=!0;for(let e=this[lA].head;e!==null&&this[cA]this.warn(r,o,a),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime,prefix:this.prefix}}[tAe](e){this[cA]+=1;try{return new this[C3](e.path,this[g3](e)).on("end",()=>this[h3](e)).on("error",r=>this.emit("error",r))}catch(r){this.emit("error",r)}}[d3](){this[YE]&&this[YE].entry&&this[YE].entry.resume()}[yb](e){e.piped=!0,e.readdir&&e.readdir.forEach(a=>{let n=e.path,u=n==="./"?"":n.replace(/\/*$/,"/");this[db](u+a)});let r=e.entry,o=this.zip;o?r.on("data",a=>{o.write(a)||r.pause()}):r.on("data",a=>{super.write(a)||r.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),w3=class extends B3{constructor(e){super(e),this[C3]=Clt}pause(){}resume(){}[y3](e){let r=this.follow?"statSync":"lstatSync";this[gb](e,Cb[r](e.absolute))}[E3](e,r){this[mb](e,Cb.readdirSync(e.absolute))}[yb](e){let r=e.entry,o=this.zip;e.readdir&&e.readdir.forEach(a=>{let n=e.path,u=n==="./"?"":n.replace(/\/*$/,"/");this[db](u+a)}),o?r.on("data",a=>{o.write(a)}):r.on("data",a=>{super[nAe](a)})}};B3.Sync=w3;iAe.exports=B3});var $E=_(Y1=>{"use strict";var vlt=OE(),Dlt=Be("events").EventEmitter,Qa=Be("fs"),P3=Qa.writev;if(!P3){let t=process.binding("fs"),e=t.FSReqWrap||t.FSReqCallback;P3=(r,o,a,n)=>{let u=(p,h)=>n(p,h,o),A=new e;A.oncomplete=u,t.writeBuffers(r,o,a,A)}}var XE=Symbol("_autoClose"),Yc=Symbol("_close"),G1=Symbol("_ended"),Gn=Symbol("_fd"),sAe=Symbol("_finished"),Eh=Symbol("_flags"),v3=Symbol("_flush"),S3=Symbol("_handleChunk"),x3=Symbol("_makeBuf"),Pb=Symbol("_mode"),Ib=Symbol("_needDrain"),JE=Symbol("_onerror"),ZE=Symbol("_onopen"),D3=Symbol("_onread"),VE=Symbol("_onwrite"),Ch=Symbol("_open"),jf=Symbol("_path"),Ld=Symbol("_pos"),uA=Symbol("_queue"),KE=Symbol("_read"),oAe=Symbol("_readSize"),yh=Symbol("_reading"),Bb=Symbol("_remain"),aAe=Symbol("_size"),vb=Symbol("_write"),WE=Symbol("_writing"),Db=Symbol("_defaultFlag"),zE=Symbol("_errored"),Sb=class extends vlt{constructor(e,r){if(r=r||{},super(r),this.readable=!0,this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[zE]=!1,this[Gn]=typeof r.fd=="number"?r.fd:null,this[jf]=e,this[oAe]=r.readSize||16*1024*1024,this[yh]=!1,this[aAe]=typeof r.size=="number"?r.size:1/0,this[Bb]=this[aAe],this[XE]=typeof r.autoClose=="boolean"?r.autoClose:!0,typeof this[Gn]=="number"?this[KE]():this[Ch]()}get fd(){return this[Gn]}get path(){return this[jf]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[Ch](){Qa.open(this[jf],"r",(e,r)=>this[ZE](e,r))}[ZE](e,r){e?this[JE](e):(this[Gn]=r,this.emit("open",r),this[KE]())}[x3](){return Buffer.allocUnsafe(Math.min(this[oAe],this[Bb]))}[KE](){if(!this[yh]){this[yh]=!0;let e=this[x3]();if(e.length===0)return process.nextTick(()=>this[D3](null,0,e));Qa.read(this[Gn],e,0,e.length,null,(r,o,a)=>this[D3](r,o,a))}}[D3](e,r,o){this[yh]=!1,e?this[JE](e):this[S3](r,o)&&this[KE]()}[Yc](){if(this[XE]&&typeof this[Gn]=="number"){let e=this[Gn];this[Gn]=null,Qa.close(e,r=>r?this.emit("error",r):this.emit("close"))}}[JE](e){this[yh]=!0,this[Yc](),this.emit("error",e)}[S3](e,r){let o=!1;return this[Bb]-=e,e>0&&(o=super.write(ethis[ZE](e,r))}[ZE](e,r){this[Db]&&this[Eh]==="r+"&&e&&e.code==="ENOENT"?(this[Eh]="w",this[Ch]()):e?this[JE](e):(this[Gn]=r,this.emit("open",r),this[v3]())}end(e,r){return e&&this.write(e,r),this[G1]=!0,!this[WE]&&!this[uA].length&&typeof this[Gn]=="number"&&this[VE](null,0),this}write(e,r){return typeof e=="string"&&(e=Buffer.from(e,r)),this[G1]?(this.emit("error",new Error("write() after end()")),!1):this[Gn]===null||this[WE]||this[uA].length?(this[uA].push(e),this[Ib]=!0,!1):(this[WE]=!0,this[vb](e),!0)}[vb](e){Qa.write(this[Gn],e,0,e.length,this[Ld],(r,o)=>this[VE](r,o))}[VE](e,r){e?this[JE](e):(this[Ld]!==null&&(this[Ld]+=r),this[uA].length?this[v3]():(this[WE]=!1,this[G1]&&!this[sAe]?(this[sAe]=!0,this[Yc](),this.emit("finish")):this[Ib]&&(this[Ib]=!1,this.emit("drain"))))}[v3](){if(this[uA].length===0)this[G1]&&this[VE](null,0);else if(this[uA].length===1)this[vb](this[uA].pop());else{let e=this[uA];this[uA]=[],P3(this[Gn],e,this[Ld],(r,o)=>this[VE](r,o))}}[Yc](){if(this[XE]&&typeof this[Gn]=="number"){let e=this[Gn];this[Gn]=null,Qa.close(e,r=>r?this.emit("error",r):this.emit("close"))}}},k3=class extends xb{[Ch](){let e;if(this[Db]&&this[Eh]==="r+")try{e=Qa.openSync(this[jf],this[Eh],this[Pb])}catch(r){if(r.code==="ENOENT")return this[Eh]="w",this[Ch]();throw r}else e=Qa.openSync(this[jf],this[Eh],this[Pb]);this[ZE](null,e)}[Yc](){if(this[XE]&&typeof this[Gn]=="number"){let e=this[Gn];this[Gn]=null,Qa.closeSync(e),this.emit("close")}}[vb](e){let r=!0;try{this[VE](null,Qa.writeSync(this[Gn],e,0,e.length,this[Ld])),r=!1}finally{if(r)try{this[Yc]()}catch{}}}};Y1.ReadStream=Sb;Y1.ReadStreamSync=b3;Y1.WriteStream=xb;Y1.WriteStreamSync=k3});var Nb=_((cUt,hAe)=>{"use strict";var Plt=ob(),Slt=qE(),xlt=Be("events"),blt=BP(),klt=1024*1024,Qlt=nb(),lAe=sb(),Flt=WU(),Q3=Buffer.from([31,139]),Xl=Symbol("state"),Md=Symbol("writeEntry"),qf=Symbol("readEntry"),F3=Symbol("nextEntry"),cAe=Symbol("processEntry"),Zl=Symbol("extendedHeader"),W1=Symbol("globalExtendedHeader"),wh=Symbol("meta"),uAe=Symbol("emitMeta"),fi=Symbol("buffer"),Gf=Symbol("queue"),Od=Symbol("ended"),AAe=Symbol("emittedEnd"),Ud=Symbol("emit"),Fa=Symbol("unzip"),bb=Symbol("consumeChunk"),kb=Symbol("consumeChunkSub"),T3=Symbol("consumeBody"),fAe=Symbol("consumeMeta"),pAe=Symbol("consumeHeader"),Qb=Symbol("consuming"),R3=Symbol("bufferConcat"),N3=Symbol("maybeEnd"),V1=Symbol("writing"),Ih=Symbol("aborted"),Fb=Symbol("onDone"),_d=Symbol("sawValidEntry"),Tb=Symbol("sawNullBlock"),Rb=Symbol("sawEOF"),Tlt=t=>!0;hAe.exports=Plt(class extends xlt{constructor(e){e=e||{},super(e),this.file=e.file||"",this[_d]=null,this.on(Fb,r=>{(this[Xl]==="begin"||this[_d]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(Fb,e.ondone):this.on(Fb,r=>{this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||klt,this.filter=typeof e.filter=="function"?e.filter:Tlt,this.writable=!0,this.readable=!1,this[Gf]=new blt,this[fi]=null,this[qf]=null,this[Md]=null,this[Xl]="begin",this[wh]="",this[Zl]=null,this[W1]=null,this[Od]=!1,this[Fa]=null,this[Ih]=!1,this[Tb]=!1,this[Rb]=!1,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onentry=="function"&&this.on("entry",e.onentry)}[pAe](e,r){this[_d]===null&&(this[_d]=!1);let o;try{o=new Slt(e,r,this[Zl],this[W1])}catch(a){return this.warn("TAR_ENTRY_INVALID",a)}if(o.nullBlock)this[Tb]?(this[Rb]=!0,this[Xl]==="begin"&&(this[Xl]="header"),this[Ud]("eof")):(this[Tb]=!0,this[Ud]("nullBlock"));else if(this[Tb]=!1,!o.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:o});else if(!o.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:o});else{let a=o.type;if(/^(Symbolic)?Link$/.test(a)&&!o.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:o});else if(!/^(Symbolic)?Link$/.test(a)&&o.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:o});else{let n=this[Md]=new Qlt(o,this[Zl],this[W1]);if(!this[_d])if(n.remain){let u=()=>{n.invalid||(this[_d]=!0)};n.on("end",u)}else this[_d]=!0;n.meta?n.size>this.maxMetaEntrySize?(n.ignore=!0,this[Ud]("ignoredEntry",n),this[Xl]="ignore",n.resume()):n.size>0&&(this[wh]="",n.on("data",u=>this[wh]+=u),this[Xl]="meta"):(this[Zl]=null,n.ignore=n.ignore||!this.filter(n.path,n),n.ignore?(this[Ud]("ignoredEntry",n),this[Xl]=n.remain?"ignore":"header",n.resume()):(n.remain?this[Xl]="body":(this[Xl]="header",n.end()),this[qf]?this[Gf].push(n):(this[Gf].push(n),this[F3]())))}}}[cAe](e){let r=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[qf]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",o=>this[F3]()),r=!1)):(this[qf]=null,r=!1),r}[F3](){do;while(this[cAe](this[Gf].shift()));if(!this[Gf].length){let e=this[qf];!e||e.flowing||e.size===e.remain?this[V1]||this.emit("drain"):e.once("drain",o=>this.emit("drain"))}}[T3](e,r){let o=this[Md],a=o.blockRemain,n=a>=e.length&&r===0?e:e.slice(r,r+a);return o.write(n),o.blockRemain||(this[Xl]="header",this[Md]=null,o.end()),n.length}[fAe](e,r){let o=this[Md],a=this[T3](e,r);return this[Md]||this[uAe](o),a}[Ud](e,r,o){!this[Gf].length&&!this[qf]?this.emit(e,r,o):this[Gf].push([e,r,o])}[uAe](e){switch(this[Ud]("meta",this[wh]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[Zl]=lAe.parse(this[wh],this[Zl],!1);break;case"GlobalExtendedHeader":this[W1]=lAe.parse(this[wh],this[W1],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":this[Zl]=this[Zl]||Object.create(null),this[Zl].path=this[wh].replace(/\0.*/,"");break;case"NextFileHasLongLinkpath":this[Zl]=this[Zl]||Object.create(null),this[Zl].linkpath=this[wh].replace(/\0.*/,"");break;default:throw new Error("unknown meta: "+e.type)}}abort(e){this[Ih]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e){if(this[Ih])return;if(this[Fa]===null&&e){if(this[fi]&&(e=Buffer.concat([this[fi],e]),this[fi]=null),e.lengththis[bb](n)),this[Fa].on("error",n=>this.abort(n)),this[Fa].on("end",n=>{this[Od]=!0,this[bb]()}),this[V1]=!0;let a=this[Fa][o?"end":"write"](e);return this[V1]=!1,a}}this[V1]=!0,this[Fa]?this[Fa].write(e):this[bb](e),this[V1]=!1;let r=this[Gf].length?!1:this[qf]?this[qf].flowing:!0;return!r&&!this[Gf].length&&this[qf].once("drain",o=>this.emit("drain")),r}[R3](e){e&&!this[Ih]&&(this[fi]=this[fi]?Buffer.concat([this[fi],e]):e)}[N3](){if(this[Od]&&!this[AAe]&&!this[Ih]&&!this[Qb]){this[AAe]=!0;let e=this[Md];if(e&&e.blockRemain){let r=this[fi]?this[fi].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${r} available)`,{entry:e}),this[fi]&&e.write(this[fi]),e.end()}this[Ud](Fb)}}[bb](e){if(this[Qb])this[R3](e);else if(!e&&!this[fi])this[N3]();else{if(this[Qb]=!0,this[fi]){this[R3](e);let r=this[fi];this[fi]=null,this[kb](r)}else this[kb](e);for(;this[fi]&&this[fi].length>=512&&!this[Ih]&&!this[Rb];){let r=this[fi];this[fi]=null,this[kb](r)}this[Qb]=!1}(!this[fi]||this[Od])&&this[N3]()}[kb](e){let r=0,o=e.length;for(;r+512<=o&&!this[Ih]&&!this[Rb];)switch(this[Xl]){case"begin":case"header":this[pAe](e,r),r+=512;break;case"ignore":case"body":r+=this[T3](e,r);break;case"meta":r+=this[fAe](e,r);break;default:throw new Error("invalid state: "+this[Xl])}r{"use strict";var Rlt=LE(),dAe=Nb(),eC=Be("fs"),Nlt=$E(),gAe=Be("path"),L3=GE();yAe.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let o=Rlt(t);if(o.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!o.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&Mlt(o,e),o.noResume||Llt(o),o.file&&o.sync?Olt(o):o.file?Ult(o,r):mAe(o)};var Llt=t=>{let e=t.onentry;t.onentry=e?r=>{e(r),r.resume()}:r=>r.resume()},Mlt=(t,e)=>{let r=new Map(e.map(n=>[L3(n),!0])),o=t.filter,a=(n,u)=>{let A=u||gAe.parse(n).root||".",p=n===A?!1:r.has(n)?r.get(n):a(gAe.dirname(n),A);return r.set(n,p),p};t.filter=o?(n,u)=>o(n,u)&&a(L3(n)):n=>a(L3(n))},Olt=t=>{let e=mAe(t),r=t.file,o=!0,a;try{let n=eC.statSync(r),u=t.maxReadSize||16*1024*1024;if(n.size{let r=new dAe(t),o=t.maxReadSize||16*1024*1024,a=t.file,n=new Promise((u,A)=>{r.on("error",A),r.on("end",u),eC.stat(a,(p,h)=>{if(p)A(p);else{let E=new Nlt.ReadStream(a,{readSize:o,size:h.size});E.on("error",A),E.pipe(r)}})});return e?n.then(e,e):n},mAe=t=>new dAe(t)});var vAe=_((AUt,BAe)=>{"use strict";var _lt=LE(),Mb=wb(),EAe=$E(),CAe=Lb(),wAe=Be("path");BAe.exports=(t,e,r)=>{if(typeof e=="function"&&(r=e),Array.isArray(t)&&(e=t,t={}),!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");e=Array.from(e);let o=_lt(t);if(o.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!o.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return o.file&&o.sync?Hlt(o,e):o.file?jlt(o,e,r):o.sync?qlt(o,e):Glt(o,e)};var Hlt=(t,e)=>{let r=new Mb.Sync(t),o=new EAe.WriteStreamSync(t.file,{mode:t.mode||438});r.pipe(o),IAe(r,e)},jlt=(t,e,r)=>{let o=new Mb(t),a=new EAe.WriteStream(t.file,{mode:t.mode||438});o.pipe(a);let n=new Promise((u,A)=>{a.on("error",A),a.on("close",u),o.on("error",A)});return M3(o,e),r?n.then(r,r):n},IAe=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?CAe({file:wAe.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:o=>t.add(o)}):t.add(r)}),t.end()},M3=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return CAe({file:wAe.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:o=>t.add(o)}).then(o=>M3(t,e));t.add(r)}t.end()},qlt=(t,e)=>{let r=new Mb.Sync(t);return IAe(r,e),r},Glt=(t,e)=>{let r=new Mb(t);return M3(r,e),r}});var O3=_((fUt,QAe)=>{"use strict";var Ylt=LE(),DAe=wb(),Al=Be("fs"),PAe=$E(),SAe=Lb(),xAe=Be("path"),bAe=qE();QAe.exports=(t,e,r)=>{let o=Ylt(t);if(!o.file)throw new TypeError("file is required");if(o.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),o.sync?Wlt(o,e):Klt(o,e,r)};var Wlt=(t,e)=>{let r=new DAe.Sync(t),o=!0,a,n;try{try{a=Al.openSync(t.file,"r+")}catch(p){if(p.code==="ENOENT")a=Al.openSync(t.file,"w+");else throw p}let u=Al.fstatSync(a),A=Buffer.alloc(512);e:for(n=0;nu.size)break;n+=h,t.mtimeCache&&t.mtimeCache.set(p.path,p.mtime)}o=!1,Vlt(t,r,n,a,e)}finally{if(o)try{Al.closeSync(a)}catch{}}},Vlt=(t,e,r,o,a)=>{let n=new PAe.WriteStreamSync(t.file,{fd:o,start:r});e.pipe(n),Jlt(e,a)},Klt=(t,e,r)=>{e=Array.from(e);let o=new DAe(t),a=(u,A,p)=>{let h=(C,T)=>{C?Al.close(u,L=>p(C)):p(null,T)},E=0;if(A===0)return h(null,0);let I=0,v=Buffer.alloc(512),b=(C,T)=>{if(C)return h(C);if(I+=T,I<512&&T)return Al.read(u,v,I,v.length-I,E+I,b);if(E===0&&v[0]===31&&v[1]===139)return h(new Error("cannot append to compressed archives"));if(I<512)return h(null,E);let L=new bAe(v);if(!L.cksumValid)return h(null,E);let U=512*Math.ceil(L.size/512);if(E+U+512>A||(E+=U+512,E>=A))return h(null,E);t.mtimeCache&&t.mtimeCache.set(L.path,L.mtime),I=0,Al.read(u,v,0,512,E,b)};Al.read(u,v,0,512,E,b)},n=new Promise((u,A)=>{o.on("error",A);let p="r+",h=(E,I)=>{if(E&&E.code==="ENOENT"&&p==="r+")return p="w+",Al.open(t.file,p,h);if(E)return A(E);Al.fstat(I,(v,b)=>{if(v)return Al.close(I,()=>A(v));a(I,b.size,(C,T)=>{if(C)return A(C);let L=new PAe.WriteStream(t.file,{fd:I,start:T});o.pipe(L),L.on("error",A),L.on("close",u),kAe(o,e)})})};Al.open(t.file,p,h)});return r?n.then(r,r):n},Jlt=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?SAe({file:xAe.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:o=>t.add(o)}):t.add(r)}),t.end()},kAe=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return SAe({file:xAe.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:o=>t.add(o)}).then(o=>kAe(t,e));t.add(r)}t.end()}});var TAe=_((pUt,FAe)=>{"use strict";var zlt=LE(),Xlt=O3();FAe.exports=(t,e,r)=>{let o=zlt(t);if(!o.file)throw new TypeError("file is required");if(o.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),Zlt(o),Xlt(o,e,r)};var Zlt=t=>{let e=t.filter;t.mtimeCache||(t.mtimeCache=new Map),t.filter=e?(r,o)=>e(r,o)&&!(t.mtimeCache.get(r)>o.mtime):(r,o)=>!(t.mtimeCache.get(r)>o.mtime)}});var LAe=_((hUt,NAe)=>{var{promisify:RAe}=Be("util"),Bh=Be("fs"),$lt=t=>{if(!t)t={mode:511,fs:Bh};else if(typeof t=="object")t={mode:511,fs:Bh,...t};else if(typeof t=="number")t={mode:t,fs:Bh};else if(typeof t=="string")t={mode:parseInt(t,8),fs:Bh};else throw new TypeError("invalid options argument");return t.mkdir=t.mkdir||t.fs.mkdir||Bh.mkdir,t.mkdirAsync=RAe(t.mkdir),t.stat=t.stat||t.fs.stat||Bh.stat,t.statAsync=RAe(t.stat),t.statSync=t.statSync||t.fs.statSync||Bh.statSync,t.mkdirSync=t.mkdirSync||t.fs.mkdirSync||Bh.mkdirSync,t};NAe.exports=$lt});var OAe=_((gUt,MAe)=>{var ect=process.platform,{resolve:tct,parse:rct}=Be("path"),nct=t=>{if(/\0/.test(t))throw Object.assign(new TypeError("path must be a string without null bytes"),{path:t,code:"ERR_INVALID_ARG_VALUE"});if(t=tct(t),ect==="win32"){let e=/[*|"<>?:]/,{root:r}=rct(t);if(e.test(t.substr(r.length)))throw Object.assign(new Error("Illegal characters in path."),{path:t,code:"EINVAL"})}return t};MAe.exports=nct});var qAe=_((dUt,jAe)=>{var{dirname:UAe}=Be("path"),_Ae=(t,e,r=void 0)=>r===e?Promise.resolve():t.statAsync(e).then(o=>o.isDirectory()?r:void 0,o=>o.code==="ENOENT"?_Ae(t,UAe(e),e):void 0),HAe=(t,e,r=void 0)=>{if(r!==e)try{return t.statSync(e).isDirectory()?r:void 0}catch(o){return o.code==="ENOENT"?HAe(t,UAe(e),e):void 0}};jAe.exports={findMade:_Ae,findMadeSync:HAe}});var H3=_((mUt,YAe)=>{var{dirname:GAe}=Be("path"),U3=(t,e,r)=>{e.recursive=!1;let o=GAe(t);return o===t?e.mkdirAsync(t,e).catch(a=>{if(a.code!=="EISDIR")throw a}):e.mkdirAsync(t,e).then(()=>r||t,a=>{if(a.code==="ENOENT")return U3(o,e).then(n=>U3(t,e,n));if(a.code!=="EEXIST"&&a.code!=="EROFS")throw a;return e.statAsync(t).then(n=>{if(n.isDirectory())return r;throw a},()=>{throw a})})},_3=(t,e,r)=>{let o=GAe(t);if(e.recursive=!1,o===t)try{return e.mkdirSync(t,e)}catch(a){if(a.code!=="EISDIR")throw a;return}try{return e.mkdirSync(t,e),r||t}catch(a){if(a.code==="ENOENT")return _3(t,e,_3(o,e,r));if(a.code!=="EEXIST"&&a.code!=="EROFS")throw a;try{if(!e.statSync(t).isDirectory())throw a}catch{throw a}}};YAe.exports={mkdirpManual:U3,mkdirpManualSync:_3}});var KAe=_((yUt,VAe)=>{var{dirname:WAe}=Be("path"),{findMade:ict,findMadeSync:sct}=qAe(),{mkdirpManual:oct,mkdirpManualSync:act}=H3(),lct=(t,e)=>(e.recursive=!0,WAe(t)===t?e.mkdirAsync(t,e):ict(e,t).then(o=>e.mkdirAsync(t,e).then(()=>o).catch(a=>{if(a.code==="ENOENT")return oct(t,e);throw a}))),cct=(t,e)=>{if(e.recursive=!0,WAe(t)===t)return e.mkdirSync(t,e);let o=sct(e,t);try{return e.mkdirSync(t,e),o}catch(a){if(a.code==="ENOENT")return act(t,e);throw a}};VAe.exports={mkdirpNative:lct,mkdirpNativeSync:cct}});var ZAe=_((EUt,XAe)=>{var JAe=Be("fs"),uct=process.version,j3=uct.replace(/^v/,"").split("."),zAe=+j3[0]>10||+j3[0]==10&&+j3[1]>=12,Act=zAe?t=>t.mkdir===JAe.mkdir:()=>!1,fct=zAe?t=>t.mkdirSync===JAe.mkdirSync:()=>!1;XAe.exports={useNative:Act,useNativeSync:fct}});var ife=_((CUt,nfe)=>{var tC=LAe(),rC=OAe(),{mkdirpNative:$Ae,mkdirpNativeSync:efe}=KAe(),{mkdirpManual:tfe,mkdirpManualSync:rfe}=H3(),{useNative:pct,useNativeSync:hct}=ZAe(),nC=(t,e)=>(t=rC(t),e=tC(e),pct(e)?$Ae(t,e):tfe(t,e)),gct=(t,e)=>(t=rC(t),e=tC(e),hct(e)?efe(t,e):rfe(t,e));nC.sync=gct;nC.native=(t,e)=>$Ae(rC(t),tC(e));nC.manual=(t,e)=>tfe(rC(t),tC(e));nC.nativeSync=(t,e)=>efe(rC(t),tC(e));nC.manualSync=(t,e)=>rfe(rC(t),tC(e));nfe.exports=nC});var Afe=_((wUt,ufe)=>{"use strict";var $l=Be("fs"),Hd=Be("path"),dct=$l.lchown?"lchown":"chown",mct=$l.lchownSync?"lchownSync":"chownSync",ofe=$l.lchown&&!process.version.match(/v1[1-9]+\./)&&!process.version.match(/v10\.[6-9]/),sfe=(t,e,r)=>{try{return $l[mct](t,e,r)}catch(o){if(o.code!=="ENOENT")throw o}},yct=(t,e,r)=>{try{return $l.chownSync(t,e,r)}catch(o){if(o.code!=="ENOENT")throw o}},Ect=ofe?(t,e,r,o)=>a=>{!a||a.code!=="EISDIR"?o(a):$l.chown(t,e,r,o)}:(t,e,r,o)=>o,q3=ofe?(t,e,r)=>{try{return sfe(t,e,r)}catch(o){if(o.code!=="EISDIR")throw o;yct(t,e,r)}}:(t,e,r)=>sfe(t,e,r),Cct=process.version,afe=(t,e,r)=>$l.readdir(t,e,r),wct=(t,e)=>$l.readdirSync(t,e);/^v4\./.test(Cct)&&(afe=(t,e,r)=>$l.readdir(t,r));var Ob=(t,e,r,o)=>{$l[dct](t,e,r,Ect(t,e,r,a=>{o(a&&a.code!=="ENOENT"?a:null)}))},lfe=(t,e,r,o,a)=>{if(typeof e=="string")return $l.lstat(Hd.resolve(t,e),(n,u)=>{if(n)return a(n.code!=="ENOENT"?n:null);u.name=e,lfe(t,u,r,o,a)});if(e.isDirectory())G3(Hd.resolve(t,e.name),r,o,n=>{if(n)return a(n);let u=Hd.resolve(t,e.name);Ob(u,r,o,a)});else{let n=Hd.resolve(t,e.name);Ob(n,r,o,a)}},G3=(t,e,r,o)=>{afe(t,{withFileTypes:!0},(a,n)=>{if(a){if(a.code==="ENOENT")return o();if(a.code!=="ENOTDIR"&&a.code!=="ENOTSUP")return o(a)}if(a||!n.length)return Ob(t,e,r,o);let u=n.length,A=null,p=h=>{if(!A){if(h)return o(A=h);if(--u===0)return Ob(t,e,r,o)}};n.forEach(h=>lfe(t,h,e,r,p))})},Ict=(t,e,r,o)=>{if(typeof e=="string")try{let a=$l.lstatSync(Hd.resolve(t,e));a.name=e,e=a}catch(a){if(a.code==="ENOENT")return;throw a}e.isDirectory()&&cfe(Hd.resolve(t,e.name),r,o),q3(Hd.resolve(t,e.name),r,o)},cfe=(t,e,r)=>{let o;try{o=wct(t,{withFileTypes:!0})}catch(a){if(a.code==="ENOENT")return;if(a.code==="ENOTDIR"||a.code==="ENOTSUP")return q3(t,e,r);throw a}return o&&o.length&&o.forEach(a=>Ict(t,a,e,r)),q3(t,e,r)};ufe.exports=G3;G3.sync=cfe});var gfe=_((IUt,Y3)=>{"use strict";var ffe=ife(),ec=Be("fs"),Ub=Be("path"),pfe=Afe(),Wc=HE(),_b=class extends Error{constructor(e,r){super("Cannot extract through symbolic link"),this.path=r,this.symlink=e}get name(){return"SylinkError"}},Hb=class extends Error{constructor(e,r){super(r+": Cannot cd into '"+e+"'"),this.path=e,this.code=r}get name(){return"CwdError"}},jb=(t,e)=>t.get(Wc(e)),K1=(t,e,r)=>t.set(Wc(e),r),Bct=(t,e)=>{ec.stat(t,(r,o)=>{(r||!o.isDirectory())&&(r=new Hb(t,r&&r.code||"ENOTDIR")),e(r)})};Y3.exports=(t,e,r)=>{t=Wc(t);let o=e.umask,a=e.mode|448,n=(a&o)!==0,u=e.uid,A=e.gid,p=typeof u=="number"&&typeof A=="number"&&(u!==e.processUid||A!==e.processGid),h=e.preserve,E=e.unlink,I=e.cache,v=Wc(e.cwd),b=(L,U)=>{L?r(L):(K1(I,t,!0),U&&p?pfe(U,u,A,J=>b(J)):n?ec.chmod(t,a,r):r())};if(I&&jb(I,t)===!0)return b();if(t===v)return Bct(t,b);if(h)return ffe(t,{mode:a}).then(L=>b(null,L),b);let T=Wc(Ub.relative(v,t)).split("/");qb(v,T,a,I,E,v,null,b)};var qb=(t,e,r,o,a,n,u,A)=>{if(!e.length)return A(null,u);let p=e.shift(),h=Wc(Ub.resolve(t+"/"+p));if(jb(o,h))return qb(h,e,r,o,a,n,u,A);ec.mkdir(h,r,hfe(h,e,r,o,a,n,u,A))},hfe=(t,e,r,o,a,n,u,A)=>p=>{p?ec.lstat(t,(h,E)=>{if(h)h.path=h.path&&Wc(h.path),A(h);else if(E.isDirectory())qb(t,e,r,o,a,n,u,A);else if(a)ec.unlink(t,I=>{if(I)return A(I);ec.mkdir(t,r,hfe(t,e,r,o,a,n,u,A))});else{if(E.isSymbolicLink())return A(new _b(t,t+"/"+e.join("/")));A(p)}}):(u=u||t,qb(t,e,r,o,a,n,u,A))},vct=t=>{let e=!1,r="ENOTDIR";try{e=ec.statSync(t).isDirectory()}catch(o){r=o.code}finally{if(!e)throw new Hb(t,r)}};Y3.exports.sync=(t,e)=>{t=Wc(t);let r=e.umask,o=e.mode|448,a=(o&r)!==0,n=e.uid,u=e.gid,A=typeof n=="number"&&typeof u=="number"&&(n!==e.processUid||u!==e.processGid),p=e.preserve,h=e.unlink,E=e.cache,I=Wc(e.cwd),v=L=>{K1(E,t,!0),L&&A&&pfe.sync(L,n,u),a&&ec.chmodSync(t,o)};if(E&&jb(E,t)===!0)return v();if(t===I)return vct(I),v();if(p)return v(ffe.sync(t,o));let C=Wc(Ub.relative(I,t)).split("/"),T=null;for(let L=C.shift(),U=I;L&&(U+="/"+L);L=C.shift())if(U=Wc(Ub.resolve(U)),!jb(E,U))try{ec.mkdirSync(U,o),T=T||U,K1(E,U,!0)}catch{let te=ec.lstatSync(U);if(te.isDirectory()){K1(E,U,!0);continue}else if(h){ec.unlinkSync(U),ec.mkdirSync(U,o),T=T||U,K1(E,U,!0);continue}else if(te.isSymbolicLink())return new _b(U,U+"/"+C.join("/"))}return v(T)}});var V3=_((BUt,dfe)=>{var W3=Object.create(null),{hasOwnProperty:Dct}=Object.prototype;dfe.exports=t=>(Dct.call(W3,t)||(W3[t]=t.normalize("NFKD")),W3[t])});var Cfe=_((vUt,Efe)=>{var mfe=Be("assert"),Pct=V3(),Sct=GE(),{join:yfe}=Be("path"),xct=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,bct=xct==="win32";Efe.exports=()=>{let t=new Map,e=new Map,r=h=>h.split("/").slice(0,-1).reduce((I,v)=>(I.length&&(v=yfe(I[I.length-1],v)),I.push(v||"/"),I),[]),o=new Set,a=h=>{let E=e.get(h);if(!E)throw new Error("function does not have any path reservations");return{paths:E.paths.map(I=>t.get(I)),dirs:[...E.dirs].map(I=>t.get(I))}},n=h=>{let{paths:E,dirs:I}=a(h);return E.every(v=>v[0]===h)&&I.every(v=>v[0]instanceof Set&&v[0].has(h))},u=h=>o.has(h)||!n(h)?!1:(o.add(h),h(()=>A(h)),!0),A=h=>{if(!o.has(h))return!1;let{paths:E,dirs:I}=e.get(h),v=new Set;return E.forEach(b=>{let C=t.get(b);mfe.equal(C[0],h),C.length===1?t.delete(b):(C.shift(),typeof C[0]=="function"?v.add(C[0]):C[0].forEach(T=>v.add(T)))}),I.forEach(b=>{let C=t.get(b);mfe(C[0]instanceof Set),C[0].size===1&&C.length===1?t.delete(b):C[0].size===1?(C.shift(),v.add(C[0])):C[0].delete(h)}),o.delete(h),v.forEach(b=>u(b)),!0};return{check:n,reserve:(h,E)=>{h=bct?["win32 parallelization disabled"]:h.map(v=>Pct(Sct(yfe(v))).toLowerCase());let I=new Set(h.map(v=>r(v)).reduce((v,b)=>v.concat(b)));return e.set(E,{dirs:I,paths:h}),h.forEach(v=>{let b=t.get(v);b?b.push(E):t.set(v,[E])}),I.forEach(v=>{let b=t.get(v);b?b[b.length-1]instanceof Set?b[b.length-1].add(E):b.push(new Set([E])):t.set(v,[new Set([E])])}),u(E)}}}});var Bfe=_((DUt,Ife)=>{var kct=process.platform,Qct=kct==="win32",Fct=global.__FAKE_TESTING_FS__||Be("fs"),{O_CREAT:Tct,O_TRUNC:Rct,O_WRONLY:Nct,UV_FS_O_FILEMAP:wfe=0}=Fct.constants,Lct=Qct&&!!wfe,Mct=512*1024,Oct=wfe|Rct|Tct|Nct;Ife.exports=Lct?t=>t"w"});var r_=_((PUt,Mfe)=>{"use strict";var Uct=Be("assert"),_ct=Nb(),vn=Be("fs"),Hct=$E(),Yf=Be("path"),Rfe=gfe(),vfe=r3(),jct=Cfe(),qct=n3(),fl=HE(),Gct=GE(),Yct=V3(),Dfe=Symbol("onEntry"),z3=Symbol("checkFs"),Pfe=Symbol("checkFs2"),Wb=Symbol("pruneCache"),X3=Symbol("isReusable"),tc=Symbol("makeFs"),Z3=Symbol("file"),$3=Symbol("directory"),Vb=Symbol("link"),Sfe=Symbol("symlink"),xfe=Symbol("hardlink"),bfe=Symbol("unsupported"),kfe=Symbol("checkPath"),vh=Symbol("mkdir"),Ro=Symbol("onError"),Gb=Symbol("pending"),Qfe=Symbol("pend"),iC=Symbol("unpend"),K3=Symbol("ended"),J3=Symbol("maybeClose"),e_=Symbol("skip"),J1=Symbol("doChown"),z1=Symbol("uid"),X1=Symbol("gid"),Z1=Symbol("checkedCwd"),Nfe=Be("crypto"),Lfe=Bfe(),Wct=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,$1=Wct==="win32",Vct=(t,e)=>{if(!$1)return vn.unlink(t,e);let r=t+".DELETE."+Nfe.randomBytes(16).toString("hex");vn.rename(t,r,o=>{if(o)return e(o);vn.unlink(r,e)})},Kct=t=>{if(!$1)return vn.unlinkSync(t);let e=t+".DELETE."+Nfe.randomBytes(16).toString("hex");vn.renameSync(t,e),vn.unlinkSync(e)},Ffe=(t,e,r)=>t===t>>>0?t:e===e>>>0?e:r,Tfe=t=>Yct(Gct(fl(t))).toLowerCase(),Jct=(t,e)=>{e=Tfe(e);for(let r of t.keys()){let o=Tfe(r);(o===e||o.indexOf(e+"/")===0)&&t.delete(r)}},zct=t=>{for(let e of t.keys())t.delete(e)},e2=class extends _ct{constructor(e){if(e||(e={}),e.ondone=r=>{this[K3]=!0,this[J3]()},super(e),this[Z1]=!1,this.reservations=jct(),this.transform=typeof e.transform=="function"?e.transform:null,this.writable=!0,this.readable=!1,this[Gb]=0,this[K3]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(e.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=null,this.gid=null,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!="number"?this.preserveOwner=process.getuid&&process.getuid()===0:this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():null,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():null,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||$1,this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=fl(Yf.resolve(e.cwd||process.cwd())),this.strip=+e.strip||0,this.processUmask=e.noChmod?0:process.umask(),this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",r=>this[Dfe](r))}warn(e,r,o={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(o.recoverable=!1),super.warn(e,r,o)}[J3](){this[K3]&&this[Gb]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close"))}[kfe](e){if(this.strip){let r=fl(e.path).split("/");if(r.length=this.strip)e.linkpath=o.slice(this.strip).join("/");else return!1}}if(!this.preservePaths){let r=fl(e.path),o=r.split("/");if(o.includes("..")||$1&&/^[a-z]:\.\.$/i.test(o[0]))return this.warn("TAR_ENTRY_ERROR","path contains '..'",{entry:e,path:r}),!1;let[a,n]=qct(r);a&&(e.path=n,this.warn("TAR_ENTRY_INFO",`stripping ${a} from absolute path`,{entry:e,path:r}))}if(Yf.isAbsolute(e.path)?e.absolute=fl(Yf.resolve(e.path)):e.absolute=fl(Yf.resolve(this.cwd,e.path)),!this.preservePaths&&e.absolute.indexOf(this.cwd+"/")!==0&&e.absolute!==this.cwd)return this.warn("TAR_ENTRY_ERROR","path escaped extraction target",{entry:e,path:fl(e.path),resolvedPath:e.absolute,cwd:this.cwd}),!1;if(e.absolute===this.cwd&&e.type!=="Directory"&&e.type!=="GNUDumpDir")return!1;if(this.win32){let{root:r}=Yf.win32.parse(e.absolute);e.absolute=r+vfe.encode(e.absolute.substr(r.length));let{root:o}=Yf.win32.parse(e.path);e.path=o+vfe.encode(e.path.substr(o.length))}return!0}[Dfe](e){if(!this[kfe](e))return e.resume();switch(Uct.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[z3](e);case"CharacterDevice":case"BlockDevice":case"FIFO":default:return this[bfe](e)}}[Ro](e,r){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:r}),this[iC](),r.resume())}[vh](e,r,o){Rfe(fl(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r,noChmod:this.noChmod},o)}[J1](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[z1](e){return Ffe(this.uid,e.uid,this.processUid)}[X1](e){return Ffe(this.gid,e.gid,this.processGid)}[Z3](e,r){let o=e.mode&4095||this.fmode,a=new Hct.WriteStream(e.absolute,{flags:Lfe(e.size),mode:o,autoClose:!1});a.on("error",p=>{a.fd&&vn.close(a.fd,()=>{}),a.write=()=>!0,this[Ro](p,e),r()});let n=1,u=p=>{if(p){a.fd&&vn.close(a.fd,()=>{}),this[Ro](p,e),r();return}--n===0&&vn.close(a.fd,h=>{h?this[Ro](h,e):this[iC](),r()})};a.on("finish",p=>{let h=e.absolute,E=a.fd;if(e.mtime&&!this.noMtime){n++;let I=e.atime||new Date,v=e.mtime;vn.futimes(E,I,v,b=>b?vn.utimes(h,I,v,C=>u(C&&b)):u())}if(this[J1](e)){n++;let I=this[z1](e),v=this[X1](e);vn.fchown(E,I,v,b=>b?vn.chown(h,I,v,C=>u(C&&b)):u())}u()});let A=this.transform&&this.transform(e)||e;A!==e&&(A.on("error",p=>{this[Ro](p,e),r()}),e.pipe(A)),A.pipe(a)}[$3](e,r){let o=e.mode&4095||this.dmode;this[vh](e.absolute,o,a=>{if(a){this[Ro](a,e),r();return}let n=1,u=A=>{--n===0&&(r(),this[iC](),e.resume())};e.mtime&&!this.noMtime&&(n++,vn.utimes(e.absolute,e.atime||new Date,e.mtime,u)),this[J1](e)&&(n++,vn.chown(e.absolute,this[z1](e),this[X1](e),u)),u()})}[bfe](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[Sfe](e,r){this[Vb](e,e.linkpath,"symlink",r)}[xfe](e,r){let o=fl(Yf.resolve(this.cwd,e.linkpath));this[Vb](e,o,"link",r)}[Qfe](){this[Gb]++}[iC](){this[Gb]--,this[J3]()}[e_](e){this[iC](),e.resume()}[X3](e,r){return e.type==="File"&&!this.unlink&&r.isFile()&&r.nlink<=1&&!$1}[z3](e){this[Qfe]();let r=[e.path];e.linkpath&&r.push(e.linkpath),this.reservations.reserve(r,o=>this[Pfe](e,o))}[Wb](e){e.type==="SymbolicLink"?zct(this.dirCache):e.type!=="Directory"&&Jct(this.dirCache,e.absolute)}[Pfe](e,r){this[Wb](e);let o=A=>{this[Wb](e),r(A)},a=()=>{this[vh](this.cwd,this.dmode,A=>{if(A){this[Ro](A,e),o();return}this[Z1]=!0,n()})},n=()=>{if(e.absolute!==this.cwd){let A=fl(Yf.dirname(e.absolute));if(A!==this.cwd)return this[vh](A,this.dmode,p=>{if(p){this[Ro](p,e),o();return}u()})}u()},u=()=>{vn.lstat(e.absolute,(A,p)=>{if(p&&(this.keep||this.newer&&p.mtime>e.mtime)){this[e_](e),o();return}if(A||this[X3](e,p))return this[tc](null,e,o);if(p.isDirectory()){if(e.type==="Directory"){let h=!this.noChmod&&e.mode&&(p.mode&4095)!==e.mode,E=I=>this[tc](I,e,o);return h?vn.chmod(e.absolute,e.mode,E):E()}if(e.absolute!==this.cwd)return vn.rmdir(e.absolute,h=>this[tc](h,e,o))}if(e.absolute===this.cwd)return this[tc](null,e,o);Vct(e.absolute,h=>this[tc](h,e,o))})};this[Z1]?n():a()}[tc](e,r,o){if(e){this[Ro](e,r),o();return}switch(r.type){case"File":case"OldFile":case"ContiguousFile":return this[Z3](r,o);case"Link":return this[xfe](r,o);case"SymbolicLink":return this[Sfe](r,o);case"Directory":case"GNUDumpDir":return this[$3](r,o)}}[Vb](e,r,o,a){vn[o](r,e.absolute,n=>{n?this[Ro](n,e):(this[iC](),e.resume()),a()})}},Yb=t=>{try{return[null,t()]}catch(e){return[e,null]}},t_=class extends e2{[tc](e,r){return super[tc](e,r,()=>{})}[z3](e){if(this[Wb](e),!this[Z1]){let n=this[vh](this.cwd,this.dmode);if(n)return this[Ro](n,e);this[Z1]=!0}if(e.absolute!==this.cwd){let n=fl(Yf.dirname(e.absolute));if(n!==this.cwd){let u=this[vh](n,this.dmode);if(u)return this[Ro](u,e)}}let[r,o]=Yb(()=>vn.lstatSync(e.absolute));if(o&&(this.keep||this.newer&&o.mtime>e.mtime))return this[e_](e);if(r||this[X3](e,o))return this[tc](null,e);if(o.isDirectory()){if(e.type==="Directory"){let u=!this.noChmod&&e.mode&&(o.mode&4095)!==e.mode,[A]=u?Yb(()=>{vn.chmodSync(e.absolute,e.mode)}):[];return this[tc](A,e)}let[n]=Yb(()=>vn.rmdirSync(e.absolute));this[tc](n,e)}let[a]=e.absolute===this.cwd?[]:Yb(()=>Kct(e.absolute));this[tc](a,e)}[Z3](e,r){let o=e.mode&4095||this.fmode,a=A=>{let p;try{vn.closeSync(n)}catch(h){p=h}(A||p)&&this[Ro](A||p,e),r()},n;try{n=vn.openSync(e.absolute,Lfe(e.size),o)}catch(A){return a(A)}let u=this.transform&&this.transform(e)||e;u!==e&&(u.on("error",A=>this[Ro](A,e)),e.pipe(u)),u.on("data",A=>{try{vn.writeSync(n,A,0,A.length)}catch(p){a(p)}}),u.on("end",A=>{let p=null;if(e.mtime&&!this.noMtime){let h=e.atime||new Date,E=e.mtime;try{vn.futimesSync(n,h,E)}catch(I){try{vn.utimesSync(e.absolute,h,E)}catch{p=I}}}if(this[J1](e)){let h=this[z1](e),E=this[X1](e);try{vn.fchownSync(n,h,E)}catch(I){try{vn.chownSync(e.absolute,h,E)}catch{p=p||I}}}a(p)})}[$3](e,r){let o=e.mode&4095||this.dmode,a=this[vh](e.absolute,o);if(a){this[Ro](a,e),r();return}if(e.mtime&&!this.noMtime)try{vn.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch{}if(this[J1](e))try{vn.chownSync(e.absolute,this[z1](e),this[X1](e))}catch{}r(),e.resume()}[vh](e,r){try{return Rfe.sync(fl(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r})}catch(o){return o}}[Vb](e,r,o,a){try{vn[o+"Sync"](r,e.absolute),a(),e.resume()}catch(n){return this[Ro](n,e)}}};e2.Sync=t_;Mfe.exports=e2});var jfe=_((SUt,Hfe)=>{"use strict";var Xct=LE(),Kb=r_(),Ufe=Be("fs"),_fe=$E(),Ofe=Be("path"),n_=GE();Hfe.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let o=Xct(t);if(o.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!o.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&Zct(o,e),o.file&&o.sync?$ct(o):o.file?eut(o,r):o.sync?tut(o):rut(o)};var Zct=(t,e)=>{let r=new Map(e.map(n=>[n_(n),!0])),o=t.filter,a=(n,u)=>{let A=u||Ofe.parse(n).root||".",p=n===A?!1:r.has(n)?r.get(n):a(Ofe.dirname(n),A);return r.set(n,p),p};t.filter=o?(n,u)=>o(n,u)&&a(n_(n)):n=>a(n_(n))},$ct=t=>{let e=new Kb.Sync(t),r=t.file,o=Ufe.statSync(r),a=t.maxReadSize||16*1024*1024;new _fe.ReadStreamSync(r,{readSize:a,size:o.size}).pipe(e)},eut=(t,e)=>{let r=new Kb(t),o=t.maxReadSize||16*1024*1024,a=t.file,n=new Promise((u,A)=>{r.on("error",A),r.on("close",u),Ufe.stat(a,(p,h)=>{if(p)A(p);else{let E=new _fe.ReadStream(a,{readSize:o,size:h.size});E.on("error",A),E.pipe(r)}})});return e?n.then(e,e):n},tut=t=>new Kb.Sync(t),rut=t=>new Kb(t)});var qfe=_(us=>{"use strict";us.c=us.create=vAe();us.r=us.replace=O3();us.t=us.list=Lb();us.u=us.update=TAe();us.x=us.extract=jfe();us.Pack=wb();us.Unpack=r_();us.Parse=Nb();us.ReadEntry=nb();us.WriteEntry=p3();us.Header=qE();us.Pax=sb();us.types=JU()});var i_,Gfe,Dh,t2,r2,Yfe=Et(()=>{i_=$e(nd()),Gfe=Be("worker_threads"),Dh=Symbol("kTaskInfo"),t2=class{constructor(e,r){this.fn=e;this.limit=(0,i_.default)(r.poolSize)}run(e){return this.limit(()=>this.fn(e))}},r2=class{constructor(e,r){this.source=e;this.workers=[];this.limit=(0,i_.default)(r.poolSize),this.cleanupInterval=setInterval(()=>{if(this.limit.pendingCount===0&&this.limit.activeCount===0){let o=this.workers.pop();o?o.terminate():clearInterval(this.cleanupInterval)}},5e3).unref()}createWorker(){this.cleanupInterval.refresh();let e=new Gfe.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,"--unhandled-rejections=strict"]});return e.on("message",r=>{if(!e[Dh])throw new Error("Assertion failed: Worker sent a result without having a task assigned");e[Dh].resolve(r),e[Dh]=null,e.unref(),this.workers.push(e)}),e.on("error",r=>{e[Dh]?.reject(r),e[Dh]=null}),e.on("exit",r=>{r!==0&&e[Dh]?.reject(new Error(`Worker exited with code ${r}`)),e[Dh]=null}),e}run(e){return this.limit(()=>{let r=this.workers.pop()??this.createWorker();return r.ref(),new Promise((o,a)=>{r[Dh]={resolve:o,reject:a},r.postMessage(e)})})}}});var Vfe=_((QUt,Wfe)=>{var s_;Wfe.exports.getContent=()=>(typeof s_>"u"&&(s_=Be("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),s_)});var Xi={};Kt(Xi,{convertToZip:()=>out,convertToZipWorker:()=>l_,extractArchiveTo:()=>Zfe,getDefaultTaskPool:()=>zfe,getTaskPoolForConfiguration:()=>Xfe,makeArchiveFromDirectory:()=>sut});function nut(t,e){switch(t){case"async":return new t2(l_,{poolSize:e});case"workers":return new r2((0,a_.getContent)(),{poolSize:e});default:throw new Error(`Assertion failed: Unknown value ${t} for taskPoolMode`)}}function zfe(){return typeof o_>"u"&&(o_=nut("workers",Ji.availableParallelism())),o_}function Xfe(t){return typeof t>"u"?zfe():ol(iut,t,()=>{let e=t.get("taskPoolMode"),r=t.get("taskPoolConcurrency");switch(e){case"async":return new t2(l_,{poolSize:r});case"workers":return new r2((0,a_.getContent)(),{poolSize:r});default:throw new Error(`Assertion failed: Unknown value ${e} for taskPoolMode`)}})}async function l_(t){let{tmpFile:e,tgz:r,compressionLevel:o,extractBufferOpts:a}=t,n=new zi(e,{create:!0,level:o,stats:Ea.makeDefaultStats()}),u=Buffer.from(r.buffer,r.byteOffset,r.byteLength);return await Zfe(u,n,a),n.saveAndClose(),e}async function sut(t,{baseFs:e=new Rn,prefixPath:r=Bt.root,compressionLevel:o,inMemory:a=!1}={}){let n;if(a)n=new zi(null,{level:o});else{let A=await oe.mktempPromise(),p=K.join(A,"archive.zip");n=new zi(p,{create:!0,level:o})}let u=K.resolve(Bt.root,r);return await n.copyPromise(u,t,{baseFs:e,stableTime:!0,stableSort:!0}),n}async function out(t,e={}){let r=await oe.mktempPromise(),o=K.join(r,"archive.zip"),a=e.compressionLevel??e.configuration?.get("compressionLevel")??"mixed",n={prefixPath:e.prefixPath,stripComponents:e.stripComponents};return await(e.taskPool??Xfe(e.configuration)).run({tmpFile:o,tgz:t,compressionLevel:a,extractBufferOpts:n}),new zi(o,{level:e.compressionLevel})}async function*aut(t){let e=new Jfe.default.Parse,r=new Kfe.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on("entry",o=>{r.write(o)}),e.on("error",o=>{r.destroy(o)}),e.on("close",()=>{r.destroyed||r.end()}),e.end(t);for await(let o of r){let a=o;yield a,a.resume()}}async function Zfe(t,e,{stripComponents:r=0,prefixPath:o=Bt.dot}={}){function a(n){if(n.path[0]==="/")return!0;let u=n.path.split(/\//g);return!!(u.some(A=>A==="..")||u.length<=r)}for await(let n of aut(t)){if(a(n))continue;let u=K.normalize(ue.toPortablePath(n.path)).replace(/\/$/,"").split(/\//g);if(u.length<=r)continue;let A=u.slice(r).join("/"),p=K.join(o,A),h=420;switch((n.type==="Directory"||((n.mode??0)&73)!==0)&&(h|=73),n.type){case"Directory":e.mkdirpSync(K.dirname(p),{chmod:493,utimes:[vi.SAFE_TIME,vi.SAFE_TIME]}),e.mkdirSync(p,{mode:h}),e.utimesSync(p,vi.SAFE_TIME,vi.SAFE_TIME);break;case"OldFile":case"File":e.mkdirpSync(K.dirname(p),{chmod:493,utimes:[vi.SAFE_TIME,vi.SAFE_TIME]}),e.writeFileSync(p,await Vy(n),{mode:h}),e.utimesSync(p,vi.SAFE_TIME,vi.SAFE_TIME);break;case"SymbolicLink":e.mkdirpSync(K.dirname(p),{chmod:493,utimes:[vi.SAFE_TIME,vi.SAFE_TIME]}),e.symlinkSync(n.linkpath,p),e.lutimesSync(p,vi.SAFE_TIME,vi.SAFE_TIME);break}}return e}var Kfe,Jfe,a_,o_,iut,$fe=Et(()=>{Ye();Pt();nA();Kfe=Be("stream"),Jfe=$e(qfe());Yfe();jl();a_=$e(Vfe());iut=new WeakMap});var tpe=_((c_,epe)=>{(function(t,e){typeof c_=="object"?epe.exports=e():typeof define=="function"&&define.amd?define(e):t.treeify=e()})(c_,function(){function t(a,n){var u=n?"\u2514":"\u251C";return a?u+="\u2500 ":u+="\u2500\u2500\u2510",u}function e(a,n){var u=[];for(var A in a)!a.hasOwnProperty(A)||n&&typeof a[A]=="function"||u.push(A);return u}function r(a,n,u,A,p,h,E){var I="",v=0,b,C,T=A.slice(0);if(T.push([n,u])&&A.length>0&&(A.forEach(function(U,J){J>0&&(I+=(U[1]?" ":"\u2502")+" "),!C&&U[0]===n&&(C=!0)}),I+=t(a,u)+a,p&&(typeof n!="object"||n instanceof Date)&&(I+=": "+n),C&&(I+=" (circular ref.)"),E(I)),!C&&typeof n=="object"){var L=e(n,h);L.forEach(function(U){b=++v===L.length,r(U,n[U],b,T,p,h,E)})}}var o={};return o.asLines=function(a,n,u,A){var p=typeof u!="function"?u:!1;r(".",a,!1,[],n,p,A||u)},o.asTree=function(a,n,u){var A="";return r(".",a,!1,[],n,u,function(p){A+=p+` +`}),A},o})});var $s={};Kt($s,{emitList:()=>lut,emitTree:()=>spe,treeNodeToJson:()=>ipe,treeNodeToTreeify:()=>npe});function npe(t,{configuration:e}){let r={},o=0,a=(n,u)=>{let A=Array.isArray(n)?n.entries():Object.entries(n);for(let[p,h]of A){if(!h)continue;let{label:E,value:I,children:v}=h,b=[];typeof E<"u"&&b.push(md(e,E,2)),typeof I<"u"&&b.push(Ot(e,I[0],I[1])),b.length===0&&b.push(md(e,`${p}`,2));let C=b.join(": ").trim(),T=`\0${o++}\0`,L=u[`${T}${C}`]={};typeof v<"u"&&a(v,L)}};if(typeof t.children>"u")throw new Error("The root node must only contain children");return a(t.children,r),r}function ipe(t){let e=r=>{if(typeof r.children>"u"){if(typeof r.value>"u")throw new Error("Assertion failed: Expected a value to be set if the children are missing");return yd(r.value[0],r.value[1])}let o=Array.isArray(r.children)?r.children.entries():Object.entries(r.children??{}),a=Array.isArray(r.children)?[]:{};for(let[n,u]of o)u&&(a[cut(n)]=e(u));return typeof r.value>"u"?a:{value:yd(r.value[0],r.value[1]),children:a}};return e(t)}function lut(t,{configuration:e,stdout:r,json:o}){let a=t.map(n=>({value:n}));spe({children:a},{configuration:e,stdout:r,json:o})}function spe(t,{configuration:e,stdout:r,json:o,separators:a=0}){if(o){let u=Array.isArray(t.children)?t.children.values():Object.values(t.children??{});for(let A of u)A&&r.write(`${JSON.stringify(ipe(A))} +`);return}let n=(0,rpe.asTree)(npe(t,{configuration:e}),!1,!1);if(n=n.replace(/\0[0-9]+\0/g,""),a>=1&&(n=n.replace(/^([├└]─)/gm,`\u2502 +$1`).replace(/^│\n/,"")),a>=2)for(let u=0;u<2;++u)n=n.replace(/^([│ ].{2}[├│ ].{2}[^\n]+\n)(([│ ]).{2}[├└].{2}[^\n]*\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3 \u2502 +$2`).replace(/^│\n/,"");if(a>=3)throw new Error("Only the first two levels are accepted by treeUtils.emitTree");r.write(n)}function cut(t){return typeof t=="string"?t.replace(/^\0[0-9]+\0/,""):t}var rpe,ope=Et(()=>{rpe=$e(tpe());ql()});function n2(t){let e=t.match(uut);if(!e?.groups)throw new Error("Assertion failed: Expected the checksum to match the requested pattern");let r=e.groups.cacheVersion?parseInt(e.groups.cacheVersion):null;return{cacheKey:e.groups.cacheKey??null,cacheVersion:r,cacheSpec:e.groups.cacheSpec??null,hash:e.groups.hash}}var ape,u_,A_,Jb,Lr,uut,f_=Et(()=>{Ye();Pt();Pt();nA();ape=Be("crypto"),u_=$e(Be("fs"));Yl();rh();jl();xo();A_=Ky(process.env.YARN_CACHE_CHECKPOINT_OVERRIDE??process.env.YARN_CACHE_VERSION_OVERRIDE??9),Jb=Ky(process.env.YARN_CACHE_VERSION_OVERRIDE??10),Lr=class{constructor(e,{configuration:r,immutable:o=r.get("enableImmutableCache"),check:a=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.cacheId=`-${(0,ape.randomBytes)(8).toString("hex")}.tmp`;this.configuration=r,this.cwd=e,this.immutable=o,this.check=a;let{cacheSpec:n,cacheKey:u}=Lr.getCacheKey(r);this.cacheSpec=n,this.cacheKey=u}static async find(e,{immutable:r,check:o}={}){let a=new Lr(e.get("cacheFolder"),{configuration:e,immutable:r,check:o});return await a.setup(),a}static getCacheKey(e){let r=e.get("compressionLevel"),o=r!=="mixed"?`c${r}`:"";return{cacheKey:[Jb,o].join(""),cacheSpec:o}}get mirrorCwd(){if(!this.configuration.get("enableMirror"))return null;let e=`${this.configuration.get("globalFolder")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${aE(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,r){let a=n2(r).hash.slice(0,10);return`${aE(e)}-${a}.zip`}isChecksumCompatible(e){if(e===null)return!1;let{cacheVersion:r,cacheSpec:o}=n2(e);if(r===null||r{let ae=new zi,we=K.join(Bt.root,sO(e));return ae.mkdirSync(we,{recursive:!0}),ae.writeJsonSync(K.join(we,dr.manifest),{name:fn(e),mocked:!0}),ae},E=async(ae,{isColdHit:we,controlPath:Pe=null})=>{if(Pe===null&&u.unstablePackages?.has(e.locatorHash))return{isValid:!0,hash:null};let g=r&&!we?n2(r).cacheKey:this.cacheKey,Ee=!u.skipIntegrityCheck||!r?`${g}/${await LS(ae)}`:r;if(Pe!==null){let ce=!u.skipIntegrityCheck||!r?`${this.cacheKey}/${await LS(Pe)}`:r;if(Ee!==ce)throw new zt(18,"The remote archive doesn't match the local checksum - has the local cache been corrupted?")}let De=null;switch(r!==null&&Ee!==r&&(this.check?De="throw":n2(r).cacheKey!==n2(Ee).cacheKey?De="update":De=this.configuration.get("checksumBehavior")),De){case null:case"update":return{isValid:!0,hash:Ee};case"ignore":return{isValid:!0,hash:r};case"reset":return{isValid:!1,hash:r};default:case"throw":throw new zt(18,"The remote archive doesn't match the expected checksum")}},I=async ae=>{if(!n)throw new Error(`Cache check required but no loader configured for ${jr(this.configuration,e)}`);let we=await n(),Pe=we.getRealPath();we.saveAndClose(),await oe.chmodPromise(Pe,420);let g=await E(ae,{controlPath:Pe,isColdHit:!1});if(!g.isValid)throw new Error("Assertion failed: Expected a valid checksum");return g.hash},v=async()=>{if(A===null||!await oe.existsPromise(A)){let ae=await n(),we=ae.getRealPath();return ae.saveAndClose(),{source:"loader",path:we}}return{source:"mirror",path:A}},b=async()=>{if(!n)throw new Error(`Cache entry required but missing for ${jr(this.configuration,e)}`);if(this.immutable)throw new zt(56,`Cache entry required but missing for ${jr(this.configuration,e)}`);let{path:ae,source:we}=await v(),{hash:Pe}=await E(ae,{isColdHit:!0}),g=this.getLocatorPath(e,Pe),Ee=[];we!=="mirror"&&A!==null&&Ee.push(async()=>{let ce=`${A}${this.cacheId}`;await oe.copyFilePromise(ae,ce,u_.default.constants.COPYFILE_FICLONE),await oe.chmodPromise(ce,420),await oe.renamePromise(ce,A)}),(!u.mirrorWriteOnly||A===null)&&Ee.push(async()=>{let ce=`${g}${this.cacheId}`;await oe.copyFilePromise(ae,ce,u_.default.constants.COPYFILE_FICLONE),await oe.chmodPromise(ce,420),await oe.renamePromise(ce,g)});let De=u.mirrorWriteOnly?A??g:g;return await Promise.all(Ee.map(ce=>ce())),[!1,De,Pe]},C=async()=>{let we=(async()=>{let Pe=u.unstablePackages?.has(e.locatorHash),g=Pe||!r||this.isChecksumCompatible(r)?this.getLocatorPath(e,r):null,Ee=g!==null?this.markedFiles.has(g)||await p.existsPromise(g):!1,De=!!u.mockedPackages?.has(e.locatorHash)&&(!this.check||!Ee),ce=De||Ee,ne=ce?o:a;if(ne&&ne(),ce){let ee=null,Ie=g;if(!De)if(this.check)ee=await I(Ie);else{let ke=await E(Ie,{isColdHit:!1});if(ke.isValid)ee=ke.hash;else return b()}return[De,Ie,ee]}else{if(this.immutable&&Pe)throw new zt(56,`Cache entry required but missing for ${jr(this.configuration,e)}; consider defining ${de.pretty(this.configuration,"supportedArchitectures",de.Type.CODE)} to cache packages for multiple systems`);return b()}})();this.mutexes.set(e.locatorHash,we);try{return await we}finally{this.mutexes.delete(e.locatorHash)}};for(let ae;ae=this.mutexes.get(e.locatorHash);)await ae;let[T,L,U]=await C();T||this.markedFiles.add(L);let J,te=T?()=>h():()=>new zi(L,{baseFs:p,readOnly:!0}),le=new ny(()=>wL(()=>J=te(),ae=>`Failed to open the cache entry for ${jr(this.configuration,e)}: ${ae}`),K),pe=new Uu(L,{baseFs:le,pathUtils:K}),Ae=()=>{J?.discardAndClose()},ye=u.unstablePackages?.has(e.locatorHash)?null:U;return[pe,Ae,ye]}},uut=/^(?:(?(?[0-9]+)(?.*))\/)?(?.*)$/});var zb,lpe=Et(()=>{zb=(r=>(r[r.SCRIPT=0]="SCRIPT",r[r.SHELLCODE=1]="SHELLCODE",r))(zb||{})});var Aut,sC,p_=Et(()=>{Pt();Nl();kf();xo();Aut=[[/^(git(?:\+(?:https|ssh))?:\/\/.*(?:\.git)?)#(.*)$/,(t,e,r,o)=>`${r}#commit=${o}`],[/^https:\/\/((?:[^/]+?)@)?codeload\.github\.com\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/,(t,e,r="",o,a)=>`https://${r}github.com/${o}.git#commit=${a}`],[/^https:\/\/((?:[^/]+?)@)?github\.com\/([^/]+\/[^/]+?)(?:\.git)?#([0-9a-f]+)$/,(t,e,r="",o,a)=>`https://${r}github.com/${o}.git#commit=${a}`],[/^https?:\/\/[^/]+\/(?:[^/]+\/)*(?:@.+(?:\/|(?:%2f)))?([^/]+)\/(?:-|download)\/\1-[^/]+\.tgz(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.pkg\.github\.com\/download\/(?:@[^/]+)\/(?:[^/]+)\/(?:[^/]+)\/(?:[0-9a-f]+)(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.fontawesome\.com\/(?:@[^/]+)\/([^/]+)\/-\/([^/]+)\/\1-\2.tgz(?:#|$)/,t=>`npm:${t}`],[/^https?:\/\/[^/]+\/.*\/(@[^/]+)\/([^/]+)\/-\/\1\/\2-(?:[.\d\w-]+)\.tgz(?:#|$)/,(t,e)=>HS({protocol:"npm:",source:null,selector:t,params:{__archiveUrl:e}})],[/^[^/]+\.tgz#[0-9a-f]+$/,t=>`npm:${t}`]],sC=class{constructor(e){this.resolver=e;this.resolutions=null}async setup(e,{report:r}){let o=K.join(e.cwd,dr.lockfile);if(!oe.existsSync(o))return;let a=await oe.readFilePromise(o,"utf8"),n=Vi(a);if(Object.hasOwn(n,"__metadata"))return;let u=this.resolutions=new Map;for(let A of Object.keys(n)){let p=i1(A);if(!p){r.reportWarning(14,`Failed to parse the string "${A}" into a proper descriptor`);continue}let h=ba(p.range)?In(p,`npm:${p.range}`):p,{version:E,resolved:I}=n[A];if(!I)continue;let v;for(let[C,T]of Aut){let L=I.match(C);if(L){v=T(E,...L);break}}if(!v){r.reportWarning(14,`${qn(e.configuration,h)}: Only some patterns can be imported from legacy lockfiles (not "${I}")`);continue}let b=h;try{let C=Id(h.range),T=i1(C.selector,!0);T&&(b=T)}catch{}u.set(h.descriptorHash,Qs(b,v))}}supportsDescriptor(e,r){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!this.resolutions)throw new Error("Assertion failed: The resolution store should have been setup");let a=this.resolutions.get(e.descriptorHash);if(!a)throw new Error("Assertion failed: The resolution should have been registered");let n=tO(a),u=o.project.configuration.normalizeDependency(n);return await this.resolver.getCandidates(u,r,o)}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}}});var AA,cpe=Et(()=>{Yl();L1();ql();AA=class extends Xs{constructor({configuration:r,stdout:o,suggestInstall:a=!0}){super();this.errorCount=0;zI(this,{configuration:r}),this.configuration=r,this.stdout=o,this.suggestInstall=a}static async start(r,o){let a=new this(r);try{await o(a)}catch(n){a.reportExceptionOnce(n)}finally{await a.finalize()}return a}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(r){}reportCacheMiss(r){}startSectionSync(r,o){return o()}async startSectionPromise(r,o){return await o()}startTimerSync(r,o,a){return(typeof o=="function"?o:a)()}async startTimerPromise(r,o,a){return await(typeof o=="function"?o:a)()}reportSeparator(){}reportInfo(r,o){}reportWarning(r,o){}reportError(r,o){this.errorCount+=1,this.stdout.write(`${Ot(this.configuration,"\u27A4","redBright")} ${this.formatNameWithHyperlink(r)}: ${o} +`)}reportProgress(r){return{...Promise.resolve().then(async()=>{for await(let{}of r);}),stop:()=>{}}}reportJson(r){}reportFold(r,o){}async finalize(){this.errorCount>0&&(this.stdout.write(` +`),this.stdout.write(`${Ot(this.configuration,"\u27A4","redBright")} Errors happened when preparing the environment required to run this command. +`),this.suggestInstall&&this.stdout.write(`${Ot(this.configuration,"\u27A4","redBright")} This might be caused by packages being missing from the lockfile, in which case running "yarn install" might help. +`))}formatNameWithHyperlink(r){return CU(r,{configuration:this.configuration,json:!1})}}});var oC,h_=Et(()=>{xo();oC=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return!!(r.project.storedResolutions.get(e.descriptorHash)||r.project.originalPackages.has(OS(e).locatorHash))}supportsLocator(e,r){return!!(r.project.originalPackages.has(e.locatorHash)&&!r.project.lockfileNeedsRefresh)}shouldPersistResolution(e,r){throw new Error("The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,o){let a=o.project.storedResolutions.get(e.descriptorHash);if(a){let u=o.project.originalPackages.get(a);if(u)return[u]}let n=o.project.originalPackages.get(OS(e).locatorHash);if(n)return[n];throw new Error("Resolution expected from the lockfile data")}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let o=r.project.originalPackages.get(e.locatorHash);if(!o)throw new Error("The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache");return o}}});function Wf(){}function fut(t,e,r,o,a){for(var n=0,u=e.length,A=0,p=0;nb.length?T:b}),h.value=t.join(E)}else h.value=t.join(r.slice(A,A+h.count));A+=h.count,h.added||(p+=h.count)}}var v=e[u-1];return u>1&&typeof v.value=="string"&&(v.added||v.removed)&&t.equals("",v.value)&&(e[u-2].value+=v.value,e.pop()),e}function put(t){return{newPos:t.newPos,components:t.components.slice(0)}}function hut(t,e){if(typeof t=="function")e.callback=t;else if(t)for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e}function fpe(t,e,r){return r=hut(r,{ignoreWhitespace:!0}),E_.diff(t,e,r)}function gut(t,e,r){return C_.diff(t,e,r)}function Xb(t){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Xb=function(e){return typeof e}:Xb=function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Xb(t)}function g_(t){return yut(t)||Eut(t)||Cut(t)||wut()}function yut(t){if(Array.isArray(t))return d_(t)}function Eut(t){if(typeof Symbol<"u"&&Symbol.iterator in Object(t))return Array.from(t)}function Cut(t,e){if(!!t){if(typeof t=="string")return d_(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);if(r==="Object"&&t.constructor&&(r=t.constructor.name),r==="Map"||r==="Set")return Array.from(t);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return d_(t,e)}}function d_(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,o=new Array(e);r"u"&&(u.context=4);var A=gut(r,o,u);if(!A)return;A.push({value:"",lines:[]});function p(U){return U.map(function(J){return" "+J})}for(var h=[],E=0,I=0,v=[],b=1,C=1,T=function(J){var te=A[J],le=te.lines||te.value.replace(/\n$/,"").split(` +`);if(te.lines=le,te.added||te.removed){var pe;if(!E){var Ae=A[J-1];E=b,I=C,Ae&&(v=u.context>0?p(Ae.lines.slice(-u.context)):[],E-=v.length,I-=v.length)}(pe=v).push.apply(pe,g_(le.map(function(ce){return(te.added?"+":"-")+ce}))),te.added?C+=le.length:b+=le.length}else{if(E)if(le.length<=u.context*2&&J=A.length-2&&le.length<=u.context){var g=/\n$/.test(r),Ee=/\n$/.test(o),De=le.length==0&&v.length>Pe.oldLines;!g&&De&&r.length>0&&v.splice(Pe.oldLines,0,"\\ No newline at end of file"),(!g&&!De||!Ee)&&v.push("\\ No newline at end of file")}h.push(Pe),E=0,I=0,v=[]}b+=le.length,C+=le.length}},L=0;L{Wf.prototype={diff:function(e,r){var o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},a=o.callback;typeof o=="function"&&(a=o,o={}),this.options=o;var n=this;function u(T){return a?(setTimeout(function(){a(void 0,T)},0),!0):T}e=this.castInput(e),r=this.castInput(r),e=this.removeEmpty(this.tokenize(e)),r=this.removeEmpty(this.tokenize(r));var A=r.length,p=e.length,h=1,E=A+p;o.maxEditLength&&(E=Math.min(E,o.maxEditLength));var I=[{newPos:-1,components:[]}],v=this.extractCommon(I[0],r,e,0);if(I[0].newPos+1>=A&&v+1>=p)return u([{value:this.join(r),count:r.length}]);function b(){for(var T=-1*h;T<=h;T+=2){var L=void 0,U=I[T-1],J=I[T+1],te=(J?J.newPos:0)-T;U&&(I[T-1]=void 0);var le=U&&U.newPos+1=A&&te+1>=p)return u(fut(n,L.components,r,e,n.useLongestToken));I[T]=L}h++}if(a)(function T(){setTimeout(function(){if(h>E)return a();b()||T()},0)})();else for(;h<=E;){var C=b();if(C)return C}},pushComponent:function(e,r,o){var a=e[e.length-1];a&&a.added===r&&a.removed===o?e[e.length-1]={count:a.count+1,added:r,removed:o}:e.push({count:1,added:r,removed:o})},extractCommon:function(e,r,o,a){for(var n=r.length,u=o.length,A=e.newPos,p=A-a,h=0;A+1"u"?r:u}:o;return typeof t=="string"?t:JSON.stringify(m_(t,null,null,a),a," ")};i2.equals=function(t,e){return Wf.prototype.equals.call(i2,t.replace(/,([\r\n])/g,"$1"),e.replace(/,([\r\n])/g,"$1"))};y_=new Wf;y_.tokenize=function(t){return t.slice()};y_.join=y_.removeEmpty=function(t){return t}});var gpe=_((o3t,hpe)=>{var But=Hl(),vut=fE(),Dut=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Put=/^\w*$/;function Sut(t,e){if(But(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||vut(t)?!0:Put.test(t)||!Dut.test(t)||e!=null&&t in Object(e)}hpe.exports=Sut});var ype=_((a3t,mpe)=>{var dpe=_P(),xut="Expected a function";function I_(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(xut);var r=function(){var o=arguments,a=e?e.apply(this,o):o[0],n=r.cache;if(n.has(a))return n.get(a);var u=t.apply(this,o);return r.cache=n.set(a,u)||n,u};return r.cache=new(I_.Cache||dpe),r}I_.Cache=dpe;mpe.exports=I_});var Cpe=_((l3t,Epe)=>{var but=ype(),kut=500;function Qut(t){var e=but(t,function(o){return r.size===kut&&r.clear(),o}),r=e.cache;return e}Epe.exports=Qut});var B_=_((c3t,wpe)=>{var Fut=Cpe(),Tut=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Rut=/\\(\\)?/g,Nut=Fut(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(Tut,function(r,o,a,n){e.push(a?n.replace(Rut,"$1"):o||r)}),e});wpe.exports=Nut});var jd=_((u3t,Ipe)=>{var Lut=Hl(),Mut=gpe(),Out=B_(),Uut=R1();function _ut(t,e){return Lut(t)?t:Mut(t,e)?[t]:Out(Uut(t))}Ipe.exports=_ut});var aC=_((A3t,Bpe)=>{var Hut=fE(),jut=1/0;function qut(t){if(typeof t=="string"||Hut(t))return t;var e=t+"";return e=="0"&&1/t==-jut?"-0":e}Bpe.exports=qut});var Zb=_((f3t,vpe)=>{var Gut=jd(),Yut=aC();function Wut(t,e){e=Gut(e,t);for(var r=0,o=e.length;t!=null&&r{var Vut=rS(),Kut=jd(),Jut=UI(),Dpe=il(),zut=aC();function Xut(t,e,r,o){if(!Dpe(t))return t;e=Kut(e,t);for(var a=-1,n=e.length,u=n-1,A=t;A!=null&&++a{var Zut=Zb(),$ut=v_(),eAt=jd();function tAt(t,e,r){for(var o=-1,a=e.length,n={};++o{function rAt(t,e){return t!=null&&e in Object(t)}bpe.exports=rAt});var D_=_((d3t,Qpe)=>{var nAt=jd(),iAt=LI(),sAt=Hl(),oAt=UI(),aAt=YP(),lAt=aC();function cAt(t,e,r){e=nAt(e,t);for(var o=-1,a=e.length,n=!1;++o{var uAt=kpe(),AAt=D_();function fAt(t,e){return t!=null&&AAt(t,e,uAt)}Fpe.exports=fAt});var Npe=_((y3t,Rpe)=>{var pAt=xpe(),hAt=Tpe();function gAt(t,e){return pAt(t,e,function(r,o){return hAt(t,o)})}Rpe.exports=gAt});var Upe=_((E3t,Ope)=>{var Lpe=fd(),dAt=LI(),mAt=Hl(),Mpe=Lpe?Lpe.isConcatSpreadable:void 0;function yAt(t){return mAt(t)||dAt(t)||!!(Mpe&&t&&t[Mpe])}Ope.exports=yAt});var jpe=_((C3t,Hpe)=>{var EAt=qP(),CAt=Upe();function _pe(t,e,r,o,a){var n=-1,u=t.length;for(r||(r=CAt),a||(a=[]);++n0&&r(A)?e>1?_pe(A,e-1,r,o,a):EAt(a,A):o||(a[a.length]=A)}return a}Hpe.exports=_pe});var Gpe=_((w3t,qpe)=>{var wAt=jpe();function IAt(t){var e=t==null?0:t.length;return e?wAt(t,1):[]}qpe.exports=IAt});var P_=_((I3t,Ype)=>{var BAt=Gpe(),vAt=pL(),DAt=hL();function PAt(t){return DAt(vAt(t,void 0,BAt),t+"")}Ype.exports=PAt});var S_=_((B3t,Wpe)=>{var SAt=Npe(),xAt=P_(),bAt=xAt(function(t,e){return t==null?{}:SAt(t,e)});Wpe.exports=bAt});var $b,Vpe=Et(()=>{Yl();$b=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return this.resolver.supportsDescriptor(e,r)}supportsLocator(e,r){return this.resolver.supportsLocator(e,r)}shouldPersistResolution(e,r){return this.resolver.shouldPersistResolution(e,r)}bindDescriptor(e,r,o){return this.resolver.bindDescriptor(e,r,o)}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,o){throw new zt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async getSatisfying(e,r,o,a){throw new zt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async resolve(e,r){throw new zt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}}});var Qi,x_=Et(()=>{Yl();Qi=class extends Xs{reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,r){return r()}async startSectionPromise(e,r){return await r()}startTimerSync(e,r,o){return(typeof r=="function"?r:o)()}async startTimerPromise(e,r,o){return await(typeof r=="function"?r:o)()}reportSeparator(){}reportInfo(e,r){}reportWarning(e,r){}reportError(e,r){}reportProgress(e){return{...Promise.resolve().then(async()=>{for await(let{}of e);}),stop:()=>{}}}reportJson(e){}reportFold(e,r){}async finalize(){}}});var Kpe,lC,b_=Et(()=>{Pt();Kpe=$e(RS());AE();Bd();ql();rh();kf();xo();lC=class{constructor(e,{project:r}){this.workspacesCwds=new Set;this.project=r,this.cwd=e}async setup(){this.manifest=await Mt.tryFind(this.cwd)??new Mt,this.relativeCwd=K.relative(this.project.cwd,this.cwd)||Bt.dot;let e=this.manifest.name?this.manifest.name:eA(null,`${this.computeCandidateName()}-${zs(this.relativeCwd).substring(0,6)}`);this.anchoredDescriptor=In(e,`${Xn.protocol}${this.relativeCwd}`),this.anchoredLocator=Qs(e,`${Xn.protocol}${this.relativeCwd}`);let r=this.manifest.workspaceDefinitions.map(({pattern:a})=>a);if(r.length===0)return;let o=await(0,Kpe.default)(r,{cwd:ue.fromPortablePath(this.cwd),onlyDirectories:!0,ignore:["**/node_modules","**/.git","**/.yarn"]});o.sort(),await o.reduce(async(a,n)=>{let u=K.resolve(this.cwd,ue.toPortablePath(n)),A=await oe.existsPromise(K.join(u,"package.json"));await a,A&&this.workspacesCwds.add(u)},Promise.resolve())}get anchoredPackage(){let e=this.project.storedPackages.get(this.anchoredLocator.locatorHash);if(!e)throw new Error(`Assertion failed: Expected workspace ${o1(this.project.configuration,this)} (${Ot(this.project.configuration,K.join(this.cwd,dr.manifest),yt.PATH)}) to have been resolved. Run "yarn install" to update the lockfile`);return e}accepts(e){let r=e.indexOf(":"),o=r!==-1?e.slice(0,r+1):null,a=r!==-1?e.slice(r+1):e;if(o===Xn.protocol&&K.normalize(a)===this.relativeCwd||o===Xn.protocol&&(a==="*"||a==="^"||a==="~"))return!0;let n=ba(a);return n?o===Xn.protocol?n.test(this.manifest.version??"0.0.0"):this.project.configuration.get("enableTransparentWorkspaces")&&this.manifest.version!==null?n.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?"root-workspace":`${K.basename(this.cwd)}`||"unnamed-workspace"}getRecursiveWorkspaceDependencies({dependencies:e=Mt.hardDependencies}={}){let r=new Set,o=a=>{for(let n of e)for(let u of a.manifest[n].values()){let A=this.project.tryWorkspaceByDescriptor(u);A===null||r.has(A)||(r.add(A),o(A))}};return o(this),r}getRecursiveWorkspaceDependents({dependencies:e=Mt.hardDependencies}={}){let r=new Set,o=a=>{for(let n of this.project.workspaces)e.some(A=>[...n.manifest[A].values()].some(p=>{let h=this.project.tryWorkspaceByDescriptor(p);return h!==null&&n1(h.anchoredLocator,a.anchoredLocator)}))&&!r.has(n)&&(r.add(n),o(n))};return o(this),r}getRecursiveWorkspaceChildren(){let e=new Set([this]);for(let r of e)for(let o of r.workspacesCwds){let a=this.project.workspacesByCwd.get(o);a&&e.add(a)}return e.delete(this),Array.from(e)}async persistManifest(){let e={};this.manifest.exportTo(e);let r=K.join(this.cwd,Mt.fileName),o=`${JSON.stringify(e,null,this.manifest.indent)} +`;await oe.changeFilePromise(r,o,{automaticNewlines:!0}),this.manifest.raw=e}}});function NAt({project:t,allDescriptors:e,allResolutions:r,allPackages:o,accessibleLocators:a=new Set,optionalBuilds:n=new Set,peerRequirements:u=new Map,peerWarnings:A=[],volatileDescriptors:p=new Set}){let h=new Map,E=[],I=new Map,v=new Map,b=new Map,C=new Map,T=new Map,L=new Map(t.workspaces.map(Ae=>{let ye=Ae.anchoredLocator.locatorHash,ae=o.get(ye);if(typeof ae>"u")throw new Error("Assertion failed: The workspace should have an associated package");return[ye,$I(ae)]})),U=()=>{let Ae=oe.mktempSync(),ye=K.join(Ae,"stacktrace.log"),ae=String(E.length+1).length,we=E.map((Pe,g)=>`${`${g+1}.`.padStart(ae," ")} ${xa(Pe)} +`).join("");throw oe.writeFileSync(ye,we),oe.detachTemp(Ae),new zt(45,`Encountered a stack overflow when resolving peer dependencies; cf ${ue.fromPortablePath(ye)}`)},J=Ae=>{let ye=r.get(Ae.descriptorHash);if(typeof ye>"u")throw new Error("Assertion failed: The resolution should have been registered");let ae=o.get(ye);if(!ae)throw new Error("Assertion failed: The package could not be found");return ae},te=(Ae,ye,ae,{top:we,optional:Pe})=>{E.length>1e3&&U(),E.push(ye);let g=le(Ae,ye,ae,{top:we,optional:Pe});return E.pop(),g},le=(Ae,ye,ae,{top:we,optional:Pe})=>{if(a.has(ye.locatorHash))return;a.add(ye.locatorHash),Pe||n.delete(ye.locatorHash);let g=o.get(ye.locatorHash);if(!g)throw new Error(`Assertion failed: The package (${jr(t.configuration,ye)}) should have been registered`);let Ee=[],De=[],ce=[],ne=[],ee=[];for(let ke of Array.from(g.dependencies.values())){if(g.peerDependencies.has(ke.identHash)&&g.locatorHash!==we)continue;if(Sf(ke))throw new Error("Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch");p.delete(ke.descriptorHash);let ht=Pe;if(!ht){let Te=g.dependenciesMeta.get(fn(ke));if(typeof Te<"u"){let Je=Te.get(null);typeof Je<"u"&&Je.optional&&(ht=!0)}}let H=r.get(ke.descriptorHash);if(!H)throw new Error(`Assertion failed: The resolution (${qn(t.configuration,ke)}) should have been registered`);let lt=L.get(H)||o.get(H);if(!lt)throw new Error(`Assertion failed: The package (${H}, resolved from ${qn(t.configuration,ke)}) should have been registered`);if(lt.peerDependencies.size===0){te(ke,lt,new Map,{top:we,optional:ht});continue}let Re,Qe,be=new Set,_e;De.push(()=>{Re=nO(ke,ye.locatorHash),Qe=iO(lt,ye.locatorHash),g.dependencies.delete(ke.identHash),g.dependencies.set(Re.identHash,Re),r.set(Re.descriptorHash,Qe.locatorHash),e.set(Re.descriptorHash,Re),o.set(Qe.locatorHash,Qe),Ee.push([lt,Re,Qe])}),ce.push(()=>{_e=new Map;for(let Te of Qe.peerDependencies.values()){let Je=g.dependencies.get(Te.identHash);if(!Je&&r1(ye,Te)&&(Ae.identHash===ye.identHash?Je=Ae:(Je=In(ye,Ae.range),e.set(Je.descriptorHash,Je),r.set(Je.descriptorHash,ye.locatorHash),p.delete(Je.descriptorHash))),(!Je||Je.range==="missing:")&&Qe.dependencies.has(Te.identHash)){Qe.peerDependencies.delete(Te.identHash);continue}Je||(Je=In(Te,"missing:")),Qe.dependencies.set(Je.identHash,Je),Sf(Je)&&dd(b,Je.descriptorHash).add(Qe.locatorHash),I.set(Je.identHash,Je),Je.range==="missing:"&&be.add(Je.identHash),_e.set(Te.identHash,ae.get(Te.identHash)??Qe.locatorHash)}Qe.dependencies=new Map(ks(Qe.dependencies,([Te,Je])=>fn(Je)))}),ne.push(()=>{if(!o.has(Qe.locatorHash))return;let Te=h.get(lt.locatorHash);typeof Te=="number"&&Te>=2&&U();let Je=h.get(lt.locatorHash),He=typeof Je<"u"?Je+1:1;h.set(lt.locatorHash,He),te(Re,Qe,_e,{top:we,optional:ht}),h.set(lt.locatorHash,He-1)}),ee.push(()=>{let Te=g.dependencies.get(ke.identHash);if(typeof Te>"u")throw new Error("Assertion failed: Expected the peer dependency to have been turned into a dependency");let Je=r.get(Te.descriptorHash);if(typeof Je>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");if(dd(T,Je).add(ye.locatorHash),!!o.has(Qe.locatorHash)){for(let He of Qe.peerDependencies.values()){let x=_e.get(He.identHash);if(typeof x>"u")throw new Error("Assertion failed: Expected the peer dependency ident to be registered");Gy(Yy(C,x),fn(He)).push(Qe.locatorHash)}for(let He of be)Qe.dependencies.delete(He)}})}for(let ke of[...De,...ce])ke();let Ie;do{Ie=!0;for(let[ke,ht,H]of Ee){let lt=Yy(v,ke.locatorHash),Re=zs(...[...H.dependencies.values()].map(Te=>{let Je=Te.range!=="missing:"?r.get(Te.descriptorHash):"missing:";if(typeof Je>"u")throw new Error(`Assertion failed: Expected the resolution for ${qn(t.configuration,Te)} to have been registered`);return Je===we?`${Je} (top)`:Je}),ht.identHash),Qe=lt.get(Re);if(typeof Qe>"u"){lt.set(Re,ht);continue}if(Qe===ht)continue;o.delete(H.locatorHash),e.delete(ht.descriptorHash),r.delete(ht.descriptorHash),a.delete(H.locatorHash);let be=b.get(ht.descriptorHash)||[],_e=[g.locatorHash,...be];b.delete(ht.descriptorHash);for(let Te of _e){let Je=o.get(Te);typeof Je>"u"||(Je.dependencies.get(ht.identHash).descriptorHash!==Qe.descriptorHash&&(Ie=!1),Je.dependencies.set(ht.identHash,Qe))}}}while(!Ie);for(let ke of[...ne,...ee])ke()};for(let Ae of t.workspaces){let ye=Ae.anchoredLocator;p.delete(Ae.anchoredDescriptor.descriptorHash),te(Ae.anchoredDescriptor,ye,new Map,{top:ye.locatorHash,optional:!1})}let pe=new Map;for(let[Ae,ye]of T){let ae=o.get(Ae);if(typeof ae>"u")throw new Error("Assertion failed: Expected the root to be registered");let we=C.get(Ae);if(!(typeof we>"u"))for(let Pe of ye){let g=o.get(Pe);if(!(typeof g>"u")&&!!t.tryWorkspaceByLocator(g))for(let[Ee,De]of we){let ce=Js(Ee);if(g.peerDependencies.has(ce.identHash))continue;let ne=`p${zs(Pe,Ee,Ae).slice(0,5)}`;u.set(ne,{subject:Pe,requested:ce,rootRequester:Ae,allRequesters:De});let ee=ae.dependencies.get(ce.identHash);if(typeof ee<"u"){let Ie=J(ee),ke=Ie.version??"0.0.0",ht=new Set;for(let lt of De){let Re=o.get(lt);if(typeof Re>"u")throw new Error("Assertion failed: Expected the link to be registered");let Qe=Re.peerDependencies.get(ce.identHash);if(typeof Qe>"u")throw new Error("Assertion failed: Expected the ident to be registered");ht.add(Qe.range)}if(![...ht].every(lt=>{if(lt.startsWith(Xn.protocol)){if(!t.tryWorkspaceByLocator(Ie))return!1;lt=lt.slice(Xn.protocol.length),(lt==="^"||lt==="~")&&(lt="*")}return bf(ke,lt)})){let lt=ol(pe,Ie.locatorHash,()=>({type:2,requested:ce,subject:Ie,dependents:new Map,requesters:new Map,links:new Map,version:ke,hash:`p${Ie.locatorHash.slice(0,5)}`}));lt.dependents.set(g.locatorHash,g),lt.requesters.set(ae.locatorHash,ae);for(let Re of De)lt.links.set(Re,o.get(Re));A.push({type:1,subject:g,requested:ce,requester:ae,version:ke,hash:ne,requirementCount:De.length})}}else ae.peerDependenciesMeta.get(Ee)?.optional||A.push({type:0,subject:g,requested:ce,requester:ae,hash:ne})}}}A.push(...pe.values())}function LAt(t,e){let r=BL(t.peerWarnings,"type"),o=r[2]?.map(n=>{let u=Array.from(n.links.values(),E=>{let I=t.storedPackages.get(E.locatorHash);if(typeof I>"u")throw new Error("Assertion failed: Expected the package to be registered");let v=I.peerDependencies.get(n.requested.identHash);if(typeof v>"u")throw new Error("Assertion failed: Expected the ident to be registered");return v.range}),A=n.links.size>1?"and other dependencies request":"requests",p=aO(u),h=p?lE(t.configuration,p):Ot(t.configuration,"but they have non-overlapping ranges!","redBright");return`${cs(t.configuration,n.requested)} is listed by your project with version ${s1(t.configuration,n.version)}, which doesn't satisfy what ${cs(t.configuration,n.requesters.values().next().value)} (${Ot(t.configuration,n.hash,yt.CODE)}) ${A} (${h}).`})??[],a=r[0]?.map(n=>`${jr(t.configuration,n.subject)} doesn't provide ${cs(t.configuration,n.requested)} (${Ot(t.configuration,n.hash,yt.CODE)}), requested by ${cs(t.configuration,n.requester)}.`)??[];e.startSectionSync({reportFooter:()=>{e.reportWarning(86,`Some peer dependencies are incorrectly met; run ${Ot(t.configuration,"yarn explain peer-requirements ",yt.CODE)} for details, where ${Ot(t.configuration,"",yt.CODE)} is the six-letter p-prefixed code.`)},skipIfEmpty:!0},()=>{for(let n of ks(o,u=>zy.default(u)))e.reportWarning(60,n);for(let n of ks(a,u=>zy.default(u)))e.reportWarning(2,n)})}var ek,tk,rk,Xpe,F_,Q_,T_,nk,kAt,QAt,Jpe,FAt,TAt,RAt,pl,k_,ik,zpe,St,Zpe=Et(()=>{Pt();Pt();Nl();qt();ek=Be("crypto");w_();tk=$e(S_()),rk=$e(nd()),Xpe=$e(zn()),F_=Be("util"),Q_=$e(Be("v8")),T_=$e(Be("zlib"));f_();D1();p_();h_();AE();fO();Yl();Vpe();L1();x_();Bd();b_();VS();ql();rh();jl();Dx();DU();kf();xo();nk=Ky(process.env.YARN_LOCKFILE_VERSION_OVERRIDE??8),kAt=3,QAt=/ *, */g,Jpe=/\/$/,FAt=32,TAt=(0,F_.promisify)(T_.default.gzip),RAt=(0,F_.promisify)(T_.default.gunzip),pl=(r=>(r.UpdateLockfile="update-lockfile",r.SkipBuild="skip-build",r))(pl||{}),k_={restoreLinkersCustomData:["linkersCustomData"],restoreResolutions:["accessibleLocators","conditionalLocators","disabledLocators","optionalBuilds","storedDescriptors","storedResolutions","storedPackages","lockFileChecksum"],restoreBuildState:["skippedBuilds","storedBuildState"]},ik=(o=>(o[o.NotProvided=0]="NotProvided",o[o.NotCompatible=1]="NotCompatible",o[o.NotCompatibleAggregate=2]="NotCompatibleAggregate",o))(ik||{}),zpe=t=>zs(`${kAt}`,t),St=class{constructor(e,{configuration:r}){this.resolutionAliases=new Map;this.workspaces=[];this.workspacesByCwd=new Map;this.workspacesByIdent=new Map;this.storedResolutions=new Map;this.storedDescriptors=new Map;this.storedPackages=new Map;this.storedChecksums=new Map;this.storedBuildState=new Map;this.accessibleLocators=new Set;this.conditionalLocators=new Set;this.disabledLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.skippedBuilds=new Set;this.lockfileLastVersion=null;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.peerWarnings=[];this.linkersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=r,this.cwd=e}static async find(e,r){if(!e.projectCwd)throw new it(`No project found in ${r}`);let o=e.projectCwd,a=r,n=null;for(;n!==e.projectCwd;){if(n=a,oe.existsSync(K.join(n,dr.manifest))){o=n;break}a=K.dirname(n)}let u=new St(e.projectCwd,{configuration:e});Ve.telemetry?.reportProject(u.cwd),await u.setupResolutions(),await u.setupWorkspaces(),Ve.telemetry?.reportWorkspaceCount(u.workspaces.length),Ve.telemetry?.reportDependencyCount(u.workspaces.reduce((C,T)=>C+T.manifest.dependencies.size+T.manifest.devDependencies.size,0));let A=u.tryWorkspaceByCwd(o);if(A)return{project:u,workspace:A,locator:A.anchoredLocator};let p=await u.findLocatorForLocation(`${o}/`,{strict:!0});if(p)return{project:u,locator:p,workspace:null};let h=Ot(e,u.cwd,yt.PATH),E=Ot(e,K.relative(u.cwd,o),yt.PATH),I=`- If ${h} isn't intended to be a project, remove any yarn.lock and/or package.json file there.`,v=`- If ${h} is intended to be a project, it might be that you forgot to list ${E} in its workspace configuration.`,b=`- Finally, if ${h} is fine and you intend ${E} to be treated as a completely separate project (not even a workspace), create an empty yarn.lock file in it.`;throw new it(`The nearest package directory (${Ot(e,o,yt.PATH)}) doesn't seem to be part of the project declared in ${Ot(e,u.cwd,yt.PATH)}. + +${[I,v,b].join(` +`)}`)}async setupResolutions(){this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=K.join(this.cwd,dr.lockfile),r=this.configuration.get("defaultLanguageName");if(oe.existsSync(e)){let o=await oe.readFilePromise(e,"utf8");this.lockFileChecksum=zpe(o);let a=Vi(o);if(a.__metadata){let n=a.__metadata.version,u=a.__metadata.cacheKey;this.lockfileLastVersion=n,this.lockfileNeedsRefresh=n"u")throw new Error(`Assertion failed: Expected the lockfile entry to have a resolution field (${A})`);let h=xf(p.resolution,!0),E=new Mt;E.load(p,{yamlCompatibilityMode:!0});let I=E.version,v=E.languageName||r,b=p.linkType.toUpperCase(),C=p.conditions??null,T=E.dependencies,L=E.peerDependencies,U=E.dependenciesMeta,J=E.peerDependenciesMeta,te=E.bin;if(p.checksum!=null){let pe=typeof u<"u"&&!p.checksum.includes("/")?`${u}/${p.checksum}`:p.checksum;this.storedChecksums.set(h.locatorHash,pe)}let le={...h,version:I,languageName:v,linkType:b,conditions:C,dependencies:T,peerDependencies:L,dependenciesMeta:U,peerDependenciesMeta:J,bin:te};this.originalPackages.set(le.locatorHash,le);for(let pe of A.split(QAt)){let Ae=nh(pe);n<=6&&(Ae=this.configuration.normalizeDependency(Ae),Ae=In(Ae,Ae.range.replace(/^patch:[^@]+@(?!npm(:|%3A))/,"$1npm%3A"))),this.storedDescriptors.set(Ae.descriptorHash,Ae),this.storedResolutions.set(Ae.descriptorHash,h.locatorHash)}}}else o.includes("yarn lockfile v1")&&(this.lockfileLastVersion=-1)}}async setupWorkspaces(){this.workspaces=[],this.workspacesByCwd=new Map,this.workspacesByIdent=new Map;let e=new Set,r=(0,rk.default)(4),o=async(a,n)=>{if(e.has(n))return a;e.add(n);let u=new lC(n,{project:this});await r(()=>u.setup());let A=a.then(()=>{this.addWorkspace(u)});return Array.from(u.workspacesCwds).reduce(o,A)};await o(Promise.resolve(),this.cwd)}addWorkspace(e){let r=this.workspacesByIdent.get(e.anchoredLocator.identHash);if(typeof r<"u")throw new Error(`Duplicate workspace name ${cs(this.configuration,e.anchoredLocator)}: ${ue.fromPortablePath(e.cwd)} conflicts with ${ue.fromPortablePath(r.cwd)}`);this.workspaces.push(e),this.workspacesByCwd.set(e.cwd,e),this.workspacesByIdent.set(e.anchoredLocator.identHash,e)}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){K.isAbsolute(e)||(e=K.resolve(this.cwd,e)),e=K.normalize(e).replace(/\/+$/,"");let r=this.workspacesByCwd.get(e);return r||null}getWorkspaceByCwd(e){let r=this.tryWorkspaceByCwd(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByFilePath(e){let r=null;for(let o of this.workspaces)K.relative(o.cwd,e).startsWith("../")||r&&r.cwd.length>=o.cwd.length||(r=o);return r||null}getWorkspaceByFilePath(e){let r=this.tryWorkspaceByFilePath(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByIdent(e){let r=this.workspacesByIdent.get(e.identHash);return typeof r>"u"?null:r}getWorkspaceByIdent(e){let r=this.tryWorkspaceByIdent(e);if(!r)throw new Error(`Workspace not found (${cs(this.configuration,e)})`);return r}tryWorkspaceByDescriptor(e){if(e.range.startsWith(Xn.protocol)){let o=e.range.slice(Xn.protocol.length);if(o!=="^"&&o!=="~"&&o!=="*"&&!ba(o))return this.tryWorkspaceByCwd(o)}let r=this.tryWorkspaceByIdent(e);return r===null||(Sf(e)&&(e=e1(e)),!r.accepts(e.range))?null:r}getWorkspaceByDescriptor(e){let r=this.tryWorkspaceByDescriptor(e);if(r===null)throw new Error(`Workspace not found (${qn(this.configuration,e)})`);return r}tryWorkspaceByLocator(e){let r=this.tryWorkspaceByIdent(e);return r===null||(Hc(e)&&(e=t1(e)),r.anchoredLocator.locatorHash!==e.locatorHash)?null:r}getWorkspaceByLocator(e){let r=this.tryWorkspaceByLocator(e);if(!r)throw new Error(`Workspace not found (${jr(this.configuration,e)})`);return r}deleteDescriptor(e){this.storedResolutions.delete(e),this.storedDescriptors.delete(e)}deleteLocator(e){this.originalPackages.delete(e),this.storedPackages.delete(e),this.accessibleLocators.delete(e)}forgetResolution(e){if("descriptorHash"in e){let r=this.storedResolutions.get(e.descriptorHash);this.deleteDescriptor(e.descriptorHash);let o=new Set(this.storedResolutions.values());typeof r<"u"&&!o.has(r)&&this.deleteLocator(r)}if("locatorHash"in e){this.deleteLocator(e.locatorHash);for(let[r,o]of this.storedResolutions)o===e.locatorHash&&this.deleteDescriptor(r)}}forgetTransientResolutions(){let e=this.configuration.makeResolver(),r=new Map;for(let[o,a]of this.storedResolutions.entries()){let n=r.get(a);n||r.set(a,n=new Set),n.add(o)}for(let o of this.originalPackages.values()){let a;try{a=e.shouldPersistResolution(o,{project:this,resolver:e})}catch{a=!1}if(!a){this.deleteLocator(o.locatorHash);let n=r.get(o.locatorHash);if(n){r.delete(o.locatorHash);for(let u of n)this.deleteDescriptor(u)}}}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[r,o]of e.dependencies)Sf(o)&&e.dependencies.set(r,e1(o))}getDependencyMeta(e,r){let o={},n=this.topLevelWorkspace.manifest.dependenciesMeta.get(fn(e));if(!n)return o;let u=n.get(null);if(u&&Object.assign(o,u),r===null||!Xpe.default.valid(r))return o;for(let[A,p]of n)A!==null&&A===r&&Object.assign(o,p);return o}async findLocatorForLocation(e,{strict:r=!1}={}){let o=new Qi,a=this.configuration.getLinkers(),n={project:this,report:o};for(let u of a){let A=await u.findPackageLocator(e,n);if(A){if(r&&(await u.findPackageLocation(A,n)).replace(Jpe,"")!==e.replace(Jpe,""))continue;return A}}return null}async loadUserConfig(){let e=K.join(this.cwd,".pnp.cjs");await oe.existsPromise(e)&&vf(e).setup();let r=K.join(this.cwd,"yarn.config.cjs");return await oe.existsPromise(r)?vf(r):null}async preparePackage(e,{resolver:r,resolveOptions:o}){let a=await this.configuration.getPackageExtensions(),n=this.configuration.normalizePackage(e,{packageExtensions:a});for(let[u,A]of n.dependencies){let p=await this.configuration.reduceHook(E=>E.reduceDependency,A,this,n,A,{resolver:r,resolveOptions:o});if(!r1(A,p))throw new Error("Assertion failed: The descriptor ident cannot be changed through aliases");let h=r.bindDescriptor(p,n,o);n.dependencies.set(u,h)}return n}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error("Workspaces must have been setup before calling this function");this.forgetVirtualResolutions();let r=new Map(this.originalPackages),o=[];e.lockfileOnly||this.forgetTransientResolutions();let a=e.resolver||this.configuration.makeResolver(),n=new sC(a);await n.setup(this,{report:e.report});let u=e.lockfileOnly?[new $b(a)]:[n,a],A=new vd([new oC(a),...u]),p=new vd([...u]),h=this.configuration.makeFetcher(),E=e.lockfileOnly?{project:this,report:e.report,resolver:A}:{project:this,report:e.report,resolver:A,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:h,cacheOptions:{mirrorWriteOnly:!0}}},I=new Map,v=new Map,b=new Map,C=new Map,T=new Map,L=new Map,U=this.topLevelWorkspace.anchoredLocator,J=new Set,te=[],le=_4(),pe=this.configuration.getSupportedArchitectures();await e.report.startProgressPromise(Xs.progressViaTitle(),async ce=>{let ne=async H=>{let lt=await Wy(async()=>await A.resolve(H,E),_e=>`${jr(this.configuration,H)}: ${_e}`);if(!n1(H,lt))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${jr(this.configuration,H)} to ${jr(this.configuration,lt)})`);C.set(lt.locatorHash,lt),!r.delete(lt.locatorHash)&&!this.tryWorkspaceByLocator(lt)&&o.push(lt);let Qe=await this.preparePackage(lt,{resolver:A,resolveOptions:E}),be=Uc([...Qe.dependencies.values()].map(_e=>ht(_e)));return te.push(be),be.catch(()=>{}),v.set(Qe.locatorHash,Qe),Qe},ee=async H=>{let lt=T.get(H.locatorHash);if(typeof lt<"u")return lt;let Re=Promise.resolve().then(()=>ne(H));return T.set(H.locatorHash,Re),Re},Ie=async(H,lt)=>{let Re=await ht(lt);return I.set(H.descriptorHash,H),b.set(H.descriptorHash,Re.locatorHash),Re},ke=async H=>{ce.setTitle(qn(this.configuration,H));let lt=this.resolutionAliases.get(H.descriptorHash);if(typeof lt<"u")return Ie(H,this.storedDescriptors.get(lt));let Re=A.getResolutionDependencies(H,E),Qe=Object.fromEntries(await Uc(Object.entries(Re).map(async([Te,Je])=>{let He=A.bindDescriptor(Je,U,E),x=await ht(He);return J.add(x.locatorHash),[Te,x]}))),_e=(await Wy(async()=>await A.getCandidates(H,Qe,E),Te=>`${qn(this.configuration,H)}: ${Te}`))[0];if(typeof _e>"u")throw new zt(82,`${qn(this.configuration,H)}: No candidates found`);if(e.checkResolutions){let{locators:Te}=await p.getSatisfying(H,Qe,[_e],{...E,resolver:p});if(!Te.find(Je=>Je.locatorHash===_e.locatorHash))throw new zt(78,`Invalid resolution ${XI(this.configuration,H,_e)}`)}return I.set(H.descriptorHash,H),b.set(H.descriptorHash,_e.locatorHash),ee(_e)},ht=H=>{let lt=L.get(H.descriptorHash);if(typeof lt<"u")return lt;I.set(H.descriptorHash,H);let Re=Promise.resolve().then(()=>ke(H));return L.set(H.descriptorHash,Re),Re};for(let H of this.workspaces){let lt=H.anchoredDescriptor;te.push(ht(lt))}for(;te.length>0;){let H=[...te];te.length=0,await Uc(H)}});let Ae=sl(r.values(),ce=>this.tryWorkspaceByLocator(ce)?sl.skip:ce);if(o.length>0||Ae.length>0){let ce=new Set(this.workspaces.flatMap(H=>{let lt=v.get(H.anchoredLocator.locatorHash);if(!lt)throw new Error("Assertion failed: The workspace should have been resolved");return Array.from(lt.dependencies.values(),Re=>{let Qe=b.get(Re.descriptorHash);if(!Qe)throw new Error("Assertion failed: The resolution should have been registered");return Qe})})),ne=H=>ce.has(H.locatorHash)?"0":"1",ee=H=>xa(H),Ie=ks(o,[ne,ee]),ke=ks(Ae,[ne,ee]),ht=e.report.getRecommendedLength();Ie.length>0&&e.report.reportInfo(85,`${Ot(this.configuration,"+",yt.ADDED)} ${cS(this.configuration,Ie,ht)}`),ke.length>0&&e.report.reportInfo(85,`${Ot(this.configuration,"-",yt.REMOVED)} ${cS(this.configuration,ke,ht)}`)}let ye=new Set(this.resolutionAliases.values()),ae=new Set(v.keys()),we=new Set,Pe=new Map,g=[];NAt({project:this,accessibleLocators:we,volatileDescriptors:ye,optionalBuilds:ae,peerRequirements:Pe,peerWarnings:g,allDescriptors:I,allResolutions:b,allPackages:v});for(let ce of J)ae.delete(ce);for(let ce of ye)I.delete(ce),b.delete(ce);let Ee=new Set,De=new Set;for(let ce of v.values())ce.conditions!=null&&(!ae.has(ce.locatorHash)||(qS(ce,pe)||(qS(ce,le)&&e.report.reportWarningOnce(77,`${jr(this.configuration,ce)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${Ot(this.configuration,"supportedArchitectures",yt.SETTING)} setting`),De.add(ce.locatorHash)),Ee.add(ce.locatorHash)));this.storedResolutions=b,this.storedDescriptors=I,this.storedPackages=v,this.accessibleLocators=we,this.conditionalLocators=Ee,this.disabledLocators=De,this.originalPackages=C,this.optionalBuilds=ae,this.peerRequirements=Pe,this.peerWarnings=g}async fetchEverything({cache:e,report:r,fetcher:o,mode:a,persistProject:n=!0}){let u={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},A=o||this.configuration.makeFetcher(),p={checksums:this.storedChecksums,project:this,cache:e,fetcher:A,report:r,cacheOptions:u},h=Array.from(new Set(ks(this.storedResolutions.values(),[C=>{let T=this.storedPackages.get(C);if(!T)throw new Error("Assertion failed: The locator should have been registered");return xa(T)}])));a==="update-lockfile"&&(h=h.filter(C=>!this.storedChecksums.has(C)));let E=!1,I=Xs.progressViaCounter(h.length);await r.reportProgress(I);let v=(0,rk.default)(FAt);if(await Uc(h.map(C=>v(async()=>{let T=this.storedPackages.get(C);if(!T)throw new Error("Assertion failed: The locator should have been registered");if(Hc(T))return;let L;try{L=await A.fetch(T,p)}catch(U){U.message=`${jr(this.configuration,T)}: ${U.message}`,r.reportExceptionOnce(U),E=U;return}L.checksum!=null?this.storedChecksums.set(T.locatorHash,L.checksum):this.storedChecksums.delete(T.locatorHash),L.releaseFs&&L.releaseFs()}).finally(()=>{I.tick()}))),E)throw E;let b=n&&a!=="update-lockfile"?await this.cacheCleanup({cache:e,report:r}):null;if(r.cacheMisses.size>0||b){let T=(await Promise.all([...r.cacheMisses].map(async Ae=>{let ye=this.storedPackages.get(Ae),ae=this.storedChecksums.get(Ae)??null,we=e.getLocatorPath(ye,ae);return(await oe.statPromise(we)).size}))).reduce((Ae,ye)=>Ae+ye,0)-(b?.size??0),L=r.cacheMisses.size,U=b?.count??0,J=`${nS(L,{zero:"No new packages",one:"A package was",more:`${Ot(this.configuration,L,yt.NUMBER)} packages were`})} added to the project`,te=`${nS(U,{zero:"none were",one:"one was",more:`${Ot(this.configuration,U,yt.NUMBER)} were`})} removed`,le=T!==0?` (${Ot(this.configuration,T,yt.SIZE_DIFF)})`:"",pe=U>0?L>0?`${J}, and ${te}${le}.`:`${J}, but ${te}${le}.`:`${J}${le}.`;r.reportInfo(13,pe)}}async linkEverything({cache:e,report:r,fetcher:o,mode:a}){let n={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},u=o||this.configuration.makeFetcher(),A={checksums:this.storedChecksums,project:this,cache:e,fetcher:u,report:r,cacheOptions:n},p=this.configuration.getLinkers(),h={project:this,report:r},E=new Map(p.map(ce=>{let ne=ce.makeInstaller(h),ee=ce.getCustomDataKey(),Ie=this.linkersCustomData.get(ee);return typeof Ie<"u"&&ne.attachCustomData(Ie),[ce,ne]})),I=new Map,v=new Map,b=new Map,C=new Map(await Uc([...this.accessibleLocators].map(async ce=>{let ne=this.storedPackages.get(ce);if(!ne)throw new Error("Assertion failed: The locator should have been registered");return[ce,await u.fetch(ne,A)]}))),T=[],L=new Set,U=[];for(let ce of this.accessibleLocators){let ne=this.storedPackages.get(ce);if(typeof ne>"u")throw new Error("Assertion failed: The locator should have been registered");let ee=C.get(ne.locatorHash);if(typeof ee>"u")throw new Error("Assertion failed: The fetch result should have been registered");let Ie=[],ke=H=>{Ie.push(H)},ht=this.tryWorkspaceByLocator(ne);if(ht!==null){let H=[],{scripts:lt}=ht.manifest;for(let Qe of["preinstall","install","postinstall"])lt.has(Qe)&&H.push({type:0,script:Qe});try{for(let[Qe,be]of E)if(Qe.supportsPackage(ne,h)&&(await be.installPackage(ne,ee,{holdFetchResult:ke})).buildRequest!==null)throw new Error("Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core")}finally{Ie.length===0?ee.releaseFs?.():T.push(Uc(Ie).catch(()=>{}).then(()=>{ee.releaseFs?.()}))}let Re=K.join(ee.packageFs.getRealPath(),ee.prefixPath);v.set(ne.locatorHash,Re),!Hc(ne)&&H.length>0&&b.set(ne.locatorHash,{buildDirectives:H,buildLocations:[Re]})}else{let H=p.find(Qe=>Qe.supportsPackage(ne,h));if(!H)throw new zt(12,`${jr(this.configuration,ne)} isn't supported by any available linker`);let lt=E.get(H);if(!lt)throw new Error("Assertion failed: The installer should have been registered");let Re;try{Re=await lt.installPackage(ne,ee,{holdFetchResult:ke})}finally{Ie.length===0?ee.releaseFs?.():T.push(Uc(Ie).then(()=>{}).then(()=>{ee.releaseFs?.()}))}I.set(ne.locatorHash,H),v.set(ne.locatorHash,Re.packageLocation),Re.buildRequest&&Re.packageLocation&&(Re.buildRequest.skipped?(L.add(ne.locatorHash),this.skippedBuilds.has(ne.locatorHash)||U.push([ne,Re.buildRequest.explain])):b.set(ne.locatorHash,{buildDirectives:Re.buildRequest.directives,buildLocations:[Re.packageLocation]}))}}let J=new Map;for(let ce of this.accessibleLocators){let ne=this.storedPackages.get(ce);if(!ne)throw new Error("Assertion failed: The locator should have been registered");let ee=this.tryWorkspaceByLocator(ne)!==null,Ie=async(ke,ht)=>{let H=v.get(ne.locatorHash);if(typeof H>"u")throw new Error(`Assertion failed: The package (${jr(this.configuration,ne)}) should have been registered`);let lt=[];for(let Re of ne.dependencies.values()){let Qe=this.storedResolutions.get(Re.descriptorHash);if(typeof Qe>"u")throw new Error(`Assertion failed: The resolution (${qn(this.configuration,Re)}, from ${jr(this.configuration,ne)})should have been registered`);let be=this.storedPackages.get(Qe);if(typeof be>"u")throw new Error(`Assertion failed: The package (${Qe}, resolved from ${qn(this.configuration,Re)}) should have been registered`);let _e=this.tryWorkspaceByLocator(be)===null?I.get(Qe):null;if(typeof _e>"u")throw new Error(`Assertion failed: The package (${Qe}, resolved from ${qn(this.configuration,Re)}) should have been registered`);_e===ke||_e===null?v.get(be.locatorHash)!==null&<.push([Re,be]):!ee&&H!==null&&Gy(J,Qe).push(H)}H!==null&&await ht.attachInternalDependencies(ne,lt)};if(ee)for(let[ke,ht]of E)ke.supportsPackage(ne,h)&&await Ie(ke,ht);else{let ke=I.get(ne.locatorHash);if(!ke)throw new Error("Assertion failed: The linker should have been found");let ht=E.get(ke);if(!ht)throw new Error("Assertion failed: The installer should have been registered");await Ie(ke,ht)}}for(let[ce,ne]of J){let ee=this.storedPackages.get(ce);if(!ee)throw new Error("Assertion failed: The package should have been registered");let Ie=I.get(ee.locatorHash);if(!Ie)throw new Error("Assertion failed: The linker should have been found");let ke=E.get(Ie);if(!ke)throw new Error("Assertion failed: The installer should have been registered");await ke.attachExternalDependents(ee,ne)}let te=new Map;for(let[ce,ne]of E){let ee=await ne.finalizeInstall();for(let Ie of ee?.records??[])Ie.buildRequest.skipped?(L.add(Ie.locator.locatorHash),this.skippedBuilds.has(Ie.locator.locatorHash)||U.push([Ie.locator,Ie.buildRequest.explain])):b.set(Ie.locator.locatorHash,{buildDirectives:Ie.buildRequest.directives,buildLocations:Ie.buildLocations});typeof ee?.customData<"u"&&te.set(ce.getCustomDataKey(),ee.customData)}if(this.linkersCustomData=te,await Uc(T),a==="skip-build")return;for(let[,ce]of ks(U,([ne])=>xa(ne)))ce(r);let le=new Set(this.storedPackages.keys()),pe=new Set(b.keys());for(let ce of pe)le.delete(ce);let Ae=(0,ek.createHash)("sha512");Ae.update(process.versions.node),await this.configuration.triggerHook(ce=>ce.globalHashGeneration,this,ce=>{Ae.update("\0"),Ae.update(ce)});let ye=Ae.digest("hex"),ae=new Map,we=ce=>{let ne=ae.get(ce.locatorHash);if(typeof ne<"u")return ne;let ee=this.storedPackages.get(ce.locatorHash);if(typeof ee>"u")throw new Error("Assertion failed: The package should have been registered");let Ie=(0,ek.createHash)("sha512");Ie.update(ce.locatorHash),ae.set(ce.locatorHash,"");for(let ke of ee.dependencies.values()){let ht=this.storedResolutions.get(ke.descriptorHash);if(typeof ht>"u")throw new Error(`Assertion failed: The resolution (${qn(this.configuration,ke)}) should have been registered`);let H=this.storedPackages.get(ht);if(typeof H>"u")throw new Error("Assertion failed: The package should have been registered");Ie.update(we(H))}return ne=Ie.digest("hex"),ae.set(ce.locatorHash,ne),ne},Pe=(ce,ne)=>{let ee=(0,ek.createHash)("sha512");ee.update(ye),ee.update(we(ce));for(let Ie of ne)ee.update(Ie);return ee.digest("hex")},g=new Map,Ee=!1,De=ce=>{let ne=new Set([ce.locatorHash]);for(let ee of ne){let Ie=this.storedPackages.get(ee);if(!Ie)throw new Error("Assertion failed: The package should have been registered");for(let ke of Ie.dependencies.values()){let ht=this.storedResolutions.get(ke.descriptorHash);if(!ht)throw new Error(`Assertion failed: The resolution (${qn(this.configuration,ke)}) should have been registered`);if(ht!==ce.locatorHash&&pe.has(ht))return!1;let H=this.storedPackages.get(ht);if(!H)throw new Error("Assertion failed: The package should have been registered");let lt=this.tryWorkspaceByLocator(H);if(lt){if(lt.anchoredLocator.locatorHash!==ce.locatorHash&&pe.has(lt.anchoredLocator.locatorHash))return!1;ne.add(lt.anchoredLocator.locatorHash)}ne.add(ht)}}return!0};for(;pe.size>0;){let ce=pe.size,ne=[];for(let ee of pe){let Ie=this.storedPackages.get(ee);if(!Ie)throw new Error("Assertion failed: The package should have been registered");if(!De(Ie))continue;let ke=b.get(Ie.locatorHash);if(!ke)throw new Error("Assertion failed: The build directive should have been registered");let ht=Pe(Ie,ke.buildLocations);if(this.storedBuildState.get(Ie.locatorHash)===ht){g.set(Ie.locatorHash,ht),pe.delete(ee);continue}Ee||(await this.persistInstallStateFile(),Ee=!0),this.storedBuildState.has(Ie.locatorHash)?r.reportInfo(8,`${jr(this.configuration,Ie)} must be rebuilt because its dependency tree changed`):r.reportInfo(7,`${jr(this.configuration,Ie)} must be built because it never has been before or the last one failed`);let H=ke.buildLocations.map(async lt=>{if(!K.isAbsolute(lt))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${lt})`);for(let Re of ke.buildDirectives){let Qe=`# This file contains the result of Yarn building a package (${xa(Ie)}) +`;switch(Re.type){case 0:Qe+=`# Script name: ${Re.script} +`;break;case 1:Qe+=`# Script code: ${Re.script} +`;break}let be=null;if(!await oe.mktempPromise(async Te=>{let Je=K.join(Te,"build.log"),{stdout:He,stderr:x}=this.configuration.getSubprocessStreams(Je,{header:Qe,prefix:jr(this.configuration,Ie),report:r}),w;try{switch(Re.type){case 0:w=await Vx(Ie,Re.script,[],{cwd:lt,project:this,stdin:be,stdout:He,stderr:x});break;case 1:w=await wU(Ie,Re.script,[],{cwd:lt,project:this,stdin:be,stdout:He,stderr:x});break}}catch(F){x.write(F.stack),w=1}if(He.end(),x.end(),w===0)return!0;oe.detachTemp(Te);let S=`${jr(this.configuration,Ie)} couldn't be built successfully (exit code ${Ot(this.configuration,w,yt.NUMBER)}, logs can be found here: ${Ot(this.configuration,Je,yt.PATH)})`,y=this.optionalBuilds.has(Ie.locatorHash);return y?r.reportInfo(9,S):r.reportError(9,S),Jce&&r.reportFold(ue.fromPortablePath(Je),oe.readFileSync(Je,"utf8")),y}))return!1}return!0});ne.push(...H,Promise.allSettled(H).then(lt=>{pe.delete(ee),lt.every(Re=>Re.status==="fulfilled"&&Re.value===!0)&&g.set(Ie.locatorHash,ht)}))}if(await Uc(ne),ce===pe.size){let ee=Array.from(pe).map(Ie=>{let ke=this.storedPackages.get(Ie);if(!ke)throw new Error("Assertion failed: The package should have been registered");return jr(this.configuration,ke)}).join(", ");r.reportError(3,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${ee})`);break}}this.storedBuildState=g,this.skippedBuilds=L}async installWithNewReport(e,r){return(await Nt.start({configuration:this.configuration,json:e.json,stdout:e.stdout,forceSectionAlignment:!0,includeLogs:!e.json&&!e.quiet,includeVersion:!0},async a=>{await this.install({...r,report:a})})).exitCode()}async install(e){let r=this.configuration.get("nodeLinker");Ve.telemetry?.reportInstall(r);let o=!1;if(await e.report.startTimerPromise("Project validation",{skipIfEmpty:!0},async()=>{this.configuration.get("enableOfflineMode")&&e.report.reportWarning(90,"Offline work is enabled; Yarn won't fetch packages from the remote registry if it can avoid it"),await this.configuration.triggerHook(E=>E.validateProject,this,{reportWarning:(E,I)=>{e.report.reportWarning(E,I)},reportError:(E,I)=>{e.report.reportError(E,I),o=!0}})}),o)return;let a=await this.configuration.getPackageExtensions();for(let E of a.values())for(let[,I]of E)for(let v of I)v.status="inactive";let n=K.join(this.cwd,dr.lockfile),u=null;if(e.immutable)try{u=await oe.readFilePromise(n,"utf8")}catch(E){throw E.code==="ENOENT"?new zt(28,"The lockfile would have been created by this install, which is explicitly forbidden."):E}await e.report.startTimerPromise("Resolution step",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise("Post-resolution validation",{skipIfEmpty:!0},async()=>{LAt(this,e.report);for(let[,E]of a)for(let[,I]of E)for(let v of I)if(v.userProvided){let b=Ot(this.configuration,v,yt.PACKAGE_EXTENSION);switch(v.status){case"inactive":e.report.reportWarning(68,`${b}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case"redundant":e.report.reportWarning(69,`${b}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(u!==null){let E=Ug(u,this.generateLockfile());if(E!==u){let I=ppe(n,n,u,E,void 0,void 0,{maxEditLength:100});if(I){e.report.reportSeparator();for(let v of I.hunks){e.report.reportInfo(null,`@@ -${v.oldStart},${v.oldLines} +${v.newStart},${v.newLines} @@`);for(let b of v.lines)b.startsWith("+")?e.report.reportError(28,Ot(this.configuration,b,yt.ADDED)):b.startsWith("-")?e.report.reportError(28,Ot(this.configuration,b,yt.REMOVED)):e.report.reportInfo(null,Ot(this.configuration,b,"grey"))}e.report.reportSeparator()}throw new zt(28,"The lockfile would have been modified by this install, which is explicitly forbidden.")}}});for(let E of a.values())for(let[,I]of E)for(let v of I)v.userProvided&&v.status==="active"&&Ve.telemetry?.reportPackageExtension(yd(v,yt.PACKAGE_EXTENSION));await e.report.startTimerPromise("Fetch step",async()=>{await this.fetchEverything(e)});let A=e.immutable?[...new Set(this.configuration.get("immutablePatterns"))].sort():[],p=await Promise.all(A.map(async E=>MS(E,{cwd:this.cwd})));(typeof e.persistProject>"u"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise("Link step",async()=>{if(e.mode==="update-lockfile"){e.report.reportWarning(73,`Skipped due to ${Ot(this.configuration,"mode=update-lockfile",yt.CODE)}`);return}await this.linkEverything(e);let E=await Promise.all(A.map(async I=>MS(I,{cwd:this.cwd})));for(let I=0;I{await this.configuration.triggerHook(E=>E.validateProjectAfterInstall,this,{reportWarning:(E,I)=>{e.report.reportWarning(E,I)},reportError:(E,I)=>{e.report.reportError(E,I),h=!0}})}),!h&&await this.configuration.triggerHook(E=>E.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[n,u]of this.storedResolutions.entries()){let A=e.get(u);A||e.set(u,A=new Set),A.add(n)}let r={},{cacheKey:o}=Lr.getCacheKey(this.configuration);r.__metadata={version:nk,cacheKey:o};for(let[n,u]of e.entries()){let A=this.originalPackages.get(n);if(!A)continue;let p=[];for(let b of u){let C=this.storedDescriptors.get(b);if(!C)throw new Error("Assertion failed: The descriptor should have been registered");p.push(C)}let h=p.map(b=>Sa(b)).sort().join(", "),E=new Mt;E.version=A.linkType==="HARD"?A.version:"0.0.0-use.local",E.languageName=A.languageName,E.dependencies=new Map(A.dependencies),E.peerDependencies=new Map(A.peerDependencies),E.dependenciesMeta=new Map(A.dependenciesMeta),E.peerDependenciesMeta=new Map(A.peerDependenciesMeta),E.bin=new Map(A.bin);let I,v=this.storedChecksums.get(A.locatorHash);if(typeof v<"u"){let b=v.indexOf("/");if(b===-1)throw new Error("Assertion failed: Expected the checksum to reference its cache key");let C=v.slice(0,b),T=v.slice(b+1);C===o?I=T:I=v}r[h]={...E.exportTo({},{compatibilityMode:!1}),linkType:A.linkType.toLowerCase(),resolution:xa(A),checksum:I,conditions:A.conditions||void 0}}return`${[`# This file is generated by running "yarn install" inside your project. +`,`# Manual changes might be lost - proceed with caution! +`].join("")} +`+Ba(r)}async persistLockfile(){let e=K.join(this.cwd,dr.lockfile),r="";try{r=await oe.readFilePromise(e,"utf8")}catch{}let o=this.generateLockfile(),a=Ug(r,o);a!==r&&(await oe.writeFilePromise(e,a),this.lockFileChecksum=zpe(a),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let e=[];for(let u of Object.values(k_))e.push(...u);let r=(0,tk.default)(this,e),o=Q_.default.serialize(r),a=zs(o);if(this.installStateChecksum===a)return;let n=this.configuration.get("installStatePath");await oe.mkdirPromise(K.dirname(n),{recursive:!0}),await oe.writeFilePromise(n,await TAt(o)),this.installStateChecksum=a}async restoreInstallState({restoreLinkersCustomData:e=!0,restoreResolutions:r=!0,restoreBuildState:o=!0}={}){let a=this.configuration.get("installStatePath"),n;try{let u=await RAt(await oe.readFilePromise(a));n=Q_.default.deserialize(u),this.installStateChecksum=zs(u)}catch{r&&await this.applyLightResolution();return}e&&typeof n.linkersCustomData<"u"&&(this.linkersCustomData=n.linkersCustomData),o&&Object.assign(this,(0,tk.default)(n,k_.restoreBuildState)),r&&(n.lockFileChecksum===this.lockFileChecksum?Object.assign(this,(0,tk.default)(n,k_.restoreResolutions)):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new Qi}),await this.persistInstallStateFile()}async persist(){let e=(0,rk.default)(4);await Promise.all([this.persistLockfile(),...this.workspaces.map(r=>e(()=>r.persistManifest()))])}async cacheCleanup({cache:e,report:r}){if(this.configuration.get("enableGlobalCache"))return null;let o=new Set([".gitignore"]);if(!IO(e.cwd,this.cwd)||!await oe.existsPromise(e.cwd))return null;let a=[];for(let u of await oe.readdirPromise(e.cwd)){if(o.has(u))continue;let A=K.resolve(e.cwd,u);e.markedFiles.has(A)||(e.immutable?r.reportError(56,`${Ot(this.configuration,K.basename(A),"magenta")} appears to be unused and would be marked for deletion, but the cache is immutable`):a.push(oe.lstatPromise(A).then(async p=>(await oe.removePromise(A),p.size))))}if(a.length===0)return null;let n=await Promise.all(a);return{count:a.length,size:n.reduce((u,A)=>u+A,0)}}}});function MAt(t){let o=Math.floor(t.timeNow/864e5),a=t.updateInterval*864e5,n=t.state.lastUpdate??t.timeNow+a+Math.floor(a*t.randomInitialInterval),u=n+a,A=t.state.lastTips??o*864e5,p=A+864e5+8*36e5-t.timeZone,h=u<=t.timeNow,E=p<=t.timeNow,I=null;return(h||E||!t.state.lastUpdate||!t.state.lastTips)&&(I={},I.lastUpdate=h?t.timeNow:n,I.lastTips=A,I.blocks=h?{}:t.state.blocks,I.displayedTips=t.state.displayedTips),{nextState:I,triggerUpdate:h,triggerTips:E,nextTips:E?o*864e5:A}}var cC,$pe=Et(()=>{Pt();N1();rh();Bx();jl();kf();cC=class{constructor(e,r){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.nextTips=0;this.displayedTips=[];this.shouldCommitTips=!1;this.configuration=e;let o=this.getRegistryPath();this.isNew=!oe.existsSync(o),this.shouldShowTips=!1,this.sendReport(r),this.startBuffer()}commitTips(){this.shouldShowTips&&(this.shouldCommitTips=!0)}selectTip(e){let r=new Set(this.displayedTips),o=A=>A&&tn?bf(tn,A):!1,a=e.map((A,p)=>p).filter(A=>e[A]&&o(e[A]?.selector));if(a.length===0)return null;let n=a.filter(A=>!r.has(A));if(n.length===0){let A=Math.floor(a.length*.2);this.displayedTips=A>0?this.displayedTips.slice(-A):[],n=a.filter(p=>!r.has(p))}let u=n[Math.floor(Math.random()*n.length)];return this.displayedTips.push(u),this.commitTips(),e[u]}reportVersion(e){this.reportValue("version",e.replace(/-git\..*/,"-git"))}reportCommandName(e){this.reportValue("commandName",e||"")}reportPluginName(e){this.reportValue("pluginName",e)}reportProject(e){this.reportEnumerator("projectCount",e)}reportInstall(e){this.reportHit("installCount",e)}reportPackageExtension(e){this.reportValue("packageExtension",e)}reportWorkspaceCount(e){this.reportValue("workspaceCount",String(e))}reportDependencyCount(e){this.reportValue("dependencyCount",String(e))}reportValue(e,r){dd(this.values,e).add(r)}reportEnumerator(e,r){dd(this.enumerators,e).add(zs(r))}reportHit(e,r="*"){let o=Yy(this.hits,e),a=ol(o,r,()=>0);o.set(r,a+1)}getRegistryPath(){let e=this.configuration.get("globalFolder");return K.join(e,"telemetry.json")}sendReport(e){let r=this.getRegistryPath(),o;try{o=oe.readJsonSync(r)}catch{o={}}let{nextState:a,triggerUpdate:n,triggerTips:u,nextTips:A}=MAt({state:o,timeNow:Date.now(),timeZone:new Date().getTimezoneOffset()*60*1e3,randomInitialInterval:Math.random(),updateInterval:this.configuration.get("telemetryInterval")});if(this.nextTips=A,this.displayedTips=o.displayedTips??[],a!==null)try{oe.mkdirSync(K.dirname(r),{recursive:!0}),oe.writeJsonSync(r,a)}catch{return!1}if(u&&this.configuration.get("enableTips")&&(this.shouldShowTips=!0),n){let p=o.blocks??{};if(Object.keys(p).length===0){let h=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,E=I=>U4(h,I,{configuration:this.configuration}).catch(()=>{});for(let[I,v]of Object.entries(o.blocks??{})){if(Object.keys(v).length===0)continue;let b=v;b.userId=I,b.reportType="primary";for(let L of Object.keys(b.enumerators??{}))b.enumerators[L]=b.enumerators[L].length;E(b);let C=new Map,T=20;for(let[L,U]of Object.entries(b.values))U.length>0&&C.set(L,U.slice(0,T));for(;C.size>0;){let L={};L.userId=I,L.reportType="secondary",L.metrics={};for(let[U,J]of C)L.metrics[U]=J.shift(),J.length===0&&C.delete(U);E(L)}}}}return!0}applyChanges(){let e=this.getRegistryPath(),r;try{r=oe.readJsonSync(e)}catch{r={}}let o=this.configuration.get("telemetryUserId")??"*",a=r.blocks=r.blocks??{},n=a[o]=a[o]??{};for(let u of this.hits.keys()){let A=n.hits=n.hits??{},p=A[u]=A[u]??{};for(let[h,E]of this.hits.get(u))p[h]=(p[h]??0)+E}for(let u of["values","enumerators"])for(let A of this[u].keys()){let p=n[u]=n[u]??{};p[A]=[...new Set([...p[A]??[],...this[u].get(A)??[]])]}this.shouldCommitTips&&(r.lastTips=this.nextTips,r.displayedTips=this.displayedTips),oe.mkdirSync(K.dirname(e),{recursive:!0}),oe.writeJsonSync(e,r)}startBuffer(){process.on("exit",()=>{try{this.applyChanges()}catch{}})}}});var s2={};Kt(s2,{BuildDirectiveType:()=>zb,CACHE_CHECKPOINT:()=>A_,CACHE_VERSION:()=>Jb,Cache:()=>Lr,Configuration:()=>Ve,DEFAULT_RC_FILENAME:()=>W4,FormatType:()=>Qle,InstallMode:()=>pl,LEGACY_PLUGINS:()=>B1,LOCKFILE_VERSION:()=>nk,LegacyMigrationResolver:()=>sC,LightReport:()=>AA,LinkType:()=>Jy,LockfileResolver:()=>oC,Manifest:()=>Mt,MessageName:()=>wr,MultiFetcher:()=>pE,PackageExtensionStatus:()=>DL,PackageExtensionType:()=>vL,PeerWarningType:()=>ik,Project:()=>St,Report:()=>Xs,ReportError:()=>zt,SettingsType:()=>v1,StreamReport:()=>Nt,TAG_REGEXP:()=>QE,TelemetryManager:()=>cC,ThrowReport:()=>Qi,VirtualFetcher:()=>hE,WindowsLinkType:()=>kx,Workspace:()=>lC,WorkspaceFetcher:()=>dE,WorkspaceResolver:()=>Xn,YarnVersion:()=>tn,execUtils:()=>Ur,folderUtils:()=>WS,formatUtils:()=>de,hashUtils:()=>wn,httpUtils:()=>rn,miscUtils:()=>je,nodeUtils:()=>Ji,parseMessageName:()=>fP,reportOptionDeprecations:()=>NE,scriptUtils:()=>un,semverUtils:()=>kr,stringifyMessageName:()=>Wu,structUtils:()=>W,tgzUtils:()=>Xi,treeUtils:()=>$s});var Ye=Et(()=>{Px();VS();ql();rh();Bx();jl();Dx();DU();kf();xo();$fe();ope();f_();D1();D1();lpe();p_();cpe();h_();AE();pP();AO();Zpe();Yl();L1();$pe();x_();pO();hO();Bd();b_();N1();Ine()});var she=_((K_t,a2)=>{"use strict";var UAt=process.env.TERM_PROGRAM==="Hyper",_At=process.platform==="win32",rhe=process.platform==="linux",R_={ballotDisabled:"\u2612",ballotOff:"\u2610",ballotOn:"\u2611",bullet:"\u2022",bulletWhite:"\u25E6",fullBlock:"\u2588",heart:"\u2764",identicalTo:"\u2261",line:"\u2500",mark:"\u203B",middot:"\xB7",minus:"\uFF0D",multiplication:"\xD7",obelus:"\xF7",pencilDownRight:"\u270E",pencilRight:"\u270F",pencilUpRight:"\u2710",percent:"%",pilcrow2:"\u2761",pilcrow:"\xB6",plusMinus:"\xB1",section:"\xA7",starsOff:"\u2606",starsOn:"\u2605",upDownArrow:"\u2195"},nhe=Object.assign({},R_,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",question:"?",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),ihe=Object.assign({},R_,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",question:"?",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:rhe?"\u25B8":"\u276F",pointerSmall:rhe?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});a2.exports=_At&&!UAt?nhe:ihe;Reflect.defineProperty(a2.exports,"common",{enumerable:!1,value:R_});Reflect.defineProperty(a2.exports,"windows",{enumerable:!1,value:nhe});Reflect.defineProperty(a2.exports,"other",{enumerable:!1,value:ihe})});var Vc=_((J_t,N_)=>{"use strict";var HAt=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),jAt=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,ohe=()=>{let t={enabled:!0,visible:!0,styles:{},keys:{}};"FORCE_COLOR"in process.env&&(t.enabled=process.env.FORCE_COLOR!=="0");let e=n=>{let u=n.open=`\x1B[${n.codes[0]}m`,A=n.close=`\x1B[${n.codes[1]}m`,p=n.regex=new RegExp(`\\u001b\\[${n.codes[1]}m`,"g");return n.wrap=(h,E)=>{h.includes(A)&&(h=h.replace(p,A+u));let I=u+h+A;return E?I.replace(/\r*\n/g,`${A}$&${u}`):I},n},r=(n,u,A)=>typeof n=="function"?n(u):n.wrap(u,A),o=(n,u)=>{if(n===""||n==null)return"";if(t.enabled===!1)return n;if(t.visible===!1)return"";let A=""+n,p=A.includes(` +`),h=u.length;for(h>0&&u.includes("unstyle")&&(u=[...new Set(["unstyle",...u])].reverse());h-- >0;)A=r(t.styles[u[h]],A,p);return A},a=(n,u,A)=>{t.styles[n]=e({name:n,codes:u}),(t.keys[A]||(t.keys[A]=[])).push(n),Reflect.defineProperty(t,n,{configurable:!0,enumerable:!0,set(h){t.alias(n,h)},get(){let h=E=>o(E,h.stack);return Reflect.setPrototypeOf(h,t),h.stack=this.stack?this.stack.concat(n):[n],h}})};return a("reset",[0,0],"modifier"),a("bold",[1,22],"modifier"),a("dim",[2,22],"modifier"),a("italic",[3,23],"modifier"),a("underline",[4,24],"modifier"),a("inverse",[7,27],"modifier"),a("hidden",[8,28],"modifier"),a("strikethrough",[9,29],"modifier"),a("black",[30,39],"color"),a("red",[31,39],"color"),a("green",[32,39],"color"),a("yellow",[33,39],"color"),a("blue",[34,39],"color"),a("magenta",[35,39],"color"),a("cyan",[36,39],"color"),a("white",[37,39],"color"),a("gray",[90,39],"color"),a("grey",[90,39],"color"),a("bgBlack",[40,49],"bg"),a("bgRed",[41,49],"bg"),a("bgGreen",[42,49],"bg"),a("bgYellow",[43,49],"bg"),a("bgBlue",[44,49],"bg"),a("bgMagenta",[45,49],"bg"),a("bgCyan",[46,49],"bg"),a("bgWhite",[47,49],"bg"),a("blackBright",[90,39],"bright"),a("redBright",[91,39],"bright"),a("greenBright",[92,39],"bright"),a("yellowBright",[93,39],"bright"),a("blueBright",[94,39],"bright"),a("magentaBright",[95,39],"bright"),a("cyanBright",[96,39],"bright"),a("whiteBright",[97,39],"bright"),a("bgBlackBright",[100,49],"bgBright"),a("bgRedBright",[101,49],"bgBright"),a("bgGreenBright",[102,49],"bgBright"),a("bgYellowBright",[103,49],"bgBright"),a("bgBlueBright",[104,49],"bgBright"),a("bgMagentaBright",[105,49],"bgBright"),a("bgCyanBright",[106,49],"bgBright"),a("bgWhiteBright",[107,49],"bgBright"),t.ansiRegex=jAt,t.hasColor=t.hasAnsi=n=>(t.ansiRegex.lastIndex=0,typeof n=="string"&&n!==""&&t.ansiRegex.test(n)),t.alias=(n,u)=>{let A=typeof u=="string"?t[u]:u;if(typeof A!="function")throw new TypeError("Expected alias to be the name of an existing color (string) or a function");A.stack||(Reflect.defineProperty(A,"name",{value:n}),t.styles[n]=A,A.stack=[n]),Reflect.defineProperty(t,n,{configurable:!0,enumerable:!0,set(p){t.alias(n,p)},get(){let p=h=>o(h,p.stack);return Reflect.setPrototypeOf(p,t),p.stack=this.stack?this.stack.concat(A.stack):A.stack,p}})},t.theme=n=>{if(!HAt(n))throw new TypeError("Expected theme to be an object");for(let u of Object.keys(n))t.alias(u,n[u]);return t},t.alias("unstyle",n=>typeof n=="string"&&n!==""?(t.ansiRegex.lastIndex=0,n.replace(t.ansiRegex,"")):""),t.alias("noop",n=>n),t.none=t.clear=t.noop,t.stripColor=t.unstyle,t.symbols=she(),t.define=a,t};N_.exports=ohe();N_.exports.create=ohe});var No=_(nn=>{"use strict";var qAt=Object.prototype.toString,rc=Vc(),ahe=!1,L_=[],lhe={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};nn.longest=(t,e)=>t.reduce((r,o)=>Math.max(r,e?o[e].length:o.length),0);nn.hasColor=t=>!!t&&rc.hasColor(t);var ok=nn.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);nn.nativeType=t=>qAt.call(t).slice(8,-1).toLowerCase().replace(/\s/g,"");nn.isAsyncFn=t=>nn.nativeType(t)==="asyncfunction";nn.isPrimitive=t=>t!=null&&typeof t!="object"&&typeof t!="function";nn.resolve=(t,e,...r)=>typeof e=="function"?e.call(t,...r):e;nn.scrollDown=(t=[])=>[...t.slice(1),t[0]];nn.scrollUp=(t=[])=>[t.pop(),...t];nn.reorder=(t=[])=>{let e=t.slice();return e.sort((r,o)=>r.index>o.index?1:r.index{let o=t.length,a=r===o?0:r<0?o-1:r,n=t[e];t[e]=t[a],t[a]=n};nn.width=(t,e=80)=>{let r=t&&t.columns?t.columns:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[0]),process.platform==="win32"?r-1:r};nn.height=(t,e=20)=>{let r=t&&t.rows?t.rows:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[1]),r};nn.wordWrap=(t,e={})=>{if(!t)return t;typeof e=="number"&&(e={width:e});let{indent:r="",newline:o=` +`+r,width:a=80}=e,n=(o+r).match(/[^\S\n]/g)||[];a-=n.length;let u=`.{1,${a}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,A=t.trim(),p=new RegExp(u,"g"),h=A.match(p)||[];return h=h.map(E=>E.replace(/\n$/,"")),e.padEnd&&(h=h.map(E=>E.padEnd(a," "))),e.padStart&&(h=h.map(E=>E.padStart(a," "))),r+h.join(o)};nn.unmute=t=>{let e=t.stack.find(o=>rc.keys.color.includes(o));return e?rc[e]:t.stack.find(o=>o.slice(2)==="bg")?rc[e.slice(2)]:o=>o};nn.pascal=t=>t?t[0].toUpperCase()+t.slice(1):"";nn.inverse=t=>{if(!t||!t.stack)return t;let e=t.stack.find(o=>rc.keys.color.includes(o));if(e){let o=rc["bg"+nn.pascal(e)];return o?o.black:t}let r=t.stack.find(o=>o.slice(0,2)==="bg");return r?rc[r.slice(2).toLowerCase()]||t:rc.none};nn.complement=t=>{if(!t||!t.stack)return t;let e=t.stack.find(o=>rc.keys.color.includes(o)),r=t.stack.find(o=>o.slice(0,2)==="bg");if(e&&!r)return rc[lhe[e]||e];if(r){let o=r.slice(2).toLowerCase(),a=lhe[o];return a&&rc["bg"+nn.pascal(a)]||t}return rc.none};nn.meridiem=t=>{let e=t.getHours(),r=t.getMinutes(),o=e>=12?"pm":"am";e=e%12;let a=e===0?12:e,n=r<10?"0"+r:r;return a+":"+n+" "+o};nn.set=(t={},e="",r)=>e.split(".").reduce((o,a,n,u)=>{let A=u.length-1>n?o[a]||{}:r;return!nn.isObject(A)&&n{let o=t[e]==null?e.split(".").reduce((a,n)=>a&&a[n],t):t[e];return o??r};nn.mixin=(t,e)=>{if(!ok(t))return e;if(!ok(e))return t;for(let r of Object.keys(e)){let o=Object.getOwnPropertyDescriptor(e,r);if(o.hasOwnProperty("value"))if(t.hasOwnProperty(r)&&ok(o.value)){let a=Object.getOwnPropertyDescriptor(t,r);ok(a.value)?t[r]=nn.merge({},t[r],e[r]):Reflect.defineProperty(t,r,o)}else Reflect.defineProperty(t,r,o);else Reflect.defineProperty(t,r,o)}return t};nn.merge=(...t)=>{let e={};for(let r of t)nn.mixin(e,r);return e};nn.mixinEmitter=(t,e)=>{let r=e.constructor.prototype;for(let o of Object.keys(r)){let a=r[o];typeof a=="function"?nn.define(t,o,a.bind(e)):nn.define(t,o,a)}};nn.onExit=t=>{let e=(r,o)=>{ahe||(ahe=!0,L_.forEach(a=>a()),r===!0&&process.exit(128+o))};L_.length===0&&(process.once("SIGTERM",e.bind(null,!0,15)),process.once("SIGINT",e.bind(null,!0,2)),process.once("exit",e)),L_.push(t)};nn.define=(t,e,r)=>{Reflect.defineProperty(t,e,{value:r})};nn.defineExport=(t,e,r)=>{let o;Reflect.defineProperty(t,e,{enumerable:!0,configurable:!0,set(a){o=a},get(){return o?o():r()}})}});var che=_(pC=>{"use strict";pC.ctrl={a:"first",b:"backward",c:"cancel",d:"deleteForward",e:"last",f:"forward",g:"reset",i:"tab",k:"cutForward",l:"reset",n:"newItem",m:"cancel",j:"submit",p:"search",r:"remove",s:"save",u:"undo",w:"cutLeft",x:"toggleCursor",v:"paste"};pC.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};pC.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};pC.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};pC.keys={pageup:"pageUp",pagedown:"pageDown",home:"home",end:"end",cancel:"cancel",delete:"deleteForward",backspace:"delete",down:"down",enter:"submit",escape:"cancel",left:"left",space:"space",number:"number",return:"submit",right:"right",tab:"next",up:"up"}});var fhe=_((Z_t,Ahe)=>{"use strict";var uhe=Be("readline"),GAt=che(),YAt=/^(?:\x1b)([a-zA-Z0-9])$/,WAt=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,VAt={OP:"f1",OQ:"f2",OR:"f3",OS:"f4","[11~":"f1","[12~":"f2","[13~":"f3","[14~":"f4","[[A":"f1","[[B":"f2","[[C":"f3","[[D":"f4","[[E":"f5","[15~":"f5","[17~":"f6","[18~":"f7","[19~":"f8","[20~":"f9","[21~":"f10","[23~":"f11","[24~":"f12","[A":"up","[B":"down","[C":"right","[D":"left","[E":"clear","[F":"end","[H":"home",OA:"up",OB:"down",OC:"right",OD:"left",OE:"clear",OF:"end",OH:"home","[1~":"home","[2~":"insert","[3~":"delete","[4~":"end","[5~":"pageup","[6~":"pagedown","[[5~":"pageup","[[6~":"pagedown","[7~":"home","[8~":"end","[a":"up","[b":"down","[c":"right","[d":"left","[e":"clear","[2$":"insert","[3$":"delete","[5$":"pageup","[6$":"pagedown","[7$":"home","[8$":"end",Oa:"up",Ob:"down",Oc:"right",Od:"left",Oe:"clear","[2^":"insert","[3^":"delete","[5^":"pageup","[6^":"pagedown","[7^":"home","[8^":"end","[Z":"tab"};function KAt(t){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(t)}function JAt(t){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(t)}var ak=(t="",e={})=>{let r,o={name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:t,raw:t,...e};if(Buffer.isBuffer(t)?t[0]>127&&t[1]===void 0?(t[0]-=128,t="\x1B"+String(t)):t=String(t):t!==void 0&&typeof t!="string"?t=String(t):t||(t=o.sequence||""),o.sequence=o.sequence||t||o.name,t==="\r")o.raw=void 0,o.name="return";else if(t===` +`)o.name="enter";else if(t===" ")o.name="tab";else if(t==="\b"||t==="\x7F"||t==="\x1B\x7F"||t==="\x1B\b")o.name="backspace",o.meta=t.charAt(0)==="\x1B";else if(t==="\x1B"||t==="\x1B\x1B")o.name="escape",o.meta=t.length===2;else if(t===" "||t==="\x1B ")o.name="space",o.meta=t.length===2;else if(t<="")o.name=String.fromCharCode(t.charCodeAt(0)+"a".charCodeAt(0)-1),o.ctrl=!0;else if(t.length===1&&t>="0"&&t<="9")o.name="number";else if(t.length===1&&t>="a"&&t<="z")o.name=t;else if(t.length===1&&t>="A"&&t<="Z")o.name=t.toLowerCase(),o.shift=!0;else if(r=YAt.exec(t))o.meta=!0,o.shift=/^[A-Z]$/.test(r[1]);else if(r=WAt.exec(t)){let a=[...t];a[0]==="\x1B"&&a[1]==="\x1B"&&(o.option=!0);let n=[r[1],r[2],r[4],r[6]].filter(Boolean).join(""),u=(r[3]||r[5]||1)-1;o.ctrl=!!(u&4),o.meta=!!(u&10),o.shift=!!(u&1),o.code=n,o.name=VAt[n],o.shift=KAt(n)||o.shift,o.ctrl=JAt(n)||o.ctrl}return o};ak.listen=(t={},e)=>{let{stdin:r}=t;if(!r||r!==process.stdin&&!r.isTTY)throw new Error("Invalid stream passed");let o=uhe.createInterface({terminal:!0,input:r});uhe.emitKeypressEvents(r,o);let a=(A,p)=>e(A,ak(A,p),o),n=r.isRaw;return r.isTTY&&r.setRawMode(!0),r.on("keypress",a),o.resume(),()=>{r.isTTY&&r.setRawMode(n),r.removeListener("keypress",a),o.pause(),o.close()}};ak.action=(t,e,r)=>{let o={...GAt,...r};return e.ctrl?(e.action=o.ctrl[e.name],e):e.option&&o.option?(e.action=o.option[e.name],e):e.shift?(e.action=o.shift[e.name],e):(e.action=o.keys[e.name],e)};Ahe.exports=ak});var hhe=_(($_t,phe)=>{"use strict";phe.exports=t=>{t.timers=t.timers||{};let e=t.options.timers;if(!!e)for(let r of Object.keys(e)){let o=e[r];typeof o=="number"&&(o={interval:o}),zAt(t,r,o)}};function zAt(t,e,r={}){let o=t.timers[e]={name:e,start:Date.now(),ms:0,tick:0},a=r.interval||120;o.frames=r.frames||[],o.loading=!0;let n=setInterval(()=>{o.ms=Date.now()-o.start,o.tick++,t.render()},a);return o.stop=()=>{o.loading=!1,clearInterval(n)},Reflect.defineProperty(o,"interval",{value:n}),t.once("close",()=>o.stop()),o.stop}});var dhe=_((e8t,ghe)=>{"use strict";var{define:XAt,width:ZAt}=No(),M_=class{constructor(e){let r=e.options;XAt(this,"_prompt",e),this.type=e.type,this.name=e.name,this.message="",this.header="",this.footer="",this.error="",this.hint="",this.input="",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt="",this.buffer="",this.width=ZAt(r.stdout||process.stdout),Object.assign(this,r),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e={...this};return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let r=this._color||e[this.status];return typeof r=="function"?r:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading=="boolean"?this._loading:this.loadingChoices?"choices":!1}get status(){return this.cancelled?"cancelled":this.submitted?"submitted":"pending"}};ghe.exports=M_});var yhe=_((t8t,mhe)=>{"use strict";var O_=No(),eo=Vc(),U_={default:eo.noop,noop:eo.noop,set inverse(t){this._inverse=t},get inverse(){return this._inverse||O_.inverse(this.primary)},set complement(t){this._complement=t},get complement(){return this._complement||O_.complement(this.primary)},primary:eo.cyan,success:eo.green,danger:eo.magenta,strong:eo.bold,warning:eo.yellow,muted:eo.dim,disabled:eo.gray,dark:eo.dim.gray,underline:eo.underline,set info(t){this._info=t},get info(){return this._info||this.primary},set em(t){this._em=t},get em(){return this._em||this.primary.underline},set heading(t){this._heading=t},get heading(){return this._heading||this.muted.underline},set pending(t){this._pending=t},get pending(){return this._pending||this.primary},set submitted(t){this._submitted=t},get submitted(){return this._submitted||this.success},set cancelled(t){this._cancelled=t},get cancelled(){return this._cancelled||this.danger},set typing(t){this._typing=t},get typing(){return this._typing||this.dim},set placeholder(t){this._placeholder=t},get placeholder(){return this._placeholder||this.primary.dim},set highlight(t){this._highlight=t},get highlight(){return this._highlight||this.inverse}};U_.merge=(t={})=>{t.styles&&typeof t.styles.enabled=="boolean"&&(eo.enabled=t.styles.enabled),t.styles&&typeof t.styles.visible=="boolean"&&(eo.visible=t.styles.visible);let e=O_.merge({},U_,t.styles);delete e.merge;for(let r of Object.keys(eo))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>eo[r]});for(let r of Object.keys(eo.styles))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>eo[r]});return e};mhe.exports=U_});var Che=_((r8t,Ehe)=>{"use strict";var __=process.platform==="win32",Vf=Vc(),$At=No(),H_={...Vf.symbols,upDownDoubleArrow:"\u21D5",upDownDoubleArrow2:"\u2B0D",upDownArrow:"\u2195",asterisk:"*",asterism:"\u2042",bulletWhite:"\u25E6",electricArrow:"\u2301",ellipsisLarge:"\u22EF",ellipsisSmall:"\u2026",fullBlock:"\u2588",identicalTo:"\u2261",indicator:Vf.symbols.check,leftAngle:"\u2039",mark:"\u203B",minus:"\u2212",multiplication:"\xD7",obelus:"\xF7",percent:"%",pilcrow:"\xB6",pilcrow2:"\u2761",pencilUpRight:"\u2710",pencilDownRight:"\u270E",pencilRight:"\u270F",plus:"+",plusMinus:"\xB1",pointRight:"\u261E",rightAngle:"\u203A",section:"\xA7",hexagon:{off:"\u2B21",on:"\u2B22",disabled:"\u2B22"},ballot:{on:"\u2611",off:"\u2610",disabled:"\u2612"},stars:{on:"\u2605",off:"\u2606",disabled:"\u2606"},folder:{on:"\u25BC",off:"\u25B6",disabled:"\u25B6"},prefix:{pending:Vf.symbols.question,submitted:Vf.symbols.check,cancelled:Vf.symbols.cross},separator:{pending:Vf.symbols.pointerSmall,submitted:Vf.symbols.middot,cancelled:Vf.symbols.middot},radio:{off:__?"( )":"\u25EF",on:__?"(*)":"\u25C9",disabled:__?"(|)":"\u24BE"},numbers:["\u24EA","\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246A","\u246B","\u246C","\u246D","\u246E","\u246F","\u2470","\u2471","\u2472","\u2473","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325A","\u325B","\u325C","\u325D","\u325E","\u325F","\u32B1","\u32B2","\u32B3","\u32B4","\u32B5","\u32B6","\u32B7","\u32B8","\u32B9","\u32BA","\u32BB","\u32BC","\u32BD","\u32BE","\u32BF"]};H_.merge=t=>{let e=$At.merge({},Vf.symbols,H_,t.symbols);return delete e.merge,e};Ehe.exports=H_});var Ihe=_((n8t,whe)=>{"use strict";var eft=yhe(),tft=Che(),rft=No();whe.exports=t=>{t.options=rft.merge({},t.options.theme,t.options),t.symbols=tft.merge(t.options),t.styles=eft.merge(t.options)}});var She=_((Dhe,Phe)=>{"use strict";var Bhe=process.env.TERM_PROGRAM==="Apple_Terminal",nft=Vc(),j_=No(),Kc=Phe.exports=Dhe,Di="\x1B[",vhe="\x07",q_=!1,Ph=Kc.code={bell:vhe,beep:vhe,beginning:`${Di}G`,down:`${Di}J`,esc:Di,getPosition:`${Di}6n`,hide:`${Di}?25l`,line:`${Di}2K`,lineEnd:`${Di}K`,lineStart:`${Di}1K`,restorePosition:Di+(Bhe?"8":"u"),savePosition:Di+(Bhe?"7":"s"),screen:`${Di}2J`,show:`${Di}?25h`,up:`${Di}1J`},qd=Kc.cursor={get hidden(){return q_},hide(){return q_=!0,Ph.hide},show(){return q_=!1,Ph.show},forward:(t=1)=>`${Di}${t}C`,backward:(t=1)=>`${Di}${t}D`,nextLine:(t=1)=>`${Di}E`.repeat(t),prevLine:(t=1)=>`${Di}F`.repeat(t),up:(t=1)=>t?`${Di}${t}A`:"",down:(t=1)=>t?`${Di}${t}B`:"",right:(t=1)=>t?`${Di}${t}C`:"",left:(t=1)=>t?`${Di}${t}D`:"",to(t,e){return e?`${Di}${e+1};${t+1}H`:`${Di}${t+1}G`},move(t=0,e=0){let r="";return r+=t<0?qd.left(-t):t>0?qd.right(t):"",r+=e<0?qd.up(-e):e>0?qd.down(e):"",r},restore(t={}){let{after:e,cursor:r,initial:o,input:a,prompt:n,size:u,value:A}=t;if(o=j_.isPrimitive(o)?String(o):"",a=j_.isPrimitive(a)?String(a):"",A=j_.isPrimitive(A)?String(A):"",u){let p=Kc.cursor.up(u)+Kc.cursor.to(n.length),h=a.length-r;return h>0&&(p+=Kc.cursor.left(h)),p}if(A||e){let p=!a&&!!o?-o.length:-a.length+r;return e&&(p-=e.length),a===""&&o&&!n.includes(o)&&(p+=o.length),Kc.cursor.move(p)}}},G_=Kc.erase={screen:Ph.screen,up:Ph.up,down:Ph.down,line:Ph.line,lineEnd:Ph.lineEnd,lineStart:Ph.lineStart,lines(t){let e="";for(let r=0;r{if(!e)return G_.line+qd.to(0);let r=n=>[...nft.unstyle(n)].length,o=t.split(/\r?\n/),a=0;for(let n of o)a+=1+Math.floor(Math.max(r(n)-1,0)/e);return(G_.line+qd.prevLine()).repeat(a-1)+G_.line+qd.to(0)}});var hC=_((i8t,bhe)=>{"use strict";var ift=Be("events"),xhe=Vc(),Y_=fhe(),sft=hhe(),oft=dhe(),aft=Ihe(),Ta=No(),Gd=She(),l2=class extends ift{constructor(e={}){super(),this.name=e.name,this.type=e.type,this.options=e,aft(this),sft(this),this.state=new oft(this),this.initial=[e.initial,e.default].find(r=>r!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=cft(this.options.margin),this.setMaxListeners(0),lft(this)}async keypress(e,r={}){this.keypressed=!0;let o=Y_.action(e,Y_(e,r),this.options.actions);this.state.keypress=o,this.emit("keypress",e,o),this.emit("state",this.state.clone());let a=this.options[o.action]||this[o.action]||this.dispatch;if(typeof a=="function")return await a.call(this,e,o);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit("alert"):this.stdout.write(Gd.code.beep)}cursorHide(){this.stdout.write(Gd.cursor.hide()),Ta.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(Gd.cursor.show())}write(e){!e||(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let r=this.state.buffer;this.state.buffer="",!(!r&&!e||this.options.show===!1)&&this.stdout.write(Gd.cursor.down(e)+Gd.clear(r,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:r,rest:o}=this.sections(),{cursor:a,initial:n="",input:u="",value:A=""}=this,p=this.state.size=o.length,h={after:r,cursor:a,initial:n,input:u,prompt:e,size:p,value:A},E=Gd.cursor.restore(h);E&&this.stdout.write(E)}sections(){let{buffer:e,input:r,prompt:o}=this.state;o=xhe.unstyle(o);let a=xhe.unstyle(e),n=a.indexOf(o),u=a.slice(0,n),p=a.slice(n).split(` +`),h=p[0],E=p[p.length-1],v=(o+(r?" "+r:"")).length,b=ve.call(this,this.value),this.result=()=>o.call(this,this.value),typeof r.initial=="function"&&(this.initial=await r.initial.call(this,this)),typeof r.onRun=="function"&&await r.onRun.call(this,this),typeof r.onSubmit=="function"){let a=r.onSubmit.bind(this),n=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await a(this.name,this.value,this),n())}await this.start(),await this.render()}render(){throw new Error("expected prompt to have a custom render method")}run(){return new Promise(async(e,r)=>{if(this.once("submit",e),this.once("cancel",r),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(e,r,o){let{options:a,state:n,symbols:u,timers:A}=this,p=A&&A[e];n.timer=p;let h=a[e]||n[e]||u[e],E=r&&r[e]!=null?r[e]:await h;if(E==="")return E;let I=await this.resolve(E,n,r,o);return!I&&r&&r[e]?this.resolve(h,n,r,o):I}async prefix(){let e=await this.element("prefix")||this.symbols,r=this.timers&&this.timers.prefix,o=this.state;return o.timer=r,Ta.isObject(e)&&(e=e[o.status]||e.pending),Ta.hasColor(e)?e:(this.styles[o.status]||this.styles.pending)(e)}async message(){let e=await this.element("message");return Ta.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element("separator")||this.symbols,r=this.timers&&this.timers.separator,o=this.state;o.timer=r;let a=e[o.status]||e.pending||o.separator,n=await this.resolve(a,o);return Ta.isObject(n)&&(n=n[o.status]||n.pending),Ta.hasColor(n)?n:this.styles.muted(n)}async pointer(e,r){let o=await this.element("pointer",e,r);if(typeof o=="string"&&Ta.hasColor(o))return o;if(o){let a=this.styles,n=this.index===r,u=n?a.primary:h=>h,A=await this.resolve(o[n?"on":"off"]||o,this.state),p=Ta.hasColor(A)?A:u(A);return n?p:" ".repeat(A.length)}}async indicator(e,r){let o=await this.element("indicator",e,r);if(typeof o=="string"&&Ta.hasColor(o))return o;if(o){let a=this.styles,n=e.enabled===!0,u=n?a.success:a.dark,A=o[n?"on":"off"]||o;return Ta.hasColor(A)?A:u(A)}return""}body(){return null}footer(){if(this.state.status==="pending")return this.element("footer")}header(){if(this.state.status==="pending")return this.element("header")}async hint(){if(this.state.status==="pending"&&!this.isValue(this.state.input)){let e=await this.element("hint");return Ta.hasColor(e)?e:this.styles.muted(e)}}error(e){return this.state.submitted?"":e||this.state.error}format(e){return e}result(e){return e}validate(e){return this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==""}resolve(e,...r){return Ta.resolve(this,e,...r)}get base(){return l2.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||Ta.height(this.stdout,25)}get width(){return this.options.columns||Ta.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:r}=this.state,o=[r,e].find(this.isValue.bind(this));return this.isValue(o)?o:this.initial}static get prompt(){return e=>new this(e).run()}};function lft(t){let e=a=>t[a]===void 0||typeof t[a]=="function",r=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],o=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let a of Object.keys(t.options)){if(r.includes(a)||/^on[A-Z]/.test(a))continue;let n=t.options[a];typeof n=="function"&&e(a)?o.includes(a)||(t[a]=n.bind(t)):typeof t[a]!="function"&&(t[a]=n)}}function cft(t){typeof t=="number"&&(t=[t,t,t,t]);let e=[].concat(t||[]),r=a=>a%2===0?` +`:" ",o=[];for(let a=0;a<4;a++){let n=r(a);e[a]?o.push(n.repeat(e[a])):o.push("")}return o}bhe.exports=l2});var Fhe=_((s8t,Qhe)=>{"use strict";var uft=No(),khe={default(t,e){return e},checkbox(t,e){throw new Error("checkbox role is not implemented yet")},editable(t,e){throw new Error("editable role is not implemented yet")},expandable(t,e){throw new Error("expandable role is not implemented yet")},heading(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||"",e},input(t,e){throw new Error("input role is not implemented yet")},option(t,e){return khe.default(t,e)},radio(t,e){throw new Error("radio role is not implemented yet")},separator(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||t.symbols.line.repeat(5),e},spacer(t,e){return e}};Qhe.exports=(t,e={})=>{let r=uft.merge({},khe,e.roles);return r[t]||r.default}});var c2=_((o8t,Nhe)=>{"use strict";var Aft=Vc(),fft=hC(),pft=Fhe(),lk=No(),{reorder:W_,scrollUp:hft,scrollDown:gft,isObject:The,swap:dft}=lk,V_=class extends fft{constructor(e){super(e),this.cursorHide(),this.maxSelected=e.maxSelected||1/0,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=""}async initialize(){typeof this.options.initial=="function"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:r,autofocus:o,suggest:a}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(n=>n.enabled=!1),typeof a!="function"&&this.selectable.length===0)throw new Error("At least one choice must be selectable");The(r)&&(r=Object.keys(r)),Array.isArray(r)?(o!=null&&(this.index=this.findIndex(o)),r.forEach(n=>this.enable(this.find(n))),await this.render()):(o!=null&&(r=o),typeof r=="string"&&(r=this.findIndex(r)),typeof r=="number"&&r>-1&&(this.index=Math.max(0,Math.min(r,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,r){this.state.loadingChoices=!0;let o=[],a=0,n=async(u,A)=>{typeof u=="function"&&(u=await u.call(this)),u instanceof Promise&&(u=await u);for(let p=0;p(this.state.loadingChoices=!1,u))}async toChoice(e,r,o){if(typeof e=="function"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e=="string"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let a=e.value;if(e=pft(e.role,this.options)(this,e),typeof e.disabled=="string"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint="(disabled)"),e.index!=null)return e;e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||"",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input="",e.index=r,e.cursor=0,lk.define(e,"parent",o),e.level=o?o.level+1:1,e.indent==null&&(e.indent=o?o.indent+" ":e.indent||""),e.path=o?o.path+"."+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),this.isDisabled(e)||(this.longest=Math.max(this.longest,Aft.unstyle(e.message).length));let u={...e};return e.reset=(A=u.input,p=u.value)=>{for(let h of Object.keys(u))e[h]=u[h];e.input=A,e.value=p},a==null&&typeof e.initial=="function"&&(e.input=await e.initial.call(this,this.state,e,r)),e}async onChoice(e,r){this.emit("choice",e,r,this),typeof e.onChoice=="function"&&await e.onChoice.call(this,this.state,e,r)}async addChoice(e,r,o){let a=await this.toChoice(e,r,o);return this.choices.push(a),this.index=this.choices.length-1,this.limit=this.choices.length,a}async newItem(e,r,o){let a={name:"New choice name?",editable:!0,newChoice:!0,...e},n=await this.addChoice(a,r,o);return n.updateChoice=()=>{delete n.newChoice,n.name=n.message=n.input,n.input="",n.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?" ".repeat(e.level-1):"":e.indent}dispatch(e,r){if(this.multiple&&this[r.name])return this[r.name]();this.alert()}focus(e,r){return typeof r!="boolean"&&(r=e.enabled),r&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=r&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelectedr.enabled);return this.choices.forEach(r=>r.enabled=!e),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(e=>e.enabled=!e.enabled),this.render())}g(e=this.focused){return this.choices.some(r=>!!r.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,r){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof r!="boolean"&&(r=!e.enabled),e.enabled=r,e.choices&&e.choices.forEach(a=>this.toggle(a,r));let o=e.parent;for(;o;){let a=o.choices.filter(n=>this.isDisabled(n));o.enabled=a.every(n=>n.enabled===!0),o=o.parent}return Rhe(this,this.choices),this.emit("toggle",e,this),e}enable(e){return this.selected.length>=this.maxSelected?this.alert():(e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e)}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let r=o=>{let a=Number(o);if(a>this.choices.length-1)return this.alert();let n=this.focused,u=this.choices.find(A=>a===A.index);if(!u.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(u)===-1){let A=W_(this.choices),p=A.indexOf(u);if(n.index>p){let h=A.slice(p,p+this.limit),E=A.filter(I=>!h.includes(I));this.choices=h.concat(E)}else{let h=p-this.limit+1;this.choices=A.slice(h).concat(A.slice(0,h))}}return this.index=this.choices.indexOf(u),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(o=>{let a=this.choices.length,n=this.num,u=(A=!1,p)=>{clearTimeout(this.numberTimeout),A&&(p=r(n)),this.num="",o(p)};if(n==="0"||n.length===1&&Number(n+"0")>a)return u(!0);if(Number(n)>a)return u(!1,this.alert());this.numberTimeout=setTimeout(()=>u(!0),this.delay)})}home(){return this.choices=W_(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,r=W_(this.choices);return this.choices=r.slice(e).concat(r.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){return this.visible.length<=1?this.alert():this.up()}next(){return this.visible.length<=1?this.alert():this.down()}right(){return this.cursor>=this.input.length?this.alert():(this.cursor++,this.render())}left(){return this.cursor<=0?this.alert():(this.cursor--,this.render())}up(){let e=this.choices.length,r=this.visible.length,o=this.index;return this.options.scroll===!1&&o===0?this.alert():e>r&&o===0?this.scrollUp():(this.index=(o-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,r=this.visible.length,o=this.index;return this.options.scroll===!1&&o===r-1?this.alert():e>r&&o===r-1?this.scrollDown():(this.index=(o+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=hft(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=gft(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){return this.visible.length<=1?this.alert():(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled()?this.up():this.render())}pageDown(){return this.visible.length>=this.choices.length?this.alert():(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled()?this.down():this.render())}swap(e){dft(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&["disabled","collapsed","hidden","completing","readonly"].some(o=>e[o]===!0)?!0:e&&e.role==="heading"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(r=>this.isEnabled(r));if(e.choices){let r=e.choices.filter(o=>!this.isDisabled(o));return e.enabled&&r.every(o=>this.isEnabled(o))}return e.enabled&&!this.isDisabled(e)}isChoice(e,r){return e.name===r||e.index===Number(r)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(r=>this.isChoice(e,r)):this.isChoice(e,this.initial)}map(e=[],r="value"){return[].concat(e||[]).reduce((o,a)=>(o[a]=this.find(a,r),o),{})}filter(e,r){let a=typeof e=="function"?e:(A,p)=>[A.name,p].includes(e),u=(this.options.multiple?this.state._choices:this.choices).filter(a);return r?u.map(A=>A[r]):u}find(e,r){if(The(e))return r?e[r]:e;let a=typeof e=="function"?e:(u,A)=>[u.name,A].includes(e),n=this.choices.find(a);if(n)return r?n[r]:n}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice)return e.input?(e.updateChoice(),this.render()):this.alert();if(this.choices.some(u=>u.newChoice))return this.alert();let{reorder:r,sort:o}=this.options,a=this.multiple===!0,n=this.selected;return n===void 0?this.alert():(Array.isArray(n)&&r!==!1&&o!==!0&&(n=lk.reorder(n)),this.value=a?n.map(u=>u.name):n.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let r of e)this.state._choices.some(o=>o.name===r.name)||this.state._choices.push(r);if(!this._initial&&this.options.initial){this._initial=!0;let r=this.initial;if(typeof r=="string"||typeof r=="number"){let o=this.find(r);o&&(this.initial=o.index,this.focus(o,!0))}}}get choices(){return Rhe(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:r,choices:o}=this,a=e.limit||this._limit||r.limit||o.length;return Math.min(a,this.height)}set value(e){super.value=e}get value(){return typeof super.value!="string"&&super.value===this.initial?this.input:super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];return e&&this.state.submitted&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function Rhe(t,e){if(e instanceof Promise)return e;if(typeof e=="function"){if(lk.isAsyncFn(e))return e;e=e.call(t,t)}for(let r of e){if(Array.isArray(r.choices)){let o=r.choices.filter(a=>!t.isDisabled(a));r.enabled=o.every(a=>a.enabled===!0)}t.isDisabled(r)===!0&&delete r.enabled}return e}Nhe.exports=V_});var Sh=_((a8t,Lhe)=>{"use strict";var mft=c2(),K_=No(),J_=class extends mft{constructor(e){super(e),this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(e,r){if(this.multiple)return this[r.name]?await this[r.name](e,r):await super.dispatch(e,r);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,r){return!this.multiple||this.options.pointer?super.pointer(e,r):""}indicator(e,r){return this.multiple?super.indicator(e,r):""}choiceMessage(e,r){let o=this.resolve(e.message,this.state,e,r);return e.role==="heading"&&!K_.hasColor(o)&&(o=this.styles.strong(o)),this.resolve(o,this.state,e,r)}choiceSeparator(){return":"}async renderChoice(e,r){await this.onChoice(e,r);let o=this.index===r,a=await this.pointer(e,r),n=await this.indicator(e,r)+(e.pad||""),u=await this.resolve(e.hint,this.state,e,r);u&&!K_.hasColor(u)&&(u=this.styles.muted(u));let A=this.indent(e),p=await this.choiceMessage(e,r),h=()=>[this.margin[3],A+a+n,p,this.margin[1],u].filter(Boolean).join(" ");return e.role==="heading"?h():e.disabled?(K_.hasColor(p)||(p=this.styles.disabled(p)),h()):(o&&(p=this.styles.em(p)),h())}async renderChoices(){if(this.state.loading==="choices")return this.styles.warning("Loading choices");if(this.state.submitted)return"";let e=this.visible.map(async(n,u)=>await this.renderChoice(n,u)),r=await Promise.all(e);r.length||r.push(this.styles.danger("No matching choices"));let o=this.margin[0]+r.join(` +`),a;return this.options.choicesHeader&&(a=await this.resolve(this.options.choicesHeader,this.state)),[a,o].filter(Boolean).join(` +`)}format(){return!this.state.submitted||this.state.cancelled?"":Array.isArray(this.selected)?this.selected.map(e=>this.styles.primary(e.name)).join(", "):this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:r}=this.state,o="",a=await this.header(),n=await this.prefix(),u=await this.separator(),A=await this.message();this.options.promptLine!==!1&&(o=[n,A,u,""].join(" "),this.state.prompt=o);let p=await this.format(),h=await this.error()||await this.hint(),E=await this.renderChoices(),I=await this.footer();p&&(o+=p),h&&!o.includes(h)&&(o+=" "+h),e&&!p&&!E.trim()&&this.multiple&&this.emptyError!=null&&(o+=this.styles.danger(this.emptyError)),this.clear(r),this.write([a,o,E,I].filter(Boolean).join(` +`)),this.write(this.margin[2]),this.restore()}};Lhe.exports=J_});var Ohe=_((l8t,Mhe)=>{"use strict";var yft=Sh(),Eft=(t,e)=>{let r=t.toLowerCase();return o=>{let n=o.toLowerCase().indexOf(r),u=e(o.slice(n,n+r.length));return n>=0?o.slice(0,n)+u+o.slice(n+r.length):o}},z_=class extends yft{constructor(e){super(e),this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:r,input:o}=this.state;return this.input=o.slice(0,r)+e+o.slice(r),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:r}=this.state;return r?(this.input=r.slice(0,e-1)+r.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:r}=this.state;return r[e]===void 0?this.alert():(this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.complete())}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,r=this.state._choices){if(typeof this.options.suggest=="function")return this.options.suggest.call(this,e,r);let o=e.toLowerCase();return r.filter(a=>a.message.toLowerCase().includes(o))}pointer(){return""}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(e=>this.styles.primary(e.message)).join(", ");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!=="pending")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,r=Eft(this.input,e),o=this.choices;this.choices=o.map(a=>({...a,message:r(a.message)})),await super.render(),this.choices=o}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};Mhe.exports=z_});var Z_=_((c8t,Uhe)=>{"use strict";var X_=No();Uhe.exports=(t,e={})=>{t.cursorHide();let{input:r="",initial:o="",pos:a,showCursor:n=!0,color:u}=e,A=u||t.styles.placeholder,p=X_.inverse(t.styles.primary),h=T=>p(t.styles.black(T)),E=r,I=" ",v=h(I);if(t.blink&&t.blink.off===!0&&(h=T=>T,v=""),n&&a===0&&o===""&&r==="")return h(I);if(n&&a===0&&(r===o||r===""))return h(o[0])+A(o.slice(1));o=X_.isPrimitive(o)?`${o}`:"",r=X_.isPrimitive(r)?`${r}`:"";let b=o&&o.startsWith(r)&&o!==r,C=b?h(o[r.length]):v;if(a!==r.length&&n===!0&&(E=r.slice(0,a)+h(r[a])+r.slice(a+1),C=""),n===!1&&(C=""),b){let T=t.styles.unstyle(E+C);return E+C+A(o.slice(T.length))}return E+C}});var ck=_((u8t,_he)=>{"use strict";var Cft=Vc(),wft=Sh(),Ift=Z_(),$_=class extends wft{constructor(e){super({...e,multiple:!0}),this.type="form",this.initial=this.options.initial,this.align=[this.options.align,"right"].find(r=>r!=null),this.emptyError="",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(r=>r.reset&&r.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let r=this.focused;if(!r)return this.alert();let{cursor:o,input:a}=r;return r.value=r.input=a.slice(0,o)+e+a.slice(o),r.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:r,input:o}=e;return e.value=e.input=o.slice(0,r-1)+o.slice(r),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:r,input:o}=e;if(o[r]===void 0)return this.alert();let a=`${o}`.slice(0,r)+`${o}`.slice(r+1);return e.value=e.input=a,this.render()}right(){let e=this.focused;return e?e.cursor>=e.input.length?this.alert():(e.cursor++,this.render()):this.alert()}left(){let e=this.focused;return e?e.cursor<=0?this.alert():(e.cursor--,this.render()):this.alert()}space(e,r){return this.dispatch(e,r)}number(e,r){return this.dispatch(e,r)}next(){let e=this.focused;if(!e)return this.alert();let{initial:r,input:o}=e;return r&&r.startsWith(o)&&o!==r?(e.value=e.input=r,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?super.prev():(e.value=e.input="",e.cursor=0,this.render()):this.alert()}separator(){return""}format(e){return this.state.submitted?"":super.format(e)}pointer(){return""}indicator(e){return e.input?"\u29BF":"\u2299"}async choiceSeparator(e,r){let o=await this.resolve(e.separator,this.state,e,r)||":";return o?" "+this.styles.disabled(o):""}async renderChoice(e,r){await this.onChoice(e,r);let{state:o,styles:a}=this,{cursor:n,initial:u="",name:A,hint:p,input:h=""}=e,{muted:E,submitted:I,primary:v,danger:b}=a,C=p,T=this.index===r,L=e.validate||(()=>!0),U=await this.choiceSeparator(e,r),J=e.message;this.align==="right"&&(J=J.padStart(this.longest+1," ")),this.align==="left"&&(J=J.padEnd(this.longest+1," "));let te=this.values[A]=h||u,le=h?"success":"dark";await L.call(e,te,this.state)!==!0&&(le="danger");let pe=a[le],Ae=pe(await this.indicator(e,r))+(e.pad||""),ye=this.indent(e),ae=()=>[ye,Ae,J+U,h,C].filter(Boolean).join(" ");if(o.submitted)return J=Cft.unstyle(J),h=I(h),C="",ae();if(e.format)h=await e.format.call(this,h,e,r);else{let we=this.styles.muted;h=Ift(this,{input:h,initial:u,pos:n,showCursor:T,color:we})}return this.isValue(h)||(h=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[A]=await e.result.call(this,te,e,r)),T&&(J=v(J)),e.error?h+=(h?" ":"")+b(e.error.trim()):e.hint&&(h+=(h?" ":"")+E(e.hint.trim())),ae()}async submit(){return this.value=this.values,super.base.submit.call(this)}};_he.exports=$_});var e8=_((A8t,jhe)=>{"use strict";var Bft=ck(),vft=()=>{throw new Error("expected prompt to have a custom authenticate method")},Hhe=(t=vft)=>{class e extends Bft{constructor(o){super(o)}async submit(){this.value=await t.call(this,this.values,this.state),super.base.submit.call(this)}static create(o){return Hhe(o)}}return e};jhe.exports=Hhe()});var Yhe=_((f8t,Ghe)=>{"use strict";var Dft=e8();function Pft(t,e){return t.username===this.options.username&&t.password===this.options.password}var qhe=(t=Pft)=>{let e=[{name:"username",message:"username"},{name:"password",message:"password",format(o){return this.options.showPassword?o:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(o.length))}}];class r extends Dft.create(t){constructor(a){super({...a,choices:e})}static create(a){return qhe(a)}}return r};Ghe.exports=qhe()});var uk=_((p8t,Whe)=>{"use strict";var Sft=hC(),{isPrimitive:xft,hasColor:bft}=No(),t8=class extends Sft{constructor(e){super(e),this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){return this.isValue(e)?(this.input=e,this.submit()):this.alert()}format(e){let{styles:r,state:o}=this;return o.submitted?r.success(e):r.primary(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return xft(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status==="pending"){let e=await this.element("hint");return bft(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:r}=this.state,o=await this.prefix(),a=await this.separator(),n=await this.message(),u=this.styles.muted(this.default),A=[o,n,u,a].filter(Boolean).join(" ");this.state.prompt=A;let p=await this.header(),h=this.value=this.cast(e),E=await this.format(h),I=await this.error()||await this.hint(),v=await this.footer();I&&!A.includes(I)&&(E+=" "+I),A+=" "+E,this.clear(r),this.write([p,A,v].filter(Boolean).join(` +`)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};Whe.exports=t8});var Khe=_((h8t,Vhe)=>{"use strict";var kft=uk(),r8=class extends kft{constructor(e){super(e),this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}};Vhe.exports=r8});var zhe=_((g8t,Jhe)=>{"use strict";var Qft=Sh(),Fft=ck(),gC=Fft.prototype,n8=class extends Qft{constructor(e){super({...e,multiple:!0}),this.align=[this.options.align,"left"].find(r=>r!=null),this.emptyError="",this.values={}}dispatch(e,r){let o=this.focused,a=o.parent||{};return!o.editable&&!a.editable&&(e==="a"||e==="i")?super[e]():gC.dispatch.call(this,e,r)}append(e,r){return gC.append.call(this,e,r)}delete(e,r){return gC.delete.call(this,e,r)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?gC.next.call(this):super.next()}prev(){return this.focused.editable?gC.prev.call(this):super.prev()}async indicator(e,r){let o=e.indicator||"",a=e.editable?o:super.indicator(e,r);return await this.resolve(a,this.state,e,r)||""}indent(e){return e.role==="heading"?"":e.editable?" ":" "}async renderChoice(e,r){return e.indent="",e.editable?gC.renderChoice.call(this,e,r):super.renderChoice(e,r)}error(){return""}footer(){return this.state.error}async validate(){let e=!0;for(let r of this.choices){if(typeof r.validate!="function"||r.role==="heading")continue;let o=r.parent?this.value[r.parent.name]:this.value;if(r.editable?o=r.value===r.name?r.initial||"":r.value:this.isDisabled(r)||(o=r.enabled===!0),e=await r.validate(o,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e=="string"?e:"Invalid Input"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let r=e.parent?this.value[e.parent.name]:this.value;if(e.role==="heading"){this.value[e.name]={};continue}e.editable?r[e.name]=e.value===e.name?e.initial||"":e.value:this.isDisabled(e)||(r[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};Jhe.exports=n8});var Yd=_((d8t,Xhe)=>{"use strict";var Tft=hC(),Rft=Z_(),{isPrimitive:Nft}=No(),i8=class extends Tft{constructor(e){super(e),this.initial=Nft(this.initial)?String(this.initial):"",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,r={}){let o=this.state.prevKeypress;return this.state.prevKeypress=r,this.options.multiline===!0&&r.name==="return"&&(!o||o.name!=="return")?this.append(` +`,r):super.keypress(e,r)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(e,r){if(!e||r.ctrl||r.code)return this.alert();this.append(e)}append(e){let{cursor:r,input:o}=this.state;this.input=`${o}`.slice(0,r)+e+`${o}`.slice(r),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:r}=this.state;if(e<=0)return this.alert();this.input=`${r}`.slice(0,e-1)+`${r}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:r}=this.state;if(r[e]===void 0)return this.alert();this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let r=this.input.slice(0,e),o=this.input.slice(e),a=r.split(" ");this.state.clipboard.push(a.pop()),this.input=a.join(" "),this.cursor=this.input.length,this.input+=o,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){this.state.prevCursor?(this.cursor=this.state.prevCursor,this.state.prevCursor=0):(this.state.prevCursor=this.cursor,this.cursor=0),this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):"";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){return this.cursor>=this.input.length?this.alert():(this.moveCursor(1),this.render())}left(){return this.cursor<=0?this.alert():(this.moveCursor(-1),this.render())}isValue(e){return!!e}async format(e=this.value){let r=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||r):Rft(this,{input:e,initial:r,pos:this.cursor})}async render(){let e=this.state.size,r=await this.prefix(),o=await this.separator(),a=await this.message(),n=[r,a,o].filter(Boolean).join(" ");this.state.prompt=n;let u=await this.header(),A=await this.format(),p=await this.error()||await this.hint(),h=await this.footer();p&&!A.includes(p)&&(A+=" "+p),n+=" "+A,this.clear(e),this.write([u,n,h].filter(Boolean).join(` +`)),this.restore()}};Xhe.exports=i8});var $he=_((m8t,Zhe)=>{"use strict";var Lft=t=>t.filter((e,r)=>t.lastIndexOf(e)===r),Ak=t=>Lft(t).filter(Boolean);Zhe.exports=(t,e={},r="")=>{let{past:o=[],present:a=""}=e,n,u;switch(t){case"prev":case"undo":return n=o.slice(0,o.length-1),u=o[o.length-1]||"",{past:Ak([r,...n]),present:u};case"next":case"redo":return n=o.slice(1),u=o[0]||"",{past:Ak([...n,r]),present:u};case"save":return{past:Ak([...o,r]),present:""};case"remove":return u=Ak(o.filter(A=>A!==r)),a="",u.length&&(a=u.pop()),{past:u,present:a};default:throw new Error(`Invalid action: "${t}"`)}}});var o8=_((y8t,t0e)=>{"use strict";var Mft=Yd(),e0e=$he(),s8=class extends Mft{constructor(e){super(e);let r=this.options.history;if(r&&r.store){let o=r.values||this.initial;this.autosave=!!r.autosave,this.store=r.store,this.data=this.store.get("values")||{past:[],present:o},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=e0e(e,this.data,this.input),this.data.present?(this.input=this.data.present,this.cursor=this.input.length,this.render()):this.alert()):this.alert()}altUp(){return this.completion("prev")}altDown(){return this.completion("next")}prev(){return this.save(),super.prev()}save(){!this.store||(this.data=e0e("save",this.data,this.input),this.store.set("values",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};t0e.exports=s8});var n0e=_((E8t,r0e)=>{"use strict";var Oft=Yd(),a8=class extends Oft{format(){return""}};r0e.exports=a8});var s0e=_((C8t,i0e)=>{"use strict";var Uft=Yd(),l8=class extends Uft{constructor(e={}){super(e),this.sep=this.options.separator||/, */,this.initial=e.initial||""}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:r=>r;return this.list.map(e).join(", ")}async submit(e){let r=this.state.error||await this.validate(this.list,this.state);return r!==!0?(this.state.error=r,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};i0e.exports=l8});var a0e=_((w8t,o0e)=>{"use strict";var _ft=Sh(),c8=class extends _ft{constructor(e){super({...e,multiple:!0})}};o0e.exports=c8});var A8=_((I8t,l0e)=>{"use strict";var Hft=Yd(),u8=class extends Hft{constructor(e={}){super({style:"number",...e}),this.min=this.isValue(e.min)?this.toNumber(e.min):-1/0,this.max=this.isValue(e.max)?this.toNumber(e.max):1/0,this.delay=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:"",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){return!/[-+.]/.test(e)||e==="."&&this.input.includes(".")?this.alert("invalid number"):super.append(e)}number(e){return super.append(e)}next(){return this.input&&this.input!==this.initial?this.alert():this.isValue(this.initial)?(this.input=this.initial,this.cursor=String(this.initial).length,this.render()):this.alert()}up(e){let r=e||this.minor,o=this.toNumber(this.input);return o>this.max+r?this.alert():(this.input=`${o+r}`,this.render())}down(e){let r=e||this.minor,o=this.toNumber(this.input);return othis.isValue(r));return this.value=this.toNumber(e||0),super.submit()}};l0e.exports=u8});var u0e=_((B8t,c0e)=>{c0e.exports=A8()});var f0e=_((v8t,A0e)=>{"use strict";var jft=Yd(),f8=class extends jft{constructor(e){super(e),this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):""}};A0e.exports=f8});var g0e=_((D8t,h0e)=>{"use strict";var qft=Vc(),Gft=c2(),p0e=No(),p8=class extends Gft{constructor(e={}){super(e),this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||"left"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||` + `;let r=e.startNumber||1;typeof this.scale=="number"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((o,a)=>({name:a+r})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let r of this.choices){e=Math.max(e,r.message.length),r.scaleIndex=r.initial||2,r.scale=[];for(let o=0;o=this.scale.length-1?this.alert():(e.scaleIndex++,this.render())}left(){let e=this.focused;return e.scaleIndex<=0?this.alert():(e.scaleIndex--,this.render())}indent(){return""}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.index)).join(", "):""}pointer(){return""}renderScaleKey(){return this.scaleKey===!1||this.state.submitted?"":["",...this.scale.map(o=>` ${o.name} - ${o.message}`)].map(o=>this.styles.muted(o)).join(` +`)}renderScaleHeading(e){let r=this.scale.map(p=>p.name);typeof this.options.renderScaleHeading=="function"&&(r=this.options.renderScaleHeading.call(this,e));let o=this.scaleLength-r.join("").length,a=Math.round(o/(r.length-1)),u=r.map(p=>this.styles.strong(p)).join(" ".repeat(a)),A=" ".repeat(this.widths[0]);return this.margin[3]+A+this.margin[1]+u}scaleIndicator(e,r,o){if(typeof this.options.scaleIndicator=="function")return this.options.scaleIndicator.call(this,e,r,o);let a=e.scaleIndex===r.index;return r.disabled?this.styles.hint(this.symbols.radio.disabled):a?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,r){let o=e.scale.map(n=>this.scaleIndicator(e,n,r)),a=this.term==="Hyper"?"":" ";return o.join(a+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,r){await this.onChoice(e,r);let o=this.index===r,a=await this.pointer(e,r),n=await e.hint;n&&!p0e.hasColor(n)&&(n=this.styles.muted(n));let u=C=>this.margin[3]+C.replace(/\s+$/,"").padEnd(this.widths[0]," "),A=this.newline,p=this.indent(e),h=await this.resolve(e.message,this.state,e,r),E=await this.renderScale(e,r),I=this.margin[1]+this.margin[3];this.scaleLength=qft.unstyle(E).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-I.length);let b=p0e.wordWrap(h,{width:this.widths[0],newline:A}).split(` +`).map(C=>u(C)+this.margin[1]);return o&&(E=this.styles.info(E),b=b.map(C=>this.styles.info(C))),b[0]+=E,this.linebreak&&b.push(""),[p+a,b.join(` +`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let e=this.visible.map(async(a,n)=>await this.renderChoice(a,n)),r=await Promise.all(e),o=await this.renderScaleHeading();return this.margin[0]+[o,...r.map(a=>a.join(" "))].join(` +`)}async render(){let{submitted:e,size:r}=this.state,o=await this.prefix(),a=await this.separator(),n=await this.message(),u="";this.options.promptLine!==!1&&(u=[o,n,a,""].join(" "),this.state.prompt=u);let A=await this.header(),p=await this.format(),h=await this.renderScaleKey(),E=await this.error()||await this.hint(),I=await this.renderChoices(),v=await this.footer(),b=this.emptyError;p&&(u+=p),E&&!u.includes(E)&&(u+=" "+E),e&&!p&&!I.trim()&&this.multiple&&b!=null&&(u+=this.styles.danger(b)),this.clear(r),this.write([A,u,h,I,v].filter(Boolean).join(` +`)),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}};h0e.exports=p8});var y0e=_((P8t,m0e)=>{"use strict";var d0e=Vc(),Yft=(t="")=>typeof t=="string"?t.replace(/^['"]|['"]$/g,""):"",g8=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=Yft(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}},Wft=async(t={},e={},r=o=>o)=>{let o=new Set,a=t.fields||[],n=t.template,u=[],A=[],p=[],h=1;typeof n=="function"&&(n=await n());let E=-1,I=()=>n[++E],v=()=>n[E+1],b=C=>{C.line=h,u.push(C)};for(b({type:"bos",value:""});Ele.name===U.key);U.field=a.find(le=>le.name===U.key),te||(te=new g8(U),A.push(te)),te.lines.push(U.line-1);continue}let T=u[u.length-1];T.type==="text"&&T.line===h?T.value+=C:b({type:"text",value:C})}return b({type:"eos",value:""}),{input:n,tabstops:u,unique:o,keys:p,items:A}};m0e.exports=async t=>{let e=t.options,r=new Set(e.required===!0?[]:e.required||[]),o={...e.values,...e.initial},{tabstops:a,items:n,keys:u}=await Wft(e,o),A=h8("result",t,e),p=h8("format",t,e),h=h8("validate",t,e,!0),E=t.isValue.bind(t);return async(I={},v=!1)=>{let b=0;I.required=r,I.items=n,I.keys=u,I.output="";let C=async(J,te,le,pe)=>{let Ae=await h(J,te,le,pe);return Ae===!1?"Invalid field "+le.name:Ae};for(let J of a){let te=J.value,le=J.key;if(J.type!=="template"){te&&(I.output+=te);continue}if(J.type==="template"){let pe=n.find(Pe=>Pe.name===le);e.required===!0&&I.required.add(pe.name);let Ae=[pe.input,I.values[pe.value],pe.value,te].find(E),ae=(pe.field||{}).message||J.inner;if(v){let Pe=await C(I.values[le],I,pe,b);if(Pe&&typeof Pe=="string"||Pe===!1){I.invalid.set(le,Pe);continue}I.invalid.delete(le);let g=await A(I.values[le],I,pe,b);I.output+=d0e.unstyle(g);continue}pe.placeholder=!1;let we=te;te=await p(te,I,pe,b),Ae!==te?(I.values[le]=Ae,te=t.styles.typing(Ae),I.missing.delete(ae)):(I.values[le]=void 0,Ae=`<${ae}>`,te=t.styles.primary(Ae),pe.placeholder=!0,I.required.has(le)&&I.missing.add(ae)),I.missing.has(ae)&&I.validating&&(te=t.styles.warning(Ae)),I.invalid.has(le)&&I.validating&&(te=t.styles.danger(Ae)),b===I.index&&(we!==te?te=t.styles.underline(te):te=t.styles.heading(d0e.unstyle(te))),b++}te&&(I.output+=te)}let T=I.output.split(` +`).map(J=>" "+J),L=n.length,U=0;for(let J of n)I.invalid.has(J.name)&&J.lines.forEach(te=>{T[te][0]===" "&&(T[te]=I.styles.danger(I.symbols.bullet)+T[te].slice(1))}),t.isValue(I.values[J.name])&&U++;return I.completed=(U/L*100).toFixed(0),I.output=T.join(` +`),I.output}};function h8(t,e,r,o){return(a,n,u,A)=>typeof u.field[t]=="function"?u.field[t].call(e,a,n,u,A):[o,a].find(p=>e.isValue(p))}});var C0e=_((S8t,E0e)=>{"use strict";var Vft=Vc(),Kft=y0e(),Jft=hC(),d8=class extends Jft{constructor(e){super(e),this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await Kft(this),await super.initialize()}async reset(e){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let r=this.getItem();this.cursor+=e,r.cursor+=e}dispatch(e,r){if(!r.code&&!r.ctrl&&e!=null&&this.getItem()){this.append(e,r);return}this.alert()}append(e,r){let o=this.getItem(),a=o.input.slice(0,this.cursor),n=o.input.slice(this.cursor);this.input=o.input=`${a}${e}${n}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let r=e.input.slice(this.cursor),o=e.input.slice(0,this.cursor-1);this.input=e.input=`${o}${r}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let r=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(r=this.styles.danger),r(`${this.state.completed}% completed`)}async render(){let{index:e,keys:r=[],submitted:o,size:a}=this.state,n=[this.options.newline,` +`].find(J=>J!=null),u=await this.prefix(),A=await this.separator(),p=await this.message(),h=[u,p,A].filter(Boolean).join(" ");this.state.prompt=h;let E=await this.header(),I=await this.error()||"",v=await this.hint()||"",b=o?"":await this.interpolate(this.state),C=this.state.key=r[e]||"",T=await this.format(C),L=await this.footer();T&&(h+=" "+T),v&&!T&&this.state.completed===0&&(h+=" "+v),this.clear(a);let U=[E,h,b,L,I.trim()];this.write(U.filter(Boolean).join(n)),this.restore()}getItem(e){let{items:r,keys:o,index:a}=this.state,n=r.find(u=>u.name===o[a]);return n&&n.input!=null&&(this.input=n.input,this.cursor=n.cursor),n}async submit(){typeof this.interpolate!="function"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:r,output:o,values:a}=this.state;if(e.size){let A="";for(let[p,h]of e)A+=`Invalid ${p}: ${h} +`;return this.state.error=A,super.submit()}if(r.size)return this.state.error="Required: "+[...r.keys()].join(", "),super.submit();let u=Vft.unstyle(o).split(` +`).map(A=>A.slice(1)).join(` +`);return this.value={values:a,result:u},super.submit()}};E0e.exports=d8});var I0e=_((x8t,w0e)=>{"use strict";var zft="(Use + to sort)",Xft=Sh(),m8=class extends Xft{constructor(e){super({...e,reorder:!1,sort:!0,multiple:!0}),this.state.hint=[this.options.hint,zft].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(e,r){let o=await super.renderChoice(e,r),a=this.symbols.identicalTo+" ",n=this.index===r&&this.sorting?this.styles.muted(a):" ";return this.options.drag===!1&&(n=""),this.options.numbered===!0?n+`${r+1} - `+o:n+o}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};w0e.exports=m8});var v0e=_((b8t,B0e)=>{"use strict";var Zft=c2(),y8=class extends Zft{constructor(e={}){if(super(e),this.emptyError=e.emptyError||"No items were selected",this.term=process.env.TERM_PROGRAM,!this.options.header){let r=["","4 - Strongly Agree","3 - Agree","2 - Neutral","1 - Disagree","0 - Strongly Disagree",""];r=r.map(o=>this.styles.muted(o)),this.state.header=r.join(` + `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let r=await super.toChoices(...e);for(let o of r)o.scale=$ft(5,this.options),o.scaleIdx=2;return r}dispatch(){this.alert()}space(){let e=this.focused,r=e.scale[e.scaleIdx],o=r.selected;return e.scale.forEach(a=>a.selected=!1),r.selected=!o,this.render()}indicator(){return""}pointer(){return""}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIdx>=e.scale.length-1?this.alert():(e.scaleIdx++,this.render())}left(){let e=this.focused;return e.scaleIdx<=0?this.alert():(e.scaleIdx--,this.render())}indent(){return" "}async renderChoice(e,r){await this.onChoice(e,r);let o=this.index===r,a=this.term==="Hyper",n=a?9:8,u=a?"":" ",A=this.symbols.line.repeat(n),p=" ".repeat(n+(a?0:1)),h=te=>(te?this.styles.success("\u25C9"):"\u25EF")+u,E=r+1+".",I=o?this.styles.heading:this.styles.noop,v=await this.resolve(e.message,this.state,e,r),b=this.indent(e),C=b+e.scale.map((te,le)=>h(le===e.scaleIdx)).join(A),T=te=>te===e.scaleIdx?I(te):te,L=b+e.scale.map((te,le)=>T(le)).join(p),U=()=>[E,v].filter(Boolean).join(" "),J=()=>[U(),C,L," "].filter(Boolean).join(` +`);return o&&(C=this.styles.cyan(C),L=this.styles.cyan(L)),J()}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(o,a)=>await this.renderChoice(o,a)),r=await Promise.all(e);return r.length||r.push(this.styles.danger("No matching choices")),r.join(` +`)}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.scaleIdx)).join(", "):""}async render(){let{submitted:e,size:r}=this.state,o=await this.prefix(),a=await this.separator(),n=await this.message(),u=[o,n,a].filter(Boolean).join(" ");this.state.prompt=u;let A=await this.header(),p=await this.format(),h=await this.error()||await this.hint(),E=await this.renderChoices(),I=await this.footer();(p||!h)&&(u+=" "+p),h&&!u.includes(h)&&(u+=" "+h),e&&!p&&!E&&this.multiple&&this.type!=="form"&&(u+=this.styles.danger(this.emptyError)),this.clear(r),this.write([u,A,E,I].filter(Boolean).join(` +`)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function $ft(t,e={}){if(Array.isArray(e.scale))return e.scale.map(o=>({...o}));let r=[];for(let o=1;o{D0e.exports=o8()});var x0e=_((Q8t,S0e)=>{"use strict";var ept=uk(),E8=class extends ept{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||"no",this.enabled=this.options.enabled||"yes",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e="",r){switch(e.toLowerCase()){case" ":return this.toggle();case"1":case"y":case"t":return this.enable();case"0":case"n":case"f":return this.disable();default:return this.alert()}}format(){let e=o=>this.styles.primary.underline(o);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(" / "))}async render(){let{size:e}=this.state,r=await this.header(),o=await this.prefix(),a=await this.separator(),n=await this.message(),u=await this.format(),A=await this.error()||await this.hint(),p=await this.footer(),h=[o,n,a,u].join(" ");this.state.prompt=h,A&&!h.includes(A)&&(h+=" "+A),this.clear(e),this.write([r,h,p].filter(Boolean).join(` +`)),this.write(this.margin[2]),this.restore()}};S0e.exports=E8});var k0e=_((F8t,b0e)=>{"use strict";var tpt=Sh(),C8=class extends tpt{constructor(e){if(super(e),typeof this.options.correctChoice!="number"||this.options.correctChoice<0)throw new Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,r){let o=await super.toChoices(e,r);if(o.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>o.length)throw new Error("Please specify the index of the correct answer from the list of choices");return o}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};b0e.exports=C8});var F0e=_(w8=>{"use strict";var Q0e=No(),As=(t,e)=>{Q0e.defineExport(w8,t,e),Q0e.defineExport(w8,t.toLowerCase(),e)};As("AutoComplete",()=>Ohe());As("BasicAuth",()=>Yhe());As("Confirm",()=>Khe());As("Editable",()=>zhe());As("Form",()=>ck());As("Input",()=>o8());As("Invisible",()=>n0e());As("List",()=>s0e());As("MultiSelect",()=>a0e());As("Numeral",()=>u0e());As("Password",()=>f0e());As("Scale",()=>g0e());As("Select",()=>Sh());As("Snippet",()=>C0e());As("Sort",()=>I0e());As("Survey",()=>v0e());As("Text",()=>P0e());As("Toggle",()=>x0e());As("Quiz",()=>k0e())});var R0e=_((R8t,T0e)=>{T0e.exports={ArrayPrompt:c2(),AuthPrompt:e8(),BooleanPrompt:uk(),NumberPrompt:A8(),StringPrompt:Yd()}});var A2=_((N8t,L0e)=>{"use strict";var N0e=Be("assert"),B8=Be("events"),xh=No(),Jc=class extends B8{constructor(e,r){super(),this.options=xh.merge({},e),this.answers={...r}}register(e,r){if(xh.isObject(e)){for(let a of Object.keys(e))this.register(a,e[a]);return this}N0e.equal(typeof r,"function","expected a function");let o=e.toLowerCase();return r.prototype instanceof this.Prompt?this.prompts[o]=r:this.prompts[o]=r(this.Prompt,this),this}async prompt(e=[]){for(let r of[].concat(e))try{typeof r=="function"&&(r=await r.call(this)),await this.ask(xh.merge({},this.options,r))}catch(o){return Promise.reject(o)}return this.answers}async ask(e){typeof e=="function"&&(e=await e.call(this));let r=xh.merge({},this.options,e),{type:o,name:a}=e,{set:n,get:u}=xh;if(typeof o=="function"&&(o=await o.call(this,e,this.answers)),!o)return this.answers[a];N0e(this.prompts[o],`Prompt "${o}" is not registered`);let A=new this.prompts[o](r),p=u(this.answers,a);A.state.answers=this.answers,A.enquirer=this,a&&A.on("submit",E=>{this.emit("answer",a,E,A),n(this.answers,a,E)});let h=A.emit.bind(A);return A.emit=(...E)=>(this.emit.call(this,...E),h(...E)),this.emit("prompt",A,this),r.autofill&&p!=null?(A.value=A.input=p,r.autofill==="show"&&await A.submit()):p=A.value=await A.run(),p}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||hC()}static get prompts(){return F0e()}static get types(){return R0e()}static get prompt(){let e=(r,...o)=>{let a=new this(...o),n=a.emit.bind(a);return a.emit=(...u)=>(e.emit(...u),n(...u)),a.prompt(r)};return xh.mixinEmitter(e,new B8),e}};xh.mixinEmitter(Jc,new B8);var I8=Jc.prompts;for(let t of Object.keys(I8)){let e=t.toLowerCase(),r=o=>new I8[t](o).run();Jc.prompt[e]=r,Jc[e]=r,Jc[t]||Reflect.defineProperty(Jc,t,{get:()=>I8[t]})}var u2=t=>{xh.defineExport(Jc,t,()=>Jc.types[t])};u2("ArrayPrompt");u2("AuthPrompt");u2("BooleanPrompt");u2("NumberPrompt");u2("StringPrompt");L0e.exports=Jc});var g2=_((mHt,q0e)=>{var apt=Zb();function lpt(t,e,r){var o=t==null?void 0:apt(t,e);return o===void 0?r:o}q0e.exports=lpt});var W0e=_((BHt,Y0e)=>{function cpt(t,e){for(var r=-1,o=t==null?0:t.length;++r{var upt=gd(),Apt=zP();function fpt(t,e){return t&&upt(e,Apt(e),t)}V0e.exports=fpt});var z0e=_((DHt,J0e)=>{var ppt=gd(),hpt=qy();function gpt(t,e){return t&&ppt(e,hpt(e),t)}J0e.exports=gpt});var Z0e=_((PHt,X0e)=>{var dpt=gd(),mpt=GP();function ypt(t,e){return dpt(t,mpt(t),e)}X0e.exports=ypt});var b8=_((SHt,$0e)=>{var Ept=qP(),Cpt=tS(),wpt=GP(),Ipt=KN(),Bpt=Object.getOwnPropertySymbols,vpt=Bpt?function(t){for(var e=[];t;)Ept(e,wpt(t)),t=Cpt(t);return e}:Ipt;$0e.exports=vpt});var tge=_((xHt,ege)=>{var Dpt=gd(),Ppt=b8();function Spt(t,e){return Dpt(t,Ppt(t),e)}ege.exports=Spt});var k8=_((bHt,rge)=>{var xpt=VN(),bpt=b8(),kpt=qy();function Qpt(t){return xpt(t,kpt,bpt)}rge.exports=Qpt});var ige=_((kHt,nge)=>{var Fpt=Object.prototype,Tpt=Fpt.hasOwnProperty;function Rpt(t){var e=t.length,r=new t.constructor(e);return e&&typeof t[0]=="string"&&Tpt.call(t,"index")&&(r.index=t.index,r.input=t.input),r}nge.exports=Rpt});var oge=_((QHt,sge)=>{var Npt=$P();function Lpt(t,e){var r=e?Npt(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}sge.exports=Lpt});var lge=_((FHt,age)=>{var Mpt=/\w*$/;function Opt(t){var e=new t.constructor(t.source,Mpt.exec(t));return e.lastIndex=t.lastIndex,e}age.exports=Opt});var pge=_((THt,fge)=>{var cge=fd(),uge=cge?cge.prototype:void 0,Age=uge?uge.valueOf:void 0;function Upt(t){return Age?Object(Age.call(t)):{}}fge.exports=Upt});var gge=_((RHt,hge)=>{var _pt=$P(),Hpt=oge(),jpt=lge(),qpt=pge(),Gpt=lL(),Ypt="[object Boolean]",Wpt="[object Date]",Vpt="[object Map]",Kpt="[object Number]",Jpt="[object RegExp]",zpt="[object Set]",Xpt="[object String]",Zpt="[object Symbol]",$pt="[object ArrayBuffer]",eht="[object DataView]",tht="[object Float32Array]",rht="[object Float64Array]",nht="[object Int8Array]",iht="[object Int16Array]",sht="[object Int32Array]",oht="[object Uint8Array]",aht="[object Uint8ClampedArray]",lht="[object Uint16Array]",cht="[object Uint32Array]";function uht(t,e,r){var o=t.constructor;switch(e){case $pt:return _pt(t);case Ypt:case Wpt:return new o(+t);case eht:return Hpt(t,r);case tht:case rht:case nht:case iht:case sht:case oht:case aht:case lht:case cht:return Gpt(t,r);case Vpt:return new o;case Kpt:case Xpt:return new o(t);case Jpt:return jpt(t);case zpt:return new o;case Zpt:return qpt(t)}}hge.exports=uht});var mge=_((NHt,dge)=>{var Aht=qI(),fht=Ju(),pht="[object Map]";function hht(t){return fht(t)&&Aht(t)==pht}dge.exports=hht});var wge=_((LHt,Cge)=>{var ght=mge(),dht=WP(),yge=VP(),Ege=yge&&yge.isMap,mht=Ege?dht(Ege):ght;Cge.exports=mht});var Bge=_((MHt,Ige)=>{var yht=qI(),Eht=Ju(),Cht="[object Set]";function wht(t){return Eht(t)&&yht(t)==Cht}Ige.exports=wht});var Sge=_((OHt,Pge)=>{var Iht=Bge(),Bht=WP(),vge=VP(),Dge=vge&&vge.isSet,vht=Dge?Bht(Dge):Iht;Pge.exports=vht});var Q8=_((UHt,Qge)=>{var Dht=HP(),Pht=W0e(),Sht=rS(),xht=K0e(),bht=z0e(),kht=aL(),Qht=eS(),Fht=Z0e(),Tht=tge(),Rht=ZN(),Nht=k8(),Lht=qI(),Mht=ige(),Oht=gge(),Uht=cL(),_ht=Hl(),Hht=OI(),jht=wge(),qht=il(),Ght=Sge(),Yht=zP(),Wht=qy(),Vht=1,Kht=2,Jht=4,xge="[object Arguments]",zht="[object Array]",Xht="[object Boolean]",Zht="[object Date]",$ht="[object Error]",bge="[object Function]",e0t="[object GeneratorFunction]",t0t="[object Map]",r0t="[object Number]",kge="[object Object]",n0t="[object RegExp]",i0t="[object Set]",s0t="[object String]",o0t="[object Symbol]",a0t="[object WeakMap]",l0t="[object ArrayBuffer]",c0t="[object DataView]",u0t="[object Float32Array]",A0t="[object Float64Array]",f0t="[object Int8Array]",p0t="[object Int16Array]",h0t="[object Int32Array]",g0t="[object Uint8Array]",d0t="[object Uint8ClampedArray]",m0t="[object Uint16Array]",y0t="[object Uint32Array]",ri={};ri[xge]=ri[zht]=ri[l0t]=ri[c0t]=ri[Xht]=ri[Zht]=ri[u0t]=ri[A0t]=ri[f0t]=ri[p0t]=ri[h0t]=ri[t0t]=ri[r0t]=ri[kge]=ri[n0t]=ri[i0t]=ri[s0t]=ri[o0t]=ri[g0t]=ri[d0t]=ri[m0t]=ri[y0t]=!0;ri[$ht]=ri[bge]=ri[a0t]=!1;function pk(t,e,r,o,a,n){var u,A=e&Vht,p=e&Kht,h=e&Jht;if(r&&(u=a?r(t,o,a,n):r(t)),u!==void 0)return u;if(!qht(t))return t;var E=_ht(t);if(E){if(u=Mht(t),!A)return Qht(t,u)}else{var I=Lht(t),v=I==bge||I==e0t;if(Hht(t))return kht(t,A);if(I==kge||I==xge||v&&!a){if(u=p||v?{}:Uht(t),!A)return p?Tht(t,bht(u,t)):Fht(t,xht(u,t))}else{if(!ri[I])return a?t:{};u=Oht(t,I,A)}}n||(n=new Dht);var b=n.get(t);if(b)return b;n.set(t,u),Ght(t)?t.forEach(function(L){u.add(pk(L,e,r,L,t,n))}):jht(t)&&t.forEach(function(L,U){u.set(U,pk(L,e,r,U,t,n))});var C=h?p?Nht:Rht:p?Wht:Yht,T=E?void 0:C(t);return Pht(T||t,function(L,U){T&&(U=L,L=t[U]),Sht(u,U,pk(L,e,r,U,t,n))}),u}Qge.exports=pk});var F8=_((_Ht,Fge)=>{var E0t=Q8(),C0t=1,w0t=4;function I0t(t){return E0t(t,C0t|w0t)}Fge.exports=I0t});var T8=_((HHt,Tge)=>{var B0t=v_();function v0t(t,e,r){return t==null?t:B0t(t,e,r)}Tge.exports=v0t});var Oge=_((VHt,Mge)=>{var D0t=Object.prototype,P0t=D0t.hasOwnProperty;function S0t(t,e){return t!=null&&P0t.call(t,e)}Mge.exports=S0t});var _ge=_((KHt,Uge)=>{var x0t=Oge(),b0t=D_();function k0t(t,e){return t!=null&&b0t(t,e,x0t)}Uge.exports=k0t});var jge=_((JHt,Hge)=>{function Q0t(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}Hge.exports=Q0t});var Gge=_((zHt,qge)=>{var F0t=Zb(),T0t=gU();function R0t(t,e){return e.length<2?t:F0t(t,T0t(e,0,-1))}qge.exports=R0t});var N8=_((XHt,Yge)=>{var N0t=jd(),L0t=jge(),M0t=Gge(),O0t=aC();function U0t(t,e){return e=N0t(e,t),t=M0t(t,e),t==null||delete t[O0t(L0t(e))]}Yge.exports=U0t});var L8=_((ZHt,Wge)=>{var _0t=N8();function H0t(t,e){return t==null?!0:_0t(t,e)}Wge.exports=H0t});var Xge=_((S6t,G0t)=>{G0t.exports={name:"@yarnpkg/cli",version:"4.0.2",license:"BSD-2-Clause",main:"./sources/index.ts",exports:{".":"./sources/index.ts","./polyfills":"./sources/polyfills.ts","./package.json":"./package.json"},dependencies:{"@yarnpkg/core":"workspace:^","@yarnpkg/fslib":"workspace:^","@yarnpkg/libzip":"workspace:^","@yarnpkg/parsers":"workspace:^","@yarnpkg/plugin-compat":"workspace:^","@yarnpkg/plugin-constraints":"workspace:^","@yarnpkg/plugin-dlx":"workspace:^","@yarnpkg/plugin-essentials":"workspace:^","@yarnpkg/plugin-exec":"workspace:^","@yarnpkg/plugin-file":"workspace:^","@yarnpkg/plugin-git":"workspace:^","@yarnpkg/plugin-github":"workspace:^","@yarnpkg/plugin-http":"workspace:^","@yarnpkg/plugin-init":"workspace:^","@yarnpkg/plugin-interactive-tools":"workspace:^","@yarnpkg/plugin-link":"workspace:^","@yarnpkg/plugin-nm":"workspace:^","@yarnpkg/plugin-npm":"workspace:^","@yarnpkg/plugin-npm-cli":"workspace:^","@yarnpkg/plugin-pack":"workspace:^","@yarnpkg/plugin-patch":"workspace:^","@yarnpkg/plugin-pnp":"workspace:^","@yarnpkg/plugin-pnpm":"workspace:^","@yarnpkg/plugin-stage":"workspace:^","@yarnpkg/plugin-typescript":"workspace:^","@yarnpkg/plugin-version":"workspace:^","@yarnpkg/plugin-workspace-tools":"workspace:^","@yarnpkg/shell":"workspace:^","ci-info":"^3.2.0",clipanion:"^4.0.0-rc.2",semver:"^7.1.2",tslib:"^2.4.0",typanion:"^3.14.0"},devDependencies:{"@types/semver":"^7.1.0","@yarnpkg/builder":"workspace:^","@yarnpkg/monorepo":"workspace:^","@yarnpkg/pnpify":"workspace:^"},peerDependencies:{"@yarnpkg/core":"workspace:^"},scripts:{postpack:"rm -rf lib",prepack:'run build:compile "$(pwd)"',"build:cli+hook":"run build:pnp:hook && builder build bundle","build:cli":"builder build bundle","run:cli":"builder run","update-local":"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/"},publishConfig:{main:"./lib/index.js",bin:null,exports:{".":"./lib/index.js","./package.json":"./package.json"}},files:["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{bundles:{standard:["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-constraints","@yarnpkg/plugin-dlx","@yarnpkg/plugin-exec","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools"]}},repository:{type:"git",url:"ssh://git@github.com/yarnpkg/berry.git",directory:"packages/yarnpkg-cli"},engines:{node:">=18.12.0"}}});var Y8=_((n5t,ude)=>{"use strict";ude.exports=function(e,r){r===!0&&(r=0);var o="";if(typeof e=="string")try{o=new URL(e).protocol}catch{}else e&&e.constructor===URL&&(o=e.protocol);var a=o.split(/\:|\+/).filter(Boolean);return typeof r=="number"?a[r]:a}});var fde=_((i5t,Ade)=>{"use strict";var cgt=Y8();function ugt(t){var e={protocols:[],protocol:null,port:null,resource:"",host:"",user:"",password:"",pathname:"",hash:"",search:"",href:t,query:{},parse_failed:!1};try{var r=new URL(t);e.protocols=cgt(r),e.protocol=e.protocols[0],e.port=r.port,e.resource=r.hostname,e.host=r.host,e.user=r.username||"",e.password=r.password||"",e.pathname=r.pathname,e.hash=r.hash.slice(1),e.search=r.search.slice(1),e.href=r.href,e.query=Object.fromEntries(r.searchParams)}catch{e.protocols=["file"],e.protocol=e.protocols[0],e.port="",e.resource="",e.user="",e.pathname="",e.hash="",e.search="",e.href=t,e.query={},e.parse_failed=!0}return e}Ade.exports=ugt});var gde=_((s5t,hde)=>{"use strict";var Agt=fde();function fgt(t){return t&&typeof t=="object"&&"default"in t?t:{default:t}}var pgt=fgt(Agt),hgt="text/plain",ggt="us-ascii",pde=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),dgt=(t,{stripHash:e})=>{let r=/^data:(?[^,]*?),(?[^#]*?)(?:#(?.*))?$/.exec(t);if(!r)throw new Error(`Invalid URL: ${t}`);let{type:o,data:a,hash:n}=r.groups,u=o.split(";");n=e?"":n;let A=!1;u[u.length-1]==="base64"&&(u.pop(),A=!0);let p=(u.shift()||"").toLowerCase(),E=[...u.map(I=>{let[v,b=""]=I.split("=").map(C=>C.trim());return v==="charset"&&(b=b.toLowerCase(),b===ggt)?"":`${v}${b?`=${b}`:""}`}).filter(Boolean)];return A&&E.push("base64"),(E.length>0||p&&p!==hgt)&&E.unshift(p),`data:${E.join(";")},${A?a.trim():a}${n?`#${n}`:""}`};function mgt(t,e){if(e={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripTextFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeSingleSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},t=t.trim(),/^data:/i.test(t))return dgt(t,e);if(/^view-source:/i.test(t))throw new Error("`view-source:` is not supported as it is a non-standard protocol");let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let a=new URL(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&a.protocol==="https:"&&(a.protocol="http:"),e.forceHttps&&a.protocol==="http:"&&(a.protocol="https:"),e.stripAuthentication&&(a.username="",a.password=""),e.stripHash?a.hash="":e.stripTextFragment&&(a.hash=a.hash.replace(/#?:~:text.*?$/i,"")),a.pathname){let u=/\b[a-z][a-z\d+\-.]{1,50}:\/\//g,A=0,p="";for(;;){let E=u.exec(a.pathname);if(!E)break;let I=E[0],v=E.index,b=a.pathname.slice(A,v);p+=b.replace(/\/{2,}/g,"/"),p+=I,A=v+I.length}let h=a.pathname.slice(A,a.pathname.length);p+=h.replace(/\/{2,}/g,"/"),a.pathname=p}if(a.pathname)try{a.pathname=decodeURI(a.pathname)}catch{}if(e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let u=a.pathname.split("/"),A=u[u.length-1];pde(A,e.removeDirectoryIndex)&&(u=u.slice(0,-1),a.pathname=u.slice(1).join("/")+"/")}if(a.hostname&&(a.hostname=a.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.(?!www\.)[a-z\-\d]{1,63}\.[a-z.\-\d]{2,63}$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let u of[...a.searchParams.keys()])pde(u,e.removeQueryParameters)&&a.searchParams.delete(u);if(e.removeQueryParameters===!0&&(a.search=""),e.sortQueryParameters){a.searchParams.sort();try{a.search=decodeURIComponent(a.search)}catch{}}e.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\/$/,""));let n=t;return t=a.toString(),!e.removeSingleSlash&&a.pathname==="/"&&!n.endsWith("/")&&a.hash===""&&(t=t.replace(/\/$/,"")),(e.removeTrailingSlash||a.pathname==="/")&&a.hash===""&&e.removeSingleSlash&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t}var W8=(t,e=!1)=>{let r=/^(?:([a-z_][a-z0-9_-]{0,31})@|https?:\/\/)([\w\.\-@]+)[\/:]([\~,\.\w,\-,\_,\/]+?(?:\.git|\/)?)$/,o=n=>{let u=new Error(n);throw u.subject_url=t,u};(typeof t!="string"||!t.trim())&&o("Invalid url."),t.length>W8.MAX_INPUT_LENGTH&&o("Input exceeds maximum length. If needed, change the value of parseUrl.MAX_INPUT_LENGTH."),e&&(typeof e!="object"&&(e={stripHash:!1}),t=mgt(t,e));let a=pgt.default(t);if(a.parse_failed){let n=a.href.match(r);n?(a.protocols=["ssh"],a.protocol="ssh",a.resource=n[2],a.host=n[2],a.user=n[1],a.pathname=`/${n[3]}`,a.parse_failed=!1):o("URL parsing failed.")}return a};W8.MAX_INPUT_LENGTH=2048;hde.exports=W8});var yde=_((o5t,mde)=>{"use strict";var ygt=Y8();function dde(t){if(Array.isArray(t))return t.indexOf("ssh")!==-1||t.indexOf("rsync")!==-1;if(typeof t!="string")return!1;var e=ygt(t);if(t=t.substring(t.indexOf("://")+3),dde(e))return!0;var r=new RegExp(".([a-zA-Z\\d]+):(\\d+)/");return!t.match(r)&&t.indexOf("@"){"use strict";var Egt=gde(),Ede=yde();function Cgt(t){var e=Egt(t);return e.token="",e.password==="x-oauth-basic"?e.token=e.user:e.user==="x-token-auth"&&(e.token=e.password),Ede(e.protocols)||e.protocols.length===0&&Ede(t)?e.protocol="ssh":e.protocols.length?e.protocol=e.protocols[0]:(e.protocol="file",e.protocols=["file"]),e.href=e.href.replace(/\/$/,""),e}Cde.exports=Cgt});var Bde=_((l5t,Ide)=>{"use strict";var wgt=wde();function V8(t){if(typeof t!="string")throw new Error("The url must be a string.");var e=/^([a-z\d-]{1,39})\/([-\.\w]{1,100})$/i;e.test(t)&&(t="https://github.com/"+t);var r=wgt(t),o=r.resource.split("."),a=null;switch(r.toString=function(L){return V8.stringify(this,L)},r.source=o.length>2?o.slice(1-o.length).join("."):r.source=r.resource,r.git_suffix=/\.git$/.test(r.pathname),r.name=decodeURIComponent((r.pathname||r.href).replace(/(^\/)|(\/$)/g,"").replace(/\.git$/,"")),r.owner=decodeURIComponent(r.user),r.source){case"git.cloudforge.com":r.owner=r.user,r.organization=o[0],r.source="cloudforge.com";break;case"visualstudio.com":if(r.resource==="vs-ssh.visualstudio.com"){a=r.name.split("/"),a.length===4&&(r.organization=a[1],r.owner=a[2],r.name=a[3],r.full_name=a[2]+"/"+a[3]);break}else{a=r.name.split("/"),a.length===2?(r.owner=a[1],r.name=a[1],r.full_name="_git/"+r.name):a.length===3?(r.name=a[2],a[0]==="DefaultCollection"?(r.owner=a[2],r.organization=a[0],r.full_name=r.organization+"/_git/"+r.name):(r.owner=a[0],r.full_name=r.owner+"/_git/"+r.name)):a.length===4&&(r.organization=a[0],r.owner=a[1],r.name=a[3],r.full_name=r.organization+"/"+r.owner+"/_git/"+r.name);break}case"dev.azure.com":case"azure.com":if(r.resource==="ssh.dev.azure.com"){a=r.name.split("/"),a.length===4&&(r.organization=a[1],r.owner=a[2],r.name=a[3]);break}else{a=r.name.split("/"),a.length===5?(r.organization=a[0],r.owner=a[1],r.name=a[4],r.full_name="_git/"+r.name):a.length===3?(r.name=a[2],a[0]==="DefaultCollection"?(r.owner=a[2],r.organization=a[0],r.full_name=r.organization+"/_git/"+r.name):(r.owner=a[0],r.full_name=r.owner+"/_git/"+r.name)):a.length===4&&(r.organization=a[0],r.owner=a[1],r.name=a[3],r.full_name=r.organization+"/"+r.owner+"/_git/"+r.name),r.query&&r.query.path&&(r.filepath=r.query.path.replace(/^\/+/g,"")),r.query&&r.query.version&&(r.ref=r.query.version.replace(/^GB/,""));break}default:a=r.name.split("/");var n=a.length-1;if(a.length>=2){var u=a.indexOf("-",2),A=a.indexOf("blob",2),p=a.indexOf("tree",2),h=a.indexOf("commit",2),E=a.indexOf("src",2),I=a.indexOf("raw",2),v=a.indexOf("edit",2);n=u>0?u-1:A>0?A-1:p>0?p-1:h>0?h-1:E>0?E-1:I>0?I-1:v>0?v-1:n,r.owner=a.slice(0,n).join("/"),r.name=a[n],h&&(r.commit=a[n+2])}r.ref="",r.filepathtype="",r.filepath="";var b=a.length>n&&a[n+1]==="-"?n+1:n;a.length>b+2&&["raw","src","blob","tree","edit"].indexOf(a[b+1])>=0&&(r.filepathtype=a[b+1],r.ref=a[b+2],a.length>b+3&&(r.filepath=a.slice(b+3).join("/"))),r.organization=r.owner;break}r.full_name||(r.full_name=r.owner,r.name&&(r.full_name&&(r.full_name+="/"),r.full_name+=r.name)),r.owner.startsWith("scm/")&&(r.source="bitbucket-server",r.owner=r.owner.replace("scm/",""),r.organization=r.owner,r.full_name=r.owner+"/"+r.name);var C=/(projects|users)\/(.*?)\/repos\/(.*?)((\/.*$)|$)/,T=C.exec(r.pathname);return T!=null&&(r.source="bitbucket-server",T[1]==="users"?r.owner="~"+T[2]:r.owner=T[2],r.organization=r.owner,r.name=T[3],a=T[4].split("/"),a.length>1&&(["raw","browse"].indexOf(a[1])>=0?(r.filepathtype=a[1],a.length>2&&(r.filepath=a.slice(2).join("/"))):a[1]==="commits"&&a.length>2&&(r.commit=a[2])),r.full_name=r.owner+"/"+r.name,r.query.at?r.ref=r.query.at:r.ref=""),r}V8.stringify=function(t,e){e=e||(t.protocols&&t.protocols.length?t.protocols.join("+"):t.protocol);var r=t.port?":"+t.port:"",o=t.user||"git",a=t.git_suffix?".git":"";switch(e){case"ssh":return r?"ssh://"+o+"@"+t.resource+r+"/"+t.full_name+a:o+"@"+t.resource+":"+t.full_name+a;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return e+"://"+o+"@"+t.resource+r+"/"+t.full_name+a;case"http":case"https":var n=t.token?Igt(t):t.user&&(t.protocols.includes("http")||t.protocols.includes("https"))?t.user+"@":"";return e+"://"+n+t.resource+r+"/"+Bgt(t)+a;default:return t.href}};function Igt(t){switch(t.source){case"bitbucket.org":return"x-token-auth:"+t.token+"@";default:return t.token+"@"}}function Bgt(t){switch(t.source){case"bitbucket-server":return"scm/"+t.full_name;default:return""+t.full_name}}Ide.exports=V8});var Ude=_((H9t,Ode)=>{var Rgt=jx(),Ngt=eS(),Lgt=Hl(),Mgt=fE(),Ogt=B_(),Ugt=aC(),_gt=R1();function Hgt(t){return Lgt(t)?Rgt(t,Ugt):Mgt(t)?[t]:Ngt(Ogt(_gt(t)))}Ode.exports=Hgt});function Ygt(t,e){return e===1&&Ggt.has(t[0])}function I2(t){let e=Array.isArray(t)?t:(0,jde.default)(t);return e.map((o,a)=>jgt.test(o)?`[${o}]`:qgt.test(o)&&!Ygt(e,a)?`.${o}`:`[${JSON.stringify(o)}]`).join("").replace(/^\./,"")}function Wgt(t,e){let r=[];if(e.methodName!==null&&r.push(de.pretty(t,e.methodName,de.Type.CODE)),e.file!==null){let o=[];o.push(de.pretty(t,e.file,de.Type.PATH)),e.line!==null&&(o.push(de.pretty(t,e.line,de.Type.NUMBER)),e.column!==null&&o.push(de.pretty(t,e.column,de.Type.NUMBER))),r.push(`(${o.join(de.pretty(t,":","grey"))})`)}return r.join(" ")}function mk(t,{manifestUpdates:e,reportedErrors:r},{fix:o}={}){let a=new Map,n=new Map,u=[...r.keys()].map(A=>[A,new Map]);for(let[A,p]of[...u,...e]){let h=r.get(A)?.map(b=>({text:b,fixable:!1}))??[],E=!1,I=t.getWorkspaceByCwd(A),v=I.manifest.exportTo({});for(let[b,C]of p){if(C.size>1){let T=[...C].map(([L,U])=>{let J=de.pretty(t.configuration,L,de.Type.INSPECT),te=U.size>0?Wgt(t.configuration,U.values().next().value):null;return te!==null?` +${J} at ${te}`:` +${J}`}).join("");h.push({text:`Conflict detected in constraint targeting ${de.pretty(t.configuration,b,de.Type.CODE)}; conflicting values are:${T}`,fixable:!1})}else{let[[T]]=C,L=(0,_de.default)(v,b);if(JSON.stringify(L)===JSON.stringify(T))continue;if(!o){let U=typeof L>"u"?`Missing field ${de.pretty(t.configuration,b,de.Type.CODE)}; expected ${de.pretty(t.configuration,T,de.Type.INSPECT)}`:typeof T>"u"?`Extraneous field ${de.pretty(t.configuration,b,de.Type.CODE)} currently set to ${de.pretty(t.configuration,L,de.Type.INSPECT)}`:`Invalid field ${de.pretty(t.configuration,b,de.Type.CODE)}; expected ${de.pretty(t.configuration,T,de.Type.INSPECT)}, found ${de.pretty(t.configuration,L,de.Type.INSPECT)}`;h.push({text:U,fixable:!0});continue}typeof T>"u"?(0,qde.default)(v,b):(0,Hde.default)(v,b,T),E=!0}E&&a.set(I,v)}h.length>0&&n.set(I,h)}return{changedWorkspaces:a,remainingErrors:n}}function Gde(t,{configuration:e}){let r={children:[]};for(let[o,a]of t){let n=[];for(let A of a){let p=A.text.split(/\n/);A.fixable&&(p[0]=`${de.pretty(e,"\u2699","gray")} ${p[0]}`),n.push({value:de.tuple(de.Type.NO_HINT,p[0]),children:p.slice(1).map(h=>({value:de.tuple(de.Type.NO_HINT,h)}))})}let u={value:de.tuple(de.Type.LOCATOR,o.anchoredLocator),children:je.sortMap(n,A=>A.value[1])};r.children.push(u)}return r.children=je.sortMap(r.children,o=>o.value[1]),r}var _de,Hde,jde,qde,CC,jgt,qgt,Ggt,B2=Et(()=>{Ye();_de=$e(g2()),Hde=$e(T8()),jde=$e(Ude()),qde=$e(L8()),CC=class{constructor(e){this.indexedFields=e;this.items=[];this.indexes={};this.clear()}clear(){this.items=[];for(let e of this.indexedFields)this.indexes[e]=new Map}insert(e){this.items.push(e);for(let r of this.indexedFields){let o=Object.hasOwn(e,r)?e[r]:void 0;if(typeof o>"u")continue;je.getArrayWithDefault(this.indexes[r],o).push(e)}return e}find(e){if(typeof e>"u")return this.items;let r=Object.entries(e);if(r.length===0)return this.items;let o=[],a;for(let[u,A]of r){let p=u,h=Object.hasOwn(this.indexes,p)?this.indexes[p]:void 0;if(typeof h>"u"){o.push([p,A]);continue}let E=new Set(h.get(A)??[]);if(E.size===0)return[];if(typeof a>"u")a=E;else for(let I of a)E.has(I)||a.delete(I);if(a.size===0)break}let n=[...a??[]];return o.length>0&&(n=n.filter(u=>{for(let[A,p]of o)if(!(typeof p<"u"?Object.hasOwn(u,A)&&u[A]===p:Object.hasOwn(u,A)===!1))return!1;return!0})),n}},jgt=/^[0-9]+$/,qgt=/^[a-zA-Z0-9_]+$/,Ggt=new Set(["scripts",...Mt.allDependencies])});var Yde=_(($9t,aH)=>{var Vgt;(function(t){var e=function(){return{"append/2":[new t.type.Rule(new t.type.Term("append",[new t.type.Var("X"),new t.type.Var("L")]),new t.type.Term("foldl",[new t.type.Term("append",[]),new t.type.Var("X"),new t.type.Term("[]",[]),new t.type.Var("L")]))],"append/3":[new t.type.Rule(new t.type.Term("append",[new t.type.Term("[]",[]),new t.type.Var("X"),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("append",[new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("S")])]),new t.type.Term("append",[new t.type.Var("T"),new t.type.Var("X"),new t.type.Var("S")]))],"member/2":[new t.type.Rule(new t.type.Term("member",[new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("_")])]),null),new t.type.Rule(new t.type.Term("member",[new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("_"),new t.type.Var("Xs")])]),new t.type.Term("member",[new t.type.Var("X"),new t.type.Var("Xs")]))],"permutation/2":[new t.type.Rule(new t.type.Term("permutation",[new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("permutation",[new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("permutation",[new t.type.Var("T"),new t.type.Var("P")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("P")]),new t.type.Term("append",[new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("Y")]),new t.type.Var("S")])])]))],"maplist/2":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("X")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("Xs")])]))],"maplist/3":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs")])]))],"maplist/4":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs")])]))],"maplist/5":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds")])]))],"maplist/6":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")]),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Es")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D"),new t.type.Var("E")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds"),new t.type.Var("Es")])]))],"maplist/7":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")]),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Es")]),new t.type.Term(".",[new t.type.Var("F"),new t.type.Var("Fs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D"),new t.type.Var("E"),new t.type.Var("F")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds"),new t.type.Var("Es"),new t.type.Var("Fs")])]))],"maplist/8":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")]),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Es")]),new t.type.Term(".",[new t.type.Var("F"),new t.type.Var("Fs")]),new t.type.Term(".",[new t.type.Var("G"),new t.type.Var("Gs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D"),new t.type.Var("E"),new t.type.Var("F"),new t.type.Var("G")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds"),new t.type.Var("Es"),new t.type.Var("Fs"),new t.type.Var("Gs")])]))],"include/3":[new t.type.Rule(new t.type.Term("include",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("include",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("L")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P"),new t.type.Var("A")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("A"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Term("[]",[])]),new t.type.Var("B")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("F"),new t.type.Var("B")]),new t.type.Term(",",[new t.type.Term(";",[new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("F")]),new t.type.Term(",",[new t.type.Term("=",[new t.type.Var("L"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("S")])]),new t.type.Term("!",[])])]),new t.type.Term("=",[new t.type.Var("L"),new t.type.Var("S")])]),new t.type.Term("include",[new t.type.Var("P"),new t.type.Var("T"),new t.type.Var("S")])])])])]))],"exclude/3":[new t.type.Rule(new t.type.Term("exclude",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("exclude",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("exclude",[new t.type.Var("P"),new t.type.Var("T"),new t.type.Var("E")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P"),new t.type.Var("L")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("L"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Term("[]",[])]),new t.type.Var("Q")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("R"),new t.type.Var("Q")]),new t.type.Term(";",[new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("R")]),new t.type.Term(",",[new t.type.Term("!",[]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("E")])])]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("E")])])])])])])]))],"foldl/4":[new t.type.Rule(new t.type.Term("foldl",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Var("I"),new t.type.Var("I")]),null),new t.type.Rule(new t.type.Term("foldl",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("I"),new t.type.Var("R")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P"),new t.type.Var("L")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("L"),new t.type.Term(".",[new t.type.Var("I"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])])])]),new t.type.Var("L2")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P2"),new t.type.Var("L2")]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P2")]),new t.type.Term("foldl",[new t.type.Var("P"),new t.type.Var("T"),new t.type.Var("X"),new t.type.Var("R")])])])])]))],"select/3":[new t.type.Rule(new t.type.Term("select",[new t.type.Var("E"),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Xs")]),new t.type.Var("Xs")]),null),new t.type.Rule(new t.type.Term("select",[new t.type.Var("E"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Ys")])]),new t.type.Term("select",[new t.type.Var("E"),new t.type.Var("Xs"),new t.type.Var("Ys")]))],"sum_list/2":[new t.type.Rule(new t.type.Term("sum_list",[new t.type.Term("[]",[]),new t.type.Num(0,!1)]),null),new t.type.Rule(new t.type.Term("sum_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("sum_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term("is",[new t.type.Var("S"),new t.type.Term("+",[new t.type.Var("X"),new t.type.Var("Y")])])]))],"max_list/2":[new t.type.Rule(new t.type.Term("max_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])]),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("max_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("max_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term(";",[new t.type.Term(",",[new t.type.Term(">=",[new t.type.Var("X"),new t.type.Var("Y")]),new t.type.Term(",",[new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("X")]),new t.type.Term("!",[])])]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("Y")])])]))],"min_list/2":[new t.type.Rule(new t.type.Term("min_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])]),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("min_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("min_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term(";",[new t.type.Term(",",[new t.type.Term("=<",[new t.type.Var("X"),new t.type.Var("Y")]),new t.type.Term(",",[new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("X")]),new t.type.Term("!",[])])]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("Y")])])]))],"prod_list/2":[new t.type.Rule(new t.type.Term("prod_list",[new t.type.Term("[]",[]),new t.type.Num(1,!1)]),null),new t.type.Rule(new t.type.Term("prod_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("prod_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term("is",[new t.type.Var("S"),new t.type.Term("*",[new t.type.Var("X"),new t.type.Var("Y")])])]))],"last/2":[new t.type.Rule(new t.type.Term("last",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])]),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("last",[new t.type.Term(".",[new t.type.Var("_"),new t.type.Var("Xs")]),new t.type.Var("X")]),new t.type.Term("last",[new t.type.Var("Xs"),new t.type.Var("X")]))],"prefix/2":[new t.type.Rule(new t.type.Term("prefix",[new t.type.Var("Part"),new t.type.Var("Whole")]),new t.type.Term("append",[new t.type.Var("Part"),new t.type.Var("_"),new t.type.Var("Whole")]))],"nth0/3":[new t.type.Rule(new t.type.Term("nth0",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")])]),new t.type.Term(",",[new t.type.Term(">=",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")]),new t.type.Term("!",[])])])]))],"nth1/3":[new t.type.Rule(new t.type.Term("nth1",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")])]),new t.type.Term(",",[new t.type.Term(">",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")]),new t.type.Term("!",[])])])]))],"nth0/4":[new t.type.Rule(new t.type.Term("nth0",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")])]),new t.type.Term(",",[new t.type.Term(">=",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term("!",[])])])]))],"nth1/4":[new t.type.Rule(new t.type.Term("nth1",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")])]),new t.type.Term(",",[new t.type.Term(">",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term("!",[])])])]))],"nth/5":[new t.type.Rule(new t.type.Term("nth",[new t.type.Var("N"),new t.type.Var("N"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("X"),new t.type.Var("Xs")]),null),new t.type.Rule(new t.type.Term("nth",[new t.type.Var("N"),new t.type.Var("O"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("Y"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Ys")])]),new t.type.Term(",",[new t.type.Term("is",[new t.type.Var("M"),new t.type.Term("+",[new t.type.Var("N"),new t.type.Num(1,!1)])]),new t.type.Term("nth",[new t.type.Var("M"),new t.type.Var("O"),new t.type.Var("Xs"),new t.type.Var("Y"),new t.type.Var("Ys")])]))],"length/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(!t.type.is_variable(A)&&!t.type.is_integer(A))o.throw_error(t.error.type("integer",A,n.indicator));else if(t.type.is_integer(A)&&A.value<0)o.throw_error(t.error.domain("not_less_than_zero",A,n.indicator));else{var p=new t.type.Term("length",[u,new t.type.Num(0,!1),A]);t.type.is_integer(A)&&(p=new t.type.Term(",",[p,new t.type.Term("!",[])])),o.prepend([new t.type.State(a.goal.replace(p),a.substitution,a)])}},"length/3":[new t.type.Rule(new t.type.Term("length",[new t.type.Term("[]",[]),new t.type.Var("N"),new t.type.Var("N")]),null),new t.type.Rule(new t.type.Term("length",[new t.type.Term(".",[new t.type.Var("_"),new t.type.Var("X")]),new t.type.Var("A"),new t.type.Var("N")]),new t.type.Term(",",[new t.type.Term("succ",[new t.type.Var("A"),new t.type.Var("B")]),new t.type.Term("length",[new t.type.Var("X"),new t.type.Var("B"),new t.type.Var("N")])]))],"replicate/3":function(o,a,n){var u=n.args[0],A=n.args[1],p=n.args[2];if(t.type.is_variable(A))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_integer(A))o.throw_error(t.error.type("integer",A,n.indicator));else if(A.value<0)o.throw_error(t.error.domain("not_less_than_zero",A,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))o.throw_error(t.error.type("list",p,n.indicator));else{for(var h=new t.type.Term("[]"),E=0;E0;I--)E[I].equals(E[I-1])&&E.splice(I,1);for(var v=new t.type.Term("[]"),I=E.length-1;I>=0;I--)v=new t.type.Term(".",[E[I],v]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[v,A])),a.substitution,a)])}}},"msort/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type("list",A,n.indicator));else{for(var p=[],h=u;h.indicator==="./2";)p.push(h.args[0]),h=h.args[1];if(t.type.is_variable(h))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_empty_list(h))o.throw_error(t.error.type("list",u,n.indicator));else{for(var E=p.sort(t.compare),I=new t.type.Term("[]"),v=E.length-1;v>=0;v--)I=new t.type.Term(".",[E[v],I]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[I,A])),a.substitution,a)])}}},"keysort/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type("list",A,n.indicator));else{for(var p=[],h,E=u;E.indicator==="./2";){if(h=E.args[0],t.type.is_variable(h)){o.throw_error(t.error.instantiation(n.indicator));return}else if(!t.type.is_term(h)||h.indicator!=="-/2"){o.throw_error(t.error.type("pair",h,n.indicator));return}h.args[0].pair=h.args[1],p.push(h.args[0]),E=E.args[1]}if(t.type.is_variable(E))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_empty_list(E))o.throw_error(t.error.type("list",u,n.indicator));else{for(var I=p.sort(t.compare),v=new t.type.Term("[]"),b=I.length-1;b>=0;b--)v=new t.type.Term(".",[new t.type.Term("-",[I[b],I[b].pair]),v]),delete I[b].pair;o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[v,A])),a.substitution,a)])}}},"take/3":function(o,a,n){var u=n.args[0],A=n.args[1],p=n.args[2];if(t.type.is_variable(A)||t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_list(A))o.throw_error(t.error.type("list",A,n.indicator));else if(!t.type.is_integer(u))o.throw_error(t.error.type("integer",u,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))o.throw_error(t.error.type("list",p,n.indicator));else{for(var h=u.value,E=[],I=A;h>0&&I.indicator==="./2";)E.push(I.args[0]),I=I.args[1],h--;if(h===0){for(var v=new t.type.Term("[]"),h=E.length-1;h>=0;h--)v=new t.type.Term(".",[E[h],v]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[v,p])),a.substitution,a)])}}},"drop/3":function(o,a,n){var u=n.args[0],A=n.args[1],p=n.args[2];if(t.type.is_variable(A)||t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_list(A))o.throw_error(t.error.type("list",A,n.indicator));else if(!t.type.is_integer(u))o.throw_error(t.error.type("integer",u,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))o.throw_error(t.error.type("list",p,n.indicator));else{for(var h=u.value,E=[],I=A;h>0&&I.indicator==="./2";)E.push(I.args[0]),I=I.args[1],h--;h===0&&o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[I,p])),a.substitution,a)])}},"reverse/2":function(o,a,n){var u=n.args[0],A=n.args[1],p=t.type.is_instantiated_list(u),h=t.type.is_instantiated_list(A);if(t.type.is_variable(u)&&t.type.is_variable(A))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(u)&&!t.type.is_fully_list(u))o.throw_error(t.error.type("list",u,n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type("list",A,n.indicator));else if(!p&&!h)o.throw_error(t.error.instantiation(n.indicator));else{for(var E=p?u:A,I=new t.type.Term("[]",[]);E.indicator==="./2";)I=new t.type.Term(".",[E.args[0],I]),E=E.args[1];o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[I,p?A:u])),a.substitution,a)])}},"list_to_set/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else{for(var p=u,h=[];p.indicator==="./2";)h.push(p.args[0]),p=p.args[1];if(t.type.is_variable(p))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_term(p)||p.indicator!=="[]/0")o.throw_error(t.error.type("list",u,n.indicator));else{for(var E=[],I=new t.type.Term("[]",[]),v,b=0;b=0;b--)I=new t.type.Term(".",[E[b],I]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[A,I])),a.substitution,a)])}}}}},r=["append/2","append/3","member/2","permutation/2","maplist/2","maplist/3","maplist/4","maplist/5","maplist/6","maplist/7","maplist/8","include/3","exclude/3","foldl/4","sum_list/2","max_list/2","min_list/2","prod_list/2","last/2","prefix/2","nth0/3","nth1/3","nth0/4","nth1/4","length/2","replicate/3","select/3","sort/2","msort/2","keysort/2","take/3","drop/3","reverse/2","list_to_set/2"];typeof aH<"u"?aH.exports=function(o){t=o,new t.type.Module("lists",e(),r)}:new t.type.Module("lists",e(),r)})(Vgt)});var ome=_(Yr=>{"use strict";var Zd=process.platform==="win32",lH="aes-256-cbc",Kgt="sha256",Kde="The current environment doesn't support interactive reading from TTY.",Yn=Be("fs"),Wde=process.binding("tty_wrap").TTY,uH=Be("child_process"),l0=Be("path"),AH={prompt:"> ",hideEchoBack:!1,mask:"*",limit:[],limitMessage:"Input another, please.$<( [)limit(])>",defaultInput:"",trueValue:[],falseValue:[],caseSensitive:!1,keepWhitespace:!1,encoding:"utf8",bufferSize:1024,print:void 0,history:!0,cd:!1,phContent:void 0,preCheck:void 0},Jf="none",Xc,IC,Vde=!1,a0,Ek,cH,Jgt=0,dH="",Xd=[],Ck,Jde=!1,fH=!1,v2=!1;function zde(t){function e(r){return r.replace(/[^\w\u0080-\uFFFF]/g,function(o){return"#"+o.charCodeAt(0)+";"})}return Ek.concat(function(r){var o=[];return Object.keys(r).forEach(function(a){r[a]==="boolean"?t[a]&&o.push("--"+a):r[a]==="string"&&t[a]&&o.push("--"+a,e(t[a]))}),o}({display:"string",displayOnly:"boolean",keyIn:"boolean",hideEchoBack:"boolean",mask:"string",limit:"string",caseSensitive:"boolean"}))}function zgt(t,e){function r(U){var J,te="",le;for(cH=cH||Be("os").tmpdir();;){J=l0.join(cH,U+te);try{le=Yn.openSync(J,"wx")}catch(pe){if(pe.code==="EEXIST"){te++;continue}else throw pe}Yn.closeSync(le);break}return J}var o,a,n,u={},A,p,h=r("readline-sync.stdout"),E=r("readline-sync.stderr"),I=r("readline-sync.exit"),v=r("readline-sync.done"),b=Be("crypto"),C,T,L;C=b.createHash(Kgt),C.update(""+process.pid+Jgt+++Math.random()),L=C.digest("hex"),T=b.createDecipher(lH,L),o=zde(t),Zd?(a=process.env.ComSpec||"cmd.exe",process.env.Q='"',n=["/V:ON","/S","/C","(%Q%"+a+"%Q% /V:ON /S /C %Q%%Q%"+a0+"%Q%"+o.map(function(U){return" %Q%"+U+"%Q%"}).join("")+" & (echo !ERRORLEVEL!)>%Q%"+I+"%Q%%Q%) 2>%Q%"+E+"%Q% |%Q%"+process.execPath+"%Q% %Q%"+__dirname+"\\encrypt.js%Q% %Q%"+lH+"%Q% %Q%"+L+"%Q% >%Q%"+h+"%Q% & (echo 1)>%Q%"+v+"%Q%"]):(a="/bin/sh",n=["-c",'("'+a0+'"'+o.map(function(U){return" '"+U.replace(/'/g,"'\\''")+"'"}).join("")+'; echo $?>"'+I+'") 2>"'+E+'" |"'+process.execPath+'" "'+__dirname+'/encrypt.js" "'+lH+'" "'+L+'" >"'+h+'"; echo 1 >"'+v+'"']),v2&&v2("_execFileSync",o);try{uH.spawn(a,n,e)}catch(U){u.error=new Error(U.message),u.error.method="_execFileSync - spawn",u.error.program=a,u.error.args=n}for(;Yn.readFileSync(v,{encoding:t.encoding}).trim()!=="1";);return(A=Yn.readFileSync(I,{encoding:t.encoding}).trim())==="0"?u.input=T.update(Yn.readFileSync(h,{encoding:"binary"}),"hex",t.encoding)+T.final(t.encoding):(p=Yn.readFileSync(E,{encoding:t.encoding}).trim(),u.error=new Error(Kde+(p?` +`+p:"")),u.error.method="_execFileSync",u.error.program=a,u.error.args=n,u.error.extMessage=p,u.error.exitCode=+A),Yn.unlinkSync(h),Yn.unlinkSync(E),Yn.unlinkSync(I),Yn.unlinkSync(v),u}function Xgt(t){var e,r={},o,a={env:process.env,encoding:t.encoding};if(a0||(Zd?process.env.PSModulePath?(a0="powershell.exe",Ek=["-ExecutionPolicy","Bypass","-File",__dirname+"\\read.ps1"]):(a0="cscript.exe",Ek=["//nologo",__dirname+"\\read.cs.js"]):(a0="/bin/sh",Ek=[__dirname+"/read.sh"])),Zd&&!process.env.PSModulePath&&(a.stdio=[process.stdin]),uH.execFileSync){e=zde(t),v2&&v2("execFileSync",e);try{r.input=uH.execFileSync(a0,e,a)}catch(n){o=n.stderr?(n.stderr+"").trim():"",r.error=new Error(Kde+(o?` +`+o:"")),r.error.method="execFileSync",r.error.program=a0,r.error.args=e,r.error.extMessage=o,r.error.exitCode=n.status,r.error.code=n.code,r.error.signal=n.signal}}else r=zgt(t,a);return r.error||(r.input=r.input.replace(/^\s*'|'\s*$/g,""),t.display=""),r}function pH(t){var e="",r=t.display,o=!t.display&&t.keyIn&&t.hideEchoBack&&!t.mask;function a(){var n=Xgt(t);if(n.error)throw n.error;return n.input}return fH&&fH(t),function(){var n,u,A;function p(){return n||(n=process.binding("fs"),u=process.binding("constants")),n}if(typeof Jf=="string")if(Jf=null,Zd){if(A=function(h){var E=h.replace(/^\D+/,"").split("."),I=0;return(E[0]=+E[0])&&(I+=E[0]*1e4),(E[1]=+E[1])&&(I+=E[1]*100),(E[2]=+E[2])&&(I+=E[2]),I}(process.version),!(A>=20302&&A<40204||A>=5e4&&A<50100||A>=50600&&A<60200)&&process.stdin.isTTY)process.stdin.pause(),Jf=process.stdin.fd,IC=process.stdin._handle;else try{Jf=p().open("CONIN$",u.O_RDWR,parseInt("0666",8)),IC=new Wde(Jf,!0)}catch{}if(process.stdout.isTTY)Xc=process.stdout.fd;else{try{Xc=Yn.openSync("\\\\.\\CON","w")}catch{}if(typeof Xc!="number")try{Xc=p().open("CONOUT$",u.O_RDWR,parseInt("0666",8))}catch{}}}else{if(process.stdin.isTTY){process.stdin.pause();try{Jf=Yn.openSync("/dev/tty","r"),IC=process.stdin._handle}catch{}}else try{Jf=Yn.openSync("/dev/tty","r"),IC=new Wde(Jf,!1)}catch{}if(process.stdout.isTTY)Xc=process.stdout.fd;else try{Xc=Yn.openSync("/dev/tty","w")}catch{}}}(),function(){var n,u,A=!t.hideEchoBack&&!t.keyIn,p,h,E,I,v;Ck="";function b(C){return C===Vde?!0:IC.setRawMode(C)!==0?!1:(Vde=C,!0)}if(Jde||!IC||typeof Xc!="number"&&(t.display||!A)){e=a();return}if(t.display&&(Yn.writeSync(Xc,t.display),t.display=""),!t.displayOnly){if(!b(!A)){e=a();return}for(h=t.keyIn?1:t.bufferSize,p=Buffer.allocUnsafe&&Buffer.alloc?Buffer.alloc(h):new Buffer(h),t.keyIn&&t.limit&&(u=new RegExp("[^"+t.limit+"]","g"+(t.caseSensitive?"":"i")));;){E=0;try{E=Yn.readSync(Jf,p,0,h)}catch(C){if(C.code!=="EOF"){b(!1),e+=a();return}}if(E>0?(I=p.toString(t.encoding,0,E),Ck+=I):(I=` +`,Ck+=String.fromCharCode(0)),I&&typeof(v=(I.match(/^(.*?)[\r\n]/)||[])[1])=="string"&&(I=v,n=!0),I&&(I=I.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g,"")),I&&u&&(I=I.replace(u,"")),I&&(A||(t.hideEchoBack?t.mask&&Yn.writeSync(Xc,new Array(I.length+1).join(t.mask)):Yn.writeSync(Xc,I)),e+=I),!t.keyIn&&n||t.keyIn&&e.length>=h)break}!A&&!o&&Yn.writeSync(Xc,` +`),b(!1)}}(),t.print&&!o&&t.print(r+(t.displayOnly?"":(t.hideEchoBack?new Array(e.length+1).join(t.mask):e)+` +`),t.encoding),t.displayOnly?"":dH=t.keepWhitespace||t.keyIn?e:e.trim()}function Zgt(t,e){var r=[];function o(a){a!=null&&(Array.isArray(a)?a.forEach(o):(!e||e(a))&&r.push(a))}return o(t),r}function mH(t){return t.replace(/[\x00-\x7f]/g,function(e){return"\\x"+("00"+e.charCodeAt().toString(16)).substr(-2)})}function Ts(){var t=Array.prototype.slice.call(arguments),e,r;return t.length&&typeof t[0]=="boolean"&&(r=t.shift(),r&&(e=Object.keys(AH),t.unshift(AH))),t.reduce(function(o,a){return a==null||(a.hasOwnProperty("noEchoBack")&&!a.hasOwnProperty("hideEchoBack")&&(a.hideEchoBack=a.noEchoBack,delete a.noEchoBack),a.hasOwnProperty("noTrim")&&!a.hasOwnProperty("keepWhitespace")&&(a.keepWhitespace=a.noTrim,delete a.noTrim),r||(e=Object.keys(a)),e.forEach(function(n){var u;if(!!a.hasOwnProperty(n))switch(u=a[n],n){case"mask":case"limitMessage":case"defaultInput":case"encoding":u=u!=null?u+"":"",u&&n!=="limitMessage"&&(u=u.replace(/[\r\n]/g,"")),o[n]=u;break;case"bufferSize":!isNaN(u=parseInt(u,10))&&typeof u=="number"&&(o[n]=u);break;case"displayOnly":case"keyIn":case"hideEchoBack":case"caseSensitive":case"keepWhitespace":case"history":case"cd":o[n]=!!u;break;case"limit":case"trueValue":case"falseValue":o[n]=Zgt(u,function(A){var p=typeof A;return p==="string"||p==="number"||p==="function"||A instanceof RegExp}).map(function(A){return typeof A=="string"?A.replace(/[\r\n]/g,""):A});break;case"print":case"phContent":case"preCheck":o[n]=typeof u=="function"?u:void 0;break;case"prompt":case"display":o[n]=u??"";break}})),o},{})}function hH(t,e,r){return e.some(function(o){var a=typeof o;return a==="string"?r?t===o:t.toLowerCase()===o.toLowerCase():a==="number"?parseFloat(t)===o:a==="function"?o(t):o instanceof RegExp?o.test(t):!1})}function yH(t,e){var r=l0.normalize(Zd?(process.env.HOMEDRIVE||"")+(process.env.HOMEPATH||""):process.env.HOME||"").replace(/[\/\\]+$/,"");return t=l0.normalize(t),e?t.replace(/^~(?=\/|\\|$)/,r):t.replace(new RegExp("^"+mH(r)+"(?=\\/|\\\\|$)",Zd?"i":""),"~")}function BC(t,e){var r="(?:\\(([\\s\\S]*?)\\))?(\\w+|.-.)(?:\\(([\\s\\S]*?)\\))?",o=new RegExp("(\\$)?(\\$<"+r+">)","g"),a=new RegExp("(\\$)?(\\$\\{"+r+"\\})","g");function n(u,A,p,h,E,I){var v;return A||typeof(v=e(E))!="string"?p:v?(h||"")+v+(I||""):""}return t.replace(o,n).replace(a,n)}function Xde(t,e,r){var o,a=[],n=-1,u=0,A="",p;function h(E,I){return I.length>3?(E.push(I[0]+"..."+I[I.length-1]),p=!0):I.length&&(E=E.concat(I)),E}return o=t.reduce(function(E,I){return E.concat((I+"").split(""))},[]).reduce(function(E,I){var v,b;return e||(I=I.toLowerCase()),v=/^\d$/.test(I)?1:/^[A-Z]$/.test(I)?2:/^[a-z]$/.test(I)?3:0,r&&v===0?A+=I:(b=I.charCodeAt(0),v&&v===n&&b===u+1?a.push(I):(E=h(E,a),a=[I],n=v),u=b),E},[]),o=h(o,a),A&&(o.push(A),p=!0),{values:o,suppressed:p}}function Zde(t,e){return t.join(t.length>2?", ":e?" / ":"/")}function $de(t,e){var r,o,a={},n;if(e.phContent&&(r=e.phContent(t,e)),typeof r!="string")switch(t){case"hideEchoBack":case"mask":case"defaultInput":case"caseSensitive":case"keepWhitespace":case"encoding":case"bufferSize":case"history":case"cd":r=e.hasOwnProperty(t)?typeof e[t]=="boolean"?e[t]?"on":"off":e[t]+"":"";break;case"limit":case"trueValue":case"falseValue":o=e[e.hasOwnProperty(t+"Src")?t+"Src":t],e.keyIn?(a=Xde(o,e.caseSensitive),o=a.values):o=o.filter(function(u){var A=typeof u;return A==="string"||A==="number"}),r=Zde(o,a.suppressed);break;case"limitCount":case"limitCountNotZero":r=e[e.hasOwnProperty("limitSrc")?"limitSrc":"limit"].length,r=r||t!=="limitCountNotZero"?r+"":"";break;case"lastInput":r=dH;break;case"cwd":case"CWD":case"cwdHome":r=process.cwd(),t==="CWD"?r=l0.basename(r):t==="cwdHome"&&(r=yH(r));break;case"date":case"time":case"localeDate":case"localeTime":r=new Date()["to"+t.replace(/^./,function(u){return u.toUpperCase()})+"String"]();break;default:typeof(n=(t.match(/^history_m(\d+)$/)||[])[1])=="string"&&(r=Xd[Xd.length-n]||"")}return r}function eme(t){var e=/^(.)-(.)$/.exec(t),r="",o,a,n,u;if(!e)return null;for(o=e[1].charCodeAt(0),a=e[2].charCodeAt(0),u=o +And the length must be: $`,trueValue:null,falseValue:null,caseSensitive:!0},e,{history:!1,cd:!1,phContent:function(b){return b==="charlist"?r.text:b==="length"?o+"..."+a:null}}),u,A,p,h,E,I,v;for(e=e||{},u=BC(e.charlist?e.charlist+"":"$",eme),(isNaN(o=parseInt(e.min,10))||typeof o!="number")&&(o=12),(isNaN(a=parseInt(e.max,10))||typeof a!="number")&&(a=24),h=new RegExp("^["+mH(u)+"]{"+o+","+a+"}$"),r=Xde([u],n.caseSensitive,!0),r.text=Zde(r.values,r.suppressed),A=e.confirmMessage!=null?e.confirmMessage:"Reinput a same one to confirm it: ",p=e.unmatchMessage!=null?e.unmatchMessage:"It differs from first one. Hit only the Enter key if you want to retry from first one.",t==null&&(t="Input new password: "),E=n.limitMessage;!v;)n.limit=h,n.limitMessage=E,I=Yr.question(t,n),n.limit=[I,""],n.limitMessage=p,v=Yr.question(A,n);return I};function nme(t,e,r){var o;function a(n){return o=r(n),!isNaN(o)&&typeof o=="number"}return Yr.question(t,Ts({limitMessage:"Input valid number, please."},e,{limit:a,cd:!1})),o}Yr.questionInt=function(t,e){return nme(t,e,function(r){return parseInt(r,10)})};Yr.questionFloat=function(t,e){return nme(t,e,parseFloat)};Yr.questionPath=function(t,e){var r,o="",a=Ts({hideEchoBack:!1,limitMessage:`$Input valid path, please.$<( Min:)min>$<( Max:)max>`,history:!0,cd:!0},e,{keepWhitespace:!1,limit:function(n){var u,A,p;n=yH(n,!0),o="";function h(E){E.split(/\/|\\/).reduce(function(I,v){var b=l0.resolve(I+=v+l0.sep);if(!Yn.existsSync(b))Yn.mkdirSync(b);else if(!Yn.statSync(b).isDirectory())throw new Error("Non directory already exists: "+b);return I},"")}try{if(u=Yn.existsSync(n),r=u?Yn.realpathSync(n):l0.resolve(n),!e.hasOwnProperty("exists")&&!u||typeof e.exists=="boolean"&&e.exists!==u)return o=(u?"Already exists":"No such file or directory")+": "+r,!1;if(!u&&e.create&&(e.isDirectory?h(r):(h(l0.dirname(r)),Yn.closeSync(Yn.openSync(r,"w"))),r=Yn.realpathSync(r)),u&&(e.min||e.max||e.isFile||e.isDirectory)){if(A=Yn.statSync(r),e.isFile&&!A.isFile())return o="Not file: "+r,!1;if(e.isDirectory&&!A.isDirectory())return o="Not directory: "+r,!1;if(e.min&&A.size<+e.min||e.max&&A.size>+e.max)return o="Size "+A.size+" is out of range: "+r,!1}if(typeof e.validate=="function"&&(p=e.validate(r))!==!0)return typeof p=="string"&&(o=p),!1}catch(E){return o=E+"",!1}return!0},phContent:function(n){return n==="error"?o:n!=="min"&&n!=="max"?null:e.hasOwnProperty(n)?e[n]+"":""}});return e=e||{},t==null&&(t='Input path (you can "cd" and "pwd"): '),Yr.question(t,a),r};function ime(t,e){var r={},o={};return typeof t=="object"?(Object.keys(t).forEach(function(a){typeof t[a]=="function"&&(o[e.caseSensitive?a:a.toLowerCase()]=t[a])}),r.preCheck=function(a){var n;return r.args=gH(a),n=r.args[0]||"",e.caseSensitive||(n=n.toLowerCase()),r.hRes=n!=="_"&&o.hasOwnProperty(n)?o[n].apply(a,r.args.slice(1)):o.hasOwnProperty("_")?o._.apply(a,r.args):null,{res:a,forceNext:!1}},o.hasOwnProperty("_")||(r.limit=function(){var a=r.args[0]||"";return e.caseSensitive||(a=a.toLowerCase()),o.hasOwnProperty(a)})):r.preCheck=function(a){return r.args=gH(a),r.hRes=typeof t=="function"?t.apply(a,r.args):!0,{res:a,forceNext:!1}},r}Yr.promptCL=function(t,e){var r=Ts({hideEchoBack:!1,limitMessage:"Requested command is not available.",caseSensitive:!1,history:!0},e),o=ime(t,r);return r.limit=o.limit,r.preCheck=o.preCheck,Yr.prompt(r),o.args};Yr.promptLoop=function(t,e){for(var r=Ts({hideEchoBack:!1,trueValue:null,falseValue:null,caseSensitive:!1,history:!0},e);!t(Yr.prompt(r)););};Yr.promptCLLoop=function(t,e){var r=Ts({hideEchoBack:!1,limitMessage:"Requested command is not available.",caseSensitive:!1,history:!0},e),o=ime(t,r);for(r.limit=o.limit,r.preCheck=o.preCheck;Yr.prompt(r),!o.hRes;);};Yr.promptSimShell=function(t){return Yr.prompt(Ts({hideEchoBack:!1,history:!0},t,{prompt:function(){return Zd?"$>":(process.env.USER||"")+(process.env.HOSTNAME?"@"+process.env.HOSTNAME.replace(/\..*$/,""):"")+":$$ "}()}))};function sme(t,e,r){var o;return t==null&&(t="Are you sure? "),(!e||e.guide!==!1)&&(t+="")&&(t=t.replace(/\s*:?\s*$/,"")+" [y/n]: "),o=Yr.keyIn(t,Ts(e,{hideEchoBack:!1,limit:r,trueValue:"y",falseValue:"n",caseSensitive:!1})),typeof o=="boolean"?o:""}Yr.keyInYN=function(t,e){return sme(t,e)};Yr.keyInYNStrict=function(t,e){return sme(t,e,"yn")};Yr.keyInPause=function(t,e){t==null&&(t="Continue..."),(!e||e.guide!==!1)&&(t+="")&&(t=t.replace(/\s+$/,"")+" (Hit any key)"),Yr.keyIn(t,Ts({limit:null},e,{hideEchoBack:!0,mask:""}))};Yr.keyInSelect=function(t,e,r){var o=Ts({hideEchoBack:!1},r,{trueValue:null,falseValue:null,caseSensitive:!1,phContent:function(p){return p==="itemsCount"?t.length+"":p==="firstItem"?(t[0]+"").trim():p==="lastItem"?(t[t.length-1]+"").trim():null}}),a="",n={},u=49,A=` +`;if(!Array.isArray(t)||!t.length||t.length>35)throw"`items` must be Array (max length: 35).";return t.forEach(function(p,h){var E=String.fromCharCode(u);a+=E,n[E]=h,A+="["+E+"] "+(p+"").trim()+` +`,u=u===57?97:u+1}),(!r||r.cancel!==!1)&&(a+="0",n[0]=-1,A+="[0] "+(r&&r.cancel!=null&&typeof r.cancel!="boolean"?(r.cancel+"").trim():"CANCEL")+` +`),o.limit=a,A+=` +`,e==null&&(e="Choose one from list: "),(e+="")&&((!r||r.guide!==!1)&&(e=e.replace(/\s*:?\s*$/,"")+" [$]: "),A+=e),n[Yr.keyIn(A,o).toLowerCase()]};Yr.getRawInput=function(){return Ck};function D2(t,e){var r;return e.length&&(r={},r[t]=e[0]),Yr.setDefaultOptions(r)[t]}Yr.setPrint=function(){return D2("print",arguments)};Yr.setPrompt=function(){return D2("prompt",arguments)};Yr.setEncoding=function(){return D2("encoding",arguments)};Yr.setMask=function(){return D2("mask",arguments)};Yr.setBufferSize=function(){return D2("bufferSize",arguments)}});var EH=_((t7t,hl)=>{(function(){var t={major:0,minor:2,patch:66,status:"beta"};tau_file_system={files:{},open:function(w,S,y){var F=tau_file_system.files[w];if(!F){if(y==="read")return null;F={path:w,text:"",type:S,get:function(z,X){return X===this.text.length||X>this.text.length?"end_of_file":this.text.substring(X,X+z)},put:function(z,X){return X==="end_of_file"?(this.text+=z,!0):X==="past_end_of_file"?null:(this.text=this.text.substring(0,X)+z+this.text.substring(X+z.length),!0)},get_byte:function(z){if(z==="end_of_stream")return-1;var X=Math.floor(z/2);if(this.text.length<=X)return-1;var Z=n(this.text[Math.floor(z/2)],0);return z%2===0?Z&255:Z/256>>>0},put_byte:function(z,X){var Z=X==="end_of_stream"?this.text.length:Math.floor(X/2);if(this.text.length>>0,ie=(ie&255)<<8|z&255):(ie=ie&255,ie=(z&255)<<8|ie&255),this.text.length===Z?this.text+=u(ie):this.text=this.text.substring(0,Z)+u(ie)+this.text.substring(Z+1),!0},flush:function(){return!0},close:function(){var z=tau_file_system.files[this.path];return z?!0:null}},tau_file_system.files[w]=F}return y==="write"&&(F.text=""),F}},tau_user_input={buffer:"",get:function(w,S){for(var y;tau_user_input.buffer.length\?\@\^\~\\]+|'(?:[^']*?(?:\\(?:x?\d+)?\\)*(?:'')*(?:\\')*)*')/,number:/^(?:0o[0-7]+|0x[0-9a-fA-F]+|0b[01]+|0'(?:''|\\[abfnrtv\\'"`]|\\x?\d+\\|[^\\])|\d+(?:\.\d+(?:[eE][+-]?\d+)?)?)/,string:/^(?:"([^"]|""|\\")*"|`([^`]|``|\\`)*`)/,l_brace:/^(?:\[)/,r_brace:/^(?:\])/,l_bracket:/^(?:\{)/,r_bracket:/^(?:\})/,bar:/^(?:\|)/,l_paren:/^(?:\()/,r_paren:/^(?:\))/};function L(w,S){return w.get_flag("char_conversion").id==="on"?S.replace(/./g,function(y){return w.get_char_conversion(y)}):S}function U(w){this.thread=w,this.text="",this.tokens=[]}U.prototype.set_last_tokens=function(w){return this.tokens=w},U.prototype.new_text=function(w){this.text=w,this.tokens=[]},U.prototype.get_tokens=function(w){var S,y=0,F=0,z=0,X=[],Z=!1;if(w){var ie=this.tokens[w-1];y=ie.len,S=L(this.thread,this.text.substr(ie.len)),F=ie.line,z=ie.start}else S=this.text;if(/^\s*$/.test(S))return null;for(;S!=="";){var Se=[],Ne=!1;if(/^\n/.exec(S)!==null){F++,z=0,y++,S=S.replace(/\n/,""),Z=!0;continue}for(var ot in T)if(T.hasOwnProperty(ot)){var dt=T[ot].exec(S);dt&&Se.push({value:dt[0],name:ot,matches:dt})}if(!Se.length)return this.set_last_tokens([{value:S,matches:[],name:"lexical",line:F,start:z}]);var ie=r(Se,function(Qr,mr){return Qr.value.length>=mr.value.length?Qr:mr});switch(ie.start=z,ie.line=F,S=S.replace(ie.value,""),z+=ie.value.length,y+=ie.value.length,ie.name){case"atom":ie.raw=ie.value,ie.value.charAt(0)==="'"&&(ie.value=v(ie.value.substr(1,ie.value.length-2),"'"),ie.value===null&&(ie.name="lexical",ie.value="unknown escape sequence"));break;case"number":ie.float=ie.value.substring(0,2)!=="0x"&&ie.value.match(/[.eE]/)!==null&&ie.value!=="0'.",ie.value=C(ie.value),ie.blank=Ne;break;case"string":var jt=ie.value.charAt(0);ie.value=v(ie.value.substr(1,ie.value.length-2),jt),ie.value===null&&(ie.name="lexical",ie.value="unknown escape sequence");break;case"whitespace":var $t=X[X.length-1];$t&&($t.space=!0),Ne=!0;continue;case"r_bracket":X.length>0&&X[X.length-1].name==="l_bracket"&&(ie=X.pop(),ie.name="atom",ie.value="{}",ie.raw="{}",ie.space=!1);break;case"r_brace":X.length>0&&X[X.length-1].name==="l_brace"&&(ie=X.pop(),ie.name="atom",ie.value="[]",ie.raw="[]",ie.space=!1);break}ie.len=y,X.push(ie),Ne=!1}var xt=this.set_last_tokens(X);return xt.length===0?null:xt};function J(w,S,y,F,z){if(!S[y])return{type:A,value:x.error.syntax(S[y-1],"expression expected",!0)};var X;if(F==="0"){var Z=S[y];switch(Z.name){case"number":return{type:p,len:y+1,value:new x.type.Num(Z.value,Z.float)};case"variable":return{type:p,len:y+1,value:new x.type.Var(Z.value)};case"string":var ie;switch(w.get_flag("double_quotes").id){case"atom":ie=new H(Z.value,[]);break;case"codes":ie=new H("[]",[]);for(var Se=Z.value.length-1;Se>=0;Se--)ie=new H(".",[new x.type.Num(n(Z.value,Se),!1),ie]);break;case"chars":ie=new H("[]",[]);for(var Se=Z.value.length-1;Se>=0;Se--)ie=new H(".",[new x.type.Term(Z.value.charAt(Se),[]),ie]);break}return{type:p,len:y+1,value:ie};case"l_paren":var xt=J(w,S,y+1,w.__get_max_priority(),!0);return xt.type!==p?xt:S[xt.len]&&S[xt.len].name==="r_paren"?(xt.len++,xt):{type:A,derived:!0,value:x.error.syntax(S[xt.len]?S[xt.len]:S[xt.len-1],") or operator expected",!S[xt.len])};case"l_bracket":var xt=J(w,S,y+1,w.__get_max_priority(),!0);return xt.type!==p?xt:S[xt.len]&&S[xt.len].name==="r_bracket"?(xt.len++,xt.value=new H("{}",[xt.value]),xt):{type:A,derived:!0,value:x.error.syntax(S[xt.len]?S[xt.len]:S[xt.len-1],"} or operator expected",!S[xt.len])}}var Ne=te(w,S,y,z);return Ne.type===p||Ne.derived||(Ne=le(w,S,y),Ne.type===p||Ne.derived)?Ne:{type:A,derived:!1,value:x.error.syntax(S[y],"unexpected token")}}var ot=w.__get_max_priority(),dt=w.__get_next_priority(F),jt=y;if(S[y].name==="atom"&&S[y+1]&&(S[y].space||S[y+1].name!=="l_paren")){var Z=S[y++],$t=w.__lookup_operator_classes(F,Z.value);if($t&&$t.indexOf("fy")>-1){var xt=J(w,S,y,F,z);if(xt.type!==A)return Z.value==="-"&&!Z.space&&x.type.is_number(xt.value)?{value:new x.type.Num(-xt.value.value,xt.value.is_float),len:xt.len,type:p}:{value:new x.type.Term(Z.value,[xt.value]),len:xt.len,type:p};X=xt}else if($t&&$t.indexOf("fx")>-1){var xt=J(w,S,y,dt,z);if(xt.type!==A)return{value:new x.type.Term(Z.value,[xt.value]),len:xt.len,type:p};X=xt}}y=jt;var xt=J(w,S,y,dt,z);if(xt.type===p){y=xt.len;var Z=S[y];if(S[y]&&(S[y].name==="atom"&&w.__lookup_operator_classes(F,Z.value)||S[y].name==="bar"&&w.__lookup_operator_classes(F,"|"))){var an=dt,Qr=F,$t=w.__lookup_operator_classes(F,Z.value);if($t.indexOf("xf")>-1)return{value:new x.type.Term(Z.value,[xt.value]),len:++xt.len,type:p};if($t.indexOf("xfx")>-1){var mr=J(w,S,y+1,an,z);return mr.type===p?{value:new x.type.Term(Z.value,[xt.value,mr.value]),len:mr.len,type:p}:(mr.derived=!0,mr)}else if($t.indexOf("xfy")>-1){var mr=J(w,S,y+1,Qr,z);return mr.type===p?{value:new x.type.Term(Z.value,[xt.value,mr.value]),len:mr.len,type:p}:(mr.derived=!0,mr)}else if(xt.type!==A)for(;;){y=xt.len;var Z=S[y];if(Z&&Z.name==="atom"&&w.__lookup_operator_classes(F,Z.value)){var $t=w.__lookup_operator_classes(F,Z.value);if($t.indexOf("yf")>-1)xt={value:new x.type.Term(Z.value,[xt.value]),len:++y,type:p};else if($t.indexOf("yfx")>-1){var mr=J(w,S,++y,an,z);if(mr.type===A)return mr.derived=!0,mr;y=mr.len,xt={value:new x.type.Term(Z.value,[xt.value,mr.value]),len:y,type:p}}else break}else break}}else X={type:A,value:x.error.syntax(S[xt.len-1],"operator expected")};return xt}return xt}function te(w,S,y,F){if(!S[y]||S[y].name==="atom"&&S[y].raw==="."&&!F&&(S[y].space||!S[y+1]||S[y+1].name!=="l_paren"))return{type:A,derived:!1,value:x.error.syntax(S[y-1],"unfounded token")};var z=S[y],X=[];if(S[y].name==="atom"&&S[y].raw!==","){if(y++,S[y-1].space)return{type:p,len:y,value:new x.type.Term(z.value,X)};if(S[y]&&S[y].name==="l_paren"){if(S[y+1]&&S[y+1].name==="r_paren")return{type:A,derived:!0,value:x.error.syntax(S[y+1],"argument expected")};var Z=J(w,S,++y,"999",!0);if(Z.type===A)return Z.derived?Z:{type:A,derived:!0,value:x.error.syntax(S[y]?S[y]:S[y-1],"argument expected",!S[y])};for(X.push(Z.value),y=Z.len;S[y]&&S[y].name==="atom"&&S[y].value===",";){if(Z=J(w,S,y+1,"999",!0),Z.type===A)return Z.derived?Z:{type:A,derived:!0,value:x.error.syntax(S[y+1]?S[y+1]:S[y],"argument expected",!S[y+1])};X.push(Z.value),y=Z.len}if(S[y]&&S[y].name==="r_paren")y++;else return{type:A,derived:!0,value:x.error.syntax(S[y]?S[y]:S[y-1],", or ) expected",!S[y])}}return{type:p,len:y,value:new x.type.Term(z.value,X)}}return{type:A,derived:!1,value:x.error.syntax(S[y],"term expected")}}function le(w,S,y){if(!S[y])return{type:A,derived:!1,value:x.error.syntax(S[y-1],"[ expected")};if(S[y]&&S[y].name==="l_brace"){var F=J(w,S,++y,"999",!0),z=[F.value],X=void 0;if(F.type===A)return S[y]&&S[y].name==="r_brace"?{type:p,len:y+1,value:new x.type.Term("[]",[])}:{type:A,derived:!0,value:x.error.syntax(S[y],"] expected")};for(y=F.len;S[y]&&S[y].name==="atom"&&S[y].value===",";){if(F=J(w,S,y+1,"999",!0),F.type===A)return F.derived?F:{type:A,derived:!0,value:x.error.syntax(S[y+1]?S[y+1]:S[y],"argument expected",!S[y+1])};z.push(F.value),y=F.len}var Z=!1;if(S[y]&&S[y].name==="bar"){if(Z=!0,F=J(w,S,y+1,"999",!0),F.type===A)return F.derived?F:{type:A,derived:!0,value:x.error.syntax(S[y+1]?S[y+1]:S[y],"argument expected",!S[y+1])};X=F.value,y=F.len}return S[y]&&S[y].name==="r_brace"?{type:p,len:y+1,value:g(z,X)}:{type:A,derived:!0,value:x.error.syntax(S[y]?S[y]:S[y-1],Z?"] expected":", or | or ] expected",!S[y])}}return{type:A,derived:!1,value:x.error.syntax(S[y],"list expected")}}function pe(w,S,y){var F=S[y].line,z=J(w,S,y,w.__get_max_priority(),!1),X=null,Z;if(z.type!==A)if(y=z.len,S[y]&&S[y].name==="atom"&&S[y].raw===".")if(y++,x.type.is_term(z.value)){if(z.value.indicator===":-/2"?(X=new x.type.Rule(z.value.args[0],Pe(z.value.args[1])),Z={value:X,len:y,type:p}):z.value.indicator==="-->/2"?(X=ae(new x.type.Rule(z.value.args[0],z.value.args[1]),w),X.body=Pe(X.body),Z={value:X,len:y,type:x.type.is_rule(X)?p:A}):(X=new x.type.Rule(z.value,null),Z={value:X,len:y,type:p}),X){var ie=X.singleton_variables();ie.length>0&&w.throw_warning(x.warning.singleton(ie,X.head.indicator,F))}return Z}else return{type:A,value:x.error.syntax(S[y],"callable expected")};else return{type:A,value:x.error.syntax(S[y]?S[y]:S[y-1],". or operator expected")};return z}function Ae(w,S,y){y=y||{},y.from=y.from?y.from:"$tau-js",y.reconsult=y.reconsult!==void 0?y.reconsult:!0;var F=new U(w),z={},X;F.new_text(S);var Z=0,ie=F.get_tokens(Z);do{if(ie===null||!ie[Z])break;var Se=pe(w,ie,Z);if(Se.type===A)return new H("throw",[Se.value]);if(Se.value.body===null&&Se.value.head.indicator==="?-/1"){var Ne=new Je(w.session);Ne.add_goal(Se.value.head.args[0]),Ne.answer(function(dt){x.type.is_error(dt)?w.throw_warning(dt.args[0]):(dt===!1||dt===null)&&w.throw_warning(x.warning.failed_goal(Se.value.head.args[0],Se.len))}),Z=Se.len;var ot=!0}else if(Se.value.body===null&&Se.value.head.indicator===":-/1"){var ot=w.run_directive(Se.value.head.args[0]);Z=Se.len,Se.value.head.args[0].indicator==="char_conversion/2"&&(ie=F.get_tokens(Z),Z=0)}else{X=Se.value.head.indicator,y.reconsult!==!1&&z[X]!==!0&&!w.is_multifile_predicate(X)&&(w.session.rules[X]=a(w.session.rules[X]||[],function(jt){return jt.dynamic}),z[X]=!0);var ot=w.add_rule(Se.value,y);Z=Se.len}if(!ot)return ot}while(!0);return!0}function ye(w,S){var y=new U(w);y.new_text(S);var F=0;do{var z=y.get_tokens(F);if(z===null)break;var X=J(w,z,0,w.__get_max_priority(),!1);if(X.type!==A){var Z=X.len,ie=Z;if(z[Z]&&z[Z].name==="atom"&&z[Z].raw===".")w.add_goal(Pe(X.value));else{var Se=z[Z];return new H("throw",[x.error.syntax(Se||z[Z-1],". or operator expected",!Se)])}F=X.len+1}else return new H("throw",[X.value])}while(!0);return!0}function ae(w,S){w=w.rename(S);var y=S.next_free_variable(),F=we(w.body,y,S);return F.error?F.value:(w.body=F.value,w.head.args=w.head.args.concat([y,F.variable]),w.head=new H(w.head.id,w.head.args),w)}function we(w,S,y){var F;if(x.type.is_term(w)&&w.indicator==="!/0")return{value:w,variable:S,error:!1};if(x.type.is_term(w)&&w.indicator===",/2"){var z=we(w.args[0],S,y);if(z.error)return z;var X=we(w.args[1],z.variable,y);return X.error?X:{value:new H(",",[z.value,X.value]),variable:X.variable,error:!1}}else{if(x.type.is_term(w)&&w.indicator==="{}/1")return{value:w.args[0],variable:S,error:!1};if(x.type.is_empty_list(w))return{value:new H("true",[]),variable:S,error:!1};if(x.type.is_list(w)){F=y.next_free_variable();for(var Z=w,ie;Z.indicator==="./2";)ie=Z,Z=Z.args[1];return x.type.is_variable(Z)?{value:x.error.instantiation("DCG"),variable:S,error:!0}:x.type.is_empty_list(Z)?(ie.args[1]=F,{value:new H("=",[S,w]),variable:F,error:!1}):{value:x.error.type("list",w,"DCG"),variable:S,error:!0}}else return x.type.is_callable(w)?(F=y.next_free_variable(),w.args=w.args.concat([S,F]),w=new H(w.id,w.args),{value:w,variable:F,error:!1}):{value:x.error.type("callable",w,"DCG"),variable:S,error:!0}}}function Pe(w){return x.type.is_variable(w)?new H("call",[w]):x.type.is_term(w)&&[",/2",";/2","->/2"].indexOf(w.indicator)!==-1?new H(w.id,[Pe(w.args[0]),Pe(w.args[1])]):w}function g(w,S){for(var y=S||new x.type.Term("[]",[]),F=w.length-1;F>=0;F--)y=new x.type.Term(".",[w[F],y]);return y}function Ee(w,S){for(var y=w.length-1;y>=0;y--)w[y]===S&&w.splice(y,1)}function De(w){for(var S={},y=[],F=0;F=0;S--)if(w.charAt(S)==="/")return new H("/",[new H(w.substring(0,S)),new ke(parseInt(w.substring(S+1)),!1)])}function Ie(w){this.id=w}function ke(w,S){this.is_float=S!==void 0?S:parseInt(w)!==w,this.value=this.is_float?w:parseInt(w)}var ht=0;function H(w,S,y){this.ref=y||++ht,this.id=w,this.args=S||[],this.indicator=w+"/"+this.args.length}var lt=0;function Re(w,S,y,F,z,X){this.id=lt++,this.stream=w,this.mode=S,this.alias=y,this.type=F!==void 0?F:"text",this.reposition=z!==void 0?z:!0,this.eof_action=X!==void 0?X:"eof_code",this.position=this.mode==="append"?"end_of_stream":0,this.output=this.mode==="write"||this.mode==="append",this.input=this.mode==="read"}function Qe(w){w=w||{},this.links=w}function be(w,S,y){S=S||new Qe,y=y||null,this.goal=w,this.substitution=S,this.parent=y}function _e(w,S,y){this.head=w,this.body=S,this.dynamic=y||!1}function Te(w){w=w===void 0||w<=0?1e3:w,this.rules={},this.src_predicates={},this.rename=0,this.modules=[],this.thread=new Je(this),this.total_threads=1,this.renamed_variables={},this.public_predicates={},this.multifile_predicates={},this.limit=w,this.streams={user_input:new Re(typeof hl<"u"&&hl.exports?nodejs_user_input:tau_user_input,"read","user_input","text",!1,"reset"),user_output:new Re(typeof hl<"u"&&hl.exports?nodejs_user_output:tau_user_output,"write","user_output","text",!1,"eof_code")},this.file_system=typeof hl<"u"&&hl.exports?nodejs_file_system:tau_file_system,this.standard_input=this.streams.user_input,this.standard_output=this.streams.user_output,this.current_input=this.streams.user_input,this.current_output=this.streams.user_output,this.format_success=function(S){return S.substitution},this.format_error=function(S){return S.goal},this.flag={bounded:x.flag.bounded.value,max_integer:x.flag.max_integer.value,min_integer:x.flag.min_integer.value,integer_rounding_function:x.flag.integer_rounding_function.value,char_conversion:x.flag.char_conversion.value,debug:x.flag.debug.value,max_arity:x.flag.max_arity.value,unknown:x.flag.unknown.value,double_quotes:x.flag.double_quotes.value,occurs_check:x.flag.occurs_check.value,dialect:x.flag.dialect.value,version_data:x.flag.version_data.value,nodejs:x.flag.nodejs.value},this.__loaded_modules=[],this.__char_conversion={},this.__operators={1200:{":-":["fx","xfx"],"-->":["xfx"],"?-":["fx"]},1100:{";":["xfy"]},1050:{"->":["xfy"]},1e3:{",":["xfy"]},900:{"\\+":["fy"]},700:{"=":["xfx"],"\\=":["xfx"],"==":["xfx"],"\\==":["xfx"],"@<":["xfx"],"@=<":["xfx"],"@>":["xfx"],"@>=":["xfx"],"=..":["xfx"],is:["xfx"],"=:=":["xfx"],"=\\=":["xfx"],"<":["xfx"],"=<":["xfx"],">":["xfx"],">=":["xfx"]},600:{":":["xfy"]},500:{"+":["yfx"],"-":["yfx"],"/\\":["yfx"],"\\/":["yfx"]},400:{"*":["yfx"],"/":["yfx"],"//":["yfx"],rem:["yfx"],mod:["yfx"],"<<":["yfx"],">>":["yfx"]},200:{"**":["xfx"],"^":["xfy"],"-":["fy"],"+":["fy"],"\\":["fy"]}}}function Je(w){this.epoch=Date.now(),this.session=w,this.session.total_threads++,this.total_steps=0,this.cpu_time=0,this.cpu_time_last=0,this.points=[],this.debugger=!1,this.debugger_states=[],this.level="top_level/0",this.__calls=[],this.current_limit=this.session.limit,this.warnings=[]}function He(w,S,y){this.id=w,this.rules=S,this.exports=y,x.module[w]=this}He.prototype.exports_predicate=function(w){return this.exports.indexOf(w)!==-1},Ie.prototype.unify=function(w,S){if(S&&e(w.variables(),this.id)!==-1&&!x.type.is_variable(w))return null;var y={};return y[this.id]=w,new Qe(y)},ke.prototype.unify=function(w,S){return x.type.is_number(w)&&this.value===w.value&&this.is_float===w.is_float?new Qe:null},H.prototype.unify=function(w,S){if(x.type.is_term(w)&&this.indicator===w.indicator){for(var y=new Qe,F=0;F=0){var F=this.args[0].value,z=Math.floor(F/26),X=F%26;return"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[X]+(z!==0?z:"")}switch(this.indicator){case"[]/0":case"{}/0":case"!/0":return this.id;case"{}/1":return"{"+this.args[0].toString(w)+"}";case"./2":for(var Z="["+this.args[0].toString(w),ie=this.args[1];ie.indicator==="./2";)Z+=", "+ie.args[0].toString(w),ie=ie.args[1];return ie.indicator!=="[]/0"&&(Z+="|"+ie.toString(w)),Z+="]",Z;case",/2":return"("+this.args[0].toString(w)+", "+this.args[1].toString(w)+")";default:var Se=this.id,Ne=w.session?w.session.lookup_operator(this.id,this.args.length):null;if(w.session===void 0||w.ignore_ops||Ne===null)return w.quoted&&!/^(!|,|;|[a-z][0-9a-zA-Z_]*)$/.test(Se)&&Se!=="{}"&&Se!=="[]"&&(Se="'"+b(Se)+"'"),Se+(this.args.length?"("+o(this.args,function($t){return $t.toString(w)}).join(", ")+")":"");var ot=Ne.priority>S.priority||Ne.priority===S.priority&&(Ne.class==="xfy"&&this.indicator!==S.indicator||Ne.class==="yfx"&&this.indicator!==S.indicator||this.indicator===S.indicator&&Ne.class==="yfx"&&y==="right"||this.indicator===S.indicator&&Ne.class==="xfy"&&y==="left");Ne.indicator=this.indicator;var dt=ot?"(":"",jt=ot?")":"";return this.args.length===0?"("+this.id+")":["fy","fx"].indexOf(Ne.class)!==-1?dt+Se+" "+this.args[0].toString(w,Ne)+jt:["yf","xf"].indexOf(Ne.class)!==-1?dt+this.args[0].toString(w,Ne)+" "+Se+jt:dt+this.args[0].toString(w,Ne,"left")+" "+this.id+" "+this.args[1].toString(w,Ne,"right")+jt}},Re.prototype.toString=function(w){return"("+this.id+")"},Qe.prototype.toString=function(w){var S="{";for(var y in this.links)!this.links.hasOwnProperty(y)||(S!=="{"&&(S+=", "),S+=y+"/"+this.links[y].toString(w));return S+="}",S},be.prototype.toString=function(w){return this.goal===null?"<"+this.substitution.toString(w)+">":"<"+this.goal.toString(w)+", "+this.substitution.toString(w)+">"},_e.prototype.toString=function(w){return this.body?this.head.toString(w)+" :- "+this.body.toString(w)+".":this.head.toString(w)+"."},Te.prototype.toString=function(w){for(var S="",y=0;y=0;z--)F=new H(".",[S[z],F]);return F}return new H(this.id,o(this.args,function(X){return X.apply(w)}),this.ref)},Re.prototype.apply=function(w){return this},_e.prototype.apply=function(w){return new _e(this.head.apply(w),this.body!==null?this.body.apply(w):null)},Qe.prototype.apply=function(w){var S,y={};for(S in this.links)!this.links.hasOwnProperty(S)||(y[S]=this.links[S].apply(w));return new Qe(y)},H.prototype.select=function(){for(var w=this;w.indicator===",/2";)w=w.args[0];return w},H.prototype.replace=function(w){return this.indicator===",/2"?this.args[0].indicator===",/2"?new H(",",[this.args[0].replace(w),this.args[1]]):w===null?this.args[1]:new H(",",[w,this.args[1]]):w},H.prototype.search=function(w){if(x.type.is_term(w)&&w.ref!==void 0&&this.ref===w.ref)return!0;for(var S=0;SS&&F0&&(S=this.head_point().substitution.domain());e(S,x.format_variable(this.session.rename))!==-1;)this.session.rename++;if(w.id==="_")return new Ie(x.format_variable(this.session.rename));this.session.renamed_variables[w.id]=x.format_variable(this.session.rename)}return new Ie(this.session.renamed_variables[w.id])},Te.prototype.next_free_variable=function(){return this.thread.next_free_variable()},Je.prototype.next_free_variable=function(){this.session.rename++;var w=[];for(this.points.length>0&&(w=this.head_point().substitution.domain());e(w,x.format_variable(this.session.rename))!==-1;)this.session.rename++;return new Ie(x.format_variable(this.session.rename))},Te.prototype.is_public_predicate=function(w){return!this.public_predicates.hasOwnProperty(w)||this.public_predicates[w]===!0},Je.prototype.is_public_predicate=function(w){return this.session.is_public_predicate(w)},Te.prototype.is_multifile_predicate=function(w){return this.multifile_predicates.hasOwnProperty(w)&&this.multifile_predicates[w]===!0},Je.prototype.is_multifile_predicate=function(w){return this.session.is_multifile_predicate(w)},Te.prototype.prepend=function(w){return this.thread.prepend(w)},Je.prototype.prepend=function(w){for(var S=w.length-1;S>=0;S--)this.points.push(w[S])},Te.prototype.success=function(w,S){return this.thread.success(w,S)},Je.prototype.success=function(w,y){var y=typeof y>"u"?w:y;this.prepend([new be(w.goal.replace(null),w.substitution,y)])},Te.prototype.throw_error=function(w){return this.thread.throw_error(w)},Je.prototype.throw_error=function(w){this.prepend([new be(new H("throw",[w]),new Qe,null,null)])},Te.prototype.step_rule=function(w,S){return this.thread.step_rule(w,S)},Je.prototype.step_rule=function(w,S){var y=S.indicator;if(w==="user"&&(w=null),w===null&&this.session.rules.hasOwnProperty(y))return this.session.rules[y];for(var F=w===null?this.session.modules:e(this.session.modules,w)===-1?[]:[w],z=0;z1)&&this.again()},Te.prototype.answers=function(w,S,y){return this.thread.answers(w,S,y)},Je.prototype.answers=function(w,S,y){var F=S||1e3,z=this;if(S<=0){y&&y();return}this.answer(function(X){w(X),X!==!1?setTimeout(function(){z.answers(w,S-1,y)},1):y&&y()})},Te.prototype.again=function(w){return this.thread.again(w)},Je.prototype.again=function(w){for(var S,y=Date.now();this.__calls.length>0;){for(this.warnings=[],w!==!1&&(this.current_limit=this.session.limit);this.current_limit>0&&this.points.length>0&&this.head_point().goal!==null&&!x.type.is_error(this.head_point().goal);)if(this.current_limit--,this.step()===!0)return;var F=Date.now();this.cpu_time_last=F-y,this.cpu_time+=this.cpu_time_last;var z=this.__calls.shift();this.current_limit<=0?z(null):this.points.length===0?z(!1):x.type.is_error(this.head_point().goal)?(S=this.session.format_error(this.points.pop()),this.points=[],z(S)):(this.debugger&&this.debugger_states.push(this.head_point()),S=this.session.format_success(this.points.pop()),z(S))}},Te.prototype.unfold=function(w){if(w.body===null)return!1;var S=w.head,y=w.body,F=y.select(),z=new Je(this),X=[];z.add_goal(F),z.step();for(var Z=z.points.length-1;Z>=0;Z--){var ie=z.points[Z],Se=S.apply(ie.substitution),Ne=y.replace(ie.goal);Ne!==null&&(Ne=Ne.apply(ie.substitution)),X.push(new _e(Se,Ne))}var ot=this.rules[S.indicator],dt=e(ot,w);return X.length>0&&dt!==-1?(ot.splice.apply(ot,[dt,1].concat(X)),!0):!1},Je.prototype.unfold=function(w){return this.session.unfold(w)},Ie.prototype.interpret=function(w){return x.error.instantiation(w.level)},ke.prototype.interpret=function(w){return this},H.prototype.interpret=function(w){return x.type.is_unitary_list(this)?this.args[0].interpret(w):x.operate(w,this)},Ie.prototype.compare=function(w){return this.idw.id?1:0},ke.prototype.compare=function(w){if(this.value===w.value&&this.is_float===w.is_float)return 0;if(this.valuew.value)return 1},H.prototype.compare=function(w){if(this.args.lengthw.args.length||this.args.length===w.args.length&&this.id>w.id)return 1;for(var S=0;SF)return 1;if(w.constructor===ke){if(w.is_float&&S.is_float)return 0;if(w.is_float)return-1;if(S.is_float)return 1}return 0},is_substitution:function(w){return w instanceof Qe},is_state:function(w){return w instanceof be},is_rule:function(w){return w instanceof _e},is_variable:function(w){return w instanceof Ie},is_stream:function(w){return w instanceof Re},is_anonymous_var:function(w){return w instanceof Ie&&w.id==="_"},is_callable:function(w){return w instanceof H},is_number:function(w){return w instanceof ke},is_integer:function(w){return w instanceof ke&&!w.is_float},is_float:function(w){return w instanceof ke&&w.is_float},is_term:function(w){return w instanceof H},is_atom:function(w){return w instanceof H&&w.args.length===0},is_ground:function(w){if(w instanceof Ie)return!1;if(w instanceof H){for(var S=0;S0},is_list:function(w){return w instanceof H&&(w.indicator==="[]/0"||w.indicator==="./2")},is_empty_list:function(w){return w instanceof H&&w.indicator==="[]/0"},is_non_empty_list:function(w){return w instanceof H&&w.indicator==="./2"},is_fully_list:function(w){for(;w instanceof H&&w.indicator==="./2";)w=w.args[1];return w instanceof Ie||w instanceof H&&w.indicator==="[]/0"},is_instantiated_list:function(w){for(;w instanceof H&&w.indicator==="./2";)w=w.args[1];return w instanceof H&&w.indicator==="[]/0"},is_unitary_list:function(w){return w instanceof H&&w.indicator==="./2"&&w.args[1]instanceof H&&w.args[1].indicator==="[]/0"},is_character:function(w){return w instanceof H&&(w.id.length===1||w.id.length>0&&w.id.length<=2&&n(w.id,0)>=65536)},is_character_code:function(w){return w instanceof ke&&!w.is_float&&w.value>=0&&w.value<=1114111},is_byte:function(w){return w instanceof ke&&!w.is_float&&w.value>=0&&w.value<=255},is_operator:function(w){return w instanceof H&&x.arithmetic.evaluation[w.indicator]},is_directive:function(w){return w instanceof H&&x.directive[w.indicator]!==void 0},is_builtin:function(w){return w instanceof H&&x.predicate[w.indicator]!==void 0},is_error:function(w){return w instanceof H&&w.indicator==="throw/1"},is_predicate_indicator:function(w){return w instanceof H&&w.indicator==="//2"&&w.args[0]instanceof H&&w.args[0].args.length===0&&w.args[1]instanceof ke&&w.args[1].is_float===!1},is_flag:function(w){return w instanceof H&&w.args.length===0&&x.flag[w.id]!==void 0},is_value_flag:function(w,S){if(!x.type.is_flag(w))return!1;for(var y in x.flag[w.id].allowed)if(!!x.flag[w.id].allowed.hasOwnProperty(y)&&x.flag[w.id].allowed[y].equals(S))return!0;return!1},is_io_mode:function(w){return x.type.is_atom(w)&&["read","write","append"].indexOf(w.id)!==-1},is_stream_option:function(w){return x.type.is_term(w)&&(w.indicator==="alias/1"&&x.type.is_atom(w.args[0])||w.indicator==="reposition/1"&&x.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false")||w.indicator==="type/1"&&x.type.is_atom(w.args[0])&&(w.args[0].id==="text"||w.args[0].id==="binary")||w.indicator==="eof_action/1"&&x.type.is_atom(w.args[0])&&(w.args[0].id==="error"||w.args[0].id==="eof_code"||w.args[0].id==="reset"))},is_stream_position:function(w){return x.type.is_integer(w)&&w.value>=0||x.type.is_atom(w)&&(w.id==="end_of_stream"||w.id==="past_end_of_stream")},is_stream_property:function(w){return x.type.is_term(w)&&(w.indicator==="input/0"||w.indicator==="output/0"||w.indicator==="alias/1"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0]))||w.indicator==="file_name/1"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0]))||w.indicator==="position/1"&&(x.type.is_variable(w.args[0])||x.type.is_stream_position(w.args[0]))||w.indicator==="reposition/1"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false"))||w.indicator==="type/1"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0])&&(w.args[0].id==="text"||w.args[0].id==="binary"))||w.indicator==="mode/1"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0])&&(w.args[0].id==="read"||w.args[0].id==="write"||w.args[0].id==="append"))||w.indicator==="eof_action/1"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0])&&(w.args[0].id==="error"||w.args[0].id==="eof_code"||w.args[0].id==="reset"))||w.indicator==="end_of_stream/1"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0])&&(w.args[0].id==="at"||w.args[0].id==="past"||w.args[0].id==="not")))},is_streamable:function(w){return w.__proto__.stream!==void 0},is_read_option:function(w){return x.type.is_term(w)&&["variables/1","variable_names/1","singletons/1"].indexOf(w.indicator)!==-1},is_write_option:function(w){return x.type.is_term(w)&&(w.indicator==="quoted/1"&&x.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false")||w.indicator==="ignore_ops/1"&&x.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false")||w.indicator==="numbervars/1"&&x.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false"))},is_close_option:function(w){return x.type.is_term(w)&&w.indicator==="force/1"&&x.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false")},is_modifiable_flag:function(w){return x.type.is_flag(w)&&x.flag[w.id].changeable},is_module:function(w){return w instanceof H&&w.indicator==="library/1"&&w.args[0]instanceof H&&w.args[0].args.length===0&&x.module[w.args[0].id]!==void 0}},arithmetic:{evaluation:{"e/0":{type_args:null,type_result:!0,fn:function(w){return Math.E}},"pi/0":{type_args:null,type_result:!0,fn:function(w){return Math.PI}},"tau/0":{type_args:null,type_result:!0,fn:function(w){return 2*Math.PI}},"epsilon/0":{type_args:null,type_result:!0,fn:function(w){return Number.EPSILON}},"+/1":{type_args:null,type_result:null,fn:function(w,S){return w}},"-/1":{type_args:null,type_result:null,fn:function(w,S){return-w}},"\\/1":{type_args:!1,type_result:!1,fn:function(w,S){return~w}},"abs/1":{type_args:null,type_result:null,fn:function(w,S){return Math.abs(w)}},"sign/1":{type_args:null,type_result:null,fn:function(w,S){return Math.sign(w)}},"float_integer_part/1":{type_args:!0,type_result:!1,fn:function(w,S){return parseInt(w)}},"float_fractional_part/1":{type_args:!0,type_result:!0,fn:function(w,S){return w-parseInt(w)}},"float/1":{type_args:null,type_result:!0,fn:function(w,S){return parseFloat(w)}},"floor/1":{type_args:!0,type_result:!1,fn:function(w,S){return Math.floor(w)}},"truncate/1":{type_args:!0,type_result:!1,fn:function(w,S){return parseInt(w)}},"round/1":{type_args:!0,type_result:!1,fn:function(w,S){return Math.round(w)}},"ceiling/1":{type_args:!0,type_result:!1,fn:function(w,S){return Math.ceil(w)}},"sin/1":{type_args:null,type_result:!0,fn:function(w,S){return Math.sin(w)}},"cos/1":{type_args:null,type_result:!0,fn:function(w,S){return Math.cos(w)}},"tan/1":{type_args:null,type_result:!0,fn:function(w,S){return Math.tan(w)}},"asin/1":{type_args:null,type_result:!0,fn:function(w,S){return Math.asin(w)}},"acos/1":{type_args:null,type_result:!0,fn:function(w,S){return Math.acos(w)}},"atan/1":{type_args:null,type_result:!0,fn:function(w,S){return Math.atan(w)}},"atan2/2":{type_args:null,type_result:!0,fn:function(w,S,y){return Math.atan2(w,S)}},"exp/1":{type_args:null,type_result:!0,fn:function(w,S){return Math.exp(w)}},"sqrt/1":{type_args:null,type_result:!0,fn:function(w,S){return Math.sqrt(w)}},"log/1":{type_args:null,type_result:!0,fn:function(w,S){return w>0?Math.log(w):x.error.evaluation("undefined",S.__call_indicator)}},"+/2":{type_args:null,type_result:null,fn:function(w,S,y){return w+S}},"-/2":{type_args:null,type_result:null,fn:function(w,S,y){return w-S}},"*/2":{type_args:null,type_result:null,fn:function(w,S,y){return w*S}},"//2":{type_args:null,type_result:!0,fn:function(w,S,y){return S?w/S:x.error.evaluation("zero_division",y.__call_indicator)}},"///2":{type_args:!1,type_result:!1,fn:function(w,S,y){return S?parseInt(w/S):x.error.evaluation("zero_division",y.__call_indicator)}},"**/2":{type_args:null,type_result:!0,fn:function(w,S,y){return Math.pow(w,S)}},"^/2":{type_args:null,type_result:null,fn:function(w,S,y){return Math.pow(w,S)}},"<>/2":{type_args:!1,type_result:!1,fn:function(w,S,y){return w>>S}},"/\\/2":{type_args:!1,type_result:!1,fn:function(w,S,y){return w&S}},"\\//2":{type_args:!1,type_result:!1,fn:function(w,S,y){return w|S}},"xor/2":{type_args:!1,type_result:!1,fn:function(w,S,y){return w^S}},"rem/2":{type_args:!1,type_result:!1,fn:function(w,S,y){return S?w%S:x.error.evaluation("zero_division",y.__call_indicator)}},"mod/2":{type_args:!1,type_result:!1,fn:function(w,S,y){return S?w-parseInt(w/S)*S:x.error.evaluation("zero_division",y.__call_indicator)}},"max/2":{type_args:null,type_result:null,fn:function(w,S,y){return Math.max(w,S)}},"min/2":{type_args:null,type_result:null,fn:function(w,S,y){return Math.min(w,S)}}}},directive:{"dynamic/1":function(w,S){var y=S.args[0];if(x.type.is_variable(y))w.throw_error(x.error.instantiation(S.indicator));else if(!x.type.is_compound(y)||y.indicator!=="//2")w.throw_error(x.error.type("predicate_indicator",y,S.indicator));else if(x.type.is_variable(y.args[0])||x.type.is_variable(y.args[1]))w.throw_error(x.error.instantiation(S.indicator));else if(!x.type.is_atom(y.args[0]))w.throw_error(x.error.type("atom",y.args[0],S.indicator));else if(!x.type.is_integer(y.args[1]))w.throw_error(x.error.type("integer",y.args[1],S.indicator));else{var F=S.args[0].args[0].id+"/"+S.args[0].args[1].value;w.session.public_predicates[F]=!0,w.session.rules[F]||(w.session.rules[F]=[])}},"multifile/1":function(w,S){var y=S.args[0];x.type.is_variable(y)?w.throw_error(x.error.instantiation(S.indicator)):!x.type.is_compound(y)||y.indicator!=="//2"?w.throw_error(x.error.type("predicate_indicator",y,S.indicator)):x.type.is_variable(y.args[0])||x.type.is_variable(y.args[1])?w.throw_error(x.error.instantiation(S.indicator)):x.type.is_atom(y.args[0])?x.type.is_integer(y.args[1])?w.session.multifile_predicates[S.args[0].args[0].id+"/"+S.args[0].args[1].value]=!0:w.throw_error(x.error.type("integer",y.args[1],S.indicator)):w.throw_error(x.error.type("atom",y.args[0],S.indicator))},"set_prolog_flag/2":function(w,S){var y=S.args[0],F=S.args[1];x.type.is_variable(y)||x.type.is_variable(F)?w.throw_error(x.error.instantiation(S.indicator)):x.type.is_atom(y)?x.type.is_flag(y)?x.type.is_value_flag(y,F)?x.type.is_modifiable_flag(y)?w.session.flag[y.id]=F:w.throw_error(x.error.permission("modify","flag",y)):w.throw_error(x.error.domain("flag_value",new H("+",[y,F]),S.indicator)):w.throw_error(x.error.domain("prolog_flag",y,S.indicator)):w.throw_error(x.error.type("atom",y,S.indicator))},"use_module/1":function(w,S){var y=S.args[0];if(x.type.is_variable(y))w.throw_error(x.error.instantiation(S.indicator));else if(!x.type.is_term(y))w.throw_error(x.error.type("term",y,S.indicator));else if(x.type.is_module(y)){var F=y.args[0].id;e(w.session.modules,F)===-1&&w.session.modules.push(F)}},"char_conversion/2":function(w,S){var y=S.args[0],F=S.args[1];x.type.is_variable(y)||x.type.is_variable(F)?w.throw_error(x.error.instantiation(S.indicator)):x.type.is_character(y)?x.type.is_character(F)?y.id===F.id?delete w.session.__char_conversion[y.id]:w.session.__char_conversion[y.id]=F.id:w.throw_error(x.error.type("character",F,S.indicator)):w.throw_error(x.error.type("character",y,S.indicator))},"op/3":function(w,S){var y=S.args[0],F=S.args[1],z=S.args[2];if(x.type.is_variable(y)||x.type.is_variable(F)||x.type.is_variable(z))w.throw_error(x.error.instantiation(S.indicator));else if(!x.type.is_integer(y))w.throw_error(x.error.type("integer",y,S.indicator));else if(!x.type.is_atom(F))w.throw_error(x.error.type("atom",F,S.indicator));else if(!x.type.is_atom(z))w.throw_error(x.error.type("atom",z,S.indicator));else if(y.value<0||y.value>1200)w.throw_error(x.error.domain("operator_priority",y,S.indicator));else if(z.id===",")w.throw_error(x.error.permission("modify","operator",z,S.indicator));else if(z.id==="|"&&(y.value<1001||F.id.length!==3))w.throw_error(x.error.permission("modify","operator",z,S.indicator));else if(["fy","fx","yf","xf","xfx","yfx","xfy"].indexOf(F.id)===-1)w.throw_error(x.error.domain("operator_specifier",F,S.indicator));else{var X={prefix:null,infix:null,postfix:null};for(var Z in w.session.__operators)if(!!w.session.__operators.hasOwnProperty(Z)){var ie=w.session.__operators[Z][z.id];ie&&(e(ie,"fx")!==-1&&(X.prefix={priority:Z,type:"fx"}),e(ie,"fy")!==-1&&(X.prefix={priority:Z,type:"fy"}),e(ie,"xf")!==-1&&(X.postfix={priority:Z,type:"xf"}),e(ie,"yf")!==-1&&(X.postfix={priority:Z,type:"yf"}),e(ie,"xfx")!==-1&&(X.infix={priority:Z,type:"xfx"}),e(ie,"xfy")!==-1&&(X.infix={priority:Z,type:"xfy"}),e(ie,"yfx")!==-1&&(X.infix={priority:Z,type:"yfx"}))}var Se;switch(F.id){case"fy":case"fx":Se="prefix";break;case"yf":case"xf":Se="postfix";break;default:Se="infix";break}if(((X.prefix&&Se==="prefix"||X.postfix&&Se==="postfix"||X.infix&&Se==="infix")&&X[Se].type!==F.id||X.infix&&Se==="postfix"||X.postfix&&Se==="infix")&&y.value!==0)w.throw_error(x.error.permission("create","operator",z,S.indicator));else return X[Se]&&(Ee(w.session.__operators[X[Se].priority][z.id],F.id),w.session.__operators[X[Se].priority][z.id].length===0&&delete w.session.__operators[X[Se].priority][z.id]),y.value>0&&(w.session.__operators[y.value]||(w.session.__operators[y.value.toString()]={}),w.session.__operators[y.value][z.id]||(w.session.__operators[y.value][z.id]=[]),w.session.__operators[y.value][z.id].push(F.id)),!0}}},predicate:{"op/3":function(w,S,y){x.directive["op/3"](w,y)&&w.success(S)},"current_op/3":function(w,S,y){var F=y.args[0],z=y.args[1],X=y.args[2],Z=[];for(var ie in w.session.__operators)for(var Se in w.session.__operators[ie])for(var Ne=0;Ne/2"){var F=w.points,z=w.session.format_success,X=w.session.format_error;w.session.format_success=function(Ne){return Ne.substitution},w.session.format_error=function(Ne){return Ne.goal},w.points=[new be(y.args[0].args[0],S.substitution,S)];var Z=function(Ne){w.points=F,w.session.format_success=z,w.session.format_error=X,Ne===!1?w.prepend([new be(S.goal.replace(y.args[1]),S.substitution,S)]):x.type.is_error(Ne)?w.throw_error(Ne.args[0]):Ne===null?(w.prepend([S]),w.__calls.shift()(null)):w.prepend([new be(S.goal.replace(y.args[0].args[1]).apply(Ne),S.substitution.apply(Ne),S)])};w.__calls.unshift(Z)}else{var ie=new be(S.goal.replace(y.args[0]),S.substitution,S),Se=new be(S.goal.replace(y.args[1]),S.substitution,S);w.prepend([ie,Se])}},"!/0":function(w,S,y){var F,z,X=[];for(F=S,z=null;F.parent!==null&&F.parent.goal.search(y);)if(z=F,F=F.parent,F.goal!==null){var Z=F.goal.select();if(Z&&Z.id==="call"&&Z.search(y)){F=z;break}}for(var ie=w.points.length-1;ie>=0;ie--){for(var Se=w.points[ie],Ne=Se.parent;Ne!==null&&Ne!==F.parent;)Ne=Ne.parent;Ne===null&&Ne!==F.parent&&X.push(Se)}w.points=X.reverse(),w.success(S)},"\\+/1":function(w,S,y){var F=y.args[0];x.type.is_variable(F)?w.throw_error(x.error.instantiation(w.level)):x.type.is_callable(F)?w.prepend([new be(S.goal.replace(new H(",",[new H(",",[new H("call",[F]),new H("!",[])]),new H("fail",[])])),S.substitution,S),new be(S.goal.replace(null),S.substitution,S)]):w.throw_error(x.error.type("callable",F,w.level))},"->/2":function(w,S,y){var F=S.goal.replace(new H(",",[y.args[0],new H(",",[new H("!"),y.args[1]])]));w.prepend([new be(F,S.substitution,S)])},"fail/0":function(w,S,y){},"false/0":function(w,S,y){},"true/0":function(w,S,y){w.success(S)},"call/1":ne(1),"call/2":ne(2),"call/3":ne(3),"call/4":ne(4),"call/5":ne(5),"call/6":ne(6),"call/7":ne(7),"call/8":ne(8),"once/1":function(w,S,y){var F=y.args[0];w.prepend([new be(S.goal.replace(new H(",",[new H("call",[F]),new H("!",[])])),S.substitution,S)])},"forall/2":function(w,S,y){var F=y.args[0],z=y.args[1];w.prepend([new be(S.goal.replace(new H("\\+",[new H(",",[new H("call",[F]),new H("\\+",[new H("call",[z])])])])),S.substitution,S)])},"repeat/0":function(w,S,y){w.prepend([new be(S.goal.replace(null),S.substitution,S),S])},"throw/1":function(w,S,y){x.type.is_variable(y.args[0])?w.throw_error(x.error.instantiation(w.level)):w.throw_error(y.args[0])},"catch/3":function(w,S,y){var F=w.points;w.points=[],w.prepend([new be(y.args[0],S.substitution,S)]);var z=w.session.format_success,X=w.session.format_error;w.session.format_success=function(ie){return ie.substitution},w.session.format_error=function(ie){return ie.goal};var Z=function(ie){var Se=w.points;if(w.points=F,w.session.format_success=z,w.session.format_error=X,x.type.is_error(ie)){for(var Ne=[],ot=w.points.length-1;ot>=0;ot--){for(var $t=w.points[ot],dt=$t.parent;dt!==null&&dt!==S.parent;)dt=dt.parent;dt===null&&dt!==S.parent&&Ne.push($t)}w.points=Ne;var jt=w.get_flag("occurs_check").indicator==="true/0",$t=new be,xt=x.unify(ie.args[0],y.args[1],jt);xt!==null?($t.substitution=S.substitution.apply(xt),$t.goal=S.goal.replace(y.args[2]).apply(xt),$t.parent=S,w.prepend([$t])):w.throw_error(ie.args[0])}else if(ie!==!1){for(var an=ie===null?[]:[new be(S.goal.apply(ie).replace(null),S.substitution.apply(ie),S)],Qr=[],ot=Se.length-1;ot>=0;ot--){Qr.push(Se[ot]);var mr=Se[ot].goal!==null?Se[ot].goal.select():null;if(x.type.is_term(mr)&&mr.indicator==="!/0")break}var xr=o(Qr,function(Wr){return Wr.goal===null&&(Wr.goal=new H("true",[])),Wr=new be(S.goal.replace(new H("catch",[Wr.goal,y.args[1],y.args[2]])),S.substitution.apply(Wr.substitution),Wr.parent),Wr.exclude=y.args[0].variables(),Wr}).reverse();w.prepend(xr),w.prepend(an),ie===null&&(this.current_limit=0,w.__calls.shift()(null))}};w.__calls.unshift(Z)},"=/2":function(w,S,y){var F=w.get_flag("occurs_check").indicator==="true/0",z=new be,X=x.unify(y.args[0],y.args[1],F);X!==null&&(z.goal=S.goal.apply(X).replace(null),z.substitution=S.substitution.apply(X),z.parent=S,w.prepend([z]))},"unify_with_occurs_check/2":function(w,S,y){var F=new be,z=x.unify(y.args[0],y.args[1],!0);z!==null&&(F.goal=S.goal.apply(z).replace(null),F.substitution=S.substitution.apply(z),F.parent=S,w.prepend([F]))},"\\=/2":function(w,S,y){var F=w.get_flag("occurs_check").indicator==="true/0",z=x.unify(y.args[0],y.args[1],F);z===null&&w.success(S)},"subsumes_term/2":function(w,S,y){var F=w.get_flag("occurs_check").indicator==="true/0",z=x.unify(y.args[1],y.args[0],F);z!==null&&y.args[1].apply(z).equals(y.args[1])&&w.success(S)},"findall/3":function(w,S,y){var F=y.args[0],z=y.args[1],X=y.args[2];if(x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(z))w.throw_error(x.error.type("callable",z,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_list(X))w.throw_error(x.error.type("list",X,y.indicator));else{var Z=w.next_free_variable(),ie=new H(",",[z,new H("=",[Z,F])]),Se=w.points,Ne=w.session.limit,ot=w.session.format_success;w.session.format_success=function($t){return $t.substitution},w.add_goal(ie,!0,S);var dt=[],jt=function($t){if($t!==!1&&$t!==null&&!x.type.is_error($t))w.__calls.unshift(jt),dt.push($t.links[Z.id]),w.session.limit=w.current_limit;else if(w.points=Se,w.session.limit=Ne,w.session.format_success=ot,x.type.is_error($t))w.throw_error($t.args[0]);else if(w.current_limit>0){for(var xt=new H("[]"),an=dt.length-1;an>=0;an--)xt=new H(".",[dt[an],xt]);w.prepend([new be(S.goal.replace(new H("=",[X,xt])),S.substitution,S)])}};w.__calls.unshift(jt)}},"bagof/3":function(w,S,y){var F,z=y.args[0],X=y.args[1],Z=y.args[2];if(x.type.is_variable(X))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(X))w.throw_error(x.error.type("callable",X,y.indicator));else if(!x.type.is_variable(Z)&&!x.type.is_list(Z))w.throw_error(x.error.type("list",Z,y.indicator));else{var ie=w.next_free_variable(),Se;X.indicator==="^/2"?(Se=X.args[0].variables(),X=X.args[1]):Se=[],Se=Se.concat(z.variables());for(var Ne=X.variables().filter(function(xr){return e(Se,xr)===-1}),ot=new H("[]"),dt=Ne.length-1;dt>=0;dt--)ot=new H(".",[new Ie(Ne[dt]),ot]);var jt=new H(",",[X,new H("=",[ie,new H(",",[ot,z])])]),$t=w.points,xt=w.session.limit,an=w.session.format_success;w.session.format_success=function(xr){return xr.substitution},w.add_goal(jt,!0,S);var Qr=[],mr=function(xr){if(xr!==!1&&xr!==null&&!x.type.is_error(xr)){w.__calls.unshift(mr);var Wr=!1,Vn=xr.links[ie.id].args[0],Ns=xr.links[ie.id].args[1];for(var Ri in Qr)if(!!Qr.hasOwnProperty(Ri)){var ps=Qr[Ri];if(ps.variables.equals(Vn)){ps.answers.push(Ns),Wr=!0;break}}Wr||Qr.push({variables:Vn,answers:[Ns]}),w.session.limit=w.current_limit}else if(w.points=$t,w.session.limit=xt,w.session.format_success=an,x.type.is_error(xr))w.throw_error(xr.args[0]);else if(w.current_limit>0){for(var io=[],Si=0;Si=0;so--)Ls=new H(".",[xr[so],Ls]);io.push(new be(S.goal.replace(new H(",",[new H("=",[ot,Qr[Si].variables]),new H("=",[Z,Ls])])),S.substitution,S))}w.prepend(io)}};w.__calls.unshift(mr)}},"setof/3":function(w,S,y){var F,z=y.args[0],X=y.args[1],Z=y.args[2];if(x.type.is_variable(X))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(X))w.throw_error(x.error.type("callable",X,y.indicator));else if(!x.type.is_variable(Z)&&!x.type.is_list(Z))w.throw_error(x.error.type("list",Z,y.indicator));else{var ie=w.next_free_variable(),Se;X.indicator==="^/2"?(Se=X.args[0].variables(),X=X.args[1]):Se=[],Se=Se.concat(z.variables());for(var Ne=X.variables().filter(function(xr){return e(Se,xr)===-1}),ot=new H("[]"),dt=Ne.length-1;dt>=0;dt--)ot=new H(".",[new Ie(Ne[dt]),ot]);var jt=new H(",",[X,new H("=",[ie,new H(",",[ot,z])])]),$t=w.points,xt=w.session.limit,an=w.session.format_success;w.session.format_success=function(xr){return xr.substitution},w.add_goal(jt,!0,S);var Qr=[],mr=function(xr){if(xr!==!1&&xr!==null&&!x.type.is_error(xr)){w.__calls.unshift(mr);var Wr=!1,Vn=xr.links[ie.id].args[0],Ns=xr.links[ie.id].args[1];for(var Ri in Qr)if(!!Qr.hasOwnProperty(Ri)){var ps=Qr[Ri];if(ps.variables.equals(Vn)){ps.answers.push(Ns),Wr=!0;break}}Wr||Qr.push({variables:Vn,answers:[Ns]}),w.session.limit=w.current_limit}else if(w.points=$t,w.session.limit=xt,w.session.format_success=an,x.type.is_error(xr))w.throw_error(xr.args[0]);else if(w.current_limit>0){for(var io=[],Si=0;Si=0;so--)Ls=new H(".",[xr[so],Ls]);io.push(new be(S.goal.replace(new H(",",[new H("=",[ot,Qr[Si].variables]),new H("=",[Z,Ls])])),S.substitution,S))}w.prepend(io)}};w.__calls.unshift(mr)}},"functor/3":function(w,S,y){var F,z=y.args[0],X=y.args[1],Z=y.args[2];if(x.type.is_variable(z)&&(x.type.is_variable(X)||x.type.is_variable(Z)))w.throw_error(x.error.instantiation("functor/3"));else if(!x.type.is_variable(Z)&&!x.type.is_integer(Z))w.throw_error(x.error.type("integer",y.args[2],"functor/3"));else if(!x.type.is_variable(X)&&!x.type.is_atomic(X))w.throw_error(x.error.type("atomic",y.args[1],"functor/3"));else if(x.type.is_integer(X)&&x.type.is_integer(Z)&&Z.value!==0)w.throw_error(x.error.type("atom",y.args[1],"functor/3"));else if(x.type.is_variable(z)){if(y.args[2].value>=0){for(var ie=[],Se=0;Se0&&F<=y.args[1].args.length){var z=new H("=",[y.args[1].args[F-1],y.args[2]]);w.prepend([new be(S.goal.replace(z),S.substitution,S)])}}},"=../2":function(w,S,y){var F;if(x.type.is_variable(y.args[0])&&(x.type.is_variable(y.args[1])||x.type.is_non_empty_list(y.args[1])&&x.type.is_variable(y.args[1].args[0])))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_fully_list(y.args[1]))w.throw_error(x.error.type("list",y.args[1],y.indicator));else if(x.type.is_variable(y.args[0])){if(!x.type.is_variable(y.args[1])){var X=[];for(F=y.args[1].args[1];F.indicator==="./2";)X.push(F.args[0]),F=F.args[1];x.type.is_variable(y.args[0])&&x.type.is_variable(F)?w.throw_error(x.error.instantiation(y.indicator)):X.length===0&&x.type.is_compound(y.args[1].args[0])?w.throw_error(x.error.type("atomic",y.args[1].args[0],y.indicator)):X.length>0&&(x.type.is_compound(y.args[1].args[0])||x.type.is_number(y.args[1].args[0]))?w.throw_error(x.error.type("atom",y.args[1].args[0],y.indicator)):X.length===0?w.prepend([new be(S.goal.replace(new H("=",[y.args[1].args[0],y.args[0]],S)),S.substitution,S)]):w.prepend([new be(S.goal.replace(new H("=",[new H(y.args[1].args[0].id,X),y.args[0]])),S.substitution,S)])}}else{if(x.type.is_atomic(y.args[0]))F=new H(".",[y.args[0],new H("[]")]);else{F=new H("[]");for(var z=y.args[0].args.length-1;z>=0;z--)F=new H(".",[y.args[0].args[z],F]);F=new H(".",[new H(y.args[0].id),F])}w.prepend([new be(S.goal.replace(new H("=",[F,y.args[1]])),S.substitution,S)])}},"copy_term/2":function(w,S,y){var F=y.args[0].rename(w);w.prepend([new be(S.goal.replace(new H("=",[F,y.args[1]])),S.substitution,S.parent)])},"term_variables/2":function(w,S,y){var F=y.args[0],z=y.args[1];if(!x.type.is_fully_list(z))w.throw_error(x.error.type("list",z,y.indicator));else{var X=g(o(De(F.variables()),function(Z){return new Ie(Z)}));w.prepend([new be(S.goal.replace(new H("=",[z,X])),S.substitution,S)])}},"clause/2":function(w,S,y){if(x.type.is_variable(y.args[0]))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))w.throw_error(x.error.type("callable",y.args[0],y.indicator));else if(!x.type.is_variable(y.args[1])&&!x.type.is_callable(y.args[1]))w.throw_error(x.error.type("callable",y.args[1],y.indicator));else if(w.session.rules[y.args[0].indicator]!==void 0)if(w.is_public_predicate(y.args[0].indicator)){var F=[];for(var z in w.session.rules[y.args[0].indicator])if(!!w.session.rules[y.args[0].indicator].hasOwnProperty(z)){var X=w.session.rules[y.args[0].indicator][z];w.session.renamed_variables={},X=X.rename(w),X.body===null&&(X.body=new H("true"));var Z=new H(",",[new H("=",[X.head,y.args[0]]),new H("=",[X.body,y.args[1]])]);F.push(new be(S.goal.replace(Z),S.substitution,S))}w.prepend(F)}else w.throw_error(x.error.permission("access","private_procedure",y.args[0].indicator,y.indicator))},"current_predicate/1":function(w,S,y){var F=y.args[0];if(!x.type.is_variable(F)&&(!x.type.is_compound(F)||F.indicator!=="//2"))w.throw_error(x.error.type("predicate_indicator",F,y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_variable(F.args[0])&&!x.type.is_atom(F.args[0]))w.throw_error(x.error.type("atom",F.args[0],y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_variable(F.args[1])&&!x.type.is_integer(F.args[1]))w.throw_error(x.error.type("integer",F.args[1],y.indicator));else{var z=[];for(var X in w.session.rules)if(!!w.session.rules.hasOwnProperty(X)){var Z=X.lastIndexOf("/"),ie=X.substr(0,Z),Se=parseInt(X.substr(Z+1,X.length-(Z+1))),Ne=new H("/",[new H(ie),new ke(Se,!1)]),ot=new H("=",[Ne,F]);z.push(new be(S.goal.replace(ot),S.substitution,S))}w.prepend(z)}},"asserta/1":function(w,S,y){if(x.type.is_variable(y.args[0]))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))w.throw_error(x.error.type("callable",y.args[0],y.indicator));else{var F,z;y.args[0].indicator===":-/2"?(F=y.args[0].args[0],z=Pe(y.args[0].args[1])):(F=y.args[0],z=null),x.type.is_callable(F)?z!==null&&!x.type.is_callable(z)?w.throw_error(x.error.type("callable",z,y.indicator)):w.is_public_predicate(F.indicator)?(w.session.rules[F.indicator]===void 0&&(w.session.rules[F.indicator]=[]),w.session.public_predicates[F.indicator]=!0,w.session.rules[F.indicator]=[new _e(F,z,!0)].concat(w.session.rules[F.indicator]),w.success(S)):w.throw_error(x.error.permission("modify","static_procedure",F.indicator,y.indicator)):w.throw_error(x.error.type("callable",F,y.indicator))}},"assertz/1":function(w,S,y){if(x.type.is_variable(y.args[0]))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))w.throw_error(x.error.type("callable",y.args[0],y.indicator));else{var F,z;y.args[0].indicator===":-/2"?(F=y.args[0].args[0],z=Pe(y.args[0].args[1])):(F=y.args[0],z=null),x.type.is_callable(F)?z!==null&&!x.type.is_callable(z)?w.throw_error(x.error.type("callable",z,y.indicator)):w.is_public_predicate(F.indicator)?(w.session.rules[F.indicator]===void 0&&(w.session.rules[F.indicator]=[]),w.session.public_predicates[F.indicator]=!0,w.session.rules[F.indicator].push(new _e(F,z,!0)),w.success(S)):w.throw_error(x.error.permission("modify","static_procedure",F.indicator,y.indicator)):w.throw_error(x.error.type("callable",F,y.indicator))}},"retract/1":function(w,S,y){if(x.type.is_variable(y.args[0]))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))w.throw_error(x.error.type("callable",y.args[0],y.indicator));else{var F,z;if(y.args[0].indicator===":-/2"?(F=y.args[0].args[0],z=y.args[0].args[1]):(F=y.args[0],z=new H("true")),typeof S.retract>"u")if(w.is_public_predicate(F.indicator)){if(w.session.rules[F.indicator]!==void 0){for(var X=[],Z=0;Zw.get_flag("max_arity").value)w.throw_error(x.error.representation("max_arity",y.indicator));else{var F=y.args[0].args[0].id+"/"+y.args[0].args[1].value;w.is_public_predicate(F)?(delete w.session.rules[F],w.success(S)):w.throw_error(x.error.permission("modify","static_procedure",F,y.indicator))}},"atom_length/2":function(w,S,y){if(x.type.is_variable(y.args[0]))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_atom(y.args[0]))w.throw_error(x.error.type("atom",y.args[0],y.indicator));else if(!x.type.is_variable(y.args[1])&&!x.type.is_integer(y.args[1]))w.throw_error(x.error.type("integer",y.args[1],y.indicator));else if(x.type.is_integer(y.args[1])&&y.args[1].value<0)w.throw_error(x.error.domain("not_less_than_zero",y.args[1],y.indicator));else{var F=new ke(y.args[0].id.length,!1);w.prepend([new be(S.goal.replace(new H("=",[F,y.args[1]])),S.substitution,S)])}},"atom_concat/3":function(w,S,y){var F,z,X=y.args[0],Z=y.args[1],ie=y.args[2];if(x.type.is_variable(ie)&&(x.type.is_variable(X)||x.type.is_variable(Z)))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_atom(X))w.throw_error(x.error.type("atom",X,y.indicator));else if(!x.type.is_variable(Z)&&!x.type.is_atom(Z))w.throw_error(x.error.type("atom",Z,y.indicator));else if(!x.type.is_variable(ie)&&!x.type.is_atom(ie))w.throw_error(x.error.type("atom",ie,y.indicator));else{var Se=x.type.is_variable(X),Ne=x.type.is_variable(Z);if(!Se&&!Ne)z=new H("=",[ie,new H(X.id+Z.id)]),w.prepend([new be(S.goal.replace(z),S.substitution,S)]);else if(Se&&!Ne)F=ie.id.substr(0,ie.id.length-Z.id.length),F+Z.id===ie.id&&(z=new H("=",[X,new H(F)]),w.prepend([new be(S.goal.replace(z),S.substitution,S)]));else if(Ne&&!Se)F=ie.id.substr(X.id.length),X.id+F===ie.id&&(z=new H("=",[Z,new H(F)]),w.prepend([new be(S.goal.replace(z),S.substitution,S)]));else{for(var ot=[],dt=0;dt<=ie.id.length;dt++){var jt=new H(ie.id.substr(0,dt)),$t=new H(ie.id.substr(dt));z=new H(",",[new H("=",[jt,X]),new H("=",[$t,Z])]),ot.push(new be(S.goal.replace(z),S.substitution,S))}w.prepend(ot)}}},"sub_atom/5":function(w,S,y){var F,z=y.args[0],X=y.args[1],Z=y.args[2],ie=y.args[3],Se=y.args[4];if(x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_integer(X))w.throw_error(x.error.type("integer",X,y.indicator));else if(!x.type.is_variable(Z)&&!x.type.is_integer(Z))w.throw_error(x.error.type("integer",Z,y.indicator));else if(!x.type.is_variable(ie)&&!x.type.is_integer(ie))w.throw_error(x.error.type("integer",ie,y.indicator));else if(x.type.is_integer(X)&&X.value<0)w.throw_error(x.error.domain("not_less_than_zero",X,y.indicator));else if(x.type.is_integer(Z)&&Z.value<0)w.throw_error(x.error.domain("not_less_than_zero",Z,y.indicator));else if(x.type.is_integer(ie)&&ie.value<0)w.throw_error(x.error.domain("not_less_than_zero",ie,y.indicator));else{var Ne=[],ot=[],dt=[];if(x.type.is_variable(X))for(F=0;F<=z.id.length;F++)Ne.push(F);else Ne.push(X.value);if(x.type.is_variable(Z))for(F=0;F<=z.id.length;F++)ot.push(F);else ot.push(Z.value);if(x.type.is_variable(ie))for(F=0;F<=z.id.length;F++)dt.push(F);else dt.push(ie.value);var jt=[];for(var $t in Ne)if(!!Ne.hasOwnProperty($t)){F=Ne[$t];for(var xt in ot)if(!!ot.hasOwnProperty(xt)){var an=ot[xt],Qr=z.id.length-F-an;if(e(dt,Qr)!==-1&&F+an+Qr===z.id.length){var mr=z.id.substr(F,an);if(z.id===z.id.substr(0,F)+mr+z.id.substr(F+an,Qr)){var xr=new H("=",[new H(mr),Se]),Wr=new H("=",[X,new ke(F)]),Vn=new H("=",[Z,new ke(an)]),Ns=new H("=",[ie,new ke(Qr)]),Ri=new H(",",[new H(",",[new H(",",[Wr,Vn]),Ns]),xr]);jt.push(new be(S.goal.replace(Ri),S.substitution,S))}}}}w.prepend(jt)}},"atom_chars/2":function(w,S,y){var F=y.args[0],z=y.args[1];if(x.type.is_variable(F)&&x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_atom(F))w.throw_error(x.error.type("atom",F,y.indicator));else if(x.type.is_variable(F)){for(var ie=z,Se=x.type.is_variable(F),Ne="";ie.indicator==="./2";){if(x.type.is_character(ie.args[0]))Ne+=ie.args[0].id;else if(x.type.is_variable(ie.args[0])&&Se){w.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_variable(ie.args[0])){w.throw_error(x.error.type("character",ie.args[0],y.indicator));return}ie=ie.args[1]}x.type.is_variable(ie)&&Se?w.throw_error(x.error.instantiation(y.indicator)):!x.type.is_empty_list(ie)&&!x.type.is_variable(ie)?w.throw_error(x.error.type("list",z,y.indicator)):w.prepend([new be(S.goal.replace(new H("=",[new H(Ne),F])),S.substitution,S)])}else{for(var X=new H("[]"),Z=F.id.length-1;Z>=0;Z--)X=new H(".",[new H(F.id.charAt(Z)),X]);w.prepend([new be(S.goal.replace(new H("=",[z,X])),S.substitution,S)])}},"atom_codes/2":function(w,S,y){var F=y.args[0],z=y.args[1];if(x.type.is_variable(F)&&x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_atom(F))w.throw_error(x.error.type("atom",F,y.indicator));else if(x.type.is_variable(F)){for(var ie=z,Se=x.type.is_variable(F),Ne="";ie.indicator==="./2";){if(x.type.is_character_code(ie.args[0]))Ne+=u(ie.args[0].value);else if(x.type.is_variable(ie.args[0])&&Se){w.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_variable(ie.args[0])){w.throw_error(x.error.representation("character_code",y.indicator));return}ie=ie.args[1]}x.type.is_variable(ie)&&Se?w.throw_error(x.error.instantiation(y.indicator)):!x.type.is_empty_list(ie)&&!x.type.is_variable(ie)?w.throw_error(x.error.type("list",z,y.indicator)):w.prepend([new be(S.goal.replace(new H("=",[new H(Ne),F])),S.substitution,S)])}else{for(var X=new H("[]"),Z=F.id.length-1;Z>=0;Z--)X=new H(".",[new ke(n(F.id,Z),!1),X]);w.prepend([new be(S.goal.replace(new H("=",[z,X])),S.substitution,S)])}},"char_code/2":function(w,S,y){var F=y.args[0],z=y.args[1];if(x.type.is_variable(F)&&x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_character(F))w.throw_error(x.error.type("character",F,y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_integer(z))w.throw_error(x.error.type("integer",z,y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_character_code(z))w.throw_error(x.error.representation("character_code",y.indicator));else if(x.type.is_variable(z)){var X=new ke(n(F.id,0),!1);w.prepend([new be(S.goal.replace(new H("=",[X,z])),S.substitution,S)])}else{var Z=new H(u(z.value));w.prepend([new be(S.goal.replace(new H("=",[Z,F])),S.substitution,S)])}},"number_chars/2":function(w,S,y){var F,z=y.args[0],X=y.args[1];if(x.type.is_variable(z)&&x.type.is_variable(X))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_number(z))w.throw_error(x.error.type("number",z,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_list(X))w.throw_error(x.error.type("list",X,y.indicator));else{var Z=x.type.is_variable(z);if(!x.type.is_variable(X)){var ie=X,Se=!0;for(F="";ie.indicator==="./2";){if(x.type.is_character(ie.args[0]))F+=ie.args[0].id;else if(x.type.is_variable(ie.args[0]))Se=!1;else if(!x.type.is_variable(ie.args[0])){w.throw_error(x.error.type("character",ie.args[0],y.indicator));return}ie=ie.args[1]}if(Se=Se&&x.type.is_empty_list(ie),!x.type.is_empty_list(ie)&&!x.type.is_variable(ie)){w.throw_error(x.error.type("list",X,y.indicator));return}if(!Se&&Z){w.throw_error(x.error.instantiation(y.indicator));return}else if(Se)if(x.type.is_variable(ie)&&Z){w.throw_error(x.error.instantiation(y.indicator));return}else{var Ne=w.parse(F),ot=Ne.value;!x.type.is_number(ot)||Ne.tokens[Ne.tokens.length-1].space?w.throw_error(x.error.syntax_by_predicate("parseable_number",y.indicator)):w.prepend([new be(S.goal.replace(new H("=",[z,ot])),S.substitution,S)]);return}}if(!Z){F=z.toString();for(var dt=new H("[]"),jt=F.length-1;jt>=0;jt--)dt=new H(".",[new H(F.charAt(jt)),dt]);w.prepend([new be(S.goal.replace(new H("=",[X,dt])),S.substitution,S)])}}},"number_codes/2":function(w,S,y){var F,z=y.args[0],X=y.args[1];if(x.type.is_variable(z)&&x.type.is_variable(X))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_number(z))w.throw_error(x.error.type("number",z,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_list(X))w.throw_error(x.error.type("list",X,y.indicator));else{var Z=x.type.is_variable(z);if(!x.type.is_variable(X)){var ie=X,Se=!0;for(F="";ie.indicator==="./2";){if(x.type.is_character_code(ie.args[0]))F+=u(ie.args[0].value);else if(x.type.is_variable(ie.args[0]))Se=!1;else if(!x.type.is_variable(ie.args[0])){w.throw_error(x.error.type("character_code",ie.args[0],y.indicator));return}ie=ie.args[1]}if(Se=Se&&x.type.is_empty_list(ie),!x.type.is_empty_list(ie)&&!x.type.is_variable(ie)){w.throw_error(x.error.type("list",X,y.indicator));return}if(!Se&&Z){w.throw_error(x.error.instantiation(y.indicator));return}else if(Se)if(x.type.is_variable(ie)&&Z){w.throw_error(x.error.instantiation(y.indicator));return}else{var Ne=w.parse(F),ot=Ne.value;!x.type.is_number(ot)||Ne.tokens[Ne.tokens.length-1].space?w.throw_error(x.error.syntax_by_predicate("parseable_number",y.indicator)):w.prepend([new be(S.goal.replace(new H("=",[z,ot])),S.substitution,S)]);return}}if(!Z){F=z.toString();for(var dt=new H("[]"),jt=F.length-1;jt>=0;jt--)dt=new H(".",[new ke(n(F,jt),!1),dt]);w.prepend([new be(S.goal.replace(new H("=",[X,dt])),S.substitution,S)])}}},"upcase_atom/2":function(w,S,y){var F=y.args[0],z=y.args[1];x.type.is_variable(F)?w.throw_error(x.error.instantiation(y.indicator)):x.type.is_atom(F)?!x.type.is_variable(z)&&!x.type.is_atom(z)?w.throw_error(x.error.type("atom",z,y.indicator)):w.prepend([new be(S.goal.replace(new H("=",[z,new H(F.id.toUpperCase(),[])])),S.substitution,S)]):w.throw_error(x.error.type("atom",F,y.indicator))},"downcase_atom/2":function(w,S,y){var F=y.args[0],z=y.args[1];x.type.is_variable(F)?w.throw_error(x.error.instantiation(y.indicator)):x.type.is_atom(F)?!x.type.is_variable(z)&&!x.type.is_atom(z)?w.throw_error(x.error.type("atom",z,y.indicator)):w.prepend([new be(S.goal.replace(new H("=",[z,new H(F.id.toLowerCase(),[])])),S.substitution,S)]):w.throw_error(x.error.type("atom",F,y.indicator))},"atomic_list_concat/2":function(w,S,y){var F=y.args[0],z=y.args[1];w.prepend([new be(S.goal.replace(new H("atomic_list_concat",[F,new H("",[]),z])),S.substitution,S)])},"atomic_list_concat/3":function(w,S,y){var F=y.args[0],z=y.args[1],X=y.args[2];if(x.type.is_variable(z)||x.type.is_variable(F)&&x.type.is_variable(X))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_list(F))w.throw_error(x.error.type("list",F,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_atom(X))w.throw_error(x.error.type("atom",X,y.indicator));else if(x.type.is_variable(X)){for(var ie="",Se=F;x.type.is_term(Se)&&Se.indicator==="./2";){if(!x.type.is_atom(Se.args[0])&&!x.type.is_number(Se.args[0])){w.throw_error(x.error.type("atomic",Se.args[0],y.indicator));return}ie!==""&&(ie+=z.id),x.type.is_atom(Se.args[0])?ie+=Se.args[0].id:ie+=""+Se.args[0].value,Se=Se.args[1]}ie=new H(ie,[]),x.type.is_variable(Se)?w.throw_error(x.error.instantiation(y.indicator)):!x.type.is_term(Se)||Se.indicator!=="[]/0"?w.throw_error(x.error.type("list",F,y.indicator)):w.prepend([new be(S.goal.replace(new H("=",[ie,X])),S.substitution,S)])}else{var Z=g(o(X.id.split(z.id),function(Ne){return new H(Ne,[])}));w.prepend([new be(S.goal.replace(new H("=",[Z,F])),S.substitution,S)])}},"@=/2":function(w,S,y){x.compare(y.args[0],y.args[1])>0&&w.success(S)},"@>=/2":function(w,S,y){x.compare(y.args[0],y.args[1])>=0&&w.success(S)},"compare/3":function(w,S,y){var F=y.args[0],z=y.args[1],X=y.args[2];if(!x.type.is_variable(F)&&!x.type.is_atom(F))w.throw_error(x.error.type("atom",F,y.indicator));else if(x.type.is_atom(F)&&["<",">","="].indexOf(F.id)===-1)w.throw_error(x.type.domain("order",F,y.indicator));else{var Z=x.compare(z,X);Z=Z===0?"=":Z===-1?"<":">",w.prepend([new be(S.goal.replace(new H("=",[F,new H(Z,[])])),S.substitution,S)])}},"is/2":function(w,S,y){var F=y.args[1].interpret(w);x.type.is_number(F)?w.prepend([new be(S.goal.replace(new H("=",[y.args[0],F],w.level)),S.substitution,S)]):w.throw_error(F)},"between/3":function(w,S,y){var F=y.args[0],z=y.args[1],X=y.args[2];if(x.type.is_variable(F)||x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_integer(F))w.throw_error(x.error.type("integer",F,y.indicator));else if(!x.type.is_integer(z))w.throw_error(x.error.type("integer",z,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_integer(X))w.throw_error(x.error.type("integer",X,y.indicator));else if(x.type.is_variable(X)){var Z=[new be(S.goal.replace(new H("=",[X,F])),S.substitution,S)];F.value=X.value&&w.success(S)},"succ/2":function(w,S,y){var F=y.args[0],z=y.args[1];x.type.is_variable(F)&&x.type.is_variable(z)?w.throw_error(x.error.instantiation(y.indicator)):!x.type.is_variable(F)&&!x.type.is_integer(F)?w.throw_error(x.error.type("integer",F,y.indicator)):!x.type.is_variable(z)&&!x.type.is_integer(z)?w.throw_error(x.error.type("integer",z,y.indicator)):!x.type.is_variable(F)&&F.value<0?w.throw_error(x.error.domain("not_less_than_zero",F,y.indicator)):!x.type.is_variable(z)&&z.value<0?w.throw_error(x.error.domain("not_less_than_zero",z,y.indicator)):(x.type.is_variable(z)||z.value>0)&&(x.type.is_variable(F)?w.prepend([new be(S.goal.replace(new H("=",[F,new ke(z.value-1,!1)])),S.substitution,S)]):w.prepend([new be(S.goal.replace(new H("=",[z,new ke(F.value+1,!1)])),S.substitution,S)]))},"=:=/2":function(w,S,y){var F=x.arithmetic_compare(w,y.args[0],y.args[1]);x.type.is_term(F)?w.throw_error(F):F===0&&w.success(S)},"=\\=/2":function(w,S,y){var F=x.arithmetic_compare(w,y.args[0],y.args[1]);x.type.is_term(F)?w.throw_error(F):F!==0&&w.success(S)},"/2":function(w,S,y){var F=x.arithmetic_compare(w,y.args[0],y.args[1]);x.type.is_term(F)?w.throw_error(F):F>0&&w.success(S)},">=/2":function(w,S,y){var F=x.arithmetic_compare(w,y.args[0],y.args[1]);x.type.is_term(F)?w.throw_error(F):F>=0&&w.success(S)},"var/1":function(w,S,y){x.type.is_variable(y.args[0])&&w.success(S)},"atom/1":function(w,S,y){x.type.is_atom(y.args[0])&&w.success(S)},"atomic/1":function(w,S,y){x.type.is_atomic(y.args[0])&&w.success(S)},"compound/1":function(w,S,y){x.type.is_compound(y.args[0])&&w.success(S)},"integer/1":function(w,S,y){x.type.is_integer(y.args[0])&&w.success(S)},"float/1":function(w,S,y){x.type.is_float(y.args[0])&&w.success(S)},"number/1":function(w,S,y){x.type.is_number(y.args[0])&&w.success(S)},"nonvar/1":function(w,S,y){x.type.is_variable(y.args[0])||w.success(S)},"ground/1":function(w,S,y){y.variables().length===0&&w.success(S)},"acyclic_term/1":function(w,S,y){for(var F=S.substitution.apply(S.substitution),z=y.args[0].variables(),X=0;X0?xt[xt.length-1]:null,xt!==null&&(jt=J(w,xt,0,w.__get_max_priority(),!1))}if(jt.type===p&&jt.len===xt.length-1&&an.value==="."){jt=jt.value.rename(w);var Qr=new H("=",[z,jt]);if(ie.variables){var mr=g(o(De(jt.variables()),function(xr){return new Ie(xr)}));Qr=new H(",",[Qr,new H("=",[ie.variables,mr])])}if(ie.variable_names){var mr=g(o(De(jt.variables()),function(Wr){var Vn;for(Vn in w.session.renamed_variables)if(w.session.renamed_variables.hasOwnProperty(Vn)&&w.session.renamed_variables[Vn]===Wr)break;return new H("=",[new H(Vn,[]),new Ie(Wr)])}));Qr=new H(",",[Qr,new H("=",[ie.variable_names,mr])])}if(ie.singletons){var mr=g(o(new _e(jt,null).singleton_variables(),function(Wr){var Vn;for(Vn in w.session.renamed_variables)if(w.session.renamed_variables.hasOwnProperty(Vn)&&w.session.renamed_variables[Vn]===Wr)break;return new H("=",[new H(Vn,[]),new Ie(Wr)])}));Qr=new H(",",[Qr,new H("=",[ie.singletons,mr])])}w.prepend([new be(S.goal.replace(Qr),S.substitution,S)])}else jt.type===p?w.throw_error(x.error.syntax(xt[jt.len],"unexpected token",!1)):w.throw_error(jt.value)}}},"write/1":function(w,S,y){var F=y.args[0];w.prepend([new be(S.goal.replace(new H(",",[new H("current_output",[new Ie("S")]),new H("write",[new Ie("S"),F])])),S.substitution,S)])},"write/2":function(w,S,y){var F=y.args[0],z=y.args[1];w.prepend([new be(S.goal.replace(new H("write_term",[F,z,new H(".",[new H("quoted",[new H("false",[])]),new H(".",[new H("ignore_ops",[new H("false")]),new H(".",[new H("numbervars",[new H("true")]),new H("[]",[])])])])])),S.substitution,S)])},"writeq/1":function(w,S,y){var F=y.args[0];w.prepend([new be(S.goal.replace(new H(",",[new H("current_output",[new Ie("S")]),new H("writeq",[new Ie("S"),F])])),S.substitution,S)])},"writeq/2":function(w,S,y){var F=y.args[0],z=y.args[1];w.prepend([new be(S.goal.replace(new H("write_term",[F,z,new H(".",[new H("quoted",[new H("true",[])]),new H(".",[new H("ignore_ops",[new H("false")]),new H(".",[new H("numbervars",[new H("true")]),new H("[]",[])])])])])),S.substitution,S)])},"write_canonical/1":function(w,S,y){var F=y.args[0];w.prepend([new be(S.goal.replace(new H(",",[new H("current_output",[new Ie("S")]),new H("write_canonical",[new Ie("S"),F])])),S.substitution,S)])},"write_canonical/2":function(w,S,y){var F=y.args[0],z=y.args[1];w.prepend([new be(S.goal.replace(new H("write_term",[F,z,new H(".",[new H("quoted",[new H("true",[])]),new H(".",[new H("ignore_ops",[new H("true")]),new H(".",[new H("numbervars",[new H("false")]),new H("[]",[])])])])])),S.substitution,S)])},"write_term/2":function(w,S,y){var F=y.args[0],z=y.args[1];w.prepend([new be(S.goal.replace(new H(",",[new H("current_output",[new Ie("S")]),new H("write_term",[new Ie("S"),F,z])])),S.substitution,S)])},"write_term/3":function(w,S,y){var F=y.args[0],z=y.args[1],X=y.args[2],Z=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(x.type.is_variable(F)||x.type.is_variable(X))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_list(X))w.throw_error(x.error.type("list",X,y.indicator));else if(!x.type.is_stream(F)&&!x.type.is_atom(F))w.throw_error(x.error.domain("stream_or_alias",F,y.indicator));else if(!x.type.is_stream(Z)||Z.stream===null)w.throw_error(x.error.existence("stream",F,y.indicator));else if(Z.input)w.throw_error(x.error.permission("output","stream",F,y.indicator));else if(Z.type==="binary")w.throw_error(x.error.permission("output","binary_stream",F,y.indicator));else if(Z.position==="past_end_of_stream"&&Z.eof_action==="error")w.throw_error(x.error.permission("output","past_end_of_stream",F,y.indicator));else{for(var ie={},Se=X,Ne;x.type.is_term(Se)&&Se.indicator==="./2";){if(Ne=Se.args[0],x.type.is_variable(Ne)){w.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_write_option(Ne)){w.throw_error(x.error.domain("write_option",Ne,y.indicator));return}ie[Ne.id]=Ne.args[0].id==="true",Se=Se.args[1]}if(Se.indicator!=="[]/0"){x.type.is_variable(Se)?w.throw_error(x.error.instantiation(y.indicator)):w.throw_error(x.error.type("list",X,y.indicator));return}else{ie.session=w.session;var ot=z.toString(ie);Z.stream.put(ot,Z.position),typeof Z.position=="number"&&(Z.position+=ot.length),w.success(S)}}},"halt/0":function(w,S,y){w.points=[]},"halt/1":function(w,S,y){var F=y.args[0];x.type.is_variable(F)?w.throw_error(x.error.instantiation(y.indicator)):x.type.is_integer(F)?w.points=[]:w.throw_error(x.error.type("integer",F,y.indicator))},"current_prolog_flag/2":function(w,S,y){var F=y.args[0],z=y.args[1];if(!x.type.is_variable(F)&&!x.type.is_atom(F))w.throw_error(x.error.type("atom",F,y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_flag(F))w.throw_error(x.error.domain("prolog_flag",F,y.indicator));else{var X=[];for(var Z in x.flag)if(!!x.flag.hasOwnProperty(Z)){var ie=new H(",",[new H("=",[new H(Z),F]),new H("=",[w.get_flag(Z),z])]);X.push(new be(S.goal.replace(ie),S.substitution,S))}w.prepend(X)}},"set_prolog_flag/2":function(w,S,y){var F=y.args[0],z=y.args[1];x.type.is_variable(F)||x.type.is_variable(z)?w.throw_error(x.error.instantiation(y.indicator)):x.type.is_atom(F)?x.type.is_flag(F)?x.type.is_value_flag(F,z)?x.type.is_modifiable_flag(F)?(w.session.flag[F.id]=z,w.success(S)):w.throw_error(x.error.permission("modify","flag",F)):w.throw_error(x.error.domain("flag_value",new H("+",[F,z]),y.indicator)):w.throw_error(x.error.domain("prolog_flag",F,y.indicator)):w.throw_error(x.error.type("atom",F,y.indicator))}},flag:{bounded:{allowed:[new H("true"),new H("false")],value:new H("true"),changeable:!1},max_integer:{allowed:[new ke(Number.MAX_SAFE_INTEGER)],value:new ke(Number.MAX_SAFE_INTEGER),changeable:!1},min_integer:{allowed:[new ke(Number.MIN_SAFE_INTEGER)],value:new ke(Number.MIN_SAFE_INTEGER),changeable:!1},integer_rounding_function:{allowed:[new H("down"),new H("toward_zero")],value:new H("toward_zero"),changeable:!1},char_conversion:{allowed:[new H("on"),new H("off")],value:new H("on"),changeable:!0},debug:{allowed:[new H("on"),new H("off")],value:new H("off"),changeable:!0},max_arity:{allowed:[new H("unbounded")],value:new H("unbounded"),changeable:!1},unknown:{allowed:[new H("error"),new H("fail"),new H("warning")],value:new H("error"),changeable:!0},double_quotes:{allowed:[new H("chars"),new H("codes"),new H("atom")],value:new H("codes"),changeable:!0},occurs_check:{allowed:[new H("false"),new H("true")],value:new H("false"),changeable:!0},dialect:{allowed:[new H("tau")],value:new H("tau"),changeable:!1},version_data:{allowed:[new H("tau",[new ke(t.major,!1),new ke(t.minor,!1),new ke(t.patch,!1),new H(t.status)])],value:new H("tau",[new ke(t.major,!1),new ke(t.minor,!1),new ke(t.patch,!1),new H(t.status)]),changeable:!1},nodejs:{allowed:[new H("yes"),new H("no")],value:new H(typeof hl<"u"&&hl.exports?"yes":"no"),changeable:!1}},unify:function(w,S,y){y=y===void 0?!1:y;for(var F=[{left:w,right:S}],z={};F.length!==0;){var X=F.pop();if(w=X.left,S=X.right,x.type.is_term(w)&&x.type.is_term(S)){if(w.indicator!==S.indicator)return null;for(var Z=0;Zz.value?1:0:z}else return F},operate:function(w,S){if(x.type.is_operator(S)){for(var y=x.type.is_operator(S),F=[],z,X=!1,Z=0;Zw.get_flag("max_integer").value||z0?w.start+w.matches[0].length:w.start,z=y?new H("token_not_found"):new H("found",[new H(w.value.toString())]),X=new H(".",[new H("line",[new ke(w.line+1)]),new H(".",[new H("column",[new ke(F+1)]),new H(".",[z,new H("[]",[])])])]);return new H("error",[new H("syntax_error",[new H(S)]),X])},syntax_by_predicate:function(w,S){return new H("error",[new H("syntax_error",[new H(w)]),ee(S)])}},warning:{singleton:function(w,S,y){for(var F=new H("[]"),z=w.length-1;z>=0;z--)F=new H(".",[new Ie(w[z]),F]);return new H("warning",[new H("singleton_variables",[F,ee(S)]),new H(".",[new H("line",[new ke(y,!1)]),new H("[]")])])},failed_goal:function(w,S){return new H("warning",[new H("failed_goal",[w]),new H(".",[new H("line",[new ke(S,!1)]),new H("[]")])])}},format_variable:function(w){return"_"+w},format_answer:function(w,S,F){S instanceof Te&&(S=S.thread);var F=F||{};if(F.session=S?S.session:void 0,x.type.is_error(w))return"uncaught exception: "+w.args[0].toString();if(w===!1)return"false.";if(w===null)return"limit exceeded ;";var z=0,X="";if(x.type.is_substitution(w)){var Z=w.domain(!0);w=w.filter(function(Ne,ot){return!x.type.is_variable(ot)||Z.indexOf(ot.id)!==-1&&Ne!==ot.id})}for(var ie in w.links)!w.links.hasOwnProperty(ie)||(z++,X!==""&&(X+=", "),X+=ie.toString(F)+" = "+w.links[ie].toString(F));var Se=typeof S>"u"||S.points.length>0?" ;":".";return z===0?"true"+Se:X+Se},flatten_error:function(w){if(!x.type.is_error(w))return null;w=w.args[0];var S={};return S.type=w.args[0].id,S.thrown=S.type==="syntax_error"?null:w.args[1].id,S.expected=null,S.found=null,S.representation=null,S.existence=null,S.existence_type=null,S.line=null,S.column=null,S.permission_operation=null,S.permission_type=null,S.evaluation_type=null,S.type==="type_error"||S.type==="domain_error"?(S.expected=w.args[0].args[0].id,S.found=w.args[0].args[1].toString()):S.type==="syntax_error"?w.args[1].indicator==="./2"?(S.expected=w.args[0].args[0].id,S.found=w.args[1].args[1].args[1].args[0],S.found=S.found.id==="token_not_found"?S.found.id:S.found.args[0].id,S.line=w.args[1].args[0].args[0].value,S.column=w.args[1].args[1].args[0].args[0].value):S.thrown=w.args[1].id:S.type==="permission_error"?(S.found=w.args[0].args[2].toString(),S.permission_operation=w.args[0].args[0].id,S.permission_type=w.args[0].args[1].id):S.type==="evaluation_error"?S.evaluation_type=w.args[0].args[0].id:S.type==="representation_error"?S.representation=w.args[0].args[0].id:S.type==="existence_error"&&(S.existence=w.args[0].args[1].toString(),S.existence_type=w.args[0].args[0].id),S},create:function(w){return new x.type.Session(w)}};typeof hl<"u"?hl.exports=x:window.pl=x})()});function ame(t,e,r){t.prepend(r.map(o=>new Ra.default.type.State(e.goal.replace(o),e.substitution,e)))}function CH(t){let e=cme.get(t.session);if(e==null)throw new Error("Assertion failed: A project should have been registered for the active session");return e}function ume(t,e){cme.set(t,e),t.consult(`:- use_module(library(${tdt.id})).`)}var wH,Ra,lme,c0,$gt,edt,cme,tdt,Ame=Et(()=>{Ye();wH=$e(g2()),Ra=$e(EH()),lme=$e(Be("vm")),{is_atom:c0,is_variable:$gt,is_instantiated_list:edt}=Ra.default.type;cme=new WeakMap;tdt=new Ra.default.type.Module("constraints",{["project_workspaces_by_descriptor/3"]:(t,e,r)=>{let[o,a,n]=r.args;if(!c0(o)||!c0(a)){t.throw_error(Ra.default.error.instantiation(r.indicator));return}let u=W.parseIdent(o.id),A=W.makeDescriptor(u,a.id),h=CH(t).tryWorkspaceByDescriptor(A);$gt(n)&&h!==null&&ame(t,e,[new Ra.default.type.Term("=",[n,new Ra.default.type.Term(String(h.relativeCwd))])]),c0(n)&&h!==null&&h.relativeCwd===n.id&&t.success(e)},["workspace_field/3"]:(t,e,r)=>{let[o,a,n]=r.args;if(!c0(o)||!c0(a)){t.throw_error(Ra.default.error.instantiation(r.indicator));return}let A=CH(t).tryWorkspaceByCwd(o.id);if(A==null)return;let p=(0,wH.default)(A.manifest.raw,a.id);typeof p>"u"||ame(t,e,[new Ra.default.type.Term("=",[n,new Ra.default.type.Term(typeof p=="object"?JSON.stringify(p):p)])])},["workspace_field_test/3"]:(t,e,r)=>{let[o,a,n]=r.args;t.prepend([new Ra.default.type.State(e.goal.replace(new Ra.default.type.Term("workspace_field_test",[o,a,n,new Ra.default.type.Term("[]",[])])),e.substitution,e)])},["workspace_field_test/4"]:(t,e,r)=>{let[o,a,n,u]=r.args;if(!c0(o)||!c0(a)||!c0(n)||!edt(u)){t.throw_error(Ra.default.error.instantiation(r.indicator));return}let p=CH(t).tryWorkspaceByCwd(o.id);if(p==null)return;let h=(0,wH.default)(p.manifest.raw,a.id);if(typeof h>"u")return;let E={$$:h};for(let[v,b]of u.toJavaScript().entries())E[`$${v}`]=b;lme.default.runInNewContext(n.id,E)&&t.success(e)}},["project_workspaces_by_descriptor/3","workspace_field/3","workspace_field_test/3","workspace_field_test/4"])});var S2={};Kt(S2,{Constraints:()=>P2,DependencyType:()=>gme});function to(t){if(t instanceof vC.default.type.Num)return t.value;if(t instanceof vC.default.type.Term)switch(t.indicator){case"throw/1":return to(t.args[0]);case"error/1":return to(t.args[0]);case"error/2":if(t.args[0]instanceof vC.default.type.Term&&t.args[0].indicator==="syntax_error/1")return Object.assign(to(t.args[0]),...to(t.args[1]));{let e=to(t.args[0]);return e.message+=` (in ${to(t.args[1])})`,e}case"syntax_error/1":return new zt(43,`Syntax error: ${to(t.args[0])}`);case"existence_error/2":return new zt(44,`Existence error: ${to(t.args[0])} ${to(t.args[1])} not found`);case"instantiation_error/0":return new zt(75,"Instantiation error: an argument is variable when an instantiated argument was expected");case"line/1":return{line:to(t.args[0])};case"column/1":return{column:to(t.args[0])};case"found/1":return{found:to(t.args[0])};case"./2":return[to(t.args[0])].concat(to(t.args[1]));case"//2":return`${to(t.args[0])}/${to(t.args[1])}`;default:return t.id}throw`couldn't pretty print because of unsupported node ${t}`}function pme(t){let e;try{e=to(t)}catch(r){throw typeof r=="string"?new zt(42,`Unknown error: ${t} (note: ${r})`):r}return typeof e.line<"u"&&typeof e.column<"u"&&(e.message+=` at line ${e.line}, column ${e.column}`),e}function $d(t){return t.id==="null"?null:`${t.toJavaScript()}`}function rdt(t){if(t.id==="null")return null;{let e=t.toJavaScript();if(typeof e!="string")return JSON.stringify(e);try{return JSON.stringify(JSON.parse(e))}catch{return JSON.stringify(e)}}}function u0(t){return typeof t=="string"?`'${t}'`:"[]"}var hme,vC,gme,fme,IH,P2,x2=Et(()=>{Ye();Ye();Pt();hme=$e(Yde()),vC=$e(EH());B2();Ame();(0,hme.default)(vC.default);gme=(o=>(o.Dependencies="dependencies",o.DevDependencies="devDependencies",o.PeerDependencies="peerDependencies",o))(gme||{}),fme=["dependencies","devDependencies","peerDependencies"];IH=class{constructor(e,r){let o=1e3*e.workspaces.length;this.session=vC.default.create(o),ume(this.session,e),this.session.consult(":- use_module(library(lists))."),this.session.consult(r)}fetchNextAnswer(){return new Promise(e=>{this.session.answer(r=>{e(r)})})}async*makeQuery(e){let r=this.session.query(e);if(r!==!0)throw pme(r);for(;;){let o=await this.fetchNextAnswer();if(o===null)throw new zt(79,"Resolution limit exceeded");if(!o)break;if(o.id==="throw")throw pme(o);yield o}}};P2=class{constructor(e){this.source="";this.project=e;let r=e.configuration.get("constraintsPath");oe.existsSync(r)&&(this.source=oe.readFileSync(r,"utf8"))}static async find(e){return new P2(e)}getProjectDatabase(){let e="";for(let r of fme)e+=`dependency_type(${r}). +`;for(let r of this.project.workspacesByCwd.values()){let o=r.relativeCwd;e+=`workspace(${u0(o)}). +`,e+=`workspace_ident(${u0(o)}, ${u0(W.stringifyIdent(r.anchoredLocator))}). +`,e+=`workspace_version(${u0(o)}, ${u0(r.manifest.version)}). +`;for(let a of fme)for(let n of r.manifest[a].values())e+=`workspace_has_dependency(${u0(o)}, ${u0(W.stringifyIdent(n))}, ${u0(n.range)}, ${a}). +`}return e+=`workspace(_) :- false. +`,e+=`workspace_ident(_, _) :- false. +`,e+=`workspace_version(_, _) :- false. +`,e+=`workspace_has_dependency(_, _, _, _) :- false. +`,e}getDeclarations(){let e="";return e+=`gen_enforced_dependency(_, _, _, _) :- false. +`,e+=`gen_enforced_field(_, _, _) :- false. +`,e}get fullSource(){return`${this.getProjectDatabase()} +${this.source} +${this.getDeclarations()}`}createSession(){return new IH(this.project,this.fullSource)}async processClassic(){let e=this.createSession();return{enforcedDependencies:await this.genEnforcedDependencies(e),enforcedFields:await this.genEnforcedFields(e)}}async process(){let{enforcedDependencies:e,enforcedFields:r}=await this.processClassic(),o=new Map;for(let{workspace:a,dependencyIdent:n,dependencyRange:u,dependencyType:A}of e){let p=I2([A,W.stringifyIdent(n)]),h=je.getMapWithDefault(o,a.cwd);je.getMapWithDefault(h,p).set(u??void 0,new Set)}for(let{workspace:a,fieldPath:n,fieldValue:u}of r){let A=I2(n),p=je.getMapWithDefault(o,a.cwd);je.getMapWithDefault(p,A).set(JSON.parse(u)??void 0,new Set)}return{manifestUpdates:o,reportedErrors:new Map}}async genEnforcedDependencies(e){let r=[];for await(let o of e.makeQuery("workspace(WorkspaceCwd), dependency_type(DependencyType), gen_enforced_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType).")){let a=K.resolve(this.project.cwd,$d(o.links.WorkspaceCwd)),n=$d(o.links.DependencyIdent),u=$d(o.links.DependencyRange),A=$d(o.links.DependencyType);if(a===null||n===null)throw new Error("Invalid rule");let p=this.project.getWorkspaceByCwd(a),h=W.parseIdent(n);r.push({workspace:p,dependencyIdent:h,dependencyRange:u,dependencyType:A})}return je.sortMap(r,[({dependencyRange:o})=>o!==null?"0":"1",({workspace:o})=>W.stringifyIdent(o.anchoredLocator),({dependencyIdent:o})=>W.stringifyIdent(o)])}async genEnforcedFields(e){let r=[];for await(let o of e.makeQuery("workspace(WorkspaceCwd), gen_enforced_field(WorkspaceCwd, FieldPath, FieldValue).")){let a=K.resolve(this.project.cwd,$d(o.links.WorkspaceCwd)),n=$d(o.links.FieldPath),u=rdt(o.links.FieldValue);if(a===null||n===null)throw new Error("Invalid rule");let A=this.project.getWorkspaceByCwd(a);r.push({workspace:A,fieldPath:n,fieldValue:u})}return je.sortMap(r,[({workspace:o})=>W.stringifyIdent(o.anchoredLocator),({fieldPath:o})=>o])}async*query(e){let r=this.createSession();for await(let o of r.makeQuery(e)){let a={};for(let[n,u]of Object.entries(o.links))n!=="_"&&(a[n]=$d(u));yield a}}}});var vme=_(vk=>{"use strict";Object.defineProperty(vk,"__esModule",{value:!0});function q2(t){let e=[...t.caches],r=e.shift();return r===void 0?Bme():{get(o,a,n={miss:()=>Promise.resolve()}){return r.get(o,a,n).catch(()=>q2({caches:e}).get(o,a,n))},set(o,a){return r.set(o,a).catch(()=>q2({caches:e}).set(o,a))},delete(o){return r.delete(o).catch(()=>q2({caches:e}).delete(o))},clear(){return r.clear().catch(()=>q2({caches:e}).clear())}}}function Bme(){return{get(t,e,r={miss:()=>Promise.resolve()}){return e().then(a=>Promise.all([a,r.miss(a)])).then(([a])=>a)},set(t,e){return Promise.resolve(e)},delete(t){return Promise.resolve()},clear(){return Promise.resolve()}}}vk.createFallbackableCache=q2;vk.createNullCache=Bme});var Pme=_((QWt,Dme)=>{Dme.exports=vme()});var Sme=_(LH=>{"use strict";Object.defineProperty(LH,"__esModule",{value:!0});function wdt(t={serializable:!0}){let e={};return{get(r,o,a={miss:()=>Promise.resolve()}){let n=JSON.stringify(r);if(n in e)return Promise.resolve(t.serializable?JSON.parse(e[n]):e[n]);let u=o(),A=a&&a.miss||(()=>Promise.resolve());return u.then(p=>A(p)).then(()=>u)},set(r,o){return e[JSON.stringify(r)]=t.serializable?JSON.stringify(o):o,Promise.resolve(o)},delete(r){return delete e[JSON.stringify(r)],Promise.resolve()},clear(){return e={},Promise.resolve()}}}LH.createInMemoryCache=wdt});var bme=_((TWt,xme)=>{xme.exports=Sme()});var Qme=_(Zc=>{"use strict";Object.defineProperty(Zc,"__esModule",{value:!0});function Idt(t,e,r){let o={"x-algolia-api-key":r,"x-algolia-application-id":e};return{headers(){return t===MH.WithinHeaders?o:{}},queryParameters(){return t===MH.WithinQueryParameters?o:{}}}}function Bdt(t){let e=0,r=()=>(e++,new Promise(o=>{setTimeout(()=>{o(t(r))},Math.min(100*e,1e3))}));return t(r)}function kme(t,e=(r,o)=>Promise.resolve()){return Object.assign(t,{wait(r){return kme(t.then(o=>Promise.all([e(o,r),o])).then(o=>o[1]))}})}function vdt(t){let e=t.length-1;for(e;e>0;e--){let r=Math.floor(Math.random()*(e+1)),o=t[e];t[e]=t[r],t[r]=o}return t}function Ddt(t,e){return e&&Object.keys(e).forEach(r=>{t[r]=e[r](t)}),t}function Pdt(t,...e){let r=0;return t.replace(/%s/g,()=>encodeURIComponent(e[r++]))}var Sdt="4.14.2",xdt=t=>()=>t.transporter.requester.destroy(),MH={WithinQueryParameters:0,WithinHeaders:1};Zc.AuthMode=MH;Zc.addMethods=Ddt;Zc.createAuth=Idt;Zc.createRetryablePromise=Bdt;Zc.createWaitablePromise=kme;Zc.destroy=xdt;Zc.encode=Pdt;Zc.shuffle=vdt;Zc.version=Sdt});var G2=_((NWt,Fme)=>{Fme.exports=Qme()});var Tme=_(OH=>{"use strict";Object.defineProperty(OH,"__esModule",{value:!0});var bdt={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};OH.MethodEnum=bdt});var Y2=_((MWt,Rme)=>{Rme.exports=Tme()});var Jme=_(Fi=>{"use strict";Object.defineProperty(Fi,"__esModule",{value:!0});var Lme=Y2();function UH(t,e){let r=t||{},o=r.data||{};return Object.keys(r).forEach(a=>{["timeout","headers","queryParameters","data","cacheable"].indexOf(a)===-1&&(o[a]=r[a])}),{data:Object.entries(o).length>0?o:void 0,timeout:r.timeout||e,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var W2={Read:1,Write:2,Any:3},xC={Up:1,Down:2,Timeouted:3},Mme=2*60*1e3;function HH(t,e=xC.Up){return{...t,status:e,lastUpdate:Date.now()}}function Ome(t){return t.status===xC.Up||Date.now()-t.lastUpdate>Mme}function Ume(t){return t.status===xC.Timeouted&&Date.now()-t.lastUpdate<=Mme}function jH(t){return typeof t=="string"?{protocol:"https",url:t,accept:W2.Any}:{protocol:t.protocol||"https",url:t.url,accept:t.accept||W2.Any}}function kdt(t,e){return Promise.all(e.map(r=>t.get(r,()=>Promise.resolve(HH(r))))).then(r=>{let o=r.filter(A=>Ome(A)),a=r.filter(A=>Ume(A)),n=[...o,...a],u=n.length>0?n.map(A=>jH(A)):e;return{getTimeout(A,p){return(a.length===0&&A===0?1:a.length+3+A)*p},statelessHosts:u}})}var Qdt=({isTimedOut:t,status:e})=>!t&&~~e===0,Fdt=t=>{let e=t.status;return t.isTimedOut||Qdt(t)||~~(e/100)!==2&&~~(e/100)!==4},Tdt=({status:t})=>~~(t/100)===2,Rdt=(t,e)=>Fdt(t)?e.onRetry(t):Tdt(t)?e.onSuccess(t):e.onFail(t);function Nme(t,e,r,o){let a=[],n=Gme(r,o),u=Yme(t,o),A=r.method,p=r.method!==Lme.MethodEnum.Get?{}:{...r.data,...o.data},h={"x-algolia-agent":t.userAgent.value,...t.queryParameters,...p,...o.queryParameters},E=0,I=(v,b)=>{let C=v.pop();if(C===void 0)throw Kme(_H(a));let T={data:n,headers:u,method:A,url:jme(C,r.path,h),connectTimeout:b(E,t.timeouts.connect),responseTimeout:b(E,o.timeout)},L=J=>{let te={request:T,response:J,host:C,triesLeft:v.length};return a.push(te),te},U={onSuccess:J=>_me(J),onRetry(J){let te=L(J);return J.isTimedOut&&E++,Promise.all([t.logger.info("Retryable failure",qH(te)),t.hostsCache.set(C,HH(C,J.isTimedOut?xC.Timeouted:xC.Down))]).then(()=>I(v,b))},onFail(J){throw L(J),Hme(J,_H(a))}};return t.requester.send(T).then(J=>Rdt(J,U))};return kdt(t.hostsCache,e).then(v=>I([...v.statelessHosts].reverse(),v.getTimeout))}function Ndt(t){let{hostsCache:e,logger:r,requester:o,requestsCache:a,responsesCache:n,timeouts:u,userAgent:A,hosts:p,queryParameters:h,headers:E}=t,I={hostsCache:e,logger:r,requester:o,requestsCache:a,responsesCache:n,timeouts:u,userAgent:A,headers:E,queryParameters:h,hosts:p.map(v=>jH(v)),read(v,b){let C=UH(b,I.timeouts.read),T=()=>Nme(I,I.hosts.filter(J=>(J.accept&W2.Read)!==0),v,C);if((C.cacheable!==void 0?C.cacheable:v.cacheable)!==!0)return T();let U={request:v,mappedRequestOptions:C,transporter:{queryParameters:I.queryParameters,headers:I.headers}};return I.responsesCache.get(U,()=>I.requestsCache.get(U,()=>I.requestsCache.set(U,T()).then(J=>Promise.all([I.requestsCache.delete(U),J]),J=>Promise.all([I.requestsCache.delete(U),Promise.reject(J)])).then(([J,te])=>te)),{miss:J=>I.responsesCache.set(U,J)})},write(v,b){return Nme(I,I.hosts.filter(C=>(C.accept&W2.Write)!==0),v,UH(b,I.timeouts.write))}};return I}function Ldt(t){let e={value:`Algolia for JavaScript (${t})`,add(r){let o=`; ${r.segment}${r.version!==void 0?` (${r.version})`:""}`;return e.value.indexOf(o)===-1&&(e.value=`${e.value}${o}`),e}};return e}function _me(t){try{return JSON.parse(t.content)}catch(e){throw Vme(e.message,t)}}function Hme({content:t,status:e},r){let o=t;try{o=JSON.parse(t).message}catch{}return Wme(o,e,r)}function Mdt(t,...e){let r=0;return t.replace(/%s/g,()=>encodeURIComponent(e[r++]))}function jme(t,e,r){let o=qme(r),a=`${t.protocol}://${t.url}/${e.charAt(0)==="/"?e.substr(1):e}`;return o.length&&(a+=`?${o}`),a}function qme(t){let e=r=>Object.prototype.toString.call(r)==="[object Object]"||Object.prototype.toString.call(r)==="[object Array]";return Object.keys(t).map(r=>Mdt("%s=%s",r,e(t[r])?JSON.stringify(t[r]):t[r])).join("&")}function Gme(t,e){if(t.method===Lme.MethodEnum.Get||t.data===void 0&&e.data===void 0)return;let r=Array.isArray(t.data)?t.data:{...t.data,...e.data};return JSON.stringify(r)}function Yme(t,e){let r={...t.headers,...e.headers},o={};return Object.keys(r).forEach(a=>{let n=r[a];o[a.toLowerCase()]=n}),o}function _H(t){return t.map(e=>qH(e))}function qH(t){let e=t.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...t,request:{...t.request,headers:{...t.request.headers,...e}}}}function Wme(t,e,r){return{name:"ApiError",message:t,status:e,transporterStackTrace:r}}function Vme(t,e){return{name:"DeserializationError",message:t,response:e}}function Kme(t){return{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:t}}Fi.CallEnum=W2;Fi.HostStatusEnum=xC;Fi.createApiError=Wme;Fi.createDeserializationError=Vme;Fi.createMappedRequestOptions=UH;Fi.createRetryError=Kme;Fi.createStatefulHost=HH;Fi.createStatelessHost=jH;Fi.createTransporter=Ndt;Fi.createUserAgent=Ldt;Fi.deserializeFailure=Hme;Fi.deserializeSuccess=_me;Fi.isStatefulHostTimeouted=Ume;Fi.isStatefulHostUp=Ome;Fi.serializeData=Gme;Fi.serializeHeaders=Yme;Fi.serializeQueryParameters=qme;Fi.serializeUrl=jme;Fi.stackFrameWithoutCredentials=qH;Fi.stackTraceWithoutCredentials=_H});var V2=_((UWt,zme)=>{zme.exports=Jme()});var Xme=_(d0=>{"use strict";Object.defineProperty(d0,"__esModule",{value:!0});var bC=G2(),Odt=V2(),K2=Y2(),Udt=t=>{let e=t.region||"us",r=bC.createAuth(bC.AuthMode.WithinHeaders,t.appId,t.apiKey),o=Odt.createTransporter({hosts:[{url:`analytics.${e}.algolia.com`}],...t,headers:{...r.headers(),"content-type":"application/json",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}}),a=t.appId;return bC.addMethods({appId:a,transporter:o},t.methods)},_dt=t=>(e,r)=>t.transporter.write({method:K2.MethodEnum.Post,path:"2/abtests",data:e},r),Hdt=t=>(e,r)=>t.transporter.write({method:K2.MethodEnum.Delete,path:bC.encode("2/abtests/%s",e)},r),jdt=t=>(e,r)=>t.transporter.read({method:K2.MethodEnum.Get,path:bC.encode("2/abtests/%s",e)},r),qdt=t=>e=>t.transporter.read({method:K2.MethodEnum.Get,path:"2/abtests"},e),Gdt=t=>(e,r)=>t.transporter.write({method:K2.MethodEnum.Post,path:bC.encode("2/abtests/%s/stop",e)},r);d0.addABTest=_dt;d0.createAnalyticsClient=Udt;d0.deleteABTest=Hdt;d0.getABTest=jdt;d0.getABTests=qdt;d0.stopABTest=Gdt});var $me=_((HWt,Zme)=>{Zme.exports=Xme()});var tye=_(J2=>{"use strict";Object.defineProperty(J2,"__esModule",{value:!0});var GH=G2(),Ydt=V2(),eye=Y2(),Wdt=t=>{let e=t.region||"us",r=GH.createAuth(GH.AuthMode.WithinHeaders,t.appId,t.apiKey),o=Ydt.createTransporter({hosts:[{url:`personalization.${e}.algolia.com`}],...t,headers:{...r.headers(),"content-type":"application/json",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}});return GH.addMethods({appId:t.appId,transporter:o},t.methods)},Vdt=t=>e=>t.transporter.read({method:eye.MethodEnum.Get,path:"1/strategies/personalization"},e),Kdt=t=>(e,r)=>t.transporter.write({method:eye.MethodEnum.Post,path:"1/strategies/personalization",data:e},r);J2.createPersonalizationClient=Wdt;J2.getPersonalizationStrategy=Vdt;J2.setPersonalizationStrategy=Kdt});var nye=_((qWt,rye)=>{rye.exports=tye()});var mye=_(Ft=>{"use strict";Object.defineProperty(Ft,"__esModule",{value:!0});var Gt=G2(),Na=V2(),Ir=Y2(),Jdt=Be("crypto");function Dk(t){let e=r=>t.request(r).then(o=>{if(t.batch!==void 0&&t.batch(o.hits),!t.shouldStop(o))return o.cursor?e({cursor:o.cursor}):e({page:(r.page||0)+1})});return e({})}var zdt=t=>{let e=t.appId,r=Gt.createAuth(t.authMode!==void 0?t.authMode:Gt.AuthMode.WithinHeaders,e,t.apiKey),o=Na.createTransporter({hosts:[{url:`${e}-dsn.algolia.net`,accept:Na.CallEnum.Read},{url:`${e}.algolia.net`,accept:Na.CallEnum.Write}].concat(Gt.shuffle([{url:`${e}-1.algolianet.com`},{url:`${e}-2.algolianet.com`},{url:`${e}-3.algolianet.com`}])),...t,headers:{...r.headers(),"content-type":"application/x-www-form-urlencoded",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}}),a={transporter:o,appId:e,addAlgoliaAgent(n,u){o.userAgent.add({segment:n,version:u})},clearCache(){return Promise.all([o.requestsCache.clear(),o.responsesCache.clear()]).then(()=>{})}};return Gt.addMethods(a,t.methods)};function iye(){return{name:"MissingObjectIDError",message:"All objects must have an unique objectID (like a primary key) to be valid. Algolia is also able to generate objectIDs automatically but *it's not recommended*. To do it, use the `{'autoGenerateObjectIDIfNotExist': true}` option."}}function sye(){return{name:"ObjectNotFoundError",message:"Object not found."}}function oye(){return{name:"ValidUntilNotFoundError",message:"ValidUntil not found in given secured api key."}}var Xdt=t=>(e,r)=>{let{queryParameters:o,...a}=r||{},n={acl:e,...o!==void 0?{queryParameters:o}:{}},u=(A,p)=>Gt.createRetryablePromise(h=>z2(t)(A.key,p).catch(E=>{if(E.status!==404)throw E;return h()}));return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:"1/keys",data:n},a),u)},Zdt=t=>(e,r,o)=>{let a=Na.createMappedRequestOptions(o);return a.queryParameters["X-Algolia-User-ID"]=e,t.transporter.write({method:Ir.MethodEnum.Post,path:"1/clusters/mapping",data:{cluster:r}},a)},$dt=t=>(e,r,o)=>t.transporter.write({method:Ir.MethodEnum.Post,path:"1/clusters/mapping/batch",data:{users:e,cluster:r}},o),emt=t=>(e,r)=>Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!0,requests:{action:"addEntry",body:[]}}},r),(o,a)=>kC(t)(o.taskID,a)),Pk=t=>(e,r,o)=>{let a=(n,u)=>X2(t)(e,{methods:{waitTask:Zi}}).waitTask(n.taskID,u);return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode("1/indexes/%s/operation",e),data:{operation:"copy",destination:r}},o),a)},tmt=t=>(e,r,o)=>Pk(t)(e,r,{...o,scope:[xk.Rules]}),rmt=t=>(e,r,o)=>Pk(t)(e,r,{...o,scope:[xk.Settings]}),nmt=t=>(e,r,o)=>Pk(t)(e,r,{...o,scope:[xk.Synonyms]}),imt=t=>(e,r)=>e.method===Ir.MethodEnum.Get?t.transporter.read(e,r):t.transporter.write(e,r),smt=t=>(e,r)=>{let o=(a,n)=>Gt.createRetryablePromise(u=>z2(t)(e,n).then(u).catch(A=>{if(A.status!==404)throw A}));return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Delete,path:Gt.encode("1/keys/%s",e)},r),o)},omt=t=>(e,r,o)=>{let a=r.map(n=>({action:"deleteEntry",body:{objectID:n}}));return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!1,requests:a}},o),(n,u)=>kC(t)(n.taskID,u))},amt=()=>(t,e)=>{let r=Na.serializeQueryParameters(e),o=Jdt.createHmac("sha256",t).update(r).digest("hex");return Buffer.from(o+r).toString("base64")},z2=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:Gt.encode("1/keys/%s",e)},r),aye=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:Gt.encode("1/task/%s",e.toString())},r),lmt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:"/1/dictionaries/*/settings"},e),cmt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:"1/logs"},e),umt=()=>t=>{let e=Buffer.from(t,"base64").toString("ascii"),r=/validUntil=(\d+)/,o=e.match(r);if(o===null)throw oye();return parseInt(o[1],10)-Math.round(new Date().getTime()/1e3)},Amt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:"1/clusters/mapping/top"},e),fmt=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:Gt.encode("1/clusters/mapping/%s",e)},r),pmt=t=>e=>{let{retrieveMappings:r,...o}=e||{};return r===!0&&(o.getClusters=!0),t.transporter.read({method:Ir.MethodEnum.Get,path:"1/clusters/mapping/pending"},o)},X2=t=>(e,r={})=>{let o={transporter:t.transporter,appId:t.appId,indexName:e};return Gt.addMethods(o,r.methods)},hmt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:"1/keys"},e),gmt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:"1/clusters"},e),dmt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:"1/indexes"},e),mmt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:"1/clusters/mapping"},e),ymt=t=>(e,r,o)=>{let a=(n,u)=>X2(t)(e,{methods:{waitTask:Zi}}).waitTask(n.taskID,u);return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode("1/indexes/%s/operation",e),data:{operation:"move",destination:r}},o),a)},Emt=t=>(e,r)=>{let o=(a,n)=>Promise.all(Object.keys(a.taskID).map(u=>X2(t)(u,{methods:{waitTask:Zi}}).waitTask(a.taskID[u],n)));return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:"1/indexes/*/batch",data:{requests:e}},r),o)},Cmt=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:e}},r),wmt=t=>(e,r)=>{let o=e.map(a=>({...a,params:Na.serializeQueryParameters(a.params||{})}));return t.transporter.read({method:Ir.MethodEnum.Post,path:"1/indexes/*/queries",data:{requests:o},cacheable:!0},r)},Imt=t=>(e,r)=>Promise.all(e.map(o=>{let{facetName:a,facetQuery:n,...u}=o.params;return X2(t)(o.indexName,{methods:{searchForFacetValues:hye}}).searchForFacetValues(a,n,{...r,...u})})),Bmt=t=>(e,r)=>{let o=Na.createMappedRequestOptions(r);return o.queryParameters["X-Algolia-User-ID"]=e,t.transporter.write({method:Ir.MethodEnum.Delete,path:"1/clusters/mapping"},o)},vmt=t=>(e,r,o)=>{let a=r.map(n=>({action:"addEntry",body:n}));return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!0,requests:a}},o),(n,u)=>kC(t)(n.taskID,u))},Dmt=t=>(e,r)=>{let o=(a,n)=>Gt.createRetryablePromise(u=>z2(t)(e,n).catch(A=>{if(A.status!==404)throw A;return u()}));return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode("1/keys/%s/restore",e)},r),o)},Pmt=t=>(e,r,o)=>{let a=r.map(n=>({action:"addEntry",body:n}));return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!1,requests:a}},o),(n,u)=>kC(t)(n.taskID,u))},Smt=t=>(e,r,o)=>t.transporter.read({method:Ir.MethodEnum.Post,path:Gt.encode("/1/dictionaries/%s/search",e),data:{query:r},cacheable:!0},o),xmt=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Post,path:"1/clusters/mapping/search",data:{query:e}},r),bmt=t=>(e,r)=>Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Put,path:"/1/dictionaries/*/settings",data:e},r),(o,a)=>kC(t)(o.taskID,a)),kmt=t=>(e,r)=>{let o=Object.assign({},r),{queryParameters:a,...n}=r||{},u=a?{queryParameters:a}:{},A=["acl","indexes","referers","restrictSources","queryParameters","description","maxQueriesPerIPPerHour","maxHitsPerQuery"],p=E=>Object.keys(o).filter(I=>A.indexOf(I)!==-1).every(I=>E[I]===o[I]),h=(E,I)=>Gt.createRetryablePromise(v=>z2(t)(e,I).then(b=>p(b)?Promise.resolve():v()));return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Put,path:Gt.encode("1/keys/%s",e),data:u},n),h)},kC=t=>(e,r)=>Gt.createRetryablePromise(o=>aye(t)(e,r).then(a=>a.status!=="published"?o():void 0)),lye=t=>(e,r)=>{let o=(a,n)=>Zi(t)(a.taskID,n);return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode("1/indexes/%s/batch",t.indexName),data:{requests:e}},r),o)},Qmt=t=>e=>Dk({shouldStop:r=>r.cursor===void 0,...e,request:r=>t.transporter.read({method:Ir.MethodEnum.Post,path:Gt.encode("1/indexes/%s/browse",t.indexName),data:r},e)}),Fmt=t=>e=>{let r={hitsPerPage:1e3,...e};return Dk({shouldStop:o=>o.hits.length({...a,hits:a.hits.map(n=>(delete n._highlightResult,n))}))}})},Tmt=t=>e=>{let r={hitsPerPage:1e3,...e};return Dk({shouldStop:o=>o.hits.length({...a,hits:a.hits.map(n=>(delete n._highlightResult,n))}))}})},Sk=t=>(e,r,o)=>{let{batchSize:a,...n}=o||{},u={taskIDs:[],objectIDs:[]},A=(p=0)=>{let h=[],E;for(E=p;E({action:r,body:I})),n).then(I=>(u.objectIDs=u.objectIDs.concat(I.objectIDs),u.taskIDs.push(I.taskID),E++,A(E)))};return Gt.createWaitablePromise(A(),(p,h)=>Promise.all(p.taskIDs.map(E=>Zi(t)(E,h))))},Rmt=t=>e=>Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode("1/indexes/%s/clear",t.indexName)},e),(r,o)=>Zi(t)(r.taskID,o)),Nmt=t=>e=>{let{forwardToReplicas:r,...o}=e||{},a=Na.createMappedRequestOptions(o);return r&&(a.queryParameters.forwardToReplicas=1),Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode("1/indexes/%s/rules/clear",t.indexName)},a),(n,u)=>Zi(t)(n.taskID,u))},Lmt=t=>e=>{let{forwardToReplicas:r,...o}=e||{},a=Na.createMappedRequestOptions(o);return r&&(a.queryParameters.forwardToReplicas=1),Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode("1/indexes/%s/synonyms/clear",t.indexName)},a),(n,u)=>Zi(t)(n.taskID,u))},Mmt=t=>(e,r)=>Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode("1/indexes/%s/deleteByQuery",t.indexName),data:e},r),(o,a)=>Zi(t)(o.taskID,a)),Omt=t=>e=>Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Delete,path:Gt.encode("1/indexes/%s",t.indexName)},e),(r,o)=>Zi(t)(r.taskID,o)),Umt=t=>(e,r)=>Gt.createWaitablePromise(cye(t)([e],r).then(o=>({taskID:o.taskIDs[0]})),(o,a)=>Zi(t)(o.taskID,a)),cye=t=>(e,r)=>{let o=e.map(a=>({objectID:a}));return Sk(t)(o,rm.DeleteObject,r)},_mt=t=>(e,r)=>{let{forwardToReplicas:o,...a}=r||{},n=Na.createMappedRequestOptions(a);return o&&(n.queryParameters.forwardToReplicas=1),Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Delete,path:Gt.encode("1/indexes/%s/rules/%s",t.indexName,e)},n),(u,A)=>Zi(t)(u.taskID,A))},Hmt=t=>(e,r)=>{let{forwardToReplicas:o,...a}=r||{},n=Na.createMappedRequestOptions(a);return o&&(n.queryParameters.forwardToReplicas=1),Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Delete,path:Gt.encode("1/indexes/%s/synonyms/%s",t.indexName,e)},n),(u,A)=>Zi(t)(u.taskID,A))},jmt=t=>e=>uye(t)(e).then(()=>!0).catch(r=>{if(r.status!==404)throw r;return!1}),qmt=t=>(e,r,o)=>t.transporter.read({method:Ir.MethodEnum.Post,path:Gt.encode("1/answers/%s/prediction",t.indexName),data:{query:e,queryLanguages:r},cacheable:!0},o),Gmt=t=>(e,r)=>{let{query:o,paginate:a,...n}=r||{},u=0,A=()=>pye(t)(o||"",{...n,page:u}).then(p=>{for(let[h,E]of Object.entries(p.hits))if(e(E))return{object:E,position:parseInt(h,10),page:u};if(u++,a===!1||u>=p.nbPages)throw sye();return A()});return A()},Ymt=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:Gt.encode("1/indexes/%s/%s",t.indexName,e)},r),Wmt=()=>(t,e)=>{for(let[r,o]of Object.entries(t.hits))if(o.objectID===e)return parseInt(r,10);return-1},Vmt=t=>(e,r)=>{let{attributesToRetrieve:o,...a}=r||{},n=e.map(u=>({indexName:t.indexName,objectID:u,...o?{attributesToRetrieve:o}:{}}));return t.transporter.read({method:Ir.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:n}},a)},Kmt=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:Gt.encode("1/indexes/%s/rules/%s",t.indexName,e)},r),uye=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:Gt.encode("1/indexes/%s/settings",t.indexName),data:{getVersion:2}},e),Jmt=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:Gt.encode("1/indexes/%s/synonyms/%s",t.indexName,e)},r),Aye=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:Gt.encode("1/indexes/%s/task/%s",t.indexName,e.toString())},r),zmt=t=>(e,r)=>Gt.createWaitablePromise(fye(t)([e],r).then(o=>({objectID:o.objectIDs[0],taskID:o.taskIDs[0]})),(o,a)=>Zi(t)(o.taskID,a)),fye=t=>(e,r)=>{let{createIfNotExists:o,...a}=r||{},n=o?rm.PartialUpdateObject:rm.PartialUpdateObjectNoCreate;return Sk(t)(e,n,a)},Xmt=t=>(e,r)=>{let{safe:o,autoGenerateObjectIDIfNotExist:a,batchSize:n,...u}=r||{},A=(C,T,L,U)=>Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode("1/indexes/%s/operation",C),data:{operation:L,destination:T}},U),(J,te)=>Zi(t)(J.taskID,te)),p=Math.random().toString(36).substring(7),h=`${t.indexName}_tmp_${p}`,E=YH({appId:t.appId,transporter:t.transporter,indexName:h}),I=[],v=A(t.indexName,h,"copy",{...u,scope:["settings","synonyms","rules"]});I.push(v);let b=(o?v.wait(u):v).then(()=>{let C=E(e,{...u,autoGenerateObjectIDIfNotExist:a,batchSize:n});return I.push(C),o?C.wait(u):C}).then(()=>{let C=A(h,t.indexName,"move",u);return I.push(C),o?C.wait(u):C}).then(()=>Promise.all(I)).then(([C,T,L])=>({objectIDs:T.objectIDs,taskIDs:[C.taskID,...T.taskIDs,L.taskID]}));return Gt.createWaitablePromise(b,(C,T)=>Promise.all(I.map(L=>L.wait(T))))},Zmt=t=>(e,r)=>WH(t)(e,{...r,clearExistingRules:!0}),$mt=t=>(e,r)=>VH(t)(e,{...r,clearExistingSynonyms:!0}),eyt=t=>(e,r)=>Gt.createWaitablePromise(YH(t)([e],r).then(o=>({objectID:o.objectIDs[0],taskID:o.taskIDs[0]})),(o,a)=>Zi(t)(o.taskID,a)),YH=t=>(e,r)=>{let{autoGenerateObjectIDIfNotExist:o,...a}=r||{},n=o?rm.AddObject:rm.UpdateObject;if(n===rm.UpdateObject){for(let u of e)if(u.objectID===void 0)return Gt.createWaitablePromise(Promise.reject(iye()))}return Sk(t)(e,n,a)},tyt=t=>(e,r)=>WH(t)([e],r),WH=t=>(e,r)=>{let{forwardToReplicas:o,clearExistingRules:a,...n}=r||{},u=Na.createMappedRequestOptions(n);return o&&(u.queryParameters.forwardToReplicas=1),a&&(u.queryParameters.clearExistingRules=1),Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode("1/indexes/%s/rules/batch",t.indexName),data:e},u),(A,p)=>Zi(t)(A.taskID,p))},ryt=t=>(e,r)=>VH(t)([e],r),VH=t=>(e,r)=>{let{forwardToReplicas:o,clearExistingSynonyms:a,replaceExistingSynonyms:n,...u}=r||{},A=Na.createMappedRequestOptions(u);return o&&(A.queryParameters.forwardToReplicas=1),(n||a)&&(A.queryParameters.replaceExistingSynonyms=1),Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode("1/indexes/%s/synonyms/batch",t.indexName),data:e},A),(p,h)=>Zi(t)(p.taskID,h))},pye=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Post,path:Gt.encode("1/indexes/%s/query",t.indexName),data:{query:e},cacheable:!0},r),hye=t=>(e,r,o)=>t.transporter.read({method:Ir.MethodEnum.Post,path:Gt.encode("1/indexes/%s/facets/%s/query",t.indexName,e),data:{facetQuery:r},cacheable:!0},o),gye=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Post,path:Gt.encode("1/indexes/%s/rules/search",t.indexName),data:{query:e}},r),dye=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Post,path:Gt.encode("1/indexes/%s/synonyms/search",t.indexName),data:{query:e}},r),nyt=t=>(e,r)=>{let{forwardToReplicas:o,...a}=r||{},n=Na.createMappedRequestOptions(a);return o&&(n.queryParameters.forwardToReplicas=1),Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Put,path:Gt.encode("1/indexes/%s/settings",t.indexName),data:e},n),(u,A)=>Zi(t)(u.taskID,A))},Zi=t=>(e,r)=>Gt.createRetryablePromise(o=>Aye(t)(e,r).then(a=>a.status!=="published"?o():void 0)),iyt={AddObject:"addObject",Analytics:"analytics",Browser:"browse",DeleteIndex:"deleteIndex",DeleteObject:"deleteObject",EditSettings:"editSettings",ListIndexes:"listIndexes",Logs:"logs",Personalization:"personalization",Recommendation:"recommendation",Search:"search",SeeUnretrievableAttributes:"seeUnretrievableAttributes",Settings:"settings",Usage:"usage"},rm={AddObject:"addObject",UpdateObject:"updateObject",PartialUpdateObject:"partialUpdateObject",PartialUpdateObjectNoCreate:"partialUpdateObjectNoCreate",DeleteObject:"deleteObject",DeleteIndex:"delete",ClearIndex:"clear"},xk={Settings:"settings",Synonyms:"synonyms",Rules:"rules"},syt={None:"none",StopIfEnoughMatches:"stopIfEnoughMatches"},oyt={Synonym:"synonym",OneWaySynonym:"oneWaySynonym",AltCorrection1:"altCorrection1",AltCorrection2:"altCorrection2",Placeholder:"placeholder"};Ft.ApiKeyACLEnum=iyt;Ft.BatchActionEnum=rm;Ft.ScopeEnum=xk;Ft.StrategyEnum=syt;Ft.SynonymEnum=oyt;Ft.addApiKey=Xdt;Ft.assignUserID=Zdt;Ft.assignUserIDs=$dt;Ft.batch=lye;Ft.browseObjects=Qmt;Ft.browseRules=Fmt;Ft.browseSynonyms=Tmt;Ft.chunkedBatch=Sk;Ft.clearDictionaryEntries=emt;Ft.clearObjects=Rmt;Ft.clearRules=Nmt;Ft.clearSynonyms=Lmt;Ft.copyIndex=Pk;Ft.copyRules=tmt;Ft.copySettings=rmt;Ft.copySynonyms=nmt;Ft.createBrowsablePromise=Dk;Ft.createMissingObjectIDError=iye;Ft.createObjectNotFoundError=sye;Ft.createSearchClient=zdt;Ft.createValidUntilNotFoundError=oye;Ft.customRequest=imt;Ft.deleteApiKey=smt;Ft.deleteBy=Mmt;Ft.deleteDictionaryEntries=omt;Ft.deleteIndex=Omt;Ft.deleteObject=Umt;Ft.deleteObjects=cye;Ft.deleteRule=_mt;Ft.deleteSynonym=Hmt;Ft.exists=jmt;Ft.findAnswers=qmt;Ft.findObject=Gmt;Ft.generateSecuredApiKey=amt;Ft.getApiKey=z2;Ft.getAppTask=aye;Ft.getDictionarySettings=lmt;Ft.getLogs=cmt;Ft.getObject=Ymt;Ft.getObjectPosition=Wmt;Ft.getObjects=Vmt;Ft.getRule=Kmt;Ft.getSecuredApiKeyRemainingValidity=umt;Ft.getSettings=uye;Ft.getSynonym=Jmt;Ft.getTask=Aye;Ft.getTopUserIDs=Amt;Ft.getUserID=fmt;Ft.hasPendingMappings=pmt;Ft.initIndex=X2;Ft.listApiKeys=hmt;Ft.listClusters=gmt;Ft.listIndices=dmt;Ft.listUserIDs=mmt;Ft.moveIndex=ymt;Ft.multipleBatch=Emt;Ft.multipleGetObjects=Cmt;Ft.multipleQueries=wmt;Ft.multipleSearchForFacetValues=Imt;Ft.partialUpdateObject=zmt;Ft.partialUpdateObjects=fye;Ft.removeUserID=Bmt;Ft.replaceAllObjects=Xmt;Ft.replaceAllRules=Zmt;Ft.replaceAllSynonyms=$mt;Ft.replaceDictionaryEntries=vmt;Ft.restoreApiKey=Dmt;Ft.saveDictionaryEntries=Pmt;Ft.saveObject=eyt;Ft.saveObjects=YH;Ft.saveRule=tyt;Ft.saveRules=WH;Ft.saveSynonym=ryt;Ft.saveSynonyms=VH;Ft.search=pye;Ft.searchDictionaryEntries=Smt;Ft.searchForFacetValues=hye;Ft.searchRules=gye;Ft.searchSynonyms=dye;Ft.searchUserIDs=xmt;Ft.setDictionarySettings=bmt;Ft.setSettings=nyt;Ft.updateApiKey=kmt;Ft.waitAppTask=kC;Ft.waitTask=Zi});var Eye=_((YWt,yye)=>{yye.exports=mye()});var Cye=_(bk=>{"use strict";Object.defineProperty(bk,"__esModule",{value:!0});function ayt(){return{debug(t,e){return Promise.resolve()},info(t,e){return Promise.resolve()},error(t,e){return Promise.resolve()}}}var lyt={Debug:1,Info:2,Error:3};bk.LogLevelEnum=lyt;bk.createNullLogger=ayt});var Iye=_((VWt,wye)=>{wye.exports=Cye()});var Pye=_(KH=>{"use strict";Object.defineProperty(KH,"__esModule",{value:!0});var Bye=Be("http"),vye=Be("https"),cyt=Be("url"),Dye={keepAlive:!0},uyt=new Bye.Agent(Dye),Ayt=new vye.Agent(Dye);function fyt({agent:t,httpAgent:e,httpsAgent:r,requesterOptions:o={}}={}){let a=e||t||uyt,n=r||t||Ayt;return{send(u){return new Promise(A=>{let p=cyt.parse(u.url),h=p.query===null?p.pathname:`${p.pathname}?${p.query}`,E={...o,agent:p.protocol==="https:"?n:a,hostname:p.hostname,path:h,method:u.method,headers:{...o&&o.headers?o.headers:{},...u.headers},...p.port!==void 0?{port:p.port||""}:{}},I=(p.protocol==="https:"?vye:Bye).request(E,T=>{let L=[];T.on("data",U=>{L=L.concat(U)}),T.on("end",()=>{clearTimeout(b),clearTimeout(C),A({status:T.statusCode||0,content:Buffer.concat(L).toString(),isTimedOut:!1})})}),v=(T,L)=>setTimeout(()=>{I.abort(),A({status:0,content:L,isTimedOut:!0})},T*1e3),b=v(u.connectTimeout,"Connection timeout"),C;I.on("error",T=>{clearTimeout(b),clearTimeout(C),A({status:0,content:T.message,isTimedOut:!1})}),I.once("response",()=>{clearTimeout(b),C=v(u.responseTimeout,"Socket timeout")}),u.data!==void 0&&I.write(u.data),I.end()})},destroy(){return a.destroy(),n.destroy(),Promise.resolve()}}}KH.createNodeHttpRequester=fyt});var xye=_((JWt,Sye)=>{Sye.exports=Pye()});var Fye=_((zWt,Qye)=>{"use strict";var bye=Pme(),pyt=bme(),QC=$me(),zH=G2(),JH=nye(),Ut=Eye(),hyt=Iye(),gyt=xye(),dyt=V2();function kye(t,e,r){let o={appId:t,apiKey:e,timeouts:{connect:2,read:5,write:30},requester:gyt.createNodeHttpRequester(),logger:hyt.createNullLogger(),responsesCache:bye.createNullCache(),requestsCache:bye.createNullCache(),hostsCache:pyt.createInMemoryCache(),userAgent:dyt.createUserAgent(zH.version).add({segment:"Node.js",version:process.versions.node})},a={...o,...r},n=()=>u=>JH.createPersonalizationClient({...o,...u,methods:{getPersonalizationStrategy:JH.getPersonalizationStrategy,setPersonalizationStrategy:JH.setPersonalizationStrategy}});return Ut.createSearchClient({...a,methods:{search:Ut.multipleQueries,searchForFacetValues:Ut.multipleSearchForFacetValues,multipleBatch:Ut.multipleBatch,multipleGetObjects:Ut.multipleGetObjects,multipleQueries:Ut.multipleQueries,copyIndex:Ut.copyIndex,copySettings:Ut.copySettings,copyRules:Ut.copyRules,copySynonyms:Ut.copySynonyms,moveIndex:Ut.moveIndex,listIndices:Ut.listIndices,getLogs:Ut.getLogs,listClusters:Ut.listClusters,multipleSearchForFacetValues:Ut.multipleSearchForFacetValues,getApiKey:Ut.getApiKey,addApiKey:Ut.addApiKey,listApiKeys:Ut.listApiKeys,updateApiKey:Ut.updateApiKey,deleteApiKey:Ut.deleteApiKey,restoreApiKey:Ut.restoreApiKey,assignUserID:Ut.assignUserID,assignUserIDs:Ut.assignUserIDs,getUserID:Ut.getUserID,searchUserIDs:Ut.searchUserIDs,listUserIDs:Ut.listUserIDs,getTopUserIDs:Ut.getTopUserIDs,removeUserID:Ut.removeUserID,hasPendingMappings:Ut.hasPendingMappings,generateSecuredApiKey:Ut.generateSecuredApiKey,getSecuredApiKeyRemainingValidity:Ut.getSecuredApiKeyRemainingValidity,destroy:zH.destroy,clearDictionaryEntries:Ut.clearDictionaryEntries,deleteDictionaryEntries:Ut.deleteDictionaryEntries,getDictionarySettings:Ut.getDictionarySettings,getAppTask:Ut.getAppTask,replaceDictionaryEntries:Ut.replaceDictionaryEntries,saveDictionaryEntries:Ut.saveDictionaryEntries,searchDictionaryEntries:Ut.searchDictionaryEntries,setDictionarySettings:Ut.setDictionarySettings,waitAppTask:Ut.waitAppTask,customRequest:Ut.customRequest,initIndex:u=>A=>Ut.initIndex(u)(A,{methods:{batch:Ut.batch,delete:Ut.deleteIndex,findAnswers:Ut.findAnswers,getObject:Ut.getObject,getObjects:Ut.getObjects,saveObject:Ut.saveObject,saveObjects:Ut.saveObjects,search:Ut.search,searchForFacetValues:Ut.searchForFacetValues,waitTask:Ut.waitTask,setSettings:Ut.setSettings,getSettings:Ut.getSettings,partialUpdateObject:Ut.partialUpdateObject,partialUpdateObjects:Ut.partialUpdateObjects,deleteObject:Ut.deleteObject,deleteObjects:Ut.deleteObjects,deleteBy:Ut.deleteBy,clearObjects:Ut.clearObjects,browseObjects:Ut.browseObjects,getObjectPosition:Ut.getObjectPosition,findObject:Ut.findObject,exists:Ut.exists,saveSynonym:Ut.saveSynonym,saveSynonyms:Ut.saveSynonyms,getSynonym:Ut.getSynonym,searchSynonyms:Ut.searchSynonyms,browseSynonyms:Ut.browseSynonyms,deleteSynonym:Ut.deleteSynonym,clearSynonyms:Ut.clearSynonyms,replaceAllObjects:Ut.replaceAllObjects,replaceAllSynonyms:Ut.replaceAllSynonyms,searchRules:Ut.searchRules,getRule:Ut.getRule,deleteRule:Ut.deleteRule,saveRule:Ut.saveRule,saveRules:Ut.saveRules,replaceAllRules:Ut.replaceAllRules,browseRules:Ut.browseRules,clearRules:Ut.clearRules}}),initAnalytics:()=>u=>QC.createAnalyticsClient({...o,...u,methods:{addABTest:QC.addABTest,getABTest:QC.getABTest,getABTests:QC.getABTests,stopABTest:QC.stopABTest,deleteABTest:QC.deleteABTest}}),initPersonalization:n,initRecommendation:()=>u=>(a.logger.info("The `initRecommendation` method is deprecated. Use `initPersonalization` instead."),n()(u))}})}kye.version=zH.version;Qye.exports=kye});var ZH=_((XWt,XH)=>{var Tye=Fye();XH.exports=Tye;XH.exports.default=Tye});var t6=_(($Wt,Lye)=>{"use strict";var Nye=Object.getOwnPropertySymbols,yyt=Object.prototype.hasOwnProperty,Eyt=Object.prototype.propertyIsEnumerable;function Cyt(t){if(t==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}function wyt(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de",Object.getOwnPropertyNames(t)[0]==="5")return!1;for(var e={},r=0;r<10;r++)e["_"+String.fromCharCode(r)]=r;var o=Object.getOwnPropertyNames(e).map(function(n){return e[n]});if(o.join("")!=="0123456789")return!1;var a={};return"abcdefghijklmnopqrst".split("").forEach(function(n){a[n]=n}),Object.keys(Object.assign({},a)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}Lye.exports=wyt()?Object.assign:function(t,e){for(var r,o=Cyt(t),a,n=1;n{"use strict";var o6=t6(),$c=typeof Symbol=="function"&&Symbol.for,Z2=$c?Symbol.for("react.element"):60103,Iyt=$c?Symbol.for("react.portal"):60106,Byt=$c?Symbol.for("react.fragment"):60107,vyt=$c?Symbol.for("react.strict_mode"):60108,Dyt=$c?Symbol.for("react.profiler"):60114,Pyt=$c?Symbol.for("react.provider"):60109,Syt=$c?Symbol.for("react.context"):60110,xyt=$c?Symbol.for("react.forward_ref"):60112,byt=$c?Symbol.for("react.suspense"):60113,kyt=$c?Symbol.for("react.memo"):60115,Qyt=$c?Symbol.for("react.lazy"):60116,Mye=typeof Symbol=="function"&&Symbol.iterator;function $2(t){for(var e="https://reactjs.org/docs/error-decoder.html?invariant="+t,r=1;rkk.length&&kk.push(t)}function n6(t,e,r,o){var a=typeof t;(a==="undefined"||a==="boolean")&&(t=null);var n=!1;if(t===null)n=!0;else switch(a){case"string":case"number":n=!0;break;case"object":switch(t.$$typeof){case Z2:case Iyt:n=!0}}if(n)return r(o,t,e===""?"."+r6(t,0):e),1;if(n=0,e=e===""?".":e+":",Array.isArray(t))for(var u=0;u{"use strict";Jye.exports=Kye()});var f6=_((rVt,A6)=>{"use strict";var An=A6.exports;A6.exports.default=An;var Ln="\x1B[",eB="\x1B]",TC="\x07",Qk=";",zye=process.env.TERM_PROGRAM==="Apple_Terminal";An.cursorTo=(t,e)=>{if(typeof t!="number")throw new TypeError("The `x` argument is required");return typeof e!="number"?Ln+(t+1)+"G":Ln+(e+1)+";"+(t+1)+"H"};An.cursorMove=(t,e)=>{if(typeof t!="number")throw new TypeError("The `x` argument is required");let r="";return t<0?r+=Ln+-t+"D":t>0&&(r+=Ln+t+"C"),e<0?r+=Ln+-e+"A":e>0&&(r+=Ln+e+"B"),r};An.cursorUp=(t=1)=>Ln+t+"A";An.cursorDown=(t=1)=>Ln+t+"B";An.cursorForward=(t=1)=>Ln+t+"C";An.cursorBackward=(t=1)=>Ln+t+"D";An.cursorLeft=Ln+"G";An.cursorSavePosition=zye?"\x1B7":Ln+"s";An.cursorRestorePosition=zye?"\x1B8":Ln+"u";An.cursorGetPosition=Ln+"6n";An.cursorNextLine=Ln+"E";An.cursorPrevLine=Ln+"F";An.cursorHide=Ln+"?25l";An.cursorShow=Ln+"?25h";An.eraseLines=t=>{let e="";for(let r=0;r[eB,"8",Qk,Qk,e,TC,t,eB,"8",Qk,Qk,TC].join("");An.image=(t,e={})=>{let r=`${eB}1337;File=inline=1`;return e.width&&(r+=`;width=${e.width}`),e.height&&(r+=`;height=${e.height}`),e.preserveAspectRatio===!1&&(r+=";preserveAspectRatio=0"),r+":"+t.toString("base64")+TC};An.iTerm={setCwd:(t=process.cwd())=>`${eB}50;CurrentDir=${t}${TC}`,annotation:(t,e={})=>{let r=`${eB}1337;`,o=typeof e.x<"u",a=typeof e.y<"u";if((o||a)&&!(o&&a&&typeof e.length<"u"))throw new Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");return t=t.replace(/\|/g,""),r+=e.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",e.length>0?r+=(o?[t,e.length,e.x,e.y]:[e.length,t]).join("|"):r+=t,r+TC}}});var Zye=_((nVt,p6)=>{"use strict";var Xye=(t,e)=>{for(let r of Reflect.ownKeys(e))Object.defineProperty(t,r,Object.getOwnPropertyDescriptor(e,r));return t};p6.exports=Xye;p6.exports.default=Xye});var eEe=_((iVt,Tk)=>{"use strict";var Myt=Zye(),Fk=new WeakMap,$ye=(t,e={})=>{if(typeof t!="function")throw new TypeError("Expected a function");let r,o=0,a=t.displayName||t.name||"",n=function(...u){if(Fk.set(n,++o),o===1)r=t.apply(this,u),t=null;else if(e.throw===!0)throw new Error(`Function \`${a}\` can only be called once`);return r};return Myt(n,t),Fk.set(n,o),n};Tk.exports=$ye;Tk.exports.default=$ye;Tk.exports.callCount=t=>{if(!Fk.has(t))throw new Error(`The given function \`${t.name}\` is not wrapped by the \`onetime\` package`);return Fk.get(t)}});var tEe=_((sVt,Rk)=>{Rk.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];process.platform!=="win32"&&Rk.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");process.platform==="linux"&&Rk.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")});var d6=_((oVt,LC)=>{var Ei=global.process,nm=function(t){return t&&typeof t=="object"&&typeof t.removeListener=="function"&&typeof t.emit=="function"&&typeof t.reallyExit=="function"&&typeof t.listeners=="function"&&typeof t.kill=="function"&&typeof t.pid=="number"&&typeof t.on=="function"};nm(Ei)?(rEe=Be("assert"),RC=tEe(),nEe=/^win/i.test(Ei.platform),tB=Be("events"),typeof tB!="function"&&(tB=tB.EventEmitter),Ei.__signal_exit_emitter__?Rs=Ei.__signal_exit_emitter__:(Rs=Ei.__signal_exit_emitter__=new tB,Rs.count=0,Rs.emitted={}),Rs.infinite||(Rs.setMaxListeners(1/0),Rs.infinite=!0),LC.exports=function(t,e){if(!nm(global.process))return function(){};rEe.equal(typeof t,"function","a callback must be provided for exit handler"),NC===!1&&h6();var r="exit";e&&e.alwaysLast&&(r="afterexit");var o=function(){Rs.removeListener(r,t),Rs.listeners("exit").length===0&&Rs.listeners("afterexit").length===0&&Nk()};return Rs.on(r,t),o},Nk=function(){!NC||!nm(global.process)||(NC=!1,RC.forEach(function(e){try{Ei.removeListener(e,Lk[e])}catch{}}),Ei.emit=Mk,Ei.reallyExit=g6,Rs.count-=1)},LC.exports.unload=Nk,im=function(e,r,o){Rs.emitted[e]||(Rs.emitted[e]=!0,Rs.emit(e,r,o))},Lk={},RC.forEach(function(t){Lk[t]=function(){if(!!nm(global.process)){var r=Ei.listeners(t);r.length===Rs.count&&(Nk(),im("exit",null,t),im("afterexit",null,t),nEe&&t==="SIGHUP"&&(t="SIGINT"),Ei.kill(Ei.pid,t))}}}),LC.exports.signals=function(){return RC},NC=!1,h6=function(){NC||!nm(global.process)||(NC=!0,Rs.count+=1,RC=RC.filter(function(e){try{return Ei.on(e,Lk[e]),!0}catch{return!1}}),Ei.emit=sEe,Ei.reallyExit=iEe)},LC.exports.load=h6,g6=Ei.reallyExit,iEe=function(e){!nm(global.process)||(Ei.exitCode=e||0,im("exit",Ei.exitCode,null),im("afterexit",Ei.exitCode,null),g6.call(Ei,Ei.exitCode))},Mk=Ei.emit,sEe=function(e,r){if(e==="exit"&&nm(global.process)){r!==void 0&&(Ei.exitCode=r);var o=Mk.apply(this,arguments);return im("exit",Ei.exitCode,null),im("afterexit",Ei.exitCode,null),o}else return Mk.apply(this,arguments)}):LC.exports=function(){return function(){}};var rEe,RC,nEe,tB,Rs,Nk,im,Lk,NC,h6,g6,iEe,Mk,sEe});var aEe=_((aVt,oEe)=>{"use strict";var Oyt=eEe(),Uyt=d6();oEe.exports=Oyt(()=>{Uyt(()=>{process.stderr.write("\x1B[?25h")},{alwaysLast:!0})})});var m6=_(MC=>{"use strict";var _yt=aEe(),Ok=!1;MC.show=(t=process.stderr)=>{!t.isTTY||(Ok=!1,t.write("\x1B[?25h"))};MC.hide=(t=process.stderr)=>{!t.isTTY||(_yt(),Ok=!0,t.write("\x1B[?25l"))};MC.toggle=(t,e)=>{t!==void 0&&(Ok=t),Ok?MC.show(e):MC.hide(e)}});var AEe=_(rB=>{"use strict";var uEe=rB&&rB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(rB,"__esModule",{value:!0});var lEe=uEe(f6()),cEe=uEe(m6()),Hyt=(t,{showCursor:e=!1}={})=>{let r=0,o="",a=!1,n=u=>{!e&&!a&&(cEe.default.hide(),a=!0);let A=u+` +`;A!==o&&(o=A,t.write(lEe.default.eraseLines(r)+A),r=A.split(` +`).length)};return n.clear=()=>{t.write(lEe.default.eraseLines(r)),o="",r=0},n.done=()=>{o="",r=0,e||(cEe.default.show(),a=!1)},n};rB.default={create:Hyt}});var fEe=_((uVt,jyt)=>{jyt.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY_BUILD_BASE",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}}]});var gEe=_(gl=>{"use strict";var hEe=fEe(),pA=process.env;Object.defineProperty(gl,"_vendors",{value:hEe.map(function(t){return t.constant})});gl.name=null;gl.isPR=null;hEe.forEach(function(t){var e=Array.isArray(t.env)?t.env:[t.env],r=e.every(function(o){return pEe(o)});if(gl[t.constant]=r,r)switch(gl.name=t.name,typeof t.pr){case"string":gl.isPR=!!pA[t.pr];break;case"object":"env"in t.pr?gl.isPR=t.pr.env in pA&&pA[t.pr.env]!==t.pr.ne:"any"in t.pr?gl.isPR=t.pr.any.some(function(o){return!!pA[o]}):gl.isPR=pEe(t.pr);break;default:gl.isPR=null}});gl.isCI=!!(pA.CI||pA.CONTINUOUS_INTEGRATION||pA.BUILD_NUMBER||pA.RUN_ID||gl.name);function pEe(t){return typeof t=="string"?!!pA[t]:Object.keys(t).every(function(e){return pA[e]===t[e]})}});var mEe=_((fVt,dEe)=>{"use strict";dEe.exports=gEe().isCI});var EEe=_((pVt,yEe)=>{"use strict";var qyt=t=>{let e=new Set;do for(let r of Reflect.ownKeys(t))e.add([t,r]);while((t=Reflect.getPrototypeOf(t))&&t!==Object.prototype);return e};yEe.exports=(t,{include:e,exclude:r}={})=>{let o=a=>{let n=u=>typeof u=="string"?a===u:u.test(a);return e?e.some(n):r?!r.some(n):!0};for(let[a,n]of qyt(t.constructor.prototype)){if(n==="constructor"||!o(n))continue;let u=Reflect.getOwnPropertyDescriptor(a,n);u&&typeof u.value=="function"&&(t[n]=t[n].bind(t))}return t}});var PEe=_(kn=>{"use strict";Object.defineProperty(kn,"__esModule",{value:!0});var UC,sB,qk,Gk,v6;typeof window>"u"||typeof MessageChannel!="function"?(OC=null,y6=null,E6=function(){if(OC!==null)try{var t=kn.unstable_now();OC(!0,t),OC=null}catch(e){throw setTimeout(E6,0),e}},CEe=Date.now(),kn.unstable_now=function(){return Date.now()-CEe},UC=function(t){OC!==null?setTimeout(UC,0,t):(OC=t,setTimeout(E6,0))},sB=function(t,e){y6=setTimeout(t,e)},qk=function(){clearTimeout(y6)},Gk=function(){return!1},v6=kn.unstable_forceFrameRate=function(){}):(Uk=window.performance,C6=window.Date,wEe=window.setTimeout,IEe=window.clearTimeout,typeof console<"u"&&(BEe=window.cancelAnimationFrame,typeof window.requestAnimationFrame!="function"&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),typeof BEe!="function"&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills")),typeof Uk=="object"&&typeof Uk.now=="function"?kn.unstable_now=function(){return Uk.now()}:(vEe=C6.now(),kn.unstable_now=function(){return C6.now()-vEe}),nB=!1,iB=null,_k=-1,w6=5,I6=0,Gk=function(){return kn.unstable_now()>=I6},v6=function(){},kn.unstable_forceFrameRate=function(t){0>t||125jk(u,r))p!==void 0&&0>jk(p,u)?(t[o]=p,t[A]=r,o=A):(t[o]=u,t[n]=r,o=n);else if(p!==void 0&&0>jk(p,r))t[o]=p,t[A]=r,o=A;else break e}}return e}return null}function jk(t,e){var r=t.sortIndex-e.sortIndex;return r!==0?r:t.id-e.id}var eu=[],m0=[],Gyt=1,na=null,Lo=3,Wk=!1,sm=!1,oB=!1;function Vk(t){for(var e=nc(m0);e!==null;){if(e.callback===null)Yk(m0);else if(e.startTime<=t)Yk(m0),e.sortIndex=e.expirationTime,D6(eu,e);else break;e=nc(m0)}}function P6(t){if(oB=!1,Vk(t),!sm)if(nc(eu)!==null)sm=!0,UC(S6);else{var e=nc(m0);e!==null&&sB(P6,e.startTime-t)}}function S6(t,e){sm=!1,oB&&(oB=!1,qk()),Wk=!0;var r=Lo;try{for(Vk(e),na=nc(eu);na!==null&&(!(na.expirationTime>e)||t&&!Gk());){var o=na.callback;if(o!==null){na.callback=null,Lo=na.priorityLevel;var a=o(na.expirationTime<=e);e=kn.unstable_now(),typeof a=="function"?na.callback=a:na===nc(eu)&&Yk(eu),Vk(e)}else Yk(eu);na=nc(eu)}if(na!==null)var n=!0;else{var u=nc(m0);u!==null&&sB(P6,u.startTime-e),n=!1}return n}finally{na=null,Lo=r,Wk=!1}}function DEe(t){switch(t){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1e4;default:return 5e3}}var Yyt=v6;kn.unstable_ImmediatePriority=1;kn.unstable_UserBlockingPriority=2;kn.unstable_NormalPriority=3;kn.unstable_IdlePriority=5;kn.unstable_LowPriority=4;kn.unstable_runWithPriority=function(t,e){switch(t){case 1:case 2:case 3:case 4:case 5:break;default:t=3}var r=Lo;Lo=t;try{return e()}finally{Lo=r}};kn.unstable_next=function(t){switch(Lo){case 1:case 2:case 3:var e=3;break;default:e=Lo}var r=Lo;Lo=e;try{return t()}finally{Lo=r}};kn.unstable_scheduleCallback=function(t,e,r){var o=kn.unstable_now();if(typeof r=="object"&&r!==null){var a=r.delay;a=typeof a=="number"&&0o?(t.sortIndex=a,D6(m0,t),nc(eu)===null&&t===nc(m0)&&(oB?qk():oB=!0,sB(P6,a-o))):(t.sortIndex=r,D6(eu,t),sm||Wk||(sm=!0,UC(S6))),t};kn.unstable_cancelCallback=function(t){t.callback=null};kn.unstable_wrapCallback=function(t){var e=Lo;return function(){var r=Lo;Lo=e;try{return t.apply(this,arguments)}finally{Lo=r}}};kn.unstable_getCurrentPriorityLevel=function(){return Lo};kn.unstable_shouldYield=function(){var t=kn.unstable_now();Vk(t);var e=nc(eu);return e!==na&&na!==null&&e!==null&&e.callback!==null&&e.startTime<=t&&e.expirationTime{"use strict";SEe.exports=PEe()});var xEe=_((dVt,aB)=>{aB.exports=function t(e){"use strict";var r=t6(),o=sn(),a=x6();function n(P){for(var D="https://reactjs.org/docs/error-decoder.html?invariant="+P,R=1;Rao||(P.current=yl[ao],yl[ao]=null,ao--)}function Mn(P,D){ao++,yl[ao]=P.current,P.current=D}var Ni={},On={current:Ni},_i={current:!1},tr=Ni;function Me(P,D){var R=P.type.contextTypes;if(!R)return Ni;var j=P.stateNode;if(j&&j.__reactInternalMemoizedUnmaskedChildContext===D)return j.__reactInternalMemoizedMaskedChildContext;var Y={},fe;for(fe in R)Y[fe]=D[fe];return j&&(P=P.stateNode,P.__reactInternalMemoizedUnmaskedChildContext=D,P.__reactInternalMemoizedMaskedChildContext=Y),Y}function ii(P){return P=P.childContextTypes,P!=null}function Oa(P){Kn(_i,P),Kn(On,P)}function hr(P){Kn(_i,P),Kn(On,P)}function uc(P,D,R){if(On.current!==Ni)throw Error(n(168));Mn(On,D,P),Mn(_i,R,P)}function uu(P,D,R){var j=P.stateNode;if(P=D.childContextTypes,typeof j.getChildContext!="function")return R;j=j.getChildContext();for(var Y in j)if(!(Y in P))throw Error(n(108,ae(D)||"Unknown",Y));return r({},R,{},j)}function Ac(P){var D=P.stateNode;return D=D&&D.__reactInternalMemoizedMergedChildContext||Ni,tr=On.current,Mn(On,D,P),Mn(_i,_i.current,P),!0}function El(P,D,R){var j=P.stateNode;if(!j)throw Error(n(169));R?(D=uu(P,D,tr),j.__reactInternalMemoizedMergedChildContext=D,Kn(_i,P),Kn(On,P),Mn(On,D,P)):Kn(_i,P),Mn(_i,R,P)}var vA=a.unstable_runWithPriority,Au=a.unstable_scheduleCallback,Ce=a.unstable_cancelCallback,Tt=a.unstable_shouldYield,fc=a.unstable_requestPaint,Hi=a.unstable_now,fu=a.unstable_getCurrentPriorityLevel,Yt=a.unstable_ImmediatePriority,Cl=a.unstable_UserBlockingPriority,DA=a.unstable_NormalPriority,cp=a.unstable_LowPriority,pc=a.unstable_IdlePriority,PA={},Qn=fc!==void 0?fc:function(){},hi=null,hc=null,SA=!1,sa=Hi(),Li=1e4>sa?Hi:function(){return Hi()-sa};function _o(){switch(fu()){case Yt:return 99;case Cl:return 98;case DA:return 97;case cp:return 96;case pc:return 95;default:throw Error(n(332))}}function Ze(P){switch(P){case 99:return Yt;case 98:return Cl;case 97:return DA;case 96:return cp;case 95:return pc;default:throw Error(n(332))}}function lo(P,D){return P=Ze(P),vA(P,D)}function gc(P,D,R){return P=Ze(P),Au(P,D,R)}function pu(P){return hi===null?(hi=[P],hc=Au(Yt,hu)):hi.push(P),PA}function ji(){if(hc!==null){var P=hc;hc=null,Ce(P)}hu()}function hu(){if(!SA&&hi!==null){SA=!0;var P=0;try{var D=hi;lo(99,function(){for(;P=D&&(qo=!0),P.firstContext=null)}function ms(P,D){if(aa!==P&&D!==!1&&D!==0)if((typeof D!="number"||D===1073741823)&&(aa=P,D=1073741823),D={context:P,observedBits:D,next:null},Us===null){if(co===null)throw Error(n(308));Us=D,co.dependencies={expirationTime:0,firstContext:D,responders:null}}else Us=Us.next=D;return x?P._currentValue:P._currentValue2}var _s=!1;function Un(P){return{baseState:P,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Pn(P){return{baseState:P.baseState,firstUpdate:P.firstUpdate,lastUpdate:P.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function ys(P,D){return{expirationTime:P,suspenseConfig:D,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function We(P,D){P.lastUpdate===null?P.firstUpdate=P.lastUpdate=D:(P.lastUpdate.next=D,P.lastUpdate=D)}function tt(P,D){var R=P.alternate;if(R===null){var j=P.updateQueue,Y=null;j===null&&(j=P.updateQueue=Un(P.memoizedState))}else j=P.updateQueue,Y=R.updateQueue,j===null?Y===null?(j=P.updateQueue=Un(P.memoizedState),Y=R.updateQueue=Un(R.memoizedState)):j=P.updateQueue=Pn(Y):Y===null&&(Y=R.updateQueue=Pn(j));Y===null||j===Y?We(j,D):j.lastUpdate===null||Y.lastUpdate===null?(We(j,D),We(Y,D)):(We(j,D),Y.lastUpdate=D)}function It(P,D){var R=P.updateQueue;R=R===null?P.updateQueue=Un(P.memoizedState):nr(P,R),R.lastCapturedUpdate===null?R.firstCapturedUpdate=R.lastCapturedUpdate=D:(R.lastCapturedUpdate.next=D,R.lastCapturedUpdate=D)}function nr(P,D){var R=P.alternate;return R!==null&&D===R.updateQueue&&(D=P.updateQueue=Pn(D)),D}function $(P,D,R,j,Y,fe){switch(R.tag){case 1:return P=R.payload,typeof P=="function"?P.call(fe,j,Y):P;case 3:P.effectTag=P.effectTag&-4097|64;case 0:if(P=R.payload,Y=typeof P=="function"?P.call(fe,j,Y):P,Y==null)break;return r({},j,Y);case 2:_s=!0}return j}function me(P,D,R,j,Y){_s=!1,D=nr(P,D);for(var fe=D.baseState,ve=null,vt=0,wt=D.firstUpdate,bt=fe;wt!==null;){var _r=wt.expirationTime;_rxn?(ai=Fr,Fr=null):ai=Fr.sibling;var en=di(rt,Fr,At[xn],Wt);if(en===null){Fr===null&&(Fr=ai);break}P&&Fr&&en.alternate===null&&D(rt,Fr),Ke=fe(en,Ke,xn),Sn===null?vr=en:Sn.sibling=en,Sn=en,Fr=ai}if(xn===At.length)return R(rt,Fr),vr;if(Fr===null){for(;xnxn?(ai=Fr,Fr=null):ai=Fr.sibling;var ho=di(rt,Fr,en.value,Wt);if(ho===null){Fr===null&&(Fr=ai);break}P&&Fr&&ho.alternate===null&&D(rt,Fr),Ke=fe(ho,Ke,xn),Sn===null?vr=ho:Sn.sibling=ho,Sn=ho,Fr=ai}if(en.done)return R(rt,Fr),vr;if(Fr===null){for(;!en.done;xn++,en=At.next())en=is(rt,en.value,Wt),en!==null&&(Ke=fe(en,Ke,xn),Sn===null?vr=en:Sn.sibling=en,Sn=en);return vr}for(Fr=j(rt,Fr);!en.done;xn++,en=At.next())en=po(Fr,rt,xn,en.value,Wt),en!==null&&(P&&en.alternate!==null&&Fr.delete(en.key===null?xn:en.key),Ke=fe(en,Ke,xn),Sn===null?vr=en:Sn.sibling=en,Sn=en);return P&&Fr.forEach(function(PF){return D(rt,PF)}),vr}return function(rt,Ke,At,Wt){var vr=typeof At=="object"&&At!==null&&At.type===E&&At.key===null;vr&&(At=At.props.children);var Sn=typeof At=="object"&&At!==null;if(Sn)switch(At.$$typeof){case p:e:{for(Sn=At.key,vr=Ke;vr!==null;){if(vr.key===Sn)if(vr.tag===7?At.type===E:vr.elementType===At.type){R(rt,vr.sibling),Ke=Y(vr,At.type===E?At.props.children:At.props,Wt),Ke.ref=kA(rt,vr,At),Ke.return=rt,rt=Ke;break e}else{R(rt,vr);break}else D(rt,vr);vr=vr.sibling}At.type===E?(Ke=xu(At.props.children,rt.mode,Wt,At.key),Ke.return=rt,rt=Ke):(Wt=Hm(At.type,At.key,At.props,null,rt.mode,Wt),Wt.ref=kA(rt,Ke,At),Wt.return=rt,rt=Wt)}return ve(rt);case h:e:{for(vr=At.key;Ke!==null;){if(Ke.key===vr)if(Ke.tag===4&&Ke.stateNode.containerInfo===At.containerInfo&&Ke.stateNode.implementation===At.implementation){R(rt,Ke.sibling),Ke=Y(Ke,At.children||[],Wt),Ke.return=rt,rt=Ke;break e}else{R(rt,Ke);break}else D(rt,Ke);Ke=Ke.sibling}Ke=Fw(At,rt.mode,Wt),Ke.return=rt,rt=Ke}return ve(rt)}if(typeof At=="string"||typeof At=="number")return At=""+At,Ke!==null&&Ke.tag===6?(R(rt,Ke.sibling),Ke=Y(Ke,At,Wt),Ke.return=rt,rt=Ke):(R(rt,Ke),Ke=Qw(At,rt.mode,Wt),Ke.return=rt,rt=Ke),ve(rt);if(bA(At))return VA(rt,Ke,At,Wt);if(Ae(At))return Yo(rt,Ke,At,Wt);if(Sn&&up(rt,At),typeof At>"u"&&!vr)switch(rt.tag){case 1:case 0:throw rt=rt.type,Error(n(152,rt.displayName||rt.name||"Component"))}return R(rt,Ke)}}var gu=ng(!0),ig=ng(!1),du={},uo={current:du},QA={current:du},mc={current:du};function ca(P){if(P===du)throw Error(n(174));return P}function sg(P,D){Mn(mc,D,P),Mn(QA,P,P),Mn(uo,du,P),D=ne(D),Kn(uo,P),Mn(uo,D,P)}function yc(P){Kn(uo,P),Kn(QA,P),Kn(mc,P)}function Pm(P){var D=ca(mc.current),R=ca(uo.current);D=ee(R,P.type,D),R!==D&&(Mn(QA,P,P),Mn(uo,D,P))}function og(P){QA.current===P&&(Kn(uo,P),Kn(QA,P))}var $n={current:0};function Ap(P){for(var D=P;D!==null;){if(D.tag===13){var R=D.memoizedState;if(R!==null&&(R=R.dehydrated,R===null||Ls(R)||so(R)))return D}else if(D.tag===19&&D.memoizedProps.revealOrder!==void 0){if((D.effectTag&64)!==0)return D}else if(D.child!==null){D.child.return=D,D=D.child;continue}if(D===P)break;for(;D.sibling===null;){if(D.return===null||D.return===P)return null;D=D.return}D.sibling.return=D.return,D=D.sibling}return null}function ag(P,D){return{responder:P,props:D}}var FA=u.ReactCurrentDispatcher,Hs=u.ReactCurrentBatchConfig,mu=0,Ha=null,Gi=null,ua=null,yu=null,Es=null,Ec=null,Cc=0,G=null,Dt=0,wl=!1,bi=null,wc=0;function ct(){throw Error(n(321))}function Eu(P,D){if(D===null)return!1;for(var R=0;RCc&&(Cc=_r,_m(Cc))):(Pw(_r,wt.suspenseConfig),fe=wt.eagerReducer===P?wt.eagerState:P(fe,wt.action)),ve=wt,wt=wt.next}while(wt!==null&&wt!==j);bt||(vt=ve,Y=fe),hs(fe,D.memoizedState)||(qo=!0),D.memoizedState=fe,D.baseUpdate=vt,D.baseState=Y,R.lastRenderedState=fe}return[D.memoizedState,R.dispatch]}function cg(P){var D=TA();return typeof P=="function"&&(P=P()),D.memoizedState=D.baseState=P,P=D.queue={last:null,dispatch:null,lastRenderedReducer:Br,lastRenderedState:P},P=P.dispatch=hg.bind(null,Ha,P),[D.memoizedState,P]}function ug(P){return Cs(Br,P)}function Ag(P,D,R,j){return P={tag:P,create:D,destroy:R,deps:j,next:null},G===null?(G={lastEffect:null},G.lastEffect=P.next=P):(D=G.lastEffect,D===null?G.lastEffect=P.next=P:(R=D.next,D.next=P,P.next=R,G.lastEffect=P)),P}function pp(P,D,R,j){var Y=TA();Dt|=P,Y.memoizedState=Ag(D,R,void 0,j===void 0?null:j)}function Ic(P,D,R,j){var Y=fp();j=j===void 0?null:j;var fe=void 0;if(Gi!==null){var ve=Gi.memoizedState;if(fe=ve.destroy,j!==null&&Eu(j,ve.deps)){Ag(0,R,fe,j);return}}Dt|=P,Y.memoizedState=Ag(D,R,fe,j)}function Ct(P,D){return pp(516,192,P,D)}function Sm(P,D){return Ic(516,192,P,D)}function fg(P,D){if(typeof D=="function")return P=P(),D(P),function(){D(null)};if(D!=null)return P=P(),D.current=P,function(){D.current=null}}function pg(){}function Cu(P,D){return TA().memoizedState=[P,D===void 0?null:D],P}function xm(P,D){var R=fp();D=D===void 0?null:D;var j=R.memoizedState;return j!==null&&D!==null&&Eu(D,j[1])?j[0]:(R.memoizedState=[P,D],P)}function hg(P,D,R){if(!(25>wc))throw Error(n(301));var j=P.alternate;if(P===Ha||j!==null&&j===Ha)if(wl=!0,P={expirationTime:mu,suspenseConfig:null,action:R,eagerReducer:null,eagerState:null,next:null},bi===null&&(bi=new Map),R=bi.get(D),R===void 0)bi.set(D,P);else{for(D=R;D.next!==null;)D=D.next;D.next=P}else{var Y=ga(),fe=pt.suspense;Y=HA(Y,P,fe),fe={expirationTime:Y,suspenseConfig:fe,action:R,eagerReducer:null,eagerState:null,next:null};var ve=D.last;if(ve===null)fe.next=fe;else{var vt=ve.next;vt!==null&&(fe.next=vt),ve.next=fe}if(D.last=fe,P.expirationTime===0&&(j===null||j.expirationTime===0)&&(j=D.lastRenderedReducer,j!==null))try{var wt=D.lastRenderedState,bt=j(wt,R);if(fe.eagerReducer=j,fe.eagerState=bt,hs(bt,wt))return}catch{}finally{}Sc(P,Y)}}var wu={readContext:ms,useCallback:ct,useContext:ct,useEffect:ct,useImperativeHandle:ct,useLayoutEffect:ct,useMemo:ct,useReducer:ct,useRef:ct,useState:ct,useDebugValue:ct,useResponder:ct,useDeferredValue:ct,useTransition:ct},yw={readContext:ms,useCallback:Cu,useContext:ms,useEffect:Ct,useImperativeHandle:function(P,D,R){return R=R!=null?R.concat([P]):null,pp(4,36,fg.bind(null,D,P),R)},useLayoutEffect:function(P,D){return pp(4,36,P,D)},useMemo:function(P,D){var R=TA();return D=D===void 0?null:D,P=P(),R.memoizedState=[P,D],P},useReducer:function(P,D,R){var j=TA();return D=R!==void 0?R(D):D,j.memoizedState=j.baseState=D,P=j.queue={last:null,dispatch:null,lastRenderedReducer:P,lastRenderedState:D},P=P.dispatch=hg.bind(null,Ha,P),[j.memoizedState,P]},useRef:function(P){var D=TA();return P={current:P},D.memoizedState=P},useState:cg,useDebugValue:pg,useResponder:ag,useDeferredValue:function(P,D){var R=cg(P),j=R[0],Y=R[1];return Ct(function(){a.unstable_next(function(){var fe=Hs.suspense;Hs.suspense=D===void 0?null:D;try{Y(P)}finally{Hs.suspense=fe}})},[P,D]),j},useTransition:function(P){var D=cg(!1),R=D[0],j=D[1];return[Cu(function(Y){j(!0),a.unstable_next(function(){var fe=Hs.suspense;Hs.suspense=P===void 0?null:P;try{j(!1),Y()}finally{Hs.suspense=fe}})},[P,R]),R]}},bm={readContext:ms,useCallback:xm,useContext:ms,useEffect:Sm,useImperativeHandle:function(P,D,R){return R=R!=null?R.concat([P]):null,Ic(4,36,fg.bind(null,D,P),R)},useLayoutEffect:function(P,D){return Ic(4,36,P,D)},useMemo:function(P,D){var R=fp();D=D===void 0?null:D;var j=R.memoizedState;return j!==null&&D!==null&&Eu(D,j[1])?j[0]:(P=P(),R.memoizedState=[P,D],P)},useReducer:Cs,useRef:function(){return fp().memoizedState},useState:ug,useDebugValue:pg,useResponder:ag,useDeferredValue:function(P,D){var R=ug(P),j=R[0],Y=R[1];return Sm(function(){a.unstable_next(function(){var fe=Hs.suspense;Hs.suspense=D===void 0?null:D;try{Y(P)}finally{Hs.suspense=fe}})},[P,D]),j},useTransition:function(P){var D=ug(!1),R=D[0],j=D[1];return[xm(function(Y){j(!0),a.unstable_next(function(){var fe=Hs.suspense;Hs.suspense=P===void 0?null:P;try{j(!1),Y()}finally{Hs.suspense=fe}})},[P,R]),R]}},Aa=null,Bc=null,Il=!1;function Iu(P,D){var R=Dl(5,null,null,0);R.elementType="DELETED",R.type="DELETED",R.stateNode=D,R.return=P,R.effectTag=8,P.lastEffect!==null?(P.lastEffect.nextEffect=R,P.lastEffect=R):P.firstEffect=P.lastEffect=R}function gg(P,D){switch(P.tag){case 5:return D=io(D,P.type,P.pendingProps),D!==null?(P.stateNode=D,!0):!1;case 6:return D=Si(D,P.pendingProps),D!==null?(P.stateNode=D,!0):!1;case 13:return!1;default:return!1}}function RA(P){if(Il){var D=Bc;if(D){var R=D;if(!gg(P,D)){if(D=cc(R),!D||!gg(P,D)){P.effectTag=P.effectTag&-1025|2,Il=!1,Aa=P;return}Iu(Aa,R)}Aa=P,Bc=cu(D)}else P.effectTag=P.effectTag&-1025|2,Il=!1,Aa=P}}function hp(P){for(P=P.return;P!==null&&P.tag!==5&&P.tag!==3&&P.tag!==13;)P=P.return;Aa=P}function ja(P){if(!y||P!==Aa)return!1;if(!Il)return hp(P),Il=!0,!1;var D=P.type;if(P.tag!==5||D!=="head"&&D!=="body"&&!Qe(D,P.memoizedProps))for(D=Bc;D;)Iu(P,D),D=cc(D);if(hp(P),P.tag===13){if(!y)throw Error(n(316));if(P=P.memoizedState,P=P!==null?P.dehydrated:null,!P)throw Error(n(317));Bc=Ms(P)}else Bc=Aa?cc(P.stateNode):null;return!0}function dg(){y&&(Bc=Aa=null,Il=!1)}var gp=u.ReactCurrentOwner,qo=!1;function ws(P,D,R,j){D.child=P===null?ig(D,null,R,j):gu(D,P.child,R,j)}function Ii(P,D,R,j,Y){R=R.render;var fe=D.ref;return ds(D,Y),j=lg(P,D,R,j,fe,Y),P!==null&&!qo?(D.updateQueue=P.updateQueue,D.effectTag&=-517,P.expirationTime<=Y&&(P.expirationTime=0),si(P,D,Y)):(D.effectTag|=1,ws(P,D,j,Y),D.child)}function km(P,D,R,j,Y,fe){if(P===null){var ve=R.type;return typeof ve=="function"&&!kw(ve)&&ve.defaultProps===void 0&&R.compare===null&&R.defaultProps===void 0?(D.tag=15,D.type=ve,Qm(P,D,ve,j,Y,fe)):(P=Hm(R.type,null,j,null,D.mode,fe),P.ref=D.ref,P.return=D,D.child=P)}return ve=P.child,YD)&&_A.set(P,D)))}}function vg(P,D){P.expirationTimeP?D:P)}function fo(P){if(P.lastExpiredTime!==0)P.callbackExpirationTime=1073741823,P.callbackPriority=99,P.callbackNode=pu(Dw.bind(null,P));else{var D=Um(P),R=P.callbackNode;if(D===0)R!==null&&(P.callbackNode=null,P.callbackExpirationTime=0,P.callbackPriority=90);else{var j=ga();if(D===1073741823?j=99:D===1||D===2?j=95:(j=10*(1073741821-D)-10*(1073741821-j),j=0>=j?99:250>=j?98:5250>=j?97:95),R!==null){var Y=P.callbackPriority;if(P.callbackExpirationTime===D&&Y>=j)return;R!==PA&&Ce(R)}P.callbackExpirationTime=D,P.callbackPriority=j,D=D===1073741823?pu(Dw.bind(null,P)):gc(j,Wv.bind(null,P),{timeout:10*(1073741821-D)-Li()}),P.callbackNode=D}}}function Wv(P,D){if(Om=0,D)return D=ga(),jm(P,D),fo(P),null;var R=Um(P);if(R!==0){if(D=P.callbackNode,(yr&(rs|js))!==En)throw Error(n(327));if(Ip(),P===gi&&R===ns||Pu(P,R),Mr!==null){var j=yr;yr|=rs;var Y=qA(P);do try{gF();break}catch(vt){jA(P,vt)}while(1);if(la(),yr=j,Ep.current=Y,Yi===Rm)throw D=Nm,Pu(P,R),WA(P,R),fo(P),D;if(Mr===null)switch(Y=P.finishedWork=P.current.alternate,P.finishedExpirationTime=R,j=Yi,gi=null,j){case Bu:case Rm:throw Error(n(345));case Bi:jm(P,2=R){P.lastPingedTime=R,Pu(P,R);break}}if(fe=Um(P),fe!==0&&fe!==R)break;if(j!==0&&j!==R){P.lastPingedTime=j;break}P.timeoutHandle=Te(Su.bind(null,P),Y);break}Su(P);break;case vl:if(WA(P,R),j=P.lastSuspendedTime,R===j&&(P.nextKnownPendingLevel=Sw(Y)),OA&&(Y=P.lastPingedTime,Y===0||Y>=R)){P.lastPingedTime=R,Pu(P,R);break}if(Y=Um(P),Y!==0&&Y!==R)break;if(j!==0&&j!==R){P.lastPingedTime=j;break}if(MA!==1073741823?j=10*(1073741821-MA)-Li():Ya===1073741823?j=0:(j=10*(1073741821-Ya)-5e3,Y=Li(),R=10*(1073741821-R)-Y,j=Y-j,0>j&&(j=0),j=(120>j?120:480>j?480:1080>j?1080:1920>j?1920:3e3>j?3e3:4320>j?4320:1960*Cw(j/1960))-j,R=j?j=0:(Y=ve.busyDelayMs|0,fe=Li()-(10*(1073741821-fe)-(ve.timeoutMs|0||5e3)),j=fe<=Y?0:Y+j-fe),10 component higher in the tree to provide a loading indicator or placeholder to display.`+ml(Y))}Yi!==Pc&&(Yi=Bi),fe=yg(fe,Y),wt=j;do{switch(wt.tag){case 3:ve=fe,wt.effectTag|=4096,wt.expirationTime=D;var Ke=Gv(wt,ve,D);It(wt,Ke);break e;case 1:ve=fe;var At=wt.type,Wt=wt.stateNode;if((wt.effectTag&64)===0&&(typeof At.getDerivedStateFromError=="function"||Wt!==null&&typeof Wt.componentDidCatch=="function"&&(Du===null||!Du.has(Wt)))){wt.effectTag|=4096,wt.expirationTime=D;var vr=Yv(wt,ve,D);It(wt,vr);break e}}wt=wt.return}while(wt!==null)}Mr=zv(Mr)}catch(Sn){D=Sn;continue}break}while(1)}function qA(){var P=Ep.current;return Ep.current=wu,P===null?wu:P}function Pw(P,D){PCp&&(Cp=P)}function hF(){for(;Mr!==null;)Mr=Jv(Mr)}function gF(){for(;Mr!==null&&!Tt();)Mr=Jv(Mr)}function Jv(P){var D=Zv(P.alternate,P,ns);return P.memoizedProps=P.pendingProps,D===null&&(D=zv(P)),ww.current=null,D}function zv(P){Mr=P;do{var D=Mr.alternate;if(P=Mr.return,(Mr.effectTag&2048)===0){e:{var R=D;D=Mr;var j=ns,Y=D.pendingProps;switch(D.tag){case 2:break;case 16:break;case 15:case 0:break;case 1:ii(D.type)&&Oa(D);break;case 3:yc(D),hr(D),Y=D.stateNode,Y.pendingContext&&(Y.context=Y.pendingContext,Y.pendingContext=null),(R===null||R.child===null)&&ja(D)&&pa(D),Bl(D);break;case 5:og(D);var fe=ca(mc.current);if(j=D.type,R!==null&&D.stateNode!=null)ts(R,D,j,Y,fe),R.ref!==D.ref&&(D.effectTag|=128);else if(Y){if(R=ca(uo.current),ja(D)){if(Y=D,!y)throw Error(n(175));R=ap(Y.stateNode,Y.type,Y.memoizedProps,fe,R,Y),Y.updateQueue=R,R=R!==null,R&&pa(D)}else{var ve=ht(j,Y,fe,R,D);vc(ve,D,!1,!1),D.stateNode=ve,lt(ve,j,Y,fe,R)&&pa(D)}D.ref!==null&&(D.effectTag|=128)}else if(D.stateNode===null)throw Error(n(166));break;case 6:if(R&&D.stateNode!=null)Gr(R,D,R.memoizedProps,Y);else{if(typeof Y!="string"&&D.stateNode===null)throw Error(n(166));if(R=ca(mc.current),fe=ca(uo.current),ja(D)){if(R=D,!y)throw Error(n(176));(R=lp(R.stateNode,R.memoizedProps,R))&&pa(D)}else D.stateNode=_e(Y,R,fe,D)}break;case 11:break;case 13:if(Kn($n,D),Y=D.memoizedState,(D.effectTag&64)!==0){D.expirationTime=j;break e}Y=Y!==null,fe=!1,R===null?D.memoizedProps.fallback!==void 0&&ja(D):(j=R.memoizedState,fe=j!==null,Y||j===null||(j=R.child.sibling,j!==null&&(ve=D.firstEffect,ve!==null?(D.firstEffect=j,j.nextEffect=ve):(D.firstEffect=D.lastEffect=j,j.nextEffect=null),j.effectTag=8))),Y&&!fe&&(D.mode&2)!==0&&(R===null&&D.memoizedProps.unstable_avoidThisFallback!==!0||($n.current&1)!==0?Yi===Bu&&(Yi=ha):((Yi===Bu||Yi===ha)&&(Yi=vl),Cp!==0&&gi!==null&&(WA(gi,ns),eD(gi,Cp)))),S&&Y&&(D.effectTag|=4),w&&(Y||fe)&&(D.effectTag|=4);break;case 7:break;case 8:break;case 12:break;case 4:yc(D),Bl(D);break;case 10:wi(D);break;case 9:break;case 14:break;case 17:ii(D.type)&&Oa(D);break;case 19:if(Kn($n,D),Y=D.memoizedState,Y===null)break;if(fe=(D.effectTag&64)!==0,ve=Y.rendering,ve===null){if(fe)Dc(Y,!1);else if(Yi!==Bu||R!==null&&(R.effectTag&64)!==0)for(R=D.child;R!==null;){if(ve=Ap(R),ve!==null){for(D.effectTag|=64,Dc(Y,!1),R=ve.updateQueue,R!==null&&(D.updateQueue=R,D.effectTag|=4),Y.lastEffect===null&&(D.firstEffect=null),D.lastEffect=Y.lastEffect,R=j,Y=D.child;Y!==null;)fe=Y,j=R,fe.effectTag&=2,fe.nextEffect=null,fe.firstEffect=null,fe.lastEffect=null,ve=fe.alternate,ve===null?(fe.childExpirationTime=0,fe.expirationTime=j,fe.child=null,fe.memoizedProps=null,fe.memoizedState=null,fe.updateQueue=null,fe.dependencies=null):(fe.childExpirationTime=ve.childExpirationTime,fe.expirationTime=ve.expirationTime,fe.child=ve.child,fe.memoizedProps=ve.memoizedProps,fe.memoizedState=ve.memoizedState,fe.updateQueue=ve.updateQueue,j=ve.dependencies,fe.dependencies=j===null?null:{expirationTime:j.expirationTime,firstContext:j.firstContext,responders:j.responders}),Y=Y.sibling;Mn($n,$n.current&1|2,D),D=D.child;break e}R=R.sibling}}else{if(!fe)if(R=Ap(ve),R!==null){if(D.effectTag|=64,fe=!0,R=R.updateQueue,R!==null&&(D.updateQueue=R,D.effectTag|=4),Dc(Y,!0),Y.tail===null&&Y.tailMode==="hidden"&&!ve.alternate){D=D.lastEffect=Y.lastEffect,D!==null&&(D.nextEffect=null);break}}else Li()>Y.tailExpiration&&1Y&&(Y=j),ve>Y&&(Y=ve),fe=fe.sibling;R.childExpirationTime=Y}if(D!==null)return D;P!==null&&(P.effectTag&2048)===0&&(P.firstEffect===null&&(P.firstEffect=Mr.firstEffect),Mr.lastEffect!==null&&(P.lastEffect!==null&&(P.lastEffect.nextEffect=Mr.firstEffect),P.lastEffect=Mr.lastEffect),1P?D:P}function Su(P){var D=_o();return lo(99,dF.bind(null,P,D)),null}function dF(P,D){do Ip();while(Ig!==null);if((yr&(rs|js))!==En)throw Error(n(327));var R=P.finishedWork,j=P.finishedExpirationTime;if(R===null)return null;if(P.finishedWork=null,P.finishedExpirationTime=0,R===P.current)throw Error(n(177));P.callbackNode=null,P.callbackExpirationTime=0,P.callbackPriority=90,P.nextKnownPendingLevel=0;var Y=Sw(R);if(P.firstPendingTime=Y,j<=P.lastSuspendedTime?P.firstSuspendedTime=P.lastSuspendedTime=P.nextKnownPendingLevel=0:j<=P.firstSuspendedTime&&(P.firstSuspendedTime=j-1),j<=P.lastPingedTime&&(P.lastPingedTime=0),j<=P.lastExpiredTime&&(P.lastExpiredTime=0),P===gi&&(Mr=gi=null,ns=0),1=R?ln(P,D,R):(Mn($n,$n.current&1,D),D=si(P,D,R),D!==null?D.sibling:null);Mn($n,$n.current&1,D);break;case 19:if(j=D.childExpirationTime>=R,(P.effectTag&64)!==0){if(j)return qa(P,D,R);D.effectTag|=64}if(Y=D.memoizedState,Y!==null&&(Y.rendering=null,Y.tail=null),Mn($n,$n.current,D),!j)return null}return si(P,D,R)}qo=!1}}else qo=!1;switch(D.expirationTime=0,D.tag){case 2:if(j=D.type,P!==null&&(P.alternate=null,D.alternate=null,D.effectTag|=2),P=D.pendingProps,Y=Me(D,On.current),ds(D,R),Y=lg(null,D,j,P,Y,R),D.effectTag|=1,typeof Y=="object"&&Y!==null&&typeof Y.render=="function"&&Y.$$typeof===void 0){if(D.tag=1,mw(),ii(j)){var fe=!0;Ac(D)}else fe=!1;D.memoizedState=Y.state!==null&&Y.state!==void 0?Y.state:null;var ve=j.getDerivedStateFromProps;typeof ve=="function"&&er(D,j,ve,P),Y.updater=Zr,D.stateNode=Y,Y._reactInternalFiber=D,jo(D,j,P,R),D=mp(null,D,j,!0,fe,R)}else D.tag=0,ws(null,D,Y,R),D=D.child;return D;case 16:if(Y=D.elementType,P!==null&&(P.alternate=null,D.alternate=null,D.effectTag|=2),P=D.pendingProps,ye(Y),Y._status!==1)throw Y._result;switch(Y=Y._result,D.type=Y,fe=D.tag=BF(Y),P=Ci(Y,P),fe){case 0:D=NA(null,D,Y,P,R);break;case 1:D=dp(null,D,Y,P,R);break;case 11:D=Ii(null,D,Y,P,R);break;case 14:D=km(null,D,Y,Ci(Y.type,P),j,R);break;default:throw Error(n(306,Y,""))}return D;case 0:return j=D.type,Y=D.pendingProps,Y=D.elementType===j?Y:Ci(j,Y),NA(P,D,j,Y,R);case 1:return j=D.type,Y=D.pendingProps,Y=D.elementType===j?Y:Ci(j,Y),dp(P,D,j,Y,R);case 3:if(mg(D),j=D.updateQueue,j===null)throw Error(n(282));if(Y=D.memoizedState,Y=Y!==null?Y.element:null,me(D,j,D.pendingProps,null,R),j=D.memoizedState.element,j===Y)dg(),D=si(P,D,R);else{if((Y=D.stateNode.hydrate)&&(y?(Bc=cu(D.stateNode.containerInfo),Aa=D,Y=Il=!0):Y=!1),Y)for(R=ig(D,null,j,R),D.child=R;R;)R.effectTag=R.effectTag&-3|1024,R=R.sibling;else ws(P,D,j,R),dg();D=D.child}return D;case 5:return Pm(D),P===null&&RA(D),j=D.type,Y=D.pendingProps,fe=P!==null?P.memoizedProps:null,ve=Y.children,Qe(j,Y)?ve=null:fe!==null&&Qe(j,fe)&&(D.effectTag|=16),Go(P,D),D.mode&4&&R!==1&&be(j,Y)?(D.expirationTime=D.childExpirationTime=1,D=null):(ws(P,D,ve,R),D=D.child),D;case 6:return P===null&&RA(D),null;case 13:return ln(P,D,R);case 4:return sg(D,D.stateNode.containerInfo),j=D.pendingProps,P===null?D.child=gu(D,null,j,R):ws(P,D,j,R),D.child;case 11:return j=D.type,Y=D.pendingProps,Y=D.elementType===j?Y:Ci(j,Y),Ii(P,D,j,Y,R);case 7:return ws(P,D,D.pendingProps,R),D.child;case 8:return ws(P,D,D.pendingProps.children,R),D.child;case 12:return ws(P,D,D.pendingProps.children,R),D.child;case 10:e:{if(j=D.type._context,Y=D.pendingProps,ve=D.memoizedProps,fe=Y.value,Ho(D,fe),ve!==null){var vt=ve.value;if(fe=hs(vt,fe)?0:(typeof j._calculateChangedBits=="function"?j._calculateChangedBits(vt,fe):1073741823)|0,fe===0){if(ve.children===Y.children&&!_i.current){D=si(P,D,R);break e}}else for(vt=D.child,vt!==null&&(vt.return=D);vt!==null;){var wt=vt.dependencies;if(wt!==null){ve=vt.child;for(var bt=wt.firstContext;bt!==null;){if(bt.context===j&&(bt.observedBits&fe)!==0){vt.tag===1&&(bt=ys(R,null),bt.tag=2,tt(vt,bt)),vt.expirationTime"u")return!1;var D=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(D.isDisabled||!D.supportsFiber)return!0;try{var R=D.inject(P);xw=function(j){try{D.onCommitFiberRoot(R,j,void 0,(j.current.effectTag&64)===64)}catch{}},bw=function(j){try{D.onCommitFiberUnmount(R,j)}catch{}}}catch{}return!0}function IF(P,D,R,j){this.tag=P,this.key=R,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=D,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=j,this.effectTag=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childExpirationTime=this.expirationTime=0,this.alternate=null}function Dl(P,D,R,j){return new IF(P,D,R,j)}function kw(P){return P=P.prototype,!(!P||!P.isReactComponent)}function BF(P){if(typeof P=="function")return kw(P)?1:0;if(P!=null){if(P=P.$$typeof,P===L)return 11;if(P===te)return 14}return 2}function YA(P,D){var R=P.alternate;return R===null?(R=Dl(P.tag,D,P.key,P.mode),R.elementType=P.elementType,R.type=P.type,R.stateNode=P.stateNode,R.alternate=P,P.alternate=R):(R.pendingProps=D,R.effectTag=0,R.nextEffect=null,R.firstEffect=null,R.lastEffect=null),R.childExpirationTime=P.childExpirationTime,R.expirationTime=P.expirationTime,R.child=P.child,R.memoizedProps=P.memoizedProps,R.memoizedState=P.memoizedState,R.updateQueue=P.updateQueue,D=P.dependencies,R.dependencies=D===null?null:{expirationTime:D.expirationTime,firstContext:D.firstContext,responders:D.responders},R.sibling=P.sibling,R.index=P.index,R.ref=P.ref,R}function Hm(P,D,R,j,Y,fe){var ve=2;if(j=P,typeof P=="function")kw(P)&&(ve=1);else if(typeof P=="string")ve=5;else e:switch(P){case E:return xu(R.children,Y,fe,D);case T:ve=8,Y|=7;break;case I:ve=8,Y|=1;break;case v:return P=Dl(12,R,D,Y|8),P.elementType=v,P.type=v,P.expirationTime=fe,P;case U:return P=Dl(13,R,D,Y),P.type=U,P.elementType=U,P.expirationTime=fe,P;case J:return P=Dl(19,R,D,Y),P.elementType=J,P.expirationTime=fe,P;default:if(typeof P=="object"&&P!==null)switch(P.$$typeof){case b:ve=10;break e;case C:ve=9;break e;case L:ve=11;break e;case te:ve=14;break e;case le:ve=16,j=null;break e}throw Error(n(130,P==null?P:typeof P,""))}return D=Dl(ve,R,D,Y),D.elementType=P,D.type=j,D.expirationTime=fe,D}function xu(P,D,R,j){return P=Dl(7,P,j,D),P.expirationTime=R,P}function Qw(P,D,R){return P=Dl(6,P,null,D),P.expirationTime=R,P}function Fw(P,D,R){return D=Dl(4,P.children!==null?P.children:[],P.key,D),D.expirationTime=R,D.stateNode={containerInfo:P.containerInfo,pendingChildren:null,implementation:P.implementation},D}function vF(P,D,R){this.tag=D,this.current=null,this.containerInfo=P,this.pingCache=this.pendingChildren=null,this.finishedExpirationTime=0,this.finishedWork=null,this.timeoutHandle=He,this.pendingContext=this.context=null,this.hydrate=R,this.callbackNode=null,this.callbackPriority=90,this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}function $v(P,D){var R=P.firstSuspendedTime;return P=P.lastSuspendedTime,R!==0&&R>=D&&P<=D}function WA(P,D){var R=P.firstSuspendedTime,j=P.lastSuspendedTime;RD||R===0)&&(P.lastSuspendedTime=D),D<=P.lastPingedTime&&(P.lastPingedTime=0),D<=P.lastExpiredTime&&(P.lastExpiredTime=0)}function eD(P,D){D>P.firstPendingTime&&(P.firstPendingTime=D);var R=P.firstSuspendedTime;R!==0&&(D>=R?P.firstSuspendedTime=P.lastSuspendedTime=P.nextKnownPendingLevel=0:D>=P.lastSuspendedTime&&(P.lastSuspendedTime=D+1),D>P.nextKnownPendingLevel&&(P.nextKnownPendingLevel=D))}function jm(P,D){var R=P.lastExpiredTime;(R===0||R>D)&&(P.lastExpiredTime=D)}function tD(P){var D=P._reactInternalFiber;if(D===void 0)throw typeof P.render=="function"?Error(n(188)):Error(n(268,Object.keys(P)));return P=Ee(D),P===null?null:P.stateNode}function rD(P,D){P=P.memoizedState,P!==null&&P.dehydrated!==null&&P.retryTime{"use strict";bEe.exports=xEe()});var FEe=_((yVt,QEe)=>{"use strict";var Wyt={ALIGN_COUNT:8,ALIGN_AUTO:0,ALIGN_FLEX_START:1,ALIGN_CENTER:2,ALIGN_FLEX_END:3,ALIGN_STRETCH:4,ALIGN_BASELINE:5,ALIGN_SPACE_BETWEEN:6,ALIGN_SPACE_AROUND:7,DIMENSION_COUNT:2,DIMENSION_WIDTH:0,DIMENSION_HEIGHT:1,DIRECTION_COUNT:3,DIRECTION_INHERIT:0,DIRECTION_LTR:1,DIRECTION_RTL:2,DISPLAY_COUNT:2,DISPLAY_FLEX:0,DISPLAY_NONE:1,EDGE_COUNT:9,EDGE_LEFT:0,EDGE_TOP:1,EDGE_RIGHT:2,EDGE_BOTTOM:3,EDGE_START:4,EDGE_END:5,EDGE_HORIZONTAL:6,EDGE_VERTICAL:7,EDGE_ALL:8,EXPERIMENTAL_FEATURE_COUNT:1,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:0,FLEX_DIRECTION_COUNT:4,FLEX_DIRECTION_COLUMN:0,FLEX_DIRECTION_COLUMN_REVERSE:1,FLEX_DIRECTION_ROW:2,FLEX_DIRECTION_ROW_REVERSE:3,JUSTIFY_COUNT:6,JUSTIFY_FLEX_START:0,JUSTIFY_CENTER:1,JUSTIFY_FLEX_END:2,JUSTIFY_SPACE_BETWEEN:3,JUSTIFY_SPACE_AROUND:4,JUSTIFY_SPACE_EVENLY:5,LOG_LEVEL_COUNT:6,LOG_LEVEL_ERROR:0,LOG_LEVEL_WARN:1,LOG_LEVEL_INFO:2,LOG_LEVEL_DEBUG:3,LOG_LEVEL_VERBOSE:4,LOG_LEVEL_FATAL:5,MEASURE_MODE_COUNT:3,MEASURE_MODE_UNDEFINED:0,MEASURE_MODE_EXACTLY:1,MEASURE_MODE_AT_MOST:2,NODE_TYPE_COUNT:2,NODE_TYPE_DEFAULT:0,NODE_TYPE_TEXT:1,OVERFLOW_COUNT:3,OVERFLOW_VISIBLE:0,OVERFLOW_HIDDEN:1,OVERFLOW_SCROLL:2,POSITION_TYPE_COUNT:2,POSITION_TYPE_RELATIVE:0,POSITION_TYPE_ABSOLUTE:1,PRINT_OPTIONS_COUNT:3,PRINT_OPTIONS_LAYOUT:1,PRINT_OPTIONS_STYLE:2,PRINT_OPTIONS_CHILDREN:4,UNIT_COUNT:4,UNIT_UNDEFINED:0,UNIT_POINT:1,UNIT_PERCENT:2,UNIT_AUTO:3,WRAP_COUNT:3,WRAP_NO_WRAP:0,WRAP_WRAP:1,WRAP_WRAP_REVERSE:2};QEe.exports=Wyt});var LEe=_((EVt,NEe)=>{"use strict";var Vyt=Object.assign||function(t){for(var e=1;e"}}]),t}(),TEe=function(){Kk(t,null,[{key:"fromJS",value:function(r){var o=r.width,a=r.height;return new t(o,a)}}]);function t(e,r){k6(this,t),this.width=e,this.height=r}return Kk(t,[{key:"fromJS",value:function(r){r(this.width,this.height)}},{key:"toString",value:function(){return""}}]),t}(),REe=function(){function t(e,r){k6(this,t),this.unit=e,this.value=r}return Kk(t,[{key:"fromJS",value:function(r){r(this.unit,this.value)}},{key:"toString",value:function(){switch(this.unit){case tu.UNIT_POINT:return String(this.value);case tu.UNIT_PERCENT:return this.value+"%";case tu.UNIT_AUTO:return"auto";default:return this.value+"?"}}},{key:"valueOf",value:function(){return this.value}}]),t}();NEe.exports=function(t,e){function r(u,A,p){var h=u[A];u[A]=function(){for(var E=arguments.length,I=Array(E),v=0;v1?I-1:0),b=1;b1&&arguments[1]!==void 0?arguments[1]:NaN,p=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,h=arguments.length>3&&arguments[3]!==void 0?arguments[3]:tu.DIRECTION_LTR;return u.call(this,A,p,h)}),Vyt({Config:e.Config,Node:e.Node,Layout:t("Layout",Kyt),Size:t("Size",TEe),Value:t("Value",REe),getInstanceCount:function(){return e.getInstanceCount.apply(e,arguments)}},tu)}});var MEe=_((exports,module)=>{(function(t,e){typeof define=="function"&&define.amd?define([],function(){return e}):typeof module=="object"&&module.exports?module.exports=e:(t.nbind=t.nbind||{}).init=e})(exports,function(Module,cb){typeof Module=="function"&&(cb=Module,Module={}),Module.onRuntimeInitialized=function(t,e){return function(){t&&t.apply(this,arguments);try{Module.ccall("nbind_init")}catch(r){e(r);return}e(null,{bind:Module._nbind_value,reflect:Module.NBind.reflect,queryType:Module.NBind.queryType,toggleLightGC:Module.toggleLightGC,lib:Module})}}(Module.onRuntimeInitialized,cb);var Module;Module||(Module=(typeof Module<"u"?Module:null)||{});var moduleOverrides={};for(var key in Module)Module.hasOwnProperty(key)&&(moduleOverrides[key]=Module[key]);var ENVIRONMENT_IS_WEB=!1,ENVIRONMENT_IS_WORKER=!1,ENVIRONMENT_IS_NODE=!1,ENVIRONMENT_IS_SHELL=!1;if(Module.ENVIRONMENT)if(Module.ENVIRONMENT==="WEB")ENVIRONMENT_IS_WEB=!0;else if(Module.ENVIRONMENT==="WORKER")ENVIRONMENT_IS_WORKER=!0;else if(Module.ENVIRONMENT==="NODE")ENVIRONMENT_IS_NODE=!0;else if(Module.ENVIRONMENT==="SHELL")ENVIRONMENT_IS_SHELL=!0;else throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.");else ENVIRONMENT_IS_WEB=typeof window=="object",ENVIRONMENT_IS_WORKER=typeof importScripts=="function",ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof Be=="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER,ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){Module.print||(Module.print=console.log),Module.printErr||(Module.printErr=console.warn);var nodeFS,nodePath;Module.read=function(e,r){nodeFS||(nodeFS={}("")),nodePath||(nodePath={}("")),e=nodePath.normalize(e);var o=nodeFS.readFileSync(e);return r?o:o.toString()},Module.readBinary=function(e){var r=Module.read(e,!0);return r.buffer||(r=new Uint8Array(r)),assert(r.buffer),r},Module.load=function(e){globalEval(read(e))},Module.thisProgram||(process.argv.length>1?Module.thisProgram=process.argv[1].replace(/\\/g,"/"):Module.thisProgram="unknown-program"),Module.arguments=process.argv.slice(2),typeof module<"u"&&(module.exports=Module),Module.inspect=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),typeof printErr<"u"&&(Module.printErr=printErr),typeof read<"u"?Module.read=read:Module.read=function(){throw"no read() available"},Module.readBinary=function(e){if(typeof readbuffer=="function")return new Uint8Array(readbuffer(e));var r=read(e,"binary");return assert(typeof r=="object"),r},typeof scriptArgs<"u"?Module.arguments=scriptArgs:typeof arguments<"u"&&(Module.arguments=arguments),typeof quit=="function"&&(Module.quit=function(t,e){quit(t)});else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(Module.read=function(e){var r=new XMLHttpRequest;return r.open("GET",e,!1),r.send(null),r.responseText},ENVIRONMENT_IS_WORKER&&(Module.readBinary=function(e){var r=new XMLHttpRequest;return r.open("GET",e,!1),r.responseType="arraybuffer",r.send(null),new Uint8Array(r.response)}),Module.readAsync=function(e,r,o){var a=new XMLHttpRequest;a.open("GET",e,!0),a.responseType="arraybuffer",a.onload=function(){a.status==200||a.status==0&&a.response?r(a.response):o()},a.onerror=o,a.send(null)},typeof arguments<"u"&&(Module.arguments=arguments),typeof console<"u")Module.print||(Module.print=function(e){console.log(e)}),Module.printErr||(Module.printErr=function(e){console.warn(e)});else{var TRY_USE_DUMP=!1;Module.print||(Module.print=TRY_USE_DUMP&&typeof dump<"u"?function(t){dump(t)}:function(t){})}ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),typeof Module.setWindowTitle>"u"&&(Module.setWindowTitle=function(t){document.title=t})}else throw"Unknown runtime environment. Where are we?";function globalEval(t){eval.call(null,t)}!Module.load&&Module.read&&(Module.load=function(e){globalEval(Module.read(e))}),Module.print||(Module.print=function(){}),Module.printErr||(Module.printErr=Module.print),Module.arguments||(Module.arguments=[]),Module.thisProgram||(Module.thisProgram="./this.program"),Module.quit||(Module.quit=function(t,e){throw e}),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[];for(var key in moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=void 0;var Runtime={setTempRet0:function(t){return tempRet0=t,t},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(t){STACKTOP=t},getNativeTypeSize:function(t){switch(t){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(t[t.length-1]==="*")return Runtime.QUANTUM_SIZE;if(t[0]==="i"){var e=parseInt(t.substr(1));return assert(e%8===0),e/8}else return 0}}},getNativeFieldSize:function(t){return Math.max(Runtime.getNativeTypeSize(t),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(t,e){return e==="double"||e==="i64"?t&7&&(assert((t&7)===4),t+=4):assert((t&3)===0),t},getAlignSize:function(t,e,r){return!r&&(t=="i64"||t=="double")?8:t?Math.min(e||(t?Runtime.getNativeFieldSize(t):0),Runtime.QUANTUM_SIZE):Math.min(e,8)},dynCall:function(t,e,r){return r&&r.length?Module["dynCall_"+t].apply(null,[e].concat(r)):Module["dynCall_"+t].call(null,e)},functionPointers:[],addFunction:function(t){for(var e=0;e>2],r=(e+t+15|0)&-16;if(HEAP32[DYNAMICTOP_PTR>>2]=r,r>=TOTAL_MEMORY){var o=enlargeMemory();if(!o)return HEAP32[DYNAMICTOP_PTR>>2]=e,0}return e},alignMemory:function(t,e){var r=t=Math.ceil(t/(e||16))*(e||16);return r},makeBigInt:function(t,e,r){var o=r?+(t>>>0)+ +(e>>>0)*4294967296:+(t>>>0)+ +(e|0)*4294967296;return o},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=0,EXITSTATUS=0;function assert(t,e){t||abort("Assertion failed: "+e)}function getCFunc(ident){var func=Module["_"+ident];if(!func)try{func=eval("_"+ident)}catch(t){}return assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)"),func}var cwrap,ccall;(function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(t){var e=Runtime.stackAlloc(t.length);return writeArrayToMemory(t,e),e},stringToC:function(t){var e=0;if(t!=null&&t!==0){var r=(t.length<<2)+1;e=Runtime.stackAlloc(r),stringToUTF8(t,e,r)}return e}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(e,r,o,a,n){var u=getCFunc(e),A=[],p=0;if(a)for(var h=0;h>0]=e;break;case"i8":HEAP8[t>>0]=e;break;case"i16":HEAP16[t>>1]=e;break;case"i32":HEAP32[t>>2]=e;break;case"i64":tempI64=[e>>>0,(tempDouble=e,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[t>>2]=tempI64[0],HEAP32[t+4>>2]=tempI64[1];break;case"float":HEAPF32[t>>2]=e;break;case"double":HEAPF64[t>>3]=e;break;default:abort("invalid type for setValue: "+r)}}Module.setValue=setValue;function getValue(t,e,r){switch(e=e||"i8",e.charAt(e.length-1)==="*"&&(e="i32"),e){case"i1":return HEAP8[t>>0];case"i8":return HEAP8[t>>0];case"i16":return HEAP16[t>>1];case"i32":return HEAP32[t>>2];case"i64":return HEAP32[t>>2];case"float":return HEAPF32[t>>2];case"double":return HEAPF64[t>>3];default:abort("invalid type for setValue: "+e)}return null}Module.getValue=getValue;var ALLOC_NORMAL=0,ALLOC_STACK=1,ALLOC_STATIC=2,ALLOC_DYNAMIC=3,ALLOC_NONE=4;Module.ALLOC_NORMAL=ALLOC_NORMAL,Module.ALLOC_STACK=ALLOC_STACK,Module.ALLOC_STATIC=ALLOC_STATIC,Module.ALLOC_DYNAMIC=ALLOC_DYNAMIC,Module.ALLOC_NONE=ALLOC_NONE;function allocate(t,e,r,o){var a,n;typeof t=="number"?(a=!0,n=t):(a=!1,n=t.length);var u=typeof e=="string"?e:null,A;if(r==ALLOC_NONE?A=o:A=[typeof _malloc=="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][r===void 0?ALLOC_STATIC:r](Math.max(n,u?1:e.length)),a){var o=A,p;for(assert((A&3)==0),p=A+(n&-4);o>2]=0;for(p=A+n;o>0]=0;return A}if(u==="i8")return t.subarray||t.slice?HEAPU8.set(t,A):HEAPU8.set(new Uint8Array(t),A),A;for(var h=0,E,I,v;h>0],r|=o,!(o==0&&!e||(a++,e&&a==e)););e||(e=a);var n="";if(r<128){for(var u=1024,A;e>0;)A=String.fromCharCode.apply(String,HEAPU8.subarray(t,t+Math.min(e,u))),n=n?n+A:A,t+=u,e-=u;return n}return Module.UTF8ToString(t)}Module.Pointer_stringify=Pointer_stringify;function AsciiToString(t){for(var e="";;){var r=HEAP8[t++>>0];if(!r)return e;e+=String.fromCharCode(r)}}Module.AsciiToString=AsciiToString;function stringToAscii(t,e){return writeAsciiToMemory(t,e,!1)}Module.stringToAscii=stringToAscii;var UTF8Decoder=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0;function UTF8ArrayToString(t,e){for(var r=e;t[r];)++r;if(r-e>16&&t.subarray&&UTF8Decoder)return UTF8Decoder.decode(t.subarray(e,r));for(var o,a,n,u,A,p,h="";;){if(o=t[e++],!o)return h;if(!(o&128)){h+=String.fromCharCode(o);continue}if(a=t[e++]&63,(o&224)==192){h+=String.fromCharCode((o&31)<<6|a);continue}if(n=t[e++]&63,(o&240)==224?o=(o&15)<<12|a<<6|n:(u=t[e++]&63,(o&248)==240?o=(o&7)<<18|a<<12|n<<6|u:(A=t[e++]&63,(o&252)==248?o=(o&3)<<24|a<<18|n<<12|u<<6|A:(p=t[e++]&63,o=(o&1)<<30|a<<24|n<<18|u<<12|A<<6|p))),o<65536)h+=String.fromCharCode(o);else{var E=o-65536;h+=String.fromCharCode(55296|E>>10,56320|E&1023)}}}Module.UTF8ArrayToString=UTF8ArrayToString;function UTF8ToString(t){return UTF8ArrayToString(HEAPU8,t)}Module.UTF8ToString=UTF8ToString;function stringToUTF8Array(t,e,r,o){if(!(o>0))return 0;for(var a=r,n=r+o-1,u=0;u=55296&&A<=57343&&(A=65536+((A&1023)<<10)|t.charCodeAt(++u)&1023),A<=127){if(r>=n)break;e[r++]=A}else if(A<=2047){if(r+1>=n)break;e[r++]=192|A>>6,e[r++]=128|A&63}else if(A<=65535){if(r+2>=n)break;e[r++]=224|A>>12,e[r++]=128|A>>6&63,e[r++]=128|A&63}else if(A<=2097151){if(r+3>=n)break;e[r++]=240|A>>18,e[r++]=128|A>>12&63,e[r++]=128|A>>6&63,e[r++]=128|A&63}else if(A<=67108863){if(r+4>=n)break;e[r++]=248|A>>24,e[r++]=128|A>>18&63,e[r++]=128|A>>12&63,e[r++]=128|A>>6&63,e[r++]=128|A&63}else{if(r+5>=n)break;e[r++]=252|A>>30,e[r++]=128|A>>24&63,e[r++]=128|A>>18&63,e[r++]=128|A>>12&63,e[r++]=128|A>>6&63,e[r++]=128|A&63}}return e[r]=0,r-a}Module.stringToUTF8Array=stringToUTF8Array;function stringToUTF8(t,e,r){return stringToUTF8Array(t,HEAPU8,e,r)}Module.stringToUTF8=stringToUTF8;function lengthBytesUTF8(t){for(var e=0,r=0;r=55296&&o<=57343&&(o=65536+((o&1023)<<10)|t.charCodeAt(++r)&1023),o<=127?++e:o<=2047?e+=2:o<=65535?e+=3:o<=2097151?e+=4:o<=67108863?e+=5:e+=6}return e}Module.lengthBytesUTF8=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0;function demangle(t){var e=Module.___cxa_demangle||Module.__cxa_demangle;if(e){try{var r=t.substr(1),o=lengthBytesUTF8(r)+1,a=_malloc(o);stringToUTF8(r,a,o);var n=_malloc(4),u=e(a,0,0,n);if(getValue(n,"i32")===0&&u)return Pointer_stringify(u)}catch{}finally{a&&_free(a),n&&_free(n),u&&_free(u)}return t}return Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),t}function demangleAll(t){var e=/__Z[\w\d_]+/g;return t.replace(e,function(r){var o=demangle(r);return r===o?r:r+" ["+o+"]"})}function jsStackTrace(){var t=new Error;if(!t.stack){try{throw new Error(0)}catch(e){t=e}if(!t.stack)return"(no stack trace available)"}return t.stack.toString()}function stackTrace(){var t=jsStackTrace();return Module.extraStackTrace&&(t+=` +`+Module.extraStackTrace()),demangleAll(t)}Module.stackTrace=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module.HEAP8=HEAP8=new Int8Array(buffer),Module.HEAP16=HEAP16=new Int16Array(buffer),Module.HEAP32=HEAP32=new Int32Array(buffer),Module.HEAPU8=HEAPU8=new Uint8Array(buffer),Module.HEAPU16=HEAPU16=new Uint16Array(buffer),Module.HEAPU32=HEAPU32=new Uint32Array(buffer),Module.HEAPF32=HEAPF32=new Float32Array(buffer),Module.HEAPF64=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed,STACK_BASE,STACKTOP,STACK_MAX,DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0,staticSealed=!1;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||134217728;TOTAL_MEMORY0;){var e=t.shift();if(typeof e=="function"){e();continue}var r=e.func;typeof r=="number"?e.arg===void 0?Module.dynCall_v(r):Module.dynCall_vi(r,e.arg):r(e.arg===void 0?null:e.arg)}}var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1,runtimeExited=!1;function preRun(){if(Module.preRun)for(typeof Module.preRun=="function"&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){runtimeInitialized||(runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__))}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__),runtimeExited=!0}function postRun(){if(Module.postRun)for(typeof Module.postRun=="function"&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(t){__ATPRERUN__.unshift(t)}Module.addOnPreRun=addOnPreRun;function addOnInit(t){__ATINIT__.unshift(t)}Module.addOnInit=addOnInit;function addOnPreMain(t){__ATMAIN__.unshift(t)}Module.addOnPreMain=addOnPreMain;function addOnExit(t){__ATEXIT__.unshift(t)}Module.addOnExit=addOnExit;function addOnPostRun(t){__ATPOSTRUN__.unshift(t)}Module.addOnPostRun=addOnPostRun;function intArrayFromString(t,e,r){var o=r>0?r:lengthBytesUTF8(t)+1,a=new Array(o),n=stringToUTF8Array(t,a,0,a.length);return e&&(a.length=n),a}Module.intArrayFromString=intArrayFromString;function intArrayToString(t){for(var e=[],r=0;r255&&(o&=255),e.push(String.fromCharCode(o))}return e.join("")}Module.intArrayToString=intArrayToString;function writeStringToMemory(t,e,r){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var o,a;r&&(a=e+lengthBytesUTF8(t),o=HEAP8[a]),stringToUTF8(t,e,1/0),r&&(HEAP8[a]=o)}Module.writeStringToMemory=writeStringToMemory;function writeArrayToMemory(t,e){HEAP8.set(t,e)}Module.writeArrayToMemory=writeArrayToMemory;function writeAsciiToMemory(t,e,r){for(var o=0;o>0]=t.charCodeAt(o);r||(HEAP8[e>>0]=0)}if(Module.writeAsciiToMemory=writeAsciiToMemory,(!Math.imul||Math.imul(4294967295,5)!==-5)&&(Math.imul=function t(e,r){var o=e>>>16,a=e&65535,n=r>>>16,u=r&65535;return a*u+(o*u+a*n<<16)|0}),Math.imul=Math.imul,!Math.fround){var froundBuffer=new Float32Array(1);Math.fround=function(t){return froundBuffer[0]=t,froundBuffer[0]}}Math.fround=Math.fround,Math.clz32||(Math.clz32=function(t){t=t>>>0;for(var e=0;e<32;e++)if(t&1<<31-e)return e;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(t){return t<0?Math.ceil(t):Math.floor(t)}),Math.trunc=Math.trunc;var Math_abs=Math.abs,Math_cos=Math.cos,Math_sin=Math.sin,Math_tan=Math.tan,Math_acos=Math.acos,Math_asin=Math.asin,Math_atan=Math.atan,Math_atan2=Math.atan2,Math_exp=Math.exp,Math_log=Math.log,Math_sqrt=Math.sqrt,Math_ceil=Math.ceil,Math_floor=Math.floor,Math_pow=Math.pow,Math_imul=Math.imul,Math_fround=Math.fround,Math_round=Math.round,Math_min=Math.min,Math_clz32=Math.clz32,Math_trunc=Math.trunc,runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null;function getUniqueRunDependency(t){return t}function addRunDependency(t){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}Module.addRunDependency=addRunDependency;function removeRunDependency(t){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),runDependencies==0&&(runDependencyWatcher!==null&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var e=dependenciesFulfilled;dependenciesFulfilled=null,e()}}Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={};var ASM_CONSTS=[function(t,e,r,o,a,n,u,A){return _nbind.callbackSignatureList[t].apply(this,arguments)}];function _emscripten_asm_const_iiiiiiii(t,e,r,o,a,n,u,A){return ASM_CONSTS[t](e,r,o,a,n,u,A)}function _emscripten_asm_const_iiiii(t,e,r,o,a){return ASM_CONSTS[t](e,r,o,a)}function _emscripten_asm_const_iiidddddd(t,e,r,o,a,n,u,A,p){return ASM_CONSTS[t](e,r,o,a,n,u,A,p)}function _emscripten_asm_const_iiididi(t,e,r,o,a,n,u){return ASM_CONSTS[t](e,r,o,a,n,u)}function _emscripten_asm_const_iiii(t,e,r,o){return ASM_CONSTS[t](e,r,o)}function _emscripten_asm_const_iiiid(t,e,r,o,a){return ASM_CONSTS[t](e,r,o,a)}function _emscripten_asm_const_iiiiii(t,e,r,o,a,n){return ASM_CONSTS[t](e,r,o,a,n)}STATIC_BASE=Runtime.GLOBAL_BASE,STATICTOP=STATIC_BASE+12800,__ATINIT__.push({func:function(){__GLOBAL__sub_I_Yoga_cpp()}},{func:function(){__GLOBAL__sub_I_nbind_cc()}},{func:function(){__GLOBAL__sub_I_common_cc()}},{func:function(){__GLOBAL__sub_I_Binding_cc()}}),allocate([0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,192,127,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,128,191,0,0,128,191,0,0,192,127,0,0,0,0,0,0,0,0,0,0,128,63,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,190,12,0,0,200,12,0,0,208,12,0,0,216,12,0,0,230,12,0,0,242,12,0,0,1,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,0,192,127,3,0,0,0,180,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,182,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,183,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,184,45,0,0,185,45,0,0,181,45,0,0,181,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,148,4,0,0,3,0,0,0,187,45,0,0,164,4,0,0,188,45,0,0,2,0,0,0,189,45,0,0,164,4,0,0,188,45,0,0,185,45,0,0,164,4,0,0,185,45,0,0,164,4,0,0,188,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,6,0,0,0,1,0,0,0,7,0,0,0,183,45,0,0,182,45,0,0,181,45,0,0,190,45,0,0,190,45,0,0,182,45,0,0,182,45,0,0,185,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,185,45,0,0,48,5,0,0,3,0,0,0,56,5,0,0,1,0,0,0,189,45,0,0,185,45,0,0,164,4,0,0,76,5,0,0,2,0,0,0,191,45,0,0,186,45,0,0,182,45,0,0,185,45,0,0,192,45,0,0,185,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,76,5,0,0,76,5,0,0,136,5,0,0,182,45,0,0,181,45,0,0,2,0,0,0,190,45,0,0,136,5,0,0,56,19,0,0,156,5,0,0,2,0,0,0,184,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,10,0,0,0,204,5,0,0,181,45,0,0,181,45,0,0,2,0,0,0,180,45,0,0,204,5,0,0,2,0,0,0,195,45,0,0,236,5,0,0,97,19,0,0,198,45,0,0,211,45,0,0,212,45,0,0,213,45,0,0,214,45,0,0,215,45,0,0,188,45,0,0,182,45,0,0,216,45,0,0,217,45,0,0,218,45,0,0,219,45,0,0,192,45,0,0,181,45,0,0,0,0,0,0,185,45,0,0,110,19,0,0,186,45,0,0,115,19,0,0,221,45,0,0,120,19,0,0,148,4,0,0,132,19,0,0,96,6,0,0,145,19,0,0,222,45,0,0,164,19,0,0,223,45,0,0,173,19,0,0,0,0,0,0,3,0,0,0,104,6,0,0,1,0,0,0,187,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,11,0,0,0,12,0,0,0,1,0,0,0,13,0,0,0,185,45,0,0,224,45,0,0,164,6,0,0,188,45,0,0,172,6,0,0,180,6,0,0,2,0,0,0,188,6,0,0,7,0,0,0,224,45,0,0,7,0,0,0,164,6,0,0,1,0,0,0,213,45,0,0,185,45,0,0,224,45,0,0,172,6,0,0,185,45,0,0,224,45,0,0,164,6,0,0,185,45,0,0,224,45,0,0,211,45,0,0,211,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,172,6,0,0,222,45,0,0,211,45,0,0,224,45,0,0,188,45,0,0,222,45,0,0,211,45,0,0,40,7,0,0,188,45,0,0,2,0,0,0,224,45,0,0,185,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,222,45,0,0,224,45,0,0,148,4,0,0,185,45,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,185,45,0,0,164,6,0,0,148,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,14,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,148,7,0,0,2,0,0,0,225,45,0,0,183,45,0,0,188,45,0,0,168,7,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,234,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,148,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,9,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,242,45,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,110,111,100,101,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,119,104,105,99,104,32,115,116,105,108,108,32,104,97,115,32,99,104,105,108,100,114,101,110,32,97,116,116,97,99,104,101,100,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,115,116,105,108,108,32,97,116,116,97,99,104,101,100,32,116,111,32,97,32,112,97,114,101,110,116,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,99,111,110,102,105,103,0,67,97,110,110,111,116,32,115,101,116,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,67,104,105,108,100,32,97,108,114,101,97,100,121,32,104,97,115,32,97,32,112,97,114,101,110,116,44,32,105,116,32,109,117,115,116,32,98,101,32,114,101,109,111,118,101,100,32,102,105,114,115,116,46,0,67,97,110,110,111,116,32,97,100,100,32,99,104,105,108,100,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,79,110,108,121,32,108,101,97,102,32,110,111,100,101,115,32,119,105,116,104,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,115,104,111,117,108,100,32,109,97,110,117,97,108,108,121,32,109,97,114,107,32,116,104,101,109,115,101,108,118,101,115,32,97,115,32,100,105,114,116,121,0,67,97,110,110,111,116,32,103,101,116,32,108,97,121,111,117,116,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,109,117,108,116,105,45,101,100,103,101,32,115,104,111,114,116,104,97,110,100,115,0,37,115,37,100,46,123,91,115,107,105,112,112,101,100,93,32,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,61,62,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,37,115,37,100,46,123,37,115,0,42,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,37,115,10,0,37,115,37,100,46,125,37,115,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,79,117,116,32,111,102,32,99,97,99,104,101,32,101,110,116,114,105,101,115,33,10,0,83,99,97,108,101,32,102,97,99,116,111,114,32,115,104,111,117,108,100,32,110,111,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,122,101,114,111,0,105,110,105,116,105,97,108,0,37,115,10,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,85,78,68,69,70,73,78,69,68,0,69,88,65,67,84,76,89,0,65,84,95,77,79,83,84,0,76,65,89,95,85,78,68,69,70,73,78,69,68,0,76,65,89,95,69,88,65,67,84,76,89,0,76,65,89,95,65,84,95,77,79,83,84,0,97,118,97,105,108,97,98,108,101,87,105,100,116,104,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,119,105,100,116,104,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,97,118,97,105,108,97,98,108,101,72,101,105,103,104,116,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,104,101,105,103,104,116,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,102,108,101,120,0,115,116,114,101,116,99,104,0,109,117,108,116,105,108,105,110,101,45,115,116,114,101,116,99,104,0,69,120,112,101,99,116,101,100,32,110,111,100,101,32,116,111,32,104,97,118,101,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,0,109,101,97,115,117,114,101,0,69,120,112,101,99,116,32,99,117,115,116,111,109,32,98,97,115,101,108,105,110,101,32,102,117,110,99,116,105,111,110,32,116,111,32,110,111,116,32,114,101,116,117,114,110,32,78,97,78,0,97,98,115,45,109,101,97,115,117,114,101,0,97,98,115,45,108,97,121,111,117,116,0,78,111,100,101,0,99,114,101,97,116,101,68,101,102,97,117,108,116,0,99,114,101,97,116,101,87,105,116,104,67,111,110,102,105,103,0,100,101,115,116,114,111,121,0,114,101,115,101,116,0,99,111,112,121,83,116,121,108,101,0,115,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,115,101,116,80,111,115,105,116,105,111,110,0,115,101,116,80,111,115,105,116,105,111,110,80,101,114,99,101,110,116,0,115,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,115,101,116,65,108,105,103,110,73,116,101,109,115,0,115,101,116,65,108,105,103,110,83,101,108,102,0,115,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,115,101,116,70,108,101,120,87,114,97,112,0,115,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,115,101,116,77,97,114,103,105,110,0,115,101,116,77,97,114,103,105,110,80,101,114,99,101,110,116,0,115,101,116,77,97,114,103,105,110,65,117,116,111,0,115,101,116,79,118,101,114,102,108,111,119,0,115,101,116,68,105,115,112,108,97,121,0,115,101,116,70,108,101,120,0,115,101,116,70,108,101,120,66,97,115,105,115,0,115,101,116,70,108,101,120,66,97,115,105,115,80,101,114,99,101,110,116,0,115,101,116,70,108,101,120,71,114,111,119,0,115,101,116,70,108,101,120,83,104,114,105,110,107,0,115,101,116,87,105,100,116,104,0,115,101,116,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,87,105,100,116,104,65,117,116,111,0,115,101,116,72,101,105,103,104,116,0,115,101,116,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,72,101,105,103,104,116,65,117,116,111,0,115,101,116,77,105,110,87,105,100,116,104,0,115,101,116,77,105,110,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,105,110,72,101,105,103,104,116,0,115,101,116,77,105,110,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,77,97,120,87,105,100,116,104,0,115,101,116,77,97,120,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,97,120,72,101,105,103,104,116,0,115,101,116,77,97,120,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,65,115,112,101,99,116,82,97,116,105,111,0,115,101,116,66,111,114,100,101,114,0,115,101,116,80,97,100,100,105,110,103,0,115,101,116,80,97,100,100,105,110,103,80,101,114,99,101,110,116,0,103,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,103,101,116,80,111,115,105,116,105,111,110,0,103,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,103,101,116,65,108,105,103,110,73,116,101,109,115,0,103,101,116,65,108,105,103,110,83,101,108,102,0,103,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,103,101,116,70,108,101,120,87,114,97,112,0,103,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,103,101,116,77,97,114,103,105,110,0,103,101,116,70,108,101,120,66,97,115,105,115,0,103,101,116,70,108,101,120,71,114,111,119,0,103,101,116,70,108,101,120,83,104,114,105,110,107,0,103,101,116,87,105,100,116,104,0,103,101,116,72,101,105,103,104,116,0,103,101,116,77,105,110,87,105,100,116,104,0,103,101,116,77,105,110,72,101,105,103,104,116,0,103,101,116,77,97,120,87,105,100,116,104,0,103,101,116,77,97,120,72,101,105,103,104,116,0,103,101,116,65,115,112,101,99,116,82,97,116,105,111,0,103,101,116,66,111,114,100,101,114,0,103,101,116,79,118,101,114,102,108,111,119,0,103,101,116,68,105,115,112,108,97,121,0,103,101,116,80,97,100,100,105,110,103,0,105,110,115,101,114,116,67,104,105,108,100,0,114,101,109,111,118,101,67,104,105,108,100,0,103,101,116,67,104,105,108,100,67,111,117,110,116,0,103,101,116,80,97,114,101,110,116,0,103,101,116,67,104,105,108,100,0,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,117,110,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,109,97,114,107,68,105,114,116,121,0,105,115,68,105,114,116,121,0,99,97,108,99,117,108,97,116,101,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,76,101,102,116,0,103,101,116,67,111,109,112,117,116,101,100,82,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,84,111,112,0,103,101,116,67,111,109,112,117,116,101,100,66,111,116,116,111,109,0,103,101,116,67,111,109,112,117,116,101,100,87,105,100,116,104,0,103,101,116,67,111,109,112,117,116,101,100,72,101,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,77,97,114,103,105,110,0,103,101,116,67,111,109,112,117,116,101,100,66,111,114,100,101,114,0,103,101,116,67,111,109,112,117,116,101,100,80,97,100,100,105,110,103,0,67,111,110,102,105,103,0,99,114,101,97,116,101,0,115,101,116,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,115,101,116,80,111,105,110,116,83,99,97,108,101,70,97,99,116,111,114,0,105,115,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,86,97,108,117,101,0,76,97,121,111,117,116,0,83,105,122,101,0,103,101,116,73,110,115,116,97,110,99,101,67,111,117,110,116,0,73,110,116,54,52,0,1,1,1,2,2,4,4,4,4,8,8,4,8,118,111,105,100,0,98,111,111,108,0,115,116,100,58,58,115,116,114,105,110,103,0,99,98,70,117,110,99,116,105,111,110,32,38,0,99,111,110,115,116,32,99,98,70,117,110,99,116,105,111,110,32,38,0,69,120,116,101,114,110,97,108,0,66,117,102,102,101,114,0,78,66,105,110,100,73,68,0,78,66,105,110,100,0,98,105,110,100,95,118,97,108,117,101,0,114,101,102,108,101,99,116,0,113,117,101,114,121,84,121,112,101,0,108,97,108,108,111,99,0,108,114,101,115,101,116,0,123,114,101,116,117,114,110,40,95,110,98,105,110,100,46,99,97,108,108,98,97,99,107,83,105,103,110,97,116,117,114,101,76,105,115,116,91,36,48,93,46,97,112,112,108,121,40,116,104,105,115,44,97,114,103,117,109,101,110,116,115,41,41,59,125,0,95,110,98,105,110,100,95,110,101,119,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;function _atexit(t,e){__ATEXIT__.unshift({func:t,arg:e})}function ___cxa_atexit(){return _atexit.apply(null,arguments)}function _abort(){Module.abort()}function __ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj(){Module.printErr("missing function: _ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj"),abort(-1)}function __decorate(t,e,r,o){var a=arguments.length,n=a<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,r):o,u;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")n=Reflect.decorate(t,e,r,o);else for(var A=t.length-1;A>=0;A--)(u=t[A])&&(n=(a<3?u(n):a>3?u(e,r,n):u(e,r))||n);return a>3&&n&&Object.defineProperty(e,r,n),n}function _defineHidden(t){return function(e,r){Object.defineProperty(e,r,{configurable:!1,enumerable:!1,value:t,writable:!0})}}var _nbind={};function __nbind_free_external(t){_nbind.externalList[t].dereference(t)}function __nbind_reference_external(t){_nbind.externalList[t].reference()}function _llvm_stackrestore(t){var e=_llvm_stacksave,r=e.LLVM_SAVEDSTACKS[t];e.LLVM_SAVEDSTACKS.splice(t,1),Runtime.stackRestore(r)}function __nbind_register_pool(t,e,r,o){_nbind.Pool.pageSize=t,_nbind.Pool.usedPtr=e/4,_nbind.Pool.rootPtr=r,_nbind.Pool.pagePtr=o/4,HEAP32[e/4]=16909060,HEAP8[e]==1&&(_nbind.bigEndian=!0),HEAP32[e/4]=0,_nbind.makeTypeKindTbl=(n={},n[1024]=_nbind.PrimitiveType,n[64]=_nbind.Int64Type,n[2048]=_nbind.BindClass,n[3072]=_nbind.BindClassPtr,n[4096]=_nbind.SharedClassPtr,n[5120]=_nbind.ArrayType,n[6144]=_nbind.ArrayType,n[7168]=_nbind.CStringType,n[9216]=_nbind.CallbackType,n[10240]=_nbind.BindType,n),_nbind.makeTypeNameTbl={Buffer:_nbind.BufferType,External:_nbind.ExternalType,Int64:_nbind.Int64Type,_nbind_new:_nbind.CreateValueType,bool:_nbind.BooleanType,"cbFunction &":_nbind.CallbackType,"const cbFunction &":_nbind.CallbackType,"const std::string &":_nbind.StringType,"std::string":_nbind.StringType},Module.toggleLightGC=_nbind.toggleLightGC,_nbind.callUpcast=Module.dynCall_ii;var a=_nbind.makeType(_nbind.constructType,{flags:2048,id:0,name:""});a.proto=Module,_nbind.BindClass.list.push(a);var n}function _emscripten_set_main_loop_timing(t,e){if(Browser.mainLoop.timingMode=t,Browser.mainLoop.timingValue=e,!Browser.mainLoop.func)return 1;if(t==0)Browser.mainLoop.scheduler=function(){var u=Math.max(0,Browser.mainLoop.tickStartTime+e-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,u)},Browser.mainLoop.method="timeout";else if(t==1)Browser.mainLoop.scheduler=function(){Browser.requestAnimationFrame(Browser.mainLoop.runner)},Browser.mainLoop.method="rAF";else if(t==2){if(!window.setImmediate){let n=function(u){u.source===window&&u.data===o&&(u.stopPropagation(),r.shift()())};var a=n,r=[],o="setimmediate";window.addEventListener("message",n,!0),window.setImmediate=function(A){r.push(A),ENVIRONMENT_IS_WORKER?(Module.setImmediates===void 0&&(Module.setImmediates=[]),Module.setImmediates.push(A),window.postMessage({target:o})):window.postMessage(o,"*")}}Browser.mainLoop.scheduler=function(){window.setImmediate(Browser.mainLoop.runner)},Browser.mainLoop.method="immediate"}return 0}function _emscripten_get_now(){abort()}function _emscripten_set_main_loop(t,e,r,o,a){Module.noExitRuntime=!0,assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters."),Browser.mainLoop.func=t,Browser.mainLoop.arg=o;var n;typeof o<"u"?n=function(){Module.dynCall_vi(t,o)}:n=function(){Module.dynCall_v(t)};var u=Browser.mainLoop.currentlyRunningMainloop;if(Browser.mainLoop.runner=function(){if(!ABORT){if(Browser.mainLoop.queue.length>0){var p=Date.now(),h=Browser.mainLoop.queue.shift();if(h.func(h.arg),Browser.mainLoop.remainingBlockers){var E=Browser.mainLoop.remainingBlockers,I=E%1==0?E-1:Math.floor(E);h.counted?Browser.mainLoop.remainingBlockers=I:(I=I+.5,Browser.mainLoop.remainingBlockers=(8*E+I)/9)}if(console.log('main loop blocker "'+h.name+'" took '+(Date.now()-p)+" ms"),Browser.mainLoop.updateStatus(),u1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else Browser.mainLoop.timingMode==0&&(Browser.mainLoop.tickStartTime=_emscripten_get_now());Browser.mainLoop.method==="timeout"&&Module.ctx&&(Module.printErr("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!"),Browser.mainLoop.method=""),Browser.mainLoop.runIter(n),!(u0?_emscripten_set_main_loop_timing(0,1e3/e):_emscripten_set_main_loop_timing(1,1),Browser.mainLoop.scheduler()),r)throw"SimulateInfiniteLoop"}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null,Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var t=Browser.mainLoop.timingMode,e=Browser.mainLoop.timingValue,r=Browser.mainLoop.func;Browser.mainLoop.func=null,_emscripten_set_main_loop(r,0,!1,Browser.mainLoop.arg,!0),_emscripten_set_main_loop_timing(t,e),Browser.mainLoop.scheduler()},updateStatus:function(){if(Module.setStatus){var t=Module.statusMessage||"Please wait...",e=Browser.mainLoop.remainingBlockers,r=Browser.mainLoop.expectedBlockers;e?e"u"&&(console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available."),Module.noImageDecoding=!0);var t={};t.canHandle=function(n){return!Module.noImageDecoding&&/\.(jpg|jpeg|png|bmp)$/i.test(n)},t.handle=function(n,u,A,p){var h=null;if(Browser.hasBlobConstructor)try{h=new Blob([n],{type:Browser.getMimetype(u)}),h.size!==n.length&&(h=new Blob([new Uint8Array(n).buffer],{type:Browser.getMimetype(u)}))}catch(b){Runtime.warnOnce("Blob constructor present but fails: "+b+"; falling back to blob builder")}if(!h){var E=new Browser.BlobBuilder;E.append(new Uint8Array(n).buffer),h=E.getBlob()}var I=Browser.URLObject.createObjectURL(h),v=new Image;v.onload=function(){assert(v.complete,"Image "+u+" could not be decoded");var C=document.createElement("canvas");C.width=v.width,C.height=v.height;var T=C.getContext("2d");T.drawImage(v,0,0),Module.preloadedImages[u]=C,Browser.URLObject.revokeObjectURL(I),A&&A(n)},v.onerror=function(C){console.log("Image "+I+" could not be decoded"),p&&p()},v.src=I},Module.preloadPlugins.push(t);var e={};e.canHandle=function(n){return!Module.noAudioDecoding&&n.substr(-4)in{".ogg":1,".wav":1,".mp3":1}},e.handle=function(n,u,A,p){var h=!1;function E(T){h||(h=!0,Module.preloadedAudios[u]=T,A&&A(n))}function I(){h||(h=!0,Module.preloadedAudios[u]=new Audio,p&&p())}if(Browser.hasBlobConstructor){try{var v=new Blob([n],{type:Browser.getMimetype(u)})}catch{return I()}var b=Browser.URLObject.createObjectURL(v),C=new Audio;C.addEventListener("canplaythrough",function(){E(C)},!1),C.onerror=function(L){if(h)return;console.log("warning: browser could not fully decode audio "+u+", trying slower base64 approach");function U(J){for(var te="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",le="=",pe="",Ae=0,ye=0,ae=0;ae=6;){var we=Ae>>ye-6&63;ye-=6,pe+=te[we]}return ye==2?(pe+=te[(Ae&3)<<4],pe+=le+le):ye==4&&(pe+=te[(Ae&15)<<2],pe+=le),pe}C.src="data:audio/x-"+u.substr(-3)+";base64,"+U(n),E(C)},C.src=b,Browser.safeSetTimeout(function(){E(C)},1e4)}else return I()},Module.preloadPlugins.push(e);function r(){Browser.pointerLock=document.pointerLockElement===Module.canvas||document.mozPointerLockElement===Module.canvas||document.webkitPointerLockElement===Module.canvas||document.msPointerLockElement===Module.canvas}var o=Module.canvas;o&&(o.requestPointerLock=o.requestPointerLock||o.mozRequestPointerLock||o.webkitRequestPointerLock||o.msRequestPointerLock||function(){},o.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||function(){},o.exitPointerLock=o.exitPointerLock.bind(document),document.addEventListener("pointerlockchange",r,!1),document.addEventListener("mozpointerlockchange",r,!1),document.addEventListener("webkitpointerlockchange",r,!1),document.addEventListener("mspointerlockchange",r,!1),Module.elementPointerLock&&o.addEventListener("click",function(a){!Browser.pointerLock&&Module.canvas.requestPointerLock&&(Module.canvas.requestPointerLock(),a.preventDefault())},!1))},createContext:function(t,e,r,o){if(e&&Module.ctx&&t==Module.canvas)return Module.ctx;var a,n;if(e){var u={antialias:!1,alpha:!1};if(o)for(var A in o)u[A]=o[A];n=GL.createContext(t,u),n&&(a=GL.getContext(n).GLctx)}else a=t.getContext("2d");return a?(r&&(e||assert(typeof GLctx>"u","cannot set in module if GLctx is used, but we are a non-GL context that would replace it"),Module.ctx=a,e&&GL.makeContextCurrent(n),Module.useWebGL=e,Browser.moduleContextCreatedCallbacks.forEach(function(p){p()}),Browser.init()),a):null},destroyContext:function(t,e,r){},fullscreenHandlersInstalled:!1,lockPointer:void 0,resizeCanvas:void 0,requestFullscreen:function(t,e,r){Browser.lockPointer=t,Browser.resizeCanvas=e,Browser.vrDevice=r,typeof Browser.lockPointer>"u"&&(Browser.lockPointer=!0),typeof Browser.resizeCanvas>"u"&&(Browser.resizeCanvas=!1),typeof Browser.vrDevice>"u"&&(Browser.vrDevice=null);var o=Module.canvas;function a(){Browser.isFullscreen=!1;var u=o.parentNode;(document.fullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement)===u?(o.exitFullscreen=document.exitFullscreen||document.cancelFullScreen||document.mozCancelFullScreen||document.msExitFullscreen||document.webkitCancelFullScreen||function(){},o.exitFullscreen=o.exitFullscreen.bind(document),Browser.lockPointer&&o.requestPointerLock(),Browser.isFullscreen=!0,Browser.resizeCanvas&&Browser.setFullscreenCanvasSize()):(u.parentNode.insertBefore(o,u),u.parentNode.removeChild(u),Browser.resizeCanvas&&Browser.setWindowedCanvasSize()),Module.onFullScreen&&Module.onFullScreen(Browser.isFullscreen),Module.onFullscreen&&Module.onFullscreen(Browser.isFullscreen),Browser.updateCanvasDimensions(o)}Browser.fullscreenHandlersInstalled||(Browser.fullscreenHandlersInstalled=!0,document.addEventListener("fullscreenchange",a,!1),document.addEventListener("mozfullscreenchange",a,!1),document.addEventListener("webkitfullscreenchange",a,!1),document.addEventListener("MSFullscreenChange",a,!1));var n=document.createElement("div");o.parentNode.insertBefore(n,o),n.appendChild(o),n.requestFullscreen=n.requestFullscreen||n.mozRequestFullScreen||n.msRequestFullscreen||(n.webkitRequestFullscreen?function(){n.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}:null)||(n.webkitRequestFullScreen?function(){n.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:null),r?n.requestFullscreen({vrDisplay:r}):n.requestFullscreen()},requestFullScreen:function(t,e,r){return Module.printErr("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead."),Browser.requestFullScreen=function(o,a,n){return Browser.requestFullscreen(o,a,n)},Browser.requestFullscreen(t,e,r)},nextRAF:0,fakeRequestAnimationFrame:function(t){var e=Date.now();if(Browser.nextRAF===0)Browser.nextRAF=e+1e3/60;else for(;e+2>=Browser.nextRAF;)Browser.nextRAF+=1e3/60;var r=Math.max(Browser.nextRAF-e,0);setTimeout(t,r)},requestAnimationFrame:function t(e){typeof window>"u"?Browser.fakeRequestAnimationFrame(e):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||Browser.fakeRequestAnimationFrame),window.requestAnimationFrame(e))},safeCallback:function(t){return function(){if(!ABORT)return t.apply(null,arguments)}},allowAsyncCallbacks:!0,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=!1},resumeAsyncCallbacks:function(){if(Browser.allowAsyncCallbacks=!0,Browser.queuedAsyncCallbacks.length>0){var t=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[],t.forEach(function(e){e()})}},safeRequestAnimationFrame:function(t){return Browser.requestAnimationFrame(function(){ABORT||(Browser.allowAsyncCallbacks?t():Browser.queuedAsyncCallbacks.push(t))})},safeSetTimeout:function(t,e){return Module.noExitRuntime=!0,setTimeout(function(){ABORT||(Browser.allowAsyncCallbacks?t():Browser.queuedAsyncCallbacks.push(t))},e)},safeSetInterval:function(t,e){return Module.noExitRuntime=!0,setInterval(function(){ABORT||Browser.allowAsyncCallbacks&&t()},e)},getMimetype:function(t){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[t.substr(t.lastIndexOf(".")+1)]},getUserMedia:function(t){window.getUserMedia||(window.getUserMedia=navigator.getUserMedia||navigator.mozGetUserMedia),window.getUserMedia(t)},getMovementX:function(t){return t.movementX||t.mozMovementX||t.webkitMovementX||0},getMovementY:function(t){return t.movementY||t.mozMovementY||t.webkitMovementY||0},getMouseWheelDelta:function(t){var e=0;switch(t.type){case"DOMMouseScroll":e=t.detail;break;case"mousewheel":e=t.wheelDelta;break;case"wheel":e=t.deltaY;break;default:throw"unrecognized mouse wheel event: "+t.type}return e},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(t){if(Browser.pointerLock)t.type!="mousemove"&&"mozMovementX"in t?Browser.mouseMovementX=Browser.mouseMovementY=0:(Browser.mouseMovementX=Browser.getMovementX(t),Browser.mouseMovementY=Browser.getMovementY(t)),typeof SDL<"u"?(Browser.mouseX=SDL.mouseX+Browser.mouseMovementX,Browser.mouseY=SDL.mouseY+Browser.mouseMovementY):(Browser.mouseX+=Browser.mouseMovementX,Browser.mouseY+=Browser.mouseMovementY);else{var e=Module.canvas.getBoundingClientRect(),r=Module.canvas.width,o=Module.canvas.height,a=typeof window.scrollX<"u"?window.scrollX:window.pageXOffset,n=typeof window.scrollY<"u"?window.scrollY:window.pageYOffset;if(t.type==="touchstart"||t.type==="touchend"||t.type==="touchmove"){var u=t.touch;if(u===void 0)return;var A=u.pageX-(a+e.left),p=u.pageY-(n+e.top);A=A*(r/e.width),p=p*(o/e.height);var h={x:A,y:p};if(t.type==="touchstart")Browser.lastTouches[u.identifier]=h,Browser.touches[u.identifier]=h;else if(t.type==="touchend"||t.type==="touchmove"){var E=Browser.touches[u.identifier];E||(E=h),Browser.lastTouches[u.identifier]=E,Browser.touches[u.identifier]=h}return}var I=t.pageX-(a+e.left),v=t.pageY-(n+e.top);I=I*(r/e.width),v=v*(o/e.height),Browser.mouseMovementX=I-Browser.mouseX,Browser.mouseMovementY=v-Browser.mouseY,Browser.mouseX=I,Browser.mouseY=v}},asyncLoad:function(t,e,r,o){var a=o?"":"al "+t;Module.readAsync(t,function(n){assert(n,'Loading data file "'+t+'" failed (no arrayBuffer).'),e(new Uint8Array(n)),a&&removeRunDependency(a)},function(n){if(r)r();else throw'Loading data file "'+t+'" failed.'}),a&&addRunDependency(a)},resizeListeners:[],updateResizeListeners:function(){var t=Module.canvas;Browser.resizeListeners.forEach(function(e){e(t.width,t.height)})},setCanvasSize:function(t,e,r){var o=Module.canvas;Browser.updateCanvasDimensions(o,t,e),r||Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL<"u"){var t=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];t=t|8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=t}Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL<"u"){var t=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];t=t&-8388609,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=t}Browser.updateResizeListeners()},updateCanvasDimensions:function(t,e,r){e&&r?(t.widthNative=e,t.heightNative=r):(e=t.widthNative,r=t.heightNative);var o=e,a=r;if(Module.forcedAspectRatio&&Module.forcedAspectRatio>0&&(o/a>2];return e},getStr:function(){var t=Pointer_stringify(SYSCALLS.get());return t},get64:function(){var t=SYSCALLS.get(),e=SYSCALLS.get();return t>=0?assert(e===0):assert(e===-1),t},getZero:function(){assert(SYSCALLS.get()===0)}};function ___syscall6(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.getStreamFromFD();return FS.close(r),0}catch(o){return(typeof FS>"u"||!(o instanceof FS.ErrnoError))&&abort(o),-o.errno}}function ___syscall54(t,e){SYSCALLS.varargs=e;try{return 0}catch(r){return(typeof FS>"u"||!(r instanceof FS.ErrnoError))&&abort(r),-r.errno}}function _typeModule(t){var e=[[0,1,"X"],[1,1,"const X"],[128,1,"X *"],[256,1,"X &"],[384,1,"X &&"],[512,1,"std::shared_ptr"],[640,1,"std::unique_ptr"],[5120,1,"std::vector"],[6144,2,"std::array"],[9216,-1,"std::function"]];function r(p,h,E,I,v,b){if(h==1){var C=I&896;(C==128||C==256||C==384)&&(p="X const")}var T;return b?T=E.replace("X",p).replace("Y",v):T=p.replace("X",E).replace("Y",v),T.replace(/([*&]) (?=[*&])/g,"$1")}function o(p,h,E,I,v){throw new Error(p+" type "+E.replace("X",h+"?")+(I?" with flag "+I:"")+" in "+v)}function a(p,h,E,I,v,b,C,T){b===void 0&&(b="X"),T===void 0&&(T=1);var L=E(p);if(L)return L;var U=I(p),J=U.placeholderFlag,te=e[J];C&&te&&(b=r(C[2],C[0],b,te[0],"?",!0));var le;J==0&&(le="Unbound"),J>=10&&(le="Corrupt"),T>20&&(le="Deeply nested"),le&&o(le,p,b,J,v||"?");var pe=U.paramList[0],Ae=a(pe,h,E,I,v,b,te,T+1),ye,ae={flags:te[0],id:p,name:"",paramList:[Ae]},we=[],Pe="?";switch(U.placeholderFlag){case 1:ye=Ae.spec;break;case 2:if((Ae.flags&15360)==1024&&Ae.spec.ptrSize==1){ae.flags=7168;break}case 3:case 6:case 5:ye=Ae.spec,Ae.flags&15360;break;case 8:Pe=""+U.paramList[1],ae.paramList.push(U.paramList[1]);break;case 9:for(var g=0,Ee=U.paramList[1];g>2]=t),t}function _llvm_stacksave(){var t=_llvm_stacksave;return t.LLVM_SAVEDSTACKS||(t.LLVM_SAVEDSTACKS=[]),t.LLVM_SAVEDSTACKS.push(Runtime.stackSave()),t.LLVM_SAVEDSTACKS.length-1}function ___syscall140(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.getStreamFromFD(),o=SYSCALLS.get(),a=SYSCALLS.get(),n=SYSCALLS.get(),u=SYSCALLS.get(),A=a;return FS.llseek(r,A,u),HEAP32[n>>2]=r.position,r.getdents&&A===0&&u===0&&(r.getdents=null),0}catch(p){return(typeof FS>"u"||!(p instanceof FS.ErrnoError))&&abort(p),-p.errno}}function ___syscall146(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.get(),o=SYSCALLS.get(),a=SYSCALLS.get(),n=0;___syscall146.buffer||(___syscall146.buffers=[null,[],[]],___syscall146.printChar=function(E,I){var v=___syscall146.buffers[E];assert(v),I===0||I===10?((E===1?Module.print:Module.printErr)(UTF8ArrayToString(v,0)),v.length=0):v.push(I)});for(var u=0;u>2],p=HEAP32[o+(u*8+4)>>2],h=0;h"u"||!(E instanceof FS.ErrnoError))&&abort(E),-E.errno}}function __nbind_finish(){for(var t=0,e=_nbind.BindClass.list;tt.pageSize/2||e>t.pageSize-r){var o=_nbind.typeNameTbl.NBind.proto;return o.lalloc(e)}else return HEAPU32[t.usedPtr]=r+e,t.rootPtr+r},t.lreset=function(e,r){var o=HEAPU32[t.pagePtr];if(o){var a=_nbind.typeNameTbl.NBind.proto;a.lreset(e,r)}else HEAPU32[t.usedPtr]=e},t}();_nbind.Pool=Pool;function constructType(t,e){var r=t==10240?_nbind.makeTypeNameTbl[e.name]||_nbind.BindType:_nbind.makeTypeKindTbl[t],o=new r(e);return typeIdTbl[e.id]=o,_nbind.typeNameTbl[e.name]=o,o}_nbind.constructType=constructType;function getType(t){return typeIdTbl[t]}_nbind.getType=getType;function queryType(t){var e=HEAPU8[t],r=_nbind.structureList[e][1];t/=4,r<0&&(++t,r=HEAPU32[t]+1);var o=Array.prototype.slice.call(HEAPU32.subarray(t+1,t+1+r));return e==9&&(o=[o[0],o.slice(1)]),{paramList:o,placeholderFlag:e}}_nbind.queryType=queryType;function getTypes(t,e){return t.map(function(r){return typeof r=="number"?_nbind.getComplexType(r,constructType,getType,queryType,e):_nbind.typeNameTbl[r]})}_nbind.getTypes=getTypes;function readTypeIdList(t,e){return Array.prototype.slice.call(HEAPU32,t/4,t/4+e)}_nbind.readTypeIdList=readTypeIdList;function readAsciiString(t){for(var e=t;HEAPU8[e++];);return String.fromCharCode.apply("",HEAPU8.subarray(t,e-1))}_nbind.readAsciiString=readAsciiString;function readPolicyList(t){var e={};if(t)for(;;){var r=HEAPU32[t/4];if(!r)break;e[readAsciiString(r)]=!0,t+=4}return e}_nbind.readPolicyList=readPolicyList;function getDynCall(t,e){var r={float32_t:"d",float64_t:"d",int64_t:"d",uint64_t:"d",void:"v"},o=t.map(function(n){return r[n.name]||"i"}).join(""),a=Module["dynCall_"+o];if(!a)throw new Error("dynCall_"+o+" not found for "+e+"("+t.map(function(n){return n.name}).join(", ")+")");return a}_nbind.getDynCall=getDynCall;function addMethod(t,e,r,o){var a=t[e];t.hasOwnProperty(e)&&a?((a.arity||a.arity===0)&&(a=_nbind.makeOverloader(a,a.arity),t[e]=a),a.addMethod(r,o)):(r.arity=o,t[e]=r)}_nbind.addMethod=addMethod;function throwError(t){throw new Error(t)}_nbind.throwError=throwError,_nbind.bigEndian=!1,_a=_typeModule(_typeModule),_nbind.Type=_a.Type,_nbind.makeType=_a.makeType,_nbind.getComplexType=_a.getComplexType,_nbind.structureList=_a.structureList;var BindType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.heap=HEAPU32,r.ptrSize=4,r}return e.prototype.needsWireRead=function(r){return!!this.wireRead||!!this.makeWireRead},e.prototype.needsWireWrite=function(r){return!!this.wireWrite||!!this.makeWireWrite},e}(_nbind.Type);_nbind.BindType=BindType;var PrimitiveType=function(t){__extends(e,t);function e(r){var o=t.call(this,r)||this,a=r.flags&32?{32:HEAPF32,64:HEAPF64}:r.flags&8?{8:HEAPU8,16:HEAPU16,32:HEAPU32}:{8:HEAP8,16:HEAP16,32:HEAP32};return o.heap=a[r.ptrSize*8],o.ptrSize=r.ptrSize,o}return e.prototype.needsWireWrite=function(r){return!!r&&!!r.Strict},e.prototype.makeWireWrite=function(r,o){return o&&o.Strict&&function(a){if(typeof a=="number")return a;throw new Error("Type mismatch")}},e}(BindType);_nbind.PrimitiveType=PrimitiveType;function pushCString(t,e){if(t==null){if(e&&e.Nullable)return 0;throw new Error("Type mismatch")}if(e&&e.Strict){if(typeof t!="string")throw new Error("Type mismatch")}else t=t.toString();var r=Module.lengthBytesUTF8(t)+1,o=_nbind.Pool.lalloc(r);return Module.stringToUTF8Array(t,HEAPU8,o,r),o}_nbind.pushCString=pushCString;function popCString(t){return t===0?null:Module.Pointer_stringify(t)}_nbind.popCString=popCString;var CStringType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=popCString,r.wireWrite=pushCString,r.readResources=[_nbind.resources.pool],r.writeResources=[_nbind.resources.pool],r}return e.prototype.makeWireWrite=function(r,o){return function(a){return pushCString(a,o)}},e}(BindType);_nbind.CStringType=CStringType;var BooleanType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=function(o){return!!o},r}return e.prototype.needsWireWrite=function(r){return!!r&&!!r.Strict},e.prototype.makeWireRead=function(r){return"!!("+r+")"},e.prototype.makeWireWrite=function(r,o){return o&&o.Strict&&function(a){if(typeof a=="boolean")return a;throw new Error("Type mismatch")}||r},e}(BindType);_nbind.BooleanType=BooleanType;var Wrapper=function(){function t(){}return t.prototype.persist=function(){this.__nbindState|=1},t}();_nbind.Wrapper=Wrapper;function makeBound(t,e){var r=function(o){__extends(a,o);function a(n,u,A,p){var h=o.call(this)||this;if(!(h instanceof a))return new(Function.prototype.bind.apply(a,Array.prototype.concat.apply([null],arguments)));var E=u,I=A,v=p;if(n!==_nbind.ptrMarker){var b=h.__nbindConstructor.apply(h,arguments);E=4608,v=HEAPU32[b/4],I=HEAPU32[b/4+1]}var C={configurable:!0,enumerable:!1,value:null,writable:!1},T={__nbindFlags:E,__nbindPtr:I};v&&(T.__nbindShared=v,_nbind.mark(h));for(var L=0,U=Object.keys(T);L>=1;var r=_nbind.valueList[t];return _nbind.valueList[t]=firstFreeValue,firstFreeValue=t,r}else{if(e)return _nbind.popShared(t,e);throw new Error("Invalid value slot "+t)}}_nbind.popValue=popValue;var valueBase=18446744073709552e3;function push64(t){return typeof t=="number"?t:pushValue(t)*4096+valueBase}function pop64(t){return t=3?u=Buffer.from(n):u=new Buffer(n),u.copy(o)}else getBuffer(o).set(n)}}_nbind.commitBuffer=commitBuffer;var dirtyList=[],gcTimer=0;function sweep(){for(var t=0,e=dirtyList;t>2]=DYNAMIC_BASE,staticSealed=!0;function invoke_viiiii(t,e,r,o,a,n){try{Module.dynCall_viiiii(t,e,r,o,a,n)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_vif(t,e,r){try{Module.dynCall_vif(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_vid(t,e,r){try{Module.dynCall_vid(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_fiff(t,e,r,o){try{return Module.dynCall_fiff(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_vi(t,e){try{Module.dynCall_vi(t,e)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_vii(t,e,r){try{Module.dynCall_vii(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_ii(t,e){try{return Module.dynCall_ii(t,e)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_viddi(t,e,r,o,a){try{Module.dynCall_viddi(t,e,r,o,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}function invoke_vidd(t,e,r,o){try{Module.dynCall_vidd(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_iiii(t,e,r,o){try{return Module.dynCall_iiii(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_diii(t,e,r,o){try{return Module.dynCall_diii(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_di(t,e){try{return Module.dynCall_di(t,e)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_iid(t,e,r){try{return Module.dynCall_iid(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_iii(t,e,r){try{return Module.dynCall_iii(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_viiddi(t,e,r,o,a,n){try{Module.dynCall_viiddi(t,e,r,o,a,n)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_viiiiii(t,e,r,o,a,n,u){try{Module.dynCall_viiiiii(t,e,r,o,a,n,u)}catch(A){if(typeof A!="number"&&A!=="longjmp")throw A;Module.setThrew(1,0)}}function invoke_dii(t,e,r){try{return Module.dynCall_dii(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_i(t){try{return Module.dynCall_i(t)}catch(e){if(typeof e!="number"&&e!=="longjmp")throw e;Module.setThrew(1,0)}}function invoke_iiiiii(t,e,r,o,a,n){try{return Module.dynCall_iiiiii(t,e,r,o,a,n)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_viiid(t,e,r,o,a){try{Module.dynCall_viiid(t,e,r,o,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}function invoke_viififi(t,e,r,o,a,n,u){try{Module.dynCall_viififi(t,e,r,o,a,n,u)}catch(A){if(typeof A!="number"&&A!=="longjmp")throw A;Module.setThrew(1,0)}}function invoke_viii(t,e,r,o){try{Module.dynCall_viii(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_v(t){try{Module.dynCall_v(t)}catch(e){if(typeof e!="number"&&e!=="longjmp")throw e;Module.setThrew(1,0)}}function invoke_viid(t,e,r,o){try{Module.dynCall_viid(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_idd(t,e,r){try{return Module.dynCall_idd(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_viiii(t,e,r,o,a){try{Module.dynCall_viiii(t,e,r,o,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}Module.asmGlobalArg={Math,Int8Array,Int16Array,Int32Array,Uint8Array,Uint16Array,Uint32Array,Float32Array,Float64Array,NaN:NaN,Infinity:1/0},Module.asmLibraryArg={abort,assert,enlargeMemory,getTotalMemory,abortOnCannotGrowMemory,invoke_viiiii,invoke_vif,invoke_vid,invoke_fiff,invoke_vi,invoke_vii,invoke_ii,invoke_viddi,invoke_vidd,invoke_iiii,invoke_diii,invoke_di,invoke_iid,invoke_iii,invoke_viiddi,invoke_viiiiii,invoke_dii,invoke_i,invoke_iiiiii,invoke_viiid,invoke_viififi,invoke_viii,invoke_v,invoke_viid,invoke_idd,invoke_viiii,_emscripten_asm_const_iiiii,_emscripten_asm_const_iiidddddd,_emscripten_asm_const_iiiid,__nbind_reference_external,_emscripten_asm_const_iiiiiiii,_removeAccessorPrefix,_typeModule,__nbind_register_pool,__decorate,_llvm_stackrestore,___cxa_atexit,__extends,__nbind_get_value_object,__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,_emscripten_set_main_loop_timing,__nbind_register_primitive,__nbind_register_type,_emscripten_memcpy_big,__nbind_register_function,___setErrNo,__nbind_register_class,__nbind_finish,_abort,_nbind_value,_llvm_stacksave,___syscall54,_defineHidden,_emscripten_set_main_loop,_emscripten_get_now,__nbind_register_callback_signature,_emscripten_asm_const_iiiiii,__nbind_free_external,_emscripten_asm_const_iiii,_emscripten_asm_const_iiididi,___syscall6,_atexit,___syscall140,___syscall146,DYNAMICTOP_PTR,tempDoublePtr,ABORT,STACKTOP,STACK_MAX,cttz_i8,___dso_handle};var asm=function(t,e,r){var o=new t.Int8Array(r),a=new t.Int16Array(r),n=new t.Int32Array(r),u=new t.Uint8Array(r),A=new t.Uint16Array(r),p=new t.Uint32Array(r),h=new t.Float32Array(r),E=new t.Float64Array(r),I=e.DYNAMICTOP_PTR|0,v=e.tempDoublePtr|0,b=e.ABORT|0,C=e.STACKTOP|0,T=e.STACK_MAX|0,L=e.cttz_i8|0,U=e.___dso_handle|0,J=0,te=0,le=0,pe=0,Ae=t.NaN,ye=t.Infinity,ae=0,we=0,Pe=0,g=0,Ee=0,De=0,ce=t.Math.floor,ne=t.Math.abs,ee=t.Math.sqrt,Ie=t.Math.pow,ke=t.Math.cos,ht=t.Math.sin,H=t.Math.tan,lt=t.Math.acos,Re=t.Math.asin,Qe=t.Math.atan,be=t.Math.atan2,_e=t.Math.exp,Te=t.Math.log,Je=t.Math.ceil,He=t.Math.imul,x=t.Math.min,w=t.Math.max,S=t.Math.clz32,y=t.Math.fround,F=e.abort,z=e.assert,X=e.enlargeMemory,Z=e.getTotalMemory,ie=e.abortOnCannotGrowMemory,Se=e.invoke_viiiii,Ne=e.invoke_vif,ot=e.invoke_vid,dt=e.invoke_fiff,jt=e.invoke_vi,$t=e.invoke_vii,xt=e.invoke_ii,an=e.invoke_viddi,Qr=e.invoke_vidd,mr=e.invoke_iiii,xr=e.invoke_diii,Wr=e.invoke_di,Vn=e.invoke_iid,Ns=e.invoke_iii,Ri=e.invoke_viiddi,ps=e.invoke_viiiiii,io=e.invoke_dii,Si=e.invoke_i,Ls=e.invoke_iiiiii,so=e.invoke_viiid,cc=e.invoke_viififi,cu=e.invoke_viii,ap=e.invoke_v,lp=e.invoke_viid,Ms=e.invoke_idd,Dn=e.invoke_viiii,oo=e._emscripten_asm_const_iiiii,Os=e._emscripten_asm_const_iiidddddd,ml=e._emscripten_asm_const_iiiid,yl=e.__nbind_reference_external,ao=e._emscripten_asm_const_iiiiiiii,Kn=e._removeAccessorPrefix,Mn=e._typeModule,Ni=e.__nbind_register_pool,On=e.__decorate,_i=e._llvm_stackrestore,tr=e.___cxa_atexit,Me=e.__extends,ii=e.__nbind_get_value_object,Oa=e.__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,hr=e._emscripten_set_main_loop_timing,uc=e.__nbind_register_primitive,uu=e.__nbind_register_type,Ac=e._emscripten_memcpy_big,El=e.__nbind_register_function,vA=e.___setErrNo,Au=e.__nbind_register_class,Ce=e.__nbind_finish,Tt=e._abort,fc=e._nbind_value,Hi=e._llvm_stacksave,fu=e.___syscall54,Yt=e._defineHidden,Cl=e._emscripten_set_main_loop,DA=e._emscripten_get_now,cp=e.__nbind_register_callback_signature,pc=e._emscripten_asm_const_iiiiii,PA=e.__nbind_free_external,Qn=e._emscripten_asm_const_iiii,hi=e._emscripten_asm_const_iiididi,hc=e.___syscall6,SA=e._atexit,sa=e.___syscall140,Li=e.___syscall146,_o=y(0);let Ze=y(0);function lo(s){s=s|0;var l=0;return l=C,C=C+s|0,C=C+15&-16,l|0}function gc(){return C|0}function pu(s){s=s|0,C=s}function ji(s,l){s=s|0,l=l|0,C=s,T=l}function hu(s,l){s=s|0,l=l|0,J||(J=s,te=l)}function xA(s){s=s|0,De=s}function Ua(){return De|0}function dc(){var s=0,l=0;Dr(8104,8,400)|0,Dr(8504,408,540)|0,s=9044,l=s+44|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));o[9088]=0,o[9089]=1,n[2273]=0,n[2274]=948,n[2275]=948,tr(17,8104,U|0)|0}function hs(s){s=s|0,ft(s+948|0)}function _t(s){return s=y(s),((Du(s)|0)&2147483647)>>>0>2139095040|0}function Fn(s,l,c){s=s|0,l=l|0,c=c|0;e:do if(n[s+(l<<3)+4>>2]|0)s=s+(l<<3)|0;else{if((l|2|0)==3&&n[s+60>>2]|0){s=s+56|0;break}switch(l|0){case 0:case 2:case 4:case 5:{if(n[s+52>>2]|0){s=s+48|0;break e}break}default:}if(n[s+68>>2]|0){s=s+64|0;break}else{s=(l|1|0)==5?948:c;break}}while(0);return s|0}function Ci(s){s=s|0;var l=0;return l=pD(1e3)|0,oa(s,(l|0)!=0,2456),n[2276]=(n[2276]|0)+1,Dr(l|0,8104,1e3)|0,o[s+2>>0]|0&&(n[l+4>>2]=2,n[l+12>>2]=4),n[l+976>>2]=s,l|0}function oa(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;d=C,C=C+16|0,f=d,l||(n[f>>2]=c,yg(s,5,3197,f)),C=d}function co(){return Ci(956)|0}function Us(s){s=s|0;var l=0;return l=Vt(1e3)|0,aa(l,s),oa(n[s+976>>2]|0,1,2456),n[2276]=(n[2276]|0)+1,n[l+944>>2]=0,l|0}function aa(s,l){s=s|0,l=l|0;var c=0;Dr(s|0,l|0,948)|0,Fm(s+948|0,l+948|0),c=s+960|0,s=l+960|0,l=c+40|0;do n[c>>2]=n[s>>2],c=c+4|0,s=s+4|0;while((c|0)<(l|0))}function la(s){s=s|0;var l=0,c=0,f=0,d=0;if(l=s+944|0,c=n[l>>2]|0,c|0&&(Ho(c+948|0,s)|0,n[l>>2]=0),c=wi(s)|0,c|0){l=0;do n[(gs(s,l)|0)+944>>2]=0,l=l+1|0;while((l|0)!=(c|0))}c=s+948|0,f=n[c>>2]|0,d=s+952|0,l=n[d>>2]|0,(l|0)!=(f|0)&&(n[d>>2]=l+(~((l+-4-f|0)>>>2)<<2)),ds(c),hD(s),n[2276]=(n[2276]|0)+-1}function Ho(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0;f=n[s>>2]|0,k=s+4|0,c=n[k>>2]|0,m=c;e:do if((f|0)==(c|0))d=f,B=4;else for(s=f;;){if((n[s>>2]|0)==(l|0)){d=s,B=4;break e}if(s=s+4|0,(s|0)==(c|0)){s=0;break}}while(0);return(B|0)==4&&((d|0)!=(c|0)?(f=d+4|0,s=m-f|0,l=s>>2,l&&(Mw(d|0,f|0,s|0)|0,c=n[k>>2]|0),s=d+(l<<2)|0,(c|0)==(s|0)||(n[k>>2]=c+(~((c+-4-s|0)>>>2)<<2)),s=1):s=0),s|0}function wi(s){return s=s|0,(n[s+952>>2]|0)-(n[s+948>>2]|0)>>2|0}function gs(s,l){s=s|0,l=l|0;var c=0;return c=n[s+948>>2]|0,(n[s+952>>2]|0)-c>>2>>>0>l>>>0?s=n[c+(l<<2)>>2]|0:s=0,s|0}function ds(s){s=s|0;var l=0,c=0,f=0,d=0;f=C,C=C+32|0,l=f,d=n[s>>2]|0,c=(n[s+4>>2]|0)-d|0,((n[s+8>>2]|0)-d|0)>>>0>c>>>0&&(d=c>>2,wp(l,d,d,s+8|0),Ig(s,l),UA(l)),C=f}function ms(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0;O=wi(s)|0;do if(O|0){if((n[(gs(s,0)|0)+944>>2]|0)==(s|0)){if(!(Ho(s+948|0,l)|0))break;Dr(l+400|0,8504,540)|0,n[l+944>>2]=0,Le(s);break}B=n[(n[s+976>>2]|0)+12>>2]|0,k=s+948|0,Q=(B|0)==0,c=0,m=0;do f=n[(n[k>>2]|0)+(m<<2)>>2]|0,(f|0)==(l|0)?Le(s):(d=Us(f)|0,n[(n[k>>2]|0)+(c<<2)>>2]=d,n[d+944>>2]=s,Q||LT[B&15](f,d,s,c),c=c+1|0),m=m+1|0;while((m|0)!=(O|0));if(c>>>0>>0){Q=s+948|0,k=s+952|0,B=c,c=n[k>>2]|0;do m=(n[Q>>2]|0)+(B<<2)|0,f=m+4|0,d=c-f|0,l=d>>2,l&&(Mw(m|0,f|0,d|0)|0,c=n[k>>2]|0),d=c,f=m+(l<<2)|0,(d|0)!=(f|0)&&(c=d+(~((d+-4-f|0)>>>2)<<2)|0,n[k>>2]=c),B=B+1|0;while((B|0)!=(O|0))}}while(0)}function _s(s){s=s|0;var l=0,c=0,f=0,d=0;Un(s,(wi(s)|0)==0,2491),Un(s,(n[s+944>>2]|0)==0,2545),l=s+948|0,c=n[l>>2]|0,f=s+952|0,d=n[f>>2]|0,(d|0)!=(c|0)&&(n[f>>2]=d+(~((d+-4-c|0)>>>2)<<2)),ds(l),l=s+976|0,c=n[l>>2]|0,Dr(s|0,8104,1e3)|0,o[c+2>>0]|0&&(n[s+4>>2]=2,n[s+12>>2]=4),n[l>>2]=c}function Un(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;d=C,C=C+16|0,f=d,l||(n[f>>2]=c,Ao(s,5,3197,f)),C=d}function Pn(){return n[2276]|0}function ys(){var s=0;return s=pD(20)|0,We((s|0)!=0,2592),n[2277]=(n[2277]|0)+1,n[s>>2]=n[239],n[s+4>>2]=n[240],n[s+8>>2]=n[241],n[s+12>>2]=n[242],n[s+16>>2]=n[243],s|0}function We(s,l){s=s|0,l=l|0;var c=0,f=0;f=C,C=C+16|0,c=f,s||(n[c>>2]=l,Ao(0,5,3197,c)),C=f}function tt(s){s=s|0,hD(s),n[2277]=(n[2277]|0)+-1}function It(s,l){s=s|0,l=l|0;var c=0;l?(Un(s,(wi(s)|0)==0,2629),c=1):(c=0,l=0),n[s+964>>2]=l,n[s+988>>2]=c}function nr(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,m=f+8|0,d=f+4|0,B=f,n[d>>2]=l,Un(s,(n[l+944>>2]|0)==0,2709),Un(s,(n[s+964>>2]|0)==0,2763),$(s),l=s+948|0,n[B>>2]=(n[l>>2]|0)+(c<<2),n[m>>2]=n[B>>2],me(l,m,d)|0,n[(n[d>>2]|0)+944>>2]=s,Le(s),C=f}function $(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;if(c=wi(s)|0,c|0&&(n[(gs(s,0)|0)+944>>2]|0)!=(s|0)){f=n[(n[s+976>>2]|0)+12>>2]|0,d=s+948|0,m=(f|0)==0,l=0;do B=n[(n[d>>2]|0)+(l<<2)>>2]|0,k=Us(B)|0,n[(n[d>>2]|0)+(l<<2)>>2]=k,n[k+944>>2]=s,m||LT[f&15](B,k,s,l),l=l+1|0;while((l|0)!=(c|0))}}function me(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0,Ge=0,Oe=0,Fe=0,et=0,Xe=0;et=C,C=C+64|0,q=et+52|0,k=et+48|0,se=et+28|0,Ge=et+24|0,Oe=et+20|0,Fe=et,f=n[s>>2]|0,m=f,l=f+((n[l>>2]|0)-m>>2<<2)|0,f=s+4|0,d=n[f>>2]|0,B=s+8|0;do if(d>>>0<(n[B>>2]|0)>>>0){if((l|0)==(d|0)){n[l>>2]=n[c>>2],n[f>>2]=(n[f>>2]|0)+4;break}_A(s,l,d,l+4|0),l>>>0<=c>>>0&&(c=(n[f>>2]|0)>>>0>c>>>0?c+4|0:c),n[l>>2]=n[c>>2]}else{f=(d-m>>2)+1|0,d=N(s)|0,d>>>0>>0&&zr(s),M=n[s>>2]|0,O=(n[B>>2]|0)-M|0,m=O>>1,wp(Fe,O>>2>>>0>>1>>>0?m>>>0>>0?f:m:d,l-M>>2,s+8|0),M=Fe+8|0,f=n[M>>2]|0,m=Fe+12|0,O=n[m>>2]|0,B=O,Q=f;do if((f|0)==(O|0)){if(O=Fe+4|0,f=n[O>>2]|0,Xe=n[Fe>>2]|0,d=Xe,f>>>0<=Xe>>>0){f=B-d>>1,f=(f|0)==0?1:f,wp(se,f,f>>>2,n[Fe+16>>2]|0),n[Ge>>2]=n[O>>2],n[Oe>>2]=n[M>>2],n[k>>2]=n[Ge>>2],n[q>>2]=n[Oe>>2],vw(se,k,q),f=n[Fe>>2]|0,n[Fe>>2]=n[se>>2],n[se>>2]=f,f=se+4|0,Xe=n[O>>2]|0,n[O>>2]=n[f>>2],n[f>>2]=Xe,f=se+8|0,Xe=n[M>>2]|0,n[M>>2]=n[f>>2],n[f>>2]=Xe,f=se+12|0,Xe=n[m>>2]|0,n[m>>2]=n[f>>2],n[f>>2]=Xe,UA(se),f=n[M>>2]|0;break}m=f,B=((m-d>>2)+1|0)/-2|0,k=f+(B<<2)|0,d=Q-m|0,m=d>>2,m&&(Mw(k|0,f|0,d|0)|0,f=n[O>>2]|0),Xe=k+(m<<2)|0,n[M>>2]=Xe,n[O>>2]=f+(B<<2),f=Xe}while(0);n[f>>2]=n[c>>2],n[M>>2]=(n[M>>2]|0)+4,l=Bg(s,Fe,l)|0,UA(Fe)}while(0);return C=et,l|0}function Le(s){s=s|0;var l=0;do{if(l=s+984|0,o[l>>0]|0)break;o[l>>0]=1,h[s+504>>2]=y(Ae),s=n[s+944>>2]|0}while((s|0)!=0)}function ft(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-4-f|0)>>>2)<<2)),gt(c))}function pt(s){return s=s|0,n[s+944>>2]|0}function Rt(s){s=s|0,Un(s,(n[s+964>>2]|0)!=0,2832),Le(s)}function er(s){return s=s|0,(o[s+984>>0]|0)!=0|0}function Zr(s,l){s=s|0,l=l|0,LUe(s,l,400)|0&&(Dr(s|0,l|0,400)|0,Le(s))}function qi(s){s=s|0;var l=Ze;return l=y(h[s+44>>2]),s=_t(l)|0,y(s?y(0):l)}function es(s){s=s|0;var l=Ze;return l=y(h[s+48>>2]),_t(l)|0&&(l=o[(n[s+976>>2]|0)+2>>0]|0?y(1):y(0)),y(l)}function xi(s,l){s=s|0,l=l|0,n[s+980>>2]=l}function jo(s){return s=s|0,n[s+980>>2]|0}function bA(s,l){s=s|0,l=l|0;var c=0;c=s+4|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Le(s))}function kA(s){return s=s|0,n[s+4>>2]|0}function up(s,l){s=s|0,l=l|0;var c=0;c=s+8|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Le(s))}function ng(s){return s=s|0,n[s+8>>2]|0}function gu(s,l){s=s|0,l=l|0;var c=0;c=s+12|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Le(s))}function ig(s){return s=s|0,n[s+12>>2]|0}function du(s,l){s=s|0,l=l|0;var c=0;c=s+16|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Le(s))}function uo(s){return s=s|0,n[s+16>>2]|0}function QA(s,l){s=s|0,l=l|0;var c=0;c=s+20|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Le(s))}function mc(s){return s=s|0,n[s+20>>2]|0}function ca(s,l){s=s|0,l=l|0;var c=0;c=s+24|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Le(s))}function sg(s){return s=s|0,n[s+24>>2]|0}function yc(s,l){s=s|0,l=l|0;var c=0;c=s+28|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Le(s))}function Pm(s){return s=s|0,n[s+28>>2]|0}function og(s,l){s=s|0,l=l|0;var c=0;c=s+32|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Le(s))}function $n(s){return s=s|0,n[s+32>>2]|0}function Ap(s,l){s=s|0,l=l|0;var c=0;c=s+36|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Le(s))}function ag(s){return s=s|0,n[s+36>>2]|0}function FA(s,l){s=s|0,l=y(l);var c=0;c=s+40|0,y(h[c>>2])!=l&&(h[c>>2]=l,Le(s))}function Hs(s,l){s=s|0,l=y(l);var c=0;c=s+44|0,y(h[c>>2])!=l&&(h[c>>2]=l,Le(s))}function mu(s,l){s=s|0,l=y(l);var c=0;c=s+48|0,y(h[c>>2])!=l&&(h[c>>2]=l,Le(s))}function Ha(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=_t(l)|0,c=(m^1)&1,f=s+52|0,d=s+56|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function Gi(s,l){s=s|0,l=y(l);var c=0,f=0;f=s+52|0,c=s+56|0,y(h[f>>2])==l&&(n[c>>2]|0)==2||(h[f>>2]=l,f=_t(l)|0,n[c>>2]=f?3:2,Le(s))}function ua(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+52|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function yu(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=_t(c)|0,f=(m^1)&1,d=s+132+(l<<3)|0,l=s+132+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Le(s))}function Es(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=_t(c)|0,f=m?0:2,d=s+132+(l<<3)|0,l=s+132+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Le(s))}function Ec(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=l+132+(c<<3)|0,l=n[f+4>>2]|0,c=s,n[c>>2]=n[f>>2],n[c+4>>2]=l}function Cc(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=_t(c)|0,f=(m^1)&1,d=s+60+(l<<3)|0,l=s+60+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Le(s))}function G(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=_t(c)|0,f=m?0:2,d=s+60+(l<<3)|0,l=s+60+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Le(s))}function Dt(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=l+60+(c<<3)|0,l=n[f+4>>2]|0,c=s,n[c>>2]=n[f>>2],n[c+4>>2]=l}function wl(s,l){s=s|0,l=l|0;var c=0;c=s+60+(l<<3)+4|0,(n[c>>2]|0)!=3&&(h[s+60+(l<<3)>>2]=y(Ae),n[c>>2]=3,Le(s))}function bi(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=_t(c)|0,f=(m^1)&1,d=s+204+(l<<3)|0,l=s+204+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Le(s))}function wc(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=_t(c)|0,f=m?0:2,d=s+204+(l<<3)|0,l=s+204+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Le(s))}function ct(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=l+204+(c<<3)|0,l=n[f+4>>2]|0,c=s,n[c>>2]=n[f>>2],n[c+4>>2]=l}function Eu(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=_t(c)|0,f=(m^1)&1,d=s+276+(l<<3)|0,l=s+276+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Le(s))}function lg(s,l){return s=s|0,l=l|0,y(h[s+276+(l<<3)>>2])}function mw(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=_t(l)|0,c=(m^1)&1,f=s+348|0,d=s+352|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function TA(s,l){s=s|0,l=y(l);var c=0,f=0;f=s+348|0,c=s+352|0,y(h[f>>2])==l&&(n[c>>2]|0)==2||(h[f>>2]=l,f=_t(l)|0,n[c>>2]=f?3:2,Le(s))}function fp(s){s=s|0;var l=0;l=s+352|0,(n[l>>2]|0)!=3&&(h[s+348>>2]=y(Ae),n[l>>2]=3,Le(s))}function Br(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+348|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Cs(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=_t(l)|0,c=(m^1)&1,f=s+356|0,d=s+360|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function cg(s,l){s=s|0,l=y(l);var c=0,f=0;f=s+356|0,c=s+360|0,y(h[f>>2])==l&&(n[c>>2]|0)==2||(h[f>>2]=l,f=_t(l)|0,n[c>>2]=f?3:2,Le(s))}function ug(s){s=s|0;var l=0;l=s+360|0,(n[l>>2]|0)!=3&&(h[s+356>>2]=y(Ae),n[l>>2]=3,Le(s))}function Ag(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+356|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function pp(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=_t(l)|0,c=(m^1)&1,f=s+364|0,d=s+368|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function Ic(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=_t(l)|0,c=m?0:2,f=s+364|0,d=s+368|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function Ct(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+364|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Sm(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=_t(l)|0,c=(m^1)&1,f=s+372|0,d=s+376|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function fg(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=_t(l)|0,c=m?0:2,f=s+372|0,d=s+376|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function pg(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+372|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Cu(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=_t(l)|0,c=(m^1)&1,f=s+380|0,d=s+384|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function xm(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=_t(l)|0,c=m?0:2,f=s+380|0,d=s+384|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function hg(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+380|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function wu(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=_t(l)|0,c=(m^1)&1,f=s+388|0,d=s+392|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function yw(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=_t(l)|0,c=m?0:2,f=s+388|0,d=s+392|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function bm(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+388|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Aa(s,l){s=s|0,l=y(l);var c=0;c=s+396|0,y(h[c>>2])!=l&&(h[c>>2]=l,Le(s))}function Bc(s){return s=s|0,y(h[s+396>>2])}function Il(s){return s=s|0,y(h[s+400>>2])}function Iu(s){return s=s|0,y(h[s+404>>2])}function gg(s){return s=s|0,y(h[s+408>>2])}function RA(s){return s=s|0,y(h[s+412>>2])}function hp(s){return s=s|0,y(h[s+416>>2])}function ja(s){return s=s|0,y(h[s+420>>2])}function dg(s,l){switch(s=s|0,l=l|0,Un(s,(l|0)<6,2918),l|0){case 0:{l=(n[s+496>>2]|0)==2?5:4;break}case 2:{l=(n[s+496>>2]|0)==2?4:5;break}default:}return y(h[s+424+(l<<2)>>2])}function gp(s,l){switch(s=s|0,l=l|0,Un(s,(l|0)<6,2918),l|0){case 0:{l=(n[s+496>>2]|0)==2?5:4;break}case 2:{l=(n[s+496>>2]|0)==2?4:5;break}default:}return y(h[s+448+(l<<2)>>2])}function qo(s,l){switch(s=s|0,l=l|0,Un(s,(l|0)<6,2918),l|0){case 0:{l=(n[s+496>>2]|0)==2?5:4;break}case 2:{l=(n[s+496>>2]|0)==2?4:5;break}default:}return y(h[s+472+(l<<2)>>2])}function ws(s,l){s=s|0,l=l|0;var c=0,f=Ze;return c=n[s+4>>2]|0,(c|0)==(n[l+4>>2]|0)?c?(f=y(h[s>>2]),s=y(ne(y(f-y(h[l>>2]))))>2]=0,n[f+4>>2]=0,n[f+8>>2]=0,Oa(f|0,s|0,l|0,0),Ao(s,3,(o[f+11>>0]|0)<0?n[f>>2]|0:f,c),s3e(f),C=c}function Go(s,l,c,f){s=y(s),l=y(l),c=c|0,f=f|0;var d=Ze;s=y(s*l),d=y(kT(s,y(1)));do if(Ii(d,y(0))|0)s=y(s-d);else{if(s=y(s-d),Ii(d,y(1))|0){s=y(s+y(1));break}if(c){s=y(s+y(1));break}f||(d>y(.5)?d=y(1):(f=Ii(d,y(.5))|0,d=y(f?1:0)),s=y(s+d))}while(0);return y(s/l)}function NA(s,l,c,f,d,m,B,k,Q,O,M,q,se){s=s|0,l=y(l),c=c|0,f=y(f),d=d|0,m=y(m),B=B|0,k=y(k),Q=y(Q),O=y(O),M=y(M),q=y(q),se=se|0;var Ge=0,Oe=Ze,Fe=Ze,et=Ze,Xe=Ze,at=Ze,Ue=Ze;return Q>2]),Oe!=y(0))?(et=y(Go(l,Oe,0,0)),Xe=y(Go(f,Oe,0,0)),Fe=y(Go(m,Oe,0,0)),Oe=y(Go(k,Oe,0,0))):(Fe=m,et=l,Oe=k,Xe=f),(d|0)==(s|0)?Ge=Ii(Fe,et)|0:Ge=0,(B|0)==(c|0)?se=Ii(Oe,Xe)|0:se=0,!Ge&&(at=y(l-M),!(dp(s,at,Q)|0))&&!(mp(s,at,d,Q)|0)?Ge=mg(s,at,d,m,Q)|0:Ge=1,!se&&(Ue=y(f-q),!(dp(c,Ue,O)|0))&&!(mp(c,Ue,B,O)|0)?se=mg(c,Ue,B,k,O)|0:se=1,se=Ge&se),se|0}function dp(s,l,c){return s=s|0,l=y(l),c=y(c),(s|0)==1?s=Ii(l,c)|0:s=0,s|0}function mp(s,l,c,f){return s=s|0,l=y(l),c=c|0,f=y(f),(s|0)==2&(c|0)==0?l>=f?s=1:s=Ii(l,f)|0:s=0,s|0}function mg(s,l,c,f,d){return s=s|0,l=y(l),c=c|0,f=y(f),d=y(d),(s|0)==2&(c|0)==2&f>l?d<=l?s=1:s=Ii(l,d)|0:s=0,s|0}function fa(s,l,c,f,d,m,B,k,Q,O,M){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=m|0,B=y(B),k=y(k),Q=Q|0,O=O|0,M=M|0;var q=0,se=0,Ge=0,Oe=0,Fe=Ze,et=Ze,Xe=0,at=0,Ue=0,qe=0,Lt=0,Or=0,or=0,Xt=0,Pr=0,Nr=0,ir=0,bn=Ze,go=Ze,mo=Ze,yo=0,ya=0;ir=C,C=C+160|0,Xt=ir+152|0,or=ir+120|0,Or=ir+104|0,Ue=ir+72|0,Oe=ir+56|0,Lt=ir+8|0,at=ir,qe=(n[2279]|0)+1|0,n[2279]=qe,Pr=s+984|0,(o[Pr>>0]|0)!=0&&(n[s+512>>2]|0)!=(n[2278]|0)?Xe=4:(n[s+516>>2]|0)==(f|0)?Nr=0:Xe=4,(Xe|0)==4&&(n[s+520>>2]=0,n[s+924>>2]=-1,n[s+928>>2]=-1,h[s+932>>2]=y(-1),h[s+936>>2]=y(-1),Nr=1);e:do if(n[s+964>>2]|0)if(Fe=y(ln(s,2,B)),et=y(ln(s,0,B)),q=s+916|0,mo=y(h[q>>2]),go=y(h[s+920>>2]),bn=y(h[s+932>>2]),NA(d,l,m,c,n[s+924>>2]|0,mo,n[s+928>>2]|0,go,bn,y(h[s+936>>2]),Fe,et,M)|0)Xe=22;else if(Ge=n[s+520>>2]|0,!Ge)Xe=21;else for(se=0;;){if(q=s+524+(se*24|0)|0,bn=y(h[q>>2]),go=y(h[s+524+(se*24|0)+4>>2]),mo=y(h[s+524+(se*24|0)+16>>2]),NA(d,l,m,c,n[s+524+(se*24|0)+8>>2]|0,bn,n[s+524+(se*24|0)+12>>2]|0,go,mo,y(h[s+524+(se*24|0)+20>>2]),Fe,et,M)|0){Xe=22;break e}if(se=se+1|0,se>>>0>=Ge>>>0){Xe=21;break}}else{if(Q){if(q=s+916|0,!(Ii(y(h[q>>2]),l)|0)){Xe=21;break}if(!(Ii(y(h[s+920>>2]),c)|0)){Xe=21;break}if((n[s+924>>2]|0)!=(d|0)){Xe=21;break}q=(n[s+928>>2]|0)==(m|0)?q:0,Xe=22;break}if(Ge=n[s+520>>2]|0,!Ge)Xe=21;else for(se=0;;){if(q=s+524+(se*24|0)|0,Ii(y(h[q>>2]),l)|0&&Ii(y(h[s+524+(se*24|0)+4>>2]),c)|0&&(n[s+524+(se*24|0)+8>>2]|0)==(d|0)&&(n[s+524+(se*24|0)+12>>2]|0)==(m|0)){Xe=22;break e}if(se=se+1|0,se>>>0>=Ge>>>0){Xe=21;break}}}while(0);do if((Xe|0)==21)o[11697]|0?(q=0,Xe=28):(q=0,Xe=31);else if((Xe|0)==22){if(se=(o[11697]|0)!=0,!((q|0)!=0&(Nr^1)))if(se){Xe=28;break}else{Xe=31;break}Oe=q+16|0,n[s+908>>2]=n[Oe>>2],Ge=q+20|0,n[s+912>>2]=n[Ge>>2],(o[11698]|0)==0|se^1||(n[at>>2]=LA(qe)|0,n[at+4>>2]=qe,Ao(s,4,2972,at),se=n[s+972>>2]|0,se|0&&ef[se&127](s),d=qa(d,Q)|0,m=qa(m,Q)|0,ya=+y(h[Oe>>2]),yo=+y(h[Ge>>2]),n[Lt>>2]=d,n[Lt+4>>2]=m,E[Lt+8>>3]=+l,E[Lt+16>>3]=+c,E[Lt+24>>3]=ya,E[Lt+32>>3]=yo,n[Lt+40>>2]=O,Ao(s,4,2989,Lt))}while(0);return(Xe|0)==28&&(se=LA(qe)|0,n[Oe>>2]=se,n[Oe+4>>2]=qe,n[Oe+8>>2]=Nr?3047:11699,Ao(s,4,3038,Oe),se=n[s+972>>2]|0,se|0&&ef[se&127](s),Lt=qa(d,Q)|0,Xe=qa(m,Q)|0,n[Ue>>2]=Lt,n[Ue+4>>2]=Xe,E[Ue+8>>3]=+l,E[Ue+16>>3]=+c,n[Ue+24>>2]=O,Ao(s,4,3049,Ue),Xe=31),(Xe|0)==31&&(si(s,l,c,f,d,m,B,k,Q,M),o[11697]|0&&(se=n[2279]|0,Lt=LA(se)|0,n[Or>>2]=Lt,n[Or+4>>2]=se,n[Or+8>>2]=Nr?3047:11699,Ao(s,4,3083,Or),se=n[s+972>>2]|0,se|0&&ef[se&127](s),Lt=qa(d,Q)|0,Or=qa(m,Q)|0,yo=+y(h[s+908>>2]),ya=+y(h[s+912>>2]),n[or>>2]=Lt,n[or+4>>2]=Or,E[or+8>>3]=yo,E[or+16>>3]=ya,n[or+24>>2]=O,Ao(s,4,3092,or)),n[s+516>>2]=f,q||(se=s+520|0,q=n[se>>2]|0,(q|0)==16&&(o[11697]|0&&Ao(s,4,3124,Xt),n[se>>2]=0,q=0),Q?q=s+916|0:(n[se>>2]=q+1,q=s+524+(q*24|0)|0),h[q>>2]=l,h[q+4>>2]=c,n[q+8>>2]=d,n[q+12>>2]=m,n[q+16>>2]=n[s+908>>2],n[q+20>>2]=n[s+912>>2],q=0)),Q&&(n[s+416>>2]=n[s+908>>2],n[s+420>>2]=n[s+912>>2],o[s+985>>0]=1,o[Pr>>0]=0),n[2279]=(n[2279]|0)+-1,n[s+512>>2]=n[2278],C=ir,Nr|(q|0)==0|0}function ln(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return f=y(V(s,l,c)),y(f+y(re(s,l,c)))}function Ao(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=C,C=C+16|0,d=m,n[d>>2]=f,s?f=n[s+976>>2]|0:f=0,Eg(f,s,l,c,d),C=m}function LA(s){return s=s|0,(s>>>0>60?3201:3201+(60-s)|0)|0}function qa(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;return d=C,C=C+32|0,c=d+12|0,f=d,n[c>>2]=n[254],n[c+4>>2]=n[255],n[c+8>>2]=n[256],n[f>>2]=n[257],n[f+4>>2]=n[258],n[f+8>>2]=n[259],(s|0)>2?s=11699:s=n[(l?f:c)+(s<<2)>>2]|0,C=d,s|0}function si(s,l,c,f,d,m,B,k,Q,O){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=m|0,B=y(B),k=y(k),Q=Q|0,O=O|0;var M=0,q=0,se=0,Ge=0,Oe=Ze,Fe=Ze,et=Ze,Xe=Ze,at=Ze,Ue=Ze,qe=Ze,Lt=0,Or=0,or=0,Xt=Ze,Pr=Ze,Nr=0,ir=Ze,bn=0,go=0,mo=0,yo=0,ya=0,Qp=0,Fp=0,xl=0,Tp=0,Fu=0,Tu=0,Rp=0,Np=0,Lp=0,Xr=0,bl=0,Mp=0,bc=0,Op=Ze,Up=Ze,Ru=Ze,Nu=Ze,kc=Ze,qs=0,za=0,Wo=0,kl=0,rf=0,nf=Ze,Lu=Ze,sf=Ze,of=Ze,Gs=Ze,vs=Ze,Ql=0,Tn=Ze,af=Ze,Eo=Ze,Qc=Ze,Co=Ze,Fc=Ze,lf=0,cf=0,Tc=Ze,Ys=Ze,Fl=0,uf=0,Af=0,ff=0,br=Ze,Jn=0,Ds=0,wo=0,Ws=0,Tr=0,ur=0,Tl=0,Jt=Ze,pf=0,li=0;Tl=C,C=C+16|0,qs=Tl+12|0,za=Tl+8|0,Wo=Tl+4|0,kl=Tl,Un(s,(d|0)==0|(_t(l)|0)^1,3326),Un(s,(m|0)==0|(_t(c)|0)^1,3406),Ds=mt(s,f)|0,n[s+496>>2]=Ds,Tr=fr(2,Ds)|0,ur=fr(0,Ds)|0,h[s+440>>2]=y(V(s,Tr,B)),h[s+444>>2]=y(re(s,Tr,B)),h[s+428>>2]=y(V(s,ur,B)),h[s+436>>2]=y(re(s,ur,B)),h[s+464>>2]=y(Cr(s,Tr)),h[s+468>>2]=y(yn(s,Tr)),h[s+452>>2]=y(Cr(s,ur)),h[s+460>>2]=y(yn(s,ur)),h[s+488>>2]=y(oi(s,Tr,B)),h[s+492>>2]=y(Mi(s,Tr,B)),h[s+476>>2]=y(oi(s,ur,B)),h[s+484>>2]=y(Mi(s,ur,B));do if(n[s+964>>2]|0)wg(s,l,c,d,m,B,k);else{if(wo=s+948|0,Ws=(n[s+952>>2]|0)-(n[wo>>2]|0)>>2,!Ws){Gv(s,l,c,d,m,B,k);break}if(!Q&&Yv(s,l,c,d,m,B,k)|0)break;$(s),bl=s+508|0,o[bl>>0]=0,Tr=fr(n[s+4>>2]|0,Ds)|0,ur=Cw(Tr,Ds)|0,Jn=he(Tr)|0,Mp=n[s+8>>2]|0,uf=s+28|0,bc=(n[uf>>2]|0)!=0,Co=Jn?B:k,Tc=Jn?k:B,Op=y(Ep(s,Tr,B)),Up=y(ww(s,Tr,B)),Oe=y(Ep(s,ur,B)),Fc=y(En(s,Tr,B)),Ys=y(En(s,ur,B)),or=Jn?d:m,Fl=Jn?m:d,br=Jn?Fc:Ys,at=Jn?Ys:Fc,Qc=y(ln(s,2,B)),Xe=y(ln(s,0,B)),Fe=y(y(Gr(s+364|0,B))-br),et=y(y(Gr(s+380|0,B))-br),Ue=y(y(Gr(s+372|0,k))-at),qe=y(y(Gr(s+388|0,k))-at),Ru=Jn?Fe:Ue,Nu=Jn?et:qe,Qc=y(l-Qc),l=y(Qc-br),_t(l)|0?br=l:br=y(_n(y(Tg(l,et)),Fe)),af=y(c-Xe),l=y(af-at),_t(l)|0?Eo=l:Eo=y(_n(y(Tg(l,qe)),Ue)),Fe=Jn?br:Eo,Tn=Jn?Eo:br;e:do if((or|0)==1)for(f=0,q=0;;){if(M=gs(s,q)|0,!f)y(rs(M))>y(0)&&y(js(M))>y(0)?f=M:f=0;else if(Tm(M)|0){Ge=0;break e}if(q=q+1|0,q>>>0>=Ws>>>0){Ge=f;break}}else Ge=0;while(0);Lt=Ge+500|0,Or=Ge+504|0,f=0,M=0,l=y(0),se=0;do{if(q=n[(n[wo>>2]|0)+(se<<2)>>2]|0,(n[q+36>>2]|0)==1)Bu(q),o[q+985>>0]=1,o[q+984>>0]=0;else{Bl(q),Q&&yp(q,mt(q,Ds)|0,Fe,Tn,br);do if((n[q+24>>2]|0)!=1)if((q|0)==(Ge|0)){n[Lt>>2]=n[2278],h[Or>>2]=y(0);break}else{Rm(s,q,br,d,Eo,br,Eo,m,Ds,O);break}else M|0&&(n[M+960>>2]=q),n[q+960>>2]=0,M=q,f=(f|0)==0?q:f;while(0);vs=y(h[q+504>>2]),l=y(l+y(vs+y(ln(q,Tr,br))))}se=se+1|0}while((se|0)!=(Ws|0));for(mo=l>Fe,Ql=bc&((or|0)==2&mo)?1:or,bn=(Fl|0)==1,ya=bn&(Q^1),Qp=(Ql|0)==1,Fp=(Ql|0)==2,xl=976+(Tr<<2)|0,Tp=(Fl|2|0)==2,Lp=bn&(bc^1),Fu=1040+(ur<<2)|0,Tu=1040+(Tr<<2)|0,Rp=976+(ur<<2)|0,Np=(Fl|0)!=1,mo=bc&((or|0)!=0&mo),go=s+976|0,bn=bn^1,l=Fe,Nr=0,yo=0,vs=y(0),kc=y(0);;){e:do if(Nr>>>0>>0)for(Or=n[wo>>2]|0,se=0,qe=y(0),Ue=y(0),et=y(0),Fe=y(0),q=0,M=0,Ge=Nr;;){if(Lt=n[Or+(Ge<<2)>>2]|0,(n[Lt+36>>2]|0)!=1&&(n[Lt+940>>2]=yo,(n[Lt+24>>2]|0)!=1)){if(Xe=y(ln(Lt,Tr,br)),Xr=n[xl>>2]|0,c=y(Gr(Lt+380+(Xr<<3)|0,Co)),at=y(h[Lt+504>>2]),c=y(Tg(c,at)),c=y(_n(y(Gr(Lt+364+(Xr<<3)|0,Co)),c)),bc&(se|0)!=0&y(Xe+y(Ue+c))>l){m=se,Xe=qe,or=Ge;break e}Xe=y(Xe+c),c=y(Ue+Xe),Xe=y(qe+Xe),Tm(Lt)|0&&(et=y(et+y(rs(Lt))),Fe=y(Fe-y(at*y(js(Lt))))),M|0&&(n[M+960>>2]=Lt),n[Lt+960>>2]=0,se=se+1|0,M=Lt,q=(q|0)==0?Lt:q}else Xe=qe,c=Ue;if(Ge=Ge+1|0,Ge>>>0>>0)qe=Xe,Ue=c;else{m=se,or=Ge;break}}else m=0,Xe=y(0),et=y(0),Fe=y(0),q=0,or=Nr;while(0);Xr=et>y(0)&ety(0)&FeNu&((_t(Nu)|0)^1))l=Nu,Xr=51;else if(o[(n[go>>2]|0)+3>>0]|0)Xr=51;else{if(Xt!=y(0)&&y(rs(s))!=y(0)){Xr=53;break}l=Xe,Xr=53}while(0);if((Xr|0)==51&&(Xr=0,_t(l)|0?Xr=53:(Pr=y(l-Xe),ir=l)),(Xr|0)==53&&(Xr=0,Xe>2]|0,Ge=Pry(0),Ue=y(Pr/Xt),et=y(0),Xe=y(0),l=y(0),M=q;do c=y(Gr(M+380+(se<<3)|0,Co)),Fe=y(Gr(M+364+(se<<3)|0,Co)),Fe=y(Tg(c,y(_n(Fe,y(h[M+504>>2]))))),Ge?(c=y(Fe*y(js(M))),c!=y(-0)&&(Jt=y(Fe-y(at*c)),nf=y(Bi(M,Tr,Jt,ir,br)),Jt!=nf)&&(et=y(et-y(nf-Fe)),l=y(l+c))):Lt&&(Lu=y(rs(M)),Lu!=y(0))&&(Jt=y(Fe+y(Ue*Lu)),sf=y(Bi(M,Tr,Jt,ir,br)),Jt!=sf)&&(et=y(et-y(sf-Fe)),Xe=y(Xe-Lu)),M=n[M+960>>2]|0;while((M|0)!=0);if(l=y(qe+l),Fe=y(Pr+et),rf)l=y(0);else{at=y(Xt+Xe),Ge=n[xl>>2]|0,Lt=Fey(0),at=y(Fe/at),l=y(0);do{Jt=y(Gr(q+380+(Ge<<3)|0,Co)),et=y(Gr(q+364+(Ge<<3)|0,Co)),et=y(Tg(Jt,y(_n(et,y(h[q+504>>2]))))),Lt?(Jt=y(et*y(js(q))),Fe=y(-Jt),Jt!=y(-0)?(Jt=y(Ue*Fe),Fe=y(Bi(q,Tr,y(et+(Or?Fe:Jt)),ir,br))):Fe=et):se&&(of=y(rs(q)),of!=y(0))?Fe=y(Bi(q,Tr,y(et+y(at*of)),ir,br)):Fe=et,l=y(l-y(Fe-et)),Xe=y(ln(q,Tr,br)),c=y(ln(q,ur,br)),Fe=y(Fe+Xe),h[za>>2]=Fe,n[kl>>2]=1,et=y(h[q+396>>2]);e:do if(_t(et)|0){M=_t(Tn)|0;do if(!M){if(mo|(ts(q,ur,Tn)|0|bn)||(ha(s,q)|0)!=4||(n[(vl(q,ur)|0)+4>>2]|0)==3||(n[(Pc(q,ur)|0)+4>>2]|0)==3)break;h[qs>>2]=Tn,n[Wo>>2]=1;break e}while(0);if(ts(q,ur,Tn)|0){M=n[q+992+(n[Rp>>2]<<2)>>2]|0,Jt=y(c+y(Gr(M,Tn))),h[qs>>2]=Jt,M=Np&(n[M+4>>2]|0)==2,n[Wo>>2]=((_t(Jt)|0|M)^1)&1;break}else{h[qs>>2]=Tn,n[Wo>>2]=M?0:2;break}}else Jt=y(Fe-Xe),Xt=y(Jt/et),Jt=y(et*Jt),n[Wo>>2]=1,h[qs>>2]=y(c+(Jn?Xt:Jt));while(0);yr(q,Tr,ir,br,kl,za),yr(q,ur,Tn,br,Wo,qs);do if(!(ts(q,ur,Tn)|0)&&(ha(s,q)|0)==4){if((n[(vl(q,ur)|0)+4>>2]|0)==3){M=0;break}M=(n[(Pc(q,ur)|0)+4>>2]|0)!=3}else M=0;while(0);Jt=y(h[za>>2]),Xt=y(h[qs>>2]),pf=n[kl>>2]|0,li=n[Wo>>2]|0,fa(q,Jn?Jt:Xt,Jn?Xt:Jt,Ds,Jn?pf:li,Jn?li:pf,br,Eo,Q&(M^1),3488,O)|0,o[bl>>0]=o[bl>>0]|o[q+508>>0],q=n[q+960>>2]|0}while((q|0)!=0)}}else l=y(0);if(l=y(Pr+l),li=l>0]=li|u[bl>>0],Fp&l>y(0)?(M=n[xl>>2]|0,(n[s+364+(M<<3)+4>>2]|0)!=0&&(Gs=y(Gr(s+364+(M<<3)|0,Co)),Gs>=y(0))?Fe=y(_n(y(0),y(Gs-y(ir-l)))):Fe=y(0)):Fe=l,Lt=Nr>>>0>>0,Lt){Ge=n[wo>>2]|0,se=Nr,M=0;do q=n[Ge+(se<<2)>>2]|0,n[q+24>>2]|0||(M=((n[(vl(q,Tr)|0)+4>>2]|0)==3&1)+M|0,M=M+((n[(Pc(q,Tr)|0)+4>>2]|0)==3&1)|0),se=se+1|0;while((se|0)!=(or|0));M?(Xe=y(0),c=y(0)):Xr=101}else Xr=101;e:do if((Xr|0)==101)switch(Xr=0,Mp|0){case 1:{M=0,Xe=y(Fe*y(.5)),c=y(0);break e}case 2:{M=0,Xe=Fe,c=y(0);break e}case 3:{if(m>>>0<=1){M=0,Xe=y(0),c=y(0);break e}c=y((m+-1|0)>>>0),M=0,Xe=y(0),c=y(y(_n(Fe,y(0)))/c);break e}case 5:{c=y(Fe/y((m+1|0)>>>0)),M=0,Xe=c;break e}case 4:{c=y(Fe/y(m>>>0)),M=0,Xe=y(c*y(.5));break e}default:{M=0,Xe=y(0),c=y(0);break e}}while(0);if(l=y(Op+Xe),Lt){et=y(Fe/y(M|0)),se=n[wo>>2]|0,q=Nr,Fe=y(0);do{M=n[se+(q<<2)>>2]|0;e:do if((n[M+36>>2]|0)!=1){switch(n[M+24>>2]|0){case 1:{if(gi(M,Tr)|0){if(!Q)break e;Jt=y(Mr(M,Tr,ir)),Jt=y(Jt+y(Cr(s,Tr))),Jt=y(Jt+y(V(M,Tr,br))),h[M+400+(n[Tu>>2]<<2)>>2]=Jt;break e}break}case 0:if(li=(n[(vl(M,Tr)|0)+4>>2]|0)==3,Jt=y(et+l),l=li?Jt:l,Q&&(li=M+400+(n[Tu>>2]<<2)|0,h[li>>2]=y(l+y(h[li>>2]))),li=(n[(Pc(M,Tr)|0)+4>>2]|0)==3,Jt=y(et+l),l=li?Jt:l,ya){Jt=y(c+y(ln(M,Tr,br))),Fe=Tn,l=y(l+y(Jt+y(h[M+504>>2])));break e}else{l=y(l+y(c+y(ns(M,Tr,br)))),Fe=y(_n(Fe,y(ns(M,ur,br))));break e}default:}Q&&(Jt=y(Xe+y(Cr(s,Tr))),li=M+400+(n[Tu>>2]<<2)|0,h[li>>2]=y(Jt+y(h[li>>2])))}while(0);q=q+1|0}while((q|0)!=(or|0))}else Fe=y(0);if(c=y(Up+l),Tp?Xe=y(y(Bi(s,ur,y(Ys+Fe),Tc,B))-Ys):Xe=Tn,et=y(y(Bi(s,ur,y(Ys+(Lp?Tn:Fe)),Tc,B))-Ys),Lt&Q){q=Nr;do{se=n[(n[wo>>2]|0)+(q<<2)>>2]|0;do if((n[se+36>>2]|0)!=1){if((n[se+24>>2]|0)==1){if(gi(se,ur)|0){if(Jt=y(Mr(se,ur,Tn)),Jt=y(Jt+y(Cr(s,ur))),Jt=y(Jt+y(V(se,ur,br))),M=n[Fu>>2]|0,h[se+400+(M<<2)>>2]=Jt,!(_t(Jt)|0))break}else M=n[Fu>>2]|0;Jt=y(Cr(s,ur)),h[se+400+(M<<2)>>2]=y(Jt+y(V(se,ur,br)));break}M=ha(s,se)|0;do if((M|0)==4){if((n[(vl(se,ur)|0)+4>>2]|0)==3){Xr=139;break}if((n[(Pc(se,ur)|0)+4>>2]|0)==3){Xr=139;break}if(ts(se,ur,Tn)|0){l=Oe;break}pf=n[se+908+(n[xl>>2]<<2)>>2]|0,n[qs>>2]=pf,l=y(h[se+396>>2]),li=_t(l)|0,Fe=(n[v>>2]=pf,y(h[v>>2])),li?l=et:(Pr=y(ln(se,ur,br)),Jt=y(Fe/l),l=y(l*Fe),l=y(Pr+(Jn?Jt:l))),h[za>>2]=l,h[qs>>2]=y(y(ln(se,Tr,br))+Fe),n[Wo>>2]=1,n[kl>>2]=1,yr(se,Tr,ir,br,Wo,qs),yr(se,ur,Tn,br,kl,za),l=y(h[qs>>2]),Pr=y(h[za>>2]),Jt=Jn?l:Pr,l=Jn?Pr:l,li=((_t(Jt)|0)^1)&1,fa(se,Jt,l,Ds,li,((_t(l)|0)^1)&1,br,Eo,1,3493,O)|0,l=Oe}else Xr=139;while(0);e:do if((Xr|0)==139){Xr=0,l=y(Xe-y(ns(se,ur,br)));do if((n[(vl(se,ur)|0)+4>>2]|0)==3){if((n[(Pc(se,ur)|0)+4>>2]|0)!=3)break;l=y(Oe+y(_n(y(0),y(l*y(.5)))));break e}while(0);if((n[(Pc(se,ur)|0)+4>>2]|0)==3){l=Oe;break}if((n[(vl(se,ur)|0)+4>>2]|0)==3){l=y(Oe+y(_n(y(0),l)));break}switch(M|0){case 1:{l=Oe;break e}case 2:{l=y(Oe+y(l*y(.5)));break e}default:{l=y(Oe+l);break e}}}while(0);Jt=y(vs+l),li=se+400+(n[Fu>>2]<<2)|0,h[li>>2]=y(Jt+y(h[li>>2]))}while(0);q=q+1|0}while((q|0)!=(or|0))}if(vs=y(vs+et),kc=y(_n(kc,c)),m=yo+1|0,or>>>0>=Ws>>>0)break;l=ir,Nr=or,yo=m}do if(Q){if(M=m>>>0>1,!M&&!(Yi(s)|0))break;if(!(_t(Tn)|0)){l=y(Tn-vs);e:do switch(n[s+12>>2]|0){case 3:{Oe=y(Oe+l),Ue=y(0);break}case 2:{Oe=y(Oe+y(l*y(.5))),Ue=y(0);break}case 4:{Tn>vs?Ue=y(l/y(m>>>0)):Ue=y(0);break}case 7:if(Tn>vs){Oe=y(Oe+y(l/y(m<<1>>>0))),Ue=y(l/y(m>>>0)),Ue=M?Ue:y(0);break e}else{Oe=y(Oe+y(l*y(.5))),Ue=y(0);break e}case 6:{Ue=y(l/y(yo>>>0)),Ue=Tn>vs&M?Ue:y(0);break}default:Ue=y(0)}while(0);if(m|0)for(Lt=1040+(ur<<2)|0,Or=976+(ur<<2)|0,Ge=0,q=0;;){e:do if(q>>>0>>0)for(Fe=y(0),et=y(0),l=y(0),se=q;;){M=n[(n[wo>>2]|0)+(se<<2)>>2]|0;do if((n[M+36>>2]|0)!=1&&(n[M+24>>2]|0)==0){if((n[M+940>>2]|0)!=(Ge|0))break e;if(Nm(M,ur)|0&&(Jt=y(h[M+908+(n[Or>>2]<<2)>>2]),l=y(_n(l,y(Jt+y(ln(M,ur,br)))))),(ha(s,M)|0)!=5)break;Gs=y(Ya(M)),Gs=y(Gs+y(V(M,0,br))),Jt=y(h[M+912>>2]),Jt=y(y(Jt+y(ln(M,0,br)))-Gs),Gs=y(_n(et,Gs)),Jt=y(_n(Fe,Jt)),Fe=Jt,et=Gs,l=y(_n(l,y(Gs+Jt)))}while(0);if(M=se+1|0,M>>>0>>0)se=M;else{se=M;break}}else et=y(0),l=y(0),se=q;while(0);if(at=y(Ue+l),c=Oe,Oe=y(Oe+at),q>>>0>>0){Xe=y(c+et),M=q;do{q=n[(n[wo>>2]|0)+(M<<2)>>2]|0;e:do if((n[q+36>>2]|0)!=1&&(n[q+24>>2]|0)==0)switch(ha(s,q)|0){case 1:{Jt=y(c+y(V(q,ur,br))),h[q+400+(n[Lt>>2]<<2)>>2]=Jt;break e}case 3:{Jt=y(y(Oe-y(re(q,ur,br)))-y(h[q+908+(n[Or>>2]<<2)>>2])),h[q+400+(n[Lt>>2]<<2)>>2]=Jt;break e}case 2:{Jt=y(c+y(y(at-y(h[q+908+(n[Or>>2]<<2)>>2]))*y(.5))),h[q+400+(n[Lt>>2]<<2)>>2]=Jt;break e}case 4:{if(Jt=y(c+y(V(q,ur,br))),h[q+400+(n[Lt>>2]<<2)>>2]=Jt,ts(q,ur,Tn)|0||(Jn?(Fe=y(h[q+908>>2]),l=y(Fe+y(ln(q,Tr,br))),et=at):(et=y(h[q+912>>2]),et=y(et+y(ln(q,ur,br))),l=at,Fe=y(h[q+908>>2])),Ii(l,Fe)|0&&Ii(et,y(h[q+912>>2]))|0))break e;fa(q,l,et,Ds,1,1,br,Eo,1,3501,O)|0;break e}case 5:{h[q+404>>2]=y(y(Xe-y(Ya(q)))+y(Mr(q,0,Tn)));break e}default:break e}while(0);M=M+1|0}while((M|0)!=(se|0))}if(Ge=Ge+1|0,(Ge|0)==(m|0))break;q=se}}}while(0);if(h[s+908>>2]=y(Bi(s,2,Qc,B,B)),h[s+912>>2]=y(Bi(s,0,af,k,B)),(Ql|0)!=0&&(lf=n[s+32>>2]|0,cf=(Ql|0)==2,!(cf&(lf|0)!=2))?cf&(lf|0)==2&&(l=y(Fc+ir),l=y(_n(y(Tg(l,y(MA(s,Tr,kc,Co)))),Fc)),Xr=198):(l=y(Bi(s,Tr,kc,Co,B)),Xr=198),(Xr|0)==198&&(h[s+908+(n[976+(Tr<<2)>>2]<<2)>>2]=l),(Fl|0)!=0&&(Af=n[s+32>>2]|0,ff=(Fl|0)==2,!(ff&(Af|0)!=2))?ff&(Af|0)==2&&(l=y(Ys+Tn),l=y(_n(y(Tg(l,y(MA(s,ur,y(Ys+vs),Tc)))),Ys)),Xr=204):(l=y(Bi(s,ur,y(Ys+vs),Tc,B)),Xr=204),(Xr|0)==204&&(h[s+908+(n[976+(ur<<2)>>2]<<2)>>2]=l),Q){if((n[uf>>2]|0)==2){q=976+(ur<<2)|0,se=1040+(ur<<2)|0,M=0;do Ge=gs(s,M)|0,n[Ge+24>>2]|0||(pf=n[q>>2]|0,Jt=y(h[s+908+(pf<<2)>>2]),li=Ge+400+(n[se>>2]<<2)|0,Jt=y(Jt-y(h[li>>2])),h[li>>2]=y(Jt-y(h[Ge+908+(pf<<2)>>2]))),M=M+1|0;while((M|0)!=(Ws|0))}if(f|0){M=Jn?Ql:d;do Lm(s,f,br,M,Eo,Ds,O),f=n[f+960>>2]|0;while((f|0)!=0)}if(M=(Tr|2|0)==3,q=(ur|2|0)==3,M|q){f=0;do se=n[(n[wo>>2]|0)+(f<<2)>>2]|0,(n[se+36>>2]|0)!=1&&(M&&Cp(s,se,Tr),q&&Cp(s,se,ur)),f=f+1|0;while((f|0)!=(Ws|0))}}}while(0);C=Tl}function pa(s,l){s=s|0,l=y(l);var c=0;oa(s,l>=y(0),3147),c=l==y(0),h[s+4>>2]=c?y(0):l}function vc(s,l,c,f){s=s|0,l=y(l),c=y(c),f=f|0;var d=Ze,m=Ze,B=0,k=0,Q=0;n[2278]=(n[2278]|0)+1,Bl(s),ts(s,2,l)|0?(d=y(Gr(n[s+992>>2]|0,l)),Q=1,d=y(d+y(ln(s,2,l)))):(d=y(Gr(s+380|0,l)),d>=y(0)?Q=2:(Q=((_t(l)|0)^1)&1,d=l)),ts(s,0,c)|0?(m=y(Gr(n[s+996>>2]|0,c)),k=1,m=y(m+y(ln(s,0,l)))):(m=y(Gr(s+388|0,c)),m>=y(0)?k=2:(k=((_t(c)|0)^1)&1,m=c)),B=s+976|0,fa(s,d,m,f,Q,k,l,c,1,3189,n[B>>2]|0)|0&&(yp(s,n[s+496>>2]|0,l,c,l),Dc(s,y(h[(n[B>>2]|0)+4>>2]),y(0),y(0)),o[11696]|0)&&km(s,7)}function Bl(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;k=C,C=C+32|0,B=k+24|0,m=k+16|0,f=k+8|0,d=k,c=0;do l=s+380+(c<<3)|0,(n[s+380+(c<<3)+4>>2]|0)!=0&&(Q=l,O=n[Q+4>>2]|0,M=f,n[M>>2]=n[Q>>2],n[M+4>>2]=O,M=s+364+(c<<3)|0,O=n[M+4>>2]|0,Q=d,n[Q>>2]=n[M>>2],n[Q+4>>2]=O,n[m>>2]=n[f>>2],n[m+4>>2]=n[f+4>>2],n[B>>2]=n[d>>2],n[B+4>>2]=n[d+4>>2],ws(m,B)|0)||(l=s+348+(c<<3)|0),n[s+992+(c<<2)>>2]=l,c=c+1|0;while((c|0)!=2);C=k}function ts(s,l,c){s=s|0,l=l|0,c=y(c);var f=0;switch(s=n[s+992+(n[976+(l<<2)>>2]<<2)>>2]|0,n[s+4>>2]|0){case 0:case 3:{s=0;break}case 1:{y(h[s>>2])>2])>2]|0){case 2:{l=y(y(y(h[s>>2])*l)/y(100));break}case 1:{l=y(h[s>>2]);break}default:l=y(Ae)}return y(l)}function yp(s,l,c,f,d){s=s|0,l=l|0,c=y(c),f=y(f),d=y(d);var m=0,B=Ze;l=n[s+944>>2]|0?l:1,m=fr(n[s+4>>2]|0,l)|0,l=Cw(m,l)|0,c=y(Mm(s,m,c)),f=y(Mm(s,l,f)),B=y(c+y(V(s,m,d))),h[s+400+(n[1040+(m<<2)>>2]<<2)>>2]=B,c=y(c+y(re(s,m,d))),h[s+400+(n[1e3+(m<<2)>>2]<<2)>>2]=c,c=y(f+y(V(s,l,d))),h[s+400+(n[1040+(l<<2)>>2]<<2)>>2]=c,d=y(f+y(re(s,l,d))),h[s+400+(n[1e3+(l<<2)>>2]<<2)>>2]=d}function Dc(s,l,c,f){s=s|0,l=y(l),c=y(c),f=y(f);var d=0,m=0,B=Ze,k=Ze,Q=0,O=0,M=Ze,q=0,se=Ze,Ge=Ze,Oe=Ze,Fe=Ze;if(l!=y(0)&&(d=s+400|0,Fe=y(h[d>>2]),m=s+404|0,Oe=y(h[m>>2]),q=s+416|0,Ge=y(h[q>>2]),O=s+420|0,B=y(h[O>>2]),se=y(Fe+c),M=y(Oe+f),f=y(se+Ge),k=y(M+B),Q=(n[s+988>>2]|0)==1,h[d>>2]=y(Go(Fe,l,0,Q)),h[m>>2]=y(Go(Oe,l,0,Q)),c=y(kT(y(Ge*l),y(1))),Ii(c,y(0))|0?m=0:m=(Ii(c,y(1))|0)^1,c=y(kT(y(B*l),y(1))),Ii(c,y(0))|0?d=0:d=(Ii(c,y(1))|0)^1,Fe=y(Go(f,l,Q&m,Q&(m^1))),h[q>>2]=y(Fe-y(Go(se,l,0,Q))),Fe=y(Go(k,l,Q&d,Q&(d^1))),h[O>>2]=y(Fe-y(Go(M,l,0,Q))),m=(n[s+952>>2]|0)-(n[s+948>>2]|0)>>2,m|0)){d=0;do Dc(gs(s,d)|0,l,se,M),d=d+1|0;while((d|0)!=(m|0))}}function Ew(s,l,c,f,d){switch(s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,c|0){case 5:case 0:{s=a7(n[489]|0,f,d)|0;break}default:s=t3e(f,d)|0}return s|0}function yg(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;d=C,C=C+16|0,m=d,n[m>>2]=f,Eg(s,0,l,c,m),C=d}function Eg(s,l,c,f,d){if(s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,s=s|0?s:956,x7[n[s+8>>2]&1](s,l,c,f,d)|0,(c|0)==5)Tt();else return}function Ga(s,l,c){s=s|0,l=l|0,c=c|0,o[s+l>>0]=c&1}function Fm(s,l){s=s|0,l=l|0;var c=0,f=0;n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,c=l+4|0,f=(n[c>>2]|0)-(n[l>>2]|0)>>2,f|0&&(Cg(s,f),Qt(s,n[l>>2]|0,n[c>>2]|0,f))}function Cg(s,l){s=s|0,l=l|0;var c=0;if((N(s)|0)>>>0>>0&&zr(s),l>>>0>1073741823)Tt();else{c=Vt(l<<2)|0,n[s+4>>2]=c,n[s>>2]=c,n[s+8>>2]=c+(l<<2);return}}function Qt(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,f=s+4|0,s=c-l|0,(s|0)>0&&(Dr(n[f>>2]|0,l|0,s|0)|0,n[f>>2]=(n[f>>2]|0)+(s>>>2<<2))}function N(s){return s=s|0,1073741823}function V(s,l,c){return s=s|0,l=l|0,c=y(c),he(l)|0&&(n[s+96>>2]|0)!=0?s=s+92|0:s=Fn(s+60|0,n[1040+(l<<2)>>2]|0,992)|0,y(ze(s,c))}function re(s,l,c){return s=s|0,l=l|0,c=y(c),he(l)|0&&(n[s+104>>2]|0)!=0?s=s+100|0:s=Fn(s+60|0,n[1e3+(l<<2)>>2]|0,992)|0,y(ze(s,c))}function he(s){return s=s|0,(s|1|0)==3|0}function ze(s,l){return s=s|0,l=y(l),(n[s+4>>2]|0)==3?l=y(0):l=y(Gr(s,l)),y(l)}function mt(s,l){return s=s|0,l=l|0,s=n[s>>2]|0,((s|0)==0?(l|0)>1?l:1:s)|0}function fr(s,l){s=s|0,l=l|0;var c=0;e:do if((l|0)==2){switch(s|0){case 2:{s=3;break e}case 3:break;default:{c=4;break e}}s=2}else c=4;while(0);return s|0}function Cr(s,l){s=s|0,l=l|0;var c=Ze;return he(l)|0&&(n[s+312>>2]|0)!=0&&(c=y(h[s+308>>2]),c>=y(0))||(c=y(_n(y(h[(Fn(s+276|0,n[1040+(l<<2)>>2]|0,992)|0)>>2]),y(0)))),y(c)}function yn(s,l){s=s|0,l=l|0;var c=Ze;return he(l)|0&&(n[s+320>>2]|0)!=0&&(c=y(h[s+316>>2]),c>=y(0))||(c=y(_n(y(h[(Fn(s+276|0,n[1e3+(l<<2)>>2]|0,992)|0)>>2]),y(0)))),y(c)}function oi(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return he(l)|0&&(n[s+240>>2]|0)!=0&&(f=y(Gr(s+236|0,c)),f>=y(0))||(f=y(_n(y(Gr(Fn(s+204|0,n[1040+(l<<2)>>2]|0,992)|0,c)),y(0)))),y(f)}function Mi(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return he(l)|0&&(n[s+248>>2]|0)!=0&&(f=y(Gr(s+244|0,c)),f>=y(0))||(f=y(_n(y(Gr(Fn(s+204|0,n[1e3+(l<<2)>>2]|0,992)|0,c)),y(0)))),y(f)}function wg(s,l,c,f,d,m,B){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=y(m),B=y(B);var k=Ze,Q=Ze,O=Ze,M=Ze,q=Ze,se=Ze,Ge=0,Oe=0,Fe=0;Fe=C,C=C+16|0,Ge=Fe,Oe=s+964|0,Un(s,(n[Oe>>2]|0)!=0,3519),k=y(En(s,2,l)),Q=y(En(s,0,l)),O=y(ln(s,2,l)),M=y(ln(s,0,l)),_t(l)|0?q=l:q=y(_n(y(0),y(y(l-O)-k))),_t(c)|0?se=c:se=y(_n(y(0),y(y(c-M)-Q))),(f|0)==1&(d|0)==1?(h[s+908>>2]=y(Bi(s,2,y(l-O),m,m)),l=y(Bi(s,0,y(c-M),B,m))):(b7[n[Oe>>2]&1](Ge,s,q,f,se,d),q=y(k+y(h[Ge>>2])),se=y(l-O),h[s+908>>2]=y(Bi(s,2,(f|2|0)==2?q:se,m,m)),se=y(Q+y(h[Ge+4>>2])),l=y(c-M),l=y(Bi(s,0,(d|2|0)==2?se:l,B,m))),h[s+912>>2]=l,C=Fe}function Gv(s,l,c,f,d,m,B){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=y(m),B=y(B);var k=Ze,Q=Ze,O=Ze,M=Ze;O=y(En(s,2,m)),k=y(En(s,0,m)),M=y(ln(s,2,m)),Q=y(ln(s,0,m)),l=y(l-M),h[s+908>>2]=y(Bi(s,2,(f|2|0)==2?O:l,m,m)),c=y(c-Q),h[s+912>>2]=y(Bi(s,0,(d|2|0)==2?k:c,B,m))}function Yv(s,l,c,f,d,m,B){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=y(m),B=y(B);var k=0,Q=Ze,O=Ze;return k=(f|0)==2,!(l<=y(0)&k)&&!(c<=y(0)&(d|0)==2)&&!((f|0)==1&(d|0)==1)?s=0:(Q=y(ln(s,0,m)),O=y(ln(s,2,m)),k=l>2]=y(Bi(s,2,k?y(0):l,m,m)),l=y(c-Q),k=c>2]=y(Bi(s,0,k?y(0):l,B,m)),s=1),s|0}function Cw(s,l){return s=s|0,l=l|0,OA(s)|0?s=fr(2,l)|0:s=0,s|0}function Ep(s,l,c){return s=s|0,l=l|0,c=y(c),c=y(oi(s,l,c)),y(c+y(Cr(s,l)))}function ww(s,l,c){return s=s|0,l=l|0,c=y(c),c=y(Mi(s,l,c)),y(c+y(yn(s,l)))}function En(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return f=y(Ep(s,l,c)),y(f+y(ww(s,l,c)))}function Tm(s){return s=s|0,n[s+24>>2]|0?s=0:y(rs(s))!=y(0)?s=1:s=y(js(s))!=y(0),s|0}function rs(s){s=s|0;var l=Ze;if(n[s+944>>2]|0){if(l=y(h[s+44>>2]),_t(l)|0)return l=y(h[s+40>>2]),s=l>y(0)&((_t(l)|0)^1),y(s?l:y(0))}else l=y(0);return y(l)}function js(s){s=s|0;var l=Ze,c=0,f=Ze;do if(n[s+944>>2]|0){if(l=y(h[s+48>>2]),_t(l)|0){if(c=o[(n[s+976>>2]|0)+2>>0]|0,c<<24>>24==0&&(f=y(h[s+40>>2]),f>24?y(1):y(0)}}else l=y(0);while(0);return y(l)}function Bu(s){s=s|0;var l=0,c=0;if(zm(s+400|0,0,540)|0,o[s+985>>0]=1,$(s),c=wi(s)|0,c|0){l=s+948|0,s=0;do Bu(n[(n[l>>2]|0)+(s<<2)>>2]|0),s=s+1|0;while((s|0)!=(c|0))}}function Rm(s,l,c,f,d,m,B,k,Q,O){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=y(m),B=y(B),k=k|0,Q=Q|0,O=O|0;var M=0,q=Ze,se=0,Ge=0,Oe=Ze,Fe=Ze,et=0,Xe=Ze,at=0,Ue=Ze,qe=0,Lt=0,Or=0,or=0,Xt=0,Pr=0,Nr=0,ir=0,bn=0,go=0;bn=C,C=C+16|0,Or=bn+12|0,or=bn+8|0,Xt=bn+4|0,Pr=bn,ir=fr(n[s+4>>2]|0,Q)|0,qe=he(ir)|0,q=y(Gr(Iw(l)|0,qe?m:B)),Lt=ts(l,2,m)|0,Nr=ts(l,0,B)|0;do if(!(_t(q)|0)&&!(_t(qe?c:d)|0)){if(M=l+504|0,!(_t(y(h[M>>2]))|0)&&(!(Bw(n[l+976>>2]|0,0)|0)||(n[l+500>>2]|0)==(n[2278]|0)))break;h[M>>2]=y(_n(q,y(En(l,ir,m))))}else se=7;while(0);do if((se|0)==7){if(at=qe^1,!(at|Lt^1)){B=y(Gr(n[l+992>>2]|0,m)),h[l+504>>2]=y(_n(B,y(En(l,2,m))));break}if(!(qe|Nr^1)){B=y(Gr(n[l+996>>2]|0,B)),h[l+504>>2]=y(_n(B,y(En(l,0,m))));break}h[Or>>2]=y(Ae),h[or>>2]=y(Ae),n[Xt>>2]=0,n[Pr>>2]=0,Xe=y(ln(l,2,m)),Ue=y(ln(l,0,m)),Lt?(Oe=y(Xe+y(Gr(n[l+992>>2]|0,m))),h[Or>>2]=Oe,n[Xt>>2]=1,Ge=1):(Ge=0,Oe=y(Ae)),Nr?(q=y(Ue+y(Gr(n[l+996>>2]|0,B))),h[or>>2]=q,n[Pr>>2]=1,M=1):(M=0,q=y(Ae)),se=n[s+32>>2]|0,qe&(se|0)==2?se=2:_t(Oe)|0&&!(_t(c)|0)&&(h[Or>>2]=c,n[Xt>>2]=2,Ge=2,Oe=c),!((se|0)==2&at)&&_t(q)|0&&!(_t(d)|0)&&(h[or>>2]=d,n[Pr>>2]=2,M=2,q=d),Fe=y(h[l+396>>2]),et=_t(Fe)|0;do if(et)se=Ge;else{if((Ge|0)==1&at){h[or>>2]=y(y(Oe-Xe)/Fe),n[Pr>>2]=1,M=1,se=1;break}qe&(M|0)==1?(h[Or>>2]=y(Fe*y(q-Ue)),n[Xt>>2]=1,M=1,se=1):se=Ge}while(0);go=_t(c)|0,Ge=(ha(s,l)|0)!=4,!(qe|Lt|((f|0)!=1|go)|(Ge|(se|0)==1))&&(h[Or>>2]=c,n[Xt>>2]=1,!et)&&(h[or>>2]=y(y(c-Xe)/Fe),n[Pr>>2]=1,M=1),!(Nr|at|((k|0)!=1|(_t(d)|0))|(Ge|(M|0)==1))&&(h[or>>2]=d,n[Pr>>2]=1,!et)&&(h[Or>>2]=y(Fe*y(d-Ue)),n[Xt>>2]=1),yr(l,2,m,m,Xt,Or),yr(l,0,B,m,Pr,or),c=y(h[Or>>2]),d=y(h[or>>2]),fa(l,c,d,Q,n[Xt>>2]|0,n[Pr>>2]|0,m,B,0,3565,O)|0,B=y(h[l+908+(n[976+(ir<<2)>>2]<<2)>>2]),h[l+504>>2]=y(_n(B,y(En(l,ir,m))))}while(0);n[l+500>>2]=n[2278],C=bn}function Bi(s,l,c,f,d){return s=s|0,l=l|0,c=y(c),f=y(f),d=y(d),f=y(MA(s,l,c,f)),y(_n(f,y(En(s,l,d))))}function ha(s,l){return s=s|0,l=l|0,l=l+20|0,l=n[((n[l>>2]|0)==0?s+16|0:l)>>2]|0,(l|0)==5&&OA(n[s+4>>2]|0)|0&&(l=1),l|0}function vl(s,l){return s=s|0,l=l|0,he(l)|0&&(n[s+96>>2]|0)!=0?l=4:l=n[1040+(l<<2)>>2]|0,s+60+(l<<3)|0}function Pc(s,l){return s=s|0,l=l|0,he(l)|0&&(n[s+104>>2]|0)!=0?l=5:l=n[1e3+(l<<2)>>2]|0,s+60+(l<<3)|0}function yr(s,l,c,f,d,m){switch(s=s|0,l=l|0,c=y(c),f=y(f),d=d|0,m=m|0,c=y(Gr(s+380+(n[976+(l<<2)>>2]<<3)|0,c)),c=y(c+y(ln(s,l,f))),n[d>>2]|0){case 2:case 1:{d=_t(c)|0,f=y(h[m>>2]),h[m>>2]=d|f>2]=2,h[m>>2]=c);break}default:}}function gi(s,l){return s=s|0,l=l|0,s=s+132|0,he(l)|0&&(n[(Fn(s,4,948)|0)+4>>2]|0)!=0?s=1:s=(n[(Fn(s,n[1040+(l<<2)>>2]|0,948)|0)+4>>2]|0)!=0,s|0}function Mr(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0;return s=s+132|0,he(l)|0&&(f=Fn(s,4,948)|0,(n[f+4>>2]|0)!=0)?d=4:(f=Fn(s,n[1040+(l<<2)>>2]|0,948)|0,n[f+4>>2]|0?d=4:c=y(0)),(d|0)==4&&(c=y(Gr(f,c))),y(c)}function ns(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return f=y(h[s+908+(n[976+(l<<2)>>2]<<2)>>2]),f=y(f+y(V(s,l,c))),y(f+y(re(s,l,c)))}function Yi(s){s=s|0;var l=0,c=0,f=0;e:do if(OA(n[s+4>>2]|0)|0)l=0;else if((n[s+16>>2]|0)!=5)if(c=wi(s)|0,!c)l=0;else for(l=0;;){if(f=gs(s,l)|0,(n[f+24>>2]|0)==0&&(n[f+20>>2]|0)==5){l=1;break e}if(l=l+1|0,l>>>0>=c>>>0){l=0;break}}else l=1;while(0);return l|0}function Nm(s,l){s=s|0,l=l|0;var c=Ze;return c=y(h[s+908+(n[976+(l<<2)>>2]<<2)>>2]),c>=y(0)&((_t(c)|0)^1)|0}function Ya(s){s=s|0;var l=Ze,c=0,f=0,d=0,m=0,B=0,k=0,Q=Ze;if(c=n[s+968>>2]|0,c)Q=y(h[s+908>>2]),l=y(h[s+912>>2]),l=y(v7[c&0](s,Q,l)),Un(s,(_t(l)|0)^1,3573);else{m=wi(s)|0;do if(m|0){for(c=0,d=0;;){if(f=gs(s,d)|0,n[f+940>>2]|0){B=8;break}if((n[f+24>>2]|0)!=1)if(k=(ha(s,f)|0)==5,k){c=f;break}else c=(c|0)==0?f:c;if(d=d+1|0,d>>>0>=m>>>0){B=8;break}}if((B|0)==8&&!c)break;return l=y(Ya(c)),y(l+y(h[c+404>>2]))}while(0);l=y(h[s+912>>2])}return y(l)}function MA(s,l,c,f){s=s|0,l=l|0,c=y(c),f=y(f);var d=Ze,m=0;return OA(l)|0?(l=1,m=3):he(l)|0?(l=0,m=3):(f=y(Ae),d=y(Ae)),(m|0)==3&&(d=y(Gr(s+364+(l<<3)|0,f)),f=y(Gr(s+380+(l<<3)|0,f))),m=f=y(0)&((_t(f)|0)^1)),c=m?f:c,m=d>=y(0)&((_t(d)|0)^1)&c>2]|0,m)|0,Oe=Cw(et,m)|0,Fe=he(et)|0,q=y(ln(l,2,c)),se=y(ln(l,0,c)),ts(l,2,c)|0?k=y(q+y(Gr(n[l+992>>2]|0,c))):gi(l,2)|0&&sr(l,2)|0?(k=y(h[s+908>>2]),Q=y(Cr(s,2)),Q=y(k-y(Q+y(yn(s,2)))),k=y(Mr(l,2,c)),k=y(Bi(l,2,y(Q-y(k+y(vu(l,2,c)))),c,c))):k=y(Ae),ts(l,0,d)|0?Q=y(se+y(Gr(n[l+996>>2]|0,d))):gi(l,0)|0&&sr(l,0)|0?(Q=y(h[s+912>>2]),at=y(Cr(s,0)),at=y(Q-y(at+y(yn(s,0)))),Q=y(Mr(l,0,d)),Q=y(Bi(l,0,y(at-y(Q+y(vu(l,0,d)))),d,c))):Q=y(Ae),O=_t(k)|0,M=_t(Q)|0;do if(O^M&&(Ge=y(h[l+396>>2]),!(_t(Ge)|0)))if(O){k=y(q+y(y(Q-se)*Ge));break}else{at=y(se+y(y(k-q)/Ge)),Q=M?at:Q;break}while(0);M=_t(k)|0,O=_t(Q)|0,M|O&&(Ue=(M^1)&1,f=c>y(0)&((f|0)!=0&M),k=Fe?k:f?c:k,fa(l,k,Q,m,Fe?Ue:f?2:Ue,M&(O^1)&1,k,Q,0,3623,B)|0,k=y(h[l+908>>2]),k=y(k+y(ln(l,2,c))),Q=y(h[l+912>>2]),Q=y(Q+y(ln(l,0,c)))),fa(l,k,Q,m,1,1,k,Q,1,3635,B)|0,sr(l,et)|0&&!(gi(l,et)|0)?(Ue=n[976+(et<<2)>>2]|0,at=y(h[s+908+(Ue<<2)>>2]),at=y(at-y(h[l+908+(Ue<<2)>>2])),at=y(at-y(yn(s,et))),at=y(at-y(re(l,et,c))),at=y(at-y(vu(l,et,Fe?c:d))),h[l+400+(n[1040+(et<<2)>>2]<<2)>>2]=at):Xe=21;do if((Xe|0)==21){if(!(gi(l,et)|0)&&(n[s+8>>2]|0)==1){Ue=n[976+(et<<2)>>2]|0,at=y(h[s+908+(Ue<<2)>>2]),at=y(y(at-y(h[l+908+(Ue<<2)>>2]))*y(.5)),h[l+400+(n[1040+(et<<2)>>2]<<2)>>2]=at;break}!(gi(l,et)|0)&&(n[s+8>>2]|0)==2&&(Ue=n[976+(et<<2)>>2]|0,at=y(h[s+908+(Ue<<2)>>2]),at=y(at-y(h[l+908+(Ue<<2)>>2])),h[l+400+(n[1040+(et<<2)>>2]<<2)>>2]=at)}while(0);sr(l,Oe)|0&&!(gi(l,Oe)|0)?(Ue=n[976+(Oe<<2)>>2]|0,at=y(h[s+908+(Ue<<2)>>2]),at=y(at-y(h[l+908+(Ue<<2)>>2])),at=y(at-y(yn(s,Oe))),at=y(at-y(re(l,Oe,c))),at=y(at-y(vu(l,Oe,Fe?d:c))),h[l+400+(n[1040+(Oe<<2)>>2]<<2)>>2]=at):Xe=30;do if((Xe|0)==30&&!(gi(l,Oe)|0)){if((ha(s,l)|0)==2){Ue=n[976+(Oe<<2)>>2]|0,at=y(h[s+908+(Ue<<2)>>2]),at=y(y(at-y(h[l+908+(Ue<<2)>>2]))*y(.5)),h[l+400+(n[1040+(Oe<<2)>>2]<<2)>>2]=at;break}Ue=(ha(s,l)|0)==3,Ue^(n[s+28>>2]|0)==2&&(Ue=n[976+(Oe<<2)>>2]|0,at=y(h[s+908+(Ue<<2)>>2]),at=y(at-y(h[l+908+(Ue<<2)>>2])),h[l+400+(n[1040+(Oe<<2)>>2]<<2)>>2]=at)}while(0)}function Cp(s,l,c){s=s|0,l=l|0,c=c|0;var f=Ze,d=0;d=n[976+(c<<2)>>2]|0,f=y(h[l+908+(d<<2)>>2]),f=y(y(h[s+908+(d<<2)>>2])-f),f=y(f-y(h[l+400+(n[1040+(c<<2)>>2]<<2)>>2])),h[l+400+(n[1e3+(c<<2)>>2]<<2)>>2]=f}function OA(s){return s=s|0,(s|1|0)==1|0}function Iw(s){s=s|0;var l=Ze;switch(n[s+56>>2]|0){case 0:case 3:{l=y(h[s+40>>2]),l>y(0)&((_t(l)|0)^1)?s=o[(n[s+976>>2]|0)+2>>0]|0?1056:992:s=1056;break}default:s=s+52|0}return s|0}function Bw(s,l){return s=s|0,l=l|0,(o[s+l>>0]|0)!=0|0}function sr(s,l){return s=s|0,l=l|0,s=s+132|0,he(l)|0&&(n[(Fn(s,5,948)|0)+4>>2]|0)!=0?s=1:s=(n[(Fn(s,n[1e3+(l<<2)>>2]|0,948)|0)+4>>2]|0)!=0,s|0}function vu(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0;return s=s+132|0,he(l)|0&&(f=Fn(s,5,948)|0,(n[f+4>>2]|0)!=0)?d=4:(f=Fn(s,n[1e3+(l<<2)>>2]|0,948)|0,n[f+4>>2]|0?d=4:c=y(0)),(d|0)==4&&(c=y(Gr(f,c))),y(c)}function Mm(s,l,c){return s=s|0,l=l|0,c=y(c),gi(s,l)|0?c=y(Mr(s,l,c)):c=y(-y(vu(s,l,c))),y(c)}function Du(s){return s=y(s),h[v>>2]=s,n[v>>2]|0|0}function wp(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>1073741823)Tt();else{d=Vt(l<<2)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<2)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<2)}function Ig(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function UA(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-4-l|0)>>>2)<<2)),s=n[s>>2]|0,s|0&>(s)}function _A(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;if(B=s+4|0,k=n[B>>2]|0,d=k-f|0,m=d>>2,s=l+(m<<2)|0,s>>>0>>0){f=k;do n[f>>2]=n[s>>2],s=s+4|0,f=(n[B>>2]|0)+4|0,n[B>>2]=f;while(s>>>0>>0)}m|0&&Mw(k+(0-m<<2)|0,l|0,d|0)|0}function Bg(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0;return k=l+4|0,Q=n[k>>2]|0,d=n[s>>2]|0,B=c,m=B-d|0,f=Q+(0-(m>>2)<<2)|0,n[k>>2]=f,(m|0)>0&&Dr(f|0,d|0,m|0)|0,d=s+4|0,m=l+8|0,f=(n[d>>2]|0)-B|0,(f|0)>0&&(Dr(n[m>>2]|0,c|0,f|0)|0,n[m>>2]=(n[m>>2]|0)+(f>>>2<<2)),B=n[s>>2]|0,n[s>>2]=n[k>>2],n[k>>2]=B,B=n[d>>2]|0,n[d>>2]=n[m>>2],n[m>>2]=B,B=s+8|0,c=l+12|0,s=n[B>>2]|0,n[B>>2]=n[c>>2],n[c>>2]=s,n[l>>2]=n[k>>2],Q|0}function vw(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;if(B=n[l>>2]|0,m=n[c>>2]|0,(B|0)!=(m|0)){d=s+8|0,c=((m+-4-B|0)>>>2)+1|0,s=B,f=n[d>>2]|0;do n[f>>2]=n[s>>2],f=(n[d>>2]|0)+4|0,n[d>>2]=f,s=s+4|0;while((s|0)!=(m|0));n[l>>2]=B+(c<<2)}}function Om(){dc()}function ga(){var s=0;return s=Vt(4)|0,HA(s),s|0}function HA(s){s=s|0,n[s>>2]=ys()|0}function Sc(s){s=s|0,s|0&&(vg(s),gt(s))}function vg(s){s=s|0,tt(n[s>>2]|0)}function Um(s,l,c){s=s|0,l=l|0,c=c|0,Ga(n[s>>2]|0,l,c)}function fo(s,l){s=s|0,l=y(l),pa(n[s>>2]|0,l)}function Wv(s,l){return s=s|0,l=l|0,Bw(n[s>>2]|0,l)|0}function Dw(){var s=0;return s=Vt(8)|0,Vv(s,0),s|0}function Vv(s,l){s=s|0,l=l|0,l?l=Ci(n[l>>2]|0)|0:l=co()|0,n[s>>2]=l,n[s+4>>2]=0,xi(l,s)}function pF(s){s=s|0;var l=0;return l=Vt(8)|0,Vv(l,s),l|0}function Kv(s){s=s|0,s|0&&(Pu(s),gt(s))}function Pu(s){s=s|0;var l=0;la(n[s>>2]|0),l=s+4|0,s=n[l>>2]|0,n[l>>2]=0,s|0&&(jA(s),gt(s))}function jA(s){s=s|0,qA(s)}function qA(s){s=s|0,s=n[s>>2]|0,s|0&&PA(s|0)}function Pw(s){return s=s|0,jo(s)|0}function _m(s){s=s|0;var l=0,c=0;c=s+4|0,l=n[c>>2]|0,n[c>>2]=0,l|0&&(jA(l),gt(l)),_s(n[s>>2]|0)}function hF(s,l){s=s|0,l=l|0,Zr(n[s>>2]|0,n[l>>2]|0)}function gF(s,l){s=s|0,l=l|0,ca(n[s>>2]|0,l)}function Jv(s,l,c){s=s|0,l=l|0,c=+c,yu(n[s>>2]|0,l,y(c))}function zv(s,l,c){s=s|0,l=l|0,c=+c,Es(n[s>>2]|0,l,y(c))}function Sw(s,l){s=s|0,l=l|0,gu(n[s>>2]|0,l)}function Su(s,l){s=s|0,l=l|0,du(n[s>>2]|0,l)}function dF(s,l){s=s|0,l=l|0,QA(n[s>>2]|0,l)}function mF(s,l){s=s|0,l=l|0,bA(n[s>>2]|0,l)}function Ip(s,l){s=s|0,l=l|0,yc(n[s>>2]|0,l)}function yF(s,l){s=s|0,l=l|0,up(n[s>>2]|0,l)}function Xv(s,l,c){s=s|0,l=l|0,c=+c,Cc(n[s>>2]|0,l,y(c))}function GA(s,l,c){s=s|0,l=l|0,c=+c,G(n[s>>2]|0,l,y(c))}function EF(s,l){s=s|0,l=l|0,wl(n[s>>2]|0,l)}function CF(s,l){s=s|0,l=l|0,og(n[s>>2]|0,l)}function Zv(s,l){s=s|0,l=l|0,Ap(n[s>>2]|0,l)}function xw(s,l){s=s|0,l=+l,FA(n[s>>2]|0,y(l))}function bw(s,l){s=s|0,l=+l,Ha(n[s>>2]|0,y(l))}function wF(s,l){s=s|0,l=+l,Gi(n[s>>2]|0,y(l))}function IF(s,l){s=s|0,l=+l,Hs(n[s>>2]|0,y(l))}function Dl(s,l){s=s|0,l=+l,mu(n[s>>2]|0,y(l))}function kw(s,l){s=s|0,l=+l,mw(n[s>>2]|0,y(l))}function BF(s,l){s=s|0,l=+l,TA(n[s>>2]|0,y(l))}function YA(s){s=s|0,fp(n[s>>2]|0)}function Hm(s,l){s=s|0,l=+l,Cs(n[s>>2]|0,y(l))}function xu(s,l){s=s|0,l=+l,cg(n[s>>2]|0,y(l))}function Qw(s){s=s|0,ug(n[s>>2]|0)}function Fw(s,l){s=s|0,l=+l,pp(n[s>>2]|0,y(l))}function vF(s,l){s=s|0,l=+l,Ic(n[s>>2]|0,y(l))}function $v(s,l){s=s|0,l=+l,Sm(n[s>>2]|0,y(l))}function WA(s,l){s=s|0,l=+l,fg(n[s>>2]|0,y(l))}function eD(s,l){s=s|0,l=+l,Cu(n[s>>2]|0,y(l))}function jm(s,l){s=s|0,l=+l,xm(n[s>>2]|0,y(l))}function tD(s,l){s=s|0,l=+l,wu(n[s>>2]|0,y(l))}function rD(s,l){s=s|0,l=+l,yw(n[s>>2]|0,y(l))}function qm(s,l){s=s|0,l=+l,Aa(n[s>>2]|0,y(l))}function nD(s,l,c){s=s|0,l=l|0,c=+c,Eu(n[s>>2]|0,l,y(c))}function DF(s,l,c){s=s|0,l=l|0,c=+c,bi(n[s>>2]|0,l,y(c))}function P(s,l,c){s=s|0,l=l|0,c=+c,wc(n[s>>2]|0,l,y(c))}function D(s){return s=s|0,sg(n[s>>2]|0)|0}function R(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,Ec(d,n[l>>2]|0,c),j(s,d),C=f}function j(s,l){s=s|0,l=l|0,Y(s,n[l+4>>2]|0,+y(h[l>>2]))}function Y(s,l,c){s=s|0,l=l|0,c=+c,n[s>>2]=l,E[s+8>>3]=c}function fe(s){return s=s|0,ig(n[s>>2]|0)|0}function ve(s){return s=s|0,uo(n[s>>2]|0)|0}function vt(s){return s=s|0,mc(n[s>>2]|0)|0}function wt(s){return s=s|0,kA(n[s>>2]|0)|0}function bt(s){return s=s|0,Pm(n[s>>2]|0)|0}function _r(s){return s=s|0,ng(n[s>>2]|0)|0}function is(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,Dt(d,n[l>>2]|0,c),j(s,d),C=f}function di(s){return s=s|0,$n(n[s>>2]|0)|0}function po(s){return s=s|0,ag(n[s>>2]|0)|0}function VA(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,ua(f,n[l>>2]|0),j(s,f),C=c}function Yo(s){return s=s|0,+ +y(qi(n[s>>2]|0))}function rt(s){return s=s|0,+ +y(es(n[s>>2]|0))}function Ke(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,Br(f,n[l>>2]|0),j(s,f),C=c}function At(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,Ag(f,n[l>>2]|0),j(s,f),C=c}function Wt(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,Ct(f,n[l>>2]|0),j(s,f),C=c}function vr(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,pg(f,n[l>>2]|0),j(s,f),C=c}function Sn(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,hg(f,n[l>>2]|0),j(s,f),C=c}function Fr(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,bm(f,n[l>>2]|0),j(s,f),C=c}function xn(s){return s=s|0,+ +y(Bc(n[s>>2]|0))}function ai(s,l){return s=s|0,l=l|0,+ +y(lg(n[s>>2]|0,l))}function en(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,ct(d,n[l>>2]|0,c),j(s,d),C=f}function ho(s,l,c){s=s|0,l=l|0,c=c|0,nr(n[s>>2]|0,n[l>>2]|0,c)}function PF(s,l){s=s|0,l=l|0,ms(n[s>>2]|0,n[l>>2]|0)}function sve(s){return s=s|0,wi(n[s>>2]|0)|0}function ove(s){return s=s|0,s=pt(n[s>>2]|0)|0,s?s=Pw(s)|0:s=0,s|0}function ave(s,l){return s=s|0,l=l|0,s=gs(n[s>>2]|0,l)|0,s?s=Pw(s)|0:s=0,s|0}function lve(s,l){s=s|0,l=l|0;var c=0,f=0;f=Vt(4)|0,$G(f,l),c=s+4|0,l=n[c>>2]|0,n[c>>2]=f,l|0&&(jA(l),gt(l)),It(n[s>>2]|0,1)}function $G(s,l){s=s|0,l=l|0,Cve(s,l)}function cve(s,l,c,f,d,m){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=m|0;var B=0,k=0;B=C,C=C+16|0,k=B,uve(k,jo(l)|0,+c,f,+d,m),h[s>>2]=y(+E[k>>3]),h[s+4>>2]=y(+E[k+8>>3]),C=B}function uve(s,l,c,f,d,m){s=s|0,l=l|0,c=+c,f=f|0,d=+d,m=m|0;var B=0,k=0,Q=0,O=0,M=0;B=C,C=C+32|0,M=B+8|0,O=B+20|0,Q=B,k=B+16|0,E[M>>3]=c,n[O>>2]=f,E[Q>>3]=d,n[k>>2]=m,Ave(s,n[l+4>>2]|0,M,O,Q,k),C=B}function Ave(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0;B=C,C=C+16|0,k=B,Va(k),l=da(l)|0,fve(s,l,+E[c>>3],n[f>>2]|0,+E[d>>3],n[m>>2]|0),Ka(k),C=B}function da(s){return s=s|0,n[s>>2]|0}function fve(s,l,c,f,d,m){s=s|0,l=l|0,c=+c,f=f|0,d=+d,m=m|0;var B=0;B=Pl(pve()|0)|0,c=+KA(c),f=SF(f)|0,d=+KA(d),hve(s,hi(0,B|0,l|0,+c,f|0,+d,SF(m)|0)|0)}function pve(){var s=0;return o[7608]|0||(yve(9120),s=7608,n[s>>2]=1,n[s+4>>2]=0),9120}function Pl(s){return s=s|0,n[s+8>>2]|0}function KA(s){return s=+s,+ +xF(s)}function SF(s){return s=s|0,t5(s)|0}function hve(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;d=C,C=C+32|0,c=d,f=l,f&1?(gve(c,0),ii(f|0,c|0)|0,dve(s,c),mve(c)):(n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=n[l+8>>2],n[s+12>>2]=n[l+12>>2]),C=d}function gve(s,l){s=s|0,l=l|0,e5(s,l),n[s+8>>2]=0,o[s+24>>0]=0}function dve(s,l){s=s|0,l=l|0,l=l+8|0,n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=n[l+8>>2],n[s+12>>2]=n[l+12>>2]}function mve(s){s=s|0,o[s+24>>0]=0}function e5(s,l){s=s|0,l=l|0,n[s>>2]=l}function t5(s){return s=s|0,s|0}function xF(s){return s=+s,+s}function yve(s){s=s|0,Sl(s,Eve()|0,4)}function Eve(){return 1064}function Sl(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c,n[s+8>>2]=cp(l|0,c+1|0)|0}function Cve(s,l){s=s|0,l=l|0,l=n[l>>2]|0,n[s>>2]=l,yl(l|0)}function wve(s){s=s|0;var l=0,c=0;c=s+4|0,l=n[c>>2]|0,n[c>>2]=0,l|0&&(jA(l),gt(l)),It(n[s>>2]|0,0)}function Ive(s){s=s|0,Rt(n[s>>2]|0)}function Bve(s){return s=s|0,er(n[s>>2]|0)|0}function vve(s,l,c,f){s=s|0,l=+l,c=+c,f=f|0,vc(n[s>>2]|0,y(l),y(c),f)}function Dve(s){return s=s|0,+ +y(Il(n[s>>2]|0))}function Pve(s){return s=s|0,+ +y(gg(n[s>>2]|0))}function Sve(s){return s=s|0,+ +y(Iu(n[s>>2]|0))}function xve(s){return s=s|0,+ +y(RA(n[s>>2]|0))}function bve(s){return s=s|0,+ +y(hp(n[s>>2]|0))}function kve(s){return s=s|0,+ +y(ja(n[s>>2]|0))}function Qve(s,l){s=s|0,l=l|0,E[s>>3]=+y(Il(n[l>>2]|0)),E[s+8>>3]=+y(gg(n[l>>2]|0)),E[s+16>>3]=+y(Iu(n[l>>2]|0)),E[s+24>>3]=+y(RA(n[l>>2]|0)),E[s+32>>3]=+y(hp(n[l>>2]|0)),E[s+40>>3]=+y(ja(n[l>>2]|0))}function Fve(s,l){return s=s|0,l=l|0,+ +y(dg(n[s>>2]|0,l))}function Tve(s,l){return s=s|0,l=l|0,+ +y(gp(n[s>>2]|0,l))}function Rve(s,l){return s=s|0,l=l|0,+ +y(qo(n[s>>2]|0,l))}function Nve(){return Pn()|0}function Lve(){Mve(),Ove(),Uve(),_ve(),Hve(),jve()}function Mve(){HNe(11713,4938,1)}function Ove(){oNe(10448)}function Uve(){HRe(10408)}function _ve(){uRe(10324)}function Hve(){yFe(10096)}function jve(){qve(9132)}function qve(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0,Ge=0,Oe=0,Fe=0,et=0,Xe=0,at=0,Ue=0,qe=0,Lt=0,Or=0,or=0,Xt=0,Pr=0,Nr=0,ir=0,bn=0,go=0,mo=0,yo=0,ya=0,Qp=0,Fp=0,xl=0,Tp=0,Fu=0,Tu=0,Rp=0,Np=0,Lp=0,Xr=0,bl=0,Mp=0,bc=0,Op=0,Up=0,Ru=0,Nu=0,kc=0,qs=0,za=0,Wo=0,kl=0,rf=0,nf=0,Lu=0,sf=0,of=0,Gs=0,vs=0,Ql=0,Tn=0,af=0,Eo=0,Qc=0,Co=0,Fc=0,lf=0,cf=0,Tc=0,Ys=0,Fl=0,uf=0,Af=0,ff=0,br=0,Jn=0,Ds=0,wo=0,Ws=0,Tr=0,ur=0,Tl=0;l=C,C=C+672|0,c=l+656|0,Tl=l+648|0,ur=l+640|0,Tr=l+632|0,Ws=l+624|0,wo=l+616|0,Ds=l+608|0,Jn=l+600|0,br=l+592|0,ff=l+584|0,Af=l+576|0,uf=l+568|0,Fl=l+560|0,Ys=l+552|0,Tc=l+544|0,cf=l+536|0,lf=l+528|0,Fc=l+520|0,Co=l+512|0,Qc=l+504|0,Eo=l+496|0,af=l+488|0,Tn=l+480|0,Ql=l+472|0,vs=l+464|0,Gs=l+456|0,of=l+448|0,sf=l+440|0,Lu=l+432|0,nf=l+424|0,rf=l+416|0,kl=l+408|0,Wo=l+400|0,za=l+392|0,qs=l+384|0,kc=l+376|0,Nu=l+368|0,Ru=l+360|0,Up=l+352|0,Op=l+344|0,bc=l+336|0,Mp=l+328|0,bl=l+320|0,Xr=l+312|0,Lp=l+304|0,Np=l+296|0,Rp=l+288|0,Tu=l+280|0,Fu=l+272|0,Tp=l+264|0,xl=l+256|0,Fp=l+248|0,Qp=l+240|0,ya=l+232|0,yo=l+224|0,mo=l+216|0,go=l+208|0,bn=l+200|0,ir=l+192|0,Nr=l+184|0,Pr=l+176|0,Xt=l+168|0,or=l+160|0,Or=l+152|0,Lt=l+144|0,qe=l+136|0,Ue=l+128|0,at=l+120|0,Xe=l+112|0,et=l+104|0,Fe=l+96|0,Oe=l+88|0,Ge=l+80|0,se=l+72|0,q=l+64|0,M=l+56|0,O=l+48|0,Q=l+40|0,k=l+32|0,B=l+24|0,m=l+16|0,d=l+8|0,f=l,Gve(s,3646),Yve(s,3651,2)|0,Wve(s,3665,2)|0,Vve(s,3682,18)|0,n[Tl>>2]=19,n[Tl+4>>2]=0,n[c>>2]=n[Tl>>2],n[c+4>>2]=n[Tl+4>>2],Tw(s,3690,c)|0,n[ur>>2]=1,n[ur+4>>2]=0,n[c>>2]=n[ur>>2],n[c+4>>2]=n[ur+4>>2],Kve(s,3696,c)|0,n[Tr>>2]=2,n[Tr+4>>2]=0,n[c>>2]=n[Tr>>2],n[c+4>>2]=n[Tr+4>>2],bu(s,3706,c)|0,n[Ws>>2]=1,n[Ws+4>>2]=0,n[c>>2]=n[Ws>>2],n[c+4>>2]=n[Ws+4>>2],Dg(s,3722,c)|0,n[wo>>2]=2,n[wo+4>>2]=0,n[c>>2]=n[wo>>2],n[c+4>>2]=n[wo+4>>2],Dg(s,3734,c)|0,n[Ds>>2]=3,n[Ds+4>>2]=0,n[c>>2]=n[Ds>>2],n[c+4>>2]=n[Ds+4>>2],bu(s,3753,c)|0,n[Jn>>2]=4,n[Jn+4>>2]=0,n[c>>2]=n[Jn>>2],n[c+4>>2]=n[Jn+4>>2],bu(s,3769,c)|0,n[br>>2]=5,n[br+4>>2]=0,n[c>>2]=n[br>>2],n[c+4>>2]=n[br+4>>2],bu(s,3783,c)|0,n[ff>>2]=6,n[ff+4>>2]=0,n[c>>2]=n[ff>>2],n[c+4>>2]=n[ff+4>>2],bu(s,3796,c)|0,n[Af>>2]=7,n[Af+4>>2]=0,n[c>>2]=n[Af>>2],n[c+4>>2]=n[Af+4>>2],bu(s,3813,c)|0,n[uf>>2]=8,n[uf+4>>2]=0,n[c>>2]=n[uf>>2],n[c+4>>2]=n[uf+4>>2],bu(s,3825,c)|0,n[Fl>>2]=3,n[Fl+4>>2]=0,n[c>>2]=n[Fl>>2],n[c+4>>2]=n[Fl+4>>2],Dg(s,3843,c)|0,n[Ys>>2]=4,n[Ys+4>>2]=0,n[c>>2]=n[Ys>>2],n[c+4>>2]=n[Ys+4>>2],Dg(s,3853,c)|0,n[Tc>>2]=9,n[Tc+4>>2]=0,n[c>>2]=n[Tc>>2],n[c+4>>2]=n[Tc+4>>2],bu(s,3870,c)|0,n[cf>>2]=10,n[cf+4>>2]=0,n[c>>2]=n[cf>>2],n[c+4>>2]=n[cf+4>>2],bu(s,3884,c)|0,n[lf>>2]=11,n[lf+4>>2]=0,n[c>>2]=n[lf>>2],n[c+4>>2]=n[lf+4>>2],bu(s,3896,c)|0,n[Fc>>2]=1,n[Fc+4>>2]=0,n[c>>2]=n[Fc>>2],n[c+4>>2]=n[Fc+4>>2],Is(s,3907,c)|0,n[Co>>2]=2,n[Co+4>>2]=0,n[c>>2]=n[Co>>2],n[c+4>>2]=n[Co+4>>2],Is(s,3915,c)|0,n[Qc>>2]=3,n[Qc+4>>2]=0,n[c>>2]=n[Qc>>2],n[c+4>>2]=n[Qc+4>>2],Is(s,3928,c)|0,n[Eo>>2]=4,n[Eo+4>>2]=0,n[c>>2]=n[Eo>>2],n[c+4>>2]=n[Eo+4>>2],Is(s,3948,c)|0,n[af>>2]=5,n[af+4>>2]=0,n[c>>2]=n[af>>2],n[c+4>>2]=n[af+4>>2],Is(s,3960,c)|0,n[Tn>>2]=6,n[Tn+4>>2]=0,n[c>>2]=n[Tn>>2],n[c+4>>2]=n[Tn+4>>2],Is(s,3974,c)|0,n[Ql>>2]=7,n[Ql+4>>2]=0,n[c>>2]=n[Ql>>2],n[c+4>>2]=n[Ql+4>>2],Is(s,3983,c)|0,n[vs>>2]=20,n[vs+4>>2]=0,n[c>>2]=n[vs>>2],n[c+4>>2]=n[vs+4>>2],Tw(s,3999,c)|0,n[Gs>>2]=8,n[Gs+4>>2]=0,n[c>>2]=n[Gs>>2],n[c+4>>2]=n[Gs+4>>2],Is(s,4012,c)|0,n[of>>2]=9,n[of+4>>2]=0,n[c>>2]=n[of>>2],n[c+4>>2]=n[of+4>>2],Is(s,4022,c)|0,n[sf>>2]=21,n[sf+4>>2]=0,n[c>>2]=n[sf>>2],n[c+4>>2]=n[sf+4>>2],Tw(s,4039,c)|0,n[Lu>>2]=10,n[Lu+4>>2]=0,n[c>>2]=n[Lu>>2],n[c+4>>2]=n[Lu+4>>2],Is(s,4053,c)|0,n[nf>>2]=11,n[nf+4>>2]=0,n[c>>2]=n[nf>>2],n[c+4>>2]=n[nf+4>>2],Is(s,4065,c)|0,n[rf>>2]=12,n[rf+4>>2]=0,n[c>>2]=n[rf>>2],n[c+4>>2]=n[rf+4>>2],Is(s,4084,c)|0,n[kl>>2]=13,n[kl+4>>2]=0,n[c>>2]=n[kl>>2],n[c+4>>2]=n[kl+4>>2],Is(s,4097,c)|0,n[Wo>>2]=14,n[Wo+4>>2]=0,n[c>>2]=n[Wo>>2],n[c+4>>2]=n[Wo+4>>2],Is(s,4117,c)|0,n[za>>2]=15,n[za+4>>2]=0,n[c>>2]=n[za>>2],n[c+4>>2]=n[za+4>>2],Is(s,4129,c)|0,n[qs>>2]=16,n[qs+4>>2]=0,n[c>>2]=n[qs>>2],n[c+4>>2]=n[qs+4>>2],Is(s,4148,c)|0,n[kc>>2]=17,n[kc+4>>2]=0,n[c>>2]=n[kc>>2],n[c+4>>2]=n[kc+4>>2],Is(s,4161,c)|0,n[Nu>>2]=18,n[Nu+4>>2]=0,n[c>>2]=n[Nu>>2],n[c+4>>2]=n[Nu+4>>2],Is(s,4181,c)|0,n[Ru>>2]=5,n[Ru+4>>2]=0,n[c>>2]=n[Ru>>2],n[c+4>>2]=n[Ru+4>>2],Dg(s,4196,c)|0,n[Up>>2]=6,n[Up+4>>2]=0,n[c>>2]=n[Up>>2],n[c+4>>2]=n[Up+4>>2],Dg(s,4206,c)|0,n[Op>>2]=7,n[Op+4>>2]=0,n[c>>2]=n[Op>>2],n[c+4>>2]=n[Op+4>>2],Dg(s,4217,c)|0,n[bc>>2]=3,n[bc+4>>2]=0,n[c>>2]=n[bc>>2],n[c+4>>2]=n[bc+4>>2],JA(s,4235,c)|0,n[Mp>>2]=1,n[Mp+4>>2]=0,n[c>>2]=n[Mp>>2],n[c+4>>2]=n[Mp+4>>2],bF(s,4251,c)|0,n[bl>>2]=4,n[bl+4>>2]=0,n[c>>2]=n[bl>>2],n[c+4>>2]=n[bl+4>>2],JA(s,4263,c)|0,n[Xr>>2]=5,n[Xr+4>>2]=0,n[c>>2]=n[Xr>>2],n[c+4>>2]=n[Xr+4>>2],JA(s,4279,c)|0,n[Lp>>2]=6,n[Lp+4>>2]=0,n[c>>2]=n[Lp>>2],n[c+4>>2]=n[Lp+4>>2],JA(s,4293,c)|0,n[Np>>2]=7,n[Np+4>>2]=0,n[c>>2]=n[Np>>2],n[c+4>>2]=n[Np+4>>2],JA(s,4306,c)|0,n[Rp>>2]=8,n[Rp+4>>2]=0,n[c>>2]=n[Rp>>2],n[c+4>>2]=n[Rp+4>>2],JA(s,4323,c)|0,n[Tu>>2]=9,n[Tu+4>>2]=0,n[c>>2]=n[Tu>>2],n[c+4>>2]=n[Tu+4>>2],JA(s,4335,c)|0,n[Fu>>2]=2,n[Fu+4>>2]=0,n[c>>2]=n[Fu>>2],n[c+4>>2]=n[Fu+4>>2],bF(s,4353,c)|0,n[Tp>>2]=12,n[Tp+4>>2]=0,n[c>>2]=n[Tp>>2],n[c+4>>2]=n[Tp+4>>2],Pg(s,4363,c)|0,n[xl>>2]=1,n[xl+4>>2]=0,n[c>>2]=n[xl>>2],n[c+4>>2]=n[xl+4>>2],zA(s,4376,c)|0,n[Fp>>2]=2,n[Fp+4>>2]=0,n[c>>2]=n[Fp>>2],n[c+4>>2]=n[Fp+4>>2],zA(s,4388,c)|0,n[Qp>>2]=13,n[Qp+4>>2]=0,n[c>>2]=n[Qp>>2],n[c+4>>2]=n[Qp+4>>2],Pg(s,4402,c)|0,n[ya>>2]=14,n[ya+4>>2]=0,n[c>>2]=n[ya>>2],n[c+4>>2]=n[ya+4>>2],Pg(s,4411,c)|0,n[yo>>2]=15,n[yo+4>>2]=0,n[c>>2]=n[yo>>2],n[c+4>>2]=n[yo+4>>2],Pg(s,4421,c)|0,n[mo>>2]=16,n[mo+4>>2]=0,n[c>>2]=n[mo>>2],n[c+4>>2]=n[mo+4>>2],Pg(s,4433,c)|0,n[go>>2]=17,n[go+4>>2]=0,n[c>>2]=n[go>>2],n[c+4>>2]=n[go+4>>2],Pg(s,4446,c)|0,n[bn>>2]=18,n[bn+4>>2]=0,n[c>>2]=n[bn>>2],n[c+4>>2]=n[bn+4>>2],Pg(s,4458,c)|0,n[ir>>2]=3,n[ir+4>>2]=0,n[c>>2]=n[ir>>2],n[c+4>>2]=n[ir+4>>2],zA(s,4471,c)|0,n[Nr>>2]=1,n[Nr+4>>2]=0,n[c>>2]=n[Nr>>2],n[c+4>>2]=n[Nr+4>>2],iD(s,4486,c)|0,n[Pr>>2]=10,n[Pr+4>>2]=0,n[c>>2]=n[Pr>>2],n[c+4>>2]=n[Pr+4>>2],JA(s,4496,c)|0,n[Xt>>2]=11,n[Xt+4>>2]=0,n[c>>2]=n[Xt>>2],n[c+4>>2]=n[Xt+4>>2],JA(s,4508,c)|0,n[or>>2]=3,n[or+4>>2]=0,n[c>>2]=n[or>>2],n[c+4>>2]=n[or+4>>2],bF(s,4519,c)|0,n[Or>>2]=4,n[Or+4>>2]=0,n[c>>2]=n[Or>>2],n[c+4>>2]=n[Or+4>>2],Jve(s,4530,c)|0,n[Lt>>2]=19,n[Lt+4>>2]=0,n[c>>2]=n[Lt>>2],n[c+4>>2]=n[Lt+4>>2],zve(s,4542,c)|0,n[qe>>2]=12,n[qe+4>>2]=0,n[c>>2]=n[qe>>2],n[c+4>>2]=n[qe+4>>2],Xve(s,4554,c)|0,n[Ue>>2]=13,n[Ue+4>>2]=0,n[c>>2]=n[Ue>>2],n[c+4>>2]=n[Ue+4>>2],Zve(s,4568,c)|0,n[at>>2]=2,n[at+4>>2]=0,n[c>>2]=n[at>>2],n[c+4>>2]=n[at+4>>2],$ve(s,4578,c)|0,n[Xe>>2]=20,n[Xe+4>>2]=0,n[c>>2]=n[Xe>>2],n[c+4>>2]=n[Xe+4>>2],eDe(s,4587,c)|0,n[et>>2]=22,n[et+4>>2]=0,n[c>>2]=n[et>>2],n[c+4>>2]=n[et+4>>2],Tw(s,4602,c)|0,n[Fe>>2]=23,n[Fe+4>>2]=0,n[c>>2]=n[Fe>>2],n[c+4>>2]=n[Fe+4>>2],Tw(s,4619,c)|0,n[Oe>>2]=14,n[Oe+4>>2]=0,n[c>>2]=n[Oe>>2],n[c+4>>2]=n[Oe+4>>2],tDe(s,4629,c)|0,n[Ge>>2]=1,n[Ge+4>>2]=0,n[c>>2]=n[Ge>>2],n[c+4>>2]=n[Ge+4>>2],rDe(s,4637,c)|0,n[se>>2]=4,n[se+4>>2]=0,n[c>>2]=n[se>>2],n[c+4>>2]=n[se+4>>2],zA(s,4653,c)|0,n[q>>2]=5,n[q+4>>2]=0,n[c>>2]=n[q>>2],n[c+4>>2]=n[q+4>>2],zA(s,4669,c)|0,n[M>>2]=6,n[M+4>>2]=0,n[c>>2]=n[M>>2],n[c+4>>2]=n[M+4>>2],zA(s,4686,c)|0,n[O>>2]=7,n[O+4>>2]=0,n[c>>2]=n[O>>2],n[c+4>>2]=n[O+4>>2],zA(s,4701,c)|0,n[Q>>2]=8,n[Q+4>>2]=0,n[c>>2]=n[Q>>2],n[c+4>>2]=n[Q+4>>2],zA(s,4719,c)|0,n[k>>2]=9,n[k+4>>2]=0,n[c>>2]=n[k>>2],n[c+4>>2]=n[k+4>>2],zA(s,4736,c)|0,n[B>>2]=21,n[B+4>>2]=0,n[c>>2]=n[B>>2],n[c+4>>2]=n[B+4>>2],nDe(s,4754,c)|0,n[m>>2]=2,n[m+4>>2]=0,n[c>>2]=n[m>>2],n[c+4>>2]=n[m+4>>2],iD(s,4772,c)|0,n[d>>2]=3,n[d+4>>2]=0,n[c>>2]=n[d>>2],n[c+4>>2]=n[d+4>>2],iD(s,4790,c)|0,n[f>>2]=4,n[f+4>>2]=0,n[c>>2]=n[f>>2],n[c+4>>2]=n[f+4>>2],iD(s,4808,c)|0,C=l}function Gve(s,l){s=s|0,l=l|0;var c=0;c=cFe()|0,n[s>>2]=c,uFe(c,l),xp(n[s>>2]|0)}function Yve(s,l,c){return s=s|0,l=l|0,c=c|0,JQe(s,pn(l)|0,c,0),s|0}function Wve(s,l,c){return s=s|0,l=l|0,c=c|0,TQe(s,pn(l)|0,c,0),s|0}function Vve(s,l,c){return s=s|0,l=l|0,c=c|0,EQe(s,pn(l)|0,c,0),s|0}function Tw(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],nQe(s,l,d),C=f,s|0}function Kve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Oke(s,l,d),C=f,s|0}function bu(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Ike(s,l,d),C=f,s|0}function Dg(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],oke(s,l,d),C=f,s|0}function Is(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Gbe(s,l,d),C=f,s|0}function JA(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],xbe(s,l,d),C=f,s|0}function bF(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],fbe(s,l,d),C=f,s|0}function Pg(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Oxe(s,l,d),C=f,s|0}function zA(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Ixe(s,l,d),C=f,s|0}function iD(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],oxe(s,l,d),C=f,s|0}function Jve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],GSe(s,l,d),C=f,s|0}function zve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],xSe(s,l,d),C=f,s|0}function Xve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],pSe(s,l,d),C=f,s|0}function Zve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ZPe(s,l,d),C=f,s|0}function $ve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],NPe(s,l,d),C=f,s|0}function eDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],yPe(s,l,d),C=f,s|0}function tDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],rPe(s,l,d),C=f,s|0}function rDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ODe(s,l,d),C=f,s|0}function nDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],iDe(s,l,d),C=f,s|0}function iDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],sDe(s,c,d,1),C=f}function pn(s){return s=s|0,s|0}function sDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=kF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=oDe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,aDe(m,f)|0,f),C=d}function kF(){var s=0,l=0;if(o[7616]|0||(i5(9136),tr(24,9136,U|0)|0,l=7616,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9136)|0)){s=9136,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));i5(9136)}return 9136}function oDe(s){return s=s|0,0}function aDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=kF()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],n5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(uDe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function hn(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,Q=0,O=0,M=0,q=0,se=0,Ge=0;B=C,C=C+32|0,se=B+24|0,q=B+20|0,Q=B+16|0,M=B+12|0,O=B+8|0,k=B+4|0,Ge=B,n[q>>2]=l,n[Q>>2]=c,n[M>>2]=f,n[O>>2]=d,n[k>>2]=m,m=s+28|0,n[Ge>>2]=n[m>>2],n[se>>2]=n[Ge>>2],lDe(s+24|0,se,q,M,O,Q,k)|0,n[m>>2]=n[n[m>>2]>>2],C=B}function lDe(s,l,c,f,d,m,B){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0,s=cDe(l)|0,l=Vt(24)|0,r5(l+4|0,n[c>>2]|0,n[f>>2]|0,n[d>>2]|0,n[m>>2]|0,n[B>>2]|0),n[l>>2]=n[s>>2],n[s>>2]=l,l|0}function cDe(s){return s=s|0,n[s>>2]|0}function r5(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,n[s>>2]=l,n[s+4>>2]=c,n[s+8>>2]=f,n[s+12>>2]=d,n[s+16>>2]=m}function gr(s,l){return s=s|0,l=l|0,l|s|0}function n5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function uDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=ADe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,fDe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],n5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,pDe(s,k),hDe(k),C=O;return}}function ADe(s){return s=s|0,357913941}function fDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function pDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function hDe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function i5(s){s=s|0,mDe(s)}function gDe(s){s=s|0,dDe(s+24|0)}function Rr(s){return s=s|0,n[s>>2]|0}function dDe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function mDe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,3,l,yDe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Vr(){return 9228}function yDe(){return 1140}function EDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=CDe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=wDe(l,f)|0,C=c,l|0}function Kr(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,n[s>>2]=l,n[s+4>>2]=c,n[s+8>>2]=f,n[s+12>>2]=d,n[s+16>>2]=m}function CDe(s){return s=s|0,(n[(kF()|0)+24>>2]|0)+(s*12|0)|0}function wDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;return d=C,C=C+48|0,f=d,c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),tf[c&31](f,s),f=IDe(f)|0,C=d,f|0}function IDe(s){s=s|0;var l=0,c=0,f=0,d=0;return d=C,C=C+32|0,l=d+12|0,c=d,f=QF(s5()|0)|0,f?(FF(l,f),TF(c,l),BDe(s,c),s=RF(l)|0):s=vDe(s)|0,C=d,s|0}function s5(){var s=0;return o[7632]|0||(RDe(9184),tr(25,9184,U|0)|0,s=7632,n[s>>2]=1,n[s+4>>2]=0),9184}function QF(s){return s=s|0,n[s+36>>2]|0}function FF(s,l){s=s|0,l=l|0,n[s>>2]=l,n[s+4>>2]=s,n[s+8>>2]=0}function TF(s,l){s=s|0,l=l|0,n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=0}function BDe(s,l){s=s|0,l=l|0,xDe(l,s,s+8|0,s+16|0,s+24|0,s+32|0,s+40|0)|0}function RF(s){return s=s|0,n[(n[s+4>>2]|0)+8>>2]|0}function vDe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,Q=0;Q=C,C=C+16|0,c=Q+4|0,f=Q,d=Wa(8)|0,m=d,B=Vt(48)|0,k=B,l=k+48|0;do n[k>>2]=n[s>>2],k=k+4|0,s=s+4|0;while((k|0)<(l|0));return l=m+4|0,n[l>>2]=B,k=Vt(8)|0,B=n[l>>2]|0,n[f>>2]=0,n[c>>2]=n[f>>2],o5(k,B,c),n[d>>2]=k,C=Q,m|0}function o5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Vt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1092,n[c+12>>2]=l,n[s+4>>2]=c}function DDe(s){s=s|0,Jm(s),gt(s)}function PDe(s){s=s|0,s=n[s+12>>2]|0,s|0&>(s)}function SDe(s){s=s|0,gt(s)}function xDe(s,l,c,f,d,m,B){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0,m=bDe(n[s>>2]|0,l,c,f,d,m,B)|0,B=s+4|0,n[(n[B>>2]|0)+8>>2]=m,n[(n[B>>2]|0)+8>>2]|0}function bDe(s,l,c,f,d,m,B){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0;var k=0,Q=0;return k=C,C=C+16|0,Q=k,Va(Q),s=da(s)|0,B=kDe(s,+E[l>>3],+E[c>>3],+E[f>>3],+E[d>>3],+E[m>>3],+E[B>>3])|0,Ka(Q),C=k,B|0}function kDe(s,l,c,f,d,m,B){s=s|0,l=+l,c=+c,f=+f,d=+d,m=+m,B=+B;var k=0;return k=Pl(QDe()|0)|0,l=+KA(l),c=+KA(c),f=+KA(f),d=+KA(d),m=+KA(m),Os(0,k|0,s|0,+l,+c,+f,+d,+m,+ +KA(B))|0}function QDe(){var s=0;return o[7624]|0||(FDe(9172),s=7624,n[s>>2]=1,n[s+4>>2]=0),9172}function FDe(s){s=s|0,Sl(s,TDe()|0,6)}function TDe(){return 1112}function RDe(s){s=s|0,Bp(s)}function NDe(s){s=s|0,a5(s+24|0),l5(s+16|0)}function a5(s){s=s|0,MDe(s)}function l5(s){s=s|0,LDe(s)}function LDe(s){s=s|0;var l=0,c=0;if(l=n[s>>2]|0,l|0)do c=l,l=n[l>>2]|0,gt(c);while((l|0)!=0);n[s>>2]=0}function MDe(s){s=s|0;var l=0,c=0;if(l=n[s>>2]|0,l|0)do c=l,l=n[l>>2]|0,gt(c);while((l|0)!=0);n[s>>2]=0}function Bp(s){s=s|0;var l=0;n[s+16>>2]=0,n[s+20>>2]=0,l=s+24|0,n[l>>2]=0,n[s+28>>2]=l,n[s+36>>2]=0,o[s+40>>0]=0,o[s+41>>0]=0}function ODe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],UDe(s,c,d,0),C=f}function UDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=NF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=_De(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,HDe(m,f)|0,f),C=d}function NF(){var s=0,l=0;if(o[7640]|0||(u5(9232),tr(26,9232,U|0)|0,l=7640,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9232)|0)){s=9232,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));u5(9232)}return 9232}function _De(s){return s=s|0,0}function HDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=NF()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],c5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(jDe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function c5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function jDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=qDe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,GDe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],c5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,YDe(s,k),WDe(k),C=O;return}}function qDe(s){return s=s|0,357913941}function GDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function YDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function WDe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function u5(s){s=s|0,JDe(s)}function VDe(s){s=s|0,KDe(s+24|0)}function KDe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function JDe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,1,l,zDe()|0,3),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function zDe(){return 1144}function XDe(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0;var m=0,B=0,k=0,Q=0;m=C,C=C+16|0,B=m+8|0,k=m,Q=ZDe(s)|0,s=n[Q+4>>2]|0,n[k>>2]=n[Q>>2],n[k+4>>2]=s,n[B>>2]=n[k>>2],n[B+4>>2]=n[k+4>>2],$De(l,B,c,f,d),C=m}function ZDe(s){return s=s|0,(n[(NF()|0)+24>>2]|0)+(s*12|0)|0}function $De(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0;var m=0,B=0,k=0,Q=0,O=0;O=C,C=C+16|0,B=O+2|0,k=O+1|0,Q=O,m=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(m=n[(n[s>>2]|0)+m>>2]|0),ku(B,c),c=+Qu(B,c),ku(k,f),f=+Qu(k,f),XA(Q,d),Q=ZA(Q,d)|0,D7[m&1](s,c,f,Q),C=O}function ku(s,l){s=s|0,l=+l}function Qu(s,l){return s=s|0,l=+l,+ +tPe(l)}function XA(s,l){s=s|0,l=l|0}function ZA(s,l){return s=s|0,l=l|0,ePe(l)|0}function ePe(s){return s=s|0,s|0}function tPe(s){return s=+s,+s}function rPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],nPe(s,c,d,1),C=f}function nPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=LF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=iPe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,sPe(m,f)|0,f),C=d}function LF(){var s=0,l=0;if(o[7648]|0||(f5(9268),tr(27,9268,U|0)|0,l=7648,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9268)|0)){s=9268,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));f5(9268)}return 9268}function iPe(s){return s=s|0,0}function sPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=LF()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],A5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(oPe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function A5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function oPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=aPe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,lPe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],A5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,cPe(s,k),uPe(k),C=O;return}}function aPe(s){return s=s|0,357913941}function lPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function cPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function uPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function f5(s){s=s|0,pPe(s)}function APe(s){s=s|0,fPe(s+24|0)}function fPe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function pPe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,4,l,hPe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function hPe(){return 1160}function gPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=dPe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=mPe(l,f)|0,C=c,l|0}function dPe(s){return s=s|0,(n[(LF()|0)+24>>2]|0)+(s*12|0)|0}function mPe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),p5(Ng[c&31](s)|0)|0}function p5(s){return s=s|0,s&1|0}function yPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],EPe(s,c,d,0),C=f}function EPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=MF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=CPe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,wPe(m,f)|0,f),C=d}function MF(){var s=0,l=0;if(o[7656]|0||(g5(9304),tr(28,9304,U|0)|0,l=7656,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9304)|0)){s=9304,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));g5(9304)}return 9304}function CPe(s){return s=s|0,0}function wPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=MF()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],h5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(IPe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function h5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function IPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=BPe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,vPe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],h5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,DPe(s,k),PPe(k),C=O;return}}function BPe(s){return s=s|0,357913941}function vPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function DPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function PPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function g5(s){s=s|0,bPe(s)}function SPe(s){s=s|0,xPe(s+24|0)}function xPe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function bPe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,5,l,kPe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function kPe(){return 1164}function QPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=FPe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],TPe(l,d,c),C=f}function FPe(s){return s=s|0,(n[(MF()|0)+24>>2]|0)+(s*12|0)|0}function TPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),vp(d,c),c=Dp(d,c)|0,tf[f&31](s,c),Pp(d),C=m}function vp(s,l){s=s|0,l=l|0,RPe(s,l)}function Dp(s,l){return s=s|0,l=l|0,s|0}function Pp(s){s=s|0,jA(s)}function RPe(s,l){s=s|0,l=l|0,OF(s,l)}function OF(s,l){s=s|0,l=l|0,n[s>>2]=l}function NPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],LPe(s,c,d,0),C=f}function LPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=UF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=MPe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,OPe(m,f)|0,f),C=d}function UF(){var s=0,l=0;if(o[7664]|0||(m5(9340),tr(29,9340,U|0)|0,l=7664,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9340)|0)){s=9340,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));m5(9340)}return 9340}function MPe(s){return s=s|0,0}function OPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=UF()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],d5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(UPe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function d5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function UPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=_Pe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,HPe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],d5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,jPe(s,k),qPe(k),C=O;return}}function _Pe(s){return s=s|0,357913941}function HPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function jPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function qPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function m5(s){s=s|0,WPe(s)}function GPe(s){s=s|0,YPe(s+24|0)}function YPe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function WPe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,4,l,VPe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function VPe(){return 1180}function KPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=JPe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=zPe(l,d,c)|0,C=f,c|0}function JPe(s){return s=s|0,(n[(UF()|0)+24>>2]|0)+(s*12|0)|0}function zPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;return m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),Sg(d,c),d=xg(d,c)|0,d=sD(NT[f&15](s,d)|0)|0,C=m,d|0}function Sg(s,l){s=s|0,l=l|0}function xg(s,l){return s=s|0,l=l|0,XPe(l)|0}function sD(s){return s=s|0,s|0}function XPe(s){return s=s|0,s|0}function ZPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],$Pe(s,c,d,0),C=f}function $Pe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=_F()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=eSe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,tSe(m,f)|0,f),C=d}function _F(){var s=0,l=0;if(o[7672]|0||(E5(9376),tr(30,9376,U|0)|0,l=7672,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9376)|0)){s=9376,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));E5(9376)}return 9376}function eSe(s){return s=s|0,0}function tSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=_F()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],y5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(rSe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function y5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function rSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=nSe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,iSe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],y5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,sSe(s,k),oSe(k),C=O;return}}function nSe(s){return s=s|0,357913941}function iSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function sSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function oSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function E5(s){s=s|0,cSe(s)}function aSe(s){s=s|0,lSe(s+24|0)}function lSe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function cSe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,5,l,C5()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function C5(){return 1196}function uSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=ASe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=fSe(l,f)|0,C=c,l|0}function ASe(s){return s=s|0,(n[(_F()|0)+24>>2]|0)+(s*12|0)|0}function fSe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),sD(Ng[c&31](s)|0)|0}function pSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],hSe(s,c,d,1),C=f}function hSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=HF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=gSe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,dSe(m,f)|0,f),C=d}function HF(){var s=0,l=0;if(o[7680]|0||(I5(9412),tr(31,9412,U|0)|0,l=7680,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9412)|0)){s=9412,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));I5(9412)}return 9412}function gSe(s){return s=s|0,0}function dSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=HF()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],w5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(mSe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function w5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function mSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=ySe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,ESe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],w5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,CSe(s,k),wSe(k),C=O;return}}function ySe(s){return s=s|0,357913941}function ESe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function CSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function wSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function I5(s){s=s|0,vSe(s)}function ISe(s){s=s|0,BSe(s+24|0)}function BSe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function vSe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,6,l,B5()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function B5(){return 1200}function DSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=PSe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=SSe(l,f)|0,C=c,l|0}function PSe(s){return s=s|0,(n[(HF()|0)+24>>2]|0)+(s*12|0)|0}function SSe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),oD(Ng[c&31](s)|0)|0}function oD(s){return s=s|0,s|0}function xSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],bSe(s,c,d,0),C=f}function bSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=jF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=kSe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,QSe(m,f)|0,f),C=d}function jF(){var s=0,l=0;if(o[7688]|0||(D5(9448),tr(32,9448,U|0)|0,l=7688,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9448)|0)){s=9448,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));D5(9448)}return 9448}function kSe(s){return s=s|0,0}function QSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=jF()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],v5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(FSe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function v5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function FSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=TSe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,RSe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],v5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,NSe(s,k),LSe(k),C=O;return}}function TSe(s){return s=s|0,357913941}function RSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function NSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function LSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function D5(s){s=s|0,USe(s)}function MSe(s){s=s|0,OSe(s+24|0)}function OSe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function USe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,6,l,P5()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function P5(){return 1204}function _Se(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=HSe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],jSe(l,d,c),C=f}function HSe(s){return s=s|0,(n[(jF()|0)+24>>2]|0)+(s*12|0)|0}function jSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),qF(d,c),d=GF(d,c)|0,tf[f&31](s,d),C=m}function qF(s,l){s=s|0,l=l|0}function GF(s,l){return s=s|0,l=l|0,qSe(l)|0}function qSe(s){return s=s|0,s|0}function GSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],YSe(s,c,d,0),C=f}function YSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=YF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=WSe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,VSe(m,f)|0,f),C=d}function YF(){var s=0,l=0;if(o[7696]|0||(x5(9484),tr(33,9484,U|0)|0,l=7696,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9484)|0)){s=9484,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));x5(9484)}return 9484}function WSe(s){return s=s|0,0}function VSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=YF()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],S5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(KSe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function S5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function KSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=JSe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,zSe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],S5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,XSe(s,k),ZSe(k),C=O;return}}function JSe(s){return s=s|0,357913941}function zSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function XSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function ZSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function x5(s){s=s|0,txe(s)}function $Se(s){s=s|0,exe(s+24|0)}function exe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function txe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,1,l,rxe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function rxe(){return 1212}function nxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+8|0,B=d,k=ixe(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],sxe(l,m,c,f),C=d}function ixe(s){return s=s|0,(n[(YF()|0)+24>>2]|0)+(s*12|0)|0}function sxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;k=C,C=C+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(d=n[(n[s>>2]|0)+d>>2]|0),qF(m,c),m=GF(m,c)|0,Sg(B,f),B=xg(B,f)|0,_w[d&15](s,m,B),C=k}function oxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],axe(s,c,d,1),C=f}function axe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=WF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=lxe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,cxe(m,f)|0,f),C=d}function WF(){var s=0,l=0;if(o[7704]|0||(k5(9520),tr(34,9520,U|0)|0,l=7704,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9520)|0)){s=9520,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));k5(9520)}return 9520}function lxe(s){return s=s|0,0}function cxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=WF()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],b5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(uxe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function b5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function uxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Axe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,fxe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],b5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,pxe(s,k),hxe(k),C=O;return}}function Axe(s){return s=s|0,357913941}function fxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function pxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function hxe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function k5(s){s=s|0,mxe(s)}function gxe(s){s=s|0,dxe(s+24|0)}function dxe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function mxe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,1,l,yxe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function yxe(){return 1224}function Exe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;return d=C,C=C+16|0,m=d+8|0,B=d,k=Cxe(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],f=+wxe(l,m,c),C=d,+f}function Cxe(s){return s=s|0,(n[(WF()|0)+24>>2]|0)+(s*12|0)|0}function wxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),XA(d,c),d=ZA(d,c)|0,B=+xF(+S7[f&7](s,d)),C=m,+B}function Ixe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Bxe(s,c,d,1),C=f}function Bxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=VF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=vxe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,Dxe(m,f)|0,f),C=d}function VF(){var s=0,l=0;if(o[7712]|0||(F5(9556),tr(35,9556,U|0)|0,l=7712,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9556)|0)){s=9556,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));F5(9556)}return 9556}function vxe(s){return s=s|0,0}function Dxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=VF()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Q5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(Pxe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function Q5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function Pxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Sxe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,xxe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],Q5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,bxe(s,k),kxe(k),C=O;return}}function Sxe(s){return s=s|0,357913941}function xxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function bxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function kxe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function F5(s){s=s|0,Txe(s)}function Qxe(s){s=s|0,Fxe(s+24|0)}function Fxe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function Txe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,5,l,Rxe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Rxe(){return 1232}function Nxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=Lxe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=+Mxe(l,d),C=f,+c}function Lxe(s){return s=s|0,(n[(VF()|0)+24>>2]|0)+(s*12|0)|0}function Mxe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),+ +xF(+P7[c&15](s))}function Oxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Uxe(s,c,d,1),C=f}function Uxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=KF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=_xe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,Hxe(m,f)|0,f),C=d}function KF(){var s=0,l=0;if(o[7720]|0||(R5(9592),tr(36,9592,U|0)|0,l=7720,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9592)|0)){s=9592,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));R5(9592)}return 9592}function _xe(s){return s=s|0,0}function Hxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=KF()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],T5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(jxe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function T5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function jxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=qxe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,Gxe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],T5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,Yxe(s,k),Wxe(k),C=O;return}}function qxe(s){return s=s|0,357913941}function Gxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Yxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Wxe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function R5(s){s=s|0,Jxe(s)}function Vxe(s){s=s|0,Kxe(s+24|0)}function Kxe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function Jxe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,7,l,zxe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function zxe(){return 1276}function Xxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=Zxe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=$xe(l,f)|0,C=c,l|0}function Zxe(s){return s=s|0,(n[(KF()|0)+24>>2]|0)+(s*12|0)|0}function $xe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;return d=C,C=C+16|0,f=d,c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),tf[c&31](f,s),f=N5(f)|0,C=d,f|0}function N5(s){s=s|0;var l=0,c=0,f=0,d=0;return d=C,C=C+32|0,l=d+12|0,c=d,f=QF(L5()|0)|0,f?(FF(l,f),TF(c,l),ebe(s,c),s=RF(l)|0):s=tbe(s)|0,C=d,s|0}function L5(){var s=0;return o[7736]|0||(Abe(9640),tr(25,9640,U|0)|0,s=7736,n[s>>2]=1,n[s+4>>2]=0),9640}function ebe(s,l){s=s|0,l=l|0,sbe(l,s,s+8|0)|0}function tbe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;return c=C,C=C+16|0,d=c+4|0,B=c,f=Wa(8)|0,l=f,k=Vt(16)|0,n[k>>2]=n[s>>2],n[k+4>>2]=n[s+4>>2],n[k+8>>2]=n[s+8>>2],n[k+12>>2]=n[s+12>>2],m=l+4|0,n[m>>2]=k,s=Vt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],JF(s,m,d),n[f>>2]=s,C=c,l|0}function JF(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Vt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1244,n[c+12>>2]=l,n[s+4>>2]=c}function rbe(s){s=s|0,Jm(s),gt(s)}function nbe(s){s=s|0,s=n[s+12>>2]|0,s|0&>(s)}function ibe(s){s=s|0,gt(s)}function sbe(s,l,c){return s=s|0,l=l|0,c=c|0,l=obe(n[s>>2]|0,l,c)|0,c=s+4|0,n[(n[c>>2]|0)+8>>2]=l,n[(n[c>>2]|0)+8>>2]|0}function obe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;return f=C,C=C+16|0,d=f,Va(d),s=da(s)|0,c=abe(s,n[l>>2]|0,+E[c>>3])|0,Ka(d),C=f,c|0}function abe(s,l,c){s=s|0,l=l|0,c=+c;var f=0;return f=Pl(lbe()|0)|0,l=SF(l)|0,ml(0,f|0,s|0,l|0,+ +KA(c))|0}function lbe(){var s=0;return o[7728]|0||(cbe(9628),s=7728,n[s>>2]=1,n[s+4>>2]=0),9628}function cbe(s){s=s|0,Sl(s,ube()|0,2)}function ube(){return 1264}function Abe(s){s=s|0,Bp(s)}function fbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],pbe(s,c,d,1),C=f}function pbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=zF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=hbe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,gbe(m,f)|0,f),C=d}function zF(){var s=0,l=0;if(o[7744]|0||(O5(9684),tr(37,9684,U|0)|0,l=7744,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9684)|0)){s=9684,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));O5(9684)}return 9684}function hbe(s){return s=s|0,0}function gbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=zF()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],M5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(dbe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function M5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function dbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=mbe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,ybe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],M5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,Ebe(s,k),Cbe(k),C=O;return}}function mbe(s){return s=s|0,357913941}function ybe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Ebe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Cbe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function O5(s){s=s|0,Bbe(s)}function wbe(s){s=s|0,Ibe(s+24|0)}function Ibe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function Bbe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,5,l,vbe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function vbe(){return 1280}function Dbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=Pbe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=Sbe(l,d,c)|0,C=f,c|0}function Pbe(s){return s=s|0,(n[(zF()|0)+24>>2]|0)+(s*12|0)|0}function Sbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return B=C,C=C+32|0,d=B,m=B+16|0,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),XA(m,c),m=ZA(m,c)|0,_w[f&15](d,s,m),m=N5(d)|0,C=B,m|0}function xbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],bbe(s,c,d,1),C=f}function bbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=XF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=kbe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,Qbe(m,f)|0,f),C=d}function XF(){var s=0,l=0;if(o[7752]|0||(_5(9720),tr(38,9720,U|0)|0,l=7752,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9720)|0)){s=9720,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));_5(9720)}return 9720}function kbe(s){return s=s|0,0}function Qbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=XF()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],U5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(Fbe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function U5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function Fbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Tbe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,Rbe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],U5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,Nbe(s,k),Lbe(k),C=O;return}}function Tbe(s){return s=s|0,357913941}function Rbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Nbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Lbe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function _5(s){s=s|0,Ube(s)}function Mbe(s){s=s|0,Obe(s+24|0)}function Obe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function Ube(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,8,l,_be()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function _be(){return 1288}function Hbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=jbe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=qbe(l,f)|0,C=c,l|0}function jbe(s){return s=s|0,(n[(XF()|0)+24>>2]|0)+(s*12|0)|0}function qbe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),t5(Ng[c&31](s)|0)|0}function Gbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Ybe(s,c,d,0),C=f}function Ybe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=ZF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=Wbe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,Vbe(m,f)|0,f),C=d}function ZF(){var s=0,l=0;if(o[7760]|0||(j5(9756),tr(39,9756,U|0)|0,l=7760,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9756)|0)){s=9756,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));j5(9756)}return 9756}function Wbe(s){return s=s|0,0}function Vbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=ZF()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],H5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(Kbe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function H5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function Kbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Jbe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,zbe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],H5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,Xbe(s,k),Zbe(k),C=O;return}}function Jbe(s){return s=s|0,357913941}function zbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Xbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Zbe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function j5(s){s=s|0,tke(s)}function $be(s){s=s|0,eke(s+24|0)}function eke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function tke(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,8,l,rke()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function rke(){return 1292}function nke(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=ike(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ske(l,d,c),C=f}function ike(s){return s=s|0,(n[(ZF()|0)+24>>2]|0)+(s*12|0)|0}function ske(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),ku(d,c),c=+Qu(d,c),B7[f&31](s,c),C=m}function oke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ake(s,c,d,0),C=f}function ake(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=$F()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=lke(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,cke(m,f)|0,f),C=d}function $F(){var s=0,l=0;if(o[7768]|0||(G5(9792),tr(40,9792,U|0)|0,l=7768,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9792)|0)){s=9792,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));G5(9792)}return 9792}function lke(s){return s=s|0,0}function cke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=$F()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],q5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(uke(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function q5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function uke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Ake(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,fke(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],q5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,pke(s,k),hke(k),C=O;return}}function Ake(s){return s=s|0,357913941}function fke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function pke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function hke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function G5(s){s=s|0,mke(s)}function gke(s){s=s|0,dke(s+24|0)}function dke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function mke(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,1,l,yke()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function yke(){return 1300}function Eke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+8|0,B=d,k=Cke(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],wke(l,m,c,f),C=d}function Cke(s){return s=s|0,(n[($F()|0)+24>>2]|0)+(s*12|0)|0}function wke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f;var d=0,m=0,B=0,k=0;k=C,C=C+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(d=n[(n[s>>2]|0)+d>>2]|0),XA(m,c),m=ZA(m,c)|0,ku(B,f),f=+Qu(B,f),Q7[d&15](s,m,f),C=k}function Ike(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Bke(s,c,d,0),C=f}function Bke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=eT()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=vke(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,Dke(m,f)|0,f),C=d}function eT(){var s=0,l=0;if(o[7776]|0||(W5(9828),tr(41,9828,U|0)|0,l=7776,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9828)|0)){s=9828,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));W5(9828)}return 9828}function vke(s){return s=s|0,0}function Dke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=eT()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Y5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(Pke(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function Y5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function Pke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Ske(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,xke(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],Y5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,bke(s,k),kke(k),C=O;return}}function Ske(s){return s=s|0,357913941}function xke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function bke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function kke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function W5(s){s=s|0,Tke(s)}function Qke(s){s=s|0,Fke(s+24|0)}function Fke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function Tke(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,7,l,Rke()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Rke(){return 1312}function Nke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=Lke(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Mke(l,d,c),C=f}function Lke(s){return s=s|0,(n[(eT()|0)+24>>2]|0)+(s*12|0)|0}function Mke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),XA(d,c),d=ZA(d,c)|0,tf[f&31](s,d),C=m}function Oke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Uke(s,c,d,0),C=f}function Uke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=tT()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=_ke(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,Hke(m,f)|0,f),C=d}function tT(){var s=0,l=0;if(o[7784]|0||(K5(9864),tr(42,9864,U|0)|0,l=7784,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9864)|0)){s=9864,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));K5(9864)}return 9864}function _ke(s){return s=s|0,0}function Hke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=tT()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],V5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(jke(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function V5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function jke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=qke(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,Gke(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],V5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,Yke(s,k),Wke(k),C=O;return}}function qke(s){return s=s|0,357913941}function Gke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Yke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Wke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function K5(s){s=s|0,Jke(s)}function Vke(s){s=s|0,Kke(s+24|0)}function Kke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function Jke(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,8,l,zke()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function zke(){return 1320}function Xke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=Zke(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],$ke(l,d,c),C=f}function Zke(s){return s=s|0,(n[(tT()|0)+24>>2]|0)+(s*12|0)|0}function $ke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),eQe(d,c),d=tQe(d,c)|0,tf[f&31](s,d),C=m}function eQe(s,l){s=s|0,l=l|0}function tQe(s,l){return s=s|0,l=l|0,rQe(l)|0}function rQe(s){return s=s|0,s|0}function nQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],iQe(s,c,d,0),C=f}function iQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=rT()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=sQe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,oQe(m,f)|0,f),C=d}function rT(){var s=0,l=0;if(o[7792]|0||(z5(9900),tr(43,9900,U|0)|0,l=7792,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9900)|0)){s=9900,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));z5(9900)}return 9900}function sQe(s){return s=s|0,0}function oQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=rT()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],J5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(aQe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function J5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function aQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=lQe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,cQe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],J5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,uQe(s,k),AQe(k),C=O;return}}function lQe(s){return s=s|0,357913941}function cQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function uQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function AQe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function z5(s){s=s|0,hQe(s)}function fQe(s){s=s|0,pQe(s+24|0)}function pQe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function hQe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,22,l,gQe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function gQe(){return 1344}function dQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;c=C,C=C+16|0,f=c+8|0,d=c,m=mQe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],yQe(l,f),C=c}function mQe(s){return s=s|0,(n[(rT()|0)+24>>2]|0)+(s*12|0)|0}function yQe(s,l){s=s|0,l=l|0;var c=0;c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),ef[c&127](s)}function EQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=nT()|0,s=CQe(c)|0,hn(m,l,d,s,wQe(c,f)|0,f)}function nT(){var s=0,l=0;if(o[7800]|0||(Z5(9936),tr(44,9936,U|0)|0,l=7800,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9936)|0)){s=9936,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));Z5(9936)}return 9936}function CQe(s){return s=s|0,s|0}function wQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=nT()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(X5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(IQe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function X5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function IQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=BQe(s)|0,f>>>0>>0)zr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,vQe(d,M>>3>>>0>>1>>>0?O>>>0>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,X5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,DQe(s,d),PQe(d),C=k;return}}function BQe(s){return s=s|0,536870911}function vQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Vt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function DQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function PQe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function Z5(s){s=s|0,bQe(s)}function SQe(s){s=s|0,xQe(s+24|0)}function xQe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function bQe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,1,23,l,P5()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function kQe(s,l){s=s|0,l=l|0,FQe(n[(QQe(s)|0)>>2]|0,l)}function QQe(s){return s=s|0,(n[(nT()|0)+24>>2]|0)+(s<<3)|0}function FQe(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,qF(f,l),l=GF(f,l)|0,ef[s&127](l),C=c}function TQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=iT()|0,s=RQe(c)|0,hn(m,l,d,s,NQe(c,f)|0,f)}function iT(){var s=0,l=0;if(o[7808]|0||(e9(9972),tr(45,9972,U|0)|0,l=7808,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9972)|0)){s=9972,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));e9(9972)}return 9972}function RQe(s){return s=s|0,s|0}function NQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=iT()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?($5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(LQe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function $5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function LQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=MQe(s)|0,f>>>0>>0)zr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,OQe(d,M>>3>>>0>>1>>>0?O>>>0>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,$5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,UQe(s,d),_Qe(d),C=k;return}}function MQe(s){return s=s|0,536870911}function OQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Vt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function UQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function _Qe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function e9(s){s=s|0,qQe(s)}function HQe(s){s=s|0,jQe(s+24|0)}function jQe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function qQe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,1,9,l,GQe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function GQe(){return 1348}function YQe(s,l){return s=s|0,l=l|0,VQe(n[(WQe(s)|0)>>2]|0,l)|0}function WQe(s){return s=s|0,(n[(iT()|0)+24>>2]|0)+(s<<3)|0}function VQe(s,l){s=s|0,l=l|0;var c=0,f=0;return c=C,C=C+16|0,f=c,t9(f,l),l=r9(f,l)|0,l=sD(Ng[s&31](l)|0)|0,C=c,l|0}function t9(s,l){s=s|0,l=l|0}function r9(s,l){return s=s|0,l=l|0,KQe(l)|0}function KQe(s){return s=s|0,s|0}function JQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=sT()|0,s=zQe(c)|0,hn(m,l,d,s,XQe(c,f)|0,f)}function sT(){var s=0,l=0;if(o[7816]|0||(i9(10008),tr(46,10008,U|0)|0,l=7816,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10008)|0)){s=10008,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));i9(10008)}return 10008}function zQe(s){return s=s|0,s|0}function XQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=sT()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(n9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(ZQe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function n9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function ZQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=$Qe(s)|0,f>>>0>>0)zr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,eFe(d,M>>3>>>0>>1>>>0?O>>>0>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,n9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,tFe(s,d),rFe(d),C=k;return}}function $Qe(s){return s=s|0,536870911}function eFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Vt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function tFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function rFe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function i9(s){s=s|0,sFe(s)}function nFe(s){s=s|0,iFe(s+24|0)}function iFe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function sFe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,1,15,l,C5()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function oFe(s){return s=s|0,lFe(n[(aFe(s)|0)>>2]|0)|0}function aFe(s){return s=s|0,(n[(sT()|0)+24>>2]|0)+(s<<3)|0}function lFe(s){return s=s|0,sD(CD[s&7]()|0)|0}function cFe(){var s=0;return o[7832]|0||(mFe(10052),tr(25,10052,U|0)|0,s=7832,n[s>>2]=1,n[s+4>>2]=0),10052}function uFe(s,l){s=s|0,l=l|0,n[s>>2]=AFe()|0,n[s+4>>2]=fFe()|0,n[s+12>>2]=l,n[s+8>>2]=pFe()|0,n[s+32>>2]=2}function AFe(){return 11709}function fFe(){return 1188}function pFe(){return aD()|0}function hFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Sp(f,896)|0)==512?c|0&&(gFe(c),gt(c)):l|0&&(Pu(l),gt(l))}function Sp(s,l){return s=s|0,l=l|0,l&s|0}function gFe(s){s=s|0,s=n[s+4>>2]|0,s|0&&bp(s)}function aD(){var s=0;return o[7824]|0||(n[2511]=dFe()|0,n[2512]=0,s=7824,n[s>>2]=1,n[s+4>>2]=0),10044}function dFe(){return 0}function mFe(s){s=s|0,Bp(s)}function yFe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0;l=C,C=C+32|0,c=l+24|0,m=l+16|0,d=l+8|0,f=l,EFe(s,4827),CFe(s,4834,3)|0,wFe(s,3682,47)|0,n[m>>2]=9,n[m+4>>2]=0,n[c>>2]=n[m>>2],n[c+4>>2]=n[m+4>>2],IFe(s,4841,c)|0,n[d>>2]=1,n[d+4>>2]=0,n[c>>2]=n[d>>2],n[c+4>>2]=n[d+4>>2],BFe(s,4871,c)|0,n[f>>2]=10,n[f+4>>2]=0,n[c>>2]=n[f>>2],n[c+4>>2]=n[f+4>>2],vFe(s,4891,c)|0,C=l}function EFe(s,l){s=s|0,l=l|0;var c=0;c=rRe()|0,n[s>>2]=c,nRe(c,l),xp(n[s>>2]|0)}function CFe(s,l,c){return s=s|0,l=l|0,c=c|0,_Te(s,pn(l)|0,c,0),s|0}function wFe(s,l,c){return s=s|0,l=l|0,c=c|0,DTe(s,pn(l)|0,c,0),s|0}function IFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],oTe(s,l,d),C=f,s|0}function BFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],HFe(s,l,d),C=f,s|0}function vFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],DFe(s,l,d),C=f,s|0}function DFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],PFe(s,c,d,1),C=f}function PFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=oT()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=SFe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,xFe(m,f)|0,f),C=d}function oT(){var s=0,l=0;if(o[7840]|0||(o9(10100),tr(48,10100,U|0)|0,l=7840,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10100)|0)){s=10100,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));o9(10100)}return 10100}function SFe(s){return s=s|0,0}function xFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=oT()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],s9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(bFe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function s9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function bFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=kFe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,QFe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],s9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,FFe(s,k),TFe(k),C=O;return}}function kFe(s){return s=s|0,357913941}function QFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function FFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function TFe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function o9(s){s=s|0,LFe(s)}function RFe(s){s=s|0,NFe(s+24|0)}function NFe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function LFe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,6,l,MFe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function MFe(){return 1364}function OFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=UFe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=_Fe(l,d,c)|0,C=f,c|0}function UFe(s){return s=s|0,(n[(oT()|0)+24>>2]|0)+(s*12|0)|0}function _Fe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;return m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),XA(d,c),d=ZA(d,c)|0,d=p5(NT[f&15](s,d)|0)|0,C=m,d|0}function HFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],jFe(s,c,d,0),C=f}function jFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=aT()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=qFe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,GFe(m,f)|0,f),C=d}function aT(){var s=0,l=0;if(o[7848]|0||(l9(10136),tr(49,10136,U|0)|0,l=7848,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10136)|0)){s=10136,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));l9(10136)}return 10136}function qFe(s){return s=s|0,0}function GFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=aT()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],a9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(YFe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function a9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function YFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=WFe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,VFe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],a9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,KFe(s,k),JFe(k),C=O;return}}function WFe(s){return s=s|0,357913941}function VFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function KFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function JFe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function l9(s){s=s|0,ZFe(s)}function zFe(s){s=s|0,XFe(s+24|0)}function XFe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function ZFe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,9,l,$Fe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function $Fe(){return 1372}function eTe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=tTe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],rTe(l,d,c),C=f}function tTe(s){return s=s|0,(n[(aT()|0)+24>>2]|0)+(s*12|0)|0}function rTe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=Ze;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),nTe(d,c),B=y(iTe(d,c)),I7[f&1](s,B),C=m}function nTe(s,l){s=s|0,l=+l}function iTe(s,l){return s=s|0,l=+l,y(sTe(l))}function sTe(s){return s=+s,y(s)}function oTe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],aTe(s,c,d,0),C=f}function aTe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=lT()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=lTe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,cTe(m,f)|0,f),C=d}function lT(){var s=0,l=0;if(o[7856]|0||(u9(10172),tr(50,10172,U|0)|0,l=7856,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10172)|0)){s=10172,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));u9(10172)}return 10172}function lTe(s){return s=s|0,0}function cTe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,q=lT()|0,O=q+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=q+28|0,c=n[l>>2]|0,c>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],c9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(uTe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function c9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function uTe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=ATe(s)|0,m>>>0>>0)zr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,q=se<<1,fTe(k,se>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],c9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,pTe(s,k),hTe(k),C=O;return}}function ATe(s){return s=s|0,357913941}function fTe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Vt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function pTe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function hTe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function u9(s){s=s|0,mTe(s)}function gTe(s){s=s|0,dTe(s+24|0)}function dTe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function mTe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,2,3,l,yTe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function yTe(){return 1380}function ETe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+8|0,B=d,k=CTe(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],wTe(l,m,c,f),C=d}function CTe(s){return s=s|0,(n[(lT()|0)+24>>2]|0)+(s*12|0)|0}function wTe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;k=C,C=C+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(d=n[(n[s>>2]|0)+d>>2]|0),XA(m,c),m=ZA(m,c)|0,ITe(B,f),B=BTe(B,f)|0,_w[d&15](s,m,B),C=k}function ITe(s,l){s=s|0,l=l|0}function BTe(s,l){return s=s|0,l=l|0,vTe(l)|0}function vTe(s){return s=s|0,(s|0)!=0|0}function DTe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=cT()|0,s=PTe(c)|0,hn(m,l,d,s,STe(c,f)|0,f)}function cT(){var s=0,l=0;if(o[7864]|0||(f9(10208),tr(51,10208,U|0)|0,l=7864,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10208)|0)){s=10208,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));f9(10208)}return 10208}function PTe(s){return s=s|0,s|0}function STe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=cT()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(A9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(xTe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function A9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function xTe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=bTe(s)|0,f>>>0>>0)zr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,kTe(d,M>>3>>>0>>1>>>0?O>>>0>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,A9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,QTe(s,d),FTe(d),C=k;return}}function bTe(s){return s=s|0,536870911}function kTe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Vt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function QTe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function FTe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function f9(s){s=s|0,NTe(s)}function TTe(s){s=s|0,RTe(s+24|0)}function RTe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function NTe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,1,24,l,LTe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function LTe(){return 1392}function MTe(s,l){s=s|0,l=l|0,UTe(n[(OTe(s)|0)>>2]|0,l)}function OTe(s){return s=s|0,(n[(cT()|0)+24>>2]|0)+(s<<3)|0}function UTe(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,t9(f,l),l=r9(f,l)|0,ef[s&127](l),C=c}function _Te(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=uT()|0,s=HTe(c)|0,hn(m,l,d,s,jTe(c,f)|0,f)}function uT(){var s=0,l=0;if(o[7872]|0||(h9(10244),tr(52,10244,U|0)|0,l=7872,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10244)|0)){s=10244,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));h9(10244)}return 10244}function HTe(s){return s=s|0,s|0}function jTe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=uT()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(p9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(qTe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function p9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function qTe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=GTe(s)|0,f>>>0>>0)zr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,YTe(d,M>>3>>>0>>1>>>0?O>>>0>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,p9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,WTe(s,d),VTe(d),C=k;return}}function GTe(s){return s=s|0,536870911}function YTe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Vt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function WTe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function VTe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function h9(s){s=s|0,zTe(s)}function KTe(s){s=s|0,JTe(s+24|0)}function JTe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function zTe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,1,16,l,XTe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function XTe(){return 1400}function ZTe(s){return s=s|0,eRe(n[($Te(s)|0)>>2]|0)|0}function $Te(s){return s=s|0,(n[(uT()|0)+24>>2]|0)+(s<<3)|0}function eRe(s){return s=s|0,tRe(CD[s&7]()|0)|0}function tRe(s){return s=s|0,s|0}function rRe(){var s=0;return o[7880]|0||(cRe(10280),tr(25,10280,U|0)|0,s=7880,n[s>>2]=1,n[s+4>>2]=0),10280}function nRe(s,l){s=s|0,l=l|0,n[s>>2]=iRe()|0,n[s+4>>2]=sRe()|0,n[s+12>>2]=l,n[s+8>>2]=oRe()|0,n[s+32>>2]=4}function iRe(){return 11711}function sRe(){return 1356}function oRe(){return aD()|0}function aRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Sp(f,896)|0)==512?c|0&&(lRe(c),gt(c)):l|0&&(vg(l),gt(l))}function lRe(s){s=s|0,s=n[s+4>>2]|0,s|0&&bp(s)}function cRe(s){s=s|0,Bp(s)}function uRe(s){s=s|0,ARe(s,4920),fRe(s)|0,pRe(s)|0}function ARe(s,l){s=s|0,l=l|0;var c=0;c=L5()|0,n[s>>2]=c,RRe(c,l),xp(n[s>>2]|0)}function fRe(s){s=s|0;var l=0;return l=n[s>>2]|0,bg(l,vRe()|0),s|0}function pRe(s){s=s|0;var l=0;return l=n[s>>2]|0,bg(l,hRe()|0),s|0}function hRe(){var s=0;return o[7888]|0||(g9(10328),tr(53,10328,U|0)|0,s=7888,n[s>>2]=1,n[s+4>>2]=0),Rr(10328)|0||g9(10328),10328}function bg(s,l){s=s|0,l=l|0,hn(s,0,l,0,0,0)}function g9(s){s=s|0,mRe(s),kg(s,10)}function gRe(s){s=s|0,dRe(s+24|0)}function dRe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function mRe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,5,1,l,wRe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function yRe(s,l,c){s=s|0,l=l|0,c=+c,ERe(s,l,c)}function kg(s,l){s=s|0,l=l|0,n[s+20>>2]=l}function ERe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,m=f+8|0,k=f+13|0,d=f,B=f+12|0,XA(k,l),n[m>>2]=ZA(k,l)|0,ku(B,c),E[d>>3]=+Qu(B,c),CRe(s,m,d),C=f}function CRe(s,l,c){s=s|0,l=l|0,c=c|0,Y(s+8|0,n[l>>2]|0,+E[c>>3]),o[s+24>>0]=1}function wRe(){return 1404}function IRe(s,l){return s=s|0,l=+l,BRe(s,l)|0}function BRe(s,l){s=s|0,l=+l;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return f=C,C=C+16|0,m=f+4|0,B=f+8|0,k=f,d=Wa(8)|0,c=d,Q=Vt(16)|0,XA(m,s),s=ZA(m,s)|0,ku(B,l),Y(Q,s,+Qu(B,l)),B=c+4|0,n[B>>2]=Q,s=Vt(8)|0,B=n[B>>2]|0,n[k>>2]=0,n[m>>2]=n[k>>2],JF(s,B,m),n[d>>2]=s,C=f,c|0}function vRe(){var s=0;return o[7896]|0||(d9(10364),tr(54,10364,U|0)|0,s=7896,n[s>>2]=1,n[s+4>>2]=0),Rr(10364)|0||d9(10364),10364}function d9(s){s=s|0,SRe(s),kg(s,55)}function DRe(s){s=s|0,PRe(s+24|0)}function PRe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function SRe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,5,4,l,QRe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function xRe(s){s=s|0,bRe(s)}function bRe(s){s=s|0,kRe(s)}function kRe(s){s=s|0,m9(s+8|0),o[s+24>>0]=1}function m9(s){s=s|0,n[s>>2]=0,E[s+8>>3]=0}function QRe(){return 1424}function FRe(){return TRe()|0}function TRe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0;return l=C,C=C+16|0,d=l+4|0,B=l,c=Wa(8)|0,s=c,f=Vt(16)|0,m9(f),m=s+4|0,n[m>>2]=f,f=Vt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],JF(f,m,d),n[c>>2]=f,C=l,s|0}function RRe(s,l){s=s|0,l=l|0,n[s>>2]=NRe()|0,n[s+4>>2]=LRe()|0,n[s+12>>2]=l,n[s+8>>2]=MRe()|0,n[s+32>>2]=5}function NRe(){return 11710}function LRe(){return 1416}function MRe(){return lD()|0}function ORe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Sp(f,896)|0)==512?c|0&&(URe(c),gt(c)):l|0&>(l)}function URe(s){s=s|0,s=n[s+4>>2]|0,s|0&&bp(s)}function lD(){var s=0;return o[7904]|0||(n[2600]=_Re()|0,n[2601]=0,s=7904,n[s>>2]=1,n[s+4>>2]=0),10400}function _Re(){return n[357]|0}function HRe(s){s=s|0,jRe(s,4926),qRe(s)|0}function jRe(s,l){s=s|0,l=l|0;var c=0;c=s5()|0,n[s>>2]=c,eNe(c,l),xp(n[s>>2]|0)}function qRe(s){s=s|0;var l=0;return l=n[s>>2]|0,bg(l,GRe()|0),s|0}function GRe(){var s=0;return o[7912]|0||(y9(10412),tr(56,10412,U|0)|0,s=7912,n[s>>2]=1,n[s+4>>2]=0),Rr(10412)|0||y9(10412),10412}function y9(s){s=s|0,VRe(s),kg(s,57)}function YRe(s){s=s|0,WRe(s+24|0)}function WRe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function VRe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,5,5,l,XRe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function KRe(s){s=s|0,JRe(s)}function JRe(s){s=s|0,zRe(s)}function zRe(s){s=s|0;var l=0,c=0;l=s+8|0,c=l+48|0;do n[l>>2]=0,l=l+4|0;while((l|0)<(c|0));o[s+56>>0]=1}function XRe(){return 1432}function ZRe(){return $Re()|0}function $Re(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0,k=0;B=C,C=C+16|0,s=B+4|0,l=B,c=Wa(8)|0,f=c,d=Vt(48)|0,m=d,k=m+48|0;do n[m>>2]=0,m=m+4|0;while((m|0)<(k|0));return m=f+4|0,n[m>>2]=d,k=Vt(8)|0,m=n[m>>2]|0,n[l>>2]=0,n[s>>2]=n[l>>2],o5(k,m,s),n[c>>2]=k,C=B,f|0}function eNe(s,l){s=s|0,l=l|0,n[s>>2]=tNe()|0,n[s+4>>2]=rNe()|0,n[s+12>>2]=l,n[s+8>>2]=nNe()|0,n[s+32>>2]=6}function tNe(){return 11704}function rNe(){return 1436}function nNe(){return lD()|0}function iNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Sp(f,896)|0)==512?c|0&&(sNe(c),gt(c)):l|0&>(l)}function sNe(s){s=s|0,s=n[s+4>>2]|0,s|0&&bp(s)}function oNe(s){s=s|0,aNe(s,4933),lNe(s)|0,cNe(s)|0}function aNe(s,l){s=s|0,l=l|0;var c=0;c=TNe()|0,n[s>>2]=c,RNe(c,l),xp(n[s>>2]|0)}function lNe(s){s=s|0;var l=0;return l=n[s>>2]|0,bg(l,BNe()|0),s|0}function cNe(s){s=s|0;var l=0;return l=n[s>>2]|0,bg(l,uNe()|0),s|0}function uNe(){var s=0;return o[7920]|0||(E9(10452),tr(58,10452,U|0)|0,s=7920,n[s>>2]=1,n[s+4>>2]=0),Rr(10452)|0||E9(10452),10452}function E9(s){s=s|0,pNe(s),kg(s,1)}function ANe(s){s=s|0,fNe(s+24|0)}function fNe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function pNe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,5,1,l,mNe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function hNe(s,l,c){s=s|0,l=+l,c=+c,gNe(s,l,c)}function gNe(s,l,c){s=s|0,l=+l,c=+c;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+32|0,m=f+8|0,k=f+17|0,d=f,B=f+16|0,ku(k,l),E[m>>3]=+Qu(k,l),ku(B,c),E[d>>3]=+Qu(B,c),dNe(s,m,d),C=f}function dNe(s,l,c){s=s|0,l=l|0,c=c|0,C9(s+8|0,+E[l>>3],+E[c>>3]),o[s+24>>0]=1}function C9(s,l,c){s=s|0,l=+l,c=+c,E[s>>3]=l,E[s+8>>3]=c}function mNe(){return 1472}function yNe(s,l){return s=+s,l=+l,ENe(s,l)|0}function ENe(s,l){s=+s,l=+l;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return f=C,C=C+16|0,B=f+4|0,k=f+8|0,Q=f,d=Wa(8)|0,c=d,m=Vt(16)|0,ku(B,s),s=+Qu(B,s),ku(k,l),C9(m,s,+Qu(k,l)),k=c+4|0,n[k>>2]=m,m=Vt(8)|0,k=n[k>>2]|0,n[Q>>2]=0,n[B>>2]=n[Q>>2],w9(m,k,B),n[d>>2]=m,C=f,c|0}function w9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Vt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1452,n[c+12>>2]=l,n[s+4>>2]=c}function CNe(s){s=s|0,Jm(s),gt(s)}function wNe(s){s=s|0,s=n[s+12>>2]|0,s|0&>(s)}function INe(s){s=s|0,gt(s)}function BNe(){var s=0;return o[7928]|0||(I9(10488),tr(59,10488,U|0)|0,s=7928,n[s>>2]=1,n[s+4>>2]=0),Rr(10488)|0||I9(10488),10488}function I9(s){s=s|0,PNe(s),kg(s,60)}function vNe(s){s=s|0,DNe(s+24|0)}function DNe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function PNe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,5,6,l,kNe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function SNe(s){s=s|0,xNe(s)}function xNe(s){s=s|0,bNe(s)}function bNe(s){s=s|0,B9(s+8|0),o[s+24>>0]=1}function B9(s){s=s|0,n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,n[s+12>>2]=0}function kNe(){return 1492}function QNe(){return FNe()|0}function FNe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0;return l=C,C=C+16|0,d=l+4|0,B=l,c=Wa(8)|0,s=c,f=Vt(16)|0,B9(f),m=s+4|0,n[m>>2]=f,f=Vt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],w9(f,m,d),n[c>>2]=f,C=l,s|0}function TNe(){var s=0;return o[7936]|0||(_Ne(10524),tr(25,10524,U|0)|0,s=7936,n[s>>2]=1,n[s+4>>2]=0),10524}function RNe(s,l){s=s|0,l=l|0,n[s>>2]=NNe()|0,n[s+4>>2]=LNe()|0,n[s+12>>2]=l,n[s+8>>2]=MNe()|0,n[s+32>>2]=7}function NNe(){return 11700}function LNe(){return 1484}function MNe(){return lD()|0}function ONe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Sp(f,896)|0)==512?c|0&&(UNe(c),gt(c)):l|0&>(l)}function UNe(s){s=s|0,s=n[s+4>>2]|0,s|0&&bp(s)}function _Ne(s){s=s|0,Bp(s)}function HNe(s,l,c){s=s|0,l=l|0,c=c|0,s=pn(l)|0,l=jNe(c)|0,c=qNe(c,0)|0,ELe(s,l,c,AT()|0,0)}function jNe(s){return s=s|0,s|0}function qNe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=AT()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(D9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(zNe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function AT(){var s=0,l=0;if(o[7944]|0||(v9(10568),tr(61,10568,U|0)|0,l=7944,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10568)|0)){s=10568,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));v9(10568)}return 10568}function v9(s){s=s|0,WNe(s)}function GNe(s){s=s|0,YNe(s+24|0)}function YNe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function WNe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,1,17,l,B5()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function VNe(s){return s=s|0,JNe(n[(KNe(s)|0)>>2]|0)|0}function KNe(s){return s=s|0,(n[(AT()|0)+24>>2]|0)+(s<<3)|0}function JNe(s){return s=s|0,oD(CD[s&7]()|0)|0}function D9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function zNe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=XNe(s)|0,f>>>0>>0)zr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,ZNe(d,M>>3>>>0>>1>>>0?O>>>0>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,D9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,$Ne(s,d),eLe(d),C=k;return}}function XNe(s){return s=s|0,536870911}function ZNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Vt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function $Ne(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function eLe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function tLe(){rLe()}function rLe(){nLe(10604)}function nLe(s){s=s|0,iLe(s,4955)}function iLe(s,l){s=s|0,l=l|0;var c=0;c=sLe()|0,n[s>>2]=c,oLe(c,l),xp(n[s>>2]|0)}function sLe(){var s=0;return o[7952]|0||(gLe(10612),tr(25,10612,U|0)|0,s=7952,n[s>>2]=1,n[s+4>>2]=0),10612}function oLe(s,l){s=s|0,l=l|0,n[s>>2]=uLe()|0,n[s+4>>2]=ALe()|0,n[s+12>>2]=l,n[s+8>>2]=fLe()|0,n[s+32>>2]=8}function xp(s){s=s|0;var l=0,c=0;l=C,C=C+16|0,c=l,Gm()|0,n[c>>2]=s,aLe(10608,c),C=l}function Gm(){return o[11714]|0||(n[2652]=0,tr(62,10608,U|0)|0,o[11714]=1),10608}function aLe(s,l){s=s|0,l=l|0;var c=0;c=Vt(8)|0,n[c+4>>2]=n[l>>2],n[c>>2]=n[s>>2],n[s>>2]=c}function lLe(s){s=s|0,cLe(s)}function cLe(s){s=s|0;var l=0,c=0;if(l=n[s>>2]|0,l|0)do c=l,l=n[l>>2]|0,gt(c);while((l|0)!=0);n[s>>2]=0}function uLe(){return 11715}function ALe(){return 1496}function fLe(){return aD()|0}function pLe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Sp(f,896)|0)==512?c|0&&(hLe(c),gt(c)):l|0&>(l)}function hLe(s){s=s|0,s=n[s+4>>2]|0,s|0&&bp(s)}function gLe(s){s=s|0,Bp(s)}function dLe(s,l){s=s|0,l=l|0;var c=0,f=0;Gm()|0,c=n[2652]|0;e:do if(c|0){for(;f=n[c+4>>2]|0,!(f|0&&(o7(fT(f)|0,s)|0)==0);)if(c=n[c>>2]|0,!c)break e;mLe(f,l)}while(0)}function fT(s){return s=s|0,n[s+12>>2]|0}function mLe(s,l){s=s|0,l=l|0;var c=0;s=s+36|0,c=n[s>>2]|0,c|0&&(jA(c),gt(c)),c=Vt(4)|0,$G(c,l),n[s>>2]=c}function pT(){return o[11716]|0||(n[2664]=0,tr(63,10656,U|0)|0,o[11716]=1),10656}function P9(){var s=0;return o[11717]|0?s=n[2665]|0:(yLe(),n[2665]=1504,o[11717]=1,s=1504),s|0}function yLe(){o[11740]|0||(o[11718]=gr(gr(8,0)|0,0)|0,o[11719]=gr(gr(0,0)|0,0)|0,o[11720]=gr(gr(0,16)|0,0)|0,o[11721]=gr(gr(8,0)|0,0)|0,o[11722]=gr(gr(0,0)|0,0)|0,o[11723]=gr(gr(8,0)|0,0)|0,o[11724]=gr(gr(0,0)|0,0)|0,o[11725]=gr(gr(8,0)|0,0)|0,o[11726]=gr(gr(0,0)|0,0)|0,o[11727]=gr(gr(8,0)|0,0)|0,o[11728]=gr(gr(0,0)|0,0)|0,o[11729]=gr(gr(0,0)|0,32)|0,o[11730]=gr(gr(0,0)|0,32)|0,o[11740]=1)}function S9(){return 1572}function ELe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0,O=0,M=0;m=C,C=C+32|0,M=m+16|0,O=m+12|0,Q=m+8|0,k=m+4|0,B=m,n[M>>2]=s,n[O>>2]=l,n[Q>>2]=c,n[k>>2]=f,n[B>>2]=d,pT()|0,CLe(10656,M,O,Q,k,B),C=m}function CLe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0;B=Vt(24)|0,r5(B+4|0,n[l>>2]|0,n[c>>2]|0,n[f>>2]|0,n[d>>2]|0,n[m>>2]|0),n[B>>2]=n[s>>2],n[s>>2]=B}function x9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0,Ge=0,Oe=0,Fe=0,et=0,Xe=0,at=0;if(at=C,C=C+32|0,Oe=at+20|0,Fe=at+8|0,et=at+4|0,Xe=at,l=n[l>>2]|0,l|0){Ge=Oe+4|0,Q=Oe+8|0,O=Fe+4|0,M=Fe+8|0,q=Fe+8|0,se=Oe+8|0;do{if(B=l+4|0,k=hT(B)|0,k|0){if(d=Rw(k)|0,n[Oe>>2]=0,n[Ge>>2]=0,n[Q>>2]=0,f=(Nw(k)|0)+1|0,wLe(Oe,f),f|0)for(;f=f+-1|0,xc(Fe,n[d>>2]|0),m=n[Ge>>2]|0,m>>>0<(n[se>>2]|0)>>>0?(n[m>>2]=n[Fe>>2],n[Ge>>2]=(n[Ge>>2]|0)+4):gT(Oe,Fe),f;)d=d+4|0;f=Lw(k)|0,n[Fe>>2]=0,n[O>>2]=0,n[M>>2]=0;e:do if(n[f>>2]|0)for(d=0,m=0;;){if((d|0)==(m|0)?ILe(Fe,f):(n[d>>2]=n[f>>2],n[O>>2]=(n[O>>2]|0)+4),f=f+4|0,!(n[f>>2]|0))break e;d=n[O>>2]|0,m=n[q>>2]|0}while(0);n[et>>2]=cD(B)|0,n[Xe>>2]=Rr(k)|0,BLe(c,s,et,Xe,Oe,Fe),dT(Fe),$A(Oe)}l=n[l>>2]|0}while((l|0)!=0)}C=at}function hT(s){return s=s|0,n[s+12>>2]|0}function Rw(s){return s=s|0,n[s+12>>2]|0}function Nw(s){return s=s|0,n[s+16>>2]|0}function wLe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;d=C,C=C+32|0,c=d,f=n[s>>2]|0,(n[s+8>>2]|0)-f>>2>>>0>>0&&(L9(c,l,(n[s+4>>2]|0)-f>>2,s+8|0),M9(s,c),O9(c)),C=d}function gT(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0;if(B=C,C=C+32|0,c=B,f=s+4|0,d=((n[f>>2]|0)-(n[s>>2]|0)>>2)+1|0,m=N9(s)|0,m>>>0>>0)zr(s);else{k=n[s>>2]|0,O=(n[s+8>>2]|0)-k|0,Q=O>>1,L9(c,O>>2>>>0>>1>>>0?Q>>>0>>0?d:Q:m,(n[f>>2]|0)-k>>2,s+8|0),m=c+8|0,n[n[m>>2]>>2]=n[l>>2],n[m>>2]=(n[m>>2]|0)+4,M9(s,c),O9(c),C=B;return}}function Lw(s){return s=s|0,n[s+8>>2]|0}function ILe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0;if(B=C,C=C+32|0,c=B,f=s+4|0,d=((n[f>>2]|0)-(n[s>>2]|0)>>2)+1|0,m=R9(s)|0,m>>>0>>0)zr(s);else{k=n[s>>2]|0,O=(n[s+8>>2]|0)-k|0,Q=O>>1,jLe(c,O>>2>>>0>>1>>>0?Q>>>0>>0?d:Q:m,(n[f>>2]|0)-k>>2,s+8|0),m=c+8|0,n[n[m>>2]>>2]=n[l>>2],n[m>>2]=(n[m>>2]|0)+4,qLe(s,c),GLe(c),C=B;return}}function cD(s){return s=s|0,n[s>>2]|0}function BLe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,vLe(s,l,c,f,d,m)}function dT(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-4-f|0)>>>2)<<2)),gt(c))}function $A(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-4-f|0)>>>2)<<2)),gt(c))}function vLe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,Q=0,O=0,M=0,q=0;B=C,C=C+48|0,M=B+40|0,k=B+32|0,q=B+24|0,Q=B+12|0,O=B,Va(k),s=da(s)|0,n[q>>2]=n[l>>2],c=n[c>>2]|0,f=n[f>>2]|0,mT(Q,d),DLe(O,m),n[M>>2]=n[q>>2],PLe(s,M,c,f,Q,O),dT(O),$A(Q),Ka(k),C=B}function mT(s,l){s=s|0,l=l|0;var c=0,f=0;n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,c=l+4|0,f=(n[c>>2]|0)-(n[l>>2]|0)>>2,f|0&&(_Le(s,f),HLe(s,n[l>>2]|0,n[c>>2]|0,f))}function DLe(s,l){s=s|0,l=l|0;var c=0,f=0;n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,c=l+4|0,f=(n[c>>2]|0)-(n[l>>2]|0)>>2,f|0&&(OLe(s,f),ULe(s,n[l>>2]|0,n[c>>2]|0,f))}function PLe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,Q=0,O=0,M=0,q=0;B=C,C=C+32|0,M=B+28|0,q=B+24|0,k=B+12|0,Q=B,O=Pl(SLe()|0)|0,n[q>>2]=n[l>>2],n[M>>2]=n[q>>2],l=Qg(M)|0,c=b9(c)|0,f=yT(f)|0,n[k>>2]=n[d>>2],M=d+4|0,n[k+4>>2]=n[M>>2],q=d+8|0,n[k+8>>2]=n[q>>2],n[q>>2]=0,n[M>>2]=0,n[d>>2]=0,d=ET(k)|0,n[Q>>2]=n[m>>2],M=m+4|0,n[Q+4>>2]=n[M>>2],q=m+8|0,n[Q+8>>2]=n[q>>2],n[q>>2]=0,n[M>>2]=0,n[m>>2]=0,ao(0,O|0,s|0,l|0,c|0,f|0,d|0,xLe(Q)|0)|0,dT(Q),$A(k),C=B}function SLe(){var s=0;return o[7968]|0||(LLe(10708),s=7968,n[s>>2]=1,n[s+4>>2]=0),10708}function Qg(s){return s=s|0,Q9(s)|0}function b9(s){return s=s|0,k9(s)|0}function yT(s){return s=s|0,oD(s)|0}function ET(s){return s=s|0,kLe(s)|0}function xLe(s){return s=s|0,bLe(s)|0}function bLe(s){s=s|0;var l=0,c=0,f=0;if(f=(n[s+4>>2]|0)-(n[s>>2]|0)|0,c=f>>2,f=Wa(f+4|0)|0,n[f>>2]=c,c|0){l=0;do n[f+4+(l<<2)>>2]=k9(n[(n[s>>2]|0)+(l<<2)>>2]|0)|0,l=l+1|0;while((l|0)!=(c|0))}return f|0}function k9(s){return s=s|0,s|0}function kLe(s){s=s|0;var l=0,c=0,f=0;if(f=(n[s+4>>2]|0)-(n[s>>2]|0)|0,c=f>>2,f=Wa(f+4|0)|0,n[f>>2]=c,c|0){l=0;do n[f+4+(l<<2)>>2]=Q9((n[s>>2]|0)+(l<<2)|0)|0,l=l+1|0;while((l|0)!=(c|0))}return f|0}function Q9(s){s=s|0;var l=0,c=0,f=0,d=0;return d=C,C=C+32|0,l=d+12|0,c=d,f=QF(F9()|0)|0,f?(FF(l,f),TF(c,l),fUe(s,c),s=RF(l)|0):s=QLe(s)|0,C=d,s|0}function F9(){var s=0;return o[7960]|0||(NLe(10664),tr(25,10664,U|0)|0,s=7960,n[s>>2]=1,n[s+4>>2]=0),10664}function QLe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;return c=C,C=C+16|0,d=c+4|0,B=c,f=Wa(8)|0,l=f,k=Vt(4)|0,n[k>>2]=n[s>>2],m=l+4|0,n[m>>2]=k,s=Vt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],T9(s,m,d),n[f>>2]=s,C=c,l|0}function T9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Vt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1656,n[c+12>>2]=l,n[s+4>>2]=c}function FLe(s){s=s|0,Jm(s),gt(s)}function TLe(s){s=s|0,s=n[s+12>>2]|0,s|0&>(s)}function RLe(s){s=s|0,gt(s)}function NLe(s){s=s|0,Bp(s)}function LLe(s){s=s|0,Sl(s,MLe()|0,5)}function MLe(){return 1676}function OLe(s,l){s=s|0,l=l|0;var c=0;if((R9(s)|0)>>>0>>0&&zr(s),l>>>0>1073741823)Tt();else{c=Vt(l<<2)|0,n[s+4>>2]=c,n[s>>2]=c,n[s+8>>2]=c+(l<<2);return}}function ULe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,f=s+4|0,s=c-l|0,(s|0)>0&&(Dr(n[f>>2]|0,l|0,s|0)|0,n[f>>2]=(n[f>>2]|0)+(s>>>2<<2))}function R9(s){return s=s|0,1073741823}function _Le(s,l){s=s|0,l=l|0;var c=0;if((N9(s)|0)>>>0>>0&&zr(s),l>>>0>1073741823)Tt();else{c=Vt(l<<2)|0,n[s+4>>2]=c,n[s>>2]=c,n[s+8>>2]=c+(l<<2);return}}function HLe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,f=s+4|0,s=c-l|0,(s|0)>0&&(Dr(n[f>>2]|0,l|0,s|0)|0,n[f>>2]=(n[f>>2]|0)+(s>>>2<<2))}function N9(s){return s=s|0,1073741823}function jLe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>1073741823)Tt();else{d=Vt(l<<2)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<2)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<2)}function qLe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function GLe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-4-l|0)>>>2)<<2)),s=n[s>>2]|0,s|0&>(s)}function L9(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>1073741823)Tt();else{d=Vt(l<<2)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<2)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<2)}function M9(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function O9(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-4-l|0)>>>2)<<2)),s=n[s>>2]|0,s|0&>(s)}function YLe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0,Ge=0,Oe=0,Fe=0;if(Fe=C,C=C+32|0,M=Fe+20|0,q=Fe+12|0,O=Fe+16|0,se=Fe+4|0,Ge=Fe,Oe=Fe+8|0,k=P9()|0,m=n[k>>2]|0,B=n[m>>2]|0,B|0)for(Q=n[k+8>>2]|0,k=n[k+4>>2]|0;xc(M,B),WLe(s,M,k,Q),m=m+4|0,B=n[m>>2]|0,B;)Q=Q+1|0,k=k+1|0;if(m=S9()|0,B=n[m>>2]|0,B|0)do xc(M,B),n[q>>2]=n[m+4>>2],VLe(l,M,q),m=m+8|0,B=n[m>>2]|0;while((B|0)!=0);if(m=n[(Gm()|0)>>2]|0,m|0)do l=n[m+4>>2]|0,xc(M,n[(Ym(l)|0)>>2]|0),n[q>>2]=fT(l)|0,KLe(c,M,q),m=n[m>>2]|0;while((m|0)!=0);if(xc(O,0),m=pT()|0,n[M>>2]=n[O>>2],x9(M,m,d),m=n[(Gm()|0)>>2]|0,m|0){s=M+4|0,l=M+8|0,c=M+8|0;do{if(Q=n[m+4>>2]|0,xc(q,n[(Ym(Q)|0)>>2]|0),JLe(se,U9(Q)|0),B=n[se>>2]|0,B|0){n[M>>2]=0,n[s>>2]=0,n[l>>2]=0;do xc(Ge,n[(Ym(n[B+4>>2]|0)|0)>>2]|0),k=n[s>>2]|0,k>>>0<(n[c>>2]|0)>>>0?(n[k>>2]=n[Ge>>2],n[s>>2]=(n[s>>2]|0)+4):gT(M,Ge),B=n[B>>2]|0;while((B|0)!=0);zLe(f,q,M),$A(M)}n[Oe>>2]=n[q>>2],O=_9(Q)|0,n[M>>2]=n[Oe>>2],x9(M,O,d),l5(se),m=n[m>>2]|0}while((m|0)!=0)}C=Fe}function WLe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,lMe(s,l,c,f)}function VLe(s,l,c){s=s|0,l=l|0,c=c|0,aMe(s,l,c)}function Ym(s){return s=s|0,s|0}function KLe(s,l,c){s=s|0,l=l|0,c=c|0,nMe(s,l,c)}function U9(s){return s=s|0,s+16|0}function JLe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;if(m=C,C=C+16|0,d=m+8|0,c=m,n[s>>2]=0,f=n[l>>2]|0,n[d>>2]=f,n[c>>2]=s,c=rMe(c)|0,f|0){if(f=Vt(12)|0,B=(H9(d)|0)+4|0,s=n[B+4>>2]|0,l=f+4|0,n[l>>2]=n[B>>2],n[l+4>>2]=s,l=n[n[d>>2]>>2]|0,n[d>>2]=l,!l)s=f;else for(l=f;s=Vt(12)|0,Q=(H9(d)|0)+4|0,k=n[Q+4>>2]|0,B=s+4|0,n[B>>2]=n[Q>>2],n[B+4>>2]=k,n[l>>2]=s,B=n[n[d>>2]>>2]|0,n[d>>2]=B,B;)l=s;n[s>>2]=n[c>>2],n[c>>2]=f}C=m}function zLe(s,l,c){s=s|0,l=l|0,c=c|0,XLe(s,l,c)}function _9(s){return s=s|0,s+24|0}function XLe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+32|0,B=f+24|0,d=f+16|0,k=f+12|0,m=f,Va(d),s=da(s)|0,n[k>>2]=n[l>>2],mT(m,c),n[B>>2]=n[k>>2],ZLe(s,B,m),$A(m),Ka(d),C=f}function ZLe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+32|0,B=f+16|0,k=f+12|0,d=f,m=Pl($Le()|0)|0,n[k>>2]=n[l>>2],n[B>>2]=n[k>>2],l=Qg(B)|0,n[d>>2]=n[c>>2],B=c+4|0,n[d+4>>2]=n[B>>2],k=c+8|0,n[d+8>>2]=n[k>>2],n[k>>2]=0,n[B>>2]=0,n[c>>2]=0,oo(0,m|0,s|0,l|0,ET(d)|0)|0,$A(d),C=f}function $Le(){var s=0;return o[7976]|0||(eMe(10720),s=7976,n[s>>2]=1,n[s+4>>2]=0),10720}function eMe(s){s=s|0,Sl(s,tMe()|0,2)}function tMe(){return 1732}function rMe(s){return s=s|0,n[s>>2]|0}function H9(s){return s=s|0,n[s>>2]|0}function nMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+32|0,m=f+16|0,d=f+8|0,B=f,Va(d),s=da(s)|0,n[B>>2]=n[l>>2],c=n[c>>2]|0,n[m>>2]=n[B>>2],j9(s,m,c),Ka(d),C=f}function j9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,m=f+4|0,B=f,d=Pl(iMe()|0)|0,n[B>>2]=n[l>>2],n[m>>2]=n[B>>2],l=Qg(m)|0,oo(0,d|0,s|0,l|0,b9(c)|0)|0,C=f}function iMe(){var s=0;return o[7984]|0||(sMe(10732),s=7984,n[s>>2]=1,n[s+4>>2]=0),10732}function sMe(s){s=s|0,Sl(s,oMe()|0,2)}function oMe(){return 1744}function aMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+32|0,m=f+16|0,d=f+8|0,B=f,Va(d),s=da(s)|0,n[B>>2]=n[l>>2],c=n[c>>2]|0,n[m>>2]=n[B>>2],j9(s,m,c),Ka(d),C=f}function lMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+32|0,B=d+16|0,m=d+8|0,k=d,Va(m),s=da(s)|0,n[k>>2]=n[l>>2],c=o[c>>0]|0,f=o[f>>0]|0,n[B>>2]=n[k>>2],cMe(s,B,c,f),Ka(m),C=d}function cMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,B=d+4|0,k=d,m=Pl(uMe()|0)|0,n[k>>2]=n[l>>2],n[B>>2]=n[k>>2],l=Qg(B)|0,c=Wm(c)|0,pc(0,m|0,s|0,l|0,c|0,Wm(f)|0)|0,C=d}function uMe(){var s=0;return o[7992]|0||(fMe(10744),s=7992,n[s>>2]=1,n[s+4>>2]=0),10744}function Wm(s){return s=s|0,AMe(s)|0}function AMe(s){return s=s|0,s&255|0}function fMe(s){s=s|0,Sl(s,pMe()|0,3)}function pMe(){return 1756}function hMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;switch(se=C,C=C+32|0,k=se+8|0,Q=se+4|0,O=se+20|0,M=se,OF(s,0),f=AUe(l)|0,n[k>>2]=0,q=k+4|0,n[q>>2]=0,n[k+8>>2]=0,f<<24>>24){case 0:{o[O>>0]=0,gMe(Q,c,O),uD(s,Q)|0,qA(Q);break}case 8:{q=DT(l)|0,o[O>>0]=8,xc(M,n[q+4>>2]|0),dMe(Q,c,O,M,q+8|0),uD(s,Q)|0,qA(Q);break}case 9:{if(m=DT(l)|0,l=n[m+4>>2]|0,l|0)for(B=k+8|0,d=m+12|0;l=l+-1|0,xc(Q,n[d>>2]|0),f=n[q>>2]|0,f>>>0<(n[B>>2]|0)>>>0?(n[f>>2]=n[Q>>2],n[q>>2]=(n[q>>2]|0)+4):gT(k,Q),l;)d=d+4|0;o[O>>0]=9,xc(M,n[m+8>>2]|0),mMe(Q,c,O,M,k),uD(s,Q)|0,qA(Q);break}default:q=DT(l)|0,o[O>>0]=f,xc(M,n[q+4>>2]|0),yMe(Q,c,O,M),uD(s,Q)|0,qA(Q)}$A(k),C=se}function gMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,Va(d),l=da(l)|0,QMe(s,l,o[c>>0]|0),Ka(d),C=f}function uD(s,l){s=s|0,l=l|0;var c=0;return c=n[s>>2]|0,c|0&&PA(c|0),n[s>>2]=n[l>>2],n[l>>2]=0,s|0}function dMe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0;m=C,C=C+32|0,k=m+16|0,B=m+8|0,Q=m,Va(B),l=da(l)|0,c=o[c>>0]|0,n[Q>>2]=n[f>>2],d=n[d>>2]|0,n[k>>2]=n[Q>>2],SMe(s,l,c,k,d),Ka(B),C=m}function mMe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0,O=0;m=C,C=C+32|0,Q=m+24|0,B=m+16|0,O=m+12|0,k=m,Va(B),l=da(l)|0,c=o[c>>0]|0,n[O>>2]=n[f>>2],mT(k,d),n[Q>>2]=n[O>>2],BMe(s,l,c,Q,k),$A(k),Ka(B),C=m}function yMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+32|0,B=d+16|0,m=d+8|0,k=d,Va(m),l=da(l)|0,c=o[c>>0]|0,n[k>>2]=n[f>>2],n[B>>2]=n[k>>2],EMe(s,l,c,B),Ka(m),C=d}function EMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+4|0,k=d,B=Pl(CMe()|0)|0,c=Wm(c)|0,n[k>>2]=n[f>>2],n[m>>2]=n[k>>2],AD(s,oo(0,B|0,l|0,c|0,Qg(m)|0)|0),C=d}function CMe(){var s=0;return o[8e3]|0||(wMe(10756),s=8e3,n[s>>2]=1,n[s+4>>2]=0),10756}function AD(s,l){s=s|0,l=l|0,OF(s,l)}function wMe(s){s=s|0,Sl(s,IMe()|0,2)}function IMe(){return 1772}function BMe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0,O=0;m=C,C=C+32|0,Q=m+16|0,O=m+12|0,B=m,k=Pl(vMe()|0)|0,c=Wm(c)|0,n[O>>2]=n[f>>2],n[Q>>2]=n[O>>2],f=Qg(Q)|0,n[B>>2]=n[d>>2],Q=d+4|0,n[B+4>>2]=n[Q>>2],O=d+8|0,n[B+8>>2]=n[O>>2],n[O>>2]=0,n[Q>>2]=0,n[d>>2]=0,AD(s,pc(0,k|0,l|0,c|0,f|0,ET(B)|0)|0),$A(B),C=m}function vMe(){var s=0;return o[8008]|0||(DMe(10768),s=8008,n[s>>2]=1,n[s+4>>2]=0),10768}function DMe(s){s=s|0,Sl(s,PMe()|0,3)}function PMe(){return 1784}function SMe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0;m=C,C=C+16|0,k=m+4|0,Q=m,B=Pl(xMe()|0)|0,c=Wm(c)|0,n[Q>>2]=n[f>>2],n[k>>2]=n[Q>>2],f=Qg(k)|0,AD(s,pc(0,B|0,l|0,c|0,f|0,yT(d)|0)|0),C=m}function xMe(){var s=0;return o[8016]|0||(bMe(10780),s=8016,n[s>>2]=1,n[s+4>>2]=0),10780}function bMe(s){s=s|0,Sl(s,kMe()|0,3)}function kMe(){return 1800}function QMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=Pl(FMe()|0)|0,AD(s,Qn(0,f|0,l|0,Wm(c)|0)|0)}function FMe(){var s=0;return o[8024]|0||(TMe(10792),s=8024,n[s>>2]=1,n[s+4>>2]=0),10792}function TMe(s){s=s|0,Sl(s,RMe()|0,1)}function RMe(){return 1816}function NMe(){LMe(),MMe(),OMe()}function LMe(){n[2702]=d7(65536)|0}function MMe(){iOe(10856)}function OMe(){UMe(10816)}function UMe(s){s=s|0,_Me(s,5044),HMe(s)|0}function _Me(s,l){s=s|0,l=l|0;var c=0;c=F9()|0,n[s>>2]=c,ZMe(c,l),xp(n[s>>2]|0)}function HMe(s){s=s|0;var l=0;return l=n[s>>2]|0,bg(l,jMe()|0),s|0}function jMe(){var s=0;return o[8032]|0||(q9(10820),tr(64,10820,U|0)|0,s=8032,n[s>>2]=1,n[s+4>>2]=0),Rr(10820)|0||q9(10820),10820}function q9(s){s=s|0,YMe(s),kg(s,25)}function qMe(s){s=s|0,GMe(s+24|0)}function GMe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function YMe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,5,18,l,JMe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function WMe(s,l){s=s|0,l=l|0,VMe(s,l)}function VMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;c=C,C=C+16|0,f=c,d=c+4|0,Sg(d,l),n[f>>2]=xg(d,l)|0,KMe(s,f),C=c}function KMe(s,l){s=s|0,l=l|0,G9(s+4|0,n[l>>2]|0),o[s+8>>0]=1}function G9(s,l){s=s|0,l=l|0,n[s>>2]=l}function JMe(){return 1824}function zMe(s){return s=s|0,XMe(s)|0}function XMe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;return c=C,C=C+16|0,d=c+4|0,B=c,f=Wa(8)|0,l=f,k=Vt(4)|0,Sg(d,s),G9(k,xg(d,s)|0),m=l+4|0,n[m>>2]=k,s=Vt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],T9(s,m,d),n[f>>2]=s,C=c,l|0}function Wa(s){s=s|0;var l=0,c=0;return s=s+7&-8,s>>>0<=32768&&(l=n[2701]|0,s>>>0<=(65536-l|0)>>>0)?(c=(n[2702]|0)+l|0,n[2701]=l+s,s=c):(s=d7(s+8|0)|0,n[s>>2]=n[2703],n[2703]=s,s=s+8|0),s|0}function ZMe(s,l){s=s|0,l=l|0,n[s>>2]=$Me()|0,n[s+4>>2]=eOe()|0,n[s+12>>2]=l,n[s+8>>2]=tOe()|0,n[s+32>>2]=9}function $Me(){return 11744}function eOe(){return 1832}function tOe(){return lD()|0}function rOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Sp(f,896)|0)==512?c|0&&(nOe(c),gt(c)):l|0&>(l)}function nOe(s){s=s|0,s=n[s+4>>2]|0,s|0&&bp(s)}function iOe(s){s=s|0,sOe(s,5052),oOe(s)|0,aOe(s,5058,26)|0,lOe(s,5069,1)|0,cOe(s,5077,10)|0,uOe(s,5087,19)|0,AOe(s,5094,27)|0}function sOe(s,l){s=s|0,l=l|0;var c=0;c=nUe()|0,n[s>>2]=c,iUe(c,l),xp(n[s>>2]|0)}function oOe(s){s=s|0;var l=0;return l=n[s>>2]|0,bg(l,q4e()|0),s|0}function aOe(s,l,c){return s=s|0,l=l|0,c=c|0,D4e(s,pn(l)|0,c,0),s|0}function lOe(s,l,c){return s=s|0,l=l|0,c=c|0,u4e(s,pn(l)|0,c,0),s|0}function cOe(s,l,c){return s=s|0,l=l|0,c=c|0,jOe(s,pn(l)|0,c,0),s|0}function uOe(s,l,c){return s=s|0,l=l|0,c=c|0,SOe(s,pn(l)|0,c,0),s|0}function Y9(s,l){s=s|0,l=l|0;var c=0,f=0;e:for(;;){for(c=n[2703]|0;;){if((c|0)==(l|0))break e;if(f=n[c>>2]|0,n[2703]=f,!c)c=f;else break}gt(c)}n[2701]=s}function AOe(s,l,c){return s=s|0,l=l|0,c=c|0,fOe(s,pn(l)|0,c,0),s|0}function fOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=CT()|0,s=pOe(c)|0,hn(m,l,d,s,hOe(c,f)|0,f)}function CT(){var s=0,l=0;if(o[8040]|0||(V9(10860),tr(65,10860,U|0)|0,l=8040,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10860)|0)){s=10860,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));V9(10860)}return 10860}function pOe(s){return s=s|0,s|0}function hOe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=CT()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(W9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(gOe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function W9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function gOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=dOe(s)|0,f>>>0>>0)zr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,mOe(d,M>>3>>>0>>1>>>0?O>>>0>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,W9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,yOe(s,d),EOe(d),C=k;return}}function dOe(s){return s=s|0,536870911}function mOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Vt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function yOe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function EOe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function V9(s){s=s|0,IOe(s)}function COe(s){s=s|0,wOe(s+24|0)}function wOe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function IOe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,1,11,l,BOe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function BOe(){return 1840}function vOe(s,l,c){s=s|0,l=l|0,c=c|0,POe(n[(DOe(s)|0)>>2]|0,l,c)}function DOe(s){return s=s|0,(n[(CT()|0)+24>>2]|0)+(s<<3)|0}function POe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;f=C,C=C+16|0,m=f+1|0,d=f,Sg(m,l),l=xg(m,l)|0,Sg(d,c),c=xg(d,c)|0,tf[s&31](l,c),C=f}function SOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=wT()|0,s=xOe(c)|0,hn(m,l,d,s,bOe(c,f)|0,f)}function wT(){var s=0,l=0;if(o[8048]|0||(J9(10896),tr(66,10896,U|0)|0,l=8048,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10896)|0)){s=10896,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));J9(10896)}return 10896}function xOe(s){return s=s|0,s|0}function bOe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=wT()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(K9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(kOe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function K9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function kOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=QOe(s)|0,f>>>0>>0)zr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,FOe(d,M>>3>>>0>>1>>>0?O>>>0>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,K9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,TOe(s,d),ROe(d),C=k;return}}function QOe(s){return s=s|0,536870911}function FOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Vt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function TOe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function ROe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function J9(s){s=s|0,MOe(s)}function NOe(s){s=s|0,LOe(s+24|0)}function LOe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function MOe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,1,11,l,OOe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function OOe(){return 1852}function UOe(s,l){return s=s|0,l=l|0,HOe(n[(_Oe(s)|0)>>2]|0,l)|0}function _Oe(s){return s=s|0,(n[(wT()|0)+24>>2]|0)+(s<<3)|0}function HOe(s,l){s=s|0,l=l|0;var c=0,f=0;return c=C,C=C+16|0,f=c,Sg(f,l),l=xg(f,l)|0,l=oD(Ng[s&31](l)|0)|0,C=c,l|0}function jOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=IT()|0,s=qOe(c)|0,hn(m,l,d,s,GOe(c,f)|0,f)}function IT(){var s=0,l=0;if(o[8056]|0||(X9(10932),tr(67,10932,U|0)|0,l=8056,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10932)|0)){s=10932,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));X9(10932)}return 10932}function qOe(s){return s=s|0,s|0}function GOe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=IT()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(z9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(YOe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function z9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function YOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=WOe(s)|0,f>>>0>>0)zr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,VOe(d,M>>3>>>0>>1>>>0?O>>>0>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,z9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,KOe(s,d),JOe(d),C=k;return}}function WOe(s){return s=s|0,536870911}function VOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Vt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function KOe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function JOe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function X9(s){s=s|0,ZOe(s)}function zOe(s){s=s|0,XOe(s+24|0)}function XOe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function ZOe(s){s=s|0;var l=0;l=Vr()|0,Kr(s,1,7,l,$Oe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function $Oe(){return 1860}function e4e(s,l,c){return s=s|0,l=l|0,c=c|0,r4e(n[(t4e(s)|0)>>2]|0,l,c)|0}function t4e(s){return s=s|0,(n[(IT()|0)+24>>2]|0)+(s<<3)|0}function r4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0;return f=C,C=C+32|0,B=f+12|0,m=f+8|0,k=f,Q=f+16|0,d=f+4|0,n4e(Q,l),i4e(k,Q,l),vp(d,c),c=Dp(d,c)|0,n[B>>2]=n[k>>2],_w[s&15](m,B,c),c=s4e(m)|0,qA(m),Pp(d),C=f,c|0}function n4e(s,l){s=s|0,l=l|0}function i4e(s,l,c){s=s|0,l=l|0,c=c|0,o4e(s,c)}function s4e(s){return s=s|0,da(s)|0}function o4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;d=C,C=C+16|0,c=d,f=l,f&1?(a4e(c,0),ii(f|0,c|0)|0,l4e(s,c),c4e(c)):n[s>>2]=n[l>>2],C=d}function a4e(s,l){s=s|0,l=l|0,e5(s,l),n[s+4>>2]=0,o[s+8>>0]=0}function l4e(s,l){s=s|0,l=l|0,n[s>>2]=n[l+4>>2]}function c4e(s){s=s|0,o[s+8>>0]=0}function u4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=BT()|0,s=A4e(c)|0,hn(m,l,d,s,f4e(c,f)|0,f)}function BT(){var s=0,l=0;if(o[8064]|0||($9(10968),tr(68,10968,U|0)|0,l=8064,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10968)|0)){s=10968,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));$9(10968)}return 10968}function A4e(s){return s=s|0,s|0}function f4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=BT()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(Z9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(p4e(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function Z9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function p4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=h4e(s)|0,f>>>0>>0)zr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,g4e(d,M>>3>>>0>>1>>>0?O>>>0>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,Z9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,d4e(s,d),m4e(d),C=k;return}}function h4e(s){return s=s|0,536870911}function g4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Vt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function d4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function m4e(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function $9(s){s=s|0,C4e(s)}function y4e(s){s=s|0,E4e(s+24|0)}function E4e(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function C4e(s){s=s|0;var l=0;l=Vr()|0,Kr(s,1,1,l,w4e()|0,5),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function w4e(){return 1872}function I4e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,v4e(n[(B4e(s)|0)>>2]|0,l,c,f,d,m)}function B4e(s){return s=s|0,(n[(BT()|0)+24>>2]|0)+(s<<3)|0}function v4e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,Q=0,O=0,M=0,q=0;B=C,C=C+32|0,k=B+16|0,Q=B+12|0,O=B+8|0,M=B+4|0,q=B,vp(k,l),l=Dp(k,l)|0,vp(Q,c),c=Dp(Q,c)|0,vp(O,f),f=Dp(O,f)|0,vp(M,d),d=Dp(M,d)|0,vp(q,m),m=Dp(q,m)|0,w7[s&1](l,c,f,d,m),Pp(q),Pp(M),Pp(O),Pp(Q),Pp(k),C=B}function D4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=vT()|0,s=P4e(c)|0,hn(m,l,d,s,S4e(c,f)|0,f)}function vT(){var s=0,l=0;if(o[8072]|0||(t7(11004),tr(69,11004,U|0)|0,l=8072,n[l>>2]=1,n[l+4>>2]=0),!(Rr(11004)|0)){s=11004,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));t7(11004)}return 11004}function P4e(s){return s=s|0,s|0}function S4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=vT()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(e7(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(x4e(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function e7(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function x4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=b4e(s)|0,f>>>0>>0)zr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,k4e(d,M>>3>>>0>>1>>>0?O>>>0>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,e7(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,Q4e(s,d),F4e(d),C=k;return}}function b4e(s){return s=s|0,536870911}function k4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Vt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function Q4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function F4e(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function t7(s){s=s|0,N4e(s)}function T4e(s){s=s|0,R4e(s+24|0)}function R4e(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function N4e(s){s=s|0;var l=0;l=Vr()|0,Kr(s,1,12,l,L4e()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function L4e(){return 1896}function M4e(s,l,c){s=s|0,l=l|0,c=c|0,U4e(n[(O4e(s)|0)>>2]|0,l,c)}function O4e(s){return s=s|0,(n[(vT()|0)+24>>2]|0)+(s<<3)|0}function U4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;f=C,C=C+16|0,m=f+4|0,d=f,_4e(m,l),l=H4e(m,l)|0,vp(d,c),c=Dp(d,c)|0,tf[s&31](l,c),Pp(d),C=f}function _4e(s,l){s=s|0,l=l|0}function H4e(s,l){return s=s|0,l=l|0,j4e(l)|0}function j4e(s){return s=s|0,s|0}function q4e(){var s=0;return o[8080]|0||(r7(11040),tr(70,11040,U|0)|0,s=8080,n[s>>2]=1,n[s+4>>2]=0),Rr(11040)|0||r7(11040),11040}function r7(s){s=s|0,W4e(s),kg(s,71)}function G4e(s){s=s|0,Y4e(s+24|0)}function Y4e(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function W4e(s){s=s|0;var l=0;l=Vr()|0,Kr(s,5,7,l,z4e()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function V4e(s){s=s|0,K4e(s)}function K4e(s){s=s|0,J4e(s)}function J4e(s){s=s|0,o[s+8>>0]=1}function z4e(){return 1936}function X4e(){return Z4e()|0}function Z4e(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0;return l=C,C=C+16|0,d=l+4|0,B=l,c=Wa(8)|0,s=c,m=s+4|0,n[m>>2]=Vt(1)|0,f=Vt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],$4e(f,m,d),n[c>>2]=f,C=l,s|0}function $4e(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Vt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1916,n[c+12>>2]=l,n[s+4>>2]=c}function eUe(s){s=s|0,Jm(s),gt(s)}function tUe(s){s=s|0,s=n[s+12>>2]|0,s|0&>(s)}function rUe(s){s=s|0,gt(s)}function nUe(){var s=0;return o[8088]|0||(uUe(11076),tr(25,11076,U|0)|0,s=8088,n[s>>2]=1,n[s+4>>2]=0),11076}function iUe(s,l){s=s|0,l=l|0,n[s>>2]=sUe()|0,n[s+4>>2]=oUe()|0,n[s+12>>2]=l,n[s+8>>2]=aUe()|0,n[s+32>>2]=10}function sUe(){return 11745}function oUe(){return 1940}function aUe(){return aD()|0}function lUe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Sp(f,896)|0)==512?c|0&&(cUe(c),gt(c)):l|0&>(l)}function cUe(s){s=s|0,s=n[s+4>>2]|0,s|0&&bp(s)}function uUe(s){s=s|0,Bp(s)}function xc(s,l){s=s|0,l=l|0,n[s>>2]=l}function DT(s){return s=s|0,n[s>>2]|0}function AUe(s){return s=s|0,o[n[s>>2]>>0]|0}function fUe(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,n[f>>2]=n[s>>2],pUe(l,f)|0,C=c}function pUe(s,l){s=s|0,l=l|0;var c=0;return c=hUe(n[s>>2]|0,l)|0,l=s+4|0,n[(n[l>>2]|0)+8>>2]=c,n[(n[l>>2]|0)+8>>2]|0}function hUe(s,l){s=s|0,l=l|0;var c=0,f=0;return c=C,C=C+16|0,f=c,Va(f),s=da(s)|0,l=gUe(s,n[l>>2]|0)|0,Ka(f),C=c,l|0}function Va(s){s=s|0,n[s>>2]=n[2701],n[s+4>>2]=n[2703]}function gUe(s,l){s=s|0,l=l|0;var c=0;return c=Pl(dUe()|0)|0,Qn(0,c|0,s|0,yT(l)|0)|0}function Ka(s){s=s|0,Y9(n[s>>2]|0,n[s+4>>2]|0)}function dUe(){var s=0;return o[8096]|0||(mUe(11120),s=8096,n[s>>2]=1,n[s+4>>2]=0),11120}function mUe(s){s=s|0,Sl(s,yUe()|0,1)}function yUe(){return 1948}function EUe(){CUe()}function CUe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0,Ge=0,Oe=0,Fe=0;if(Oe=C,C=C+16|0,M=Oe+4|0,q=Oe,Ni(65536,10804,n[2702]|0,10812),c=P9()|0,l=n[c>>2]|0,s=n[l>>2]|0,s|0)for(f=n[c+8>>2]|0,c=n[c+4>>2]|0;uc(s|0,u[c>>0]|0|0,o[f>>0]|0),l=l+4|0,s=n[l>>2]|0,s;)f=f+1|0,c=c+1|0;if(s=S9()|0,l=n[s>>2]|0,l|0)do uu(l|0,n[s+4>>2]|0),s=s+8|0,l=n[s>>2]|0;while((l|0)!=0);uu(wUe()|0,5167),O=Gm()|0,s=n[O>>2]|0;e:do if(s|0){do IUe(n[s+4>>2]|0),s=n[s>>2]|0;while((s|0)!=0);if(s=n[O>>2]|0,s|0){Q=O;do{for(;d=s,s=n[s>>2]|0,d=n[d+4>>2]|0,!!(BUe(d)|0);)if(n[q>>2]=Q,n[M>>2]=n[q>>2],vUe(O,M)|0,!s)break e;if(DUe(d),Q=n[Q>>2]|0,l=n7(d)|0,m=Hi()|0,B=C,C=C+((1*(l<<2)|0)+15&-16)|0,k=C,C=C+((1*(l<<2)|0)+15&-16)|0,l=n[(U9(d)|0)>>2]|0,l|0)for(c=B,f=k;n[c>>2]=n[(Ym(n[l+4>>2]|0)|0)>>2],n[f>>2]=n[l+8>>2],l=n[l>>2]|0,l;)c=c+4|0,f=f+4|0;Fe=Ym(d)|0,l=PUe(d)|0,c=n7(d)|0,f=SUe(d)|0,Au(Fe|0,l|0,B|0,k|0,c|0,f|0,fT(d)|0),_i(m|0)}while((s|0)!=0)}}while(0);if(s=n[(pT()|0)>>2]|0,s|0)do Fe=s+4|0,O=hT(Fe)|0,d=Lw(O)|0,m=Rw(O)|0,B=(Nw(O)|0)+1|0,k=fD(O)|0,Q=i7(Fe)|0,O=Rr(O)|0,M=cD(Fe)|0,q=PT(Fe)|0,El(0,d|0,m|0,B|0,k|0,Q|0,O|0,M|0,q|0,ST(Fe)|0),s=n[s>>2]|0;while((s|0)!=0);s=n[(Gm()|0)>>2]|0;e:do if(s|0){t:for(;;){if(l=n[s+4>>2]|0,l|0&&(se=n[(Ym(l)|0)>>2]|0,Ge=n[(_9(l)|0)>>2]|0,Ge|0)){c=Ge;do{l=c+4|0,f=hT(l)|0;r:do if(f|0)switch(Rr(f)|0){case 0:break t;case 4:case 3:case 2:{k=Lw(f)|0,Q=Rw(f)|0,O=(Nw(f)|0)+1|0,M=fD(f)|0,q=Rr(f)|0,Fe=cD(l)|0,El(se|0,k|0,Q|0,O|0,M|0,0,q|0,Fe|0,PT(l)|0,ST(l)|0);break r}case 1:{B=Lw(f)|0,k=Rw(f)|0,Q=(Nw(f)|0)+1|0,O=fD(f)|0,M=i7(l)|0,q=Rr(f)|0,Fe=cD(l)|0,El(se|0,B|0,k|0,Q|0,O|0,M|0,q|0,Fe|0,PT(l)|0,ST(l)|0);break r}case 5:{O=Lw(f)|0,M=Rw(f)|0,q=(Nw(f)|0)+1|0,Fe=fD(f)|0,El(se|0,O|0,M|0,q|0,Fe|0,xUe(f)|0,Rr(f)|0,0,0,0);break r}default:break r}while(0);c=n[c>>2]|0}while((c|0)!=0)}if(s=n[s>>2]|0,!s)break e}Tt()}while(0);Ce(),C=Oe}function wUe(){return 11703}function IUe(s){s=s|0,o[s+40>>0]=0}function BUe(s){return s=s|0,(o[s+40>>0]|0)!=0|0}function vUe(s,l){return s=s|0,l=l|0,l=bUe(l)|0,s=n[l>>2]|0,n[l>>2]=n[s>>2],gt(s),n[l>>2]|0}function DUe(s){s=s|0,o[s+40>>0]=1}function n7(s){return s=s|0,n[s+20>>2]|0}function PUe(s){return s=s|0,n[s+8>>2]|0}function SUe(s){return s=s|0,n[s+32>>2]|0}function fD(s){return s=s|0,n[s+4>>2]|0}function i7(s){return s=s|0,n[s+4>>2]|0}function PT(s){return s=s|0,n[s+8>>2]|0}function ST(s){return s=s|0,n[s+16>>2]|0}function xUe(s){return s=s|0,n[s+20>>2]|0}function bUe(s){return s=s|0,n[s>>2]|0}function pD(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0,Ge=0,Oe=0,Fe=0,et=0,Xe=0,at=0,Ue=0,qe=0,Lt=0;Lt=C,C=C+16|0,se=Lt;do if(s>>>0<245){if(O=s>>>0<11?16:s+11&-8,s=O>>>3,q=n[2783]|0,c=q>>>s,c&3|0)return l=(c&1^1)+s|0,s=11172+(l<<1<<2)|0,c=s+8|0,f=n[c>>2]|0,d=f+8|0,m=n[d>>2]|0,(s|0)==(m|0)?n[2783]=q&~(1<>2]=s,n[c>>2]=m),qe=l<<3,n[f+4>>2]=qe|3,qe=f+qe+4|0,n[qe>>2]=n[qe>>2]|1,qe=d,C=Lt,qe|0;if(M=n[2785]|0,O>>>0>M>>>0){if(c|0)return l=2<>>12&16,l=l>>>B,c=l>>>5&8,l=l>>>c,d=l>>>2&4,l=l>>>d,s=l>>>1&2,l=l>>>s,f=l>>>1&1,f=(c|B|d|s|f)+(l>>>f)|0,l=11172+(f<<1<<2)|0,s=l+8|0,d=n[s>>2]|0,B=d+8|0,c=n[B>>2]|0,(l|0)==(c|0)?(s=q&~(1<>2]=l,n[s>>2]=c,s=q),m=(f<<3)-O|0,n[d+4>>2]=O|3,f=d+O|0,n[f+4>>2]=m|1,n[f+m>>2]=m,M|0&&(d=n[2788]|0,l=M>>>3,c=11172+(l<<1<<2)|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=d,n[l+12>>2]=d,n[d+8>>2]=l,n[d+12>>2]=c),n[2785]=m,n[2788]=f,qe=B,C=Lt,qe|0;if(k=n[2784]|0,k){if(c=(k&0-k)+-1|0,B=c>>>12&16,c=c>>>B,m=c>>>5&8,c=c>>>m,Q=c>>>2&4,c=c>>>Q,f=c>>>1&2,c=c>>>f,s=c>>>1&1,s=n[11436+((m|B|Q|f|s)+(c>>>s)<<2)>>2]|0,c=(n[s+4>>2]&-8)-O|0,f=n[s+16+(((n[s+16>>2]|0)==0&1)<<2)>>2]|0,!f)Q=s,m=c;else{do B=(n[f+4>>2]&-8)-O|0,Q=B>>>0>>0,c=Q?B:c,s=Q?f:s,f=n[f+16+(((n[f+16>>2]|0)==0&1)<<2)>>2]|0;while((f|0)!=0);Q=s,m=c}if(B=Q+O|0,Q>>>0>>0){d=n[Q+24>>2]|0,l=n[Q+12>>2]|0;do if((l|0)==(Q|0)){if(s=Q+20|0,l=n[s>>2]|0,!l&&(s=Q+16|0,l=n[s>>2]|0,!l)){c=0;break}for(;;){if(c=l+20|0,f=n[c>>2]|0,f|0){l=f,s=c;continue}if(c=l+16|0,f=n[c>>2]|0,f)l=f,s=c;else break}n[s>>2]=0,c=l}else c=n[Q+8>>2]|0,n[c+12>>2]=l,n[l+8>>2]=c,c=l;while(0);do if(d|0){if(l=n[Q+28>>2]|0,s=11436+(l<<2)|0,(Q|0)==(n[s>>2]|0)){if(n[s>>2]=c,!c){n[2784]=k&~(1<>2]|0)!=(Q|0)&1)<<2)>>2]=c,!c)break;n[c+24>>2]=d,l=n[Q+16>>2]|0,l|0&&(n[c+16>>2]=l,n[l+24>>2]=c),l=n[Q+20>>2]|0,l|0&&(n[c+20>>2]=l,n[l+24>>2]=c)}while(0);return m>>>0<16?(qe=m+O|0,n[Q+4>>2]=qe|3,qe=Q+qe+4|0,n[qe>>2]=n[qe>>2]|1):(n[Q+4>>2]=O|3,n[B+4>>2]=m|1,n[B+m>>2]=m,M|0&&(f=n[2788]|0,l=M>>>3,c=11172+(l<<1<<2)|0,l=1<>2]|0):(n[2783]=q|l,l=c,s=c+8|0),n[s>>2]=f,n[l+12>>2]=f,n[f+8>>2]=l,n[f+12>>2]=c),n[2785]=m,n[2788]=B),qe=Q+8|0,C=Lt,qe|0}else q=O}else q=O}else q=O}else if(s>>>0<=4294967231)if(s=s+11|0,O=s&-8,Q=n[2784]|0,Q){f=0-O|0,s=s>>>8,s?O>>>0>16777215?k=31:(q=(s+1048320|0)>>>16&8,Ue=s<>>16&4,Ue=Ue<>>16&2,k=14-(M|q|k)+(Ue<>>15)|0,k=O>>>(k+7|0)&1|k<<1):k=0,c=n[11436+(k<<2)>>2]|0;e:do if(!c)c=0,s=0,Ue=57;else for(s=0,B=O<<((k|0)==31?0:25-(k>>>1)|0),m=0;;){if(d=(n[c+4>>2]&-8)-O|0,d>>>0>>0)if(d)s=c,f=d;else{s=c,f=0,d=c,Ue=61;break e}if(d=n[c+20>>2]|0,c=n[c+16+(B>>>31<<2)>>2]|0,m=(d|0)==0|(d|0)==(c|0)?m:d,d=(c|0)==0,d){c=m,Ue=57;break}else B=B<<((d^1)&1)}while(0);if((Ue|0)==57){if((c|0)==0&(s|0)==0){if(s=2<>>12&16,q=q>>>B,m=q>>>5&8,q=q>>>m,k=q>>>2&4,q=q>>>k,M=q>>>1&2,q=q>>>M,c=q>>>1&1,s=0,c=n[11436+((m|B|k|M|c)+(q>>>c)<<2)>>2]|0}c?(d=c,Ue=61):(k=s,B=f)}if((Ue|0)==61)for(;;)if(Ue=0,c=(n[d+4>>2]&-8)-O|0,q=c>>>0>>0,c=q?c:f,s=q?d:s,d=n[d+16+(((n[d+16>>2]|0)==0&1)<<2)>>2]|0,d)f=c,Ue=61;else{k=s,B=c;break}if((k|0)!=0&&B>>>0<((n[2785]|0)-O|0)>>>0){if(m=k+O|0,k>>>0>=m>>>0)return qe=0,C=Lt,qe|0;d=n[k+24>>2]|0,l=n[k+12>>2]|0;do if((l|0)==(k|0)){if(s=k+20|0,l=n[s>>2]|0,!l&&(s=k+16|0,l=n[s>>2]|0,!l)){l=0;break}for(;;){if(c=l+20|0,f=n[c>>2]|0,f|0){l=f,s=c;continue}if(c=l+16|0,f=n[c>>2]|0,f)l=f,s=c;else break}n[s>>2]=0}else qe=n[k+8>>2]|0,n[qe+12>>2]=l,n[l+8>>2]=qe;while(0);do if(d){if(s=n[k+28>>2]|0,c=11436+(s<<2)|0,(k|0)==(n[c>>2]|0)){if(n[c>>2]=l,!l){f=Q&~(1<>2]|0)!=(k|0)&1)<<2)>>2]=l,!l){f=Q;break}n[l+24>>2]=d,s=n[k+16>>2]|0,s|0&&(n[l+16>>2]=s,n[s+24>>2]=l),s=n[k+20>>2]|0,s&&(n[l+20>>2]=s,n[s+24>>2]=l),f=Q}else f=Q;while(0);do if(B>>>0>=16){if(n[k+4>>2]=O|3,n[m+4>>2]=B|1,n[m+B>>2]=B,l=B>>>3,B>>>0<256){c=11172+(l<<1<<2)|0,s=n[2783]|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=m,n[l+12>>2]=m,n[m+8>>2]=l,n[m+12>>2]=c;break}if(l=B>>>8,l?B>>>0>16777215?l=31:(Ue=(l+1048320|0)>>>16&8,qe=l<>>16&4,qe=qe<>>16&2,l=14-(at|Ue|l)+(qe<>>15)|0,l=B>>>(l+7|0)&1|l<<1):l=0,c=11436+(l<<2)|0,n[m+28>>2]=l,s=m+16|0,n[s+4>>2]=0,n[s>>2]=0,s=1<>2]=m,n[m+24>>2]=c,n[m+12>>2]=m,n[m+8>>2]=m;break}for(s=B<<((l|0)==31?0:25-(l>>>1)|0),c=n[c>>2]|0;;){if((n[c+4>>2]&-8|0)==(B|0)){Ue=97;break}if(f=c+16+(s>>>31<<2)|0,l=n[f>>2]|0,l)s=s<<1,c=l;else{Ue=96;break}}if((Ue|0)==96){n[f>>2]=m,n[m+24>>2]=c,n[m+12>>2]=m,n[m+8>>2]=m;break}else if((Ue|0)==97){Ue=c+8|0,qe=n[Ue>>2]|0,n[qe+12>>2]=m,n[Ue>>2]=m,n[m+8>>2]=qe,n[m+12>>2]=c,n[m+24>>2]=0;break}}else qe=B+O|0,n[k+4>>2]=qe|3,qe=k+qe+4|0,n[qe>>2]=n[qe>>2]|1;while(0);return qe=k+8|0,C=Lt,qe|0}else q=O}else q=O;else q=-1;while(0);if(c=n[2785]|0,c>>>0>=q>>>0)return l=c-q|0,s=n[2788]|0,l>>>0>15?(qe=s+q|0,n[2788]=qe,n[2785]=l,n[qe+4>>2]=l|1,n[qe+l>>2]=l,n[s+4>>2]=q|3):(n[2785]=0,n[2788]=0,n[s+4>>2]=c|3,qe=s+c+4|0,n[qe>>2]=n[qe>>2]|1),qe=s+8|0,C=Lt,qe|0;if(B=n[2786]|0,B>>>0>q>>>0)return at=B-q|0,n[2786]=at,qe=n[2789]|0,Ue=qe+q|0,n[2789]=Ue,n[Ue+4>>2]=at|1,n[qe+4>>2]=q|3,qe=qe+8|0,C=Lt,qe|0;if(n[2901]|0?s=n[2903]|0:(n[2903]=4096,n[2902]=4096,n[2904]=-1,n[2905]=-1,n[2906]=0,n[2894]=0,s=se&-16^1431655768,n[se>>2]=s,n[2901]=s,s=4096),k=q+48|0,Q=q+47|0,m=s+Q|0,d=0-s|0,O=m&d,O>>>0<=q>>>0||(s=n[2893]|0,s|0&&(M=n[2891]|0,se=M+O|0,se>>>0<=M>>>0|se>>>0>s>>>0)))return qe=0,C=Lt,qe|0;e:do if(n[2894]&4)l=0,Ue=133;else{c=n[2789]|0;t:do if(c){for(f=11580;s=n[f>>2]|0,!(s>>>0<=c>>>0&&(Fe=f+4|0,(s+(n[Fe>>2]|0)|0)>>>0>c>>>0));)if(s=n[f+8>>2]|0,s)f=s;else{Ue=118;break t}if(l=m-B&d,l>>>0<2147483647)if(s=kp(l|0)|0,(s|0)==((n[f>>2]|0)+(n[Fe>>2]|0)|0)){if((s|0)!=-1){B=l,m=s,Ue=135;break e}}else f=s,Ue=126;else l=0}else Ue=118;while(0);do if((Ue|0)==118)if(c=kp(0)|0,(c|0)!=-1&&(l=c,Ge=n[2902]|0,Oe=Ge+-1|0,l=((Oe&l|0)==0?0:(Oe+l&0-Ge)-l|0)+O|0,Ge=n[2891]|0,Oe=l+Ge|0,l>>>0>q>>>0&l>>>0<2147483647)){if(Fe=n[2893]|0,Fe|0&&Oe>>>0<=Ge>>>0|Oe>>>0>Fe>>>0){l=0;break}if(s=kp(l|0)|0,(s|0)==(c|0)){B=l,m=c,Ue=135;break e}else f=s,Ue=126}else l=0;while(0);do if((Ue|0)==126){if(c=0-l|0,!(k>>>0>l>>>0&(l>>>0<2147483647&(f|0)!=-1)))if((f|0)==-1){l=0;break}else{B=l,m=f,Ue=135;break e}if(s=n[2903]|0,s=Q-l+s&0-s,s>>>0>=2147483647){B=l,m=f,Ue=135;break e}if((kp(s|0)|0)==-1){kp(c|0)|0,l=0;break}else{B=s+l|0,m=f,Ue=135;break e}}while(0);n[2894]=n[2894]|4,Ue=133}while(0);if((Ue|0)==133&&O>>>0<2147483647&&(at=kp(O|0)|0,Fe=kp(0)|0,et=Fe-at|0,Xe=et>>>0>(q+40|0)>>>0,!((at|0)==-1|Xe^1|at>>>0>>0&((at|0)!=-1&(Fe|0)!=-1)^1))&&(B=Xe?et:l,m=at,Ue=135),(Ue|0)==135){l=(n[2891]|0)+B|0,n[2891]=l,l>>>0>(n[2892]|0)>>>0&&(n[2892]=l),Q=n[2789]|0;do if(Q){for(l=11580;;){if(s=n[l>>2]|0,c=l+4|0,f=n[c>>2]|0,(m|0)==(s+f|0)){Ue=145;break}if(d=n[l+8>>2]|0,d)l=d;else break}if((Ue|0)==145&&(n[l+12>>2]&8|0)==0&&Q>>>0>>0&Q>>>0>=s>>>0){n[c>>2]=f+B,qe=Q+8|0,qe=(qe&7|0)==0?0:0-qe&7,Ue=Q+qe|0,qe=(n[2786]|0)+(B-qe)|0,n[2789]=Ue,n[2786]=qe,n[Ue+4>>2]=qe|1,n[Ue+qe+4>>2]=40,n[2790]=n[2905];break}for(m>>>0<(n[2787]|0)>>>0&&(n[2787]=m),c=m+B|0,l=11580;;){if((n[l>>2]|0)==(c|0)){Ue=153;break}if(s=n[l+8>>2]|0,s)l=s;else break}if((Ue|0)==153&&(n[l+12>>2]&8|0)==0){n[l>>2]=m,M=l+4|0,n[M>>2]=(n[M>>2]|0)+B,M=m+8|0,M=m+((M&7|0)==0?0:0-M&7)|0,l=c+8|0,l=c+((l&7|0)==0?0:0-l&7)|0,O=M+q|0,k=l-M-q|0,n[M+4>>2]=q|3;do if((l|0)!=(Q|0)){if((l|0)==(n[2788]|0)){qe=(n[2785]|0)+k|0,n[2785]=qe,n[2788]=O,n[O+4>>2]=qe|1,n[O+qe>>2]=qe;break}if(s=n[l+4>>2]|0,(s&3|0)==1){B=s&-8,f=s>>>3;e:do if(s>>>0<256)if(s=n[l+8>>2]|0,c=n[l+12>>2]|0,(c|0)==(s|0)){n[2783]=n[2783]&~(1<>2]=c,n[c+8>>2]=s;break}else{m=n[l+24>>2]|0,s=n[l+12>>2]|0;do if((s|0)==(l|0)){if(f=l+16|0,c=f+4|0,s=n[c>>2]|0,!s)if(s=n[f>>2]|0,s)c=f;else{s=0;break}for(;;){if(f=s+20|0,d=n[f>>2]|0,d|0){s=d,c=f;continue}if(f=s+16|0,d=n[f>>2]|0,d)s=d,c=f;else break}n[c>>2]=0}else qe=n[l+8>>2]|0,n[qe+12>>2]=s,n[s+8>>2]=qe;while(0);if(!m)break;c=n[l+28>>2]|0,f=11436+(c<<2)|0;do if((l|0)!=(n[f>>2]|0)){if(n[m+16+(((n[m+16>>2]|0)!=(l|0)&1)<<2)>>2]=s,!s)break e}else{if(n[f>>2]=s,s|0)break;n[2784]=n[2784]&~(1<>2]=m,c=l+16|0,f=n[c>>2]|0,f|0&&(n[s+16>>2]=f,n[f+24>>2]=s),c=n[c+4>>2]|0,!c)break;n[s+20>>2]=c,n[c+24>>2]=s}while(0);l=l+B|0,d=B+k|0}else d=k;if(l=l+4|0,n[l>>2]=n[l>>2]&-2,n[O+4>>2]=d|1,n[O+d>>2]=d,l=d>>>3,d>>>0<256){c=11172+(l<<1<<2)|0,s=n[2783]|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=O,n[l+12>>2]=O,n[O+8>>2]=l,n[O+12>>2]=c;break}l=d>>>8;do if(!l)l=0;else{if(d>>>0>16777215){l=31;break}Ue=(l+1048320|0)>>>16&8,qe=l<>>16&4,qe=qe<>>16&2,l=14-(at|Ue|l)+(qe<>>15)|0,l=d>>>(l+7|0)&1|l<<1}while(0);if(f=11436+(l<<2)|0,n[O+28>>2]=l,s=O+16|0,n[s+4>>2]=0,n[s>>2]=0,s=n[2784]|0,c=1<>2]=O,n[O+24>>2]=f,n[O+12>>2]=O,n[O+8>>2]=O;break}for(s=d<<((l|0)==31?0:25-(l>>>1)|0),c=n[f>>2]|0;;){if((n[c+4>>2]&-8|0)==(d|0)){Ue=194;break}if(f=c+16+(s>>>31<<2)|0,l=n[f>>2]|0,l)s=s<<1,c=l;else{Ue=193;break}}if((Ue|0)==193){n[f>>2]=O,n[O+24>>2]=c,n[O+12>>2]=O,n[O+8>>2]=O;break}else if((Ue|0)==194){Ue=c+8|0,qe=n[Ue>>2]|0,n[qe+12>>2]=O,n[Ue>>2]=O,n[O+8>>2]=qe,n[O+12>>2]=c,n[O+24>>2]=0;break}}else qe=(n[2786]|0)+k|0,n[2786]=qe,n[2789]=O,n[O+4>>2]=qe|1;while(0);return qe=M+8|0,C=Lt,qe|0}for(l=11580;s=n[l>>2]|0,!(s>>>0<=Q>>>0&&(qe=s+(n[l+4>>2]|0)|0,qe>>>0>Q>>>0));)l=n[l+8>>2]|0;d=qe+-47|0,s=d+8|0,s=d+((s&7|0)==0?0:0-s&7)|0,d=Q+16|0,s=s>>>0>>0?Q:s,l=s+8|0,c=m+8|0,c=(c&7|0)==0?0:0-c&7,Ue=m+c|0,c=B+-40-c|0,n[2789]=Ue,n[2786]=c,n[Ue+4>>2]=c|1,n[Ue+c+4>>2]=40,n[2790]=n[2905],c=s+4|0,n[c>>2]=27,n[l>>2]=n[2895],n[l+4>>2]=n[2896],n[l+8>>2]=n[2897],n[l+12>>2]=n[2898],n[2895]=m,n[2896]=B,n[2898]=0,n[2897]=l,l=s+24|0;do Ue=l,l=l+4|0,n[l>>2]=7;while((Ue+8|0)>>>0>>0);if((s|0)!=(Q|0)){if(m=s-Q|0,n[c>>2]=n[c>>2]&-2,n[Q+4>>2]=m|1,n[s>>2]=m,l=m>>>3,m>>>0<256){c=11172+(l<<1<<2)|0,s=n[2783]|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=Q,n[l+12>>2]=Q,n[Q+8>>2]=l,n[Q+12>>2]=c;break}if(l=m>>>8,l?m>>>0>16777215?c=31:(Ue=(l+1048320|0)>>>16&8,qe=l<>>16&4,qe=qe<>>16&2,c=14-(at|Ue|c)+(qe<>>15)|0,c=m>>>(c+7|0)&1|c<<1):c=0,f=11436+(c<<2)|0,n[Q+28>>2]=c,n[Q+20>>2]=0,n[d>>2]=0,l=n[2784]|0,s=1<>2]=Q,n[Q+24>>2]=f,n[Q+12>>2]=Q,n[Q+8>>2]=Q;break}for(s=m<<((c|0)==31?0:25-(c>>>1)|0),c=n[f>>2]|0;;){if((n[c+4>>2]&-8|0)==(m|0)){Ue=216;break}if(f=c+16+(s>>>31<<2)|0,l=n[f>>2]|0,l)s=s<<1,c=l;else{Ue=215;break}}if((Ue|0)==215){n[f>>2]=Q,n[Q+24>>2]=c,n[Q+12>>2]=Q,n[Q+8>>2]=Q;break}else if((Ue|0)==216){Ue=c+8|0,qe=n[Ue>>2]|0,n[qe+12>>2]=Q,n[Ue>>2]=Q,n[Q+8>>2]=qe,n[Q+12>>2]=c,n[Q+24>>2]=0;break}}}else{qe=n[2787]|0,(qe|0)==0|m>>>0>>0&&(n[2787]=m),n[2895]=m,n[2896]=B,n[2898]=0,n[2792]=n[2901],n[2791]=-1,l=0;do qe=11172+(l<<1<<2)|0,n[qe+12>>2]=qe,n[qe+8>>2]=qe,l=l+1|0;while((l|0)!=32);qe=m+8|0,qe=(qe&7|0)==0?0:0-qe&7,Ue=m+qe|0,qe=B+-40-qe|0,n[2789]=Ue,n[2786]=qe,n[Ue+4>>2]=qe|1,n[Ue+qe+4>>2]=40,n[2790]=n[2905]}while(0);if(l=n[2786]|0,l>>>0>q>>>0)return at=l-q|0,n[2786]=at,qe=n[2789]|0,Ue=qe+q|0,n[2789]=Ue,n[Ue+4>>2]=at|1,n[qe+4>>2]=q|3,qe=qe+8|0,C=Lt,qe|0}return n[(Vm()|0)>>2]=12,qe=0,C=Lt,qe|0}function hD(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,Q=0;if(!!s){c=s+-8|0,d=n[2787]|0,s=n[s+-4>>2]|0,l=s&-8,Q=c+l|0;do if(s&1)k=c,B=c;else{if(f=n[c>>2]|0,!(s&3)||(B=c+(0-f)|0,m=f+l|0,B>>>0>>0))return;if((B|0)==(n[2788]|0)){if(s=Q+4|0,l=n[s>>2]|0,(l&3|0)!=3){k=B,l=m;break}n[2785]=m,n[s>>2]=l&-2,n[B+4>>2]=m|1,n[B+m>>2]=m;return}if(c=f>>>3,f>>>0<256)if(s=n[B+8>>2]|0,l=n[B+12>>2]|0,(l|0)==(s|0)){n[2783]=n[2783]&~(1<>2]=l,n[l+8>>2]=s,k=B,l=m;break}d=n[B+24>>2]|0,s=n[B+12>>2]|0;do if((s|0)==(B|0)){if(c=B+16|0,l=c+4|0,s=n[l>>2]|0,!s)if(s=n[c>>2]|0,s)l=c;else{s=0;break}for(;;){if(c=s+20|0,f=n[c>>2]|0,f|0){s=f,l=c;continue}if(c=s+16|0,f=n[c>>2]|0,f)s=f,l=c;else break}n[l>>2]=0}else k=n[B+8>>2]|0,n[k+12>>2]=s,n[s+8>>2]=k;while(0);if(d){if(l=n[B+28>>2]|0,c=11436+(l<<2)|0,(B|0)==(n[c>>2]|0)){if(n[c>>2]=s,!s){n[2784]=n[2784]&~(1<>2]|0)!=(B|0)&1)<<2)>>2]=s,!s){k=B,l=m;break}n[s+24>>2]=d,l=B+16|0,c=n[l>>2]|0,c|0&&(n[s+16>>2]=c,n[c+24>>2]=s),l=n[l+4>>2]|0,l?(n[s+20>>2]=l,n[l+24>>2]=s,k=B,l=m):(k=B,l=m)}else k=B,l=m}while(0);if(!(B>>>0>=Q>>>0)&&(s=Q+4|0,f=n[s>>2]|0,!!(f&1))){if(f&2)n[s>>2]=f&-2,n[k+4>>2]=l|1,n[B+l>>2]=l,d=l;else{if(s=n[2788]|0,(Q|0)==(n[2789]|0)){if(Q=(n[2786]|0)+l|0,n[2786]=Q,n[2789]=k,n[k+4>>2]=Q|1,(k|0)!=(s|0))return;n[2788]=0,n[2785]=0;return}if((Q|0)==(s|0)){Q=(n[2785]|0)+l|0,n[2785]=Q,n[2788]=B,n[k+4>>2]=Q|1,n[B+Q>>2]=Q;return}d=(f&-8)+l|0,c=f>>>3;do if(f>>>0<256)if(l=n[Q+8>>2]|0,s=n[Q+12>>2]|0,(s|0)==(l|0)){n[2783]=n[2783]&~(1<>2]=s,n[s+8>>2]=l;break}else{m=n[Q+24>>2]|0,s=n[Q+12>>2]|0;do if((s|0)==(Q|0)){if(c=Q+16|0,l=c+4|0,s=n[l>>2]|0,!s)if(s=n[c>>2]|0,s)l=c;else{c=0;break}for(;;){if(c=s+20|0,f=n[c>>2]|0,f|0){s=f,l=c;continue}if(c=s+16|0,f=n[c>>2]|0,f)s=f,l=c;else break}n[l>>2]=0,c=s}else c=n[Q+8>>2]|0,n[c+12>>2]=s,n[s+8>>2]=c,c=s;while(0);if(m|0){if(s=n[Q+28>>2]|0,l=11436+(s<<2)|0,(Q|0)==(n[l>>2]|0)){if(n[l>>2]=c,!c){n[2784]=n[2784]&~(1<>2]|0)!=(Q|0)&1)<<2)>>2]=c,!c)break;n[c+24>>2]=m,s=Q+16|0,l=n[s>>2]|0,l|0&&(n[c+16>>2]=l,n[l+24>>2]=c),s=n[s+4>>2]|0,s|0&&(n[c+20>>2]=s,n[s+24>>2]=c)}}while(0);if(n[k+4>>2]=d|1,n[B+d>>2]=d,(k|0)==(n[2788]|0)){n[2785]=d;return}}if(s=d>>>3,d>>>0<256){c=11172+(s<<1<<2)|0,l=n[2783]|0,s=1<>2]|0):(n[2783]=l|s,s=c,l=c+8|0),n[l>>2]=k,n[s+12>>2]=k,n[k+8>>2]=s,n[k+12>>2]=c;return}s=d>>>8,s?d>>>0>16777215?s=31:(B=(s+1048320|0)>>>16&8,Q=s<>>16&4,Q=Q<>>16&2,s=14-(m|B|s)+(Q<>>15)|0,s=d>>>(s+7|0)&1|s<<1):s=0,f=11436+(s<<2)|0,n[k+28>>2]=s,n[k+20>>2]=0,n[k+16>>2]=0,l=n[2784]|0,c=1<>>1)|0),c=n[f>>2]|0;;){if((n[c+4>>2]&-8|0)==(d|0)){s=73;break}if(f=c+16+(l>>>31<<2)|0,s=n[f>>2]|0,s)l=l<<1,c=s;else{s=72;break}}if((s|0)==72){n[f>>2]=k,n[k+24>>2]=c,n[k+12>>2]=k,n[k+8>>2]=k;break}else if((s|0)==73){B=c+8|0,Q=n[B>>2]|0,n[Q+12>>2]=k,n[B>>2]=k,n[k+8>>2]=Q,n[k+12>>2]=c,n[k+24>>2]=0;break}}else n[2784]=l|c,n[f>>2]=k,n[k+24>>2]=f,n[k+12>>2]=k,n[k+8>>2]=k;while(0);if(Q=(n[2791]|0)+-1|0,n[2791]=Q,!Q)s=11588;else return;for(;s=n[s>>2]|0,s;)s=s+8|0;n[2791]=-1}}}function kUe(){return 11628}function QUe(s){s=s|0;var l=0,c=0;return l=C,C=C+16|0,c=l,n[c>>2]=RUe(n[s+60>>2]|0)|0,s=gD(hc(6,c|0)|0)|0,C=l,s|0}function s7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0,Ge=0;q=C,C=C+48|0,O=q+16|0,m=q,d=q+32|0,k=s+28|0,f=n[k>>2]|0,n[d>>2]=f,Q=s+20|0,f=(n[Q>>2]|0)-f|0,n[d+4>>2]=f,n[d+8>>2]=l,n[d+12>>2]=c,f=f+c|0,B=s+60|0,n[m>>2]=n[B>>2],n[m+4>>2]=d,n[m+8>>2]=2,m=gD(Li(146,m|0)|0)|0;e:do if((f|0)!=(m|0)){for(l=2;!((m|0)<0);)if(f=f-m|0,Ge=n[d+4>>2]|0,se=m>>>0>Ge>>>0,d=se?d+8|0:d,l=(se<<31>>31)+l|0,Ge=m-(se?Ge:0)|0,n[d>>2]=(n[d>>2]|0)+Ge,se=d+4|0,n[se>>2]=(n[se>>2]|0)-Ge,n[O>>2]=n[B>>2],n[O+4>>2]=d,n[O+8>>2]=l,m=gD(Li(146,O|0)|0)|0,(f|0)==(m|0)){M=3;break e}n[s+16>>2]=0,n[k>>2]=0,n[Q>>2]=0,n[s>>2]=n[s>>2]|32,(l|0)==2?c=0:c=c-(n[d+4>>2]|0)|0}else M=3;while(0);return(M|0)==3&&(Ge=n[s+44>>2]|0,n[s+16>>2]=Ge+(n[s+48>>2]|0),n[k>>2]=Ge,n[Q>>2]=Ge),C=q,c|0}function FUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;return d=C,C=C+32|0,m=d,f=d+20|0,n[m>>2]=n[s+60>>2],n[m+4>>2]=0,n[m+8>>2]=l,n[m+12>>2]=f,n[m+16>>2]=c,(gD(sa(140,m|0)|0)|0)<0?(n[f>>2]=-1,s=-1):s=n[f>>2]|0,C=d,s|0}function gD(s){return s=s|0,s>>>0>4294963200&&(n[(Vm()|0)>>2]=0-s,s=-1),s|0}function Vm(){return(TUe()|0)+64|0}function TUe(){return xT()|0}function xT(){return 2084}function RUe(s){return s=s|0,s|0}function NUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;return d=C,C=C+32|0,f=d,n[s+36>>2]=1,(n[s>>2]&64|0)==0&&(n[f>>2]=n[s+60>>2],n[f+4>>2]=21523,n[f+8>>2]=d+16,fu(54,f|0)|0)&&(o[s+75>>0]=-1),f=s7(s,l,c)|0,C=d,f|0}function o7(s,l){s=s|0,l=l|0;var c=0,f=0;if(c=o[s>>0]|0,f=o[l>>0]|0,c<<24>>24==0||c<<24>>24!=f<<24>>24)s=f;else{do s=s+1|0,l=l+1|0,c=o[s>>0]|0,f=o[l>>0]|0;while(!(c<<24>>24==0||c<<24>>24!=f<<24>>24));s=f}return(c&255)-(s&255)|0}function LUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;e:do if(!c)s=0;else{for(;f=o[s>>0]|0,d=o[l>>0]|0,f<<24>>24==d<<24>>24;)if(c=c+-1|0,c)s=s+1|0,l=l+1|0;else{s=0;break e}s=(f&255)-(d&255)|0}while(0);return s|0}function a7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0,Ge=0,Oe=0,Fe=0;Fe=C,C=C+224|0,M=Fe+120|0,q=Fe+80|0,Ge=Fe,Oe=Fe+136|0,f=q,d=f+40|0;do n[f>>2]=0,f=f+4|0;while((f|0)<(d|0));return n[M>>2]=n[c>>2],(bT(0,l,M,Ge,q)|0)<0?c=-1:((n[s+76>>2]|0)>-1?se=MUe(s)|0:se=0,c=n[s>>2]|0,O=c&32,(o[s+74>>0]|0)<1&&(n[s>>2]=c&-33),f=s+48|0,n[f>>2]|0?c=bT(s,l,M,Ge,q)|0:(d=s+44|0,m=n[d>>2]|0,n[d>>2]=Oe,B=s+28|0,n[B>>2]=Oe,k=s+20|0,n[k>>2]=Oe,n[f>>2]=80,Q=s+16|0,n[Q>>2]=Oe+80,c=bT(s,l,M,Ge,q)|0,m&&(ED[n[s+36>>2]&7](s,0,0)|0,c=(n[k>>2]|0)==0?-1:c,n[d>>2]=m,n[f>>2]=0,n[Q>>2]=0,n[B>>2]=0,n[k>>2]=0)),f=n[s>>2]|0,n[s>>2]=f|O,se|0&&OUe(s),c=(f&32|0)==0?c:-1),C=Fe,c|0}function bT(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0,Ge=0,Oe=0,Fe=0,et=0,Xe=0,at=0,Ue=0,qe=0,Lt=0,Or=0,or=0,Xt=0,Pr=0,Nr=0,ir=0;ir=C,C=C+64|0,or=ir+16|0,Xt=ir,Lt=ir+24|0,Pr=ir+8|0,Nr=ir+20|0,n[or>>2]=l,at=(s|0)!=0,Ue=Lt+40|0,qe=Ue,Lt=Lt+39|0,Or=Pr+4|0,B=0,m=0,M=0;e:for(;;){do if((m|0)>-1)if((B|0)>(2147483647-m|0)){n[(Vm()|0)>>2]=75,m=-1;break}else{m=B+m|0;break}while(0);if(B=o[l>>0]|0,B<<24>>24)k=l;else{Xe=87;break}t:for(;;){switch(B<<24>>24){case 37:{B=k,Xe=9;break t}case 0:{B=k;break t}default:}et=k+1|0,n[or>>2]=et,B=o[et>>0]|0,k=et}t:do if((Xe|0)==9)for(;;){if(Xe=0,(o[k+1>>0]|0)!=37)break t;if(B=B+1|0,k=k+2|0,n[or>>2]=k,(o[k>>0]|0)==37)Xe=9;else break}while(0);if(B=B-l|0,at&&ss(s,l,B),B|0){l=k;continue}Q=k+1|0,B=(o[Q>>0]|0)+-48|0,B>>>0<10?(et=(o[k+2>>0]|0)==36,Fe=et?B:-1,M=et?1:M,Q=et?k+3|0:Q):Fe=-1,n[or>>2]=Q,B=o[Q>>0]|0,k=(B<<24>>24)+-32|0;t:do if(k>>>0<32)for(O=0,q=B;;){if(B=1<>2]=Q,B=o[Q>>0]|0,k=(B<<24>>24)+-32|0,k>>>0>=32)break;q=B}else O=0;while(0);if(B<<24>>24==42){if(k=Q+1|0,B=(o[k>>0]|0)+-48|0,B>>>0<10&&(o[Q+2>>0]|0)==36)n[d+(B<<2)>>2]=10,B=n[f+((o[k>>0]|0)+-48<<3)>>2]|0,M=1,Q=Q+3|0;else{if(M|0){m=-1;break}at?(M=(n[c>>2]|0)+(4-1)&~(4-1),B=n[M>>2]|0,n[c>>2]=M+4,M=0,Q=k):(B=0,M=0,Q=k)}n[or>>2]=Q,et=(B|0)<0,B=et?0-B|0:B,O=et?O|8192:O}else{if(B=l7(or)|0,(B|0)<0){m=-1;break}Q=n[or>>2]|0}do if((o[Q>>0]|0)==46){if((o[Q+1>>0]|0)!=42){n[or>>2]=Q+1,k=l7(or)|0,Q=n[or>>2]|0;break}if(q=Q+2|0,k=(o[q>>0]|0)+-48|0,k>>>0<10&&(o[Q+3>>0]|0)==36){n[d+(k<<2)>>2]=10,k=n[f+((o[q>>0]|0)+-48<<3)>>2]|0,Q=Q+4|0,n[or>>2]=Q;break}if(M|0){m=-1;break e}at?(et=(n[c>>2]|0)+(4-1)&~(4-1),k=n[et>>2]|0,n[c>>2]=et+4):k=0,n[or>>2]=q,Q=q}else k=-1;while(0);for(Oe=0;;){if(((o[Q>>0]|0)+-65|0)>>>0>57){m=-1;break e}if(et=Q+1|0,n[or>>2]=et,q=o[(o[Q>>0]|0)+-65+(5178+(Oe*58|0))>>0]|0,se=q&255,(se+-1|0)>>>0<8)Oe=se,Q=et;else break}if(!(q<<24>>24)){m=-1;break}Ge=(Fe|0)>-1;do if(q<<24>>24==19)if(Ge){m=-1;break e}else Xe=49;else{if(Ge){n[d+(Fe<<2)>>2]=se,Ge=f+(Fe<<3)|0,Fe=n[Ge+4>>2]|0,Xe=Xt,n[Xe>>2]=n[Ge>>2],n[Xe+4>>2]=Fe,Xe=49;break}if(!at){m=0;break e}c7(Xt,se,c)}while(0);if((Xe|0)==49&&(Xe=0,!at)){B=0,l=et;continue}Q=o[Q>>0]|0,Q=(Oe|0)!=0&(Q&15|0)==3?Q&-33:Q,Ge=O&-65537,Fe=(O&8192|0)==0?O:Ge;t:do switch(Q|0){case 110:switch((Oe&255)<<24>>24){case 0:{n[n[Xt>>2]>>2]=m,B=0,l=et;continue e}case 1:{n[n[Xt>>2]>>2]=m,B=0,l=et;continue e}case 2:{B=n[Xt>>2]|0,n[B>>2]=m,n[B+4>>2]=((m|0)<0)<<31>>31,B=0,l=et;continue e}case 3:{a[n[Xt>>2]>>1]=m,B=0,l=et;continue e}case 4:{o[n[Xt>>2]>>0]=m,B=0,l=et;continue e}case 6:{n[n[Xt>>2]>>2]=m,B=0,l=et;continue e}case 7:{B=n[Xt>>2]|0,n[B>>2]=m,n[B+4>>2]=((m|0)<0)<<31>>31,B=0,l=et;continue e}default:{B=0,l=et;continue e}}case 112:{Q=120,k=k>>>0>8?k:8,l=Fe|8,Xe=61;break}case 88:case 120:{l=Fe,Xe=61;break}case 111:{Q=Xt,l=n[Q>>2]|0,Q=n[Q+4>>2]|0,se=_Ue(l,Q,Ue)|0,Ge=qe-se|0,O=0,q=5642,k=(Fe&8|0)==0|(k|0)>(Ge|0)?k:Ge+1|0,Ge=Fe,Xe=67;break}case 105:case 100:if(Q=Xt,l=n[Q>>2]|0,Q=n[Q+4>>2]|0,(Q|0)<0){l=dD(0,0,l|0,Q|0)|0,Q=De,O=Xt,n[O>>2]=l,n[O+4>>2]=Q,O=1,q=5642,Xe=66;break t}else{O=(Fe&2049|0)!=0&1,q=(Fe&2048|0)==0?(Fe&1|0)==0?5642:5644:5643,Xe=66;break t}case 117:{Q=Xt,O=0,q=5642,l=n[Q>>2]|0,Q=n[Q+4>>2]|0,Xe=66;break}case 99:{o[Lt>>0]=n[Xt>>2],l=Lt,O=0,q=5642,se=Ue,Q=1,k=Ge;break}case 109:{Q=HUe(n[(Vm()|0)>>2]|0)|0,Xe=71;break}case 115:{Q=n[Xt>>2]|0,Q=Q|0?Q:5652,Xe=71;break}case 67:{n[Pr>>2]=n[Xt>>2],n[Or>>2]=0,n[Xt>>2]=Pr,se=-1,Q=Pr,Xe=75;break}case 83:{l=n[Xt>>2]|0,k?(se=k,Q=l,Xe=75):(Bs(s,32,B,0,Fe),l=0,Xe=84);break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{B=qUe(s,+E[Xt>>3],B,k,Fe,Q)|0,l=et;continue e}default:O=0,q=5642,se=Ue,Q=k,k=Fe}while(0);t:do if((Xe|0)==61)Fe=Xt,Oe=n[Fe>>2]|0,Fe=n[Fe+4>>2]|0,se=UUe(Oe,Fe,Ue,Q&32)|0,q=(l&8|0)==0|(Oe|0)==0&(Fe|0)==0,O=q?0:2,q=q?5642:5642+(Q>>4)|0,Ge=l,l=Oe,Q=Fe,Xe=67;else if((Xe|0)==66)se=Km(l,Q,Ue)|0,Ge=Fe,Xe=67;else if((Xe|0)==71)Xe=0,Fe=jUe(Q,0,k)|0,Oe=(Fe|0)==0,l=Q,O=0,q=5642,se=Oe?Q+k|0:Fe,Q=Oe?k:Fe-Q|0,k=Ge;else if((Xe|0)==75){for(Xe=0,q=Q,l=0,k=0;O=n[q>>2]|0,!(!O||(k=u7(Nr,O)|0,(k|0)<0|k>>>0>(se-l|0)>>>0));)if(l=k+l|0,se>>>0>l>>>0)q=q+4|0;else break;if((k|0)<0){m=-1;break e}if(Bs(s,32,B,l,Fe),!l)l=0,Xe=84;else for(O=0;;){if(k=n[Q>>2]|0,!k){Xe=84;break t}if(k=u7(Nr,k)|0,O=k+O|0,(O|0)>(l|0)){Xe=84;break t}if(ss(s,Nr,k),O>>>0>=l>>>0){Xe=84;break}else Q=Q+4|0}}while(0);if((Xe|0)==67)Xe=0,Q=(l|0)!=0|(Q|0)!=0,Fe=(k|0)!=0|Q,Q=((Q^1)&1)+(qe-se)|0,l=Fe?se:Ue,se=Ue,Q=Fe?(k|0)>(Q|0)?k:Q:k,k=(k|0)>-1?Ge&-65537:Ge;else if((Xe|0)==84){Xe=0,Bs(s,32,B,l,Fe^8192),B=(B|0)>(l|0)?B:l,l=et;continue}Oe=se-l|0,Ge=(Q|0)<(Oe|0)?Oe:Q,Fe=Ge+O|0,B=(B|0)<(Fe|0)?Fe:B,Bs(s,32,B,Fe,k),ss(s,q,O),Bs(s,48,B,Fe,k^65536),Bs(s,48,Ge,Oe,0),ss(s,l,Oe),Bs(s,32,B,Fe,k^8192),l=et}e:do if((Xe|0)==87&&!s)if(!M)m=0;else{for(m=1;l=n[d+(m<<2)>>2]|0,!!l;)if(c7(f+(m<<3)|0,l,c),m=m+1|0,(m|0)>=10){m=1;break e}for(;;){if(n[d+(m<<2)>>2]|0){m=-1;break e}if(m=m+1|0,(m|0)>=10){m=1;break}}}while(0);return C=ir,m|0}function MUe(s){return s=s|0,0}function OUe(s){s=s|0}function ss(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]&32||ZUe(l,c,s)|0}function l7(s){s=s|0;var l=0,c=0,f=0;if(c=n[s>>2]|0,f=(o[c>>0]|0)+-48|0,f>>>0<10){l=0;do l=f+(l*10|0)|0,c=c+1|0,n[s>>2]=c,f=(o[c>>0]|0)+-48|0;while(f>>>0<10)}else l=0;return l|0}function c7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;e:do if(l>>>0<=20)do switch(l|0){case 9:{f=(n[c>>2]|0)+(4-1)&~(4-1),l=n[f>>2]|0,n[c>>2]=f+4,n[s>>2]=l;break e}case 10:{f=(n[c>>2]|0)+(4-1)&~(4-1),l=n[f>>2]|0,n[c>>2]=f+4,f=s,n[f>>2]=l,n[f+4>>2]=((l|0)<0)<<31>>31;break e}case 11:{f=(n[c>>2]|0)+(4-1)&~(4-1),l=n[f>>2]|0,n[c>>2]=f+4,f=s,n[f>>2]=l,n[f+4>>2]=0;break e}case 12:{f=(n[c>>2]|0)+(8-1)&~(8-1),l=f,d=n[l>>2]|0,l=n[l+4>>2]|0,n[c>>2]=f+8,f=s,n[f>>2]=d,n[f+4>>2]=l;break e}case 13:{d=(n[c>>2]|0)+(4-1)&~(4-1),f=n[d>>2]|0,n[c>>2]=d+4,f=(f&65535)<<16>>16,d=s,n[d>>2]=f,n[d+4>>2]=((f|0)<0)<<31>>31;break e}case 14:{d=(n[c>>2]|0)+(4-1)&~(4-1),f=n[d>>2]|0,n[c>>2]=d+4,d=s,n[d>>2]=f&65535,n[d+4>>2]=0;break e}case 15:{d=(n[c>>2]|0)+(4-1)&~(4-1),f=n[d>>2]|0,n[c>>2]=d+4,f=(f&255)<<24>>24,d=s,n[d>>2]=f,n[d+4>>2]=((f|0)<0)<<31>>31;break e}case 16:{d=(n[c>>2]|0)+(4-1)&~(4-1),f=n[d>>2]|0,n[c>>2]=d+4,d=s,n[d>>2]=f&255,n[d+4>>2]=0;break e}case 17:{d=(n[c>>2]|0)+(8-1)&~(8-1),m=+E[d>>3],n[c>>2]=d+8,E[s>>3]=m;break e}case 18:{d=(n[c>>2]|0)+(8-1)&~(8-1),m=+E[d>>3],n[c>>2]=d+8,E[s>>3]=m;break e}default:break e}while(0);while(0)}function UUe(s,l,c,f){if(s=s|0,l=l|0,c=c|0,f=f|0,!((s|0)==0&(l|0)==0))do c=c+-1|0,o[c>>0]=u[5694+(s&15)>>0]|0|f,s=mD(s|0,l|0,4)|0,l=De;while(!((s|0)==0&(l|0)==0));return c|0}function _Ue(s,l,c){if(s=s|0,l=l|0,c=c|0,!((s|0)==0&(l|0)==0))do c=c+-1|0,o[c>>0]=s&7|48,s=mD(s|0,l|0,3)|0,l=De;while(!((s|0)==0&(l|0)==0));return c|0}function Km(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;if(l>>>0>0|(l|0)==0&s>>>0>4294967295){for(;f=TT(s|0,l|0,10,0)|0,c=c+-1|0,o[c>>0]=f&255|48,f=s,s=FT(s|0,l|0,10,0)|0,l>>>0>9|(l|0)==9&f>>>0>4294967295;)l=De;l=s}else l=s;if(l)for(;c=c+-1|0,o[c>>0]=(l>>>0)%10|0|48,!(l>>>0<10);)l=(l>>>0)/10|0;return c|0}function HUe(s){return s=s|0,KUe(s,n[(VUe()|0)+188>>2]|0)|0}function jUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;m=l&255,f=(c|0)!=0;e:do if(f&(s&3|0)!=0)for(d=l&255;;){if((o[s>>0]|0)==d<<24>>24){B=6;break e}if(s=s+1|0,c=c+-1|0,f=(c|0)!=0,!(f&(s&3|0)!=0)){B=5;break}}else B=5;while(0);(B|0)==5&&(f?B=6:c=0);e:do if((B|0)==6&&(d=l&255,(o[s>>0]|0)!=d<<24>>24)){f=He(m,16843009)|0;t:do if(c>>>0>3){for(;m=n[s>>2]^f,!((m&-2139062144^-2139062144)&m+-16843009|0);)if(s=s+4|0,c=c+-4|0,c>>>0<=3){B=11;break t}}else B=11;while(0);if((B|0)==11&&!c){c=0;break}for(;;){if((o[s>>0]|0)==d<<24>>24)break e;if(s=s+1|0,c=c+-1|0,!c){c=0;break}}}while(0);return(c|0?s:0)|0}function Bs(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0;if(B=C,C=C+256|0,m=B,(c|0)>(f|0)&(d&73728|0)==0){if(d=c-f|0,zm(m|0,l|0,(d>>>0<256?d:256)|0)|0,d>>>0>255){l=c-f|0;do ss(s,m,256),d=d+-256|0;while(d>>>0>255);d=l&255}ss(s,m,d)}C=B}function u7(s,l){return s=s|0,l=l|0,s?s=YUe(s,l,0)|0:s=0,s|0}function qUe(s,l,c,f,d,m){s=s|0,l=+l,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,Q=0,O=0,M=0,q=0,se=0,Ge=0,Oe=0,Fe=0,et=0,Xe=0,at=0,Ue=0,qe=0,Lt=0,Or=0,or=0,Xt=0,Pr=0,Nr=0,ir=0,bn=0;bn=C,C=C+560|0,Q=bn+8|0,et=bn,ir=bn+524|0,Nr=ir,O=bn+512|0,n[et>>2]=0,Pr=O+12|0,A7(l)|0,(De|0)<0?(l=-l,or=1,Or=5659):(or=(d&2049|0)!=0&1,Or=(d&2048|0)==0?(d&1|0)==0?5660:5665:5662),A7(l)|0,Xt=De&2146435072;do if(Xt>>>0<2146435072|(Xt|0)==2146435072&0<0){if(Ge=+GUe(l,et)*2,B=Ge!=0,B&&(n[et>>2]=(n[et>>2]|0)+-1),at=m|32,(at|0)==97){Oe=m&32,se=(Oe|0)==0?Or:Or+9|0,q=or|2,B=12-f|0;do if(f>>>0>11|(B|0)==0)l=Ge;else{l=8;do B=B+-1|0,l=l*16;while((B|0)!=0);if((o[se>>0]|0)==45){l=-(l+(-Ge-l));break}else{l=Ge+l-l;break}}while(0);k=n[et>>2]|0,B=(k|0)<0?0-k|0:k,B=Km(B,((B|0)<0)<<31>>31,Pr)|0,(B|0)==(Pr|0)&&(B=O+11|0,o[B>>0]=48),o[B+-1>>0]=(k>>31&2)+43,M=B+-2|0,o[M>>0]=m+15,O=(f|0)<1,Q=(d&8|0)==0,B=ir;do Xt=~~l,k=B+1|0,o[B>>0]=u[5694+Xt>>0]|Oe,l=(l-+(Xt|0))*16,(k-Nr|0)==1&&!(Q&(O&l==0))?(o[k>>0]=46,B=B+2|0):B=k;while(l!=0);Xt=B-Nr|0,Nr=Pr-M|0,Pr=(f|0)!=0&(Xt+-2|0)<(f|0)?f+2|0:Xt,B=Nr+q+Pr|0,Bs(s,32,c,B,d),ss(s,se,q),Bs(s,48,c,B,d^65536),ss(s,ir,Xt),Bs(s,48,Pr-Xt|0,0,0),ss(s,M,Nr),Bs(s,32,c,B,d^8192);break}k=(f|0)<0?6:f,B?(B=(n[et>>2]|0)+-28|0,n[et>>2]=B,l=Ge*268435456):(l=Ge,B=n[et>>2]|0),Xt=(B|0)<0?Q:Q+288|0,Q=Xt;do qe=~~l>>>0,n[Q>>2]=qe,Q=Q+4|0,l=(l-+(qe>>>0))*1e9;while(l!=0);if((B|0)>0)for(O=Xt,q=Q;;){if(M=(B|0)<29?B:29,B=q+-4|0,B>>>0>=O>>>0){Q=0;do Ue=m7(n[B>>2]|0,0,M|0)|0,Ue=QT(Ue|0,De|0,Q|0,0)|0,qe=De,Xe=TT(Ue|0,qe|0,1e9,0)|0,n[B>>2]=Xe,Q=FT(Ue|0,qe|0,1e9,0)|0,B=B+-4|0;while(B>>>0>=O>>>0);Q&&(O=O+-4|0,n[O>>2]=Q)}for(Q=q;!(Q>>>0<=O>>>0);)if(B=Q+-4|0,!(n[B>>2]|0))Q=B;else break;if(B=(n[et>>2]|0)-M|0,n[et>>2]=B,(B|0)>0)q=Q;else break}else O=Xt;if((B|0)<0){f=((k+25|0)/9|0)+1|0,Fe=(at|0)==102;do{if(Oe=0-B|0,Oe=(Oe|0)<9?Oe:9,O>>>0>>0){M=(1<>>Oe,se=0,B=O;do qe=n[B>>2]|0,n[B>>2]=(qe>>>Oe)+se,se=He(qe&M,q)|0,B=B+4|0;while(B>>>0>>0);B=(n[O>>2]|0)==0?O+4|0:O,se?(n[Q>>2]=se,O=B,B=Q+4|0):(O=B,B=Q)}else O=(n[O>>2]|0)==0?O+4|0:O,B=Q;Q=Fe?Xt:O,Q=(B-Q>>2|0)>(f|0)?Q+(f<<2)|0:B,B=(n[et>>2]|0)+Oe|0,n[et>>2]=B}while((B|0)<0);B=O,f=Q}else B=O,f=Q;if(qe=Xt,B>>>0>>0){if(Q=(qe-B>>2)*9|0,M=n[B>>2]|0,M>>>0>=10){O=10;do O=O*10|0,Q=Q+1|0;while(M>>>0>=O>>>0)}}else Q=0;if(Fe=(at|0)==103,Xe=(k|0)!=0,O=k-((at|0)!=102?Q:0)+((Xe&Fe)<<31>>31)|0,(O|0)<(((f-qe>>2)*9|0)+-9|0)){if(O=O+9216|0,Oe=Xt+4+(((O|0)/9|0)+-1024<<2)|0,O=((O|0)%9|0)+1|0,(O|0)<9){M=10;do M=M*10|0,O=O+1|0;while((O|0)!=9)}else M=10;if(q=n[Oe>>2]|0,se=(q>>>0)%(M>>>0)|0,O=(Oe+4|0)==(f|0),O&(se|0)==0)O=Oe;else if(Ge=(((q>>>0)/(M>>>0)|0)&1|0)==0?9007199254740992:9007199254740994,Ue=(M|0)/2|0,l=se>>>0>>0?.5:O&(se|0)==(Ue|0)?1:1.5,or&&(Ue=(o[Or>>0]|0)==45,l=Ue?-l:l,Ge=Ue?-Ge:Ge),O=q-se|0,n[Oe>>2]=O,Ge+l!=Ge){if(Ue=O+M|0,n[Oe>>2]=Ue,Ue>>>0>999999999)for(Q=Oe;O=Q+-4|0,n[Q>>2]=0,O>>>0>>0&&(B=B+-4|0,n[B>>2]=0),Ue=(n[O>>2]|0)+1|0,n[O>>2]=Ue,Ue>>>0>999999999;)Q=O;else O=Oe;if(Q=(qe-B>>2)*9|0,q=n[B>>2]|0,q>>>0>=10){M=10;do M=M*10|0,Q=Q+1|0;while(q>>>0>=M>>>0)}}else O=Oe;O=O+4|0,O=f>>>0>O>>>0?O:f,Ue=B}else O=f,Ue=B;for(at=O;;){if(at>>>0<=Ue>>>0){et=0;break}if(B=at+-4|0,!(n[B>>2]|0))at=B;else{et=1;break}}f=0-Q|0;do if(Fe)if(B=((Xe^1)&1)+k|0,(B|0)>(Q|0)&(Q|0)>-5?(M=m+-1|0,k=B+-1-Q|0):(M=m+-2|0,k=B+-1|0),B=d&8,B)Oe=B;else{if(et&&(Lt=n[at+-4>>2]|0,(Lt|0)!=0))if((Lt>>>0)%10|0)O=0;else{O=0,B=10;do B=B*10|0,O=O+1|0;while(!((Lt>>>0)%(B>>>0)|0|0))}else O=9;if(B=((at-qe>>2)*9|0)+-9|0,(M|32|0)==102){Oe=B-O|0,Oe=(Oe|0)>0?Oe:0,k=(k|0)<(Oe|0)?k:Oe,Oe=0;break}else{Oe=B+Q-O|0,Oe=(Oe|0)>0?Oe:0,k=(k|0)<(Oe|0)?k:Oe,Oe=0;break}}else M=m,Oe=d&8;while(0);if(Fe=k|Oe,q=(Fe|0)!=0&1,se=(M|32|0)==102,se)Xe=0,B=(Q|0)>0?Q:0;else{if(B=(Q|0)<0?f:Q,B=Km(B,((B|0)<0)<<31>>31,Pr)|0,O=Pr,(O-B|0)<2)do B=B+-1|0,o[B>>0]=48;while((O-B|0)<2);o[B+-1>>0]=(Q>>31&2)+43,B=B+-2|0,o[B>>0]=M,Xe=B,B=O-B|0}if(B=or+1+k+q+B|0,Bs(s,32,c,B,d),ss(s,Or,or),Bs(s,48,c,B,d^65536),se){M=Ue>>>0>Xt>>>0?Xt:Ue,Oe=ir+9|0,q=Oe,se=ir+8|0,O=M;do{if(Q=Km(n[O>>2]|0,0,Oe)|0,(O|0)==(M|0))(Q|0)==(Oe|0)&&(o[se>>0]=48,Q=se);else if(Q>>>0>ir>>>0){zm(ir|0,48,Q-Nr|0)|0;do Q=Q+-1|0;while(Q>>>0>ir>>>0)}ss(s,Q,q-Q|0),O=O+4|0}while(O>>>0<=Xt>>>0);if(Fe|0&&ss(s,5710,1),O>>>0>>0&(k|0)>0)for(;;){if(Q=Km(n[O>>2]|0,0,Oe)|0,Q>>>0>ir>>>0){zm(ir|0,48,Q-Nr|0)|0;do Q=Q+-1|0;while(Q>>>0>ir>>>0)}if(ss(s,Q,(k|0)<9?k:9),O=O+4|0,Q=k+-9|0,O>>>0>>0&(k|0)>9)k=Q;else{k=Q;break}}Bs(s,48,k+9|0,9,0)}else{if(Fe=et?at:Ue+4|0,(k|0)>-1){et=ir+9|0,Oe=(Oe|0)==0,f=et,q=0-Nr|0,se=ir+8|0,M=Ue;do{Q=Km(n[M>>2]|0,0,et)|0,(Q|0)==(et|0)&&(o[se>>0]=48,Q=se);do if((M|0)==(Ue|0)){if(O=Q+1|0,ss(s,Q,1),Oe&(k|0)<1){Q=O;break}ss(s,5710,1),Q=O}else{if(Q>>>0<=ir>>>0)break;zm(ir|0,48,Q+q|0)|0;do Q=Q+-1|0;while(Q>>>0>ir>>>0)}while(0);Nr=f-Q|0,ss(s,Q,(k|0)>(Nr|0)?Nr:k),k=k-Nr|0,M=M+4|0}while(M>>>0>>0&(k|0)>-1)}Bs(s,48,k+18|0,18,0),ss(s,Xe,Pr-Xe|0)}Bs(s,32,c,B,d^8192)}else ir=(m&32|0)!=0,B=or+3|0,Bs(s,32,c,B,d&-65537),ss(s,Or,or),ss(s,l!=l|!1?ir?5686:5690:ir?5678:5682,3),Bs(s,32,c,B,d^8192);while(0);return C=bn,((B|0)<(c|0)?c:B)|0}function A7(s){s=+s;var l=0;return E[v>>3]=s,l=n[v>>2]|0,De=n[v+4>>2]|0,l|0}function GUe(s,l){return s=+s,l=l|0,+ +f7(s,l)}function f7(s,l){s=+s,l=l|0;var c=0,f=0,d=0;switch(E[v>>3]=s,c=n[v>>2]|0,f=n[v+4>>2]|0,d=mD(c|0,f|0,52)|0,d&2047){case 0:{s!=0?(s=+f7(s*18446744073709552e3,l),c=(n[l>>2]|0)+-64|0):c=0,n[l>>2]=c;break}case 2047:break;default:n[l>>2]=(d&2047)+-1022,n[v>>2]=c,n[v+4>>2]=f&-2146435073|1071644672,s=+E[v>>3]}return+s}function YUe(s,l,c){s=s|0,l=l|0,c=c|0;do if(s){if(l>>>0<128){o[s>>0]=l,s=1;break}if(!(n[n[(WUe()|0)+188>>2]>>2]|0))if((l&-128|0)==57216){o[s>>0]=l,s=1;break}else{n[(Vm()|0)>>2]=84,s=-1;break}if(l>>>0<2048){o[s>>0]=l>>>6|192,o[s+1>>0]=l&63|128,s=2;break}if(l>>>0<55296|(l&-8192|0)==57344){o[s>>0]=l>>>12|224,o[s+1>>0]=l>>>6&63|128,o[s+2>>0]=l&63|128,s=3;break}if((l+-65536|0)>>>0<1048576){o[s>>0]=l>>>18|240,o[s+1>>0]=l>>>12&63|128,o[s+2>>0]=l>>>6&63|128,o[s+3>>0]=l&63|128,s=4;break}else{n[(Vm()|0)>>2]=84,s=-1;break}}else s=1;while(0);return s|0}function WUe(){return xT()|0}function VUe(){return xT()|0}function KUe(s,l){s=s|0,l=l|0;var c=0,f=0;for(f=0;;){if((u[5712+f>>0]|0)==(s|0)){s=2;break}if(c=f+1|0,(c|0)==87){c=5800,f=87,s=5;break}else f=c}if((s|0)==2&&(f?(c=5800,s=5):c=5800),(s|0)==5)for(;;){do s=c,c=c+1|0;while((o[s>>0]|0)!=0);if(f=f+-1|0,f)s=5;else break}return JUe(c,n[l+20>>2]|0)|0}function JUe(s,l){return s=s|0,l=l|0,zUe(s,l)|0}function zUe(s,l){return s=s|0,l=l|0,l?l=XUe(n[l>>2]|0,n[l+4>>2]|0,s)|0:l=0,(l|0?l:s)|0}function XUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0;se=(n[s>>2]|0)+1794895138|0,m=Fg(n[s+8>>2]|0,se)|0,f=Fg(n[s+12>>2]|0,se)|0,d=Fg(n[s+16>>2]|0,se)|0;e:do if(m>>>0>>2>>>0&&(q=l-(m<<2)|0,f>>>0>>0&d>>>0>>0)&&((d|f)&3|0)==0){for(q=f>>>2,M=d>>>2,O=0;;){if(k=m>>>1,Q=O+k|0,B=Q<<1,d=B+q|0,f=Fg(n[s+(d<<2)>>2]|0,se)|0,d=Fg(n[s+(d+1<<2)>>2]|0,se)|0,!(d>>>0>>0&f>>>0<(l-d|0)>>>0)){f=0;break e}if(o[s+(d+f)>>0]|0){f=0;break e}if(f=o7(c,s+d|0)|0,!f)break;if(f=(f|0)<0,(m|0)==1){f=0;break e}else O=f?O:Q,m=f?k:m-k|0}f=B+M|0,d=Fg(n[s+(f<<2)>>2]|0,se)|0,f=Fg(n[s+(f+1<<2)>>2]|0,se)|0,f>>>0>>0&d>>>0<(l-f|0)>>>0?f=(o[s+(f+d)>>0]|0)==0?s+f|0:0:f=0}else f=0;while(0);return f|0}function Fg(s,l){s=s|0,l=l|0;var c=0;return c=C7(s|0)|0,((l|0)==0?s:c)|0}function ZUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=c+16|0,d=n[f>>2]|0,d?m=5:$Ue(c)|0?f=0:(d=n[f>>2]|0,m=5);e:do if((m|0)==5){if(k=c+20|0,B=n[k>>2]|0,f=B,(d-B|0)>>>0>>0){f=ED[n[c+36>>2]&7](c,s,l)|0;break}t:do if((o[c+75>>0]|0)>-1){for(B=l;;){if(!B){m=0,d=s;break t}if(d=B+-1|0,(o[s+d>>0]|0)==10)break;B=d}if(f=ED[n[c+36>>2]&7](c,s,B)|0,f>>>0>>0)break e;m=B,d=s+B|0,l=l-B|0,f=n[k>>2]|0}else m=0,d=s;while(0);Dr(f|0,d|0,l|0)|0,n[k>>2]=(n[k>>2]|0)+l,f=m+l|0}while(0);return f|0}function $Ue(s){s=s|0;var l=0,c=0;return l=s+74|0,c=o[l>>0]|0,o[l>>0]=c+255|c,l=n[s>>2]|0,l&8?(n[s>>2]=l|32,s=-1):(n[s+8>>2]=0,n[s+4>>2]=0,c=n[s+44>>2]|0,n[s+28>>2]=c,n[s+20>>2]=c,n[s+16>>2]=c+(n[s+48>>2]|0),s=0),s|0}function _n(s,l){s=y(s),l=y(l);var c=0,f=0;c=p7(s)|0;do if((c&2147483647)>>>0<=2139095040){if(f=p7(l)|0,(f&2147483647)>>>0<=2139095040)if((f^c|0)<0){s=(c|0)<0?l:s;break}else{s=s>2]=s,n[v>>2]|0|0}function Tg(s,l){s=y(s),l=y(l);var c=0,f=0;c=h7(s)|0;do if((c&2147483647)>>>0<=2139095040){if(f=h7(l)|0,(f&2147483647)>>>0<=2139095040)if((f^c|0)<0){s=(c|0)<0?s:l;break}else{s=s>2]=s,n[v>>2]|0|0}function kT(s,l){s=y(s),l=y(l);var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0;m=(h[v>>2]=s,n[v>>2]|0),k=(h[v>>2]=l,n[v>>2]|0),c=m>>>23&255,B=k>>>23&255,Q=m&-2147483648,d=k<<1;e:do if((d|0)!=0&&!((c|0)==255|((e3e(l)|0)&2147483647)>>>0>2139095040)){if(f=m<<1,f>>>0<=d>>>0)return l=y(s*y(0)),y((f|0)==(d|0)?l:s);if(c)f=m&8388607|8388608;else{if(c=m<<9,(c|0)>-1){f=c,c=0;do c=c+-1|0,f=f<<1;while((f|0)>-1)}else c=0;f=m<<1-c}if(B)k=k&8388607|8388608;else{if(m=k<<9,(m|0)>-1){d=0;do d=d+-1|0,m=m<<1;while((m|0)>-1)}else d=0;B=d,k=k<<1-d}d=f-k|0,m=(d|0)>-1;t:do if((c|0)>(B|0)){for(;;){if(m)if(d)f=d;else break;if(f=f<<1,c=c+-1|0,d=f-k|0,m=(d|0)>-1,(c|0)<=(B|0))break t}l=y(s*y(0));break e}while(0);if(m)if(d)f=d;else{l=y(s*y(0));break}if(f>>>0<8388608)do f=f<<1,c=c+-1|0;while(f>>>0<8388608);(c|0)>0?c=f+-8388608|c<<23:c=f>>>(1-c|0),l=(n[v>>2]=c|Q,y(h[v>>2]))}else O=3;while(0);return(O|0)==3&&(l=y(s*l),l=y(l/l)),y(l)}function e3e(s){return s=y(s),h[v>>2]=s,n[v>>2]|0|0}function t3e(s,l){return s=s|0,l=l|0,a7(n[582]|0,s,l)|0}function zr(s){s=s|0,Tt()}function Jm(s){s=s|0}function r3e(s,l){return s=s|0,l=l|0,0}function n3e(s){return s=s|0,(g7(s+4|0)|0)==-1?(ef[n[(n[s>>2]|0)+8>>2]&127](s),s=1):s=0,s|0}function g7(s){s=s|0;var l=0;return l=n[s>>2]|0,n[s>>2]=l+-1,l+-1|0}function bp(s){s=s|0,n3e(s)|0&&i3e(s)}function i3e(s){s=s|0;var l=0;l=s+8|0,(n[l>>2]|0)!=0&&(g7(l)|0)!=-1||ef[n[(n[s>>2]|0)+16>>2]&127](s)}function Vt(s){s=s|0;var l=0;for(l=(s|0)==0?1:s;s=pD(l)|0,!(s|0);){if(s=o3e()|0,!s){s=0;break}k7[s&0]()}return s|0}function d7(s){return s=s|0,Vt(s)|0}function gt(s){s=s|0,hD(s)}function s3e(s){s=s|0,(o[s+11>>0]|0)<0&>(n[s>>2]|0)}function o3e(){var s=0;return s=n[2923]|0,n[2923]=s+0,s|0}function a3e(){}function dD(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,f=l-f-(c>>>0>s>>>0|0)>>>0,De=f,s-c>>>0|0|0}function QT(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,c=s+c>>>0,De=l+f+(c>>>0>>0|0)>>>0,c|0|0}function zm(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;if(m=s+c|0,l=l&255,(c|0)>=67){for(;s&3;)o[s>>0]=l,s=s+1|0;for(f=m&-4|0,d=f-64|0,B=l|l<<8|l<<16|l<<24;(s|0)<=(d|0);)n[s>>2]=B,n[s+4>>2]=B,n[s+8>>2]=B,n[s+12>>2]=B,n[s+16>>2]=B,n[s+20>>2]=B,n[s+24>>2]=B,n[s+28>>2]=B,n[s+32>>2]=B,n[s+36>>2]=B,n[s+40>>2]=B,n[s+44>>2]=B,n[s+48>>2]=B,n[s+52>>2]=B,n[s+56>>2]=B,n[s+60>>2]=B,s=s+64|0;for(;(s|0)<(f|0);)n[s>>2]=B,s=s+4|0}for(;(s|0)<(m|0);)o[s>>0]=l,s=s+1|0;return m-c|0}function m7(s,l,c){return s=s|0,l=l|0,c=c|0,(c|0)<32?(De=l<>>32-c,s<>>c,s>>>c|(l&(1<>>c-32|0)}function Dr(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;if((c|0)>=8192)return Ac(s|0,l|0,c|0)|0;if(m=s|0,d=s+c|0,(s&3)==(l&3)){for(;s&3;){if(!c)return m|0;o[s>>0]=o[l>>0]|0,s=s+1|0,l=l+1|0,c=c-1|0}for(c=d&-4|0,f=c-64|0;(s|0)<=(f|0);)n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=n[l+8>>2],n[s+12>>2]=n[l+12>>2],n[s+16>>2]=n[l+16>>2],n[s+20>>2]=n[l+20>>2],n[s+24>>2]=n[l+24>>2],n[s+28>>2]=n[l+28>>2],n[s+32>>2]=n[l+32>>2],n[s+36>>2]=n[l+36>>2],n[s+40>>2]=n[l+40>>2],n[s+44>>2]=n[l+44>>2],n[s+48>>2]=n[l+48>>2],n[s+52>>2]=n[l+52>>2],n[s+56>>2]=n[l+56>>2],n[s+60>>2]=n[l+60>>2],s=s+64|0,l=l+64|0;for(;(s|0)<(c|0);)n[s>>2]=n[l>>2],s=s+4|0,l=l+4|0}else for(c=d-4|0;(s|0)<(c|0);)o[s>>0]=o[l>>0]|0,o[s+1>>0]=o[l+1>>0]|0,o[s+2>>0]=o[l+2>>0]|0,o[s+3>>0]=o[l+3>>0]|0,s=s+4|0,l=l+4|0;for(;(s|0)<(d|0);)o[s>>0]=o[l>>0]|0,s=s+1|0,l=l+1|0;return m|0}function y7(s){s=s|0;var l=0;return l=o[L+(s&255)>>0]|0,(l|0)<8?l|0:(l=o[L+(s>>8&255)>>0]|0,(l|0)<8?l+8|0:(l=o[L+(s>>16&255)>>0]|0,(l|0)<8?l+16|0:(o[L+(s>>>24)>>0]|0)+24|0))}function E7(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0,O=0,M=0,q=0,se=0,Ge=0,Oe=0;if(M=s,Q=l,O=Q,B=c,se=f,k=se,!O)return m=(d|0)!=0,k?m?(n[d>>2]=s|0,n[d+4>>2]=l&0,se=0,d=0,De=se,d|0):(se=0,d=0,De=se,d|0):(m&&(n[d>>2]=(M>>>0)%(B>>>0),n[d+4>>2]=0),se=0,d=(M>>>0)/(B>>>0)>>>0,De=se,d|0);m=(k|0)==0;do if(B){if(!m){if(m=(S(k|0)|0)-(S(O|0)|0)|0,m>>>0<=31){q=m+1|0,k=31-m|0,l=m-31>>31,B=q,s=M>>>(q>>>0)&l|O<>>(q>>>0)&l,m=0,k=M<>2]=s|0,n[d+4>>2]=Q|l&0,se=0,d=0,De=se,d|0):(se=0,d=0,De=se,d|0)}if(m=B-1|0,m&B|0){k=(S(B|0)|0)+33-(S(O|0)|0)|0,Oe=64-k|0,q=32-k|0,Q=q>>31,Ge=k-32|0,l=Ge>>31,B=k,s=q-1>>31&O>>>(Ge>>>0)|(O<>>(k>>>0))&l,l=l&O>>>(k>>>0),m=M<>>(Ge>>>0))&Q|M<>31;break}return d|0&&(n[d>>2]=m&M,n[d+4>>2]=0),(B|0)==1?(Ge=Q|l&0,Oe=s|0|0,De=Ge,Oe|0):(Oe=y7(B|0)|0,Ge=O>>>(Oe>>>0)|0,Oe=O<<32-Oe|M>>>(Oe>>>0)|0,De=Ge,Oe|0)}else{if(m)return d|0&&(n[d>>2]=(O>>>0)%(B>>>0),n[d+4>>2]=0),Ge=0,Oe=(O>>>0)/(B>>>0)>>>0,De=Ge,Oe|0;if(!M)return d|0&&(n[d>>2]=0,n[d+4>>2]=(O>>>0)%(k>>>0)),Ge=0,Oe=(O>>>0)/(k>>>0)>>>0,De=Ge,Oe|0;if(m=k-1|0,!(m&k))return d|0&&(n[d>>2]=s|0,n[d+4>>2]=m&O|l&0),Ge=0,Oe=O>>>((y7(k|0)|0)>>>0),De=Ge,Oe|0;if(m=(S(k|0)|0)-(S(O|0)|0)|0,m>>>0<=30){l=m+1|0,k=31-m|0,B=l,s=O<>>(l>>>0),l=O>>>(l>>>0),m=0,k=M<>2]=s|0,n[d+4>>2]=Q|l&0,Ge=0,Oe=0,De=Ge,Oe|0):(Ge=0,Oe=0,De=Ge,Oe|0)}while(0);if(!B)O=k,Q=0,k=0;else{q=c|0|0,M=se|f&0,O=QT(q|0,M|0,-1,-1)|0,c=De,Q=k,k=0;do f=Q,Q=m>>>31|Q<<1,m=k|m<<1,f=s<<1|f>>>31|0,se=s>>>31|l<<1|0,dD(O|0,c|0,f|0,se|0)|0,Oe=De,Ge=Oe>>31|((Oe|0)<0?-1:0)<<1,k=Ge&1,s=dD(f|0,se|0,Ge&q|0,(((Oe|0)<0?-1:0)>>31|((Oe|0)<0?-1:0)<<1)&M|0)|0,l=De,B=B-1|0;while((B|0)!=0);O=Q,Q=0}return B=0,d|0&&(n[d>>2]=s,n[d+4>>2]=l),Ge=(m|0)>>>31|(O|B)<<1|(B<<1|m>>>31)&0|Q,Oe=(m<<1|0>>>31)&-2|k,De=Ge,Oe|0}function FT(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,E7(s,l,c,f,0)|0}function kp(s){s=s|0;var l=0,c=0;return c=s+15&-16|0,l=n[I>>2]|0,s=l+c|0,(c|0)>0&(s|0)<(l|0)|(s|0)<0?(ie()|0,vA(12),-1):(n[I>>2]=s,(s|0)>(Z()|0)&&(X()|0)==0?(n[I>>2]=l,vA(12),-1):l|0)}function Mw(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;if((l|0)<(s|0)&(s|0)<(l+c|0)){for(f=s,l=l+c|0,s=s+c|0;(c|0)>0;)s=s-1|0,l=l-1|0,c=c-1|0,o[s>>0]=o[l>>0]|0;s=f}else Dr(s,l,c)|0;return s|0}function TT(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;return m=C,C=C+16|0,d=m|0,E7(s,l,c,f,d)|0,C=m,De=n[d+4>>2]|0,n[d>>2]|0|0}function C7(s){return s=s|0,(s&255)<<24|(s>>8&255)<<16|(s>>16&255)<<8|s>>>24|0}function l3e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,w7[s&1](l|0,c|0,f|0,d|0,m|0)}function c3e(s,l,c){s=s|0,l=l|0,c=y(c),I7[s&1](l|0,y(c))}function u3e(s,l,c){s=s|0,l=l|0,c=+c,B7[s&31](l|0,+c)}function A3e(s,l,c,f){return s=s|0,l=l|0,c=y(c),f=y(f),y(v7[s&0](l|0,y(c),y(f)))}function f3e(s,l){s=s|0,l=l|0,ef[s&127](l|0)}function p3e(s,l,c){s=s|0,l=l|0,c=c|0,tf[s&31](l|0,c|0)}function h3e(s,l){return s=s|0,l=l|0,Ng[s&31](l|0)|0}function g3e(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0,D7[s&1](l|0,+c,+f,d|0)}function d3e(s,l,c,f){s=s|0,l=l|0,c=+c,f=+f,z3e[s&1](l|0,+c,+f)}function m3e(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,ED[s&7](l|0,c|0,f|0)|0}function y3e(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,+X3e[s&1](l|0,c|0,f|0)}function E3e(s,l){return s=s|0,l=l|0,+P7[s&15](l|0)}function C3e(s,l,c){return s=s|0,l=l|0,c=+c,Z3e[s&1](l|0,+c)|0}function w3e(s,l,c){return s=s|0,l=l|0,c=c|0,NT[s&15](l|0,c|0)|0}function I3e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=+f,d=+d,m=m|0,$3e[s&1](l|0,c|0,+f,+d,m|0)}function B3e(s,l,c,f,d,m,B){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0,e_e[s&1](l|0,c|0,f|0,d|0,m|0,B|0)}function v3e(s,l,c){return s=s|0,l=l|0,c=c|0,+S7[s&7](l|0,c|0)}function D3e(s){return s=s|0,CD[s&7]()|0}function P3e(s,l,c,f,d,m){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,x7[s&1](l|0,c|0,f|0,d|0,m|0)|0}function S3e(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=+d,t_e[s&1](l|0,c|0,f|0,+d)}function x3e(s,l,c,f,d,m,B){s=s|0,l=l|0,c=c|0,f=y(f),d=d|0,m=y(m),B=B|0,b7[s&1](l|0,c|0,y(f),d|0,y(m),B|0)}function b3e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,_w[s&15](l|0,c|0,f|0)}function k3e(s){s=s|0,k7[s&0]()}function Q3e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f,Q7[s&15](l|0,c|0,+f)}function F3e(s,l,c){return s=s|0,l=+l,c=+c,r_e[s&1](+l,+c)|0}function T3e(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,LT[s&15](l|0,c|0,f|0,d|0)}function R3e(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,F(0)}function N3e(s,l){s=s|0,l=y(l),F(1)}function ma(s,l){s=s|0,l=+l,F(2)}function L3e(s,l,c){return s=s|0,l=y(l),c=y(c),F(3),Ze}function Er(s){s=s|0,F(4)}function Ow(s,l){s=s|0,l=l|0,F(5)}function Ja(s){return s=s|0,F(6),0}function M3e(s,l,c,f){s=s|0,l=+l,c=+c,f=f|0,F(7)}function O3e(s,l,c){s=s|0,l=+l,c=+c,F(8)}function U3e(s,l,c){return s=s|0,l=l|0,c=c|0,F(9),0}function _3e(s,l,c){return s=s|0,l=l|0,c=c|0,F(10),0}function Rg(s){return s=s|0,F(11),0}function H3e(s,l){return s=s|0,l=+l,F(12),0}function Uw(s,l){return s=s|0,l=l|0,F(13),0}function j3e(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0,F(14)}function q3e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,F(15)}function RT(s,l){return s=s|0,l=l|0,F(16),0}function G3e(){return F(17),0}function Y3e(s,l,c,f,d){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,F(18),0}function W3e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f,F(19)}function V3e(s,l,c,f,d,m){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=m|0,F(20)}function yD(s,l,c){s=s|0,l=l|0,c=c|0,F(21)}function K3e(){F(22)}function Xm(s,l,c){s=s|0,l=l|0,c=+c,F(23)}function J3e(s,l){return s=+s,l=+l,F(24),0}function Zm(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,F(25)}var w7=[R3e,YLe],I7=[N3e,fo],B7=[ma,xw,bw,wF,IF,Dl,kw,BF,Hm,xu,Fw,vF,$v,WA,eD,jm,tD,rD,qm,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma],v7=[L3e],ef=[Er,Jm,DDe,PDe,SDe,rbe,nbe,ibe,CNe,wNe,INe,FLe,TLe,RLe,eUe,tUe,rUe,hs,Kv,_m,YA,Qw,wve,Ive,gDe,NDe,VDe,APe,SPe,GPe,aSe,ISe,MSe,$Se,gxe,Qxe,Vxe,wbe,Mbe,$be,gke,Qke,Vke,fQe,SQe,HQe,nFe,Sc,RFe,zFe,gTe,TTe,KTe,gRe,DRe,xRe,YRe,KRe,ANe,vNe,SNe,GNe,lLe,a5,qMe,COe,NOe,zOe,y4e,T4e,G4e,V4e,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er],tf=[Ow,hF,gF,Sw,Su,dF,mF,Ip,yF,EF,CF,Zv,VA,Ke,At,Wt,vr,Sn,Fr,PF,lve,Qve,dQe,kQe,MTe,WMe,dLe,Y9,Ow,Ow,Ow,Ow],Ng=[Ja,QUe,pF,D,fe,ve,vt,wt,bt,_r,di,po,sve,ove,Bve,oFe,ZTe,VNe,zMe,Wa,Ja,Ja,Ja,Ja,Ja,Ja,Ja,Ja,Ja,Ja,Ja,Ja],D7=[M3e,vve],z3e=[O3e,hNe],ED=[U3e,s7,FUe,NUe,KPe,Dbe,OFe,e4e],X3e=[_3e,Exe],P7=[Rg,Yo,rt,xn,Dve,Pve,Sve,xve,bve,kve,Rg,Rg,Rg,Rg,Rg,Rg],Z3e=[H3e,IRe],NT=[Uw,r3e,ave,EDe,gPe,uSe,DSe,Xxe,Hbe,YQe,Wv,UOe,Uw,Uw,Uw,Uw],$3e=[j3e,XDe],e_e=[q3e,I4e],S7=[RT,ai,Fve,Tve,Rve,Nxe,RT,RT],CD=[G3e,Nve,Dw,ga,FRe,ZRe,QNe,X4e],x7=[Y3e,Ew],t_e=[W3e,Eke],b7=[V3e,cve],_w=[yD,R,is,en,ho,QPe,_Se,Nke,Xke,Um,hMe,vOe,M4e,yD,yD,yD],k7=[K3e],Q7=[Xm,Jv,zv,Xv,GA,nD,DF,P,nke,eTe,yRe,Xm,Xm,Xm,Xm,Xm],r_e=[J3e,yNe],LT=[Zm,nxe,hFe,ETe,aRe,ORe,iNe,ONe,pLe,rOe,lUe,Zm,Zm,Zm,Zm,Zm];return{_llvm_bswap_i32:C7,dynCall_idd:F3e,dynCall_i:D3e,_i64Subtract:dD,___udivdi3:FT,dynCall_vif:c3e,setThrew:hu,dynCall_viii:b3e,_bitshift64Lshr:mD,_bitshift64Shl:m7,dynCall_vi:f3e,dynCall_viiddi:I3e,dynCall_diii:y3e,dynCall_iii:w3e,_memset:zm,_sbrk:kp,_memcpy:Dr,__GLOBAL__sub_I_Yoga_cpp:Om,dynCall_vii:p3e,___uremdi3:TT,dynCall_vid:u3e,stackAlloc:lo,_nbind_init:EUe,getTempRet0:Ua,dynCall_di:E3e,dynCall_iid:C3e,setTempRet0:xA,_i64Add:QT,dynCall_fiff:A3e,dynCall_iiii:m3e,_emscripten_get_global_libc:kUe,dynCall_viid:Q3e,dynCall_viiid:S3e,dynCall_viififi:x3e,dynCall_ii:h3e,__GLOBAL__sub_I_Binding_cc:NMe,dynCall_viiii:T3e,dynCall_iiiiii:P3e,stackSave:gc,dynCall_viiiii:l3e,__GLOBAL__sub_I_nbind_cc:Lve,dynCall_vidd:d3e,_free:hD,runPostSets:a3e,dynCall_viiiiii:B3e,establishStackSpace:ji,_memmove:Mw,stackRestore:pu,_malloc:pD,__GLOBAL__sub_I_common_cc:tLe,dynCall_viddi:g3e,dynCall_dii:v3e,dynCall_v:k3e}}(Module.asmGlobalArg,Module.asmLibraryArg,buffer),_llvm_bswap_i32=Module._llvm_bswap_i32=asm._llvm_bswap_i32,getTempRet0=Module.getTempRet0=asm.getTempRet0,___udivdi3=Module.___udivdi3=asm.___udivdi3,setThrew=Module.setThrew=asm.setThrew,_bitshift64Lshr=Module._bitshift64Lshr=asm._bitshift64Lshr,_bitshift64Shl=Module._bitshift64Shl=asm._bitshift64Shl,_memset=Module._memset=asm._memset,_sbrk=Module._sbrk=asm._sbrk,_memcpy=Module._memcpy=asm._memcpy,stackAlloc=Module.stackAlloc=asm.stackAlloc,___uremdi3=Module.___uremdi3=asm.___uremdi3,_nbind_init=Module._nbind_init=asm._nbind_init,_i64Subtract=Module._i64Subtract=asm._i64Subtract,setTempRet0=Module.setTempRet0=asm.setTempRet0,_i64Add=Module._i64Add=asm._i64Add,_emscripten_get_global_libc=Module._emscripten_get_global_libc=asm._emscripten_get_global_libc,__GLOBAL__sub_I_Yoga_cpp=Module.__GLOBAL__sub_I_Yoga_cpp=asm.__GLOBAL__sub_I_Yoga_cpp,__GLOBAL__sub_I_Binding_cc=Module.__GLOBAL__sub_I_Binding_cc=asm.__GLOBAL__sub_I_Binding_cc,stackSave=Module.stackSave=asm.stackSave,__GLOBAL__sub_I_nbind_cc=Module.__GLOBAL__sub_I_nbind_cc=asm.__GLOBAL__sub_I_nbind_cc,_free=Module._free=asm._free,runPostSets=Module.runPostSets=asm.runPostSets,establishStackSpace=Module.establishStackSpace=asm.establishStackSpace,_memmove=Module._memmove=asm._memmove,stackRestore=Module.stackRestore=asm.stackRestore,_malloc=Module._malloc=asm._malloc,__GLOBAL__sub_I_common_cc=Module.__GLOBAL__sub_I_common_cc=asm.__GLOBAL__sub_I_common_cc,dynCall_viiiii=Module.dynCall_viiiii=asm.dynCall_viiiii,dynCall_vif=Module.dynCall_vif=asm.dynCall_vif,dynCall_vid=Module.dynCall_vid=asm.dynCall_vid,dynCall_fiff=Module.dynCall_fiff=asm.dynCall_fiff,dynCall_vi=Module.dynCall_vi=asm.dynCall_vi,dynCall_vii=Module.dynCall_vii=asm.dynCall_vii,dynCall_ii=Module.dynCall_ii=asm.dynCall_ii,dynCall_viddi=Module.dynCall_viddi=asm.dynCall_viddi,dynCall_vidd=Module.dynCall_vidd=asm.dynCall_vidd,dynCall_iiii=Module.dynCall_iiii=asm.dynCall_iiii,dynCall_diii=Module.dynCall_diii=asm.dynCall_diii,dynCall_di=Module.dynCall_di=asm.dynCall_di,dynCall_iid=Module.dynCall_iid=asm.dynCall_iid,dynCall_iii=Module.dynCall_iii=asm.dynCall_iii,dynCall_viiddi=Module.dynCall_viiddi=asm.dynCall_viiddi,dynCall_viiiiii=Module.dynCall_viiiiii=asm.dynCall_viiiiii,dynCall_dii=Module.dynCall_dii=asm.dynCall_dii,dynCall_i=Module.dynCall_i=asm.dynCall_i,dynCall_iiiiii=Module.dynCall_iiiiii=asm.dynCall_iiiiii,dynCall_viiid=Module.dynCall_viiid=asm.dynCall_viiid,dynCall_viififi=Module.dynCall_viififi=asm.dynCall_viififi,dynCall_viii=Module.dynCall_viii=asm.dynCall_viii,dynCall_v=Module.dynCall_v=asm.dynCall_v,dynCall_viid=Module.dynCall_viid=asm.dynCall_viid,dynCall_idd=Module.dynCall_idd=asm.dynCall_idd,dynCall_viiii=Module.dynCall_viiii=asm.dynCall_viiii;Runtime.stackAlloc=Module.stackAlloc,Runtime.stackSave=Module.stackSave,Runtime.stackRestore=Module.stackRestore,Runtime.establishStackSpace=Module.establishStackSpace,Runtime.setTempRet0=Module.setTempRet0,Runtime.getTempRet0=Module.getTempRet0,Module.asm=asm;function ExitStatus(t){this.name="ExitStatus",this.message="Program terminated with exit("+t+")",this.status=t}ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus;var initialStackTop,preloadStartTime=null,calledMain=!1;dependenciesFulfilled=function t(){Module.calledRun||run(),Module.calledRun||(dependenciesFulfilled=t)},Module.callMain=Module.callMain=function t(e){e=e||[],ensureInitRuntime();var r=e.length+1;function o(){for(var p=0;p<4-1;p++)a.push(0)}var a=[allocate(intArrayFromString(Module.thisProgram),"i8",ALLOC_NORMAL)];o();for(var n=0;n0||(preRun(),runDependencies>0)||Module.calledRun)return;function e(){Module.calledRun||(Module.calledRun=!0,!ABORT&&(ensureInitRuntime(),preMain(),Module.onRuntimeInitialized&&Module.onRuntimeInitialized(),Module._main&&shouldRunNow&&Module.callMain(t),postRun()))}Module.setStatus?(Module.setStatus("Running..."),setTimeout(function(){setTimeout(function(){Module.setStatus("")},1),e()},1)):e()}Module.run=Module.run=run;function exit(t,e){e&&Module.noExitRuntime||(Module.noExitRuntime||(ABORT=!0,EXITSTATUS=t,STACKTOP=initialStackTop,exitRuntime(),Module.onExit&&Module.onExit(t)),ENVIRONMENT_IS_NODE&&process.exit(t),Module.quit(t,new ExitStatus(t)))}Module.exit=Module.exit=exit;var abortDecorators=[];function abort(t){Module.onAbort&&Module.onAbort(t),t!==void 0?(Module.print(t),Module.printErr(t),t=JSON.stringify(t)):t="",ABORT=!0,EXITSTATUS=1;var e=` +If this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.`,r="abort("+t+") at "+stackTrace()+e;throw abortDecorators&&abortDecorators.forEach(function(o){r=o(r,t)}),r}if(Module.abort=Module.abort=abort,Module.preInit)for(typeof Module.preInit=="function"&&(Module.preInit=[Module.preInit]);Module.preInit.length>0;)Module.preInit.pop()();var shouldRunNow=!0;Module.noInitialRun&&(shouldRunNow=!1),run()})});var om=_((wVt,OEe)=>{"use strict";var Jyt=LEe(),zyt=MEe(),Q6=!1,F6=null;zyt({},function(t,e){if(!Q6){if(Q6=!0,t)throw t;F6=e}});if(!Q6)throw new Error("Failed to load the yoga module - it needed to be loaded synchronously, but didn't");OEe.exports=Jyt(F6.bind,F6.lib)});var R6=_((IVt,T6)=>{"use strict";var UEe=t=>Number.isNaN(t)?!1:t>=4352&&(t<=4447||t===9001||t===9002||11904<=t&&t<=12871&&t!==12351||12880<=t&&t<=19903||19968<=t&&t<=42182||43360<=t&&t<=43388||44032<=t&&t<=55203||63744<=t&&t<=64255||65040<=t&&t<=65049||65072<=t&&t<=65131||65281<=t&&t<=65376||65504<=t&&t<=65510||110592<=t&&t<=110593||127488<=t&&t<=127569||131072<=t&&t<=262141);T6.exports=UEe;T6.exports.default=UEe});var HEe=_((BVt,_Ee)=>{"use strict";_Ee.exports=function(){return/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g}});var Jk=_((vVt,N6)=>{"use strict";var Xyt=MP(),Zyt=R6(),$yt=HEe(),jEe=t=>{if(typeof t!="string"||t.length===0||(t=Xyt(t),t.length===0))return 0;t=t.replace($yt()," ");let e=0;for(let r=0;r=127&&o<=159||o>=768&&o<=879||(o>65535&&r++,e+=Zyt(o)?2:1)}return e};N6.exports=jEe;N6.exports.default=jEe});var M6=_((DVt,L6)=>{"use strict";var eEt=Jk(),qEe=t=>{let e=0;for(let r of t.split(` +`))e=Math.max(e,eEt(r));return e};L6.exports=qEe;L6.exports.default=qEe});var GEe=_(lB=>{"use strict";var tEt=lB&&lB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(lB,"__esModule",{value:!0});var rEt=tEt(M6()),O6={};lB.default=t=>{if(t.length===0)return{width:0,height:0};if(O6[t])return O6[t];let e=rEt.default(t),r=t.split(` +`).length;return O6[t]={width:e,height:r},{width:e,height:r}}});var YEe=_(cB=>{"use strict";var nEt=cB&&cB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(cB,"__esModule",{value:!0});var dn=nEt(om()),iEt=(t,e)=>{"position"in e&&t.setPositionType(e.position==="absolute"?dn.default.POSITION_TYPE_ABSOLUTE:dn.default.POSITION_TYPE_RELATIVE)},sEt=(t,e)=>{"marginLeft"in e&&t.setMargin(dn.default.EDGE_START,e.marginLeft||0),"marginRight"in e&&t.setMargin(dn.default.EDGE_END,e.marginRight||0),"marginTop"in e&&t.setMargin(dn.default.EDGE_TOP,e.marginTop||0),"marginBottom"in e&&t.setMargin(dn.default.EDGE_BOTTOM,e.marginBottom||0)},oEt=(t,e)=>{"paddingLeft"in e&&t.setPadding(dn.default.EDGE_LEFT,e.paddingLeft||0),"paddingRight"in e&&t.setPadding(dn.default.EDGE_RIGHT,e.paddingRight||0),"paddingTop"in e&&t.setPadding(dn.default.EDGE_TOP,e.paddingTop||0),"paddingBottom"in e&&t.setPadding(dn.default.EDGE_BOTTOM,e.paddingBottom||0)},aEt=(t,e)=>{var r;"flexGrow"in e&&t.setFlexGrow((r=e.flexGrow)!==null&&r!==void 0?r:0),"flexShrink"in e&&t.setFlexShrink(typeof e.flexShrink=="number"?e.flexShrink:1),"flexDirection"in e&&(e.flexDirection==="row"&&t.setFlexDirection(dn.default.FLEX_DIRECTION_ROW),e.flexDirection==="row-reverse"&&t.setFlexDirection(dn.default.FLEX_DIRECTION_ROW_REVERSE),e.flexDirection==="column"&&t.setFlexDirection(dn.default.FLEX_DIRECTION_COLUMN),e.flexDirection==="column-reverse"&&t.setFlexDirection(dn.default.FLEX_DIRECTION_COLUMN_REVERSE)),"flexBasis"in e&&(typeof e.flexBasis=="number"?t.setFlexBasis(e.flexBasis):typeof e.flexBasis=="string"?t.setFlexBasisPercent(Number.parseInt(e.flexBasis,10)):t.setFlexBasis(NaN)),"alignItems"in e&&((e.alignItems==="stretch"||!e.alignItems)&&t.setAlignItems(dn.default.ALIGN_STRETCH),e.alignItems==="flex-start"&&t.setAlignItems(dn.default.ALIGN_FLEX_START),e.alignItems==="center"&&t.setAlignItems(dn.default.ALIGN_CENTER),e.alignItems==="flex-end"&&t.setAlignItems(dn.default.ALIGN_FLEX_END)),"alignSelf"in e&&((e.alignSelf==="auto"||!e.alignSelf)&&t.setAlignSelf(dn.default.ALIGN_AUTO),e.alignSelf==="flex-start"&&t.setAlignSelf(dn.default.ALIGN_FLEX_START),e.alignSelf==="center"&&t.setAlignSelf(dn.default.ALIGN_CENTER),e.alignSelf==="flex-end"&&t.setAlignSelf(dn.default.ALIGN_FLEX_END)),"justifyContent"in e&&((e.justifyContent==="flex-start"||!e.justifyContent)&&t.setJustifyContent(dn.default.JUSTIFY_FLEX_START),e.justifyContent==="center"&&t.setJustifyContent(dn.default.JUSTIFY_CENTER),e.justifyContent==="flex-end"&&t.setJustifyContent(dn.default.JUSTIFY_FLEX_END),e.justifyContent==="space-between"&&t.setJustifyContent(dn.default.JUSTIFY_SPACE_BETWEEN),e.justifyContent==="space-around"&&t.setJustifyContent(dn.default.JUSTIFY_SPACE_AROUND))},lEt=(t,e)=>{var r,o;"width"in e&&(typeof e.width=="number"?t.setWidth(e.width):typeof e.width=="string"?t.setWidthPercent(Number.parseInt(e.width,10)):t.setWidthAuto()),"height"in e&&(typeof e.height=="number"?t.setHeight(e.height):typeof e.height=="string"?t.setHeightPercent(Number.parseInt(e.height,10)):t.setHeightAuto()),"minWidth"in e&&(typeof e.minWidth=="string"?t.setMinWidthPercent(Number.parseInt(e.minWidth,10)):t.setMinWidth((r=e.minWidth)!==null&&r!==void 0?r:0)),"minHeight"in e&&(typeof e.minHeight=="string"?t.setMinHeightPercent(Number.parseInt(e.minHeight,10)):t.setMinHeight((o=e.minHeight)!==null&&o!==void 0?o:0))},cEt=(t,e)=>{"display"in e&&t.setDisplay(e.display==="flex"?dn.default.DISPLAY_FLEX:dn.default.DISPLAY_NONE)},uEt=(t,e)=>{if("borderStyle"in e){let r=typeof e.borderStyle=="string"?1:0;t.setBorder(dn.default.EDGE_TOP,r),t.setBorder(dn.default.EDGE_BOTTOM,r),t.setBorder(dn.default.EDGE_LEFT,r),t.setBorder(dn.default.EDGE_RIGHT,r)}};cB.default=(t,e={})=>{iEt(t,e),sEt(t,e),oEt(t,e),aEt(t,e),lEt(t,e),cEt(t,e),uEt(t,e)}});var KEe=_((xVt,VEe)=>{"use strict";var uB=Jk(),AEt=MP(),fEt=vI(),_6=new Set(["\x1B","\x9B"]),pEt=39,WEe=t=>`${_6.values().next().value}[${t}m`,hEt=t=>t.split(" ").map(e=>uB(e)),U6=(t,e,r)=>{let o=[...e],a=!1,n=uB(AEt(t[t.length-1]));for(let[u,A]of o.entries()){let p=uB(A);if(n+p<=r?t[t.length-1]+=A:(t.push(A),n=0),_6.has(A))a=!0;else if(a&&A==="m"){a=!1;continue}a||(n+=p,n===r&&u0&&t.length>1&&(t[t.length-2]+=t.pop())},gEt=t=>{let e=t.split(" "),r=e.length;for(;r>0&&!(uB(e[r-1])>0);)r--;return r===e.length?t:e.slice(0,r).join(" ")+e.slice(r).join("")},dEt=(t,e,r={})=>{if(r.trim!==!1&&t.trim()==="")return"";let o="",a="",n,u=hEt(t),A=[""];for(let[p,h]of t.split(" ").entries()){r.trim!==!1&&(A[A.length-1]=A[A.length-1].trimLeft());let E=uB(A[A.length-1]);if(p!==0&&(E>=e&&(r.wordWrap===!1||r.trim===!1)&&(A.push(""),E=0),(E>0||r.trim===!1)&&(A[A.length-1]+=" ",E++)),r.hard&&u[p]>e){let I=e-E,v=1+Math.floor((u[p]-I-1)/e);Math.floor((u[p]-1)/e)e&&E>0&&u[p]>0){if(r.wordWrap===!1&&Ee&&r.wordWrap===!1){U6(A,h,e);continue}A[A.length-1]+=h}r.trim!==!1&&(A=A.map(gEt)),o=A.join(` +`);for(let[p,h]of[...o].entries()){if(a+=h,_6.has(h)){let I=parseFloat(/\d[^m]*/.exec(o.slice(p,p+4)));n=I===pEt?null:I}let E=fEt.codes.get(Number(n));n&&E&&(o[p+1]===` +`?a+=WEe(E):h===` +`&&(a+=WEe(n)))}return a};VEe.exports=(t,e,r)=>String(t).normalize().replace(/\r\n/g,` +`).split(` +`).map(o=>dEt(o,e,r)).join(` +`)});var XEe=_((bVt,zEe)=>{"use strict";var JEe="[\uD800-\uDBFF][\uDC00-\uDFFF]",mEt=t=>t&&t.exact?new RegExp(`^${JEe}$`):new RegExp(JEe,"g");zEe.exports=mEt});var H6=_((kVt,tCe)=>{"use strict";var yEt=R6(),EEt=XEe(),ZEe=vI(),eCe=["\x1B","\x9B"],zk=t=>`${eCe[0]}[${t}m`,$Ee=(t,e,r)=>{let o=[];t=[...t];for(let a of t){let n=a;a.match(";")&&(a=a.split(";")[0][0]+"0");let u=ZEe.codes.get(parseInt(a,10));if(u){let A=t.indexOf(u.toString());A>=0?t.splice(A,1):o.push(zk(e?u:n))}else if(e){o.push(zk(0));break}else o.push(zk(n))}if(e&&(o=o.filter((a,n)=>o.indexOf(a)===n),r!==void 0)){let a=zk(ZEe.codes.get(parseInt(r,10)));o=o.reduce((n,u)=>u===a?[u,...n]:[...n,u],[])}return o.join("")};tCe.exports=(t,e,r)=>{let o=[...t.normalize()],a=[];r=typeof r=="number"?r:o.length;let n=!1,u,A=0,p="";for(let[h,E]of o.entries()){let I=!1;if(eCe.includes(E)){let v=/\d[^m]*/.exec(t.slice(h,h+18));u=v&&v.length>0?v[0]:void 0,Ae&&A<=r)p+=E;else if(A===e&&!n&&u!==void 0)p=$Ee(a);else if(A>=r){p+=$Ee(a,!0,u);break}}return p}});var nCe=_((QVt,rCe)=>{"use strict";var y0=H6(),CEt=Jk();function Xk(t,e,r){if(t.charAt(e)===" ")return e;for(let o=1;o<=3;o++)if(r){if(t.charAt(e+o)===" ")return e+o}else if(t.charAt(e-o)===" ")return e-o;return e}rCe.exports=(t,e,r)=>{r={position:"end",preferTruncationOnSpace:!1,...r};let{position:o,space:a,preferTruncationOnSpace:n}=r,u="\u2026",A=1;if(typeof t!="string")throw new TypeError(`Expected \`input\` to be a string, got ${typeof t}`);if(typeof e!="number")throw new TypeError(`Expected \`columns\` to be a number, got ${typeof e}`);if(e<1)return"";if(e===1)return u;let p=CEt(t);if(p<=e)return t;if(o==="start"){if(n){let h=Xk(t,p-e+1,!0);return u+y0(t,h,p).trim()}return a===!0&&(u+=" ",A=2),u+y0(t,p-e+A,p)}if(o==="middle"){a===!0&&(u=" "+u+" ",A=3);let h=Math.floor(e/2);if(n){let E=Xk(t,h),I=Xk(t,p-(e-h)+1,!0);return y0(t,0,E)+u+y0(t,I,p).trim()}return y0(t,0,h)+u+y0(t,p-(e-h)+A,p)}if(o==="end"){if(n){let h=Xk(t,e-1);return y0(t,0,h)+u}return a===!0&&(u=" "+u,A=2),y0(t,0,e-A)+u}throw new Error(`Expected \`options.position\` to be either \`start\`, \`middle\` or \`end\`, got ${o}`)}});var q6=_(AB=>{"use strict";var iCe=AB&&AB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(AB,"__esModule",{value:!0});var wEt=iCe(KEe()),IEt=iCe(nCe()),j6={};AB.default=(t,e,r)=>{let o=t+String(e)+String(r);if(j6[o])return j6[o];let a=t;if(r==="wrap"&&(a=wEt.default(t,e,{trim:!1,hard:!0})),r.startsWith("truncate")){let n="end";r==="truncate-middle"&&(n="middle"),r==="truncate-start"&&(n="start"),a=IEt.default(t,e,{position:n})}return j6[o]=a,a}});var Y6=_(G6=>{"use strict";Object.defineProperty(G6,"__esModule",{value:!0});var sCe=t=>{let e="";if(t.childNodes.length>0)for(let r of t.childNodes){let o="";r.nodeName==="#text"?o=r.nodeValue:((r.nodeName==="ink-text"||r.nodeName==="ink-virtual-text")&&(o=sCe(r)),o.length>0&&typeof r.internal_transform=="function"&&(o=r.internal_transform(o))),e+=o}return e};G6.default=sCe});var W6=_(pi=>{"use strict";var fB=pi&&pi.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(pi,"__esModule",{value:!0});pi.setTextNodeValue=pi.createTextNode=pi.setStyle=pi.setAttribute=pi.removeChildNode=pi.insertBeforeNode=pi.appendChildNode=pi.createNode=pi.TEXT_NAME=void 0;var BEt=fB(om()),oCe=fB(GEe()),vEt=fB(YEe()),DEt=fB(q6()),PEt=fB(Y6());pi.TEXT_NAME="#text";pi.createNode=t=>{var e;let r={nodeName:t,style:{},attributes:{},childNodes:[],parentNode:null,yogaNode:t==="ink-virtual-text"?void 0:BEt.default.Node.create()};return t==="ink-text"&&((e=r.yogaNode)===null||e===void 0||e.setMeasureFunc(SEt.bind(null,r))),r};pi.appendChildNode=(t,e)=>{var r;e.parentNode&&pi.removeChildNode(e.parentNode,e),e.parentNode=t,t.childNodes.push(e),e.yogaNode&&((r=t.yogaNode)===null||r===void 0||r.insertChild(e.yogaNode,t.yogaNode.getChildCount())),(t.nodeName==="ink-text"||t.nodeName==="ink-virtual-text")&&Zk(t)};pi.insertBeforeNode=(t,e,r)=>{var o,a;e.parentNode&&pi.removeChildNode(e.parentNode,e),e.parentNode=t;let n=t.childNodes.indexOf(r);if(n>=0){t.childNodes.splice(n,0,e),e.yogaNode&&((o=t.yogaNode)===null||o===void 0||o.insertChild(e.yogaNode,n));return}t.childNodes.push(e),e.yogaNode&&((a=t.yogaNode)===null||a===void 0||a.insertChild(e.yogaNode,t.yogaNode.getChildCount())),(t.nodeName==="ink-text"||t.nodeName==="ink-virtual-text")&&Zk(t)};pi.removeChildNode=(t,e)=>{var r,o;e.yogaNode&&((o=(r=e.parentNode)===null||r===void 0?void 0:r.yogaNode)===null||o===void 0||o.removeChild(e.yogaNode)),e.parentNode=null;let a=t.childNodes.indexOf(e);a>=0&&t.childNodes.splice(a,1),(t.nodeName==="ink-text"||t.nodeName==="ink-virtual-text")&&Zk(t)};pi.setAttribute=(t,e,r)=>{t.attributes[e]=r};pi.setStyle=(t,e)=>{t.style=e,t.yogaNode&&vEt.default(t.yogaNode,e)};pi.createTextNode=t=>{let e={nodeName:"#text",nodeValue:t,yogaNode:void 0,parentNode:null,style:{}};return pi.setTextNodeValue(e,t),e};var SEt=function(t,e){var r,o;let a=t.nodeName==="#text"?t.nodeValue:PEt.default(t),n=oCe.default(a);if(n.width<=e||n.width>=1&&e>0&&e<1)return n;let u=(o=(r=t.style)===null||r===void 0?void 0:r.textWrap)!==null&&o!==void 0?o:"wrap",A=DEt.default(a,e,u);return oCe.default(A)},aCe=t=>{var e;if(!(!t||!t.parentNode))return(e=t.yogaNode)!==null&&e!==void 0?e:aCe(t.parentNode)},Zk=t=>{let e=aCe(t);e?.markDirty()};pi.setTextNodeValue=(t,e)=>{typeof e!="string"&&(e=String(e)),t.nodeValue=e,Zk(t)}});var fCe=_(pB=>{"use strict";var ACe=pB&&pB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(pB,"__esModule",{value:!0});var lCe=x6(),xEt=ACe(kEe()),cCe=ACe(om()),Mo=W6(),uCe=t=>{t?.unsetMeasureFunc(),t?.freeRecursive()};pB.default=xEt.default({schedulePassiveEffects:lCe.unstable_scheduleCallback,cancelPassiveEffects:lCe.unstable_cancelCallback,now:Date.now,getRootHostContext:()=>({isInsideText:!1}),prepareForCommit:()=>{},resetAfterCommit:t=>{if(t.isStaticDirty){t.isStaticDirty=!1,typeof t.onImmediateRender=="function"&&t.onImmediateRender();return}typeof t.onRender=="function"&&t.onRender()},getChildHostContext:(t,e)=>{let r=t.isInsideText,o=e==="ink-text"||e==="ink-virtual-text";return r===o?t:{isInsideText:o}},shouldSetTextContent:()=>!1,createInstance:(t,e,r,o)=>{if(o.isInsideText&&t==="ink-box")throw new Error(" can\u2019t be nested inside component");let a=t==="ink-text"&&o.isInsideText?"ink-virtual-text":t,n=Mo.createNode(a);for(let[u,A]of Object.entries(e))u!=="children"&&(u==="style"?Mo.setStyle(n,A):u==="internal_transform"?n.internal_transform=A:u==="internal_static"?n.internal_static=!0:Mo.setAttribute(n,u,A));return n},createTextInstance:(t,e,r)=>{if(!r.isInsideText)throw new Error(`Text string "${t}" must be rendered inside component`);return Mo.createTextNode(t)},resetTextContent:()=>{},hideTextInstance:t=>{Mo.setTextNodeValue(t,"")},unhideTextInstance:(t,e)=>{Mo.setTextNodeValue(t,e)},getPublicInstance:t=>t,hideInstance:t=>{var e;(e=t.yogaNode)===null||e===void 0||e.setDisplay(cCe.default.DISPLAY_NONE)},unhideInstance:t=>{var e;(e=t.yogaNode)===null||e===void 0||e.setDisplay(cCe.default.DISPLAY_FLEX)},appendInitialChild:Mo.appendChildNode,appendChild:Mo.appendChildNode,insertBefore:Mo.insertBeforeNode,finalizeInitialChildren:(t,e,r,o)=>(t.internal_static&&(o.isStaticDirty=!0,o.staticNode=t),!1),supportsMutation:!0,appendChildToContainer:Mo.appendChildNode,insertInContainerBefore:Mo.insertBeforeNode,removeChildFromContainer:(t,e)=>{Mo.removeChildNode(t,e),uCe(e.yogaNode)},prepareUpdate:(t,e,r,o,a)=>{t.internal_static&&(a.isStaticDirty=!0);let n={},u=Object.keys(o);for(let A of u)if(o[A]!==r[A]){if(A==="style"&&typeof o.style=="object"&&typeof r.style=="object"){let h=o.style,E=r.style,I=Object.keys(h);for(let v of I){if(v==="borderStyle"||v==="borderColor"){if(typeof n.style!="object"){let b={};n.style=b}n.style.borderStyle=h.borderStyle,n.style.borderColor=h.borderColor}if(h[v]!==E[v]){if(typeof n.style!="object"){let b={};n.style=b}n.style[v]=h[v]}}continue}n[A]=o[A]}return n},commitUpdate:(t,e)=>{for(let[r,o]of Object.entries(e))r!=="children"&&(r==="style"?Mo.setStyle(t,o):r==="internal_transform"?t.internal_transform=o:r==="internal_static"?t.internal_static=!0:Mo.setAttribute(t,r,o))},commitTextUpdate:(t,e,r)=>{Mo.setTextNodeValue(t,r)},removeChild:(t,e)=>{Mo.removeChildNode(t,e),uCe(e.yogaNode)}})});var hCe=_((LVt,pCe)=>{"use strict";pCe.exports=(t,e=1,r)=>{if(r={indent:" ",includeEmptyLines:!1,...r},typeof t!="string")throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof t}\``);if(typeof e!="number")throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof e}\``);if(typeof r.indent!="string")throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof r.indent}\``);if(e===0)return t;let o=r.includeEmptyLines?/^/gm:/^(?!\s*$)/gm;return t.replace(o,r.indent.repeat(e))}});var gCe=_(hB=>{"use strict";var bEt=hB&&hB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(hB,"__esModule",{value:!0});var $k=bEt(om());hB.default=t=>t.getComputedWidth()-t.getComputedPadding($k.default.EDGE_LEFT)-t.getComputedPadding($k.default.EDGE_RIGHT)-t.getComputedBorder($k.default.EDGE_LEFT)-t.getComputedBorder($k.default.EDGE_RIGHT)});var dCe=_((OVt,kEt)=>{kEt.exports={single:{topLeft:"\u250C",topRight:"\u2510",bottomRight:"\u2518",bottomLeft:"\u2514",vertical:"\u2502",horizontal:"\u2500"},double:{topLeft:"\u2554",topRight:"\u2557",bottomRight:"\u255D",bottomLeft:"\u255A",vertical:"\u2551",horizontal:"\u2550"},round:{topLeft:"\u256D",topRight:"\u256E",bottomRight:"\u256F",bottomLeft:"\u2570",vertical:"\u2502",horizontal:"\u2500"},bold:{topLeft:"\u250F",topRight:"\u2513",bottomRight:"\u251B",bottomLeft:"\u2517",vertical:"\u2503",horizontal:"\u2501"},singleDouble:{topLeft:"\u2553",topRight:"\u2556",bottomRight:"\u255C",bottomLeft:"\u2559",vertical:"\u2551",horizontal:"\u2500"},doubleSingle:{topLeft:"\u2552",topRight:"\u2555",bottomRight:"\u255B",bottomLeft:"\u2558",vertical:"\u2502",horizontal:"\u2550"},classic:{topLeft:"+",topRight:"+",bottomRight:"+",bottomLeft:"+",vertical:"|",horizontal:"-"}}});var yCe=_((UVt,V6)=>{"use strict";var mCe=dCe();V6.exports=mCe;V6.exports.default=mCe});var CCe=_((_Vt,ECe)=>{"use strict";var QEt=(t,e,r)=>{let o=t.indexOf(e);if(o===-1)return t;let a=e.length,n=0,u="";do u+=t.substr(n,o-n)+e+r,n=o+a,o=t.indexOf(e,n);while(o!==-1);return u+=t.substr(n),u},FEt=(t,e,r,o)=>{let a=0,n="";do{let u=t[o-1]==="\r";n+=t.substr(a,(u?o-1:o)-a)+e+(u?`\r +`:` +`)+r,a=o+1,o=t.indexOf(` +`,a)}while(o!==-1);return n+=t.substr(a),n};ECe.exports={stringReplaceAll:QEt,stringEncaseCRLFWithFirstIndex:FEt}});var DCe=_((HVt,vCe)=>{"use strict";var TEt=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,wCe=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,REt=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,NEt=/\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi,LEt=new Map([["n",` +`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e","\x1B"],["a","\x07"]]);function BCe(t){let e=t[0]==="u",r=t[1]==="{";return e&&!r&&t.length===5||t[0]==="x"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):LEt.get(t)||t}function MEt(t,e){let r=[],o=e.trim().split(/\s*,\s*/g),a;for(let n of o){let u=Number(n);if(!Number.isNaN(u))r.push(u);else if(a=n.match(REt))r.push(a[2].replace(NEt,(A,p,h)=>p?BCe(p):h));else throw new Error(`Invalid Chalk template style argument: ${n} (in style '${t}')`)}return r}function OEt(t){wCe.lastIndex=0;let e=[],r;for(;(r=wCe.exec(t))!==null;){let o=r[1];if(r[2]){let a=MEt(o,r[2]);e.push([o].concat(a))}else e.push([o])}return e}function ICe(t,e){let r={};for(let a of e)for(let n of a.styles)r[n[0]]=a.inverse?null:n.slice(1);let o=t;for(let[a,n]of Object.entries(r))if(!!Array.isArray(n)){if(!(a in o))throw new Error(`Unknown Chalk style: ${a}`);o=n.length>0?o[a](...n):o[a]}return o}vCe.exports=(t,e)=>{let r=[],o=[],a=[];if(e.replace(TEt,(n,u,A,p,h,E)=>{if(u)a.push(BCe(u));else if(p){let I=a.join("");a=[],o.push(r.length===0?I:ICe(t,r)(I)),r.push({inverse:A,styles:OEt(p)})}else if(h){if(r.length===0)throw new Error("Found extraneous } in Chalk template literal");o.push(ICe(t,r)(a.join(""))),a=[],r.pop()}else a.push(E)}),o.push(a.join("")),r.length>0){let n=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?"":"s"} (\`}\`)`;throw new Error(n)}return o.join("")}});var iQ=_((jVt,QCe)=>{"use strict";var gB=vI(),{stdout:J6,stderr:z6}=yN(),{stringReplaceAll:UEt,stringEncaseCRLFWithFirstIndex:_Et}=CCe(),{isArray:eQ}=Array,SCe=["ansi","ansi","ansi256","ansi16m"],_C=Object.create(null),HEt=(t,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let r=J6?J6.level:0;t.level=e.level===void 0?r:e.level},X6=class{constructor(e){return xCe(e)}},xCe=t=>{let e={};return HEt(e,t),e.template=(...r)=>kCe(e.template,...r),Object.setPrototypeOf(e,tQ.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=X6,e.template};function tQ(t){return xCe(t)}for(let[t,e]of Object.entries(gB))_C[t]={get(){let r=rQ(this,Z6(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};_C.visible={get(){let t=rQ(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:t}),t}};var bCe=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let t of bCe)_C[t]={get(){let{level:e}=this;return function(...r){let o=Z6(gB.color[SCe[e]][t](...r),gB.color.close,this._styler);return rQ(this,o,this._isEmpty)}}};for(let t of bCe){let e="bg"+t[0].toUpperCase()+t.slice(1);_C[e]={get(){let{level:r}=this;return function(...o){let a=Z6(gB.bgColor[SCe[r]][t](...o),gB.bgColor.close,this._styler);return rQ(this,a,this._isEmpty)}}}}var jEt=Object.defineProperties(()=>{},{..._C,level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}}),Z6=(t,e,r)=>{let o,a;return r===void 0?(o=t,a=e):(o=r.openAll+t,a=e+r.closeAll),{open:t,close:e,openAll:o,closeAll:a,parent:r}},rQ=(t,e,r)=>{let o=(...a)=>eQ(a[0])&&eQ(a[0].raw)?PCe(o,kCe(o,...a)):PCe(o,a.length===1?""+a[0]:a.join(" "));return Object.setPrototypeOf(o,jEt),o._generator=t,o._styler=e,o._isEmpty=r,o},PCe=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?"":e;let r=t._styler;if(r===void 0)return e;let{openAll:o,closeAll:a}=r;if(e.indexOf("\x1B")!==-1)for(;r!==void 0;)e=UEt(e,r.close,r.open),r=r.parent;let n=e.indexOf(` +`);return n!==-1&&(e=_Et(e,a,o,n)),o+e+a},K6,kCe=(t,...e)=>{let[r]=e;if(!eQ(r)||!eQ(r.raw))return e.join(" ");let o=e.slice(1),a=[r.raw[0]];for(let n=1;n{"use strict";var qEt=mB&&mB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(mB,"__esModule",{value:!0});var dB=qEt(iQ()),GEt=/^(rgb|hsl|hsv|hwb)\(\s?(\d+),\s?(\d+),\s?(\d+)\s?\)$/,YEt=/^(ansi|ansi256)\(\s?(\d+)\s?\)$/,sQ=(t,e)=>e==="foreground"?t:"bg"+t[0].toUpperCase()+t.slice(1);mB.default=(t,e,r)=>{if(!e)return t;if(e in dB.default){let a=sQ(e,r);return dB.default[a](t)}if(e.startsWith("#")){let a=sQ("hex",r);return dB.default[a](e)(t)}if(e.startsWith("ansi")){let a=YEt.exec(e);if(!a)return t;let n=sQ(a[1],r),u=Number(a[2]);return dB.default[n](u)(t)}if(e.startsWith("rgb")||e.startsWith("hsl")||e.startsWith("hsv")||e.startsWith("hwb")){let a=GEt.exec(e);if(!a)return t;let n=sQ(a[1],r),u=Number(a[2]),A=Number(a[3]),p=Number(a[4]);return dB.default[n](u,A,p)(t)}return t}});var TCe=_(yB=>{"use strict";var FCe=yB&&yB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(yB,"__esModule",{value:!0});var WEt=FCe(yCe()),ej=FCe($6());yB.default=(t,e,r,o)=>{if(typeof r.style.borderStyle=="string"){let a=r.yogaNode.getComputedWidth(),n=r.yogaNode.getComputedHeight(),u=r.style.borderColor,A=WEt.default[r.style.borderStyle],p=ej.default(A.topLeft+A.horizontal.repeat(a-2)+A.topRight,u,"foreground"),h=(ej.default(A.vertical,u,"foreground")+` +`).repeat(n-2),E=ej.default(A.bottomLeft+A.horizontal.repeat(a-2)+A.bottomRight,u,"foreground");o.write(t,e,p,{transformers:[]}),o.write(t,e+1,h,{transformers:[]}),o.write(t+a-1,e+1,h,{transformers:[]}),o.write(t,e+n-1,E,{transformers:[]})}}});var NCe=_(EB=>{"use strict";var am=EB&&EB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(EB,"__esModule",{value:!0});var VEt=am(om()),KEt=am(M6()),JEt=am(hCe()),zEt=am(q6()),XEt=am(gCe()),ZEt=am(Y6()),$Et=am(TCe()),eCt=(t,e)=>{var r;let o=(r=t.childNodes[0])===null||r===void 0?void 0:r.yogaNode;if(o){let a=o.getComputedLeft(),n=o.getComputedTop();e=` +`.repeat(n)+JEt.default(e,a)}return e},RCe=(t,e,r)=>{var o;let{offsetX:a=0,offsetY:n=0,transformers:u=[],skipStaticElements:A}=r;if(A&&t.internal_static)return;let{yogaNode:p}=t;if(p){if(p.getDisplay()===VEt.default.DISPLAY_NONE)return;let h=a+p.getComputedLeft(),E=n+p.getComputedTop(),I=u;if(typeof t.internal_transform=="function"&&(I=[t.internal_transform,...u]),t.nodeName==="ink-text"){let v=ZEt.default(t);if(v.length>0){let b=KEt.default(v),C=XEt.default(p);if(b>C){let T=(o=t.style.textWrap)!==null&&o!==void 0?o:"wrap";v=zEt.default(v,C,T)}v=eCt(t,v),e.write(h,E,v,{transformers:I})}return}if(t.nodeName==="ink-box"&&$Et.default(h,E,t,e),t.nodeName==="ink-root"||t.nodeName==="ink-box")for(let v of t.childNodes)RCe(v,e,{offsetX:h,offsetY:E,transformers:I,skipStaticElements:A})}};EB.default=RCe});var MCe=_((WVt,LCe)=>{"use strict";LCe.exports=t=>{t=Object.assign({onlyFirst:!1},t);let e=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(e,t.onlyFirst?void 0:"g")}});var UCe=_((VVt,tj)=>{"use strict";var tCt=MCe(),OCe=t=>typeof t=="string"?t.replace(tCt(),""):t;tj.exports=OCe;tj.exports.default=OCe});var jCe=_((KVt,HCe)=>{"use strict";var _Ce="[\uD800-\uDBFF][\uDC00-\uDFFF]";HCe.exports=t=>t&&t.exact?new RegExp(`^${_Ce}$`):new RegExp(_Ce,"g")});var GCe=_((JVt,rj)=>{"use strict";var rCt=UCe(),nCt=jCe(),qCe=t=>rCt(t).replace(nCt()," ").length;rj.exports=qCe;rj.exports.default=qCe});var VCe=_(CB=>{"use strict";var WCe=CB&&CB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(CB,"__esModule",{value:!0});var YCe=WCe(H6()),iCt=WCe(GCe()),nj=class{constructor(e){this.writes=[];let{width:r,height:o}=e;this.width=r,this.height=o}write(e,r,o,a){let{transformers:n}=a;!o||this.writes.push({x:e,y:r,text:o,transformers:n})}get(){let e=[];for(let o=0;oo.trimRight()).join(` +`),height:e.length}}};CB.default=nj});var zCe=_(wB=>{"use strict";var ij=wB&&wB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(wB,"__esModule",{value:!0});var sCt=ij(om()),KCe=ij(NCe()),JCe=ij(VCe());wB.default=(t,e)=>{var r;if(t.yogaNode.setWidth(e),t.yogaNode){t.yogaNode.calculateLayout(void 0,void 0,sCt.default.DIRECTION_LTR);let o=new JCe.default({width:t.yogaNode.getComputedWidth(),height:t.yogaNode.getComputedHeight()});KCe.default(t,o,{skipStaticElements:!0});let a;!((r=t.staticNode)===null||r===void 0)&&r.yogaNode&&(a=new JCe.default({width:t.staticNode.yogaNode.getComputedWidth(),height:t.staticNode.yogaNode.getComputedHeight()}),KCe.default(t.staticNode,a,{skipStaticElements:!1}));let{output:n,height:u}=o.get();return{output:n,outputHeight:u,staticOutput:a?`${a.get().output} +`:""}}return{output:"",outputHeight:0,staticOutput:""}}});var ewe=_((ZVt,$Ce)=>{"use strict";var XCe=Be("stream"),ZCe=["assert","count","countReset","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","table","time","timeEnd","timeLog","trace","warn"],sj={},oCt=t=>{let e=new XCe.PassThrough,r=new XCe.PassThrough;e.write=a=>t("stdout",a),r.write=a=>t("stderr",a);let o=new console.Console(e,r);for(let a of ZCe)sj[a]=console[a],console[a]=o[a];return()=>{for(let a of ZCe)console[a]=sj[a];sj={}}};$Ce.exports=oCt});var aj=_(oj=>{"use strict";Object.defineProperty(oj,"__esModule",{value:!0});oj.default=new WeakMap});var cj=_(lj=>{"use strict";Object.defineProperty(lj,"__esModule",{value:!0});var aCt=sn(),twe=aCt.createContext({exit:()=>{}});twe.displayName="InternalAppContext";lj.default=twe});var Aj=_(uj=>{"use strict";Object.defineProperty(uj,"__esModule",{value:!0});var lCt=sn(),rwe=lCt.createContext({stdin:void 0,setRawMode:()=>{},isRawModeSupported:!1,internal_exitOnCtrlC:!0});rwe.displayName="InternalStdinContext";uj.default=rwe});var pj=_(fj=>{"use strict";Object.defineProperty(fj,"__esModule",{value:!0});var cCt=sn(),nwe=cCt.createContext({stdout:void 0,write:()=>{}});nwe.displayName="InternalStdoutContext";fj.default=nwe});var gj=_(hj=>{"use strict";Object.defineProperty(hj,"__esModule",{value:!0});var uCt=sn(),iwe=uCt.createContext({stderr:void 0,write:()=>{}});iwe.displayName="InternalStderrContext";hj.default=iwe});var oQ=_(dj=>{"use strict";Object.defineProperty(dj,"__esModule",{value:!0});var ACt=sn(),swe=ACt.createContext({activeId:void 0,add:()=>{},remove:()=>{},activate:()=>{},deactivate:()=>{},enableFocus:()=>{},disableFocus:()=>{},focusNext:()=>{},focusPrevious:()=>{}});swe.displayName="InternalFocusContext";dj.default=swe});var awe=_((sKt,owe)=>{"use strict";var fCt=/[|\\{}()[\]^$+*?.-]/g;owe.exports=t=>{if(typeof t!="string")throw new TypeError("Expected a string");return t.replace(fCt,"\\$&")}});var Awe=_((oKt,uwe)=>{"use strict";var pCt=awe(),hCt=typeof process=="object"&&process&&typeof process.cwd=="function"?process.cwd():".",cwe=[].concat(Be("module").builtinModules,"bootstrap_node","node").map(t=>new RegExp(`(?:\\((?:node:)?${t}(?:\\.js)?:\\d+:\\d+\\)$|^\\s*at (?:node:)?${t}(?:\\.js)?:\\d+:\\d+$)`));cwe.push(/\((?:node:)?internal\/[^:]+:\d+:\d+\)$/,/\s*at (?:node:)?internal\/[^:]+:\d+:\d+$/,/\/\.node-spawn-wrap-\w+-\w+\/node:\d+:\d+\)?$/);var IB=class{constructor(e){e={ignoredPackages:[],...e},"internals"in e||(e.internals=IB.nodeInternals()),"cwd"in e||(e.cwd=hCt),this._cwd=e.cwd.replace(/\\/g,"/"),this._internals=[].concat(e.internals,gCt(e.ignoredPackages)),this._wrapCallSite=e.wrapCallSite||!1}static nodeInternals(){return[...cwe]}clean(e,r=0){r=" ".repeat(r),Array.isArray(e)||(e=e.split(` +`)),!/^\s*at /.test(e[0])&&/^\s*at /.test(e[1])&&(e=e.slice(1));let o=!1,a=null,n=[];return e.forEach(u=>{if(u=u.replace(/\\/g,"/"),this._internals.some(p=>p.test(u)))return;let A=/^\s*at /.test(u);o?u=u.trimEnd().replace(/^(\s+)at /,"$1"):(u=u.trim(),A&&(u=u.slice(3))),u=u.replace(`${this._cwd}/`,""),u&&(A?(a&&(n.push(a),a=null),n.push(u)):(o=!0,a=u))}),n.map(u=>`${r}${u} +`).join("")}captureString(e,r=this.captureString){typeof e=="function"&&(r=e,e=1/0);let{stackTraceLimit:o}=Error;e&&(Error.stackTraceLimit=e);let a={};Error.captureStackTrace(a,r);let{stack:n}=a;return Error.stackTraceLimit=o,this.clean(n)}capture(e,r=this.capture){typeof e=="function"&&(r=e,e=1/0);let{prepareStackTrace:o,stackTraceLimit:a}=Error;Error.prepareStackTrace=(A,p)=>this._wrapCallSite?p.map(this._wrapCallSite):p,e&&(Error.stackTraceLimit=e);let n={};Error.captureStackTrace(n,r);let{stack:u}=n;return Object.assign(Error,{prepareStackTrace:o,stackTraceLimit:a}),u}at(e=this.at){let[r]=this.capture(1,e);if(!r)return{};let o={line:r.getLineNumber(),column:r.getColumnNumber()};lwe(o,r.getFileName(),this._cwd),r.isConstructor()&&(o.constructor=!0),r.isEval()&&(o.evalOrigin=r.getEvalOrigin()),r.isNative()&&(o.native=!0);let a;try{a=r.getTypeName()}catch{}a&&a!=="Object"&&a!=="[object Object]"&&(o.type=a);let n=r.getFunctionName();n&&(o.function=n);let u=r.getMethodName();return u&&n!==u&&(o.method=u),o}parseLine(e){let r=e&&e.match(dCt);if(!r)return null;let o=r[1]==="new",a=r[2],n=r[3],u=r[4],A=Number(r[5]),p=Number(r[6]),h=r[7],E=r[8],I=r[9],v=r[10]==="native",b=r[11]===")",C,T={};if(E&&(T.line=Number(E)),I&&(T.column=Number(I)),b&&h){let L=0;for(let U=h.length-1;U>0;U--)if(h.charAt(U)===")")L++;else if(h.charAt(U)==="("&&h.charAt(U-1)===" "&&(L--,L===-1&&h.charAt(U-1)===" ")){let J=h.slice(0,U-1);h=h.slice(U+1),a+=` (${J}`;break}}if(a){let L=a.match(mCt);L&&(a=L[1],C=L[2])}return lwe(T,h,this._cwd),o&&(T.constructor=!0),n&&(T.evalOrigin=n,T.evalLine=A,T.evalColumn=p,T.evalFile=u&&u.replace(/\\/g,"/")),v&&(T.native=!0),a&&(T.function=a),C&&a!==C&&(T.method=C),T}};function lwe(t,e,r){e&&(e=e.replace(/\\/g,"/"),e.startsWith(`${r}/`)&&(e=e.slice(r.length+1)),t.file=e)}function gCt(t){if(t.length===0)return[];let e=t.map(r=>pCt(r));return new RegExp(`[/\\\\]node_modules[/\\\\](?:${e.join("|")})[/\\\\][^:]+:\\d+:\\d+`)}var dCt=new RegExp("^(?:\\s*at )?(?:(new) )?(?:(.*?) \\()?(?:eval at ([^ ]+) \\((.+?):(\\d+):(\\d+)\\), )?(?:(.+?):(\\d+):(\\d+)|(native))(\\)?)$"),mCt=/^(.*?) \[as (.*?)\]$/;uwe.exports=IB});var pwe=_((aKt,fwe)=>{"use strict";fwe.exports=(t,e)=>t.replace(/^\t+/gm,r=>" ".repeat(r.length*(e||2)))});var gwe=_((lKt,hwe)=>{"use strict";var yCt=pwe(),ECt=(t,e)=>{let r=[],o=t-e,a=t+e;for(let n=o;n<=a;n++)r.push(n);return r};hwe.exports=(t,e,r)=>{if(typeof t!="string")throw new TypeError("Source code is missing.");if(!e||e<1)throw new TypeError("Line number must start from `1`.");if(t=yCt(t).split(/\r?\n/),!(e>t.length))return r={around:3,...r},ECt(e,r.around).filter(o=>t[o-1]!==void 0).map(o=>({line:o,value:t[o-1]}))}});var aQ=_(ru=>{"use strict";var CCt=ru&&ru.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),wCt=ru&&ru.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),ICt=ru&&ru.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&CCt(e,t,r);return wCt(e,t),e},BCt=ru&&ru.__rest||function(t,e){var r={};for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&e.indexOf(o)<0&&(r[o]=t[o]);if(t!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,o=Object.getOwnPropertySymbols(t);a{var{children:r}=t,o=BCt(t,["children"]);let a=Object.assign(Object.assign({},o),{marginLeft:o.marginLeft||o.marginX||o.margin||0,marginRight:o.marginRight||o.marginX||o.margin||0,marginTop:o.marginTop||o.marginY||o.margin||0,marginBottom:o.marginBottom||o.marginY||o.margin||0,paddingLeft:o.paddingLeft||o.paddingX||o.padding||0,paddingRight:o.paddingRight||o.paddingX||o.padding||0,paddingTop:o.paddingTop||o.paddingY||o.padding||0,paddingBottom:o.paddingBottom||o.paddingY||o.padding||0});return dwe.default.createElement("ink-box",{ref:e,style:a},r)});mj.displayName="Box";mj.defaultProps={flexDirection:"row",flexGrow:0,flexShrink:1};ru.default=mj});var Cj=_(BB=>{"use strict";var yj=BB&&BB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(BB,"__esModule",{value:!0});var vCt=yj(sn()),HC=yj(iQ()),mwe=yj($6()),Ej=({color:t,backgroundColor:e,dimColor:r,bold:o,italic:a,underline:n,strikethrough:u,inverse:A,wrap:p,children:h})=>{if(h==null)return null;let E=I=>(r&&(I=HC.default.dim(I)),t&&(I=mwe.default(I,t,"foreground")),e&&(I=mwe.default(I,e,"background")),o&&(I=HC.default.bold(I)),a&&(I=HC.default.italic(I)),n&&(I=HC.default.underline(I)),u&&(I=HC.default.strikethrough(I)),A&&(I=HC.default.inverse(I)),I);return vCt.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row",textWrap:p},internal_transform:E},h)};Ej.displayName="Text";Ej.defaultProps={dimColor:!1,bold:!1,italic:!1,underline:!1,strikethrough:!1,wrap:"wrap"};BB.default=Ej});var wwe=_(nu=>{"use strict";var DCt=nu&&nu.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),PCt=nu&&nu.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),SCt=nu&&nu.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&DCt(e,t,r);return PCt(e,t),e},vB=nu&&nu.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(nu,"__esModule",{value:!0});var ywe=SCt(Be("fs")),fs=vB(sn()),Ewe=vB(Awe()),xCt=vB(gwe()),Xf=vB(aQ()),hA=vB(Cj()),Cwe=new Ewe.default({cwd:process.cwd(),internals:Ewe.default.nodeInternals()}),bCt=({error:t})=>{let e=t.stack?t.stack.split(` +`).slice(1):void 0,r=e?Cwe.parseLine(e[0]):void 0,o,a=0;if(r?.file&&r?.line&&ywe.existsSync(r.file)){let n=ywe.readFileSync(r.file,"utf8");if(o=xCt.default(n,r.line),o)for(let{line:u}of o)a=Math.max(a,String(u).length)}return fs.default.createElement(Xf.default,{flexDirection:"column",padding:1},fs.default.createElement(Xf.default,null,fs.default.createElement(hA.default,{backgroundColor:"red",color:"white"}," ","ERROR"," "),fs.default.createElement(hA.default,null," ",t.message)),r&&fs.default.createElement(Xf.default,{marginTop:1},fs.default.createElement(hA.default,{dimColor:!0},r.file,":",r.line,":",r.column)),r&&o&&fs.default.createElement(Xf.default,{marginTop:1,flexDirection:"column"},o.map(({line:n,value:u})=>fs.default.createElement(Xf.default,{key:n},fs.default.createElement(Xf.default,{width:a+1},fs.default.createElement(hA.default,{dimColor:n!==r.line,backgroundColor:n===r.line?"red":void 0,color:n===r.line?"white":void 0},String(n).padStart(a," "),":")),fs.default.createElement(hA.default,{key:n,backgroundColor:n===r.line?"red":void 0,color:n===r.line?"white":void 0}," "+u)))),t.stack&&fs.default.createElement(Xf.default,{marginTop:1,flexDirection:"column"},t.stack.split(` +`).slice(1).map(n=>{let u=Cwe.parseLine(n);return u?fs.default.createElement(Xf.default,{key:n},fs.default.createElement(hA.default,{dimColor:!0},"- "),fs.default.createElement(hA.default,{dimColor:!0,bold:!0},u.function),fs.default.createElement(hA.default,{dimColor:!0,color:"gray"}," ","(",u.file,":",u.line,":",u.column,")")):fs.default.createElement(Xf.default,{key:n},fs.default.createElement(hA.default,{dimColor:!0},"- "),fs.default.createElement(hA.default,{dimColor:!0,bold:!0},n))})))};nu.default=bCt});var Bwe=_(iu=>{"use strict";var kCt=iu&&iu.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),QCt=iu&&iu.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),FCt=iu&&iu.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&kCt(e,t,r);return QCt(e,t),e},cm=iu&&iu.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(iu,"__esModule",{value:!0});var lm=FCt(sn()),Iwe=cm(m6()),TCt=cm(cj()),RCt=cm(Aj()),NCt=cm(pj()),LCt=cm(gj()),MCt=cm(oQ()),OCt=cm(wwe()),UCt=" ",_Ct="\x1B[Z",HCt="\x1B",lQ=class extends lm.PureComponent{constructor(){super(...arguments),this.state={isFocusEnabled:!0,activeFocusId:void 0,focusables:[],error:void 0},this.rawModeEnabledCount=0,this.handleSetRawMode=e=>{let{stdin:r}=this.props;if(!this.isRawModeSupported())throw r===process.stdin?new Error(`Raw mode is not supported on the current process.stdin, which Ink uses as input stream by default. +Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`):new Error(`Raw mode is not supported on the stdin provided to Ink. +Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`);if(r.setEncoding("utf8"),e){this.rawModeEnabledCount===0&&(r.addListener("data",this.handleInput),r.resume(),r.setRawMode(!0)),this.rawModeEnabledCount++;return}--this.rawModeEnabledCount===0&&(r.setRawMode(!1),r.removeListener("data",this.handleInput),r.pause())},this.handleInput=e=>{e===""&&this.props.exitOnCtrlC&&this.handleExit(),e===HCt&&this.state.activeFocusId&&this.setState({activeFocusId:void 0}),this.state.isFocusEnabled&&this.state.focusables.length>0&&(e===UCt&&this.focusNext(),e===_Ct&&this.focusPrevious())},this.handleExit=e=>{this.isRawModeSupported()&&this.handleSetRawMode(!1),this.props.onExit(e)},this.enableFocus=()=>{this.setState({isFocusEnabled:!0})},this.disableFocus=()=>{this.setState({isFocusEnabled:!1})},this.focusNext=()=>{this.setState(e=>{let r=e.focusables[0].id;return{activeFocusId:this.findNextFocusable(e)||r}})},this.focusPrevious=()=>{this.setState(e=>{let r=e.focusables[e.focusables.length-1].id;return{activeFocusId:this.findPreviousFocusable(e)||r}})},this.addFocusable=(e,{autoFocus:r})=>{this.setState(o=>{let a=o.activeFocusId;return!a&&r&&(a=e),{activeFocusId:a,focusables:[...o.focusables,{id:e,isActive:!0}]}})},this.removeFocusable=e=>{this.setState(r=>({activeFocusId:r.activeFocusId===e?void 0:r.activeFocusId,focusables:r.focusables.filter(o=>o.id!==e)}))},this.activateFocusable=e=>{this.setState(r=>({focusables:r.focusables.map(o=>o.id!==e?o:{id:e,isActive:!0})}))},this.deactivateFocusable=e=>{this.setState(r=>({activeFocusId:r.activeFocusId===e?void 0:r.activeFocusId,focusables:r.focusables.map(o=>o.id!==e?o:{id:e,isActive:!1})}))},this.findNextFocusable=e=>{let r=e.focusables.findIndex(o=>o.id===e.activeFocusId);for(let o=r+1;o{let r=e.focusables.findIndex(o=>o.id===e.activeFocusId);for(let o=r-1;o>=0;o--)if(e.focusables[o].isActive)return e.focusables[o].id}}static getDerivedStateFromError(e){return{error:e}}isRawModeSupported(){return this.props.stdin.isTTY}render(){return lm.default.createElement(TCt.default.Provider,{value:{exit:this.handleExit}},lm.default.createElement(RCt.default.Provider,{value:{stdin:this.props.stdin,setRawMode:this.handleSetRawMode,isRawModeSupported:this.isRawModeSupported(),internal_exitOnCtrlC:this.props.exitOnCtrlC}},lm.default.createElement(NCt.default.Provider,{value:{stdout:this.props.stdout,write:this.props.writeToStdout}},lm.default.createElement(LCt.default.Provider,{value:{stderr:this.props.stderr,write:this.props.writeToStderr}},lm.default.createElement(MCt.default.Provider,{value:{activeId:this.state.activeFocusId,add:this.addFocusable,remove:this.removeFocusable,activate:this.activateFocusable,deactivate:this.deactivateFocusable,enableFocus:this.enableFocus,disableFocus:this.disableFocus,focusNext:this.focusNext,focusPrevious:this.focusPrevious}},this.state.error?lm.default.createElement(OCt.default,{error:this.state.error}):this.props.children)))))}componentDidMount(){Iwe.default.hide(this.props.stdout)}componentWillUnmount(){Iwe.default.show(this.props.stdout),this.isRawModeSupported()&&this.handleSetRawMode(!1)}componentDidCatch(e){this.handleExit(e)}};iu.default=lQ;lQ.displayName="InternalApp"});var Pwe=_(su=>{"use strict";var jCt=su&&su.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),qCt=su&&su.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),GCt=su&&su.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&jCt(e,t,r);return qCt(e,t),e},ou=su&&su.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(su,"__esModule",{value:!0});var YCt=ou(sn()),vwe=uO(),WCt=ou(AEe()),VCt=ou(f6()),KCt=ou(mEe()),JCt=ou(EEe()),wj=ou(fCe()),zCt=ou(zCe()),XCt=ou(d6()),ZCt=ou(ewe()),$Ct=GCt(W6()),ewt=ou(aj()),twt=ou(Bwe()),jC=process.env.CI==="false"?!1:KCt.default,Dwe=()=>{},Ij=class{constructor(e){this.resolveExitPromise=()=>{},this.rejectExitPromise=()=>{},this.unsubscribeExit=()=>{},this.onRender=()=>{if(this.isUnmounted)return;let{output:r,outputHeight:o,staticOutput:a}=zCt.default(this.rootNode,this.options.stdout.columns||80),n=a&&a!==` +`;if(this.options.debug){n&&(this.fullStaticOutput+=a),this.options.stdout.write(this.fullStaticOutput+r);return}if(jC){n&&this.options.stdout.write(a),this.lastOutput=r;return}if(n&&(this.fullStaticOutput+=a),o>=this.options.stdout.rows){this.options.stdout.write(VCt.default.clearTerminal+this.fullStaticOutput+r),this.lastOutput=r;return}n&&(this.log.clear(),this.options.stdout.write(a),this.log(r)),!n&&r!==this.lastOutput&&this.throttledLog(r),this.lastOutput=r},JCt.default(this),this.options=e,this.rootNode=$Ct.createNode("ink-root"),this.rootNode.onRender=e.debug?this.onRender:vwe(this.onRender,32,{leading:!0,trailing:!0}),this.rootNode.onImmediateRender=this.onRender,this.log=WCt.default.create(e.stdout),this.throttledLog=e.debug?this.log:vwe(this.log,void 0,{leading:!0,trailing:!0}),this.isUnmounted=!1,this.lastOutput="",this.fullStaticOutput="",this.container=wj.default.createContainer(this.rootNode,!1,!1),this.unsubscribeExit=XCt.default(this.unmount,{alwaysLast:!1}),e.patchConsole&&this.patchConsole(),jC||(e.stdout.on("resize",this.onRender),this.unsubscribeResize=()=>{e.stdout.off("resize",this.onRender)})}render(e){let r=YCt.default.createElement(twt.default,{stdin:this.options.stdin,stdout:this.options.stdout,stderr:this.options.stderr,writeToStdout:this.writeToStdout,writeToStderr:this.writeToStderr,exitOnCtrlC:this.options.exitOnCtrlC,onExit:this.unmount},e);wj.default.updateContainer(r,this.container,null,Dwe)}writeToStdout(e){if(!this.isUnmounted){if(this.options.debug){this.options.stdout.write(e+this.fullStaticOutput+this.lastOutput);return}if(jC){this.options.stdout.write(e);return}this.log.clear(),this.options.stdout.write(e),this.log(this.lastOutput)}}writeToStderr(e){if(!this.isUnmounted){if(this.options.debug){this.options.stderr.write(e),this.options.stdout.write(this.fullStaticOutput+this.lastOutput);return}if(jC){this.options.stderr.write(e);return}this.log.clear(),this.options.stderr.write(e),this.log(this.lastOutput)}}unmount(e){this.isUnmounted||(this.onRender(),this.unsubscribeExit(),typeof this.restoreConsole=="function"&&this.restoreConsole(),typeof this.unsubscribeResize=="function"&&this.unsubscribeResize(),jC?this.options.stdout.write(this.lastOutput+` +`):this.options.debug||this.log.done(),this.isUnmounted=!0,wj.default.updateContainer(null,this.container,null,Dwe),ewt.default.delete(this.options.stdout),e instanceof Error?this.rejectExitPromise(e):this.resolveExitPromise())}waitUntilExit(){return this.exitPromise||(this.exitPromise=new Promise((e,r)=>{this.resolveExitPromise=e,this.rejectExitPromise=r})),this.exitPromise}clear(){!jC&&!this.options.debug&&this.log.clear()}patchConsole(){this.options.debug||(this.restoreConsole=ZCt.default((e,r)=>{e==="stdout"&&this.writeToStdout(r),e==="stderr"&&(r.startsWith("The above error occurred")||this.writeToStderr(r))}))}};su.default=Ij});var xwe=_(DB=>{"use strict";var Swe=DB&&DB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(DB,"__esModule",{value:!0});var rwt=Swe(Pwe()),cQ=Swe(aj()),nwt=Be("stream"),iwt=(t,e)=>{let r=Object.assign({stdout:process.stdout,stdin:process.stdin,stderr:process.stderr,debug:!1,exitOnCtrlC:!0,patchConsole:!0},swt(e)),o=owt(r.stdout,()=>new rwt.default(r));return o.render(t),{rerender:o.render,unmount:()=>o.unmount(),waitUntilExit:o.waitUntilExit,cleanup:()=>cQ.default.delete(r.stdout),clear:o.clear}};DB.default=iwt;var swt=(t={})=>t instanceof nwt.Stream?{stdout:t,stdin:process.stdin}:t,owt=(t,e)=>{let r;return cQ.default.has(t)?r=cQ.default.get(t):(r=e(),cQ.default.set(t,r)),r}});var kwe=_(Zf=>{"use strict";var awt=Zf&&Zf.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),lwt=Zf&&Zf.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),cwt=Zf&&Zf.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&awt(e,t,r);return lwt(e,t),e};Object.defineProperty(Zf,"__esModule",{value:!0});var PB=cwt(sn()),bwe=t=>{let{items:e,children:r,style:o}=t,[a,n]=PB.useState(0),u=PB.useMemo(()=>e.slice(a),[e,a]);PB.useLayoutEffect(()=>{n(e.length)},[e.length]);let A=u.map((h,E)=>r(h,a+E)),p=PB.useMemo(()=>Object.assign({position:"absolute",flexDirection:"column"},o),[o]);return PB.default.createElement("ink-box",{internal_static:!0,style:p},A)};bwe.displayName="Static";Zf.default=bwe});var Fwe=_(SB=>{"use strict";var uwt=SB&&SB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(SB,"__esModule",{value:!0});var Awt=uwt(sn()),Qwe=({children:t,transform:e})=>t==null?null:Awt.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row"},internal_transform:e},t);Qwe.displayName="Transform";SB.default=Qwe});var Rwe=_(xB=>{"use strict";var fwt=xB&&xB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(xB,"__esModule",{value:!0});var pwt=fwt(sn()),Twe=({count:t=1})=>pwt.default.createElement("ink-text",null,` +`.repeat(t));Twe.displayName="Newline";xB.default=Twe});var Mwe=_(bB=>{"use strict";var Nwe=bB&&bB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(bB,"__esModule",{value:!0});var hwt=Nwe(sn()),gwt=Nwe(aQ()),Lwe=()=>hwt.default.createElement(gwt.default,{flexGrow:1});Lwe.displayName="Spacer";bB.default=Lwe});var uQ=_(kB=>{"use strict";var dwt=kB&&kB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(kB,"__esModule",{value:!0});var mwt=sn(),ywt=dwt(Aj()),Ewt=()=>mwt.useContext(ywt.default);kB.default=Ewt});var Uwe=_(QB=>{"use strict";var Cwt=QB&&QB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(QB,"__esModule",{value:!0});var Owe=sn(),wwt=Cwt(uQ()),Iwt=(t,e={})=>{let{stdin:r,setRawMode:o,internal_exitOnCtrlC:a}=wwt.default();Owe.useEffect(()=>{if(e.isActive!==!1)return o(!0),()=>{o(!1)}},[e.isActive,o]),Owe.useEffect(()=>{if(e.isActive===!1)return;let n=u=>{let A=String(u),p={upArrow:A==="\x1B[A",downArrow:A==="\x1B[B",leftArrow:A==="\x1B[D",rightArrow:A==="\x1B[C",pageDown:A==="\x1B[6~",pageUp:A==="\x1B[5~",return:A==="\r",escape:A==="\x1B",ctrl:!1,shift:!1,tab:A===" "||A==="\x1B[Z",backspace:A==="\b",delete:A==="\x7F"||A==="\x1B[3~",meta:!1};A<=""&&!p.return&&(A=String.fromCharCode(A.charCodeAt(0)+"a".charCodeAt(0)-1),p.ctrl=!0),A.startsWith("\x1B")&&(A=A.slice(1),p.meta=!0);let h=A>="A"&&A<="Z",E=A>="\u0410"&&A<="\u042F";A.length===1&&(h||E)&&(p.shift=!0),p.tab&&A==="[Z"&&(p.shift=!0),(p.tab||p.backspace||p.delete)&&(A=""),(!(A==="c"&&p.ctrl)||!a)&&t(A,p)};return r?.on("data",n),()=>{r?.off("data",n)}},[e.isActive,r,a,t])};QB.default=Iwt});var _we=_(FB=>{"use strict";var Bwt=FB&&FB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(FB,"__esModule",{value:!0});var vwt=sn(),Dwt=Bwt(cj()),Pwt=()=>vwt.useContext(Dwt.default);FB.default=Pwt});var Hwe=_(TB=>{"use strict";var Swt=TB&&TB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(TB,"__esModule",{value:!0});var xwt=sn(),bwt=Swt(pj()),kwt=()=>xwt.useContext(bwt.default);TB.default=kwt});var jwe=_(RB=>{"use strict";var Qwt=RB&&RB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(RB,"__esModule",{value:!0});var Fwt=sn(),Twt=Qwt(gj()),Rwt=()=>Fwt.useContext(Twt.default);RB.default=Rwt});var Gwe=_(LB=>{"use strict";var qwe=LB&&LB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(LB,"__esModule",{value:!0});var NB=sn(),Nwt=qwe(oQ()),Lwt=qwe(uQ()),Mwt=({isActive:t=!0,autoFocus:e=!1}={})=>{let{isRawModeSupported:r,setRawMode:o}=Lwt.default(),{activeId:a,add:n,remove:u,activate:A,deactivate:p}=NB.useContext(Nwt.default),h=NB.useMemo(()=>Math.random().toString().slice(2,7),[]);return NB.useEffect(()=>(n(h,{autoFocus:e}),()=>{u(h)}),[h,e]),NB.useEffect(()=>{t?A(h):p(h)},[t,h]),NB.useEffect(()=>{if(!(!r||!t))return o(!0),()=>{o(!1)}},[t]),{isFocused:Boolean(h)&&a===h}};LB.default=Mwt});var Ywe=_(MB=>{"use strict";var Owt=MB&&MB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(MB,"__esModule",{value:!0});var Uwt=sn(),_wt=Owt(oQ()),Hwt=()=>{let t=Uwt.useContext(_wt.default);return{enableFocus:t.enableFocus,disableFocus:t.disableFocus,focusNext:t.focusNext,focusPrevious:t.focusPrevious}};MB.default=Hwt});var Wwe=_(Bj=>{"use strict";Object.defineProperty(Bj,"__esModule",{value:!0});Bj.default=t=>{var e,r,o,a;return{width:(r=(e=t.yogaNode)===null||e===void 0?void 0:e.getComputedWidth())!==null&&r!==void 0?r:0,height:(a=(o=t.yogaNode)===null||o===void 0?void 0:o.getComputedHeight())!==null&&a!==void 0?a:0}}});var ic=_(ro=>{"use strict";Object.defineProperty(ro,"__esModule",{value:!0});var jwt=xwe();Object.defineProperty(ro,"render",{enumerable:!0,get:function(){return jwt.default}});var qwt=aQ();Object.defineProperty(ro,"Box",{enumerable:!0,get:function(){return qwt.default}});var Gwt=Cj();Object.defineProperty(ro,"Text",{enumerable:!0,get:function(){return Gwt.default}});var Ywt=kwe();Object.defineProperty(ro,"Static",{enumerable:!0,get:function(){return Ywt.default}});var Wwt=Fwe();Object.defineProperty(ro,"Transform",{enumerable:!0,get:function(){return Wwt.default}});var Vwt=Rwe();Object.defineProperty(ro,"Newline",{enumerable:!0,get:function(){return Vwt.default}});var Kwt=Mwe();Object.defineProperty(ro,"Spacer",{enumerable:!0,get:function(){return Kwt.default}});var Jwt=Uwe();Object.defineProperty(ro,"useInput",{enumerable:!0,get:function(){return Jwt.default}});var zwt=_we();Object.defineProperty(ro,"useApp",{enumerable:!0,get:function(){return zwt.default}});var Xwt=uQ();Object.defineProperty(ro,"useStdin",{enumerable:!0,get:function(){return Xwt.default}});var Zwt=Hwe();Object.defineProperty(ro,"useStdout",{enumerable:!0,get:function(){return Zwt.default}});var $wt=jwe();Object.defineProperty(ro,"useStderr",{enumerable:!0,get:function(){return $wt.default}});var eIt=Gwe();Object.defineProperty(ro,"useFocus",{enumerable:!0,get:function(){return eIt.default}});var tIt=Ywe();Object.defineProperty(ro,"useFocusManager",{enumerable:!0,get:function(){return tIt.default}});var rIt=Wwe();Object.defineProperty(ro,"measureElement",{enumerable:!0,get:function(){return rIt.default}})});var Dj={};Kt(Dj,{Gem:()=>vj});var Vwe,um,vj,AQ=Et(()=>{Vwe=$e(ic()),um=$e(sn()),vj=(0,um.memo)(({active:t})=>{let e=(0,um.useMemo)(()=>t?"\u25C9":"\u25EF",[t]),r=(0,um.useMemo)(()=>t?"green":"yellow",[t]);return um.default.createElement(Vwe.Text,{color:r},e)})});var Jwe={};Kt(Jwe,{useKeypress:()=>Am});function Am({active:t},e,r){let{stdin:o}=(0,Kwe.useStdin)(),a=(0,fQ.useCallback)((n,u)=>e(n,u),r);(0,fQ.useEffect)(()=>{if(!(!t||!o))return o.on("keypress",a),()=>{o.off("keypress",a)}},[t,a,o])}var Kwe,fQ,OB=Et(()=>{Kwe=$e(ic()),fQ=$e(sn())});var Xwe={};Kt(Xwe,{FocusRequest:()=>zwe,useFocusRequest:()=>Pj});var zwe,Pj,Sj=Et(()=>{OB();zwe=(r=>(r.BEFORE="before",r.AFTER="after",r))(zwe||{}),Pj=function({active:t},e,r){Am({active:t},(o,a)=>{a.name==="tab"&&(a.shift?e("before"):e("after"))},r)}});var Zwe={};Kt(Zwe,{useListInput:()=>UB});var UB,pQ=Et(()=>{OB();UB=function(t,e,{active:r,minus:o,plus:a,set:n,loop:u=!0}){Am({active:r},(A,p)=>{let h=e.indexOf(t);switch(p.name){case o:{let E=h-1;if(u){n(e[(e.length+E)%e.length]);return}if(E<0)return;n(e[E])}break;case a:{let E=h+1;if(u){n(e[E%e.length]);return}if(E>=e.length)return;n(e[E])}break}},[e,t,a,n,u])}});var hQ={};Kt(hQ,{ScrollableItems:()=>nIt});var E0,La,nIt,gQ=Et(()=>{E0=$e(ic()),La=$e(sn());Sj();pQ();nIt=({active:t=!0,children:e=[],radius:r=10,size:o=1,loop:a=!0,onFocusRequest:n,willReachEnd:u})=>{let A=L=>{if(L.key===null)throw new Error("Expected all children to have a key");return L.key},p=La.default.Children.map(e,L=>A(L)),h=p[0],[E,I]=(0,La.useState)(h),v=p.indexOf(E);(0,La.useEffect)(()=>{p.includes(E)||I(h)},[e]),(0,La.useEffect)(()=>{u&&v>=p.length-2&&u()},[v]),Pj({active:t&&!!n},L=>{n?.(L)},[n]),UB(E,p,{active:t,minus:"up",plus:"down",set:I,loop:a});let b=v-r,C=v+r;C>p.length&&(b-=C-p.length,C=p.length),b<0&&(C+=-b,b=0),C>=p.length&&(C=p.length-1);let T=[];for(let L=b;L<=C;++L){let U=p[L],J=t&&U===E;T.push(La.default.createElement(E0.Box,{key:U,height:o},La.default.createElement(E0.Box,{marginLeft:1,marginRight:1},La.default.createElement(E0.Text,null,J?La.default.createElement(E0.Text,{color:"cyan",bold:!0},">"):" ")),La.default.createElement(E0.Box,null,La.default.cloneElement(e[L],{active:J}))))}return La.default.createElement(E0.Box,{flexDirection:"column",width:"100%"},T)}});var $we,$f,eIe,xj,tIe,bj=Et(()=>{$we=$e(ic()),$f=$e(sn()),eIe=Be("readline"),xj=$f.default.createContext(null),tIe=({children:t})=>{let{stdin:e,setRawMode:r}=(0,$we.useStdin)();(0,$f.useEffect)(()=>{r&&r(!0),e&&(0,eIe.emitKeypressEvents)(e)},[e,r]);let[o,a]=(0,$f.useState)(new Map),n=(0,$f.useMemo)(()=>({getAll:()=>o,get:u=>o.get(u),set:(u,A)=>a(new Map([...o,[u,A]]))}),[o,a]);return $f.default.createElement(xj.Provider,{value:n,children:t})}});var kj={};Kt(kj,{useMinistore:()=>iIt});function iIt(t,e){let r=(0,dQ.useContext)(xj);if(r===null)throw new Error("Expected this hook to run with a ministore context attached");if(typeof t>"u")return r.getAll();let o=(0,dQ.useCallback)(n=>{r.set(t,n)},[t,r.set]),a=r.get(t);return typeof a>"u"&&(a=e),[a,o]}var dQ,Qj=Et(()=>{dQ=$e(sn());bj()});var yQ={};Kt(yQ,{renderForm:()=>sIt});async function sIt(t,e,{stdin:r,stdout:o,stderr:a}){let n,u=p=>{let{exit:h}=(0,mQ.useApp)();Am({active:!0},(E,I)=>{I.name==="return"&&(n=p,h())},[h,p])},{waitUntilExit:A}=(0,mQ.render)(Fj.default.createElement(tIe,null,Fj.default.createElement(t,{...e,useSubmit:u})),{stdin:r,stdout:o,stderr:a});return await A(),n}var mQ,Fj,EQ=Et(()=>{mQ=$e(ic()),Fj=$e(sn());bj();OB()});var sIe=_(_B=>{"use strict";Object.defineProperty(_B,"__esModule",{value:!0});_B.UncontrolledTextInput=void 0;var nIe=sn(),Tj=sn(),rIe=ic(),fm=iQ(),iIe=({value:t,placeholder:e="",focus:r=!0,mask:o,highlightPastedText:a=!1,showCursor:n=!0,onChange:u,onSubmit:A})=>{let[{cursorOffset:p,cursorWidth:h},E]=Tj.useState({cursorOffset:(t||"").length,cursorWidth:0});Tj.useEffect(()=>{E(T=>{if(!r||!n)return T;let L=t||"";return T.cursorOffset>L.length-1?{cursorOffset:L.length,cursorWidth:0}:T})},[t,r,n]);let I=a?h:0,v=o?o.repeat(t.length):t,b=v,C=e?fm.grey(e):void 0;if(n&&r){C=e.length>0?fm.inverse(e[0])+fm.grey(e.slice(1)):fm.inverse(" "),b=v.length>0?"":fm.inverse(" ");let T=0;for(let L of v)T>=p-I&&T<=p?b+=fm.inverse(L):b+=L,T++;v.length>0&&p===v.length&&(b+=fm.inverse(" "))}return rIe.useInput((T,L)=>{if(L.upArrow||L.downArrow||L.ctrl&&T==="c"||L.tab||L.shift&&L.tab)return;if(L.return){A&&A(t);return}let U=p,J=t,te=0;L.leftArrow?n&&U--:L.rightArrow?n&&U++:L.backspace||L.delete?p>0&&(J=t.slice(0,p-1)+t.slice(p,t.length),U--):(J=t.slice(0,p)+T+t.slice(p,t.length),U+=T.length,T.length>1&&(te=T.length)),p<0&&(U=0),p>t.length&&(U=t.length),E({cursorOffset:U,cursorWidth:te}),J!==t&&u(J)},{isActive:r}),nIe.createElement(rIe.Text,null,e?v.length>0?b:C:b)};_B.default=iIe;_B.UncontrolledTextInput=t=>{let[e,r]=Tj.useState("");return nIe.createElement(iIe,Object.assign({},t,{value:e,onChange:r}))}});var lIe={};Kt(lIe,{Pad:()=>Rj});var oIe,aIe,Rj,Nj=Et(()=>{oIe=$e(ic()),aIe=$e(sn()),Rj=({length:t,active:e})=>{if(t===0)return null;let r=t>1?` ${"-".repeat(t-1)}`:" ";return aIe.default.createElement(oIe.Text,{dimColor:!e},r)}});var cIe={};Kt(cIe,{ItemOptions:()=>oIt});var jB,w0,oIt,uIe=Et(()=>{jB=$e(ic()),w0=$e(sn());pQ();AQ();Nj();oIt=function({active:t,skewer:e,options:r,value:o,onChange:a,sizes:n=[]}){let u=r.filter(({label:p})=>!!p).map(({value:p})=>p),A=r.findIndex(p=>p.value===o&&p.label!="");return UB(o,u,{active:t,minus:"left",plus:"right",set:a}),w0.default.createElement(w0.default.Fragment,null,r.map(({label:p},h)=>{let E=h===A,I=n[h]-1||0,v=p.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,""),b=Math.max(0,I-v.length-2);return p?w0.default.createElement(jB.Box,{key:p,width:I,marginLeft:1},w0.default.createElement(jB.Text,{wrap:"truncate"},w0.default.createElement(vj,{active:E})," ",p),e?w0.default.createElement(Rj,{active:t,length:b}):null):w0.default.createElement(jB.Box,{key:`spacer-${h}`,width:I,marginLeft:1})}))}});var PIe=_((zJt,DIe)=>{var Gj;DIe.exports=()=>(typeof Gj>"u"&&(Gj=Be("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),Gj)});var VIe=_((wzt,WIe)=>{var $j=Symbol("arg flag"),Ma=class extends Error{constructor(e,r){super(e),this.name="ArgError",this.code=r,Object.setPrototypeOf(this,Ma.prototype)}};function iv(t,{argv:e=process.argv.slice(2),permissive:r=!1,stopAtPositional:o=!1}={}){if(!t)throw new Ma("argument specification object is required","ARG_CONFIG_NO_SPEC");let a={_:[]},n={},u={};for(let A of Object.keys(t)){if(!A)throw new Ma("argument key cannot be an empty string","ARG_CONFIG_EMPTY_KEY");if(A[0]!=="-")throw new Ma(`argument key must start with '-' but found: '${A}'`,"ARG_CONFIG_NONOPT_KEY");if(A.length===1)throw new Ma(`argument key must have a name; singular '-' keys are not allowed: ${A}`,"ARG_CONFIG_NONAME_KEY");if(typeof t[A]=="string"){n[A]=t[A];continue}let p=t[A],h=!1;if(Array.isArray(p)&&p.length===1&&typeof p[0]=="function"){let[E]=p;p=(I,v,b=[])=>(b.push(E(I,v,b[b.length-1])),b),h=E===Boolean||E[$j]===!0}else if(typeof p=="function")h=p===Boolean||p[$j]===!0;else throw new Ma(`type missing or not a function or valid array type: ${A}`,"ARG_CONFIG_VAD_TYPE");if(A[1]!=="-"&&A.length>2)throw new Ma(`short argument keys (with a single hyphen) must have only one character: ${A}`,"ARG_CONFIG_SHORTOPT_TOOLONG");u[A]=[p,h]}for(let A=0,p=e.length;A0){a._=a._.concat(e.slice(A));break}if(h==="--"){a._=a._.concat(e.slice(A+1));break}if(h.length>1&&h[0]==="-"){let E=h[1]==="-"||h.length===2?[h]:h.slice(1).split("").map(I=>`-${I}`);for(let I=0;I1&&e[A+1][0]==="-"&&!(e[A+1].match(/^-?\d*(\.(?=\d))?\d*$/)&&(L===Number||typeof BigInt<"u"&&L===BigInt))){let J=b===T?"":` (alias for ${T})`;throw new Ma(`option requires argument: ${b}${J}`,"ARG_MISSING_REQUIRED_LONGARG")}a[T]=L(e[A+1],T,a[T]),++A}else a[T]=L(C,T,a[T])}}else a._.push(h)}return a}iv.flag=t=>(t[$j]=!0,t);iv.COUNT=iv.flag((t,e,r)=>(r||0)+1);iv.ArgError=Ma;WIe.exports=iv});var t1e=_((Kzt,e1e)=>{var nq;e1e.exports=()=>(typeof nq>"u"&&(nq=Be("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),nq)});var o1e=_((cq,uq)=>{(function(t){cq&&typeof cq=="object"&&typeof uq<"u"?uq.exports=t():typeof define=="function"&&define.amd?define([],t):typeof window<"u"?window.isWindows=t():typeof global<"u"?global.isWindows=t():typeof self<"u"?self.isWindows=t():this.isWindows=t()})(function(){"use strict";return function(){return process&&(process.platform==="win32"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var u1e=_((WXt,c1e)=>{"use strict";Aq.ifExists=n1t;var GC=Be("util"),sc=Be("path"),a1e=o1e(),e1t=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,t1t={createPwshFile:!0,createCmdFile:a1e(),fs:Be("fs")},r1t=new Map([[".js","node"],[".cjs","node"],[".mjs","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function l1e(t){let e={...t1t,...t},r=e.fs;return e.fs_={chmod:r.chmod?GC.promisify(r.chmod):async()=>{},mkdir:GC.promisify(r.mkdir),readFile:GC.promisify(r.readFile),stat:GC.promisify(r.stat),unlink:GC.promisify(r.unlink),writeFile:GC.promisify(r.writeFile)},e}async function Aq(t,e,r){let o=l1e(r);await o.fs_.stat(t),await s1t(t,e,o)}function n1t(t,e,r){return Aq(t,e,r).catch(()=>{})}function i1t(t,e){return e.fs_.unlink(t).catch(()=>{})}async function s1t(t,e,r){let o=await u1t(t,r);return await o1t(e,r),a1t(t,e,o,r)}function o1t(t,e){return e.fs_.mkdir(sc.dirname(t),{recursive:!0})}function a1t(t,e,r,o){let a=l1e(o),n=[{generator:p1t,extension:""}];return a.createCmdFile&&n.push({generator:f1t,extension:".cmd"}),a.createPwshFile&&n.push({generator:h1t,extension:".ps1"}),Promise.all(n.map(u=>A1t(t,e+u.extension,r,u.generator,a)))}function l1t(t,e){return i1t(t,e)}function c1t(t,e){return g1t(t,e)}async function u1t(t,e){let a=(await e.fs_.readFile(t,"utf8")).trim().split(/\r*\n/)[0].match(e1t);if(!a){let n=sc.extname(t).toLowerCase();return{program:r1t.get(n)||null,additionalArgs:""}}return{program:a[1],additionalArgs:a[2]}}async function A1t(t,e,r,o,a){let n=a.preserveSymlinks?"--preserve-symlinks":"",u=[r.additionalArgs,n].filter(A=>A).join(" ");return a=Object.assign({},a,{prog:r.program,args:u}),await l1t(e,a),await a.fs_.writeFile(e,o(t,e,a),"utf8"),c1t(e,a)}function f1t(t,e,r){let a=sc.relative(sc.dirname(e),t).split("/").join("\\"),n=sc.isAbsolute(a)?`"${a}"`:`"%~dp0\\${a}"`,u,A=r.prog,p=r.args||"",h=fq(r.nodePath).win32;A?(u=`"%~dp0\\${A}.exe"`,a=n):(A=n,p="",a="");let E=r.progArgs?`${r.progArgs.join(" ")} `:"",I=h?`@SET NODE_PATH=${h}\r +`:"";return u?I+=`@IF EXIST ${u} (\r + ${u} ${p} ${a} ${E}%*\r +) ELSE (\r + @SETLOCAL\r + @SET PATHEXT=%PATHEXT:;.JS;=;%\r + ${A} ${p} ${a} ${E}%*\r +)\r +`:I+=`@${A} ${p} ${a} ${E}%*\r +`,I}function p1t(t,e,r){let o=sc.relative(sc.dirname(e),t),a=r.prog&&r.prog.split("\\").join("/"),n;o=o.split("\\").join("/");let u=sc.isAbsolute(o)?`"${o}"`:`"$basedir/${o}"`,A=r.args||"",p=fq(r.nodePath).posix;a?(n=`"$basedir/${r.prog}"`,o=u):(a=u,A="",o="");let h=r.progArgs?`${r.progArgs.join(" ")} `:"",E=`#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") + +case \`uname\` in + *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; +esac + +`,I=r.nodePath?`export NODE_PATH="${p}" +`:"";return n?E+=`${I}if [ -x ${n} ]; then + exec ${n} ${A} ${o} ${h}"$@" +else + exec ${a} ${A} ${o} ${h}"$@" +fi +`:E+=`${I}${a} ${A} ${o} ${h}"$@" +exit $? +`,E}function h1t(t,e,r){let o=sc.relative(sc.dirname(e),t),a=r.prog&&r.prog.split("\\").join("/"),n=a&&`"${a}$exe"`,u;o=o.split("\\").join("/");let A=sc.isAbsolute(o)?`"${o}"`:`"$basedir/${o}"`,p=r.args||"",h=fq(r.nodePath),E=h.win32,I=h.posix;n?(u=`"$basedir/${r.prog}$exe"`,o=A):(n=A,p="",o="");let v=r.progArgs?`${r.progArgs.join(" ")} `:"",b=`#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +${r.nodePath?`$env_node_path=$env:NODE_PATH +$env:NODE_PATH="${E}" +`:""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +}`;return r.nodePath&&(b+=` else { + $env:NODE_PATH="${I}" +}`),u?b+=` +$ret=0 +if (Test-Path ${u}) { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & ${u} ${p} ${o} ${v}$args + } else { + & ${u} ${p} ${o} ${v}$args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & ${n} ${p} ${o} ${v}$args + } else { + & ${n} ${p} ${o} ${v}$args + } + $ret=$LASTEXITCODE +} +${r.nodePath?`$env:NODE_PATH=$env_node_path +`:""}exit $ret +`:b+=` +# Support pipeline input +if ($MyInvocation.ExpectingInput) { + $input | & ${n} ${p} ${o} ${v}$args +} else { + & ${n} ${p} ${o} ${v}$args +} +${r.nodePath?`$env:NODE_PATH=$env_node_path +`:""}exit $LASTEXITCODE +`,b}function g1t(t,e){return e.fs_.chmod(t,493)}function fq(t){if(!t)return{win32:"",posix:""};let e=typeof t=="string"?t.split(sc.delimiter):Array.from(t),r={};for(let o=0;o`/mnt/${A.toLowerCase()}`):e[o];r.win32=r.win32?`${r.win32};${a}`:a,r.posix=r.posix?`${r.posix}:${n}`:n,r[o]={win32:a,posix:n}}return r}c1e.exports=Aq});var Sq=_((h$t,F1e)=>{F1e.exports=Be("stream")});var L1e=_((g$t,N1e)=>{"use strict";function T1e(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),r.push.apply(r,o)}return r}function U1t(t){for(var e=1;e0?this.tail.next=o:this.head=o,this.tail=o,++this.length}},{key:"unshift",value:function(r){var o={data:r,next:this.head};this.length===0&&(this.tail=o),this.head=o,++this.length}},{key:"shift",value:function(){if(this.length!==0){var r=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,r}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(r){if(this.length===0)return"";for(var o=this.head,a=""+o.data;o=o.next;)a+=r+o.data;return a}},{key:"concat",value:function(r){if(this.length===0)return QQ.alloc(0);for(var o=QQ.allocUnsafe(r>>>0),a=this.head,n=0;a;)W1t(a.data,o,n),n+=a.data.length,a=a.next;return o}},{key:"consume",value:function(r,o){var a;return ru.length?u.length:r;if(A===u.length?n+=u:n+=u.slice(0,r),r-=A,r===0){A===u.length?(++a,o.next?this.head=o.next:this.head=this.tail=null):(this.head=o,o.data=u.slice(A));break}++a}return this.length-=a,n}},{key:"_getBuffer",value:function(r){var o=QQ.allocUnsafe(r),a=this.head,n=1;for(a.data.copy(o),r-=a.data.length;a=a.next;){var u=a.data,A=r>u.length?u.length:r;if(u.copy(o,o.length-r,0,A),r-=A,r===0){A===u.length?(++n,a.next?this.head=a.next:this.head=this.tail=null):(this.head=a,a.data=u.slice(A));break}++n}return this.length-=n,o}},{key:Y1t,value:function(r,o){return xq(this,U1t({},o,{depth:0,customInspect:!1}))}}]),t}()});var kq=_((d$t,O1e)=>{"use strict";function V1t(t,e){var r=this,o=this._readableState&&this._readableState.destroyed,a=this._writableState&&this._writableState.destroyed;return o||a?(e?e(t):t&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(bq,this,t)):process.nextTick(bq,this,t)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,function(n){!e&&n?r._writableState?r._writableState.errorEmitted?process.nextTick(FQ,r):(r._writableState.errorEmitted=!0,process.nextTick(M1e,r,n)):process.nextTick(M1e,r,n):e?(process.nextTick(FQ,r),e(n)):process.nextTick(FQ,r)}),this)}function M1e(t,e){bq(t,e),FQ(t)}function FQ(t){t._writableState&&!t._writableState.emitClose||t._readableState&&!t._readableState.emitClose||t.emit("close")}function K1t(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function bq(t,e){t.emit("error",e)}function J1t(t,e){var r=t._readableState,o=t._writableState;r&&r.autoDestroy||o&&o.autoDestroy?t.destroy(e):t.emit("error",e)}O1e.exports={destroy:V1t,undestroy:K1t,errorOrDestroy:J1t}});var k0=_((m$t,H1e)=>{"use strict";var _1e={};function ac(t,e,r){r||(r=Error);function o(n,u,A){return typeof e=="string"?e:e(n,u,A)}class a extends r{constructor(u,A,p){super(o(u,A,p))}}a.prototype.name=r.name,a.prototype.code=t,_1e[t]=a}function U1e(t,e){if(Array.isArray(t)){let r=t.length;return t=t.map(o=>String(o)),r>2?`one of ${e} ${t.slice(0,r-1).join(", ")}, or `+t[r-1]:r===2?`one of ${e} ${t[0]} or ${t[1]}`:`of ${e} ${t[0]}`}else return`of ${e} ${String(t)}`}function z1t(t,e,r){return t.substr(!r||r<0?0:+r,e.length)===e}function X1t(t,e,r){return(r===void 0||r>t.length)&&(r=t.length),t.substring(r-e.length,r)===e}function Z1t(t,e,r){return typeof r!="number"&&(r=0),r+e.length>t.length?!1:t.indexOf(e,r)!==-1}ac("ERR_INVALID_OPT_VALUE",function(t,e){return'The value "'+e+'" is invalid for option "'+t+'"'},TypeError);ac("ERR_INVALID_ARG_TYPE",function(t,e,r){let o;typeof e=="string"&&z1t(e,"not ")?(o="must not be",e=e.replace(/^not /,"")):o="must be";let a;if(X1t(t," argument"))a=`The ${t} ${o} ${U1e(e,"type")}`;else{let n=Z1t(t,".")?"property":"argument";a=`The "${t}" ${n} ${o} ${U1e(e,"type")}`}return a+=`. Received type ${typeof r}`,a},TypeError);ac("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF");ac("ERR_METHOD_NOT_IMPLEMENTED",function(t){return"The "+t+" method is not implemented"});ac("ERR_STREAM_PREMATURE_CLOSE","Premature close");ac("ERR_STREAM_DESTROYED",function(t){return"Cannot call "+t+" after a stream was destroyed"});ac("ERR_MULTIPLE_CALLBACK","Callback called multiple times");ac("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable");ac("ERR_STREAM_WRITE_AFTER_END","write after end");ac("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError);ac("ERR_UNKNOWN_ENCODING",function(t){return"Unknown encoding: "+t},TypeError);ac("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event");H1e.exports.codes=_1e});var Qq=_((y$t,j1e)=>{"use strict";var $1t=k0().codes.ERR_INVALID_OPT_VALUE;function e2t(t,e,r){return t.highWaterMark!=null?t.highWaterMark:e?t[r]:null}function t2t(t,e,r,o){var a=e2t(e,o,r);if(a!=null){if(!(isFinite(a)&&Math.floor(a)===a)||a<0){var n=o?r:"highWaterMark";throw new $1t(n,a)}return Math.floor(a)}return t.objectMode?16:16*1024}j1e.exports={getHighWaterMark:t2t}});var q1e=_((E$t,Fq)=>{typeof Object.create=="function"?Fq.exports=function(e,r){r&&(e.super_=r,e.prototype=Object.create(r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:Fq.exports=function(e,r){if(r){e.super_=r;var o=function(){};o.prototype=r.prototype,e.prototype=new o,e.prototype.constructor=e}}});var Q0=_((C$t,Rq)=>{try{if(Tq=Be("util"),typeof Tq.inherits!="function")throw"";Rq.exports=Tq.inherits}catch{Rq.exports=q1e()}var Tq});var Y1e=_((w$t,G1e)=>{G1e.exports=Be("util").deprecate});var Mq=_((I$t,X1e)=>{"use strict";X1e.exports=Ti;function V1e(t){var e=this;this.next=null,this.entry=null,this.finish=function(){x2t(e,t)}}var JC;Ti.WritableState=mv;var r2t={deprecate:Y1e()},K1e=Sq(),RQ=Be("buffer").Buffer,n2t=global.Uint8Array||function(){};function i2t(t){return RQ.from(t)}function s2t(t){return RQ.isBuffer(t)||t instanceof n2t}var Lq=kq(),o2t=Qq(),a2t=o2t.getHighWaterMark,F0=k0().codes,l2t=F0.ERR_INVALID_ARG_TYPE,c2t=F0.ERR_METHOD_NOT_IMPLEMENTED,u2t=F0.ERR_MULTIPLE_CALLBACK,A2t=F0.ERR_STREAM_CANNOT_PIPE,f2t=F0.ERR_STREAM_DESTROYED,p2t=F0.ERR_STREAM_NULL_VALUES,h2t=F0.ERR_STREAM_WRITE_AFTER_END,g2t=F0.ERR_UNKNOWN_ENCODING,zC=Lq.errorOrDestroy;Q0()(Ti,K1e);function d2t(){}function mv(t,e,r){JC=JC||Em(),t=t||{},typeof r!="boolean"&&(r=e instanceof JC),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.writableObjectMode),this.highWaterMark=a2t(this,t,"writableHighWaterMark",r),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var o=t.decodeStrings===!1;this.decodeStrings=!o,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(a){B2t(e,a)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new V1e(this)}mv.prototype.getBuffer=function(){for(var e=this.bufferedRequest,r=[];e;)r.push(e),e=e.next;return r};(function(){try{Object.defineProperty(mv.prototype,"buffer",{get:r2t.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch{}})();var TQ;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(TQ=Function.prototype[Symbol.hasInstance],Object.defineProperty(Ti,Symbol.hasInstance,{value:function(e){return TQ.call(this,e)?!0:this!==Ti?!1:e&&e._writableState instanceof mv}})):TQ=function(e){return e instanceof this};function Ti(t){JC=JC||Em();var e=this instanceof JC;if(!e&&!TQ.call(Ti,this))return new Ti(t);this._writableState=new mv(t,this,e),this.writable=!0,t&&(typeof t.write=="function"&&(this._write=t.write),typeof t.writev=="function"&&(this._writev=t.writev),typeof t.destroy=="function"&&(this._destroy=t.destroy),typeof t.final=="function"&&(this._final=t.final)),K1e.call(this)}Ti.prototype.pipe=function(){zC(this,new A2t)};function m2t(t,e){var r=new h2t;zC(t,r),process.nextTick(e,r)}function y2t(t,e,r,o){var a;return r===null?a=new p2t:typeof r!="string"&&!e.objectMode&&(a=new l2t("chunk",["string","Buffer"],r)),a?(zC(t,a),process.nextTick(o,a),!1):!0}Ti.prototype.write=function(t,e,r){var o=this._writableState,a=!1,n=!o.objectMode&&s2t(t);return n&&!RQ.isBuffer(t)&&(t=i2t(t)),typeof e=="function"&&(r=e,e=null),n?e="buffer":e||(e=o.defaultEncoding),typeof r!="function"&&(r=d2t),o.ending?m2t(this,r):(n||y2t(this,o,t,r))&&(o.pendingcb++,a=C2t(this,o,n,t,e,r)),a};Ti.prototype.cork=function(){this._writableState.corked++};Ti.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,!t.writing&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&J1e(this,t))};Ti.prototype.setDefaultEncoding=function(e){if(typeof e=="string"&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new g2t(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(Ti.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function E2t(t,e,r){return!t.objectMode&&t.decodeStrings!==!1&&typeof e=="string"&&(e=RQ.from(e,r)),e}Object.defineProperty(Ti.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function C2t(t,e,r,o,a,n){if(!r){var u=E2t(e,o,a);o!==u&&(r=!0,a="buffer",o=u)}var A=e.objectMode?1:o.length;e.length+=A;var p=e.length{"use strict";var b2t=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};$1e.exports=yA;var Z1e=_q(),Uq=Mq();Q0()(yA,Z1e);for(Oq=b2t(Uq.prototype),NQ=0;NQ{var MQ=Be("buffer"),np=MQ.Buffer;function e2e(t,e){for(var r in t)e[r]=t[r]}np.from&&np.alloc&&np.allocUnsafe&&np.allocUnsafeSlow?t2e.exports=MQ:(e2e(MQ,Hq),Hq.Buffer=XC);function XC(t,e,r){return np(t,e,r)}e2e(np,XC);XC.from=function(t,e,r){if(typeof t=="number")throw new TypeError("Argument must not be a number");return np(t,e,r)};XC.alloc=function(t,e,r){if(typeof t!="number")throw new TypeError("Argument must be a number");var o=np(t);return e!==void 0?typeof r=="string"?o.fill(e,r):o.fill(e):o.fill(0),o};XC.allocUnsafe=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return np(t)};XC.allocUnsafeSlow=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return MQ.SlowBuffer(t)}});var Gq=_(i2e=>{"use strict";var qq=r2e().Buffer,n2e=qq.isEncoding||function(t){switch(t=""+t,t&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function F2t(t){if(!t)return"utf8";for(var e;;)switch(t){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return t;default:if(e)return;t=(""+t).toLowerCase(),e=!0}}function T2t(t){var e=F2t(t);if(typeof e!="string"&&(qq.isEncoding===n2e||!n2e(t)))throw new Error("Unknown encoding: "+t);return e||t}i2e.StringDecoder=yv;function yv(t){this.encoding=T2t(t);var e;switch(this.encoding){case"utf16le":this.text=U2t,this.end=_2t,e=4;break;case"utf8":this.fillLast=L2t,e=4;break;case"base64":this.text=H2t,this.end=j2t,e=3;break;default:this.write=q2t,this.end=G2t;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=qq.allocUnsafe(e)}yv.prototype.write=function(t){if(t.length===0)return"";var e,r;if(this.lastNeed){if(e=this.fillLast(t),e===void 0)return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r>5===6?2:t>>4===14?3:t>>3===30?4:t>>6===2?-1:-2}function R2t(t,e,r){var o=e.length-1;if(o=0?(a>0&&(t.lastNeed=a-1),a):--o=0?(a>0&&(t.lastNeed=a-2),a):--o=0?(a>0&&(a===2?a=0:t.lastNeed=a-3),a):0))}function N2t(t,e,r){if((e[0]&192)!==128)return t.lastNeed=0,"\uFFFD";if(t.lastNeed>1&&e.length>1){if((e[1]&192)!==128)return t.lastNeed=1,"\uFFFD";if(t.lastNeed>2&&e.length>2&&(e[2]&192)!==128)return t.lastNeed=2,"\uFFFD"}}function L2t(t){var e=this.lastTotal-this.lastNeed,r=N2t(this,t,e);if(r!==void 0)return r;if(this.lastNeed<=t.length)return t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,e,0,t.length),this.lastNeed-=t.length}function M2t(t,e){var r=R2t(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=r;var o=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,o),t.toString("utf8",e,o)}function O2t(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+"\uFFFD":e}function U2t(t,e){if((t.length-e)%2===0){var r=t.toString("utf16le",e);if(r){var o=r.charCodeAt(r.length-1);if(o>=55296&&o<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function _2t(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,r)}return e}function H2t(t,e){var r=(t.length-e)%3;return r===0?t.toString("base64",e):(this.lastNeed=3-r,this.lastTotal=3,r===1?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-r))}function j2t(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function q2t(t){return t.toString(this.encoding)}function G2t(t){return t&&t.length?this.write(t):""}});var OQ=_((D$t,a2e)=>{"use strict";var s2e=k0().codes.ERR_STREAM_PREMATURE_CLOSE;function Y2t(t){var e=!1;return function(){if(!e){e=!0;for(var r=arguments.length,o=new Array(r),a=0;a{"use strict";var UQ;function T0(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var K2t=OQ(),R0=Symbol("lastResolve"),Cm=Symbol("lastReject"),Ev=Symbol("error"),_Q=Symbol("ended"),wm=Symbol("lastPromise"),Yq=Symbol("handlePromise"),Im=Symbol("stream");function N0(t,e){return{value:t,done:e}}function J2t(t){var e=t[R0];if(e!==null){var r=t[Im].read();r!==null&&(t[wm]=null,t[R0]=null,t[Cm]=null,e(N0(r,!1)))}}function z2t(t){process.nextTick(J2t,t)}function X2t(t,e){return function(r,o){t.then(function(){if(e[_Q]){r(N0(void 0,!0));return}e[Yq](r,o)},o)}}var Z2t=Object.getPrototypeOf(function(){}),$2t=Object.setPrototypeOf((UQ={get stream(){return this[Im]},next:function(){var e=this,r=this[Ev];if(r!==null)return Promise.reject(r);if(this[_Q])return Promise.resolve(N0(void 0,!0));if(this[Im].destroyed)return new Promise(function(u,A){process.nextTick(function(){e[Ev]?A(e[Ev]):u(N0(void 0,!0))})});var o=this[wm],a;if(o)a=new Promise(X2t(o,this));else{var n=this[Im].read();if(n!==null)return Promise.resolve(N0(n,!1));a=new Promise(this[Yq])}return this[wm]=a,a}},T0(UQ,Symbol.asyncIterator,function(){return this}),T0(UQ,"return",function(){var e=this;return new Promise(function(r,o){e[Im].destroy(null,function(a){if(a){o(a);return}r(N0(void 0,!0))})})}),UQ),Z2t),eBt=function(e){var r,o=Object.create($2t,(r={},T0(r,Im,{value:e,writable:!0}),T0(r,R0,{value:null,writable:!0}),T0(r,Cm,{value:null,writable:!0}),T0(r,Ev,{value:null,writable:!0}),T0(r,_Q,{value:e._readableState.endEmitted,writable:!0}),T0(r,Yq,{value:function(n,u){var A=o[Im].read();A?(o[wm]=null,o[R0]=null,o[Cm]=null,n(N0(A,!1))):(o[R0]=n,o[Cm]=u)},writable:!0}),r));return o[wm]=null,K2t(e,function(a){if(a&&a.code!=="ERR_STREAM_PREMATURE_CLOSE"){var n=o[Cm];n!==null&&(o[wm]=null,o[R0]=null,o[Cm]=null,n(a)),o[Ev]=a;return}var u=o[R0];u!==null&&(o[wm]=null,o[R0]=null,o[Cm]=null,u(N0(void 0,!0))),o[_Q]=!0}),e.on("readable",z2t.bind(null,o)),o};l2e.exports=eBt});var p2e=_((S$t,f2e)=>{"use strict";function u2e(t,e,r,o,a,n,u){try{var A=t[n](u),p=A.value}catch(h){r(h);return}A.done?e(p):Promise.resolve(p).then(o,a)}function tBt(t){return function(){var e=this,r=arguments;return new Promise(function(o,a){var n=t.apply(e,r);function u(p){u2e(n,o,a,u,A,"next",p)}function A(p){u2e(n,o,a,u,A,"throw",p)}u(void 0)})}}function A2e(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),r.push.apply(r,o)}return r}function rBt(t){for(var e=1;e{"use strict";B2e.exports=mn;var ZC;mn.ReadableState=m2e;var x$t=Be("events").EventEmitter,d2e=function(e,r){return e.listeners(r).length},wv=Sq(),HQ=Be("buffer").Buffer,oBt=global.Uint8Array||function(){};function aBt(t){return HQ.from(t)}function lBt(t){return HQ.isBuffer(t)||t instanceof oBt}var Wq=Be("util"),$r;Wq&&Wq.debuglog?$r=Wq.debuglog("stream"):$r=function(){};var cBt=L1e(),$q=kq(),uBt=Qq(),ABt=uBt.getHighWaterMark,jQ=k0().codes,fBt=jQ.ERR_INVALID_ARG_TYPE,pBt=jQ.ERR_STREAM_PUSH_AFTER_EOF,hBt=jQ.ERR_METHOD_NOT_IMPLEMENTED,gBt=jQ.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,$C,Vq,Kq;Q0()(mn,wv);var Cv=$q.errorOrDestroy,Jq=["error","close","destroy","pause","resume"];function dBt(t,e,r){if(typeof t.prependListener=="function")return t.prependListener(e,r);!t._events||!t._events[e]?t.on(e,r):Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]}function m2e(t,e,r){ZC=ZC||Em(),t=t||{},typeof r!="boolean"&&(r=e instanceof ZC),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.readableObjectMode),this.highWaterMark=ABt(this,t,"readableHighWaterMark",r),this.buffer=new cBt,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&($C||($C=Gq().StringDecoder),this.decoder=new $C(t.encoding),this.encoding=t.encoding)}function mn(t){if(ZC=ZC||Em(),!(this instanceof mn))return new mn(t);var e=this instanceof ZC;this._readableState=new m2e(t,this,e),this.readable=!0,t&&(typeof t.read=="function"&&(this._read=t.read),typeof t.destroy=="function"&&(this._destroy=t.destroy)),wv.call(this)}Object.defineProperty(mn.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){!this._readableState||(this._readableState.destroyed=e)}});mn.prototype.destroy=$q.destroy;mn.prototype._undestroy=$q.undestroy;mn.prototype._destroy=function(t,e){e(t)};mn.prototype.push=function(t,e){var r=this._readableState,o;return r.objectMode?o=!0:typeof t=="string"&&(e=e||r.defaultEncoding,e!==r.encoding&&(t=HQ.from(t,e),e=""),o=!0),y2e(this,t,e,!1,o)};mn.prototype.unshift=function(t){return y2e(this,t,null,!0,!1)};function y2e(t,e,r,o,a){$r("readableAddChunk",e);var n=t._readableState;if(e===null)n.reading=!1,EBt(t,n);else{var u;if(a||(u=mBt(n,e)),u)Cv(t,u);else if(n.objectMode||e&&e.length>0)if(typeof e!="string"&&!n.objectMode&&Object.getPrototypeOf(e)!==HQ.prototype&&(e=aBt(e)),o)n.endEmitted?Cv(t,new gBt):zq(t,n,e,!0);else if(n.ended)Cv(t,new pBt);else{if(n.destroyed)return!1;n.reading=!1,n.decoder&&!r?(e=n.decoder.write(e),n.objectMode||e.length!==0?zq(t,n,e,!1):Zq(t,n)):zq(t,n,e,!1)}else o||(n.reading=!1,Zq(t,n))}return!n.ended&&(n.length=h2e?t=h2e:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}function g2e(t,e){return t<=0||e.length===0&&e.ended?0:e.objectMode?1:t!==t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=yBt(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}mn.prototype.read=function(t){$r("read",t),t=parseInt(t,10);var e=this._readableState,r=t;if(t!==0&&(e.emittedReadable=!1),t===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return $r("read: emitReadable",e.length,e.ended),e.length===0&&e.ended?Xq(this):qQ(this),null;if(t=g2e(t,e),t===0&&e.ended)return e.length===0&&Xq(this),null;var o=e.needReadable;$r("need readable",o),(e.length===0||e.length-t0?a=w2e(t,e):a=null,a===null?(e.needReadable=e.length<=e.highWaterMark,t=0):(e.length-=t,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&Xq(this)),a!==null&&this.emit("data",a),a};function EBt(t,e){if($r("onEofChunk"),!e.ended){if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,e.sync?qQ(t):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,E2e(t)))}}function qQ(t){var e=t._readableState;$r("emitReadable",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||($r("emitReadable",e.flowing),e.emittedReadable=!0,process.nextTick(E2e,t))}function E2e(t){var e=t._readableState;$r("emitReadable_",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(t.emit("readable"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,eG(t)}function Zq(t,e){e.readingMore||(e.readingMore=!0,process.nextTick(CBt,t,e))}function CBt(t,e){for(;!e.reading&&!e.ended&&(e.length1&&I2e(o.pipes,t)!==-1)&&!h&&($r("false write response, pause",o.awaitDrain),o.awaitDrain++),r.pause())}function v(L){$r("onerror",L),T(),t.removeListener("error",v),d2e(t,"error")===0&&Cv(t,L)}dBt(t,"error",v);function b(){t.removeListener("finish",C),T()}t.once("close",b);function C(){$r("onfinish"),t.removeListener("close",b),T()}t.once("finish",C);function T(){$r("unpipe"),r.unpipe(t)}return t.emit("pipe",r),o.flowing||($r("pipe resume"),r.resume()),t};function wBt(t){return function(){var r=t._readableState;$r("pipeOnDrain",r.awaitDrain),r.awaitDrain&&r.awaitDrain--,r.awaitDrain===0&&d2e(t,"data")&&(r.flowing=!0,eG(t))}}mn.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this,r),this);if(!t){var o=e.pipes,a=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var n=0;n0,o.flowing!==!1&&this.resume()):t==="readable"&&!o.endEmitted&&!o.readableListening&&(o.readableListening=o.needReadable=!0,o.flowing=!1,o.emittedReadable=!1,$r("on readable",o.length,o.reading),o.length?qQ(this):o.reading||process.nextTick(IBt,this)),r};mn.prototype.addListener=mn.prototype.on;mn.prototype.removeListener=function(t,e){var r=wv.prototype.removeListener.call(this,t,e);return t==="readable"&&process.nextTick(C2e,this),r};mn.prototype.removeAllListeners=function(t){var e=wv.prototype.removeAllListeners.apply(this,arguments);return(t==="readable"||t===void 0)&&process.nextTick(C2e,this),e};function C2e(t){var e=t._readableState;e.readableListening=t.listenerCount("readable")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:t.listenerCount("data")>0&&t.resume()}function IBt(t){$r("readable nexttick read 0"),t.read(0)}mn.prototype.resume=function(){var t=this._readableState;return t.flowing||($r("resume"),t.flowing=!t.readableListening,BBt(this,t)),t.paused=!1,this};function BBt(t,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(vBt,t,e))}function vBt(t,e){$r("resume",e.reading),e.reading||t.read(0),e.resumeScheduled=!1,t.emit("resume"),eG(t),e.flowing&&!e.reading&&t.read(0)}mn.prototype.pause=function(){return $r("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&($r("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function eG(t){var e=t._readableState;for($r("flow",e.flowing);e.flowing&&t.read()!==null;);}mn.prototype.wrap=function(t){var e=this,r=this._readableState,o=!1;t.on("end",function(){if($r("wrapped end"),r.decoder&&!r.ended){var u=r.decoder.end();u&&u.length&&e.push(u)}e.push(null)}),t.on("data",function(u){if($r("wrapped data"),r.decoder&&(u=r.decoder.write(u)),!(r.objectMode&&u==null)&&!(!r.objectMode&&(!u||!u.length))){var A=e.push(u);A||(o=!0,t.pause())}});for(var a in t)this[a]===void 0&&typeof t[a]=="function"&&(this[a]=function(A){return function(){return t[A].apply(t,arguments)}}(a));for(var n=0;n=e.length?(e.decoder?r=e.buffer.join(""):e.buffer.length===1?r=e.buffer.first():r=e.buffer.concat(e.length),e.buffer.clear()):r=e.buffer.consume(t,e.decoder),r}function Xq(t){var e=t._readableState;$r("endReadable",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(DBt,e,t))}function DBt(t,e){if($r("endReadableNT",t.endEmitted,t.length),!t.endEmitted&&t.length===0&&(t.endEmitted=!0,e.readable=!1,e.emit("end"),t.autoDestroy)){var r=e._writableState;(!r||r.autoDestroy&&r.finished)&&e.destroy()}}typeof Symbol=="function"&&(mn.from=function(t,e){return Kq===void 0&&(Kq=p2e()),Kq(mn,t,e)});function I2e(t,e){for(var r=0,o=t.length;r{"use strict";D2e.exports=ip;var GQ=k0().codes,PBt=GQ.ERR_METHOD_NOT_IMPLEMENTED,SBt=GQ.ERR_MULTIPLE_CALLBACK,xBt=GQ.ERR_TRANSFORM_ALREADY_TRANSFORMING,bBt=GQ.ERR_TRANSFORM_WITH_LENGTH_0,YQ=Em();Q0()(ip,YQ);function kBt(t,e){var r=this._transformState;r.transforming=!1;var o=r.writecb;if(o===null)return this.emit("error",new SBt);r.writechunk=null,r.writecb=null,e!=null&&this.push(e),o(t);var a=this._readableState;a.reading=!1,(a.needReadable||a.length{"use strict";S2e.exports=Iv;var P2e=tG();Q0()(Iv,P2e);function Iv(t){if(!(this instanceof Iv))return new Iv(t);P2e.call(this,t)}Iv.prototype._transform=function(t,e,r){r(null,t)}});var T2e=_((F$t,F2e)=>{"use strict";var rG;function FBt(t){var e=!1;return function(){e||(e=!0,t.apply(void 0,arguments))}}var Q2e=k0().codes,TBt=Q2e.ERR_MISSING_ARGS,RBt=Q2e.ERR_STREAM_DESTROYED;function b2e(t){if(t)throw t}function NBt(t){return t.setHeader&&typeof t.abort=="function"}function LBt(t,e,r,o){o=FBt(o);var a=!1;t.on("close",function(){a=!0}),rG===void 0&&(rG=OQ()),rG(t,{readable:e,writable:r},function(u){if(u)return o(u);a=!0,o()});var n=!1;return function(u){if(!a&&!n){if(n=!0,NBt(t))return t.abort();if(typeof t.destroy=="function")return t.destroy();o(u||new RBt("pipe"))}}}function k2e(t){t()}function MBt(t,e){return t.pipe(e)}function OBt(t){return!t.length||typeof t[t.length-1]!="function"?b2e:t.pop()}function UBt(){for(var t=arguments.length,e=new Array(t),r=0;r0;return LBt(u,p,h,function(E){a||(a=E),E&&n.forEach(k2e),!p&&(n.forEach(k2e),o(a))})});return e.reduce(MBt)}F2e.exports=UBt});var ew=_((lc,vv)=>{var Bv=Be("stream");process.env.READABLE_STREAM==="disable"&&Bv?(vv.exports=Bv.Readable,Object.assign(vv.exports,Bv),vv.exports.Stream=Bv):(lc=vv.exports=_q(),lc.Stream=Bv||lc,lc.Readable=lc,lc.Writable=Mq(),lc.Duplex=Em(),lc.Transform=tG(),lc.PassThrough=x2e(),lc.finished=OQ(),lc.pipeline=T2e())});var L2e=_((T$t,N2e)=>{"use strict";var{Buffer:lu}=Be("buffer"),R2e=Symbol.for("BufferList");function ni(t){if(!(this instanceof ni))return new ni(t);ni._init.call(this,t)}ni._init=function(e){Object.defineProperty(this,R2e,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};ni.prototype._new=function(e){return new ni(e)};ni.prototype._offset=function(e){if(e===0)return[0,0];let r=0;for(let o=0;othis.length||e<0)return;let r=this._offset(e);return this._bufs[r[0]][r[1]]};ni.prototype.slice=function(e,r){return typeof e=="number"&&e<0&&(e+=this.length),typeof r=="number"&&r<0&&(r+=this.length),this.copy(null,0,e,r)};ni.prototype.copy=function(e,r,o,a){if((typeof o!="number"||o<0)&&(o=0),(typeof a!="number"||a>this.length)&&(a=this.length),o>=this.length||a<=0)return e||lu.alloc(0);let n=!!e,u=this._offset(o),A=a-o,p=A,h=n&&r||0,E=u[1];if(o===0&&a===this.length){if(!n)return this._bufs.length===1?this._bufs[0]:lu.concat(this._bufs,this.length);for(let I=0;Iv)this._bufs[I].copy(e,h,E),h+=v;else{this._bufs[I].copy(e,h,E,E+p),h+=v;break}p-=v,E&&(E=0)}return e.length>h?e.slice(0,h):e};ni.prototype.shallowSlice=function(e,r){if(e=e||0,r=typeof r!="number"?this.length:r,e<0&&(e+=this.length),r<0&&(r+=this.length),e===r)return this._new();let o=this._offset(e),a=this._offset(r),n=this._bufs.slice(o[0],a[0]+1);return a[1]===0?n.pop():n[n.length-1]=n[n.length-1].slice(0,a[1]),o[1]!==0&&(n[0]=n[0].slice(o[1])),this._new(n)};ni.prototype.toString=function(e,r,o){return this.slice(r,o).toString(e)};ni.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};ni.prototype.duplicate=function(){let e=this._new();for(let r=0;rthis.length?this.length:e;let o=this._offset(e),a=o[0],n=o[1];for(;a=t.length){let p=u.indexOf(t,n);if(p!==-1)return this._reverseOffset([a,p]);n=u.length-t.length+1}else{let p=this._reverseOffset([a,n]);if(this._match(p,t))return p;n++}n=0}return-1};ni.prototype._match=function(t,e){if(this.length-t{"use strict";var nG=ew().Duplex,_Bt=Q0(),Dv=L2e();function Uo(t){if(!(this instanceof Uo))return new Uo(t);if(typeof t=="function"){this._callback=t;let e=function(o){this._callback&&(this._callback(o),this._callback=null)}.bind(this);this.on("pipe",function(o){o.on("error",e)}),this.on("unpipe",function(o){o.removeListener("error",e)}),t=null}Dv._init.call(this,t),nG.call(this)}_Bt(Uo,nG);Object.assign(Uo.prototype,Dv.prototype);Uo.prototype._new=function(e){return new Uo(e)};Uo.prototype._write=function(e,r,o){this._appendBuffer(e),typeof o=="function"&&o()};Uo.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};Uo.prototype.end=function(e){nG.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};Uo.prototype._destroy=function(e,r){this._bufs.length=0,this.length=0,r(e)};Uo.prototype._isBufferList=function(e){return e instanceof Uo||e instanceof Dv||Uo.isBufferList(e)};Uo.isBufferList=Dv.isBufferList;WQ.exports=Uo;WQ.exports.BufferListStream=Uo;WQ.exports.BufferList=Dv});var oG=_(rw=>{var HBt=Buffer.alloc,jBt="0000000000000000000",qBt="7777777777777777777",O2e="0".charCodeAt(0),U2e=Buffer.from("ustar\0","binary"),GBt=Buffer.from("00","binary"),YBt=Buffer.from("ustar ","binary"),WBt=Buffer.from(" \0","binary"),VBt=parseInt("7777",8),Pv=257,sG=263,KBt=function(t,e,r){return typeof t!="number"?r:(t=~~t,t>=e?e:t>=0||(t+=e,t>=0)?t:0)},JBt=function(t){switch(t){case 0:return"file";case 1:return"link";case 2:return"symlink";case 3:return"character-device";case 4:return"block-device";case 5:return"directory";case 6:return"fifo";case 7:return"contiguous-file";case 72:return"pax-header";case 55:return"pax-global-header";case 27:return"gnu-long-link-path";case 28:case 30:return"gnu-long-path"}return null},zBt=function(t){switch(t){case"file":return 0;case"link":return 1;case"symlink":return 2;case"character-device":return 3;case"block-device":return 4;case"directory":return 5;case"fifo":return 6;case"contiguous-file":return 7;case"pax-header":return 72}return 0},_2e=function(t,e,r,o){for(;re?qBt.slice(0,e)+" ":jBt.slice(0,e-t.length)+t+" "};function XBt(t){var e;if(t[0]===128)e=!0;else if(t[0]===255)e=!1;else return null;for(var r=[],o=t.length-1;o>0;o--){var a=t[o];e?r.push(a):r.push(255-a)}var n=0,u=r.length;for(o=0;o=Math.pow(10,r)&&r++,e+r+t};rw.decodeLongPath=function(t,e){return tw(t,0,t.length,e)};rw.encodePax=function(t){var e="";t.name&&(e+=iG(" path="+t.name+` +`)),t.linkname&&(e+=iG(" linkpath="+t.linkname+` +`));var r=t.pax;if(r)for(var o in r)e+=iG(" "+o+"="+r[o]+` +`);return Buffer.from(e)};rw.decodePax=function(t){for(var e={};t.length;){for(var r=0;r100;){var a=r.indexOf("/");if(a===-1)return null;o+=o?"/"+r.slice(0,a):r.slice(0,a),r=r.slice(a+1)}return Buffer.byteLength(r)>100||Buffer.byteLength(o)>155||t.linkname&&Buffer.byteLength(t.linkname)>100?null:(e.write(r),e.write(L0(t.mode&VBt,6),100),e.write(L0(t.uid,6),108),e.write(L0(t.gid,6),116),e.write(L0(t.size,11),124),e.write(L0(t.mtime.getTime()/1e3|0,11),136),e[156]=O2e+zBt(t.type),t.linkname&&e.write(t.linkname,157),U2e.copy(e,Pv),GBt.copy(e,sG),t.uname&&e.write(t.uname,265),t.gname&&e.write(t.gname,297),e.write(L0(t.devmajor||0,6),329),e.write(L0(t.devminor||0,6),337),o&&e.write(o,345),e.write(L0(H2e(e),6),148),e)};rw.decode=function(t,e,r){var o=t[156]===0?0:t[156]-O2e,a=tw(t,0,100,e),n=M0(t,100,8),u=M0(t,108,8),A=M0(t,116,8),p=M0(t,124,12),h=M0(t,136,12),E=JBt(o),I=t[157]===0?null:tw(t,157,100,e),v=tw(t,265,32),b=tw(t,297,32),C=M0(t,329,8),T=M0(t,337,8),L=H2e(t);if(L===8*32)return null;if(L!==M0(t,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");if(U2e.compare(t,Pv,Pv+6)===0)t[345]&&(a=tw(t,345,155,e)+"/"+a);else if(!(YBt.compare(t,Pv,Pv+6)===0&&WBt.compare(t,sG,sG+2)===0)){if(!r)throw new Error("Invalid tar header: unknown format.")}return o===0&&a&&a[a.length-1]==="/"&&(o=5),{name:a,mode:n,uid:u,gid:A,size:p,mtime:new Date(1e3*h),type:E,linkname:I,uname:v,gname:b,devmajor:C,devminor:T}}});var K2e=_((L$t,V2e)=>{var q2e=Be("util"),ZBt=M2e(),Sv=oG(),G2e=ew().Writable,Y2e=ew().PassThrough,W2e=function(){},j2e=function(t){return t&=511,t&&512-t},$Bt=function(t,e){var r=new VQ(t,e);return r.end(),r},evt=function(t,e){return e.path&&(t.name=e.path),e.linkpath&&(t.linkname=e.linkpath),e.size&&(t.size=parseInt(e.size,10)),t.pax=e,t},VQ=function(t,e){this._parent=t,this.offset=e,Y2e.call(this,{autoDestroy:!1})};q2e.inherits(VQ,Y2e);VQ.prototype.destroy=function(t){this._parent.destroy(t)};var sp=function(t){if(!(this instanceof sp))return new sp(t);G2e.call(this,t),t=t||{},this._offset=0,this._buffer=ZBt(),this._missing=0,this._partial=!1,this._onparse=W2e,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,r=e._buffer,o=function(){e._continue()},a=function(v){if(e._locked=!1,v)return e.destroy(v);e._stream||o()},n=function(){e._stream=null;var v=j2e(e._header.size);v?e._parse(v,u):e._parse(512,I),e._locked||o()},u=function(){e._buffer.consume(j2e(e._header.size)),e._parse(512,I),o()},A=function(){var v=e._header.size;e._paxGlobal=Sv.decodePax(r.slice(0,v)),r.consume(v),n()},p=function(){var v=e._header.size;e._pax=Sv.decodePax(r.slice(0,v)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),r.consume(v),n()},h=function(){var v=e._header.size;this._gnuLongPath=Sv.decodeLongPath(r.slice(0,v),t.filenameEncoding),r.consume(v),n()},E=function(){var v=e._header.size;this._gnuLongLinkPath=Sv.decodeLongPath(r.slice(0,v),t.filenameEncoding),r.consume(v),n()},I=function(){var v=e._offset,b;try{b=e._header=Sv.decode(r.slice(0,512),t.filenameEncoding,t.allowUnknownFormat)}catch(C){e.emit("error",C)}if(r.consume(512),!b){e._parse(512,I),o();return}if(b.type==="gnu-long-path"){e._parse(b.size,h),o();return}if(b.type==="gnu-long-link-path"){e._parse(b.size,E),o();return}if(b.type==="pax-global-header"){e._parse(b.size,A),o();return}if(b.type==="pax-header"){e._parse(b.size,p),o();return}if(e._gnuLongPath&&(b.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(b.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=b=evt(b,e._pax),e._pax=null),e._locked=!0,!b.size||b.type==="directory"){e._parse(512,I),e.emit("entry",b,$Bt(e,v),a);return}e._stream=new VQ(e,v),e.emit("entry",b,e._stream,a),e._parse(b.size,n),o()};this._onheader=I,this._parse(512,I)};q2e.inherits(sp,G2e);sp.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.emit("close"))};sp.prototype._parse=function(t,e){this._destroyed||(this._offset+=t,this._missing=t,e===this._onheader&&(this._partial=!1),this._onparse=e)};sp.prototype._continue=function(){if(!this._destroyed){var t=this._cb;this._cb=W2e,this._overflow?this._write(this._overflow,void 0,t):t()}};sp.prototype._write=function(t,e,r){if(!this._destroyed){var o=this._stream,a=this._buffer,n=this._missing;if(t.length&&(this._partial=!0),t.lengthn&&(u=t.slice(n),t=t.slice(0,n)),o?o.end(t):a.append(t),this._overflow=u,this._onparse()}};sp.prototype._final=function(t){if(this._partial)return this.destroy(new Error("Unexpected end of data"));t()};V2e.exports=sp});var z2e=_((M$t,J2e)=>{J2e.exports=Be("fs").constants||Be("constants")});var tBe=_((O$t,eBe)=>{var nw=z2e(),X2e=OO(),JQ=Q0(),tvt=Buffer.alloc,Z2e=ew().Readable,iw=ew().Writable,rvt=Be("string_decoder").StringDecoder,KQ=oG(),nvt=parseInt("755",8),ivt=parseInt("644",8),$2e=tvt(1024),lG=function(){},aG=function(t,e){e&=511,e&&t.push($2e.slice(0,512-e))};function svt(t){switch(t&nw.S_IFMT){case nw.S_IFBLK:return"block-device";case nw.S_IFCHR:return"character-device";case nw.S_IFDIR:return"directory";case nw.S_IFIFO:return"fifo";case nw.S_IFLNK:return"symlink"}return"file"}var zQ=function(t){iw.call(this),this.written=0,this._to=t,this._destroyed=!1};JQ(zQ,iw);zQ.prototype._write=function(t,e,r){if(this.written+=t.length,this._to.push(t))return r();this._to._drain=r};zQ.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var XQ=function(){iw.call(this),this.linkname="",this._decoder=new rvt("utf-8"),this._destroyed=!1};JQ(XQ,iw);XQ.prototype._write=function(t,e,r){this.linkname+=this._decoder.write(t),r()};XQ.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var xv=function(){iw.call(this),this._destroyed=!1};JQ(xv,iw);xv.prototype._write=function(t,e,r){r(new Error("No body allowed for this entry"))};xv.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var EA=function(t){if(!(this instanceof EA))return new EA(t);Z2e.call(this,t),this._drain=lG,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};JQ(EA,Z2e);EA.prototype.entry=function(t,e,r){if(this._stream)throw new Error("already piping an entry");if(!(this._finalized||this._destroyed)){typeof e=="function"&&(r=e,e=null),r||(r=lG);var o=this;if((!t.size||t.type==="symlink")&&(t.size=0),t.type||(t.type=svt(t.mode)),t.mode||(t.mode=t.type==="directory"?nvt:ivt),t.uid||(t.uid=0),t.gid||(t.gid=0),t.mtime||(t.mtime=new Date),typeof e=="string"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){t.size=e.length,this._encode(t);var a=this.push(e);return aG(o,t.size),a?process.nextTick(r):this._drain=r,new xv}if(t.type==="symlink"&&!t.linkname){var n=new XQ;return X2e(n,function(A){if(A)return o.destroy(),r(A);t.linkname=n.linkname,o._encode(t),r()}),n}if(this._encode(t),t.type!=="file"&&t.type!=="contiguous-file")return process.nextTick(r),new xv;var u=new zQ(this);return this._stream=u,X2e(u,function(A){if(o._stream=null,A)return o.destroy(),r(A);if(u.written!==t.size)return o.destroy(),r(new Error("size mismatch"));aG(o,t.size),o._finalizing&&o.finalize(),r()}),u}};EA.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push($2e),this.push(null))};EA.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())};EA.prototype._encode=function(t){if(!t.pax){var e=KQ.encode(t);if(e){this.push(e);return}}this._encodePax(t)};EA.prototype._encodePax=function(t){var e=KQ.encodePax({name:t.name,linkname:t.linkname,pax:t.pax}),r={name:"PaxHeader",mode:t.mode,uid:t.uid,gid:t.gid,size:e.length,mtime:t.mtime,type:"pax-header",linkname:t.linkname&&"PaxHeader",uname:t.uname,gname:t.gname,devmajor:t.devmajor,devminor:t.devminor};this.push(KQ.encode(r)),this.push(e),aG(this,e.length),r.size=t.size,r.type=t.type,this.push(KQ.encode(r))};EA.prototype._read=function(t){var e=this._drain;this._drain=lG,e()};eBe.exports=EA});var rBe=_(cG=>{cG.extract=K2e();cG.pack=tBe()});var hBe=_((ier,pBe)=>{"use strict";var Bm=class{constructor(e,r,o){this.__specs=e||{},Object.keys(this.__specs).forEach(a=>{if(typeof this.__specs[a]=="string"){let n=this.__specs[a],u=this.__specs[n];if(u){let A=u.aliases||[];A.push(a,n),u.aliases=[...new Set(A)],this.__specs[a]=u}else throw new Error(`Alias refers to invalid key: ${n} -> ${a}`)}}),this.__opts=r||{},this.__providers=ABe(o.filter(a=>a!=null&&typeof a=="object")),this.__isFiggyPudding=!0}get(e){return gG(this,e,!0)}get[Symbol.toStringTag](){return"FiggyPudding"}forEach(e,r=this){for(let[o,a]of this.entries())e.call(r,a,o,this)}toJSON(){let e={};return this.forEach((r,o)=>{e[o]=r}),e}*entries(e){for(let o of Object.keys(this.__specs))yield[o,this.get(o)];let r=e||this.__opts.other;if(r){let o=new Set;for(let a of this.__providers){let n=a.entries?a.entries(r):Cvt(a);for(let[u,A]of n)r(u)&&!o.has(u)&&(o.add(u),yield[u,A])}}}*[Symbol.iterator](){for(let[e,r]of this.entries())yield[e,r]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new Bm(this.__specs,this.__opts,ABe(this.__providers).concat(e)),fBe)}};try{let t=Be("util");Bm.prototype[t.inspect.custom]=function(e,r){return this[Symbol.toStringTag]+" "+t.inspect(this.toJSON(),r)}}catch{}function yvt(t){throw Object.assign(new Error(`invalid config key requested: ${t}`),{code:"EBADKEY"})}function gG(t,e,r){let o=t.__specs[e];if(r&&!o&&(!t.__opts.other||!t.__opts.other(e)))yvt(e);else{o||(o={});let a;for(let n of t.__providers){if(a=uBe(e,n),a===void 0&&o.aliases&&o.aliases.length){for(let u of o.aliases)if(u!==e&&(a=uBe(u,n),a!==void 0))break}if(a!==void 0)break}return a===void 0&&o.default!==void 0?typeof o.default=="function"?o.default(t):o.default:a}}function uBe(t,e){let r;return e.__isFiggyPudding?r=gG(e,t,!1):typeof e.get=="function"?r=e.get(t):r=e[t],r}var fBe={has(t,e){return e in t.__specs&&gG(t,e,!1)!==void 0},ownKeys(t){return Object.keys(t.__specs)},get(t,e){return typeof e=="symbol"||e.slice(0,2)==="__"||e in Bm.prototype?t[e]:t.get(e)},set(t,e,r){if(typeof e=="symbol"||e.slice(0,2)==="__")return t[e]=r,!0;throw new Error("figgyPudding options cannot be modified. Use .concat() instead.")},deleteProperty(){throw new Error("figgyPudding options cannot be deleted. Use .concat() and shadow them instead.")}};pBe.exports=Evt;function Evt(t,e){function r(...o){return new Proxy(new Bm(t,e,o),fBe)}return r}function ABe(t){let e=[];return t.forEach(r=>e.unshift(r)),e}function Cvt(t){return Object.keys(t).map(e=>[e,t[e]])}});var mBe=_((ser,IA)=>{"use strict";var kv=Be("crypto"),wvt=hBe(),Ivt=Be("stream").Transform,gBe=["sha256","sha384","sha512"],Bvt=/^[a-z0-9+/]+(?:=?=?)$/i,vvt=/^([^-]+)-([^?]+)([?\S*]*)$/,Dvt=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)*$/,Pvt=/^[\x21-\x7E]+$/,ia=wvt({algorithms:{default:["sha512"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>Rvt},Promise:{default:()=>Promise},sep:{default:" "},single:{default:!1},size:{},strict:{default:!1}}),U0=class{get isHash(){return!0}constructor(e,r){r=ia(r);let o=!!r.strict;this.source=e.trim();let a=this.source.match(o?Dvt:vvt);if(!a||o&&!gBe.some(u=>u===a[1]))return;this.algorithm=a[1],this.digest=a[2];let n=a[3];this.options=n?n.slice(1).split("?"):[]}hexDigest(){return this.digest&&Buffer.from(this.digest,"base64").toString("hex")}toJSON(){return this.toString()}toString(e){if(e=ia(e),e.strict&&!(gBe.some(o=>o===this.algorithm)&&this.digest.match(Bvt)&&(this.options||[]).every(o=>o.match(Pvt))))return"";let r=this.options&&this.options.length?`?${this.options.join("?")}`:"";return`${this.algorithm}-${this.digest}${r}`}},vm=class{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){e=ia(e);let r=e.sep||" ";return e.strict&&(r=r.replace(/\S+/g," ")),Object.keys(this).map(o=>this[o].map(a=>U0.prototype.toString.call(a,e)).filter(a=>a.length).join(r)).filter(o=>o.length).join(r)}concat(e,r){r=ia(r);let o=typeof e=="string"?e:bv(e,r);return wA(`${this.toString(r)} ${o}`,r)}hexDigest(){return wA(this,{single:!0}).hexDigest()}match(e,r){r=ia(r);let o=wA(e,r),a=o.pickAlgorithm(r);return this[a]&&o[a]&&this[a].find(n=>o[a].find(u=>n.digest===u.digest))||!1}pickAlgorithm(e){e=ia(e);let r=e.pickAlgorithm,o=Object.keys(this);if(!o.length)throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`);return o.reduce((a,n)=>r(a,n)||a)}};IA.exports.parse=wA;function wA(t,e){if(e=ia(e),typeof t=="string")return dG(t,e);if(t.algorithm&&t.digest){let r=new vm;return r[t.algorithm]=[t],dG(bv(r,e),e)}else return dG(bv(t,e),e)}function dG(t,e){return e.single?new U0(t,e):t.trim().split(/\s+/).reduce((r,o)=>{let a=new U0(o,e);if(a.algorithm&&a.digest){let n=a.algorithm;r[n]||(r[n]=[]),r[n].push(a)}return r},new vm)}IA.exports.stringify=bv;function bv(t,e){return e=ia(e),t.algorithm&&t.digest?U0.prototype.toString.call(t,e):typeof t=="string"?bv(wA(t,e),e):vm.prototype.toString.call(t,e)}IA.exports.fromHex=Svt;function Svt(t,e,r){r=ia(r);let o=r.options&&r.options.length?`?${r.options.join("?")}`:"";return wA(`${e}-${Buffer.from(t,"hex").toString("base64")}${o}`,r)}IA.exports.fromData=xvt;function xvt(t,e){e=ia(e);let r=e.algorithms,o=e.options&&e.options.length?`?${e.options.join("?")}`:"";return r.reduce((a,n)=>{let u=kv.createHash(n).update(t).digest("base64"),A=new U0(`${n}-${u}${o}`,e);if(A.algorithm&&A.digest){let p=A.algorithm;a[p]||(a[p]=[]),a[p].push(A)}return a},new vm)}IA.exports.fromStream=bvt;function bvt(t,e){e=ia(e);let r=e.Promise||Promise,o=mG(e);return new r((a,n)=>{t.pipe(o),t.on("error",n),o.on("error",n);let u;o.on("integrity",A=>{u=A}),o.on("end",()=>a(u)),o.on("data",()=>{})})}IA.exports.checkData=kvt;function kvt(t,e,r){if(r=ia(r),e=wA(e,r),!Object.keys(e).length){if(r.error)throw Object.assign(new Error("No valid integrity hashes to check against"),{code:"EINTEGRITY"});return!1}let o=e.pickAlgorithm(r),a=kv.createHash(o).update(t).digest("base64"),n=wA({algorithm:o,digest:a}),u=n.match(e,r);if(u||!r.error)return u;if(typeof r.size=="number"&&t.length!==r.size){let A=new Error(`data size mismatch when checking ${e}. + Wanted: ${r.size} + Found: ${t.length}`);throw A.code="EBADSIZE",A.found=t.length,A.expected=r.size,A.sri=e,A}else{let A=new Error(`Integrity checksum failed when using ${o}: Wanted ${e}, but got ${n}. (${t.length} bytes)`);throw A.code="EINTEGRITY",A.found=n,A.expected=e,A.algorithm=o,A.sri=e,A}}IA.exports.checkStream=Qvt;function Qvt(t,e,r){r=ia(r);let o=r.Promise||Promise,a=mG(r.concat({integrity:e}));return new o((n,u)=>{t.pipe(a),t.on("error",u),a.on("error",u);let A;a.on("verified",p=>{A=p}),a.on("end",()=>n(A)),a.on("data",()=>{})})}IA.exports.integrityStream=mG;function mG(t){t=ia(t);let e=t.integrity&&wA(t.integrity,t),r=e&&Object.keys(e).length,o=r&&e.pickAlgorithm(t),a=r&&e[o],n=Array.from(new Set(t.algorithms.concat(o?[o]:[]))),u=n.map(kv.createHash),A=0,p=new Ivt({transform(h,E,I){A+=h.length,u.forEach(v=>v.update(h,E)),I(null,h,E)}}).on("end",()=>{let h=t.options&&t.options.length?`?${t.options.join("?")}`:"",E=wA(u.map((v,b)=>`${n[b]}-${v.digest("base64")}${h}`).join(" "),t),I=r&&E.match(e,t);if(typeof t.size=="number"&&A!==t.size){let v=new Error(`stream size mismatch when checking ${e}. + Wanted: ${t.size} + Found: ${A}`);v.code="EBADSIZE",v.found=A,v.expected=t.size,v.sri=e,p.emit("error",v)}else if(t.integrity&&!I){let v=new Error(`${e} integrity checksum failed when using ${o}: wanted ${a} but got ${E}. (${A} bytes)`);v.code="EINTEGRITY",v.found=E,v.expected=a,v.algorithm=o,v.sri=e,p.emit("error",v)}else p.emit("size",A),p.emit("integrity",E),I&&p.emit("verified",I)});return p}IA.exports.create=Fvt;function Fvt(t){t=ia(t);let e=t.algorithms,r=t.options.length?`?${t.options.join("?")}`:"",o=e.map(kv.createHash);return{update:function(a,n){return o.forEach(u=>u.update(a,n)),this},digest:function(a){return e.reduce((u,A)=>{let p=o.shift().digest("base64"),h=new U0(`${A}-${p}${r}`,t);if(h.algorithm&&h.digest){let E=h.algorithm;u[E]||(u[E]=[]),u[E].push(h)}return u},new vm)}}}var Tvt=new Set(kv.getHashes()),dBe=["md5","whirlpool","sha1","sha224","sha256","sha384","sha512","sha3","sha3-256","sha3-384","sha3-512","sha3_256","sha3_384","sha3_512"].filter(t=>Tvt.has(t));function Rvt(t,e){return dBe.indexOf(t.toLowerCase())>=dBe.indexOf(e.toLowerCase())?t:e}});var VBe=_((lir,WBe)=>{var TDt=uL();function RDt(t){return TDt(t)?void 0:t}WBe.exports=RDt});var JBe=_((cir,KBe)=>{var NDt=jx(),LDt=Q8(),MDt=N8(),ODt=jd(),UDt=gd(),_Dt=VBe(),HDt=P_(),jDt=k8(),qDt=1,GDt=2,YDt=4,WDt=HDt(function(t,e){var r={};if(t==null)return r;var o=!1;e=NDt(e,function(n){return n=ODt(n,t),o||(o=n.length>1),n}),UDt(t,jDt(t),r),o&&(r=LDt(r,qDt|GDt|YDt,_Dt));for(var a=e.length;a--;)MDt(r,e[a]);return r});KBe.exports=WDt});Pt();Ye();Pt();var eve=Be("child_process"),tve=$e(ed());qt();var uC=new Map([]);var o2={};Kt(o2,{BaseCommand:()=>ut,WorkspaceRequiredError:()=>rr,getCli:()=>the,getDynamicLibs:()=>ehe,getPluginConfiguration:()=>fC,openWorkspace:()=>AC,pluginCommands:()=>uC,runExit:()=>sk});qt();var ut=class extends nt{constructor(){super(...arguments);this.cwd=ge.String("--cwd",{hidden:!0})}validateAndExecute(){if(typeof this.cwd<"u")throw new it("The --cwd option is ambiguous when used anywhere else than the very first parameter provided in the command line, before even the command path");return super.validateAndExecute()}};Ye();Pt();qt();var rr=class extends it{constructor(e,r){let o=K.relative(e,r),a=K.join(e,Mt.fileName);super(`This command can only be run from within a workspace of your project (${o} isn't a workspace of ${a}).`)}};Ye();Pt();nA();Nl();b1();qt();var OAt=$e(zn());Za();var ehe=()=>new Map([["@yarnpkg/cli",o2],["@yarnpkg/core",s2],["@yarnpkg/fslib",Vw],["@yarnpkg/libzip",x1],["@yarnpkg/parsers",tI],["@yarnpkg/shell",T1],["clipanion",pI],["semver",OAt],["typanion",Ko]]);Ye();async function AC(t,e){let{project:r,workspace:o}=await St.find(t,e);if(!o)throw new rr(r.cwd,e);return o}Ye();Pt();nA();Nl();b1();qt();var tPt=$e(zn());Za();var tH={};Kt(tH,{AddCommand:()=>bh,BinCommand:()=>kh,CacheCleanCommand:()=>Qh,ClipanionCommand:()=>Wd,ConfigCommand:()=>Nh,ConfigGetCommand:()=>Fh,ConfigSetCommand:()=>Th,ConfigUnsetCommand:()=>Rh,DedupeCommand:()=>Lh,EntryCommand:()=>dC,ExecCommand:()=>Mh,ExplainCommand:()=>_h,ExplainPeerRequirementsCommand:()=>Oh,HelpCommand:()=>Vd,InfoCommand:()=>Hh,LinkCommand:()=>qh,NodeCommand:()=>Gh,PluginCheckCommand:()=>Yh,PluginImportCommand:()=>Kh,PluginImportSourcesCommand:()=>Jh,PluginListCommand:()=>Wh,PluginRemoveCommand:()=>zh,PluginRuntimeCommand:()=>Xh,RebuildCommand:()=>Zh,RemoveCommand:()=>$h,RunCommand:()=>e0,RunIndexCommand:()=>zd,SetResolutionCommand:()=>t0,SetVersionCommand:()=>Uh,SetVersionSourcesCommand:()=>Vh,UnlinkCommand:()=>r0,UpCommand:()=>Kf,VersionCommand:()=>Kd,WhyCommand:()=>n0,WorkspaceCommand:()=>o0,WorkspacesListCommand:()=>s0,YarnCommand:()=>jh,dedupeUtils:()=>gk,default:()=>Qgt,suggestUtils:()=>zc});var Tde=$e(ed());Ye();Ye();Ye();qt();var j0e=$e(A2());Za();var zc={};Kt(zc,{Modifier:()=>D8,Strategy:()=>fk,Target:()=>f2,WorkspaceModifier:()=>M0e,applyModifier:()=>ipt,extractDescriptorFromPath:()=>P8,extractRangeModifier:()=>O0e,fetchDescriptorFrom:()=>S8,findProjectDescriptors:()=>H0e,getModifier:()=>p2,getSuggestedDescriptors:()=>h2,makeWorkspaceDescriptor:()=>_0e,toWorkspaceModifier:()=>U0e});Ye();Ye();Pt();var v8=$e(zn()),rpt="workspace:",f2=(o=>(o.REGULAR="dependencies",o.DEVELOPMENT="devDependencies",o.PEER="peerDependencies",o))(f2||{}),D8=(o=>(o.CARET="^",o.TILDE="~",o.EXACT="",o))(D8||{}),M0e=(o=>(o.CARET="^",o.TILDE="~",o.EXACT="*",o))(M0e||{}),fk=(n=>(n.KEEP="keep",n.REUSE="reuse",n.PROJECT="project",n.LATEST="latest",n.CACHE="cache",n))(fk||{});function p2(t,e){return t.exact?"":t.caret?"^":t.tilde?"~":e.configuration.get("defaultSemverRangePrefix")}var npt=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function O0e(t,{project:e}){let r=t.match(npt);return r?r[1]:e.configuration.get("defaultSemverRangePrefix")}function ipt(t,e){let{protocol:r,source:o,params:a,selector:n}=W.parseRange(t.range);return v8.default.valid(n)&&(n=`${e}${t.range}`),W.makeDescriptor(t,W.makeRange({protocol:r,source:o,params:a,selector:n}))}function U0e(t){switch(t){case"^":return"^";case"~":return"~";case"":return"*";default:throw new Error(`Assertion failed: Unknown modifier: "${t}"`)}}function _0e(t,e){return W.makeDescriptor(t.anchoredDescriptor,`${rpt}${U0e(e)}`)}async function H0e(t,{project:e,target:r}){let o=new Map,a=n=>{let u=o.get(n.descriptorHash);return u||o.set(n.descriptorHash,u={descriptor:n,locators:[]}),u};for(let n of e.workspaces)if(r==="peerDependencies"){let u=n.manifest.peerDependencies.get(t.identHash);u!==void 0&&a(u).locators.push(n.anchoredLocator)}else{let u=n.manifest.dependencies.get(t.identHash),A=n.manifest.devDependencies.get(t.identHash);r==="devDependencies"?A!==void 0?a(A).locators.push(n.anchoredLocator):u!==void 0&&a(u).locators.push(n.anchoredLocator):u!==void 0?a(u).locators.push(n.anchoredLocator):A!==void 0&&a(A).locators.push(n.anchoredLocator)}return o}async function P8(t,{cwd:e,workspace:r}){return await spt(async o=>{K.isAbsolute(t)||(t=K.relative(r.cwd,K.resolve(e,t)),t.match(/^\.{0,2}\//)||(t=`./${t}`));let{project:a}=r,n=await S8(W.makeIdent(null,"archive"),t,{project:r.project,cache:o,workspace:r});if(!n)throw new Error("Assertion failed: The descriptor should have been found");let u=new Qi,A=a.configuration.makeResolver(),p=a.configuration.makeFetcher(),h={checksums:a.storedChecksums,project:a,cache:o,fetcher:p,report:u,resolver:A},E=A.bindDescriptor(n,r.anchoredLocator,h),I=W.convertDescriptorToLocator(E),v=await p.fetch(I,h),b=await Mt.find(v.prefixPath,{baseFs:v.packageFs});if(!b.name)throw new Error("Target path doesn't have a name");return W.makeDescriptor(b.name,t)})}async function h2(t,{project:e,workspace:r,cache:o,target:a,fixed:n,modifier:u,strategies:A,maxResults:p=1/0}){if(!(p>=0))throw new Error(`Invalid maxResults (${p})`);let[h,E]=t.range!=="unknown"?n||kr.validRange(t.range)||!t.range.match(/^[a-z0-9._-]+$/i)?[t.range,"latest"]:["unknown",t.range]:["unknown","latest"];if(h!=="unknown")return{suggestions:[{descriptor:t,name:`Use ${W.prettyDescriptor(e.configuration,t)}`,reason:"(unambiguous explicit request)"}],rejections:[]};let I=typeof r<"u"&&r!==null&&r.manifest[a].get(t.identHash)||null,v=[],b=[],C=async T=>{try{await T()}catch(L){b.push(L)}};for(let T of A){if(v.length>=p)break;switch(T){case"keep":await C(async()=>{I&&v.push({descriptor:I,name:`Keep ${W.prettyDescriptor(e.configuration,I)}`,reason:"(no changes)"})});break;case"reuse":await C(async()=>{for(let{descriptor:L,locators:U}of(await H0e(t,{project:e,target:a})).values()){if(U.length===1&&U[0].locatorHash===r.anchoredLocator.locatorHash&&A.includes("keep"))continue;let J=`(originally used by ${W.prettyLocator(e.configuration,U[0])}`;J+=U.length>1?` and ${U.length-1} other${U.length>2?"s":""})`:")",v.push({descriptor:L,name:`Reuse ${W.prettyDescriptor(e.configuration,L)}`,reason:J})}});break;case"cache":await C(async()=>{for(let L of e.storedDescriptors.values())L.identHash===t.identHash&&v.push({descriptor:L,name:`Reuse ${W.prettyDescriptor(e.configuration,L)}`,reason:"(already used somewhere in the lockfile)"})});break;case"project":await C(async()=>{if(r.manifest.name!==null&&t.identHash===r.manifest.name.identHash)return;let L=e.tryWorkspaceByIdent(t);if(L===null)return;let U=_0e(L,u);v.push({descriptor:U,name:`Attach ${W.prettyDescriptor(e.configuration,U)}`,reason:`(local workspace at ${de.pretty(e.configuration,L.relativeCwd,de.Type.PATH)})`})});break;case"latest":{let L=e.configuration.get("enableNetwork"),U=e.configuration.get("enableOfflineMode");await C(async()=>{if(a==="peerDependencies")v.push({descriptor:W.makeDescriptor(t,"*"),name:"Use *",reason:"(catch-all peer dependency pattern)"});else if(!L&&!U)v.push({descriptor:null,name:"Resolve from latest",reason:de.pretty(e.configuration,"(unavailable because enableNetwork is toggled off)","grey")});else{let J=await S8(t,E,{project:e,cache:o,workspace:r,modifier:u});J&&v.push({descriptor:J,name:`Use ${W.prettyDescriptor(e.configuration,J)}`,reason:`(resolved from ${U?"the cache":"latest"})`})}})}break}}return{suggestions:v.slice(0,p),rejections:b.slice(0,p)}}async function S8(t,e,{project:r,cache:o,workspace:a,preserveModifier:n=!0,modifier:u}){let A=r.configuration.normalizeDependency(W.makeDescriptor(t,e)),p=new Qi,h=r.configuration.makeFetcher(),E=r.configuration.makeResolver(),I={project:r,fetcher:h,cache:o,checksums:r.storedChecksums,report:p,cacheOptions:{skipIntegrityCheck:!0}},v={...I,resolver:E,fetchOptions:I},b=E.bindDescriptor(A,a.anchoredLocator,v),C=await E.getCandidates(b,{},v);if(C.length===0)return null;let T=C[0],{protocol:L,source:U,params:J,selector:te}=W.parseRange(W.convertToManifestRange(T.reference));if(L===r.configuration.get("defaultProtocol")&&(L=null),v8.default.valid(te)){let le=te;if(typeof u<"u")te=u+te;else if(n!==!1){let ye=typeof n=="string"?n:A.range;te=O0e(ye,{project:r})+te}let pe=W.makeDescriptor(T,W.makeRange({protocol:L,source:U,params:J,selector:te}));(await E.getCandidates(r.configuration.normalizeDependency(pe),{},v)).length!==1&&(te=le)}return W.makeDescriptor(T,W.makeRange({protocol:L,source:U,params:J,selector:te}))}async function spt(t){return await oe.mktempPromise(async e=>{let r=Ve.create(e);return r.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await t(new Lr(e,{configuration:r,check:!1,immutable:!1}))})}var bh=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.fixed=ge.Boolean("-F,--fixed",!1,{description:"Store dependency tags as-is instead of resolving them"});this.exact=ge.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=ge.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=ge.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.dev=ge.Boolean("-D,--dev",!1,{description:"Add a package as a dev dependency"});this.peer=ge.Boolean("-P,--peer",!1,{description:"Add a package as a peer dependency"});this.optional=ge.Boolean("-O,--optional",!1,{description:"Add / upgrade a package to an optional regular / peer dependency"});this.preferDev=ge.Boolean("--prefer-dev",!1,{description:"Add / upgrade a package to a dev dependency"});this.interactive=ge.Boolean("-i,--interactive",{description:"Reuse the specified package from other workspaces in the project"});this.cached=ge.Boolean("--cached",!1,{description:"Reuse the highest version already used somewhere within the project"});this.mode=ge.String("--mode",{description:"Change what artifacts installs generate",validator:Vs(pl)});this.silent=ge.Boolean("--silent",{hidden:!0});this.packages=ge.Rest()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Lr.find(r);if(!a)throw new rr(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=this.fixed,A=this.interactive??r.get("preferInteractive"),p=A||r.get("preferReuse"),h=p2(this,o),E=[p?"reuse":void 0,"project",this.cached?"cache":void 0,"latest"].filter(U=>typeof U<"u"),I=A?1/0:1,v=await Promise.all(this.packages.map(async U=>{let J=U.match(/^\.{0,2}\//)?await P8(U,{cwd:this.context.cwd,workspace:a}):W.tryParseDescriptor(U),te=U.match(/^(https?:|git@github)/);if(te)throw new it(`It seems you are trying to add a package using a ${de.pretty(r,`${te[0]}...`,de.Type.RANGE)} url; we now require package names to be explicitly specified. +Try running the command again with the package name prefixed: ${de.pretty(r,"yarn add",de.Type.CODE)} ${de.pretty(r,W.makeDescriptor(W.makeIdent(null,"my-package"),`${te[0]}...`),de.Type.DESCRIPTOR)}`);if(!J)throw new it(`The ${de.pretty(r,U,de.Type.CODE)} string didn't match the required format (package-name@range). Did you perhaps forget to explicitly reference the package name?`);let le=opt(a,J,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional});return await Promise.all(le.map(async Ae=>{let ye=await h2(J,{project:o,workspace:a,cache:n,fixed:u,target:Ae,modifier:h,strategies:E,maxResults:I});return{request:J,suggestedDescriptors:ye,target:Ae}}))})).then(U=>U.flat()),b=await AA.start({configuration:r,stdout:this.context.stdout,suggestInstall:!1},async U=>{for(let{request:J,suggestedDescriptors:{suggestions:te,rejections:le}}of v)if(te.filter(Ae=>Ae.descriptor!==null).length===0){let[Ae]=le;if(typeof Ae>"u")throw new Error("Assertion failed: Expected an error to have been set");o.configuration.get("enableNetwork")?U.reportError(27,`${W.prettyDescriptor(r,J)} can't be resolved to a satisfying range`):U.reportError(27,`${W.prettyDescriptor(r,J)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),U.reportSeparator(),U.reportExceptionOnce(Ae)}});if(b.hasErrors())return b.exitCode();let C=!1,T=[],L=[];for(let{suggestedDescriptors:{suggestions:U},target:J}of v){let te,le=U.filter(ae=>ae.descriptor!==null),pe=le[0].descriptor,Ae=le.every(ae=>W.areDescriptorsEqual(ae.descriptor,pe));le.length===1||Ae?te=pe:(C=!0,{answer:te}=await(0,j0e.prompt)({type:"select",name:"answer",message:"Which range do you want to use?",choices:U.map(({descriptor:ae,name:we,reason:Pe})=>ae?{name:we,hint:Pe,descriptor:ae}:{name:we,hint:Pe,disabled:!0}),onCancel:()=>process.exit(130),result(ae){return this.find(ae,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let ye=a.manifest[J].get(te.identHash);(typeof ye>"u"||ye.descriptorHash!==te.descriptorHash)&&(a.manifest[J].set(te.identHash,te),this.optional&&(J==="dependencies"?a.manifest.ensureDependencyMeta({...te,range:"unknown"}).optional=!0:J==="peerDependencies"&&(a.manifest.ensurePeerDependencyMeta({...te,range:"unknown"}).optional=!0)),typeof ye>"u"?T.push([a,J,te,E]):L.push([a,J,ye,te]))}return await r.triggerMultipleHooks(U=>U.afterWorkspaceDependencyAddition,T),await r.triggerMultipleHooks(U=>U.afterWorkspaceDependencyReplacement,L),C&&this.context.stdout.write(` +`),await o.installWithNewReport({json:this.json,stdout:this.context.stdout,quiet:this.context.quiet},{cache:n,mode:this.mode})}};bh.paths=[["add"]],bh.usage=nt.Usage({description:"add dependencies to the project",details:"\n This command adds a package to the package.json for the nearest workspace.\n\n - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\n\n - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\n\n - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\n\n - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\"peerDependenciesMeta\": { \"\": { \"optional\": true } }`\n\n - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\n\n - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\n\n If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\n\n If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/protocols.\n ",examples:[["Add a regular package to the current workspace","$0 add lodash"],["Add a specific version for a package to the current workspace","$0 add lodash@1.2.3"],["Add a package from a GitHub repository (the master branch) to the current workspace using a URL","$0 add lodash@https://github.com/lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol","$0 add lodash@github:lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)","$0 add lodash@lodash/lodash"],["Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)","$0 add lodash-es@lodash/lodash#es"]]});function opt(t,e,{dev:r,peer:o,preferDev:a,optional:n}){let u=t.manifest["dependencies"].has(e.identHash),A=t.manifest["devDependencies"].has(e.identHash),p=t.manifest["peerDependencies"].has(e.identHash);if((r||o)&&u)throw new it(`Package "${W.prettyIdent(t.project.configuration,e)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!r&&!o&&p)throw new it(`Package "${W.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(n&&A)throw new it(`Package "${W.prettyIdent(t.project.configuration,e)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(n&&!o&&p)throw new it(`Package "${W.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((r||a)&&n)throw new it(`Package "${W.prettyIdent(t.project.configuration,e)}" cannot simultaneously be a dev dependency and an optional dependency`);let h=[];return o&&h.push("peerDependencies"),(r||a)&&h.push("devDependencies"),n&&h.push("dependencies"),h.length>0?h:A?["devDependencies"]:p?["peerDependencies"]:["dependencies"]}Ye();Ye();qt();var kh=class extends ut{constructor(){super(...arguments);this.verbose=ge.Boolean("-v,--verbose",!1,{description:"Print both the binary name and the locator of the package that provides the binary"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.name=ge.String({required:!1})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,locator:a}=await St.find(r,this.context.cwd);if(await o.restoreInstallState(),this.name){let A=(await un.getPackageAccessibleBinaries(a,{project:o})).get(this.name);if(!A)throw new it(`Couldn't find a binary named "${this.name}" for package "${W.prettyLocator(r,a)}"`);let[,p]=A;return this.context.stdout.write(`${p} +`),0}return(await Nt.start({configuration:r,json:this.json,stdout:this.context.stdout},async u=>{let A=await un.getPackageAccessibleBinaries(a,{project:o}),h=Array.from(A.keys()).reduce((E,I)=>Math.max(E,I.length),0);for(let[E,[I,v]]of A)u.reportJson({name:E,source:W.stringifyIdent(I),path:v});if(this.verbose)for(let[E,[I]]of A)u.reportInfo(null,`${E.padEnd(h," ")} ${W.prettyLocator(r,I)}`);else for(let E of A.keys())u.reportInfo(null,E)})).exitCode()}};kh.paths=[["bin"]],kh.usage=nt.Usage({description:"get the path to a binary script",details:` + When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the \`-v,--verbose\` flag will cause the output to contain both the binary name and the locator of the package that provides the binary. + + When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive. + `,examples:[["List all the available binaries","$0 bin"],["Print the path to a specific binary","$0 bin eslint"]]});Ye();Pt();qt();var Qh=class extends ut{constructor(){super(...arguments);this.mirror=ge.Boolean("--mirror",!1,{description:"Remove the global cache files instead of the local cache files"});this.all=ge.Boolean("--all",!1,{description:"Remove both the global cache files and the local cache files of the current project"})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),o=await Lr.find(r);return(await Nt.start({configuration:r,stdout:this.context.stdout},async()=>{let n=(this.all||this.mirror)&&o.mirrorCwd!==null,u=!this.mirror;n&&(await oe.removePromise(o.mirrorCwd),await r.triggerHook(A=>A.cleanGlobalArtifacts,r)),u&&await oe.removePromise(o.cwd)})).exitCode()}};Qh.paths=[["cache","clean"],["cache","clear"]],Qh.usage=nt.Usage({description:"remove the shared cache files",details:` + This command will remove all the files from the cache. + `,examples:[["Remove all the local archives","$0 cache clean"],["Remove all the archives stored in the ~/.yarn directory","$0 cache clean --mirror"]]});Ye();qt();var G0e=$e(g2()),x8=Be("util"),Fh=class extends ut{constructor(){super(...arguments);this.why=ge.Boolean("--why",!1,{description:"Print the explanation for why a setting has its value"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.unsafe=ge.Boolean("--no-redacted",!1,{description:"Don't redact secrets (such as tokens) from the output"});this.name=ge.String()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),o=this.name.replace(/[.[].*$/,""),a=this.name.replace(/^[^.[]*/,"");if(typeof r.settings.get(o)>"u")throw new it(`Couldn't find a configuration settings named "${o}"`);let u=r.getSpecial(o,{hideSecrets:!this.unsafe,getNativePaths:!0}),A=je.convertMapsToIndexableObjects(u),p=a?(0,G0e.default)(A,a):A,h=await Nt.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async E=>{E.reportJson(p)});if(!this.json){if(typeof p=="string")return this.context.stdout.write(`${p} +`),h.exitCode();x8.inspect.styles.name="cyan",this.context.stdout.write(`${(0,x8.inspect)(p,{depth:1/0,colors:r.get("enableColors"),compact:!1})} +`)}return h.exitCode()}};Fh.paths=[["config","get"]],Fh.usage=nt.Usage({description:"read a configuration settings",details:` + This command will print a configuration setting. + + Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the \`--no-redacted\` to get the untransformed value. + `,examples:[["Print a simple configuration setting","yarn config get yarnPath"],["Print a complex configuration setting","yarn config get packageExtensions"],["Print a nested field from the configuration",`yarn config get 'npmScopes["my-company"].npmRegistryServer'`],["Print a token from the configuration","yarn config get npmAuthToken --no-redacted"],["Print a configuration setting as JSON","yarn config get packageExtensions --json"]]});Ye();qt();var Rge=$e(F8()),Nge=$e(g2()),Lge=$e(T8()),R8=Be("util"),Th=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Set complex configuration settings to JSON values"});this.home=ge.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=ge.String();this.value=ge.String()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),o=()=>{if(!r.projectCwd)throw new it("This command must be run from within a project folder");return r.projectCwd},a=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof r.settings.get(a)>"u")throw new it(`Couldn't find a configuration settings named "${a}"`);if(a==="enableStrictSettings")throw new it("This setting only affects the file it's in, and thus cannot be set from the CLI");let A=this.json?JSON.parse(this.value):this.value;await(this.home?C=>Ve.updateHomeConfiguration(C):C=>Ve.updateConfiguration(o(),C))(C=>{if(n){let T=(0,Rge.default)(C);return(0,Lge.default)(T,this.name,A),T}else return{...C,[a]:A}});let E=(await Ve.find(this.context.cwd,this.context.plugins)).getSpecial(a,{hideSecrets:!0,getNativePaths:!0}),I=je.convertMapsToIndexableObjects(E),v=n?(0,Nge.default)(I,n):I;return(await Nt.start({configuration:r,includeFooter:!1,stdout:this.context.stdout},async C=>{R8.inspect.styles.name="cyan",C.reportInfo(0,`Successfully set ${this.name} to ${(0,R8.inspect)(v,{depth:1/0,colors:r.get("enableColors"),compact:!1})}`)})).exitCode()}};Th.paths=[["config","set"]],Th.usage=nt.Usage({description:"change a configuration settings",details:` + This command will set a configuration setting. + + When used without the \`--json\` flag, it can only set a simple configuration setting (a string, a number, or a boolean). + + When used with the \`--json\` flag, it can set both simple and complex configuration settings, including Arrays and Objects. + `,examples:[["Set a simple configuration setting (a string, a number, or a boolean)","yarn config set initScope myScope"],["Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag",'yarn config set initScope --json \\"myScope\\"'],["Set a complex configuration setting (an Array) using the `--json` flag",`yarn config set unsafeHttpWhitelist --json '["*.example.com", "example.com"]'`],["Set a complex configuration setting (an Object) using the `--json` flag",`yarn config set packageExtensions --json '{ "@babel/parser@*": { "dependencies": { "@babel/types": "*" } } }'`],["Set a nested configuration setting",'yarn config set npmScopes.company.npmRegistryServer "https://npm.example.com"'],["Set a nested configuration setting using indexed access for non-simple keys",`yarn config set 'npmRegistries["//npm.example.com"].npmAuthToken' "ffffffff-ffff-ffff-ffff-ffffffffffff"`]]});Ye();qt();var Vge=$e(F8()),Kge=$e(_ge()),Jge=$e(L8()),Rh=class extends ut{constructor(){super(...arguments);this.home=ge.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=ge.String()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),o=()=>{if(!r.projectCwd)throw new it("This command must be run from within a project folder");return r.projectCwd},a=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof r.settings.get(a)>"u")throw new it(`Couldn't find a configuration settings named "${a}"`);let A=this.home?h=>Ve.updateHomeConfiguration(h):h=>Ve.updateConfiguration(o(),h);return(await Nt.start({configuration:r,includeFooter:!1,stdout:this.context.stdout},async h=>{let E=!1;await A(I=>{if(!(0,Kge.default)(I,this.name))return h.reportWarning(0,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),E=!0,I;let v=n?(0,Vge.default)(I):{...I};return(0,Jge.default)(v,this.name),v}),E||h.reportInfo(0,`Successfully unset ${this.name}`)})).exitCode()}};Rh.paths=[["config","unset"]],Rh.usage=nt.Usage({description:"unset a configuration setting",details:` + This command will unset a configuration setting. + `,examples:[["Unset a simple configuration setting","yarn config unset initScope"],["Unset a complex configuration setting","yarn config unset packageExtensions"],["Unset a nested configuration setting","yarn config unset npmScopes.company.npmRegistryServer"]]});Ye();Pt();qt();var hk=Be("util"),Nh=class extends ut{constructor(){super(...arguments);this.noDefaults=ge.Boolean("--no-defaults",!1,{description:"Omit the default values from the display"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.verbose=ge.Boolean("-v,--verbose",{hidden:!0});this.why=ge.Boolean("--why",{hidden:!0});this.names=ge.Rest()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins,{strict:!1}),o=await NE({configuration:r,stdout:this.context.stdout,forceError:this.json},[{option:this.verbose,message:"The --verbose option is deprecated, the settings' descriptions are now always displayed"},{option:this.why,message:"The --why option is deprecated, the settings' sources are now always displayed"}]);if(o!==null)return o;let a=this.names.length>0?[...new Set(this.names)].sort():[...r.settings.keys()].sort(),n,u=await Nt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async A=>{if(r.invalid.size>0&&!this.json){for(let[p,h]of r.invalid)A.reportError(34,`Invalid configuration key "${p}" in ${h}`);A.reportSeparator()}if(this.json)for(let p of a){let h=r.settings.get(p);typeof h>"u"&&A.reportError(34,`No configuration key named "${p}"`);let E=r.getSpecial(p,{hideSecrets:!0,getNativePaths:!0}),I=r.sources.get(p)??"",v=I&&I[0]!=="<"?ue.fromPortablePath(I):I;A.reportJson({key:p,effective:E,source:v,...h})}else{let p={breakLength:1/0,colors:r.get("enableColors"),maxArrayLength:2},h={},E={children:h};for(let I of a){if(this.noDefaults&&!r.sources.has(I))continue;let v=r.settings.get(I),b=r.sources.get(I)??"",C=r.getSpecial(I,{hideSecrets:!0,getNativePaths:!0}),T={Description:{label:"Description",value:de.tuple(de.Type.MARKDOWN,{text:v.description,format:this.cli.format(),paragraphs:!1})},Source:{label:"Source",value:de.tuple(b[0]==="<"?de.Type.CODE:de.Type.PATH,b)}};h[I]={value:de.tuple(de.Type.CODE,I),children:T};let L=(U,J)=>{for(let[te,le]of J)if(le instanceof Map){let pe={};U[te]={children:pe},L(pe,le)}else U[te]={label:te,value:de.tuple(de.Type.NO_HINT,(0,hk.inspect)(le,p))}};C instanceof Map?L(T,C):T.Value={label:"Value",value:de.tuple(de.Type.NO_HINT,(0,hk.inspect)(C,p))}}a.length!==1&&(n=void 0),$s.emitTree(E,{configuration:r,json:this.json,stdout:this.context.stdout,separators:2})}});if(!this.json&&typeof n<"u"){let A=a[0],p=(0,hk.inspect)(r.getSpecial(A,{hideSecrets:!0,getNativePaths:!0}),{colors:r.get("enableColors")});this.context.stdout.write(` +`),this.context.stdout.write(`${p} +`)}return u.exitCode()}};Nh.paths=[["config"]],Nh.usage=nt.Usage({description:"display the current configuration",details:` + This command prints the current active configuration settings. + `,examples:[["Print the active configuration settings","$0 config"]]});Ye();qt();Za();var gk={};Kt(gk,{Strategy:()=>d2,acceptedStrategies:()=>j0t,dedupe:()=>M8});Ye();Ye();var zge=$e(Zo()),d2=(e=>(e.HIGHEST="highest",e))(d2||{}),j0t=new Set(Object.values(d2)),q0t={highest:async(t,e,{resolver:r,fetcher:o,resolveOptions:a,fetchOptions:n})=>{let u=new Map;for(let[p,h]of t.storedResolutions){let E=t.storedDescriptors.get(p);if(typeof E>"u")throw new Error(`Assertion failed: The descriptor (${p}) should have been registered`);je.getSetWithDefault(u,E.identHash).add(h)}let A=new Map(je.mapAndFilter(t.storedDescriptors.values(),p=>W.isVirtualDescriptor(p)?je.mapAndFilter.skip:[p.descriptorHash,je.makeDeferred()]));for(let p of t.storedDescriptors.values()){let h=A.get(p.descriptorHash);if(typeof h>"u")throw new Error(`Assertion failed: The descriptor (${p.descriptorHash}) should have been registered`);let E=t.storedResolutions.get(p.descriptorHash);if(typeof E>"u")throw new Error(`Assertion failed: The resolution (${p.descriptorHash}) should have been registered`);let I=t.originalPackages.get(E);if(typeof I>"u")throw new Error(`Assertion failed: The package (${E}) should have been registered`);Promise.resolve().then(async()=>{let v=r.getResolutionDependencies(p,a),b=Object.fromEntries(await je.allSettledSafe(Object.entries(v).map(async([te,le])=>{let pe=A.get(le.descriptorHash);if(typeof pe>"u")throw new Error(`Assertion failed: The descriptor (${le.descriptorHash}) should have been registered`);let Ae=await pe.promise;if(!Ae)throw new Error("Assertion failed: Expected the dependency to have been through the dedupe process itself");return[te,Ae.updatedPackage]})));if(e.length&&!zge.default.isMatch(W.stringifyIdent(p),e)||!r.shouldPersistResolution(I,a))return I;let C=u.get(p.identHash);if(typeof C>"u")throw new Error(`Assertion failed: The resolutions (${p.identHash}) should have been registered`);if(C.size===1)return I;let T=[...C].map(te=>{let le=t.originalPackages.get(te);if(typeof le>"u")throw new Error(`Assertion failed: The package (${te}) should have been registered`);return le}),L=await r.getSatisfying(p,b,T,a),U=L.locators?.[0];if(typeof U>"u"||!L.sorted)return I;let J=t.originalPackages.get(U.locatorHash);if(typeof J>"u")throw new Error(`Assertion failed: The package (${U.locatorHash}) should have been registered`);return J}).then(async v=>{let b=await t.preparePackage(v,{resolver:r,resolveOptions:a});h.resolve({descriptor:p,currentPackage:I,updatedPackage:v,resolvedPackage:b})}).catch(v=>{h.reject(v)})}return[...A.values()].map(p=>p.promise)}};async function M8(t,{strategy:e,patterns:r,cache:o,report:a}){let{configuration:n}=t,u=new Qi,A=n.makeResolver(),p=n.makeFetcher(),h={cache:o,checksums:t.storedChecksums,fetcher:p,project:t,report:u,cacheOptions:{skipIntegrityCheck:!0}},E={project:t,resolver:A,report:u,fetchOptions:h};return await a.startTimerPromise("Deduplication step",async()=>{let I=q0t[e],v=await I(t,r,{resolver:A,resolveOptions:E,fetcher:p,fetchOptions:h}),b=Xs.progressViaCounter(v.length);await a.reportProgress(b);let C=0;await Promise.all(v.map(U=>U.then(J=>{if(J===null||J.currentPackage.locatorHash===J.updatedPackage.locatorHash)return;C++;let{descriptor:te,currentPackage:le,updatedPackage:pe}=J;a.reportInfo(0,`${W.prettyDescriptor(n,te)} can be deduped from ${W.prettyLocator(n,le)} to ${W.prettyLocator(n,pe)}`),a.reportJson({descriptor:W.stringifyDescriptor(te),currentResolution:W.stringifyLocator(le),updatedResolution:W.stringifyLocator(pe)}),t.storedResolutions.set(te.descriptorHash,pe.locatorHash)}).finally(()=>b.tick())));let T;switch(C){case 0:T="No packages";break;case 1:T="One package";break;default:T=`${C} packages`}let L=de.pretty(n,e,de.Type.CODE);return a.reportInfo(0,`${T} can be deduped using the ${L} strategy`),C})}var Lh=class extends ut{constructor(){super(...arguments);this.strategy=ge.String("-s,--strategy","highest",{description:"The strategy to use when deduping dependencies",validator:Vs(d2)});this.check=ge.Boolean("-c,--check",!1,{description:"Exit with exit code 1 when duplicates are found, without persisting the dependency tree"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.mode=ge.String("--mode",{description:"Change what artifacts installs generate",validator:Vs(pl)});this.patterns=ge.Rest()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd),a=await Lr.find(r);await o.restoreInstallState({restoreResolutions:!1});let n=0,u=await Nt.start({configuration:r,includeFooter:!1,stdout:this.context.stdout,json:this.json},async A=>{n=await M8(o,{strategy:this.strategy,patterns:this.patterns,cache:a,report:A})});return u.hasErrors()?u.exitCode():this.check?n?1:0:await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:a,mode:this.mode})}};Lh.paths=[["dedupe"]],Lh.usage=nt.Usage({description:"deduplicate dependencies with overlapping ranges",details:"\n Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\n\n This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\n\n - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\n\n **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\n\n If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n ### In-depth explanation:\n\n Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\n\n Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\n ",examples:[["Dedupe all packages","$0 dedupe"],["Dedupe all packages using a specific strategy","$0 dedupe --strategy highest"],["Dedupe a specific package","$0 dedupe lodash"],["Dedupe all packages with the `@babel/*` scope","$0 dedupe '@babel/*'"],["Check for duplicates (can be used as a CI step)","$0 dedupe --check"]]});Ye();qt();var Wd=class extends ut{async execute(){let{plugins:e}=await Ve.find(this.context.cwd,this.context.plugins),r=[];for(let u of e){let{commands:A}=u[1];if(A){let h=as.from(A).definitions();r.push([u[0],h])}}let o=this.cli.definitions(),a=(u,A)=>u.split(" ").slice(1).join()===A.split(" ").slice(1).join(),n=Xge()["@yarnpkg/builder"].bundles.standard;for(let u of r){let A=u[1];for(let p of A)o.find(h=>a(h.path,p.path)).plugin={name:u[0],isDefault:n.includes(u[0])}}this.context.stdout.write(`${JSON.stringify(o,null,2)} +`)}};Wd.paths=[["--clipanion=definitions"]];var Vd=class extends ut{async execute(){this.context.stdout.write(this.cli.usage(null))}};Vd.paths=[["help"],["--help"],["-h"]];Ye();Pt();qt();var dC=class extends ut{constructor(){super(...arguments);this.leadingArgument=ge.String();this.args=ge.Proxy()}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!W.tryParseIdent(this.leadingArgument)){let r=K.resolve(this.context.cwd,ue.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:r})}else return await this.cli.run(["run",this.leadingArgument,...this.args])}};Ye();var Kd=class extends ut{async execute(){this.context.stdout.write(`${tn||""} +`)}};Kd.paths=[["-v"],["--version"]];Ye();Ye();qt();var Mh=class extends ut{constructor(){super(...arguments);this.commandName=ge.String();this.args=ge.Proxy()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,locator:a}=await St.find(r,this.context.cwd);return await o.restoreInstallState(),await un.executePackageShellcode(a,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:o})}};Mh.paths=[["exec"]],Mh.usage=nt.Usage({description:"execute a shell script",details:` + This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell. + + It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). + `,examples:[["Execute a single shell command","$0 exec echo Hello World"],["Execute a shell script",'$0 exec "tsc & babel src --out-dir lib"']]});Ye();qt();Za();var Oh=class extends ut{constructor(){super(...arguments);this.hash=ge.String({validator:aP(Ey(),[sI(/^p[0-9a-f]{5}$/)])})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd);return await o.restoreInstallState({restoreResolutions:!1}),await o.applyLightResolution(),await Y0t(this.hash,o,{stdout:this.context.stdout})}};Oh.paths=[["explain","peer-requirements"]],Oh.usage=nt.Usage({description:"explain a set of peer requirements",details:` + A set of peer requirements represents all peer requirements that a dependent must satisfy when providing a given peer request to a requester and its descendants. + + When the hash argument is specified, this command prints a detailed explanation of all requirements of the set corresponding to the hash and whether they're satisfied or not. + + When used without arguments, this command lists all sets of peer requirements and the corresponding hash that can be used to get detailed information about a given set. + + **Note:** A hash is a six-letter p-prefixed code that can be obtained from peer dependency warnings or from the list of all peer requirements (\`yarn explain peer-requirements\`). + `,examples:[["Explain the corresponding set of peer requirements for a hash","$0 explain peer-requirements p1a4ed"],["List all sets of peer requirements","$0 explain peer-requirements"]]});async function Y0t(t,e,r){let o=e.peerWarnings.find(n=>n.hash===t);if(typeof o>"u")throw new Error(`No peerDependency requirements found for hash: "${t}"`);return(await Nt.start({configuration:e.configuration,stdout:r.stdout,includeFooter:!1,includePrefix:!1},async n=>{let u=de.mark(e.configuration);switch(o.type){case 2:{n.reportInfo(0,`We have a problem with ${de.pretty(e.configuration,o.requested,de.Type.IDENT)}, which is provided with version ${W.prettyReference(e.configuration,o.version)}.`),n.reportInfo(0,"It is needed by the following direct dependencies of workspaces in your project:"),n.reportSeparator();for(let h of o.requesters.values()){let E=e.storedPackages.get(h.locatorHash);if(!E)throw new Error("Assertion failed: Expected the package to be registered");let I=E?.peerDependencies.get(o.requested.identHash);if(!I)throw new Error("Assertion failed: Expected the package to list the peer dependency");let v=kr.satisfiesWithPrereleases(o.version,I.range)?u.Check:u.Cross;n.reportInfo(null,` ${v} ${W.prettyLocator(e.configuration,h)} (via ${W.prettyRange(e.configuration,I.range)})`)}let A=[...o.links.values()].filter(h=>!o.requesters.has(h.locatorHash));if(A.length>0){n.reportSeparator(),n.reportInfo(0,`However, those packages themselves have more dependencies listing ${W.prettyIdent(e.configuration,o.requested)} as peer dependency:`),n.reportSeparator();for(let h of A){let E=e.storedPackages.get(h.locatorHash);if(!E)throw new Error("Assertion failed: Expected the package to be registered");let I=E?.peerDependencies.get(o.requested.identHash);if(!I)throw new Error("Assertion failed: Expected the package to list the peer dependency");let v=kr.satisfiesWithPrereleases(o.version,I.range)?u.Check:u.Cross;n.reportInfo(null,` ${v} ${W.prettyLocator(e.configuration,h)} (via ${W.prettyRange(e.configuration,I.range)})`)}}let p=Array.from(o.links.values(),h=>{let E=e.storedPackages.get(h.locatorHash);if(typeof E>"u")throw new Error("Assertion failed: Expected the package to be registered");let I=E.peerDependencies.get(o.requested.identHash);if(typeof I>"u")throw new Error("Assertion failed: Expected the ident to be registered");return I.range});if(p.length>1){let h=kr.simplifyRanges(p);n.reportSeparator(),h===null?(n.reportInfo(0,"Unfortunately, put together, we found no single range that can satisfy all those peer requirements."),n.reportInfo(0,`Your best option may be to try to upgrade some dependencies with ${de.pretty(e.configuration,"yarn up",de.Type.CODE)}, or silence the warning via ${de.pretty(e.configuration,"logFilters",de.Type.CODE)}.`)):n.reportInfo(0,`Put together, the final range we computed is ${de.pretty(e.configuration,h,de.Type.RANGE)}`)}}break;default:n.reportInfo(0,`The ${de.pretty(e.configuration,"yarn explain peer-requirements",de.Type.CODE)} command doesn't support this warning type yet.`);break}})).exitCode()}Ye();qt();Za();Ye();Ye();Pt();qt();var Zge=$e(zn()),Uh=class extends ut{constructor(){super(...arguments);this.useYarnPath=ge.Boolean("--yarn-path",{description:"Set the yarnPath setting even if the version can be accessed by Corepack"});this.onlyIfNeeded=ge.Boolean("--only-if-needed",!1,{description:"Only lock the Yarn version if it isn't already locked"});this.version=ge.String()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins);if(this.onlyIfNeeded&&r.get("yarnPath")){let A=r.sources.get("yarnPath");if(!A)throw new Error("Assertion failed: Expected 'yarnPath' to have a source");let p=r.projectCwd??r.startingCwd;if(K.contains(p,A))return 0}let o=()=>{if(typeof tn>"u")throw new it("The --install flag can only be used without explicit version specifier from the Yarn CLI");return`file://${process.argv[1]}`},a,n=(A,p)=>({version:p,url:A.replace(/\{\}/g,p)});if(this.version==="self")a={url:o(),version:tn??"self"};else if(this.version==="latest"||this.version==="berry"||this.version==="stable")a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await m2(r,"stable"));else if(this.version==="canary")a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await m2(r,"canary"));else if(this.version==="classic")a={url:"https://classic.yarnpkg.com/latest.js",version:"classic"};else if(this.version.match(/^https?:/))a={url:this.version,version:"remote"};else if(this.version.match(/^\.{0,2}[\\/]/)||ue.isAbsolute(this.version))a={url:`file://${K.resolve(ue.toPortablePath(this.version))}`,version:"file"};else if(kr.satisfiesWithPrereleases(this.version,">=2.0.0"))a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",this.version);else if(kr.satisfiesWithPrereleases(this.version,"^0.x || ^1.x"))a=n("https://github.com/yarnpkg/yarn/releases/download/v{}/yarn-{}.js",this.version);else if(kr.validRange(this.version))a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await W0t(r,this.version));else throw new it(`Invalid version descriptor "${this.version}"`);return(await Nt.start({configuration:r,stdout:this.context.stdout,includeLogs:!this.context.quiet},async A=>{let p=async()=>{let h="file://";return a.url.startsWith(h)?(A.reportInfo(0,`Retrieving ${de.pretty(r,a.url,de.Type.PATH)}`),await oe.readFilePromise(a.url.slice(h.length))):(A.reportInfo(0,`Downloading ${de.pretty(r,a.url,de.Type.URL)}`),await rn.get(a.url,{configuration:r}))};await O8(r,a.version,p,{report:A,useYarnPath:this.useYarnPath})})).exitCode()}};Uh.paths=[["set","version"]],Uh.usage=nt.Usage({description:"lock the Yarn version used by the project",details:"\n This command will set a specific release of Yarn to be used by Corepack: https://nodejs.org/api/corepack.html.\n\n By default it only will set the `packageManager` field at the root of your project, but if the referenced release cannot be represented this way, if you already have `yarnPath` configured, or if you set the `--yarn-path` command line flag, then the release will also be downloaded from the Yarn GitHub repository, stored inside your project, and referenced via the `yarnPath` settings from your project `.yarnrc.yml` file.\n\n A very good use case for this command is to enforce the version of Yarn used by any single member of your team inside the same project - by doing this you ensure that you have control over Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting different behavior.\n\n The version specifier can be:\n\n - a tag:\n - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\n - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\n - `classic` -> the most recent classic (`^0.x || ^1.x`) release\n\n - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\n\n - a semver version (e.g. `2.4.1`, `1.22.1`)\n\n - a local file referenced through either a relative or absolute path\n\n - `self` -> the version used to invoke the command\n ",examples:[["Download the latest release from the Yarn repository","$0 set version latest"],["Download the latest canary release from the Yarn repository","$0 set version canary"],["Download the latest classic release from the Yarn repository","$0 set version classic"],["Download the most recent Yarn 3 build","$0 set version 3.x"],["Download a specific Yarn 2 build","$0 set version 2.0.0-rc.30"],["Switch back to a specific Yarn 1 release","$0 set version 1.22.1"],["Use a release from the local filesystem","$0 set version ./yarn.cjs"],["Use a release from a URL","$0 set version https://repo.yarnpkg.com/3.1.0/packages/yarnpkg-cli/bin/yarn.js"],["Download the version used to invoke the command","$0 set version self"]]});async function W0t(t,e){let o=(await rn.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0})).tags.filter(a=>kr.satisfiesWithPrereleases(a,e));if(o.length===0)throw new it(`No matching release found for range ${de.pretty(t,e,de.Type.RANGE)}.`);return o[0]}async function m2(t,e){let r=await rn.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0});if(!r.latest[e])throw new it(`Tag ${de.pretty(t,e,de.Type.RANGE)} not found`);return r.latest[e]}async function O8(t,e,r,{report:o,useYarnPath:a}){let n,u=async()=>(typeof n>"u"&&(n=await r()),n);if(e===null){let te=await u();await oe.mktempPromise(async le=>{let pe=K.join(le,"yarn.cjs");await oe.writeFilePromise(pe,te);let{stdout:Ae}=await Ur.execvp(process.execPath,[ue.fromPortablePath(pe),"--version"],{cwd:le,env:{...t.env,YARN_IGNORE_PATH:"1"}});if(e=Ae.trim(),!Zge.default.valid(e))throw new Error(`Invalid semver version. ${de.pretty(t,"yarn --version",de.Type.CODE)} returned: +${e}`)})}let A=t.projectCwd??t.startingCwd,p=K.resolve(A,".yarn/releases"),h=K.resolve(p,`yarn-${e}.cjs`),E=K.relative(t.startingCwd,h),I=je.isTaggedYarnVersion(e),v=t.get("yarnPath"),b=!I,C=b||!!v||!!a;if(a===!1){if(b)throw new zt(0,"You explicitly opted out of yarnPath usage in your command line, but the version you specified cannot be represented by Corepack");C=!1}else!C&&!process.env.COREPACK_ROOT&&(o.reportWarning(0,`You don't seem to have ${de.applyHyperlink(t,"Corepack","https://nodejs.org/api/corepack.html")} enabled; we'll have to rely on ${de.applyHyperlink(t,"yarnPath","https://yarnpkg.com/configuration/yarnrc#yarnPath")} instead`),C=!0);if(C){let te=await u();o.reportInfo(0,`Saving the new release in ${de.pretty(t,E,"magenta")}`),await oe.removePromise(K.dirname(h)),await oe.mkdirPromise(K.dirname(h),{recursive:!0}),await oe.writeFilePromise(h,te,{mode:493}),await Ve.updateConfiguration(A,{yarnPath:K.relative(A,h)})}else await oe.removePromise(K.dirname(h)),await Ve.updateConfiguration(A,{yarnPath:Ve.deleteProperty});let T=await Mt.tryFind(A)||new Mt;T.packageManager=`yarn@${I?e:await m2(t,"stable")}`;let L={};T.exportTo(L);let U=K.join(A,Mt.fileName),J=`${JSON.stringify(L,null,T.indent)} +`;return await oe.changeFilePromise(U,J,{automaticNewlines:!0}),{bundleVersion:e}}function $ge(t){return wr[fP(t)]}var V0t=/## (?YN[0-9]{4}) - `(?[A-Z_]+)`\n\n(?
(?:.(?!##))+)/gs;async function K0t(t){let r=`https://repo.yarnpkg.com/${je.isTaggedYarnVersion(tn)?tn:await m2(t,"canary")}/packages/gatsby/content/advanced/error-codes.md`,o=await rn.get(r,{configuration:t});return new Map(Array.from(o.toString().matchAll(V0t),({groups:a})=>{if(!a)throw new Error("Assertion failed: Expected the match to have been successful");let n=$ge(a.code);if(a.name!==n)throw new Error(`Assertion failed: Invalid error code data: Expected "${a.name}" to be named "${n}"`);return[a.code,a.details]}))}var _h=class extends ut{constructor(){super(...arguments);this.code=ge.String({required:!1,validator:oI(Ey(),[sI(/^YN[0-9]{4}$/)])});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins);if(typeof this.code<"u"){let o=$ge(this.code),a=de.pretty(r,o,de.Type.CODE),n=this.cli.format().header(`${this.code} - ${a}`),A=(await K0t(r)).get(this.code),p=typeof A<"u"?de.jsonOrPretty(this.json,r,de.tuple(de.Type.MARKDOWN,{text:A,format:this.cli.format(),paragraphs:!0})):`This error code does not have a description. + +You can help us by editing this page on GitHub \u{1F642}: +${de.jsonOrPretty(this.json,r,de.tuple(de.Type.URL,"https://github.com/yarnpkg/berry/blob/master/packages/gatsby/content/advanced/error-codes.md"))} +`;this.json?this.context.stdout.write(`${JSON.stringify({code:this.code,name:o,details:p})} +`):this.context.stdout.write(`${n} + +${p} +`)}else{let o={children:je.mapAndFilter(Object.entries(wr),([a,n])=>Number.isNaN(Number(a))?je.mapAndFilter.skip:{label:Wu(Number(a)),value:de.tuple(de.Type.CODE,n)})};$s.emitTree(o,{configuration:r,stdout:this.context.stdout,json:this.json})}}};_h.paths=[["explain"]],_h.usage=nt.Usage({description:"explain an error code",details:` + When the code argument is specified, this command prints its name and its details. + + When used without arguments, this command lists all error codes and their names. + `,examples:[["Explain an error code","$0 explain YN0006"],["List all error codes","$0 explain"]]});Ye();Pt();qt();var ede=$e(Zo()),Hh=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean("-A,--all",!1,{description:"Print versions of a package from the whole project"});this.recursive=ge.Boolean("-R,--recursive",!1,{description:"Print information for all packages, including transitive dependencies"});this.extra=ge.Array("-X,--extra",[],{description:"An array of requests of extra data provided by plugins"});this.cache=ge.Boolean("--cache",!1,{description:"Print information about the cache entry of a package (path, size, checksum)"});this.dependents=ge.Boolean("--dependents",!1,{description:"Print all dependents for each matching package"});this.manifest=ge.Boolean("--manifest",!1,{description:"Print data obtained by looking at the package archive (license, homepage, ...)"});this.nameOnly=ge.Boolean("--name-only",!1,{description:"Only print the name for the matching packages"});this.virtuals=ge.Boolean("--virtuals",!1,{description:"Print each instance of the virtual packages"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=ge.Rest()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Lr.find(r);if(!a&&!this.all)throw new rr(o.cwd,this.context.cwd);await o.restoreInstallState();let u=new Set(this.extra);this.cache&&u.add("cache"),this.dependents&&u.add("dependents"),this.manifest&&u.add("manifest");let A=(le,{recursive:pe})=>{let Ae=le.anchoredLocator.locatorHash,ye=new Map,ae=[Ae];for(;ae.length>0;){let we=ae.shift();if(ye.has(we))continue;let Pe=o.storedPackages.get(we);if(typeof Pe>"u")throw new Error("Assertion failed: Expected the package to be registered");if(ye.set(we,Pe),W.isVirtualLocator(Pe)&&ae.push(W.devirtualizeLocator(Pe).locatorHash),!(!pe&&we!==Ae))for(let g of Pe.dependencies.values()){let Ee=o.storedResolutions.get(g.descriptorHash);if(typeof Ee>"u")throw new Error("Assertion failed: Expected the resolution to be registered");ae.push(Ee)}}return ye.values()},p=({recursive:le})=>{let pe=new Map;for(let Ae of o.workspaces)for(let ye of A(Ae,{recursive:le}))pe.set(ye.locatorHash,ye);return pe.values()},h=({all:le,recursive:pe})=>le&&pe?o.storedPackages.values():le?p({recursive:pe}):A(a,{recursive:pe}),E=({all:le,recursive:pe})=>{let Ae=h({all:le,recursive:pe}),ye=this.patterns.map(Pe=>{let g=W.parseLocator(Pe),Ee=ede.default.makeRe(W.stringifyIdent(g)),De=W.isVirtualLocator(g),ce=De?W.devirtualizeLocator(g):g;return ne=>{let ee=W.stringifyIdent(ne);if(!Ee.test(ee))return!1;if(g.reference==="unknown")return!0;let Ie=W.isVirtualLocator(ne),ke=Ie?W.devirtualizeLocator(ne):ne;return!(De&&Ie&&g.reference!==ne.reference||ce.reference!==ke.reference)}}),ae=je.sortMap([...Ae],Pe=>W.stringifyLocator(Pe));return{selection:ae.filter(Pe=>ye.length===0||ye.some(g=>g(Pe))),sortedLookup:ae}},{selection:I,sortedLookup:v}=E({all:this.all,recursive:this.recursive});if(I.length===0)throw new it("No package matched your request");let b=new Map;if(this.dependents)for(let le of v)for(let pe of le.dependencies.values()){let Ae=o.storedResolutions.get(pe.descriptorHash);if(typeof Ae>"u")throw new Error("Assertion failed: Expected the resolution to be registered");je.getArrayWithDefault(b,Ae).push(le)}let C=new Map;for(let le of v){if(!W.isVirtualLocator(le))continue;let pe=W.devirtualizeLocator(le);je.getArrayWithDefault(C,pe.locatorHash).push(le)}let T={},L={children:T},U=r.makeFetcher(),J={project:o,fetcher:U,cache:n,checksums:o.storedChecksums,report:new Qi,cacheOptions:{skipIntegrityCheck:!0}},te=[async(le,pe,Ae)=>{if(!pe.has("manifest"))return;let ye=await U.fetch(le,J),ae;try{ae=await Mt.find(ye.prefixPath,{baseFs:ye.packageFs})}finally{ye.releaseFs?.()}Ae("Manifest",{License:de.tuple(de.Type.NO_HINT,ae.license),Homepage:de.tuple(de.Type.URL,ae.raw.homepage??null)})},async(le,pe,Ae)=>{if(!pe.has("cache"))return;let ye=o.storedChecksums.get(le.locatorHash)??null,ae=n.getLocatorPath(le,ye),we;if(ae!==null)try{we=await oe.statPromise(ae)}catch{}let Pe=typeof we<"u"?[we.size,de.Type.SIZE]:void 0;Ae("Cache",{Checksum:de.tuple(de.Type.NO_HINT,ye),Path:de.tuple(de.Type.PATH,ae),Size:Pe})}];for(let le of I){let pe=W.isVirtualLocator(le);if(!this.virtuals&&pe)continue;let Ae={},ye={value:[le,de.Type.LOCATOR],children:Ae};if(T[W.stringifyLocator(le)]=ye,this.nameOnly){delete ye.children;continue}let ae=C.get(le.locatorHash);typeof ae<"u"&&(Ae.Instances={label:"Instances",value:de.tuple(de.Type.NUMBER,ae.length)}),Ae.Version={label:"Version",value:de.tuple(de.Type.NO_HINT,le.version)};let we=(g,Ee)=>{let De={};if(Ae[g]=De,Array.isArray(Ee))De.children=Ee.map(ce=>({value:ce}));else{let ce={};De.children=ce;for(let[ne,ee]of Object.entries(Ee))typeof ee>"u"||(ce[ne]={label:ne,value:ee})}};if(!pe){for(let g of te)await g(le,u,we);await r.triggerHook(g=>g.fetchPackageInfo,le,u,we)}le.bin.size>0&&!pe&&we("Exported Binaries",[...le.bin.keys()].map(g=>de.tuple(de.Type.PATH,g)));let Pe=b.get(le.locatorHash);typeof Pe<"u"&&Pe.length>0&&we("Dependents",Pe.map(g=>de.tuple(de.Type.LOCATOR,g))),le.dependencies.size>0&&!pe&&we("Dependencies",[...le.dependencies.values()].map(g=>{let Ee=o.storedResolutions.get(g.descriptorHash),De=typeof Ee<"u"?o.storedPackages.get(Ee)??null:null;return de.tuple(de.Type.RESOLUTION,{descriptor:g,locator:De})})),le.peerDependencies.size>0&&pe&&we("Peer dependencies",[...le.peerDependencies.values()].map(g=>{let Ee=le.dependencies.get(g.identHash),De=typeof Ee<"u"?o.storedResolutions.get(Ee.descriptorHash)??null:null,ce=De!==null?o.storedPackages.get(De)??null:null;return de.tuple(de.Type.RESOLUTION,{descriptor:g,locator:ce})}))}$s.emitTree(L,{configuration:r,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};Hh.paths=[["info"]],Hh.usage=nt.Usage({description:"see information related to packages",details:"\n This command prints various information related to the specified packages, accepting glob patterns.\n\n By default, if the locator reference is missing, Yarn will default to print the information about all the matching direct dependencies of the package for the active workspace. To instead print all versions of the package that are direct dependencies of any of your workspaces, use the `-A,--all` flag. Adding the `-R,--recursive` flag will also report transitive dependencies.\n\n Some fields will be hidden by default in order to keep the output readable, but can be selectively displayed by using additional options (`--dependents`, `--manifest`, `--virtuals`, ...) described in the option descriptions.\n\n Note that this command will only print the information directly related to the selected packages - if you wish to know why the package is there in the first place, use `yarn why` which will do just that (it also provides a `-R,--recursive` flag that may be of some help).\n ",examples:[["Show information about Lodash","$0 info lodash"]]});Ye();Pt();Nl();var dk=$e(ed());qt();var U8=$e(zn());Za();var J0t=[{selector:t=>t===-1,name:"nodeLinker",value:"node-modules"},{selector:t=>t!==-1&&t<8,name:"enableGlobalCache",value:!1},{selector:t=>t!==-1&&t<8,name:"compressionLevel",value:"mixed"}],jh=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.immutable=ge.Boolean("--immutable",{description:"Abort with an error exit code if the lockfile was to be modified"});this.immutableCache=ge.Boolean("--immutable-cache",{description:"Abort with an error exit code if the cache folder was to be modified"});this.refreshLockfile=ge.Boolean("--refresh-lockfile",{description:"Refresh the package metadata stored in the lockfile"});this.checkCache=ge.Boolean("--check-cache",{description:"Always refetch the packages and ensure that their checksums are consistent"});this.checkResolutions=ge.Boolean("--check-resolutions",{description:"Validates that the package resolutions are coherent"});this.inlineBuilds=ge.Boolean("--inline-builds",{description:"Verbosely print the output of the build steps of dependencies"});this.mode=ge.String("--mode",{description:"Change what artifacts installs generate",validator:Vs(pl)});this.cacheFolder=ge.String("--cache-folder",{hidden:!0});this.frozenLockfile=ge.Boolean("--frozen-lockfile",{hidden:!0});this.ignoreEngines=ge.Boolean("--ignore-engines",{hidden:!0});this.nonInteractive=ge.Boolean("--non-interactive",{hidden:!0});this.preferOffline=ge.Boolean("--prefer-offline",{hidden:!0});this.production=ge.Boolean("--production",{hidden:!0});this.registry=ge.String("--registry",{hidden:!0});this.silent=ge.Boolean("--silent",{hidden:!0});this.networkTimeout=ge.String("--network-timeout",{hidden:!0})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds<"u"&&r.useWithSource("",{enableInlineBuilds:this.inlineBuilds},r.startingCwd,{overwrite:!0});let o=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,a=await NE({configuration:r,stdout:this.context.stdout},[{option:this.ignoreEngines,message:"The --ignore-engines option is deprecated; engine checking isn't a core feature anymore",error:!dk.default.VERCEL},{option:this.registry,message:"The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file"},{option:this.preferOffline,message:"The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead",error:!dk.default.VERCEL},{option:this.production,message:"The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead",error:!0},{option:this.nonInteractive,message:"The --non-interactive option is deprecated",error:!o},{option:this.frozenLockfile,message:"The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead",callback:()=>this.immutable=this.frozenLockfile},{option:this.cacheFolder,message:"The cache-folder option has been deprecated; use rc settings instead",error:!dk.default.NETLIFY}]);if(a!==null)return a;let n=this.mode==="update-lockfile";if(n&&(this.immutable||this.immutableCache))throw new it(`${de.pretty(r,"--immutable",de.Type.CODE)} and ${de.pretty(r,"--immutable-cache",de.Type.CODE)} cannot be used with ${de.pretty(r,"--mode=update-lockfile",de.Type.CODE)}`);let u=(this.immutable??r.get("enableImmutableInstalls"))&&!n,A=this.immutableCache&&!n;if(r.projectCwd!==null){let T=await Nt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async L=>{let U=!1;await Z0t(r,u)&&(L.reportInfo(48,"Automatically removed core plugins that are now builtins \u{1F44D}"),U=!0),await X0t(r,u)&&(L.reportInfo(48,"Automatically fixed merge conflicts \u{1F44D}"),U=!0),U&&L.reportSeparator()});if(T.hasErrors())return T.exitCode()}if(r.projectCwd!==null){let T=await Nt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async L=>{if(Ve.telemetry?.isNew)Ve.telemetry.commitTips(),L.reportInfo(65,"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry"),L.reportInfo(65,`Run ${de.pretty(r,"yarn config set --home enableTelemetry 0",de.Type.CODE)} to disable`),L.reportSeparator();else if(Ve.telemetry?.shouldShowTips){let U=await rn.get("https://repo.yarnpkg.com/tags",{configuration:r,jsonResponse:!0}).catch(()=>null);if(U!==null){let J=null;if(tn!==null){let le=U8.default.prerelease(tn)?"canary":"stable",pe=U.latest[le];U8.default.gt(pe,tn)&&(J=[le,pe])}if(J)Ve.telemetry.commitTips(),L.reportInfo(88,`${de.applyStyle(r,`A new ${J[0]} version of Yarn is available:`,de.Style.BOLD)} ${W.prettyReference(r,J[1])}!`),L.reportInfo(88,`Upgrade now by running ${de.pretty(r,`yarn set version ${J[1]}`,de.Type.CODE)}`),L.reportSeparator();else{let te=Ve.telemetry.selectTip(U.tips);te&&(L.reportInfo(89,de.pretty(r,te.message,de.Type.MARKDOWN_INLINE)),te.url&&L.reportInfo(89,`Learn more at ${te.url}`),L.reportSeparator())}}}});if(T.hasErrors())return T.exitCode()}let{project:p,workspace:h}=await St.find(r,this.context.cwd),E=p.lockfileLastVersion;if(E!==null){let T=await Nt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async L=>{let U={};for(let J of J0t)J.selector(E)&&typeof r.sources.get(J.name)>"u"&&(r.use("",{[J.name]:J.value},p.cwd,{overwrite:!0}),U[J.name]=J.value);Object.keys(U).length>0&&(await Ve.updateConfiguration(p.cwd,U),L.reportInfo(87,"Migrated your project to the latest Yarn version \u{1F680}"),L.reportSeparator())});if(T.hasErrors())return T.exitCode()}let I=await Lr.find(r,{immutable:A,check:this.checkCache});if(!h)throw new rr(p.cwd,this.context.cwd);await p.restoreInstallState({restoreResolutions:!1});let v=r.get("enableHardenedMode");v&&typeof r.sources.get("enableHardenedMode")>"u"&&await Nt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async T=>{T.reportWarning(0,"Yarn detected that the current workflow is executed from a public pull request. For safety the hardened mode has been enabled."),T.reportWarning(0,`It will prevent malicious lockfile manipulations, in exchange for a slower install time. You can opt-out if necessary; check our ${de.applyHyperlink(r,"documentation","https://yarnpkg.com/features/security#hardened-mode")} for more details.`),T.reportSeparator()}),(this.refreshLockfile??v)&&(p.lockfileNeedsRefresh=!0);let b=this.checkResolutions??v;return(await Nt.start({configuration:r,json:this.json,stdout:this.context.stdout,forceSectionAlignment:!0,includeLogs:!0,includeVersion:!0},async T=>{await p.install({cache:I,report:T,immutable:u,checkResolutions:b,mode:this.mode})})).exitCode()}};jh.paths=[["install"],nt.Default],jh.usage=nt.Usage({description:"install the project dependencies",details:"\n This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics:\n\n - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ).\n\n - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of `cacheFolder` in `yarn config` to see where the cache files are stored).\n\n - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the .pnp.cjs file you might know).\n\n - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another. See https://yarnpkg.com/advanced/lifecycle-scripts for detail.\n\n Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your .pnp.cjs file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches.\n\n If the `--immutable` option is set (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the `immutablePatterns` configuration setting). For backward compatibility we offer an alias under the name of `--frozen-lockfile`, but it will be removed in a later release.\n\n If the `--immutable-cache` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed).\n\n If the `--refresh-lockfile` option is set, Yarn will keep the same resolution for the packages currently in the lockfile but will refresh their metadata. If used together with `--immutable`, it can validate that the lockfile information are consistent. This flag is enabled by default when Yarn detects it runs within a pull request context.\n\n If the `--check-cache` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them.\n\n If the `--inline-builds` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n ",examples:[["Install the project","$0 install"],["Validate a project when using Zero-Installs","$0 install --immutable --immutable-cache"],["Validate a project when using Zero-Installs (slightly safer if you accept external PRs)","$0 install --immutable --immutable-cache --check-cache"]]});var z0t="<<<<<<<";async function X0t(t,e){if(!t.projectCwd)return!1;let r=K.join(t.projectCwd,dr.lockfile);if(!await oe.existsPromise(r)||!(await oe.readFilePromise(r,"utf8")).includes(z0t))return!1;if(e)throw new zt(47,"Cannot autofix a lockfile when running an immutable install");let a=await Ur.execvp("git",["rev-parse","MERGE_HEAD","HEAD"],{cwd:t.projectCwd});if(a.code!==0&&(a=await Ur.execvp("git",["rev-parse","REBASE_HEAD","HEAD"],{cwd:t.projectCwd})),a.code!==0&&(a=await Ur.execvp("git",["rev-parse","CHERRY_PICK_HEAD","HEAD"],{cwd:t.projectCwd})),a.code!==0)throw new zt(83,"Git returned an error when trying to find the commits pertaining to the conflict");let n=await Promise.all(a.stdout.trim().split(/\n/).map(async A=>{let p=await Ur.execvp("git",["show",`${A}:./${dr.lockfile}`],{cwd:t.projectCwd});if(p.code!==0)throw new zt(83,`Git returned an error when trying to access the lockfile content in ${A}`);try{return Vi(p.stdout)}catch{throw new zt(46,"A variant of the conflicting lockfile failed to parse")}}));n=n.filter(A=>!!A.__metadata);for(let A of n){if(A.__metadata.version<7)for(let p of Object.keys(A)){if(p==="__metadata")continue;let h=W.parseDescriptor(p,!0),E=t.normalizeDependency(h),I=W.stringifyDescriptor(E);I!==p&&(A[I]=A[p],delete A[p])}for(let p of Object.keys(A)){if(p==="__metadata")continue;let h=A[p].checksum;typeof h=="string"&&h.includes("/")||(A[p].checksum=`${A.__metadata.cacheKey}/${h}`)}}let u=Object.assign({},...n);u.__metadata.version=`${Math.min(...n.map(A=>parseInt(A.__metadata.version??0)))}`,u.__metadata.cacheKey="merged";for(let[A,p]of Object.entries(u))typeof p=="string"&&delete u[A];return await oe.changeFilePromise(r,Ba(u),{automaticNewlines:!0}),!0}async function Z0t(t,e){if(!t.projectCwd)return!1;let r=[],o=K.join(t.projectCwd,".yarn/plugins/@yarnpkg");return await Ve.updateConfiguration(t.projectCwd,{plugins:n=>{if(!Array.isArray(n))return n;let u=n.filter(A=>{if(!A.path)return!0;let p=K.resolve(t.projectCwd,A.path),h=B1.has(A.spec)&&K.contains(o,p);return h&&r.push(p),!h});return u.length===0?Ve.deleteProperty:u.length===n.length?n:u}},{immutable:e})?(await Promise.all(r.map(async n=>{await oe.removePromise(n)})),!0):!1}Ye();Pt();qt();var qh=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean("-A,--all",!1,{description:"Link all workspaces belonging to the target projects to the current one"});this.private=ge.Boolean("-p,--private",!1,{description:"Also link private workspaces belonging to the target projects to the current one"});this.relative=ge.Boolean("-r,--relative",!1,{description:"Link workspaces using relative paths instead of absolute paths"});this.destinations=ge.Rest()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Lr.find(r);if(!a)throw new rr(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=o.topLevelWorkspace,A=[];for(let p of this.destinations){let h=K.resolve(this.context.cwd,ue.toPortablePath(p)),E=await Ve.find(h,this.context.plugins,{useRc:!1,strict:!1}),{project:I,workspace:v}=await St.find(E,h);if(o.cwd===I.cwd)throw new it(`Invalid destination '${p}'; Can't link the project to itself`);if(!v)throw new rr(I.cwd,h);if(this.all){let b=!1;for(let C of I.workspaces)C.manifest.name&&(!C.manifest.private||this.private)&&(A.push(C),b=!0);if(!b)throw new it(`No workspace found to be linked in the target project: ${p}`)}else{if(!v.manifest.name)throw new it(`The target workspace at '${p}' doesn't have a name and thus cannot be linked`);if(v.manifest.private&&!this.private)throw new it(`The target workspace at '${p}' is marked private - use the --private flag to link it anyway`);A.push(v)}}for(let p of A){let h=W.stringifyIdent(p.anchoredLocator),E=this.relative?K.relative(o.cwd,p.cwd):p.cwd;u.manifest.resolutions.push({pattern:{descriptor:{fullName:h}},reference:`portal:${E}`})}return await o.installWithNewReport({stdout:this.context.stdout},{cache:n})}};qh.paths=[["link"]],qh.usage=nt.Usage({description:"connect the local project to another one",details:"\n This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\n ",examples:[["Register one or more remote workspaces for use in the current project","$0 link ~/ts-loader ~/jest"],["Register all workspaces from a remote project for use in the current project","$0 link ~/jest --all"]]});qt();var Gh=class extends ut{constructor(){super(...arguments);this.args=ge.Proxy()}async execute(){return this.cli.run(["exec","node",...this.args])}};Gh.paths=[["node"]],Gh.usage=nt.Usage({description:"run node with the hook already setup",details:` + This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). + + The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version. + `,examples:[["Run a Node script","$0 node ./my-script.js"]]});Ye();qt();var Yh=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),o=await Ve.findRcFiles(this.context.cwd);return(await Nt.start({configuration:r,json:this.json,stdout:this.context.stdout},async n=>{for(let u of o)if(!!u.data?.plugins)for(let A of u.data.plugins){if(!A.checksum||!A.spec.match(/^https?:/))continue;let p=await rn.get(A.spec,{configuration:r}),h=wn.makeHash(p);if(A.checksum===h)continue;let E=de.pretty(r,A.path,de.Type.PATH),I=de.pretty(r,A.spec,de.Type.URL),v=`${E} is different from the file provided by ${I}`;n.reportJson({...A,newChecksum:h}),n.reportError(0,v)}})).exitCode()}};Yh.paths=[["plugin","check"]],Yh.usage=nt.Usage({category:"Plugin-related commands",description:"find all third-party plugins that differ from their own spec",details:` + Check only the plugins from https. + + If this command detects any plugin differences in the CI environment, it will throw an error. + `,examples:[["find all third-party plugins that differ from their own spec","$0 plugin check"]]});Ye();Ye();Pt();qt();var ode=Be("os");Ye();Pt();qt();var tde=Be("os");Ye();Nl();qt();var $0t="https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml";async function Jd(t,e){let r=await rn.get($0t,{configuration:t}),o=Vi(r.toString());return Object.fromEntries(Object.entries(o).filter(([a,n])=>!e||kr.satisfiesWithPrereleases(e,n.range??"<4.0.0-rc.1")))}var Wh=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins);return(await Nt.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{let n=await Jd(r,tn);for(let[u,{experimental:A,...p}]of Object.entries(n)){let h=u;A&&(h+=" [experimental]"),a.reportJson({name:u,experimental:A,...p}),a.reportInfo(null,h)}})).exitCode()}};Wh.paths=[["plugin","list"]],Wh.usage=nt.Usage({category:"Plugin-related commands",description:"list the available official plugins",details:"\n This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\n ",examples:[["List the official plugins","$0 plugin list"]]});var egt=/^[0-9]+$/,tgt=process.platform==="win32";function rde(t){return egt.test(t)?`pull/${t}/head`:t}var rgt=({repository:t,branch:e},r)=>[["git","init",ue.fromPortablePath(r)],["git","remote","add","origin",t],["git","fetch","origin","--depth=1",rde(e)],["git","reset","--hard","FETCH_HEAD"]],ngt=({branch:t})=>[["git","fetch","origin","--depth=1",rde(t),"--force"],["git","reset","--hard","FETCH_HEAD"],["git","clean","-dfx","-e","packages/yarnpkg-cli/bundles"]],igt=({plugins:t,noMinify:e},r,o)=>[["yarn","build:cli",...new Array().concat(...t.map(a=>["--plugin",K.resolve(o,a)])),...e?["--no-minify"]:[],"|"],[tgt?"move":"mv","packages/yarnpkg-cli/bundles/yarn.js",ue.fromPortablePath(r),"|"]],Vh=class extends ut{constructor(){super(...arguments);this.installPath=ge.String("--path",{description:"The path where the repository should be cloned to"});this.repository=ge.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=ge.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.plugins=ge.Array("--plugin",[],{description:"An array of additional plugins that should be included in the bundle"});this.dryRun=ge.Boolean("-n,--dry-run",!1,{description:"If set, the bundle will be built but not added to the project"});this.noMinify=ge.Boolean("--no-minify",!1,{description:"Build a bundle for development (debugging) - non-minified and non-mangled"});this.force=ge.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.skipPlugins=ge.Boolean("--skip-plugins",!1,{description:"Skip updating the contrib plugins"})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd),a=typeof this.installPath<"u"?K.resolve(this.context.cwd,ue.toPortablePath(this.installPath)):K.resolve(ue.toPortablePath((0,tde.tmpdir)()),"yarnpkg-sources",wn.makeHash(this.repository).slice(0,6));return(await Nt.start({configuration:r,stdout:this.context.stdout},async u=>{await _8(this,{configuration:r,report:u,target:a}),u.reportSeparator(),u.reportInfo(0,"Building a fresh bundle"),u.reportSeparator();let A=await Ur.execvp("git",["rev-parse","--short","HEAD"],{cwd:a,strict:!0}),p=K.join(a,`packages/yarnpkg-cli/bundles/yarn-${A.stdout.trim()}.js`);oe.existsSync(p)||(await y2(igt(this,p,a),{configuration:r,context:this.context,target:a}),u.reportSeparator());let h=await oe.readFilePromise(p);if(!this.dryRun){let{bundleVersion:E}=await O8(r,null,async()=>h,{report:u});this.skipPlugins||await sgt(this,E,{project:o,report:u,target:a})}})).exitCode()}};Vh.paths=[["set","version","from","sources"]],Vh.usage=nt.Usage({description:"build Yarn from master",details:` + This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project. + + By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \`--skip-plugins\` flag. + `,examples:[["Build Yarn from master","$0 set version from sources"]]});async function y2(t,{configuration:e,context:r,target:o}){for(let[a,...n]of t){let u=n[n.length-1]==="|";if(u&&n.pop(),u)await Ur.pipevp(a,n,{cwd:o,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,strict:!0});else{r.stdout.write(`${de.pretty(e,` $ ${[a,...n].join(" ")}`,"grey")} +`);try{await Ur.execvp(a,n,{cwd:o,strict:!0})}catch(A){throw r.stdout.write(A.stdout||A.stack),A}}}}async function _8(t,{configuration:e,report:r,target:o}){let a=!1;if(!t.force&&oe.existsSync(K.join(o,".git"))){r.reportInfo(0,"Fetching the latest commits"),r.reportSeparator();try{await y2(ngt(t),{configuration:e,context:t.context,target:o}),a=!0}catch{r.reportSeparator(),r.reportWarning(0,"Repository update failed; we'll try to regenerate it")}}a||(r.reportInfo(0,"Cloning the remote repository"),r.reportSeparator(),await oe.removePromise(o),await oe.mkdirPromise(o,{recursive:!0}),await y2(rgt(t,o),{configuration:e,context:t.context,target:o}))}async function sgt(t,e,{project:r,report:o,target:a}){let n=await Jd(r.configuration,e),u=new Set(Object.keys(n));for(let A of r.configuration.plugins.keys())!u.has(A)||await H8(A,t,{project:r,report:o,target:a})}Ye();Ye();Pt();qt();var nde=$e(zn()),ide=Be("url"),sde=Be("vm");var Kh=class extends ut{constructor(){super(...arguments);this.name=ge.String();this.checksum=ge.Boolean("--checksum",!0,{description:"Whether to care if this plugin is modified"})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins);return(await Nt.start({configuration:r,stdout:this.context.stdout},async a=>{let{project:n}=await St.find(r,this.context.cwd),u,A;if(this.name.match(/^\.{0,2}[\\/]/)||ue.isAbsolute(this.name)){let p=K.resolve(this.context.cwd,ue.toPortablePath(this.name));a.reportInfo(0,`Reading ${de.pretty(r,p,de.Type.PATH)}`),u=K.relative(n.cwd,p),A=await oe.readFilePromise(p)}else{let p;if(this.name.match(/^https?:/)){try{new ide.URL(this.name)}catch{throw new zt(52,`Plugin specifier "${this.name}" is neither a plugin name nor a valid url`)}u=this.name,p=this.name}else{let h=W.parseLocator(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-"));if(h.reference!=="unknown"&&!nde.default.valid(h.reference))throw new zt(0,"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.");let E=W.stringifyIdent(h),I=await Jd(r,tn);if(!Object.hasOwn(I,E)){let v=`Couldn't find a plugin named ${W.prettyIdent(r,h)} on the remote registry. +`;throw r.plugins.has(E)?v+=`A plugin named ${W.prettyIdent(r,h)} is already installed; possibly attempting to import a built-in plugin.`:v+=`Note that only the plugins referenced on our website (${de.pretty(r,"https://github.com/yarnpkg/berry/blob/master/plugins.yml",de.Type.URL)}) can be referenced by their name; any other plugin will have to be referenced through its public url (for example ${de.pretty(r,"https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js",de.Type.URL)}).`,new zt(51,v)}u=E,p=I[E].url,h.reference!=="unknown"?p=p.replace(/\/master\//,`/${E}/${h.reference}/`):tn!==null&&(p=p.replace(/\/master\//,`/@yarnpkg/cli/${tn}/`))}a.reportInfo(0,`Downloading ${de.pretty(r,p,"green")}`),A=await rn.get(p,{configuration:r})}await j8(u,A,{checksum:this.checksum,project:n,report:a})})).exitCode()}};Kh.paths=[["plugin","import"]],Kh.usage=nt.Usage({category:"Plugin-related commands",description:"download a plugin",details:` + This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations. + + Three types of plugin references are accepted: + + - If the plugin is stored within the Yarn repository, it can be referenced by name. + - Third-party plugins can be referenced directly through their public urls. + - Local plugins can be referenced by their path on the disk. + + If the \`--no-checksum\` option is set, Yarn will no longer care if the plugin is modified. + + Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the \`@yarnpkg/builder\` package). + `,examples:[['Download and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import @yarnpkg/plugin-exec"],['Download and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import exec"],["Download and activate a community plugin","$0 plugin import https://example.org/path/to/plugin.js"],["Activate a local plugin","$0 plugin import ./path/to/plugin.js"]]});async function j8(t,e,{checksum:r=!0,project:o,report:a}){let{configuration:n}=o,u={},A={exports:u};(0,sde.runInNewContext)(e.toString(),{module:A,exports:u});let h=`.yarn/plugins/${A.exports.name}.cjs`,E=K.resolve(o.cwd,h);a.reportInfo(0,`Saving the new plugin in ${de.pretty(n,h,"magenta")}`),await oe.mkdirPromise(K.dirname(E),{recursive:!0}),await oe.writeFilePromise(E,e);let I={path:h,spec:t};r&&(I.checksum=wn.makeHash(e)),await Ve.addPlugin(o.cwd,[I])}var ogt=({pluginName:t,noMinify:e},r)=>[["yarn",`build:${t}`,...e?["--no-minify"]:[],"|"]],Jh=class extends ut{constructor(){super(...arguments);this.installPath=ge.String("--path",{description:"The path where the repository should be cloned to"});this.repository=ge.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=ge.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.noMinify=ge.Boolean("--no-minify",!1,{description:"Build a plugin for development (debugging) - non-minified and non-mangled"});this.force=ge.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.name=ge.String()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),o=typeof this.installPath<"u"?K.resolve(this.context.cwd,ue.toPortablePath(this.installPath)):K.resolve(ue.toPortablePath((0,ode.tmpdir)()),"yarnpkg-sources",wn.makeHash(this.repository).slice(0,6));return(await Nt.start({configuration:r,stdout:this.context.stdout},async n=>{let{project:u}=await St.find(r,this.context.cwd),A=W.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),p=W.stringifyIdent(A),h=await Jd(r,tn);if(!Object.hasOwn(h,p))throw new zt(51,`Couldn't find a plugin named "${p}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);let E=p;await _8(this,{configuration:r,report:n,target:o}),await H8(E,this,{project:u,report:n,target:o})})).exitCode()}};Jh.paths=[["plugin","import","from","sources"]],Jh.usage=nt.Usage({category:"Plugin-related commands",description:"build a plugin from sources",details:` + This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations. + + The plugins can be referenced by their short name if sourced from the official Yarn repository. + `,examples:[['Build and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import from sources @yarnpkg/plugin-exec"],['Build and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import from sources exec"]]});async function H8(t,{context:e,noMinify:r},{project:o,report:a,target:n}){let u=t.replace(/@yarnpkg\//,""),{configuration:A}=o;a.reportSeparator(),a.reportInfo(0,`Building a fresh ${u}`),a.reportSeparator(),await y2(ogt({pluginName:u,noMinify:r},n),{configuration:A,context:e,target:n}),a.reportSeparator();let p=K.resolve(n,`packages/${u}/bundles/${t}.js`),h=await oe.readFilePromise(p);await j8(t,h,{project:o,report:a})}Ye();Pt();qt();var zh=class extends ut{constructor(){super(...arguments);this.name=ge.String()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd);return(await Nt.start({configuration:r,stdout:this.context.stdout},async n=>{let u=this.name,A=W.parseIdent(u);if(!r.plugins.has(u))throw new it(`${W.prettyIdent(r,A)} isn't referenced by the current configuration`);let p=`.yarn/plugins/${u}.cjs`,h=K.resolve(o.cwd,p);oe.existsSync(h)&&(n.reportInfo(0,`Removing ${de.pretty(r,p,de.Type.PATH)}...`),await oe.removePromise(h)),n.reportInfo(0,"Updating the configuration..."),await Ve.updateConfiguration(o.cwd,{plugins:E=>{if(!Array.isArray(E))return E;let I=E.filter(v=>v.path!==p);return I.length===0?Ve.deleteProperty:I.length===E.length?E:I}})})).exitCode()}};zh.paths=[["plugin","remove"]],zh.usage=nt.Usage({category:"Plugin-related commands",description:"remove a plugin",details:` + This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration. + + **Note:** The plugins have to be referenced by their name property, which can be obtained using the \`yarn plugin runtime\` command. Shorthands are not allowed. + `,examples:[["Remove a plugin imported from the Yarn repository","$0 plugin remove @yarnpkg/plugin-typescript"],["Remove a plugin imported from a local file","$0 plugin remove my-local-plugin"]]});Ye();qt();var Xh=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins);return(await Nt.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{for(let n of r.plugins.keys()){let u=this.context.plugins.plugins.has(n),A=n;u&&(A+=" [builtin]"),a.reportJson({name:n,builtin:u}),a.reportInfo(null,`${A}`)}})).exitCode()}};Xh.paths=[["plugin","runtime"]],Xh.usage=nt.Usage({category:"Plugin-related commands",description:"list the active plugins",details:` + This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins. + `,examples:[["List the currently active plugins","$0 plugin runtime"]]});Ye();Ye();qt();var Zh=class extends ut{constructor(){super(...arguments);this.idents=ge.Rest()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Lr.find(r);if(!a)throw new rr(o.cwd,this.context.cwd);let u=new Set;for(let A of this.idents)u.add(W.parseIdent(A).identHash);if(await o.restoreInstallState({restoreResolutions:!1}),await o.resolveEverything({cache:n,report:new Qi}),u.size>0)for(let A of o.storedPackages.values())u.has(A.identHash)&&(o.storedBuildState.delete(A.locatorHash),o.skippedBuilds.delete(A.locatorHash));else o.storedBuildState.clear(),o.skippedBuilds.clear();return await o.installWithNewReport({stdout:this.context.stdout,quiet:this.context.quiet},{cache:n})}};Zh.paths=[["rebuild"]],Zh.usage=nt.Usage({description:"rebuild the project's native packages",details:` + This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again. + + Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future). + + By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory. + `,examples:[["Rebuild all packages","$0 rebuild"],["Rebuild fsevents only","$0 rebuild fsevents"]]});Ye();Ye();Ye();qt();var q8=$e(Zo());Za();var $h=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean("-A,--all",!1,{description:"Apply the operation to all workspaces from the current project"});this.mode=ge.String("--mode",{description:"Change what artifacts installs generate",validator:Vs(pl)});this.patterns=ge.Rest()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Lr.find(r);if(!a)throw new rr(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=this.all?o.workspaces:[a],A=["dependencies","devDependencies","peerDependencies"],p=[],h=!1,E=[];for(let C of this.patterns){let T=!1,L=W.parseIdent(C);for(let U of u){let J=[...U.manifest.peerDependenciesMeta.keys()];for(let te of(0,q8.default)(J,C))U.manifest.peerDependenciesMeta.delete(te),h=!0,T=!0;for(let te of A){let le=U.manifest.getForScope(te),pe=[...le.values()].map(Ae=>W.stringifyIdent(Ae));for(let Ae of(0,q8.default)(pe,W.stringifyIdent(L))){let{identHash:ye}=W.parseIdent(Ae),ae=le.get(ye);if(typeof ae>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");U.manifest[te].delete(ye),E.push([U,te,ae]),h=!0,T=!0}}}T||p.push(C)}let I=p.length>1?"Patterns":"Pattern",v=p.length>1?"don't":"doesn't",b=this.all?"any":"this";if(p.length>0)throw new it(`${I} ${de.prettyList(r,p,de.Type.CODE)} ${v} match any packages referenced by ${b} workspace`);return h?(await r.triggerMultipleHooks(C=>C.afterWorkspaceDependencyRemoval,E),await o.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})):0}};$h.paths=[["remove"]],$h.usage=nt.Usage({description:"remove dependencies from the project",details:` + This command will remove the packages matching the specified patterns from the current workspace. + + If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: + + - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. + + - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. + + This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them. + `,examples:[["Remove a dependency from the current project","$0 remove lodash"],["Remove a dependency from all workspaces at once","$0 remove lodash --all"],["Remove all dependencies starting with `eslint-`","$0 remove 'eslint-*'"],["Remove all dependencies with the `@babel` scope","$0 remove '@babel/*'"],["Remove all dependencies matching `react-dom` or `react-helmet`","$0 remove 'react-{dom,helmet}'"]]});Ye();Ye();var ade=Be("util"),zd=class extends ut{async execute(){let e=await Ve.find(this.context.cwd,this.context.plugins),{project:r,workspace:o}=await St.find(e,this.context.cwd);if(!o)throw new rr(r.cwd,this.context.cwd);return(await Nt.start({configuration:e,stdout:this.context.stdout},async n=>{let u=o.manifest.scripts,A=je.sortMap(u.keys(),E=>E),p={breakLength:1/0,colors:e.get("enableColors"),maxArrayLength:2},h=A.reduce((E,I)=>Math.max(E,I.length),0);for(let[E,I]of u.entries())n.reportInfo(null,`${E.padEnd(h," ")} ${(0,ade.inspect)(I,p)}`)})).exitCode()}};zd.paths=[["run"]];Ye();Ye();qt();var e0=class extends ut{constructor(){super(...arguments);this.inspect=ge.String("--inspect",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.inspectBrk=ge.String("--inspect-brk",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.topLevel=ge.Boolean("-T,--top-level",!1,{description:"Check the root workspace for scripts and/or binaries instead of the current one"});this.binariesOnly=ge.Boolean("-B,--binaries-only",!1,{description:"Ignore any user defined scripts and only check for binaries"});this.require=ge.String("--require",{description:"Forwarded to the underlying Node process when executing a binary"});this.silent=ge.Boolean("--silent",{hidden:!0});this.scriptName=ge.String();this.args=ge.Proxy()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a,locator:n}=await St.find(r,this.context.cwd);await o.restoreInstallState();let u=this.topLevel?o.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await un.hasPackageScript(u,this.scriptName,{project:o}))return await un.executePackageScript(u,this.scriptName,this.args,{project:o,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let A=await un.getPackageAccessibleBinaries(u,{project:o});if(A.get(this.scriptName)){let h=[];return this.inspect&&(typeof this.inspect=="string"?h.push(`--inspect=${this.inspect}`):h.push("--inspect")),this.inspectBrk&&(typeof this.inspectBrk=="string"?h.push(`--inspect-brk=${this.inspectBrk}`):h.push("--inspect-brk")),this.require&&h.push(`--require=${this.require}`),await un.executePackageAccessibleBinary(u,this.scriptName,this.args,{cwd:this.context.cwd,project:o,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:h,packageAccessibleBinaries:A})}if(!this.topLevel&&!this.binariesOnly&&a&&this.scriptName.includes(":")){let E=(await Promise.all(o.workspaces.map(async I=>I.manifest.scripts.has(this.scriptName)?I:null))).filter(I=>I!==null);if(E.length===1)return await un.executeWorkspaceScript(E[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName==="node-gyp"?new it(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${W.prettyLocator(r,n)}). This typically happens because some package depends on "node-gyp" to build itself, but didn't list it in their dependencies. To fix that, please run "yarn add node-gyp" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new it(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${W.prettyLocator(r,n)}).`);{if(this.scriptName==="global")throw new it("The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead");let h=[this.scriptName].concat(this.args);for(let[E,I]of uC)for(let v of I)if(h.length>=v.length&&JSON.stringify(h.slice(0,v.length))===JSON.stringify(v))throw new it(`Couldn't find a script named "${this.scriptName}", but a matching command can be found in the ${E} plugin. You can install it with "yarn plugin import ${E}".`);throw new it(`Couldn't find a script named "${this.scriptName}".`)}}};e0.paths=[["run"]],e0.usage=nt.Usage({description:"run a script defined in the package.json",details:` + This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace: + + - If the \`scripts\` field from your local package.json contains a matching script name, its definition will get executed. + + - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed. + + - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed. + + Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax). + `,examples:[["Run the tests from the local workspace","$0 run test"],['Same thing, but without the "run" keyword',"$0 test"],["Inspect Webpack while running","$0 run --inspect-brk webpack"]]});Ye();Ye();qt();var t0=class extends ut{constructor(){super(...arguments);this.descriptor=ge.String();this.resolution=ge.String()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Lr.find(r);if(await o.restoreInstallState({restoreResolutions:!1}),!a)throw new rr(o.cwd,this.context.cwd);let u=W.parseDescriptor(this.descriptor,!0),A=W.makeDescriptor(u,this.resolution);return o.storedDescriptors.set(u.descriptorHash,u),o.storedDescriptors.set(A.descriptorHash,A),o.resolutionAliases.set(u.descriptorHash,A.descriptorHash),await o.installWithNewReport({stdout:this.context.stdout},{cache:n})}};t0.paths=[["set","resolution"]],t0.usage=nt.Usage({description:"enforce a package resolution",details:'\n This command updates the resolution table so that `descriptor` is resolved by `resolution`.\n\n Note that by default this command only affect the current resolution table - meaning that this "manual override" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, edit the `resolutions` field in your top-level manifest.\n\n Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\n ',examples:[["Force all instances of lodash@npm:^1.2.3 to resolve to 1.5.0","$0 set resolution lodash@npm:^1.2.3 1.5.0"]]});Ye();Pt();qt();var lde=$e(Zo()),r0=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean("-A,--all",!1,{description:"Unlink all workspaces belonging to the target project from the current one"});this.leadingArguments=ge.Rest()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Lr.find(r);if(!a)throw new rr(o.cwd,this.context.cwd);let u=o.topLevelWorkspace,A=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:p,reference:h}of u.manifest.resolutions)h.startsWith("portal:")&&A.add(p.descriptor.fullName);if(this.leadingArguments.length>0)for(let p of this.leadingArguments){let h=K.resolve(this.context.cwd,ue.toPortablePath(p));if(je.isPathLike(p)){let E=await Ve.find(h,this.context.plugins,{useRc:!1,strict:!1}),{project:I,workspace:v}=await St.find(E,h);if(!v)throw new rr(I.cwd,h);if(this.all){for(let b of I.workspaces)b.manifest.name&&A.add(W.stringifyIdent(b.anchoredLocator));if(A.size===0)throw new it("No workspace found to be unlinked in the target project")}else{if(!v.manifest.name)throw new it("The target workspace doesn't have a name and thus cannot be unlinked");A.add(W.stringifyIdent(v.anchoredLocator))}}else{let E=[...u.manifest.resolutions.map(({pattern:I})=>I.descriptor.fullName)];for(let I of(0,lde.default)(E,p))A.add(I)}}return u.manifest.resolutions=u.manifest.resolutions.filter(({pattern:p})=>!A.has(p.descriptor.fullName)),await o.installWithNewReport({stdout:this.context.stdout,quiet:this.context.quiet},{cache:n})}};r0.paths=[["unlink"]],r0.usage=nt.Usage({description:"disconnect the local project from another one",details:` + This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments. + `,examples:[["Unregister a remote workspace in the current project","$0 unlink ~/ts-loader"],["Unregister all workspaces from a remote project in the current project","$0 unlink ~/jest --all"],["Unregister all previously linked workspaces","$0 unlink --all"],["Unregister all workspaces matching a glob","$0 unlink '@babel/*' 'pkg-{a,b}'"]]});Ye();Ye();Ye();qt();var cde=$e(A2()),G8=$e(Zo());Za();var Kf=class extends ut{constructor(){super(...arguments);this.interactive=ge.Boolean("-i,--interactive",{description:"Offer various choices, depending on the detected upgrade paths"});this.fixed=ge.Boolean("-F,--fixed",!1,{description:"Store dependency tags as-is instead of resolving them"});this.exact=ge.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=ge.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=ge.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.recursive=ge.Boolean("-R,--recursive",!1,{description:"Resolve again ALL resolutions for those packages"});this.mode=ge.String("--mode",{description:"Change what artifacts installs generate",validator:Vs(pl)});this.patterns=ge.Rest()}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Lr.find(r);if(!a)throw new rr(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=[...o.storedDescriptors.values()],A=u.map(E=>W.stringifyIdent(E)),p=new Set;for(let E of this.patterns){if(W.parseDescriptor(E).range!=="unknown")throw new it("Ranges aren't allowed when using --recursive");for(let I of(0,G8.default)(A,E)){let v=W.parseIdent(I);p.add(v.identHash)}}let h=u.filter(E=>p.has(E.identHash));for(let E of h)o.storedDescriptors.delete(E.descriptorHash),o.storedResolutions.delete(E.descriptorHash);return await o.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})}async executeUpClassic(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Lr.find(r);if(!a)throw new rr(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=this.fixed,A=this.interactive??r.get("preferInteractive"),p=p2(this,o),h=A?["keep","reuse","project","latest"]:["project","latest"],E=[],I=[];for(let L of this.patterns){let U=!1,J=W.parseDescriptor(L),te=W.stringifyIdent(J);for(let le of o.workspaces)for(let pe of["dependencies","devDependencies"]){let ye=[...le.manifest.getForScope(pe).values()].map(we=>W.stringifyIdent(we)),ae=te==="*"?ye:(0,G8.default)(ye,te);for(let we of ae){let Pe=W.parseIdent(we),g=le.manifest[pe].get(Pe.identHash);if(typeof g>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");let Ee=W.makeDescriptor(Pe,J.range);E.push(Promise.resolve().then(async()=>[le,pe,g,await h2(Ee,{project:o,workspace:le,cache:n,target:pe,fixed:u,modifier:p,strategies:h})])),U=!0}}U||I.push(L)}if(I.length>1)throw new it(`Patterns ${de.prettyList(r,I,de.Type.CODE)} don't match any packages referenced by any workspace`);if(I.length>0)throw new it(`Pattern ${de.prettyList(r,I,de.Type.CODE)} doesn't match any packages referenced by any workspace`);let v=await Promise.all(E),b=await AA.start({configuration:r,stdout:this.context.stdout,suggestInstall:!1},async L=>{for(let[,,U,{suggestions:J,rejections:te}]of v){let le=J.filter(pe=>pe.descriptor!==null);if(le.length===0){let[pe]=te;if(typeof pe>"u")throw new Error("Assertion failed: Expected an error to have been set");let Ae=this.cli.error(pe);o.configuration.get("enableNetwork")?L.reportError(27,`${W.prettyDescriptor(r,U)} can't be resolved to a satisfying range + +${Ae}`):L.reportError(27,`${W.prettyDescriptor(r,U)} can't be resolved to a satisfying range (note: network resolution has been disabled) + +${Ae}`)}else le.length>1&&!A&&L.reportError(27,`${W.prettyDescriptor(r,U)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(b.hasErrors())return b.exitCode();let C=!1,T=[];for(let[L,U,,{suggestions:J}]of v){let te,le=J.filter(ae=>ae.descriptor!==null),pe=le[0].descriptor,Ae=le.every(ae=>W.areDescriptorsEqual(ae.descriptor,pe));le.length===1||Ae?te=pe:(C=!0,{answer:te}=await(0,cde.prompt)({type:"select",name:"answer",message:`Which range do you want to use in ${W.prettyWorkspace(r,L)} \u276F ${U}?`,choices:J.map(({descriptor:ae,name:we,reason:Pe})=>ae?{name:we,hint:Pe,descriptor:ae}:{name:we,hint:Pe,disabled:!0}),onCancel:()=>process.exit(130),result(ae){return this.find(ae,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let ye=L.manifest[U].get(te.identHash);if(typeof ye>"u")throw new Error("Assertion failed: This descriptor should have a matching entry");if(ye.descriptorHash!==te.descriptorHash)L.manifest[U].set(te.identHash,te),T.push([L,U,ye,te]);else{let ae=r.makeResolver(),we={project:o,resolver:ae},Pe=r.normalizeDependency(ye),g=ae.bindDescriptor(Pe,L.anchoredLocator,we);o.forgetResolution(g)}}return await r.triggerMultipleHooks(L=>L.afterWorkspaceDependencyReplacement,T),C&&this.context.stdout.write(` +`),await o.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})}};Kf.paths=[["up"]],Kf.usage=nt.Usage({description:"upgrade dependencies across the project",details:"\n This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\n\n If `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\n\n If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\n\n The, `-C,--caret`, `-E,--exact` and `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n Generally you can see `yarn up` as a counterpart to what was `yarn upgrade --latest` in Yarn 1 (ie it ignores the ranges previously listed in your manifests), but unlike `yarn upgrade` which only upgraded dependencies in the current workspace, `yarn up` will upgrade all workspaces at the same time.\n\n This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\n ",examples:[["Upgrade all instances of lodash to the latest release","$0 up lodash"],["Upgrade all instances of lodash to the latest release, but ask confirmation for each","$0 up lodash -i"],["Upgrade all instances of lodash to 1.2.3","$0 up lodash@1.2.3"],["Upgrade all instances of packages with the `@babel` scope to the latest release","$0 up '@babel/*'"],["Upgrade all instances of packages containing the word `jest` to the latest release","$0 up '*jest*'"],["Upgrade all instances of packages with the `@babel` scope to 7.0.0","$0 up '@babel/*@7.0.0'"]]}),Kf.schema=[lI("recursive",Gu.Forbids,["interactive","exact","tilde","caret"],{ignore:[void 0,!1]})];Ye();Ye();Ye();qt();var n0=class extends ut{constructor(){super(...arguments);this.recursive=ge.Boolean("-R,--recursive",!1,{description:"List, for each workspace, what are all the paths that lead to the dependency"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.peers=ge.Boolean("--peers",!1,{description:"Also print the peer dependencies that match the specified name"});this.package=ge.String()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new rr(o.cwd,this.context.cwd);await o.restoreInstallState();let n=W.parseIdent(this.package).identHash,u=this.recursive?lgt(o,n,{configuration:r,peers:this.peers}):agt(o,n,{configuration:r,peers:this.peers});$s.emitTree(u,{configuration:r,stdout:this.context.stdout,json:this.json,separators:1})}};n0.paths=[["why"]],n0.usage=nt.Usage({description:"display the reason why a package is needed",details:` + This command prints the exact reasons why a package appears in the dependency tree. + + If \`-R,--recursive\` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named "Foo" when looking for "Bar", it means that "Foo" already got printed higher in the tree. + `,examples:[["Explain why lodash is used in your project","$0 why lodash"]]});function agt(t,e,{configuration:r,peers:o}){let a=je.sortMap(t.storedPackages.values(),A=>W.stringifyLocator(A)),n={},u={children:n};for(let A of a){let p={};for(let E of A.dependencies.values()){if(!o&&A.peerDependencies.has(E.identHash))continue;let I=t.storedResolutions.get(E.descriptorHash);if(!I)throw new Error("Assertion failed: The resolution should have been registered");let v=t.storedPackages.get(I);if(!v)throw new Error("Assertion failed: The package should have been registered");if(v.identHash!==e)continue;{let C=W.stringifyLocator(A);n[C]={value:[A,de.Type.LOCATOR],children:p}}let b=W.stringifyLocator(v);p[b]={value:[{descriptor:E,locator:v},de.Type.DEPENDENT]}}}return u}function lgt(t,e,{configuration:r,peers:o}){let a=je.sortMap(t.workspaces,v=>W.stringifyLocator(v.anchoredLocator)),n=new Set,u=new Set,A=v=>{if(n.has(v.locatorHash))return u.has(v.locatorHash);if(n.add(v.locatorHash),v.identHash===e)return u.add(v.locatorHash),!0;let b=!1;v.identHash===e&&(b=!0);for(let C of v.dependencies.values()){if(!o&&v.peerDependencies.has(C.identHash))continue;let T=t.storedResolutions.get(C.descriptorHash);if(!T)throw new Error("Assertion failed: The resolution should have been registered");let L=t.storedPackages.get(T);if(!L)throw new Error("Assertion failed: The package should have been registered");A(L)&&(b=!0)}return b&&u.add(v.locatorHash),b};for(let v of a)A(v.anchoredPackage);let p=new Set,h={},E={children:h},I=(v,b,C)=>{if(!u.has(v.locatorHash))return;let T=C!==null?de.tuple(de.Type.DEPENDENT,{locator:v,descriptor:C}):de.tuple(de.Type.LOCATOR,v),L={},U={value:T,children:L},J=W.stringifyLocator(v);if(b[J]=U,!p.has(v.locatorHash)&&(p.add(v.locatorHash),!(C!==null&&t.tryWorkspaceByLocator(v))))for(let te of v.dependencies.values()){if(!o&&v.peerDependencies.has(te.identHash))continue;let le=t.storedResolutions.get(te.descriptorHash);if(!le)throw new Error("Assertion failed: The resolution should have been registered");let pe=t.storedPackages.get(le);if(!pe)throw new Error("Assertion failed: The package should have been registered");I(pe,L,te)}};for(let v of a)I(v.anchoredPackage,h,null);return E}Ye();var eH={};Kt(eH,{GitFetcher:()=>C2,GitResolver:()=>w2,default:()=>bgt,gitUtils:()=>ra});Ye();Pt();var ra={};Kt(ra,{TreeishProtocols:()=>E2,clone:()=>$8,fetchBase:()=>Qde,fetchChangedFiles:()=>Fde,fetchChangedWorkspaces:()=>Sgt,fetchRoot:()=>kde,isGitUrl:()=>EC,lsRemote:()=>bde,normalizeLocator:()=>Pgt,normalizeRepoUrl:()=>mC,resolveUrl:()=>Z8,splitRepoUrl:()=>i0,validateRepoUrl:()=>X8});Ye();Pt();qt();var Pde=$e(Bde()),Sde=$e(EU()),yC=$e(Be("querystring")),J8=$e(zn());function K8(t,e,r){let o=t.indexOf(r);return t.lastIndexOf(e,o>-1?o:1/0)}function vde(t){try{return new URL(t)}catch{return}}function vgt(t){let e=K8(t,"@","#"),r=K8(t,":","#");return r>e&&(t=`${t.slice(0,r)}/${t.slice(r+1)}`),K8(t,":","#")===-1&&t.indexOf("//")===-1&&(t=`ssh://${t}`),t}function Dde(t){return vde(t)||vde(vgt(t))}function mC(t,{git:e=!1}={}){if(t=t.replace(/^git\+https:/,"https:"),t=t.replace(/^(?:github:|https:\/\/github\.com\/|git:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\.git)?(#.*)?$/,"https://github.com/$1/$2.git$3"),t=t.replace(/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/,"https://github.com/$1/$2.git#$3"),e){let r=Dde(t);r&&(t=r.href),t=t.replace(/^git\+([^:]+):/,"$1:")}return t}function xde(){return{...process.env,GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||`${process.env.GIT_SSH||"ssh"} -o BatchMode=yes`}}var Dgt=[/^ssh:/,/^git(?:\+[^:]+)?:/,/^(?:git\+)?https?:[^#]+\/[^#]+(?:\.git)(?:#.*)?$/,/^git@[^#]+\/[^#]+\.git(?:#.*)?$/,/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z._0-9-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\.git)?(?:#.*)?$/,/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/],E2=(a=>(a.Commit="commit",a.Head="head",a.Tag="tag",a.Semver="semver",a))(E2||{});function EC(t){return t?Dgt.some(e=>!!t.match(e)):!1}function i0(t){t=mC(t);let e=t.indexOf("#");if(e===-1)return{repo:t,treeish:{protocol:"head",request:"HEAD"},extra:{}};let r=t.slice(0,e),o=t.slice(e+1);if(o.match(/^[a-z]+=/)){let a=yC.default.parse(o);for(let[p,h]of Object.entries(a))if(typeof h!="string")throw new Error(`Assertion failed: The ${p} parameter must be a literal string`);let n=Object.values(E2).find(p=>Object.hasOwn(a,p)),[u,A]=typeof n<"u"?[n,a[n]]:["head","HEAD"];for(let p of Object.values(E2))delete a[p];return{repo:r,treeish:{protocol:u,request:A},extra:a}}else{let a=o.indexOf(":"),[n,u]=a===-1?[null,o]:[o.slice(0,a),o.slice(a+1)];return{repo:r,treeish:{protocol:n,request:u},extra:{}}}}function Pgt(t){return W.makeLocator(t,mC(t.reference))}function X8(t,{configuration:e}){let r=mC(t,{git:!0});if(!rn.getNetworkSettings(`https://${(0,Pde.default)(r).resource}`,{configuration:e}).enableNetwork)throw new zt(80,`Request to '${r}' has been blocked because of your configuration settings`);return r}async function bde(t,e){let r=X8(t,{configuration:e}),o=await z8("listing refs",["ls-remote",r],{cwd:e.startingCwd,env:xde()},{configuration:e,normalizedRepoUrl:r}),a=new Map,n=/^([a-f0-9]{40})\t([^\n]+)/gm,u;for(;(u=n.exec(o.stdout))!==null;)a.set(u[2],u[1]);return a}async function Z8(t,e){let{repo:r,treeish:{protocol:o,request:a},extra:n}=i0(t),u=await bde(r,e),A=(h,E)=>{switch(h){case"commit":{if(!E.match(/^[a-f0-9]{40}$/))throw new Error("Invalid commit hash");return yC.default.stringify({...n,commit:E})}case"head":{let I=u.get(E==="HEAD"?E:`refs/heads/${E}`);if(typeof I>"u")throw new Error(`Unknown head ("${E}")`);return yC.default.stringify({...n,commit:I})}case"tag":{let I=u.get(`refs/tags/${E}`);if(typeof I>"u")throw new Error(`Unknown tag ("${E}")`);return yC.default.stringify({...n,commit:I})}case"semver":{let I=kr.validRange(E);if(!I)throw new Error(`Invalid range ("${E}")`);let v=new Map([...u.entries()].filter(([C])=>C.startsWith("refs/tags/")).map(([C,T])=>[J8.default.parse(C.slice(10)),T]).filter(C=>C[0]!==null)),b=J8.default.maxSatisfying([...v.keys()],I);if(b===null)throw new Error(`No matching range ("${E}")`);return yC.default.stringify({...n,commit:v.get(b)})}case null:{let I;if((I=p("commit",E))!==null||(I=p("tag",E))!==null||(I=p("head",E))!==null)return I;throw E.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve "${E}" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve "${E}" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol ("${h}")`)}},p=(h,E)=>{try{return A(h,E)}catch{return null}};return mC(`${r}#${A(o,a)}`)}async function $8(t,e){return await e.getLimit("cloneConcurrency")(async()=>{let{repo:r,treeish:{protocol:o,request:a}}=i0(t);if(o!=="commit")throw new Error("Invalid treeish protocol when cloning");let n=X8(r,{configuration:e}),u=await oe.mktempPromise(),A={cwd:u,env:xde()};return await z8("cloning the repository",["clone","-c core.autocrlf=false",n,ue.fromPortablePath(u)],A,{configuration:e,normalizedRepoUrl:n}),await z8("switching branch",["checkout",`${a}`],A,{configuration:e,normalizedRepoUrl:n}),u})}async function kde(t){let e,r=t;do{if(e=r,await oe.existsPromise(K.join(e,".git")))return e;r=K.dirname(e)}while(r!==e);return null}async function Qde(t,{baseRefs:e}){if(e.length===0)throw new it("Can't run this command with zero base refs specified.");let r=[];for(let A of e){let{code:p}=await Ur.execvp("git",["merge-base",A,"HEAD"],{cwd:t});p===0&&r.push(A)}if(r.length===0)throw new it(`No ancestor could be found between any of HEAD and ${e.join(", ")}`);let{stdout:o}=await Ur.execvp("git",["merge-base","HEAD",...r],{cwd:t,strict:!0}),a=o.trim(),{stdout:n}=await Ur.execvp("git",["show","--quiet","--pretty=format:%s",a],{cwd:t,strict:!0}),u=n.trim();return{hash:a,title:u}}async function Fde(t,{base:e,project:r}){let o=je.buildIgnorePattern(r.configuration.get("changesetIgnorePatterns")),{stdout:a}=await Ur.execvp("git",["diff","--name-only",`${e}`],{cwd:t,strict:!0}),n=a.split(/\r\n|\r|\n/).filter(h=>h.length>0).map(h=>K.resolve(t,ue.toPortablePath(h))),{stdout:u}=await Ur.execvp("git",["ls-files","--others","--exclude-standard"],{cwd:t,strict:!0}),A=u.split(/\r\n|\r|\n/).filter(h=>h.length>0).map(h=>K.resolve(t,ue.toPortablePath(h))),p=[...new Set([...n,...A].sort())];return o?p.filter(h=>!K.relative(r.cwd,h).match(o)):p}async function Sgt({ref:t,project:e}){if(e.configuration.projectCwd===null)throw new it("This command can only be run from within a Yarn project");let r=[K.resolve(e.cwd,dr.lockfile),K.resolve(e.cwd,e.configuration.get("cacheFolder")),K.resolve(e.cwd,e.configuration.get("installStatePath")),K.resolve(e.cwd,e.configuration.get("virtualFolder"))];await e.configuration.triggerHook(u=>u.populateYarnPaths,e,u=>{u!=null&&r.push(u)});let o=await kde(e.configuration.projectCwd);if(o==null)throw new it("This command can only be run on Git repositories");let a=await Qde(o,{baseRefs:typeof t=="string"?[t]:e.configuration.get("changesetBaseRefs")}),n=await Fde(o,{base:a.hash,project:e});return new Set(je.mapAndFilter(n,u=>{let A=e.tryWorkspaceByFilePath(u);return A===null?je.mapAndFilter.skip:r.some(p=>u.startsWith(p))?je.mapAndFilter.skip:A}))}async function z8(t,e,r,{configuration:o,normalizedRepoUrl:a}){try{return await Ur.execvp("git",e,{...r,strict:!0})}catch(n){if(!(n instanceof Ur.ExecError))throw n;let u=n.reportExtra,A=n.stderr.toString();throw new zt(1,`Failed ${t}`,p=>{p.reportError(1,` ${de.prettyField(o,{label:"Repository URL",value:de.tuple(de.Type.URL,a)})}`);for(let h of A.matchAll(/^(.+?): (.*)$/gm)){let[,E,I]=h;E=E.toLowerCase();let v=E==="error"?"Error":`${(0,Sde.default)(E)} Error`;p.reportError(1,` ${de.prettyField(o,{label:v,value:de.tuple(de.Type.NO_HINT,I)})}`)}u?.(p)})}}var C2=class{supports(e,r){return EC(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,a=new Map(r.checksums);a.set(e.locatorHash,o);let n={...r,checksums:a},u=await this.downloadHosted(e,n);if(u!==null)return u;let[A,p,h]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${W.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(e,n),...r.cacheOptions});return{packageFs:A,releaseFs:p,prefixPath:W.getIdentVendorPath(e),checksum:h}}async downloadHosted(e,r){return r.project.configuration.reduceHook(o=>o.fetchHostedRepository,null,e,r)}async cloneFromRemote(e,r){let o=await $8(e.reference,r.project.configuration),a=i0(e.reference),n=K.join(o,"package.tgz");await un.prepareExternalProject(o,n,{configuration:r.project.configuration,report:r.report,workspace:a.extra.workspace,locator:e});let u=await oe.readFilePromise(n);return await je.releaseAfterUseAsync(async()=>await Xi.convertToZip(u,{configuration:r.project.configuration,prefixPath:W.getIdentVendorPath(e),stripComponents:1}))}};Ye();Ye();var w2=class{supportsDescriptor(e,r){return EC(e.range)}supportsLocator(e,r){return EC(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=await Z8(e.range,o.project.configuration);return[W.makeLocator(e,a)]}async getSatisfying(e,r,o,a){let n=i0(e.range);return{locators:o.filter(A=>{if(A.identHash!==e.identHash)return!1;let p=i0(A.reference);return!(n.repo!==p.repo||n.treeish.protocol==="commit"&&n.treeish.request!==p.treeish.request)}),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await je.releaseAfterUseAsync(async()=>await Mt.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var xgt={configuration:{changesetBaseRefs:{description:"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.",type:"STRING",isArray:!0,isNullable:!1,default:["master","origin/master","upstream/master","main","origin/main","upstream/main"]},changesetIgnorePatterns:{description:"Array of glob patterns; files matching them will be ignored when fetching the changed files",type:"STRING",default:[],isArray:!0},cloneConcurrency:{description:"Maximal number of concurrent clones",type:"NUMBER",default:2}},fetchers:[C2],resolvers:[w2]};var bgt=xgt;qt();var s0=class extends ut{constructor(){super(...arguments);this.since=ge.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.recursive=ge.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.noPrivate=ge.Boolean("--no-private",{description:"Exclude workspaces that have the private field set to true"});this.verbose=ge.Boolean("-v,--verbose",!1,{description:"Also return the cross-dependencies between workspaces"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd);return(await Nt.start({configuration:r,json:this.json,stdout:this.context.stdout},async n=>{let u=this.since?await ra.fetchChangedWorkspaces({ref:this.since,project:o}):o.workspaces,A=new Set(u);if(this.recursive)for(let p of[...u].map(h=>h.getRecursiveWorkspaceDependents()))for(let h of p)A.add(h);for(let p of A){let{manifest:h}=p;if(h.private&&this.noPrivate)continue;let E;if(this.verbose){let I=new Set,v=new Set;for(let b of Mt.hardDependencies)for(let[C,T]of h.getForScope(b)){let L=o.tryWorkspaceByDescriptor(T);L===null?o.workspacesByIdent.has(C)&&v.add(T):I.add(L)}E={workspaceDependencies:Array.from(I).map(b=>b.relativeCwd),mismatchedWorkspaceDependencies:Array.from(v).map(b=>W.stringifyDescriptor(b))}}n.reportInfo(null,`${p.relativeCwd}`),n.reportJson({location:p.relativeCwd,name:h.name?W.stringifyIdent(h.name):null,...E})}})).exitCode()}};s0.paths=[["workspaces","list"]],s0.usage=nt.Usage({category:"Workspace-related commands",description:"list all available workspaces",details:"\n This command will print the list of all workspaces in the project.\n\n - If `--since` is set, Yarn will only list workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If `--no-private` is set, Yarn will not list any workspaces that have the `private` field set to `true`.\n\n - If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\n "});Ye();Ye();qt();var o0=class extends ut{constructor(){super(...arguments);this.workspaceName=ge.String();this.commandName=ge.String();this.args=ge.Proxy()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new rr(o.cwd,this.context.cwd);let n=o.workspaces,u=new Map(n.map(p=>[W.stringifyIdent(p.anchoredLocator),p])),A=u.get(this.workspaceName);if(A===void 0){let p=Array.from(u.keys()).sort();throw new it(`Workspace '${this.workspaceName}' not found. Did you mean any of the following: + - ${p.join(` + - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:A.cwd})}};o0.paths=[["workspace"]],o0.usage=nt.Usage({category:"Workspace-related commands",description:"run a command within the specified workspace",details:` + This command will run a given sub-command on a single workspace. + `,examples:[["Add a package to a single workspace","yarn workspace components add -D react"],["Run build script on a single workspace","yarn workspace components run build"]]});var kgt={configuration:{enableImmutableInstalls:{description:"If true (the default on CI), prevents the install command from modifying the lockfile",type:"BOOLEAN",default:Tde.isCI},defaultSemverRangePrefix:{description:"The default save prefix: '^', '~' or ''",type:"STRING",values:["^","~",""],default:"^"},preferReuse:{description:"If true, `yarn add` will attempt to reuse the most common dependency range in other workspaces.",type:"BOOLEAN",default:!1}},commands:[Qh,Fh,Th,Rh,t0,Vh,Uh,s0,Wd,Vd,dC,Kd,bh,kh,Nh,Lh,Mh,Oh,_h,Hh,jh,qh,r0,Gh,Yh,Jh,Kh,zh,Wh,Xh,Zh,$h,zd,e0,Kf,n0,o0]},Qgt=kgt;var oH={};Kt(oH,{default:()=>Tgt});Ye();var kt={optional:!0},rH=[["@tailwindcss/aspect-ratio@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@tailwindcss/line-clamp@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0",{peerDependencies:{postcss:"^8.0.0"}}],["@samverschueren/stream-to-observable@<0.3.1",{peerDependenciesMeta:{rxjs:kt,zenObservable:kt}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:kt,zenObservable:kt}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@<4.2.0",{peerDependenciesMeta:{["supports-color"]:kt}}],["got@<11",{dependencies:{["@types/responselike"]:"^1.0.0",["@types/keyv"]:"^3.1.1"}}],["cacheable-lookup@<4.1.2",{dependencies:{["@types/keyv"]:"^3.1.1"}}],["http-link-dataloader@*",{peerDependencies:{graphql:"^0.13.1 || ^14.0.0"}}],["typescript-language-server@*",{dependencies:{["vscode-jsonrpc"]:"^5.0.1",["vscode-languageserver-protocol"]:"^3.15.0"}}],["postcss-syntax@*",{peerDependenciesMeta:{["postcss-html"]:kt,["postcss-jsx"]:kt,["postcss-less"]:kt,["postcss-markdown"]:kt,["postcss-scss"]:kt}}],["jss-plugin-rule-value-function@<=10.1.1",{dependencies:{["tiny-warning"]:"^1.0.2"}}],["ink-select-input@<4.1.0",{peerDependencies:{react:"^16.8.2"}}],["license-webpack-plugin@<2.3.18",{peerDependenciesMeta:{webpack:kt}}],["snowpack@>=3.3.0",{dependencies:{["node-gyp"]:"^7.1.0"}}],["promise-inflight@*",{peerDependenciesMeta:{bluebird:kt}}],["reactcss@*",{peerDependencies:{react:"*"}}],["react-color@<=2.19.0",{peerDependencies:{react:"*"}}],["gatsby-plugin-i18n@*",{dependencies:{ramda:"^0.24.1"}}],["useragent@^2.0.0",{dependencies:{request:"^2.88.0",yamlparser:"0.0.x",semver:"5.5.x"}}],["@apollographql/apollo-tools@<=0.5.2",{peerDependencies:{graphql:"^14.2.1 || ^15.0.0"}}],["material-table@^2.0.0",{dependencies:{"@babel/runtime":"^7.11.2"}}],["@babel/parser@*",{dependencies:{"@babel/types":"^7.8.3"}}],["fork-ts-checker-webpack-plugin@<=6.3.4",{peerDependencies:{eslint:">= 6",typescript:">= 2.7",webpack:">= 4","vue-template-compiler":"*"},peerDependenciesMeta:{eslint:kt,"vue-template-compiler":kt}}],["rc-animate@<=3.1.1",{peerDependencies:{react:">=16.9.0","react-dom":">=16.9.0"}}],["react-bootstrap-table2-paginator@*",{dependencies:{classnames:"^2.2.6"}}],["react-draggable@<=4.4.3",{peerDependencies:{react:">= 16.3.0","react-dom":">= 16.3.0"}}],["apollo-upload-client@<14",{peerDependencies:{graphql:"14 - 15"}}],["react-instantsearch-core@<=6.7.0",{peerDependencies:{algoliasearch:">= 3.1 < 5"}}],["react-instantsearch-dom@<=6.7.0",{dependencies:{"react-fast-compare":"^3.0.0"}}],["ws@<7.2.1",{peerDependencies:{bufferutil:"^4.0.1","utf-8-validate":"^5.0.2"},peerDependenciesMeta:{bufferutil:kt,"utf-8-validate":kt}}],["react-portal@<4.2.2",{peerDependencies:{"react-dom":"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0"}}],["react-scripts@<=4.0.1",{peerDependencies:{react:"*"}}],["testcafe@<=1.10.1",{dependencies:{"@babel/plugin-transform-for-of":"^7.12.1","@babel/runtime":"^7.12.5"}}],["testcafe-legacy-api@<=4.2.0",{dependencies:{"testcafe-hammerhead":"^17.0.1","read-file-relative":"^1.2.0"}}],["@google-cloud/firestore@<=4.9.3",{dependencies:{protobufjs:"^6.8.6"}}],["gatsby-source-apiserver@*",{dependencies:{["babel-polyfill"]:"^6.26.0"}}],["@webpack-cli/package-utils@<=1.0.1-alpha.4",{dependencies:{["cross-spawn"]:"^7.0.3"}}],["gatsby-remark-prismjs@<3.3.28",{dependencies:{lodash:"^4"}}],["gatsby-plugin-favicon@*",{peerDependencies:{webpack:"*"}}],["gatsby-plugin-sharp@<=4.6.0-next.3",{dependencies:{debug:"^4.3.1"}}],["gatsby-react-router-scroll@<=5.6.0-next.0",{dependencies:{["prop-types"]:"^15.7.2"}}],["@rebass/forms@*",{dependencies:{["@styled-system/should-forward-prop"]:"^5.0.0"},peerDependencies:{react:"^16.8.6"}}],["rebass@*",{peerDependencies:{react:"^16.8.6"}}],["@ant-design/react-slick@<=0.28.3",{peerDependencies:{react:">=16.0.0"}}],["mqtt@<4.2.7",{dependencies:{duplexify:"^4.1.1"}}],["vue-cli-plugin-vuetify@<=2.0.3",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":kt,"vuetify-loader":kt}}],["vue-cli-plugin-vuetify@<=2.0.4",{dependencies:{"null-loader":"^3.0.0"}}],["vue-cli-plugin-vuetify@>=2.4.3",{peerDependencies:{vue:"*"}}],["@vuetify/cli-plugin-utils@<=0.0.4",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":kt}}],["@vue/cli-plugin-typescript@<=5.0.0-alpha.0",{dependencies:{"babel-loader":"^8.1.0"}}],["@vue/cli-plugin-typescript@<=5.0.0-beta.0",{dependencies:{"@babel/core":"^7.12.16"},peerDependencies:{"vue-template-compiler":"^2.0.0"},peerDependenciesMeta:{"vue-template-compiler":kt}}],["cordova-ios@<=6.3.0",{dependencies:{underscore:"^1.9.2"}}],["cordova-lib@<=10.0.1",{dependencies:{underscore:"^1.9.2"}}],["git-node-fs@*",{peerDependencies:{"js-git":"^0.7.8"},peerDependenciesMeta:{"js-git":kt}}],["consolidate@<0.16.0",{peerDependencies:{mustache:"^3.0.0"},peerDependenciesMeta:{mustache:kt}}],["consolidate@<=0.16.0",{peerDependencies:{velocityjs:"^2.0.1",tinyliquid:"^0.2.34","liquid-node":"^3.0.1",jade:"^1.11.0","then-jade":"*",dust:"^0.3.0","dustjs-helpers":"^1.7.4","dustjs-linkedin":"^2.7.5",swig:"^1.4.2","swig-templates":"^2.0.3","razor-tmpl":"^1.3.1",atpl:">=0.7.6",liquor:"^0.0.5",twig:"^1.15.2",ejs:"^3.1.5",eco:"^1.1.0-rc-3",jazz:"^0.0.18",jqtpl:"~1.1.0",hamljs:"^0.6.2",hamlet:"^0.3.3",whiskers:"^0.4.0","haml-coffee":"^1.14.1","hogan.js":"^3.0.2",templayed:">=0.2.3",handlebars:"^4.7.6",underscore:"^1.11.0",lodash:"^4.17.20",pug:"^3.0.0","then-pug":"*",qejs:"^3.0.5",walrus:"^0.10.1",mustache:"^4.0.1",just:"^0.1.8",ect:"^0.5.9",mote:"^0.2.0",toffee:"^0.3.6",dot:"^1.1.3","bracket-template":"^1.1.5",ractive:"^1.3.12",nunjucks:"^3.2.2",htmling:"^0.0.8","babel-core":"^6.26.3",plates:"~0.4.11","react-dom":"^16.13.1",react:"^16.13.1","arc-templates":"^0.5.3",vash:"^0.13.0",slm:"^2.0.0",marko:"^3.14.4",teacup:"^2.0.0","coffee-script":"^1.12.7",squirrelly:"^5.1.0",twing:"^5.0.2"},peerDependenciesMeta:{velocityjs:kt,tinyliquid:kt,"liquid-node":kt,jade:kt,"then-jade":kt,dust:kt,"dustjs-helpers":kt,"dustjs-linkedin":kt,swig:kt,"swig-templates":kt,"razor-tmpl":kt,atpl:kt,liquor:kt,twig:kt,ejs:kt,eco:kt,jazz:kt,jqtpl:kt,hamljs:kt,hamlet:kt,whiskers:kt,"haml-coffee":kt,"hogan.js":kt,templayed:kt,handlebars:kt,underscore:kt,lodash:kt,pug:kt,"then-pug":kt,qejs:kt,walrus:kt,mustache:kt,just:kt,ect:kt,mote:kt,toffee:kt,dot:kt,"bracket-template":kt,ractive:kt,nunjucks:kt,htmling:kt,"babel-core":kt,plates:kt,"react-dom":kt,react:kt,"arc-templates":kt,vash:kt,slm:kt,marko:kt,teacup:kt,"coffee-script":kt,squirrelly:kt,twing:kt}}],["vue-loader@<=16.3.3",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",webpack:"^4.1.0 || ^5.0.0-0"},peerDependenciesMeta:{"@vue/compiler-sfc":kt}}],["vue-loader@^16.7.0",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",vue:"^3.2.13"},peerDependenciesMeta:{"@vue/compiler-sfc":kt,vue:kt}}],["scss-parser@<=1.0.5",{dependencies:{lodash:"^4.17.21"}}],["query-ast@<1.0.5",{dependencies:{lodash:"^4.17.21"}}],["redux-thunk@<=2.3.0",{peerDependencies:{redux:"^4.0.0"}}],["skypack@<=0.3.2",{dependencies:{tar:"^6.1.0"}}],["@npmcli/metavuln-calculator@<2.0.0",{dependencies:{"json-parse-even-better-errors":"^2.3.1"}}],["bin-links@<2.3.0",{dependencies:{"mkdirp-infer-owner":"^1.0.2"}}],["rollup-plugin-polyfill-node@<=0.8.0",{peerDependencies:{rollup:"^1.20.0 || ^2.0.0"}}],["snowpack@<3.8.6",{dependencies:{"magic-string":"^0.25.7"}}],["elm-webpack-loader@*",{dependencies:{temp:"^0.9.4"}}],["winston-transport@<=4.4.0",{dependencies:{logform:"^2.2.0"}}],["jest-vue-preprocessor@*",{dependencies:{"@babel/core":"7.8.7","@babel/template":"7.8.6"},peerDependencies:{pug:"^2.0.4"},peerDependenciesMeta:{pug:kt}}],["redux-persist@*",{peerDependencies:{react:">=16"},peerDependenciesMeta:{react:kt}}],["sodium@>=3",{dependencies:{"node-gyp":"^3.8.0"}}],["babel-plugin-graphql-tag@<=3.1.0",{peerDependencies:{graphql:"^14.0.0 || ^15.0.0"}}],["@playwright/test@<=1.14.1",{dependencies:{"jest-matcher-utils":"^26.4.2"}}],...["babel-plugin-remove-graphql-queries@<3.14.0-next.1","babel-preset-gatsby-package@<1.14.0-next.1","create-gatsby@<1.14.0-next.1","gatsby-admin@<0.24.0-next.1","gatsby-cli@<3.14.0-next.1","gatsby-core-utils@<2.14.0-next.1","gatsby-design-tokens@<3.14.0-next.1","gatsby-legacy-polyfills@<1.14.0-next.1","gatsby-plugin-benchmark-reporting@<1.14.0-next.1","gatsby-plugin-graphql-config@<0.23.0-next.1","gatsby-plugin-image@<1.14.0-next.1","gatsby-plugin-mdx@<2.14.0-next.1","gatsby-plugin-netlify-cms@<5.14.0-next.1","gatsby-plugin-no-sourcemaps@<3.14.0-next.1","gatsby-plugin-page-creator@<3.14.0-next.1","gatsby-plugin-preact@<5.14.0-next.1","gatsby-plugin-preload-fonts@<2.14.0-next.1","gatsby-plugin-schema-snapshot@<2.14.0-next.1","gatsby-plugin-styletron@<6.14.0-next.1","gatsby-plugin-subfont@<3.14.0-next.1","gatsby-plugin-utils@<1.14.0-next.1","gatsby-recipes@<0.25.0-next.1","gatsby-source-shopify@<5.6.0-next.1","gatsby-source-wikipedia@<3.14.0-next.1","gatsby-transformer-screenshot@<3.14.0-next.1","gatsby-worker@<0.5.0-next.1"].map(t=>[t,{dependencies:{"@babel/runtime":"^7.14.8"}}]),["gatsby-core-utils@<2.14.0-next.1",{dependencies:{got:"8.3.2"}}],["gatsby-plugin-gatsby-cloud@<=3.1.0-next.0",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["gatsby-plugin-gatsby-cloud@<=3.2.0-next.1",{peerDependencies:{webpack:"*"}}],["babel-plugin-remove-graphql-queries@<=3.14.0-next.1",{dependencies:{"gatsby-core-utils":"^2.8.0-next.1"}}],["gatsby-plugin-netlify@3.13.0-next.1",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["clipanion-v3-codemod@<=0.2.0",{peerDependencies:{jscodeshift:"^0.11.0"}}],["react-live@*",{peerDependencies:{"react-dom":"*",react:"*"}}],["webpack@<4.44.1",{peerDependenciesMeta:{"webpack-cli":kt,"webpack-command":kt}}],["webpack@<5.0.0-beta.23",{peerDependenciesMeta:{"webpack-cli":kt}}],["webpack-dev-server@<3.10.2",{peerDependenciesMeta:{"webpack-cli":kt}}],["@docusaurus/responsive-loader@<1.5.0",{peerDependenciesMeta:{sharp:kt,jimp:kt}}],["eslint-module-utils@*",{peerDependenciesMeta:{"eslint-import-resolver-node":kt,"eslint-import-resolver-typescript":kt,"eslint-import-resolver-webpack":kt,"@typescript-eslint/parser":kt}}],["eslint-plugin-import@*",{peerDependenciesMeta:{"@typescript-eslint/parser":kt}}],["critters-webpack-plugin@<3.0.2",{peerDependenciesMeta:{"html-webpack-plugin":kt}}],["terser@<=5.10.0",{dependencies:{acorn:"^8.5.0"}}],["babel-preset-react-app@10.0.x",{dependencies:{"@babel/plugin-proposal-private-property-in-object":"^7.16.0"}}],["eslint-config-react-app@*",{peerDependenciesMeta:{typescript:kt}}],["@vue/eslint-config-typescript@<11.0.0",{peerDependenciesMeta:{typescript:kt}}],["unplugin-vue2-script-setup@<0.9.1",{peerDependencies:{"@vue/composition-api":"^1.4.3","@vue/runtime-dom":"^3.2.26"}}],["@cypress/snapshot@*",{dependencies:{debug:"^3.2.7"}}],["auto-relay@<=0.14.0",{peerDependencies:{"reflect-metadata":"^0.1.13"}}],["vue-template-babel-compiler@<1.2.0",{peerDependencies:{["vue-template-compiler"]:"^2.6.0"}}],["@parcel/transformer-image@<2.5.0",{peerDependencies:{["@parcel/core"]:"*"}}],["@parcel/transformer-js@<2.5.0",{peerDependencies:{["@parcel/core"]:"*"}}],["parcel@*",{peerDependenciesMeta:{["@parcel/core"]:kt}}],["react-scripts@*",{peerDependencies:{eslint:"*"}}],["focus-trap-react@^8.0.0",{dependencies:{tabbable:"^5.3.2"}}],["react-rnd@<10.3.7",{peerDependencies:{react:">=16.3.0","react-dom":">=16.3.0"}}],["connect-mongo@*",{peerDependencies:{"express-session":"^1.17.1"}}],["vue-i18n@<9",{peerDependencies:{vue:"^2"}}],["vue-router@<4",{peerDependencies:{vue:"^2"}}],["unified@<10",{dependencies:{"@types/unist":"^2.0.0"}}],["react-github-btn@<=1.3.0",{peerDependencies:{react:">=16.3.0"}}],["react-dev-utils@*",{peerDependencies:{typescript:">=2.7",webpack:">=4"},peerDependenciesMeta:{typescript:kt}}],["@asyncapi/react-component@<=1.0.0-next.39",{peerDependencies:{react:">=16.8.0","react-dom":">=16.8.0"}}],["xo@*",{peerDependencies:{webpack:">=1.11.0"},peerDependenciesMeta:{webpack:kt}}],["babel-plugin-remove-graphql-queries@<=4.20.0-next.0",{dependencies:{"@babel/types":"^7.15.4"}}],["gatsby-plugin-page-creator@<=4.20.0-next.1",{dependencies:{"fs-extra":"^10.1.0"}}],["gatsby-plugin-utils@<=3.14.0-next.1",{dependencies:{fastq:"^1.13.0"},peerDependencies:{graphql:"^15.0.0"}}],["gatsby-plugin-mdx@<3.1.0-next.1",{dependencies:{mkdirp:"^1.0.4"}}],["gatsby-plugin-mdx@^2",{peerDependencies:{gatsby:"^3.0.0-next"}}],["fdir@<=5.2.0",{peerDependencies:{picomatch:"2.x"},peerDependenciesMeta:{picomatch:kt}}],["babel-plugin-transform-typescript-metadata@<=0.3.2",{peerDependencies:{"@babel/core":"^7","@babel/traverse":"^7"},peerDependenciesMeta:{"@babel/traverse":kt}}],["graphql-compose@>=9.0.10",{peerDependencies:{graphql:"^14.2.0 || ^15.0.0 || ^16.0.0"}}]];var nH;function Rde(){return typeof nH>"u"&&(nH=Be("zlib").brotliDecompressSync(Buffer.from("G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==","base64")).toString()),nH}var iH;function Nde(){return typeof iH>"u"&&(iH=Be("zlib").brotliDecompressSync(Buffer.from("G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=","base64")).toString()),iH}var sH;function Lde(){return typeof sH>"u"&&(sH=Be("zlib").brotliDecompressSync(Buffer.from("m6PPN5NNGa6n57aNhksKPWgJ25WHbiLSmKh2KhvnP6kTyLl/kJKdo2UHRD79AwZUj8eNMfAhq4sLwQNNE0v9oGXzxif4zMFNd2xIkMSCykO7rfR0BlZhxBw6FzN7fNT9e5bXFEmqfkokrd8mVVtV8AsnMCvda38yC5HhW4VCk+8Dv+qHbwGmXF8HICI2ozSTsLYckoucF1f5RXzXH71TdkFPtH09g8TIr3pKSEaugLT4n9myO5fTay5IjCzPODs9m3tbqUBmYyixSDZKG6H6/9OEVEVFs+1ZJn1ocd6cOGKqadNQ+lT6dsj/Vqqn8347CRPcKuO3JaU19iNWMiqggsIBc03NejfVHk4IhSVcip3t/8pzXUIg0KWAHBJUqlrV2p9j/UXN7vNKWEDnwAF4TiSanCd04PG3xMvsR7zKTdCfoLR99Uh7aKUpovadhLCqJWmWVTTERyy7MvZZS3LktLb+d3gopE3R1YYyN1IW4ZjeLg1Rr3z62GSV0jQNzAc4uff5/+9PP9v/PVQFCKtflA5SHW6z+om17zn3eCQ9ObFle40MA0jn3HvekyzJ/4/9PUDYBYCaKk3LfbirNURVUiHX+XtbZqkWZi1Xrdag0VL/NajNkYLQJO8BQRDRVs28/qCSZrQuCww67QFSfxaZkOP4kuCyvFFLI+PIOH3YPXuE0ZWDIDn/P39Z5Wo005nDIDmqofK6DW+AwAX2SBkR97+eLMgmUtUCQrx4lMI+pQEGa8Fc217Xi5/qJTz+nLYW2Nz/XX57u2co7SWUeVsvNSvMXWPmCUc1lnAmoSlsqaoWiXrsYRIU0r1BaLtlHqGFUJIJbd7C///tyt8sl8tK7DDdn9Tzadbp1gkFpAXskOsBMmJXJc1/5n4j16OEnABLq2FvZgINDWcBQWb8grRy6JbAjkZoz8gmyFeqlen/S2eqBECG3ZBBj8xCNuMHmeSDxKU2SK9qiDPykXPRUpb3QexB+SCUT+K9IE7JBcB9A97KTIOl3e5B1REDyhm1Tg+XJjTMRBqkyASH0BfVl15B/kb8Z2POhnwaUtGaB3q4VC26Jke0B2YfwGOYmW69fV8bA4qoRNAmGQf/n+SsPxeawYndqu+QGNbfbowkv6CWEwVQ2wBzzKRq9c1ZjGXGXnN97RsVlldAXBFOHHvGflV7trbf7m4TEREQUEdon5X6LMZUzOwaCSIRxFEfuUesy2RMq/25lGkiBBlW2j9NxgZFBDgRkGE8P2NyQoikZjNSSlNq8TnJlzUkESSINVEz0QRC5pOXoaXQWsgSBe8pfrY/+YmmwX66CgGX+1iVVa7t14T52ehh/a7Avq8Pcv+858+fpxf7edSvKnBcNdIn9vY1EIYe/BSjHFGf92d+3Lz5nE9FmmK4nN46jrF8nasx7Es489Af8tHu2o9ayI/DY55Wf6xR+ecJ/tK2Fiso0B1mXlfEgHUANnYkJwJy4ZVPhaKoDD9Ffl2vRu7ZHrZyNMXSqhmGJAT8Wz9ZIwe/QPNG2ZCzQDfp0m/JK4YAU7Asoh4fn0adovOyvqFd8SOiq6LKYOv2A/yGEandaSDjsk6d1rX5FOHfTdUnFpuJ36OYvrf0+LUpkWxJsIlEk+N/voCPw7v0yl1ROXufVWYbRGDn4x89jQSXc/cLgiBtszojQhHqqZt8SYa298HKZql6TMbJ5hLW5J5ApN9p0uRJWSch2+7wdkjfoD8nKOQ0WR6/kOOaeVtKhXD1hzfcklxcvCIKlU4umGtnPXqYxEIpWOLOl83BwWApNj7NsuZljkAiLrfOUQULY6RqaS2mDXC0FDxdXPNhfRrV7YYEKglC2vB7unAOyYe0joEhIxL0TZ8mKkdge3ra3l8iJUC4QtgIVdeJPebR+9AGePF6XAGSHHx2TZBOZLntbjeBCCSXrzc/xVkWkGyytWDvmd7Mh5vWKu1uv7ijxl22ebOiV0RTOAPb0YV5wLXrCxzHpKEZ+IL4ZAB2qkEsESRSyYi1bNKKY45ZuvPzAbuNqcnAXEbGZr5UJiZjINkpUEpWD9R4CYMF5k4BaumbLS3y0Fk17GhnGarXwEX/USXpWrModVCxrniqbB9zpViAlaqI+uSdoxHF1k6No9qcgNpVrvqprbXsF8pTi2FOGTADdPXFtbBQkSss/JK9Bfp+w/E1qGoVZr1QIi5OKJlFOaIU2DnK2AJE2lHJcIiabCN6bXA8fbJQQIX0trQ6ULCAdvCkXu43PJd393wbJ7EjBVQdvXkDjjamhuTwKm1kK3ViIhAoWux7aZhv1yUKJDO3PkcEQjdhgMk8xhusCcy3SsJRVx6yc7Hh02d2ZyTL8rEo73EF2ePD5n9xn82oXGWjH87RWcQA/VB4rmSykk2wfEn/0bmEGKFIhTB2oda+itQdI+HeiD5onuZT9i5cbzMLDZ55LhyXTfmihN5oLpUvxRLf1ZQbH7zGd5QuUzugtLzKQsCmqnK+UUx7Ecs27Vjimu3csyw+dhz/LmyscBLljCt3kptun3N3V0ajyIlZJ0jKOaByrGf2sn6DjQ4DZ36uZS8+70Rp3sVLnFJVr26cwrw5Yc/fUf1ihzJbi6kYgsP9SShfcsuX2qoT6EH3gD2l6mvEMq9/T2oAhnq14xE0CqEUz3zE9DXmmA10rNFF7nRZmPRtdw0Ku4WPJ1dWb/HwkyADSvLyYmqtoRA/Ct9HgUKIKCjYol5kffF8bd58wO57ssgv545M6qcdlI6c0DqshLAuGrPFBvK3YhTkOQWK7LJakTNZBIDvleFjV44vI7KUa87iJETZ7csCY3/dbpLfG+nrXygDtZjFZl3OWEr38blBjEKblzNtTFuTwLjEl/S6thchBo9L9keXjWzEHcYHLsXE2tLtF9vNDjrc8wpnoju8aAFhtlv0kMR7idteuc+iZ/zBIBms3zxZOHK1ZWpvh3a5Qye6ibUAxDedhLAXvdISDbUqrcIjR8eCinYt6RJfOhBgjKhFkkacYN/GZQ+Tou3sWZfKA3ZD13SvUxo6kaCtnV+lcUDndapdsnXIQDV3ah8wn8Lk/p4AkKSnNnKUn+aLCYRO8LWBhAAKRiYNAnY9XWFFUM33ugyMRe6cBErk8IkszRH5iBgw5Tkjk+oMh8ivarnEzynCFoLEzRp59vBtXL5vBugjQEeHQ7rFlU3y/QzLstY3PZOY7QudRKopT8wdRLqEnH6HlERKySPPiqZny6iy2ezbOXbNkPkm2D0CWdQ9dg0JJqfuXDF40Id8tMb43g0Nz1iLZOzBIejwyeMlMIl+UMubnZdm2SE2hWMRhrq+YJWHCnB+tjcGYUHkvFG5Lqdgo/OQDNVPlC/7IHSJRLNOLOrDhKf/hyaybzdWXTVNnMt77ksZNojxvtG0CFUOxgZPMvC8cN/DlV7v9UWIMHAXkxQTMdYL64x6YYfV8RS6raL89z21FGZGTmu0xrDNbKbdcydS9fuhFetgH460jD9i8gYxvWzZ7v71jGlVtYimoRK8Wcce0hVjJeZw8UVUJtAeoDqzQjmeE0EvU1sc8j+WeHAQ2D2YPnatxXB3Hv6F4zwRE06poblOgsrNE8fdkyoul5gDlhHs3dSnGfIbrJB1WjephlTWGcvJMKvznGW2yL6qXZzdzJ579ST3LCDOldgY/P7qshSFMTfH/VDHswj+P4p6WYSKQ+3O5Rp0ngs8+h9s4sEVMx4HwwfgnfU2DWFZIU5W2OKednInw3sBqW38DYzPangEnI4I6dyq2noSA2lcA+/IzyfDO9ySBhI1PVgS+/hHW8fdnnGQjR0bfhMeBpg4Xkz5SKMEmFaS2tOI2CB5QIftr038Y/TxLYwyEIDAaYLVshYjxxDPiGVeTxu22oEM8dmthXra4xKhrbI4qqS7W9S3nA889+T/EhFYlLu9ZNMaQe+e0/hOH7J6ml6cnF8f/bw8RDUfAkazBmYbTH79m+chKoi7xlR3NfXJNdqVLQmXOnUyxh+SVrm9kpTLl68yyG8eouCdoRcviAhCQDpmOQCpmkX0FMMFAE5L+kpCsYXnRoyg3V7SKwi4GgEA3waiSytYBoqW2TwvCuYtlfe9ZVN3vcE3hh9FgS265fQ6USvfmXBVXAAAtyiyFE4vqqds1yyqXXsEALRLOTpCM0m9TOtJzXz5CcpbL+CdB74wNf1dhEOjbqYwfyFYAaB2/tHXH15+PRk9eg1mcS2pnC/fLQ8tZLyj9jJcZ10bA/2QQ9APg3QmhgsAzLiTdnebwr2GMEE7j/RtRHA1AgCnp2vCMV7lJLsRH/+erMM3RiJWz2UvATaPXmdkAAB0ohHI/8+tP34I+7bRdGNANMOfyAhgdYbZWTJApZavpw7gEcndV7LcrtD3Aj+Gp/glrMtHrzNvAQCa7YiyaqLJxrCp+zGx4UdO018haO0Ns7f7gHpnpUwAoEGBeSE4z6sysMmfNt+Ryhov5VbMAipVbQGAErBiOMAG7U01tprkLgGAFjwqyZG4pxSknk9VlEOr4RJWx6PXGWwBgKOTR30TCsOQGau9KjHNkbGrEQAo6WiiMQb8AY1/VAYL78Lm0cv6Lk1eBcDRzWqbZjzCt9iaOa7lIwCfmfSW1XTZfTSzZ1TMFgAoHJt8YhjAhO2msjJguGBuBAD0VE0yxnR074mfw90GI2OXeR/ZvGdSYPGOXmdkAAC0KDWocbvJ5menuERXy4zDdhNyrrG/BRfS86heUt5Zc0n2A0f0FL+C1vTR68xbAIAqFnsat3vcDEaRS40baBy0Z0lfWwRnJgBwwvUIF+DTa/uTide845b1mtOY1sRwAYAa2u1pCBdF2lhsVvsqfW3BcQkArGaiPVx8TT3+eYX+wz5+WccFLcdwAYAyaTtis4RPaSPBah+lryU4NgGAEe4Jm0Px63mF1ph29af6LoxgBcCxzmo1o8kroekezO2EfR6F/+i2pXFaKamZcQGAErPXJBjuY60s92GtXI0AwFA4FCr4HGpdJZc0k8vOkZt2SYCsRPtOMD5LP+ti3gd4NPVEIOX0TdR/LzR8T4IztoODJMWugQGupMPeEZ74jl0uw6QXC026AZ+JF6/tw6nQMSzUcTXgyK+/lQ6R3tAfmSped7Heyx92vWDvI++6kDmfRZuCe+6FICOyrzV9NU2+AKqZHxZV3gLE82kcgHN5Ug2KHPpXcn7ze7NFul1F7L91wg2ZWYhFAuukD8nVdpSUFq4n6D4mqyVvAqv4zfPmDBcgPJTbvVer3TcXOad26SRhbLzwRJ2861X99BiWq/imrvkLv2vm/TRH5BQgs2jgg6ftFf4NajeGgwcKCZJ01+rPjaE/EYZQjOTbjPNcW/zu5PiaR2LSYzKHqOPKe1wbWY11x/hrYVqwj7TJicV/b0aWHUDWNEjX1oz3ijFJAQcXrcBEkym6hhpCj0ZmGfw82IsBCh93dF4vy7t2+wIrMCHqkxNXvEAC0n0BaIBY54PSRXr8M2X8Z7vAHFJI4Vk0euy6Y7XpiGPPH7H8w5QgdfBjjtcBz+79h7dZFXaQy788ZUr2ISz/4NwzB7J0JkUpv3fTjPD3ThI1i0D0ShkU55nP0GrCzVEqYoE5mlgO6ryf+4QwAvDyNCkCmbPGL3IsCyWFFUQkslOpN5uWoiZSpkNk6SaVgyI/Cb74L/eod/sEJBxvdh2h4xH8OKzfln8jdh76t4lG5XwSvH8/5XSbfNwuEb5M4Xzyas5p4mCA13gRgIgACC1ow2ZOApHw7EeGvliLfO6DKQxKYzFnZiXbBVujyHzgo8OPYeQlmTO/mcfgQOB9TvXRmODpeKU2bovke5bOzoLIXSLSimyeyetZAsJrb+es/Z9I50b9uszaxHJRbLd4m/7gnGcsXi4/9+6myX7ocwu4FxU+rr4ez9yY0L7GxCICvTuOxumHay0BQBr2Oq65NcbvWheF68blZ9uBJq/bt4ETL5qk9Qez4fGPMe37uL+3cGLt1w4hwstmZ2/JMZyQUOcne7/lwcmDblUE4NFk2lOVo5vUsTc7Akz/IzbtTJ7HZCRH8nFWbk2XcN40LkHKkuUurAGeZCy9k5hOwddB6cyW2dmQ2ZXCEJFYAwaNbqhdfiUT4EWv+0MKqMKHdRWqwWom5KUeR8vJYEasX2SkcpF9hJG5GK38I1RPpbdcX4mseeChjEAPS/ahlMfp7GLR3C4sPr76k/xmP5QTZ60/D6Ovb4uFQ0tis+hgYsHF9eAI+gVXUNw4r7T4promnYOkW3blvNMdI+/BewRIMuxV3bgFiR+hTxYJINGyHfl3XgDi+IZKEEGF8n4MqJC6hSVbJS44GYgjaZpPm+0dZVmTGvjhhmvQTaeoXpgS3DAuPZaTUdZGbOr9RxIS06fGuBTLcMsamfnIbnSPM7EAq0Ni5zZhWLaMBoLYVzdEd1mZGJNfE/bBGm730tPC5Fs/uzV2e2Jjss/Om/tju9DKp3hSM2xsaIlN3q32lOyvQX8ocVLjGqdWnbZU4uV7RlZ2/9Djmu9UUFoWcU9hTUETPO5DX/vXs1ERXhHOex35hPh2Y9xVI2c2W3rba9GoqU2VNNdV9Uthh1VTT0EY8hK3BQCLM2UlHFVykj+fq7qpa7gp1dWG52ldo03rv26mLGm20uofdt7WZhgp/PVY4hsKfWzknoVSuRbvj712ilc5/vStD0lGsOxSIc4Z/23TnDBqc/SLAFDT+ZLrqNsoZleb5WgLk5037LwS8uJccvQYPsWA33j7lE7Sjp0cStMiPCuhAU/E+IyRGQBQd9DQ2MKrLlntUbccmgBARHK+fA4yrBNYsFPaGdDnDTukuwFNaaM4kI34EPI24TuTZn1ybzOtOs9aB8XFmQEAiq6gSLKOD6vdxuTrVkQTAHDWZMeXb0HQtQK9bJ7U9o2hu3VPJfQE6hafsUx+b7qknTsjpgJwshptgQjHJ6/hb/tp0s7cyZPTtMaedQydiTIDALM8EdRy/cI6qaBdpS5FNAGAKxHTl4cQTz1Agirbssxk7S/z/JwL2AcvkCO3N/gzU7gg5SpEoJsTKWoGACwEruGPCXf5nbk6F7HCdgvwbpbN90FcWFUlPz2W34G9qxWhR42Mia4Yk5Sxor3nZmazkyYKtcbypLD8njRHrZYsR2KbaWb5w9lRiUFFeaHDzs8PUq8WohiiqYvJSFLjXHDNHLHK3Jp69lLTsoaGVBVRztEvsgg6ZdVX7BS9G+qjUyFRKxfw8vzsIxULkV3UqlFVoy/1uuOQRoQ647J94GpKKehYstavZvVYoBomtEImx11T0bChdb/nkmzLU+D7q4JS9uXo264ywAfB+uju1Lrubj7HAKdEzc31r+a1UfO3Bz+Ocp8pWcvKw2glZ4heHm2U/aIuMI+9GjCzrF7PSWf6yk4igpo0y7IcTtYVTdOrMPClS0TnDvYIl2bt9bfcPYRbsjsefQpVK6c1mDMkjNONrhu1O506GeQwjUjAHWVV68i+tbcXoCKxKQc/2+EvdbmN8rjB8OJ9pI25c+13pfnFGefWAM7cBYQ50bNv6fRrqTGIS6AWNYTCz12VAyNcR/6qeBDxATpDQvBASGPXOBItuam6Do73Vv42BY/aek0zF3KbYTfurwirA73IiZwytHPxteTeMcigW+d2kS0N4UGQBE6YSg+e311mwi9yBNE/cPEsXUOsK9UMTgX5k4sZAJgMzpWG8FlML5662xlmZwp+bTJGq7/LBAAYw+LqGi35w2/ca7R39J4+UxhhpBFjxDRW70/TfAKPOVmK4aWB8ZwwUmIdvuCFjgrXzATBYJh18G0Q/4pSypysXv50YD2lWNx6ZLjhlm58O6lfiloSDuN/Q4so+o9RIn9uSLp/5f16ZEmvEk+UJknywiJmr6SuPLAbExA59b3zf88mqe51AY6mUAGPwv/dmdf7IUXpvA/3HkDPobePXZHkkNnggPDX0wRCAVJbKa7F8KY3NiHZzyZTFDtRyy2piCQ5CqKzu3QdDqc3OaOeCgBaiZhAkRUOWiexUUw+g9Jbpy+BC3OcuWJVuBfwbRmhAebFlReMG15K9NGZJWf0X16bzzoWeklvMhZ1Dyvn1tKw9Z1AP+D8fI1UzB1WquvhLBnuxTpABZzsRdVlzYZeuMHXWfNg79//Vr0MoKQIrUpfwbO+KjeC2nFmAMCGxJZwHKV0lWkqbO+BhDFNACADPQ+6dwl6uzRKAOAuxkY1YHIHjI4xoOmqUWFdPjwBhTe2lA9ev6yku7SI4jJWOQBlRCg0pSZO81/NHes9Urr5zCgzQp/MUw5AGRJq7YaLp86TKXu9j1/eNiKXH6FZ21Yt5WrVnhGjvF6SGQDghVGdLWGGimKOTML2FmQY0QQAWozPue5+l81I3CQA0KDKmtW4nO51bDn8gvjw89nmZzLBtlVLuQLRNONIpi4zAGDEmHjFrCiCjLsyXzFQWNEC9lAMaDo3MN91uiCU019Ea8Z7sIyFv3JePkpGp4IbQEitgq19uQTbwR04UzAnsN39U3PA0S9lVAemAxQA88tdjzG2h68Ep93pvH6SRqXPp7eKk8+wJeunbAp8kYiqfi3ZumpVYAj9R8UtTHIrkCEHUPbLutMCmQHIHkAkubRQggN40QeNWtCMqe1/tKM9FqYnpsVnKnAVUmh3Xcm6ve3F1dr2cl4xHEnVMwTVHggY10mFX6+gwxRC3y1xBJUu6pzr30OwD8fVBr7SXjY66PrY1dnaf72DcuzRTyTH/UXdyPk0b+o/88KuzUhKh9kk9zZc9pF3rmsbukj9u5/7yJrEo8XdTs5dqFteAaKI9Qilw6LQlxbIWImkQxcIwMk2jGZg00oY0zLA4GaTxKH1l6eO6bpWe5gCAL5WBzO5L+6D0mAdwiidvk7vPKxNrmlHpkq1dCs9yIZ7fc/pw9geuMod4RlhQ73R+BrHfsZuzWc8sIQhtMqg93waQn+mDUaxXyxsi3Egn+wl/UudKr6hBUFCOphk6IMamodari0wMYbP6ZpxrY5xWuw8wSu3JovTSMMU53rywZS1gAfX2NaKyPVPOO07vbL8rB0AHJ0dU2ox8CZO0mJlgpHykiMrSzqnlGL7WS7FFThsYgNC2O2/XpKPFDcQQyoMHLRpdWXpUVk7WJXcrN223edmVjoNSviFCfqM4ctkwuB9NcXuGF3ImLuHURvMCBABNxtIKWSPxFgwF/85/0wHLgAb/uSu1culTU9oTbnme3DFqikOsEM2U3cb1Tuca75NsEk20G8XyqsFohNjwRcWZLdirp+Q4pQAxHAneKBVZOJWNJ3N0AibpGzgEWW4Xs/afm4AKZEKbQl42zluDpVMkF7QcuUZZaCVOWPnvPPVi6W8uCrUzyemxnvVKwLW3Go+mvy7pFUc8g5zo+kw9caBIEFRT+JF/o5jL9Zie3kw1y2hAU3AmDR7f8myO0IG5JbBuiODXBQL+vNFfJk3gnHG707V2aHDGd+HqYzziQJ+eIglbUcVzbFBcTOFN2a5m3cb+0uZqtfmT4tWkxNMK7oKziSDlDZQIs6JVJlE/tPGgCljoCLlDNXFQHmf8dLxcte6NxcaUyXattpPLkfd5s0kDEkKeHT08yyza9c+iYjDynxA1DjHfWTF73yrgS+9mG8jPteBGZtVZgakxbJsjg/rQ83pEFcSXiymoytgyNwiTTGfX51SB2HaXzBVsUs/ddnx4NkZVzD6Ps5ZCiq3HIzmtRx2V976NiRZdg7lzxR/PWp0lraFKxYfTpJNzQNta6Gjtc16qqGy/YgSNPttDJOhnyLaMEpxQP651IABG12ojO5jo+p9ZiJPQ/NhPzMxf8uKB1eqavughT38SuODEE2curR+f0iHZ5GWTprHt2Nz8Xd75PS+Rg5p/ezVXBUP6bG86vHWbbZ9zED+ZWIGAAYYE4hZUfy/xvVVnNlYlEWz2lWpGjaFXCwTABDvHpmrU/VQT/prryud2n/lewisBYBrK2gt3rm6QK++ATcUCxL3JUQdTojnmIsn1eU8k6+7ruPPPVGB6vI8OOJE0xQAW3Vcyt+cZ0xpRhV+EA0H7wSgPiDggpUrzhiGmJQMFN0GgJIEC6cKxTf/KmauH7uav0hOD2gLAOqWpTY3l3g8iQ+6DHeNRc8TsGGcgYYg0usSxvoHkhV7sO05uhE7Y257CxBpjKE30bg2US8A8ymqOyael3aC1SBGaq4343cKPiUYLXGkfnpw/iu1MNZD/ftrmXvd7ZPw8leS12zJJAn0YefaXKF830O4lSenhRIgKVK9NIUzH8Abq9xnvPthMnFx/snqXfaYDya5vZYxIIqEdj3G4PzAKU7+GzD5Ng6JnbSoIuy0ZyLok0lBbdrkM3OtH6opQzA7b8BhXaOWdyofHu98lRTYn4ztJenUCVF0WyT67uSFv65Op6ulm6wGnG+wa6AlzOcLLQjWPY+wT+zykIYxZe2GRJuPC63FAD6MKwfrFh5oD14Fk/MUWJeQsjaoRjnT/EX+mJli+R/JcKOxwdDmOKtrNepGs854J8kwGi44m0tXD8iZgYeBTdZfOq+XdYuOpnFYspUrnjQR0/FNjDhf4O6rG3YzJh77a2vkQ4cta8QsMmxab165JbV8JWzWtat5RqcpwsoGm32NJsNDAtPYkC9vzF9gFUrhgQMOuIKesFUwzGJuRXMdYZq2jKmfdxLOcA3P7Bei8vLmHtMM2OzaLoWRbUUgWhT5cbbkNOPH9+p1wdT0rFNQMT2ACwamiRDnYd8NsY1ZcwZEoUcls8FzTZ1LFERobuTxtMHiarTMGukdfT1/om1shoLTYKJbGbOX05f3O3u6/9jTa2Rd92U9BztaGv+Vp9QfF/VHrv38tWMql3uYCauZM2Ffpks6o6JZ7QsstMDZfFPpLJrYAqoaF8OTmhJbImxjeb0L8wprCQmeQb55f/W99S+kulgG3iqlsDEDb4wGlr1/T8nZVV3whJCf4vVZhDvGpuwOQR6OR6ggzlWNzVG5tq632cmgr1w3yJVL+JeP+kB8pKd1tDXNQ9HCLhunTzTe8ZtQqw2qZJsScx/NH7upm95tlPDZJxxUX00gRtLPRLsvEsiULUsJvA/wZWLxebK1aVwFsVwEb31oI3Ze4VUyUq+4HzO29slDmRoj6eJKXBbUt3kj9zWJK5RngZNGwGDF5SuMXasy8w4DBrlITkyTHqWXwxyfEc5uaGDdCfnnLLPaewi/WBWb3lxF6olOSOaID4pbVal1zElYERrYMZTwkzhvLTDtul6XMN2wHJdllqd4vrdvG038mdfLuRFOWgYgxCZw42WzO1cQhqbCk4PZRYNVRu/CPXCIiavdmhaHDK+m11JaFEmHECBgFWL/q4rD+HniMDxh3978qPw6lFDA2Iq5KdYuXFQVGbqNXCh/J0+YzB9bXkn49Yn/fvupcrjQr/UvhDb8rRUTjR/ySsLHQsdOd4ff8c44J4o0e+i8MfiaTFiLnIUQQLy0D4suDIyh8YrkYvhVjlhw/JGEjhhDFozB2NEJHZ1d6l4mKopc/U/VatAoDUicyVjeO/nH8cpxLB1UxHsBL9POjtSBFSDFlznZJZVabo/IIJM6YFrOoZDYsNyAdxbrR0ESXF+BvdStCS9mBvk73oBPir9e2ACPyN+r1F1Zmqbbkh8OZgDgaCNGr1fMj7QT7jeFGha1PgDvOLuYY3sW7GVnJgBwjGfkGdyTsrkdcK48ersm3XZfPwBwNChFQ3kIuk/44gZNSXGmQMvqLwtwRE6w25zNGRyv+77a3Rbe1bikmgOpCmNK6gTMrpjtAORKLJwDVa2zvQMKI99pgpR9RSahlQrHt2FfXh1MK2H5wj6Ceh6Ky2ggAZTcPzfSY+IxM/3eHLxkNrlbrx7+O30yLkgARSSqdVsqRuv3VnKXoKVMbFv0WLPS6/Oq16kOs52mRHIxAwAtoNNi2sES4/UpF7KDi0eOu7xcW/g4ogkAEIxlL7RZQNd1elts7or2AwAsqDqIykJbvk+B4rxxDFWFfzNQbmAwhpg/vHNBlVeOcZhr8kHkc4bvBzsjQRac0guxrkLyy2k7gMTpNAMALACUmPbniIHpCAG7Wwy2T6jNv9FFZ9wcPOTi0XrlGG6iX+tWRK4SX3z44liOXB9EajwpPN245OYC5guiO+/Ntd+ND3m7N0udUKcezIeXiwnyTnAxy0lJNDwxp9ZL9b10fPRVrPnbdJhbPUw5eWg8KfDNMesRRnSfR4r1SMj9ELahaz3yISMYC8V6gs1Dg2B4utsT8fAVJqSE+1l3GL/dsO8ez/l9YtfimqrxvWOtJIWd5qkhNRMzABColsBzi2kJW3BVlbPZmbaLjNNtbulMAMC89WnSuL/EwxrKXXs/HWboOFivE/tXxzr7i8nSLEu/rlX0w3F1LXXhsTXHStqNV50wz9XsziwGAHx1vOZllMzX3NXLaks/VVyHf46qbltOr1VOSTFLCflLO5xdwY2Ew/xGdfjnKNC2FAEHKhiWuJz3UTcPO3dlI/4aGJd0hpDN7UjydMdNN5Wn1/lHWVAqiPYMFRwBokdBNicFMVWDN2cDycBYkaYLDPUeOsbqnfm+Mz75FqSnPwk6zm3rkXJlJdzD+xPaeTFfxit0DifFNVU0pU1GrSp6qdhzFzMA0K3sTZdMvFFz+JoVyq5PW+73URs+dC/CQ3eGJgAQk0VEG4ENI9f9gJr2yjkhdXV/QQAQNG9CNcGg4MgsshBlt0fKQqAcMS0LweZ+jCwUjhU4slCSK/cqTZ1nMhCYLo9SEO4G5ZKYgQLHLRbHgJPV2WeBc5Lv2wKn4yu6EuSp8NMxzluFsvPjxCU+vSxBdjQgSADl988Nbx1jzfDmV5KP7tvl9U4SdI6GBgmgoETFi3UIFI/I084lPq02prERgvrLKzVayx97Vi202sUMAFSa4QqkbAdLd3m3J6sd8VmeIzsxTQAAC9WENipoUiuXZhyXqEEA0IFigigLWuX7CGjbG7uhSPgXQqHAIA3lee8Fqjx3PLMf67vnOJekdcxOwkzUWviRBaNz3DIXa5ZEUlnWSGj5xbcGcKIQLJZIkkE7KiY8yy+JC/hLW2d4EbI6RtzpPy1Y1AzqlS2zG1fn0zvtjX9c3k1z4sDzwtrABwf0yEgguF1EAiy/6FXAVDU07K7PxPe5atk+vKmDu+Jmr4JdH1LBe69lTynA0yr41YB2S/yeYr4jYUqVeFPsiBD8IZjbcTwklTTz+YhSMNIKLztmbdzUe6e63eZOzeeMIi3BhWRMTyllEcCQ0ammK+3pXuv404dC+I70WdaXch8bEXUxESGoW6WP4zd+PfHFjORLHWrwHGi3LKxeqtPqTxOWlTyHq8hqRiBqGeA4hYIqlwbQ5PpZJnA9cyUFftcjR+/eu+mm0E5EwPjwRr8TNjV5jwLRJFRU4GBITIdTSK5+iVVfAIB0h34RsGnJjofpdO1QllIfBXnJrdf+ckWXX6yTrxBOXj7gqvhxI+GJkd5aUfeyKO/JJxvvf5kadYNGcCLuUt1IfT6JEvks3dO8DuGEYeByC2IrNSL90QUxT5jRL2hK7OglcBXb7bmqOSuz4LttSIUiObel+OPfd8wnADIhs1BKzrHtNeddktvNL1Rs97alaZaWu2HLKvrASksQV052hMgDxbyp7BkdfrZOMhEj5cZc4UNRHy9hMMc7TDwY3O1RjAXjecG4Hwnbbd9T2ejl30FwLWsQl9s+2xlZ+fJYfmBYNEOxlcqM5ydMRSoYBO9GhiM0V+yNYRGozg56nUKrCMj1zcIzFIsjTVvqhMdqLz5Odcke/c2ebTFwrcAdSRguNvKdvxi4yMtyhAnBZdXL2qmzyW3s+NiGx9cBAEYOfXmOchrF1GKMKe7VThzs1GjFsdoOE/2+yVmhMH9KK9mhVe5VnujQ0j8KD0LmSm2HWebD3Bq2MHfIWDzWK4ebKxLwTjjcVTFB1aav4UBaom2adHmuQT5LeQxrJdVcpUBX7LVXzGMhLDbLcglR60uS4UJhkrolYU0iVppMHG+XSfmazbrrAcNGslOSzQ5yv7sidC59zbvLYGIjZVHWjXMnFITvVowwJvIzQBM+AGqQ7o/hzRI88j4eb6BPI/7c4O+vLNmVVlTO/WRdZIx0iG+11nn3l/R6VYW7DWnAwEGa8uk+HKOJqMGEv4MmbPi4NgmQe1DfLk7xxOELefAxBiGRly8hEAjeDLGbqwsBW1S4YRQ/6xHgIB3AdT4EGJ59HZvtyhM6up9qOYCkJFiCuveveHDyIRoC0GGe4tgy7QHvaW29updOFqJTxWBK1FkspRKgSUkqkSuTTvmVkFWTJbC71dq/Y6GM0IDdG7prGtkDQ3amj1P5Xb5Inev8AyByDSfWWGiwdCE5kGfPqfXkPxE7O4/FyCkg3UliGv5sIQ/oTt1+3ataSK3H/OHXpHbY27r9gIarii0YhlmcZpGWEBzna0gPXzgwRHR6aQrzRlhHjZftxmI/dyGWELaYJcDpI3MHbNiq3vmmh08ybpDDGqz7rcyILvWBrNYzD9ZjT+0NCUz1EUwOIhYa2kc23HUAWlkG3fXYXYjUEYqbZR4RhQt7IIiG9AlJ+VfiizbDs0LFRYzoncKlxlykm7xbTGuZUgASqW3UqBTF5NNrTESS6FCBAZTybDBQLf/fGGNom6iAPC3X+4U6QJbCTqW03EE8U5i2mtOzYtnI7/lcoo0sJDNhS03ppyTWVuKZM28vcfD1fhyRumgIkvpD5PW9miSmFUubW65+/yHUXvV2FTuZuLIW2uwzRFiz9rS7qf8sYZosMWy1uUKLSxJ+vyoer7x4bRgr/OwJqLBJ4IS0UCd/DAotzB4GNQgDufGAxqCQVbH/UGk9e+EhJnfFoloeCXiWtE95Z4/sprzVjMoNmXHcxuVnNDbtdgqjAdp17Ld4/bxJvMd5ltdO0rcR/l5WZ/NHwXfa5fG2GLDQ1ZklbI5iGPvUnpL/mcxFGwPs7iuzQ1kHl7+5h2krvNmuEt07udeVH3Pj/I7utWiT3+zcC34E3O3ZZSf3E/D+2rq6LqUbJ6tpykji0PqybBpJg1z19eYVOr/lLJfyHoXrZ+6HStnVQ64RkM5P2nH/PjJZI7Mj70N5j0drR1yTie9t5cl6MUQMXHEISpmf4v947bZlj7ggnP3XQHNwT/NMXZDPr5atWxAbuEYbR+AmCZpOg9dN5A9x7ywheoAAXcsMVhcjZSWAiyBMVqiaaS5QdiuokS56fr0YxEJAM9+R6DoLi0Lo7ug7hcMlvazNHorvj+Lz5/Su57j4n/+ZWHzFbNl7+H+77D7+3kXW0ufY2S0u1nOMLv8zGfkYGZ36b7SJ+ug/GzI4/4BQhqaw7mLE+qNo9BqPNaac0GJmFZO2XYDWvWfiq+/hC2vjmetikl9T3p5tMQbUabzlCzmQkM5Y3/IFGyitiZqgjOZ13Q/hob8pNYqVftQ8FXcu3vxsZWZ5dS6p53FXxc2llxzvZFtzciO4chszmiu48bq/khtzZ7qiK2/aYqu6HDxana74ao4NzPGSTd7Rcz5Rzs3e47skYN6k/VlVgIXGgB4PD80wJNZ1poAmsaDdGnzXKKsigrRNQ8So2nQR2FlaPtGndNhUDc+doSygAy0+4dMpwJGoGNuLKnOkQFzexiE1iYaY6bFUeN3PG599fc8oKhha1Ag32Q06EZv2mY0ugHBdCVoWXfXIRreJCaFDEhwVYE70SKBXFEOKIVt4+R4rtzuhZSfTtF4YApOavUYv+5Xk3hFPGjPj7I5m7DL5bxBB2mQ3G98iUC0y5OU8Ve/HiyBkWKE925g3jCMUJloxN0qREiu6MITOmaNUNM5SsdwJebEL4rpLi8O5wxVabuKr2n3pIoxn0zmoHENd+bM8FBBYF6Sl9SV/SpWuaKk/XDndm4C+S+ooh71BhMc1ldh3UfZX3HiCbIWpTRZ/bAm8zjggnja8l2TRLviHdhW+Mq5AVsuHYb7wRRp8Vzn7q1sQo/TcvbrK1cadA2jXXUEnXTbVcJtHkNi6xO235xV/2uGwK66m3X1m6IfCdWDY2bMGr04EHSfPcx7eUmurK1Kf5qvz4y3dHTN2Ry+lp6XFf4ex5XDJ7+c8IIuGFHOJqIoW3sr1dXW2/Ih38JL8nN2IVYcrngF02fD1rEPiheksqA9euqZb4BSlHwX2gh9MqUpO48FB/TGb9Jl7dYOkaTSQ9T5x4stToxwdwj5+zJz4X/SY3popy9RGXhu64qd3g/3skqZZmJp5pGdLqUudPt0KVvo35dtVwtnLHv1p5IZH+m4GBzGB5KqASSKn0zlIA5TtjUXM+wj8h3TZpQNN9wl7GFMA4bkjHELwPP0RMN0VWcMF5riMyvJ5gaG0sOqj3UYhCLiw7ZugpFEAtkwYpSTGQJhMPnHnIsD7TaBQk2sppz5C3h7u9xr7ABdvMfRWkhkojyh01CWm1Wlg76mMQNNdB/aRVhqN9YkbNVxrZyPFIcNGd2B4Jg2dk9jCT+Ke07AJi5wh18J8f7XRjQXIP0MKSftLIZak/NDc3iVatkHQC9wMOC2zYmOZ+QIUS4JqA+PzJGJ5Imbc+KRtKedaZRbdPoFRWIPZ4vzsAUa8Ok/Y06tzpkOkJODtI1hYl9imd3TkpJ+FpKOMTY4WMiZowiHZjAKI+OGM6GBKLr1wm8HAU80tY3KsoKgjfWCYd6SVQfruywaMENuZnbgg8vudH750hXo6E2YgTtkxP1IYkqjJXzfu20huHRs/sjTbxJqS4lCwqSxHtvJilzkN+Fev1qSUOwX4vJyc5SibrB6FlyhJYVIXYm51zGuLW9pP0UD5xhnYV0jxYMuEEljN+UwzTHGvsa9Re6vMeuFnMp13earNBgGUlQJEXEv03xYNYxd/3D2CCMaKndKhWxUrZBgthvDGDPBPu62OXsyPmHxtu1VWoRYdKB5CXAL6h6wvXVbAypHjXfyT7pxsswSQy99W6TyBMlbMEKfLCBxFc9Is44UVmarRwOOGFm3ihWU2rWLHXTT28bTbAthzMEvzwjLG4+isnCslYvs0ADCJVbs7ZA2R37Z0+sM2dx7bznk03M4DDVvP13EeELIz07MBmLnu//lF40R/CHA0VvoZvUI5oMXx3Vq7nsJ4kHWCAPbZfOq2sl0wi9xJQ2eCcncOach+5G1woFE7AgJ8a4+7SIwMjEWz0a8CpEk7UwDPd3aHVXWlQ4S3oJ73L0/g61ewgq88JPW18hWtXVBK1hB5Hz99vV2St1+z/8EWpbObl11mgfAWHK9XNnihm5F9giqGt8JjcT03fjF5Gjcqql0kADSxESdZ0NgmTcIA/bvpqx0HHdqjAx+aolxoIODEjAMyN9bHqa04YQ70Y3A0G5Gdha6AueankwQfFtTd/ZzY6R7i3iLTxfiqGN8feptgFQNtBcEAfmNral+tH9EpeciSYDH5IcDmKQJJ129yA70o30BWIzv1fp91AGmbVHGbR/+DcKQ2NV+1u6QIHp7jMhocbou9aIw1HAmqAK4fkkzn1JZJgiTnKB9VkN5D5lSVWwDY7QAdUQXig2ek72X9/Ybm99vYNPM//o1VeFzKja319dHAvxUH8EvOmspkPpOxvFK56en0XOjIY0Y7FzryfEnvCuSg/cjA6WaLIp0YLU4QFckv5E55FiHF+u3wuU8TjQvny5pHK999Tgxva69PvVgg+ZrIcqsWdIAPdQMAB1bjxYA4R8eEE0l9Ltims1snh0GzQkdOM7PQWTGrNzrtduqoD8uv0SBgN4tgugi5je7CVHGCqbBrWW/hDr1/twVe8eA/AICiwJzUz7LByYnbdYGz64aPPfZWwY3kjv3JK7iboIAtQqxGIMCOwAWF9+bApfXYHYB1/9t2AIBVtUwu/Ecfq7lMbrqYqd12GplD7fjl8QAdUCNNJxRwSqgynWBcN715AAB7wEEk7rZARTIzfaAWOns4oGt1w4SgdjxQIzGUO96oLsDvydY0kulXWu24Xl39/1noNsB+YR+6I7AG7lHQNKYqQupqyyG8n8dvPvlzZcqs8UHcr/tU2wCawVQ6uPkupN+TramFeUtOwSfT2geTso5T+7WPxR/ifGv3J9TKrDC+/3Ar8NcVPT4yfV8mvhJ2Tsa3DaDWZsULcxd0CRF6ywy/Yb/mu+pq1UdaaYv0qyRwhZKaqxsAsH8N3gUNtXU95NOszwWpbe8yHNRsVuiIO/YsdFYMdcSdMtMlcRF0hUW0e8SEje5CnjmBK6hd11uYrPdvxmBuD/4DAL04UHvqJwjoSNymDHopxYMFfVJ/owLmEBTguBC2ZujH+Sgr8F3x4vF+wuN9OBVnzS1NlI3X3DuRA+iN1FxdAMDpWBSxz4/4d21zat9xFH49d/UhPncLaqU5r17PejIknwi28GlxswZpOOQsowClsUIBAKAEwBX5F/41xPEj3ubmJdjQcitOh+22e2UdAMAJgWCr4RJe6SVaBKH7T2Q0TXFr3lR+W4SFsoZ8N/IsDumuNQHGKkq555XjhQ3z3RZfRxAIuiFc+uI4Tl5J6LVjjs5evPrztXKUQy1ftm8vqhYOQFc7nv/TDAly2Vp/p+PN4ct/T1+pj55XrF7YEz98prSG9UuJMnYq7rtVNZRp2qmi1NzcAMAKnKYI7ximlJsK3pATc7KkHOZk/ZedM1iW4vVXiIkiRHh/xQTOK4iS8D6JUxuonAsRAIiep2WtJlj1IphorUXKeexPW8Bo4EP/AIDWgWxI/TiJPwtyCsOlRyxUrpjhRP2lLZ4ge0VHQu85nkGZcxWvlU3klXWB73JHiLwpOUk1lSWCLebsZtxxDnoqGzsQO2lVx5X1XiXUzL4ng2HUGyWxx9fJmx9xc5ItcarvquqjARkcBTCY+4bXLXDVbkEFjwZQ8OoDEzy62SuojW7p1TQ7vcV8/ugABCdnIQw4sBk0cDhg4FCwwK796plBAhsAAiftDY/N/M5iMt8ZEHBqn47dVDMI4BgAwDIlhEHleDdd6xdYcr7jxuHvb856qmsNCRk7SgjbznVZNWNdSC+xGDASi8VQlNSBxIoFCBbD400BAHAAcXa+x044kLiwrR17zKdTcm0C1ZRVyTh0KtC1vas8AOA4xrkJcrit6phvdbe9+UvM9qr52nZKfxOLsX3q3Q4LFgkWM6zlLlLTDmqxCZ0KLDT0FHwmFGjSU6yavaVvw/NH9Z5NA7/pi2vWUm10d7cLZGvCdpcKY+i34icgoYsA1z7b/b3TsWlmXM8x1lJtVHeH+BqnGg6DJ3Knb/5dNwDgoNAALyBWNzMGdq69u3EVcNNCAMRjgSwAdZcELvhbAao+RAAAMrQuaIJNLQ2/1nuFu9f5d5e1Rqmue/8BAJchT2/w47WFcxHN44CLbYlvsS47g8tz9LeB4lppRSmeKkhvd+t9FylL7gSlCqN0qv1z6wGn6XvYNYZcya4nGPKixrzHa6lGXzsAkDKGhoRvaF5LE367kaAuKFhpSCB1vXkAgHPgOQ4OHbesFsyWyKCYcEUWzK3KRlkWLKQaUCMLtnoEiuVFcV3csrK7Pi8pzpMWnM/QQpluDM07qohiVm7oZ8h+z4O/HSLpF5TnAWMDaMrRPrG3+qRh/ij0Y/mu9LX3QEp3iJqFK3vZSoqfDeBLPPYzDaVfQjoPHRtAzcPFvfQpedemXuHZjqBiFqQ13qyEEVVhyO4OhXZeNwAw1vmHBnVzp4CMnN30aLykaSEodHdFJXRULSimS6JWgL4+RAAAELS40QSrWnZ5rvcKs/L+zTU4rYP/AIBWBt1UP3GBvhbNIcCArngSZqroUOg9S6UVeSle4Bv0PtyFV6cWpVQ9FNPg2A69D5OfwZKHiZn+kL37PcWlPiWi9dYLcgIiF/EK0se3AQAYfKq43zZlIahKb+g9SQSqWSCqZnK3MMjyFGZjQHCWnr8rMiMzlmFWyIztwNnEklloG3YTAADTOmpUYaZlvpGg0umxyjZZ78pOOmBW3FzPDgCwW2QVSynVEtQlmQ2AmkLcGKgFTSoCxRYct0ocePXX8809xTIFau2fpFqmUerrEr6qWQejCbpewAT+oDuC5Ls7Vx7rxW15l+FlHuv14OUPTk7Yh9WGGF5mlyEAcGMEiadTqE290GanDHUrDGiWk9MkUYaYeh65gI//gawqjVewBDJWe0SCFQPs6UEEAAiQo9xnSxEFEk3tdf9NR9PES6d3/wMAA2gO4j9boayabLnNbZItZ7xNsvUHuk2zpNS6U6ClT7QwdMHyUswHFxH/VXP7Y5DPs/uXD1/pL02rcIMg5vL/C66B8kiqSm3UTc0oRq1Iw4xNIHCMRmVE8ropbZeyYun49+yslw/Yctg9Vg51mOdrRkNEYfjvTsvNW1Zqt3tpuoN+TYcsYvRbllU750tqBUwOUjYWYpYzvHv4LdmXuMxrNtxuvBKEgbqG5qL0XXBgdWKX7Dpr9DRZltPuDcboKd5Em9IQnubsKQBg0KaSowifV76JjuW385pFuG7DFFVAceutfKlxVh4AMEmv5ktkbRI4N6/kRg0yZgK5uUG2uYLcUdBgdUFp71hUVCFvF85iPrgrtbGWrnJaMav3x+Bl6Am90P0Fh+W56nuTnjFoU1kvsYeiTEHzrXewNLGmpmatdZ1z0elCO8sQAJhr8OuRsLMAB91MHLAaPr+7tG5Y0CcuDN69u8ohoM4nAR/AKRYhrLnCG93FaWqi7QWx7PzjTYIl6bB7/wGAkaDtXv6zGMCpybbbXJIsnPGSZHF92Si9oBRO4LsTlTOotDtJ36qLJEwFXRICCbOjgRIFpXaH3WAaSlcFY8EKk+4cagcAwioowA58EQsTMON2EQ8jkVsrGaqoFqzSlwcAsDy9qlqoQOKmBmRLZpwCSehsz4L06oaUQBrqf1CpeeF+3YUlCh+WZzyniG+sN5yZxhDUUMVQRWVhBTf8eaZiniQunJexWgMIYGifAXrKwSurpLcHvyf4HRlYmQ7x9nQLZYJHr5W+Hl3Y/X4B6zJqawBvb7d2WJqywRrOPOhpPrb2BhYnrKNqgSd3zpmlXeAAQPrxx4fa0c0NARGcXbbWL2tYSLg9j0WxgSr5JMoCOmYR6BX/f6O76NqtoszcXjQ16/2b3pkNNZ2u3n8AYEBorsl/toaoaTLnNrdJtpzxNsnW9e1G6RWh1gXcAeFIv2rxXDWwTdlNUF9/8qQXvrt7f/nQz9mYHJEJt1H3jq+drwdtiVJgErvYj09PvSk++PBx4Mrzv7Ff/1VkzwDMGcnj4cQMqYoFVEg64QgQgYVGPVeDGrrCZHfTYTgidfXZUPVVEwOiB6Q4t5ps+O7oawZOKBXxkxZPx2p/RXhcBvsI49wkMr+KyhQeqlv8ocrT8s40Ga4ohD7WHfU1xTCVgcVEWj0dk4hq9d2QFM1LVJHsqQ5tM0RBlg3khtkyepq+RQ5UC0mLcCOsaVoSOaidgcXHCduqQ7mgNy9IrqGtL03tikN5G9DXj1Dme0C7S0V2ngi0dT9Kwc30jVTU0dNpfUX+onTj1MPQQ6IKfUaYbrWyoUv2A3UztCDOJofrMWr83XBt6+KEgdfBbxxU1ybZYl0uBCjJNw0sbXhndsUsSJywa1MzqmIEjIDJkc1SLyDapAH0m68uzbt0emsVfy5RpOdTx71qBRh8LgXgi8wH24Qj8KMeC4u1mlQS3KZBf34F0Dwg/YOqfy0xgL9S1erEd7E40zMi8ZhuUB2krsCC3B2cdTov3xkcfH5xXJ/IH562oSBUtFPzK8A2fTiaA7KlWibRPOkag0TgwzlOZ5ROOTgnopV59sE5zbaGz/e8NOKzJ6eYjGziFF6cm3G10gSP9Nmwyo63vJon25+R/BsuNE9DqH3dAwx/0eojHecvwt8Ihzej/9XtdkvV7cMhm9evF37qmIW9cyR3E1FdzT/jOk9A76lYQ30TJsmNTDnA+BAgojVDa328nwhPOVbSDBw0Hwb9SpSNyXh45mAwUVZ2gZBib9qzKPU6lJL6g0rqDaxdDc3Gu+ModjQSoRsvhrsBUfEXTOk02N10oc5KQX40xdHuW2k6fmMyRX1CtED5ZGPmCwD+gJvuW85d6UZ1GAzOA5tvMoaoQIgCHDCyt2kmhOor3mzjgQNiw/s5dVM3f/3sS4vyUNBPkyQKYnSAAgDxBkUVuq0SA7awZcCEeuPlszGlIXPvTqxoPHFjKY0PfiUj2+z+vI1rG4NBzOatCeva2lYJ/pTaIDdVh8XLtLHujtsrMUIgSxrogWJ+DdAynXR+IeiSJcIUWauiY3U24tQ0RqGDkZb+faZfckAfeR39LHsAQJDir3CAVCZiQIqTMyqV3/+1ZUax9KWT5i8w1KshNjF34hC5KORyYpQwkjPrwPjVYWMRKXflolxVKECNQlzVRbldEEDNgKaQQtf0GjRF51vTR6QnkZjfIthVUdZq8W4RlJ3Jjm2ZDdnFXluz0OFYaBQEPKQoIiOCVa1Hr6rxyFUNYdSq6lsFgxqlnt673cBoBYTf7hh0HpGBUE418tzBJrEQwCol+l+Av3xneG6vP0XCk2feYhpRH8mr1uOlImUSAxUod8r5FtVs2Cq0t1t0gdLlokqIBvnotnvTbhTewS4o0VCh81jiVFxUjGIfBwrAcfg+0YYcOgP49nFfv+6F9/dkXgdk7M7hZqtBq2Ius2OBVuhC9k4AWim/H+/cQl+5NT2SBjgFfYoXcnNS75ebUyNmMN3QBMshV7G81vqnYBkI1zPFxDgiB3BHbO038m7Do7HwIl07elg7aseR4ZfxNWwGoKKz71elr98JO4DVGZJpWN+tzqgfQH8DBmeVhunpWTMOyv7hm8btalAO20nMQCJAM0RTv3KaFW/foTvJrvyK6MXt+Cp/N2ldu9pPSU+tb3rdqi8l7CsgNT0mAEC6gUFtfUzSUtdRAu7qP7HIVLqxM9WRTBWEBeoWmWoUIqmxAEjWhrWo10ZtYa450VzUsNLpPCJ4KSk1uWsPAEh6XvvaWUif+tEtKI5oegvU0BEHnz8VWKiVKg0B5sQKVhHEauHUMYGNKKkLuzIZYXo8hDPGrBjHG8QSK620emxDvr2K1P8QAMSFWU+kb5akXnnu5gBmR6tcEZPGde9RPZ998104ssTdGfSNzKwWTFtnbwJGrSD2AIb2iO0ulzvQp64OGnhSL6Fxwu+uUjw3w2j9XTx0A2h80fEIQFXdq7Cino0Ub77Uhk5zdr+Lm24ANfK6jdlWXVE/9od17PwPM3X8auN1v7uR0qSa+jRM7CvBrRDDKIXXqELNBACooNrSwz0ymJeSWpaAMEqaP9tFeUqDOlSuSAJRWNG2XYvFdm2pjSjw5959J1sdrs4T5B0ttgYQAKRR1v4PjhAxbY6hLBP3J/gkFs0VpRgW2hMFDClYi0qSwloNXp/R7iMh10/X5jv7wX8twk+lN3iQbUc4SgOY60rSZFcDHOghP4TMxRIGV4K6v+Eg8I0CDAng7BxJ53o2+wSsqAIaAHuknDEgu+cDAHCJTNoKWOQp4KQ4n6NnAohiw5KfCz5BKJ9dL71XqEuXkRxsz2meCez8bJE1nXQkd9J4QcG6ofd/2agQZFyK82Qe0wLhwIJZ7yHZzJTvl53dKeZy4indaqwFFNRsZIlcJB9YkAEnvB3qwxLVLyF6nO9u+kNLsH7X0vXwb5quOXgYPfNCNozDMUPD6HjXnUwjvlQn+n2dtmcvyfI4SfT0ojpKcJdyL6/Zr1ZW96ubfhJg/Sa8amF4iVO7TACAFDA9On08gLr0nwwydTB2JlTI1OOQQMBQMCze4UhqgUqPKACgapCCIqJJzqLyBpbsevGYYsv/5pkfkKwpH4BXzuJqFvu0AQD3uJpHLczZoK6zGz9BdGGzRbNlsCkpbh3YtJZqF6UfuTBnezK4sgdVLXCJFqRJrtsTlarA1SWTdmn6oruGnuVZaVASrmHYvDFoLvAKwnto8Ip67ADSK/dABAAHgdeRvuOQXo/n7rjQro+tXJUKAfnONsf3dgurlW3j/UIr3PC2mSNvYfsfMS0TPNbC3V8Jju0ybxG2ST14Yt5mn+UR88Bbr+UpfQnhoqlh8EqRE/JlaKbXJcb9Ok8+/fDDeX7hcJX/zWQK7eq0VxSsZIYLzxLP7TIBALaA6+Ye54rWpI4SUmKAUW4bZaIzeiZVCcy5SiGlIddS4LZGEg1YxSJ8DdSFsxAAAJGBIuKAX2FZmZtyv8QLjiv17E5tAGD6kelaVVFY5uLcnc9nKroimtGBFhxxtsQ4sdAml5qam/GXIM6Uc71OJqNyxVkzgWN+GOFs6a65gLPtI5wb5heOwrsAGJ0eW5o0cQ9EALBucGak71aks/bb3RFzmuIq2dKDlXarPHy7qJmkm+8XDOjgduZvfAs1djIDLdSRZY+00H0KYqZANz1ik7CcntHkisH2mQ4fKXPRcbaNF81Q8W/MchtADENzpLeXh/SD8dGbMjdHf2kN3pCt+nHZar7bAN6wreIuIiHC32tLjzLJt+XSoN+ord7hzTq1e/NjdfcmpNbL8BgKeyC+mAkA4AMMU2Hqo9lTDHinAaUefhWR23/WZ+KIG3SIJyyJRUSzNl69aXj8dm2pI4gwvFktomcTJdphVhsAqInY4thKoHDJFsFobal62pQgzmS8Qmn323SBYnbtjRSDY2mL/bk3YnA1RFjj/KXC/phiin+vvLUzJ/+E9QfkR/p5/jtYlv4x8roltUIkgSRdgUwycKTZSngG5bRTTRS6Wx7xg089K8fgXqg8QRWJwbPWxlgB85BBKUVqxU/IQUMLBumTr3pfpd3Nup5vkQA9qvGel4Mh/81gGR7ex4Eowt/BCWEvJZqZe2/1d/ACNtGe/B/wQ0LhYwzYH3n0SzkNAFBN+VnTZTy1ksGW+tfjktvatu2x0pqlXfovvU+/pgU79M5cN7ArV3mchhPXULhqIT8d2RbvwAcAsLVL5hjhikfgsTWVHf+efpoZ3oqFyM/3fDmLvSwAwGK/pHZRuXR6LtFZjtQeSWbnSjvMfDpdUjw9WxCP70wHLxvsS7pSb6uF7Tqnt1SpF9emdOnSW52cbvguGDCeNP5VfuOaH+mm5NvkrpzqXRvA5AcSgYW2HTxmxGoWXvCtj+thxG8kn/tcnzAuUpvpKcKbqWsCQLUO2HPn2fECulIFulAw7CoY0sLMtaMi3NoV2J+FAABIWlAR6Vi1Refsbf2LRPaBEXyZXqNvDwDo2yrdpI6UMAXtg1XtHrAgZkvJxMEFsR2FGJf1kSYnFhNKETeUL7Ek98pe2HBLlVg+LkCsVbi0WQdduyK0OY4P7rrHiEWuMmmT6E6vucqyJfnDFgav6jKEjwGmmMHwzsLehrcL4WVVepXG/oth101kq8laG1Pmn9HwL7eID/iJt+FdpRsCJ3MRSCGLYwTftyAYXeJYMovPOwTpM5c3Vz52oQ9rWon4MpD6jMLjtBa9PjiPlACuoqpPOdmuctLeYZUQzWXCu2bpf8KtbxcF0Fj9nKotP4StI05J6xdnTb59vQSE0SLtwoJcf6exiImkinMU5jTtvqO8lOREnixPpqnB24sMlT8XmfilkbSS5/4V2GxXxeGRAOzn+G00N3WED5j5uKm9/ODzId2PI5f1kA4HYQzTN/p7Cy9slVeug9QUxoAsXjqYuaOdfZmb/4ezVZuLm+BGMztdnif1//buBlkSTUApAUIJi58ImI1w9X6S/2oH2NoO7r231I3Em7ziZeRBC/DvPwWxErVgjaE6Vxi7dpHJKSE/0CVOyznBR6pdIzVoQNDoyUUu0JDEpH7uAEs8Xo5EjgW87BkudGY/AkCDK9QKmqA551/Rszyx+T6rU6IPGikB3t2zyUeSqChr1HeCHJtTo8oMYYiya8UB6bSuIXjt7UE0ErzqDARu/oduQ8S6BNvO+1DygWYrvqJM7pAg/+0BinC+hQ8vkCH1nEF/aDJHaCp0jYk4ly0BkPRKuw9JQBTN4fBp/ja+fiYDY+838vfD87EkDmtD+57qlf7QvnJgLKlYOS4C5iZiGJG/xDv+IzpE2l3aKup5e1MNmdBSCtOQ4Cs4fvPyebIv3fWU7LRsEsVtOnQjldhG/S9li0wpVxqEVn5sSKO3DLwngEBrzP3ienczW0/xcFE257+iZH3Nwa/dtdLt99w2n3x7BCKuTmZ76VodGmFbs9XIHVEr7ka64qvHSE2V4TKQl5h81pE8xWQv3mLyiHmMyU79oMj3yUYfPDmY7fCzr5m2TXFHHYQTiACfhp7WVvfI1Uz25m4mB6XLJ0dyO2MhyM79TO6JC/rH79C6/fNFk7vhjyaH8EmTPaORcfNNk8fPP01eIXzU5DB+anJnfJVXH6xlIJ7Pcg2XTibHz3f1GcIdlXlPI7Obpx7llECO3FwTUkdRWjP8z0pj9cxRxdKYhlroh+GECgyqxXT9uRjb8HTJemJViqv3Ar/tf3QNxXA0UnLcrutN2Gk0JRfaE9QmgtOKmB7IiUITPSQOpQRI9eoalVTlt1kmDRpNl5JV4zfWHJHMUSSuZ+CF3zLZsWNfhKfC2C4za3sgpvc7lOH48j3yNyupBmeT7J1hrhrO7Ndrd2nzrROCle2epao4u1P9O0IAoNUD85YdmwRuAQnqFhlkJna3vBDONpadMy9kW/xhYF5KZ3WJTXvrtTytiiHc5jhOjWkThnx7XqZDKflQ30l732Z6j2sYwku9TbByq9gUqSfKCYSpdFDCoNl+FABACyAlxxDdp/FGkMBq/kdlmGlxGiuvXP1oo/yauQvKwO2pWzdzAyGSeyJgm0WQ3Zi7sxAAAMnVw4nc9YVLTlTtv0gkukeDUvr2AAD0rMtStaSwF+3DYmWHYMGNJJPd5mR1CTHZFW5QwY0EzdpyVwS3fWWXsqdcEWaLosZjT3WRDhfmdcrmruTYRXhioW5J2W1iQTMgddsmp09ZXa6FeUkGjMcrda8OngQAzSlMo3DQbgBoQVBTJXztJM5drqa2mKn3txvfsG2zsLnKrG9oNVWgnxAAYAKMq5XrYtzbwpTdzM6VEFBnYw9CdAoC1xAj+sR4zVkDzTTHWmO8UT/3W7R/HM/w0zXkboSAx6BDgNhRj0kTT1jzL/g9YWNnvGbQKQEEuR+Z+bHqECCgILf5MLEyKa+NJZtD9yHWqyqYIPc3X21yc071Zgtqv5BwO0sN4cmIEoiZhfNRAIB5NiuBd9xDLIn16iihLvqvuWTalfdMh3n/G7SnDHQi0/VoJN3MS5Tgmj5RAMBNSNsIiHR9UG9xJLGvgelV9+0BAH1T3ezVkRJyrX2wrBM4FsTklExcuyC2rCPG9SaGnmzY9W2z6UIsUlzZu0dbKlViacWfqG3XUmn1ZfHUWOCBfm/M+/PNuQ0/8o51eDMHyErJkIlJXCISF3hZTXbTwO30lwAAd0WWbriGdIKKNRyEafC/0RHyjlh75JF16og1+i7ZOussN0va8bpZ8CteuXJCGG3PBwAwN2TbSMiy6ECgPVYDKRjw+iALAAAXIKIUKJF9EDGRTPKm7Fsasmxyw2IZwlFw41pvFelWfoZMEF0j3QyPgbMYGlBOGFudfDRn9Ql/5T3wo1PVnw53U15NwDGBtl1Fb+5jIZdrIMwVY/mCTfWjAAAbceW4uop4wAAngDPeM08DzioDDwFPqSRPgD1tt13luL5JWwo9mijKqBQjWulMZOYXcEOvD8MDAJxeUIr6UQqSRbep1P8bJI+lWIMryqvaNIQ0N+Kq03ZvqVRJ29ABuuzglm4NRu8XhXXtLsjrpBqOKan2eOLUo1z69A1RyvExb40Ujd/lMe/XdDArGvnE3xYIgR0vtq37kAvhyL6wVJlBJEaIGWJgeTwLgJD44EkAgHVjkOVBuwEAV4awiPCx1MuXuCsspd+OZRdL7hqqMCgIZg4SAgCYLMS2BI7ChjJqUVe3jsbIaonExbQNEheHMKH01dhY5CN/OOaf4B6B8O3Hvg84mk/XTmsl8id677VKtLfDo6EDl5/aEhMJblXa2NsdqwiVsIq5Ngwq96MAACqTqY9hukACh2KAl0UKJ/NmxdHXpZhWs/wKu60MjgSumiOd52L2LLXLI9K99c+zEAAAMbYmSkzC6UzkYjhzvdoAAK8LEKQVFRWrH81BGo7b1JYcIqTJSbGuiwgk1KyW0oHyL6S7dq/u7gVbqZKr4lDcLQm2ymKupmCT5nKVuZouy//m2kCCM4Jrya5AiXAFbBQDEUnAQxlkxKzVexIAKNIQl4N2AwDdi6F4ri9JjeGUkueOGUhVrVUE1jsotuGwdhMCAJfLnNQqcWmBKLc0ykSJxGDaFonBIWwoXI3BJSbT7Nufg4G3knuBVNmRn5afjhITkU5VbOGZLFSB0sgmKbzxniq5kgIA6FCr4KMewfRSqm4J6BEkqNbzZ1eondLggNorkU4Yai4nCgCwnpQzSJBEevLHjZadTiywavEAQBHSCZedFr7WlrA+c5+4fVsoT3zrQdOirdOY12gX3nUXIuTUpe5mOml30lHPMipyz0vXKPV5cLqDcFNvC1IXbRjIU/SIUK6CEgDYtDu1uwGgDijuc/ZIGC03cRef8Q4KFEyDNsfjoptLPu792pz3v8IrV7ugf9ynkEQkOAQIAshtxkfo4fWW4seb6Jh8fJQDAHJf39HcAHZaBepPhwNu794wF8NFD5RLAQAEjFRvmgoBB7aw1XgGLQdEGjSUDZJKUQcDJmzbtJRt1xYpiwQinUgw1XgAIAeoAPKCYM6A5uMCI9waHP4G7Rz7C1dpH6HbYgapcXS1oq3oy/sDObzz1UvxZ83yyOIjlLoJyNJVZOnOLJxjAgCcALVjwFRaSA0HYXn8b6cGQrIgc96Z6QFy5SqHC2vOGgpTceXjShT8eHfK//Gu789Dyf8nsbIP0FWbHyvsfmqqTmmyNRS0bHrySgKvyltzJ/CYwywAAMsFzoC57OVW1pLE1bjMy2pXb8HOCbGqykAQGu7+RY2qY43YpFV/Hn15uJx8VOPBdYSqiUxLtCBNctWeYPJRP5UfCefyM0RimvDpSAmdNPwTfIc878g4ZfcY4SJ3q+q+MP5c3jzXb0qYNwDvZuGsFADAK2TqPeD6tgBr9fOyolL32Srir3ibG2yIlxxpD0jhZalhDwMaMscL23RXnYJT5syJcj3rrpzquX+RSOE6rjAj9PbEAwCiU0mV3Ij6MfKMwqFRoml6jfUiQyXF5hWrumS4/2ysohmw1WwuP0Iwsnzi7fRzA2esERcIQVXrLgeg6rJ+T0/tTCzJxpswT0P2jw/iRcpKILL39yq6Dpj056aHVcQQRdty88CXlOG/ibjDIDyihp6mPMm34g9nYlFRnaZZzYn83gux3jaEsf/UfXG59P6murjsQfWbnyKCkOr1qOWOwmdvkIKkp7dCb2ew7R0eiKuhPjhpgK0ylydotP8AzsGnIQMMqawIcYk+EiCorcdnksmTPmTqf0Lnhs6KDGj0VD0kR/SgvTOglg0EvhhnadLghjwvf4HSPkDdTAhnWZISUEATbEfjhf0gcAGCscK8mO3Ey/L08mk08Dv3EHTdGM4eriSqsnrPO4f6C1L2Hf+zLk0X/uB9ksObYczYM4UVclxuJw4GkpCiuBhzxCLYOb2PtWUUfPI+lkTueMEVYDEOQQwPdHkH0/OeJEpADDbUIWkXuN3Zzse5O7AnjYKpXkBUYiF0uIReeUIclowfuJZe9HMMzJfL7LJBO9d1LoY0IUUxSOlCPCGcuD83nbg/Eyfu6W9j6uu56cS9yuVlIEH8Dk9vSQZIAVPgnWu85OYzfdzE/25A9S9fdPGLoAEqCRTq0xklCYQVx6SEwrngxH1keTEbsvcxyfEkPcrIwVR52gRTg8z7sAy/hD2ZmPUqdIWwvwrJSgKUm4PQaZOl15GYpw9JgWkgrAs+dXftGysS1fJp4AnO0XoOArq8Azo+31MsgYDotMYZCWNVuKj6Osq6zBKIoyAdTIk6HnrhoVCjoulJh/Kxu8KhqLIyC19yt5S1S0IAoMwVNxNuVYMcrqLKZN+v1IczlwmKIJ+mkB2gQb5h8SHQgKZr1w5XO+vHyft0dyYEeRWg9rYT8K8sgI0jVfJ7mrqugcndx9Xs99TKziKx/9pc6/dX+Mrd7F75kfze2akEyA28RomRuaiA1DVrpcZOADH/gm77BZzmZEJwX7gbKWqhy2kmoULf8axa6/NI8ypfpoeiE7XcUpQrOVnd1CrwDKkzNvHggZl67zAKAKA+xioKxKp0Zslcpv5z3R0wtiZ36z1LKf8UINXKIBUgRZWUWmJ0/y4AgKFwe5po6kY+2Fwc2pWoffwDvy013BEPAFiSieI/1lowO7cKF9G0FhTVGluy5Ot2Q0qM6by3CmqvuZOVByxcCNVSdaGnbshZCAU4moheAscOCNQAcKIbVhcmOVXUL58/uDBGWbjc2LY6Dd7uYTIBQH2G1PRwKsYYtagIxNnZ7jfAhSuzFfcGhdLCaLv3dm2+i0hcnFmdjM3ToCLDG0xarbLVxqQzCkJqkAXr/mTrkppdv1MyDbHNk1cu715HE2Ji+YkuMDEjq2bA9loN4ae7GNQ7m2ejAACi2Dyd5jUuaaYBuMJx2za5ve6z1Fr9Fae4QYo4xZJSZEHdIV4AIIgCS7x9WCHREoVrUDSbOKEtRvcAgF1alp+UusWPn1TjzjyDM/nE3lgEM/FoEVNK7aCkyXvu6TE2yMf+7T2pLLqyKcK1qDmfOIKAkqAJUSyMtG09k0pS0cgANbtt0M7VygSADYRMqQ4tJQjS6DIKwF3sRTJxFTbQa8ZhV6ex676NVp6QQtwbz/4AQgxxO1LnPzm8P2U6Nr3cNEbhhQzeAcRr2rcO2y20GDYwuRQAYICW6qZhCbgLzW4/W5cFlMcIDTSggyQNqBwvAGBgyqJd0MnE4Za+6B4A0I1K9ZNiyR/R9jInQfjic3MrFpDr6SkrcAL3gWb/xtWgnv9d6/z2fEb+f6yTn+gXeOTgf1X3wX9DfbPbG10dku2qOg2FSilDz2ITZtgahSZ0UEnyb/dYZZZasyMM/WzCtCoF4+9VznPHc3zPq8ZEmuL+S9bP/DrQ55tUcgAAGKULW0orowMc/N81rD7bdKUFABijbgqX61LAYChpwJl3dB1jcSUmpsbiWiWRmkVXsTcKyvhn6rZCQer8HjiK2oc5fsU5BL+j5Xj1oT4PI4R3CC1Zd62kAABV3GwVN/RhiMKgC8Xh3y761VKN5Jnry3hDwcJgNEiWPcdPOhjVvQDCFFHfBQB26BZXFB3H0hKhZxMJWrgWDwBwoU75w4KgaZMLYSZjAcKWUiKkm74jyKWbCSRQqyfoas9CLXg0sb0BSAUENAxQsTtj4/pl+oMLY9QKHIxt0xHI68NkAgB9C9Hc4ZSTxdCKIuBMq8ikAS6wVqvIav5EW6ipnYQAwFSVX29h7To4ZqMbWtza5K+6nmm4+N6tL7xuZ8O79e35SWhAiA35yVQF0r0xP09hIRdAYJGHZcVViA/FKGleqhgHKurvb+10ILz8jBp0jKMAABqKCtSzk1O5SkA3T1MVk2eu/Out5oTBaDUnfG7LGbRO2KJmApDeXQAA29AUqImmWQZazqUauxLdE9z/tyXFHfEAgFcyLe5idcswn+kFxThN72o3SlZWiJ1u2C7ZhppTUmGB2Wlft3MPWq44hfZ/m/GgtyQUi3mhpy9VQnGvozcmCqcJCNRc4HwirHbNCVdFLW6T8Fe3wSjcemRbPYNRlQ6TCQBCN6R2D6fiNkbtUwTibbWXG+DCodWKO0vkFDFRTyEAwKs05UywLs4mTdPNqEnT5tkiaXo5hAz9iT1T5mOY4T+vB5zeS7ExNjRXe85oE337jYJQuHLItBpFUgAAjStw+NGqffRSKpcEvBUN6su7kR1V3qwG5qourszzmXIyVSzhszsm+LViTFQ9FV4AYIBqhUV1QVsnnrUtcVLdN1pOJh4AGA2Sxc8uoFAGYVhzCpVMg3xcXBtZDwuqlEJDs+yKRpKAW9/I0Z90hwTOMhJadu00+GG0uO2JqqMhCaAB5YdLiLazqVCS0Vd1YyS3I90ZmTIBoDRIYNTRwkoOruraECj2mJzxHNbEX4B4x1ggwYvSowvx/WOBPqr1AUQb4njqntcsSf3RHmPyJVTqizTE6w8LehgxnCG+9foYuRQAYG0QfjS3A72UjUrAXWgugUagxIEBCKcBOscLAASosKgy9HmiPtOJxSFm4wGAACqAsCCYM6D5uMCIqQbHf+87EZ9Yq//XWY3no4m/yBEdTWWHN9S7N+6Dz+o+vL7LXvYhHsTVZVk8ROjBWRMAwEDEbVCLEnBB4rXey56KtW3gyJcosJkRirK32+Q2lE2TbpdqEVy5UzAbqlq+vV3z13JRXxWTnAO7e6rlGJ2jMaVZdnAgxyILDW8Z00ho9vVHZ7uPYIgAyCpcDTkV1cvIi5t0eUGPidQmsDvKOwL1J6v9Bb6q7bUw9PD1SwI4s1P79rw6HK1ZMSuamwwjMQBmMemM0T19V/HUjhwAoIQkqwuSX9+J15bV1nAXnTU3BbOP4fX2swAAKkIaF3fRzvbLy5G0WMnUeZvmvRhtSiHW7fLRT6Odh+aPwY0/37BB91Nj1wXK6AiiE5OiDrtVgjbTSkujHcocieMy5L3rUq/4C1pAX+qVJ5NWv/1/vPVTHnMpttXDQAT5wp+0Y5x93S8Ni3HUmlUqsdVtCIevdrXqiyIlxJpIQLPOgtFCQuhFFFAdM0+9iNASVGlUmTtq7yXnkDwFezztvE6uhKcUSytN4iqBbMKmPHIkrEH72tsfW0qlJXtyJVzB2KjYMt34h6Ni4uT2aD7kaq8iK5VNTvZXrl29A1F9n6S/HawjUep+FABA8gG8UOkDHDKxwgHFNe6BtzHMt0OqcQHGajrd2kVPcuUL6sdftNUXsDMTeX2Y5FbDAn2NPUfyIJv05pZo7QKspCd5O9vssXaQMPtlyUSthq/Nppcj3E6Xf5FHDhnWWNdSBUe3tWHkUyuRNMLVOiVlphOumQF8dhRmqmh0eBcAMAb3zOVHnD1WtDX91pOx8CWat71RMSa6Jx4AsLyzfKUA5j/hBjqRwu5PRq1Zj2BTKH4y6uINEgGF5idju11H38wZZ+SbmT2EIsULJpAhF6wKvISpQQGVWJ2JUxjJpwfiwkjTTjgp2X8qqEba1osZYqQb33b2SN3pKRMABgQTCuoeSTPNCK4WNMPmt8bRspXdcYxP2mY/IQDgcrkbQRZb4jwFDXZlZhxoWNHZ44WGhIKYFLTKjJntiJJRDuLsEmS5gzyPwzRAi1/LPbltKm9+SZCsy/wmK16dn1m5QXV5KvUqhbWkWiqpkgIASBzI22V6sFeS+9y0BDR5Fhghs6bmAlZiEABzvADAAgqJ+ihDPbC3Je4nXiys6B4A0Ahv95Sigp+hoG9hec0V8NJq4I33iO49EPKdYHx30tP3wPYnSlYY4bxhF7sPuGQ0kY0BdkYRuDKG9lG7is21oPYUo+tAXXu33UVy7CkTANwCXSuoZpO61jdoAkolCiWsmc6UOfcvgDghANDbKuqB5eP2L7kWjpdpFsD3AIvssQe2iDCYNBkY6AQmvMYj3PNi3AXxyxHzinTS/Tmjvivb3LoPByiWGG6AuRQAgMAI9YZwIpCAUnMLTmIQQHK8AEDT7H7R3IGTTlwOdTYeABDYAshgMadA8vECKt91oBm8wJEC4Obp9rvYXcaeHeA8puYTe+ObpKwg8Kiqs6AE22hBCcbVUJW57TqNFs6UCQDUoAGjlhZWarA1lKdAwe3NxI/J3sZ3pdTVH/LRgn1ZP88iWxluCPfH9ECASFfc5g6ATq4HNC/aTOsvoD7MUa64/6YZZp3HcaXlieECkEsBAABEqhewIhAAU3MDJjHYgHO8AECBExRNzfoGJp04YFXjAQARLPkjWpzXbBr0WghfrIWU7wuIX9M6f3Ysxv93w5+d9fNuNGppeL93NC8fA2y2uw9f2p1zvWnai7zDzsCz2ElZgaLMhxpXTACAWW5ONTdMYzY7cPAmCwKQG3YJo2v3zM8eanSuD1DcpBH4xlQt+Hc37/3JvvCBBs7o+2P0gODfFL4fqpvzs+GnZ8zsWMcab0XfotXQSttUawxXhI1qRbhO1mmqlm4Vdv+kLo7VqG8wap4HTPBJFZymnaSb1kquhVw6p+kufSkX49rWFRvSuO6f28foPcRSPsZSvMeq8k0eG+P2haZG8VQe4wPl56rA9Grxnn70Hphp/Jj5aEolnf7BiYotaxUwqaiREtYcoEs/CgDgKiAcnp7ppt9kZswBrRmP/zhExTXnl2MEUusVVBVgF6S8Lgc7O7MTAAhojra5mmihooKabLU30fGAu3qpd1c8ADBNom3+nFtZshKP25wmSbXGs8Mw+VbSsvcJycJ935CsuMAd8bbywg3xwp+IW+KhJtCBeKTZdCIea0adiWe827rw0rkdZQJAFalODrWHV+rUOdhL2j1bKH5Sym5pzHI/IQBgCTh4iEvfArOSmS3vUIZptqCztwaaxSqI7YL2wnGyA8/bI+0fphLGpcr5KQBnBHmBh+lqpf5G9z1TIo0vVmCs5ddz/leqZm2m6ZA05MJS7V8WS7tSAAAJCMPTM11PhcyMFKBV65P4yc/CvjBZU3OkmfMFeQfpsroAgMAJiE767PTA2pa4CYcybpmLxAMA+9t3Cxm4rCN7a9vmfOZO46cHtC8+AWfbA1u+A7R3PWeB5Vosf3IiAkuuukgEo7vI27+sECGNJVJlyW2HA6YCuTMibPrkzE7ltDAu14Yv5iT3cWTbXPNao9FPJgCoD2P65NR7vNbM0LIg8O1gUgJwO9NiZTbx7T1QcUIAYE73t1AerjGF3gPpZ8o5Hgs7zNbCCSC0ENvmXNFXL7fsJigfKr2E6CadeYPHqZX3sH9ixHBotpYCAOgASPXQuAjkAZ2aM8CZQR6NqroAgA+ELCLIdKLAycUDANNt+zBwBFCD4c2i9fGxwJLvBpvBA1IILAcEZr+L3GW1tCN4biJ5HLiVfxOYnJgmW68XPtMrdia1zUrGglaz2xNuKWbLBIACi1OL1isIthXOH4JLiEBJjp0el1NhPx/9Guax2oSN5MoEi2bFdQoKRPFAgOhW3OaegF4z9SXg2qRMop2uRLbiPu0Eriy5dR+vFbQYNjC5FABggQ7Um52EBigEXLECDKjUnEAkBhdgVhcAWLCDot57nIFIJxJMNR4AyIERQAV44syBy8ak9cl3gcXgBsH+g6t8E1gZ8JyV6dHR4DWy3Zt4pdto7MhnFgIf/iIjASDFCexk0LKy76zYKVGlIQTmJ86NjxhIlJX8vDUn/KNZjeiugLdXapO0AxHgvrflHb/xtEKY6oCxCpiq3L/P3piFX6bB6nvZ7l9Y1h0QtAyjb6h68NSMFl9Nj1+UGNdoUWpEMOZLhN94NYwJ/UVjGiZoa1FrGij8SQf6OE9vSVcPa1RRuuu1MS7NnGTvWrTci6pz3vtgYO8GBdWh4jh7JajqyoBgVHpvFmHPBMtSgz8LOH98137fIFQBOxPEpnoDADRoxMz9rjsWp4uNZmtQFeTPc7XKPAsAEK1GsqS37ax3f/FB89OADM7c4YDQA8TE8OEASR86eG6HNFddESI1ELBn0clKo0s4CJk12TT2sqfzKRbE5BSODIgRPXNRc5km6HDN3lpz24yOFUaRZyd1o0h943SM+jj7FO7B3SK2AkACHFxUXpkLmh89Nt9eCPr96U94B9AuT3TQvu9l04L867Sy+p6zdWNmCrup6QIAHUgtiHIG6qoHKJWYrnOLhcztAQA88U3kKYUTJVqVqdzm0UJjv3mi6apHM97YHjCzDnNHBu6vgjkY9r41v1uNsoYWmAKwOO7FWkIOYDkdiixwtFsFB05qq+3AmdpqPHA2998+cMs7ywQAF3CGU3WDl+ocNMA0QpVwFmN2zikEANyzZyEf4+SCLVcwzZxFZmtPjNGw6qvONv9KiOzzq87yxiBYCQFBo3myNPfSdIF6CjkMFBZ5c+hYjO94mjFu50zETgC/0VwB4HZBuRfOr/QPoCDwkVd93Oe2Ob/QuGXQxzqjugCApBJEeceEgd5CbkssGa8tRHQPADhVKewphQ1LOtpZbkV5zNOaD7fF+OETo2S3xYQ+E9CB5xPiwacPFgPa/3vHJaERXlreEpaEnU4US3ciCcjSPSvZyNK9KxnJ0iglt8W7BpgtEwBExylWDQvOpgcDWRJlpoDb+xd0lBAAaPLS9wBzXO8MASwQy8zpg/oeiCDbh4UbQFS0bRZyS5kDlYdDHyfd/Qy9AJ/Yf8HxojCN3AoACQVxUXll9v2VexhlwSKwgE7NBWRisABldQGAAimLDDKdaA5NNh4AADiih2B4E7Q+PjZYyYeA8N7rX7eF8iieXVwSXOGlpXdhSSjpRLF0eyQBWbpzko0s3XOSkSzd5+Q2eddoZcsEANExzaphwVx6MJApUWYVnj0e6tNr8zF6xqiha97eUfdEdgWAxKeIk3MAUfg4Pg8HpXFq62uNEdJvHjmKwCeiKwAkaMYF5e7j3yP9l0ZFIA+o1JwBzAzyaFjVBQB8IGSRQKQTxaFk4wGABiN6ANpvNvmGDFw2Fq0v+WCwGXxAsn/hKo08VoiHc3j6g37bY053U6yOG1yOIezVRh165ANt/n7yT7tUNp0BQhkwyD0HOpgTn/OK+z740vsP1+WRIz7hZZKPS9f8pWhEtbP1uQvQwweqTndX8cUaNs94YNovFnWLWfEkhQTmm1O1vHkstKV19G579917aERktrxnHuv6KxLCgAjC3KCs0NnxewtE2LR16Y34gy7PNVvJ3nr5PI0YRMUy+IRon4TG8omCjLGM9i1lqqs1AQKXtzERwS353Y96f+wH86hx+/61FeZ4gTYbJtWdV6f66ZHQh6wOQCOuN8xMgs874lhTrRAhFkXSahFivqpeZVMsH8OSWp/UO9s9M/gIbSyjrRgz9yjR7wvHykTHEfE/bdtAX6Ec8d6A8snXqWM1ZUOHM2SvUVI0TJOcncazpXxa1KyFBJLhKLN7KSL2/r1U23+O5ggNiGdpKQ1Y5rX5uHwvy3yRvIeKVfS48bSomzpJgwiNuthuerrI6Jc+53PqvvKysDG7d+xN7lc1aQSYimfn5JxNUcHqwCHMsM+lSmmdwtG60ZrEj1hHYRd6aX+4T2Wr2y8Oe+zCbzSUQIbZD0xzkQ747TL5lIQt/CNWAHOyoSFPsQDRo3vU1PUbn6Zee1j8/DOgc2MZ9CcFk5leTXlMhW71smskKRmOpwvoWVzWKCGPc7Yo6wxRin3YBmJru29wpS1A1NVGHlSAnkSVpQVUVMk1CKm8DivnQQLiRLm0dsDcuT8uQDwqx/pUuYVDY0TbEvceoQnTAzKXEaTysVALGVyVf0py3m8ACtRRS76oUlMAOXVzWmgAFfK8ju/ni9wFwnE3Ah0tPtWPFCAbeteNJGaVmumTJK3Mc9LSIYI0z6b1+OTve4jLeB5JJBZfDaavuHGOoE6FNaJ8YtVBPUkZYpBOEMpCeGuUE1k1zA0x+seK5QeN67jr8hdqO0w2mr2DmQk/tmQvQ4lPxPxQZrOChumMBQvQhi1/GT2bhrZyLAZjLVsJV+Inx6+73vgW/FS2Tm6F5PsQNujFCcxuXvcC1CtUHzltP79sodR2wcAse9qqTQGL7CgulAJIT0Qf2b5VBR/qMK49q1MxFqRRkBvkfrk7sqczB49vo0GQbChpcmpAWkfk2gbKctBkcn+5AmpHDa9cSDOE1Zze+N3dB4PV8ivZ2lA2m0Og9n1992NK36e61x/yw608jEhEP6V5x87elwqPDccfbmVa3BUckgfymzgBhyikQsykkFLo4v2s9SgaorLvLPQhWm5EWTq0dn0rnGSYPhf7Xr8g9lKPCpnF5djwu5nUxvgZrZ2PYruTSLQ1ib6e5cdmmwqxpqvLNKHjilb9m71ZsGYXs0bV+sozoZk+h+WHSoj5lasO/LDcU8gMrXg3iHmthykZHTvVAbRTb/B1uuh39dMmpO32ptWPaDtTqwwZmbHd9xzx4ufeqM3fd/8F51OcRuj1tmISb7htgpYwIVUu23IkBOO18EDcI7uLPpfqkDxNwRBHADeSfN/xsEYpDp/qZhc7mBEu7oj65wVnD1eTD+YZIXJPYP91ojNYHui1IPsIMrp1EUqKRdJQxydZ4gKGRWw9uxSlDdztsoXCVpITcc7wdM5WO21gt2K9nLb2Qzz48NCu+wHKWD0N7bwYX2EaxqPt8fXjQetJA4ChT53aY7dQ7/vyzTU0p89oZAdmjXawIclGAttwDCh8V95vzHgJkLYZeWTf72pEAxVLDc13L5gBqQNS/A9XW8zKbZYRK6CJDmBDA4Bq159p0n8uvOvp/EOn6/eYjv/HcsyjYg8Fc3dlD/Q2FC7KT92VDq91+j/2mq9zsE28b/8cCT0goKljy0oOJmPv8tzvWeiIQePRjKu7rxlluWZll+vE8kMBssX9PkvN455LyBzLU1SGNvMhgoG5CENiHVRgxvECDZT+0FfQZM7B+YmJ3iLFix7Wo9EQLwc+3e5MTNSds8k1iHDjSG95B5WsIpXHKCrbU72Gr9A72tdNegXv/DKNG3rcZb0UqWhvTTS3R1Kdb5F/3HHSc7O8DwmMz8rsnFoQJOJa3kJQWzm6rblMKZkfaZULHDs1ee1ydRCnbN9xj3Bd1cG8AVrF5an0xdwipTHgU3EdIQegS99EuACLeZ+dnbQyc+aCXUW0o6yBM5UHlrTHTaBURFvSri0q0+x4PvktGNmIWV1Y943ZWA+Z3q9JXC/mYMSVEp8Wx9FUYU1/4wZpxhmTPNI2IXzY/377bMQk5/0stao0WR4bRV7T52AI92U9zwYe0E1oUAyLayhjS97iVPAxkIh6P0GbVHrbxJyNOznt5mCgQxT/b/be2F8lGBhz2etIoLq5L0gDvgs4Z24LyzVWIBt6G7YPXa8rZq5J8U8x1OxcwWjIIDSYW+hP/wZTvK/77ntHy2oyLgL+1QRwDaI3kLqJJX5tJGkonIZNdF4hIV8NRyY76Xt1GwrDHqeOhC2EZq2/TQH6p+tvir380Y3e/d1j6s03eRw88jg76f938NCubUUxnT7+5RU9T+a3MK+6S/VfYPuAVP8lDRvk77aUYXNGnS14PnhNoWX3Q5a6VaFEMHIPP8weo6Y83Iry+L8goqZPbEV59T8RRA1X/ExUbhya09b30I3uxMQCxUqNi54PZKD/BFSYQ4NHGZrupHAKHPuloCGv5CUlBayZ9xUrX0sufff/Kvfn7z8oT3WAUvAq9F2f3jRJVIDkZG2zfGSrMLxAS0LfuZUuG83I09wYOGOgVQy/4CKnDin/p2T3Bqz7q/PAIHTGbsCrv38GAAQmJXoDa/21ZODmBEw5IKMvHsEgrAPH3Tmmw9/dtb4w0CZ3sIpxotXxoSLkpdgfW9THKBq3V880BJqiTje9RadGObQt8jYX1Zwuei+oeTbkR4bCArm0TZU1gnljU32lsNfYO5oJUA1xr5Tf7y75+1Oydh78GX0k7Ikna6pa6RjVo+sMyKjJ5V3Qxl9gwFSEC3r1FxYwovga6BtDaOLZmQtuoRNstLVwwe10go1SCM8KuOyLb49o5d1JvAkBny1R4HqdwsHrLVqqwBVEwvZE5ckbY/8DHOJmSwb++0plAsBwhOpsApjvBSx/b+WrUzM2UCxPy6on8fzXuqDNk/fwkLZqKHWZxFEFPNWGKBeLvMhNIcLIBQPdJI28uFIU/1TtAPrz6IVefvLusauv6NlgQ1gW/sFZVCCrVXDIYWqg36ypKODhvTYaE4a2Kb6S1dN1CceWDXyL1G3xWdo8/aVH3mYU1ErE00HYpqGKCSjReR1I0wOMWeEJj49fKx7cs8u1nSNKzMvrs7MZ+Xm0EEA3H3+G+srvaJp8Q4ZgU/irgJCQZ9kyNG7OJbaVvatVtnBdLQPYbu+toglIYdkFRitbFukiw4PeS6RU8tqOz9jKPevWHr0GpBklj+sVay4+NaCdeX0MReJXHjkGxqcrmCs+4uFW6R+v4R4bBhcUiOSZK07dhtwjzYCM12+iaeDvUE+i7+NYH+oVbxGxjvZ0EQQC13DoNEMp9EnA6Ot+OTLj2SK/wY6ht7ow10wxAAHZP4/GVCleO1aeQp2eGaKPAsWwP98OtJYKddzMnwlv6QHmCGurYmGASTX/6/n9IPvV4539S1oLmTCWfxoQxBpdVfs0XABlyjoVQnIF/hrvKk9R8V0BvAZdbBBdDVHlYG6anT5ml3X6mBqtp/s1Xk9vNWJPtzdmo3JzRD/riHFWsFmwdujQa2jqn6Zr8p/Gm/6nc+4RApjefShgujkkQDAELfD8G27Z08mBMGVUAvqLcoor1shmeSMapqbGwppIfoUnkeAmeB+fzHW5t+7tKgLupJKYUsNkQrtzBAfbrbV/unI27/zu5yy0QBB6ypZtOtaps0icbbnAX0N4zTVrsdA2kpt7+1MjjPdxRuTZznKwPIHyc8R5feeMt/JYW1I3fcna2UzKgVCrqxbT6NLcrAdr+Zo+yzXuJbc9QgZKw7JMii27mpO6ZEhaC+11HMK51IydlWHuqF1UPK8siYlCP9AiTYL7YLwCJkHpqkGnox1jjWbSVkZ9MKT42oPGr8qhATk4JsKxmmlmgRP7sSXe02lnw5JOMTGol7zxkrz1msmh7aw/cw1qqrXVSxb8bK0dC0usOvwCPF4xn7zpTjlPYwgDRxptCrnJHRuv6J0L5J2BQl7BNzzb4vquocukncf/3PCmlrBXclHMlJjhQX0ZfHoUuCoPvkzelN4wyR56zdCVXBSKp6RZv7wXI/ylJU2G1BL5XIrPv9DFZFriyFhacrwK6y1ZcxafTEggcWRsKOGGCwCvem5qQmLKza22NikXbrlksK4ng/Vtl3oUF+BEQpiRUDAxk82emqqVpoh8piXEW1qyNktLkTyrJpkttITcIDdW0BIjD2iJTAEZ5zVKxv+V45p5q90mqqlwpJKKI6tO8nyyVVRR0aaCiqfi/n19t1Ay8RHpFS6xgWyJUVgom0Kw39I8X5jbt+Hgdnzrm+rQgCzLoUkpgG9mRIErnPpCvrPsKuWeq5OMzeexuvg6SAF5Wf97z+btEtcUX4dx05viufc/8QTpqlYJX9EqvZG/BPXNjSQu4UfUErv07rjm9bqQJv/J+6kPdvznJzBWsVpCEi/OTK1UpzkPSIZyUoMEJCgJXbUjHrpDQEmYsCUn/2ygL4nKLz40LN3yGEUx5M6f2mrdl9oSOC54xVOfm8ZgKSwA1fRJDgMLOTypiGiE+fniW6x6/MYXd0uNv+R58Vl2vifhXTLzlvWD1zw5BVYKXmcv4cJ7ILQO8Hrs3UIJwct/r9tNaNb1XY/R/em8OutDOP2ihldGX0pdFEyD3xRtVBR4SYL10fjM3npkhmldtIo0Sx00m7kJ3t3L1K2I8n4NR6jjiWpl6NoYxXHdb7/d/nI2a2p+hadt5yDGU1KCDuFAfsBNSQR+lBL084xUBHwtfe83yFtqcWYjeu3W9fIt5CeRtv64yRfeT9Kb+RH587WVPVDt/P/5vf+au2Wl5If9XPV/cqm7jzxxfYNBjMrQd1DUkG3kMpRd8apUyrMz4onxe9T21Sys8eDslvkz24SkeFXi+94LgKcIwoHOQYCKXYYNY0l+Db0QCKA9OHIt0c+XSAARemLQBL3R6k+4eD2KAyDDx/1DkXwEimIhg1i98HQ1QO6980TrjD4o/Wr6LvCBfu/71WPfLjJe+Km6Z48JwoV1RVoUvmJqdY3jSXqtFZdopgNClK2xXJ4aK1EzFogq/bCYQ9Q69gOfxiIQ45EHr2pzNa344a62ig97NIf3E0AHYgTwYSbj53JbNZlMJ05RtsZO89TYWeh6m7zRfwjTSuFOwo1YT8xkdpwZkUkAOhOuR48qGp9FiTPccMpbAruOOTMaPyd2sAJBH8KtJHYbxc1mKWfpCU4OkUrFHP65AfBlMGYGFgB+Vig+HVuFgUuyDsXqykp0NcA/LYBuhJHZcVyDgYARyb+RW4HRTDKlXp18/dIaz+saDL4VkjzQK4OpmMM/DgBm1YgkyfLGyFdsG5nM1KuVAbDM/pAx2DJGL1LNJQZeDpI8Ppdx8cMMiYZw1G5/oinis+WjAZPC8MF6OOWTSaiHBls+dV1Tz8VyV7/gX0p5V3ug/UzyaDRLRohXCOeztnqU4N4U1xrnz1WTfCoZ+PKkILPrjL/O+DCAcHYSP346F88bISCSkQ1hb1MS5d7EbTWb5teoAqrGaqWThRih8Vr5ZAT616PV4MSgZytJIFm8nwrJHurm7qGD9YiQEjdGHuFw4YWbiH/hk2cAvRR7CM2Pyl2jdPaZSFdrplvx38Xyv433X9qacVKe+FS3cLhZdiwT8kZr/lHDJmo6/Xdgsnf3HKrv5TrW2DcQ6HjTGDEYF3eBNnp8m72Aqnnay0m1AwMTK+iHlSPsjI3rl/fCe9Sxl5Qab2DXBR92RtgJD03xuUjZS0olZKxWIE7L5BT66raAyhj2qKGkVBvw4sPEiQm4svOHvXlf6PrLXXGPLS3VjrPqjIUnGZFx0QzQGDaB9seA5wlmHvOVf/MJNswt608OnVYaZpr0F4Ksi3nz0J4BwhDsNYe/pGDjD1aHcThZ+FlseR9soD8GECxnHucmg3llyCfJegIt7VJG4ZEW9AnrxcimaDw5SF8JwTfq5eUl8vPzvGrgko/MwXWLZFMG2Nx9+ez52LgvAgYLN0+yWW+6E8afLJwZeBqjSJyJnR0nGxU7YsLJuP4ZxbOLtVmubFZ6DF1yb8Fm/fEXz5+sN6Lx65dEBpE48CbrXzy7eGbc2FiBSTh3dn3rXxyIMX6jFU9mR9zEk9nZyez6ZxeIs5PZESvCRSKcIB6EAnCzUeP7zGt3T15iz0nzBvH65c8oiD9oitc5fwCiYKdckb4GrsvBj84uY0bW/UZDlHa7lvhobX71sm5CLWL+agp+ttXae0RQtPmpJIXHJsfFuK2FIdD5p/7u0aUDs2WjaksB+zXVVDDQF/IPq0Hbmpg5nTKeHmLkD1Z99+eKb15v0/J0ja2nqw+fsgyZPrSB+3XB3lGdokF03+m73NHf1GsO8wmrqJZIXxInIthXeJE3w/on/MDAkPMT1lJ0k/brNPAHvQI9EIAWNBCGxAOZfU5Dl+La065DgfQzuA6uyuKcDpypbVSJn9NicWVFXDns437nXd/2X5KGFgkuf+fEfBqxyL/V75bz0SEGepF9avq49DB7PEj9HFPU2bDnlw/wz2k4dd/c00urFQfMH3cDyenwIbBeHm67NRnBTdaTxIkwJ1cVG7PebKDcd1awObq9UG+UpixzyTFpSiSZUp+FR5BtoM53TtAZgd34m4+wskAgMJB7/sJK2garcqcl0l1IfG95CU4uRWIs9iLjI3NyO5Ivoxr2uWCuSRaSogn8QBTohDy92buTrvVJsUHpX6Js9ih1VcrCTaGWED7tyQuPaZZyZTYeh0HFMio0gwOT47VLDP6MzXlnozyq3G59xd8cgCrtFldd9iygYFf1sHBh5mlDi654BAAsVLjHdwXIu+McGd4ph3pTrb9xvD3eh99jXWEXoz7sv29H5F72PLZL+3B/c0w6xBcwrwXXu/Rpp3yDMwUqwmm9GuIlGSStiPpe++p4o2DMtB2m3EyVm1Cb7dkpSIXzgtcSS+4o5P7+GQAwitX0jtJeJWQlrZJRaw8bc45A3w5/LdWrE5tOPqvD/hkWNrqFpI4ZumbWK81mj8n6kAblsZdWZcstCe9S9ijrMRWgWyXsjATHd3KS8m+5U3xQRckv8q1DipyNnOmat39jk6K6QnxHS7BXA5PhwSQ8IxjEFQJTSVw8ER68UVXMAGTQVxarV3xWNABAJ8qpybbmLBwUeaFoMh5lYNJmt4ILVoR++2VcCVLdhujmZNciNIoJTolBU7yb4zH6euMaq2/jDD57w9VnZK7rPCff41BnXAlNo+61oMbo2oX8vXh+c6jE+q2Kg2MK1q8XbvmrNLkyLsV1YS9/1cboWa5aI1CwKIYr9P0YboSPPLaxdMn18SpJPNeZmOL7XEi1d0F/8p9OLh8Ef3oIxpL0TYqugwVmLSU8nVaTfhnr/v6rzU+FKpsnAt7MX+fUkWkgdVn5LAsMLuXbi7fCeE0mCrGL7AvsUjUuedFettqwUN7LsS1/FVNSeYkq3ccwT0XL4YyHwqtFM2+q7ZThtnAQPHFeDtz4/spdD69urWVD30lMB2hHDk6wKOfYUbZUpCzP+FfD0zpHx1DSXqlQBVAnXzlRZcIdi1BOhinJr3LJ4+zTlrm0RVFW7S4U4jsqQ6MN9q5r3It8JjD852BQjYDfwP0JQXcLfx6zDizfNQb8WWLfnaTJkdp2ITGM7THCayCKL/UQnMy1SfEOItpoPC3SNlu8Xn5fhHtPOFnkWKJamqwqWU6rh6SYhzq4DSuMg63q3C3MiykHIO0ibFjRgTeQ/R4maIuZO7wPh5ZlukSxGeLojCvm/o0d7bnKXfRANjVprJbgdaPVTqFM4O8tucwdWueVn/rWtc2NBQUpYZ2/y50XlhtADr3OtOyG5KFVatoPiOlMmY5DtLIpN5enZEgrRnugB1albiFLYvuu5ERxog9B7nwVUxQQgMp4oR9C6Jx61A3DP5lLLyVujYn3kYGGRLKhMs89K6qCLATx32hRSxfHTB6Dc+PieJe34GxcnLrzPJyDi0tP7oabwcWFyE1xc5h3PkVfgncpzs8fubsWoh/mEgFMa2V106ea8uhOGCPM+yj8Lk7cewxbsrgQV2EDvQut90litW/gx679bklBfIckdXdKSg7d7O817E656D5fLoEC6b7ZwiFKKPECeEEpSljkPPZIRfeZBXSVmvLt7gINAFCtcARfZlJcrzcGR+WoMnAzU+qNs0u0zdubAe1OtWFv6XB2r9rttKZByV3RJbvl9BQkVLIg4voH1aWQyWMoGZfCXd5C6XApdud5lAuXck/uRk3hUiZyU2qAp8PybvGXO1e9+Wu7h5Wrt7C+PZxVntgGx2DkBJ5PYRVvKRT3MyBqxg0WFWbMTq0rrtxLOEPXN+Ozfu0J8FncT/Bl8mfxwxOfAA9kULehrfjBqPxjuq4ttrdW7gtXxv6oPJVsb1GsGsiQd61xtTuW9mZ18xAeruGvf8/gds383xJ1Y8+/AoDVDk31Dfe+oNKwIFVZgUCwfRPMYQMo7DohAIC3QNCpeIgxQARY+Kd2QJxT3qHaZoN93brYOTY4dAv5QFCsKehmOaCuKP9rzoAak7y+faSvaXyd87VH7mAMXxTvGl8tq4RGHeiKO+PHIA0KFdGaXgoRCPqCS45hCF5sE3aFTHl9LYPDUd6ZzMdpsNzuc/vbIG3Hrj2OU7y+3vIDTHm52ewjKO9wV20AwNyYSbReGfwEMLJg3ogNgS/+EJijaAVyKm/PEn1uJ/dmBfUPhmvlLxa+d1dz13QVDXOM6YUKZuelH7HiOSGke50ij/JwN7xXJ4QLbiOlCttJuhPEhRKxi9cnT7J4AbqmZ1T4BBGrEojjtQVw0b1gEQiJv+46D5nJ99W64OYSQnyH8tXX2ZrL372Gt/q73qroDzAePRuzHq1kq5jeCUu8HX0B2VLio0nTNZdWdxPFz/AnPfG5tuS6G/SNXQg8hSPwCoLsoQZxQdDO0IJsIOhuyENuMZiy2F0Jg0FJ7cEQq/l+E0C2vz0Y9ybi6VwM/vKHwNX6r70RS7fC7fuvIzkUmjdZR+K50SPxtIrenOKa+hpwx1Jrnxz8kE33Z4ESA781TA7dbS8Gyfn1v+MypUAuADs7udmS2g/LfNStN5LAw2sIGEmf5btBzxViIDe43T310IBavX6njvy9hC0e7ggA0lmwvXqv12BnLkd9gtanqO/x3Sm2hxBXs6jtDTBfA3xnNp/1UjPiaSbpV4+8nzGF9MBS+RjUYGy8oMc/o5NNEwdS+eW94K6D9WKfvYy35c4lvA9t6Na1quTyr1L5lByJ0FK+qzyfOFC+QrsKocIJupS8N0q+4xV/mB8frV3cnaIEEUCd4rQphO4g7e6ShfpKHhXvXhV2VgQi0k52uJkJJ+SudwQAU+o6tb/XOxi0+7c40gGeK33zGXH0eZXevLUzsMST7EhPdsh6fQNcD+Aox2V4nuOFPXaeU+8BNAAgJ3GUCy4IzmU1DQju3uLGPH91HkwnPBU+kyzBgPYeC2RzEk16k+4U76YuVVNBRDSZmdLSU5frSXDETvLRWEg7GmgTv8HG7ffKUVak16E/nNnGmGkaH3r9nfiDsTPmkrMVbFAEm1lKA0Y7KTNM+DDfWAKthkXnw2ORXZ6cv2HAcwdwUsx5OQNOfEjJmUptd8uPwlpjOrtnf542g40ssVqR2vZI4tteNovnWNwW8XR33hYp6+4T5vjgrzO1QhMS17kzAietQq4CLiAyN2Cy1j9cWFXLtzb5S3B4KJH9Q6wa/LW2/VhAGmUHfnqAf36mo7Jlk0wkSkT2trSovmB+AgoVq++0kZgny3zqBi1TgqwchU0uRZIkAI+6JoVrrR7sj8qoSUp0KYnlFRIEJTPNnbvL+RrVYiX2d7V9zzLwA6rt73qHfhaQn23zdsYtyZrQX7/N/JfNH3H3ZyDjRtV0Rv8+FcC9aY9bEaTrb+jP5x/kpb6sAIqdH2zymT8CvP5+a2CHOcm5L1avKiU9cmsNKPMbWBaGf7Cr2Lg4icb1RMUPW7DVorAlmq8lWzQM/zGobpczLq/lSBQ0VIjaDA+qUTUXiJvmFBLVTmSrgukMlKnQ4bm6DlI5B8EAALVRMhMoDldKk7FAdaFWxz9sMCSH2ymvKduD/XmtgfZCD3tbZHtL70470PRO8DLMXuB0q5A9gjMQmfOBWxKXOwPbGfJcNXzLhQLGQh2jSepiEGvQ3HH9Gp3/wpfunBwHt1FT3Ze/UIna4xQsiTjGxEyzaTV3oWJveMgVIS06JHStqVZ5C0Xm4YHvzPF8RhuaPjzoR1s8UafFRAPmgTiGWOpUeSfa1rDdlWfjCBkPf7hdCLsz1BMlpmFw6Drh5Hps5O5VQfFSNZHs7KQ1ZFckcq0nn8qZNk9P8c3vTYaeIvM6Ci9dIlrXL24728ZviWTv6oaBd3P+j1tqAkgVRrjus1FeZDImMO+hqqe/4+LDlvbmPFR8UP8oUBSN8HSHKop1zXSoSlmP8xyAXt8TItoujWu2pDRUpXRnHATWY5MDtsf7dzlg7THqlJqVmiY7HotJhVAKvJDQDXog+5MGdjsgYU0DJww2bA5wo8GFPQRuM+Sx1+C4wL4Kth9BXt/RtnrPwsLr+Chs9PT0LPr3UKI+C6rZyvtax0f379leTAT1Kn9D9y6719V99E+vjfSjG14KRxQlspH6sjvozCGJSv+uSD/e4cWJVNDNQFfIvnJQMIdbzeM+zGn7kjplCLoZdcIAGLgzooSJ2RCcr2GEZIM9HAfCmPsQC0ve6vBvYEs8H969i/7u9bdjQqcCYIhDtc2eMIKlBy5W8t/du9fft0wYz77D8vJ8TBuSPfuK1sdT6fSaSKl+4OqKnDjo5AWmzu5zK7yNjuVQLxzQXueJpwxSgf76igBHANXm02whdA2pdpYUCzbKHhI676p9LNw988TQsiodAcActCj43FBmxxEY3k19+rxifUnLiAvlTfwaH0cNLFHkuB8HKEbiikf2XAnPn1HQs/ogGADwHJqz9Shv5oarvKUn+mIlevLsC8UusdksYIXXPfK6/zoNh0wEh/qsym8/+r4zwiuNzn2FvERDnuYrdWOnQY7P7cKldFzDXZCy7EQLppcLponW/Nz0Va6VGnU/g9XGJMH2KtarAVrScJABMh49ycQjH7t7iE6eHfPIWSzbpEDkUs5i1hIY9+pNLFUJiy3KPIal5svbmdmafX08s9lHuFh6F78D/t3utXPrD7wVdf6P7MD/riLluB3/th5v2kql5yc/ugLg4Gf0skL94MfwNCi1MyPSMHp5LkxXD6sz6uSuonwvt5I2aj7F5m4AAMAhCoWnMUQTJdgqkCjOfCRebJ9P5UEWds9uMAAALQvUrrPyRbueVnRWcUcQ7XjzmsC0YP86SlBL9u4AARVql0iQYYQgFgWZbYmxK8gW3khTIy02eSPNVLhgu4s/M3Ym1PF4MfYyiPVscct3eS/ryouiljDlpT/T3lVScwdd48abjiLmWnsYIQA4bqBjVXh49mKckurfLJQeP/CjgFNtgpsbKhYZaAscjpfdwCWB7sGB6Nrhj4uGOM2hXsVimujLnDfavZCOqsOk9uTl6Qpqu9TDg+H04AAAo9LklAHmqsNLvCHhFRZEgVdvMzlXoI2SSNY7zQCAHeLF7Gdjj6KVIlssL5mM/qWw4LV86F0FHOWPaYB494/SBFh50E9RGKpPj6SOlFpnkyGl27lMY2jMBzrI0ljkfd9xx+mtilhVXpE9BNOh1NGRpONSwWdDKvUDRjChI6GDzkoDPrrAe8utrMnehDyq7i4fMlfV1t+pKpagVel1G5zdP/fzt7oe7vxuzkMxyW55KulF/dUX19ZnR5b6f657hkizAmkzKPMl90ajDiRyQ7BDAmk9pl2pzDd4GnR9TCRtUrRHL/G/udPfVoO33RsIe9hnurPAKRqYQHryVVsRydorGRaGFi87K3EaT2hKjByB5sm9c1BIjVUkXM6vD7vKo1ubg4dXdeWv5QHrK3oeAbQ3gDSFUApS7SwpFtcIenwvaNH5jKoe1DePJdFy6yYBwA50VT76oPFu6GJ4vxCu6Bn8fHYD8sX7CrruvUHVtO/pZt4sFUxzMUCRbnByYQDAQVsiNugV8Ou+rUeD3xsTns+9+a9evbUrL/sAo7HTGQMZdy1l1vGu4zkQ73HBEzAZfr6d5zYWbmE3GACwUfGIXXC1GpFaxhqEcDijt7M7ZnrVnTcQMY4fm3OskCCTrp3FxYK9MwpBUADUpxpiUFdQ32BoQSNQ3zpcQPMw6GOoA2owQF24DOaYDlSk/H73wvtWZEO8S9ooUdHK9azI0MosnAsAAJyAjuwIBTCnBEUCaSrmbADOKHTFoBo9YQCAa4HpclfLfuG3jlbWLgRwBQ8qTv488UASHnZ3AzR8OyahK1focmBDWZ0GmWLPBrxgriGRmbrcCMScxGWaUM4TLkxrZaZjtTN0Wjib6W0dOxxuiZAoWMJmIfaGS5GZG5hvl8YmZYC0otIutU1lmYs+p/e79NGCJe2A7Ur+Nv02S64ftPKac0p7uZHmbqO3krKHmghN0tn+OeRfIFrQ794aEN4ufnh7kOSzCvxx3sb/nUz0gSff9I7UVSuYDJ6CxKFFbJM+DdcRkuUjWWdpWXhAKIjz9WD+qtY2STGHyl8X1lK67BXZk+HPuwd5tof61C2PikJ6ScO98JLvNNC3RuSlKXIcnQNcVQ8OAHDV4KHdCxY8gBXiiDW82oYAgGezkzEwBbzTDACgSezOniyTywZj6QbH6ZR8f2xg0rcedK6goNcbowrAwUXkFDQCZH/SIldFkbhvGeaGrgw1RgS6a2gxqyB3K1wwmytjAurIRt4LpCZ1sC3QwQXjFceqg4IgdRNSo/cVtYhRa1VPT4GduaT2HvkWQZsUgrVaSh2aTa2FfNwbtyj8OwEAYMvXJhZcymvlDf1lo06+pZNNynFCKwrmW56zLodr6Y4XA+O+S0yfPTZIum0NbHhRHldtRWa8VzoxZG/vsd4FK9QYhmfuBMLbf1PfHK6/BsVosuCIcj9DcDknnVuxGXTtbOejuUGYufNTFstbX9HzCKDNAMQRQZZFrJ3FxcIF0QN1ne366gwq4s5GhZDnnz4CgFRYuK58nIVOu2GO4b0uqJdteve3b4L9bJatETXoDSiVaN367JJZ77jgSOSgAqa5hT7jYwMLR3tfg9HGJE1uoxevmIRlq6JpA3jhdPcbN0uCDl53fN96RSXpSlqdANPjWRoUeJhWZ2xlb+Gpom+Lqx02bWq0Sdj9LtizdQvPs2C6quqSnsngSvMnaaX8VgTF7lVxLgj3pYEv8vKvdvB4Y53ZLbWz9ToMn5g7o3uPZB7Nt9XHj+/KJv3VyT5xp/hkF6mpY7Jtu42wa7QgblKJcDzRPHoLyCtmE6fSkc1lhZQMNu5c5ETZFgtBpRIholtkgIBoiwtYzNGBFAM7pJxiO4ZScBUzLKbjbbPcm24Mfn1Vre81vo/04q1/evLmWYuvdgIAAEdQDbczAQUzwb3icGZnlFPMIwAy+LkVcSozyc75YADAaibaVfDXLPhqZXKhMGsvNVyJ/kCUypkOPUOJuovdRyx27qShg4u/nPxeaKZSLAQK+QeaBkVm2NC0LS5DQdMZzTC0XsrhOw4v5bFaL7ATvcTaNVHVoRTTEArrN4pAKk1/QACQNZiiPtw0tLUT9i/dYNLCclpQGbEYG3S3HM8dKEvpjgSlmsNfiGCCXqk3zXRvgTe/1b0YvRf4R7tK5/J1xXVdByRqXdW5OACAibICQy7R1oeSrudx2mwZ0AYMKesUiY88ewckts8MABALDPYDGF+JH8/Fab/dkOK4Q5OSt8e2BxWdBzx1/l2DmOnWUgbgJrW84pvOmDUg94UUHphe2d8aEE1FoiKIidhoGmStuLgGJEoxuI/UWHU0GFJLOnh0wNIPmJQG083SQRRBIZeWKGBut3qufxdF9aLQFVQ4Vb6og0mnr+8jALgssGP22J1mhbh1l8ttMCcZXWLSwJh3XpRMgFnul6klcHfDVFgFbHkw2q4BVjfcb7uBOXgrrq77GD1a15f+ShVuToHoCkLzB9ZX/EICaPQAyYWQF1LvLGkW0yx7KOiys6Kg9myUipaqfgQAS+gqeMz1QovGXkG6I+RzxJ+jKaXncmJpXeOzRESb2mccu2cB0iKHCBgOPx+7nMnCGewGAwDm9INcNaXWr6JFc8VxijhXWe+byEn+npWrn5X7atepuFpar6OFrGp21syh2PmV7Cr9erfffvz9N+5HRnmNvw/K43a6fKgIrdGD7WZypj6/qhzkseB2+8EAgCvJAuz5CzgLeMniskNqF5iRP2+X4DY87GcLlvDu3AxoSoVkDvSNixldWBjCucza4Z0QSTFgDoM11A6rMNisjmWB8jUN+Errr/XyEfrFzj6lhpStKGp/knaHQMgHTwwrUjLOkbAy6Ig0R8K+UFAEHItty98EzNiVOxXjFEfPkYS7wgCAIdHRu+AKgPNWnLqVUqo2/rywQUMdYVODc9H6XGDJuzPwOsnwlzVogYUMhJMSmZljPlFJXJYNxlAMK4KbCna23OBOAtqtIYacunR4xJM+gDu/iMVW5Ye0ME9//11/BypePT6lBqvab4Q2aaH6AwIAeMGeMERxoGlJcxtVuDBVS9f8PmNxryW4c/1TJC/BrdueYvl7iApcxXhBSmihK854TsV1mXgNW7sgUbWAHvlZWonsiAPKMOPhtJOmND8+4Zj6QKs0wb58XWFrR6BXfScAQO/wtOqZLn17xKk8C+5l7MJEUI8u1A6QnK4eLSBFZ1sFarvPDADwEpxtT9s1gE7pMZYAur1/LoLc86F7DKjOG+MbwOFFNG5oKy37C4+bMhMnIPHuCictNueAcxGXOwNbGy6kajCpTmgUtDEpIggOOGCICycmGMxFuCqefpXaNcPYMuaZ799rbcNDOHBfQYsQUK15IIy4/u4KXOmymloQOY6g6+XJmndKsbtTAAAwO3KyzQuZhnhNW5DNNbygLAzRvsToGmMcvSieAsYb+PtIygu9Lf011DL/y/3yra/xYLMXAMRNYYBQ8ZysST2Fs/oQ5jIgbd06CPFqOXyBZNPBcEXJI8fBRw3jW/glJxbJr3JYSwPqxV6hDYh2MoS1UFfkw2Y+ytu68DxvMSp5yPNWmqXzwQCA6ChXaxu0ejMfZ+qqGA51ejm9IOm9boD/43T5ernGQo18bsdHfOhuOoPd53YCsAkuOMZcoZvoQ2uL5GpXGABwzfExJX+BdEAiFjdJtgxYu0PvMvYejPf82CqyQppcUzOofNHoGWYP5sSFQQjZNYaLIxYyxLAnECstLkR3SEfEGioGAstnJ0NsA9+DFE2Lgo1I0ac65gs/YEUNP/hZpcOB8wM/4yExLgMBQ9wEsZSHJeRYxhRvFBTD9ZOPPyjzW5ZdUKNx2zNJLzcT59qFGckSbnoVprbVmUJwLAx6W3A1Ew0+CCc/fhZrY2YUdl4Jhy0XkGALffr1UAtzc04YADD6ga5qqXU3qm5ayUzLAGY5nKssrOPap+68KVF942HvDMdNjzpt5kRVA7znLXi0oc633PMHRehWEqn+oO7LJMz6ub1Gt/hCvU8/T7lUSeTvAlV1KfISjBdBibmn2qqYZ+Sp+JWy71RwZ2Qx7bR8YRFkWxZoC8ljFk2BttJ5y8IQaGtYXFhEYsNiuwC0GnizdrgtxK5OgvA4FEc3FRyRFFEV+HdqRJyWskqguQxjnPgxGkm8Ok3t6e6fS+gYze0JeRtOkyPeJGoMdFn1T07Q9Xh/OwV8OYXbEYvGpC8M7KIgN5u9wM1oXSCDmwuKEwHMTp/ahpmR4qmltJ89tp7axRHyNvKHD99KhHtDRcYxemQ/M//vg674N+w4fmT3epx/Q8IOv2bop/jklyY3BuBzexp9f7FOtrF0Xn4P+Nu6BrN/FTCTPJTPokrSqonhJ/bz2PfE17avC78vBpJmKeLYfviJfqHUzOLsZriG/3BIrean6dm2P3vVp3cxHf8M3rbkNpwbHlpz8IPefnRRBl69Qvfy4vT2ihd/m6HjFunvlwWttut83QC4nh0AAIRRV6OMezEHxBdwmrDwrBMMS1dvHbGLaadIrJ1mAEBEulJH2xgEycdmQEGdfxNQgRc9WqKFnGeKppABVyHMhbQQqPADigHso6r32dH3+eyIPvd8WAGmWJUuhzvUVgTfhdlVyaR0HycJF+lPSdrdhFDQIy5Rjx4MMUDAEGFXqTgfUJg79YafwrrzHNQSevKPn6Wk7epvTWSGwYnXAqs4ygVzXgjlBDpADgMalxYPwLBUz7qBbe6rLA6wNWFGF0GDq093w0UOLAAAXWOa+/23G9widGy4oa7MPtkUII61x6hYkLc9hpI6QMHWfhVvWVbVxHWX3e3CLNFSFBCzjMU+Gcyx24+RNm89ap/NvBHwHvMHZVfEmqrRwP0MOAzxM3GXenykpuX5Rqyi0V2lDgYAHGR0rRXrZ4i2tQQ=","base64")).toString()),sH}var Mde=new Map([[W.makeIdent(null,"fsevents").identHash,Rde],[W.makeIdent(null,"resolve").identHash,Nde],[W.makeIdent(null,"typescript").identHash,Lde]]),Fgt={hooks:{registerPackageExtensions:async(t,e)=>{for(let[r,o]of rH)e(W.parseDescriptor(r,!0),o)},getBuiltinPatch:async(t,e)=>{let r="compat/";if(!e.startsWith(r))return;let o=W.parseIdent(e.slice(r.length)),a=Mde.get(o.identHash)?.();return typeof a<"u"?a:null},reduceDependency:async(t,e,r,o)=>typeof Mde.get(t.identHash)>"u"?t:W.makeDescriptor(t,W.makeRange({protocol:"patch:",source:W.stringifyDescriptor(t),selector:`optional!builtin`,params:null}))}},Tgt=Fgt;var BH={};Kt(BH,{ConstraintsCheckCommand:()=>p0,ConstraintsQueryCommand:()=>A0,ConstraintsSourceCommand:()=>f0,default:()=>odt});Ye();Ye();B2();var wC=class{constructor(e){this.project=e}createEnvironment(){let e=new CC(["cwd","ident"]),r=new CC(["workspace","type","ident"]),o=new CC(["ident"]),a={manifestUpdates:new Map,reportedErrors:new Map},n=new Map,u=new Map;for(let A of this.project.storedPackages.values()){let p=Array.from(A.peerDependencies.values(),h=>[W.stringifyIdent(h),h.range]);n.set(A.locatorHash,{workspace:null,ident:W.stringifyIdent(A),version:A.version,dependencies:new Map,peerDependencies:new Map(p.filter(([h])=>A.peerDependenciesMeta.get(h)?.optional!==!0)),optionalPeerDependencies:new Map(p.filter(([h])=>A.peerDependenciesMeta.get(h)?.optional===!0))})}for(let A of this.project.storedPackages.values()){let p=n.get(A.locatorHash);p.dependencies=new Map(Array.from(A.dependencies.values(),h=>{let E=this.project.storedResolutions.get(h.descriptorHash);if(typeof E>"u")throw new Error("Assertion failed: The resolution should have been registered");let I=n.get(E);if(typeof I>"u")throw new Error("Assertion failed: The package should have been registered");return[W.stringifyIdent(h),I]})),p.dependencies.delete(p.ident)}for(let A of this.project.workspaces){let p=W.stringifyIdent(A.anchoredLocator),h=A.manifest.exportTo({}),E=n.get(A.anchoredLocator.locatorHash);if(typeof E>"u")throw new Error("Assertion failed: The package should have been registered");let I=(T,L,{caller:U=Ji.getCaller()}={})=>{let J=I2(T),te=je.getMapWithDefault(a.manifestUpdates,A.cwd),le=je.getMapWithDefault(te,J),pe=je.getSetWithDefault(le,L);U!==null&&pe.add(U)},v=T=>I(T,void 0,{caller:Ji.getCaller()}),b=T=>{je.getArrayWithDefault(a.reportedErrors,A.cwd).push(T)},C=e.insert({cwd:A.relativeCwd,ident:p,manifest:h,pkg:E,set:I,unset:v,error:b});u.set(A,C);for(let T of Mt.allDependencies)for(let L of A.manifest[T].values()){let U=W.stringifyIdent(L),J=()=>{I([T,U],void 0,{caller:Ji.getCaller()})},te=pe=>{I([T,U],pe,{caller:Ji.getCaller()})},le=null;if(T!=="peerDependencies"&&(T!=="dependencies"||!A.manifest.devDependencies.has(L.identHash))){let pe=A.anchoredPackage.dependencies.get(L.identHash);if(pe){if(typeof pe>"u")throw new Error("Assertion failed: The dependency should have been registered");let Ae=this.project.storedResolutions.get(pe.descriptorHash);if(typeof Ae>"u")throw new Error("Assertion failed: The resolution should have been registered");let ye=n.get(Ae);if(typeof ye>"u")throw new Error("Assertion failed: The package should have been registered");le=ye}}r.insert({workspace:C,ident:U,range:L.range,type:T,resolution:le,update:te,delete:J,error:b})}}for(let A of this.project.storedPackages.values()){let p=this.project.tryWorkspaceByLocator(A);if(!p)continue;let h=u.get(p);if(typeof h>"u")throw new Error("Assertion failed: The workspace should have been registered");let E=n.get(A.locatorHash);if(typeof E>"u")throw new Error("Assertion failed: The package should have been registered");E.workspace=h}return{workspaces:e,dependencies:r,packages:o,result:a}}async process(){let e=this.createEnvironment(),r={Yarn:{workspace:a=>e.workspaces.find(a)[0]??null,workspaces:a=>e.workspaces.find(a),dependency:a=>e.dependencies.find(a)[0]??null,dependencies:a=>e.dependencies.find(a),package:a=>e.packages.find(a)[0]??null,packages:a=>e.packages.find(a)}},o=await this.project.loadUserConfig();return o?.constraints?(await o.constraints(r),e.result):null}};Ye();Ye();qt();var A0=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.query=ge.String()}async execute(){let{Constraints:r}=await Promise.resolve().then(()=>(x2(),S2)),o=await Ve.find(this.context.cwd,this.context.plugins),{project:a}=await St.find(o,this.context.cwd),n=await r.find(a),u=this.query;return u.endsWith(".")||(u=`${u}.`),(await Nt.start({configuration:o,json:this.json,stdout:this.context.stdout},async p=>{for await(let h of n.query(u)){let E=Array.from(Object.entries(h)),I=E.length,v=E.reduce((b,[C])=>Math.max(b,C.length),0);for(let b=0;b(x2(),S2)),o=await Ve.find(this.context.cwd,this.context.plugins),{project:a}=await St.find(o,this.context.cwd),n=await r.find(a);this.context.stdout.write(this.verbose?n.fullSource:n.source)}};f0.paths=[["constraints","source"]],f0.usage=nt.Usage({category:"Constraints-related commands",description:"print the source code for the constraints",details:"\n This command will print the Prolog source code used by the constraints engine. Adding the `-v,--verbose` flag will print the *full* source code, including the fact database automatically compiled from the workspace manifests.\n ",examples:[["Prints the source code","yarn constraints source"],["Print the source code and the fact database","yarn constraints source -v"]]});Ye();Ye();qt();B2();var p0=class extends ut{constructor(){super(...arguments);this.fix=ge.Boolean("--fix",!1,{description:"Attempt to automatically fix unambiguous issues, following a multi-pass process"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd);await o.restoreInstallState();let a=await o.loadUserConfig(),n;if(a?.constraints)n=new wC(o);else{let{Constraints:h}=await Promise.resolve().then(()=>(x2(),S2));n=await h.find(o)}let u,A=!1,p=!1;for(let h=this.fix?10:1;h>0;--h){let E=await n.process();if(!E)break;let{changedWorkspaces:I,remainingErrors:v}=mk(o,E,{fix:this.fix}),b=[];for(let[C,T]of I){let L=C.manifest.indent;C.manifest=new Mt,C.manifest.indent=L,C.manifest.load(T),b.push(C.persistManifest())}if(await Promise.all(b),!(I.size>0&&h>1)){u=Gde(v,{configuration:r}),A=!1,p=!0;for(let[,C]of v)for(let T of C)T.fixable?A=!0:p=!1}}if(u.children.length===0)return 0;if(A){let h=p?`Those errors can all be fixed by running ${de.pretty(r,"yarn constraints --fix",de.Type.CODE)}`:`Errors prefixed by '\u2699' can be fixed by running ${de.pretty(r,"yarn constraints --fix",de.Type.CODE)}`;await Nt.start({configuration:r,stdout:this.context.stdout,includeNames:!1,includeFooter:!1},async E=>{E.reportInfo(0,h),E.reportSeparator()})}return u.children=je.sortMap(u.children,h=>h.value[1]),$s.emitTree(u,{configuration:r,stdout:this.context.stdout,json:this.json,separators:1}),1}};p0.paths=[["constraints"]],p0.usage=nt.Usage({category:"Constraints-related commands",description:"check that the project constraints are met",details:` + This command will run constraints on your project and emit errors for each one that is found but isn't met. If any error is emitted the process will exit with a non-zero exit code. + + If the \`--fix\` flag is used, Yarn will attempt to automatically fix the issues the best it can, following a multi-pass process (with a maximum of 10 iterations). Some ambiguous patterns cannot be autofixed, in which case you'll have to manually specify the right resolution. + + For more information as to how to write constraints, please consult our dedicated page on our website: https://yarnpkg.com/features/constraints. + `,examples:[["Check that all constraints are satisfied","yarn constraints"],["Autofix all unmet constraints","yarn constraints --fix"]]});B2();var sdt={configuration:{enableConstraintsChecks:{description:"If true, constraints will run during installs",type:"BOOLEAN",default:!1},constraintsPath:{description:"The path of the constraints file.",type:"ABSOLUTE_PATH",default:"./constraints.pro"}},commands:[A0,f0,p0],hooks:{async validateProjectAfterInstall(t,{reportError:e}){if(!t.configuration.get("enableConstraintsChecks"))return;let r=await t.loadUserConfig(),o;if(r?.constraints)o=new wC(t);else{let{Constraints:u}=await Promise.resolve().then(()=>(x2(),S2));o=await u.find(t)}let a=await o.process();if(!a)return;let{remainingErrors:n}=mk(t,a);if(n.size!==0)if(t.configuration.isCI)for(let[u,A]of n)for(let p of A)e(84,`${de.pretty(t.configuration,u.anchoredLocator,de.Type.IDENT)}: ${p.text}`);else e(84,`Constraint check failed; run ${de.pretty(t.configuration,"yarn constraints",de.Type.CODE)} for more details`)}}},odt=sdt;var vH={};Kt(vH,{CreateCommand:()=>em,DlxCommand:()=>h0,default:()=>ldt});Ye();qt();var em=class extends ut{constructor(){super(...arguments);this.pkg=ge.String("-p,--package",{description:"The package to run the provided command from"});this.quiet=ge.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=ge.String();this.args=ge.Proxy()}async execute(){let r=[];this.pkg&&r.push("--package",this.pkg),this.quiet&&r.push("--quiet");let o=this.command.replace(/^(@[^@/]+)(@|$)/,"$1/create$2"),a=W.parseDescriptor(o),n=a.name.match(/^create(-|$)/)?a:a.scope?W.makeIdent(a.scope,`create-${a.name}`):W.makeIdent(null,`create-${a.name}`),u=W.stringifyIdent(n);return a.range!=="unknown"&&(u+=`@${a.range}`),this.cli.run(["dlx",...r,u,...this.args])}};em.paths=[["create"]];Ye();Ye();Pt();qt();var h0=class extends ut{constructor(){super(...arguments);this.packages=ge.Array("-p,--package",{description:"The package(s) to install before running the command"});this.quiet=ge.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=ge.String();this.args=ge.Proxy()}async execute(){return Ve.telemetry=null,await oe.mktempPromise(async r=>{let o=K.join(r,`dlx-${process.pid}`);await oe.mkdirPromise(o),await oe.writeFilePromise(K.join(o,"package.json"),`{} +`),await oe.writeFilePromise(K.join(o,"yarn.lock"),"");let a=K.join(o,".yarnrc.yml"),n=await Ve.findProjectCwd(this.context.cwd),A={enableGlobalCache:!(await Ve.find(this.context.cwd,null,{strict:!1})).get("enableGlobalCache"),enableTelemetry:!1,logFilters:[{code:Wu(68),level:de.LogLevel.Discard}]},p=n!==null?K.join(n,".yarnrc.yml"):null;p!==null&&oe.existsSync(p)?(await oe.copyFilePromise(p,a),await Ve.updateConfiguration(o,L=>{let U=je.toMerged(L,A);return Array.isArray(L.plugins)&&(U.plugins=L.plugins.map(J=>{let te=typeof J=="string"?J:J.path,le=ue.isAbsolute(te)?te:ue.resolve(ue.fromPortablePath(n),te);return typeof J=="string"?le:{path:le,spec:J.spec}})),U})):await oe.writeJsonPromise(a,A);let h=this.packages??[this.command],E=W.parseDescriptor(this.command).name,I=await this.cli.run(["add","--fixed","--",...h],{cwd:o,quiet:this.quiet});if(I!==0)return I;this.quiet||this.context.stdout.write(` +`);let v=await Ve.find(o,this.context.plugins),{project:b,workspace:C}=await St.find(v,o);if(C===null)throw new rr(b.cwd,o);await b.restoreInstallState();let T=await un.getWorkspaceAccessibleBinaries(C);return T.has(E)===!1&&T.size===1&&typeof this.packages>"u"&&(E=Array.from(T)[0][0]),await un.executeWorkspaceAccessibleBinary(C,E,this.args,{packageAccessibleBinaries:T,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};h0.paths=[["dlx"]],h0.usage=nt.Usage({description:"run a package in a temporary environment",details:"\n This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\n\n By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\n\n Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\n ",examples:[["Use create-react-app to create a new React app","yarn dlx create-react-app ./my-app"],["Install multiple packages for a single command",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e "console.log('hello!')"`]]});var adt={commands:[em,h0]},ldt=adt;var SH={};Kt(SH,{ExecFetcher:()=>k2,ExecResolver:()=>Q2,default:()=>Adt,execUtils:()=>wk});Ye();Ye();Pt();var fA="exec:";var wk={};Kt(wk,{loadGeneratorFile:()=>b2,makeLocator:()=>PH,makeSpec:()=>dme,parseSpec:()=>DH});Ye();Pt();function DH(t){let{params:e,selector:r}=W.parseRange(t),o=ue.toPortablePath(r);return{parentLocator:e&&typeof e.locator=="string"?W.parseLocator(e.locator):null,path:o}}function dme({parentLocator:t,path:e,generatorHash:r,protocol:o}){let a=t!==null?{locator:W.stringifyLocator(t)}:{},n=typeof r<"u"?{hash:r}:{};return W.makeRange({protocol:o,source:e,selector:e,params:{...n,...a}})}function PH(t,{parentLocator:e,path:r,generatorHash:o,protocol:a}){return W.makeLocator(t,dme({parentLocator:e,path:r,generatorHash:o,protocol:a}))}async function b2(t,e,r){let{parentLocator:o,path:a}=W.parseFileStyleRange(t,{protocol:e}),n=K.isAbsolute(a)?{packageFs:new gn(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await r.fetcher.fetch(o,r),u=n.localPath?{packageFs:new gn(Bt.root),prefixPath:K.relative(Bt.root,n.localPath)}:n;n!==u&&n.releaseFs&&n.releaseFs();let A=u.packageFs,p=K.join(u.prefixPath,a);return await A.readFilePromise(p,"utf8")}var k2=class{supports(e,r){return!!e.reference.startsWith(fA)}getLocalPath(e,r){let{parentLocator:o,path:a}=W.parseFileStyleRange(e.reference,{protocol:fA});if(K.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:K.resolve(n,a)}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:W.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:u}}async fetchFromDisk(e,r){let o=await b2(e.reference,fA,r);return oe.mktempPromise(async a=>{let n=K.join(a,"generator.js");return await oe.writeFilePromise(n,o),oe.mktempPromise(async u=>{if(await this.generatePackage(u,e,n,r),!oe.existsSync(K.join(u,"build")))throw new Error("The script should have generated a build directory");return await Xi.makeArchiveFromDirectory(K.join(u,"build"),{prefixPath:W.getIdentVendorPath(e),compressionLevel:r.project.configuration.get("compressionLevel")})})})}async generatePackage(e,r,o,a){return await oe.mktempPromise(async n=>{let u=await un.makeScriptEnv({project:a.project,binFolder:n}),A=K.join(e,"runtime.js");return await oe.mktempPromise(async p=>{let h=K.join(p,"buildfile.log"),E=K.join(e,"generator"),I=K.join(e,"build");await oe.mkdirPromise(E),await oe.mkdirPromise(I);let v={tempDir:ue.fromPortablePath(E),buildDir:ue.fromPortablePath(I),locator:W.stringifyLocator(r)};await oe.writeFilePromise(A,` + // Expose 'Module' as a global variable + Object.defineProperty(global, 'Module', { + get: () => require('module'), + configurable: true, + enumerable: false, + }); + + // Expose non-hidden built-in modules as global variables + for (const name of Module.builtinModules.filter((name) => name !== 'module' && !name.startsWith('_'))) { + Object.defineProperty(global, name, { + get: () => require(name), + configurable: true, + enumerable: false, + }); + } + + // Expose the 'execEnv' global variable + Object.defineProperty(global, 'execEnv', { + value: { + ...${JSON.stringify(v)}, + }, + enumerable: true, + }); + `);let b=u.NODE_OPTIONS||"",C=/\s*--require\s+\S*\.pnp\.c?js\s*/g;b=b.replace(C," ").trim(),u.NODE_OPTIONS=b;let{stdout:T,stderr:L}=a.project.configuration.getSubprocessStreams(h,{header:`# This file contains the result of Yarn generating a package (${W.stringifyLocator(r)}) +`,prefix:W.prettyLocator(a.project.configuration,r),report:a.report}),{code:U}=await Ur.pipevp(process.execPath,["--require",ue.fromPortablePath(A),ue.fromPortablePath(o),W.stringifyIdent(r)],{cwd:e,env:u,stdin:null,stdout:T,stderr:L});if(U!==0)throw oe.detachTemp(p),new Error(`Package generation failed (exit code ${U}, logs can be found here: ${de.pretty(a.project.configuration,h,de.Type.PATH)})`)})})}};Ye();Ye();var cdt=2,Q2=class{supportsDescriptor(e,r){return!!e.range.startsWith(fA)}supportsLocator(e,r){return!!e.reference.startsWith(fA)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return W.bindDescriptor(e,{locator:W.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=DH(e.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let u=await b2(W.makeRange({protocol:fA,source:a,selector:a,params:{locator:W.stringifyLocator(n)}}),fA,o.fetchOptions),A=wn.makeHash(`${cdt}`,u).slice(0,6);return[PH(e,{parentLocator:n,path:a,generatorHash:A,protocol:fA})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await je.releaseAfterUseAsync(async()=>await Mt.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var udt={fetchers:[k2],resolvers:[Q2]},Adt=udt;var bH={};Kt(bH,{FileFetcher:()=>N2,FileResolver:()=>L2,TarballFileFetcher:()=>M2,TarballFileResolver:()=>O2,default:()=>hdt,fileUtils:()=>tm});Ye();Pt();var DC=/^(?:[a-zA-Z]:[\\/]|\.{0,2}\/)/,F2=/^[^?]*\.(?:tar\.gz|tgz)(?:::.*)?$/,Ui="file:";var tm={};Kt(tm,{fetchArchiveFromLocator:()=>R2,makeArchiveFromLocator:()=>Ik,makeBufferFromLocator:()=>xH,makeLocator:()=>PC,makeSpec:()=>mme,parseSpec:()=>T2});Ye();Pt();function T2(t){let{params:e,selector:r}=W.parseRange(t),o=ue.toPortablePath(r);return{parentLocator:e&&typeof e.locator=="string"?W.parseLocator(e.locator):null,path:o}}function mme({parentLocator:t,path:e,hash:r,protocol:o}){let a=t!==null?{locator:W.stringifyLocator(t)}:{},n=typeof r<"u"?{hash:r}:{};return W.makeRange({protocol:o,source:e,selector:e,params:{...n,...a}})}function PC(t,{parentLocator:e,path:r,hash:o,protocol:a}){return W.makeLocator(t,mme({parentLocator:e,path:r,hash:o,protocol:a}))}async function R2(t,e){let{parentLocator:r,path:o}=W.parseFileStyleRange(t.reference,{protocol:Ui}),a=K.isAbsolute(o)?{packageFs:new gn(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await e.fetcher.fetch(r,e),n=a.localPath?{packageFs:new gn(Bt.root),prefixPath:K.relative(Bt.root,a.localPath)}:a;a!==n&&a.releaseFs&&a.releaseFs();let u=n.packageFs,A=K.join(n.prefixPath,o);return await je.releaseAfterUseAsync(async()=>await u.readFilePromise(A),n.releaseFs)}async function Ik(t,{protocol:e,fetchOptions:r,inMemory:o=!1}){let{parentLocator:a,path:n}=W.parseFileStyleRange(t.reference,{protocol:e}),u=K.isAbsolute(n)?{packageFs:new gn(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await r.fetcher.fetch(a,r),A=u.localPath?{packageFs:new gn(Bt.root),prefixPath:K.relative(Bt.root,u.localPath)}:u;u!==A&&u.releaseFs&&u.releaseFs();let p=A.packageFs,h=K.join(A.prefixPath,n);return await je.releaseAfterUseAsync(async()=>await Xi.makeArchiveFromDirectory(h,{baseFs:p,prefixPath:W.getIdentVendorPath(t),compressionLevel:r.project.configuration.get("compressionLevel"),inMemory:o}),A.releaseFs)}async function xH(t,{protocol:e,fetchOptions:r}){return(await Ik(t,{protocol:e,fetchOptions:r,inMemory:!0})).getBufferAndClose()}var N2=class{supports(e,r){return!!e.reference.startsWith(Ui)}getLocalPath(e,r){let{parentLocator:o,path:a}=W.parseFileStyleRange(e.reference,{protocol:Ui});if(K.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:K.resolve(n,a)}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${W.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:W.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:u}}async fetchFromDisk(e,r){return Ik(e,{protocol:Ui,fetchOptions:r})}};Ye();Ye();var fdt=2,L2=class{supportsDescriptor(e,r){return e.range.match(DC)?!0:!!e.range.startsWith(Ui)}supportsLocator(e,r){return!!e.reference.startsWith(Ui)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return DC.test(e.range)&&(e=W.makeDescriptor(e,`${Ui}${e.range}`)),W.bindDescriptor(e,{locator:W.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=T2(e.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let u=await xH(W.makeLocator(e,W.makeRange({protocol:Ui,source:a,selector:a,params:{locator:W.stringifyLocator(n)}})),{protocol:Ui,fetchOptions:o.fetchOptions}),A=wn.makeHash(`${fdt}`,u).slice(0,6);return[PC(e,{parentLocator:n,path:a,hash:A,protocol:Ui})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await je.releaseAfterUseAsync(async()=>await Mt.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};Ye();var M2=class{supports(e,r){return F2.test(e.reference)?!!e.reference.startsWith(Ui):!1}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${W.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:W.getIdentVendorPath(e),checksum:u}}async fetchFromDisk(e,r){let o=await R2(e,r);return await Xi.convertToZip(o,{configuration:r.project.configuration,prefixPath:W.getIdentVendorPath(e),stripComponents:1})}};Ye();Ye();Ye();var O2=class{supportsDescriptor(e,r){return F2.test(e.range)?!!(e.range.startsWith(Ui)||DC.test(e.range)):!1}supportsLocator(e,r){return F2.test(e.reference)?!!e.reference.startsWith(Ui):!1}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return DC.test(e.range)&&(e=W.makeDescriptor(e,`${Ui}${e.range}`)),W.bindDescriptor(e,{locator:W.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=T2(e.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let u=PC(e,{parentLocator:n,path:a,hash:"",protocol:Ui}),A=await R2(u,o.fetchOptions),p=wn.makeHash(A).slice(0,6);return[PC(e,{parentLocator:n,path:a,hash:p,protocol:Ui})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await je.releaseAfterUseAsync(async()=>await Mt.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var pdt={fetchers:[M2,N2],resolvers:[O2,L2]},hdt=pdt;var FH={};Kt(FH,{GithubFetcher:()=>U2,default:()=>ddt,githubUtils:()=>Bk});Ye();Pt();var Bk={};Kt(Bk,{invalidGithubUrlMessage:()=>Cme,isGithubUrl:()=>kH,parseGithubUrl:()=>QH});var yme=$e(Be("querystring")),Eme=[/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+)\/tarball\/([^/#]+)(?:#(.*))?$/,/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+?)(?:\.git)?(?:#(.*))?$/];function kH(t){return t?Eme.some(e=>!!t.match(e)):!1}function QH(t){let e;for(let A of Eme)if(e=t.match(A),e)break;if(!e)throw new Error(Cme(t));let[,r,o,a,n="master"]=e,{commit:u}=yme.default.parse(n);return n=u||n.replace(/[^:]*:/,""),{auth:r,username:o,reponame:a,treeish:n}}function Cme(t){return`Input cannot be parsed as a valid GitHub URL ('${t}').`}var U2=class{supports(e,r){return!!kH(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${W.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:W.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let o=await rn.get(this.getLocatorUrl(e,r),{configuration:r.project.configuration});return await oe.mktempPromise(async a=>{let n=new gn(a);await Xi.extractArchiveTo(o,n,{stripComponents:1});let u=ra.splitRepoUrl(e.reference),A=K.join(a,"package.tgz");await un.prepareExternalProject(a,A,{configuration:r.project.configuration,report:r.report,workspace:u.extra.workspace,locator:e});let p=await oe.readFilePromise(A);return await Xi.convertToZip(p,{configuration:r.project.configuration,prefixPath:W.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,r){let{auth:o,username:a,reponame:n,treeish:u}=QH(e.reference);return`https://${o?`${o}@`:""}github.com/${a}/${n}/archive/${u}.tar.gz`}};var gdt={hooks:{async fetchHostedRepository(t,e,r){if(t!==null)return t;let o=new U2;if(!o.supports(e,r))return null;try{return await o.fetch(e,r)}catch{return null}}}},ddt=gdt;var TH={};Kt(TH,{TarballHttpFetcher:()=>H2,TarballHttpResolver:()=>j2,default:()=>ydt});Ye();function _2(t){let e;try{e=new URL(t)}catch{return!1}return!(e.protocol!=="http:"&&e.protocol!=="https:"||!e.pathname.match(/(\.tar\.gz|\.tgz|\/[^.]+)$/))}var H2=class{supports(e,r){return _2(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${W.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:W.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let o=await rn.get(e.reference,{configuration:r.project.configuration});return await Xi.convertToZip(o,{configuration:r.project.configuration,prefixPath:W.getIdentVendorPath(e),stripComponents:1})}};Ye();Ye();var j2=class{supportsDescriptor(e,r){return _2(e.range)}supportsLocator(e,r){return _2(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){return[W.convertDescriptorToLocator(e)]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await je.releaseAfterUseAsync(async()=>await Mt.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var mdt={fetchers:[H2],resolvers:[j2]},ydt=mdt;var RH={};Kt(RH,{InitCommand:()=>g0,default:()=>Cdt});Ye();Ye();Pt();qt();var g0=class extends ut{constructor(){super(...arguments);this.private=ge.Boolean("-p,--private",!1,{description:"Initialize a private package"});this.workspace=ge.Boolean("-w,--workspace",!1,{description:"Initialize a workspace root with a `packages/` directory"});this.install=ge.String("-i,--install",!1,{tolerateBoolean:!0,description:"Initialize a package with a specific bundle that will be locked in the project"});this.name=ge.String("-n,--name",{description:"Initialize a package with the given name"});this.usev2=ge.Boolean("-2",!1,{hidden:!0});this.yes=ge.Boolean("-y,--yes",{hidden:!0})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),o=typeof this.install=="string"?this.install:this.usev2||this.install===!0?"latest":null;return o!==null?await this.executeProxy(r,o):await this.executeRegular(r)}async executeProxy(r,o){if(r.projectCwd!==null&&r.projectCwd!==this.context.cwd)throw new it("Cannot use the --install flag from within a project subdirectory");oe.existsSync(this.context.cwd)||await oe.mkdirPromise(this.context.cwd,{recursive:!0});let a=K.join(this.context.cwd,dr.lockfile);oe.existsSync(a)||await oe.writeFilePromise(a,"");let n=await this.cli.run(["set","version",o],{quiet:!0});if(n!==0)return n;let u=[];return this.private&&u.push("-p"),this.workspace&&u.push("-w"),this.name&&u.push(`-n=${this.name}`),this.yes&&u.push("-y"),await oe.mktempPromise(async A=>{let{code:p}=await Ur.pipevp("yarn",["init",...u],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await un.makeScriptEnv({binFolder:A})});return p})}async executeRegular(r){let o=null;try{o=(await St.find(r,this.context.cwd)).project}catch{o=null}oe.existsSync(this.context.cwd)||await oe.mkdirPromise(this.context.cwd,{recursive:!0});let a=await Mt.tryFind(this.context.cwd),n=a??new Mt,u=Object.fromEntries(r.get("initFields").entries());n.load(u),n.name=n.name??W.makeIdent(r.get("initScope"),this.name??K.basename(this.context.cwd)),n.packageManager=tn&&je.isTaggedYarnVersion(tn)?`yarn@${tn}`:null,(!a&&this.workspace||this.private)&&(n.private=!0),this.workspace&&n.workspaceDefinitions.length===0&&(await oe.mkdirPromise(K.join(this.context.cwd,"packages"),{recursive:!0}),n.workspaceDefinitions=[{pattern:"packages/*"}]);let A={};n.exportTo(A);let p=K.join(this.context.cwd,Mt.fileName);await oe.changeFilePromise(p,`${JSON.stringify(A,null,2)} +`,{automaticNewlines:!0});let h=[p],E=K.join(this.context.cwd,"README.md");if(oe.existsSync(E)||(await oe.writeFilePromise(E,`# ${W.stringifyIdent(n.name)} +`),h.push(E)),!o||o.cwd===this.context.cwd){let I=K.join(this.context.cwd,dr.lockfile);oe.existsSync(I)||(await oe.writeFilePromise(I,""),h.push(I));let b=[".yarn/*","!.yarn/patches","!.yarn/plugins","!.yarn/releases","!.yarn/sdks","!.yarn/versions","","# Swap the comments on the following lines if you wish to use zero-installs","# In that case, don't forget to run `yarn config set enableGlobalCache false`!","# Documentation here: https://yarnpkg.com/features/caching#zero-installs","","#!.yarn/cache",".pnp.*"].map(pe=>`${pe} +`).join(""),C=K.join(this.context.cwd,".gitignore");oe.existsSync(C)||(await oe.writeFilePromise(C,b),h.push(C));let L=["/.yarn/** linguist-vendored","/.yarn/releases/* binary","/.yarn/plugins/**/* binary","/.pnp.* binary linguist-generated"].map(pe=>`${pe} +`).join(""),U=K.join(this.context.cwd,".gitattributes");oe.existsSync(U)||(await oe.writeFilePromise(U,L),h.push(U));let J={["*"]:{endOfLine:"lf",insertFinalNewline:!0},["*.{js,json,yml}"]:{charset:"utf-8",indentStyle:"space",indentSize:2}};je.mergeIntoTarget(J,r.get("initEditorConfig"));let te=`root = true +`;for(let[pe,Ae]of Object.entries(J)){te+=` +[${pe}] +`;for(let[ye,ae]of Object.entries(Ae)){let we=ye.replace(/[A-Z]/g,Pe=>`_${Pe.toLowerCase()}`);te+=`${we} = ${ae} +`}}let le=K.join(this.context.cwd,".editorconfig");oe.existsSync(le)||(await oe.writeFilePromise(le,te),h.push(le)),await this.cli.run(["install"],{quiet:!0}),oe.existsSync(K.join(this.context.cwd,".git"))||(await Ur.execvp("git",["init"],{cwd:this.context.cwd}),await Ur.execvp("git",["add","--",...h],{cwd:this.context.cwd}),await Ur.execvp("git",["commit","--allow-empty","-m","First commit"],{cwd:this.context.cwd}))}}};g0.paths=[["init"]],g0.usage=nt.Usage({description:"create a new package",details:"\n This command will setup a new package in your local directory.\n\n If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\n\n If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\n\n If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\n\n The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\n ",examples:[["Create a new package in the local directory","yarn init"],["Create a new private package in the local directory","yarn init -p"],["Create a new package and store the Yarn release inside","yarn init -i=latest"],["Create a new private package and defines it as a workspace root","yarn init -w"]]});var Edt={configuration:{initScope:{description:"Scope used when creating packages via the init command",type:"STRING",default:null},initFields:{description:"Additional fields to set when creating packages via the init command",type:"MAP",valueDefinition:{description:"",type:"ANY"}},initEditorConfig:{description:"Extra rules to define in the generator editorconfig",type:"MAP",valueDefinition:{description:"",type:"ANY"}}},commands:[g0]},Cdt=Edt;var Lj={};Kt(Lj,{SearchCommand:()=>C0,UpgradeInteractiveCommand:()=>I0,default:()=>lIt});Ye();var Ime=$e(Be("os"));function SC({stdout:t}){if(Ime.default.endianness()==="BE")throw new Error("Interactive commands cannot be used on big-endian systems because ink depends on yoga-layout-prebuilt which only supports little-endian architectures");if(!t.isTTY)throw new Error("Interactive commands can only be used inside a TTY environment")}qt();var Rye=$e(ZH()),$H={appId:"OFCNCOG2CU",apiKey:"6fe4476ee5a1832882e326b506d14126",indexName:"npm-search"},myt=(0,Rye.default)($H.appId,$H.apiKey).initIndex($H.indexName),e6=async(t,e=0)=>await myt.search(t,{analyticsTags:["yarn-plugin-interactive-tools"],attributesToRetrieve:["name","version","owner","repository","humanDownloadsLast30Days"],page:e,hitsPerPage:10});var HB=["regular","dev","peer"],C0=class extends ut{async execute(){SC(this.context);let{Gem:e}=await Promise.resolve().then(()=>(AQ(),Dj)),{ScrollableItems:r}=await Promise.resolve().then(()=>(gQ(),hQ)),{useKeypress:o}=await Promise.resolve().then(()=>(OB(),Jwe)),{useMinistore:a}=await Promise.resolve().then(()=>(Qj(),kj)),{renderForm:n}=await Promise.resolve().then(()=>(EQ(),yQ)),{default:u}=await Promise.resolve().then(()=>$e(sIe())),{Box:A,Text:p}=await Promise.resolve().then(()=>$e(ic())),{default:h,useEffect:E,useState:I}=await Promise.resolve().then(()=>$e(sn())),v=await Ve.find(this.context.cwd,this.context.plugins),b=()=>h.createElement(A,{flexDirection:"row"},h.createElement(A,{flexDirection:"column",width:48},h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to move between packages.")),h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select a package.")),h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," again to change the target."))),h.createElement(A,{flexDirection:"column"},h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to install the selected packages.")),h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to abort.")))),C=()=>h.createElement(h.Fragment,null,h.createElement(A,{width:15},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Owner")),h.createElement(A,{width:11},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Version")),h.createElement(A,{width:10},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Downloads"))),T=()=>h.createElement(A,{width:17},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Target")),L=({hit:ae,active:we})=>{let[Pe,g]=a(ae.name,null);o({active:we},(ce,ne)=>{if(ne.name!=="space")return;if(!Pe){g(HB[0]);return}let ee=HB.indexOf(Pe)+1;ee===HB.length?g(null):g(HB[ee])},[Pe,g]);let Ee=W.parseIdent(ae.name),De=W.prettyIdent(v,Ee);return h.createElement(A,null,h.createElement(A,{width:45},h.createElement(p,{bold:!0,wrap:"wrap"},De)),h.createElement(A,{width:14,marginLeft:1},h.createElement(p,{bold:!0,wrap:"truncate"},ae.owner.name)),h.createElement(A,{width:10,marginLeft:1},h.createElement(p,{italic:!0,wrap:"truncate"},ae.version)),h.createElement(A,{width:16,marginLeft:1},h.createElement(p,null,ae.humanDownloadsLast30Days)))},U=({name:ae,active:we})=>{let[Pe]=a(ae,null),g=W.parseIdent(ae);return h.createElement(A,null,h.createElement(A,{width:47},h.createElement(p,{bold:!0}," - ",W.prettyIdent(v,g))),HB.map(Ee=>h.createElement(A,{key:Ee,width:14,marginLeft:1},h.createElement(p,null," ",h.createElement(e,{active:Pe===Ee})," ",h.createElement(p,{bold:!0},Ee)))))},J=()=>h.createElement(A,{marginTop:1},h.createElement(p,null,"Powered by Algolia.")),le=await n(({useSubmit:ae})=>{let we=a();ae(we);let Pe=Array.from(we.keys()).filter(H=>we.get(H)!==null),[g,Ee]=I(""),[De,ce]=I(0),[ne,ee]=I([]),Ie=H=>{H.match(/\t| /)||Ee(H)},ke=async()=>{ce(0);let H=await e6(g);H.query===g&&ee(H.hits)},ht=async()=>{let H=await e6(g,De+1);H.query===g&&H.page-1===De&&(ce(H.page),ee([...ne,...H.hits]))};return E(()=>{g?ke():ee([])},[g]),h.createElement(A,{flexDirection:"column"},h.createElement(b,null),h.createElement(A,{flexDirection:"row",marginTop:1},h.createElement(p,{bold:!0},"Search: "),h.createElement(A,{width:41},h.createElement(u,{value:g,onChange:Ie,placeholder:"i.e. babel, webpack, react...",showCursor:!1})),h.createElement(C,null)),ne.length?h.createElement(r,{radius:2,loop:!1,children:ne.map(H=>h.createElement(L,{key:H.name,hit:H,active:!1})),willReachEnd:ht}):h.createElement(p,{color:"gray"},"Start typing..."),h.createElement(A,{flexDirection:"row",marginTop:1},h.createElement(A,{width:49},h.createElement(p,{bold:!0},"Selected:")),h.createElement(T,null)),Pe.length?Pe.map(H=>h.createElement(U,{key:H,name:H,active:!1})):h.createElement(p,{color:"gray"},"No selected packages..."),h.createElement(J,null))},{},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof le>"u")return 1;let pe=Array.from(le.keys()).filter(ae=>le.get(ae)==="regular"),Ae=Array.from(le.keys()).filter(ae=>le.get(ae)==="dev"),ye=Array.from(le.keys()).filter(ae=>le.get(ae)==="peer");return pe.length&&await this.cli.run(["add",...pe]),Ae.length&&await this.cli.run(["add","--dev",...Ae]),ye&&await this.cli.run(["add","--peer",...ye]),0}};C0.paths=[["search"]],C0.usage=nt.Usage({category:"Interactive commands",description:"open the search interface",details:` + This command opens a fullscreen terminal interface where you can search for and install packages from the npm registry. + `,examples:[["Open the search window","yarn search"]]});Ye();qt();w_();var fIe=$e(zn()),AIe=/^((?:[\^~]|>=?)?)([0-9]+)(\.[0-9]+)(\.[0-9]+)((?:-\S+)?)$/,pIe=(t,e)=>t.length>0?[t.slice(0,e)].concat(pIe(t.slice(e),e)):[],I0=class extends ut{async execute(){SC(this.context);let{ItemOptions:e}=await Promise.resolve().then(()=>(uIe(),cIe)),{Pad:r}=await Promise.resolve().then(()=>(Nj(),lIe)),{ScrollableItems:o}=await Promise.resolve().then(()=>(gQ(),hQ)),{useMinistore:a}=await Promise.resolve().then(()=>(Qj(),kj)),{renderForm:n}=await Promise.resolve().then(()=>(EQ(),yQ)),{Box:u,Text:A}=await Promise.resolve().then(()=>$e(ic())),{default:p,useEffect:h,useRef:E,useState:I}=await Promise.resolve().then(()=>$e(sn())),v=await Ve.find(this.context.cwd,this.context.plugins),{project:b,workspace:C}=await St.find(v,this.context.cwd),T=await Lr.find(v);if(!C)throw new rr(b.cwd,this.context.cwd);await b.restoreInstallState({restoreResolutions:!1});let L=this.context.stdout.rows-7,U=(Ee,De)=>{let ce=fpe(Ee,De),ne="";for(let ee of ce)ee.added?ne+=de.pretty(v,ee.value,"green"):ee.removed||(ne+=ee.value);return ne},J=(Ee,De)=>{if(Ee===De)return De;let ce=W.parseRange(Ee),ne=W.parseRange(De),ee=ce.selector.match(AIe),Ie=ne.selector.match(AIe);if(!ee||!Ie)return U(Ee,De);let ke=["gray","red","yellow","green","magenta"],ht=null,H="";for(let lt=1;lt{let ne=await zc.fetchDescriptorFrom(Ee,ce,{project:b,cache:T,preserveModifier:De,workspace:C});return ne!==null?ne.range:Ee.range},le=async Ee=>{let De=fIe.default.valid(Ee.range)?`^${Ee.range}`:Ee.range,[ce,ne]=await Promise.all([te(Ee,Ee.range,De).catch(()=>null),te(Ee,Ee.range,"latest").catch(()=>null)]),ee=[{value:null,label:Ee.range}];return ce&&ce!==Ee.range?ee.push({value:ce,label:J(Ee.range,ce)}):ee.push({value:null,label:""}),ne&&ne!==ce&&ne!==Ee.range?ee.push({value:ne,label:J(Ee.range,ne)}):ee.push({value:null,label:""}),ee},pe=()=>p.createElement(u,{flexDirection:"row"},p.createElement(u,{flexDirection:"column",width:49},p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},""),"/",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to select packages.")),p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},""),"/",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to select versions."))),p.createElement(u,{flexDirection:"column"},p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to install.")),p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to abort.")))),Ae=()=>p.createElement(u,{flexDirection:"row",paddingTop:1,paddingBottom:1},p.createElement(u,{width:50},p.createElement(A,{bold:!0},p.createElement(A,{color:"greenBright"},"?")," Pick the packages you want to upgrade.")),p.createElement(u,{width:17},p.createElement(A,{bold:!0,underline:!0,color:"gray"},"Current")),p.createElement(u,{width:17},p.createElement(A,{bold:!0,underline:!0,color:"gray"},"Range")),p.createElement(u,{width:17},p.createElement(A,{bold:!0,underline:!0,color:"gray"},"Latest"))),ye=({active:Ee,descriptor:De,suggestions:ce})=>{let[ne,ee]=a(De.descriptorHash,null),Ie=W.stringifyIdent(De),ke=Math.max(0,45-Ie.length);return p.createElement(p.Fragment,null,p.createElement(u,null,p.createElement(u,{width:45},p.createElement(A,{bold:!0},W.prettyIdent(v,De)),p.createElement(r,{active:Ee,length:ke})),p.createElement(e,{active:Ee,options:ce,value:ne,skewer:!0,onChange:ee,sizes:[17,17,17]})))},ae=({dependencies:Ee})=>{let[De,ce]=I(Ee.map(()=>null)),ne=E(!0),ee=async Ie=>{let ke=await le(Ie);return ke.filter(ht=>ht.label!=="").length<=1?null:{descriptor:Ie,suggestions:ke}};return h(()=>()=>{ne.current=!1},[]),h(()=>{let Ie=Math.trunc(L*1.75),ke=Ee.slice(0,Ie),ht=Ee.slice(Ie),H=pIe(ht,L),lt=ke.map(ee).reduce(async(Re,Qe)=>{await Re;let be=await Qe;be!==null&&(!ne.current||ce(_e=>{let Te=_e.findIndex(He=>He===null),Je=[..._e];return Je[Te]=be,Je}))},Promise.resolve());H.reduce((Re,Qe)=>Promise.all(Qe.map(be=>Promise.resolve().then(()=>ee(be)))).then(async be=>{be=be.filter(_e=>_e!==null),await Re,ne.current&&ce(_e=>{let Te=_e.findIndex(Je=>Je===null);return _e.slice(0,Te).concat(be).concat(_e.slice(Te+be.length))})}),lt).then(()=>{ne.current&&ce(Re=>Re.filter(Qe=>Qe!==null))})},[]),De.length?p.createElement(o,{radius:L>>1,children:De.map((Ie,ke)=>Ie!==null?p.createElement(ye,{key:ke,active:!1,descriptor:Ie.descriptor,suggestions:Ie.suggestions}):p.createElement(A,{key:ke},"Loading..."))}):p.createElement(A,null,"No upgrades found")},Pe=await n(({useSubmit:Ee})=>{Ee(a());let De=new Map;for(let ne of b.workspaces)for(let ee of["dependencies","devDependencies"])for(let Ie of ne.manifest[ee].values())b.tryWorkspaceByDescriptor(Ie)===null&&(Ie.range.startsWith("link:")||De.set(Ie.descriptorHash,Ie));let ce=je.sortMap(De.values(),ne=>W.stringifyDescriptor(ne));return p.createElement(u,{flexDirection:"column"},p.createElement(pe,null),p.createElement(Ae,null),p.createElement(ae,{dependencies:ce}))},{},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof Pe>"u")return 1;let g=!1;for(let Ee of b.workspaces)for(let De of["dependencies","devDependencies"]){let ce=Ee.manifest[De];for(let ne of ce.values()){let ee=Pe.get(ne.descriptorHash);typeof ee<"u"&&ee!==null&&(ce.set(ne.identHash,W.makeDescriptor(ne,ee)),g=!0)}}return g?await b.installWithNewReport({quiet:this.context.quiet,stdout:this.context.stdout},{cache:T}):0}};I0.paths=[["upgrade-interactive"]],I0.usage=nt.Usage({category:"Interactive commands",description:"open the upgrade interface",details:` + This command opens a fullscreen terminal interface where you can see any out of date packages used by your application, their status compared to the latest versions available on the remote registry, and select packages to upgrade. + `,examples:[["Open the upgrade window","yarn upgrade-interactive"]]});var aIt={commands:[C0,I0]},lIt=aIt;var Mj={};Kt(Mj,{LinkFetcher:()=>qB,LinkResolver:()=>GB,PortalFetcher:()=>YB,PortalResolver:()=>WB,default:()=>uIt});Ye();Pt();var ep="portal:",tp="link:";var qB=class{supports(e,r){return!!e.reference.startsWith(tp)}getLocalPath(e,r){let{parentLocator:o,path:a}=W.parseFileStyleRange(e.reference,{protocol:tp});if(K.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:K.resolve(n,a)}async fetch(e,r){let{parentLocator:o,path:a}=W.parseFileStyleRange(e.reference,{protocol:tp}),n=K.isAbsolute(a)?{packageFs:new gn(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await r.fetcher.fetch(o,r),u=n.localPath?{packageFs:new gn(Bt.root),prefixPath:K.relative(Bt.root,n.localPath),localPath:Bt.root}:n;n!==u&&n.releaseFs&&n.releaseFs();let A=u.packageFs,p=K.resolve(u.localPath??u.packageFs.getRealPath(),u.prefixPath,a);return n.localPath?{packageFs:new gn(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:Bt.dot,discardFromLookup:!0,localPath:p}:{packageFs:new _u(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:Bt.dot,discardFromLookup:!0}}};Ye();Pt();var GB=class{supportsDescriptor(e,r){return!!e.range.startsWith(tp)}supportsLocator(e,r){return!!e.reference.startsWith(tp)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return W.bindDescriptor(e,{locator:W.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=e.range.slice(tp.length);return[W.makeLocator(e,`${tp}${ue.toPortablePath(a)}`)]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){return{...e,version:"0.0.0",languageName:r.project.configuration.get("defaultLanguageName"),linkType:"SOFT",conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map}}};Ye();Pt();var YB=class{supports(e,r){return!!e.reference.startsWith(ep)}getLocalPath(e,r){let{parentLocator:o,path:a}=W.parseFileStyleRange(e.reference,{protocol:ep});if(K.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:K.resolve(n,a)}async fetch(e,r){let{parentLocator:o,path:a}=W.parseFileStyleRange(e.reference,{protocol:ep}),n=K.isAbsolute(a)?{packageFs:new gn(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await r.fetcher.fetch(o,r),u=n.localPath?{packageFs:new gn(Bt.root),prefixPath:K.relative(Bt.root,n.localPath),localPath:Bt.root}:n;n!==u&&n.releaseFs&&n.releaseFs();let A=u.packageFs,p=K.resolve(u.localPath??u.packageFs.getRealPath(),u.prefixPath,a);return n.localPath?{packageFs:new gn(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:Bt.dot,localPath:p}:{packageFs:new _u(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:Bt.dot}}};Ye();Ye();Pt();var WB=class{supportsDescriptor(e,r){return!!e.range.startsWith(ep)}supportsLocator(e,r){return!!e.reference.startsWith(ep)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return W.bindDescriptor(e,{locator:W.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=e.range.slice(ep.length);return[W.makeLocator(e,`${ep}${ue.toPortablePath(a)}`)]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await je.releaseAfterUseAsync(async()=>await Mt.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"SOFT",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var cIt={fetchers:[qB,YB],resolvers:[GB,WB]},uIt=cIt;var Cq={};Kt(Cq,{NodeModulesLinker:()=>lv,NodeModulesMode:()=>dq,PnpLooseLinker:()=>cv,default:()=>P1t});Pt();Ye();Pt();Pt();var Uj=(t,e)=>`${t}@${e}`,hIe=(t,e)=>{let r=e.indexOf("#"),o=r>=0?e.substring(r+1):e;return Uj(t,o)};var mIe=(t,e={})=>{let r=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),o=e.check||r>=9,a=e.hoistingLimits||new Map,n={check:o,debugLevel:r,hoistingLimits:a,fastLookupPossible:!0},u;n.debugLevel>=0&&(u=Date.now());let A=mIt(t,n),p=!1,h=0;do p=_j(A,[A],new Set([A.locator]),new Map,n).anotherRoundNeeded,n.fastLookupPossible=!1,h++;while(p);if(n.debugLevel>=0&&console.log(`hoist time: ${Date.now()-u}ms, rounds: ${h}`),n.debugLevel>=1){let E=VB(A);if(_j(A,[A],new Set([A.locator]),new Map,n).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree: +${E}, next tree: +${VB(A)}`);let v=yIe(A);if(v)throw new Error(`${v}, after hoisting finished: +${VB(A)}`)}return n.debugLevel>=2&&console.log(VB(A)),yIt(A)},AIt=t=>{let e=t[t.length-1],r=new Map,o=new Set,a=n=>{if(!o.has(n)){o.add(n);for(let u of n.hoistedDependencies.values())r.set(u.name,u);for(let u of n.dependencies.values())n.peerNames.has(u.name)||a(u)}};return a(e),r},fIt=t=>{let e=t[t.length-1],r=new Map,o=new Set,a=new Set,n=(u,A)=>{if(o.has(u))return;o.add(u);for(let h of u.hoistedDependencies.values())if(!A.has(h.name)){let E;for(let I of t)E=I.dependencies.get(h.name),E&&r.set(E.name,E)}let p=new Set;for(let h of u.dependencies.values())p.add(h.name);for(let h of u.dependencies.values())u.peerNames.has(h.name)||n(h,p)};return n(e,a),r},gIe=(t,e)=>{if(e.decoupled)return e;let{name:r,references:o,ident:a,locator:n,dependencies:u,originalDependencies:A,hoistedDependencies:p,peerNames:h,reasons:E,isHoistBorder:I,hoistPriority:v,dependencyKind:b,hoistedFrom:C,hoistedTo:T}=e,L={name:r,references:new Set(o),ident:a,locator:n,dependencies:new Map(u),originalDependencies:new Map(A),hoistedDependencies:new Map(p),peerNames:new Set(h),reasons:new Map(E),decoupled:!0,isHoistBorder:I,hoistPriority:v,dependencyKind:b,hoistedFrom:new Map(C),hoistedTo:new Map(T)},U=L.dependencies.get(r);return U&&U.ident==L.ident&&L.dependencies.set(r,L),t.dependencies.set(L.name,L),L},pIt=(t,e)=>{let r=new Map([[t.name,[t.ident]]]);for(let a of t.dependencies.values())t.peerNames.has(a.name)||r.set(a.name,[a.ident]);let o=Array.from(e.keys());o.sort((a,n)=>{let u=e.get(a),A=e.get(n);return A.hoistPriority!==u.hoistPriority?A.hoistPriority-u.hoistPriority:A.peerDependents.size!==u.peerDependents.size?A.peerDependents.size-u.peerDependents.size:A.dependents.size-u.dependents.size});for(let a of o){let n=a.substring(0,a.indexOf("@",1)),u=a.substring(n.length+1);if(!t.peerNames.has(n)){let A=r.get(n);A||(A=[],r.set(n,A)),A.indexOf(u)<0&&A.push(u)}}return r},Oj=t=>{let e=new Set,r=(o,a=new Set)=>{if(!a.has(o)){a.add(o);for(let n of o.peerNames)if(!t.peerNames.has(n)){let u=t.dependencies.get(n);u&&!e.has(u)&&r(u,a)}e.add(o)}};for(let o of t.dependencies.values())t.peerNames.has(o.name)||r(o);return e},_j=(t,e,r,o,a,n=new Set)=>{let u=e[e.length-1];if(n.has(u))return{anotherRoundNeeded:!1,isGraphChanged:!1};n.add(u);let A=EIt(u),p=pIt(u,A),h=t==u?new Map:a.fastLookupPossible?AIt(e):fIt(e),E,I=!1,v=!1,b=new Map(Array.from(p.entries()).map(([T,L])=>[T,L[0]])),C=new Map;do{let T=dIt(t,e,r,h,b,p,o,C,a);T.isGraphChanged&&(v=!0),T.anotherRoundNeeded&&(I=!0),E=!1;for(let[L,U]of p)U.length>1&&!u.dependencies.has(L)&&(b.delete(L),U.shift(),b.set(L,U[0]),E=!0)}while(E);for(let T of u.dependencies.values())if(!u.peerNames.has(T.name)&&!r.has(T.locator)){r.add(T.locator);let L=_j(t,[...e,T],r,C,a);L.isGraphChanged&&(v=!0),L.anotherRoundNeeded&&(I=!0),r.delete(T.locator)}return{anotherRoundNeeded:I,isGraphChanged:v}},hIt=t=>{for(let[e,r]of t.dependencies)if(!t.peerNames.has(e)&&r.ident!==t.ident)return!0;return!1},gIt=(t,e,r,o,a,n,u,A,{outputReason:p,fastLookupPossible:h})=>{let E,I=null,v=new Set;p&&(E=`${Array.from(e).map(L=>no(L)).join("\u2192")}`);let b=r[r.length-1],T=!(o.ident===b.ident);if(p&&!T&&(I="- self-reference"),T&&(T=o.dependencyKind!==1,p&&!T&&(I="- workspace")),T&&o.dependencyKind===2&&(T=!hIt(o),p&&!T&&(I="- external soft link with unhoisted dependencies")),T&&(T=b.dependencyKind!==1||b.hoistedFrom.has(o.name)||e.size===1,p&&!T&&(I=b.reasons.get(o.name))),T&&(T=!t.peerNames.has(o.name),p&&!T&&(I=`- cannot shadow peer: ${no(t.originalDependencies.get(o.name).locator)} at ${E}`)),T){let L=!1,U=a.get(o.name);if(L=!U||U.ident===o.ident,p&&!L&&(I=`- filled by: ${no(U.locator)} at ${E}`),L)for(let J=r.length-1;J>=1;J--){let le=r[J].dependencies.get(o.name);if(le&&le.ident!==o.ident){L=!1;let pe=A.get(b);pe||(pe=new Set,A.set(b,pe)),pe.add(o.name),p&&(I=`- filled by ${no(le.locator)} at ${r.slice(0,J).map(Ae=>no(Ae.locator)).join("\u2192")}`);break}}T=L}if(T&&(T=n.get(o.name)===o.ident,p&&!T&&(I=`- filled by: ${no(u.get(o.name)[0])} at ${E}`)),T){let L=!0,U=new Set(o.peerNames);for(let J=r.length-1;J>=1;J--){let te=r[J];for(let le of U){if(te.peerNames.has(le)&&te.originalDependencies.has(le))continue;let pe=te.dependencies.get(le);pe&&t.dependencies.get(le)!==pe&&(J===r.length-1?v.add(pe):(v=null,L=!1,p&&(I=`- peer dependency ${no(pe.locator)} from parent ${no(te.locator)} was not hoisted to ${E}`))),U.delete(le)}if(!L)break}T=L}if(T&&!h)for(let L of o.hoistedDependencies.values()){let U=a.get(L.name)||t.dependencies.get(L.name);if(!U||L.ident!==U.ident){T=!1,p&&(I=`- previously hoisted dependency mismatch, needed: ${no(L.locator)}, available: ${no(U?.locator)}`);break}}return v!==null&&v.size>0?{isHoistable:2,dependsOn:v,reason:I}:{isHoistable:T?0:1,reason:I}},CQ=t=>`${t.name}@${t.locator}`,dIt=(t,e,r,o,a,n,u,A,p)=>{let h=e[e.length-1],E=new Set,I=!1,v=!1,b=(U,J,te,le,pe)=>{if(E.has(le))return;let Ae=[...J,CQ(le)],ye=[...te,CQ(le)],ae=new Map,we=new Map;for(let ce of Oj(le)){let ne=gIt(h,r,[h,...U,le],ce,o,a,n,A,{outputReason:p.debugLevel>=2,fastLookupPossible:p.fastLookupPossible});if(we.set(ce,ne),ne.isHoistable===2)for(let ee of ne.dependsOn){let Ie=ae.get(ee.name)||new Set;Ie.add(ce.name),ae.set(ee.name,Ie)}}let Pe=new Set,g=(ce,ne,ee)=>{if(!Pe.has(ce)){Pe.add(ce),we.set(ce,{isHoistable:1,reason:ee});for(let Ie of ae.get(ce.name)||[])g(le.dependencies.get(Ie),ne,p.debugLevel>=2?`- peer dependency ${no(ce.locator)} from parent ${no(le.locator)} was not hoisted`:"")}};for(let[ce,ne]of we)ne.isHoistable===1&&g(ce,ne,ne.reason);let Ee=!1;for(let ce of we.keys())if(!Pe.has(ce)){v=!0;let ne=u.get(le);ne&&ne.has(ce.name)&&(I=!0),Ee=!0,le.dependencies.delete(ce.name),le.hoistedDependencies.set(ce.name,ce),le.reasons.delete(ce.name);let ee=h.dependencies.get(ce.name);if(p.debugLevel>=2){let Ie=Array.from(J).concat([le.locator]).map(ht=>no(ht)).join("\u2192"),ke=h.hoistedFrom.get(ce.name);ke||(ke=[],h.hoistedFrom.set(ce.name,ke)),ke.push(Ie),le.hoistedTo.set(ce.name,Array.from(e).map(ht=>no(ht.locator)).join("\u2192"))}if(!ee)h.ident!==ce.ident&&(h.dependencies.set(ce.name,ce),pe.add(ce));else for(let Ie of ce.references)ee.references.add(Ie)}if(le.dependencyKind===2&&Ee&&(I=!0),p.check){let ce=yIe(t);if(ce)throw new Error(`${ce}, after hoisting dependencies of ${[h,...U,le].map(ne=>no(ne.locator)).join("\u2192")}: +${VB(t)}`)}let De=Oj(le);for(let ce of De)if(Pe.has(ce)){let ne=we.get(ce);if((a.get(ce.name)===ce.ident||!le.reasons.has(ce.name))&&ne.isHoistable!==0&&le.reasons.set(ce.name,ne.reason),!ce.isHoistBorder&&ye.indexOf(CQ(ce))<0){E.add(le);let Ie=gIe(le,ce);b([...U,le],Ae,ye,Ie,T),E.delete(le)}}},C,T=new Set(Oj(h)),L=Array.from(e).map(U=>CQ(U));do{C=T,T=new Set;for(let U of C){if(U.locator===h.locator||U.isHoistBorder)continue;let J=gIe(h,U);b([],Array.from(r),L,J,T)}}while(T.size>0);return{anotherRoundNeeded:I,isGraphChanged:v}},yIe=t=>{let e=[],r=new Set,o=new Set,a=(n,u,A)=>{if(r.has(n)||(r.add(n),o.has(n)))return;let p=new Map(u);for(let h of n.dependencies.values())n.peerNames.has(h.name)||p.set(h.name,h);for(let h of n.originalDependencies.values()){let E=p.get(h.name),I=()=>`${Array.from(o).concat([n]).map(v=>no(v.locator)).join("\u2192")}`;if(n.peerNames.has(h.name)){let v=u.get(h.name);(v!==E||!v||v.ident!==h.ident)&&e.push(`${I()} - broken peer promise: expected ${h.ident} but found ${v&&v.ident}`)}else{let v=A.hoistedFrom.get(n.name),b=n.hoistedTo.get(h.name),C=`${v?` hoisted from ${v.join(", ")}`:""}`,T=`${b?` hoisted to ${b}`:""}`,L=`${I()}${C}`;E?E.ident!==h.ident&&e.push(`${L} - broken require promise for ${h.name}${T}: expected ${h.ident}, but found: ${E.ident}`):e.push(`${L} - broken require promise: no required dependency ${h.name}${T} found`)}}o.add(n);for(let h of n.dependencies.values())n.peerNames.has(h.name)||a(h,p,n);o.delete(n)};return a(t,t.dependencies,t),e.join(` +`)},mIt=(t,e)=>{let{identName:r,name:o,reference:a,peerNames:n}=t,u={name:o,references:new Set([a]),locator:Uj(r,a),ident:hIe(r,a),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(n),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,dependencyKind:1,hoistedFrom:new Map,hoistedTo:new Map},A=new Map([[t,u]]),p=(h,E)=>{let I=A.get(h),v=!!I;if(!I){let{name:b,identName:C,reference:T,peerNames:L,hoistPriority:U,dependencyKind:J}=h,te=e.hoistingLimits.get(E.locator);I={name:b,references:new Set([T]),locator:Uj(C,T),ident:hIe(C,T),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(L),reasons:new Map,decoupled:!0,isHoistBorder:te?te.has(b):!1,hoistPriority:U||0,dependencyKind:J||0,hoistedFrom:new Map,hoistedTo:new Map},A.set(h,I)}if(E.dependencies.set(h.name,I),E.originalDependencies.set(h.name,I),v){let b=new Set,C=T=>{if(!b.has(T)){b.add(T),T.decoupled=!1;for(let L of T.dependencies.values())T.peerNames.has(L.name)||C(L)}};C(I)}else for(let b of h.dependencies)p(b,I)};for(let h of t.dependencies)p(h,u);return u},Hj=t=>t.substring(0,t.indexOf("@",1)),yIt=t=>{let e={name:t.name,identName:Hj(t.locator),references:new Set(t.references),dependencies:new Set},r=new Set([t]),o=(a,n,u)=>{let A=r.has(a),p;if(n===a)p=u;else{let{name:h,references:E,locator:I}=a;p={name:h,identName:Hj(I),references:E,dependencies:new Set}}if(u.dependencies.add(p),!A){r.add(a);for(let h of a.dependencies.values())a.peerNames.has(h.name)||o(h,a,p);r.delete(a)}};for(let a of t.dependencies.values())o(a,t,e);return e},EIt=t=>{let e=new Map,r=new Set([t]),o=u=>`${u.name}@${u.ident}`,a=u=>{let A=o(u),p=e.get(A);return p||(p={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(A,p)),p},n=(u,A)=>{let p=!!r.has(A);if(a(A).dependents.add(u.ident),!p){r.add(A);for(let E of A.dependencies.values()){let I=a(E);I.hoistPriority=Math.max(I.hoistPriority,E.hoistPriority),A.peerNames.has(E.name)?I.peerDependents.add(A.ident):n(A,E)}}};for(let u of t.dependencies.values())t.peerNames.has(u.name)||n(t,u);return e},no=t=>{if(!t)return"none";let e=t.indexOf("@",1),r=t.substring(0,e);r.endsWith("$wsroot$")&&(r=`wh:${r.replace("$wsroot$","")}`);let o=t.substring(e+1);if(o==="workspace:.")return".";if(o){let a=(o.indexOf("#")>0?o.split("#")[1]:o).replace("npm:","");return o.startsWith("virtual")&&(r=`v:${r}`),a.startsWith("workspace")&&(r=`w:${r}`,a=""),`${r}${a?`@${a}`:""}`}else return`${r}`},dIe=5e4,VB=t=>{let e=0,r=(a,n,u="")=>{if(e>dIe||n.has(a))return"";e++;let A=Array.from(a.dependencies.values()).sort((h,E)=>h.name===E.name?0:h.name>E.name?1:-1),p="";n.add(a);for(let h=0;h":"")+(v!==E.name?`a:${E.name}:`:"")+no(E.locator)+(I?` ${I}`:"")} +`,p+=r(E,n,`${u}${hdIe?` +Tree is too large, part of the tree has been dunped +`:"")};var KB=(o=>(o.WORKSPACES="workspaces",o.DEPENDENCIES="dependencies",o.NONE="none",o))(KB||{}),EIe="node_modules",B0="$wsroot$";var JB=(t,e)=>{let{packageTree:r,hoistingLimits:o,errors:a,preserveSymlinksRequired:n}=wIt(t,e),u=null;if(a.length===0){let A=mIe(r,{hoistingLimits:o});u=BIt(t,A,e)}return{tree:u,errors:a,preserveSymlinksRequired:n}},gA=t=>`${t.name}@${t.reference}`,qj=t=>{let e=new Map;for(let[r,o]of t.entries())if(!o.dirList){let a=e.get(o.locator);a||(a={target:o.target,linkType:o.linkType,locations:[],aliases:o.aliases},e.set(o.locator,a)),a.locations.push(r)}for(let r of e.values())r.locations=r.locations.sort((o,a)=>{let n=o.split(K.delimiter).length,u=a.split(K.delimiter).length;return a===o?0:n!==u?u-n:a>o?1:-1});return e},CIe=(t,e)=>{let r=W.isVirtualLocator(t)?W.devirtualizeLocator(t):t,o=W.isVirtualLocator(e)?W.devirtualizeLocator(e):e;return W.areLocatorsEqual(r,o)},jj=(t,e,r,o)=>{if(t.linkType!=="SOFT")return!1;let a=ue.toPortablePath(r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation);return K.contains(o,a)===null},CIt=t=>{let e=t.getPackageInformation(t.topLevel);if(e===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");if(t.findPackageLocator(e.packageLocation)===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let o=ue.toPortablePath(e.packageLocation.slice(0,-1)),a=new Map,n={children:new Map},u=t.getDependencyTreeRoots(),A=new Map,p=new Set,h=(v,b)=>{let C=gA(v);if(p.has(C))return;p.add(C);let T=t.getPackageInformation(v);if(T){let L=b?gA(b):"";if(gA(v)!==L&&T.linkType==="SOFT"&&!jj(T,v,t,o)){let U=wIe(T,v,t);(!A.get(U)||v.reference.startsWith("workspace:"))&&A.set(U,v)}for(let[U,J]of T.packageDependencies)J!==null&&(T.packagePeers.has(U)||h(t.getLocator(U,J),v))}};for(let v of u)h(v,null);let E=o.split(K.sep);for(let v of A.values()){let b=t.getPackageInformation(v),T=ue.toPortablePath(b.packageLocation.slice(0,-1)).split(K.sep).slice(E.length),L=n;for(let U of T){let J=L.children.get(U);J||(J={children:new Map},L.children.set(U,J)),L=J}L.workspaceLocator=v}let I=(v,b)=>{if(v.workspaceLocator){let C=gA(b),T=a.get(C);T||(T=new Set,a.set(C,T)),T.add(v.workspaceLocator)}for(let C of v.children.values())I(C,v.workspaceLocator||b)};for(let v of n.children.values())I(v,n.workspaceLocator);return a},wIt=(t,e)=>{let r=[],o=!1,a=new Map,n=CIt(t),u=t.getPackageInformation(t.topLevel);if(u===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");let A=t.findPackageLocator(u.packageLocation);if(A===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let p=ue.toPortablePath(u.packageLocation.slice(0,-1)),h={name:A.name,identName:A.name,reference:A.reference,peerNames:u.packagePeers,dependencies:new Set,dependencyKind:1},E=new Map,I=(b,C)=>`${gA(C)}:${b}`,v=(b,C,T,L,U,J,te,le)=>{let pe=I(b,T),Ae=E.get(pe),ye=!!Ae;!ye&&T.name===A.name&&T.reference===A.reference&&(Ae=h,E.set(pe,h));let ae=jj(C,T,t,p);if(!Ae){let ce=0;ae?ce=2:C.linkType==="SOFT"&&T.name.endsWith(B0)&&(ce=1),Ae={name:b,identName:T.name,reference:T.reference,dependencies:new Set,peerNames:ce===1?new Set:C.packagePeers,dependencyKind:ce},E.set(pe,Ae)}let we;if(ae?we=2:U.linkType==="SOFT"?we=1:we=0,Ae.hoistPriority=Math.max(Ae.hoistPriority||0,we),le&&!ae){let ce=gA({name:L.identName,reference:L.reference}),ne=a.get(ce)||new Set;a.set(ce,ne),ne.add(Ae.name)}let Pe=new Map(C.packageDependencies);if(e.project){let ce=e.project.workspacesByCwd.get(ue.toPortablePath(C.packageLocation.slice(0,-1)));if(ce){let ne=new Set([...Array.from(ce.manifest.peerDependencies.values(),ee=>W.stringifyIdent(ee)),...Array.from(ce.manifest.peerDependenciesMeta.keys())]);for(let ee of ne)Pe.has(ee)||(Pe.set(ee,J.get(ee)||null),Ae.peerNames.add(ee))}}let g=gA({name:T.name.replace(B0,""),reference:T.reference}),Ee=n.get(g);if(Ee)for(let ce of Ee)Pe.set(`${ce.name}${B0}`,ce.reference);(C!==U||C.linkType!=="SOFT"||!ae&&(!e.selfReferencesByCwd||e.selfReferencesByCwd.get(te)))&&L.dependencies.add(Ae);let De=T!==A&&C.linkType==="SOFT"&&!T.name.endsWith(B0)&&!ae;if(!ye&&!De){let ce=new Map;for(let[ne,ee]of Pe)if(ee!==null){let Ie=t.getLocator(ne,ee),ke=t.getLocator(ne.replace(B0,""),ee),ht=t.getPackageInformation(ke);if(ht===null)throw new Error("Assertion failed: Expected the package to have been registered");let H=jj(ht,Ie,t,p);if(e.validateExternalSoftLinks&&e.project&&H){ht.packageDependencies.size>0&&(o=!0);for(let[_e,Te]of ht.packageDependencies)if(Te!==null){let Je=W.parseLocator(Array.isArray(Te)?`${Te[0]}@${Te[1]}`:`${_e}@${Te}`);if(gA(Je)!==gA(Ie)){let He=Pe.get(_e);if(He){let x=W.parseLocator(Array.isArray(He)?`${He[0]}@${He[1]}`:`${_e}@${He}`);CIe(x,Je)||r.push({messageName:71,text:`Cannot link ${W.prettyIdent(e.project.configuration,W.parseIdent(Ie.name))} into ${W.prettyLocator(e.project.configuration,W.parseLocator(`${T.name}@${T.reference}`))} dependency ${W.prettyLocator(e.project.configuration,Je)} conflicts with parent dependency ${W.prettyLocator(e.project.configuration,x)}`})}else{let x=ce.get(_e);if(x){let w=x.target,S=W.parseLocator(Array.isArray(w)?`${w[0]}@${w[1]}`:`${_e}@${w}`);CIe(S,Je)||r.push({messageName:71,text:`Cannot link ${W.prettyIdent(e.project.configuration,W.parseIdent(Ie.name))} into ${W.prettyLocator(e.project.configuration,W.parseLocator(`${T.name}@${T.reference}`))} dependency ${W.prettyLocator(e.project.configuration,Je)} conflicts with dependency ${W.prettyLocator(e.project.configuration,S)} from sibling portal ${W.prettyIdent(e.project.configuration,W.parseIdent(x.portal.name))}`})}else ce.set(_e,{target:Je.reference,portal:Ie})}}}}let lt=e.hoistingLimitsByCwd?.get(te),Re=H?te:K.relative(p,ue.toPortablePath(ht.packageLocation))||Bt.dot,Qe=e.hoistingLimitsByCwd?.get(Re);v(ne,ht,Ie,Ae,C,Pe,Re,lt==="dependencies"||Qe==="dependencies"||Qe==="workspaces")}}};return v(A.name,u,A,h,u,u.packageDependencies,Bt.dot,!1),{packageTree:h,hoistingLimits:a,errors:r,preserveSymlinksRequired:o}};function wIe(t,e,r){let o=r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation;return ue.toPortablePath(o||t.packageLocation)}function IIt(t,e,r){let o=e.getLocator(t.name.replace(B0,""),t.reference),a=e.getPackageInformation(o);if(a===null)throw new Error("Assertion failed: Expected the package to be registered");return r.pnpifyFs?{linkType:"SOFT",target:ue.toPortablePath(a.packageLocation)}:{linkType:a.linkType,target:wIe(a,t,e)}}var BIt=(t,e,r)=>{let o=new Map,a=(E,I,v)=>{let{linkType:b,target:C}=IIt(E,t,r);return{locator:gA(E),nodePath:I,target:C,linkType:b,aliases:v}},n=E=>{let[I,v]=E.split("/");return v?{scope:I,name:v}:{scope:null,name:I}},u=new Set,A=(E,I,v)=>{if(u.has(E))return;u.add(E);let b=Array.from(E.references).sort().join("#");for(let C of E.dependencies){let T=Array.from(C.references).sort().join("#");if(C.identName===E.identName.replace(B0,"")&&T===b)continue;let L=Array.from(C.references).sort(),U={name:C.identName,reference:L[0]},{name:J,scope:te}=n(C.name),le=te?[te,J]:[J],pe=K.join(I,EIe),Ae=K.join(pe,...le),ye=`${v}/${U.name}`,ae=a(U,v,L.slice(1)),we=!1;if(ae.linkType==="SOFT"&&r.project){let Pe=r.project.workspacesByCwd.get(ae.target.slice(0,-1));we=!!(Pe&&!Pe.manifest.name)}if(!C.name.endsWith(B0)&&!we){let Pe=o.get(Ae);if(Pe){if(Pe.dirList)throw new Error(`Assertion failed: ${Ae} cannot merge dir node with leaf node`);{let De=W.parseLocator(Pe.locator),ce=W.parseLocator(ae.locator);if(Pe.linkType!==ae.linkType)throw new Error(`Assertion failed: ${Ae} cannot merge nodes with different link types ${Pe.nodePath}/${W.stringifyLocator(De)} and ${v}/${W.stringifyLocator(ce)}`);if(De.identHash!==ce.identHash)throw new Error(`Assertion failed: ${Ae} cannot merge nodes with different idents ${Pe.nodePath}/${W.stringifyLocator(De)} and ${v}/s${W.stringifyLocator(ce)}`);ae.aliases=[...ae.aliases,...Pe.aliases,W.parseLocator(Pe.locator).reference]}}o.set(Ae,ae);let g=Ae.split("/"),Ee=g.indexOf(EIe);for(let De=g.length-1;Ee>=0&&De>Ee;De--){let ce=ue.toPortablePath(g.slice(0,De).join(K.sep)),ne=g[De],ee=o.get(ce);if(!ee)o.set(ce,{dirList:new Set([ne])});else if(ee.dirList){if(ee.dirList.has(ne))break;ee.dirList.add(ne)}}}A(C,ae.linkType==="SOFT"?ae.target:Ae,ye)}},p=a({name:e.name,reference:Array.from(e.references)[0]},"",[]),h=p.target;return o.set(h,p),A(e,h,""),o};Ye();Ye();Pt();Pt();nA();Nl();var lq={};Kt(lq,{PnpInstaller:()=>dm,PnpLinker:()=>P0,UnplugCommand:()=>x0,default:()=>$It,getPnpPath:()=>S0,jsInstallUtils:()=>mA,pnpUtils:()=>av,quotePathIfNeeded:()=>s1e});Pt();var i1e=Be("url");Ye();Ye();Pt();Pt();var IIe={["DEFAULT"]:{collapsed:!1,next:{["*"]:"DEFAULT"}},["TOP_LEVEL"]:{collapsed:!1,next:{fallbackExclusionList:"FALLBACK_EXCLUSION_LIST",packageRegistryData:"PACKAGE_REGISTRY_DATA",["*"]:"DEFAULT"}},["FALLBACK_EXCLUSION_LIST"]:{collapsed:!1,next:{["*"]:"FALLBACK_EXCLUSION_ENTRIES"}},["FALLBACK_EXCLUSION_ENTRIES"]:{collapsed:!0,next:{["*"]:"FALLBACK_EXCLUSION_DATA"}},["FALLBACK_EXCLUSION_DATA"]:{collapsed:!0,next:{["*"]:"DEFAULT"}},["PACKAGE_REGISTRY_DATA"]:{collapsed:!1,next:{["*"]:"PACKAGE_REGISTRY_ENTRIES"}},["PACKAGE_REGISTRY_ENTRIES"]:{collapsed:!0,next:{["*"]:"PACKAGE_STORE_DATA"}},["PACKAGE_STORE_DATA"]:{collapsed:!1,next:{["*"]:"PACKAGE_STORE_ENTRIES"}},["PACKAGE_STORE_ENTRIES"]:{collapsed:!0,next:{["*"]:"PACKAGE_INFORMATION_DATA"}},["PACKAGE_INFORMATION_DATA"]:{collapsed:!1,next:{packageDependencies:"PACKAGE_DEPENDENCIES",["*"]:"DEFAULT"}},["PACKAGE_DEPENDENCIES"]:{collapsed:!1,next:{["*"]:"PACKAGE_DEPENDENCY"}},["PACKAGE_DEPENDENCY"]:{collapsed:!0,next:{["*"]:"DEFAULT"}}};function vIt(t,e,r){let o="";o+="[";for(let a=0,n=t.length;a"u"||(A!==0&&(a+=", "),a+=JSON.stringify(p),a+=": ",a+=wQ(p,h,e,r).replace(/^ +/g,""),A+=1)}return a+="}",a}function SIt(t,e,r){let o=Object.keys(t),a=`${r} `,n="";n+=r,n+=`{ +`;let u=0;for(let A=0,p=o.length;A"u"||(u!==0&&(n+=",",n+=` +`),n+=a,n+=JSON.stringify(h),n+=": ",n+=wQ(h,E,e,a).replace(/^ +/g,""),u+=1)}return u!==0&&(n+=` +`),n+=r,n+="}",n}function wQ(t,e,r,o){let{next:a}=IIe[r],n=a[t]||a["*"];return BIe(e,n,o)}function BIe(t,e,r){let{collapsed:o}=IIe[e];return Array.isArray(t)?o?vIt(t,e,r):DIt(t,e,r):typeof t=="object"&&t!==null?o?PIt(t,e,r):SIt(t,e,r):JSON.stringify(t)}function vIe(t){return BIe(t,"TOP_LEVEL","")}function zB(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let o=[];for(let n of e)o.push(r.map(u=>n(u)));let a=r.map((n,u)=>u);return a.sort((n,u)=>{for(let A of o){let p=A[n]A[u]?1:0;if(p!==0)return p}return 0}),a.map(n=>r[n])}function xIt(t){let e=new Map,r=zB(t.fallbackExclusionList||[],[({name:o,reference:a})=>o,({name:o,reference:a})=>a]);for(let{name:o,reference:a}of r){let n=e.get(o);typeof n>"u"&&e.set(o,n=new Set),n.add(a)}return Array.from(e).map(([o,a])=>[o,Array.from(a)])}function bIt(t){return zB(t.fallbackPool||[],([e])=>e)}function kIt(t){let e=[];for(let[r,o]of zB(t.packageRegistry,([a])=>a===null?"0":`1${a}`)){let a=[];e.push([r,a]);for(let[n,{packageLocation:u,packageDependencies:A,packagePeers:p,linkType:h,discardFromLookup:E}]of zB(o,([I])=>I===null?"0":`1${I}`)){let I=[];r!==null&&n!==null&&!A.has(r)&&I.push([r,n]);for(let[C,T]of zB(A.entries(),([L])=>L))I.push([C,T]);let v=p&&p.size>0?Array.from(p):void 0,b=E||void 0;a.push([n,{packageLocation:u,packageDependencies:I,packagePeers:v,linkType:h,discardFromLookup:b}])}}return e}function XB(t){return{__info:["This file is automatically generated. Do not touch it, or risk","your modifications being lost."],dependencyTreeRoots:t.dependencyTreeRoots,enableTopLevelFallback:t.enableTopLevelFallback||!1,ignorePatternData:t.ignorePattern||null,fallbackExclusionList:xIt(t),fallbackPool:bIt(t),packageRegistryData:kIt(t)}}var SIe=$e(PIe());function xIe(t,e){return[t?`${t} +`:"",`/* eslint-disable */ +`,`"use strict"; +`,` +`,e,` +`,(0,SIe.default)()].join("")}function QIt(t){return JSON.stringify(t,null,2)}function FIt(t){return`'${t.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,`\\ +`)}'`}function TIt(t){return[`const RAW_RUNTIME_STATE = +`,`${FIt(vIe(t))}; + +`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) { +`,` return hydrateRuntimeState(JSON.parse(RAW_RUNTIME_STATE), {basePath: basePath || __dirname}); +`,`} +`].join("")}function RIt(){return[`function $$SETUP_STATE(hydrateRuntimeState, basePath) { +`,` const fs = require('fs'); +`,` const path = require('path'); +`,` const pnpDataFilepath = path.resolve(__dirname, ${JSON.stringify(dr.pnpData)}); +`,` return hydrateRuntimeState(JSON.parse(fs.readFileSync(pnpDataFilepath, 'utf8')), {basePath: basePath || __dirname}); +`,`} +`].join("")}function bIe(t){let e=XB(t),r=TIt(e);return xIe(t.shebang,r)}function kIe(t){let e=XB(t),r=RIt(),o=xIe(t.shebang,r);return{dataFile:QIt(e),loaderFile:o}}Pt();function Yj(t,{basePath:e}){let r=ue.toPortablePath(e),o=K.resolve(r),a=t.ignorePatternData!==null?new RegExp(t.ignorePatternData):null,n=new Map,u=new Map(t.packageRegistryData.map(([I,v])=>[I,new Map(v.map(([b,C])=>{if(I===null!=(b===null))throw new Error("Assertion failed: The name and reference should be null, or neither should");let T=C.discardFromLookup??!1,L={name:I,reference:b},U=n.get(C.packageLocation);U?(U.discardFromLookup=U.discardFromLookup&&T,T||(U.locator=L)):n.set(C.packageLocation,{locator:L,discardFromLookup:T});let J=null;return[b,{packageDependencies:new Map(C.packageDependencies),packagePeers:new Set(C.packagePeers),linkType:C.linkType,discardFromLookup:T,get packageLocation(){return J||(J=K.join(o,C.packageLocation))}}]}))])),A=new Map(t.fallbackExclusionList.map(([I,v])=>[I,new Set(v)])),p=new Map(t.fallbackPool),h=t.dependencyTreeRoots,E=t.enableTopLevelFallback;return{basePath:r,dependencyTreeRoots:h,enableTopLevelFallback:E,fallbackExclusionList:A,fallbackPool:p,ignorePattern:a,packageLocatorsByLocations:n,packageRegistry:u}}Pt();Pt();var rp=Be("module"),gm=Be("url"),tq=Be("util");var Oo=Be("url");var RIe=$e(Be("assert"));var Wj=Array.isArray,ZB=JSON.stringify,$B=Object.getOwnPropertyNames,pm=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),Vj=(t,e)=>RegExp.prototype.exec.call(t,e),Kj=(t,...e)=>RegExp.prototype[Symbol.replace].apply(t,e),v0=(t,...e)=>String.prototype.endsWith.apply(t,e),Jj=(t,...e)=>String.prototype.includes.apply(t,e),zj=(t,...e)=>String.prototype.lastIndexOf.apply(t,e),ev=(t,...e)=>String.prototype.indexOf.apply(t,e),QIe=(t,...e)=>String.prototype.replace.apply(t,e),D0=(t,...e)=>String.prototype.slice.apply(t,e),dA=(t,...e)=>String.prototype.startsWith.apply(t,e),FIe=Map,TIe=JSON.parse;function tv(t,e,r){return class extends r{constructor(...o){super(e(...o)),this.code=t,this.name=`${r.name} [${t}]`}}}var NIe=tv("ERR_PACKAGE_IMPORT_NOT_DEFINED",(t,e,r)=>`Package import specifier "${t}" is not defined${e?` in package ${e}package.json`:""} imported from ${r}`,TypeError),Xj=tv("ERR_INVALID_MODULE_SPECIFIER",(t,e,r=void 0)=>`Invalid module "${t}" ${e}${r?` imported from ${r}`:""}`,TypeError),LIe=tv("ERR_INVALID_PACKAGE_TARGET",(t,e,r,o=!1,a=void 0)=>{let n=typeof r=="string"&&!o&&r.length&&!dA(r,"./");return e==="."?((0,RIe.default)(o===!1),`Invalid "exports" main target ${ZB(r)} defined in the package config ${t}package.json${a?` imported from ${a}`:""}${n?'; targets must start with "./"':""}`):`Invalid "${o?"imports":"exports"}" target ${ZB(r)} defined for '${e}' in the package config ${t}package.json${a?` imported from ${a}`:""}${n?'; targets must start with "./"':""}`},Error),rv=tv("ERR_INVALID_PACKAGE_CONFIG",(t,e,r)=>`Invalid package config ${t}${e?` while importing ${e}`:""}${r?`. ${r}`:""}`,Error),MIe=tv("ERR_PACKAGE_PATH_NOT_EXPORTED",(t,e,r=void 0)=>e==="."?`No "exports" main defined in ${t}package.json${r?` imported from ${r}`:""}`:`Package subpath '${e}' is not defined by "exports" in ${t}package.json${r?` imported from ${r}`:""}`,Error);var BQ=Be("url");function OIe(t,e){let r=Object.create(null);for(let o=0;oe):t+e}nv(r,t,o,u,a)}Vj(_Ie,D0(t,2))!==null&&nv(r,t,o,u,a);let p=new URL(t,o),h=p.pathname,E=new URL(".",o).pathname;if(dA(h,E)||nv(r,t,o,u,a),e==="")return p;if(Vj(_Ie,e)!==null){let I=n?QIe(r,"*",()=>e):r+e;MIt(I,o,u,a)}return n?new URL(Kj(HIe,p.href,()=>e)):new URL(e,p)}function UIt(t){let e=+t;return`${e}`!==t?!1:e>=0&&e<4294967295}function qC(t,e,r,o,a,n,u,A){if(typeof e=="string")return OIt(e,r,o,t,a,n,u,A);if(Wj(e)){if(e.length===0)return null;let p;for(let h=0;hn?-1:n>a||r===-1?1:o===-1||t.length>e.length?-1:e.length>t.length?1:0}function _It(t,e,r){if(typeof t=="string"||Wj(t))return!0;if(typeof t!="object"||t===null)return!1;let o=$B(t),a=!1,n=0;for(let u=0;u=h.length&&v0(e,I)&&qIe(n,h)===1&&zj(h,"*")===E&&(n=h,u=D0(e,E,e.length-I.length))}}if(n){let p=r[n],h=qC(t,p,u,n,o,!0,!1,a);return h==null&&Zj(e,t,o),h}Zj(e,t,o)}function YIe({name:t,base:e,conditions:r,readFileSyncFn:o}){if(t==="#"||dA(t,"#/")||v0(t,"/")){let u="is not a valid internal imports specifier name";throw new Xj(t,u,(0,Oo.fileURLToPath)(e))}let a,n=UIe(e,o);if(n.exists){a=(0,Oo.pathToFileURL)(n.pjsonPath);let u=n.imports;if(u)if(pm(u,t)&&!Jj(t,"*")){let A=qC(a,u[t],"",t,e,!1,!0,r);if(A!=null)return A}else{let A="",p,h=$B(u);for(let E=0;E=I.length&&v0(t,b)&&qIe(A,I)===1&&zj(I,"*")===v&&(A=I,p=D0(t,v,t.length-b.length))}}if(A){let E=u[A],I=qC(a,E,p,A,e,!0,!0,r);if(I!=null)return I}}}LIt(t,a,e)}Pt();var jIt=new Set(["BUILTIN_NODE_RESOLUTION_FAILED","MISSING_DEPENDENCY","MISSING_PEER_DEPENDENCY","QUALIFIED_PATH_RESOLUTION_FAILED","UNDECLARED_DEPENDENCY"]);function $i(t,e,r={},o){o??=jIt.has(t)?"MODULE_NOT_FOUND":t;let a={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:{...a,value:o},pnpCode:{...a,value:t},data:{...a,value:r}})}function au(t){return ue.normalize(ue.fromPortablePath(t))}var JIe=$e(VIe());function zIe(t){return qIt(),eq[t]}var eq;function qIt(){eq||(eq={"--conditions":[],...KIe(GIt()),...KIe(process.execArgv)})}function KIe(t){return(0,JIe.default)({"--conditions":[String],"-C":"--conditions"},{argv:t,permissive:!0})}function GIt(){let t=[],e=YIt(process.env.NODE_OPTIONS||"",t);return t.length,e}function YIt(t,e){let r=[],o=!1,a=!0;for(let n=0;nparseInt(t,10)),XIe=hm>19||hm===19&&sv>=2||hm===18&&sv>=13,Bzt=hm===20&&sv<6||hm===19&&sv>=3,vzt=hm>19||hm===19&&sv>=6;function ZIe(t){if(process.env.WATCH_REPORT_DEPENDENCIES&&process.send)if(t=t.map(e=>ue.fromPortablePath(mi.resolveVirtual(ue.toPortablePath(e)))),XIe)process.send({"watch:require":t});else for(let e of t)process.send({"watch:require":e})}function rq(t,e){let r=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,o=Number(process.env.PNP_DEBUG_LEVEL),a=/^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/,n=/^(\/|\.{1,2}(\/|$))/,u=/\/$/,A=/^\.{0,2}\//,p={name:null,reference:null},h=[],E=new Set;if(t.enableTopLevelFallback===!0&&h.push(p),e.compatibilityMode!==!1)for(let Re of["react-scripts","gatsby"]){let Qe=t.packageRegistry.get(Re);if(Qe)for(let be of Qe.keys()){if(be===null)throw new Error("Assertion failed: This reference shouldn't be null");h.push({name:Re,reference:be})}}let{ignorePattern:I,packageRegistry:v,packageLocatorsByLocations:b}=t;function C(Re,Qe){return{fn:Re,args:Qe,error:null,result:null}}function T(Re){let Qe=process.stderr?.hasColors?.()??process.stdout.isTTY,be=(Je,He)=>`\x1B[${Je}m${He}\x1B[0m`,_e=Re.error;console.error(_e?be("31;1",`\u2716 ${Re.error?.message.replace(/\n.*/s,"")}`):be("33;1","\u203C Resolution")),Re.args.length>0&&console.error();for(let Je of Re.args)console.error(` ${be("37;1","In \u2190")} ${(0,tq.inspect)(Je,{colors:Qe,compact:!0})}`);Re.result&&(console.error(),console.error(` ${be("37;1","Out \u2192")} ${(0,tq.inspect)(Re.result,{colors:Qe,compact:!0})}`));let Te=new Error().stack.match(/(?<=^ +)at.*/gm)?.slice(2)??[];if(Te.length>0){console.error();for(let Je of Te)console.error(` ${be("38;5;244",Je)}`)}console.error()}function L(Re,Qe){if(e.allowDebug===!1)return Qe;if(Number.isFinite(o)){if(o>=2)return(...be)=>{let _e=C(Re,be);try{return _e.result=Qe(...be)}catch(Te){throw _e.error=Te}finally{T(_e)}};if(o>=1)return(...be)=>{try{return Qe(...be)}catch(_e){let Te=C(Re,be);throw Te.error=_e,T(Te),_e}}}return Qe}function U(Re){let Qe=g(Re);if(!Qe)throw $i("INTERNAL","Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)");return Qe}function J(Re){if(Re.name===null)return!0;for(let Qe of t.dependencyTreeRoots)if(Qe.name===Re.name&&Qe.reference===Re.reference)return!0;return!1}let te=new Set(["node","require",...zIe("--conditions")]);function le(Re,Qe=te,be){let _e=ce(K.join(Re,"internal.js"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(_e===null)throw $i("INTERNAL",`The locator that owns the "${Re}" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:Te}=U(_e),Je=K.join(Te,dr.manifest);if(!e.fakeFs.existsSync(Je))return null;let He=JSON.parse(e.fakeFs.readFileSync(Je,"utf8"));if(He.exports==null)return null;let x=K.contains(Te,Re);if(x===null)throw $i("INTERNAL","unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)");x!=="."&&!A.test(x)&&(x=`./${x}`);try{let w=GIe({packageJSONUrl:(0,gm.pathToFileURL)(ue.fromPortablePath(Je)),packageSubpath:x,exports:He.exports,base:be?(0,gm.pathToFileURL)(ue.fromPortablePath(be)):null,conditions:Qe});return ue.toPortablePath((0,gm.fileURLToPath)(w))}catch(w){throw $i("EXPORTS_RESOLUTION_FAILED",w.message,{unqualifiedPath:au(Re),locator:_e,pkgJson:He,subpath:au(x),conditions:Qe},w.code)}}function pe(Re,Qe,{extensions:be}){let _e;try{Qe.push(Re),_e=e.fakeFs.statSync(Re)}catch{}if(_e&&!_e.isDirectory())return e.fakeFs.realpathSync(Re);if(_e&&_e.isDirectory()){let Te;try{Te=JSON.parse(e.fakeFs.readFileSync(K.join(Re,dr.manifest),"utf8"))}catch{}let Je;if(Te&&Te.main&&(Je=K.resolve(Re,Te.main)),Je&&Je!==Re){let He=pe(Je,Qe,{extensions:be});if(He!==null)return He}}for(let Te=0,Je=be.length;Te{let x=JSON.stringify(He.name);if(_e.has(x))return;_e.add(x);let w=Ee(He);for(let S of w)if(U(S).packagePeers.has(Re))Te(S);else{let F=be.get(S.name);typeof F>"u"&&be.set(S.name,F=new Set),F.add(S.reference)}};Te(Qe);let Je=[];for(let He of[...be.keys()].sort())for(let x of[...be.get(He)].sort())Je.push({name:He,reference:x});return Je}function ce(Re,{resolveIgnored:Qe=!1,includeDiscardFromLookup:be=!1}={}){if(ae(Re)&&!Qe)return null;let _e=K.relative(t.basePath,Re);_e.match(n)||(_e=`./${_e}`),_e.endsWith("/")||(_e=`${_e}/`);do{let Te=b.get(_e);if(typeof Te>"u"||Te.discardFromLookup&&!be){_e=_e.substring(0,_e.lastIndexOf("/",_e.length-2)+1);continue}return Te.locator}while(_e!=="");return null}function ne(Re){try{return e.fakeFs.readFileSync(ue.toPortablePath(Re),"utf8")}catch(Qe){if(Qe.code==="ENOENT")return;throw Qe}}function ee(Re,Qe,{considerBuiltins:be=!0}={}){if(Re.startsWith("#"))throw new Error("resolveToUnqualified can not handle private import mappings");if(Re==="pnpapi")return ue.toPortablePath(e.pnpapiResolution);if(be&&(0,rp.isBuiltin)(Re))return null;let _e=au(Re),Te=Qe&&au(Qe);if(Qe&&ae(Qe)&&(!K.isAbsolute(Re)||ce(Re)===null)){let x=ye(Re,Qe);if(x===!1)throw $i("BUILTIN_NODE_RESOLUTION_FAILED",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp) + +Require request: "${_e}" +Required by: ${Te} +`,{request:_e,issuer:Te});return ue.toPortablePath(x)}let Je,He=Re.match(a);if(He){if(!Qe)throw $i("API_ERROR","The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:_e,issuer:Te});let[,x,w]=He,S=ce(Qe);if(!S){let Ne=ye(Re,Qe);if(Ne===!1)throw $i("BUILTIN_NODE_RESOLUTION_FAILED",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree). + +Require path: "${_e}" +Required by: ${Te} +`,{request:_e,issuer:Te});return ue.toPortablePath(Ne)}let F=U(S).packageDependencies.get(x),z=null;if(F==null&&S.name!==null){let Ne=t.fallbackExclusionList.get(S.name);if(!Ne||!Ne.has(S.reference)){for(let dt=0,jt=h.length;dtJ(ot))?X=$i("MISSING_PEER_DEPENDENCY",`${S.name} tried to access ${x} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. + +Required package: ${x}${x!==_e?` (via "${_e}")`:""} +Required by: ${S.name}@${S.reference} (via ${Te}) +${Ne.map(ot=>`Ancestor breaking the chain: ${ot.name}@${ot.reference} +`).join("")} +`,{request:_e,issuer:Te,issuerLocator:Object.assign({},S),dependencyName:x,brokenAncestors:Ne}):X=$i("MISSING_PEER_DEPENDENCY",`${S.name} tried to access ${x} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. + +Required package: ${x}${x!==_e?` (via "${_e}")`:""} +Required by: ${S.name}@${S.reference} (via ${Te}) + +${Ne.map(ot=>`Ancestor breaking the chain: ${ot.name}@${ot.reference} +`).join("")} +`,{request:_e,issuer:Te,issuerLocator:Object.assign({},S),dependencyName:x,brokenAncestors:Ne})}else F===void 0&&(!be&&(0,rp.isBuiltin)(Re)?J(S)?X=$i("UNDECLARED_DEPENDENCY",`Your application tried to access ${x}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${x} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. + +Required package: ${x}${x!==_e?` (via "${_e}")`:""} +Required by: ${Te} +`,{request:_e,issuer:Te,dependencyName:x}):X=$i("UNDECLARED_DEPENDENCY",`${S.name} tried to access ${x}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${x} isn't otherwise declared in ${S.name}'s dependencies, this makes the require call ambiguous and unsound. + +Required package: ${x}${x!==_e?` (via "${_e}")`:""} +Required by: ${Te} +`,{request:_e,issuer:Te,issuerLocator:Object.assign({},S),dependencyName:x}):J(S)?X=$i("UNDECLARED_DEPENDENCY",`Your application tried to access ${x}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. + +Required package: ${x}${x!==_e?` (via "${_e}")`:""} +Required by: ${Te} +`,{request:_e,issuer:Te,dependencyName:x}):X=$i("UNDECLARED_DEPENDENCY",`${S.name} tried to access ${x}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. + +Required package: ${x}${x!==_e?` (via "${_e}")`:""} +Required by: ${S.name}@${S.reference} (via ${Te}) +`,{request:_e,issuer:Te,issuerLocator:Object.assign({},S),dependencyName:x}));if(F==null){if(z===null||X===null)throw X||new Error("Assertion failed: Expected an error to have been set");F=z;let Ne=X.message.replace(/\n.*/g,"");X.message=Ne,!E.has(Ne)&&o!==0&&(E.add(Ne),process.emitWarning(X))}let Z=Array.isArray(F)?{name:F[0],reference:F[1]}:{name:x,reference:F},ie=U(Z);if(!ie.packageLocation)throw $i("MISSING_DEPENDENCY",`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod. + +Required package: ${Z.name}@${Z.reference}${Z.name!==_e?` (via "${_e}")`:""} +Required by: ${S.name}@${S.reference} (via ${Te}) +`,{request:_e,issuer:Te,dependencyLocator:Object.assign({},Z)});let Se=ie.packageLocation;w?Je=K.join(Se,w):Je=Se}else if(K.isAbsolute(Re))Je=K.normalize(Re);else{if(!Qe)throw $i("API_ERROR","The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:_e,issuer:Te});let x=K.resolve(Qe);Qe.match(u)?Je=K.normalize(K.join(x,Re)):Je=K.normalize(K.join(K.dirname(x),Re))}return K.normalize(Je)}function Ie(Re,Qe,be=te,_e){if(n.test(Re))return Qe;let Te=le(Qe,be,_e);return Te?K.normalize(Te):Qe}function ke(Re,{extensions:Qe=Object.keys(rp.Module._extensions)}={}){let be=[],_e=pe(Re,be,{extensions:Qe});if(_e)return K.normalize(_e);{ZIe(be.map(He=>ue.fromPortablePath(He)));let Te=au(Re),Je=ce(Re);if(Je){let{packageLocation:He}=U(Je),x=!0;try{e.fakeFs.accessSync(He)}catch(w){if(w?.code==="ENOENT")x=!1;else{let S=(w?.message??w??"empty exception thrown").replace(/^[A-Z]/,y=>y.toLowerCase());throw $i("QUALIFIED_PATH_RESOLUTION_FAILED",`Required package exists but could not be accessed (${S}). + +Missing package: ${Je.name}@${Je.reference} +Expected package location: ${au(He)} +`,{unqualifiedPath:Te,extensions:Qe})}}if(!x){let w=He.includes("/unplugged/")?"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).":"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.";throw $i("QUALIFIED_PATH_RESOLUTION_FAILED",`${w} + +Missing package: ${Je.name}@${Je.reference} +Expected package location: ${au(He)} +`,{unqualifiedPath:Te,extensions:Qe})}}throw $i("QUALIFIED_PATH_RESOLUTION_FAILED",`Qualified path resolution failed: we looked for the following paths, but none could be accessed. + +Source path: ${Te} +${be.map(He=>`Not found: ${au(He)} +`).join("")}`,{unqualifiedPath:Te,extensions:Qe})}}function ht(Re,Qe,be){if(!Qe)throw new Error("Assertion failed: An issuer is required to resolve private import mappings");let _e=YIe({name:Re,base:(0,gm.pathToFileURL)(ue.fromPortablePath(Qe)),conditions:be.conditions??te,readFileSyncFn:ne});if(_e instanceof URL)return ke(ue.toPortablePath((0,gm.fileURLToPath)(_e)),{extensions:be.extensions});if(_e.startsWith("#"))throw new Error("Mapping from one private import to another isn't allowed");return H(_e,Qe,be)}function H(Re,Qe,be={}){try{if(Re.startsWith("#"))return ht(Re,Qe,be);let{considerBuiltins:_e,extensions:Te,conditions:Je}=be,He=ee(Re,Qe,{considerBuiltins:_e});if(Re==="pnpapi")return He;if(He===null)return null;let x=()=>Qe!==null?ae(Qe):!1,w=(!_e||!(0,rp.isBuiltin)(Re))&&!x()?Ie(Re,He,Je,Qe):He;return ke(w,{extensions:Te})}catch(_e){throw Object.hasOwn(_e,"pnpCode")&&Object.assign(_e.data,{request:au(Re),issuer:Qe&&au(Qe)}),_e}}function lt(Re){let Qe=K.normalize(Re),be=mi.resolveVirtual(Qe);return be!==Qe?be:null}return{VERSIONS:we,topLevel:Pe,getLocator:(Re,Qe)=>Array.isArray(Qe)?{name:Qe[0],reference:Qe[1]}:{name:Re,reference:Qe},getDependencyTreeRoots:()=>[...t.dependencyTreeRoots],getAllLocators(){let Re=[];for(let[Qe,be]of v)for(let _e of be.keys())Qe!==null&&_e!==null&&Re.push({name:Qe,reference:_e});return Re},getPackageInformation:Re=>{let Qe=g(Re);if(Qe===null)return null;let be=ue.fromPortablePath(Qe.packageLocation);return{...Qe,packageLocation:be}},findPackageLocator:Re=>ce(ue.toPortablePath(Re)),resolveToUnqualified:L("resolveToUnqualified",(Re,Qe,be)=>{let _e=Qe!==null?ue.toPortablePath(Qe):null,Te=ee(ue.toPortablePath(Re),_e,be);return Te===null?null:ue.fromPortablePath(Te)}),resolveUnqualified:L("resolveUnqualified",(Re,Qe)=>ue.fromPortablePath(ke(ue.toPortablePath(Re),Qe))),resolveRequest:L("resolveRequest",(Re,Qe,be)=>{let _e=Qe!==null?ue.toPortablePath(Qe):null,Te=H(ue.toPortablePath(Re),_e,be);return Te===null?null:ue.fromPortablePath(Te)}),resolveVirtual:L("resolveVirtual",Re=>{let Qe=lt(ue.toPortablePath(Re));return Qe!==null?ue.fromPortablePath(Qe):null})}}Pt();var $Ie=(t,e,r)=>{let o=XB(t),a=Yj(o,{basePath:e}),n=ue.join(e,dr.pnpCjs);return rq(a,{fakeFs:r,pnpapiResolution:n})};var iq=$e(t1e());qt();var mA={};Kt(mA,{checkManifestCompatibility:()=>r1e,extractBuildRequest:()=>vQ,getExtractHint:()=>sq,hasBindingGyp:()=>oq});Ye();Pt();function r1e(t){return W.isPackageCompatible(t,Ji.getArchitectureSet())}function vQ(t,e,r,{configuration:o}){let a=[];for(let n of["preinstall","install","postinstall"])e.manifest.scripts.has(n)&&a.push({type:0,script:n});return!e.manifest.scripts.has("install")&&e.misc.hasBindingGyp&&a.push({type:1,script:"node-gyp rebuild"}),a.length===0?null:t.linkType!=="HARD"?{skipped:!0,explain:n=>n.reportWarningOnce(6,`${W.prettyLocator(o,t)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`)}:r&&r.built===!1?{skipped:!0,explain:n=>n.reportInfoOnce(5,`${W.prettyLocator(o,t)} lists build scripts, but its build has been explicitly disabled through configuration.`)}:!o.get("enableScripts")&&!r.built?{skipped:!0,explain:n=>n.reportWarningOnce(4,`${W.prettyLocator(o,t)} lists build scripts, but all build scripts have been disabled.`)}:r1e(t)?{skipped:!1,directives:a}:{skipped:!0,explain:n=>n.reportWarningOnce(76,`${W.prettyLocator(o,t)} The ${Ji.getArchitectureName()} architecture is incompatible with this package, build skipped.`)}}var VIt=new Set([".exe",".bin",".h",".hh",".hpp",".c",".cc",".cpp",".java",".jar",".node"]);function sq(t){return t.packageFs.getExtractHint({relevantExtensions:VIt})}function oq(t){let e=K.join(t.prefixPath,"binding.gyp");return t.packageFs.existsSync(e)}var av={};Kt(av,{getUnpluggedPath:()=>ov});Ye();Pt();function ov(t,{configuration:e}){return K.resolve(e.get("pnpUnpluggedFolder"),W.slugifyLocator(t))}var KIt=new Set([W.makeIdent(null,"open").identHash,W.makeIdent(null,"opn").identHash]),P0=class{constructor(){this.mode="strict";this.pnpCache=new Map}getCustomDataKey(){return JSON.stringify({name:"PnpLinker",version:2})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the PnP linker to be enabled");let o=S0(r.project).cjs;if(!oe.existsSync(o))throw new it(`The project in ${de.pretty(r.project.configuration,`${r.project.cwd}/package.json`,de.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let a=je.getFactoryWithDefault(this.pnpCache,o,()=>je.dynamicRequire(o,{cachingStrategy:je.CachingStrategy.FsTime})),n={name:W.stringifyIdent(e),reference:e.reference},u=a.getPackageInformation(n);if(!u)throw new it(`Couldn't find ${W.prettyLocator(r.project.configuration,e)} in the currently installed PnP map - running an install might help`);return ue.toPortablePath(u.packageLocation)}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let o=S0(r.project).cjs;if(!oe.existsSync(o))return null;let n=je.getFactoryWithDefault(this.pnpCache,o,()=>je.dynamicRequire(o,{cachingStrategy:je.CachingStrategy.FsTime})).findPackageLocator(ue.fromPortablePath(e));return n?W.makeLocator(W.parseIdent(n.name),n.reference):null}makeInstaller(e){return new dm(e)}isEnabled(e){return!(e.project.configuration.get("nodeLinker")!=="pnp"||e.project.configuration.get("pnpMode")!==this.mode)}},dm=class{constructor(e){this.opts=e;this.mode="strict";this.asyncActions=new je.AsyncActions(10);this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}attachCustomData(e){this.customData=e}async installPackage(e,r,o){let a=W.stringifyIdent(e),n=e.reference,u=!!this.opts.project.tryWorkspaceByLocator(e),A=W.isVirtualLocator(e),p=e.peerDependencies.size>0&&!A,h=!p&&!u,E=!p&&e.linkType!=="SOFT",I,v;if(h||E){let te=A?W.devirtualizeLocator(e):e;I=this.customData.store.get(te.locatorHash),typeof I>"u"&&(I=await JIt(r),e.linkType==="HARD"&&this.customData.store.set(te.locatorHash,I)),I.manifest.type==="module"&&(this.isESMLoaderRequired=!0),v=this.opts.project.getDependencyMeta(te,e.version)}let b=h?vQ(e,I,v,{configuration:this.opts.project.configuration}):null,C=E?await this.unplugPackageIfNeeded(e,I,r,v,o):r.packageFs;if(K.isAbsolute(r.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${r.prefixPath}) to be relative to the parent`);let T=K.resolve(C.getRealPath(),r.prefixPath),L=aq(this.opts.project.cwd,T),U=new Map,J=new Set;if(A){for(let te of e.peerDependencies.values())U.set(W.stringifyIdent(te),null),J.add(W.stringifyIdent(te));if(!u){let te=W.devirtualizeLocator(e);this.virtualTemplates.set(te.locatorHash,{location:aq(this.opts.project.cwd,mi.resolveVirtual(T)),locator:te})}}return je.getMapWithDefault(this.packageRegistry,a).set(n,{packageLocation:L,packageDependencies:U,packagePeers:J,linkType:e.linkType,discardFromLookup:r.discardFromLookup||!1}),{packageLocation:T,buildRequest:b}}async attachInternalDependencies(e,r){let o=this.getPackageInformation(e);for(let[a,n]of r){let u=W.areIdentsEqual(a,n)?n.reference:[W.stringifyIdent(n),n.reference];o.packageDependencies.set(W.stringifyIdent(a),u)}}async attachExternalDependents(e,r){for(let o of r)this.getDiskInformation(o).packageDependencies.set(W.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;let e=S0(this.opts.project);if(this.isEsmEnabled()||await oe.removePromise(e.esmLoader),this.opts.project.configuration.get("nodeLinker")!=="pnp"){await oe.removePromise(e.cjs),await oe.removePromise(e.data),await oe.removePromise(e.esmLoader),await oe.removePromise(this.opts.project.configuration.get("pnpUnpluggedFolder"));return}for(let{locator:E,location:I}of this.virtualTemplates.values())je.getMapWithDefault(this.packageRegistry,W.stringifyIdent(E)).set(E.reference,{packageLocation:I,packageDependencies:new Map,packagePeers:new Set,linkType:"SOFT",discardFromLookup:!1});this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));let r=this.opts.project.configuration.get("pnpFallbackMode"),o=this.opts.project.workspaces.map(({anchoredLocator:E})=>({name:W.stringifyIdent(E),reference:E.reference})),a=r!=="none",n=[],u=new Map,A=je.buildIgnorePattern([".yarn/sdks/**",...this.opts.project.configuration.get("pnpIgnorePatterns")]),p=this.packageRegistry,h=this.opts.project.configuration.get("pnpShebang");if(r==="dependencies-only")for(let E of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(E)&&n.push({name:W.stringifyIdent(E),reference:E.reference});return await this.asyncActions.wait(),await this.finalizeInstallWithPnp({dependencyTreeRoots:o,enableTopLevelFallback:a,fallbackExclusionList:n,fallbackPool:u,ignorePattern:A,packageRegistry:p,shebang:h}),{customData:this.customData}}async transformPnpSettings(e){}isEsmEnabled(){if(this.opts.project.configuration.sources.has("pnpEnableEsmLoader"))return this.opts.project.configuration.get("pnpEnableEsmLoader");if(this.isESMLoaderRequired)return!0;for(let e of this.opts.project.workspaces)if(e.manifest.type==="module")return!0;return!1}async finalizeInstallWithPnp(e){let r=S0(this.opts.project),o=await this.locateNodeModules(e.ignorePattern);if(o.length>0){this.opts.report.reportWarning(31,"One or more node_modules have been detected and will be removed. This operation may take some time.");for(let n of o)await oe.removePromise(n)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get("pnpEnableInlining")){let n=bIe(e);await oe.changeFilePromise(r.cjs,n,{automaticNewlines:!0,mode:493}),await oe.removePromise(r.data)}else{let{dataFile:n,loaderFile:u}=kIe(e);await oe.changeFilePromise(r.cjs,u,{automaticNewlines:!0,mode:493}),await oe.changeFilePromise(r.data,n,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning(0,"ESM support for PnP uses the experimental loader API and is therefore experimental"),await oe.changeFilePromise(r.esmLoader,(0,iq.default)(),{automaticNewlines:!0,mode:420}));let a=this.opts.project.configuration.get("pnpUnpluggedFolder");if(this.unpluggedPaths.size===0)await oe.removePromise(a);else for(let n of await oe.readdirPromise(a)){let u=K.resolve(a,n);this.unpluggedPaths.has(u)||await oe.removePromise(u)}}async locateNodeModules(e){let r=[],o=e?new RegExp(e):null;for(let a of this.opts.project.workspaces){let n=K.join(a.cwd,"node_modules");if(o&&o.test(K.relative(this.opts.project.cwd,a.cwd))||!oe.existsSync(n))continue;let u=await oe.readdirPromise(n,{withFileTypes:!0}),A=u.filter(p=>!p.isDirectory()||p.name===".bin"||!p.name.startsWith("."));if(A.length===u.length)r.push(n);else for(let p of A)r.push(K.join(n,p.name))}return r}async unplugPackageIfNeeded(e,r,o,a,n){return this.shouldBeUnplugged(e,r,a)?this.unplugPackage(e,o,n):o.packageFs}shouldBeUnplugged(e,r,o){return typeof o.unplugged<"u"?o.unplugged:KIt.has(e.identHash)||e.conditions!=null?!0:r.manifest.preferUnplugged!==null?r.manifest.preferUnplugged:!!(vQ(e,r,o,{configuration:this.opts.project.configuration})?.skipped===!1||r.misc.extractHint)}async unplugPackage(e,r,o){let a=ov(e,{configuration:this.opts.project.configuration});return this.opts.project.disabledLocators.has(e.locatorHash)?new Uu(a,{baseFs:r.packageFs,pathUtils:K}):(this.unpluggedPaths.add(a),o.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{let n=K.join(a,r.prefixPath,".ready");await oe.existsPromise(n)||(this.opts.project.storedBuildState.delete(e.locatorHash),await oe.mkdirPromise(a,{recursive:!0}),await oe.copyPromise(a,Bt.dot,{baseFs:r.packageFs,overwrite:!1}),await oe.writeFilePromise(n,""))})),new gn(a))}getPackageInformation(e){let r=W.stringifyIdent(e),o=e.reference,a=this.packageRegistry.get(r);if(!a)throw new Error(`Assertion failed: The package information store should have been available (for ${W.prettyIdent(this.opts.project.configuration,e)})`);let n=a.get(o);if(!n)throw new Error(`Assertion failed: The package information should have been available (for ${W.prettyLocator(this.opts.project.configuration,e)})`);return n}getDiskInformation(e){let r=je.getMapWithDefault(this.packageRegistry,"@@disk"),o=aq(this.opts.project.cwd,e);return je.getFactoryWithDefault(r,o,()=>({packageLocation:o,packageDependencies:new Map,packagePeers:new Set,linkType:"SOFT",discardFromLookup:!1}))}};function aq(t,e){let r=K.relative(t,e);return r.match(/^\.{0,2}\//)||(r=`./${r}`),r.replace(/\/?$/,"/")}async function JIt(t){let e=await Mt.tryFind(t.prefixPath,{baseFs:t.packageFs})??new Mt,r=new Set(["preinstall","install","postinstall"]);for(let o of e.scripts.keys())r.has(o)||e.scripts.delete(o);return{manifest:{scripts:e.scripts,preferUnplugged:e.preferUnplugged,type:e.type},misc:{extractHint:sq(t),hasBindingGyp:oq(t)}}}Ye();Ye();qt();var n1e=$e(Zo());var x0=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean("-A,--all",!1,{description:"Unplug direct dependencies from the entire project"});this.recursive=ge.Boolean("-R,--recursive",!1,{description:"Unplug both direct and transitive dependencies"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=ge.Rest()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Lr.find(r);if(!a)throw new rr(o.cwd,this.context.cwd);if(r.get("nodeLinker")!=="pnp")throw new it("This command can only be used if the `nodeLinker` option is set to `pnp`");await o.restoreInstallState();let u=new Set(this.patterns),A=this.patterns.map(b=>{let C=W.parseDescriptor(b),T=C.range!=="unknown"?C:W.makeDescriptor(C,"*");if(!kr.validRange(T.range))throw new it(`The range of the descriptor patterns must be a valid semver range (${W.prettyDescriptor(r,T)})`);return L=>{let U=W.stringifyIdent(L);return!n1e.default.isMatch(U,W.stringifyIdent(T))||L.version&&!kr.satisfiesWithPrereleases(L.version,T.range)?!1:(u.delete(b),!0)}}),p=()=>{let b=[];for(let C of o.storedPackages.values())!o.tryWorkspaceByLocator(C)&&!W.isVirtualLocator(C)&&A.some(T=>T(C))&&b.push(C);return b},h=b=>{let C=new Set,T=[],L=(U,J)=>{if(C.has(U.locatorHash))return;let te=!!o.tryWorkspaceByLocator(U);if(!(J>0&&!this.recursive&&te)&&(C.add(U.locatorHash),!o.tryWorkspaceByLocator(U)&&A.some(le=>le(U))&&T.push(U),!(J>0&&!this.recursive)))for(let le of U.dependencies.values()){let pe=o.storedResolutions.get(le.descriptorHash);if(!pe)throw new Error("Assertion failed: The resolution should have been registered");let Ae=o.storedPackages.get(pe);if(!Ae)throw new Error("Assertion failed: The package should have been registered");L(Ae,J+1)}};for(let U of b)L(U.anchoredPackage,0);return T},E,I;if(this.all&&this.recursive?(E=p(),I="the project"):this.all?(E=h(o.workspaces),I="any workspace"):(E=h([a]),I="this workspace"),u.size>1)throw new it(`Patterns ${de.prettyList(r,u,de.Type.CODE)} don't match any packages referenced by ${I}`);if(u.size>0)throw new it(`Pattern ${de.prettyList(r,u,de.Type.CODE)} doesn't match any packages referenced by ${I}`);E=je.sortMap(E,b=>W.stringifyLocator(b));let v=await Nt.start({configuration:r,stdout:this.context.stdout,json:this.json},async b=>{for(let C of E){let T=C.version??"unknown",L=o.topLevelWorkspace.manifest.ensureDependencyMeta(W.makeDescriptor(C,T));L.unplugged=!0,b.reportInfo(0,`Will unpack ${W.prettyLocator(r,C)} to ${de.pretty(r,ov(C,{configuration:r}),de.Type.PATH)}`),b.reportJson({locator:W.stringifyLocator(C),version:T})}await o.topLevelWorkspace.persistManifest(),this.json||b.reportSeparator()});return v.hasErrors()?v.exitCode():await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n})}};x0.paths=[["unplug"]],x0.usage=nt.Usage({description:"force the unpacking of a list of packages",details:"\n This command will add the selectors matching the specified patterns to the list of packages that must be unplugged when installed.\n\n A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `pnpUnpluggedFolder`. Note that unpacking packages this way is generally not recommended because it'll make it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\n\n Running the command will set a persistent flag inside your top-level `package.json`, in the `dependenciesMeta` field. As such, to undo its effects, you'll need to revert the changes made to the manifest and run `yarn install` to apply the modification.\n\n By default, only direct dependencies from the current workspace are affected. If `-A,--all` is set, direct dependencies from the entire project are affected. Using the `-R,--recursive` flag will affect transitive dependencies as well as direct ones.\n\n This command accepts glob patterns inside the scope and name components (not the range). Make sure to escape the patterns to prevent your own shell from trying to expand them.\n ",examples:[["Unplug the lodash dependency from the active workspace","yarn unplug lodash"],["Unplug all instances of lodash referenced by any workspace","yarn unplug lodash -A"],["Unplug all instances of lodash referenced by the active workspace and its dependencies","yarn unplug lodash -R"],["Unplug all instances of lodash, anywhere","yarn unplug lodash -AR"],["Unplug one specific version of lodash","yarn unplug lodash@1.2.3"],["Unplug all packages with the `@babel` scope","yarn unplug '@babel/*'"],["Unplug all packages (only for testing, not recommended)","yarn unplug -R '*'"]]});var S0=t=>({cjs:K.join(t.cwd,dr.pnpCjs),data:K.join(t.cwd,dr.pnpData),esmLoader:K.join(t.cwd,dr.pnpEsmLoader)}),s1e=t=>/\s/.test(t)?JSON.stringify(t):t;async function zIt(t,e,r){let o=/\s*--require\s+\S*\.pnp\.c?js\s*/g,a=/\s*--experimental-loader\s+\S*\.pnp\.loader\.mjs\s*/,n=(e.NODE_OPTIONS??"").replace(o," ").replace(a," ").trim();if(t.configuration.get("nodeLinker")!=="pnp"){e.NODE_OPTIONS=n;return}let u=S0(t),A=`--require ${s1e(ue.fromPortablePath(u.cjs))}`;oe.existsSync(u.esmLoader)&&(A=`${A} --experimental-loader ${(0,i1e.pathToFileURL)(ue.fromPortablePath(u.esmLoader)).href}`),oe.existsSync(u.cjs)&&(e.NODE_OPTIONS=n?`${A} ${n}`:A)}async function XIt(t,e){let r=S0(t);e(r.cjs),e(r.data),e(r.esmLoader),e(t.configuration.get("pnpUnpluggedFolder"))}var ZIt={hooks:{populateYarnPaths:XIt,setupScriptEnvironment:zIt},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: "pnp", "pnpm", or "node-modules"',type:"STRING",default:"pnp"},winLinkType:{description:"Whether Yarn should use Windows Junctions or symlinks when creating links on Windows.",type:"STRING",values:["junctions","symlinks"],default:"junctions"},pnpMode:{description:"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.",type:"STRING",default:"strict"},pnpShebang:{description:"String to prepend to the generated PnP script",type:"STRING",default:"#!/usr/bin/env node"},pnpIgnorePatterns:{description:"Array of glob patterns; files matching them will use the classic resolution",type:"STRING",default:[],isArray:!0},pnpEnableEsmLoader:{description:"If true, Yarn will generate an ESM loader (`.pnp.loader.mjs`). If this is not explicitly set Yarn tries to automatically detect whether ESM support is required.",type:"BOOLEAN",default:!1},pnpEnableInlining:{description:"If true, the PnP data will be inlined along with the generated loader",type:"BOOLEAN",default:!0},pnpFallbackMode:{description:"If true, the generated PnP loader will follow the top-level fallback rule",type:"STRING",default:"dependencies-only"},pnpUnpluggedFolder:{description:"Folder where the unplugged packages must be stored",type:"ABSOLUTE_PATH",default:"./.yarn/unplugged"}},linkers:[P0],commands:[x0]},$It=ZIt;var p1e=$e(u1e());qt();var gq=$e(Be("crypto")),h1e=$e(Be("fs")),g1e=1,Pi="node_modules",DQ=".bin",d1e=".yarn-state.yml",d1t=1e3,dq=(o=>(o.CLASSIC="classic",o.HARDLINKS_LOCAL="hardlinks-local",o.HARDLINKS_GLOBAL="hardlinks-global",o))(dq||{}),lv=class{constructor(){this.installStateCache=new Map}getCustomDataKey(){return JSON.stringify({name:"NodeModulesLinker",version:3})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the node-modules linker to be enabled");let o=r.project.tryWorkspaceByLocator(e);if(o)return o.cwd;let a=await je.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await hq(r.project,{unrollAliases:!0}));if(a===null)throw new it("Couldn't find the node_modules state file - running an install might help (findPackageLocation)");let n=a.locatorMap.get(W.stringifyLocator(e));if(!n){let p=new it(`Couldn't find ${W.prettyLocator(r.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw p.code="LOCATOR_NOT_INSTALLED",p}let u=n.locations.sort((p,h)=>p.split(K.sep).length-h.split(K.sep).length),A=K.join(r.project.configuration.startingCwd,Pi);return u.find(p=>K.contains(A,p))||n.locations[0]}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let o=await je.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await hq(r.project,{unrollAliases:!0}));if(o===null)return null;let{locationRoot:a,segments:n}=PQ(K.resolve(e),{skipPrefix:r.project.cwd}),u=o.locationTree.get(a);if(!u)return null;let A=u.locator;for(let p of n){if(u=u.children.get(p),!u)break;A=u.locator||A}return W.parseLocator(A)}makeInstaller(e){return new pq(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="node-modules"}},pq=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}attachCustomData(e){this.customData=e}async installPackage(e,r){let o=K.resolve(r.packageFs.getRealPath(),r.prefixPath),a=this.customData.store.get(e.locatorHash);if(typeof a>"u"&&(a=await m1t(e,r),e.linkType==="HARD"&&this.customData.store.set(e.locatorHash,a)),!W.isPackageCompatible(e,this.opts.project.configuration.getSupportedArchitectures()))return{packageLocation:null,buildRequest:null};let n=new Map,u=new Set;n.has(W.stringifyIdent(e))||n.set(W.stringifyIdent(e),e.reference);let A=e;if(W.isVirtualLocator(e)){A=W.devirtualizeLocator(e);for(let E of e.peerDependencies.values())n.set(W.stringifyIdent(E),null),u.add(W.stringifyIdent(E))}let p={packageLocation:`${ue.fromPortablePath(o)}/`,packageDependencies:n,packagePeers:u,linkType:e.linkType,discardFromLookup:r.discardFromLookup??!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:a,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:p});let h=r.checksum?r.checksum.substring(r.checksum.indexOf("/")+1):null;return this.realLocatorChecksums.set(A.locatorHash,h),{packageLocation:o,buildRequest:null}}async attachInternalDependencies(e,r){let o=this.localStore.get(e.locatorHash);if(typeof o>"u")throw new Error("Assertion failed: Expected information object to have been registered");for(let[a,n]of r){let u=W.areIdentsEqual(a,n)?n.reference:[W.stringifyIdent(n),n.reference];o.pnpNode.packageDependencies.set(W.stringifyIdent(a),u)}}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the node-modules linker")}async finalizeInstall(){if(this.opts.project.configuration.get("nodeLinker")!=="node-modules")return;let e=new mi({baseFs:new Jl({maxOpenFiles:80,readOnlyArchives:!0})}),r=await hq(this.opts.project),o=this.opts.project.configuration.get("nmMode");(r===null||o!==r.nmMode)&&(this.opts.project.storedBuildState.clear(),r={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:o,mtimeMs:0});let a=new Map(this.opts.project.workspaces.map(v=>{let b=this.opts.project.configuration.get("nmHoistingLimits");try{b=je.validateEnum(KB,v.manifest.installConfig?.hoistingLimits??b)}catch{let T=W.prettyWorkspace(this.opts.project.configuration,v);this.opts.report.reportWarning(57,`${T}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(KB).join(", ")}, using default: "${b}"`)}return[v.relativeCwd,b]})),n=new Map(this.opts.project.workspaces.map(v=>{let b=this.opts.project.configuration.get("nmSelfReferences");return b=v.manifest.installConfig?.selfReferences??b,[v.relativeCwd,b]})),u={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(v,b)=>Array.isArray(b)?{name:b[0],reference:b[1]}:{name:v,reference:b},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(v=>{let b=v.anchoredLocator;return{name:W.stringifyIdent(b),reference:b.reference}}),getPackageInformation:v=>{let b=v.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:W.makeLocator(W.parseIdent(v.name),v.reference),C=this.localStore.get(b.locatorHash);if(typeof C>"u")throw new Error("Assertion failed: Expected the package reference to have been registered");return C.pnpNode},findPackageLocator:v=>{let b=this.opts.project.tryWorkspaceByCwd(ue.toPortablePath(v));if(b!==null){let C=b.anchoredLocator;return{name:W.stringifyIdent(C),reference:C.reference}}throw new Error("Assertion failed: Unimplemented")},resolveToUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveRequest:()=>{throw new Error("Assertion failed: Unimplemented")},resolveVirtual:v=>ue.fromPortablePath(mi.resolveVirtual(ue.toPortablePath(v)))},{tree:A,errors:p,preserveSymlinksRequired:h}=JB(u,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:a,project:this.opts.project,selfReferencesByCwd:n});if(!A){for(let{messageName:v,text:b}of p)this.opts.report.reportError(v,b);return}let E=qj(A);await B1t(r,E,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async v=>{let b=W.parseLocator(v),C=this.localStore.get(b.locatorHash);if(typeof C>"u")throw new Error("Assertion failed: Expected the slot to exist");return C.customPackageData.manifest}});let I=[];for(let[v,b]of E.entries()){if(C1e(v))continue;let C=W.parseLocator(v),T=this.localStore.get(C.locatorHash);if(typeof T>"u")throw new Error("Assertion failed: Expected the slot to exist");if(this.opts.project.tryWorkspaceByLocator(T.pkg))continue;let L=mA.extractBuildRequest(T.pkg,T.customPackageData,T.dependencyMeta,{configuration:this.opts.project.configuration});!L||I.push({buildLocations:b.locations,locator:C,buildRequest:L})}return h&&this.opts.report.reportWarning(72,`The application uses portals and that's why ${de.pretty(this.opts.project.configuration,"--preserve-symlinks",de.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:I}}};async function m1t(t,e){let r=await Mt.tryFind(e.prefixPath,{baseFs:e.packageFs})??new Mt,o=new Set(["preinstall","install","postinstall"]);for(let a of r.scripts.keys())o.has(a)||r.scripts.delete(a);return{manifest:{bin:r.bin,scripts:r.scripts},misc:{hasBindingGyp:mA.hasBindingGyp(e)}}}async function y1t(t,e,r,o,{installChangedByUser:a}){let n="";n+=`# Warning: This file is automatically generated. Removing it is fine, but will +`,n+=`# cause your node_modules installation to become invalidated. +`,n+=` +`,n+=`__metadata: +`,n+=` version: ${g1e} +`,n+=` nmMode: ${o.value} +`;let u=Array.from(e.keys()).sort(),A=W.stringifyLocator(t.topLevelWorkspace.anchoredLocator);for(let E of u){let I=e.get(E);n+=` +`,n+=`${JSON.stringify(E)}: +`,n+=` locations: +`;for(let v of I.locations){let b=K.contains(t.cwd,v);if(b===null)throw new Error(`Assertion failed: Expected the path to be within the project (${v})`);n+=` - ${JSON.stringify(b)} +`}if(I.aliases.length>0){n+=` aliases: +`;for(let v of I.aliases)n+=` - ${JSON.stringify(v)} +`}if(E===A&&r.size>0){n+=` bin: +`;for(let[v,b]of r){let C=K.contains(t.cwd,v);if(C===null)throw new Error(`Assertion failed: Expected the path to be within the project (${v})`);n+=` ${JSON.stringify(C)}: +`;for(let[T,L]of b){let U=K.relative(K.join(v,Pi),L);n+=` ${JSON.stringify(T)}: ${JSON.stringify(U)} +`}}}}let p=t.cwd,h=K.join(p,Pi,d1e);a&&await oe.removePromise(h),await oe.changeFilePromise(h,n,{automaticNewlines:!0})}async function hq(t,{unrollAliases:e=!1}={}){let r=t.cwd,o=K.join(r,Pi,d1e),a;try{a=await oe.statPromise(o)}catch{}if(!a)return null;let n=Vi(await oe.readFilePromise(o,"utf8"));if(n.__metadata.version>g1e)return null;let u=n.__metadata.nmMode||"classic",A=new Map,p=new Map;delete n.__metadata;for(let[h,E]of Object.entries(n)){let I=E.locations.map(b=>K.join(r,b)),v=E.bin;if(v)for(let[b,C]of Object.entries(v)){let T=K.join(r,ue.toPortablePath(b)),L=je.getMapWithDefault(p,T);for(let[U,J]of Object.entries(C))L.set(U,ue.toPortablePath([T,Pi,J].join(K.sep)))}if(A.set(h,{target:Bt.dot,linkType:"HARD",locations:I,aliases:E.aliases||[]}),e&&E.aliases)for(let b of E.aliases){let{scope:C,name:T}=W.parseLocator(h),L=W.makeLocator(W.makeIdent(C,T),b),U=W.stringifyLocator(L);A.set(U,{target:Bt.dot,linkType:"HARD",locations:I,aliases:[]})}}return{locatorMap:A,binSymlinks:p,locationTree:m1e(A,{skipPrefix:t.cwd}),nmMode:u,mtimeMs:a.mtimeMs}}var YC=async(t,e)=>{if(t.split(K.sep).indexOf(Pi)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${t}`);try{if(!e.innerLoop){let o=e.allowSymlink?await oe.statPromise(t):await oe.lstatPromise(t);if(e.allowSymlink&&!o.isDirectory()||!e.allowSymlink&&o.isSymbolicLink()){await oe.unlinkPromise(t);return}}let r=await oe.readdirPromise(t,{withFileTypes:!0});for(let o of r){let a=K.join(t,o.name);o.isDirectory()?(o.name!==Pi||e&&e.innerLoop)&&await YC(a,{innerLoop:!0,contentsOnly:!1}):await oe.unlinkPromise(a)}e.contentsOnly||await oe.rmdirPromise(t)}catch(r){if(r.code!=="ENOENT"&&r.code!=="ENOTEMPTY")throw r}},A1e=4,PQ=(t,{skipPrefix:e})=>{let r=K.contains(e,t);if(r===null)throw new Error(`Assertion failed: Writing attempt prevented to ${t} which is outside project root: ${e}`);let o=r.split(K.sep).filter(p=>p!==""),a=o.indexOf(Pi),n=o.slice(0,a).join(K.sep),u=K.join(e,n),A=o.slice(a);return{locationRoot:u,segments:A}},m1e=(t,{skipPrefix:e})=>{let r=new Map;if(t===null)return r;let o=()=>({children:new Map,linkType:"HARD"});for(let[a,n]of t.entries()){if(n.linkType==="SOFT"&&K.contains(e,n.target)!==null){let A=je.getFactoryWithDefault(r,n.target,o);A.locator=a,A.linkType=n.linkType}for(let u of n.locations){let{locationRoot:A,segments:p}=PQ(u,{skipPrefix:e}),h=je.getFactoryWithDefault(r,A,o);for(let E=0;E{if(process.platform==="win32"&&r==="junctions"){let o;try{o=await oe.lstatPromise(t)}catch{}if(!o||o.isDirectory()){await oe.symlinkPromise(t,e,"junction");return}}await oe.symlinkPromise(K.relative(K.dirname(e),t),e)};async function y1e(t,e,r){let o=K.join(t,`${gq.default.randomBytes(16).toString("hex")}.tmp`);try{await oe.writeFilePromise(o,r);try{await oe.linkPromise(o,e)}catch{}}finally{await oe.unlinkPromise(o)}}async function E1t({srcPath:t,dstPath:e,entry:r,globalHardlinksStore:o,baseFs:a,nmMode:n}){if(r.kind===E1e.FILE){if(n.value==="hardlinks-global"&&o&&r.digest){let A=K.join(o,r.digest.substring(0,2),`${r.digest.substring(2)}.dat`),p;try{let h=await oe.statPromise(A);if(h&&(!r.mtimeMs||h.mtimeMs>r.mtimeMs||h.mtimeMs(o.FILE="file",o.DIRECTORY="directory",o.SYMLINK="symlink",o))(E1e||{}),C1t=async(t,e,{baseFs:r,globalHardlinksStore:o,nmMode:a,windowsLinkType:n,packageChecksum:u})=>{await oe.mkdirPromise(t,{recursive:!0});let A=async(E=Bt.dot)=>{let I=K.join(e,E),v=await r.readdirPromise(I,{withFileTypes:!0}),b=new Map;for(let C of v){let T=K.join(E,C.name),L,U=K.join(I,C.name);if(C.isFile()){if(L={kind:"file",mode:(await r.lstatPromise(U)).mode},a.value==="hardlinks-global"){let J=await wn.checksumFile(U,{baseFs:r,algorithm:"sha1"});L.digest=J}}else if(C.isDirectory())L={kind:"directory"};else if(C.isSymbolicLink())L={kind:"symlink",symlinkTo:await r.readlinkPromise(U)};else throw new Error(`Unsupported file type (file: ${U}, mode: 0o${await r.statSync(U).mode.toString(8).padStart(6,"0")})`);if(b.set(T,L),C.isDirectory()&&T!==Pi){let J=await A(T);for(let[te,le]of J)b.set(te,le)}}return b},p;if(a.value==="hardlinks-global"&&o&&u){let E=K.join(o,u.substring(0,2),`${u.substring(2)}.json`);try{p=new Map(Object.entries(JSON.parse(await oe.readFilePromise(E,"utf8"))))}catch{p=await A()}}else p=await A();let h=!1;for(let[E,I]of p){let v=K.join(e,E),b=K.join(t,E);if(I.kind==="directory")await oe.mkdirPromise(b,{recursive:!0});else if(I.kind==="file"){let C=I.mtimeMs;await E1t({srcPath:v,dstPath:b,entry:I,nmMode:a,baseFs:r,globalHardlinksStore:o}),I.mtimeMs!==C&&(h=!0)}else I.kind==="symlink"&&await mq(K.resolve(K.dirname(b),I.symlinkTo),b,n)}if(a.value==="hardlinks-global"&&o&&h&&u){let E=K.join(o,u.substring(0,2),`${u.substring(2)}.json`);await oe.removePromise(E),await y1e(o,E,Buffer.from(JSON.stringify(Object.fromEntries(p))))}};function w1t(t,e,r,o){let a=new Map,n=new Map,u=new Map,A=!1,p=(h,E,I,v,b)=>{let C=!0,T=K.join(h,E),L=new Set;if(E===Pi||E.startsWith("@")){let J;try{J=oe.statSync(T)}catch{}C=!!J,J?J.mtimeMs>r?(A=!0,L=new Set(oe.readdirSync(T))):L=new Set(I.children.get(E).children.keys()):A=!0;let te=e.get(h);if(te){let le=K.join(h,Pi,DQ),pe;try{pe=oe.statSync(le)}catch{}if(!pe)A=!0;else if(pe.mtimeMs>r){A=!0;let Ae=new Set(oe.readdirSync(le)),ye=new Map;n.set(h,ye);for(let[ae,we]of te)Ae.has(ae)&&ye.set(ae,we)}else n.set(h,te)}}else C=b.has(E);let U=I.children.get(E);if(C){let{linkType:J,locator:te}=U,le={children:new Map,linkType:J,locator:te};if(v.children.set(E,le),te){let pe=je.getSetWithDefault(u,te);pe.add(T),u.set(te,pe)}for(let pe of U.children.keys())p(T,pe,U,le,L)}else U.locator&&o.storedBuildState.delete(W.parseLocator(U.locator).locatorHash)};for(let[h,E]of t){let{linkType:I,locator:v}=E,b={children:new Map,linkType:I,locator:v};if(a.set(h,b),v){let C=je.getSetWithDefault(u,E.locator);C.add(h),u.set(E.locator,C)}E.children.has(Pi)&&p(h,Pi,E,b,new Set)}return{locationTree:a,binSymlinks:n,locatorLocations:u,installChangedByUser:A}}function C1e(t){let e=W.parseDescriptor(t);return W.isVirtualDescriptor(e)&&(e=W.devirtualizeDescriptor(e)),e.range.startsWith("link:")}async function I1t(t,e,r,{loadManifest:o}){let a=new Map;for(let[A,{locations:p}]of t){let h=C1e(A)?null:await o(A,p[0]),E=new Map;if(h)for(let[I,v]of h.bin){let b=K.join(p[0],v);v!==""&&oe.existsSync(b)&&E.set(I,v)}a.set(A,E)}let n=new Map,u=(A,p,h)=>{let E=new Map,I=K.contains(r,A);if(h.locator&&I!==null){let v=a.get(h.locator);for(let[b,C]of v){let T=K.join(A,ue.toPortablePath(C));E.set(b,T)}for(let[b,C]of h.children){let T=K.join(A,b),L=u(T,T,C);L.size>0&&n.set(A,new Map([...n.get(A)||new Map,...L]))}}else for(let[v,b]of h.children){let C=u(K.join(A,v),p,b);for(let[T,L]of C)E.set(T,L)}return E};for(let[A,p]of e){let h=u(A,A,p);h.size>0&&n.set(A,new Map([...n.get(A)||new Map,...h]))}return n}var f1e=(t,e)=>{if(!t||!e)return t===e;let r=W.parseLocator(t);W.isVirtualLocator(r)&&(r=W.devirtualizeLocator(r));let o=W.parseLocator(e);return W.isVirtualLocator(o)&&(o=W.devirtualizeLocator(o)),W.areLocatorsEqual(r,o)};function yq(t){return K.join(t.get("globalFolder"),"store")}async function B1t(t,e,{baseFs:r,project:o,report:a,loadManifest:n,realLocatorChecksums:u}){let A=K.join(o.cwd,Pi),{locationTree:p,binSymlinks:h,locatorLocations:E,installChangedByUser:I}=w1t(t.locationTree,t.binSymlinks,t.mtimeMs,o),v=m1e(e,{skipPrefix:o.cwd}),b=[],C=async({srcDir:we,dstDir:Pe,linkType:g,globalHardlinksStore:Ee,nmMode:De,windowsLinkType:ce,packageChecksum:ne})=>{let ee=(async()=>{try{g==="SOFT"?(await oe.mkdirPromise(K.dirname(Pe),{recursive:!0}),await mq(K.resolve(we),Pe,ce)):await C1t(Pe,we,{baseFs:r,globalHardlinksStore:Ee,nmMode:De,windowsLinkType:ce,packageChecksum:ne})}catch(Ie){throw Ie.message=`While persisting ${we} -> ${Pe} ${Ie.message}`,Ie}finally{le.tick()}})().then(()=>b.splice(b.indexOf(ee),1));b.push(ee),b.length>A1e&&await Promise.race(b)},T=async(we,Pe,g)=>{let Ee=(async()=>{let De=async(ce,ne,ee)=>{try{ee.innerLoop||await oe.mkdirPromise(ne,{recursive:!0});let Ie=await oe.readdirPromise(ce,{withFileTypes:!0});for(let ke of Ie){if(!ee.innerLoop&&ke.name===DQ)continue;let ht=K.join(ce,ke.name),H=K.join(ne,ke.name);ke.isDirectory()?(ke.name!==Pi||ee&&ee.innerLoop)&&(await oe.mkdirPromise(H,{recursive:!0}),await De(ht,H,{...ee,innerLoop:!0})):ye.value==="hardlinks-local"||ye.value==="hardlinks-global"?await oe.linkPromise(ht,H):await oe.copyFilePromise(ht,H,h1e.default.constants.COPYFILE_FICLONE)}}catch(Ie){throw ee.innerLoop||(Ie.message=`While cloning ${ce} -> ${ne} ${Ie.message}`),Ie}finally{ee.innerLoop||le.tick()}};await De(we,Pe,g)})().then(()=>b.splice(b.indexOf(Ee),1));b.push(Ee),b.length>A1e&&await Promise.race(b)},L=async(we,Pe,g)=>{if(g)for(let[Ee,De]of Pe.children){let ce=g.children.get(Ee);await L(K.join(we,Ee),De,ce)}else{Pe.children.has(Pi)&&await YC(K.join(we,Pi),{contentsOnly:!1});let Ee=K.basename(we)===Pi&&v.has(K.join(K.dirname(we),K.sep));await YC(we,{contentsOnly:we===A,allowSymlink:Ee})}};for(let[we,Pe]of p){let g=v.get(we);for(let[Ee,De]of Pe.children){if(Ee===".")continue;let ce=g&&g.children.get(Ee),ne=K.join(we,Ee);await L(ne,De,ce)}}let U=async(we,Pe,g)=>{if(g){f1e(Pe.locator,g.locator)||await YC(we,{contentsOnly:Pe.linkType==="HARD"});for(let[Ee,De]of Pe.children){let ce=g.children.get(Ee);await U(K.join(we,Ee),De,ce)}}else{Pe.children.has(Pi)&&await YC(K.join(we,Pi),{contentsOnly:!0});let Ee=K.basename(we)===Pi&&v.has(K.join(K.dirname(we),K.sep));await YC(we,{contentsOnly:Pe.linkType==="HARD",allowSymlink:Ee})}};for(let[we,Pe]of v){let g=p.get(we);for(let[Ee,De]of Pe.children){if(Ee===".")continue;let ce=g&&g.children.get(Ee);await U(K.join(we,Ee),De,ce)}}let J=new Map,te=[];for(let[we,Pe]of E)for(let g of Pe){let{locationRoot:Ee,segments:De}=PQ(g,{skipPrefix:o.cwd}),ce=v.get(Ee),ne=Ee;if(ce){for(let ee of De)if(ne=K.join(ne,ee),ce=ce.children.get(ee),!ce)break;if(ce){let ee=f1e(ce.locator,we),Ie=e.get(ce.locator),ke=Ie.target,ht=ne,H=Ie.linkType;if(ee)J.has(ke)||J.set(ke,ht);else if(ke!==ht){let lt=W.parseLocator(ce.locator);W.isVirtualLocator(lt)&&(lt=W.devirtualizeLocator(lt)),te.push({srcDir:ke,dstDir:ht,linkType:H,realLocatorHash:lt.locatorHash})}}}}for(let[we,{locations:Pe}]of e.entries())for(let g of Pe){let{locationRoot:Ee,segments:De}=PQ(g,{skipPrefix:o.cwd}),ce=p.get(Ee),ne=v.get(Ee),ee=Ee,Ie=e.get(we),ke=W.parseLocator(we);W.isVirtualLocator(ke)&&(ke=W.devirtualizeLocator(ke));let ht=ke.locatorHash,H=Ie.target,lt=g;if(H===lt)continue;let Re=Ie.linkType;for(let Qe of De)ne=ne.children.get(Qe);if(!ce)te.push({srcDir:H,dstDir:lt,linkType:Re,realLocatorHash:ht});else for(let Qe of De)if(ee=K.join(ee,Qe),ce=ce.children.get(Qe),!ce){te.push({srcDir:H,dstDir:lt,linkType:Re,realLocatorHash:ht});break}}let le=Xs.progressViaCounter(te.length),pe=a.reportProgress(le),Ae=o.configuration.get("nmMode"),ye={value:Ae},ae=o.configuration.get("winLinkType");try{let we=ye.value==="hardlinks-global"?`${yq(o.configuration)}/v1`:null;if(we&&!await oe.existsPromise(we)){await oe.mkdirpPromise(we);for(let g=0;g<256;g++)await oe.mkdirPromise(K.join(we,g.toString(16).padStart(2,"0")))}for(let g of te)(g.linkType==="SOFT"||!J.has(g.srcDir))&&(J.set(g.srcDir,g.dstDir),await C({...g,globalHardlinksStore:we,nmMode:ye,windowsLinkType:ae,packageChecksum:u.get(g.realLocatorHash)||null}));await Promise.all(b),b.length=0;for(let g of te){let Ee=J.get(g.srcDir);g.linkType!=="SOFT"&&g.dstDir!==Ee&&await T(Ee,g.dstDir,{nmMode:ye})}await Promise.all(b),await oe.mkdirPromise(A,{recursive:!0});let Pe=await I1t(e,v,o.cwd,{loadManifest:n});await v1t(h,Pe,o.cwd,ae),await y1t(o,e,Pe,ye,{installChangedByUser:I}),Ae=="hardlinks-global"&&ye.value=="hardlinks-local"&&a.reportWarningOnce(74,"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices")}finally{pe.stop()}}async function v1t(t,e,r,o){for(let a of t.keys()){if(K.contains(r,a)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${a}`);if(!e.has(a)){let n=K.join(a,Pi,DQ);await oe.removePromise(n)}}for(let[a,n]of e){if(K.contains(r,a)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${a}`);let u=K.join(a,Pi,DQ),A=t.get(a)||new Map;await oe.mkdirPromise(u,{recursive:!0});for(let p of A.keys())n.has(p)||(await oe.removePromise(K.join(u,p)),process.platform==="win32"&&await oe.removePromise(K.join(u,`${p}.cmd`)));for(let[p,h]of n){let E=A.get(p),I=K.join(u,p);E!==h&&(process.platform==="win32"?await(0,p1e.default)(ue.fromPortablePath(h),ue.fromPortablePath(I),{createPwshFile:!1}):(await oe.removePromise(I),await mq(h,I,o),K.contains(r,await oe.realpathPromise(h))!==null&&await oe.chmodPromise(h,493)))}}}Ye();Pt();nA();var cv=class extends P0{constructor(){super(...arguments);this.mode="loose"}makeInstaller(r){return new Eq(r)}},Eq=class extends dm{constructor(){super(...arguments);this.mode="loose"}async transformPnpSettings(r){let o=new mi({baseFs:new Jl({maxOpenFiles:80,readOnlyArchives:!0})}),a=$Ie(r,this.opts.project.cwd,o),{tree:n,errors:u}=JB(a,{pnpifyFs:!1,project:this.opts.project});if(!n){for(let{messageName:I,text:v}of u)this.opts.report.reportError(I,v);return}let A=new Map;r.fallbackPool=A;let p=(I,v)=>{let b=W.parseLocator(v.locator),C=W.stringifyIdent(b);C===I?A.set(I,b.reference):A.set(I,[C,b.reference])},h=K.join(this.opts.project.cwd,dr.nodeModules),E=n.get(h);if(!(typeof E>"u")){if("target"in E)throw new Error("Assertion failed: Expected the root junction point to be a directory");for(let I of E.dirList){let v=K.join(h,I),b=n.get(v);if(typeof b>"u")throw new Error("Assertion failed: Expected the child to have been registered");if("target"in b)p(I,b);else for(let C of b.dirList){let T=K.join(v,C),L=n.get(T);if(typeof L>"u")throw new Error("Assertion failed: Expected the subchild to have been registered");if("target"in L)p(`${I}/${C}`,L);else throw new Error("Assertion failed: Expected the leaf junction to be a package")}}}}};var D1t={hooks:{cleanGlobalArtifacts:async t=>{let e=yq(t);await oe.removePromise(e)}},configuration:{nmHoistingLimits:{description:"Prevents packages to be hoisted past specific levels",type:"STRING",values:["workspaces","dependencies","none"],default:"none"},nmMode:{description:"Defines in which measure Yarn must use hardlinks and symlinks when generated `node_modules` directories.",type:"STRING",values:["classic","hardlinks-local","hardlinks-global"],default:"classic"},nmSelfReferences:{description:"Defines whether the linker should generate self-referencing symlinks for workspaces.",type:"BOOLEAN",default:!0}},linkers:[lv,cv]},P1t=D1t;var EG={};Kt(EG,{NpmHttpFetcher:()=>fv,NpmRemapResolver:()=>pv,NpmSemverFetcher:()=>dl,NpmSemverResolver:()=>hv,NpmTagResolver:()=>gv,default:()=>Ovt,npmConfigUtils:()=>Zn,npmHttpUtils:()=>on,npmPublishUtils:()=>sw});Ye();var x1e=$e(zn());var Wn="npm:";var on={};Kt(on,{AuthType:()=>P1e,customPackageError:()=>mm,del:()=>N1t,get:()=>ym,getIdentUrl:()=>SQ,getPackageMetadata:()=>KC,handleInvalidAuthenticationError:()=>b0,post:()=>T1t,put:()=>R1t});Ye();Ye();Pt();var Bq=$e(A2()),v1e=$e(S_()),D1e=$e(zn()),vq=Be("url");var Zn={};Kt(Zn,{RegistryType:()=>w1e,getAuditRegistry:()=>S1t,getAuthConfiguration:()=>Iq,getDefaultRegistry:()=>uv,getPublishRegistry:()=>x1t,getRegistryConfiguration:()=>I1e,getScopeConfiguration:()=>wq,getScopeRegistry:()=>WC,normalizeRegistry:()=>oc});var w1e=(o=>(o.AUDIT_REGISTRY="npmAuditRegistry",o.FETCH_REGISTRY="npmRegistryServer",o.PUBLISH_REGISTRY="npmPublishRegistry",o))(w1e||{});function oc(t){return t.replace(/\/$/,"")}function S1t({configuration:t}){return uv({configuration:t,type:"npmAuditRegistry"})}function x1t(t,{configuration:e}){return t.publishConfig?.registry?oc(t.publishConfig.registry):t.name?WC(t.name.scope,{configuration:e,type:"npmPublishRegistry"}):uv({configuration:e,type:"npmPublishRegistry"})}function WC(t,{configuration:e,type:r="npmRegistryServer"}){let o=wq(t,{configuration:e});if(o===null)return uv({configuration:e,type:r});let a=o.get(r);return a===null?uv({configuration:e,type:r}):oc(a)}function uv({configuration:t,type:e="npmRegistryServer"}){let r=t.get(e);return oc(r!==null?r:t.get("npmRegistryServer"))}function I1e(t,{configuration:e}){let r=e.get("npmRegistries"),o=oc(t),a=r.get(o);if(typeof a<"u")return a;let n=r.get(o.replace(/^[a-z]+:/,""));return typeof n<"u"?n:null}function wq(t,{configuration:e}){if(t===null)return null;let o=e.get("npmScopes").get(t);return o||null}function Iq(t,{configuration:e,ident:r}){let o=r&&wq(r.scope,{configuration:e});return o?.get("npmAuthIdent")||o?.get("npmAuthToken")?o:I1e(t,{configuration:e})||e}var P1e=(a=>(a[a.NO_AUTH=0]="NO_AUTH",a[a.BEST_EFFORT=1]="BEST_EFFORT",a[a.CONFIGURATION=2]="CONFIGURATION",a[a.ALWAYS_AUTH=3]="ALWAYS_AUTH",a))(P1e||{});async function b0(t,{attemptedAs:e,registry:r,headers:o,configuration:a}){if(bQ(t))throw new zt(41,"Invalid OTP token");if(t.originalError?.name==="HTTPError"&&t.originalError?.response.statusCode===401)throw new zt(41,`Invalid authentication (${typeof e!="string"?`as ${await M1t(r,o,{configuration:a})}`:`attempted as ${e}`})`)}function mm(t,e){let r=t.response?.statusCode;return r?r===404?"Package not found":r>=500&&r<600?`The registry appears to be down (using a ${de.applyHyperlink(e,"local cache","https://yarnpkg.com/advanced/lexicon#local-cache")} might have protected you against such outages)`:null:null}function SQ(t){return t.scope?`/@${t.scope}%2f${t.name}`:`/${t.name}`}var B1e=new Map;async function KC(t,{cache:e,project:r,registry:o,headers:a,version:n,...u}){return await je.getFactoryWithDefault(B1e,t.identHash,async()=>{let{configuration:A}=r;o=Av(A,{ident:t,registry:o});let p=Q1t(A,o),h=K.join(p,`${W.slugifyIdent(t)}.json`),E=null;if(!r.lockfileNeedsRefresh){try{E=await oe.readJsonPromise(h)}catch{}if(E){if(typeof n<"u"&&typeof E.metadata.versions[n]<"u")return E.metadata;if(A.get("enableOfflineMode")){let I=structuredClone(E.metadata),v=new Set;if(e){for(let C of Object.keys(I.versions)){let T=W.makeLocator(t,`npm:${C}`),L=e.getLocatorMirrorPath(T);(!L||!oe.existsSync(L))&&(delete I.versions[C],v.add(C))}let b=I["dist-tags"].latest;if(v.has(b)){let C=Object.keys(E.metadata.versions).sort(D1e.default.compare),T=C.indexOf(b);for(;v.has(C[T])&&T>=0;)T-=1;T>=0?I["dist-tags"].latest=C[T]:delete I["dist-tags"].latest}}return I}}}return await ym(SQ(t),{...u,customErrorMessage:mm,configuration:A,registry:o,ident:t,headers:{...a,["If-None-Match"]:E?.etag,["If-Modified-Since"]:E?.lastModified},wrapNetworkRequest:async I=>async()=>{let v=await I();if(v.statusCode===304){if(E===null)throw new Error("Assertion failed: cachedMetadata should not be null");return{...v,body:E.metadata}}let b=b1t(JSON.parse(v.body.toString()));B1e.set(t.identHash,b);let C={metadata:b,etag:v.headers.etag,lastModified:v.headers["last-modified"]},T=`${h}-${process.pid}.tmp`;return await oe.mkdirPromise(p,{recursive:!0}),await oe.writeJsonPromise(T,C,{compact:!0}),await oe.renamePromise(T,h),{...v,body:b}}})})}var S1e=["name","dist.tarball","bin","scripts","os","cpu","libc","dependencies","dependenciesMeta","optionalDependencies","peerDependencies","peerDependenciesMeta","deprecated"];function b1t(t){return{"dist-tags":t["dist-tags"],versions:Object.fromEntries(Object.entries(t.versions).map(([e,r])=>[e,(0,v1e.default)(r,S1e)]))}}var k1t=wn.makeHash(...S1e).slice(0,6);function Q1t(t,e){let r=F1t(t),o=new vq.URL(e);return K.join(r,k1t,o.hostname)}function F1t(t){return K.join(t.get("globalFolder"),"metadata/npm")}async function ym(t,{configuration:e,headers:r,ident:o,authType:a,registry:n,...u}){n=Av(e,{ident:o,registry:n}),o&&o.scope&&typeof a>"u"&&(a=1);let A=await xQ(n,{authType:a,configuration:e,ident:o});A&&(r={...r,authorization:A});try{return await rn.get(t.charAt(0)==="/"?`${n}${t}`:t,{configuration:e,headers:r,...u})}catch(p){throw await b0(p,{registry:n,configuration:e,headers:r}),p}}async function T1t(t,e,{attemptedAs:r,configuration:o,headers:a,ident:n,authType:u=3,registry:A,otp:p,...h}){A=Av(o,{ident:n,registry:A});let E=await xQ(A,{authType:u,configuration:o,ident:n});E&&(a={...a,authorization:E}),p&&(a={...a,...VC(p)});try{return await rn.post(A+t,e,{configuration:o,headers:a,...h})}catch(I){if(!bQ(I)||p)throw await b0(I,{attemptedAs:r,registry:A,configuration:o,headers:a}),I;p=await Dq(I,{configuration:o});let v={...a,...VC(p)};try{return await rn.post(`${A}${t}`,e,{configuration:o,headers:v,...h})}catch(b){throw await b0(b,{attemptedAs:r,registry:A,configuration:o,headers:a}),b}}}async function R1t(t,e,{attemptedAs:r,configuration:o,headers:a,ident:n,authType:u=3,registry:A,otp:p,...h}){A=Av(o,{ident:n,registry:A});let E=await xQ(A,{authType:u,configuration:o,ident:n});E&&(a={...a,authorization:E}),p&&(a={...a,...VC(p)});try{return await rn.put(A+t,e,{configuration:o,headers:a,...h})}catch(I){if(!bQ(I))throw await b0(I,{attemptedAs:r,registry:A,configuration:o,headers:a}),I;p=await Dq(I,{configuration:o});let v={...a,...VC(p)};try{return await rn.put(`${A}${t}`,e,{configuration:o,headers:v,...h})}catch(b){throw await b0(b,{attemptedAs:r,registry:A,configuration:o,headers:a}),b}}}async function N1t(t,{attemptedAs:e,configuration:r,headers:o,ident:a,authType:n=3,registry:u,otp:A,...p}){u=Av(r,{ident:a,registry:u});let h=await xQ(u,{authType:n,configuration:r,ident:a});h&&(o={...o,authorization:h}),A&&(o={...o,...VC(A)});try{return await rn.del(u+t,{configuration:r,headers:o,...p})}catch(E){if(!bQ(E)||A)throw await b0(E,{attemptedAs:e,registry:u,configuration:r,headers:o}),E;A=await Dq(E,{configuration:r});let I={...o,...VC(A)};try{return await rn.del(`${u}${t}`,{configuration:r,headers:I,...p})}catch(v){throw await b0(v,{attemptedAs:e,registry:u,configuration:r,headers:o}),v}}}function Av(t,{ident:e,registry:r}){if(typeof r>"u"&&e)return WC(e.scope,{configuration:t});if(typeof r!="string")throw new Error("Assertion failed: The registry should be a string");return oc(r)}async function xQ(t,{authType:e=2,configuration:r,ident:o}){let a=Iq(t,{configuration:r,ident:o}),n=L1t(a,e);if(!n)return null;let u=await r.reduceHook(A=>A.getNpmAuthenticationHeader,void 0,t,{configuration:r,ident:o});if(u)return u;if(a.get("npmAuthToken"))return`Bearer ${a.get("npmAuthToken")}`;if(a.get("npmAuthIdent")){let A=a.get("npmAuthIdent");return A.includes(":")?`Basic ${Buffer.from(A).toString("base64")}`:`Basic ${A}`}if(n&&e!==1)throw new zt(33,"No authentication configured for request");return null}function L1t(t,e){switch(e){case 2:return t.get("npmAlwaysAuth");case 1:case 3:return!0;case 0:return!1;default:throw new Error("Unreachable")}}async function M1t(t,e,{configuration:r}){if(typeof e>"u"||typeof e.authorization>"u")return"an anonymous user";try{return(await rn.get(new vq.URL(`${t}/-/whoami`).href,{configuration:r,headers:e,jsonResponse:!0})).username??"an unknown user"}catch{return"an unknown user"}}async function Dq(t,{configuration:e}){let r=t.originalError?.response.headers["npm-notice"];if(r&&(await Nt.start({configuration:e,stdout:process.stdout,includeFooter:!1},async a=>{if(a.reportInfo(0,r.replace(/(https?:\/\/\S+)/g,de.pretty(e,"$1",de.Type.URL))),!process.env.YARN_IS_TEST_ENV){let n=r.match(/open (https?:\/\/\S+)/i);if(n&&Ji.openUrl){let{openNow:u}=await(0,Bq.prompt)({type:"confirm",name:"openNow",message:"Do you want to try to open this url now?",required:!0,initial:!0,onCancel:()=>process.exit(130)});u&&(await Ji.openUrl(n[1])||(a.reportSeparator(),a.reportWarning(0,"We failed to automatically open the url; you'll have to open it yourself in your browser of choice.")))}}}),process.stdout.write(` +`)),process.env.YARN_IS_TEST_ENV)return process.env.YARN_INJECT_NPM_2FA_TOKEN||"";let{otp:o}=await(0,Bq.prompt)({type:"password",name:"otp",message:"One-time password:",required:!0,onCancel:()=>process.exit(130)});return process.stdout.write(` +`),o}function bQ(t){if(t.originalError?.name!=="HTTPError")return!1;try{return(t.originalError?.response.headers["www-authenticate"].split(/,\s*/).map(r=>r.toLowerCase())).includes("otp")}catch{return!1}}function VC(t){return{["npm-otp"]:t}}var fv=class{supports(e,r){if(!e.reference.startsWith(Wn))return!1;let{selector:o,params:a}=W.parseRange(e.reference);return!(!x1e.default.valid(o)||a===null||typeof a.__archiveUrl!="string")}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${W.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:W.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let{params:o}=W.parseRange(e.reference);if(o===null||typeof o.__archiveUrl!="string")throw new Error("Assertion failed: The archiveUrl querystring parameter should have been available");let a=await ym(o.__archiveUrl,{customErrorMessage:mm,configuration:r.project.configuration,ident:e});return await Xi.convertToZip(a,{configuration:r.project.configuration,prefixPath:W.getIdentVendorPath(e),stripComponents:1})}};Ye();var pv=class{supportsDescriptor(e,r){return!(!e.range.startsWith(Wn)||!W.tryParseDescriptor(e.range.slice(Wn.length),!0))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){let o=r.project.configuration.normalizeDependency(W.parseDescriptor(e.range.slice(Wn.length),!0));return r.resolver.getResolutionDependencies(o,r)}async getCandidates(e,r,o){let a=o.project.configuration.normalizeDependency(W.parseDescriptor(e.range.slice(Wn.length),!0));return await o.resolver.getCandidates(a,r,o)}async getSatisfying(e,r,o,a){let n=a.project.configuration.normalizeDependency(W.parseDescriptor(e.range.slice(Wn.length),!0));return a.resolver.getSatisfying(n,r,o,a)}resolve(e,r){throw new Error("Unreachable")}};Ye();Ye();var b1e=$e(zn()),k1e=Be("url");var dl=class{supports(e,r){if(!e.reference.startsWith(Wn))return!1;let o=new k1e.URL(e.reference);return!(!b1e.default.valid(o.pathname)||o.searchParams.has("__archiveUrl"))}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${W.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:W.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let o;try{o=await ym(dl.getLocatorUrl(e),{customErrorMessage:mm,configuration:r.project.configuration,ident:e})}catch{o=await ym(dl.getLocatorUrl(e).replace(/%2f/g,"/"),{customErrorMessage:mm,configuration:r.project.configuration,ident:e})}return await Xi.convertToZip(o,{configuration:r.project.configuration,prefixPath:W.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,r,{configuration:o}){let a=WC(e.scope,{configuration:o}),n=dl.getLocatorUrl(e);return r=r.replace(/^https?:(\/\/(?:[^/]+\.)?npmjs.org(?:$|\/))/,"https:$1"),a=a.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r=r.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r===a+n||r===a+n.replace(/%2f/g,"/")}static getLocatorUrl(e){let r=kr.clean(e.reference.slice(Wn.length));if(r===null)throw new zt(10,"The npm semver resolver got selected, but the version isn't semver");return`${SQ(e)}/-/${e.name}-${r}.tgz`}};Ye();Ye();Ye();var Pq=$e(zn());var kQ=W.makeIdent(null,"node-gyp"),O1t=/\b(node-gyp|prebuild-install)\b/,hv=class{supportsDescriptor(e,r){return e.range.startsWith(Wn)?!!kr.validRange(e.range.slice(Wn.length)):!1}supportsLocator(e,r){if(!e.reference.startsWith(Wn))return!1;let{selector:o}=W.parseRange(e.reference);return!!Pq.default.valid(o)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=kr.validRange(e.range.slice(Wn.length));if(a===null)throw new Error(`Expected a valid range, got ${e.range.slice(Wn.length)}`);let n=await KC(e,{cache:o.fetchOptions?.cache,project:o.project,version:Pq.default.valid(a.raw)?a.raw:void 0}),u=je.mapAndFilter(Object.keys(n.versions),h=>{try{let E=new kr.SemVer(h);if(a.test(E))return E}catch{}return je.mapAndFilter.skip}),A=u.filter(h=>!n.versions[h.raw].deprecated),p=A.length>0?A:u;return p.sort((h,E)=>-h.compare(E)),p.map(h=>{let E=W.makeLocator(e,`${Wn}${h.raw}`),I=n.versions[h.raw].dist.tarball;return dl.isConventionalTarballUrl(E,I,{configuration:o.project.configuration})?E:W.bindLocator(E,{__archiveUrl:I})})}async getSatisfying(e,r,o,a){let n=kr.validRange(e.range.slice(Wn.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(Wn.length)}`);return{locators:je.mapAndFilter(o,p=>{if(p.identHash!==e.identHash)return je.mapAndFilter.skip;let h=W.tryParseRange(p.reference,{requireProtocol:Wn});if(!h)return je.mapAndFilter.skip;let E=new kr.SemVer(h.selector);return n.test(E)?{locator:p,version:E}:je.mapAndFilter.skip}).sort((p,h)=>-p.version.compare(h.version)).map(({locator:p})=>p),sorted:!0}}async resolve(e,r){let{selector:o}=W.parseRange(e.reference),a=kr.clean(o);if(a===null)throw new zt(10,"The npm semver resolver got selected, but the version isn't semver");let n=await KC(e,{cache:r.fetchOptions?.cache,project:r.project,version:a});if(!Object.hasOwn(n,"versions"))throw new zt(15,'Registry returned invalid data for - missing "versions" field');if(!Object.hasOwn(n.versions,a))throw new zt(16,`Registry failed to return reference "${a}"`);let u=new Mt;if(u.load(n.versions[a]),!u.dependencies.has(kQ.identHash)&&!u.peerDependencies.has(kQ.identHash)){for(let A of u.scripts.values())if(A.match(O1t)){u.dependencies.set(kQ.identHash,W.makeDescriptor(kQ,"latest"));break}}return{...e,version:a,languageName:"node",linkType:"HARD",conditions:u.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(u.dependencies),peerDependencies:u.peerDependencies,dependenciesMeta:u.dependenciesMeta,peerDependenciesMeta:u.peerDependenciesMeta,bin:u.bin}}};Ye();Ye();var Q1e=$e(zn());var gv=class{supportsDescriptor(e,r){return!(!e.range.startsWith(Wn)||!QE.test(e.range.slice(Wn.length)))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=e.range.slice(Wn.length),n=await KC(e,{cache:o.fetchOptions?.cache,project:o.project});if(!Object.hasOwn(n,"dist-tags"))throw new zt(15,'Registry returned invalid data - missing "dist-tags" field');let u=n["dist-tags"];if(!Object.hasOwn(u,a))throw new zt(16,`Registry failed to return tag "${a}"`);let A=u[a],p=W.makeLocator(e,`${Wn}${A}`),h=n.versions[A].dist.tarball;return dl.isConventionalTarballUrl(p,h,{configuration:o.project.configuration})?[p]:[W.bindLocator(p,{__archiveUrl:h})]}async getSatisfying(e,r,o,a){let n=[];for(let u of o){if(u.identHash!==e.identHash)continue;let A=W.tryParseRange(u.reference,{requireProtocol:Wn});if(!(!A||!Q1e.default.valid(A.selector))){if(A.params?.__archiveUrl){let p=W.makeRange({protocol:Wn,selector:A.selector,source:null,params:null}),[h]=await a.resolver.getCandidates(W.makeDescriptor(e,p),r,a);if(u.reference!==h.reference)continue}n.push(u)}}return{locators:n,sorted:!1}}async resolve(e,r){throw new Error("Unreachable")}};var sw={};Kt(sw,{getGitHead:()=>Lvt,getPublishAccess:()=>wBe,getReadmeContent:()=>IBe,makePublishBody:()=>Nvt});Ye();Ye();Pt();var hG={};Kt(hG,{PackCommand:()=>O0,default:()=>mvt,packUtils:()=>CA});Ye();Ye();Ye();Pt();qt();var CA={};Kt(CA,{genPackList:()=>$Q,genPackStream:()=>pG,genPackageManifest:()=>lBe,hasPackScripts:()=>AG,prepareForPack:()=>fG});Ye();Pt();var uG=$e(Zo()),oBe=$e(rBe()),aBe=Be("zlib"),ovt=["/package.json","/readme","/readme.*","/license","/license.*","/licence","/licence.*","/changelog","/changelog.*"],avt=["/package.tgz",".github",".git",".hg","node_modules",".npmignore",".gitignore",".#*",".DS_Store"];async function AG(t){return!!(un.hasWorkspaceScript(t,"prepack")||un.hasWorkspaceScript(t,"postpack"))}async function fG(t,{report:e},r){await un.maybeExecuteWorkspaceLifecycleScript(t,"prepack",{report:e});try{let o=K.join(t.cwd,Mt.fileName);await oe.existsPromise(o)&&await t.manifest.loadFile(o,{baseFs:oe}),await r()}finally{await un.maybeExecuteWorkspaceLifecycleScript(t,"postpack",{report:e})}}async function pG(t,e){typeof e>"u"&&(e=await $Q(t));let r=new Set;for(let n of t.manifest.publishConfig?.executableFiles??new Set)r.add(K.normalize(n));for(let n of t.manifest.bin.values())r.add(K.normalize(n));let o=oBe.default.pack();process.nextTick(async()=>{for(let n of e){let u=K.normalize(n),A=K.resolve(t.cwd,u),p=K.join("package",u),h=await oe.lstatPromise(A),E={name:p,mtime:new Date(vi.SAFE_TIME*1e3)},I=r.has(u)?493:420,v,b,C=new Promise((L,U)=>{v=L,b=U}),T=L=>{L?b(L):v()};if(h.isFile()){let L;u==="package.json"?L=Buffer.from(JSON.stringify(await lBe(t),null,2)):L=await oe.readFilePromise(A),o.entry({...E,mode:I,type:"file"},L,T)}else h.isSymbolicLink()?o.entry({...E,mode:I,type:"symlink",linkname:await oe.readlinkPromise(A)},T):T(new Error(`Unsupported file type ${h.mode} for ${ue.fromPortablePath(u)}`));await C}o.finalize()});let a=(0,aBe.createGzip)();return o.pipe(a),a}async function lBe(t){let e=JSON.parse(JSON.stringify(t.manifest.raw));return await t.project.configuration.triggerHook(r=>r.beforeWorkspacePacking,t,e),e}async function $Q(t){let e=t.project,r=e.configuration,o={accept:[],reject:[]};for(let I of avt)o.reject.push(I);for(let I of ovt)o.accept.push(I);o.reject.push(r.get("rcFilename"));let a=I=>{if(I===null||!I.startsWith(`${t.cwd}/`))return;let v=K.relative(t.cwd,I),b=K.resolve(Bt.root,v);o.reject.push(b)};a(K.resolve(e.cwd,dr.lockfile)),a(r.get("cacheFolder")),a(r.get("globalFolder")),a(r.get("installStatePath")),a(r.get("virtualFolder")),a(r.get("yarnPath")),await r.triggerHook(I=>I.populateYarnPaths,e,I=>{a(I)});for(let I of e.workspaces){let v=K.relative(t.cwd,I.cwd);v!==""&&!v.match(/^(\.\.)?\//)&&o.reject.push(`/${v}`)}let n={accept:[],reject:[]},u=t.manifest.publishConfig?.main??t.manifest.main,A=t.manifest.publishConfig?.module??t.manifest.module,p=t.manifest.publishConfig?.browser??t.manifest.browser,h=t.manifest.publishConfig?.bin??t.manifest.bin;u!=null&&n.accept.push(K.resolve(Bt.root,u)),A!=null&&n.accept.push(K.resolve(Bt.root,A)),typeof p=="string"&&n.accept.push(K.resolve(Bt.root,p));for(let I of h.values())n.accept.push(K.resolve(Bt.root,I));if(p instanceof Map)for(let[I,v]of p.entries())n.accept.push(K.resolve(Bt.root,I)),typeof v=="string"&&n.accept.push(K.resolve(Bt.root,v));let E=t.manifest.files!==null;if(E){n.reject.push("/*");for(let I of t.manifest.files)cBe(n.accept,I,{cwd:Bt.root})}return await lvt(t.cwd,{hasExplicitFileList:E,globalList:o,ignoreList:n})}async function lvt(t,{hasExplicitFileList:e,globalList:r,ignoreList:o}){let a=[],n=new _u(t),u=[[Bt.root,[o]]];for(;u.length>0;){let[A,p]=u.pop(),h=await n.lstatPromise(A);if(!iBe(A,{globalList:r,ignoreLists:h.isDirectory()?null:p}))if(h.isDirectory()){let E=await n.readdirPromise(A),I=!1,v=!1;if(!e||A!==Bt.root)for(let T of E)I=I||T===".gitignore",v=v||T===".npmignore";let b=v?await nBe(n,A,".npmignore"):I?await nBe(n,A,".gitignore"):null,C=b!==null?[b].concat(p):p;iBe(A,{globalList:r,ignoreLists:p})&&(C=[...p,{accept:[],reject:["**/*"]}]);for(let T of E)u.push([K.resolve(A,T),C])}else(h.isFile()||h.isSymbolicLink())&&a.push(K.relative(Bt.root,A))}return a.sort()}async function nBe(t,e,r){let o={accept:[],reject:[]},a=await t.readFilePromise(K.join(e,r),"utf8");for(let n of a.split(/\n/g))cBe(o.reject,n,{cwd:e});return o}function cvt(t,{cwd:e}){let r=t[0]==="!";return r&&(t=t.slice(1)),t.match(/\.{0,1}\//)&&(t=K.resolve(e,t)),r&&(t=`!${t}`),t}function cBe(t,e,{cwd:r}){let o=e.trim();o===""||o[0]==="#"||t.push(cvt(o,{cwd:r}))}function iBe(t,{globalList:e,ignoreLists:r}){let o=ZQ(t,e.accept);if(o!==0)return o===2;let a=ZQ(t,e.reject);if(a!==0)return a===1;if(r!==null)for(let n of r){let u=ZQ(t,n.accept);if(u!==0)return u===2;let A=ZQ(t,n.reject);if(A!==0)return A===1}return!1}function ZQ(t,e){let r=e,o=[];for(let a=0;a{await fG(a,{report:p},async()=>{p.reportJson({base:ue.fromPortablePath(a.cwd)});let h=await $Q(a);for(let E of h)p.reportInfo(null,ue.fromPortablePath(E)),p.reportJson({location:ue.fromPortablePath(E)});if(!this.dryRun){let E=await pG(a,h),I=oe.createWriteStream(u);E.pipe(I),await new Promise(v=>{I.on("finish",v)})}}),this.dryRun||(p.reportInfo(0,`Package archive generated in ${de.pretty(r,u,de.Type.PATH)}`),p.reportJson({output:ue.fromPortablePath(u)}))})).exitCode()}};O0.paths=[["pack"]],O0.usage=nt.Usage({description:"generate a tarball from the active workspace",details:"\n This command will turn the active workspace into a compressed archive suitable for publishing. The archive will by default be stored at the root of the workspace (`package.tgz`).\n\n If the `-o,---out` is set the archive will be created at the specified path. The `%s` and `%v` variables can be used within the path and will be respectively replaced by the package name and version.\n ",examples:[["Create an archive from the active workspace","yarn pack"],["List the files that would be made part of the workspace's archive","yarn pack --dry-run"],["Name and output the archive in a dedicated folder","yarn pack --out /artifacts/%s-%v.tgz"]]});function uvt(t,{workspace:e}){let r=t.replace("%s",Avt(e)).replace("%v",fvt(e));return ue.toPortablePath(r)}function Avt(t){return t.manifest.name!==null?W.slugifyIdent(t.manifest.name):"package"}function fvt(t){return t.manifest.version!==null?t.manifest.version:"unknown"}var pvt=["dependencies","devDependencies","peerDependencies"],hvt="workspace:",gvt=(t,e)=>{e.publishConfig&&(e.publishConfig.type&&(e.type=e.publishConfig.type),e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.imports&&(e.imports=e.publishConfig.imports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let r=t.project;for(let o of pvt)for(let a of t.manifest.getForScope(o).values()){let n=r.tryWorkspaceByDescriptor(a),u=W.parseRange(a.range);if(u.protocol===hvt)if(n===null){if(r.tryWorkspaceByIdent(a)===null)throw new zt(21,`${W.prettyDescriptor(r.configuration,a)}: No local workspace found for this range`)}else{let A;W.areDescriptorsEqual(a,n.anchoredDescriptor)||u.selector==="*"?A=n.manifest.version??"0.0.0":u.selector==="~"||u.selector==="^"?A=`${u.selector}${n.manifest.version??"0.0.0"}`:A=u.selector;let p=o==="dependencies"?W.makeDescriptor(a,"unknown"):null,h=p!==null&&t.manifest.ensureDependencyMeta(p).optional?"optionalDependencies":o;e[h][W.stringifyIdent(a)]=A}}},dvt={hooks:{beforeWorkspacePacking:gvt},commands:[O0]},mvt=dvt;var yBe=Be("crypto"),EBe=$e(mBe()),CBe=Be("url");async function Nvt(t,e,{access:r,tag:o,registry:a,gitHead:n}){let u=t.manifest.name,A=t.manifest.version,p=W.stringifyIdent(u),h=(0,yBe.createHash)("sha1").update(e).digest("hex"),E=EBe.default.fromData(e).toString(),I=r??wBe(t,u),v=await IBe(t),b=await CA.genPackageManifest(t),C=`${p}-${A}.tgz`,T=new CBe.URL(`${oc(a)}/${p}/-/${C}`);return{_id:p,_attachments:{[C]:{content_type:"application/octet-stream",data:e.toString("base64"),length:e.length}},name:p,access:I,["dist-tags"]:{[o]:A},versions:{[A]:{...b,_id:`${p}@${A}`,name:p,version:A,gitHead:n,dist:{shasum:h,integrity:E,tarball:T.toString()}}},readme:v}}async function Lvt(t){try{let{stdout:e}=await Ur.execvp("git",["rev-parse","--revs-only","HEAD"],{cwd:t});return e.trim()===""?void 0:e.trim()}catch{return}}function wBe(t,e){let r=t.project.configuration;return t.manifest.publishConfig&&typeof t.manifest.publishConfig.access=="string"?t.manifest.publishConfig.access:r.get("npmPublishAccess")!==null?r.get("npmPublishAccess"):e.scope?"restricted":"public"}async function IBe(t){let e=ue.toPortablePath(`${t.cwd}/README.md`),r=t.manifest.name,a=`# ${W.stringifyIdent(r)} +`;try{a=await oe.readFilePromise(e,"utf8")}catch(n){if(n.code==="ENOENT")return a;throw n}return a}var yG={npmAlwaysAuth:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:"BOOLEAN",default:!1},npmAuthIdent:{description:"Authentication identity for the npm registry (_auth in npm and yarn v1)",type:"SECRET",default:null},npmAuthToken:{description:"Authentication token for the npm registry (_authToken in npm and yarn v1)",type:"SECRET",default:null}},BBe={npmAuditRegistry:{description:"Registry to query for audit reports",type:"STRING",default:null},npmPublishRegistry:{description:"Registry to push packages to",type:"STRING",default:null},npmRegistryServer:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:"STRING",default:"https://registry.yarnpkg.com"}},Mvt={configuration:{...yG,...BBe,npmScopes:{description:"Settings per package scope",type:"MAP",valueDefinition:{description:"",type:"SHAPE",properties:{...yG,...BBe}}},npmRegistries:{description:"Settings per registry",type:"MAP",normalizeKeys:oc,valueDefinition:{description:"",type:"SHAPE",properties:{...yG}}}},fetchers:[fv,dl],resolvers:[pv,hv,gv]},Ovt=Mvt;var xG={};Kt(xG,{NpmAuditCommand:()=>_0,NpmInfoCommand:()=>H0,NpmLoginCommand:()=>j0,NpmLogoutCommand:()=>q0,NpmPublishCommand:()=>G0,NpmTagAddCommand:()=>W0,NpmTagListCommand:()=>Y0,NpmTagRemoveCommand:()=>V0,NpmWhoamiCommand:()=>K0,default:()=>Gvt,npmAuditTypes:()=>Tv,npmAuditUtils:()=>eF});Ye();Ye();qt();var vG=$e(Zo());Za();var Tv={};Kt(Tv,{Environment:()=>Qv,Severity:()=>Fv});var Qv=(o=>(o.All="all",o.Production="production",o.Development="development",o))(Qv||{}),Fv=(n=>(n.Info="info",n.Low="low",n.Moderate="moderate",n.High="high",n.Critical="critical",n))(Fv||{});var eF={};Kt(eF,{allSeverities:()=>ow,getPackages:()=>BG,getReportTree:()=>wG,getSeverityInclusions:()=>CG,getTopLevelDependencies:()=>IG});Ye();var vBe=$e(zn());var ow=["info","low","moderate","high","critical"];function CG(t){if(typeof t>"u")return new Set(ow);let e=ow.indexOf(t),r=ow.slice(e);return new Set(r)}function wG(t){let e={},r={children:e};for(let[o,a]of je.sortMap(Object.entries(t),n=>n[0]))for(let n of je.sortMap(a,u=>`${u.id}`))e[`${o}/${n.id}`]={value:de.tuple(de.Type.IDENT,W.parseIdent(o)),children:{ID:typeof n.id<"u"&&{label:"ID",value:de.tuple(de.Type.ID,n.id)},Issue:{label:"Issue",value:de.tuple(de.Type.NO_HINT,n.title)},URL:typeof n.url<"u"&&{label:"URL",value:de.tuple(de.Type.URL,n.url)},Severity:{label:"Severity",value:de.tuple(de.Type.NO_HINT,n.severity)},["Vulnerable Versions"]:{label:"Vulnerable Versions",value:de.tuple(de.Type.RANGE,n.vulnerable_versions)},["Tree Versions"]:{label:"Tree Versions",children:[...n.versions].sort(vBe.default.compare).map(u=>({value:de.tuple(de.Type.REFERENCE,u)}))},Dependents:{label:"Dependents",children:je.sortMap(n.dependents,u=>W.stringifyLocator(u)).map(u=>({value:de.tuple(de.Type.LOCATOR,u)}))}}};return r}function IG(t,e,{all:r,environment:o}){let a=[],n=r?t.workspaces:[e],u=["all","production"].includes(o),A=["all","development"].includes(o);for(let p of n)for(let h of p.anchoredPackage.dependencies.values())(p.manifest.devDependencies.has(h.identHash)?!A:!u)||a.push({workspace:p,dependency:h});return a}function BG(t,e,{recursive:r}){let o=new Map,a=new Set,n=[],u=(A,p)=>{let h=t.storedResolutions.get(p.descriptorHash);if(typeof h>"u")throw new Error("Assertion failed: The resolution should have been registered");if(!a.has(h))a.add(h);else return;let E=t.storedPackages.get(h);if(typeof E>"u")throw new Error("Assertion failed: The package should have been registered");if(W.ensureDevirtualizedLocator(E).reference.startsWith("npm:")&&E.version!==null){let v=W.stringifyIdent(E),b=je.getMapWithDefault(o,v);je.getArrayWithDefault(b,E.version).push(A)}if(r)for(let v of E.dependencies.values())n.push([E,v])};for(let{workspace:A,dependency:p}of e)n.push([A.anchoredLocator,p]);for(;n.length>0;){let[A,p]=n.shift();u(A,p)}return o}var _0=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean("-A,--all",!1,{description:"Audit dependencies from all workspaces"});this.recursive=ge.Boolean("-R,--recursive",!1,{description:"Audit transitive dependencies as well"});this.environment=ge.String("--environment","all",{description:"Which environments to cover",validator:Vs(Qv)});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.noDeprecations=ge.Boolean("--no-deprecations",!1,{description:"Don't warn about deprecated packages"});this.severity=ge.String("--severity","info",{description:"Minimal severity requested for packages to be displayed",validator:Vs(Fv)});this.excludes=ge.Array("--exclude",[],{description:"Array of glob patterns of packages to exclude from audit"});this.ignores=ge.Array("--ignore",[],{description:"Array of glob patterns of advisory ID's to ignore in the audit report"})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new rr(o.cwd,this.context.cwd);await o.restoreInstallState();let n=IG(o,a,{all:this.all,environment:this.environment}),u=BG(o,n,{recursive:this.recursive}),A=Array.from(new Set([...r.get("npmAuditExcludePackages"),...this.excludes])),p=Object.create(null);for(let[L,U]of u)A.some(J=>vG.default.isMatch(L,J))||(p[L]=[...U.keys()]);let h=Zn.getAuditRegistry({configuration:r}),E,I=await AA.start({configuration:r,stdout:this.context.stdout},async()=>{let L=on.post("/-/npm/v1/security/advisories/bulk",p,{authType:on.AuthType.BEST_EFFORT,configuration:r,jsonResponse:!0,registry:h}),U=this.noDeprecations?[]:await Promise.all(Array.from(Object.entries(p),async([te,le])=>{let pe=await on.getPackageMetadata(W.parseIdent(te),{project:o});return je.mapAndFilter(le,Ae=>{let{deprecated:ye}=pe.versions[Ae];return ye?[te,Ae,ye]:je.mapAndFilter.skip})})),J=await L;for(let[te,le,pe]of U.flat(1))Object.hasOwn(J,te)&&J[te].some(Ae=>kr.satisfiesWithPrereleases(le,Ae.vulnerable_versions))||(J[te]??=[],J[te].push({id:`${te} (deprecation)`,title:pe.trim()||"This package has been deprecated.",severity:"moderate",vulnerable_versions:le}));E=J});if(I.hasErrors())return I.exitCode();let v=CG(this.severity),b=Array.from(new Set([...r.get("npmAuditIgnoreAdvisories"),...this.ignores])),C=Object.create(null);for(let[L,U]of Object.entries(E)){let J=U.filter(te=>!vG.default.isMatch(`${te.id}`,b)&&v.has(te.severity));J.length>0&&(C[L]=J.map(te=>{let le=u.get(L);if(typeof le>"u")throw new Error("Assertion failed: Expected the registry to only return packages that were requested");let pe=[...le.keys()].filter(ye=>kr.satisfiesWithPrereleases(ye,te.vulnerable_versions)),Ae=new Map;for(let ye of pe)for(let ae of le.get(ye))Ae.set(ae.locatorHash,ae);return{...te,versions:pe,dependents:[...Ae.values()]}}))}let T=Object.keys(C).length>0;return T?($s.emitTree(wG(C),{configuration:r,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Nt.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async L=>{L.reportInfo(1,"No audit suggestions")}),T?1:0)}};_0.paths=[["npm","audit"]],_0.usage=nt.Usage({description:"perform a vulnerability audit against the installed packages",details:` + This command checks for known security reports on the packages you use. The reports are by default extracted from the npm registry, and may or may not be relevant to your actual program (not all vulnerabilities affect all code paths). + + For consistency with our other commands the default is to only check the direct dependencies for the active workspace. To extend this search to all workspaces, use \`-A,--all\`. To extend this search to both direct and transitive dependencies, use \`-R,--recursive\`. + + Applying the \`--severity\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${ow.map(r=>`\`${r}\``).join(", ")}. + + If the \`--json\` flag is set, Yarn will print the output exactly as received from the registry. Regardless of this flag, the process will exit with a non-zero exit code if a report is found for the selected packages. + + If certain packages produce false positives for a particular environment, the \`--exclude\` flag can be used to exclude any number of packages from the audit. This can also be set in the configuration file with the \`npmAuditExcludePackages\` option. + + If particular advisories are needed to be ignored, the \`--ignore\` flag can be used with Advisory ID's to ignore any number of advisories in the audit report. This can also be set in the configuration file with the \`npmAuditIgnoreAdvisories\` option. + + To understand the dependency tree requiring vulnerable packages, check the raw report with the \`--json\` flag or use \`yarn why package\` to get more information as to who depends on them. + `,examples:[["Checks for known security issues with the installed packages. The output is a list of known issues.","yarn npm audit"],["Audit dependencies in all workspaces","yarn npm audit --all"],["Limit auditing to `dependencies` (excludes `devDependencies`)","yarn npm audit --environment production"],["Show audit report as valid JSON","yarn npm audit --json"],["Audit all direct and transitive dependencies","yarn npm audit --recursive"],["Output moderate (or more severe) vulnerabilities","yarn npm audit --severity moderate"],["Exclude certain packages","yarn npm audit --exclude package1 --exclude package2"],["Ignore specific advisories","yarn npm audit --ignore 1234567 --ignore 7654321"]]});Ye();Ye();Pt();qt();var DG=$e(zn()),PG=Be("util"),H0=class extends ut{constructor(){super(...arguments);this.fields=ge.String("-f,--fields",{description:"A comma-separated list of manifest fields that should be displayed"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.packages=ge.Rest()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd),a=typeof this.fields<"u"?new Set(["name",...this.fields.split(/\s*,\s*/)]):null,n=[],u=!1,A=await Nt.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async p=>{for(let h of this.packages){let E;if(h==="."){let le=o.topLevelWorkspace;if(!le.manifest.name)throw new it(`Missing ${de.pretty(r,"name",de.Type.CODE)} field in ${ue.fromPortablePath(K.join(le.cwd,dr.manifest))}`);E=W.makeDescriptor(le.manifest.name,"unknown")}else E=W.parseDescriptor(h);let I=on.getIdentUrl(E),v=SG(await on.get(I,{configuration:r,ident:E,jsonResponse:!0,customErrorMessage:on.customPackageError})),b=Object.keys(v.versions).sort(DG.default.compareLoose),T=v["dist-tags"].latest||b[b.length-1],L=kr.validRange(E.range);if(L){let le=DG.default.maxSatisfying(b,L);le!==null?T=le:(p.reportWarning(0,`Unmet range ${W.prettyRange(r,E.range)}; falling back to the latest version`),u=!0)}else Object.hasOwn(v["dist-tags"],E.range)?T=v["dist-tags"][E.range]:E.range!=="unknown"&&(p.reportWarning(0,`Unknown tag ${W.prettyRange(r,E.range)}; falling back to the latest version`),u=!0);let U=v.versions[T],J={...v,...U,version:T,versions:b},te;if(a!==null){te={};for(let le of a){let pe=J[le];if(typeof pe<"u")te[le]=pe;else{p.reportWarning(1,`The ${de.pretty(r,le,de.Type.CODE)} field doesn't exist inside ${W.prettyIdent(r,E)}'s information`),u=!0;continue}}}else this.json||(delete J.dist,delete J.readme,delete J.users),te=J;p.reportJson(te),this.json||n.push(te)}});PG.inspect.styles.name="cyan";for(let p of n)(p!==n[0]||u)&&this.context.stdout.write(` +`),this.context.stdout.write(`${(0,PG.inspect)(p,{depth:1/0,colors:!0,compact:!1})} +`);return A.exitCode()}};H0.paths=[["npm","info"]],H0.usage=nt.Usage({category:"Npm-related commands",description:"show information about a package",details:"\n This command fetches information about a package from the npm registry and prints it in a tree format.\n\n The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\n\n Append `@` to the package argument to provide information specific to the latest version that satisfies the range or to the corresponding tagged version. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\n\n If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package information.\n\n By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\n ",examples:[["Show all available information about react (except the `dist`, `readme`, and `users` fields)","yarn npm info react"],["Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)","yarn npm info react --json"],["Show all available information about react@16.12.0","yarn npm info react@16.12.0"],["Show all available information about react@next","yarn npm info react@next"],["Show the description of react","yarn npm info react --fields description"],["Show all available versions of react","yarn npm info react --fields versions"],["Show the readme of react","yarn npm info react --fields readme"],["Show a few fields of react","yarn npm info react --fields homepage,repository"]]});function SG(t){if(Array.isArray(t)){let e=[];for(let r of t)r=SG(r),r&&e.push(r);return e}else if(typeof t=="object"&&t!==null){let e={};for(let r of Object.keys(t)){if(r.startsWith("_"))continue;let o=SG(t[r]);o&&(e[r]=o)}return e}else return t||null}Ye();Ye();qt();var DBe=$e(A2()),j0=class extends ut{constructor(){super(...arguments);this.scope=ge.String("-s,--scope",{description:"Login to the registry configured for a given scope"});this.publish=ge.Boolean("--publish",!1,{description:"Login to the publish registry"});this.alwaysAuth=ge.Boolean("--always-auth",{description:"Set the npmAlwaysAuth configuration"})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),o=await tF({configuration:r,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Nt.start({configuration:r,stdout:this.context.stdout,includeFooter:!1},async n=>{let u=await _vt({configuration:r,registry:o,report:n,stdin:this.context.stdin,stdout:this.context.stdout}),A=`/-/user/org.couchdb.user:${encodeURIComponent(u.name)}`,p=await on.put(A,u,{attemptedAs:u.name,configuration:r,registry:o,jsonResponse:!0,authType:on.AuthType.NO_AUTH});return await Uvt(o,p.token,{alwaysAuth:this.alwaysAuth,scope:this.scope}),n.reportInfo(0,"Successfully logged in")})).exitCode()}};j0.paths=[["npm","login"]],j0.usage=nt.Usage({category:"Npm-related commands",description:"store new login info to access the npm registry",details:"\n This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\n\n Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n ",examples:[["Login to the default registry","yarn npm login"],["Login to the registry linked to the @my-scope registry","yarn npm login --scope my-scope"],["Login to the publish registry for the current package","yarn npm login --publish"]]});async function tF({scope:t,publish:e,configuration:r,cwd:o}){return t&&e?Zn.getScopeRegistry(t,{configuration:r,type:Zn.RegistryType.PUBLISH_REGISTRY}):t?Zn.getScopeRegistry(t,{configuration:r}):e?Zn.getPublishRegistry((await AC(r,o)).manifest,{configuration:r}):Zn.getDefaultRegistry({configuration:r})}async function Uvt(t,e,{alwaysAuth:r,scope:o}){let a=u=>A=>{let p=je.isIndexableObject(A)?A:{},h=p[u],E=je.isIndexableObject(h)?h:{};return{...p,[u]:{...E,...r!==void 0?{npmAlwaysAuth:r}:{},npmAuthToken:e}}},n=o?{npmScopes:a(o)}:{npmRegistries:a(t)};return await Ve.updateHomeConfiguration(n)}async function _vt({configuration:t,registry:e,report:r,stdin:o,stdout:a}){r.reportInfo(0,`Logging in to ${de.pretty(t,e,de.Type.URL)}`);let n=!1;if(e.match(/^https:\/\/npm\.pkg\.github\.com(\/|$)/)&&(r.reportInfo(0,"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions."),n=!0),r.reportSeparator(),t.env.YARN_IS_TEST_ENV)return{name:t.env.YARN_INJECT_NPM_USER||"",password:t.env.YARN_INJECT_NPM_PASSWORD||""};let{username:u,password:A}=await(0,DBe.prompt)([{type:"input",name:"username",message:"Username:",required:!0,onCancel:()=>process.exit(130),stdin:o,stdout:a},{type:"password",name:"password",message:n?"Token:":"Password:",required:!0,onCancel:()=>process.exit(130),stdin:o,stdout:a}]);return r.reportSeparator(),{name:u,password:A}}Ye();Ye();qt();var aw=new Set(["npmAuthIdent","npmAuthToken"]),q0=class extends ut{constructor(){super(...arguments);this.scope=ge.String("-s,--scope",{description:"Logout of the registry configured for a given scope"});this.publish=ge.Boolean("--publish",!1,{description:"Logout of the publish registry"});this.all=ge.Boolean("-A,--all",!1,{description:"Logout of all registries"})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),o=async()=>{let n=await tF({configuration:r,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),u=await Ve.find(this.context.cwd,this.context.plugins),A=W.makeIdent(this.scope??null,"pkg");return!Zn.getAuthConfiguration(n,{configuration:u,ident:A}).get("npmAuthToken")};return(await Nt.start({configuration:r,stdout:this.context.stdout},async n=>{if(this.all&&(await jvt(),n.reportInfo(0,"Successfully logged out from everything")),this.scope){await PBe("npmScopes",this.scope),await o()?n.reportInfo(0,`Successfully logged out from ${this.scope}`):n.reportWarning(0,"Scope authentication settings removed, but some other ones settings still apply to it");return}let u=await tF({configuration:r,cwd:this.context.cwd,publish:this.publish});await PBe("npmRegistries",u),await o()?n.reportInfo(0,`Successfully logged out from ${u}`):n.reportWarning(0,"Registry authentication settings removed, but some other ones settings still apply to it")})).exitCode()}};q0.paths=[["npm","logout"]],q0.usage=nt.Usage({category:"Npm-related commands",description:"logout of the npm registry",details:"\n This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\n\n Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n\n Adding the `-A,--all` flag will cause the deletion to be done against all registries and scopes.\n ",examples:[["Logout of the default registry","yarn npm logout"],["Logout of the @my-scope scope","yarn npm logout --scope my-scope"],["Logout of the publish registry for the current package","yarn npm logout --publish"],["Logout of all registries","yarn npm logout --all"]]});function Hvt(t,e){let r=t[e];if(!je.isIndexableObject(r))return!1;let o=new Set(Object.keys(r));if([...aw].every(n=>!o.has(n)))return!1;for(let n of aw)o.delete(n);if(o.size===0)return t[e]=void 0,!0;let a={...r};for(let n of aw)delete a[n];return t[e]=a,!0}async function jvt(){let t=e=>{let r=!1,o=je.isIndexableObject(e)?{...e}:{};o.npmAuthToken&&(delete o.npmAuthToken,r=!0);for(let a of Object.keys(o))Hvt(o,a)&&(r=!0);if(Object.keys(o).length!==0)return r?o:e};return await Ve.updateHomeConfiguration({npmRegistries:t,npmScopes:t})}async function PBe(t,e){return await Ve.updateHomeConfiguration({[t]:r=>{let o=je.isIndexableObject(r)?r:{};if(!Object.hasOwn(o,e))return r;let a=o[e],n=je.isIndexableObject(a)?a:{},u=new Set(Object.keys(n));if([...aw].every(p=>!u.has(p)))return r;for(let p of aw)u.delete(p);if(u.size===0)return Object.keys(o).length===1?void 0:{...o,[e]:void 0};let A={};for(let p of aw)A[p]=void 0;return{...o,[e]:{...n,...A}}}})}Ye();qt();var G0=class extends ut{constructor(){super(...arguments);this.access=ge.String("--access",{description:"The access for the published package (public or restricted)"});this.tag=ge.String("--tag","latest",{description:"The tag on the registry that the package should be attached to"});this.tolerateRepublish=ge.Boolean("--tolerate-republish",!1,{description:"Warn and exit when republishing an already existing version of a package"});this.otp=ge.String("--otp",{description:"The OTP token to use with the command"})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new rr(o.cwd,this.context.cwd);if(a.manifest.private)throw new it("Private workspaces cannot be published");if(a.manifest.name===null||a.manifest.version===null)throw new it("Workspaces must have valid names and versions to be published on an external registry");await o.restoreInstallState();let n=a.manifest.name,u=a.manifest.version,A=Zn.getPublishRegistry(a.manifest,{configuration:r});return(await Nt.start({configuration:r,stdout:this.context.stdout},async h=>{if(this.tolerateRepublish)try{let E=await on.get(on.getIdentUrl(n),{configuration:r,registry:A,ident:n,jsonResponse:!0});if(!Object.hasOwn(E,"versions"))throw new zt(15,'Registry returned invalid data for - missing "versions" field');if(Object.hasOwn(E.versions,u)){h.reportWarning(0,`Registry already knows about version ${u}; skipping.`);return}}catch(E){if(E.originalError?.response?.statusCode!==404)throw E}await un.maybeExecuteWorkspaceLifecycleScript(a,"prepublish",{report:h}),await CA.prepareForPack(a,{report:h},async()=>{let E=await CA.genPackList(a);for(let T of E)h.reportInfo(null,T);let I=await CA.genPackStream(a,E),v=await je.bufferStream(I),b=await sw.getGitHead(a.cwd),C=await sw.makePublishBody(a,v,{access:this.access,tag:this.tag,registry:A,gitHead:b});await on.put(on.getIdentUrl(n),C,{configuration:r,registry:A,ident:n,otp:this.otp,jsonResponse:!0})}),h.reportInfo(0,"Package archive published")})).exitCode()}};G0.paths=[["npm","publish"]],G0.usage=nt.Usage({category:"Npm-related commands",description:"publish the active workspace to the npm registry",details:'\n This command will pack the active workspace into a fresh archive and upload it to the npm registry.\n\n The package will by default be attached to the `latest` tag on the registry, but this behavior can be overriden by using the `--tag` option.\n\n Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka "private packages"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\n ',examples:[["Publish the active workspace","yarn npm publish"]]});Ye();qt();var SBe=$e(zn());Ye();Pt();qt();var Y0=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=ge.String({required:!1})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n;if(typeof this.package<"u")n=W.parseIdent(this.package);else{if(!a)throw new rr(o.cwd,this.context.cwd);if(!a.manifest.name)throw new it(`Missing 'name' field in ${ue.fromPortablePath(K.join(a.cwd,dr.manifest))}`);n=a.manifest.name}let u=await Rv(n,r),p={children:je.sortMap(Object.entries(u),([h])=>h).map(([h,E])=>({value:de.tuple(de.Type.RESOLUTION,{descriptor:W.makeDescriptor(n,h),locator:W.makeLocator(n,E)})}))};return $s.emitTree(p,{configuration:r,json:this.json,stdout:this.context.stdout})}};Y0.paths=[["npm","tag","list"]],Y0.usage=nt.Usage({category:"Npm-related commands",description:"list all dist-tags of a package",details:` + This command will list all tags of a package from the npm registry. + + If the package is not specified, Yarn will default to the current workspace. + `,examples:[["List all tags of package `my-pkg`","yarn npm tag list my-pkg"]]});async function Rv(t,e){let r=`/-/package${on.getIdentUrl(t)}/dist-tags`;return on.get(r,{configuration:e,ident:t,jsonResponse:!0,customErrorMessage:on.customPackageError})}var W0=class extends ut{constructor(){super(...arguments);this.package=ge.String();this.tag=ge.String()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new rr(o.cwd,this.context.cwd);let n=W.parseDescriptor(this.package,!0),u=n.range;if(!SBe.default.valid(u))throw new it(`The range ${de.pretty(r,n.range,de.Type.RANGE)} must be a valid semver version`);let A=Zn.getPublishRegistry(a.manifest,{configuration:r}),p=de.pretty(r,n,de.Type.IDENT),h=de.pretty(r,u,de.Type.RANGE),E=de.pretty(r,this.tag,de.Type.CODE);return(await Nt.start({configuration:r,stdout:this.context.stdout},async v=>{let b=await Rv(n,r);Object.hasOwn(b,this.tag)&&b[this.tag]===u&&v.reportWarning(0,`Tag ${E} is already set to version ${h}`);let C=`/-/package${on.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await on.put(C,u,{configuration:r,registry:A,ident:n,jsonRequest:!0,jsonResponse:!0}),v.reportInfo(0,`Tag ${E} added to version ${h} of package ${p}`)})).exitCode()}};W0.paths=[["npm","tag","add"]],W0.usage=nt.Usage({category:"Npm-related commands",description:"add a tag for a specific version of a package",details:` + This command will add a tag to the npm registry for a specific version of a package. If the tag already exists, it will be overwritten. + `,examples:[["Add a `beta` tag for version `2.3.4-beta.4` of package `my-pkg`","yarn npm tag add my-pkg@2.3.4-beta.4 beta"]]});Ye();qt();var V0=class extends ut{constructor(){super(...arguments);this.package=ge.String();this.tag=ge.String()}async execute(){if(this.tag==="latest")throw new it("The 'latest' tag cannot be removed.");let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new rr(o.cwd,this.context.cwd);let n=W.parseIdent(this.package),u=Zn.getPublishRegistry(a.manifest,{configuration:r}),A=de.pretty(r,this.tag,de.Type.CODE),p=de.pretty(r,n,de.Type.IDENT),h=await Rv(n,r);if(!Object.hasOwn(h,this.tag))throw new it(`${A} is not a tag of package ${p}`);return(await Nt.start({configuration:r,stdout:this.context.stdout},async I=>{let v=`/-/package${on.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await on.del(v,{configuration:r,registry:u,ident:n,jsonResponse:!0}),I.reportInfo(0,`Tag ${A} removed from package ${p}`)})).exitCode()}};V0.paths=[["npm","tag","remove"]],V0.usage=nt.Usage({category:"Npm-related commands",description:"remove a tag from a package",details:` + This command will remove a tag from a package from the npm registry. + `,examples:[["Remove the `beta` tag from package `my-pkg`","yarn npm tag remove my-pkg beta"]]});Ye();Ye();qt();var K0=class extends ut{constructor(){super(...arguments);this.scope=ge.String("-s,--scope",{description:"Print username for the registry configured for a given scope"});this.publish=ge.Boolean("--publish",!1,{description:"Print username for the publish registry"})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),o;return this.scope&&this.publish?o=Zn.getScopeRegistry(this.scope,{configuration:r,type:Zn.RegistryType.PUBLISH_REGISTRY}):this.scope?o=Zn.getScopeRegistry(this.scope,{configuration:r}):this.publish?o=Zn.getPublishRegistry((await AC(r,this.context.cwd)).manifest,{configuration:r}):o=Zn.getDefaultRegistry({configuration:r}),(await Nt.start({configuration:r,stdout:this.context.stdout},async n=>{let u;try{u=await on.get("/-/whoami",{configuration:r,registry:o,authType:on.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?W.makeIdent(this.scope,""):void 0})}catch(A){if(A.response?.statusCode===401||A.response?.statusCode===403){n.reportError(41,"Authentication failed - your credentials may have expired");return}else throw A}n.reportInfo(0,u.username)})).exitCode()}};K0.paths=[["npm","whoami"]],K0.usage=nt.Usage({category:"Npm-related commands",description:"display the name of the authenticated user",details:"\n Print the username associated with the current authentication settings to the standard output.\n\n When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\n\n When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\n ",examples:[["Print username for the default registry","yarn npm whoami"],["Print username for the registry on a given scope","yarn npm whoami --scope company"]]});var qvt={configuration:{npmPublishAccess:{description:"Default access of the published packages",type:"STRING",default:null},npmAuditExcludePackages:{description:"Array of glob patterns of packages to exclude from npm audit",type:"STRING",default:[],isArray:!0},npmAuditIgnoreAdvisories:{description:"Array of glob patterns of advisory IDs to exclude from npm audit",type:"STRING",default:[],isArray:!0}},commands:[_0,H0,j0,q0,G0,W0,Y0,V0,K0]},Gvt=qvt;var NG={};Kt(NG,{PatchCommand:()=>X0,PatchCommitCommand:()=>z0,PatchFetcher:()=>Uv,PatchResolver:()=>_v,default:()=>lDt,patchUtils:()=>Dm});Ye();Ye();Pt();nA();var Dm={};Kt(Dm,{applyPatchFile:()=>nF,diffFolders:()=>TG,ensureUnpatchedDescriptor:()=>bG,ensureUnpatchedLocator:()=>sF,extractPackageToDisk:()=>FG,extractPatchFlags:()=>RBe,isParentRequired:()=>QG,isPatchDescriptor:()=>iF,isPatchLocator:()=>J0,loadPatchFiles:()=>Ov,makeDescriptor:()=>oF,makeLocator:()=>kG,makePatchHash:()=>RG,parseDescriptor:()=>Lv,parseLocator:()=>Mv,parsePatchFile:()=>Nv,unpatchDescriptor:()=>sDt,unpatchLocator:()=>oDt});Ye();Pt();Ye();Pt();var Yvt=/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/;function lw(t){return K.relative(Bt.root,K.resolve(Bt.root,ue.toPortablePath(t)))}function Wvt(t){let e=t.trim().match(Yvt);if(!e)throw new Error(`Bad header line: '${t}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var Vvt=420,Kvt=493;var xBe=()=>({semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}),Jvt=t=>({header:Wvt(t),parts:[]}),zvt={["@"]:"header",["-"]:"deletion",["+"]:"insertion",[" "]:"context",["\\"]:"pragma",undefined:"context"};function Xvt(t){let e=[],r=xBe(),o="parsing header",a=null,n=null;function u(){a&&(n&&(a.parts.push(n),n=null),r.hunks.push(a),a=null)}function A(){u(),e.push(r),r=xBe()}for(let p=0;p0?"patch":"mode change",J=null;switch(U){case"rename":{if(!E||!I)throw new Error("Bad parser state: rename from & to not given");e.push({type:"rename",semverExclusivity:o,fromPath:lw(E),toPath:lw(I)}),J=I}break;case"file deletion":{let te=a||C;if(!te)throw new Error("Bad parse state: no path given for file deletion");e.push({type:"file deletion",semverExclusivity:o,hunk:L&&L[0]||null,path:lw(te),mode:rF(p),hash:v})}break;case"file creation":{let te=n||T;if(!te)throw new Error("Bad parse state: no path given for file creation");e.push({type:"file creation",semverExclusivity:o,hunk:L&&L[0]||null,path:lw(te),mode:rF(h),hash:b})}break;case"patch":case"mode change":J=T||n;break;default:je.assertNever(U);break}J&&u&&A&&u!==A&&e.push({type:"mode change",semverExclusivity:o,path:lw(J),oldMode:rF(u),newMode:rF(A)}),J&&L&&L.length&&e.push({type:"patch",semverExclusivity:o,path:lw(J),hunks:L,beforeHash:v,afterHash:b})}if(e.length===0)throw new Error("Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string");return e}function rF(t){let e=parseInt(t,8)&511;if(e!==Vvt&&e!==Kvt)throw new Error(`Unexpected file mode string: ${t}`);return e}function Nv(t){let e=t.split(/\n/g);return e[e.length-1]===""&&e.pop(),Zvt(Xvt(e))}function $vt(t){let e=0,r=0;for(let{type:o,lines:a}of t.parts)switch(o){case"context":r+=a.length,e+=a.length;break;case"deletion":e+=a.length;break;case"insertion":r+=a.length;break;default:je.assertNever(o);break}if(e!==t.header.original.length||r!==t.header.patched.length){let o=a=>a<0?a:`+${a}`;throw new Error(`hunk header integrity check failed (expected @@ ${o(t.header.original.length)} ${o(t.header.patched.length)} @@, got @@ ${o(e)} ${o(r)} @@)`)}}Ye();Pt();var cw=class extends Error{constructor(r,o){super(`Cannot apply hunk #${r+1}`);this.hunk=o}};async function uw(t,e,r){let o=await t.lstatPromise(e),a=await r();typeof a<"u"&&(e=a),await t.lutimesPromise(e,o.atime,o.mtime)}async function nF(t,{baseFs:e=new Rn,dryRun:r=!1,version:o=null}={}){for(let a of t)if(!(a.semverExclusivity!==null&&o!==null&&!kr.satisfiesWithPrereleases(o,a.semverExclusivity)))switch(a.type){case"file deletion":if(r){if(!e.existsSync(a.path))throw new Error(`Trying to delete a file that doesn't exist: ${a.path}`)}else await uw(e,K.dirname(a.path),async()=>{await e.unlinkPromise(a.path)});break;case"rename":if(r){if(!e.existsSync(a.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${a.fromPath}`)}else await uw(e,K.dirname(a.fromPath),async()=>{await uw(e,K.dirname(a.toPath),async()=>{await uw(e,a.fromPath,async()=>(await e.movePromise(a.fromPath,a.toPath),a.toPath))})});break;case"file creation":if(r){if(e.existsSync(a.path))throw new Error(`Trying to create a file that already exists: ${a.path}`)}else{let n=a.hunk?a.hunk.parts[0].lines.join(` +`)+(a.hunk.parts[0].noNewlineAtEndOfFile?"":` +`):"";await e.mkdirpPromise(K.dirname(a.path),{chmod:493,utimes:[vi.SAFE_TIME,vi.SAFE_TIME]}),await e.writeFilePromise(a.path,n,{mode:a.mode}),await e.utimesPromise(a.path,vi.SAFE_TIME,vi.SAFE_TIME)}break;case"patch":await uw(e,a.path,async()=>{await rDt(a,{baseFs:e,dryRun:r})});break;case"mode change":{let u=(await e.statPromise(a.path)).mode;if(bBe(a.newMode)!==bBe(u))continue;await uw(e,a.path,async()=>{await e.chmodPromise(a.path,a.newMode)})}break;default:je.assertNever(a);break}}function bBe(t){return(t&64)>0}function kBe(t){return t.replace(/\s+$/,"")}function tDt(t,e){return kBe(t)===kBe(e)}async function rDt({hunks:t,path:e},{baseFs:r,dryRun:o=!1}){let a=await r.statSync(e).mode,u=(await r.readFileSync(e,"utf8")).split(/\n/),A=[],p=0,h=0;for(let I of t){let v=Math.max(h,I.header.patched.start+p),b=Math.max(0,v-h),C=Math.max(0,u.length-v-I.header.original.length),T=Math.max(b,C),L=0,U=0,J=null;for(;L<=T;){if(L<=b&&(U=v-L,J=QBe(I,u,U),J!==null)){L=-L;break}if(L<=C&&(U=v+L,J=QBe(I,u,U),J!==null))break;L+=1}if(J===null)throw new cw(t.indexOf(I),I);A.push(J),p+=L,h=U+I.header.original.length}if(o)return;let E=0;for(let I of A)for(let v of I)switch(v.type){case"splice":{let b=v.index+E;u.splice(b,v.numToDelete,...v.linesToInsert),E+=v.linesToInsert.length-v.numToDelete}break;case"pop":u.pop();break;case"push":u.push(v.line);break;default:je.assertNever(v);break}await r.writeFilePromise(e,u.join(` +`),{mode:a})}function QBe(t,e,r){let o=[];for(let a of t.parts)switch(a.type){case"context":case"deletion":{for(let n of a.lines){let u=e[r];if(u==null||!tDt(u,n))return null;r+=1}a.type==="deletion"&&(o.push({type:"splice",index:r-a.lines.length,numToDelete:a.lines.length,linesToInsert:[]}),a.noNewlineAtEndOfFile&&o.push({type:"push",line:""}))}break;case"insertion":o.push({type:"splice",index:r,numToDelete:0,linesToInsert:a.lines}),a.noNewlineAtEndOfFile&&o.push({type:"pop"});break;default:je.assertNever(a.type);break}return o}var iDt=/^builtin<([^>]+)>$/;function Aw(t,e){let{protocol:r,source:o,selector:a,params:n}=W.parseRange(t);if(r!=="patch:")throw new Error("Invalid patch range");if(o===null)throw new Error("Patch locators must explicitly define their source");let u=a?a.split(/&/).map(E=>ue.toPortablePath(E)):[],A=n&&typeof n.locator=="string"?W.parseLocator(n.locator):null,p=n&&typeof n.version=="string"?n.version:null,h=e(o);return{parentLocator:A,sourceItem:h,patchPaths:u,sourceVersion:p}}function iF(t){return t.range.startsWith("patch:")}function J0(t){return t.reference.startsWith("patch:")}function Lv(t){let{sourceItem:e,...r}=Aw(t.range,W.parseDescriptor);return{...r,sourceDescriptor:e}}function Mv(t){let{sourceItem:e,...r}=Aw(t.reference,W.parseLocator);return{...r,sourceLocator:e}}function sDt(t){let{sourceItem:e}=Aw(t.range,W.parseDescriptor);return e}function oDt(t){let{sourceItem:e}=Aw(t.reference,W.parseLocator);return e}function bG(t){if(!iF(t))return t;let{sourceItem:e}=Aw(t.range,W.parseDescriptor);return e}function sF(t){if(!J0(t))return t;let{sourceItem:e}=Aw(t.reference,W.parseLocator);return e}function FBe({parentLocator:t,sourceItem:e,patchPaths:r,sourceVersion:o,patchHash:a},n){let u=t!==null?{locator:W.stringifyLocator(t)}:{},A=typeof o<"u"?{version:o}:{},p=typeof a<"u"?{hash:a}:{};return W.makeRange({protocol:"patch:",source:n(e),selector:r.join("&"),params:{...A,...p,...u}})}function oF(t,{parentLocator:e,sourceDescriptor:r,patchPaths:o}){return W.makeDescriptor(t,FBe({parentLocator:e,sourceItem:r,patchPaths:o},W.stringifyDescriptor))}function kG(t,{parentLocator:e,sourcePackage:r,patchPaths:o,patchHash:a}){return W.makeLocator(t,FBe({parentLocator:e,sourceItem:r,sourceVersion:r.version,patchPaths:o,patchHash:a},W.stringifyLocator))}function TBe({onAbsolute:t,onRelative:e,onProject:r,onBuiltin:o},a){let n=a.lastIndexOf("!");n!==-1&&(a=a.slice(n+1));let u=a.match(iDt);return u!==null?o(u[1]):a.startsWith("~/")?r(a.slice(2)):K.isAbsolute(a)?t(a):e(a)}function RBe(t){let e=t.lastIndexOf("!");return{optional:(e!==-1?new Set(t.slice(0,e).split(/!/)):new Set).has("optional")}}function QG(t){return TBe({onAbsolute:()=>!1,onRelative:()=>!0,onProject:()=>!1,onBuiltin:()=>!1},t)}async function Ov(t,e,r){let o=t!==null?await r.fetcher.fetch(t,r):null,a=o&&o.localPath?{packageFs:new gn(Bt.root),prefixPath:K.relative(Bt.root,o.localPath)}:o;o&&o!==a&&o.releaseFs&&o.releaseFs();let n=await je.releaseAfterUseAsync(async()=>await Promise.all(e.map(async u=>{let A=RBe(u),p=await TBe({onAbsolute:async h=>await oe.readFilePromise(h,"utf8"),onRelative:async h=>{if(a===null)throw new Error("Assertion failed: The parent locator should have been fetched");return await a.packageFs.readFilePromise(K.join(a.prefixPath,h),"utf8")},onProject:async h=>await oe.readFilePromise(K.join(r.project.cwd,h),"utf8"),onBuiltin:async h=>await r.project.configuration.firstHook(E=>E.getBuiltinPatch,r.project,h)},u);return{...A,source:p}})));for(let u of n)typeof u.source=="string"&&(u.source=u.source.replace(/\r\n?/g,` +`));return n}async function FG(t,{cache:e,project:r}){let o=r.storedPackages.get(t.locatorHash);if(typeof o>"u")throw new Error("Assertion failed: Expected the package to be registered");let a=sF(t),n=r.storedChecksums,u=new Qi,A=await oe.mktempPromise(),p=K.join(A,"source"),h=K.join(A,"user"),E=K.join(A,".yarn-patch.json"),I=r.configuration.makeFetcher(),v=[];try{let b,C;if(t.locatorHash===a.locatorHash){let T=await I.fetch(t,{cache:e,project:r,fetcher:I,checksums:n,report:u});v.push(()=>T.releaseFs?.()),b=T,C=T}else b=await I.fetch(t,{cache:e,project:r,fetcher:I,checksums:n,report:u}),v.push(()=>b.releaseFs?.()),C=await I.fetch(t,{cache:e,project:r,fetcher:I,checksums:n,report:u}),v.push(()=>C.releaseFs?.());await Promise.all([oe.copyPromise(p,b.prefixPath,{baseFs:b.packageFs}),oe.copyPromise(h,C.prefixPath,{baseFs:C.packageFs}),oe.writeJsonPromise(E,{locator:W.stringifyLocator(t),version:o.version})])}finally{for(let b of v)b()}return oe.detachTemp(A),h}async function TG(t,e){let r=ue.fromPortablePath(t).replace(/\\/g,"/"),o=ue.fromPortablePath(e).replace(/\\/g,"/"),{stdout:a,stderr:n}=await Ur.execvp("git",["-c","core.safecrlf=false","diff","--src-prefix=a/","--dst-prefix=b/","--ignore-cr-at-eol","--full-index","--no-index","--no-renames","--text",r,o],{cwd:ue.toPortablePath(process.cwd()),env:{...process.env,GIT_CONFIG_NOSYSTEM:"1",HOME:"",XDG_CONFIG_HOME:"",USERPROFILE:""}});if(n.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH. +The following error was reported by 'git': +${n}`);let u=r.startsWith("/")?A=>A.slice(1):A=>A;return a.replace(new RegExp(`(a|b)(${je.escapeRegExp(`/${u(r)}/`)})`,"g"),"$1/").replace(new RegExp(`(a|b)${je.escapeRegExp(`/${u(o)}/`)}`,"g"),"$1/").replace(new RegExp(je.escapeRegExp(`${r}/`),"g"),"").replace(new RegExp(je.escapeRegExp(`${o}/`),"g"),"")}function RG(t,e){let r=[];for(let{source:o}of t){if(o===null)continue;let a=Nv(o);for(let n of a){let{semverExclusivity:u,...A}=n;u!==null&&e!==null&&!kr.satisfiesWithPrereleases(e,u)||r.push(JSON.stringify(A))}}return wn.makeHash(`${3}`,...r).slice(0,6)}Ye();function NBe(t,{configuration:e,report:r}){for(let o of t.parts)for(let a of o.lines)switch(o.type){case"context":r.reportInfo(null,` ${de.pretty(e,a,"grey")}`);break;case"deletion":r.reportError(28,`- ${de.pretty(e,a,de.Type.REMOVED)}`);break;case"insertion":r.reportError(28,`+ ${de.pretty(e,a,de.Type.ADDED)}`);break;default:je.assertNever(o.type)}}var Uv=class{supports(e,r){return!!J0(e)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${W.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:W.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:u}}async patchPackage(e,r){let{parentLocator:o,sourceLocator:a,sourceVersion:n,patchPaths:u}=Mv(e),A=await Ov(o,u,r),p=await oe.mktempPromise(),h=K.join(p,"current.zip"),E=await r.fetcher.fetch(a,r),I=W.getIdentVendorPath(e),v=new zi(h,{create:!0,level:r.project.configuration.get("compressionLevel")});await je.releaseAfterUseAsync(async()=>{await v.copyPromise(I,E.prefixPath,{baseFs:E.packageFs,stableSort:!0})},E.releaseFs),v.saveAndClose();for(let{source:b,optional:C}of A){if(b===null)continue;let T=new zi(h,{level:r.project.configuration.get("compressionLevel")}),L=new gn(K.resolve(Bt.root,I),{baseFs:T});try{await nF(Nv(b),{baseFs:L,version:n})}catch(U){if(!(U instanceof cw))throw U;let J=r.project.configuration.get("enableInlineHunks"),te=!J&&!C?" (set enableInlineHunks for details)":"",le=`${W.prettyLocator(r.project.configuration,e)}: ${U.message}${te}`,pe=Ae=>{!J||NBe(U.hunk,{configuration:r.project.configuration,report:Ae})};if(T.discardAndClose(),C){r.report.reportWarningOnce(66,le,{reportExtra:pe});continue}else throw new zt(66,le,pe)}T.saveAndClose()}return new zi(h,{level:r.project.configuration.get("compressionLevel")})}};Ye();var _v=class{supportsDescriptor(e,r){return!!iF(e)}supportsLocator(e,r){return!!J0(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){let{patchPaths:a}=Lv(e);return a.every(n=>!QG(n))?e:W.bindDescriptor(e,{locator:W.stringifyLocator(r)})}getResolutionDependencies(e,r){let{sourceDescriptor:o}=Lv(e);return{sourceDescriptor:r.project.configuration.normalizeDependency(o)}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{parentLocator:a,patchPaths:n}=Lv(e),u=await Ov(a,n,o.fetchOptions),A=r.sourceDescriptor;if(typeof A>"u")throw new Error("Assertion failed: The dependency should have been resolved");let p=RG(u,A.version);return[kG(e,{parentLocator:a,sourcePackage:A,patchPaths:n,patchHash:p})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let{sourceLocator:o}=Mv(e);return{...await r.resolver.resolve(o,r),...e}}};Ye();Pt();qt();var z0=class extends ut{constructor(){super(...arguments);this.save=ge.Boolean("-s,--save",!1,{description:"Add the patch to your resolution entries"});this.patchFolder=ge.String()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new rr(o.cwd,this.context.cwd);await o.restoreInstallState();let n=K.resolve(this.context.cwd,ue.toPortablePath(this.patchFolder)),u=K.join(n,"../source"),A=K.join(n,"../.yarn-patch.json");if(!oe.existsSync(u))throw new it("The argument folder didn't get created by 'yarn patch'");let p=await TG(u,n),h=await oe.readJsonPromise(A),E=W.parseLocator(h.locator,!0);if(!o.storedPackages.has(E.locatorHash))throw new it("No package found in the project for the given locator");if(!this.save){this.context.stdout.write(p);return}let I=r.get("patchFolder"),v=K.join(I,`${W.slugifyLocator(E)}.patch`);await oe.mkdirPromise(I,{recursive:!0}),await oe.writeFilePromise(v,p);let b=[],C=new Map;for(let T of o.storedPackages.values()){if(W.isVirtualLocator(T))continue;let L=T.dependencies.get(E.identHash);if(!L)continue;let U=W.ensureDevirtualizedDescriptor(L),J=bG(U),te=o.storedResolutions.get(J.descriptorHash);if(!te)throw new Error("Assertion failed: Expected the resolution to have been registered");if(!o.storedPackages.get(te))throw new Error("Assertion failed: Expected the package to have been registered");let pe=o.tryWorkspaceByLocator(T);if(pe)b.push(pe);else{let Ae=o.originalPackages.get(T.locatorHash);if(!Ae)throw new Error("Assertion failed: Expected the original package to have been registered");let ye=Ae.dependencies.get(L.identHash);if(!ye)throw new Error("Assertion failed: Expected the original dependency to have been registered");C.set(ye.descriptorHash,ye)}}for(let T of b)for(let L of Mt.hardDependencies){let U=T.manifest[L].get(E.identHash);if(!U)continue;let J=oF(U,{parentLocator:null,sourceDescriptor:W.convertLocatorToDescriptor(E),patchPaths:[K.join(dr.home,K.relative(o.cwd,v))]});T.manifest[L].set(U.identHash,J)}for(let T of C.values()){let L=oF(T,{parentLocator:null,sourceDescriptor:W.convertLocatorToDescriptor(E),patchPaths:[K.join(dr.home,K.relative(o.cwd,v))]});o.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:W.stringifyIdent(L),description:T.range}},reference:L.range})}await o.persist()}};z0.paths=[["patch-commit"]],z0.usage=nt.Usage({description:"generate a patch out of a directory",details:"\n By default, this will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\n\n With the `-s,--save` option set, the patchfile won't be printed on stdout anymore and will instead be stored within a local file (by default kept within `.yarn/patches`, but configurable via the `patchFolder` setting). A `resolutions` entry will also be added to your top-level manifest, referencing the patched package via the `patch:` protocol.\n\n Note that only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\n "});Ye();Pt();qt();var X0=class extends ut{constructor(){super(...arguments);this.update=ge.Boolean("-u,--update",!1,{description:"Reapply local patches that already apply to this packages"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=ge.String()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Lr.find(r);if(!a)throw new rr(o.cwd,this.context.cwd);await o.restoreInstallState();let u=W.parseLocator(this.package);if(u.reference==="unknown"){let A=je.mapAndFilter([...o.storedPackages.values()],p=>p.identHash!==u.identHash?je.mapAndFilter.skip:W.isVirtualLocator(p)?je.mapAndFilter.skip:J0(p)!==this.update?je.mapAndFilter.skip:p);if(A.length===0)throw new it("No package found in the project for the given locator");if(A.length>1)throw new it(`Multiple candidate packages found; explicitly choose one of them (use \`yarn why \` to get more information as to who depends on them): +${A.map(p=>` +- ${W.prettyLocator(r,p)}`).join("")}`);u=A[0]}if(!o.storedPackages.has(u.locatorHash))throw new it("No package found in the project for the given locator");await Nt.start({configuration:r,json:this.json,stdout:this.context.stdout},async A=>{let p=sF(u),h=await FG(u,{cache:n,project:o});A.reportJson({locator:W.stringifyLocator(p),path:ue.fromPortablePath(h)});let E=this.update?" along with its current modifications":"";A.reportInfo(0,`Package ${W.prettyLocator(r,p)} got extracted with success${E}!`),A.reportInfo(0,`You can now edit the following folder: ${de.pretty(r,ue.fromPortablePath(h),"magenta")}`),A.reportInfo(0,`Once you are done run ${de.pretty(r,`yarn patch-commit -s ${process.platform==="win32"?'"':""}${ue.fromPortablePath(h)}${process.platform==="win32"?'"':""}`,"cyan")} and Yarn will store a patchfile based on your changes.`)})}};X0.paths=[["patch"]],X0.usage=nt.Usage({description:"prepare a package for patching",details:"\n This command will cause a package to be extracted in a temporary directory intended to be editable at will.\n\n Once you're done with your changes, run `yarn patch-commit -s path` (with `path` being the temporary directory you received) to generate a patchfile and register it into your top-level manifest via the `patch:` protocol. Run `yarn patch-commit -h` for more details.\n\n Calling the command when you already have a patch won't import it by default (in other words, the default behavior is to reset existing patches). However, adding the `-u,--update` flag will import any current patch.\n "});var aDt={configuration:{enableInlineHunks:{description:"If true, the installs will print unmatched patch hunks",type:"BOOLEAN",default:!1},patchFolder:{description:"Folder where the patch files must be written",type:"ABSOLUTE_PATH",default:"./.yarn/patches"}},commands:[z0,X0],fetchers:[Uv],resolvers:[_v]},lDt=aDt;var OG={};Kt(OG,{PnpmLinker:()=>Hv,default:()=>pDt});Ye();Pt();qt();var Hv=class{getCustomDataKey(){return JSON.stringify({name:"PnpmLinker",version:3})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the pnpm linker to be enabled");let o=this.getCustomDataKey(),a=r.project.linkersCustomData.get(o);if(!a)throw new it(`The project in ${de.pretty(r.project.configuration,`${r.project.cwd}/package.json`,de.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=a.pathsByLocator.get(e.locatorHash);if(typeof n>"u")throw new it(`Couldn't find ${W.prettyLocator(r.project.configuration,e)} in the currently installed pnpm map - running an install might help`);return n.packageLocation}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let o=this.getCustomDataKey(),a=r.project.linkersCustomData.get(o);if(!a)throw new it(`The project in ${de.pretty(r.project.configuration,`${r.project.cwd}/package.json`,de.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=e.match(/(^.*\/node_modules\/(@[^/]*\/)?[^/]+)(\/.*$)/);if(n){let p=a.locatorByPath.get(n[1]);if(p)return p}let u=e,A=e;do{A=u,u=K.dirname(A);let p=a.locatorByPath.get(A);if(p)return p}while(u!==A);return null}makeInstaller(e){return new LG(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="pnpm"}},LG=class{constructor(e){this.opts=e;this.asyncActions=new je.AsyncActions(10);this.customData={pathsByLocator:new Map,locatorByPath:new Map};this.indexFolderPromise=PD(oe,{indexPath:K.join(e.project.configuration.get("globalFolder"),"index")})}attachCustomData(e){}async installPackage(e,r,o){switch(e.linkType){case"SOFT":return this.installPackageSoft(e,r,o);case"HARD":return this.installPackageHard(e,r,o)}throw new Error("Assertion failed: Unsupported package link type")}async installPackageSoft(e,r,o){let a=K.resolve(r.packageFs.getRealPath(),r.prefixPath),n=this.opts.project.tryWorkspaceByLocator(e)?K.join(a,dr.nodeModules):null;return this.customData.pathsByLocator.set(e.locatorHash,{packageLocation:a,dependenciesLocation:n}),{packageLocation:a,buildRequest:null}}async installPackageHard(e,r,o){let a=cDt(e,{project:this.opts.project}),n=a.packageLocation;this.customData.locatorByPath.set(n,W.stringifyLocator(e)),this.customData.pathsByLocator.set(e.locatorHash,a),o.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await oe.mkdirPromise(n,{recursive:!0}),await oe.copyPromise(n,r.prefixPath,{baseFs:r.packageFs,overwrite:!1,linkStrategy:{type:"HardlinkFromIndex",indexPath:await this.indexFolderPromise,autoRepair:!0}})}));let A=W.isVirtualLocator(e)?W.devirtualizeLocator(e):e,p={manifest:await Mt.tryFind(r.prefixPath,{baseFs:r.packageFs})??new Mt,misc:{hasBindingGyp:mA.hasBindingGyp(r)}},h=this.opts.project.getDependencyMeta(A,e.version),E=mA.extractBuildRequest(e,p,h,{configuration:this.opts.project.configuration});return{packageLocation:n,buildRequest:E}}async attachInternalDependencies(e,r){if(this.opts.project.configuration.get("nodeLinker")!=="pnpm"||!LBe(e,{project:this.opts.project}))return;let o=this.customData.pathsByLocator.get(e.locatorHash);if(typeof o>"u")throw new Error(`Assertion failed: Expected the package to have been registered (${W.stringifyLocator(e)})`);let{dependenciesLocation:a}=o;!a||this.asyncActions.reduce(e.locatorHash,async n=>{await oe.mkdirPromise(a,{recursive:!0});let u=await uDt(a),A=new Map(u),p=[n],h=(I,v)=>{let b=v;LBe(v,{project:this.opts.project})||(this.opts.report.reportWarningOnce(0,"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies"),b=W.devirtualizeLocator(v));let C=this.customData.pathsByLocator.get(b.locatorHash);if(typeof C>"u")throw new Error(`Assertion failed: Expected the package to have been registered (${W.stringifyLocator(v)})`);let T=W.stringifyIdent(I),L=K.join(a,T),U=K.relative(K.dirname(L),C.packageLocation),J=A.get(T);A.delete(T),p.push(Promise.resolve().then(async()=>{if(J){if(J.isSymbolicLink()&&await oe.readlinkPromise(L)===U)return;await oe.removePromise(L)}await oe.mkdirpPromise(K.dirname(L)),process.platform=="win32"&&this.opts.project.configuration.get("winLinkType")==="junctions"?await oe.symlinkPromise(C.packageLocation,L,"junction"):await oe.symlinkPromise(U,L)}))},E=!1;for(let[I,v]of r)I.identHash===e.identHash&&(E=!0),h(I,v);!E&&!this.opts.project.tryWorkspaceByLocator(e)&&h(W.convertLocatorToDescriptor(e),e),p.push(ADt(a,A)),await Promise.all(p)})}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the pnpm linker")}async finalizeInstall(){let e=OBe(this.opts.project);if(this.opts.project.configuration.get("nodeLinker")!=="pnpm")await oe.removePromise(e);else{let r;try{r=new Set(await oe.readdirPromise(e))}catch{r=new Set}for(let{dependenciesLocation:o}of this.customData.pathsByLocator.values()){if(!o)continue;let a=K.contains(e,o);if(a===null)continue;let[n]=a.split(K.sep);r.delete(n)}await Promise.all([...r].map(async o=>{await oe.removePromise(K.join(e,o))}))}return await this.asyncActions.wait(),await MG(e),this.opts.project.configuration.get("nodeLinker")!=="node-modules"&&await MG(MBe(this.opts.project)),{customData:this.customData}}};function MBe(t){return K.join(t.cwd,dr.nodeModules)}function OBe(t){return K.join(MBe(t),".store")}function cDt(t,{project:e}){let r=W.slugifyLocator(t),o=OBe(e),a=K.join(o,r,"package"),n=K.join(o,r,dr.nodeModules);return{packageLocation:a,dependenciesLocation:n}}function LBe(t,{project:e}){return!W.isVirtualLocator(t)||!e.tryWorkspaceByLocator(t)}async function uDt(t){let e=new Map,r=[];try{r=await oe.readdirPromise(t,{withFileTypes:!0})}catch(o){if(o.code!=="ENOENT")throw o}try{for(let o of r)if(!o.name.startsWith("."))if(o.name.startsWith("@")){let a=await oe.readdirPromise(K.join(t,o.name),{withFileTypes:!0});if(a.length===0)e.set(o.name,o);else for(let n of a)e.set(`${o.name}/${n.name}`,n)}else e.set(o.name,o)}catch(o){if(o.code!=="ENOENT")throw o}return e}async function ADt(t,e){let r=[],o=new Set;for(let a of e.keys()){r.push(oe.removePromise(K.join(t,a)));let n=W.tryParseIdent(a)?.scope;n&&o.add(`@${n}`)}return Promise.all(r).then(()=>Promise.all([...o].map(a=>MG(K.join(t,a)))))}async function MG(t){try{await oe.rmdirPromise(t)}catch(e){if(e.code!=="ENOENT"&&e.code!=="ENOTEMPTY")throw e}}var fDt={linkers:[Hv]},pDt=fDt;var YG={};Kt(YG,{StageCommand:()=>Z0,default:()=>vDt,stageUtils:()=>lF});Ye();Pt();qt();Ye();Pt();var lF={};Kt(lF,{ActionType:()=>UG,checkConsensus:()=>aF,expandDirectory:()=>jG,findConsensus:()=>qG,findVcsRoot:()=>_G,genCommitMessage:()=>GG,getCommitPrefix:()=>UBe,isYarnFile:()=>HG});Pt();var UG=(n=>(n[n.CREATE=0]="CREATE",n[n.DELETE=1]="DELETE",n[n.ADD=2]="ADD",n[n.REMOVE=3]="REMOVE",n[n.MODIFY=4]="MODIFY",n))(UG||{});async function _G(t,{marker:e}){do if(!oe.existsSync(K.join(t,e)))t=K.dirname(t);else return t;while(t!=="/");return null}function HG(t,{roots:e,names:r}){if(r.has(K.basename(t)))return!0;do if(!e.has(t))t=K.dirname(t);else return!0;while(t!=="/");return!1}function jG(t){let e=[],r=[t];for(;r.length>0;){let o=r.pop(),a=oe.readdirSync(o);for(let n of a){let u=K.resolve(o,n);oe.lstatSync(u).isDirectory()?r.push(u):e.push(u)}}return e}function aF(t,e){let r=0,o=0;for(let a of t)a!=="wip"&&(e.test(a)?r+=1:o+=1);return r>=o}function qG(t){let e=aF(t,/^(\w\(\w+\):\s*)?\w+s/),r=aF(t,/^(\w\(\w+\):\s*)?[A-Z]/),o=aF(t,/^\w\(\w+\):/);return{useThirdPerson:e,useUpperCase:r,useComponent:o}}function UBe(t){return t.useComponent?"chore(yarn): ":""}var hDt=new Map([[0,"create"],[1,"delete"],[2,"add"],[3,"remove"],[4,"update"]]);function GG(t,e){let r=UBe(t),o=[],a=e.slice().sort((n,u)=>n[0]-u[0]);for(;a.length>0;){let[n,u]=a.shift(),A=hDt.get(n);t.useUpperCase&&o.length===0&&(A=`${A[0].toUpperCase()}${A.slice(1)}`),t.useThirdPerson&&(A+="s");let p=[u];for(;a.length>0&&a[0][0]===n;){let[,E]=a.shift();p.push(E)}p.sort();let h=p.shift();p.length===1?h+=" (and one other)":p.length>1&&(h+=` (and ${p.length} others)`),o.push(`${A} ${h}`)}return`${r}${o.join(", ")}`}var gDt="Commit generated via `yarn stage`",dDt=11;async function _Be(t){let{code:e,stdout:r}=await Ur.execvp("git",["log","-1","--pretty=format:%H"],{cwd:t});return e===0?r.trim():null}async function mDt(t,e){let r=[],o=e.filter(h=>K.basename(h.path)==="package.json");for(let{action:h,path:E}of o){let I=K.relative(t,E);if(h===4){let v=await _Be(t),{stdout:b}=await Ur.execvp("git",["show",`${v}:${I}`],{cwd:t,strict:!0}),C=await Mt.fromText(b),T=await Mt.fromFile(E),L=new Map([...T.dependencies,...T.devDependencies]),U=new Map([...C.dependencies,...C.devDependencies]);for(let[J,te]of U){let le=W.stringifyIdent(te),pe=L.get(J);pe?pe.range!==te.range&&r.push([4,`${le} to ${pe.range}`]):r.push([3,le])}for(let[J,te]of L)U.has(J)||r.push([2,W.stringifyIdent(te)])}else if(h===0){let v=await Mt.fromFile(E);v.name?r.push([0,W.stringifyIdent(v.name)]):r.push([0,"a package"])}else if(h===1){let v=await _Be(t),{stdout:b}=await Ur.execvp("git",["show",`${v}:${I}`],{cwd:t,strict:!0}),C=await Mt.fromText(b);C.name?r.push([1,W.stringifyIdent(C.name)]):r.push([1,"a package"])}else throw new Error("Assertion failed: Unsupported action type")}let{code:a,stdout:n}=await Ur.execvp("git",["log",`-${dDt}`,"--pretty=format:%s"],{cwd:t}),u=a===0?n.split(/\n/g).filter(h=>h!==""):[],A=qG(u);return GG(A,r)}var yDt={[0]:[" A ","?? "],[4]:[" M "],[1]:[" D "]},EDt={[0]:["A "],[4]:["M "],[1]:["D "]},HBe={async findRoot(t){return await _G(t,{marker:".git"})},async filterChanges(t,e,r,o){let{stdout:a}=await Ur.execvp("git",["status","-s"],{cwd:t,strict:!0}),n=a.toString().split(/\n/g),u=o?.staged?EDt:yDt;return[].concat(...n.map(p=>{if(p==="")return[];let h=p.slice(0,3),E=K.resolve(t,p.slice(3));if(!o?.staged&&h==="?? "&&p.endsWith("/"))return jG(E).map(I=>({action:0,path:I}));{let v=[0,4,1].find(b=>u[b].includes(h));return v!==void 0?[{action:v,path:E}]:[]}})).filter(p=>HG(p.path,{roots:e,names:r}))},async genCommitMessage(t,e){return await mDt(t,e)},async makeStage(t,e){let r=e.map(o=>ue.fromPortablePath(o.path));await Ur.execvp("git",["add","--",...r],{cwd:t,strict:!0})},async makeCommit(t,e,r){let o=e.map(a=>ue.fromPortablePath(a.path));await Ur.execvp("git",["add","-N","--",...o],{cwd:t,strict:!0}),await Ur.execvp("git",["commit","-m",`${r} + +${gDt} +`,"--",...o],{cwd:t,strict:!0})},async makeReset(t,e){let r=e.map(o=>ue.fromPortablePath(o.path));await Ur.execvp("git",["reset","HEAD","--",...r],{cwd:t,strict:!0})}};var CDt=[HBe],Z0=class extends ut{constructor(){super(...arguments);this.commit=ge.Boolean("-c,--commit",!1,{description:"Commit the staged files"});this.reset=ge.Boolean("-r,--reset",!1,{description:"Remove all files from the staging area"});this.dryRun=ge.Boolean("-n,--dry-run",!1,{description:"Print the commit message and the list of modified files without staging / committing"});this.update=ge.Boolean("-u,--update",!1,{hidden:!0})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd),{driver:a,root:n}=await wDt(o.cwd),u=[r.get("cacheFolder"),r.get("globalFolder"),r.get("virtualFolder"),r.get("yarnPath")];await r.triggerHook(I=>I.populateYarnPaths,o,I=>{u.push(I)});let A=new Set;for(let I of u)for(let v of IDt(n,I))A.add(v);let p=new Set([r.get("rcFilename"),dr.lockfile,dr.manifest]),h=await a.filterChanges(n,A,p),E=await a.genCommitMessage(n,h);if(this.dryRun)if(this.commit)this.context.stdout.write(`${E} +`);else for(let I of h)this.context.stdout.write(`${ue.fromPortablePath(I.path)} +`);else if(this.reset){let I=await a.filterChanges(n,A,p,{staged:!0});I.length===0?this.context.stdout.write("No staged changes found!"):await a.makeReset(n,I)}else h.length===0?this.context.stdout.write("No changes found!"):this.commit?await a.makeCommit(n,h,E):(await a.makeStage(n,h),this.context.stdout.write(E))}};Z0.paths=[["stage"]],Z0.usage=nt.Usage({description:"add all yarn files to your vcs",details:"\n This command will add to your staging area the files belonging to Yarn (typically any modified `package.json` and `.yarnrc.yml` files, but also linker-generated files, cache data, etc). It will take your ignore list into account, so the cache files won't be added if the cache is ignored in a `.gitignore` file (assuming you use Git).\n\n Running `--reset` will instead remove them from the staging area (the changes will still be there, but won't be committed until you stage them back).\n\n Since the staging area is a non-existent concept in Mercurial, Yarn will always create a new commit when running this command on Mercurial repositories. You can get this behavior when using Git by using the `--commit` flag which will directly create a commit.\n ",examples:[["Adds all modified project files to the staging area","yarn stage"],["Creates a new commit containing all modified project files","yarn stage --commit"]]});async function wDt(t){let e=null,r=null;for(let o of CDt)if((r=await o.findRoot(t))!==null){e=o;break}if(e===null||r===null)throw new it("No stage driver has been found for your current project");return{driver:e,root:r}}function IDt(t,e){let r=[];if(e===null)return r;for(;;){(e===t||e.startsWith(`${t}/`))&&r.push(e);let o;try{o=oe.statSync(e)}catch{break}if(o.isSymbolicLink())e=K.resolve(K.dirname(e),oe.readlinkSync(e));else break}return r}var BDt={commands:[Z0]},vDt=BDt;var WG={};Kt(WG,{default:()=>FDt});Ye();Ye();Pt();var GBe=$e(zn());Ye();var jBe=$e(ZH()),DDt="e8e1bd300d860104bb8c58453ffa1eb4",PDt="OFCNCOG2CU",qBe=async(t,e)=>{let r=W.stringifyIdent(t),a=SDt(e).initIndex("npm-search");try{return(await a.getObject(r,{attributesToRetrieve:["types"]})).types?.ts==="definitely-typed"}catch{return!1}},SDt=t=>(0,jBe.default)(PDt,DDt,{requester:{async send(r){try{let o=await rn.request(r.url,r.data||null,{configuration:t,headers:r.headers});return{content:o.body,isTimedOut:!1,status:o.statusCode}}catch(o){return{content:o.response.body,isTimedOut:!1,status:o.response.statusCode}}}}});var YBe=t=>t.scope?`${t.scope}__${t.name}`:`${t.name}`,xDt=async(t,e,r,o)=>{if(r.scope==="types")return;let{project:a}=t,{configuration:n}=a;if(!(n.get("tsEnableAutoTypes")??oe.existsSync(K.join(a.cwd,"tsconfig.json"))))return;let A=n.makeResolver(),p={project:a,resolver:A,report:new Qi};if(!await qBe(r,n))return;let E=YBe(r),I=W.parseRange(r.range).selector;if(!kr.validRange(I)){let L=n.normalizeDependency(r),U=await A.getCandidates(L,{},p);I=W.parseRange(U[0].reference).selector}let v=GBe.default.coerce(I);if(v===null)return;let b=`${zc.Modifier.CARET}${v.major}`,C=W.makeDescriptor(W.makeIdent("types",E),b),T=je.mapAndFind(a.workspaces,L=>{let U=L.manifest.dependencies.get(r.identHash)?.descriptorHash,J=L.manifest.devDependencies.get(r.identHash)?.descriptorHash;if(U!==r.descriptorHash&&J!==r.descriptorHash)return je.mapAndFind.skip;let te=[];for(let le of Mt.allDependencies){let pe=L.manifest[le].get(C.identHash);typeof pe>"u"||te.push([le,pe])}return te.length===0?je.mapAndFind.skip:te});if(typeof T<"u")for(let[L,U]of T)t.manifest[L].set(U.identHash,U);else{try{let L=n.normalizeDependency(C);if((await A.getCandidates(L,{},p)).length===0)return}catch{return}t.manifest[zc.Target.DEVELOPMENT].set(C.identHash,C)}},bDt=async(t,e,r)=>{if(r.scope==="types")return;let{project:o}=t,{configuration:a}=o;if(!(a.get("tsEnableAutoTypes")??oe.existsSync(K.join(o.cwd,"tsconfig.json"))))return;let u=YBe(r),A=W.makeIdent("types",u);for(let p of Mt.allDependencies)typeof t.manifest[p].get(A.identHash)>"u"||t.manifest[p].delete(A.identHash)},kDt=(t,e)=>{e.publishConfig&&e.publishConfig.typings&&(e.typings=e.publishConfig.typings),e.publishConfig&&e.publishConfig.types&&(e.types=e.publishConfig.types)},QDt={configuration:{tsEnableAutoTypes:{description:"Whether Yarn should auto-install @types/ dependencies on 'yarn add'",type:"BOOLEAN",isNullable:!0,default:null}},hooks:{afterWorkspaceDependencyAddition:xDt,afterWorkspaceDependencyRemoval:bDt,beforeWorkspacePacking:kDt}},FDt=QDt;var XG={};Kt(XG,{VersionApplyCommand:()=>$0,VersionCheckCommand:()=>eg,VersionCommand:()=>tg,default:()=>XDt,versionUtils:()=>gw});Ye();Ye();qt();var gw={};Kt(gw,{Decision:()=>pw,applyPrerelease:()=>XBe,applyReleases:()=>zG,applyStrategy:()=>uF,clearVersionFiles:()=>VG,getUndecidedDependentWorkspaces:()=>qv,getUndecidedWorkspaces:()=>cF,openVersionFile:()=>hw,requireMoreDecisions:()=>KDt,resolveVersionFiles:()=>jv,suggestStrategy:()=>JG,updateVersionFiles:()=>KG,validateReleaseDecision:()=>fw});Ye();Pt();Nl();qt();var zBe=$e(JBe()),BA=$e(zn()),VDt=/^(>=|[~^]|)(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/,pw=(u=>(u.UNDECIDED="undecided",u.DECLINE="decline",u.MAJOR="major",u.MINOR="minor",u.PATCH="patch",u.PRERELEASE="prerelease",u))(pw||{});function fw(t){let e=BA.default.valid(t);return e||je.validateEnum((0,zBe.default)(pw,"UNDECIDED"),t)}async function jv(t,{prerelease:e=null}={}){let r=new Map,o=t.configuration.get("deferredVersionFolder");if(!oe.existsSync(o))return r;let a=await oe.readdirPromise(o);for(let n of a){if(!n.endsWith(".yml"))continue;let u=K.join(o,n),A=await oe.readFilePromise(u,"utf8"),p=Vi(A);for(let[h,E]of Object.entries(p.releases||{})){if(E==="decline")continue;let I=W.parseIdent(h),v=t.tryWorkspaceByIdent(I);if(v===null)throw new Error(`Assertion failed: Expected a release definition file to only reference existing workspaces (${K.basename(u)} references ${h})`);if(v.manifest.version===null)throw new Error(`Assertion failed: Expected the workspace to have a version (${W.prettyLocator(t.configuration,v.anchoredLocator)})`);let b=v.manifest.raw.stableVersion??v.manifest.version,C=r.get(v),T=uF(b,fw(E));if(T===null)throw new Error(`Assertion failed: Expected ${b} to support being bumped via strategy ${E}`);let L=typeof C<"u"?BA.default.gt(T,C)?T:C:T;r.set(v,L)}}return e&&(r=new Map([...r].map(([n,u])=>[n,XBe(u,{current:n.manifest.version,prerelease:e})]))),r}async function VG(t){let e=t.configuration.get("deferredVersionFolder");!oe.existsSync(e)||await oe.removePromise(e)}async function KG(t,e){let r=new Set(e),o=t.configuration.get("deferredVersionFolder");if(!oe.existsSync(o))return;let a=await oe.readdirPromise(o);for(let n of a){if(!n.endsWith(".yml"))continue;let u=K.join(o,n),A=await oe.readFilePromise(u,"utf8"),p=Vi(A),h=p?.releases;if(!!h){for(let E of Object.keys(h)){let I=W.parseIdent(E),v=t.tryWorkspaceByIdent(I);(v===null||r.has(v))&&delete p.releases[E]}Object.keys(p.releases).length>0?await oe.changeFilePromise(u,Ba(new Ba.PreserveOrdering(p))):await oe.unlinkPromise(u)}}}async function hw(t,{allowEmpty:e=!1}={}){let r=t.configuration;if(r.projectCwd===null)throw new it("This command can only be run from within a Yarn project");let o=await ra.fetchRoot(r.projectCwd),a=o!==null?await ra.fetchBase(o,{baseRefs:r.get("changesetBaseRefs")}):null,n=o!==null?await ra.fetchChangedFiles(o,{base:a.hash,project:t}):[],u=r.get("deferredVersionFolder"),A=n.filter(b=>K.contains(u,b)!==null);if(A.length>1)throw new it(`Your current branch contains multiple versioning files; this isn't supported: +- ${A.map(b=>ue.fromPortablePath(b)).join(` +- `)}`);let p=new Set(je.mapAndFilter(n,b=>{let C=t.tryWorkspaceByFilePath(b);return C===null?je.mapAndFilter.skip:C}));if(A.length===0&&p.size===0&&!e)return null;let h=A.length===1?A[0]:K.join(u,`${wn.makeHash(Math.random().toString()).slice(0,8)}.yml`),E=oe.existsSync(h)?await oe.readFilePromise(h,"utf8"):"{}",I=Vi(E),v=new Map;for(let b of I.declined||[]){let C=W.parseIdent(b),T=t.getWorkspaceByIdent(C);v.set(T,"decline")}for(let[b,C]of Object.entries(I.releases||{})){let T=W.parseIdent(b),L=t.getWorkspaceByIdent(T);v.set(L,fw(C))}return{project:t,root:o,baseHash:a!==null?a.hash:null,baseTitle:a!==null?a.title:null,changedFiles:new Set(n),changedWorkspaces:p,releaseRoots:new Set([...p].filter(b=>b.manifest.version!==null)),releases:v,async saveAll(){let b={},C=[],T=[];for(let L of t.workspaces){if(L.manifest.version===null)continue;let U=W.stringifyIdent(L.anchoredLocator),J=v.get(L);J==="decline"?C.push(U):typeof J<"u"?b[U]=fw(J):p.has(L)&&T.push(U)}await oe.mkdirPromise(K.dirname(h),{recursive:!0}),await oe.changeFilePromise(h,Ba(new Ba.PreserveOrdering({releases:Object.keys(b).length>0?b:void 0,declined:C.length>0?C:void 0,undecided:T.length>0?T:void 0})))}}}function KDt(t){return cF(t).size>0||qv(t).length>0}function cF(t){let e=new Set;for(let r of t.changedWorkspaces)r.manifest.version!==null&&(t.releases.has(r)||e.add(r));return e}function qv(t,{include:e=new Set}={}){let r=[],o=new Map(je.mapAndFilter([...t.releases],([n,u])=>u==="decline"?je.mapAndFilter.skip:[n.anchoredLocator.locatorHash,n])),a=new Map(je.mapAndFilter([...t.releases],([n,u])=>u!=="decline"?je.mapAndFilter.skip:[n.anchoredLocator.locatorHash,n]));for(let n of t.project.workspaces)if(!(!e.has(n)&&(a.has(n.anchoredLocator.locatorHash)||o.has(n.anchoredLocator.locatorHash)))&&n.manifest.version!==null)for(let u of Mt.hardDependencies)for(let A of n.manifest.getForScope(u).values()){let p=t.project.tryWorkspaceByDescriptor(A);p!==null&&o.has(p.anchoredLocator.locatorHash)&&r.push([n,p])}return r}function JG(t,e){let r=BA.default.clean(e);for(let o of Object.values(pw))if(o!=="undecided"&&o!=="decline"&&BA.default.inc(t,o)===r)return o;return null}function uF(t,e){if(BA.default.valid(e))return e;if(t===null)throw new it(`Cannot apply the release strategy "${e}" unless the workspace already has a valid version`);if(!BA.default.valid(t))throw new it(`Cannot apply the release strategy "${e}" on a non-semver version (${t})`);let r=BA.default.inc(t,e);if(r===null)throw new it(`Cannot apply the release strategy "${e}" on the specified version (${t})`);return r}function zG(t,e,{report:r}){let o=new Map;for(let a of t.workspaces)for(let n of Mt.allDependencies)for(let u of a.manifest[n].values()){let A=t.tryWorkspaceByDescriptor(u);if(A===null||!e.has(A))continue;je.getArrayWithDefault(o,A).push([a,n,u.identHash])}for(let[a,n]of e){let u=a.manifest.version;a.manifest.version=n,BA.default.prerelease(n)===null?delete a.manifest.raw.stableVersion:a.manifest.raw.stableVersion||(a.manifest.raw.stableVersion=u);let A=a.manifest.name!==null?W.stringifyIdent(a.manifest.name):null;r.reportInfo(0,`${W.prettyLocator(t.configuration,a.anchoredLocator)}: Bumped to ${n}`),r.reportJson({cwd:ue.fromPortablePath(a.cwd),ident:A,oldVersion:u,newVersion:n});let p=o.get(a);if(!(typeof p>"u"))for(let[h,E,I]of p){let v=h.manifest[E].get(I);if(typeof v>"u")throw new Error("Assertion failed: The dependency should have existed");let b=v.range,C=!1;if(b.startsWith(Xn.protocol)&&(b=b.slice(Xn.protocol.length),C=!0,b===a.relativeCwd))continue;let T=b.match(VDt);if(!T){r.reportWarning(0,`Couldn't auto-upgrade range ${b} (in ${W.prettyLocator(t.configuration,h.anchoredLocator)})`);continue}let L=`${T[1]}${n}`;C&&(L=`${Xn.protocol}${L}`);let U=W.makeDescriptor(v,L);h.manifest[E].set(I,U)}}}var JDt=new Map([["%n",{extract:t=>t.length>=1?[t[0],t.slice(1)]:null,generate:(t=0)=>`${t+1}`}]]);function XBe(t,{current:e,prerelease:r}){let o=new BA.default.SemVer(e),a=o.prerelease.slice(),n=[];o.prerelease=[],o.format()!==t&&(a.length=0);let u=!0,A=r.split(/\./g);for(let p of A){let h=JDt.get(p);if(typeof h>"u")n.push(p),a[0]===p?a.shift():u=!1;else{let E=u?h.extract(a):null;E!==null&&typeof E[0]=="number"?(n.push(h.generate(E[0])),a=E[1]):(n.push(h.generate()),u=!1)}}return o.prerelease&&(o.prerelease=[]),`${t}-${n.join(".")}`}var $0=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean("--all",!1,{description:"Apply the deferred version changes on all workspaces"});this.dryRun=ge.Boolean("--dry-run",!1,{description:"Print the versions without actually generating the package archive"});this.prerelease=ge.String("--prerelease",{description:"Add a prerelease identifier to new versions",tolerateBoolean:!0});this.recursive=ge.Boolean("-R,--recursive",{description:"Release the transitive workspaces as well"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Lr.find(r);if(!a)throw new rr(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=await Nt.start({configuration:r,json:this.json,stdout:this.context.stdout},async A=>{let p=this.prerelease?typeof this.prerelease!="boolean"?this.prerelease:"rc.%n":null,h=await jv(o,{prerelease:p}),E=new Map;if(this.all)E=h;else{let I=this.recursive?a.getRecursiveWorkspaceDependencies():[a];for(let v of I){let b=h.get(v);typeof b<"u"&&E.set(v,b)}}if(E.size===0){let I=h.size>0?" Did you want to add --all?":"";A.reportWarning(0,`The current workspace doesn't seem to require a version bump.${I}`);return}zG(o,E,{report:A}),this.dryRun||(p||(this.all?await VG(o):await KG(o,[...E.keys()])),A.reportSeparator())});return u.hasErrors()?u.exitCode():await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n})}};$0.paths=[["version","apply"]],$0.usage=nt.Usage({category:"Release-related commands",description:"apply all the deferred version bumps at once",details:` + This command will apply the deferred version changes and remove their definitions from the repository. + + Note that if \`--prerelease\` is set, the given prerelease identifier (by default \`rc.%d\`) will be used on all new versions and the version definitions will be kept as-is. + + By default only the current workspace will be bumped, but you can configure this behavior by using one of: + + - \`--recursive\` to also apply the version bump on its dependencies + - \`--all\` to apply the version bump on all packages in the repository + + Note that this command will also update the \`workspace:\` references across all your local workspaces, thus ensuring that they keep referring to the same workspaces even after the version bump. + `,examples:[["Apply the version change to the local workspace","yarn version apply"],["Apply the version change to all the workspaces in the local workspace","yarn version apply --all"]]});Ye();Pt();qt();var AF=$e(zn());var eg=class extends ut{constructor(){super(...arguments);this.interactive=ge.Boolean("-i,--interactive",{description:"Open an interactive interface used to set version bumps"})}async execute(){return this.interactive?await this.executeInteractive():await this.executeStandard()}async executeInteractive(){SC(this.context);let{Gem:r}=await Promise.resolve().then(()=>(AQ(),Dj)),{ScrollableItems:o}=await Promise.resolve().then(()=>(gQ(),hQ)),{FocusRequest:a}=await Promise.resolve().then(()=>(Sj(),Xwe)),{useListInput:n}=await Promise.resolve().then(()=>(pQ(),Zwe)),{renderForm:u}=await Promise.resolve().then(()=>(EQ(),yQ)),{Box:A,Text:p}=await Promise.resolve().then(()=>$e(ic())),{default:h,useCallback:E,useState:I}=await Promise.resolve().then(()=>$e(sn())),v=await Ve.find(this.context.cwd,this.context.plugins),{project:b,workspace:C}=await St.find(v,this.context.cwd);if(!C)throw new rr(b.cwd,this.context.cwd);await b.restoreInstallState();let T=await hw(b);if(T===null||T.releaseRoots.size===0)return 0;if(T.root===null)throw new it("This command can only be run on Git repositories");let L=()=>h.createElement(A,{flexDirection:"row",paddingBottom:1},h.createElement(A,{flexDirection:"column",width:60},h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select workspaces.")),h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select release strategies."))),h.createElement(A,{flexDirection:"column"},h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to save.")),h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to abort.")))),U=({workspace:ye,active:ae,decision:we,setDecision:Pe})=>{let g=ye.manifest.raw.stableVersion??ye.manifest.version;if(g===null)throw new Error(`Assertion failed: The version should have been set (${W.prettyLocator(v,ye.anchoredLocator)})`);if(AF.default.prerelease(g)!==null)throw new Error(`Assertion failed: Prerelease identifiers shouldn't be found (${g})`);let Ee=["undecided","decline","patch","minor","major"];n(we,Ee,{active:ae,minus:"left",plus:"right",set:Pe});let De=we==="undecided"?h.createElement(p,{color:"yellow"},g):we==="decline"?h.createElement(p,{color:"green"},g):h.createElement(p,null,h.createElement(p,{color:"magenta"},g)," \u2192 ",h.createElement(p,{color:"green"},AF.default.valid(we)?we:AF.default.inc(g,we)));return h.createElement(A,{flexDirection:"column"},h.createElement(A,null,h.createElement(p,null,W.prettyLocator(v,ye.anchoredLocator)," - ",De)),h.createElement(A,null,Ee.map(ce=>h.createElement(A,{key:ce,paddingLeft:2},h.createElement(p,null,h.createElement(r,{active:ce===we})," ",ce)))))},J=ye=>{let ae=new Set(T.releaseRoots),we=new Map([...ye].filter(([Pe])=>ae.has(Pe)));for(;;){let Pe=qv({project:T.project,releases:we}),g=!1;if(Pe.length>0){for(let[Ee]of Pe)if(!ae.has(Ee)){ae.add(Ee),g=!0;let De=ye.get(Ee);typeof De<"u"&&we.set(Ee,De)}}if(!g)break}return{relevantWorkspaces:ae,relevantReleases:we}},te=()=>{let[ye,ae]=I(()=>new Map(T.releases)),we=E((Pe,g)=>{let Ee=new Map(ye);g!=="undecided"?Ee.set(Pe,g):Ee.delete(Pe);let{relevantReleases:De}=J(Ee);ae(De)},[ye,ae]);return[ye,we]},le=({workspaces:ye,releases:ae})=>{let we=[];we.push(`${ye.size} total`);let Pe=0,g=0;for(let Ee of ye){let De=ae.get(Ee);typeof De>"u"?g+=1:De!=="decline"&&(Pe+=1)}return we.push(`${Pe} release${Pe===1?"":"s"}`),we.push(`${g} remaining`),h.createElement(p,{color:"yellow"},we.join(", "))},Ae=await u(({useSubmit:ye})=>{let[ae,we]=te();ye(ae);let{relevantWorkspaces:Pe}=J(ae),g=new Set([...Pe].filter(ne=>!T.releaseRoots.has(ne))),[Ee,De]=I(0),ce=E(ne=>{switch(ne){case a.BEFORE:De(Ee-1);break;case a.AFTER:De(Ee+1);break}},[Ee,De]);return h.createElement(A,{flexDirection:"column"},h.createElement(L,null),h.createElement(A,null,h.createElement(p,{wrap:"wrap"},"The following files have been modified in your local checkout.")),h.createElement(A,{flexDirection:"column",marginTop:1,paddingLeft:2},[...T.changedFiles].map(ne=>h.createElement(A,{key:ne},h.createElement(p,null,h.createElement(p,{color:"grey"},ue.fromPortablePath(T.root)),ue.sep,ue.relative(ue.fromPortablePath(T.root),ue.fromPortablePath(ne)))))),T.releaseRoots.size>0&&h.createElement(h.Fragment,null,h.createElement(A,{marginTop:1},h.createElement(p,{wrap:"wrap"},"Because of those files having been modified, the following workspaces may need to be released again (note that private workspaces are also shown here, because even though they won't be published, releasing them will allow us to flag their dependents for potential re-release):")),g.size>3?h.createElement(A,{marginTop:1},h.createElement(le,{workspaces:T.releaseRoots,releases:ae})):null,h.createElement(A,{marginTop:1,flexDirection:"column"},h.createElement(o,{active:Ee%2===0,radius:1,size:2,onFocusRequest:ce},[...T.releaseRoots].map(ne=>h.createElement(U,{key:ne.cwd,workspace:ne,decision:ae.get(ne)||"undecided",setDecision:ee=>we(ne,ee)}))))),g.size>0?h.createElement(h.Fragment,null,h.createElement(A,{marginTop:1},h.createElement(p,{wrap:"wrap"},"The following workspaces depend on other workspaces that have been marked for release, and thus may need to be released as well:")),h.createElement(A,null,h.createElement(p,null,"(Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to move the focus between the workspace groups.)")),g.size>5?h.createElement(A,{marginTop:1},h.createElement(le,{workspaces:g,releases:ae})):null,h.createElement(A,{marginTop:1,flexDirection:"column"},h.createElement(o,{active:Ee%2===1,radius:2,size:2,onFocusRequest:ce},[...g].map(ne=>h.createElement(U,{key:ne.cwd,workspace:ne,decision:ae.get(ne)||"undecided",setDecision:ee=>we(ne,ee)}))))):null)},{versionFile:T},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof Ae>"u")return 1;T.releases.clear();for(let[ye,ae]of Ae)T.releases.set(ye,ae);await T.saveAll()}async executeStandard(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new rr(o.cwd,this.context.cwd);return await o.restoreInstallState(),(await Nt.start({configuration:r,stdout:this.context.stdout},async u=>{let A=await hw(o);if(A===null||A.releaseRoots.size===0)return;if(A.root===null)throw new it("This command can only be run on Git repositories");if(u.reportInfo(0,`Your PR was started right after ${de.pretty(r,A.baseHash.slice(0,7),"yellow")} ${de.pretty(r,A.baseTitle,"magenta")}`),A.changedFiles.size>0){u.reportInfo(0,"You have changed the following files since then:"),u.reportSeparator();for(let v of A.changedFiles)u.reportInfo(null,`${de.pretty(r,ue.fromPortablePath(A.root),"gray")}${ue.sep}${ue.relative(ue.fromPortablePath(A.root),ue.fromPortablePath(v))}`)}let p=!1,h=!1,E=cF(A);if(E.size>0){p||u.reportSeparator();for(let v of E)u.reportError(0,`${W.prettyLocator(r,v.anchoredLocator)} has been modified but doesn't have a release strategy attached`);p=!0}let I=qv(A);for(let[v,b]of I)h||u.reportSeparator(),u.reportError(0,`${W.prettyLocator(r,v.anchoredLocator)} doesn't have a release strategy attached, but depends on ${W.prettyWorkspace(r,b)} which is planned for release.`),h=!0;(p||h)&&(u.reportSeparator(),u.reportInfo(0,"This command detected that at least some workspaces have received modifications without explicit instructions as to how they had to be released (if needed)."),u.reportInfo(0,"To correct these errors, run `yarn version check --interactive` then follow the instructions."))})).exitCode()}};eg.paths=[["version","check"]],eg.usage=nt.Usage({category:"Release-related commands",description:"check that all the relevant packages have been bumped",details:"\n **Warning:** This command currently requires Git.\n\n This command will check that all the packages covered by the files listed in argument have been properly bumped or declined to bump.\n\n In the case of a bump, the check will also cover transitive packages - meaning that should `Foo` be bumped, a package `Bar` depending on `Foo` will require a decision as to whether `Bar` will need to be bumped. This check doesn't cross packages that have declined to bump.\n\n In case no arguments are passed to the function, the list of modified files will be generated by comparing the HEAD against `master`.\n ",examples:[["Check whether the modified packages need a bump","yarn version check"]]});Ye();qt();var fF=$e(zn());var tg=class extends ut{constructor(){super(...arguments);this.deferred=ge.Boolean("-d,--deferred",{description:"Prepare the version to be bumped during the next release cycle"});this.immediate=ge.Boolean("-i,--immediate",{description:"Bump the version immediately"});this.strategy=ge.String()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new rr(o.cwd,this.context.cwd);let n=r.get("preferDeferredVersions");this.deferred&&(n=!0),this.immediate&&(n=!1);let u=fF.default.valid(this.strategy),A=this.strategy==="decline",p;if(u)if(a.manifest.version!==null){let E=JG(a.manifest.version,this.strategy);E!==null?p=E:p=this.strategy}else p=this.strategy;else{let E=a.manifest.version;if(!A){if(E===null)throw new it("Can't bump the version if there wasn't a version to begin with - use 0.0.0 as initial version then run the command again.");if(typeof E!="string"||!fF.default.valid(E))throw new it(`Can't bump the version (${E}) if it's not valid semver`)}p=fw(this.strategy)}if(!n){let I=(await jv(o)).get(a);if(typeof I<"u"&&p!=="decline"){let v=uF(a.manifest.version,p);if(fF.default.lt(v,I))throw new it(`Can't bump the version to one that would be lower than the current deferred one (${I})`)}}let h=await hw(o,{allowEmpty:!0});return h.releases.set(a,p),await h.saveAll(),n?0:await this.cli.run(["version","apply"])}};tg.paths=[["version"]],tg.usage=nt.Usage({category:"Release-related commands",description:"apply a new version to the current package",details:"\n This command will bump the version number for the given package, following the specified strategy:\n\n - If `major`, the first number from the semver range will be increased (`X.0.0`).\n - If `minor`, the second number from the semver range will be increased (`0.X.0`).\n - If `patch`, the third number from the semver range will be increased (`0.0.X`).\n - If prefixed by `pre` (`premajor`, ...), a `-0` suffix will be set (`0.0.0-0`).\n - If `prerelease`, the suffix will be increased (`0.0.0-X`); the third number from the semver range will also be increased if there was no suffix in the previous version.\n - If `decline`, the nonce will be increased for `yarn version check` to pass without version bump.\n - If a valid semver range, it will be used as new version.\n - If unspecified, Yarn will ask you for guidance.\n\n For more information about the `--deferred` flag, consult our documentation (https://yarnpkg.com/features/release-workflow#deferred-versioning).\n ",examples:[["Immediately bump the version to the next major","yarn version major"],["Prepare the version to be bumped to the next major","yarn version major --deferred"]]});var zDt={configuration:{deferredVersionFolder:{description:"Folder where are stored the versioning files",type:"ABSOLUTE_PATH",default:"./.yarn/versions"},preferDeferredVersions:{description:"If true, running `yarn version` will assume the `--deferred` flag unless `--immediate` is set",type:"BOOLEAN",default:!1}},commands:[$0,eg,tg]},XDt=zDt;var ZG={};Kt(ZG,{WorkspacesFocusCommand:()=>rg,WorkspacesForeachCommand:()=>op,default:()=>ePt});Ye();Ye();qt();var rg=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.production=ge.Boolean("--production",!1,{description:"Only install regular dependencies by omitting dev dependencies"});this.all=ge.Boolean("-A,--all",!1,{description:"Install the entire project"});this.workspaces=ge.Rest()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Lr.find(r);await o.restoreInstallState({restoreResolutions:!1});let u;if(this.all)u=new Set(o.workspaces);else if(this.workspaces.length===0){if(!a)throw new rr(o.cwd,this.context.cwd);u=new Set([a])}else u=new Set(this.workspaces.map(A=>o.getWorkspaceByIdent(W.parseIdent(A))));for(let A of u)for(let p of this.production?["dependencies"]:Mt.hardDependencies)for(let h of A.manifest.getForScope(p).values()){let E=o.tryWorkspaceByDescriptor(h);E!==null&&u.add(E)}for(let A of o.workspaces)u.has(A)?this.production&&A.manifest.devDependencies.clear():(A.manifest.installConfig=A.manifest.installConfig||{},A.manifest.installConfig.selfReferences=!1,A.manifest.dependencies.clear(),A.manifest.devDependencies.clear(),A.manifest.peerDependencies.clear(),A.manifest.scripts.clear());return await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n,persistProject:!1})}};rg.paths=[["workspaces","focus"]],rg.usage=nt.Usage({category:"Workspace-related commands",description:"install a single workspace and its dependencies",details:"\n This command will run an install as if the specified workspaces (and all other workspaces they depend on) were the only ones in the project. If no workspaces are explicitly listed, the active one will be assumed.\n\n Note that this command is only very moderately useful when using zero-installs, since the cache will contain all the packages anyway - meaning that the only difference between a full install and a focused install would just be a few extra lines in the `.pnp.cjs` file, at the cost of introducing an extra complexity.\n\n If the `-A,--all` flag is set, the entire project will be installed. Combine with `--production` to replicate the old `yarn install --production`.\n "});Ye();Ye();Ye();qt();var dw=$e(Zo()),$Be=$e(nd());Za();var op=class extends ut{constructor(){super(...arguments);this.from=ge.Array("--from",{description:"An array of glob pattern idents or paths from which to base any recursion"});this.all=ge.Boolean("-A,--all",{description:"Run the command on all workspaces of a project"});this.recursive=ge.Boolean("-R,--recursive",{description:"Run the command on the current workspace and all of its recursive dependencies"});this.worktree=ge.Boolean("-W,--worktree",{description:"Run the command on all workspaces of the current worktree"});this.verbose=ge.Boolean("-v,--verbose",{description:"Prefix each output line with the name of the originating workspace"});this.parallel=ge.Boolean("-p,--parallel",!1,{description:"Run the commands in parallel"});this.interlaced=ge.Boolean("-i,--interlaced",!1,{description:"Print the output of commands in real-time instead of buffering it"});this.jobs=ge.String("-j,--jobs",{description:"The maximum number of parallel tasks that the execution will be limited to; or `unlimited`",validator:LR([Vs(["unlimited"]),oI(NR(),[OR(),MR(1)])])});this.topological=ge.Boolean("-t,--topological",!1,{description:"Run the command after all workspaces it depends on (regular) have finished"});this.topologicalDev=ge.Boolean("--topological-dev",!1,{description:"Run the command after all workspaces it depends on (regular + dev) have finished"});this.include=ge.Array("--include",[],{description:"An array of glob pattern idents or paths; only matching workspaces will be traversed"});this.exclude=ge.Array("--exclude",[],{description:"An array of glob pattern idents or paths; matching workspaces won't be traversed"});this.publicOnly=ge.Boolean("--no-private",{description:"Avoid running the command on private workspaces"});this.since=ge.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.dryRun=ge.Boolean("-n,--dry-run",{description:"Print the commands that would be run, without actually running them"});this.commandName=ge.String();this.args=ge.Proxy()}async execute(){let r=await Ve.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!this.all&&!a)throw new rr(o.cwd,this.context.cwd);await o.restoreInstallState();let n=this.cli.process([this.commandName,...this.args]),u=n.path.length===1&&n.path[0]==="run"&&typeof n.scriptName<"u"?n.scriptName:null;if(n.path.length===0)throw new it("Invalid subcommand name for iteration - use the 'run' keyword if you wish to execute a script");let A=ae=>{!this.dryRun||this.context.stdout.write(`${ae} +`)},p=()=>{let ae=this.from.map(we=>dw.default.matcher(we));return o.workspaces.filter(we=>{let Pe=W.stringifyIdent(we.anchoredLocator),g=we.relativeCwd;return ae.some(Ee=>Ee(Pe)||Ee(g))})},h=[];if(this.since?(A("Option --since is set; selecting the changed workspaces as root for workspace selection"),h=Array.from(await ra.fetchChangedWorkspaces({ref:this.since,project:o}))):this.from?(A("Option --from is set; selecting the specified workspaces"),h=[...p()]):this.worktree?(A("Option --worktree is set; selecting the current workspace"),h=[a]):this.recursive?(A("Option --recursive is set; selecting the current workspace"),h=[a]):this.all&&(A("Option --all is set; selecting all workspaces"),h=[...o.workspaces]),this.dryRun&&!this.all){for(let ae of h)A(` +- ${ae.relativeCwd} + ${W.prettyLocator(r,ae.anchoredLocator)}`);h.length>0&&A("")}let E;if(this.recursive?this.since?(A("Option --recursive --since is set; recursively selecting all dependent workspaces"),E=new Set(h.map(ae=>[...ae.getRecursiveWorkspaceDependents()]).flat())):(A("Option --recursive is set; recursively selecting all transitive dependencies"),E=new Set(h.map(ae=>[...ae.getRecursiveWorkspaceDependencies()]).flat())):this.worktree?(A("Option --worktree is set; recursively selecting all nested workspaces"),E=new Set(h.map(ae=>[...ae.getRecursiveWorkspaceChildren()]).flat())):E=null,E!==null&&(h=[...new Set([...h,...E])],this.dryRun))for(let ae of E)A(` +- ${ae.relativeCwd} + ${W.prettyLocator(r,ae.anchoredLocator)}`);let I=[],v=!1;if(u?.includes(":")){for(let ae of o.workspaces)if(ae.manifest.scripts.has(u)&&(v=!v,v===!1))break}for(let ae of h){if(u&&!ae.manifest.scripts.has(u)&&!v&&!(await un.getWorkspaceAccessibleBinaries(ae)).has(u)){A(`Excluding ${ae.relativeCwd} because it doesn't have a "${u}" script`);continue}if(!(u===r.env.npm_lifecycle_event&&ae.cwd===a.cwd)){if(this.include.length>0&&!dw.default.isMatch(W.stringifyIdent(ae.anchoredLocator),this.include)&&!dw.default.isMatch(ae.relativeCwd,this.include)){A(`Excluding ${ae.relativeCwd} because it doesn't match the --include filter`);continue}if(this.exclude.length>0&&(dw.default.isMatch(W.stringifyIdent(ae.anchoredLocator),this.exclude)||dw.default.isMatch(ae.relativeCwd,this.exclude))){A(`Excluding ${ae.relativeCwd} because it matches the --include filter`);continue}if(this.publicOnly&&ae.manifest.private===!0){A(`Excluding ${ae.relativeCwd} because it's a private workspace and --no-private was set`);continue}I.push(ae)}}if(this.dryRun)return 0;let b=this.verbose??this.context.stdout.isTTY,C=this.parallel?this.jobs==="unlimited"?1/0:Number(this.jobs)||Math.ceil(Ji.availableParallelism()/2):1,T=C===1?!1:this.parallel,L=T?this.interlaced:!0,U=(0,$Be.default)(C),J=new Map,te=new Set,le=0,pe=null,Ae=!1,ye=await Nt.start({configuration:r,stdout:this.context.stdout,includePrefix:!1},async ae=>{let we=async(Pe,{commandIndex:g})=>{if(Ae)return-1;!T&&b&&g>1&&ae.reportSeparator();let Ee=ZDt(Pe,{configuration:r,verbose:b,commandIndex:g}),[De,ce]=ZBe(ae,{prefix:Ee,interlaced:L}),[ne,ee]=ZBe(ae,{prefix:Ee,interlaced:L});try{b&&ae.reportInfo(null,`${Ee} Process started`);let Ie=Date.now(),ke=await this.cli.run([this.commandName,...this.args],{cwd:Pe.cwd,stdout:De,stderr:ne})||0;De.end(),ne.end(),await ce,await ee;let ht=Date.now();if(b){let H=r.get("enableTimers")?`, completed in ${de.pretty(r,ht-Ie,de.Type.DURATION)}`:"";ae.reportInfo(null,`${Ee} Process exited (exit code ${ke})${H}`)}return ke===130&&(Ae=!0,pe=ke),ke}catch(Ie){throw De.end(),ne.end(),await ce,await ee,Ie}};for(let Pe of I)J.set(Pe.anchoredLocator.locatorHash,Pe);for(;J.size>0&&!ae.hasErrors();){let Pe=[];for(let[De,ce]of J){if(te.has(ce.anchoredDescriptor.descriptorHash))continue;let ne=!0;if(this.topological||this.topologicalDev){let ee=this.topologicalDev?new Map([...ce.manifest.dependencies,...ce.manifest.devDependencies]):ce.manifest.dependencies;for(let Ie of ee.values()){let ke=o.tryWorkspaceByDescriptor(Ie);if(ne=ke===null||!J.has(ke.anchoredLocator.locatorHash),!ne)break}}if(!!ne&&(te.add(ce.anchoredDescriptor.descriptorHash),Pe.push(U(async()=>{let ee=await we(ce,{commandIndex:++le});return J.delete(De),te.delete(ce.anchoredDescriptor.descriptorHash),ee})),!T))break}if(Pe.length===0){let De=Array.from(J.values()).map(ce=>W.prettyLocator(r,ce.anchoredLocator)).join(", ");ae.reportError(3,`Dependency cycle detected (${De})`);return}let Ee=(await Promise.all(Pe)).find(De=>De!==0);pe===null&&(pe=typeof Ee<"u"?1:pe),(this.topological||this.topologicalDev)&&typeof Ee<"u"&&ae.reportError(0,"The command failed for workspaces that are depended upon by other workspaces; can't satisfy the dependency graph")}});return pe!==null?pe:ye.exitCode()}};op.paths=[["workspaces","foreach"]],op.usage=nt.Usage({category:"Workspace-related commands",description:"run a command on all workspaces",details:"\n This command will run a given sub-command on current and all its descendant workspaces. Various flags can alter the exact behavior of the command:\n\n - If `-p,--parallel` is set, the commands will be ran in parallel; they'll by default be limited to a number of parallel tasks roughly equal to half your core number, but that can be overridden via `-j,--jobs`, or disabled by setting `-j unlimited`.\n\n - If `-p,--parallel` and `-i,--interlaced` are both set, Yarn will print the lines from the output as it receives them. If `-i,--interlaced` wasn't set, it would instead buffer the output from each process and print the resulting buffers only after their source processes have exited.\n\n - If `-t,--topological` is set, Yarn will only run the command after all workspaces that it depends on through the `dependencies` field have successfully finished executing. If `--topological-dev` is set, both the `dependencies` and `devDependencies` fields will be considered when figuring out the wait points.\n\n - If `-A,--all` is set, Yarn will run the command on all the workspaces of a project.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If `-W,--worktree` is set, Yarn will find workspaces to run the command on by looking at the current worktree.\n\n - If `--from` is set, Yarn will use the packages matching the 'from' glob as the starting point for any recursive search.\n\n - If `--since` is set, Yarn will only run the command on workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `--dry-run` is set, Yarn will explain what it would do without actually doing anything.\n\n - The command may apply to only some workspaces through the use of `--include` which acts as a whitelist. The `--exclude` flag will do the opposite and will be a list of packages that mustn't execute the script. Both flags accept glob patterns (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n Adding the `-v,--verbose` flag (automatically enabled in interactive terminal environments) will cause Yarn to print more information; in particular the name of the workspace that generated the output will be printed at the front of each line.\n\n If the command is `run` and the script being run does not exist the child workspace will be skipped without error.\n ",examples:[["Publish all packages","yarn workspaces foreach -A npm publish --tolerate-republish"],["Run the build script on all descendant packages","yarn workspaces foreach -A run build"],["Run the build script on current and all descendant packages in parallel, building package dependencies first","yarn workspaces foreach -Apt run build"],["Run the build script on several packages and all their dependencies, building dependencies first","yarn workspaces foreach -Rpt --from '{workspace-a,workspace-b}' run build"]]}),op.schema=[lI("all",Gu.Forbids,["from","recursive","since","worktree"],{missingIf:"undefined"}),UR(["all","recursive","since","worktree"],{missingIf:"undefined"})];function ZBe(t,{prefix:e,interlaced:r}){let o=t.createStreamReporter(e),a=new je.DefaultStream;a.pipe(o,{end:!1}),a.on("finish",()=>{o.end()});let n=new Promise(A=>{o.on("finish",()=>{A(a.active)})});if(r)return[a,n];let u=new je.BufferStream;return u.pipe(a,{end:!1}),u.on("finish",()=>{a.end()}),[u,n]}function ZDt(t,{configuration:e,commandIndex:r,verbose:o}){if(!o)return null;let n=`[${W.stringifyIdent(t.anchoredLocator)}]:`,u=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],A=u[r%u.length];return de.pretty(e,n,A)}var $Dt={commands:[rg,op]},ePt=$Dt;var fC=()=>({modules:new Map([["@yarnpkg/cli",o2],["@yarnpkg/core",s2],["@yarnpkg/fslib",Vw],["@yarnpkg/libzip",x1],["@yarnpkg/parsers",tI],["@yarnpkg/shell",T1],["clipanion",pI],["semver",tPt],["typanion",Ko],["@yarnpkg/plugin-essentials",tH],["@yarnpkg/plugin-compat",oH],["@yarnpkg/plugin-constraints",BH],["@yarnpkg/plugin-dlx",vH],["@yarnpkg/plugin-exec",SH],["@yarnpkg/plugin-file",bH],["@yarnpkg/plugin-git",eH],["@yarnpkg/plugin-github",FH],["@yarnpkg/plugin-http",TH],["@yarnpkg/plugin-init",RH],["@yarnpkg/plugin-interactive-tools",Lj],["@yarnpkg/plugin-link",Mj],["@yarnpkg/plugin-nm",Cq],["@yarnpkg/plugin-npm",EG],["@yarnpkg/plugin-npm-cli",xG],["@yarnpkg/plugin-pack",hG],["@yarnpkg/plugin-patch",NG],["@yarnpkg/plugin-pnp",lq],["@yarnpkg/plugin-pnpm",OG],["@yarnpkg/plugin-stage",YG],["@yarnpkg/plugin-typescript",WG],["@yarnpkg/plugin-version",XG],["@yarnpkg/plugin-workspace-tools",ZG]]),plugins:new Set(["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-constraints","@yarnpkg/plugin-dlx","@yarnpkg/plugin-exec","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools"])});function rve({cwd:t,pluginConfiguration:e}){let r=new as({binaryLabel:"Yarn Package Manager",binaryName:"yarn",binaryVersion:tn??""});return Object.assign(r,{defaultContext:{...as.defaultContext,cwd:t,plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr}})}function rPt(t){if(je.parseOptionalBoolean(process.env.YARN_IGNORE_NODE))return!0;let r=process.versions.node,o=">=18.12.0";if(kr.satisfiesWithPrereleases(r,o))return!0;let a=new it(`This tool requires a Node version compatible with ${o} (got ${r}). Upgrade Node, or set \`YARN_IGNORE_NODE=1\` in your environment.`);return as.defaultContext.stdout.write(t.error(a)),!1}async function nve({selfPath:t,pluginConfiguration:e}){return await Ve.find(ue.toPortablePath(process.cwd()),e,{strict:!1,usePathCheck:t})}function nPt(t,e,{yarnPath:r}){if(!oe.existsSync(r))return t.error(new Error(`The "yarn-path" option has been set, but the specified location doesn't exist (${r}).`)),1;process.on("SIGINT",()=>{});let o={stdio:"inherit",env:{...process.env,YARN_IGNORE_PATH:"1"}};try{(0,eve.execFileSync)(process.execPath,[ue.fromPortablePath(r),...e],o)}catch(a){return a.status??1}return 0}function iPt(t,e){let r=null,o=e;return e.length>=2&&e[0]==="--cwd"?(r=ue.toPortablePath(e[1]),o=e.slice(2)):e.length>=1&&e[0].startsWith("--cwd=")?(r=ue.toPortablePath(e[0].slice(6)),o=e.slice(1)):e[0]==="add"&&e[e.length-2]==="--cwd"&&(r=ue.toPortablePath(e[e.length-1]),o=e.slice(0,e.length-2)),t.defaultContext.cwd=r!==null?K.resolve(r):K.cwd(),o}function sPt(t,{configuration:e}){if(!e.get("enableTelemetry")||tve.isCI||!process.stdout.isTTY)return;Ve.telemetry=new cC(e,"puba9cdc10ec5790a2cf4969dd413a47270");let o=/^@yarnpkg\/plugin-(.*)$/;for(let a of e.plugins.keys())uC.has(a.match(o)?.[1]??"")&&Ve.telemetry?.reportPluginName(a);t.binaryVersion&&Ve.telemetry.reportVersion(t.binaryVersion)}function ive(t,{configuration:e}){for(let r of e.plugins.values())for(let o of r.commands||[])t.register(o)}async function oPt(t,e,{selfPath:r,pluginConfiguration:o}){if(!rPt(t))return 1;let a=await nve({selfPath:r,pluginConfiguration:o}),n=a.get("yarnPath"),u=a.get("ignorePath");if(n&&!u)return nPt(t,e,{yarnPath:n});delete process.env.YARN_IGNORE_PATH;let A=iPt(t,e);sPt(t,{configuration:a}),ive(t,{configuration:a});let p=t.process(A,t.defaultContext);return p.help||Ve.telemetry?.reportCommandName(p.path.join(" ")),await t.run(p,t.defaultContext)}async function the({cwd:t=K.cwd(),pluginConfiguration:e=fC()}={}){let r=rve({cwd:t,pluginConfiguration:e}),o=await nve({pluginConfiguration:e,selfPath:null});return ive(r,{configuration:o}),r}async function sk(t,{cwd:e=K.cwd(),selfPath:r,pluginConfiguration:o}){let a=rve({cwd:e,pluginConfiguration:o});try{process.exitCode=await oPt(a,t,{selfPath:r,pluginConfiguration:o})}catch(n){as.defaultContext.stdout.write(a.error(n)),process.exitCode=1}finally{await oe.rmtempPromise()}}sk(process.argv.slice(2),{cwd:K.cwd(),selfPath:ue.toPortablePath(ue.resolve(process.argv[1])),pluginConfiguration:fC()});})(); +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ +/*! + * buildToken + * Builds OAuth token prefix (helper function) + * + * @name buildToken + * @function + * @param {GitUrl} obj The parsed Git url object. + * @return {String} token prefix + */ +/*! + * fill-range + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Licensed under the MIT License. + */ +/*! + * is-extglob + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ +/*! + * is-glob + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * is-number + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * is-windows + * + * Copyright © 2015-2018, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * to-regex-range + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Released under the MIT License. + */ +/** + @license + Copyright (c) 2015, Rebecca Turner + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + */ +/** + @license + Copyright Joyent, Inc. and other Node contributors. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to permit + persons to whom the Software is furnished to do so, subject to the + following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +/** + @license + Copyright Node.js contributors. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. +*/ +/** + @license + The MIT License (MIT) + + Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ +/** @license React v0.18.0 + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +/** @license React v0.24.0 + * react-reconciler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +/** @license React v16.13.1 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/docsite/.yarn/sdks/integrations.yml b/docsite/.yarn/sdks/integrations.yml new file mode 100644 index 00000000..aa9d0d0a --- /dev/null +++ b/docsite/.yarn/sdks/integrations.yml @@ -0,0 +1,5 @@ +# This file is automatically generated by @yarnpkg/sdks. +# Manual changes might be lost! + +integrations: + - vscode diff --git a/docsite/.yarnrc.yml b/docsite/.yarnrc.yml new file mode 100644 index 00000000..42f1e2eb --- /dev/null +++ b/docsite/.yarnrc.yml @@ -0,0 +1,7 @@ +compressionLevel: mixed + +enableGlobalCache: false + +nodeLinker: pnp + +yarnPath: .yarn/releases/yarn-4.0.2.cjs diff --git a/docsite/_includes/page.css b/docsite/_includes/page.css new file mode 100644 index 00000000..416ac89e --- /dev/null +++ b/docsite/_includes/page.css @@ -0,0 +1,115 @@ +html { + padding: 0; + margin: 0; +} + +body{ + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + padding: 0; + margin: 0; +} + +footer{ + width: 100%; + height: 32px; + font-size: 12px; + display: flex; + flex-direction: row; + justify-content: center; + gap: 18px; + align-items: center; + color: #5d5d5d; + background: #e9eaeb; + border-top: 1px solid #c4c5c6; +} + +#cookiesManager{ + cursor: pointer; + color: #485fc7; +} + +.page-content { + display: flex; + flex-direction: row; + margin: 0; + padding: 0; + overflow: scroll; + padding: 0; + margin: 0; +} + +header { + background-color: lightgrey; + height: 2%; + padding: 10px; +} + +nav { + padding: 1em; + min-width: 200px; +} + +main { + flex: 1; + padding: 0 5em 0 5em; +} + +.logotitle { + font-size: 1.5em; + font-weight: bold; + margin: 5px; +} + +.number { + all: unset; +} + +.tag.token { + all: unset; +} + +main ul { + list-style-type: disc; + padding-left: 30px; + margin-top: 10px; +} + +h1 { + font-size: 2rem; + margin-top: 10px; +} + +h2 { + font-size: 1.5rem; + margin-top: 10px; + font-weight: 500; +} + +h3 { + font-size: 1rem; + margin-top: 10px; + font-weight: 500; +} +p { + margin-top: 10px; +} + +/* Accessibility styling */ + +a { + color: #485fc7; + text-decoration: underline; +} + +.menu-list a { + text-decoration: none; +} + + +.token.comment, .token.prolog, .token.doctype, .token.cdata { + color: #8093a5; +} + +.token.property, .token.tag, .token.constant, .token.symbol, .token.deleted { + color: #ff36ab; +} \ No newline at end of file diff --git a/docsite/_includes/page.njk b/docsite/_includes/page.njk new file mode 100644 index 00000000..b6f57bc9 --- /dev/null +++ b/docsite/_includes/page.njk @@ -0,0 +1,164 @@ +--- +title: GraphRAG +--- +{% set css %} +{% include "page.css" %} +{% endset %} + +{% macro link_to(url, text) %} +{{text}} +{% endmacro %} + + + + + + + {{ title }} + + + + + {% mermaid_js %} + {% initClipboardJS %} + + {% block js %} + + + {% endblock %} + + +
+ + GraphRAG +
+
+ + + + +
+

{{title}}

+ {{ content | safe }} +
+
+ + + \ No newline at end of file diff --git a/docsite/data/operation_dulce/ABOUT.md b/docsite/data/operation_dulce/ABOUT.md new file mode 100644 index 00000000..272d3bf6 --- /dev/null +++ b/docsite/data/operation_dulce/ABOUT.md @@ -0,0 +1,3 @@ +# About + +This document (Operation Dulce) is an AI-generated science fiction novella, included here for the purposes of integration testing. \ No newline at end of file diff --git a/docsite/data/operation_dulce/Operation Dulce v2 1 1.md b/docsite/data/operation_dulce/Operation Dulce v2 1 1.md new file mode 100644 index 00000000..95c9e3cd --- /dev/null +++ b/docsite/data/operation_dulce/Operation Dulce v2 1 1.md @@ -0,0 +1,970 @@ +# Operation: Dulce + +## Chapter 1 + +The thrumming of monitors cast a stark contrast to the rigid silence enveloping the group. Agent Alex Mercer, unfailingly determined on paper, seemed dwarfed by the enormity of the sterile briefing room where Paranormal Military Squad's elite convened. With dulled eyes, he scanned the projectors outlining their impending odyssey into Operation: Dulce. + +“I assume, Agent Mercer, you’re not having second thoughts?” It was Taylor Cruz’s voice, laced with an edge that demanded attention. + +Alex flickered a strained smile, still thumbing his folder's corner. "Of course not, Agent Cruz. Just trying to soak in all the details." The compliance in his tone was unsettling, even to himself. + +Jordan Hayes, perched on the opposite side of the table, narrowed their eyes but offered a supportive nod. "Details are imperative. We’ll need your clear-headedness down there, Mercer." + +A comfortable silence, the kind that threaded between veterans of shared secrets, lingered briefly before Sam Rivera, never one to submit to quiet, added, "I’ve combed through the last transmission logs. If anyone can make sense of the anomalies, it’s going to be the two of you." + +Taylor snorted dismissively. “Focus, people. We have protocols for a reason. Speculation is counter-productive.” The words 'counter-productive' seemed to hang in the air, a tacit reprimand directed at Alex. + +Feeling the weight of his compliance conflicting with his natural inclination to leave no stone unturned, Alex straightened in his seat. "I agree, Agent Cruz. Protocol is paramount," he said, meeting Taylor's steely gaze. It was an affirmation, but beneath it lay layers of unspoken complexities that would undoubtedly unwind with time. + +Alex's submission, though seemingly complete, didn't escape Jordan, who tilted their head ever so slightly, their eyes revealing a spark of understanding. They knew well enough the struggle of aligning personal convictions with overarching missions. As everyone began to collect their binders and prepare for departure, a quiet resolve took form within Alex, galvanized by the groundwork laid by their interactions. He may have spoken in compliance, but his determination had merely taken a subtler form — one that wouldn't surrender so easily to the forthcoming shadows. + +\* + +Dr. Jordan Hayes shuffled a stack of papers, their eyes revealing a tinge of skepticism at Taylor Cruz's authoritarian performance. _Protocols_, Jordan thought, _are just the framework, the true challenges we're about to face lie well beyond the boundaries of any protocol._ They cleared their throat before speaking, tone cautious yet firm, "Let's remember, the unknown variables exceed the known. We should remain adaptive." + +A murmur of agreement echoed from Sam Rivera, who leaned forward, lacing their fingers together as if weaving a digital framework in the air before them, "Exactly, adaptability could be the key to interpreting the signal distortions and system malfunctions. We shouldn't discount the… erratic." + +Their words hung like an electric charge in the room, challenging Taylor's position with an inherent truth. Cruz’s jaw tightened almost imperceptibly, but the agent masked it with a small nod, conceding to the omnipresent threat of the unpredictable. + +Alex glanced at Jordan, who never looked back, their gaze fixed instead on a distant point, as if envisioning the immense dark corridors they were soon to navigate in Dulce. Jordan was not one to embrace fantastical theories, but the air of cautious calculation betrayed a mind bracing for confrontation with the inexplicable, an internal battle between the evidence of their research and the calculating skepticism that kept them alive in their field. + +The meeting adjourned with no further comments, the team members quietly retreading the paths to their personal preparations. Alex, trailing slightly behind, observed the others. _The cautious reserve Jordan wears like armor doesn't fool me_, he thought, _their analytical mind sees the patterns I do. And that's worth more than protocol. That's the connection we need to survive this._ + +As the agents dispersed into the labyrinth of the facility, lost in their thoughts and preparations, the base's halogen lights flickered, a brief and unnoticed harbingers of the darkness to come. + +\* + +A deserted corridor inside the facility stretched before Taylor Cruz, each footstep rhythmic and precise. Cruz, ambitious and meticulous, eyed the troops passing by with a sardonic tilt of the lips. Obedience—it was as much a tool as any weapon in the arsenal, and Cruz wielded it masterfully. To them, it was another step toward unfettered power within the dark bowels of the military complex. + +Inside a secluded equipment bay, Cruz began checking over gear with mechanical efficiency. They traced fingers over the sleek surface of an encrypted radio transmitter. "If protocols are maintained," said Cruz aloud, rehearsing the speech for their subordinates, "not only will we re-establish a line of communication with Dulce, but we shall also illuminate the darkest secrets it conceals." + +Agent Hayes appeared in the doorway, arms crossed and a knowing glint in their eyes. "You do understand," Jordan began, the words measured and probing, "that once we're in the depths, rank gives way to survival instincts. It's not about commands—it's empowerment through trust." + +The sentiment snagged on Cruz's armor of confidence, probing at the insecurities festering beneath. Taylor offered a brief nod, perhaps too curt, but enough to acknowledge Jordan's point without yielding ground. "Trust," Cruz mused, "or the illusion thereof, is just as potent." + +Silence claimed the space between them, steeped in the reality of the unknown dangers lurking in the shadows of the mission. Cruz diligently returned to the equipment, the act a clear dismissal. + +Not much later, Cruz stood alone, the hollow echo of the bay a stark reminder of the isolation that power often wrought. With each checked box, their resolve steeled further, a silent vow to usher their team through the abyss—whatever it might hold—and emerge enshrined in the respect they so deeply craved. + +## Chapter 2 + +Sam Rivera sat alone in a cramped office, the hum of a dozen servers murmuring a digital lullaby in the background. Surrounded by the glow of multiple screens, their eyes danced across lines of code and intercepted comm signals from Dulce — a kaleidoscope of data that their curious and isolated mind hungered to decrypt. + +To an outsider, it might have looked like obsession, this fervent quest for answers. But to Sam, it was a dance — a give and take with the mysteries of the universe. Their fingers paused over the keyboard as they leaned back in the chair, whispering to thin air, "What secrets are you hiding from us?" + +The stillness of the room broke with the unexpected arrival of Alex Mercer, whose encroaching shadow loomed over Sam's workspace. The cybersecurity expert craned their neck upwards, met by the ever-so-slight furrow in Alex's brow. "Got a minute, Rivera?" + +"Always," Sam said, a smile surfacing as they swiveled to face their mentor more directly. _He has that look — like something's not sitting right with him,_ they noted inwardly. + +Alex hesitated, weighing his words carefully. "Our tech is top-tier, but the silence from Dulce... It's not just technology that will see us through, it's intuition and... trust." His gaze pierced through the digital haze, trying to instill something more profound than advice. + +Sam regarded Alex for a moment, the sincerity in his voice resonating with their own unspoken desire to prove their worth. "Intuition," they mirrored thoughtfully. "I guess sometimes the numbers don't have all the answers." + +Their shared silence held a newfound understanding, a recognition that between the ones and zeros, it was their combined human insights that might prevail against the impossible. As Alex turned to leave, Sam's eyes drifted back to the screens, now seeing them not as barriers to isolate behind, but as windows into the vast and enigmatic challenge that awaited their team. + +Outside the office, the persistent buzz of activity in the facility belied the unease that gripped its inhabitants. A restlessness that nibbled on the edges of reality, as though forewarning of the threshold they were soon to cross — from the known into the realm of cosmic secrets and silent threats. + +\* + +Shadows played against the walls of the cramped underground meeting room, where Alex Mercer stood gazing at the concealed elevator that would deliver them into the bowels of Dulce base. The air was thick, every breath laced with the weight of impending confrontation, the kind one feels when stepping into a legend. Though armed with an array of advanced weaponry and gear, there was an unshakeable sense that they were delving into a conflict where the physical might be of little consequence. + +"I know what you're thinking," Jordan Hayes remarked, approaching Mercer. Their voice was low, a blend of confidence and hidden apprehension. "This feels like more than a rescue or reconnaissance mission, doesn't it?" + +Alex turned, his features a mask of uneasy resolve. "It's like we're being pulled into someone else’s game. Not just observers or participants, but... pawns." + +Jordan gave a short nod, their analytical mind colliding with the uncertain dynamics of this operation. "I've felt that way since the briefing. Like there's a layer we’re not seeing. And yet, we have no choice but to play along." Their eyes locked with Alex's, silently exchanging a vow to remain vigilant. + +"You two need to cut the philosophical chatter. We have positions to secure," Taylor Cruz interjected sharply, stepping into their exchange. The authority in Taylor's voice brooked no argument; it was their way of pulling everyone back to the now. + +Alex's response was measured, more assertive than moments ago. "Acknowledged, Agent Cruz," he replied, his voice steadier, mirroring the transformation brewing within. He gripped his rifle with a newfound firmness. "Let's proceed." + +As they congregated at the elevator, a tension palpable, Sam Rivera piped in with a tone of balanced levity, "Hope everyone’s brought their good luck charms. Something tells me we’re going to need all the help we can get." + +Their laughter served as a brief respite from the gravity of their mission, a shared moment that reinforced their common humanity amidst the unknowable. Then, as one, they stepped into the elevator. The doors closed with a silent hiss, and they descended into the darkness together, aware that when they returned, if they returned, none of them would be the same. + +\* + +The sense of foreboding hung heavier than the darkness that the artificial lights of the elevator shaft failed to fully penetrate. The team was descending into the earth, carrying with them not only the weight of their equipment but also the silent pressure of the invisible war they were about to fight—a war that seemed to edge away from physicality and into the unnervingly psychological. + +As they descended, Dr. Jordan Hayes couldn't help but muse over the layers of data that could wait below, now almost longing for the comfort of empirical evidence. _To think that this reluctance to accept other possibilities may have been my biggest blind spot,_ Jordan contemplated, feeling the hard shell of skepticism begin to crack. + +Alex caught Jordan's reflective gaze and leaned in, his voice barely a murmur over the hum of the elevator. "Once we're down there, keep that analytical edge sharp. You see through the mazes of the unexplained better than anyone." + +The compliment was unexpected and weighed differently than praise from others. This was an acknowledgment from someone who stood on the front lines of the unknown with eyes wide open. "Thank you, Alex," Jordan said, the words carrying a trace of newfound assertiveness. "You can count on me." + +The exchange was cut short by a shudder that ran through the elevator, subtle, but enough to make them instinctively hold their breaths. It wasn't the mechanical stutter of old gears but a vibration that seemed to emanate from the very walls of the shaft—a whisper of something that defied natural explanation. + +Cruz was the first to react, all business despite the shadow that crossed their expression. "Systems check. Now," they barked out, masking the moment of disquiet with swift command. + +Every agent checked their gear, sending confirmation signals through their comms, creating a chorus of electronic beeps that promised readiness. But there was an unspoken question among them: was their technology, their weaponry, their protocols sufficient for what awaited them or merely a fragile comfort? + +Against the gravity of the silence that was once again closing in, Sam's voice crackled through, only half-jest. "I'd laugh if we run into Martians playing poker down there—just to lighten the mood, you know?" + +Despite—or perhaps because of—the oddity of the moment, this elicited a round of chuckles, an audible release of tension that ran counterpoint to the undercurrent of anxiety coursing through the team. + +As the elevator came to a halting, eerie calm at the sub-level, the group stepped off, finding themselves at the threshold of Dulce's mysterious halls. They stood in a tight pack, sharing a cautious glance before fanning out into the unknown, each one acutely aware that the truth was inevitably intertwined with danger. + +Into the depths of Dulce, the team advanced, their silence now a shared testament to the camaraderie born of facing the abyss together—and the steel resolve to uncover whatever horrors lay hidden in its shadows. + +\* + +The weight of the thick metal door closing behind them reverberated through the concrete hallway, marking the final threshold between the familiar world above and the strangeness that lay beneath. Dulce base, a name that had been whispered in the wind-blown deserts above and in the shadowed corners of conspiracy forums, now a tangible cold reality that they could touch — and that touched them back with a chill. + +Like lambs led to an altar of alien deities, so did Agents Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera proceed, their movements measured, their senses heightened. The air was still, almost respectful of the gravity of their presence. Their torch beams sliced through the darkness, uncovering steel doors with warnings that spoke of top secrets and mortal dangers. + +Taylor Cruz, stepping firmly into the role of de facto leader, set a brisk pace. "Eyes sharp, people. Comms check, every thirty seconds," Taylor ordered, their voice echoing slightly before being swallowed by the surrounding silence. + +Sam, fiddling with a handheld device aimed at detecting electronic anomalies, offered a murmured "Copy that," their usual buoyancy dimmed by the oppressive atmosphere. + +It was Jordan Hayes who paused at an innocuous looking panel, nondescript amongst the gauntlet of secured doorways. "Mercer, Rivera, come see this," Jordan’s voice was marked with a rare hint of urgency. + +Alex joined Jordan's side, examining the panel which, at a mere glance, seemed just another part of the base's infrastructure. Yet, to the trained eye, it appeared out of place—a facade. + +Jordan explained their reasoning as Sam approached, instinctively understanding the significance of what lay beneath, "This panel is a recent addition — covering something they didn't want found." + +Before Alex could respond, the soft whir of an approaching drone cut through their muffled exchange. Taylor had looped back upon hearing the commotion. "Explanations later. We can't afford to attract..." Cruz’s voice trailed off as the small airborne device came into view, its sensors locked onto the group. + +Sam was the first to react, their tech-savvy mind already steps ahead. "I've got this," they declared, fingers flying over the controls of their own gadgetry to ward off the impending threat. + +The drone lingered, its scan seeming more curious than hostile. But within moments, courtesy of Sam's interference, the little sentinel drifted away, retreating into the shadows as if accepting a silent truce. The crew exhaled, a moment of collective relief palpable in the air. + +Cruz squared their shoulders, clearly ruffled but not conceding any ground. "Move out," they directed, a hint more forceful than before. "And Rivera, keep that trick handy." + +The team pressed onward, the quiet now filled with the soft beeps of regular comms checks, their pace undeterred by the confrontation. Yet, every agent held a renewed sense of wariness, their trust in one another deepening with the knowledge that the base—its technology, its secrets—was alive in a way they hadn't fully anticipated. + +As they converged upon a central hub, the imposing doors to the mainframe room stood ajar — an invitation or a trap, neither option comforting. Without a word, they fortified their resolve and stepped through the threshold, where the dim glow of operational LED lights and the distant hum of machinery hinted at Dulce’s still-beating heart. + +Solemnly, yet unmistakably together, they moved deeper into the heart of the enigma, ready to unmask the lifeforce of Dulce base or confront whatever existential threat lay in wait. It was in that unwavering march towards the unknown that their destinies were forever cemented to the legacy of Operation: Dulce. + +## Chapter 3 + +The thrumming of monitors cast a stark contrast to the rigid silence enveloping the group. Agent Alex Mercer, unfailingly determined on paper, seemed dwarfed by the enormity of the sterile briefing room where Paranormal Military Squad's elite convened. With dulled eyes, he scanned the projectors outlining their impending odyssey into Operation: Dulce. + +\* + +The cooling vents hummed in a monotonous drone, but it was the crackle of the comms system coming to life that cut through the lab’s tension. Dr. Jordan Hayes hovered over a table arrayed with alien technology, their fingers delicately probing the enigmatic circuitry retrieved from the crash site. Agent Alex Mercer watched, admiration blooming in silent solidarity for Jordan's deft touch and unspoken drive. + +Jordan, always composed, only allowed the faintest furrow of concentration to mar their brow. "What we understand about physics..." they muttered, trailing off as they realigned a translucent component. The device emitted a low pulse, causing Jordan to still. "Could be fundamentally changed by this." + +A calculated risk—that's what this was. And for a person of science, a gamble was worth the potential paradigm shift. + +"I’ve been thinking," Alex started, his eyes still fixed on the immediately tangible mystery before them. "About what’s at stake here. Not the mission parameters, but what this means for us—humanity." + +Jordan glanced up, meeting his eyes just long enough to convey the shared enormity of their situation; the career-defining glory and existential dread entwined. "The quest for understanding always comes at a price. We're standing on the precipice of knowledge that could either elevate us or condemn us." + +The charged air between them spiked as Taylor Cruz’s brusque tones sliced through their reverie. "Hayes, Mercer, this isn't philosophy hour. Focus on the task. We need actionable intel, not daydreams." + +With a sound of restrained acknowledgment, Jordan returned their gaze to the device, while Alex clenched his jaw, the buzz of frustration dull against the backdrop of Taylor's authoritarian certainty. It was this competitive undercurrent that kept him alert, the sense that his and Jordan's shared commitment to discovery was an unspoken rebellion against Cruz's narrowing vision of control and order. + +Then Taylor did something unexpected. They paused beside Jordan and, for a moment, observed the device with something akin to reverence. “If this tech can be understood..." Taylor said, their voice quieter, "It could change the game for us. For all of us.” + +The underlying dismissal earlier seemed to falter, replaced by a glimpse of reluctant respect for the gravity of what lay in their hands. Jordan looked up, and for a fleeting heartbeat, their eyes locked with Taylor's, a wordless clash of wills softening into an uneasy truce. + +It was a small transformation, barely perceptible, but one that Alex noted with an inward nod. They had all been brought here by different paths and for different reasons. Yet, beneath the veneer of duty, the enticement of the vast unknown pulled them inexorably together, coalescing their distinct desires into a shared pulse of anticipation. + +Marshaled back to the moment by the blink of lights and whir of machinery, they refocused their efforts, each movement sharpened by the knowledge that beyond understanding the unearthly artifacts, they might be piecing together the future of their species. + +\* + +Amidst the sterility of the briefing room, the liminal space between the facts laid out and the hidden truths, sat Sam Rivera, his demeanor an artful balance of focus and a casual disguise of his razor-sharp talent with technology. Across from him, Alex Mercer lingered in thought, the mental cogs turning as each file on Dulce stirred more than curiosity—it beckoned to a past both honored and burdensome. + +"You've been quiet, Sam," Alex noted, catching the younger man's contemplative gaze. "Your take on these signal inconsistencies?" + +There was a respect in Alex's tone, though a respectful distance remained—a gulf of experience and a hint of protective mentorship that stood between them. Sam nodded, recognizing the space afforded to him, and he couldn't help but feel the weight of expectation pressing upon his shoulders. It wasn't just the mission that was immense, it was the trust being placed in him. + +"The patterns are... off," Sam admitted, hesitant but driven. "If I'm right, what we're looking at isn't random—it's a structured anomaly. We need to be ready for anything." + +Alex's eyes brightened with a subtle approval that crossed the distance like a silent nod. "Good. Keen eyes will keep us ahead—or at least not blindsided," he said, affirming the belief that inscribed Sam's role as more than the tech personnel—he was to be a guiding intellect in the heart of uncertainty. + +Their exchange was cut short by Taylor Cruz's abrupt arrival, his gait brimming with a robust confidence that veiled the sharp undercurrents of his striving nature. "Time to gear up. Dulce waits for no one," Taylor announced, his voice carrying an iron resolve that knew the costs of hesitation—though whether the cost was calculated in human or career terms was an ambiguity he wore like a badge of honor. + +As Sam and Alex nodded in unison, the icy chasm of hierarchy and cryptic protocols seemed momentarily to bridge over with an understanding—this mission was convergence, a nexus point that would challenge each of their motives and strength. + +They filed out of the briefing room, their footsteps synchronized, a rhythm that spoke volumes of the unknown cadence they would soon march to within the base's veins. For Alex Mercer, the link with Sam Rivera, though distant, was now poised with a mutuality ready to be tested; for Taylor Cruz, the initiative pulsed like a heartbeat, anticipation thinly veiled behind a mask of duty. + +In the midst of the descent, they were each alone yet irrevocably joined, stepping closer towards the volatile embrace of Operation: Dulce. + +## Chapter 4 + +The corridors of the Dulce military base were as silent as a tomb and twice as chilling. Alex Mercer walked with a surety that belied his bubbling undercurrents of doubt. The briefing had been definitive, sturdy pillars of facts and protocols, yet as he ventured deeper, the ominous atmosphere gnawed at him—a stark reminder of how much remained unknown. + +Jordan Hayes trailed a few steps behind, their detached exterior breaking for a moment as they caught up to Alex. "What's on your mind?" Jordan asked, their astuteness cutting through the unspoken tension. + +Alex glanced back at them. This place was a puzzle, a treacherous labyrinth where the walls whispered secrets, and among them, he sensed a call to question, to challenge the narrative they'd been sold. "The silence here... It's almost as if the base is waiting for something—or someone." + +"Just stay sharp, Mercer," Jordan cautioned, yet their eyes lingered on the quietude around them, conceiving the same shadow of doubt that unsettled Alex. + +Before they could delve into further discussion, the distinctive click of a safety catch echoed in the hollow space. Both agents turned to find Taylor Cruz standing resolute, primed for combat. Taylor's gaze was scrutinizing and cold, a stark contrast to the growing unease that smoldered silently amongst the rest. + +"Chatter is a liability," Taylor snapped, with a commanding flair that bordered on tyrannical. "We move forward, eyes open, mouths shut." + +Alex felt the tight grip of compliance strangle his gut, a lesson learned under the hard tutelage of rank and order. But here, in the bowels of Dulce, those instincts began to wane, the imperative to adhere now conflicting with the pressing urgency to confront the shadows they were enmeshed in. + +Then, unexpectedly, the lights flickered, a power fluctuation—or a sign? Alex's hand instinctively went to his sidearm, his mindset shifting from soldier to skeptic. The base, with its unyielding coldness, had just given them their first nudge into the realm of the speculative, an invitation to peel back the veneer of reality. + +"We should consider all possibilities," Alex murmured, more to himself than the others, his voice a barely audible breath against the sterile air of the complex. + +Taylor's posture stiffened at the challenge, yet their response was uncharacteristically reserved, notable in its lack of rebuke. "Agreed. For now, keep moving. But stay vigilant." + +A surprise—an echo of agreement from the last person Alex expected it from. And there it was, the glimpse of a wrinkle in the unyielding fabric of command, a hint that perhaps they were all starting to sense the strangeness that permeated this place. + +Progressing with determined steps, the trio moved deeper, silently acknowledging the evolution of their predicament. It was a small yet transformative concession to the unknown forces at play, an acknowledgment from each agent that, despite their disparate goals and ideals, the true nature of the Dulce base was an enigma that would forge new paths through their convictions. + +As they reached the central communications hub, the truth that awaited them lurked in the shadows, its eyes unseen but felt by all. The walls didn't just whisper now; they spoke in tones only the brave—or the foolish—would dare to listen to. + +\* + +The subterranean silence of Dulce was an oppressive entity of its own, wrapping the team in a cloak of uneasiness as they pressed on through the dimly lit corridor. Jordan Hayes found themselves contemplating the ramifications of each step taken into this suspended world, where the sterile air seemed to mock the gravity of their predicament. The closer they got to the communication hub, the more Jordan's mind wandered toward the realm of the inexplicable. + +Beside Jordan, Alex Mercer moved forward with deliberation, his gaze scanning the heavy utility doors they passed—one of which was partially ajar, beckoning them with its darkness. "After you, Dr. Hayes," Alex said, gesturing toward the mysterious opening. A hint of shared understanding passed between them; knowledge was the guiding star of this mission as much as confrontation or recovery. + +Jordan peered inside, the beam from their flashlight slicing through the obscurity. The room beyond was a chaotic cascade of papers, overturned furniture, and the particular kind of disorder born from hasty evacuation—or something far more sinister. + +"It's like they vanished in the middle of something urgent," Alex murmured, his voice tight with a mix of concern and anticipation. He began to sift through the scattered reports, each page a potential clue to the enigmatic silence that shrouded Dulce. + +Behind them, Taylor watched with a disciplined patience, their authority the foundation upon which the operation was built. Their voice cut into the stillness, a reminder of their presence, "Time is not our ally here." + +Drawing back from momentary distraction, Jordan acknowledged the wisdom in Taylor's words, yet could feel the shift in their stance—from skeptical, reserved analyst, to a proactive agent within the narrative. "You're right; these documents may hold critical insights. Let's collect what we can and analyze them properly." + +From the darkened hollows of the room, shadows seemed to cast subtle judgment as Alex and Jordan worked together with heightened urgency. Taylor, for once, didn't intervene but instead surveyed the entrance, their mind anticipating the unknown variables that lay ahead. + +Unexpectedly, a soft hiss emanated from a neglected terminal on the desk. Jordan's head snapped up, their heart rate accelerating at the potential ramifications. Without a word, they moved to the machine, hands driven by the newfound conviction that knowledge was more than power—it was survival. + +As Jordan began to extract what data they could from the terminal, the first comprehensible communication from the depths of Dulce in far too long crackled through: an automated distress marker, looping endlessly without further context. It was a revelation, one that reverberated through the group, confirming their fears and igniting an even greater need to press on. + +Watching Jordan's dogged determination, Alex witnessed the minor transformation in his colleague unfold—a shift from doubt to action, a sliver of belief in the possibilities beyond their rational understanding. This forge of resolve amidst the alien echoes of Dulce not only bonded them closer as a team but compelled them forward with a sharpened edge of responsibility to the truth, wherever it would lead. + +As they collected their findings and regrouped, the base around them imperceptibly changed, the air charged with the vibration of secrets poised on the brink of revelation. And in that charged silence, the group moved on, each now carrying pieces of a puzzle that would soon converge into a picture of galactic significance. + +\* + +In the chill of the cramped server room, the hum of machinery was the backbone to a symphony of data streams coursing through the air. Dr. Jordan Hayes, nerves alight with the mission's mounting unknowns, patched into the last known coordinates of the unsent distress broadcast they had uncovered. They were so close to the core now – to the truth behind the blackout – it was almost tangible. + +Beside them stood Agent Alex Mercer, ever the soldier, yet with eyes that betrayed an intellect craving to understand the murk beneath the surface. "Any progress, Dr. Hayes?" Alex queried, his voice betraying a subtle urgency. + +"Getting there," Jordan replied, fingers dancing across the keyboard. "Whoever sent this was cut off mid-transmission. It's as if Dulce itself swallowed the message whole." + +Taylor Cruz closed in, their frame casting a long shadow over the duo, evoking an almost palpable wall between them and the forward momentum of their mission. "Time is against us," Taylor intoned, more statement than threat. "What we uncover here determines our next course of action." + +Alex acknowledged Taylor with a brisk nod, his stance firm. Yet inwardly, the tightening grip he felt from Taylor's words couldn't throttle the swell of his own investigative instinct. His soldier's obedience had begun to war with the advocate's zeal for unveiling the dark heart of Dulce's secrets. + +And then, the unexpected occurred. The screens flashed in unison, spilling a discordant stream of symbols and images that defied immediate analysis. Jordan's breath caught – this was the response they had been fishing for, an alien communication protocol resonating just at the edge of human comprehension. + +Each member of the team felt it: a shift in the room’s very atmosphere, like a veil being drawn from their perception. Alex and Jordan stood still, absorbed in the bewilderment of contact, while Taylor, despite their authority, hesitated – a minor betrayal that unease was creeping into even their disciplined heart. + +"Thoughts, Rivera?" Taylor rallied, seeking the counsel of Sam Rivera, whose eyes were wide with exhilaration. + +Sam stepped forward, breaking the spell of stillness. "It's like nothing I've ever seen before, but I think I can bridge our systems to communicate," they declared, a wisp of optimism braiding their voice. They set about adapting their gear to transmute the foreign signals into something the team could dissect, their actions a testament to the mentorship and belief instilled in them by Mercer and the team. + +Taylor observed them, a cold calculation behind their facade, as they weighed the worth of this anomaly. It was a crossroad that potentially led to either monumental breakthrough or unprecedented catastrophe. "Once you've established a line, document everything. We can't afford to miss any detail," Taylor ordered, the words sharper than intended. + +The connection was made, and with trembling anticipation, the team listened as the first garbled outputs began to emerge, their very essence promising insights that could alter the course of history. It was an enigmatic dance with the unknown, the pulse of Dulce no longer just a place, but a herald to an alien register the team had yet to decipher. + +Together, they stood at the precipice of understanding, where the faint glow of their monitors cast more than just light – it cast the shadow of burgeoning transformation. It was in this moment, in the grasp of an extraterrestrial tongue, that the team, bound by a hunger for knowledge and the raw edge of survival, found their mission reframed from a search for answers to the articulation of a question humankind had yet to fully ask. + +Silent in their commune with the inexplicable frequency, they realized they were not merely investigators; they had become liaisons on behalf of Earth, interpreters of a cosmic message that could redefine their very existence. The implications loomed large, but now, they would not face them alone – they would face them as a united front, wrought together by the very mysteries that once drove them apart. + +## Chapter 5 + +Dr. Jordan Hayes clutched the edge of the briefing room table, their fingers white-knuckled against the laminate surface, as an array of constellations rotated on the projector—charts and graphs bleeding across the stars. In the dim room, nebulas and dark matter seemed within arm's reach, tangible yet unfathomable. + +Sam Rivera leaned back against the wall, arms crossed, gaze darting between the swirling cosmos and the faces of their companions. A taut line of concentration etched their young features, a mingling of fervent curiosity with the nascent understanding of the high stakes for which they played. + +Jordan's voice broke the profound silence. "The patterns in the signal disruptions sync with none other than zenithal star alignments. It's as if... as if these 'meet and greets' were scheduled, predestined by celestial mechanics." + +The statement hung heavy, daring the occupants of the room to unravel its implications. Alex Mercer, his prior military resolve momentarily suspended, absorbed the hypothesis with a visible hunger. "It's like we're adhering to an appointment we never knew we had," he murmured, his heart a drumbeat in his chest. + +Taylor Cruz snorted—a sound that clattered against the high concepts like a tumbledown shack in a futurist cityscape. Folding their arms, they glanced between the agents, their apprehension clad in the contempt of practicality. "What we need are facts, not mystic conjecture." + +Alex pivoted on his heel, facing Taylor squarely, and his voice found its edge of steel. "This isn't mysticism, Cruz. It's a hypothesis based on observed phenomena as unpredictable as the place we're standing in." + +Taylor's gaze never wavered, yet the slight twitch at the corner of their mouth belied their taut composure. "If there's a semblance of truth to it, then it's critical intel. But remember, we're not astrologers—we're soldiers and scientists." + +Jordan met Taylor’s gaze with a curt nod, accepting the caution even as the crucible of their intellect smoldered with the fervor of cosmic discovery. Their eyes flicked to Sam, whose steady presence and ready tech affirmed a burgeoning dynamic—the makings of a sentinel, standing guard over the threshold of human understanding and cosmic reality. + +With the projector casting pallid light over their features, each agent became a silhouette of purpose, shadows pillared against the backdrop of an endless universe. The story they were embroiled in would soon demand they plunge into darkness to retrieve the light of knowledge—a light that could very well redraw the shape of their world. + +They left the briefing room with a shared silence, each pondering the vast weave of celestial intent and terrestrial response, sensing that the galactic appointment to which they'd unwittingly RSVP’d was more insistent—and more threatening—than any operation they’d faced before. + +\* + +As the Paranormal Military Squad team convened in the heart of the Dulce military complex, an air of bristling expectation clung to the walls of the underground sanctum. Alex Mercer’s brow furrowed while watching his companions—Jordan Hayes, diligently setting up their makeshift lab station, and Sam Rivera meticulously checking the communication relays they had restored. Taylor Cruz observed with hawk-like focus, yet to betray the strain that their command posed on them. + +The gravity of the mission had shifted, deepened; each member of the team felt its pull, tethered to the understanding that they were now part of a larger narrative—a cosmic play with Earth as a stage and the human race unwitting actors. + +Jordan paused, a tension creeping across their shoulders as they aligned the satellite data with the alien message that had been decoded. "The instructions in this message," Jordan started, the timbre of their voice betraying their usual composure. "They're coordinates and... a warning." + +Sam leaned in, their eyes widening behind the glow of their laptop screen. "A warning? Like, ‘stay away from’, or ‘beware of’...?" Their words trailed off, uncertainty a new companion in their lexicon. + +Alex exhaled slowly, his mind racing to connect the dots. "It doesn't matter which," he said, decisive yet contemplative. "What matters is we understand intent. Are we being warned out of concern, or are we stumbling upon a threat?" + +Cruz’s iron-clad facade momentarily cracked, a fleeting glimpse of vulnerability flashing through their eyes. "We need to know if this entails additional risk to the operation," they said, directing their gaze specifically at Alex. "Mercer, I rely on you to keep the team grounded. No one goes off-course." + +Their reminder seemed both a command and a plea—rooted in an understanding that each member of the team now faced the duality of their roles, protectors of earthly secrets and heralds of potentially devastating revelations. + +Sam's fingers stilled mid-type, their task forgotten as they absorbed the weight of the unfolding reality. "We're the first line of defense... or detection," they mused half to themselves, a growing sense of agency within the larger play they were cast into. + +Jordan returned to the data, more resolute in their actions. The warning, whether cautionary or dire, was a beacon they no longer could ignore; its light casting aside shadows of doubt and igniting a collective purpose within the team. + +Alex watched Jordan and Sam, feeling a brotherhood in their shared quest. As Cruz paced, poised on the cusp of decisions that would mark their career and perhaps the fate of many, Alex knew the narrative had changed. They were no longer mere operatives; they had become guardians of a threshold, keepers of a message from a realm beyond stars and stripes. This elevation in their mission could not be shackled by regulations and established protocols—it demanded a new perspective, a new resolve. + +Tension threaded through the dialogue of beeps and static as communications with Washington buzzed in the background. The team stood, a portentous air enveloping them. It was clear that the decisions they made in the ensuing hours could redefine humanity's place in the cosmos or condemn them to ignorance and potential peril. + +Their connection to the stars solidified, the group moved to address the crystallizing warning, shifting from passive recipients to active participants. Mercer’s latter instincts gained precedence— the team’s mandate had evolved, no longer solely to observe and report but to interact and prepare. A metamorphosis had begun, and Operation: Dulce hummed with the newfound frequency of their daring, a tone set not by the earthly hierarchies but by the pulsing symphony of the universe itself. + +\* + +The desert night loomed eerily still as echoes of hidden activity reverberated deep beneath the bleak sands of New Mexico. Diverting his gaze from the array of sensors before him, Jordan Hayes allowed a rare breath, deep and anxious. Turning to Alex Mercer's focused silhouette, the nocturnal landscape illuminated softly by makeshift floodlights, Jordan felt the syncopated tempo of apprehension and exhilaration jockey for primacy within. + +"The closer we get to unlocking these messages, the more I feel like we're peeling back layers of reality itself," Jordan confided, eyes not leaving the monitors that presented a constellation of data points. + +"Yes," Alex replied, his voice steady as he considered the implications of their discovery. "And we have to be ready for whatever we find beneath those layers. Whether it's a breakthrough or a Pandora's Box." + +Silence settled between them, broken only by the occasional buzz of communications equipment attempting to bridge terrestrial and extraterrestrial intelligences. Tense moments drifted by, laden with the expectant weight of near breakthrough, when a soft chime signaled an incoming transmission -- a rare sound that set every agent on high alert. + +Absent was the voice of Washington or Paranormal Military Squad command. Instead, a rhythmic series of pulses and tones filled the air, deliberately patterned, unmistakably non-human. + +Sam Rivera adjusted the sensitivity of the decoding equipment, their hands shaking with anticipation as much as focus. "I have it!" they announced, the signal transforming under their expertise into a sequence of visual symbols on the screen before them. + +Their shared excitement was palpable, a kinetic force resonating between the team members as they crowded around the display. + +"What does it say?" Taylor Cruz demanded, the urgency in his tone scraping against the newfound wonderment. + +Interpreting the alien syntax required not only decoding but intuition and empathy. The words that emerged upon the screen were at once coherent and enigmatic: "*Voyage. Convergence. Peril.*" + +The stark simplicity of the message struck them collectively, a chill breeze wafting through their resolve. + +Alex stepped forward, piecing together the cryptic communication with a growing sense of obligation. "It’s a call to action," he deduced, "or possibly a summons." + +Jordan's gaze met Alex’s, both understanding that this was no longer an investigation or mere extraction of hidden truths. This was humanity's unwitting enlistment into a galactic dialogue that defied boundaries of nation, creed, or protocol. + +Sam's eyes were aglow, not with fear, but with the profound acceptance of inevitability that comes with groundbreaking revelation. Moreover, within Taylor's stern exterior churned the seed of reluctant admiration for the unclassified, the uncharted realms they were approaching. + +Together, they accepted the pivot in their mission, readjusting their objectives from exploration to engagement, and from isolation to a communal outreach beyond the stars. As dawn's first light threatened the horizon, it became clear that they were no longer merely operatives of a clandestine governmental faction—they were delegates on behalf of Earth, embarking on a voyage orchestrated by destinies unrelated to the mere geopolitics of their world. + +Turning to each other, their silhouettes sketched against the coming dawn, the agents recognized the transformation within and amongst them. They were bound by more than duty—they were intricately woven into the fabric of an unfolding cosmic opera, one in which they had been granted an undeniable role. And as they set course for the coordinates that beckoned them like a distant siren's call, it was with a solemn dedication to not only uncover the mysteries ahead but to navigate the convergence, and the peril, as unified emissaries of a world on the cusp of a broader understanding. + +\* + +Beneath the hum of the fluorescent lights and the vigilance of silent monitors, Alex Mercer stood with his team in the threshold of the base's command center, their faces etched with the fatigue of hours spent unraveling galactic mysteries. Jordan Hayes broke the stillness with a delicate fusion of disbelief and resolve. "The signal..." they began, their tone deliberate, "it’s evolving. It’s not just sending a message—it’s responding to us." + +Taylor Cruz leaned over the console, their eyes narrowing with intrigue and a flicker of unease, studying the alternating patterns on the screen. "Responding? Like it’s alive?" Taylor asked, a question that bordered on the edge of wonder and alarm. + +Sam Rivera’s gaze was locked onto their interface, a digital orchestra at their fingertips. "It could be some form of advanced AI. Or something else entirely," they contributed, a note of exhilaration betraying the gravity of the situation. + +Alex paced before the terminal, absorbing the enormity of their predicament. Their mission—once rooted in the solid ground of military discipline and covert operations—had transcended into an encounter of unprecedented import. "We need to be cautious," he advised, his voice a low rumble of cautious strategy. "If this signal is intelligent, how we interact with it could dictate the outcome of this entire operation." + +Jordan met Alex's gaze with a nod, the weight of the responsibility shared and accepted. "We have protocols for first contact, but nothing for... this," Jordan admitted. The room was gripped with tension, each breath seemingly louder than the last. + +Then, with a sudden burst that filled the command center, the signal coalesced into a clear and distinct pattern which replicated and expanded, its complexity revealing the hand—or mind—of an intelligent architect. + +Taylor's instinct for command surged forth. "Prepare to record and analyze. Whatever it is, we need to understand it—" But their words were cut short as the signal surged, enveloping the room in a brief, blinding cascade of light. + +In that pulse of brilliance, a shared revelation coursed through the team. The signal had become a bridge, an extension of unknown consciousness reaching towards them, testing, communicating, searching. + +Alex stepped back from the light, feeling a profound change unravelling within him. The path forward would not be one of confrontation or conquest, but of connection and comprehension. + +Jordan turned to Alex and Taylor, seeing in their faces a reflection of the same metamorphosis taking place within themselves—a movement from observers to participants, from agents to ambassadors. + +With a collective breath, the team faced the kaleidoscope of lights. The alien signal, once a harbinger of enigma, was now a catalyst for transformation—a symphony of light and sound that echoed the beginnings of a new relationship between humanity and the alien unknown. + +And so, with deliberate steps, Alex Mercer led his team into the luminous fray. Science, protocol, and survival instinct harmonized within them, each member poised on the cusp of a new chapter in human history. + +They were no longer merely the instruments of Paranormal Military Squad's will—they were the vanguard of humankind’s first definitive leap into the cosmic community. + +With the last echoes of the signal resonating in the control room, they each embraced the sequencing of the transmission, the dance of extraterrestrial light that now wrote itself into their story. The chapter of Operation: Dulce drew to a close, but the narrative of their destiny had only just begun. + +## Chapter 6 + +\* + +The cool darkness of the command center at Dulce base was a stark contrast to the brewing storm outside, where the unforgiving New Mexico desert winds whispered of the hidden truths that lay buried deep beneath its surface. Dr. Jordan Hayes sat, their eyes fixed on the readout, the frenetic dance of symbols and numbers reflecting off their determined face. They were on the cusp of an epiphany, teetering between the widely accepted laws of physics and the promise of a new cosmic paradigm. + +Alex Mercer watched from across the room, noting the subtle shifts in Jordan’s posture that belied a developing readiness to embrace the unbelievable. “Find something?” Alex’s question, asked with a blend of curiosity and solidarity, bridged the gap between a command and a genuine query among equals. + +Jordan's response was slow, measured against the magnitude of their analysis. “This isn’t random static. It’s a pattern - a repeated sequence phasing in and out but distinctly artificial.” Jordan turned away from the screen, locking eyes with Alex. “This could change everything.” + +Sam Rivera leaned in, their eyes alight with the fires of revelation and a quenchless thirst for understanding. “A pattern means intention. Could it be a message?” + +A figure emerged from the doorway, casting a long shadow into the room - Taylor Cruz. “Intentions can be friendly, or hostile. We shouldn’t forget that,” said Taylor, bringing a dose of their usual pragmatism into the heart of discovery. + +Alex acknowledged Taylor’s caution with a nod, understanding the need to keep their feet grounded even as their spirits soared toward the unknown. “Then let’s be the first to find out which it is." + +The team gathered around the monitors, the soft tapping of Jordan's keystrokes now punctuated by the occasional crackle of Sam's radio equipment. The sound was almost ritualistic, a prelude to humanity’s potential first, knowing foray into a larger universe. + +Jordan’s fingers paused, suspended in mid-air. The signal had evolved, becoming a beacon that somehow felt less alien and more familiar. It was as if the complexities of their message were unfolding into something more accessible, more terrestrial. + +A hushed excitement swept through the room. The transformation suggested an awareness on the part of the unknown senders; a finesse that spoke volumes about their capabilities and perhaps their intentions. + +With the growing realization that they were engaging with an intelligence far exceeding their previous understanding, the team prepared to reach back across the cosmic divide. Prepared or not, they were no longer bystanders in this galactic narrative. They were active correspondents in an exchange that transcended galaxies and welcomed them into an expansive, possibly fraught, interstellar conversation. + +\* + +Inside the cavernous central hub of Dulce military base, Dr. Jordan Hayes stood in near-darkness, surrounded by a nest of cables and monitors that buzzed with silent, cryptic life. Jordan's eyes narrowed to focus on the sequences that danced across the screen—patterns that could unravel the cosmic enigma surrounding them. + +Alex Mercer approached with his characteristic stride, a signal of reliability in the chaos. "Status report, Dr. Hayes?" he inquired, his voice low, almost blending into the soundscape of beeping consoles and swirling fans. + +"We're on the brink of unravelling the signal's origin," Jordan replied, the weight of implications heavy in their tone. "There's intelligence behind it, a thought process alien to our own." + +As if summoned by their analysis, Taylor Cruz approached with authority radiating from every pore. "Understand this, we need to know if it's friend or foe. Don't get wrapped up in the existential—our lives may depend on the answers you provide." + +Sam Rivera, their hands adroitly adjusting a device to fine-tune the signal, chimed in with optimism undercut by anxious anticipation. "We're deciphering the comm encryption. Soon, we'll have a channel open—not just listening in, but speaking back." + +Alex nodded his understanding, his strategic mind processing the tactical implications while grappling with the more profound humanistic impact. "When we do, we'll tread carefully, communicate with purpose," he reassured the team. + +The operation had evolved rapidly, from a stealthy incursion into a clandestine labyrinth to an exchange with an extraterrestrial intellect. Their earlier trepidation transformed into determined focus, as they prepared to extend humanity’s hand into the vast unknown. + +An alert on one of the monitor stations snapped the team into alarm. The signal had not simply been waiting—it had been calculating. Now, it reached its crescendo, demanding their attention with a provocative urgency. + +Jordan's fingers raced over the keyboard, their eyes simultaneously interpreting data and sharing directives. "It’s a linguistic lock, a test of comprehension. We crack this, we establish dialogue." + +Taylor's presence was a beacon of steely resolve. "Then let’s solve it. This is what we trained for—the unknown." + +Alex and Sam exchanged a look that telegraphed their shared determination—this was not only the mission they had trained for; it was the mission they had been destined for. + +Together, the Paranormal Military Squad team leaned into the challenge, their minds honing in on the complex patterns with a singular goal: to unlock the conversation with an intelligence that had already begun to shift the foundations of what they knew, or thought they knew, about the universe. + +In a symphony of clicks and murmurs, they worked, knowing they were about to make a giant leap not just for themselves or Paranormal Military Squad, but for all of humanity. As the final pieces fell into place, Dulce's militaristic silence was shattered by the sound of intergalactic contact—by the sound of history being made. + +## Chapter 7 + +In the enclosed space of Dulce’s command center, the air was thick with anticipation, each team member poised to tread the razor's edge between scientific breakthrough and galactic peril. Dr. Jordan Hayes focused intently on the screen, their fingers tapping a staccato rhythm against the keyboard as lines of alien code cascaded down the monitor. + +Alex Mercer's steely gaze surveyed the room, stopping on each member of his team. "Thoughts?" he asked, echoing the unspoken tension. His question, while directed at the group, lingered on Jordan—acknowledging their expertise and inviting collaboration rather than dictating orders. + +Jordan’s brow furrowed, an indicator of the mental gymnastics being performed. "It's unprecedented," they finally said, their voice a testament to the gravity of the moment. "Behavioral algorithms... if we're right, this code could reveal extraterrestrial thought patterns." + +Before anyone could react, Taylor Cruz interjected with the assertiveness of someone accustomed to commandeering the discourse. "Then let’s ensure we’re deciphering it correctly," Taylor stated, their tone suggesting they were still battling to maintain control over an increasingly alien situation. + +Sam Rivera hovered near the mainframe, youthful energy barely contained under the surface. "What if it’s more than just a message? What if they’re trying to extend consciousness across the stars?" + +The room fell into a contemplative silence, broken only by the hum of electronic equipment and the distant thud of secured doors locking in rhythm. The weight of responsibility rested on each agent's shoulders—a heaviness palpable in the air they shared. + +Alex stepped forward, reaching a subtle decision, one dictated by foresight and the humanity nestled at the core of their mission. "We approach with the aim to understand, not to confront," he said, softening his military bearing into a more diplomatic stance. + +Jordan nodded, appreciating the leadership that Alex displayed in the face of the unknown, and turned back to the cryptic data. Here, before them all, was a tangible piece of evidence—proof of an extraterrestrial sentience that had outreached the bounds of their expectations. + +Taylor took a breath, simultaneously exuding a sense of preparedness and venturing into the unknown alongside their peers. "Then let’s do what Paranormal Military Squad does best—investigate and adapt," Taylor added, finding comfort in the familiar even as they stood on the cusp of an unprecedented alchemy of science and mystery. + +The team leaned into their respective roles, driven by the urgency of the assignment and the pull of an insatiable curiosity. Sam offered a grin that belied the tension, a youthfulness that reminded them all of the profound excitement nested within the terror of the unknown. + +Quietly but resolutely, they turned back to their instruments, each of them a sentinel on the threshold of a new reality. The once implicit lines of command were now woven into a shared tapestry of hierarchy and camaraderie. As they danced with the unknown, they were beacons of sentient endeavor, casting the light of human consciousness into the vast darkness that called to them. + +\* + +\* + +Dulce Base's cavernous darkness was pierced by the sharp luminescence of monitors, casting an electric glow onto the faces of those who dared to unearth its secrets. Dr. Jordan Hayes stood motionless, eyes glazed in concentration, their mind a nexus where terrestrial science battled with celestial unknowns. + +Alex Mercer watched from a slight distance, the weight of command tangible upon his shoulders, though lightened by the shared burden now held amongst them. "We could be on the frontier of a new kind of diplomacy," he mused aloud, giving voice to the moment's gravity. + +At those words, Jordan's trance broke. "If that's the case, then these communications," Jordan motioned to the stream of data, "are our olive branch across the cosmos." + +Taylor Cruz, who paced with restless energy, halted and faced the team—his stoicism marred by the erratic dance of lights reflected in his eyes. "An olive branch, or an invitation to a battlefield?" he posed, ever the strategist, his words laced with a hint of cynicism. + +Sam Rivera, nestled amongst an array of equipment, licked their lips—a mixture of nerves and anticipation palpable. "We're mapping out something incredible here. Whether it's peace or war, we're the cartographers." + +Silence enveloped them like the expanse of space itself, each member contemplating the chasms they might bridge—or the abysses into which they might unwittingly descend. + +Alex's demeanor assumed a quiet resolve—the profound knowledge that this mission was as much about navigating uncharted philosophical territories as it was about ensuring survival. "Whichever it proves to be, we'll face it. Prepared, unified." + +A nod passed between Jordan and Alex, a silent exchange of mutual respect and shared mission. Sam, buoyed by the weighty encounters of the mind and machinery, entered keystrokes with a fervor that seemed to bring them ever closer to the alien mind. + +They stood there, the Paranormal Military Squad team, not just as guardians of homeworld secrets or as soldiers of clandestine wars, but as humankind's chosen few at the fulcrum of history—a history that was now unfolding to the rhythm of otherworldly codes. + +Each revelation, each parsed symbol, inched them toward the line between the earthly and otherworldly. And as they stood on this precipice of cosmic negotiations, it was clear the ensuing dialogue would not just shape the future of Paranormal Military Squad—it could very well redefine the parameters of human existence. + +\* + +The hum of advanced computational systems tingling with cryptic transmissions framed the ambiance of Dulce's mainframe chamber. Jordan Hayes, fingers hovering over a console dense with blinking lights, furrowed their brow as sequences of alien data streamed across the screen. + +Alex materialized behind them, his presence a stable beacon amidst the technological whirlwind. "Look for patterns, anomalies. Anything that might resemble a handshake protocol in their communications," he directed, his voice a low thrum, reverberating with cautious optimism. + +Jordan cast a glance over their shoulder, acknowledging Alex's contribution with the shared understanding of colleagues who had transcended mere professional acquaintance. "I’m isolating sequences that seem to recur with more intention than static. If these are their ‘handshakes,’ then we might just be making first contact," they remarked, their focus returning to the screen with renewed vigor. + +From the other end of the room, where shadows married the artificial light, Sam's voice crackled through the static of nearby speakers, "Don't forget the anomalies we detected earlier. Each one could be a word, a sentence, or even a concept untranslatable to our current understandings." + +Resolute, Taylor Cruz stood at Jordan's other side, a stoic figure wrestling with the implications of their mission. "Keep pursuing this line," Taylor instructed, an undercurrent of intensity carried forth in their otherwise composed demeanor. "And remember, this isn't just about making contact; it's about securing knowledge for humanity." + +Alex offered a nod that spoke volumes, conveying his understanding of the stakes at play. Here, in this chamber of possibility, the team's actions would determine if humanity stood at the brink of a new age of understanding or the onset of an unprecedented threat. + +Every second thrummed with significance as Jordan and Sam worked in tandem, each keystroke a foray into the unknown. Taylor observed with a commander's scrutiny, the gravity of their role sustaining them against the waves of ambiguity breaking against their resolve. + +Pivotal moments come rarely in the course of human events but here, amidst the electronic symphony of a stalwart command center, lay the incepting notes of a cosmic overture. The harmony between human and alien, between Paranormal Military Squad and the vast reaches of space, began its first tentative measures, with each member of the team a vital instrument in a celestial ensemble yet to be fully heard. + +\* + +The crisp air within the mainframe room of Dulce base seemed to hum with unspoken possibilities. Jordan Hayes was the centerpiece of focus, their hands dancing methodically over the console as streams of otherworldly code cascaded down monitors, each flicker a potential key to the cosmic doors they were inching open. + +Alex Mercer watched, posture relaxed but eyes sharp. "Remember, this could be our first introduction, maybe even our first impression," he said, mindful of the gravity carried by each action they made henceforth. + +A hint of a smile touched Jordan's face, a small acknowledgment of the monumental task at hand. "Understood. I'm balancing the signal's syntax with our algorithms. If we're interpreting this correctly, it could be... well, an invitation." + +Into the electric tension of the chamber walked Taylor Cruz, their silhouette a sharp contrast against the cool lighting, radiating a presence that spoke of command and chilly tenacity. "An invitation, or a challenge?” Taylor questioned, the weight of their suspicion casting a different tint on the cascading data. + +Sam Rivera, in a corner arrayed with sophisticated equipment, piped up, their voice a buoyant note amidst the tentative atmosphere. "Either way, it's a connection. One that we're uniquely positioned to navigate," they remarked with an air of optimism threading through the uncertainty. + +Alex channeled the strengths of his team into the core of their approach, his leadership adapting to the contours of an unprecedented scenario. "Cautious and curious," he reflected aloud, shaping a strategy that balanced their thirst for comprehension with the prudence required in addressing the unknown. + +Jordan, hands momentarily at rest, looked up. The signal was more than a sequence of bits and commands—it was a riddle wrapped in the depths of space-time, and they were on the cusp of parsing its meaning. + +Taylor, hardly a step away, nodded in silent agreement. The implications of their findings might very well direct the course of human destiny from this point onward. + +Finding a tempo among themselves, the Dulce team was a confluence of ambition and acumen, each member intuitive to the beats of discovery. The chamber around them held untold stories, secrets coaxed from the stars, that now, led by Paranormal Military Squad's finest, began to unravel. + +The future in those moments was unwritten, a narrative scribed not in the dust of desert confines, but in the potential for interstellar diplomacy and understanding. As they prepared to script humanity's next chapter, the room seemed to pulse with the heartbeat of a story far greater than the sum of its parts. + +## Chapter 8 + +The grit of an earthbound dust storm contrasted sharply with the pristine sterility of the underground command center. Alex Mercer, eyes set with fervent determination, stood over Jordan Hayes, whose fingers danced across the keyboard with rapid purpose. Monitoring the progression of alien code unraveling before them, Mercer spoke with a tempered urgency, "Keep it steady, Jordan. We might be initiating the first true interspecies communication bridge here. It's all about finesse now." + +Taylor Cruz, the embodiment of military precision, surveyed the room with a calculated gaze from their vigil beside an array of glimmering screens. "Remember, these could be delicate negotiations -- or coded threats. Stay sharp," Cruz added, their voice cool as polished steel. + +Jordan, with a silent nod, recognized the gravity of both stances. Gravitating between scientific acuity and diplomatic caution, they replied, "The sequence is aligning—syncing with our comms. It's looking more and more like direct engagement." + +Amid the banks of electronic machinery, the thrumming pulse of an impending interspecies signal exchange, Sam Rivera interjected with a youthful zeal that cut through the weighty atmosphere, "It's not just an exchange. It's a... symphony. It's as if they're teaching us their language through modulation." + +A moment of profound silence swept over the team. The isolation of their location, deep within the top-secret labyrinth of Dulce, became suffused with an almost palpable sense of historical significance. + +"Then our response needs to be equally symphonic," Alex uttered, contemplating the awe-inspiring transmutation of their task from a simple recovery mission to a full-blown cosmic concerto. + +With a renewed sense of wonder tempered by caution, the Paranormal Military Squad team found themselves harmonizing a delicate balance between envoys and interpreters. The long shadow cast by their duty was now illuminated by the brilliant glow of otherworldly dialogue. + +In this carefully orchestrated march towards the unknown, each individual's expertise became critical notes in a larger melody. The narrative of human achievement, so often defined by solitary pursuits, now emerged as a collaborative opus, each member of the team a maestro in their right. + +The protocols of encounters, the mathematics of languages, and the poetics of connection all fused into a singular moment of convergence. The echo of their efforts reverberated back to them, not through the cavernous base's concrete walls, but from light-years away, in the form of a reply, intangible yet infinitely profound. + +\* + +Amidst the hum of the supercomputers and the faint static from the scrambled transmissions, Alex Mercer cast a thoughtful glance across the dimly lit room toward where Dr. Jordan Hayes was methodically adjusting the archaic dials of the decryption machine. "Any progress?" he asked, his tone conveying both impatience and the deep-seated respect born from countless shared challenges. + +Jordan did not look up, their gaze remained locked on the flickering lights that represented a dialogue suspended between worlds. Their fingers ceased their dance, hovering meditatively over the controls. "We might be on the cusp of a breakthrough," Jordan suggested. "The signal... it's evolved. It's reflexive now, responsive in a way that suggests sentience." + +Taylor Cruz's familiar sharp strides approached the two, breaking the rhythm of soft beeps. "Responsive is good, if it means understanding," Taylor said, head tilted as they peered at the encryption data scrolling by. "But remember, comprehension can bring revelation or conflict." + +Sam Rivera’s youthful voice permeated the tension, brimming with an excitement edged by the enormity of what they faced. "If it's truly sentient, we're not just cracking a code; we're learning how to converse with an entirely new form of consciousness," they chimed in, the weight of history not lost on the zealous astrotechnician. + +Alex nodded, his thoughts alighting on potential strategies for navigating the conversation they were cultivating with the unfathomable. "We need to keep that conversation going, echo its patterns, and speak its language," he resolved, knowing the delicate nature of their work merited every ounce of their collective acumen. + +The chamber now was a crucible, forging within it the future narrative of human contact with the unknown. Every signal pulse they sent out was an invitation for understanding, and every echo back a step closer to bridging the cosmic divide. And so, together, they stood - agents in Paranormal Military Squad's clandestine ranks, united by purpose, sculpting humanity’s first sonnets into the void. + +\* + +#### Knowledge graph updates + +- (Jordan Hayes, Interprets, Communications as cosmic diplomacy, Moderate) + +- (Taylor Cruz, Questions, Potential aggressiveness of alien intent, Minor) + +- (Sam Rivera, Expresses, Optimism about forming a connection, Minor) + +- (Alex Mercer, Adopts, Balanced strategy for contact, Moderate) + +- (Paranormal Military Squad team, Navigates, Beats of cosmic discovery, Moderate) + +- (Paranormal Military Squad team, Prepares, To script humanity's interstellar narrative, Major) + +## Chapter 9 + +The sterile silence of Dulce Base's command center was thick with concentration as Alex Mercer surveyed his team, hunched over their respective technological battle stations. Each agent was a weapon against ignorance, their adversary a code from beyond the stars that held secrets to alien thought. + +Dr. Jordan Hayes, whose hands had been steadfastly working the decryption algorithms, paused and looked up at Alex. "We're through the next layer of encryption," Jordan announced, a mixture of pride and gravitas in their tone. "It's communicating. It's... aware." + +A shadow momentarily clouded Alex's determined features—awareness implied so much more than mere intelligence. "Aware and reactive or aware and proactive?" he queried, his experience anticipating the pivotal importance of intention. + +"Unknown at this stage," Taylor Cruz interjected, looking up from a datasheet. "But I urge caution. We tread the line between breakthrough and disaster with each keystroke." + +Sam Rivera, ever the source of technological acumen, added their voice to the conversation. "The signal's adapting every time we interact with it. Like a conversation where both parties are learning each other's language in real time." + +Alex leaned in, rested a hand on Jordan's shoulder—a sign of companionship and an affirmation of trust. "Keep the communication channels open. But let no message, no pulse go unchecked. This could be our Rosetta Stone or our Tower of Babel." + +Silence fell over them, a momentary lull as each member of the team contemplated the historic weight of their task. Yet, it was impregnated with a tangible sense of excitement—a collective energy that thrummed through the air just as palpably as the electric current through the banks of machines surrounding them. + +They continued their work, squaring shoulders against the magnitude of their undertaking. The agents were standing not just at the precipice of a new chapter for Paranormal Military Squad but for all of humanity. For now, they communicated with powerful unknowns, but with each exchange, they were etching the first words of a dialogue that might forever alter humanity's place in the cosmos. + +\* + +\* + +The sterile silence of Dulce Base's command center was thick with concentration as Alex Mercer surveyed his team, hunched over their respective technological battle stations. Each agent was a weapon against ignorance, their adversary a code from beyond the stars that held secrets to alien thought. + +Dr. Jordan Hayes, whose hands had been steadfastly working the decryption algorithms, paused and looked up at Alex. "We're through the next layer of encryption," Jordan announced, a mixture of pride and gravitas in their tone. "It's communicating. It's... aware." + +A shadow momentarily clouded Alex's determined features—awareness implied so much more than mere intelligence. "Aware and reactive or aware and proactive?" he queried, his experience anticipating the pivotal importance of intention. + +"Unknown at this stage," Taylor Cruz interjected, looking up from a datasheet. "But I urge caution. We tread the line between breakthrough and disaster with each keystroke." + +Sam Rivera, ever the source of technological acumen, added their voice to the conversation. "The signal's adapting every time we interact with it. Like a conversation where both parties are learning each other's language in real time." + +Alex leaned in, rested a hand on Jordan's shoulder—a sign of companionship and an affirmation of trust. "Keep the communication channels open. But let no message, no pulse go unchecked. This could be our Rosetta Stone or our Tower of Babel." + +Silence fell over them, a momentary lull as each member of the team contemplated the historic weight of their task. Yet, it was impregnated with a tangible sense of excitement—a collective energy that thrummed through the air just as palpably as the electric current through the banks of machines surrounding them. + +They continued their work, squaring shoulders against the magnitude of their undertaking. The agents were standing not just at the precipice of a new chapter for Paranormal Military Squad but for all of humanity. For now, they communicated with powerful unknowns, but with each exchange, they were etching the first words of a dialogue that might forever alter humanity's place in the cosmos. + +\* + +Alex Mercer's eyes were fixed on the monitors, the reflected light casting an ethereal glow across his stoic face. The room buzzed with tension, a cacophony of low hums and electronic beeps that underscored the historic nature of their actions. He moved to where Dr. Jordan Hayes was immersed in their work, scrutinizing the alien code streaming rapidly down the terminal. + +"Find anything that might look like an entry point or a... digital handshake?" Alex asked, his voice steady, betraying none of the tension gripping his chest. + +Jordan looked up briefly, their expression weary yet intense, "Potentially. It's as if the code is anticipating our input, modifying itself in real-time. I've never seen anything like it." + +From across the room, Taylor Cruz's sharp voice cut through the hum. "Then it's learning or, possibly worse, baiting us. Proceed with extreme caution," they commanded, their firm stance reinforcing the gravity of the situation. + +Sam Rivera, surrounded by a cascade of screens and interfaces, added, "It's almost organic in its complexity. Any minute now, and I might have a way in." + +A slight nod was Alex's immediate response, his mind racing through the potential scenarios. "Everyone, stay alert. This could be the beginning of something profound." His seasoned eyes never left the unfolding drama on the monitors. + +The room fell silent, the air heavy with unspoken questions. Were they mere moments away from unlocking an otherworldly dialogue? Or was it a Pandora's box that, once opened, could not be closed? + +Alex moved closer to the main console, his fingers hovering over the command keys. With the precision of a maestro orchestrating a symphony, he communicated silently with Jordan – respectful of their expertise, aware that the next move could alter the course of human history. + +Jordan met his gaze, nodding sharply, and refocused on the task. The signal seemed to pulse with sentient curiosity, drawing them further into its intricate web. + +A sudden flurry of alerts and the intensifying glow of monitors heralded that they had bridged a technological chasm. The alien intelligence on the other end was no longer a distant enigma – it was an active participant, responding to their digital overtures with an unknown agenda. + +The team's meticulous efforts had led them to a momentous threshold. Beyond lay unprecedented contact – a nexus of curiosity and potential peril. Within the confines of the base, against the backdrop of a silent desert night, the Paranormal Military Squad operatives became mediators of Earth's bid for cosmic relevance, their every action now a gesture in the grand dance of intergalactic relations. + +## Chapter 10 + +The corridors of the Dulce military base, now silent, echoed with a history of whispered conspiracies and furtive movements. But in the command center, a delicate tapestry of light and sound was being woven as the echoes of cosmic dialogue resonated through the high-tech enclave. Dr. Jordan Hayes, now leading the efforts, called out from their workstation, "I’ve isolated the signal's harmonics. It's more than a call; it's a song, an interstellar siren’s call." + +Alex Mercer, steady and resilient in the face of the incomprehensible, acknowledged with a quiet nod, "A song that we need to learn—quickly." His eyes, heavy with responsibility, scanned the room, watching his team work tirelessly at the intersection of science and speculation. + +Sam Rivera, dulled by fatigue yet driven by unshakeable resolve, manipulated a complex array of audio interfaces. "There's a pattern, a repeating motif. It's structured, intentional," they muttered, their revelation a bridge between the known and the unimaginable. + +Taylor Cruz, a figure of central authority, paced the length of the room, their usual unflappable demeanor betraying a rare flicker of apprehension. "We should be wary of the sirens’ call," Taylor interjected, invoking myths of old as a cautionary metaphor. "We don't want to crash upon unseen shores." + +Undeterred, Jordan cast a determined glance at the team. "We navigate by starlight now, not by the limited light of our previous understanding." Their voice was a beacon, charting a course through unchartered realities. + +Every individual was acutely aware that each moment in that room was a conduit to an epochal shift for civilization. The mysterious signals, once distant and alien, had coalesced into complex and harmonious oscillations—beacons of an extraterrestrial intellect inviting Earth to join in a cosmic consortium. + +Silently, Alex approached the mainframe, his trained fingers aligning with the console’s mechanisms. The room watched in collective breathlessness as he set the frequency in motion, an introductory phrase to an otherworldly melody—a symphony that could bind worlds or spell devastation for all they knew. + +In the control room of Dulce, amongst whispered legends and the quiet hum of machines, humanity's ambassadors now stood, stretching their hands into the void, reaching for the hand that would either pull them into the light of new stars or into the maw of darkness between them. + +\* + +Underground, the Dulce facility's command center was awash with frenetic energy, a stark juxtaposition against the silent, decrepit corridors that enveloped them. The air hummed with anticipation as Dr. Jordan Hayes and Alex Mercer hunched over a console. The sterile light from the monitors cast an otherworldly glow upon their faces, now reflecting a mosaic of alien characters rapidly translating across the screen. + +"The patterns are evolving," Jordan murmured, concentration etched into their every feature. "It’s as if our attempts to decrypt have accelerated its learning. It’s adapting to us." + +Alex, who stood steadfast behind Jordan, felt a tinge of uncharted fear quickly quelled by the fire of discovery raging within him. "Keep it up," he urged. "But whatever this is becoming, we need to ensure it remains within our control." + +Taylor Cruz interjected, their voice slicing through the buzz of activity. "Control may be an illusion when facing an intelligence that literally writes its own rules," they stated stoically, casting a watchful eye over the flurry of data. + +"It's like it's learning to communicate," offered Sam Rivera from a nearby interface, their youthful energy boding a mix of awe and anxiety. "This gives ‘talking to strangers’ a whole new meaning." + +Alex surveyed his team—each face a study in concentration, determination, and not a small measure of trepidation. "This might well be our first contact," he acknowledged, "And we need to be ready for whatever answers back." + +Together, they stood on the edge of the unknown, forging humanity’s response to a message from the heavens. The ensuing silence was palpable—a collective introspection about their role in this grand cosmic play, one that could rewrite human history. + +The encrypted dialogue continued to unfold, its intricate patterns showing an almost uncanny anticipation of their investigative strategies. The air turned heavy with the scent of electricity and ambition as they closed in on a pivotal response. + +As the signal’s intelligence—whether artificial or biological—grew more profound, so too did the realization that their mission had morphed from passive observation to active engagement. There was no turning back now. Each agent embraced their part in the delicate dance of an interstellar exchange that could change everything they thought they knew about life, intelligence, and the dark void beyond Earth's atmosphere. + +\* + +The underground halls of Dulce Base, usually buzzing with covert operations, now thrummed with a different kind of energy, an electric mix of fear and fascination. At the heart of the base, in a room shielded from the world’s eyes, Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera huddled around a bank of monitors. Each screen flickered erratically with the alien script that had become the center of their lives—and perhaps the pivot on which humanity’s future would turn. + +Jordan's eyes never wavered from the displays, their expression was one of rapt concentration, interspersed with flashes of revelation. "We're conversing with the stars," they whispered, almost to themselves. The words hung in the air, a testament to the awe-inspiring strangeness of the situation. + +"The language is morphing; changing its structure with every exchange we have," Sam chimed in, enthusiasm tinged with the solemnity of the occasion. "It's like witnessing the birth of a new form of dialogue—one that spans galaxies." + +Taylor, despite the situation's precariousness, maintained an appearance of ironclad composure. "Keep the communication stream secured and monitored. We don't know what we're dealing with yet," they reminded the team, a bastion of protocol amidst uncertainty. + +Alex watched his team expand the parameters of human achievement; their work here would possibly define an era. "This is untrodden territory," he acknowledged, "and in every word we script, in every response we decode, we're drawing a map that others will follow." + +Jordan turned to Alex, a nod acknowledging the shared responsibility of this moment. They had embarked on a new voyage, an odyssey not of the body, but of the intellect and spirit. No longer explorers of the Earthly realm, they had been promoted by circumstance to ambassadors of humanity in a silent and boundless ocean. + +A sudden pulse of energy from the monitors signaled a breakthrough; the language had not only adapted but it seemed to resonate, to harmonize with their attempts at making contact. The alien script now sprawled across the screens didn't just ask to be understood—it invited interpretation, collaboration, maybe even companionship across the cold distances of space. + +As they stood before the precipice of first contact, Paranormal Military Squad's finest became the architects of a symphony meant to echo through the cosmos. But more than architects, they were the first to play the notes of this cosmic composition, daring to believe that on the other end, someone—or something—might be listening, ready to join the chorus. + +\* + +The underground command center of Dulce Base, once pulsing with clandestine operations, now resonated with the charge of an impending cosmic threshold. Encircled by banks of whirring machinery, each monitor flickered erratically with alien script that had occupied center stage in the lives of Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera. + +Jordan's gaze didn’t flit for even a moment from the screens, where indiscernible alien messages ebbed and flowed like the tide. The ciphers and symbols cascaded down as they tweaked the algorithmic sliders. "This sequence here," Jordan began, voice both hushed and heavy, "it’s not just transmitting; it resonates—it's designed to be felt." + +The room took a collective breath, the remarkable implication hanging in the air like a careful revelation. Sam Rivera was the first to respond, their voice alive with ingenuity: "It's a form of communication stretching well beyond words. We need to respond in kind—the whole array of human expression might be at play here." + +Taylor's eyes remained fixed on the figures playing across the data sheets. "If that's the case," Taylor intoned pragmatically, "we must tread carefully. This is no longer just about being heard—it's about being understood." + +Alex watched his team, each a fulcrum of insight and expertise, and felt the solemnity of the role they were about to assume. "Then we'll ensure our message is clear and full. Our humanity is our strength in this dialogue," he declared, the depths of his experience fueling a commanding reassurance. + +The anticipation was palpable as the agents contemplated the vastness of their endeavor. They were not merely probing at the secrets of the planar cosmos—they were negotiating across the starry expanse, extending to distant intelligences the full spectrum of human curiosity and compassion. + +A symphony of beeping consoles orchestrated their next steps as they prepared to articulate their interplanetary overture. The rhythmic tapping of Jordan's keystrokes set the tempo for an undertaking that traversed beyond algorithms and encryption. + +The base withstood time and whispered secrets of its own, but none so grand as this moment of creation—an invitation to the universe that promised to echo through both the echoes of space and the annals of human history. + +## Chapter 11 + +The sterile silence of Dulce Base's command center was thick with concentration as Alex Mercer surveyed his team, hunched over their respective technological battle stations. Each agent was a weapon against ignorance, their adversary a code from beyond the stars that held secrets to alien thought. + +\* + +The thrum of the colossal machinery vibrated through the subterranean facility as Alex Mercer stood amidst the whispers of technology, each carrying voices from worlds apart. He watched as Sam Rivera adjusted a complex array of cosmic translators, their expression a mixture of anticipation and awe. + +"Are we ready, Mercer?" Taylor Cruz asked, the soft glow of the command center consoles reflecting upon their stern face. + +Alex turned towards Taylor, his eyes holding a depth that betrayed the enormity of the threshold they were about to cross. "This is it," he said. "Initiate the protocol. It's time we answer the cosmos." + +Jordan Hayes, stationed at the mainframe, typed rhythmically, a blue hue painting their focused features. The eerie silence that had settled over the team was interrupted by a visceral sound—humankind's response to the alien dialogue, now streaming into the abyss. + +The control room, once a fortress of solitude, erupted into an oasis of life. Lights flickered in tandem, echoing the symphony of interstellar communication. They stood together at the edge of discovery, facing the symmetry and discord of a universe unknown. + +"If we're right, we've just become Earth's first emissaries to a celestial congress we're only beginning to comprehend," Jordan's voice was somber, resonating with a mix of trepidation and honor. + +The room filled with the resonance of human and alien minds converging, creating a new narrative within the fathomless expanse of existence. Paranormal Military Squad, once protectors of Earth's clandestine secrets, had now become the tether linking humanity to the cosmic fold. + +\* + +The underground command center of Dulce Base, once pulsing with covert operations, now resonated with the charge of an impending cosmic threshold. Encircled by banks of whirring machinery, each monitor flickered erratically with alien script that had occupied center stage in the lives of Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera. + +Jordan's gaze didn’t flit for even a moment from the screens, where indiscernible alien messages ebbed and flowed like the tide. The ciphers and symbols cascaded down as they tweaked the algorithmic sliders. "This sequence here," Jordan began, voice both hushed and heavy, "it’s not just transmitting; it resonates—it's designed to be felt." + +The room took a collective breath, the remarkable implication hanging in the air like a careful revelation. Sam Rivera was the first to respond, their voice alive with ingenuity: "It's a form of communication stretching well beyond words. We need to respond in kind—the whole array of human expression might be at play here." + +Taylor's eyes remained fixed on the figures playing across the data sheets. "If that's the case," Taylor intoned pragmatically, "we must tread carefully. This is no longer just about being heard—it's about being understood." + +Alex watched his team, each a fulcrum of insight and expertise, and felt the solemnity of the role they were about to assume. "Then we'll ensure our message is clear and full. Our humanity is our strength in this dialogue," he declared, the depths of his experience fueling a commanding reassurance. + +The anticipation was palpable as the agents contemplated the vastness of their endeavor. They were not merely probing at the secrets of the planar cosmos—they were negotiating across the starry expanse, extending to distant intelligences the full spectrum of human curiosity and compassion. + +A symphony of beeping consoles orchestrated their next steps as they prepared to articulate their interplanetary overture. The rhythmic tapping of Jordan's keystrokes set the tempo for an undertaking that traversed beyond algorithms and encryption. + +The base withstood time and whispered secrets of its own, but none so grand as this moment of creation—an invitation to the universe that promised to echo through both the echoes of space and the annals of human history. + +## Chapter 12 + +The underground facility of Dulce Base, once shrouded in silence and operational secrecy, now hummed with an energy that cradled the promise of cosmic revelation. Alex Mercer stood pensively by the central terminal, flanked by Dr. Jordan Hayes, Taylor Cruz, and Sam Rivera, each poised at the edge of a history-defining moment. + +Jordan's fingers ghosted across the console, tracing patterns of otherworldly origin. "The signal’s architecture is becoming more complex, resembling aspects of human cognition—recognition, learning, even... empathy?" they postulated with furrowed concern. + +Alex turned his gaze upon Jordan, his voice quiet but resolute, "Empathy could bridge galaxies. Let's harness this connection and proceed with cautious optimism." + +Taylor, ever the sober sentinel, projected a more pragmatic standpoint. "Empathy or not, we are duty-bound to assess the risk to humanity. Every new discovery warrants a measured response." + +The static hiss of communications equipment filled the air, its purpose now transformed into a dialogue with an intelligence beyond the stars. It was Sam, wide-eyed amid the myriad lights and switches, who broke the silence, "We have provisional confirmation of the signal’s intent—initiation. We’re being brought into a broader spectrum of cognizance." + +The chamber lay still for a heartbeat, the Paranormal Military Squad agents steeped in contemplation of the path unfurling before them—a path paved with possibilities of diplomacy or disruption, each step a venture further into the cosmic unknown. + +Alex stepped closer to the viewing monitors, each depicting alien symbols seemingly reaching out from the void. "Initiate the broadcast," he spoke with quiet command. "Our response will mark humanity’s readiness to partake in the wider conversation of conscious beings." + +Amidst the crackling air of expectation, the team wordlessly returned to their stations. They had transcended their roles as protectors of Earth's clandestine lore to become the harbingers of an interstellar parley that could change the existential course of life on their pale blue dot. + +The deep hum of the terminal emitted a signal—a testament to the uncanny reality that Earth was now actively partaking in an exchange not bound by gravity nor the limits of the solar wind. + +Here, in the depths of Dulce, a message from humanity woven from understanding and uncertainty was cast into the firmament, an epitheg of their desire to join the universal dialogue and discover their place among the constellations. + +\* + +The somber depths of the Dulce Base command center stood in stark counterpoint to the animated flurry of activity around the central comms array. Alex Mercer's silhouette loomed behind Dr. Jordan Hayes, who sat with a posture indicating laser focus on the decryption process. A quiet murmur of digital soundscape filled the space, subtly heightened by the anticipation of contact with an intelligence beyond the Earth. + +Jordan's voice was steady, betraying none of the extraordinary nature of their work, "Looking through the signal's pattern, it's evident we’re dealing with a form of intelligence—calculating, mirroring, possibly even understanding." + +Alex's reflection bounced off the darkened screens, his head nodding in silent affirmation. "We’re walking a delicate line. Our response should be thoughtful, measured. We’re ambassadors, not merely explorers." + +Taylor Cruz approached, arms folded, their words slicing through the din of careful keystrokes and soft whirrs, "If there’s even the slightest chance it understands, we can’t afford missteps. The language of the stars might be more absolute than ours." + +From another terminal, Sam Rivera brought youthful vigor to the conversation, "There’s rhythm in these patterns. If this is their way of reaching out, our reply should encapsulate all that we are—all that humanity stands for." + +Looking around at his team, Alex saw resolve etched on every face. The chamber, usually somber and echoing with the quiet steps of covert agents, now felt alive with the heartbeat of discovery. They were not just professionals operating in the gloom; they were a collective standing at the helm of a momentous journey. + +"Let’s begin," he said, returned by the resolve in his voice. "Every second counts." With that, they pressed forward, setting in motion a reply to a conversation billions of years in the making. + +The dance with an unseen partner commenced, each pulse they sent out a step taken with caution and hope. And as those digital pulses journeyed through the black sea of infinity, Earth, for perhaps the first time, joined a pan-galactic dialogue that whispered secrets of the cosmos—secrets that, until now, had been lost in the silent vastness of space. + +\* + +As the team stood in the centralized nerve center of Dulce's underground fortress, the solemn atmosphere was reverent, overseeing systems that engaged with an intelligence from the void. Alex's stance was contemplative as he gazed at Jordan Hayes, who presided over the console, the tension of the moment reaching a tactile fervor. Each rhythmic tap of Hayes's fingers on the keys was a foray into uncharted symphonies of contact. + +Observing Hayes unravel the dense alien encryption, Alex spoke, a diplomatic tenor underpinning his words, "Keep focused on the syntax, dissect its nuances. We're not just decoding signals; we're translating intentions." + +Without diverting from their task, Jordan acknowledged the insight. "Indeed, if their understanding of us is as deep as we hope, we're paving the way for dialogue far beyond our current realm." + +Taylor Cruz, near the rear of the room, provided a steady oversight. "As horizonless as our prospects may seem," Taylor intoned, "remain diligent. Complacency before alien cognition could spell catastrophe." + +Sam's youthful voice resonated with optimism, "Imagine—forming a rapport with a consciousness separate from our reality; we're drafting the bridge to stars alive with minds!" + +The sentiment hung for a moment before Alex gathered his conviction. "Dialogue is our vessel. We are not just agents of enigma; we are the threads that may weave a new cosmic relationship." His words seemed to reflect off the walls, reaching beyond the room's confines, a quiet yet resilient vow. + +Their task was titanic, stepping stones laid delicately into new territories of existence. The signal, once an esoteric strand in the echo of the universe, beckoned now with a clarity rocketing the complexity of thoughts from a distant order. + +Action by action, the Paranormal Military Squad team bridged the vast interstellar distances, their expertise and empathy casting a beacon of unity into frontiers of intelligence and knowledge. Their work, a partnership struck with an unseen cosmic congregation, each pulse sent and received a line in Earth's novitiate envoi to the cosmic shores. + +\* + +Under the stark, unforgiving lights of Dulce Base's underground command center, tension buzzed harder than the banks of supercomputers that lined the walls. Agent Alex Mercer leaned over the shoulder of Jordan Hayes, whose eyes were locked onto the display screen, where an incomprehensible series of alien symbols streamed past incessantly. + +“Any progress on the decryption?” Alex's voice was steady, a controlled presence necessary in the gravity of their undertaking. + +Jordan tapped a key, pausing the flow of code, and leaned back with a deep sigh. "We've broken through another subset of the cipher. It's revealing... well, indications of a complex society, not unlike our own." His eyes met Alex's with an unspoken question that hung heavily between them—were they truly prepared for what they might find? + +Taylor Cruz strode into the room, a tightly coiled spring of ambition and authority, and peered at the screen. "Understand their society, and we may predict behavior. Remain expedient—we don't know how much time we have before the situation shifts." There was an edge of stark realism to Taylor's words, the underlying message clear: every revelation bore its own set of risks. + +Alex nodded thoughtfully, recognizing the validity of Cruz's caution. Turning to Sam, who was tinkering with a device that buzzed quietly on the table, he asked, “Sam, can your contraption get us any further?” + +Sam looked up with a smirk, a twinkle of mischief in their eye. “It’s not just any contraption, it’s potentially a direct line to their thoughts. Give me a moment more, and I'll have something for you.” + +The air ticked with electronic beeps and the rustling sound of the Paranormal Military Squad team at work. They were so close to peering into the intelligence of an alien race—a reality on the brink of dramatically expanding their understanding of the universe. + +The machinery whirred in response to Sam’s precise touches, and suddenly, the room filled with a low hum—something had changed, a signal had been successfully sent. The team held their breath as they listened. The sound that filled the room was unmistakable: a response, an alien voice filtered through the static of space and time. + +Alex exchanged a look of quiet triumph with Jordan. The breakthrough was monumental; they were no longer casting messages into the void but engaged in a dialogue—an exchange that marked the beginning of Operation: Dulce’s true unfolding. This was it, the first steps into an interstellar odyssey that demanded every ounce of their courage and wit. + +## Chapter 13 + +Dr. Jordan Hayes shuffled a stack of papers, their eyes revealing a tinge of skepticism at Taylor Cruz's authoritarian performance. _Protocols_, Jordan thought, _are just the framework, the true challenges we're about to face lie well beyond the boundaries of any protocol._ They cleared their throat before speaking, tone cautious yet firm, "Let's remember, the unknown variables exceed the known. We should remain adaptive." + +A murmur of agreement echoed from Sam Rivera, who leaned forward, lacing their fingers together as if weaving a digital framework in the air before them, "Exactly, adaptability could be the key to interpreting the signal distortions and system malfunctions. We shouldn't discount the… erratic." + +Their words hung like an electric charge in the room, challenging Taylor's position with an inherent truth. Cruz’s jaw tightened almost imperceptibly, but the agent masked it with a small nod, conceding to the omnipresent threat of the unpredictable. + +Alex glanced at Jordan, who never looked back, their gaze fixed instead on a distant point, as if envisioning the immense dark corridors they were soon to navigate in Dulce. Jordan was not one to embrace fantastical theories, but the air of cautious calculation betrayed a mind bracing for confrontation with the inexplicable, an internal battle between the evidence of their research and the calculating skepticism that kept them alive in their field. + +The meeting adjourned with no further comments, the team members quietly retreading the paths to their personal preparations. Alex, trailing slightly behind, observed the others. _The cautious reserve Jordan wears like armor doesn't fool me_, he thought, _their analytical mind sees the patterns I do. And that's worth more than protocol. That's the connection we need to survive this._ + +As the agents dispersed into the labyrinth of the facility, lost in their thoughts and preparations, the base's halogen lights flickered, a brief and unnoticed harbingers of the darkness to come. + +\* + +The gritty, wind-tossed surface of New Mexico, just above the cavernous domain of Dulce Base, offered no shelter from the burgeoning storm—the scouring sands an earthly reminder of chaos theories in motion. Far beneath, a similar maelstrom brewed within the confines of the command center, as Paranormal Military Squad's handpicked squad stood poised for potential enormities of contact. + +Ruffling through printed transmission logs, Jordan Hayes dialed the focus of their analytical prowess onto the emerging pattern of signals crisscrossing between Earth and the unfathomable. "Our responses so far have echoed their complexity, but the real divergence is yet to come," Jordan remarked stoically, the calm belying the mounting surge of adrenaline for the revelation ahead. + +Alex Mercer's figure, a silhouette sharpened by the purpose, loomed at the periphery of the monitors' sickly glow. "Indeed," he assented, "The echoes are the easy part. It will be the introduction of our own, human variable that truly begins our dialogue." + +Taylor Cruz, windowless command center notwithstanding, appeared as though they could feel the tempest above. Their eyes never left the monitors as they unspooled their hard wisdom. "For all our advances, we find ourselves deciphering the swings and nuances of an interstellar pendulum. Predict its arc, and we may preempt the gravity of its message." + +Amidst a chorus of bleeps and static, Sam Rivera's tech-clad hands moved rhythmically, their spirited approach to unruly streams of data bordering an intimate dance with entropy. "Entropy that leads to discovery," Sam mused, responding to Taylor's metaphor. "Each step into the unknown is a step away from precedent." + +Alex, drawing near Jordan, spoke again, his voice now a thread woven through the very fabric of their operations. "Let's be the cartographers of this new territory. Our initial shades of understanding could color the cosmos for generations to come." + +Their gazes fell upon a screen as the latest transmission painted its digital blooms of alien script across the black. This time, the pattern wavered in an almost imperceptible fashion, a modification that whispered of active, alien thought awaiting their next move. A hush enveloped the Paranormal Military Squad ensemble, the gravity of the pathogen undeniable. They were about to issue a reply, one poised to reshape the very concept of humanity's outreach into the cosmos. + +The New Mexico desert's secrets were infamous, its storms a mere prelude to the revelations that the team—united in purpose—would unleash upon the world. The howling winds outside found their counterpart in the newfound resolve within, as Dulce's stalwart guardians readied themselves to send forth humanity's retort to the echoes from beyond. + +\* + +The cavernous control room, deeply entrenched beneath the desolate New Mexico terrain, held the Paranormal Military Squad team in intense focus; an island of calm amid the storm of cosmic dialectics. Dr. Jordan Hayes worked methodically, every keystroke an intricate step in their tenuous cosmic ballet. Suddenly, they paused, a signal pattern resonating from the screen. "This is new; it's...inviting. It’s as if the signal is not just calling to us but weaving its intelligence through ours." + +Alex Mercer scrutinized the shift in data. "A confluence of minds, then. If we're to meet them halfway, Jordan, our reply must be both innovative and discerning," he proposed, a glimmer of profound curiosity behind his authoritative demeanor. + +Taylor Cruz, whose sharp eyes missed nothing, nodded from beside a secondary panel. "Innovative, yes, but also defensive. This interaction is a razor’s edge, and we cannot afford to bleed before the unknown," Taylor reminded them, the metaphor a stark warning of potential dangers. + +Against the backdrop of their conversation, Sam Rivera’s youthful optimism cut through the tension. "If they’re weaving through our intellect, then we've achieved something beyond first contact—we're at the genesis of interstellar symbiosis," they posited with a mix of reverence and excitement. + +Alex returned Sam’s smile with his own, tempered and faint, as he turned back to the task at hand. The magnitude of their mission extended beyond the fabric of the universe, an exploration into the threads that connected sentient beings across the vast expanse. “Let’s reply with our own woven tapestry of thought—delicate, but deliberate.” + +With renewed determination, the room came alive with an undercurrent of anticipation, its occupants charged with the potential of forging an alliance with the cosmos. Paranormal Military Squad's finest were no longer merely soldiers and scientists; they had become pioneers on the vanguard of humanity’s greatest odyssey. + +The New Mexican sands above, impassive to the change brewing underneath, stood as silent sentinels as Earth's emissaries crafted their response. A response that, composed with care and imbued with humanity's essence, reached into the void, connecting with an otherworldly intelligence that awaited their harmony in the cosmic conversation. + +## Chapter 14 + +The command center of Dulce Base lay shrouded in shadows that seemed to claw at the edges of the dimly lit array of screens and consoles. Alex Mercer, focused and unwavering, watched as Dr. Jordan Hayes parsed the latest string of alien signals—a symphony of otherworldly communications that threatened to either enlighten or confound. + +"We’re encountering a paradigm shift with every transmission," Jordan Hayes murmured, the pulsing glow of the monitor painting their features with an almost spectral hue. "This signal... it’s evolving, becoming denser, more sophisticated. As if it's growing alongside us—tandem evolution." + +The air was electric, charged with the raw potential of uncharted discovery and laden with the gravity of existential risk. Taylor Cruz, who always seemed here to mold such gravity into actionable strategies, stepped forward. "We must contain this evolution within parameters we can manage. We cannot be bystanders to an uncontrolled ascent of intelligence." + +Sam Rivera, the youngest of the cohort, worked feverishly at their station. "It's not just intelligence—these signals have rhythm, a kind of music suggesting not just evolution, but a dance! We're being invited to partake in the cosmos's ballet!" they exclaimed, a touch of youthful exuberance breaking through the solemnity. + +Alex turned, facing his team, the stoic mask of command tempered by the perceptible flicker of awe in his gaze. "Let this dance then be our dialogue. We will match their steps with prudent but daring measures—our humanity as our guide." + +In the ensuing hours, the Paranormal Military Squad team forged a rhythm of their own, their collective expertise a beacon piercing through the fog of the unknown. The signal, increasingly intricate and seemingly conscious, now demanded not just observation but participation, an interstellar pas de deux that hummed with the promise and peril of first contact. + +Before them, the communications interface flickered to life with a received transmission—a resonant hum that seemed to vibrate through the very foundations of the base. They had successfully established a back-and-forth with whatever intelligence lay hidden among the stars. Every subsequent note they struck within the cosmic ether would come to define humanity's place within the galactic community—heralds of Earth's grand entrance into a universe far less silent than once perceived. + +\* + +In the concrete belly of Dulce Base, dimly lit by the jagged dance of fluorescent lights above, Sam Rivera perched on the edge of their seat, their eager fingers fluttering across an ancient keyboard. The stark, cold room—reminiscent of a time when covert operations and unspoken dread ruled supreme—now housed a peculiar blend of old-world machinery and sleek, modern interfaces. + +Alex Mercer, standing steadfast like a bridge between the enigmatic past and the unfathomable present, watched on. In his eyes flashed the foreboding excitement of change. "Sam," he started, his voice steadfast, "the patterns in these signals, what do they tell us about the nature of our... guest?" + +Sam's eyes glimmered with something akin to thrill—or was it trepidation? "It's like we're mirroring each other, evolving together through this.. dialogue. Like it knows us, understands us, and it's… learning." + +Jordan Hayes, preoccupied at a nearby console, chimed in without lifting their gaze. "It's a dialogue that transcends mere words, Alex. We're being woven into a narrative far grander than the sum of our known sciences." + +Taylor Cruz, arms crossed, wore the heavy mantle of their skepticism comfortably. "Keep theorizing," they interjected crisply, "but remember the grounding reality of what we are part of here. This contact is a blade that cuts both ways." + +In this cavern of history, voices both human and inhuman whispered secrets to those brave enough to listen. Each member present understood the gravity that pulled at their feet; no longer were they mere mortals shackled to their terrestrial plane. The digital pings and encrypted calls resonated with an implication of a cosmic agenda that would not be ignored. + +Jordan's fingers paused, hovering in hesitation. What ripple might the next keystroke send through the fabric of known existence? It was a step into the ballet of the infinite, where the Paranormal Military Squad team played their part in the waltz of wonders with an audience of stars. + +\* + +## Chapter 15 + +In the clandestine hush of Dulce Base's subterranean command center, the Paranormal Military Squad team had become a crucible for interstellar communication. Dr. Jordan Hayes' gaze lingered on the screen as they navigated through the convolution of alien code. Each character held the potential to unravel a new dimension of contact, and with Sam Rivera's keen interjection, they were crafting humanity's inaugural cosmological discourse. + +Alex Mercer peered over Jordan's shoulder, calculating the implications of every visual nuance that cascaded across the monitor. "Look for consistency—any repeating motifs could signal a willingness to engage. We're drafting history with each exchange," he remarked, aware of the delicate balance between forging a bond and exposing vulnerabilities. + +Taylor Cruz, stoic and enigmatic, observed the interplay from the threshold, a silhouette against the machinery's luminescence. "Remember, while we seek common ground, the foundation we stand upon remains Terra firma. Caution must temper our curiosity," they stated, their voice an anchor amidst the current of excitement. + +The command center buzzed with energy, rivaled only by the tempest overhead that concealed their operation. Sam, with swift dexterity, navigated the communications relay. "Their signals resonate almost musically. It's as if they're composing a symphony, and we've been handed the baton to conduct the next movement," they offered, imbuing the scenario with a blend of scientific adventurism and poetic license. + +Amidst the whirring servers and the occasional flicker of emergency lighting, the essence of their mission transcended mere reconnaissance. They were humanity's elected envoys at the brink of a celestial alliance—or confrontation—with an audience as vast as the universe itself. + +Alex stepped back, his profile etched by the chamber's artificial day. "Then let's ensure our contribution to this symphony harmonizes with theirs. It's time for humanity's voice to rise and be counted among the cosmic ensemble." + +Under his directive, the Paranormal Military Squad team initiated their calculated response, weaving thoughts and theories into a digital overture aimed at the heart of alien intellect. As the digital stream punctured the endless night, each member of this clandestine group was acutely aware of the irrevocable step they undertook—bringing Earth into the pantheon of galactic entities designed to converse among the stars. + +\* + +Clusters of high-tech equipment bathed the Dulce underground command center in an eerie blue light. Sam Rivera's fingers flew across the keyboard, navigating an elaborate network of alien patterns. The very air seemed to pulse with the ebb and flow of cryptic communications reaching across the stars. "I've got something!" Sam's announcement tore through the focus in the room, drawing every pair of eyes to the torrent of symbols unraveling on the screen. + +With the pacing of a seasoned officer gauging the moment before action, Alex Mercer approached, his calm demeanor belying an acute awareness of the precipice on which they now stood. "Define 'something," Alex prompted, reinforcing the need for clarity amidst the extraordinary. + +"It's repeating—a sequence that’s evolved with each interaction, almost as if it's... singing," Sam theorized, the awe in their voice reflecting the potential magnitude of their discovery. + +Jordan Hayes interjected from across the console, their eyes not leaving the display as they absorbed the new data. "A cosmic vocalization, then," they mused, intrigued. "A singularity in the signal that might represent a point of reference for both parties." + +Taylor Cruz, hands clasped behind their back, regarded the unfolding scene, their own calculations etching lines of concern onto their stern visage. "Or a beacon—a homing tune, calling out to something we might not be ready to greet," Taylor offered, voicing the group's unspoken apprehension. + +Alex's eyes locked on the screen, taking in the scope of what they were attempting to interpret. Drawing a deep breath, Alex gave a slight nod. "If this is their song, then let us respond with ours. We've come this far by mirroring their signals, now let's engage in an interstellar duet, and see where the music leads us." + +With the expectation of the significant achieving a crescendo, the members of Paranormal Military Squad huddled over their equipment—sages at the threshold of a potentially world-altering communion. The strange harmonies that reverberated through the command center suggested that their interlocutors were poised, waiting, perhaps even eager, for Earth's chorus to join the symphony. + +As the team initiated their reply, weaving humanity's own intricate melody into the vast cosmic dialogue, they each felt a profound change within—an evolution of purpose. They were not just messengers or investigators; they had become co-composers in a galactic orchestra, with the universe itself as their witness and concert hall. + +With the exchange of harmonious signals crawling through the vacuum of space, the Paranormal Military Squad operatives found themselves part of a bridging of minds—a realization that out there, among the vast arrays of stars and planets, harmony was the true universal language. + +\* + +The dim glow of monitors cast an otherworldly ambiance upon Dulce Base's command center, where Paranormal Military Squad's chosen stood huddled over their instruments, suspended at history's threshold. Codes—alien in origin and nature—were being deciphered by Dr. Jordan Hayes, whose countenance bore the marks of deep concentration. + +Alex Mercer, the bedrock upon which their team's resolve was founded, leaned in with an eagerness tempered by his chain of command. "Jordan, we've invested our expertise into comprehending their patterns, but now we must also endeavor to understand their intent," he urged, his voice bearing the gravitas of their mission's potential consequences. + +At another console, Sam Rivera's youth did not betray their crucial role in the operation. With eyes alight, they mirrored the rapid computing before them. "There's emotion here—complex, profound even. This isn't just the output of a cold machine; it's...sentience," Sam whispered, nearly drowned by the mechanical chorus around them. + +Jordan, without shifting focus from their work, replied, "It's a sentience that—should we succeed here—ushers us into a new era of existence. The cadence of these signals," they tapped the screen with a flourish, "could well be the heartbeat of this new dawn." + +Taylor Cruz paused beside Mercer, their expression unreadable beneath the sterile light. "And as it beats, we must gauge whether its rhythm bodes well for us, or spells our missteps. Courage must not blind us to the hazards intrinsic to such contact," Taylor cautioned, the sentinel within them ever alert. + +Alex nodded, a gesture that carried the weight of responsibility and a silent command: proceed, but with circumspection. They were not merely decoding a message; they were interpreting a dialogue across the celestial divide. + +The room fell into a rhythm akin to a well-conducted ensemble. Each member's expertise proved a critical note in the unfolding symphony. Their actions were now more than mere research or defense; they were the tentative overtures of humankind reaching out to grasp the vast unknown. + +Textures of sound meshed with the light from countless computations, the palpable anticipation of the agents at the edge of discovery cresting with an awareness that their work would reshape future chronicles. And when the response finally came—a signal piercing the deafening silence of uncertainty—all within Dulce's confines understood: the dawn of an interstellar continuum had just begun to break. + +\* + +In the sterile hum and flickering lights of Dulce Base's command center, the Paranormal Military Squad team stood as humanity's vanguard, verging on the brim of an intergalactic abyss. Dr. Jordan Hayes, analytical edges sharp, deciphered extraterrestrial patterns that bled across screens in enigmatic cascades—a daunting mosaic of potential threats and untapped wisdom. + +Agent Alex Mercer, the embodiment of focus and a steadfast nerve, observed the unfolding digital drama with the gravitas due a historic first contact. "Let the data weave its narrative, Jordan," he instructed, a moderate undertone of exhilaration within his command. "It's encoding more than information—it's outlining civilization." + +Jordan absorbed the directive, their gaze unflinching from the screens, feeling the weight of their next move. "The nuances here are extraordinary," they acknowledged. "It paints a picture of a culture steeped in complexities we're only starting to fathom.” + +Taylor Cruz, stoicism personified yet not immune to the situation's gravity, chimed in. "Understand it, but guard against it," they cautioned, bringing a sober prudence to the room. "This culture, however advanced, remains an unknown quantity—an ocean of wonders and darkness with uncertain tides." + +Sam Rivera, a visual contrast with wide eyes and restless hands, represented the other side of the room — intrigue and optimism against the drawn swords of precaution. “Think of it,” they proposed, voice bouncing with a rebellious upbeat timbre, “as the first act of a play written in constellations. We're setting the stage for a galactic narrative.” + +Each team member, in their way, was both actor and scribe in this moment of tense pageantry. Heavy with the presence of risk, the command center had become not just a room of computers and glass panels but a theater for performing the elaborate choreography of contact. + +Bound by resolve and curiosity, they proceeded, each data entry a trembling step onto the cosmic stage. And like all cautious pioneers edging into fertile but unnavigated lands, they understood: as they mapped the heavens, they were simultaneously mapping the furthest reaches of their own existential horizons. + diff --git a/docsite/img/GraphRag-Figure1.jpg b/docsite/img/GraphRag-Figure1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dda8c771f5731a8d8d75050d7149dcbe9e8ea776 GIT binary patch literal 62215 zcmdqIWl$V#6ec>j27(5+8C-(96J&6k!2>~pyF+mKfWQDla2SHSyCo3Z-Q9x+4-m-m z?cLhl+Pbp4clZ9d-F2$Ey1TmG=j~U{dCqhGF8cC*bc2Kn{S8 ziiVDcijIzkj)8%WiTxTI8w(4Y7!M!!^&4U`vNyz}q!iSQv=o#;DpFE94muzcGb#wmQC`}Mfr*8U^YTLDYXCA53JNkR3K|+J>dV^!FV6v}1Zafx zJTmA+S|2bNT#0!@5_2(uvbEhL+Ec$keCBSUSlFa*$jB)enV4Bv+4uzng@i>!<=)9F zC@O)Kb#x(6J$(a13rnky);6|w?jD|A-afv5Vc`*x|3pQ{z>~ftr=+H(XXND<6c!bi zl$O=iH#9aix3sqX=;`h29~c}Oo}QVVn_pO5THe~;+1=Ye_<4AAad~xpb9?vu{^4I- zNC1@o1J-{=_TS(lc)^8?ii(1Y@h>hUWbYS4AwWf==Rqfw(ZcxPO2oh$f=Mi!m|NS8 z1?1EIMPlwYg-r_L-(tM@7utVB_TL9A^nVK3e+Kqna4iFHQIKAK9tr_K3h+=A!}1mR z|G&nJk^#tfE|qgF8L`D$w~*djNFH}>mTdGZU+x`Vw@{{a*<}bWMtp1S$9O+yUIzUZ zp}a83k{1J){r|jA*pZj2_)pDmO|-8AVD4!`HP~qf)IL&MS|XQ=)5P~P^>cwtPsA~D zENn6u35tG(_1t+eEP(&k#(;n$NHCiMro=JcrCw790>}Pop{{F;iZ}KOE<@dBX|d?1 z+opEfHa375WHbEv5f5?25}wz>ansR!V#AW}nisZ|`H# zU2}?T9jZp#EQR#g=r~`)<(&jwld>Lk>Kljl_4YWY3`jFh^hC${{z+o+{h+M6xWuL4 zQv98EaK5g_;goK3b8~XWDBPOdp1>wAMjnk=OZtC{NjuVUcPM~(L^y^OWI(&K*V?uc z{h3B2BZYb0*a|h0n|?zWaY$5K(K{nB4jF(T;GyF{ct+`)hbJg6Bpq+GhEgs zMn9O>MWQt2&Q|OTB+;0y9$l6vG0VEhuHw|CzHx9xw+;$eRUGPfA5gtH)U(IY3xl+` z5G?U~)%45xMucHW#O%aEBMMjJzllW|isX|^U

}6fev|;h}qKZ&=uwJ~u#AaDKnt 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 K&!hQ!;eP-{@pC=^ literal 0 HcmV?d00001 diff --git a/docsite/img/pipeline-running.png b/docsite/img/pipeline-running.png new file mode 100644 index 0000000000000000000000000000000000000000..7522c2a9a72924c44415a16c8628fa4c380ca0fd GIT binary patch literal 96578 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�vd+2FTlu>*C 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 +👉 [GraphRAG Accelerator](https://github.com/Azure-Samples/graphrag-accelerator)
    +👉 [GitHub Repository](https://github.com/microsoft/graphrag) + +

    +Figure 1: LLM-generated knowledge graph built from a private dataset using GPT-4 Turbo. +

    +

    +Figure 1: An LLM-generated knowledge graph built using GPT-4 Turbo. +

    + +GraphRAG is a structured, hierarchical approach to Retrieval Augmented Generation (RAG), as opposed to naive semantic-search +approaches using plain text snippets. The GraphRAG process involves extracting a knowledge graph out of raw text, building a community hierarchy, generating summaries for these communities, and then leveraging these structures when perform RAG-based tasks. + +To learn more about GraphRAG and how it can be used to enhance your LLMs ability to reason about your private data, please visit the [Microsoft Research Blog Post](https://www.microsoft.com/en-us/research/blog/graphrag-unlocking-llm-discovery-on-narrative-private-data/). + +## Solution Accelerator 🚀 + +To quickstart the GraphRAG system we recommend trying the [Solution Accelerator](https://github.com/Azure-Samples/graphrag-accelerator) package. This provides a user-friendly end-to-end experience with Azure resources. + +## Get Started with GraphRAG 🚀 + +To start using GraphRAG, check out the [_Get Started_](posts/get_started) guide. +For a deeper dive into the main sub-systems, please visit the docpages for the [Indexer](posts/index/overview) and [Query](posts/query/overview) packages. + +## GraphRAG vs Baseline RAG 🔍 + +Retrieval-Augmented Generation (RAG) is a technique to improve LLM outputs using real-world information. This technique is an important part of most LLM-based tools and the majority of RAG approaches use vector similarity as the search technique, which we call _Baseline RAG_. GraphRAG uses knowledge graphs to provide substantial improvements in question-and-answer performance when reasoning about complex information. RAG techniques have shown promise in helping LLMs to reason about _private datasets_ - data that the LLM is not trained on and has never seen before, such as an enterprise’s proprietary research, business documents, or communications. _Baseline RAG_ was created to help solve this problem, but we observe situations where baseline RAG performs very poorly. For example: + +- Baseline RAG struggles to connect the dots. This happens when answering a question requires traversing disparate pieces of information through their shared attributes in order to provide new synthesized insights. +- Baseline RAG performs poorly when being asked to holistically understand summarized semantic concepts over large data collections or even singular large documents. + +To address this, the tech community is working to develop methods that extend and enhance RAG. Microsoft Research’s new approach, GraphRAG, uses LLMs to create a knowledge graph based on an input corpus. This graph, along with community summaries and graph machine learning outputs, are used to augment prompts at query time. GraphRAG shows substantial improvement in answering the two classes of questions described above, demonstrating intelligence or mastery that outperforms other approaches previously applied to private datasets. + +## The GraphRAG Process 🤖 + +GraphRAG builds upon our prior [research](https://www.microsoft.com/en-us/worklab/patterns-hidden-inside-the-org-chart) and [tooling](https://github.com/graspologic-org/graspologic) using graph machine learning. The basic steps of the GraphRAG process are as follows: + +### Index + +- Slice up an input corpus into a series of TextUnits, which act as analyzable units for the rest of the process, and provide fine-grained references ino our outputs. +- Extract all entities, relationships, and key claims from the TextUnits using an LLM. +- Perform a hierarchical clustering of the graph using the [Leiden technique](https://arxiv.org/pdf/1810.08473.pdf). To see this visually, check out Figure 1 above. Each circle is an entity (e.g., a person, place, or organization), with the size representing the degree of the entity, and the color representing its community. +- Generate summaries of each community and its constituents from the bottom-up. This aids in holistic understanding of the dataset. + +### Query + +At query time, these structures are used to provide materials for the LLM context window when answering a question. The primary query modes are: + +- [_Global Search_](posts/query/0-global_search) for reasoning about holistic questions about the corpus by leveraging the community summaries. +- [_Local Search_](posts/query/1-local_search) for reasoning about specific entities by fanning-out to their neighbors and associated concepts. + +### Prompt Tuning + +Using _GraphRAG_ with your data out of the box may not yield the best possible results. +We strongly recommend to fine-tune your prompts following the [Prompt Tuning Guide](posts/index/3-prompt_tuning) in our documentation. diff --git a/docsite/nbdocsite_template/conf.json b/docsite/nbdocsite_template/conf.json new file mode 100644 index 00000000..62feba72 --- /dev/null +++ b/docsite/nbdocsite_template/conf.json @@ -0,0 +1,5 @@ +{ + "mimetypes": { + "text/markdown": true + } + } \ No newline at end of file diff --git a/docsite/nbdocsite_template/index.md.j2 b/docsite/nbdocsite_template/index.md.j2 new file mode 100644 index 00000000..46b7b5fa --- /dev/null +++ b/docsite/nbdocsite_template/index.md.j2 @@ -0,0 +1,94 @@ +{% extends 'base/display_priority.j2' %} + + +{%- block header -%} +--- +title: +layout: page +tags: [post, notebook] +--- +{%- endblock header -%} + +{% block in_prompt %} +{% endblock in_prompt %} + +{% block output_prompt %} +{%- endblock output_prompt %} + +{% block input %} +``` +{%- if 'magics_language' in cell.metadata -%} + {{ cell.metadata.magics_language}} +{%- elif 'name' in nb.metadata.get('language_info', {}) -%} + {{ nb.metadata.language_info.name }} +{%- endif %} +{{ cell.source}} +``` +{% endblock input %} + +{% block error %} +{{ super() }} +{% endblock error %} + +{% block traceback_line %} +{{ line | indent | strip_ansi }} +{% endblock traceback_line %} + +{% block execute_result %} + +{% block data_priority scoped %} +{{ super() }} +{% endblock %} +{% endblock execute_result %} + +{% block stream %} +{{ output.text | indent }} +{% endblock stream %} + +{% block data_svg %} + {% if "filenames" in output.metadata %} +![svg]({{ output.metadata.filenames['image/svg+xml'] | path2url }}) + {% else %} +![svg](data:image/svg;base64,{{ output.data['image/svg+xml'] }}) + {% endif %} +{% endblock data_svg %} + +{% block data_png %} + {% if "filenames" in output.metadata %} +![png]({{ output.metadata.filenames['image/png'] | path2url }}) + {% else %} +![png](data:image/png;base64,{{ output.data['image/png'] }}) + {% endif %} +{% endblock data_png %} + +{% block data_jpg %} + {% if "filenames" in output.metadata %} +![jpeg]({{ output.metadata.filenames['image/jpeg'] | path2url }}) + {% else %} +![jpeg](data:image/jpeg;base64,{{ output.data['image/jpeg'] }}) + {% endif %} +{% endblock data_jpg %} + +{% block data_latex %} +{{ output.data['text/latex'] }} +{% endblock data_latex %} + +{% block data_html scoped %} +{{ output.data['text/html'] }} +{% endblock data_html %} + +{% block data_markdown scoped %} +{{ output.data['text/markdown'] }} +{% endblock data_markdown %} + +{% block data_text scoped %} +{{ output.data['text/plain'] | indent }} +{% endblock data_text %} + +{% block markdowncell scoped %} +{{ cell.source }} +{% endblock markdowncell %} + +{% block unknowncell scoped %} +unknown type {{ cell.type }} +{% endblock unknowncell %} \ No newline at end of file diff --git a/docsite/package.json b/docsite/package.json new file mode 100644 index 00000000..4ed4295a --- /dev/null +++ b/docsite/package.json @@ -0,0 +1,18 @@ +{ + "name": "@graphrag/docsite", + "version": "0.0.1", + "private": true, + "scripts": { + "start": "eleventy --serve", + "build": "eleventy && touch _site/.nojekyll", + "build:docs": "yarn build", + "start:docs": "yarn start" + }, + "dependencies": { + "@11ty/eleventy": "^2.0.1", + "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0", + "@kevingimbel/eleventy-plugin-mermaid": "^2.2.1", + "eleventy-plugin-code-clipboard": "^0.1.1", + "markdown-it": "^14.1.0" + } +} diff --git a/docsite/posts/config/custom.md b/docsite/posts/config/custom.md new file mode 100644 index 00000000..c6f051cd --- /dev/null +++ b/docsite/posts/config/custom.md @@ -0,0 +1,168 @@ +--- +title: Custom Configuration Mode +navtitle: Fully Custom Config +layout: page +tags: [post] +date: 2023-01-04 +--- + +The primary configuration sections for Indexing Engine pipelines are described below. Each configuration section can be expressed in Python (for use in Python API mode) as well as YAML, but YAML is show here for brevity. + +Using custom configuration is an advanced use-case. Most users will want to use the [Default Configuration](/posts/config/overview) instead. + +## Indexing Engine Examples + +The [examples](https://github.com/microsoft/graphrag/blob/main/examples/) directory contains several examples of how to use the indexing engine with _custom configuration_. + +Most examples include two different forms of running the pipeline, both are contained in the examples `run.py` + +1. Using mostly the Python API +2. Using mostly the a pipeline configuration file + +To run an example: + +- Run `poetry shell` to activate a virtual environment with the required dependencies. +- Run `PYTHONPATH="$(pwd)" python examples/path_to_example/run.py` from the `root` directory. + +For example to run the single_verb example, you would run the following commands: + +```bash +poetry shell +``` + +```sh +PYTHONPATH="$(pwd)" python examples/single_verb/run.py +``` + +# Configuration Sections + +# > extends + +This configuration allows you to extend a base configuration file or files. + +```yaml +# single base +extends: ../base_config.yml +``` + +```yaml +# multiple bases +extends: + - ../base_config.yml + - ../base_config2.yml +``` + +# > root_dir + +This configuration allows you to set the root directory for the pipeline. All data inputs and outputs are assumed to be relative to this path. + +```yaml +root_dir: /workspace/data_project +``` + +# > storage + +This configuration allows you define the output strategy for the pipeline. + +- `type`: The type of storage to use. Options are `file`, `memory`, and `blob` +- `base_dir` (`type: file` only): The base directory to store the data in. This is relative to the config root. +- `connection_string` (`type: blob` only): The connection string to use for blob storage. +- `container_name` (`type: blob` only): The container to use for blob storage. + +# > cache + +This configuration allows you define the cache strategy for the pipeline. + +- `type`: The type of cache to use. Options are `file` and `memory`, and `blob`. +- `base_dir` (`type: file` only): The base directory to store the cache in. This is relative to the config root. +- `connection_string` (`type: blob` only): The connection string to use for blob storage. +- `container_name` (`type: blob` only): The container to use for blob storage. + +# > reporting + +This configuration allows you define the reporting strategy for the pipeline. Report files are generated artifacts that summarize the performance metrics of the pipeline and emit any error messages. + +- `type`: The type of reporting to use. Options are `file`, `memory`, and `blob` +- `base_dir` (`type: file` only): The base directory to store the reports in. This is relative to the config root. +- `connection_string` (`type: blob` only): The connection string to use for blob storage. +- `container_name` (`type: blob` only): The container to use for blob storage. + +# > workflows + +This configuration section defines the workflow DAG for the pipeline. Here we define an array of workflows and express their inter-dependencies in steps: + +- `name`: The name of the workflow. This is used to reference the workflow in other parts of the config. +- `steps`: The DataShaper steps that this workflow comprises. If a step defines an input in the form of `workflow:`, then it is assumed to have a dependency on the output of that workflow. + +```yaml +workflows: + - name: workflow1 + steps: + - verb: derive + args: + column1: "col1" + column2: "col2" + - name: workflow2 + steps: + - verb: derive + args: + column1: "col1" + column2: "col2" + input: + # dependency established here + source: workflow:workflow1 +``` + +# > input + +- `type`: The type of input to use. Options are `file` or `blob`. +- `file_type`: The file type field discriminates between the different input types. Options are `csv` and `text`. +- `base_dir`: The base directory to read the input files from. This is relative to the config file. +- `file_pattern`: A regex to match the input files. The regex must have named groups for each of the fields in the file_filter. +- `post_process`: A DataShaper workflow definition to apply to the input before executing the primary workflow. +- `source_column` (`type: csv` only): The column containing the source/author of the data +- `text_column` (`type: csv` only): The column containing the text of the data +- `timestamp_column` (`type: csv` only): The column containing the timestamp of the data +- `timestamp_format` (`type: csv` only): The format of the timestamp + +```yaml +input: + type: file + file_type: csv + base_dir: ../data/csv # the directory containing the CSV files, this is relative to the config file + file_pattern: '.*[\/](?P[^\/]+)[\/](?P\d{4})-(?P\d{2})-(?P\d{2})_(?P[^_]+)_\d+\.csv$' # a regex to match the CSV files + # An additional file filter which uses the named groups from the file_pattern to further filter the files + # file_filter: + # # source: (source_filter) + # year: (2023) + # month: (06) + # # day: (22) + source_column: "author" # the column containing the source/author of the data + text_column: "message" # the column containing the text of the data + timestamp_column: "date(yyyyMMddHHmmss)" # optional, the column containing the timestamp of the data + timestamp_format: "%Y%m%d%H%M%S" # optional, the format of the timestamp + post_process: # Optional, set of steps to process the data before going into the workflow + - verb: filter + args: + column: "title", + value: "My document" +``` + +```yaml +input: + type: file + file_type: csv + base_dir: ../data/csv # the directory containing the CSV files, this is relative to the config file + file_pattern: '.*[\/](?P[^\/]+)[\/](?P\d{4})-(?P\d{2})-(?P\d{2})_(?P[^_]+)_\d+\.csv$' # a regex to match the CSV files + # An additional file filter which uses the named groups from the file_pattern to further filter the files + # file_filter: + # # source: (source_filter) + # year: (2023) + # month: (06) + # # day: (22) + post_process: # Optional, set of steps to process the data before going into the workflow + - verb: filter + args: + column: "title", + value: "My document" +``` diff --git a/docsite/posts/config/env_vars.md b/docsite/posts/config/env_vars.md new file mode 100644 index 00000000..a7256ee9 --- /dev/null +++ b/docsite/posts/config/env_vars.md @@ -0,0 +1,217 @@ +--- +title: Default Configuration Mode (using Env Vars) +navtitle: Using Env Vars +tags: [post] +layout: page +date: 2023-01-03 +--- + +## Text-Embeddings Customization + +By default, the GraphRAG indexer will only emit embeddings required for our query methods. However, the model has embeddings defined for all plaintext fields, and these can be generated by setting the `GRAPHRAG_EMBEDDING_TARGET` environment variable to `all`. + +If the embedding target is `all`, and you want to only embed a subset of these fields, you may specify which embeddings to skip using the `GRAPHRAG_EMBEDDING_SKIP` argument described below. + +### Embedded Fields + +- `text_unit.text` +- `document.raw_content` +- `entity.name` +- `entity.description` +- `relationship.description` +- `community.title` +- `community.summary` +- `community.full_content` + +## Input Data + +Our pipeline can ingest .csv or .txt data from an input folder. These files can be nested within subfolders. To configure how input data is handled, what fields are mapped over, and how timestamps are parsed, look for configuration values starting with `GRAPHRAG_INPUT_` below. In general, CSV-based data provides the most customizeability. Each CSV should at least contain a `text` field (which can be mapped with environment variables), but it's helpful if they also have `title`, `timestamp`, and `source` fields. Additional fields can be included as well, which will land as extra fields on the `Document` table. + +## Base LLM Settings + +These are the primary settings for configuring LLM connectivity. + +| Parameter | Required? | Description | Type | Default Value | +| --------------------------- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ----- | ------------- | +| `GRAPHRAG_API_KEY` | **Yes for OpenAI. Optional for AOAI** | The API key. (Note: `OPENAI_API_KEY is also used as a fallback). If not defined when using AOAI, managed identity will be used. | `str` | `None` | +| `GRAPHRAG_API_BASE` | **For AOAI** | The API Base URL | `str` | `None` | +| `GRAPHRAG_API_VERSION` | **For AOAI** | The AOAI API version. | `str` | `None` | +| `GRAPHRAG_API_ORGANIZATION` | | The AOAI organization. | `str` | `None` | +| `GRAPHRAG_API_PROXY` | | The AOAI proxy. | `str` | `None` | + +## Text Generation Settings + +These settings control the text generation model used by the pipeline. Any settings with a fallback will use the base LLM settings, if available. + +| Parameter | Required? | Description | Type | Default Value | +| ------------------------------------------------- | ------------------------ | ------------------------------------------------------------------------------ | ------- | --------------------- | +| `GRAPHRAG_LLM_TYPE` | **For AOAI** | The LLM operation type. Either `openai_chat` or `azure_openai_chat` | `str` | `openai_chat` | +| `GRAPHRAG_LLM_DEPLOYMENT_NAME` | **For AOAI** | The AOAI model deployment name. | `str` | `None` | +| `GRAPHRAG_LLM_API_KEY` | Yes (uses fallback) | The API key. If not defined when using AOAI, managed identity will be used. | `str` | `None` | +| `GRAPHRAG_LLM_API_BASE` | For AOAI (uses fallback) | The API Base URL | `str` | `None` | +| `GRAPHRAG_LLM_API_VERSION` | For AOAI (uses fallback) | The AOAI API version. | `str` | `None` | +| `GRAPHRAG_LLM_API_ORGANIZATION` | For AOAI (uses fallback) | The AOAI organization. | `str` | `None` | +| `GRAPHRAG_LLM_API_PROXY` | | The AOAI proxy. | `str` | `None` | +| `GRAPHRAG_LLM_MODEL` | | The LLM model. | `str` | `gpt-4-turbo-preview` | +| `GRAPHRAG_LLM_MAX_TOKENS` | | The maximum number of tokens. | `int` | `4000` | +| `GRAPHRAG_LLM_REQUEST_TIMEOUT` | | The maximum number of seconds to wait for a response from the chat client. | `int` | `180` | +| `GRAPHRAG_LLM_MODEL_SUPPORTS_JSON` | | Indicates whether the given model supports JSON output mode. `True` to enable. | `str` | `None` | +| `GRAPHRAG_LLM_THREAD_COUNT` | | The number of threads to use for LLM parallelization. | `int` | 50 | +| `GRAPHRAG_LLM_THREAD_STAGGER` | | The time to wait (in seconds) between starting each thread. | `float` | 0.3 | +| `GRAPHRAG_LLM_CONCURRENT_REQUESTS` | | The number of concurrent requests to allow for the embedding client. | `int` | 25 | +| `GRAPHRAG_LLM_TPM` | | The number of tokens per minute to allow for the LLM client. 0 = Bypass | `int` | 0 | +| `GRAPHRAG_LLM_RPM` | | The number of requests per minute to allow for the LLM client. 0 = Bypass | `int` | 0 | +| `GRAPHRAG_LLM_MAX_RETRIES` | | The maximum number of retries to attempt when a request fails. | `int` | 10 | +| `GRAPHRAG_LLM_MAX_RETRY_WAIT` | | The maximum number of seconds to wait between retries. | `int` | 10 | +| `GRAPHRAG_LLM_SLEEP_ON_RATE_LIMIT_RECOMMENDATION` | | Whether to sleep on rate limit recommendation. (Azure Only) | `bool` | `True` | + +## Text Embedding Settings + +These settings control the text embedding model used by the pipeline. Any settings with a fallback will use the base LLM settings, if available. + +| Parameter | Required ? | Description | Type | Default | +| ------------------------------------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------ | +| `GRAPHRAG_EMBEDDING_TYPE` | **For AOAI** | The embedding client to use. Either `openai_embedding` or `azure_openai_embedding` | `str` | `openai_embedding` | +| `GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME` | **For AOAI** | The AOAI deployment name. | `str` | `None` | +| `GRAPHRAG_EMBEDDING_API_KEY` | Yes (uses fallback) | The API key to use for the embedding client. If not defined when using AOAI, managed identity will be used. | `str` | `None` | +| `GRAPHRAG_EMBEDDING_API_BASE` | For AOAI (uses fallback) | The API base URL. | `str` | `None` | +| `GRAPHRAG_EMBEDDING_API_VERSION` | For AOAI (uses fallback) | The AOAI API version to use for the embedding client. | `str` | `None` | +| `GRAPHRAG_EMBEDDING_API_ORGANIZATION` | For AOAI (uses fallback) | The AOAI organization to use for the embedding client. | `str` | `None` | +| `GRAPHRAG_EMBEDDING_API_PROXY` | | The AOAI proxy to use for the embedding client. | `str` | `None` | +| `GRAPHRAG_EMBEDDING_MODEL` | | The model to use for the embedding client. | `str` | `text-embedding-3-small` | +| `GRAPHRAG_EMBEDDING_BATCH_SIZE` | | The number of texts to embed at once. [(Azure limit is 16)](https://learn.microsoft.com/en-us/azure/ai-ce) | `int` | 16 | +| `GRAPHRAG_EMBEDDING_BATCH_MAX_TOKENS` | | The maximum tokens per batch [(Azure limit is 8191)](https://learn.microsoft.com/en-us/azure/ai-services/openai/reference) | `int` | 8191 | +| `GRAPHRAG_EMBEDDING_TARGET` | | The target fields to embed. Either `required` or `all`. | `str` | `required` | +| `GRAPHRAG_EMBEDDING_SKIP` | | A comma-separated list of fields to skip embeddings for . (e.g. 'relationship.description') | `str` | `None` | +| `GRAPHRAG_EMBEDDING_THREAD_COUNT` | | The number of threads to use for parallelization for embeddings. | `int` | | +| `GRAPHRAG_EMBEDDING_THREAD_STAGGER` | | The time to wait (in seconds) between starting each thread for embeddings. | `float` | 50 | +| `GRAPHRAG_EMBEDDING_CONCURRENT_REQUESTS` | | The number of concurrent requests to allow for the embedding client. | `int` | 25 | +| `GRAPHRAG_EMBEDDING_TPM` | | The number of tokens per minute to allow for the embedding client. 0 = Bypass | `int` | 0 | +| `GRAPHRAG_EMBEDDING_RPM` | | The number of requests per minute to allow for the embedding client. 0 = Bypass | `int` | 0 | +| `GRAPHRAG_EMBEDDING_MAX_RETRIES` | | The maximum number of retries to attempt when a request fails. | `int` | 10 | +| `GRAPHRAG_EMBEDDING_MAX_RETRY_WAIT` | | The maximum number of seconds to wait between retries. | `int` | 10 | +| `GRAPHRAG_EMBEDDING_TARGET` | | The target fields to embed. Either `required` or `all`. | `str` | `required` | +| `GRAPHRAG_EMBEDDING_SLEEP_ON_RATE_LIMIT_RECOMMENDATION` | | Whether to sleep on rate limit recommendation. (Azure Only) | `bool` | `True` | + +## Input Settings + +These settings control the data input used by the pipeline. Any settings with a fallback will use the base LLM settings, if available. + +### Plaintext Input Data (`GRAPHRAG_INPUT_FILE_TYPE`=text) + +| Parameter | Description | Type | Required or Optional | Default | +| ----------------------------- | --------------------------------------------------------------------------------- | ----- | -------------------- | ---------- | +| `GRAPHRAG_INPUT_FILE_PATTERN` | The file pattern regexp to use when reading input files from the input directory. | `str` | optional | `.*\.txt$` | + +### CSV Input Data (`GRAPHRAG_INPUT_FILE_TYPE`=csv) + +| Parameter | Description | Type | Required or Optional | Default | +| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----- | -------------------- | ---------- | +| `GRAPHRAG_INPUT_TYPE` | The input storage type to use when reading files. (`file` or `blob`) | `str` | optional | `file` | +| `GRAPHRAG_INPUT_FILE_PATTERN` | The file pattern regexp to use when reading input files from the input directory. | `str` | optional | `.*\.txt$` | +| `GRAPHRAG_INPUT_SOURCE_COLUMN` | The 'source' column to use when reading CSV input files. | `str` | optional | `source` | +| `GRAPHRAG_INPUT_TIMESTAMP_COLUMN` | The 'timestamp' column to use when reading CSV input files. | `str` | optional | `None` | +| `GRAPHRAG_INPUT_TIMESTAMP_FORMAT` | The timestamp format to use when parsing timestamps in the timestamp column. | `str` | optional | `None` | +| `GRAPHRAG_INPUT_TEXT_COLUMN` | The 'text' column to use when reading CSV input files. | `str` | optional | `text` | +| `GRAPHRAG_INPUT_DOCUMENT_ATTRIBUTE_COLUMNS` | A list of CSV columns, comma-separated, to incorporate as document fields. | `str` | optional | `id` | +| `GRAPHRAG_INPUT_TITLE_COLUMN` | The 'title' column to use when reading CSV input files. | `str` | optional | `title` | +| `GRAPHRAG_INPUT_STORAGE_ACCOUNT_BLOB_URL` | The Azure Storage blob endpoint to use when in `blob` mode and using managed identity. Will have the format `https://.blob.core.windows.net` | `str` | optional | `None` | +| `GRAPHRAG_INPUT_CONNECTION_STRING` | The connection string to use when reading CSV input files from Azure Blob Storage. | `str` | optional | `None` | +| `GRAPHRAG_INPUT_CONTAINER_NAME` | The container name to use when reading CSV input files from Azure Blob Storage. | `str` | optional | `None` | +| `GRAPHRAG_INPUT_BASE_DIR` | The base directory to read input files from. | `str` | optional | `None` | + +## Data Mapping Settings + +| Parameter | Description | Type | Required or Optional | Default | +| -------------------------- | -------------------------------------------------------- | ----- | -------------------- | ------- | +| `GRAPHRAG_INPUT_FILE_TYPE` | The type of input data, `csv` or `text` | `str` | optional | `text` | +| `GRAPHRAG_INPUT_ENCODING` | The encoding to apply when reading CSV/text input files. | `str` | optional | `utf-8` | + +## Data Chunking + +| Parameter | Description | Type | Required or Optional | Default | +| --------------------------- | ------------------------------------------------------------------------------------------- | ----- | -------------------- | ------- | +| `GRAPHRAG_CHUNK_SIZE` | The chunk size in tokens for text-chunk analysis windows. | `str` | optional | 300 | +| `GRAPHRAG_CHUNK_OVERLAP` | The chunk overlap in tokens for text-chunk analysis windows. | `str` | optional | 100 | +| `GRAPHRAG_CHUNK_BY_COLUMNS` | A comma-separated list of document attributes to groupby when performing TextUnit chunking. | `str` | optional | `id` | + +## Prompting Overrides + +| Parameter | Description | Type | Required or Optional | Default | +| --------------------------------------------- | ------------------------------------------------------------------------------------------ | -------- | -------------------- | ---------------------------------------------------------------- | +| `GRAPHRAG_ENTITY_EXTRACTION_PROMPT_FILE` | The path (relative to the root) of an entity extraction prompt template text file. | `str` | optional | `None` | +| `GRAPHRAG_ENTITY_EXTRACTION_MAX_GLEANINGS` | The maximum number of redrives (gleanings) to invoke when extracting entities in a loop. | `int` | optional | 0 | +| `GRAPHRAG_ENTITY_EXTRACTION_ENTITY_TYPES` | A comma-separated list of entity types to extract. | `str` | optional | `organization,person,event,geo` | +| `GRAPHRAG_SUMMARIZE_DESCRIPTIONS_PROMPT_FILE` | The path (relative to the root) of an description summarization prompt template text file. | `str` | optional | `None` | +| `GRAPHRAG_SUMMARIZE_DESCRIPTIONS_MAX_LENGTH` | The maximum number of tokens to generate per description summarization. | `int` | optional | 500 | +| `GRAPHRAG_CLAIM_EXTRACTION_ENABLED` | Whether claim extraction is enabled for this pipeline. | `bool` | optional | `False` | +| `GRAPHRAG_CLAIM_EXTRACTION_DESCRIPTION` | The claim_description prompting argument to utilize. | `string` | optional | "Any claims or facts that could be relevant to threat analysis." | +| `GRAPHRAG_CLAIM_EXTRACTION_PROMPT_FILE` | The claim extraction prompt to utilize. | `string` | optional | `None` | +| `GRAPHRAG_CLAIM_EXTRACTION_MAX_GLEANINGS` | The maximum number of redrives (gleanings) to invoke when extracting claims in a loop. | `int` | optional | 0 | +| `GRAPHRAG_COMMUNITY_REPORT_PROMPT_FILE` | The community report extraction prompt to utilize. | `string` | optional | `None` | +| `GRAPHRAG_COMMUNITY_REPORT_MAX_LENGTH` | The maximum number of tokens to generate per community report. | `int` | optional | 1500 | + +## Storage + +This section controls the storage mechanism used by the pipeline used for emitting output tables. + +| Parameter | Description | Type | Required or Optional | Default | +| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----- | -------------------- | ------- | +| `GRAPHRAG_STORAGE_TYPE` | The type of reporter to use. Options are `file`, `memory`, or `blob` | `str` | optional | `file` | +| `GRAPHRAG_STORAGE_STORAGE_ACCOUNT_BLOB_URL` | The Azure Storage blob endpoint to use when in `blob` mode and using managed identity. Will have the format `https://.blob.core.windows.net` | `str` | optional | None | +| `GRAPHRAG_STORAGE_CONNECTION_STRING` | The Azure Storage connection string to use when in `blob` mode. | `str` | optional | None | +| `GRAPHRAG_STORAGE_CONTAINER_NAME` | The Azure Storage container name to use when in `blob` mode. | `str` | optional | None | +| `GRAPHRAG_STORAGE_BASE_DIR` | The base path to data outputs outputs. | `str` | optional | None | + +## Cache + +This section controls the cache mechanism used by the pipeline. This is used to cache LLM invocation results. + +| Parameter | Description | Type | Required or Optional | Default | +| ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----- | -------------------- | ------- | +| `GRAPHRAG_CACHE_TYPE` | The type of cache to use. Options are `file`, `memory`, `none` or `blob` | `str` | optional | `file` | +| `GRAPHRAG_CACHE_STORAGE_ACCOUNT_BLOB_URL` | The Azure Storage blob endpoint to use when in `blob` mode and using managed identity. Will have the format `https://.blob.core.windows.net` | `str` | optional | None | +| `GRAPHRAG_CACHE_CONNECTION_STRING` | The Azure Storage connection string to use when in `blob` mode. | `str` | optional | None | +| `GRAPHRAG_CACHE_CONTAINER_NAME` | The Azure Storage container name to use when in `blob` mode. | `str` | optional | None | +| `GRAPHRAG_CACHE_BASE_DIR` | The base path to the reporting outputs. | `str` | optional | None | + +## Reporting + +This section controls the reporting mechanism used by the pipeline, for common events and error messages. The default is to write reports to a file in the output directory. However, you can also choose to write reports to the console or to an Azure Blob Storage container. + +| Parameter | Description | Type | Required or Optional | Default | +| --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----- | -------------------- | ------- | +| `GRAPHRAG_REPORTING_TYPE` | The type of reporter to use. Options are `file`, `console`, or `blob` | `str` | optional | `file` | +| `GRAPHRAG_REPORTING_STORAGE_ACCOUNT_BLOB_URL` | The Azure Storage blob endpoint to use when in `blob` mode and using managed identity. Will have the format `https://.blob.core.windows.net` | `str` | optional | None | +| `GRAPHRAG_REPORTING_CONNECTION_STRING` | The Azure Storage connection string to use when in `blob` mode. | `str` | optional | None | +| `GRAPHRAG_REPORTING_CONTAINER_NAME` | The Azure Storage container name to use when in `blob` mode. | `str` | optional | None | +| `GRAPHRAG_REPORTING_BASE_DIR` | The base path to the reporting outputs. | `str` | optional | None | + +## Node2Vec Parameters + +| Parameter | Description | Type | Required or Optional | Default | +| ------------------------------- | ---------------------------------------- | ------ | -------------------- | ------- | +| `GRAPHRAG_NODE2VEC_ENABLED` | Whether to enable Node2Vec | `bool` | optional | False | +| `GRAPHRAG_NODE2VEC_NUM_WALKS` | The Node2Vec number of walks to perform | `int` | optional | 10 | +| `GRAPHRAG_NODE2VEC_WALK_LENGTH` | The Node2Vec walk length | `int` | optional | 40 | +| `GRAPHRAG_NODE2VEC_WINDOW_SIZE` | The Node2Vec window size | `int` | optional | 2 | +| `GRAPHRAG_NODE2VEC_ITERATIONS` | The number of iterations to run node2vec | `int` | optional | 3 | +| `GRAPHRAG_NODE2VEC_RANDOM_SEED` | The random seed to use for node2vec | `int` | optional | 597832 | + +## Data Snapshotting + +| Parameter | Description | Type | Required or Optional | Default | +| ----------------------------------- | ------------------------------------------- | ------ | -------------------- | ------- | +| `GRAPHRAG_SNAPSHOT_GRAPHML` | Whether to enable GraphML snapshots. | `bool` | optional | False | +| `GRAPHRAG_SNAPSHOT_RAW_ENTITIES` | Whether to enable raw entity snapshots. | `bool` | optional | False | +| `GRAPHRAG_SNAPSHOT_TOP_LEVEL_NODES` | Whether to enable top-level node snapshots. | `bool` | optional | False | + +# Miscellaneous Settings + +| Parameter | Description | Type | Required or Optional | Default | +| --------------------------- | --------------------------------------------------------------------- | ------ | -------------------- | ------------- | +| `GRAPHRAG_ASYNC_MODE` | Which async mode to use. Either `asyncio` or `threaded`. | `str` | optional | `asyncio` | +| `GRAPHRAG_ENCODING_MODEL` | The text encoding model, used in tiktoken, to encode text. | `str` | optional | `cl100k_base` | +| `GRAPHRAG_MAX_CLUSTER_SIZE` | The maximum number of entities to include in a single Leiden cluster. | `int` | optional | 10 | +| `GRAPHRAG_SKIP_WORKFLOWS` | A comma-separated list of workflow names to skip. | `str` | optional | `None` | +| `GRAPHRAG_UMAP_ENABLED` | Whether to enable UMAP layouts | `bool` | optional | False | diff --git a/docsite/posts/config/init.md b/docsite/posts/config/init.md new file mode 100644 index 00000000..afaa5712 --- /dev/null +++ b/docsite/posts/config/init.md @@ -0,0 +1,38 @@ +--- +title: Configuring GraphRAG Indexing +navtitle: Init Command +tags: [post] +layout: page +date: 2023-01-03 +--- + +To start using GraphRAG, you need to configure the system. The `init` command is the easiest way to get started. It will create a `.env` and `settings.yaml` files in the specified directory with the necessary configuration settings. It will also output the default LLM prompts used by GraphRAG. + +## Usage + +```sh +python -m graphrag.index [--init] [--root PATH] +``` + +## Options + +- `--init` - Initialize the directory with the necessary configuration files. +- `--root PATH` - The root directory to initialize. Default is the current directory. + +## Example + +```sh +python -m graphrag.index --init --root ./ragtest +``` + +## Output + +The `init` command will create the following files in the specified directory: + +- `settings.yaml` - The configuration settings file. This file contains the configuration settings for GraphRAG. +- `.env` - The environment variables file. These are referenced in the `settings.yaml` file. +- `prompts/` - The LLM prompts folder. This contains the default prompts used by GraphRAG, you can modify them or run the [Auto Prompt Tuning](/posts/prompt_tuning/auto_prompt_tuning) command to generate new prompts adapted to your data. + +## Next Steps + +After initializing your workspace, you can either run the [Prompt Tuning](/posts/prompt_tuning/auto_prompt_tuning) command to adapt the prompts to your data or even start running the [Indexing Pipeline](/posts/index/overview) to index your data. For more information on configuring GraphRAG, see the [Configuration](/posts/config/overview) documentation. diff --git a/docsite/posts/config/json_yaml.md b/docsite/posts/config/json_yaml.md new file mode 100644 index 00000000..a9bb4464 --- /dev/null +++ b/docsite/posts/config/json_yaml.md @@ -0,0 +1,221 @@ +--- +title: Default Configuration Mode (using JSON/YAML) +navtitle: Using JSON or YAML +tags: [post] +layout: page +date: 2023-01-03 +--- + +The default configuration mode may be configured by using a `config.json` or `config.yml` file in the data project root. If a `.env` file is present along with this config file, then it will be loaded, and the environment variables defined therein will be available for token replacements in your configuration document using `${ENV_VAR}` syntax. + +For example: + +``` +# .env +API_KEY=some_api_key + +# config.json +{ + "llm": { + "api_key": "${API_KEY}" + } +} +``` + +# Config Sections + +## input + +### Fields + +- `type` **file|blob** - The input type to use. Default=`file` +- `file_type` **text|csv** - The type of input data to load. Either `text` or `csv`. Default is `text` +- `file_encoding` **str** - The encoding of the input file. Default is `utf-8` +- `file_pattern` **str** - A regex to match input files. Default is `.*\.csv$` if in csv mode and `.*\.txt$` if in text mode. +- `source_column` **str** - (CSV Mode Only) The source column name. +- `timestamp_column` **str** - (CSV Mode Only) The timestamp column name. +- `timestamp_format` **str** - (CSV Mode Only) The source format. +- `text_column` **str** - (CSV Mode Only) The text column name. +- `title_column` **str** - (CSV Mode Only) The title column name. +- `document_attribute_columns` **list[str]** - (CSV Mode Only) The additional document attributes to include. +- `connection_string` **str** - (blob only) The Azure Storage connection string. +- `container_name` **str** - (blob only) The Azure Storage container name. +- `base_dir` **str** - The base directory to read input from, relative to the root. +- `storage_account_blob_url` **str** - The storage account blob URL to use. + +## llm + +This is the base LLM configuration section. Other steps may override this configuration with their own LLM configuration. + +### Fields + +- `api_key` **str** - The OpenAI API key to use. +- `type` **openai_chat|azure_openai_chat|openai_embedding|azure_openai_embedding** - The type of LLM to use. +- `model` **str** - The model name. +- `max_tokens` **int** - The maximum number of output tokens. +- `request_timeout` **float** - The per-request timeout. +- `api_base` **str** - The API base url to use. +- `api_version` **str** - The API version +- `organization` **str** - The client organization. +- `proxy` **str** - The proxy URL to use. +- `cognitive_services_endpoint` **str** - The url endpoint for cognitive services. +- `deployment_name` **str** - The deployment name to use (Azure). +- `model_supports_json` **bool** - Whether the model supports JSON-mode output. +- `tokens_per_minute` **int** - Set a leaky-bucket throttle on tokens-per-minute. +- `requests_per_minute` **int** - Set a leaky-bucket throttle on requests-per-minute. +- `max_retries` **int** - The maximum number of retries to use. +- `max_retry_wait` **float** - The maximum backoff time. +- `sleep_on_rate_limit_recommendation` **bool** - Whether to adhere to sleep recommendations (Azure). +- `concurrent_requests` **int** The number of open requests to allow at once. + +## parallelization + +### Fields + +- `stagger` **float** - The threading stagger value. +- `num_threads` **int** - The maximum number of work threads. + +## async_mode + +**asyncio|threaded** The async mode to use. Either `asyncio` or `threaded. + +## embeddings + +### Fields + +- `llm` (see LLM top-level config) +- `parallelization` (see Parallelization top-level config) +- `async_mode` (see Async Mode top-level config) +- `batch_size` **int** - The maximum batch size to use. +- `batch_max_tokens` **int** - The maximum batch #-tokens. +- `target` **required|all** - Determines which set of embeddings to emit. +- `skip` **list[str]** - Which embeddings to skip. +- `strategy` **dict** - Fully override the text-embedding strategy. + +## chunks + +### Fields + +- `size` **int** - The max chunk size in tokens. +- `overlap` **int** - The chunk overlap in tokens. +- `group_by_columns` **list[str]** - group documents by fields before chunking. +- `strategy` **dict** - Fully override the chunking strategy. + +## cache + +### Fields + +- `type` **file|memory|none|blob** - The cache type to use. Default=`file` +- `connection_string` **str** - (blob only) The Azure Storage connection string. +- `container_name` **str** - (blob only) The Azure Storage container name. +- `base_dir` **str** - The base directory to write cache to, relative to the root. +- `storage_account_blob_url` **str** - The storage account blob URL to use. + +## storage + +### Fields + +- `type` **file|memory|blob** - The storage type to use. Default=`file` +- `connection_string` **str** - (blob only) The Azure Storage connection string. +- `container_name` **str** - (blob only) The Azure Storage container name. +- `base_dir` **str** - The base directory to write reports to, relative to the root. +- `storage_account_blob_url` **str** - The storage account blob URL to use. + +## reporting + +### Fields + +- `type` **file|console|blob** - The reporting type to use. Default=`file` +- `connection_string` **str** - (blob only) The Azure Storage connection string. +- `container_name` **str** - (blob only) The Azure Storage container name. +- `base_dir` **str** - The base directory to write reports to, relative to the root. +- `storage_account_blob_url` **str** - The storage account blob URL to use. + +## entity_extraction + +### Fields + +- `llm` (see LLM top-level config) +- `parallelization` (see Parallelization top-level config) +- `async_mode` (see Async Mode top-level config) +- `prompt` **str** - The prompt file to use. +- `entity_types` **list[str]** - The entity types to identify. +- `max_gleanings` **int** - The maximum number of gleaning cycles to use. +- `strategy` **dict** - Fully override the entity extraction strategy. + +## summarize_descriptions + +### Fields + +- `llm` (see LLM top-level config) +- `parallelization` (see Parallelization top-level config) +- `async_mode` (see Async Mode top-level config) +- `prompt` **str** - The prompt file to use. +- `max_length` **int** - The maximum number of output tokens per summarization. +- `strategy` **dict** - Fully override the summarize description strategy. + +## claim_extraction + +### Fields + +- `enabled` **bool** - Whether to enable claim extraction. default=False +- `llm` (see LLM top-level config) +- `parallelization` (see Parallelization top-level config) +- `async_mode` (see Async Mode top-level config) +- `prompt` **str** - The prompt file to use. +- `description` **str** - Describes the types of claims we want to extract. +- `max_gleanings` **int** - The maximum number of gleaning cycles to use. +- `strategy` **dict** - Fully override the claim extraction strategy. + +## community_reports + +### Fields + +- `llm` (see LLM top-level config) +- `parallelization` (see Parallelization top-level config) +- `async_mode` (see Async Mode top-level config) +- `prompt` **str** - The prompt file to use. +- `max_length` **int** - The maximum number of output tokens per report. +- `max_input_length` **int** - The maximum number of input tokens to use when generating reports. +- `strategy` **dict** - Fully override the community reports strategy. + +## cluster_graph + +### Fields + +- `max_cluster_size` **int** - The maximum cluster size to emit. +- `strategy` **dict** - Fully override the cluster_graph strategy. + +## embed_graph + +### Fields + +- `enabled` **bool** - Whether to enable graph embeddings. +- `num_walks` **int** - The node2vec number of walks. +- `walk_length` **int** - The node2vec walk length. +- `window_size` **int** - The node2vec window size. +- `iterations` **int** - The node2vec number of iterations. +- `random_seed` **int** - The node2vec random seed. +- `strategy` **dict** - Fully override the embed graph strategy. + +## umap + +### Fields + +- `enabled` **bool** - Whether to enable UMAP layouts. + +## snapshots + +### Fields + +- `graphml` **bool** - Emit graphml snapshots. +- `raw_entities` **bool** - Emit raw entity snapshots. +- `top_level_nodes` **bool** - Emit top-level-node snapshots. + +## encoding_model + +**str** - The text encoding model to use. Default is `cl100k_base`. + +## skip_workflows + +**list[str]** - Which workflow names to skip. diff --git a/docsite/posts/config/overview.md b/docsite/posts/config/overview.md new file mode 100644 index 00000000..ce13d41e --- /dev/null +++ b/docsite/posts/config/overview.md @@ -0,0 +1,21 @@ +--- +title: Configuring GraphRAG Indexing +navtitle: Configuration +tags: [post] +layout: page +date: 2023-01-03 +--- + +The GraphRAG system is highly configurable. This page provides an overview of the configuration options available for the GraphRAG indexing engine. + +## Default Configuration Mode + +The default configuration mode is the simplest way to get started with the GraphRAG system. It is designed to work out-of-the-box with minimal configuration. The primary configuration sections for the Indexing Engine pipelines are described below. The main ways to set up GraphRAG in Default Configuration mode are via: + +- [Init command](/posts/config/init) (recommended) +- [Purely using environment variables](/posts/config/env_vars) +- [Using JSON or YAML for deeper control](/posts/config/json_yaml) + +## Custom Configuration Mode + +Custom configuration mode is an advanced use-case. Most users will want to use the Default Configuration instead. The primary configuration sections for Indexing Engine pipelines are described below. Details about how to use custom configuration are available in the [Custom Configuration Mode](/posts/config/custom) documentation. diff --git a/docsite/posts/config/template.md b/docsite/posts/config/template.md new file mode 100644 index 00000000..80173b40 --- /dev/null +++ b/docsite/posts/config/template.md @@ -0,0 +1,174 @@ +--- +title: Configuration Template +navtitle: Configuration Template +layout: page +tags: [post] +date: 2024-04-04 +--- + +The following template can be used and stored as a `.env` in the the directory where you're are pointing +the `--root` parameter on your Indexing Pipeline execution. + +For details about how to run the Indexing Pipeline, refer to the [Index CLI](../../index/2-cli) documentation. + +## .env File Template + +Required variables are uncommented. All the optional configuration can be turned on or off as needed. + +### Minimal Configuration + +```bash +# Base LLM Settings +GRAPHRAG_API_KEY="your_api_key" +GRAPHRAG_API_BASE="http://.openai.azure.com" # For Azure OpenAI Users +GRAPHRAG_API_VERSION="api_version" # For Azure OpenAI Users + +# Text Generation Settings +GRAPHRAG_LLM_TYPE="azure_openai_chat" # or openai_chat +GRAPHRAG_LLM_DEPLOYMENT_NAME="gpt-4-turbo-preview" +GRAPHRAG_LLM_MODEL_SUPPORTS_JSON=True + +# Text Embedding Settings +GRAPHRAG_EMBEDDING_TYPE="azure_openai_embedding" # or openai_embedding +GRAPHRAG_LLM_DEPLOYMENT_NAME="text-embedding-3-small" + +# Data Mapping Settings +GRAPHRAG_INPUT_TYPE="text" + +``` + +### Full Configuration + +```bash + +# Required LLM Config + +# Input Data Configuration +GRAPHRAG_INPUT_TYPE="file" + +# Plaintext Input Data Configuration +# GRAPHRAG_INPUT_FILE_PATTERN=.*\.txt + +# Text Input Data Configuration +GRAPHRAG_INPUT_FILE_TYPE="text" +GRAPHRAG_INPUT_FILE_PATTERN=".*\.txt$" +GRAPHRAG_INPUT_SOURCE_COLUMN=source +# GRAPHRAG_INPUT_TIMESTAMP_COLUMN=None +# GRAPHRAG_INPUT_TIMESTAMP_FORMAT=None +# GRAPHRAG_INPUT_TEXT_COLUMN="text" +# GRAPHRAG_INPUT_ATTRIBUTE_COLUMNS=id +# GRAPHRAG_INPUT_TITLE_COLUMN="title" +# GRAPHRAG_INPUT_TYPE="file" +# GRAPHRAG_INPUT_CONNECTION_STRING=None +# GRAPHRAG_INPUT_CONTAINER_NAME=None +# GRAPHRAG_INPUT_BASE_DIR=None + +# Base LLM Settings +GRAPHRAG_API_KEY="your_api_key" +GRAPHRAG_API_BASE="http://.openai.azure.com" # For Azure OpenAI Users +GRAPHRAG_API_VERSION="api_version" # For Azure OpenAI Users +# GRAPHRAG_API_ORGANIZATION=None +# GRAPHRAG_API_PROXY=None + +# Text Generation Settings +# GRAPHRAG_LLM_TYPE=openai_chat +GRAPHRAG_LLM_API_KEY="your_api_key" # If GRAPHRAG_API_KEY is not set +GRAPHRAG_LLM_API_BASE="http://.openai.azure.com" # For Azure OpenAI Users and if GRAPHRAG_API_BASE is not set +GRAPHRAG_LLM_API_VERSION="api_version" # For Azure OpenAI Users and if GRAPHRAG_API_VERSION is not set +GRAPHRAG_LLM_MODEL_SUPPORTS_JSON=True # Suggested by default +# GRAPHRAG_LLM_API_ORGANIZATION=None +# GRAPHRAG_LLM_API_PROXY=None +# GRAPHRAG_LLM_DEPLOYMENT_NAME=None +# GRAPHRAG_LLM_MODEL=gpt-4-turbo-preview +# GRAPHRAG_LLM_MAX_TOKENS=4000 +# GRAPHRAG_LLM_REQUEST_TIMEOUT=180 +# GRAPHRAG_LLM_THREAD_COUNT=50 +# GRAPHRAG_LLM_THREAD_STAGGER=0.3 +# GRAPHRAG_LLM_CONCURRENT_REQUESTS=25 +# GRAPHRAG_LLM_TPM=0 +# GRAPHRAG_LLM_RPM=0 +# GRAPHRAG_LLM_MAX_RETRIES=10 +# GRAPHRAG_LLM_MAX_RETRY_WAIT=10 +# GRAPHRAG_LLM_SLEEP_ON_RATE_LIMIT_RECOMMENDATION=True + +# Text Embedding Settings +# GRAPHRAG_EMBEDDING_TYPE=openai_embedding +GRAPHRAG_EMBEDDING_API_KEY="your_api_key" # If GRAPHRAG_API_KEY is not set +GRAPHRAG_EMBEDDING_API_BASE="http://.openai.azure.com" # For Azure OpenAI Users and if GRAPHRAG_API_BASE is not set +GRAPHRAG_EMBEDDING_API_VERSION="api_version" # For Azure OpenAI Users and if GRAPHRAG_API_VERSION is not set +# GRAPHRAG_EMBEDDING_API_ORGANIZATION=None +# GRAPHRAG_EMBEDDING_API_PROXY=None +# GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME=None +# GRAPHRAG_EMBEDDING_MODEL=text-embedding-3-small +# GRAPHRAG_EMBEDDING_BATCH_SIZE=16 +# GRAPHRAG_EMBEDDING_BATCH_MAX_TOKENS=8191 +# GRAPHRAG_EMBEDDING_TARGET=required +# GRAPHRAG_EMBEDDING_SKIP=None +# GRAPHRAG_EMBEDDING_THREAD_COUNT=None +# GRAPHRAG_EMBEDDING_THREAD_STAGGER=50 +# GRAPHRAG_EMBEDDING_CONCURRENT_REQUESTS=25 +# GRAPHRAG_EMBEDDING_TPM=0 +# GRAPHRAG_EMBEDDING_RPM=0 +# GRAPHRAG_EMBEDDING_MAX_RETRIES=10 +# GRAPHRAG_EMBEDDING_MAX_RETRY_WAIT=10 +# GRAPHRAG_EMBEDDING_SLEEP_ON_RATE_LIMIT_RECOMMENDATION=True + +# Data Mapping Settings +# GRAPHRAG_INPUT_ENCODING=utf-8 + +# Data Chunking +# GRAPHRAG_CHUNK_SIZE=300 +# GRAPHRAG_CHUNK_OVERLAP=100 +# GRAPHRAG_CHUNK_BY_COLUMNS=id + +# Prompting Overrides +# GRAPHRAG_ENTITY_EXTRACTION_PROMPT_FILE=None +# GRAPHRAG_ENTITY_EXTRACTION_MAX_GLEANINGS=0 +# GRAPHRAG_ENTITY_EXTRACTION_ENTITY_TYPES=organization,person,event,geo +# GRAPHRAG_SUMMARIZE_DESCRIPTIONS_PROMPT_FILE=None +# GRAPHRAG_SUMMARIZE_DESCRIPTIONS_MAX_LENGTH=500 +# GRAPHRAG_CLAIM_EXTRACTION_DESCRIPTION="Any claims or facts that could be relevant to threat analysis." +# GRAPHRAG_CLAIM_EXTRACTION_PROMPT_FILE=None +# GRAPHRAG_CLAIM_EXTRACTION_MAX_GLEANINGS=0 +# GRAPHRAG_COMMUNITY_REPORT_PROMPT_FILE=None +# GRAPHRAG_COMMUNITY_REPORT_MAX_LENGTH=1500 + +# Storage +# GRAPHRAG_STORAGE_TYPE=file +# GRAPHRAG_STORAGE_CONNECTION_STRING=None +# GRAPHRAG_STORAGE_CONTAINER_NAME=None +# GRAPHRAG_STORAGE_BASE_DIR=None + +# Cache +# GRAPHRAG_CACHE_TYPE=file +# GRAPHRAG_CACHE_CONNECTION_STRING=None +# GRAPHRAG_CACHE_CONTAINER_NAME=None +# GRAPHRAG_CACHE_BASE_DIR=None + +# Reporting +# GRAPHRAG_REPORTING_TYPE=file +# GRAPHRAG_REPORTING_CONNECTION_STRING=None +# GRAPHRAG_REPORTING_CONTAINER_NAME=None +# GRAPHRAG_REPORTING_BASE_DIR=None + +# Node2Vec Parameters +# GRAPHRAG_NODE2VEC_ENABLED=False +# GRAPHRAG_NODE2VEC_NUM_WALKS=10 +# GRAPHRAG_NODE2VEC_WALK_LENGTH=40 +# GRAPHRAG_NODE2VEC_WINDOW_SIZE=2 +# GRAPHRAG_NODE2VEC_ITERATIONS=3 +# GRAPHRAG_NODE2VEC_RANDOM_SEED=597832 + +# Data Snapshotting +# GRAPHRAG_SNAPSHOT_GRAPHML=False +# GRAPHRAG_SNAPSHOT_RAW_ENTITIES=False +# GRAPHRAG_SNAPSHOT_TOP_LEVEL_NODES=False + +# Miscellaneous Settings +# GRAPHRAG_ASYNC_MODE=asyncio +# GRAPHRAG_ENCODING_MODEL=cl100k_base +# GRAPHRAG_MAX_CLUSTER_SIZE=10 +# GRAPHRAG_ENTITY_RESOLUTION_ENABLED=False +# GRAPHRAG_SKIP_WORKFLOWS=None +# GRAPHRAG_UMAP_ENABLED=False +``` diff --git a/docsite/posts/developing.md b/docsite/posts/developing.md new file mode 100644 index 00000000..f4a83dc7 --- /dev/null +++ b/docsite/posts/developing.md @@ -0,0 +1,90 @@ +--- +title: Developing GraphRAG +navtitle: Developing +layout: page +tags: [post] +--- + +# Requirements + +| Name | Installation | Purpose | +| ------------------- | ------------------------------------------------------------ | ----------------------------------------------------------------------------------- | +| Python 3.10-3.12 | [Download](https://www.python.org/downloads/) | The library is Python-based. | +| Poetry | [Instructions](https://python-poetry.org/docs/#installation) | Poetry is used for package management and virtualenv management in Python codebases | + +# Getting Started + +## Install Dependencies + +```sh +# Install Python dependencies. +poetry install +``` + +## Execute the Indexing Engine + +```sh +poetry run poe index <...args> +``` + +## Executing Queries + +```sh +poetry run poe query <...args> +``` + +# Azurite + +Some unit and smoke tests use Azurite to emulate Azure resources. This can be started by running: + +```sh +./scripts/start-azurite.sh +``` + +or by simply running `azurite` in the terminal if already installed globally. See the [Azurite documentation](https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite) for more information about how to install and use Azurite. + +# Lifecycle Scripts + +Our Python package utilizes Poetry to manage dependencies and [poethepoet](https://pypi.org/project/poethepoet/) to manage build scripts. + +Available scripts are: + +- `poetry run poe index` - Run the Indexing CLI +- `poetry run poe query` - Run the Query CLI +- `poetry build` - This invokes `poetry build`, which will build a wheel file and other distributable artifacts. +- `poetry run poe test` - This will execute all tests. +- `poetry run poe test_unit` - This will execute unit tests. +- `poetry run poe test_integration` - This will execute integration tests. +- `poetry run poe test_smoke` - This will execute smoke tests. +- `poetry run poe check` - This will perform a suite of static checks across the package, including: + - formatting + - documentation formatting + - linting + - security patterns + - type-checking +- `poetry run poe fix` - This will apply any available auto-fixes to the package. Usually this is just formatting fixes. +- `poetry run poe fix_unsafe` - This will apply any available auto-fixes to the package, including those that may be unsafe. +- `poetry run poe format` - Explicitly run the formatter across the package. + +## Troubleshooting + +### "RuntimeError: llvm-config failed executing, please point LLVM_CONFIG to the path for llvm-config" when running poetry install + +Make sure llvm-9 and llvm-9-dev are installed: + +`sudo apt-get install llvm-9 llvm-9-dev` + +and then in your bashrc, add + +`export LLVM_CONFIG=/usr/bin/llvm-config-9` + +### "numba/\_pymodule.h:6:10: fatal error: Python.h: No such file or directory" when running poetry install + +Make sure you have python3.10-dev installed or more generally `python-dev` + +`sudo apt-get install python3.10-dev` + +### LLM call constantly exceeds TPM, RPM or time limits + +`GRAPHRAG_LLM_THREAD_COUNT` and `GRAPHRAG_EMBEDDING_THREAD_COUNT` are both set to 50 by default. You can modify this values +to reduce concurrency. Please refer to the [Configuration Documents](../config/overview) diff --git a/docsite/posts/get_started.md b/docsite/posts/get_started.md new file mode 100644 index 00000000..f2c0e7fb --- /dev/null +++ b/docsite/posts/get_started.md @@ -0,0 +1,130 @@ +--- +title: Get Started +navtitle: Get started +layout: page +tags: [post] +--- + +## Requirements + +[Python 3.10-3.12](https://www.python.org/downloads/) + +To get started with the GraphRAG system, you have a few options: + +👉 [Use the GraphRAG Accelerator solution](https://github.com/Azure-Samples/graphrag-accelerator)
    +👉 [Install from pypi](https://pypi.org/project/graphrag/).
    +👉 [Use it from source](/posts/developing)
    + +## Quickstart + +To get started with the GraphRAG system we recommend trying the [Solution Accelerator](https://github.com/Azure-Samples/graphrag-accelerator) package. This provides a user-friendly end-to-end experience with Azure resources. + +# Top-Level Modules + +[Indexing Pipeline Overview](/posts/index/overview)
    +[Query Engine Overview](/posts/query/overview) + +# Overview + +The following is a simple end-to-end example for using the GraphRAG system. +It shows how to use the system to index some text, and then use the indexed data to answer questions about the documents. + +# Install GraphRAG + +```bash +pip install graphrag +``` + +# Running the Indexer + +Now we need to set up a data project and some initial configuration. Let's set that up. We're using the [default configuration mode](/posts/config/overview/), which you can customize as needed using a [config file](/posts/config/json_yaml/), which we recommend, or [environment variables](/posts/config/env_vars/). + +First let's get a sample dataset ready: + +```sh +mkdir -p ./ragtest/input +``` + +Now let's get a copy of A Christmas Carol by Charles Dickens from a trusted source + +```sh +curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt > ./ragtest/input/book.txt +``` + +Next we'll inject some required config variables: + +## Set Up Your Workspace Variables + +First let's make sure to setup the required environment variables. For details on these environment variables, and what environment variables are available, see the [variables documentation](/posts/config/overview/). + +To initialize your workspace, let's first run the `graphrag.index --init` command. +Since we have already configured a directory named \.ragtest` in the previous step, we can run the following command: + +```sh +python -m graphrag.index --init --root ./ragtest +``` + +This will create two files: `.env` and `settings.yaml` in the `./ragtest` directory. + +- `.env` contains the environment variables required to run the GraphRAG pipeline. If you inspect the file, you'll see a single environment variable defined, + `GRAPHRAG_API_KEY=`. This is the API key for the OpenAI API or Azure OpenAI endpoint. You can replace this with your own API key. +- `settings.yaml` contains the settings for the pipeline. You can modify this file to change the settings for the pipeline. +
    + +#### OpenAI and Azure OpenAI + +To run in OpenAI mode, just make sure to update the value of `GRAPHRAG_API_KEY` in the `.env` file with your OpenAI API key. + +#### Azure OpenAI + +In addition, Azure OpenAI users should set the following variables in the settings.yaml file. To find the appropriate sections, just search for the `llm:` configuration, you should see two sections, one for the chat endpoint and one for the embeddings endpoint. Here is an example of how to configure the chat endpoint: + +```yaml +type: azure_openai_chat # Or azure_openai_embedding for embeddings +api_base: https://.openai.azure.com +api_version: 2024-02-15-preview # You can customize this for other versions +deployment_name: +``` + +- For more details about configuring GraphRAG, see the [configuration documentation](/posts/config/overview/). +- To learn more about Initialization, refer to the [Initialization documentation](/posts/config/init/). +- For more details about using the CLI, refer to the [CLI documentation](/posts/query/3-cli/). + +## Running the Indexing pipeline + +Finally we'll run the pipeline! + +```sh +python -m graphrag.index --root ./ragtest +``` + +![pipeline executing from the CLI](/img/pipeline-running.png) + +This process will take some time to run. This depends on the size of your input data, what model you're using, and the text chunk size being used (these can be configured in your `.env` file). +Once the pipeline is complete, you should see a new folder called `./ragtest/output//artifacts` with a series of parquet files. + +# Using the Query Engine + +## Running the Query Engine + +Now let's ask some questions using this dataset. + +Here is an example using Global search to ask a high-level question: + +```sh +python -m graphrag.query \ +--root ./ragtest \ +--method global \ +"What are the top themes in this story?" +``` + +Here is an example using Local search to ask a more specific question about a particular character: + +```sh +python -m graphrag.query \ +--root ./ragtest \ +--method local \ +"Who is Scrooge, and what are his main relationships?" +``` + +Please refer to [Query Engine](/posts/query/overview) docs for detailed information about how to leverage our Local and Global search mechanisms for extracting meaningful insights from data after the Indexer has wrapped up execution. diff --git a/docsite/posts/index/0-architecture.md b/docsite/posts/index/0-architecture.md new file mode 100644 index 00000000..4826bdab --- /dev/null +++ b/docsite/posts/index/0-architecture.md @@ -0,0 +1,73 @@ +--- +title: Indexing Architecture +navtitle: Architecture +tags: [post, indexing] +layout: page +date: 2023-01-01 +--- + +## Key Concepts + +### Knowledge Model + +In order to support the GraphRAG system, the outputs of the indexing engine (in the Default Configuration Mode) are aligned to a knowledge model we call the _GraphRAG Knowledge Model_. +This model is designed to be an abstraction over the underlying data storage technology, and to provide a common interface for the GraphRAG system to interact with. +In normal use-cases the outputs of the GraphRAG Indexer would be loaded into a database system, and the GraphRAG's Query Engine would interact with the database using the knowledge model data-store types. + +### DataShaper Workflows + +GraphRAG's Indexing Pipeline is built on top of our open-source library, [DataShaper](https://github.com/microsoft/datashaper). +DataShaper is a data processing library that allows users to declaratively express data pipelines, schemas, and related assets using well-defined schemas. +DataShaper has implementations in JavaScript and Python, and is designed to be extensible to other languages. + +One of the core resource types within DataShaper is a [Workflow](https://github.com/microsoft/datashaper/blob/main/javascript/schema/src/workflow/WorkflowSchema.ts). +Workflows are expressed as sequences of steps, which we call [verbs](https://github.com/microsoft/datashaper/blob/main/javascript/schema/src/workflow/verbs.ts). +Each step has a verb name and a configuration object. +In DataShaper, these verbs model relational concepts such as SELECT, DROP, JOIN, etc.. Each verb transforms an input data table, and that table is passed down the pipeline. + +```mermaid +--- +title: Sample Workflow +--- +flowchart LR + input[Input Table] --> select[SELECT] --> join[JOIN] --> binarize[BINARIZE] --> output[Output Table] +``` + +### LLM-based Workflow Steps + +GraphRAG's Indexing Pipeline implements a handful of custom verbs on top of the standard, relational verbs that our DataShaper library provides. These verbs give us the ability to augment text documents with rich, structured data using the power of LLMs such as GPT-4. We utilize these verbs in our standard workflow to extract entities, relationships, claims, community structures, and community reports and summaries. This behavior is customizable and can be extended to support many kinds of AI-based data enrichment and extraction tasks. + +### Workflow Graphs + +Because of the complexity of our data indexing tasks, we needed to be able to express our data pipeline as series of multiple, interdependent workflows. +In the GraphRAG Indexing Pipeline, each workflow may define dependencies on other workflows, effectively forming a directed acyclic graph (DAG) of workflows, which is then used to schedule processing. + +```mermaid +--- +title: Sample Workflow DAG +--- +stateDiagram-v2 + [*] --> Prepare + Prepare --> Chunk + Chunk --> ExtractGraph + Chunk --> EmbedDocuments + ExtractGraph --> GenerateReports + ExtractGraph --> EmbedGraph + EntityResolution --> EmbedGraph + EntityResolution --> GenerateReports + ExtractGraph --> EntityResolution +``` + +### Dataframe Message Format + +The primary unit of communication between workflows, and between workflow steps is an instance of `pandas.DataFrame`. +Although side-effects are possible, our goal is to be _data-centric_ and _table-centric_ in our approach to data processing. +This allows us to easily reason about our data, and to leverage the power of dataframe-based ecosystems. +Our underlying dataframe technology may change over time, but our primary goal is to support the DataShaper workflow schema while retaining single-machine ease of use and developer ergonomics. + +### LLM Caching + +The GraphRAG library was designed with LLM interactions in mind, and a common setback when working with LLM APIs is various errors errors due to network latency, throttling, etc.. +Because of these potential error cases, we've added a cache layer around LLM interactions. +When completion requests are made using the same input set (prompt and tuning parameters), we return a cached result if one exists. +This allows our indexer to be more resilient to network issues, to act idempotently, and to provide a more efficient end-user experience. diff --git a/docsite/posts/index/1-default_dataflow.md b/docsite/posts/index/1-default_dataflow.md new file mode 100644 index 00000000..1b8d135d --- /dev/null +++ b/docsite/posts/index/1-default_dataflow.md @@ -0,0 +1,218 @@ +--- +title: Indexing Dataflow +navtitle: Dataflow +layout: page +tags: [post, indexing] +date: 2023-01-02 +--- + +## The GraphRAG Knowledge Model + +The knowledge model is a specification for data outputs that conform to our data-model definition. You can find these definitions in the python/graphrag/graphrag/model folder within the GraphRAG repository. The following entity types are provided. The fields here represent the fields that are text-embedded by default. + +- `Document` - An input document into the system. These either represent individual rows in a CSV or individual .txt file. +- `TextUnit` - A chunk of text to analyze. The size of these chunks, their overlap, and whether they adhere to any data boundaries may be configured below. A common use case is to set `CHUNK_BY_COLUMNS` to `id` so that there is a 1-to-many relationship between documents and TextUnits instead of a many-to-many. +- `Entity` - An entity extracted from a TextUnit. These represent people, places, events, or some other entity-model that you provide. +- `Relationship` - A relationship between two entities. These are generated from the covariates. +- `Covariate` - Extracted claim information, which contains statements about entities which may be time-bound. +- `Community Report` - Once entities are generated, we perform hierarchical community detection on them and generate reports for each community in this hierarchy. +- `Node` - This table contains layout information for rendered graph-views of the Entities and Documents which have been embedded and clustered. + +## The Default Configuration Workflow + +Let's take a look at how the default-configuration workflow transforms text documents into the _GraphRAG Knowledge Model_. This page gives a general overview of the major steps in this process. To fully configure this workflow, check out the [configuration](/posts/config/overview/) documentation. + +```mermaid +--- +title: Dataflow Overview +--- +flowchart TB + subgraph phase1[Phase 1: Compose TextUnits] + documents[Documents] --> chunk[Chunk] + chunk --> embed[Embed] --> textUnits[Text Units] + end + subgraph phase2[Phase 2: Graph Extraction] + textUnits --> graph_extract[Entity & Relationship Extraction] + graph_extract --> graph_summarize[Entity & Relationship Summarization] + graph_summarize --> entity_resolve[Entity Resolution] + entity_resolve --> claim_extraction[Claim Extraction] + claim_extraction --> graph_outputs[Graph Tables] + end + subgraph phase3[Phase 3: Graph Augmentation] + graph_outputs --> community_detect[Community Detection] + community_detect --> graph_embed[Graph Embedding] + graph_embed --> augmented_graph[Augmented Graph Tables] + end + subgraph phase4[Phase 4: Community Summarization] + augmented_graph --> summarized_communities[Community Summarization] + summarized_communities --> embed_communities[Community Embedding] + embed_communities --> community_outputs[Community Tables] + end + subgraph phase5[Phase 5: Document Processing] + documents --> link_to_text_units[Link to TextUnits] + textUnits --> link_to_text_units + link_to_text_units --> embed_documents[Document Embedding] + embed_documents --> document_graph[Document Graph Creation] + document_graph --> document_outputs[Document Tables] + end + subgraph phase6[Phase 6: Network Visualization] + document_outputs --> umap_docs[Umap Documents] + augmented_graph --> umap_entities[Umap Entities] + umap_docs --> combine_nodes[Nodes Table] + umap_entities --> combine_nodes + end +``` + +## Phase 1: Compose TextUnits + +The first phase of the default-configuration workflow is to transform input documents into _TextUnits_. A _TextUnit_ is a chunk of text that is used for our graph extraction techniques. They are also used as source-references by extracted knowledge items in order to empower breadcrumbs and provenance by concepts back to their original source tex. + +The chunk size (counted in tokens), is user-configurable. By default this is set to 300 tokens, although we've had positive experience with 1200-token chunks using a single "glean" step. (A "glean" step is a follow-on extraction). Larger chunks result in lower-fidelity output and less meaningful reference texts; however, using larger chunks can result in much faster processing time. + +The group-by configuration is also user-configurable. By default, we align our chunks to document boundaries, meaning that there is a strict 1-to-many relationship between Documents and TextUnits. In rare cases, this can be turned into a many-to-many relationship. This is useful when the documents are very short and we need several of them to compose a meaningful analysis unit (e.g. Tweets or a chat log) + +Each of these text-units are text-embedded and passed into the next phase of the pipeline. + +```mermaid +--- +title: Documents into Text Chunks +--- +flowchart LR + doc1[Document 1] --> tu1[TextUnit 1] + doc1 --> tu2[TextUnit 2] + doc2[Document 2] --> tu3[TextUnit 3] + doc2 --> tu4[TextUnit 4] + +``` + +## Phase 2: Graph Extraction + +In this phase, we analyze each text unit and extract our graph primitives: _Entities_, _Relationships_, and _Claims_. +Entities and Relationships are extracted at once in our _entity_extract_ verb, and claims are extracted in our _claim_extract_ verb. Results are then combined and passed into following phases of the pipeline. + +```mermaid +--- +title: Graph Extraction +--- +flowchart LR + tu[TextUnit] --> ge[Graph Extraction] --> gs[Graph Summarization] --> er[Entity Resolution] + tu --> ce[Claim Extraction] +``` + +### Entity & Relationship Extraction + +In this first step of graph extraction, we process each text-unit in order to extract entities and relationships out of the raw text using the LLM. The output of this step is a subgraph-per-TextUnit containing a list of **entities** with a _name_, _type_, and _description_, and a list of **relationships** with a _source_, _target_, and _description_. + +These subgraphs are merged together - any entities with the same _name_ and _type_ are merged by creating an array of their descriptions. Similarly, any relationships with the same _source_ and _target_ are merged by creating an array of their descriptions. + +### Entity & Relationship Summarization + +Now that we have a graph of entities and relationships, each with a list of descriptions, we can summarize these lists into a single description per entity and relationship. This is done by asking the LLM for a short summary that captures all of the distinct information from each description. This allows all of our entities and relationships to have a single concise description. + +### Entity Resolution (Not Enabled by Default) + +The final step of graph extraction is to resolve any entities that represent the same real-world entity but but have different names. Since this is done via LLM, and we don't want to lose information, we want to take a conservative, non-destructive approach to this. + +Our current implementation of Entity Resolution, however, is destructive. It will provide the LLM with a series of entities and ask it to determine which ones should be merged. Those entities are then merged together into a single entity and their relationships are updated. + +We are currently exploring other entity resolution techniques. In the near future, entity resolution will be executed by creating an edge between entity variants indicating that the entities have been resolved by the indexing engine. This will allow for end-users to undo indexing-side resolutions, and add their own non-destructive resolutions using a similar process. + +### Claim Extraction & Emission + +Finally, as an independent workflow, we extract claims from the source TextUnits. These claims represent positive factual statements with an evaluated status and time-bounds. These are emitted as a primary artifact called **Covariates**. + +## Phase 3: Graph Augmentation + +Now that we have a usable graph of entities and relationships, we want to understand their community structure and augment the graph with additional information. This is done in two steps: _Community Detection_ and _Graph Embedding_. These give us explicit (communities) and implicit (embeddings) ways of understanding the topological structure of our graph. + +```mermaid +--- +title: Graph Augmentation +--- +flowchart LR + cd[Leiden Hierarchical Community Detection] --> ge[Node2Vec Graph Embedding] --> ag[Graph Table Emission] +``` + +### Community Detection + +In this step, we generate a hierarchy of entity communities using the Hierarchical Leiden Algorithm. This method will apply a recursive community-clustering to our graph until we reach a community-size threshold. This will allow us to understand the community structure of our graph and provide a way to navigate and summarize the graph at different levels of granularity. + +### Graph Embedding + +In this step, we generate a vector representation of our graph using the Node2Vec algorithm. This will allow us to understand the implicit structure of our graph and provide an additional vector-space in which to search for related concepts during our query phase. + +### Graph Tables Emission + +Once our graph augmentation steps are complete, the final **Entities** and **Relationships** tables are emitted after their text fields are text-embedded. + +## Phase 4: Community Summarization + +```mermaid +--- +title: Community Summarization +--- +flowchart LR + sc[Generate Community Reports] --> ss[Summarize Community Reports] --> ce[Community Embedding] --> co[Community Tables Emission] +``` + +At this point, we have a functional graph of entities and relationships, a hierarchy of communities for the entities, as well as node2vec embeddings. + +Now we want to build on the communities data and generate reports for each community. This gives us a high-level understanding of the graph at several points of graph granularity. For example, if community A is the top-level community, we'll get a report about the entire graph. If the community is lower-level, we'll get a report about a local cluster. + +### Generate Community Reports + +In this step, we generate a summary of each community using the LLM. This will allow us to understand the distinct information contained within each community and provide a scoped understanding of the graph, from either a high-level or a low-level perspective. These reports contain an executive overview and reference the key entities, relationships, and claims within the community sub-structure. + +### Summarize Community Reports + +In this step, each _community report_ is then summarized via the LLM for shorthand use. + +### Community Embedding + +In this step, we generate a vector representation of our communities by generating text embeddings of the community report, the community report summary, and the title of the community report. + +### Community Tables Emission + +At this point, some bookkeeping work is performed and we emit the **Communities** and **CommunityReports** tables. + +## Phase 5: Document Processing + +In this phase of the workflow, we create the _Documents_ table for the knowledge model. + +```mermaid +--- +title: Document Processing +--- +flowchart LR + aug[Augment] --> dp[Link to TextUnits] --> de[Avg. Embedding] --> dg[Document Table Emission] +``` + +### Augment with Columns (CSV Only) + +If the workflow is operating on CSV data, you may configure your workflow to add additional fields to Documents output. These fields should exist on the incoming CSV tables. Details about configuring this can be found in the [configuration documentation](/posts/config/overview/). + +### Link to TextUnits + +In this step, we link each document to the text-units that were created in the first phase. This allows us to understand which documents are related to which text-units and vice-versa. + +### Document Embedding + +In this step, we generate a vector representation of our documents using an average embedding of document slices. We re-chunk documents without overlapping chunks, and then generate an embedding for each chunk. We create an average of these chunks weighted by token-count and use this as the document embedding. This will allow us to understand the implicit relationship between documents, and will help us generate a network representation of our documents. + +### Documents Table Emission + +At this point, we can emit the **Documents** table into the knowledge Model. + +## Phase 6: Network Visualization + +In this phase of the workflow, we perform some steps to support network visualization of our high-dimensional vector spaces within our existing graphs. At this point there are two logical graphs at play: the _Entity-Relationship_ graph and the _Document_ graph. + +```mermaid +--- +title: Network Visualization Workflows +--- +flowchart LR + nv[Umap Documents] --> ne[Umap Entities] --> ng[Nodes Table Emission] +``` + +For each of the logical graphs, we perform a UMAP dimensionality reduction to generate a 2D representation of the graph. This will allow us to visualize the graph in a 2D space and understand the relationships between the nodes in the graph. The UMAP embeddings are then emitted as a table of _Nodes_. The rows of this table include a discriminator indicating whether the node is a document or an entity, and the UMAP coordinates. diff --git a/docsite/posts/index/2-cli.md b/docsite/posts/index/2-cli.md new file mode 100644 index 00000000..97911bbc --- /dev/null +++ b/docsite/posts/index/2-cli.md @@ -0,0 +1,26 @@ +--- +title: Indexer CLI +navtitle: CLI +layout: page +tags: [post, indexing] +date: 2023-01-03 +--- + +The GraphRAG indexer CLI allows for no-code usage of the GraphRAG Indexer. + +```bash +python -m graphrag.index --verbose --root --config +--resume --reporter --emit json,csv,parquet +--nocache +``` + +## CLI Arguments + +- `--verbose` - Adds extra logging information during the run. +- `--root ` - the data root directory. This should contain an `input` directory with the input data, and an `.env` file with environment variables. These are described below. +- `--init` - This will initialize the data project directory at the specified `root` with bootstrap configuration and prompt-overrides. +- `--resume ` - if specified, the pipeline will attempt to resume a prior run. The parquet files from the prior run will be loaded into the system as inputs, and the workflows that generated those files will be skipped. The input value should be the timestamped output folder, e.g. "20240105-143721". +- `--config ` - This will opt-out of the Default Configuration mode and execute a custom configuration. If this is used, then none of the environment-variables below will apply. +- `--reporter ` - This will specify the progress reporter to use. The default is `rich`. Valid values are `rich`, `print`, and `none`. +- `--emit ` - This specifies the table output formats the pipeline should emit. The default is `parquet`. Valid values are `parquet`, `csv`, and `json`, comma-separated. +- `--nocache` - This will disable the caching mechanism. This is useful for debugging and development, but should not be used in production. diff --git a/docsite/posts/index/overview.md b/docsite/posts/index/overview.md new file mode 100644 index 00000000..9133330b --- /dev/null +++ b/docsite/posts/index/overview.md @@ -0,0 +1,82 @@ +--- +title: GraphRAG Indexing 🤖 +navtitle: Indexing Overview +layout: page +tags: [post] +--- + +The GraphRAG indexing package is a data pipeline and transformation suite that is designed to extract meaningful, structured data from unstructured text using LLMs. + +Indexing Pipelines are configurable. They are composed of workflows, standard and custom steps, prompt templates, and input/output adapters. Our standard pipeline is designed to: + +- extract entities, relationships and claims from raw text +- perform community detection in entities +- generate community summaries and reports at multiple levels of granularity +- embed entities into a graph vector space +- embed text chunks into a textual vector space + +The outputs of the pipeline can be stored in a variety of formats, including JSON and Parquet - or they can be handled manually via the Python API. + +## Getting Started + +### Requirements + +See the [requirements](/posts/developing#requirements) section in [Get Started](/posts/get_started) for details on setting up a development environment. + +The Indexing Engine can be used in either a default configuration mode or with a custom pipeline. +To configure GraphRAG, see the [configuration](/posts/config/overview) documentation. +After you have a config file you can run the pipeline using the CLI or the Python API. + +## Usage + +### CLI + +```bash +# Via Poetry +poetry run poe cli --root # default config mode +poetry run poe cli --config your_pipeline.yml # custom config mode + +# Via Node +yarn run:index --root # default config mode +yarn run:index --config your_pipeline.yml # custom config mode + +``` + +### Python API + +```python +from graphrag.index import run_pipeline +from graphrag.index.config import PipelineWorkflowReference + +workflows: list[PipelineWorkflowReference] = [ + PipelineWorkflowReference( + steps=[ + { + # built-in verb + "verb": "derive", # https://github.com/microsoft/datashaper/blob/main/python/datashaper/datashaper/engine/verbs/derive.py + "args": { + "column1": "col1", # from above + "column2": "col2", # from above + "to": "col_multiplied", # new column name + "operator": "*", # multiply the two columns + }, + # Since we're trying to act on the default input, we don't need explicitly to specify an input + } + ] + ), +] + +dataset = pd.DataFrame([{"col1": 2, "col2": 4}, {"col1": 5, "col2": 10}]) +outputs = [] +async for output in await run_pipeline(dataset=dataset, workflows=workflows): + outputs.append(output +pipeline_result = outputs[-1] +print(pipeline_result) +``` + +## Further Reading + +- To start developing within the _GraphRAG_ project, see [getting started](/posts/developing/) +- To understand the underlying concepts and execution model of the indexing library, see [the architecture documentation](/posts/index/0-architecture/) +- To get running with a series of examples, see [the examples documentation](https://github.com/microsoft/graphrag/blob/main/examples/README.md) +- To read more about configuring the indexing engine, see [the configuration documentation](/posts/config/overview) diff --git a/docsite/posts/prompt_tuning/auto_prompt_tuning.md b/docsite/posts/prompt_tuning/auto_prompt_tuning.md new file mode 100644 index 00000000..3b091064 --- /dev/null +++ b/docsite/posts/prompt_tuning/auto_prompt_tuning.md @@ -0,0 +1,72 @@ +--- +title: Prompt Tuning ⚙️ +navtitle: Auto templating +layout: page +tags: [post, tuning] +date: 2024-06-13 +--- + +GraphRAG provides the ability to create domain adaptive templates for the generation of the knowledge graph. This step is optional, though is is highly encouraged to run it as it will yield better results when executing an Index Run. + +The templates are generated by loading the inputs, splitting them into chunks (text units) and then running a series of LLM invocations and template substitutions to generate the final prompts. We suggest using the default values provided by the script, but in this page you'll find the detail of each in case you want to further explore and tweak the template generation algorithm. + +## Prerequisites + +Before running the automatic template generation make sure you have already initialized your workspace with the `graphrag.index --init` command. This will create the necessary configuration files and the default prompts. Refer to the [Init Documentation](/posts/config/init) for more information about the initialization process. + +## Usage + +You can run the main script from the command line with various options: + +```bash +python -m graphrag.prompt_tune [--root ROOT] [--domain DOMAIN] [--method METHOD] [--limit LIMIT] [--max-tokens MAX_TOKENS] [--chunk-size CHUNK_SIZE] [--no-entity-types] [--output OUTPUT] +``` + +## Command-Line Options + +- `--root` (optional): The data project root directory, including the config files (YML, JSON, or .env). Defaults to the current directory. + +- `--domain` (optional): The domain related to your input data, such as 'space science', 'microbiology', or 'environmental news'. If left empty, the domain will be inferred from the input data. + +- `--method` (optional): The method to select documents. Options are all, random, or top. Default is random. + +- `--limit` (optional): The limit of text units to load when using random or top selection. Default is 15. + +- `--max-tokens` (optional): Maximum token count for prompt generation. Default is 2000. + +- `--chunk-size` (optional): The size in tokens to use for generating text units from input documents. Default is 200. + +- `--no-entity-types` (optional): Use untyped entity extraction generation. We recommend using this when your data covers a lot of topics or it is highly randomized. + +- `--output` (optional): The folder to save the generated prompts. Default is "prompts". + +## Example Usage + +```bash +python -m graphrag.prompt_tune --root /path/to/project --domain "environmental news" --method random --limit 10 --max-tokens 2048 --chunk-size 256 --no-entity-types --output /path/to/output +``` + +or, with minimal configuration (suggested): + +```bash +python -m graphrag.prompt_tune --root /path/to/project --no-entity-types +``` + +## Document Selection Methods + +The auto template feature ingests the input data and then divides it into text units the size of the chunk size parameter. +After that, it uses one of the following selection methods to pick a sample to work with for template generation: + +- `random`: Select text units randomly. This is the default and recommended option. +- `top`: Select the head n text units. +- `all`: Use all text units for the generation. Use only with small datasets; this option is not usually recommended. + +## Modify Env Vars + +After running auto-templating, you should modify the following environment variables (or config variables) to pick up the new prompts on your index run. Note: Please make sure to update the correct path to the generated prompts, in this example we are using the default "prompts" path. + +- `GRAPHRAG_ENTITY_EXTRACTION_PROMPT_FILE` = "prompts/entity_extraction.txt" + +- `GRAPHRAG_COMMUNITY_REPORT_PROMPT_FILE` = "prompts/community_report.txt" + +- `GRAPHRAG_SUMMARIZE_DESCRIPTIONS_PROMPT_FILE` = "prompts/summarize_descriptions.txt" diff --git a/docsite/posts/prompt_tuning/manual_prompt_tuning.md b/docsite/posts/prompt_tuning/manual_prompt_tuning.md new file mode 100644 index 00000000..935840d2 --- /dev/null +++ b/docsite/posts/prompt_tuning/manual_prompt_tuning.md @@ -0,0 +1,60 @@ +--- +title: Prompt Tuning⚙️ +navtitle: Manual Tuning +layout: page +tags: [post, tuning] +date: 2023-01-03 +--- + +The GraphRAG indexer, by default, will run with a handful of prompts that are designed to work well in the broad context of knowledge discovery. +However, it is quite common to want to tune the prompts to better suit your specific use case. +We provide a means for you to do this by allowing you to specify a custom prompt file, which will each use a series of token-replacements internally. + +Each of these prompts may be overridden by writing a custom prompt file in plaintext. We use token-replacements in the form of `{token_name}`, and the descriptions for the available tokens can be found below. + +## Entity/Relationship Extraction + +[Prompt Source](http://github.com/microsoft/graphrag/blob/main/graphrag/index/graph/extractors/graph/prompts.py) + +### Tokens (values provided by extractor) + +- **{input_text}** - The input text to be processed. +- **{entity_types}** - A list of entity types +- **{tuple_delimiter}** - A delimiter for separating values within a tuple. A single tuple is used to represent an individual entity or relationship. +- **{record_delimiter}** - A delimiter for separating tuple instances. +- **{completion_delimiter}** - An indicator for when generation is complete. + +## Summarize Entity/Relationship Descriptions + +[Prompt Source](http://github.com/microsoft/graphrag/blob/main/graphrag/index/graph/extractors/summarize/prompts.py) + +### Tokens (values provided by extractor) + +- **{entity_name}** - The name of the entity or the source/target pair of the relationship. +- **{description_list}** - A list of descriptions for the entity or relationship. + +## Claim Extraction + +[Prompt Source](http://github.com/microsoft/graphrag/blob/main/graphrag/index/graph/extractors/claims/prompts.py) + +### Tokens (values provided by extractor) + +- **{input_text}** - The input text to be processed. +- **{tuple_delimiter}** - A delimiter for separating values within a tuple. A single tuple is used to represent an individual entity or relationship. +- **{record_delimiter}** - A delimiter for separating tuple instances. +- **{completion_delimiter}** - An indicator for when generation is complete. + +Note: there is additional paramater for the `Claim Description` that is used in claim extraction. +The default value is + +`"Any claims or facts that could be relevant to information discovery."` + +See the [configuration documentation](/posts/config/overview/) for details on how to change this. + +## Generate Community Reports + +[Prompt Source](http://github.com/microsoft/graphrag/blob/main/graphrag/index/graph/extractors/community_reports/prompts.py) + +### Tokens (values provided by extractor) + +- **{input_text}** - The input text to generate the report with. This will contain tables of entities and relationships. diff --git a/docsite/posts/prompt_tuning/overview.md b/docsite/posts/prompt_tuning/overview.md new file mode 100644 index 00000000..09d99e47 --- /dev/null +++ b/docsite/posts/prompt_tuning/overview.md @@ -0,0 +1,26 @@ +--- +title: Prompt Tuning ⚙️ +navtitle: Overview +layout: page +tags: [post, tuning] +date: 2024-06-13 +--- + +This page provides an overview of the prompt tuning options available for the GraphRAG indexing engine. + +## Default Prompts + +The default prompts are the simplest way to get started with the GraphRAG system. It is designed to work out-of-the-box with minimal configuration. You can find more detail about these prompts in the following links: + +- [Entity/Relationship Extraction](http://github.com/microsoft/graphrag/blob/main/graphrag/index/graph/extractors/graph/prompts.py) +- [Entity/Relationship Description Summarization](http://github.com/microsoft/graphrag/blob/main/graphrag/index/graph/extractors/summarize/prompts.py) +- [Claim Extraction](http://github.com/microsoft/graphrag/blob/main/graphrag/index/graph/extractors/claims/prompts.py) +- [Community Reports](http://github.com/microsoft/graphrag/blob/main/graphrag/index/graph/extractors/community_reports/prompts.py) + +## Auto Templating + +Auto Templating leverages your input data and LLM interactions to create domain adaptive templates for the generation of the knowledge graph. It is highly encouraged to run it as it will yield better results when executing an Index Run. For more details about how to use it, please refer to the [Auto Templating](/posts/prompt_tuning/auto_prompt_tuning) documentation. + +## Manual Configuration + +Manual configuration is an advanced use-case. Most users will want to use the Auto Templating feature instead. Details about how to use manual configuration are available in the [Manual Prompt Configuration](/posts/prompt_tunins/manual_prompt_tuning) documentation. diff --git a/docsite/posts/query/0-global_search.md b/docsite/posts/query/0-global_search.md new file mode 100644 index 00000000..1a0eda22 --- /dev/null +++ b/docsite/posts/query/0-global_search.md @@ -0,0 +1,78 @@ +--- +title: Global Search 🔎 +navtitle: Global Search +tags: [post, orchestration] +layout: page +date: 2024-06-03 +--- + +## Whole Dataset Reasoning + +Baseline RAG struggles with queries that require aggregation of information across the dataset to compose an answer. Queries such as “What are the top 5 themes in the data?” perform terribly because baseline RAG relies on a vector search of semantically similar text content within the dataset. There is nothing in the query to direct it to the correct information. + +However, with GraphRAG we can answer such questions, because the structure of the LLM-generated knowledge graph tells us about the structure (and thus themes) of the dataset as a whole. This allows the private dataset to be organized into meaningful semantic clusters that are pre-summarized. Using our [global search](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/global_search/) method, the LLM uses these clusters to summarize these themes when responding to a user query. + +## Methodology + +```mermaid +--- +title: Global Search Dataflow +--- +%%{ init: { 'flowchart': { 'curve': 'step' } } }%% +flowchart LR + + uq[User Query] --- .1 + ch1[Conversation History] --- .1 + + subgraph RIR + direction TB + ri1[Rated Intermediate
    Response 1]~~~ri2[Rated Intermediate
    Response 2] -."{1..N}".-rin[Rated Intermediate
    Response N] + end + + .1--Shuffled Community
    Report Batch 1-->RIR + .1--Shuffled Community
    Report Batch 2-->RIR---.2 + .1--Shuffled Community
    Report Batch N-->RIR + + .2--Ranking +
    Filtering-->agr[Aggregated Intermediate
    Responses]-->res[Response] + + + + classDef green fill:#26B653,stroke:#333,stroke-width:2px,color:#fff; + classDef turquoise fill:#19CCD3,stroke:#333,stroke-width:2px,color:#fff; + classDef rose fill:#DD8694,stroke:#333,stroke-width:2px,color:#fff; + classDef orange fill:#F19914,stroke:#333,stroke-width:2px,color:#fff; + classDef purple fill:#B356CD,stroke:#333,stroke-width:2px,color:#fff; + classDef invisible fill:#fff,stroke:#fff,stroke-width:0px,color:#fff, width:0px; + class uq,ch1 turquoise; + class ri1,ri2,rin rose; + class agr orange; + class res purple; + class .1,.2 invisible; + +``` + +Given a user query and, optionally, the conversation history, the global search method uses a collection of LLM-generated community reports from a specified level of the graph's community hierarchy as context data to generate response in a map-reduce manner. At the `map` step, community reports are segmented into text chunks of pre-defined size. Each text chunk is then used to produce an intermediate response containing a list of point, each of which is accompanied by a numerical rating indicating the importance of the point. At the `reduce` step, a filtered set of the most important points from the intermediate responses are aggregated and used as the context to generate the final response. + +The quality of the global search’s response can be heavily influenced by the level of the community hierarchy chosen for sourcing community reports. Lower hierarchy levels, with their detailed reports, tend to yield more thorough responses, but may also increase the time and LLM resources needed to generate the final response due to the volume of reports. + + +## Configuration + +Below are the key parameters of the [GlobalSearch class](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/global_search/search.py): +* `llm`: OpenAI model object to be used for response generation +* `context_builder`: [context builder](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/global_search/community_context.py) object to be used for preparing context data from community reports +* `map_system_prompt`: prompt template used in the `map` stage. Default template can be found at [map_system_prompt](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/global_search/map_system_prompt.py) +* `reduce_system_prompt`: prompt template used in the `reduce` stage, default template can be found at [reduce_system_prompt](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/global_search/reduce_system_prompt.py) +* `response_type`: free-form text describing the desired response type and format (e.g., `Multiple Paragraphs`, `Multi-Page Report`) +* `allow_general_knowledge`: setting this to True will include additional instructions to the `reduce_system_prompt` to prompt the LLM to incorporate relevant real-world knowledge outside of the dataset. Note that this may increase hallucinations, but can be useful for certain scenarios. Default is False +*`general_knowledge_inclusion_prompt`: instruction to add to the `reduce_system_prompt` if `allow_general_knowledge` is enabled. Default instruction can be found at [general_knowledge_instruction](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/global_search/reduce_system_prompt.py) +* `max_data_tokens`: token budget for the context data +* `map_llm_params`: a dictionary of additional parameters (e.g., temperature, max_tokens) to be passed to the LLM call at the `map` stage +* `reduce_llm_params`: a dictionary of additional parameters (e.g., temperature, max_tokens) to passed to the LLM call at the `reduce` stage +* `context_builder_params`: a dictionary of additional parameters to be passed to the [`context_builder`](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/global_search/community_context.py) object when building context window for the `map` stage. +* `concurrent_coroutines`: controls the degree of parallelism in the `map` stage. +* `callbacks`: optional callback functions, can be used to provide custom event handlers for LLM's completion streaming events + +## How to Use + +An example of a global search scenario can be found in the following [notebook](../notebooks/global_search_nb). \ No newline at end of file diff --git a/docsite/posts/query/1-local_search.md b/docsite/posts/query/1-local_search.md new file mode 100644 index 00000000..7d2a465d --- /dev/null +++ b/docsite/posts/query/1-local_search.md @@ -0,0 +1,67 @@ +--- +title: Local Search 🔎 +navtitle: Local Search +tags: [post, orchestration] +layout: page +date: 2024-03-28 +--- + +## Entity-based Reasoning + +The [local search](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/local_search/) method combines structured data from the knowledge graph with unstructured data from the input documents to augment the LLM context with relevant entity information at query time. It is well-suited for answering questions that require an understanding of specific entities mentioned in the input documents (e.g., “What are the healing properties of chamomile?”). + +## Methodology + +```mermaid +--- +title: Local Search Dataflow +--- +%%{ init: { 'flowchart': { 'curve': 'step' } } }%% +flowchart LR + + uq[User Query] ---.1 + ch1[Conversation
    History]---.1 + + .1--Entity
    Description
    Embedding--> ee[Extracted Entities] + + ee[Extracted Entities] ---.2--Entity-Text
    Unit Mapping--> ctu[Candidate
    Text Units]--Ranking +
    Filtering -->ptu[Prioritized
    Text Units]---.3 + .2--Entity-Report
    Mapping--> ccr[Candidate
    Community Reports]--Ranking +
    Filtering -->pcr[Prioritized
    Community Reports]---.3 + .2--Entity-Entity
    Relationships--> ce[Candidate
    Entities]--Ranking +
    Filtering -->pe[Prioritized
    Entities]---.3 + .2--Entity-Entity
    Relationships--> cr[Candidate
    Relationships]--Ranking +
    Filtering -->pr[Prioritized
    Relationships]---.3 + .2--Entity-Covariate
    Mappings--> cc[Candidate
    Covariates]--Ranking +
    Filtering -->pc[Prioritized
    Covariates]---.3 + ch1 -->ch2[Conversation History]---.3 + .3-->res[Response] + + classDef green fill:#26B653,stroke:#333,stroke-width:2px,color:#fff; + classDef turquoise fill:#19CCD3,stroke:#333,stroke-width:2px,color:#fff; + classDef rose fill:#DD8694,stroke:#333,stroke-width:2px,color:#fff; + classDef orange fill:#F19914,stroke:#333,stroke-width:2px,color:#fff; + classDef purple fill:#B356CD,stroke:#333,stroke-width:2px,color:#fff; + classDef invisible fill:#fff,stroke:#fff,stroke-width:0px,color:#fff, width:0px; + class uq,ch1 turquoise + class ee green + class ctu,ccr,ce,cr,cc rose + class ptu,pcr,pe,pr,pc,ch2 orange + class res purple + class .1,.2,.3 invisible + + +``` + +Given a user query and, optionally, the conversation history, the local search method identifies a set of entities from the knowledge graph that are semantically-related to the user input. These entities serve as access points into the knowledge graph, enabling the extraction of further relevant details such as connected entities, relationships, entity covariates, and community reports. Additionally, it also extracts relevant text chunks from the raw input documents that are associated with the identified entities. These candidate data sources are then prioritized and filtered to fit within a single context window of pre-defined size, which is used to generate a response to the user query. + +## Configuration + +Below are the key parameters of the [LocalSearch class](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/local_search/search.py): +* `llm`: OpenAI model object to be used for response generation +* `context_builder`: [context builder](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/local_search/mixed_context.py) object to be used for preparing context data from collections of knowledge model objects +* `system_prompt`: prompt template used to generate the search response. Default template can be found at [system_prompt](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/local_search/system_prompt.py) +* `response_type`: free-form text describing the desired response type and format (e.g., `Multiple Paragraphs`, `Multi-Page Report`) +* `llm_params`: a dictionary of additional parameters (e.g., temperature, max_tokens) to be passed to the LLM call +* `context_builder_params`: a dictionary of additional parameters to be passed to the [`context_builder`](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/local_search/mixed_context.py) object when building context for the search prompt +* `callbacks`: optional callback functions, can be used to provide custom event handlers for LLM's completion streaming events + +## How to Use + +An example of a local search scenario can be found in the following [notebook](../notebooks/local_search_nb). + diff --git a/docsite/posts/query/2-question_generation.md b/docsite/posts/query/2-question_generation.md new file mode 100644 index 00000000..73a89f1f --- /dev/null +++ b/docsite/posts/query/2-question_generation.md @@ -0,0 +1,28 @@ +--- +title: Question Generation ❔ +navtitle: Question Generation +tags: [post, orchestration] +layout: page +date: 2024-03-28 +--- + +## Entity-based Question Generation + +The [question generation](https://github.com/microsoft/graphrag/blob/main//graphrag/query/question_gen/) method combines structured data from the knowledge graph with unstructured data from the input documents to generate candidate questions related to specific entities. + +## Methodology +Given a list of prior user questions, the question generation method uses the same context-building approach employed in [local search](1-local_search.md) to extract and prioritize relevant structured and unstructured data, including entities, relationships, covariates, community reports and raw text chunks. These data records are then fitted into a single LLM prompt to generate candidate follow-up questions that represent the most important or urgent information content or themes in the data. + +## Configuration + +Below are the key parameters of the [Question Generation class](https://github.com/microsoft/graphrag/blob/main//graphrag/query/question_gen/local_gen.py): +* `llm`: OpenAI model object to be used for response generation +* `context_builder`: [context builder](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/local_search/mixed_context.py) object to be used for preparing context data from collections of knowledge model objects, using the same context builder class as in local search +* `system_prompt`: prompt template used to generate candidate questions. Default template can be found at [system_prompt](https://github.com/microsoft/graphrag/blob/main//graphrag/query/question_gen/system_prompt.py) +* `llm_params`: a dictionary of additional parameters (e.g., temperature, max_tokens) to be passed to the LLM call +* `context_builder_params`: a dictionary of additional parameters to be passed to the [`context_builder`](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/local_search/mixed_context.py) object when building context for the question generation prompt +* `callbacks`: optional callback functions, can be used to provide custom event handlers for LLM's completion streaming events + +## How to Use + +An example of the question generation function can be found in the following [notebook](../notebooks/local_search_nb). diff --git a/docsite/posts/query/3-cli.md b/docsite/posts/query/3-cli.md new file mode 100644 index 00000000..c1a88f9e --- /dev/null +++ b/docsite/posts/query/3-cli.md @@ -0,0 +1,48 @@ +--- +title: Query CLI +navtitle: CLI +layout: page +tags: [post, orchestration] +date: 2024-27-03 +--- + +The GraphRAG query CLI allows for no-code usage of the GraphRAG Query engine. + +```bash +python -m graphrag.query --data --community_level --response_type --method <"local"|"global"> +``` + +## CLI Arguments + +- `--data ` - Folder containing the `.parquet` output files from running the Indexer. +- `--community_level ` - Community level in the Leiden community hierarchy from which we will load the community reports higher value means we use reports on smaller communities. Default: 2 +- `--response_type ` - Free form text describing the response type and format, can be anything, e.g. `Multiple Paragraphs`, `Single Paragraph`, `Single Sentence`, `List of 3-7 Points`, `Single Page`, `Multi-Page Report`. Default: `Multiple Paragraphs`. +- `--method <"local"|"global">` - Method to use to answer the query, one of local or global. For more information check [Overview](overview.md) + +## Env Variables + +Required environment variables to execute: +- `GRAPHRAG_API_KEY` - API Key for executing the model, will fallback to `OPENAI_API_KEY` if one is not provided. +- `GRAPHRAG_LLM_MODEL` - Model to use for Chat Completions. +- `GRAPHRAG_EMBEDDING_MODEL` - Model to use for Embeddings. + +You can further customize the execution by providing these environment variables: + +- `GRAPHRAG_LLM_API_BASE` - The API Base URL. Default: `None` +- `GRAPHRAG_LLM_TYPE` - The LLM operation type. Either `openai_chat` or `azure_openai_chat`. Default: `openai_chat` +- `GRAPHRAG_LLM_MAX_RETRIES` - The maximum number of retries to attempt when a request fails. Default: `20` +- `GRAPHRAG_EMBEDDING_API_BASE` - The API Base URL. Default: `None` +- `GRAPHRAG_EMBEDDING_TYPE` - The embedding client to use. Either `openai_embedding` or `azure_openai_embedding`. Default: `openai_embedding` +- `GRAPHRAG_EMBEDDING_MAX_RETRIES` - The maximum number of retries to attempt when a request fails. Default: `20` +- `GRAPHRAG_LOCAL_SEARCH_TEXT_UNIT_PROP` - Proportion of context window dedicated to related text units. Default: `0.5` +- `GRAPHRAG_LOCAL_SEARCH_COMMUNITY_PROP` - Proportion of context window dedicated to community reports. Default: `0.1` +- `GRAPHRAG_LOCAL_SEARCH_CONVERSATION_HISTORY_MAX_TURNS` - Maximum number of turns to include in the conversation history. Default: `5` +- `GRAPHRAG_LOCAL_SEARCH_TOP_K_ENTITIES` - Number of related entities to retrieve from the entity description embedding store. Default: `10` +- `GRAPHRAG_LOCAL_SEARCH_TOP_K_RELATIONSHIPS` - Control the number of out-of-network relationships to pull into the context window. Default: `10` +- `GRAPHRAG_LOCAL_SEARCH_MAX_TOKENS` - Change this based on the token limit you have on your model (if you are using a model with 8k limit, a good setting could be 5000). Default: `12000` +- `GRAPHRAG_LOCAL_SEARCH_LLM_MAX_TOKENS` - Change this based on the token limit you have on your model (if you are using a model with 8k limit, a good setting could be 1000=1500). Default: `2000` +- `GRAPHRAG_GLOBAL_SEARCH_MAX_TOKENS` - Change this based on the token limit you have on your model (if you are using a model with 8k limit, a good setting could be 5000). Default: `12000` +- `GRAPHRAG_GLOBAL_SEARCH_DATA_MAX_TOKENS` - Change this based on the token limit you have on your model (if you are using a model with 8k limit, a good setting could be 5000). Default: `12000` +- `GRAPHRAG_GLOBAL_SEARCH_MAP_MAX_TOKENS` - Default: `500` +- `GRAPHRAG_GLOBAL_SEARCH_REDUCE_MAX_TOKENS` - Change this based on the token limit you have on your model (if you are using a model with 8k limit, a good setting could be 1000-1500). Default: `2000` +- `GRAPHRAG_GLOBAL_SEARCH_CONCURRENCY` - Default: `32` \ No newline at end of file diff --git a/docsite/posts/query/notebooks/overview.md b/docsite/posts/query/notebooks/overview.md new file mode 100644 index 00000000..cf1a8259 --- /dev/null +++ b/docsite/posts/query/notebooks/overview.md @@ -0,0 +1,13 @@ +--- +title: Query Engine Notebooks +navtitle: Query Engine Notebooks +layout: page +tags: [post, notebook] +--- + +For examples about running Query please refer to the following notebooks: + +- [Global Search Notebook](/posts/query/notebooks/global_search_nb) +- [Local Search Notebook](/posts/query/notebooks/local_search_nb) + +The test dataset for these notebooks can be found [here](/data/operation_dulce/dataset.zip). \ No newline at end of file diff --git a/docsite/posts/query/overview.md b/docsite/posts/query/overview.md new file mode 100644 index 00000000..2b725759 --- /dev/null +++ b/docsite/posts/query/overview.md @@ -0,0 +1,31 @@ +--- +title: Query Engine 🔎 +navtitle: Overview +tags: [post] +layout: page +--- + +The Query Engine is the retrieval module of the Graph RAG Library. It is one of the two main components of the Graph RAG library, the other being the Indexing Pipeline (see [Indexing Pipeline](/posts/index/overview)). +It is responsible for the following tasks: + +- [Local Search](#local-search) +- [Global Search](#global-search) +- [Question Generation](#question-generation) + +## Local Search + +Local search method generates answers by combining relevant data from the AI-extracted knowledge-graph with text chunks of the raw documents. This method is suitable for questions that require an understanding of specific entities mentioned in the documents (e.g. What are the healing properties of chamomile?). + +For more details about how Local Search works please refer to the [Local Search](/posts/query/1-local_search) documentation. + +## Global Search + +Global search method generates answers by searching over all AI-generated community reports in a map-reduce fashion. This is a resource-intensive method, but often gives good responses for questions that require an understanding of the dataset as a whole (e.g. What are the most significant values of the herbs mentioned in this notebook?). + +More about this can be checked at the [Global Search](/posts/query/0-global_search) documentation. + +## Question Generation + +This functionality takes a list of user queries and generates the next candidate questions. This is useful for generating follow-up questions in a conversation or for generating a list of questions for the investigator to dive deeper into the dataset. + +Information about how question generation works can be found at the [Question Generation](/posts/query/2-question_generation) documentation page. diff --git a/docsite/yarn.lock b/docsite/yarn.lock new file mode 100644 index 00000000..ad5b51fa --- /dev/null +++ b/docsite/yarn.lock @@ -0,0 +1,2793 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10 + +"@11ty/dependency-tree@npm:^2.0.1": + version: 2.0.1 + resolution: "@11ty/dependency-tree@npm:2.0.1" + checksum: f10df6f7fe71fd39ee6820146b450440bd0a03d7abb065e3486de6aa3e9cb341a480b912f650b360bf4a4383f87197f169a550c418e36efd359eaef17e97ea74 + languageName: node + linkType: hard + +"@11ty/eleventy-dev-server@npm:^1.0.4": + version: 1.0.4 + resolution: "@11ty/eleventy-dev-server@npm:1.0.4" + dependencies: + "@11ty/eleventy-utils": "npm:^1.0.1" + chokidar: "npm:^3.5.3" + debug: "npm:^4.3.4" + dev-ip: "npm:^1.0.1" + finalhandler: "npm:^1.2.0" + mime: "npm:^3.0.0" + minimist: "npm:^1.2.8" + morphdom: "npm:^2.7.0" + please-upgrade-node: "npm:^3.2.0" + ssri: "npm:^8.0.1" + ws: "npm:^8.13.0" + bin: + eleventy-dev-server: cmd.js + checksum: ff8dffcbd0eb2dfc3213cede12d09ddeaae39b2db68ac67685b55e9f0f2e3824e5065279ee0fd52b3190bf552219027fdac051d450364f0fefd6f6cc2ad9a194 + languageName: node + linkType: hard + +"@11ty/eleventy-plugin-syntaxhighlight@npm:^5.0.0": + version: 5.0.0 + resolution: "@11ty/eleventy-plugin-syntaxhighlight@npm:5.0.0" + dependencies: + prismjs: "npm:^1.29.0" + checksum: b6d2663a8fc2874e7893ce345e4a231bcdfbff58df79cc8974a39e34bef71bb0dfa8289a8123b7ed5324a4c842ad5f5021111189c0b43ba1a64a21001480b0c9 + languageName: node + linkType: hard + +"@11ty/eleventy-utils@npm:^1.0.1": + version: 1.0.2 + resolution: "@11ty/eleventy-utils@npm:1.0.2" + dependencies: + normalize-path: "npm:^3.0.0" + checksum: a7602dcf92197259d7dad5a5fd01cc425e8fe47e003f27404020eeeb4cabb641b036eb7d04b323dc9cd25382f92d4ab314de785e7c262e4627074d5797e27513 + languageName: node + linkType: hard + +"@11ty/eleventy@npm:^2.0.1": + version: 2.0.1 + resolution: "@11ty/eleventy@npm:2.0.1" + dependencies: + "@11ty/dependency-tree": "npm:^2.0.1" + "@11ty/eleventy-dev-server": "npm:^1.0.4" + "@11ty/eleventy-utils": "npm:^1.0.1" + "@11ty/lodash-custom": "npm:^4.17.21" + "@iarna/toml": "npm:^2.2.5" + "@sindresorhus/slugify": "npm:^1.1.2" + bcp-47-normalize: "npm:^1.1.1" + chokidar: "npm:^3.5.3" + cross-spawn: "npm:^7.0.3" + debug: "npm:^4.3.4" + dependency-graph: "npm:^0.11.0" + ejs: "npm:^3.1.9" + fast-glob: "npm:^3.2.12" + graceful-fs: "npm:^4.2.11" + gray-matter: "npm:^4.0.3" + hamljs: "npm:^0.6.2" + handlebars: "npm:^4.7.7" + is-glob: "npm:^4.0.3" + iso-639-1: "npm:^2.1.15" + kleur: "npm:^4.1.5" + liquidjs: "npm:^10.7.0" + luxon: "npm:^3.3.0" + markdown-it: "npm:^13.0.1" + micromatch: "npm:^4.0.5" + minimist: "npm:^1.2.8" + moo: "npm:^0.5.2" + multimatch: "npm:^5.0.0" + mustache: "npm:^4.2.0" + normalize-path: "npm:^3.0.0" + nunjucks: "npm:^3.2.3" + path-to-regexp: "npm:^6.2.1" + please-upgrade-node: "npm:^3.2.0" + posthtml: "npm:^0.16.6" + posthtml-urls: "npm:^1.0.0" + pug: "npm:^3.0.2" + recursive-copy: "npm:^2.0.14" + semver: "npm:^7.3.8" + slugify: "npm:^1.6.6" + bin: + eleventy: cmd.js + checksum: 560655c9f955c2597191c7dcc761b846b7b44bd5494a2fdfb58971841ff81a37ac3404cdbce49ea74b72f32f509982bf366e31e455f3112ca2671516fe79a709 + languageName: node + linkType: hard + +"@11ty/lodash-custom@npm:^4.17.21": + version: 4.17.21 + resolution: "@11ty/lodash-custom@npm:4.17.21" + checksum: 1b4658f2054757075ede5fd364613516513295c2f0d7112afb78133eb79c922310844196630046aa0d3687298f4d6040cdd043883511c368cbc7d61f4619fe4c + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.23.4": + version: 7.24.1 + resolution: "@babel/helper-string-parser@npm:7.24.1" + checksum: 04c0ede77b908b43e6124753b48bc485528112a9335f0a21a226bff1ace75bb6e64fab24c85cb4b1610ef3494dacd1cb807caeb6b79a7b36c43d48c289b35949 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-validator-identifier@npm:7.22.20" + checksum: df882d2675101df2d507b95b195ca2f86a3ef28cb711c84f37e79ca23178e13b9f0d8b522774211f51e40168bf5142be4c1c9776a150cddb61a0d5bf3e95750b + languageName: node + linkType: hard + +"@babel/parser@npm:^7.6.0, @babel/parser@npm:^7.9.6": + version: 7.24.4 + resolution: "@babel/parser@npm:7.24.4" + bin: + parser: ./bin/babel-parser.js + checksum: 3742cc5068036287e6395269dce5a2735e6349cdc8d4b53297c75f98c580d7e1c8cb43235623999d151f2ef975d677dbc2c2357573a1855caa71c271bf3046c9 + languageName: node + linkType: hard + +"@babel/types@npm:^7.6.1, @babel/types@npm:^7.8.3, @babel/types@npm:^7.9.6": + version: 7.24.0 + resolution: "@babel/types@npm:7.24.0" + dependencies: + "@babel/helper-string-parser": "npm:^7.23.4" + "@babel/helper-validator-identifier": "npm:^7.22.20" + to-fast-properties: "npm:^2.0.0" + checksum: a0b4875ce2e132f9daff0d5b27c7f4c4fcc97f2b084bdc5834e92c9d32592778489029e65d99d00c406da612d87b72d7a236c0afccaa1435c028d0c94c9b6da4 + languageName: node + linkType: hard + +"@graphrag/docsite@workspace:.": + version: 0.0.0-use.local + resolution: "@graphrag/docsite@workspace:." + dependencies: + "@11ty/eleventy": "npm:^2.0.1" + "@11ty/eleventy-plugin-syntaxhighlight": "npm:^5.0.0" + "@kevingimbel/eleventy-plugin-mermaid": "npm:^2.2.1" + eleventy-plugin-code-clipboard: "npm:^0.1.1" + markdown-it: "npm:^14.1.0" + languageName: unknown + linkType: soft + +"@iarna/toml@npm:^2.2.5": + version: 2.2.5 + resolution: "@iarna/toml@npm:2.2.5" + checksum: b61426dc1a3297bbcb24cb8e9c638663866b4bb6f28f2c377b167e4b1f8956d8d208c484b73bb59f4232249903545cc073364c43576d2d5ad66afbd730ad24a9 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: e9ed5fd27c3aec1095e3a16e0c0cf148d1fee55a38665c35f7b3f86a9b5d00d042ddaabc98e8a1cb7463b9378c15f22a94eb35e99469c201453eb8375191f243 + languageName: node + linkType: hard + +"@kevingimbel/eleventy-plugin-mermaid@npm:^2.2.1": + version: 2.2.1 + resolution: "@kevingimbel/eleventy-plugin-mermaid@npm:2.2.1" + dependencies: + htmlencode: "npm:^0.0.4" + checksum: 4870aca1f4d918e3174ba6b0fa1a3c71b8880ccd1b67d28490a67d90deeb6bad829bc97dc2e588be569c44a2d374cc0215f0019b9407b03c513d3e41038b6ba3 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 6ab2a9b8a1d67b067922c36f259e3b3dfd6b97b219c540877a4944549a4d49ea5ceba5663905ab5289682f1f3c15ff441d02f0447f620a42e1cb5e1937174d4b + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 40033e33e96e97d77fba5a238e4bba4487b8284678906a9f616b5579ddaf868a18874c0054a75402c9fbaaa033a25ceae093af58c9c30278e35c23c9479e79b0 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^2.0.0": + version: 2.2.2 + resolution: "@npmcli/agent@npm:2.2.2" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 96fc0036b101bae5032dc2a4cd832efb815ce9b33f9ee2f29909ee49d96a0026b3565f73c507a69eb8603f5cb32e0ae45a70cab1e2655990a4e06ae99f7f572a + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" + dependencies: + semver: "npm:^7.3.5" + checksum: f3a7ab3a31de65e42aeb6ed03ed035ef123d2de7af4deb9d4a003d27acc8618b57d9fb9d259fe6c28ca538032a028f37337264388ba27d26d37fff7dde22476e + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 115e8ceeec6bc69dff2048b35c0ab4f8bbee12d8bb6c1f4af758604586d802b6e669dcb02dda61d078de42c2b4ddce41b3d9e726d7daa6b4b850f4adbf7333ff + languageName: node + linkType: hard + +"@sindresorhus/slugify@npm:^1.1.2": + version: 1.1.2 + resolution: "@sindresorhus/slugify@npm:1.1.2" + dependencies: + "@sindresorhus/transliterate": "npm:^0.1.1" + escape-string-regexp: "npm:^4.0.0" + checksum: 5177152d3edb223650e71dcbf234b18ddd1782af1c0cf0787034f059399c0ddf22514cd3fdea0db86d7e3c9a96edae3a605e67ce1616962f7ac46f51a7f4a267 + languageName: node + linkType: hard + +"@sindresorhus/transliterate@npm:^0.1.1": + version: 0.1.2 + resolution: "@sindresorhus/transliterate@npm:0.1.2" + dependencies: + escape-string-regexp: "npm:^2.0.0" + lodash.deburr: "npm:^4.1.0" + checksum: bbe48cf3ecf53c25ef3d7f6a75521b95cd37ab5d786dd4fc9cddfb00502d8455720d7c585958caf34ab6f5fb7f8f4a9c055bfbe0d4a395523448f02a73c850a3 + languageName: node + linkType: hard + +"@types/minimatch@npm:^3.0.3": + version: 3.0.5 + resolution: "@types/minimatch@npm:3.0.5" + checksum: c41d136f67231c3131cf1d4ca0b06687f4a322918a3a5adddc87ce90ed9dbd175a3610adee36b106ae68c0b92c637c35e02b58c8a56c424f71d30993ea220b92 + languageName: node + linkType: hard + +"a-sync-waterfall@npm:^1.0.0": + version: 1.0.1 + resolution: "a-sync-waterfall@npm:1.0.1" + checksum: 6069080aff936c88fc32f798cc172a8b541e35b993dc5d2e43b74b6f37c522744eec107e1d475d2c624825c6cb7d2ec9ec020dbe4520578afcae74f11902daa2 + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: ca0a54e35bea4ece0ecb68a47b312e1a9a6f772408d5bcb9051230aaa94b0460671c5b5c9cb3240eb5b7bc94c52476550eb221f65a0bbd0145bdc9f3113a6707 + languageName: node + linkType: hard + +"acorn@npm:^7.1.1": + version: 7.4.1 + resolution: "acorn@npm:7.4.1" + bin: + acorn: bin/acorn + checksum: 8be2a40714756d713dfb62544128adce3b7102c6eb94bc312af196c2cc4af76e5b93079bd66b05e9ca31b35a9b0ce12171d16bc55f366cafdb794fdab9d753ec + languageName: node + linkType: hard + +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": + version: 7.1.1 + resolution: "agent-base@npm:7.1.1" + dependencies: + debug: "npm:^4.3.4" + checksum: c478fec8f79953f118704d007a38f2a185458853f5c45579b9669372bd0e12602e88dc2ad0233077831504f7cd6fcc8251c383375bba5eaaf563b102938bda26 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: b4494dfbfc7e4591b4711a396bd27e540f8153914123dccb4cdbbcb514015ada63a3809f362b9d8d4f6b17a706f1d7bea3c6f974b15fa5ae76b5b502070889ff + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: 70fdf883b704d17a5dfc9cde206e698c16bcd74e7f196ab821511651aee4f9f76c9514bdfa6ca3a27b5e49138b89cb222a28caf3afe4567570139577f991df32 + languageName: node + linkType: hard + +"any-promise@npm:^0.1.0": + version: 0.1.0 + resolution: "any-promise@npm:0.1.0" + checksum: d618bab8f9fec26593f004c7733e685463106bd36e166349891f3bac84fc30d1b4211730b5e2e6cb16e7d7faa5e61651adec362a1f54a6cd2c110d7ad8d5fb85 + languageName: node + linkType: hard + +"anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: c6a621343a553ff3779390bb5ee9c2263d6643ebcd7843227bdde6cc7adbed796eb5540ca98db19e3fd7b4714e1faa51551f8849b268bb62df27ddb15cbcd91e + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 18640244e641a417ec75a9bd38b0b2b6b95af5199aa241b131d4b2fb206f334d7ecc600bd194861610a5579084978bfcbb02baa399dbe442d56d0ae5e60dbaef + languageName: node + linkType: hard + +"array-differ@npm:^1.0.0": + version: 1.0.0 + resolution: "array-differ@npm:1.0.0" + checksum: ac6060952c7cb0a534c06ea3c6c960432d605d905e9901afe386e841aadc6e102ed81e0e6abe5eb4b50dd43907fc6426f6012b5ca784ec7741a5b398690c0998 + languageName: node + linkType: hard + +"array-differ@npm:^3.0.0": + version: 3.0.0 + resolution: "array-differ@npm:3.0.0" + checksum: 117edd9df5c1530bd116c6e8eea891d4bd02850fd89b1b36e532b6540e47ca620a373b81feca1c62d1395d9ae601516ba538abe5e8172d41091da2c546b05fb7 + languageName: node + linkType: hard + +"array-union@npm:^1.0.1": + version: 1.0.2 + resolution: "array-union@npm:1.0.2" + dependencies: + array-uniq: "npm:^1.0.1" + checksum: 82cec6421b6e6766556c484835a6d476a873f1b71cace5ab2b4f1b15b1e3162dc4da0d16f7a2b04d4aec18146c6638fe8f661340b31ba8e469fd811a1b45dc8d + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d + languageName: node + linkType: hard + +"array-uniq@npm:^1.0.1": + version: 1.0.3 + resolution: "array-uniq@npm:1.0.3" + checksum: 1625f06b093d8bf279b81adfec6e72951c0857d65b5e3f65f053fffe9f9dd61c2fc52cff57e38a4700817e7e3f01a4faa433d505ea9e33cdae4514c334e0bf9e + languageName: node + linkType: hard + +"arrify@npm:^1.0.0": + version: 1.0.1 + resolution: "arrify@npm:1.0.1" + checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 + languageName: node + linkType: hard + +"arrify@npm:^2.0.1": + version: 2.0.1 + resolution: "arrify@npm:2.0.1" + checksum: 067c4c1afd182806a82e4c1cb8acee16ab8b5284fbca1ce29408e6e91281c36bb5b612f6ddfbd40a0f7a7e0c75bf2696eb94c027f6e328d6e9c52465c98e4209 + languageName: node + linkType: hard + +"asap@npm:^2.0.3, asap@npm:~2.0.3": + version: 2.0.6 + resolution: "asap@npm:2.0.6" + checksum: b244c0458c571945e4b3be0b14eb001bea5596f9868cc50cc711dc03d58a7e953517d3f0dad81ccde3ff37d1f074701fa76a6f07d41aaa992d7204a37b915dda + languageName: node + linkType: hard + +"assert-never@npm:^1.2.1": + version: 1.2.1 + resolution: "assert-never@npm:1.2.1" + checksum: ea4f1756d90f55254c4dc7a20d6c5d5bc169160562aefe3d8756b598c10e695daf568f21b6d6b12245d7f3782d3ff83ef6a01ab75d487adfc6909470a813bf8c + languageName: node + linkType: hard + +"async@npm:^3.2.3": + version: 3.2.5 + resolution: "async@npm:3.2.5" + checksum: 323c3615c3f0ab1ac25a6f953296bc0ac3213d5e0f1c0debdb12964e55963af288d570293c11e44f7967af58c06d2a88d0ea588c86ec0fbf62fa98037f604a0f + languageName: node + linkType: hard + +"babel-walk@npm:3.0.0-canary-5": + version: 3.0.0-canary-5 + resolution: "babel-walk@npm:3.0.0-canary-5" + dependencies: + "@babel/types": "npm:^7.9.6" + checksum: f4cea17303b33266fa97be471df9917d386bb5cd2756ae4c4725b3f105b9d630789818be202de06afa546e94810add61d614aa5eeb16e2a3027636cbafac2c1a + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + languageName: node + linkType: hard + +"bcp-47-match@npm:^1.0.0": + version: 1.0.3 + resolution: "bcp-47-match@npm:1.0.3" + checksum: 27dd9792d611cffde96722a6c251d924d0f2a085219e59270600b02c544814f759ccc5ffdbf3f01bb154e750d80327e3df6c6f304f10bb38b3c974bb247bafaa + languageName: node + linkType: hard + +"bcp-47-normalize@npm:^1.1.1": + version: 1.1.1 + resolution: "bcp-47-normalize@npm:1.1.1" + dependencies: + bcp-47: "npm:^1.0.0" + bcp-47-match: "npm:^1.0.0" + checksum: 2c5b9219299765eb6298b436bc5f05b1ed33c1898130e548b139efd5dea9bd9d1d953949786883d7c1e61372f096c50cf2f008a7b31fd155933c567723885e1b + languageName: node + linkType: hard + +"bcp-47@npm:^1.0.0": + version: 1.0.8 + resolution: "bcp-47@npm:1.0.8" + dependencies: + is-alphabetical: "npm:^1.0.0" + is-alphanumerical: "npm:^1.0.0" + is-decimal: "npm:^1.0.0" + checksum: 0291be2a5989df2710c8b0af1e5b2e44069b317428445a66973e6b67b8d349ac7ac00e75838d1262b768be5811e52f4a2934f8d8874cbd433e2c9934b1896871 + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.3.0 + resolution: "binary-extensions@npm:2.3.0" + checksum: bcad01494e8a9283abf18c1b967af65ee79b0c6a9e6fcfafebfe91dbe6e0fc7272bafb73389e198b310516ae04f7ad17d79aacf6cb4c0d5d5202a7e2e52c7d98 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + languageName: node + linkType: hard + +"braces@npm:^3.0.2, braces@npm:~3.0.2": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: "npm:^7.1.1" + checksum: fad11a0d4697a27162840b02b1fad249c1683cbc510cd5bf1a471f2f8085c046d41094308c577a50a03a579dd99d5a6b3724c4b5e8b14df2c4443844cfcda2c6 + languageName: node + linkType: hard + +"cacache@npm:^18.0.0": + version: 18.0.2 + resolution: "cacache@npm:18.0.2" + dependencies: + "@npmcli/fs": "npm:^3.1.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^4.0.0" + ssri: "npm:^10.0.0" + tar: "npm:^6.1.11" + unique-filename: "npm:^3.0.0" + checksum: 5ca58464f785d4d64ac2019fcad95451c8c89bea25949f63acd8987fcc3493eaef1beccc0fa39e673506d879d3fc1ab420760f8a14f8ddf46ea2d121805a5e96 + languageName: node + linkType: hard + +"call-bind@npm:^1.0.2": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + set-function-length: "npm:^1.2.1" + checksum: cd6fe658e007af80985da5185bff7b55e12ef4c2b6f41829a26ed1eef254b1f1c12e3dfd5b2b068c6ba8b86aba62390842d81752e67dcbaec4f6f76e7113b6b7 + languageName: node + linkType: hard + +"chalk@npm:^4.0.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: cb3f3e594913d63b1814d7ca7c9bafbf895f75fbf93b92991980610dfd7b48500af4e3a5d4e3a8f337990a96b168d7eb84ee55efdce965e2ee8efc20f8c8f139 + languageName: node + linkType: hard + +"character-parser@npm:^2.2.0": + version: 2.2.0 + resolution: "character-parser@npm:2.2.0" + dependencies: + is-regex: "npm:^1.0.3" + checksum: 5980ddc776a133ba7a264aaec77ab9dd883aa9ff45bb335bfa93ae26b8e7360e60b2c97119f85cc4d2203829c9977df7c6ba6612354b1dfc9ef41d84fde03002 + languageName: node + linkType: hard + +"chokidar@npm:^3.5.3": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: c327fb07704443f8d15f7b4a7ce93b2f0bc0e6cea07ec28a7570aa22cd51fcf0379df589403976ea956c369f25aa82d84561947e227cd925902e1751371658df + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: fa00c91b4332b294de06b443923246bccebe9fab1b253f7fe1772d37b06a2269b4039a85e309abe1fe11b267b11c08d1d0473fda3badd6167f57313af2887a64 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + languageName: node + linkType: hard + +"commander@npm:^10.0.0": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: 8799faa84a30da985802e661cc9856adfaee324d4b138413013ef7f087e8d7924b144c30a1f1405475f0909f467665cd9e1ce13270a2f41b141dab0b7a58f3fb + languageName: node + linkType: hard + +"commander@npm:^5.1.0": + version: 5.1.0 + resolution: "commander@npm:5.1.0" + checksum: 3e2ef5c003c5179250161e42ce6d48e0e69a54af970c65b7f985c70095240c260fd647453efd4c2c5a31b30ce468f373dc70f769c2f54a2c014abc4792aaca28 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 9680699c8e2b3af0ae22592cb764acaf973f292a7b71b8a06720233011853a58e256c89216a10cbe889727532fd77f8bcd49a760cedfde271b8e006c20e079f2 + languageName: node + linkType: hard + +"constantinople@npm:^4.0.1": + version: 4.0.1 + resolution: "constantinople@npm:4.0.1" + dependencies: + "@babel/parser": "npm:^7.6.0" + "@babel/types": "npm:^7.6.1" + checksum: 15fc9bec82711f275e35581fe97a7e7b8d30441745955023570f258bbf876f4bf3de84faa6e7a663a3048565d9cc58bde65d300f74d090faec6afe07913d584f + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: e1a13869d2f57d974de0d9ef7acbf69dc6937db20b918525a01dacb5032129bd552d290d886d981e99f1b624cb03657084cc87bd40f115c07ecf376821c729ce + languageName: node + linkType: hard + +"debug@npm:2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: "npm:2.0.0" + checksum: e07005f2b40e04f1bd14a3dd20520e9c4f25f60224cb006ce9d6781732c917964e9ec029fc7f1a151083cd929025ad5133814d4dc624a9aaf020effe4914ed14 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: "npm:2.1.2" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 0073c3bcbd9cb7d71dd5f6b55be8701af42df3e56e911186dfa46fac3a5b9eb7ce7f377dd1d3be6db8977221f8eb333d945216f645cf56f6b688cd484837d255 + languageName: node + linkType: hard + +"define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: abdcb2505d80a53524ba871273e5da75e77e52af9e15b3aa65d8aad82b8a3a424dad7aee2cc0b71470ac7acf501e08defac362e8b6a73cdb4309f028061df4ae + languageName: node + linkType: hard + +"dependency-graph@npm:^0.11.0": + version: 0.11.0 + resolution: "dependency-graph@npm:0.11.0" + checksum: 6b5eb540303753037a613e781da4b81534d139cbabc92f342630ed622e3ef4c332fc40cf87823e1ec71a7aeb4b195f8d88d7e625931ce6007bf2bf09a8bfb01e + languageName: node + linkType: hard + +"dev-ip@npm:^1.0.1": + version: 1.0.1 + resolution: "dev-ip@npm:1.0.1" + bin: + dev-ip: lib/dev-ip.js + checksum: 274a6470c2143e4cdcb2b27e0bea137dbc2b42667eb59c890e703185054cb2bcaf2d8533e7ad2f532fe551a90542abc6b37053e8d73918a4fcfb7ffd76589620 + languageName: node + linkType: hard + +"doctypes@npm:^1.1.0": + version: 1.1.0 + resolution: "doctypes@npm:1.1.0" + checksum: 6e6c2d1a80f2072dc4831994c914c44455e341c5ab18c16797368a0afd59d7c22f3335805ba2c1dd2931e9539d1ba8b613b7650dc63f6ab56b77b8d888055de8 + languageName: node + linkType: hard + +"dom-serializer@npm:^1.0.1": + version: 1.4.1 + resolution: "dom-serializer@npm:1.4.1" + dependencies: + domelementtype: "npm:^2.0.1" + domhandler: "npm:^4.2.0" + entities: "npm:^2.0.0" + checksum: 53b217bcfed4a0f90dd47f34f239b1c81fff53ffa39d164d722325817fdb554903b145c2d12c8421ce0df7d31c1b180caf7eacd3c86391dd925f803df8027dcc + languageName: node + linkType: hard + +"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0": + version: 2.3.0 + resolution: "domelementtype@npm:2.3.0" + checksum: ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6 + languageName: node + linkType: hard + +"domhandler@npm:^4.2.0, domhandler@npm:^4.2.2": + version: 4.3.1 + resolution: "domhandler@npm:4.3.1" + dependencies: + domelementtype: "npm:^2.2.0" + checksum: e0d2af7403997a3ca040a9ace4a233b75ebe321e0ef628b417e46d619d65d47781b2f2038b6c2ef6e56e73e66aec99caf6a12c7e687ecff18ef74af6dfbde5de + languageName: node + linkType: hard + +"domutils@npm:^2.8.0": + version: 2.8.0 + resolution: "domutils@npm:2.8.0" + dependencies: + dom-serializer: "npm:^1.0.1" + domelementtype: "npm:^2.2.0" + domhandler: "npm:^4.2.0" + checksum: 1f316a03f00b09a8893d4a25d297d5cbffd02c564509dede28ef72d5ce38d93f6d61f1de88d439f31b14a1d9b42f587ed711b9e8b1b4d3bf6001399832bfc4e0 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 9b1d3e1baefeaf7d70799db8774149cef33b97183a6addceeba0cf6b85ba23ee2686f302f14482006df32df75d32b17c509c143a3689627929e4a8efaf483952 + languageName: node + linkType: hard + +"ee-first@npm:1.1.1": + version: 1.1.1 + resolution: "ee-first@npm:1.1.1" + checksum: 1b4cac778d64ce3b582a7e26b218afe07e207a0f9bfe13cc7395a6d307849cfe361e65033c3251e00c27dd060cab43014c2d6b2647676135e18b77d2d05b3f4f + languageName: node + linkType: hard + +"ejs@npm:^3.1.9": + version: 3.1.10 + resolution: "ejs@npm:3.1.10" + dependencies: + jake: "npm:^10.8.5" + bin: + ejs: bin/cli.js + checksum: a9cb7d7cd13b7b1cd0be5c4788e44dd10d92f7285d2f65b942f33e127230c054f99a42db4d99f766d8dbc6c57e94799593ee66a14efd7c8dd70c4812bf6aa384 + languageName: node + linkType: hard + +"eleventy-plugin-code-clipboard@npm:^0.1.1": + version: 0.1.1 + resolution: "eleventy-plugin-code-clipboard@npm:0.1.1" + dependencies: + uglify-js: "npm:^3.14.5" + checksum: c3bd659bd9d950cad786fd4ff14fcdd7dc9046269de3f3694d4cc1a87c51ea3bb6b263acd7b78a5954d0fef103463808cdb17269c86455f0e2a4a5790905db45 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: c72d67a6821be15ec11997877c437491c313d924306b8da5d87d2a2bcc2cec9903cb5b04ee1a088460501d8e5b44f10df82fdc93c444101a7610b80c8b6938e1 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 915acf859cea7131dac1b2b5c9c8e35c4849e325a1d114c30adb8cd615970f6dca0e27f64f3a4949d7d6ed86ecd79a1c5c63f02e697513cddd7b5835c90948b8 + languageName: node + linkType: hard + +"encodeurl@npm:~1.0.2": + version: 1.0.2 + resolution: "encodeurl@npm:1.0.2" + checksum: e50e3d508cdd9c4565ba72d2012e65038e5d71bdc9198cb125beb6237b5b1ade6c0d343998da9e170fb2eae52c1bed37d4d6d98a46ea423a0cddbed5ac3f780c + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f + languageName: node + linkType: hard + +"entities@npm:^2.0.0": + version: 2.2.0 + resolution: "entities@npm:2.2.0" + checksum: 2c765221ee324dbe25e1b8ca5d1bf2a4d39e750548f2e85cbf7ca1d167d709689ddf1796623e66666ae747364c11ed512c03b48c5bbe70968d30f2a4009509b7 + languageName: node + linkType: hard + +"entities@npm:^3.0.1, entities@npm:~3.0.1": + version: 3.0.1 + resolution: "entities@npm:3.0.1" + checksum: 3706e0292ea3f3679720b3d3b1ed6290b164aaeb11116691a922a3acea144503871e0de2170b47671c3b735549b8b7f4741d0d3c2987e8f985ccaa0dd3762eba + languageName: node + linkType: hard + +"entities@npm:^4.4.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: ede2a35c9bce1aeccd055a1b445d41c75a14a2bb1cd22e242f20cf04d236cdcd7f9c859eb83f76885327bfae0c25bf03303665ee1ce3d47c5927b98b0e3e3d48 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 1d20d825cdcce8d811bfbe86340f4755c02655a7feb2f13f8c880566d9d72a3f6c92c192a6867632e490d6da67b678271f46e01044996a6443e870331100dfdd + languageName: node + linkType: hard + +"errno@npm:^0.1.2": + version: 0.1.8 + resolution: "errno@npm:0.1.8" + dependencies: + prr: "npm:~1.0.1" + bin: + errno: cli.js + checksum: 93076ed11bedb8f0389cbefcbdd3445f66443159439dccbaac89a053428ad92147676736235d275612dc0296d3f9a7e6b7177ed78a566b6cd15dacd4fa0d5888 + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: "npm:^1.2.4" + checksum: f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 96e65d640156f91b707517e8cdc454dd7d47c32833aa3e85d79f24f9eb7ea85f39b63e36216ef0114996581969b59fe609a94e30316b08f5f4df1d44134cf8d5 + languageName: node + linkType: hard + +"escape-html@npm:~1.0.3": + version: 1.0.3 + resolution: "escape-html@npm:1.0.3" + checksum: 6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: f1d3c622ad992421362294f7acf866aa9409fbad4eb2e8fa230bd33944ce371d32279667b242d8b8907ec2b6ad7353a717f3c0e60e748873a34a7905174bc0eb + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 2d9bbb6473de7051f96790d5f9a678f32e60ed0aa70741dc7fdc96fec8d631124ec3374ac144387604f05afff9500f31a1d45bd9eee4cdc2e4f9ad2d9b9d5dbd + languageName: node + linkType: hard + +"extend-shallow@npm:^2.0.1": + version: 2.0.1 + resolution: "extend-shallow@npm:2.0.1" + dependencies: + is-extendable: "npm:^0.1.0" + checksum: 8fb58d9d7a511f4baf78d383e637bd7d2e80843bd9cd0853649108ea835208fb614da502a553acc30208e1325240bb7cc4a68473021612496bb89725483656d8 + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.12": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.4" + checksum: 222512e9315a0efca1276af9adb2127f02105d7288fa746145bf45e2716383fb79eb983c89601a72a399a56b7c18d38ce70457c5466218c5f13fad957cee16df + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.17.1 + resolution: "fastq@npm:1.17.1" + dependencies: + reusify: "npm:^1.0.4" + checksum: a443180068b527dd7b3a63dc7f2a47ceca2f3e97b9c00a1efe5538757e6cc4056a3526df94308075d7727561baf09ebaa5b67da8dcbddb913a021c5ae69d1f69 + languageName: node + linkType: hard + +"filelist@npm:^1.0.4": + version: 1.0.4 + resolution: "filelist@npm:1.0.4" + dependencies: + minimatch: "npm:^5.0.1" + checksum: 4b436fa944b1508b95cffdfc8176ae6947b92825483639ef1b9a89b27d82f3f8aa22b21eed471993f92709b431670d4e015b39c087d435a61e1bb04564cf51de + languageName: node + linkType: hard + +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: a7095cb39e5bc32fada2aa7c7249d3f6b01bd1ce461a61b0adabacccabd9198500c6fb1f68a7c851a657e273fce2233ba869638897f3d7ed2e87a2d89b4436ea + languageName: node + linkType: hard + +"finalhandler@npm:^1.2.0": + version: 1.2.0 + resolution: "finalhandler@npm:1.2.0" + dependencies: + debug: "npm:2.6.9" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + statuses: "npm:2.0.1" + unpipe: "npm:~1.0.0" + checksum: 635718cb203c6d18e6b48dfbb6c54ccb08ea470e4f474ddcef38c47edcf3227feec316f886dd701235997d8af35240cae49856721ce18f539ad038665ebbf163 + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" + dependencies: + cross-spawn: "npm:^7.0.0" + signal-exit: "npm:^4.0.1" + checksum: 087edd44857d258c4f73ad84cb8df980826569656f2550c341b27adf5335354393eec24ea2fabd43a253233fb27cee177ebe46bd0b7ea129c77e87cb1e9936fb + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: "npm:^3.0.0" + checksum: 03191781e94bc9a54bd376d3146f90fe8e082627c502185dbf7b9b3032f66b0b142c1115f3b2cc5936575fc1b44845ce903dd4c21bec2a8d69f3bd56f9cee9ec + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: af143246cf6884fe26fa281621d45cfe111d34b30535a475bfa38dafe343dadb466c047a924ffc7d6b7b18265df4110224ce3803806dbb07173bf2087b648d7f + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: e703107c28e362d8d7b910bbcbfd371e640a3bb45ae157a362b5952c0030c0b6d4981140ec319b347bce7adc025dd7813da1ff908a945ac214d64f5402a51b96 + languageName: node + linkType: hard + +"fsevents@npm:~2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 4c1ade961ded57cdbfbb5cac5106ec17bc8bccd62e16343c569a0ceeca83b9dfef87550b4dc5cbb89642da412b20c5071f304c8c464b80415446e8e155a038c0 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 185e20d20f10c8d661d59aac0f3b63b31132d492e1b11fcc2a93cb2c47257ebaee7407c38513efd2b35cafdf972d9beb2ea4593c1e0f3bf8f2744836928d7454 + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.0" + checksum: 85bbf4b234c3940edf8a41f4ecbd4e25ce78e5e6ad4e24ca2f77037d983b9ef943fd72f00f3ee97a49ec622a506b67db49c36246150377efcda1c9eb03e5f06d + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: 32cd106ce8c0d83731966d31517adb766d02c3812de49c30cfe0675c7c0ae6630c11214c54a5ae67aca882cf738d27fd7768f21aa19118b9245950554be07247 + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10": + version: 10.3.12 + resolution: "glob@npm:10.3.12" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^2.3.6" + minimatch: "npm:^9.0.1" + minipass: "npm:^7.0.4" + path-scurry: "npm:^1.10.2" + bin: + glob: dist/esm/bin.mjs + checksum: 9e8186abc22dc824b5dd86cefd8e6b5621a72d1be7f68bacc0fd681e8c162ec5546660a6ec0553d6a74757a585e655956c7f8f1a6d24570e8d865c307323d178 + languageName: node + linkType: hard + +"glob@npm:^7.1.3": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 59452a9202c81d4508a43b8af7082ca5c76452b9fcc4a9ab17655822e6ce9b21d4f8fbadabe4fe3faef448294cec249af305e2cd824b7e9aaf689240e5e96a7b + languageName: node + linkType: hard + +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.1.3" + checksum: 5fbc7ad57b368ae4cd2f41214bd947b045c1a4be2f194a7be1778d71f8af9dbf4004221f3b6f23e30820eb0d052b4f819fe6ebe8221e2a3c6f0ee4ef173421ca + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.4, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 + languageName: node + linkType: hard + +"gray-matter@npm:^4.0.3": + version: 4.0.3 + resolution: "gray-matter@npm:4.0.3" + dependencies: + js-yaml: "npm:^3.13.1" + kind-of: "npm:^6.0.2" + section-matter: "npm:^1.0.0" + strip-bom-string: "npm:^1.0.0" + checksum: 9a8f146a7a918d2524d5d60e0b4d45729f5bca54aa41247f971d9e4bc984943fda58159435763d463ec2abc8a0e238e807bd9b05e3a48f4a613a325c9dd5ad0c + languageName: node + linkType: hard + +"hamljs@npm:^0.6.2": + version: 0.6.2 + resolution: "hamljs@npm:0.6.2" + checksum: 7810b962a5e7356bf3131b17645220f0a672d1bcd201336f5e2a83d615bd753fb5312b338e6b8a2f9b81c07bcac95ca3ca8481ca4384fbe768f6bef657fe10c2 + languageName: node + linkType: hard + +"handlebars@npm:^4.7.7": + version: 4.7.8 + resolution: "handlebars@npm:4.7.8" + dependencies: + minimist: "npm:^1.2.5" + neo-async: "npm:^2.6.2" + source-map: "npm:^0.6.1" + uglify-js: "npm:^3.1.4" + wordwrap: "npm:^1.0.0" + dependenciesMeta: + uglify-js: + optional: true + bin: + handlebars: bin/handlebars + checksum: bd528f4dd150adf67f3f857118ef0fa43ff79a153b1d943fa0a770f2599e38b25a7a0dbac1a3611a4ec86970fd2325a81310fb788b5c892308c9f8743bd02e11 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 2d8c9ab8cebb572e3362f7d06139a4592105983d4317e68f7adba320fe6ddfc8874581e0971e899e633fd5f72e262830edce36d5a0bc863dad17ad20572484b2 + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1": + version: 1.0.3 + resolution: "has-proto@npm:1.0.3" + checksum: 0b67c2c94e3bea37db3e412e3c41f79d59259875e636ba471e94c009cdfb1fa82bf045deeffafc7dbb9c148e36cae6b467055aaa5d9fad4316e11b41e3ba551a + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: 464f97a8202a7690dadd026e6d73b1ceeddd60fe6acfd06151106f050303eaa75855aaa94969df8015c11ff7c505f196114d22f7386b4a471038da5874cf5e9b + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.0": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: "npm:^1.0.3" + checksum: c74c5f5ceee3c8a5b8bc37719840dc3749f5b0306d818974141dda2471a1a2ca6c8e46b9d6ac222c5345df7a901c9b6f350b1e6d62763fec877e26609a401bfe + languageName: node + linkType: hard + +"hasown@npm:^2.0.0": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 7898a9c1788b2862cf0f9c345a6bec77ba4a0c0983c7f19d610c382343d4f98fa260686b225dfb1f88393a66679d2ec58ee310c1d6868c081eda7918f32cc70a + languageName: node + linkType: hard + +"htmlencode@npm:^0.0.4": + version: 0.0.4 + resolution: "htmlencode@npm:0.0.4" + checksum: a36da12431c32acd8c55b2d2266c7cf6697616730011d28cb84765bf9aae62002224c74411622cf209be6da81024c72734de727f96e337130619f5cc60b23932 + languageName: node + linkType: hard + +"htmlparser2@npm:^7.1.1": + version: 7.2.0 + resolution: "htmlparser2@npm:7.2.0" + dependencies: + domelementtype: "npm:^2.0.1" + domhandler: "npm:^4.2.2" + domutils: "npm:^2.8.0" + entities: "npm:^3.0.1" + checksum: fd097e19c01fb4ac8f44e432ae2908a606a382ccfec90efc91354a5b153540feade679ab8dca5fdebbe4f27c5a700743e2a0794f5a7a1beae9cc59d47e0f24b5 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 362d5ed66b12ceb9c0a328fb31200b590ab1b02f4a254a697dc796850cc4385603e75f53ec59f768b2dad3bfa1464bd229f7de278d2899a0e3beffc634b6683f + languageName: node + linkType: hard + +"http-equiv-refresh@npm:^1.0.0": + version: 1.0.0 + resolution: "http-equiv-refresh@npm:1.0.0" + checksum: 4404bbb9eb163382cd4ecfff359bf1eb709e3dc266af725b27ae96d08eb079e86508cfd59cf04eca3fadc2351e0077b0edd7ced01d1f219c20da28997d350ab6 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: d062acfa0cb82beeb558f1043c6ba770ea892b5fb7b28654dbc70ea2aeea55226dd34c02a294f6c1ca179a5aa483c4ea641846821b182edbd9cc5d89b54c6848 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.4 + resolution: "https-proxy-agent@npm:7.0.4" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:4" + checksum: 405fe582bba461bfe5c7e2f8d752b384036854488b828ae6df6a587c654299cbb2c50df38c4b6ab303502c3c5e029a793fbaac965d1e86ee0be03faceb554d63 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 24e3292dd3dadaa81d065c6f8c41b274a47098150d444b96e5f53b4638a9a71482921ea6a91a1f59bb71d9796de25e04afd05919fa64c360347ba65d3766f10f + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 2d30b157a91fe1c1d7c6f653cbf263f039be6c5bfa959245a16d4ee191fc0f2af86c08545b6e6beeb041c56b574d2d5b9f95343d378ab49c0f37394d541e7fc8 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: cd3f5cbc9ca2d624c6a1f53f12e6b341659aba0e2d3254ae2b4464aaea8b4294cdb09616abbc59458f980531f2429784ed6a420d48d245bcad0811980c9efae9 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: d2ebd65441a38c8336c223d1b80b921b9fa737e37ea466fd7e253cb000c64ae1f17fa59e68130ef5bda92cfd8d36b83d37dab0eb0a4558bcfec8e8cdfd2dcb67 + languageName: node + linkType: hard + +"inherits@npm:2": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: cd45e923bee15186c07fa4c89db0aace24824c482fb887b528304694b2aa6ff8a898da8657046a5dcf3e46cd6db6c61629551f9215f208d7c3f157cf9b290521 + languageName: node + linkType: hard + +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: "npm:1.1.0" + sprintf-js: "npm:^1.1.3" + checksum: 1ed81e06721af012306329b31f532b5e24e00cb537be18ddc905a84f19fe8f83a09a1699862bf3a1ec4b9dea93c55a3fa5faf8b5ea380431469df540f38b092c + languageName: node + linkType: hard + +"is-alphabetical@npm:^1.0.0": + version: 1.0.4 + resolution: "is-alphabetical@npm:1.0.4" + checksum: 6508cce44fd348f06705d377b260974f4ce68c74000e7da4045f0d919e568226dc3ce9685c5a2af272195384df6930f748ce9213fc9f399b5d31b362c66312cb + languageName: node + linkType: hard + +"is-alphanumerical@npm:^1.0.0": + version: 1.0.4 + resolution: "is-alphanumerical@npm:1.0.4" + dependencies: + is-alphabetical: "npm:^1.0.0" + is-decimal: "npm:^1.0.0" + checksum: e2e491acc16fcf5b363f7c726f666a9538dba0a043665740feb45bba1652457a73441e7c5179c6768a638ed396db3437e9905f403644ec7c468fb41f4813d03f + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: "npm:^2.0.0" + checksum: 078e51b4f956c2c5fd2b26bb2672c3ccf7e1faff38e0ebdba45612265f4e3d9fc3127a1fa8370bbf09eab61339203c3d3b7af5662cbf8be4030f8fac37745b0e + languageName: node + linkType: hard + +"is-core-module@npm:^2.13.0": + version: 2.13.1 + resolution: "is-core-module@npm:2.13.1" + dependencies: + hasown: "npm:^2.0.0" + checksum: d53bd0cc24b0a0351fb4b206ee3908f71b9bbf1c47e9c9e14e5f06d292af1663704d2abd7e67700d6487b2b7864e0d0f6f10a1edf1892864bdffcb197d1845a2 + languageName: node + linkType: hard + +"is-decimal@npm:^1.0.0": + version: 1.0.4 + resolution: "is-decimal@npm:1.0.4" + checksum: ed483a387517856dc395c68403a10201fddcc1b63dc56513fbe2fe86ab38766120090ecdbfed89223d84ca8b1cd28b0641b93cb6597b6e8f4c097a7c24e3fb96 + languageName: node + linkType: hard + +"is-expression@npm:^4.0.0": + version: 4.0.0 + resolution: "is-expression@npm:4.0.0" + dependencies: + acorn: "npm:^7.1.1" + object-assign: "npm:^4.1.1" + checksum: 0f01d0ff53fbbec36abae8fbb7ef056c6d024f7128646856a3e6c500b205788d3e0f337025e72df979d7d7cf4674a00370633d7f8974c668b2d3fdb7e8a83bdb + languageName: node + linkType: hard + +"is-extendable@npm:^0.1.0": + version: 0.1.1 + resolution: "is-extendable@npm:0.1.1" + checksum: 3875571d20a7563772ecc7a5f36cb03167e9be31ad259041b4a8f73f33f885441f778cee1f1fe0085eb4bc71679b9d8c923690003a36a6a5fdf8023e6e3f0672 + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 3ed74f2b0cdf4f401f38edb0442ddfde3092d79d7d35c9919c86641efdbcbb32e45aa3c0f70ce5eecc946896cd5a0f26e4188b9f2b881876f7cb6c505b82da11 + languageName: node + linkType: hard + +"is-json@npm:^2.0.1": + version: 2.0.1 + resolution: "is-json@npm:2.0.1" + checksum: 29a768ad31d2ade15188578967120aa730cd2145e53a88ab88e022f0b4597368228f28a9de08c3cfbb0c80de1fae26fab21910e5b71c3b5661f2a41c05f9ae8d + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 6a6c3383f68afa1e05b286af866017c78f1226d43ac8cb064e115ff9ed85eb33f5c4f7216c96a71e4dfea289ef52c5da3aef5bbfade8ffe47a0465d70c0c8e86 + languageName: node + linkType: hard + +"is-promise@npm:^2.0.0": + version: 2.2.2 + resolution: "is-promise@npm:2.2.2" + checksum: 18bf7d1c59953e0ad82a1ed963fb3dc0d135c8f299a14f89a17af312fc918373136e56028e8831700e1933519630cc2fd4179a777030330fde20d34e96f40c78 + languageName: node + linkType: hard + +"is-regex@npm:^1.0.3": + version: 1.1.4 + resolution: "is-regex@npm:1.1.4" + dependencies: + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: 36d9174d16d520b489a5e9001d7d8d8624103b387be300c50f860d9414556d0485d74a612fdafc6ebbd5c89213d947dcc6b6bff6b2312093f71ea03cbb19e564 + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 7c9f715c03aff08f35e98b1fadae1b9267b38f0615d501824f9743f3aab99ef10e303ce7db3f186763a0b70a19de5791ebfc854ff884d5a8c4d92211f642ec92 + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 7fe1931ee4e88eb5aa524cd3ceb8c882537bc3a81b02e438b240e47012eef49c86904d0f0e593ea7c3a9996d18d0f1f3be8d3eaa92333977b0c3a9d353d5563e + languageName: node + linkType: hard + +"iso-639-1@npm:^2.1.15": + version: 2.1.15 + resolution: "iso-639-1@npm:2.1.15" + checksum: 32f6cfdfa5e85eef54cb2df77829e6678e9479e9b6a7fdb7e75ba0005957d4da35ff315b69c354e216ba46044e4437b1823362d27dff14bcefbb408b2a66e2f8 + languageName: node + linkType: hard + +"jackspeak@npm:^2.3.6": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 6e6490d676af8c94a7b5b29b8fd5629f21346911ebe2e32931c2a54210134408171c24cee1a109df2ec19894ad04a429402a8438cbf5cc2794585d35428ace76 + languageName: node + linkType: hard + +"jake@npm:^10.8.5": + version: 10.8.7 + resolution: "jake@npm:10.8.7" + dependencies: + async: "npm:^3.2.3" + chalk: "npm:^4.0.2" + filelist: "npm:^1.0.4" + minimatch: "npm:^3.1.2" + bin: + jake: bin/cli.js + checksum: ad1cfe398836df4e6962954e5095597c21c5af1ea5a4182f6adf0869df8aca467a2eeca7869bf44f47120f4dd4ea52589d16050d295c87a5906c0d744775acc3 + languageName: node + linkType: hard + +"js-stringify@npm:^1.0.2": + version: 1.0.2 + resolution: "js-stringify@npm:1.0.2" + checksum: f9701d9e535d3ac0f62bbf2624b76c5d0af5b889187232817ae284a41ba21fd7a8b464c2dce3815d8cf52c8bea3480be6b368cfc2c67da799cad458058e8bbf5 + languageName: node + linkType: hard + +"js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 9e22d80b4d0105b9899135365f746d47466ed53ef4223c529b3c0f7a39907743fdbd3c4379f94f1106f02755b5e90b2faaf84801a891135544e1ea475d1a1379 + languageName: node + linkType: hard + +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: bebe7ae829bbd586ce8cbe83501dd8cb8c282c8902a8aeeed0a073a89dc37e8103b1244f3c6acd60278bcbfe12d93a3f83c9ac396868a3b3bbc3c5e5e3b648ef + languageName: node + linkType: hard + +"jstransformer@npm:1.0.0": + version: 1.0.0 + resolution: "jstransformer@npm:1.0.0" + dependencies: + is-promise: "npm:^2.0.0" + promise: "npm:^7.0.1" + checksum: 7bca6e2e2fb4b6e65e567965e0370488699eb05cbbf27e6cb2ee2a89912d9c238aceb5c63216d834c50a000ed991b2bbd703b5432351aa2a15ee979b5180e652 + languageName: node + linkType: hard + +"junk@npm:^1.0.1": + version: 1.0.3 + resolution: "junk@npm:1.0.3" + checksum: 0646ce69b7292c970e7071c028a2537c29297802209301de48aef96557a8c23cfc9058f19f672b95260c1776fb0b5e4b055ac48a282163b069f391cd644b4324 + languageName: node + linkType: hard + +"kind-of@npm:^6.0.0, kind-of@npm:^6.0.2": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 5873d303fb36aad875b7538798867da2ae5c9e328d67194b0162a3659a627d22f742fc9c4ae95cd1704132a24b00cae5041fc00c0f6ef937dc17080dc4dbb962 + languageName: node + linkType: hard + +"kleur@npm:^4.1.5": + version: 4.1.5 + resolution: "kleur@npm:4.1.5" + checksum: 44d84cc4eedd4311099402ef6d4acd9b2d16e08e499d6ef3bb92389bd4692d7ef09e35248c26e27f98acac532122acb12a1bfee645994ae3af4f0a37996da7df + languageName: node + linkType: hard + +"linkify-it@npm:^4.0.1": + version: 4.0.1 + resolution: "linkify-it@npm:4.0.1" + dependencies: + uc.micro: "npm:^1.0.1" + checksum: d0a786d2e3f02f46b6f4a9b466af9eb936fb68e86b7cd305933d5457b12fdc53a4d0e0b697b02dc2e7d84a51d2425d719598bb7b47af7e01911e492e07a97957 + languageName: node + linkType: hard + +"linkify-it@npm:^5.0.0": + version: 5.0.0 + resolution: "linkify-it@npm:5.0.0" + dependencies: + uc.micro: "npm:^2.0.0" + checksum: ef3b7609dda6ec0c0be8a7b879cea195f0d36387b0011660cd6711bba0ad82137f59b458b7e703ec74f11d88e7c1328e2ad9b855a8500c0ded67461a8c4519e6 + languageName: node + linkType: hard + +"liquidjs@npm:^10.7.0": + version: 10.10.2 + resolution: "liquidjs@npm:10.10.2" + dependencies: + commander: "npm:^10.0.0" + bin: + liquid: bin/liquid.js + liquidjs: bin/liquid.js + checksum: 5257257a03526db1f15a41a60508be481450a719cbfa4ee078ad34db0c8c27377d211e07a030aa9c1154b2d26838b7c10fb2687a65e543e3f7256932e7609c40 + languageName: node + linkType: hard + +"list-to-array@npm:^1.1.0": + version: 1.1.0 + resolution: "list-to-array@npm:1.1.0" + checksum: c5b0e100799170005b034d83ea3628b0e9af566bc6a280f263564fe02f1590d75fddd4c2f28a11bddc89ab27217b372a9ba0e7b6caeb0a7c7dc77bda6413e6ff + languageName: node + linkType: hard + +"lodash.deburr@npm:^4.1.0": + version: 4.1.0 + resolution: "lodash.deburr@npm:4.1.0" + checksum: 165ce8f8a051360f98ce977f12bd645fe3faf3cc2452aa36f5a8849e3e69463e2252ff952ed6b7cc33c8f608fcbe56e7d13baf524818da95cb53849d366b62be + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.2.0 + resolution: "lru-cache@npm:10.2.0" + checksum: 502ec42c3309c0eae1ce41afca471f831c278566d45a5273a0c51102dee31e0e250a62fa9029c3370988df33a14188a38e682c16143b794de78668de3643e302 + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: "npm:^4.0.0" + checksum: fc1fe2ee205f7c8855fa0f34c1ab0bcf14b6229e35579ec1fd1079f31d6fc8ef8eb6fd17f2f4d99788d7e339f50e047555551ebd5e434dda503696e7c6591825 + languageName: node + linkType: hard + +"luxon@npm:^3.3.0": + version: 3.4.4 + resolution: "luxon@npm:3.4.4" + checksum: c14164bc338987349075a08e63ea3ff902866735f7f5553a355b27be22667919765ff96fde4d3413d0e9a0edc4ff9e2e74ebcb8f86eae0ce8b14b27330d87d6e + languageName: node + linkType: hard + +"make-fetch-happen@npm:^13.0.0": + version: 13.0.0 + resolution: "make-fetch-happen@npm:13.0.0" + dependencies: + "@npmcli/agent": "npm:^2.0.0" + cacache: "npm:^18.0.0" + http-cache-semantics: "npm:^4.1.1" + is-lambda: "npm:^1.0.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^3.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + promise-retry: "npm:^2.0.1" + ssri: "npm:^10.0.0" + checksum: ded5a91a02b76381b06a4ec4d5c1d23ebbde15d402b3c3e4533b371dac7e2f7ca071ae71ae6dae72aa261182557b7b1b3fd3a705b39252dc17f74fa509d3e76f + languageName: node + linkType: hard + +"markdown-it@npm:^13.0.1": + version: 13.0.2 + resolution: "markdown-it@npm:13.0.2" + dependencies: + argparse: "npm:^2.0.1" + entities: "npm:~3.0.1" + linkify-it: "npm:^4.0.1" + mdurl: "npm:^1.0.1" + uc.micro: "npm:^1.0.5" + bin: + markdown-it: bin/markdown-it.js + checksum: 4f48271bbd44d16502efd4148d7c05ca1fb4b50719a07d34c91e8d16f8d065c558fed0fafe07cd13ca5958096bfe295b37cd4f042add7ec49f73c70154e75f58 + languageName: node + linkType: hard + +"markdown-it@npm:^14.1.0": + version: 14.1.0 + resolution: "markdown-it@npm:14.1.0" + dependencies: + argparse: "npm:^2.0.1" + entities: "npm:^4.4.0" + linkify-it: "npm:^5.0.0" + mdurl: "npm:^2.0.0" + punycode.js: "npm:^2.3.1" + uc.micro: "npm:^2.1.0" + bin: + markdown-it: bin/markdown-it.mjs + checksum: f34f921be178ed0607ba9e3e27c733642be445e9bb6b1dba88da7aafe8ba1bc5d2f1c3aa8f3fc33b49a902da4e4c08c2feadfafb290b8c7dda766208bb6483a9 + languageName: node + linkType: hard + +"maximatch@npm:^0.1.0": + version: 0.1.0 + resolution: "maximatch@npm:0.1.0" + dependencies: + array-differ: "npm:^1.0.0" + array-union: "npm:^1.0.1" + arrify: "npm:^1.0.0" + minimatch: "npm:^3.0.0" + checksum: 6effa7fc9bd4d7ddbc6714b5c36642ffff96dbd603e6a8dd939802aa0cbd67be38b19c316e9d3d8253225d7adb63ebdbb0fdd21683f8f3cec9ec63cbd8387af0 + languageName: node + linkType: hard + +"mdurl@npm:^1.0.1": + version: 1.0.1 + resolution: "mdurl@npm:1.0.1" + checksum: ada367d01c9e81d07328101f187d5bd8641b71f33eab075df4caed935a24fa679e625f07108801d8250a5e4a99e5cd4be7679957a11424a3aa3e740d2bb2d5cb + languageName: node + linkType: hard + +"mdurl@npm:^2.0.0": + version: 2.0.0 + resolution: "mdurl@npm:2.0.0" + checksum: 1720349d4a53e401aa993241368e35c0ad13d816ad0b28388928c58ca9faa0cf755fa45f18ccbf64f4ce54a845a50ddce5c84e4016897b513096a68dac4b0158 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: "npm:^3.0.2" + picomatch: "npm:^2.3.1" + checksum: a749888789fc15cac0e03273844dbd749f9f8e8d64e70c564bcf06a033129554c789bb9e30d7566d7ff6596611a08e58ac12cf2a05f6e3c9c47c50c4c7e12fa2 + languageName: node + linkType: hard + +"mime@npm:^3.0.0": + version: 3.0.0 + resolution: "mime@npm:3.0.0" + bin: + mime: cli.js + checksum: b2d31580deb58be89adaa1877cbbf152b7604b980fd7ef8f08b9e96bfedf7d605d9c23a8ba62aa12c8580b910cd7c1d27b7331d0f40f7a14e17d5a0bbec3b49f + languageName: node + linkType: hard + +"minimatch@npm:^3.0.0, minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: e0b25b04cd4ec6732830344e5739b13f8690f8a012d73445a4a19fbc623f5dd481ef7a5827fde25954cd6026fede7574cc54dc4643c99d6c6b653d6203f94634 + languageName: node + linkType: hard + +"minimatch@npm:^5.0.1": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 126b36485b821daf96d33b5c821dac600cc1ab36c87e7a532594f9b1652b1fa89a1eebcaad4dff17c764dce1a7ac1531327f190fed5f97d8f6e5f889c116c429 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.1": + version: 9.0.4 + resolution: "minimatch@npm:9.0.4" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 4cdc18d112b164084513e890d6323370db14c22249d536ad1854539577a895e690a27513dc346392f61a4a50afbbd8abc88f3f25558bfbbbb862cd56508b20f5 + languageName: node + linkType: hard + +"minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.8": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 908491b6cc15a6c440ba5b22780a0ba89b9810e1aea684e253e43c4e3b8d56ec1dcdd7ea96dde119c29df59c936cde16062159eae4225c691e19c70b432b6e6f + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.4 + resolution: "minipass-fetch@npm:3.0.4" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.1.2" + dependenciesMeta: + encoding: + optional: true + checksum: 3edf72b900e30598567eafe96c30374432a8709e61bb06b87198fa3192d466777e2ec21c52985a0999044fa6567bd6f04651585983a1cbb27e2c1770a07ed2a2 + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 40982d8d836a52b0f37049a0a7e5d0f089637298e6d9b45df9c115d4f0520682a78258905e5c8b180fb41b593b0a82cc1361d2c74b45f7ada66334f84d1ecfdd + languageName: node + linkType: hard + +"minipass@npm:^3.0.0, minipass@npm:^3.1.1": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: a5c6ef069f70d9a524d3428af39f2b117ff8cd84172e19b754e7264a33df460873e6eb3d6e55758531580970de50ae950c496256bb4ad3691a2974cddff189f0 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 61682162d29f45d3152b78b08bab7fb32ca10899bc5991ffe98afc18c9e9543bd1e3be94f8b8373ba6262497db63607079dc242ea62e43e7b2270837b7347c93 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4": + version: 7.0.4 + resolution: "minipass@npm:7.0.4" + checksum: e864bd02ceb5e0707696d58f7ce3a0b89233f0d686ef0d447a66db705c0846a8dc6f34865cd85256c1472ff623665f616b90b8ff58058b2ad996c5de747d2d18 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: "npm:^3.0.0" + yallist: "npm:^4.0.0" + checksum: ae0f45436fb51344dcb87938446a32fbebb540d0e191d63b35e1c773d47512e17307bf54aa88326cc6d176594d00e4423563a091f7266c2f9a6872cdc1e234d1 + languageName: node + linkType: hard + +"mkdirp@npm:^0.5.1": + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" + dependencies: + minimist: "npm:^1.2.6" + bin: + mkdirp: bin/cmd.js + checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: d71b8dcd4b5af2fe13ecf3bd24070263489404fe216488c5ba7e38ece1f54daf219e72a833a3a2dc404331e870e9f44963a33399589490956bff003a3404d3b2 + languageName: node + linkType: hard + +"moo@npm:^0.5.2": + version: 0.5.2 + resolution: "moo@npm:0.5.2" + checksum: fee356cb13b52e259c925fe297d71b3f47b98b06444b696dd4870d20cad4711eb58d24131afeba9bf7a51d77c77a3cbe8479066497d12a88abb51865c1be7de7 + languageName: node + linkType: hard + +"morphdom@npm:^2.7.0": + version: 2.7.2 + resolution: "morphdom@npm:2.7.2" + checksum: aa8860bf4a31c9272bfb5ca3ade7db63009a4971d587a369f2e55d669b6ce3e6a674ed0bb16f542cd1f7102b46f2fcafecd9052f8768d7ac11abdd4204bc1e3b + languageName: node + linkType: hard + +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4 + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f + languageName: node + linkType: hard + +"multimatch@npm:^5.0.0": + version: 5.0.0 + resolution: "multimatch@npm:5.0.0" + dependencies: + "@types/minimatch": "npm:^3.0.3" + array-differ: "npm:^3.0.0" + array-union: "npm:^2.1.0" + arrify: "npm:^2.0.1" + minimatch: "npm:^3.0.4" + checksum: 82c8030a53af965cab48da22f1b0f894ef99e16ee680dabdfbd38d2dfacc3c8208c475203d747afd9e26db44118ed0221d5a0d65268c864f06d6efc7ac6df812 + languageName: node + linkType: hard + +"mustache@npm:^4.2.0": + version: 4.2.0 + resolution: "mustache@npm:4.2.0" + bin: + mustache: bin/mustache + checksum: 6e668bd5803255ab0779c3983b9412b5c4f4f90e822230e0e8f414f5449ed7a137eed29430e835aa689886f663385cfe05f808eb34b16e1f3a95525889b05cd3 + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: 2723fb822a17ad55c93a588a4bc44d53b22855bf4be5499916ca0cab1e7165409d0b288ba2577d7b029f10ce18cf2ed8e703e5af31c984e1e2304277ef979837 + languageName: node + linkType: hard + +"neo-async@npm:^2.6.2": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: 1a7948fea86f2b33ec766bc899c88796a51ba76a4afc9026764aedc6e7cde692a09067031e4a1bf6db4f978ccd99e7f5b6c03fe47ad9865c3d4f99050d67e002 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 10.1.0 + resolution: "node-gyp@npm:10.1.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^13.0.0" + nopt: "npm:^7.0.0" + proc-log: "npm:^3.0.0" + semver: "npm:^7.3.5" + tar: "npm:^6.1.2" + which: "npm:^4.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 89e105e495e66cd4568af3cf79cdeb67d670eb069e33163c7781d3366470a30367c9bd8dea59e46db16370020139e5bf78b1fbc03284cb571754dfaa59744db5 + languageName: node + linkType: hard + +"nopt@npm:^7.0.0": + version: 7.2.0 + resolution: "nopt@npm:7.2.0" + dependencies: + abbrev: "npm:^2.0.0" + bin: + nopt: bin/nopt.js + checksum: 1e7489f17cbda452c8acaf596a8defb4ae477d2a9953b76eb96f4ec3f62c6b421cd5174eaa742f88279871fde9586d8a1d38fb3f53fa0c405585453be31dff4c + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 + languageName: node + linkType: hard + +"nunjucks@npm:^3.2.3": + version: 3.2.4 + resolution: "nunjucks@npm:3.2.4" + dependencies: + a-sync-waterfall: "npm:^1.0.0" + asap: "npm:^2.0.3" + commander: "npm:^5.1.0" + peerDependencies: + chokidar: ^3.3.0 + peerDependenciesMeta: + chokidar: + optional: true + bin: + nunjucks-precompile: bin/precompile + checksum: 8decb8bb762501aa1a44366acff50ab9d4ff9e57034455e62056b4ac117da40140e1f34f2270c38884f1a5b84b7d97c4afcb2e8c789ddd09f4dcfe71ce7b56bf + languageName: node + linkType: hard + +"object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f + languageName: node + linkType: hard + +"on-finished@npm:2.4.1": + version: 2.4.1 + resolution: "on-finished@npm:2.4.1" + dependencies: + ee-first: "npm:1.1.1" + checksum: 8e81472c5028125c8c39044ac4ab8ba51a7cdc19a9fbd4710f5d524a74c6d8c9ded4dd0eed83f28d3d33ac1d7a6a439ba948ccb765ac6ce87f30450a26bfe2ea + languageName: node + linkType: hard + +"once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 7ba4a2b1e24c05e1fc14bbaea0fc6d85cf005ae7e9c9425d4575550f37e2e584b1af97bcde78eacd7559208f20995988d52881334db16cf77bc1bcf68e48ed7c + languageName: node + linkType: hard + +"parse-srcset@npm:^1.0.2": + version: 1.0.2 + resolution: "parse-srcset@npm:1.0.2" + checksum: d40c131cfc3ab7bb6333b788d30a30d063d76a83b49fa752229823f96475e36cf29fea09e035ce3b2a634b686e93e2a7429cb8dad0041d8a3a3df622093b9ea1 + languageName: node + linkType: hard + +"parseurl@npm:~1.3.3": + version: 1.3.3 + resolution: "parseurl@npm:1.3.3" + checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a + languageName: node + linkType: hard + +"path-scurry@npm:^1.10.2": + version: 1.10.2 + resolution: "path-scurry@npm:1.10.2" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: a2bbbe8dc284c49dd9be78ca25f3a8b89300e0acc24a77e6c74824d353ef50efbf163e64a69f4330b301afca42d0e2229be0560d6d616ac4e99d48b4062016b1 + languageName: node + linkType: hard + +"path-to-regexp@npm:^6.2.1": + version: 6.2.1 + resolution: "path-to-regexp@npm:6.2.1" + checksum: 1e266be712d1a08086ee77beab12a1804842ec635dfed44f9ee1ba960a0e01cec8063fb8c92561115cdc0ce73158cdc7766e353ffa039340b4a85b370084c4d4 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 60c2595003b05e4535394d1da94850f5372c9427ca4413b71210f437f7b2ca091dbd611c45e8b37d10036fa8eade25c1b8951654f9d3973bfa66a2ff4d3b08bc + languageName: node + linkType: hard + +"pify@npm:^2.3.0": + version: 2.3.0 + resolution: "pify@npm:2.3.0" + checksum: 9503aaeaf4577acc58642ad1d25c45c6d90288596238fb68f82811c08104c800e5a7870398e9f015d82b44ecbcbef3dc3d4251a1cbb582f6e5959fe09884b2ba + languageName: node + linkType: hard + +"please-upgrade-node@npm:^3.2.0": + version: 3.2.0 + resolution: "please-upgrade-node@npm:3.2.0" + dependencies: + semver-compare: "npm:^1.0.0" + checksum: d87c41581a2a022fbe25965a97006238cd9b8cbbf49b39f78d262548149a9d30bd2bdf35fec3d810e0001e630cd46ef13c7e19c389dea8de7e64db271a2381bb + languageName: node + linkType: hard + +"posthtml-parser@npm:^0.11.0": + version: 0.11.0 + resolution: "posthtml-parser@npm:0.11.0" + dependencies: + htmlparser2: "npm:^7.1.1" + checksum: 7a26e975b5e69ae0dcb900f2212aa2df2e1215a5aee13d5876217b7f2a6abf7c6535f10643e439d9afb404d8c6869cd51a9f8164fe7dca5d6435a60757a96217 + languageName: node + linkType: hard + +"posthtml-render@npm:^3.0.0": + version: 3.0.0 + resolution: "posthtml-render@npm:3.0.0" + dependencies: + is-json: "npm:^2.0.1" + checksum: ca73e98b9d62c89eaa892b675643d4135431bcb5b1c5c00cb21802f875fd5c5caee208aa0ecdc1d803239ec3088a8138be416470eeb0b02f1f424cf90f20a8eb + languageName: node + linkType: hard + +"posthtml-urls@npm:^1.0.0": + version: 1.0.0 + resolution: "posthtml-urls@npm:1.0.0" + dependencies: + http-equiv-refresh: "npm:^1.0.0" + list-to-array: "npm:^1.1.0" + parse-srcset: "npm:^1.0.2" + promise-each: "npm:^2.2.0" + checksum: cd105988e583489153edc99e4780fb2b162afd776bf2cdb9da04642be02e490538be5fda14429a8dc302904530b0abba65a2a401682832de4d4ce565f081155f + languageName: node + linkType: hard + +"posthtml@npm:^0.16.6": + version: 0.16.6 + resolution: "posthtml@npm:0.16.6" + dependencies: + posthtml-parser: "npm:^0.11.0" + posthtml-render: "npm:^3.0.0" + checksum: e1ce9cda9b9fea0e1ddaccf13c945ca7e1bae2c6f54d34b2d0c9ed5b4b55d456684732257fc85113291807e99fcea585ad959acedca2de94d0744a84e15b31fb + languageName: node + linkType: hard + +"prismjs@npm:^1.29.0": + version: 1.29.0 + resolution: "prismjs@npm:1.29.0" + checksum: 2080db382c2dde0cfc7693769e89b501ef1bfc8ff4f8d25c07fd4c37ca31bc443f6133d5b7c145a73309dc396e829ddb7cc18560026d862a887ae08864ef6b07 + languageName: node + linkType: hard + +"proc-log@npm:^3.0.0": + version: 3.0.0 + resolution: "proc-log@npm:3.0.0" + checksum: 02b64e1b3919e63df06f836b98d3af002b5cd92655cab18b5746e37374bfb73e03b84fe305454614b34c25b485cc687a9eebdccf0242cda8fda2475dd2c97e02 + languageName: node + linkType: hard + +"promise-each@npm:^2.2.0": + version: 2.2.0 + resolution: "promise-each@npm:2.2.0" + dependencies: + any-promise: "npm:^0.1.0" + checksum: 56f4f0aceeeb52e0b7e0a1ddfca22128e9662041ea430f7a7a465beb7dc54dac5277235a2e0f3d03f0ee8b882d3a006bacad022b2b49d7aeee6b931f56c06523 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 96e1a82453c6c96eef53a37a1d6134c9f2482f94068f98a59145d0986ca4e497bf110a410adf73857e588165eab3899f0ebcf7b3890c1b3ce802abc0d65967d4 + languageName: node + linkType: hard + +"promise@npm:^7.0.1": + version: 7.3.1 + resolution: "promise@npm:7.3.1" + dependencies: + asap: "npm:~2.0.3" + checksum: 37dbe58ca7b0716cc881f0618128f1fd6ff9c46cdc529a269fd70004e567126a449a94e9428e2d19b53d06182d11b45d0c399828f103e06b2bb87643319bd2e7 + languageName: node + linkType: hard + +"prr@npm:~1.0.1": + version: 1.0.1 + resolution: "prr@npm:1.0.1" + checksum: 3bca2db0479fd38f8c4c9439139b0c42dcaadcc2fbb7bb8e0e6afaa1383457f1d19aea9e5f961d5b080f1cfc05bfa1fe9e45c97a1d3fd6d421950a73d3108381 + languageName: node + linkType: hard + +"pug-attrs@npm:^3.0.0": + version: 3.0.0 + resolution: "pug-attrs@npm:3.0.0" + dependencies: + constantinople: "npm:^4.0.1" + js-stringify: "npm:^1.0.2" + pug-runtime: "npm:^3.0.0" + checksum: 2ca2d34de3065239f01f0fc3c0e104c17f7a7105684d088bb71df623005a45f40a2301e65f49ec4581bb31794c74e691862643d4e34062d1509e92fa56a15aa5 + languageName: node + linkType: hard + +"pug-code-gen@npm:^3.0.3": + version: 3.0.3 + resolution: "pug-code-gen@npm:3.0.3" + dependencies: + constantinople: "npm:^4.0.1" + doctypes: "npm:^1.1.0" + js-stringify: "npm:^1.0.2" + pug-attrs: "npm:^3.0.0" + pug-error: "npm:^2.1.0" + pug-runtime: "npm:^3.0.1" + void-elements: "npm:^3.1.0" + with: "npm:^7.0.0" + checksum: 1918b2a75794b730ee29fc2278658ff2ccb74445742c175c55b18e414cf038e5ac5802e71db070b08f92c5304a66e141dc2261e401be4d5884f1c0bcfb3194ee + languageName: node + linkType: hard + +"pug-error@npm:^2.0.0": + version: 2.0.0 + resolution: "pug-error@npm:2.0.0" + checksum: c5372d018c897c1d6a141dd803c50957feecfda1f3d84a6adc6149801315d6c7f8c28b05f3e186d98d774fc9718699d1e1caa675630dd3c4453f8c5ec4e4a986 + languageName: node + linkType: hard + +"pug-error@npm:^2.1.0": + version: 2.1.0 + resolution: "pug-error@npm:2.1.0" + checksum: 9aefacfa156f0eb439ddab86c7136f998a532481a80665c9fb6b998afeea5bc8c4f83eb6ad8a4c7804c44927737df913b768b713995e6892112bbc05762e5415 + languageName: node + linkType: hard + +"pug-filters@npm:^4.0.0": + version: 4.0.0 + resolution: "pug-filters@npm:4.0.0" + dependencies: + constantinople: "npm:^4.0.1" + jstransformer: "npm:1.0.0" + pug-error: "npm:^2.0.0" + pug-walk: "npm:^2.0.0" + resolve: "npm:^1.15.1" + checksum: ca8b7ffede57d13679ec8c3ee2791feabb7ab3972e02f16fffe328ab9de42961758c3115b0536b2e6cf14a4dc2b2381a172adba84423be4137298fd59ff92853 + languageName: node + linkType: hard + +"pug-lexer@npm:^5.0.1": + version: 5.0.1 + resolution: "pug-lexer@npm:5.0.1" + dependencies: + character-parser: "npm:^2.2.0" + is-expression: "npm:^4.0.0" + pug-error: "npm:^2.0.0" + checksum: 18d74a2dfbee892a71ca973e72be60acc36a30b5b7325e2cd723691779e505bfecd2206453b09c2b7f868af9ec0204ed4ea7a26c2a835172a22618b350b6aeb1 + languageName: node + linkType: hard + +"pug-linker@npm:^4.0.0": + version: 4.0.0 + resolution: "pug-linker@npm:4.0.0" + dependencies: + pug-error: "npm:^2.0.0" + pug-walk: "npm:^2.0.0" + checksum: 423f62e8600fb66c785ef4e11d9a7833a959677d67443980fd66248da56cebed0a8867f7aa78dc5631803cd1ce71a00b0abf78229b2a2d2ec8779a8b3afb5079 + languageName: node + linkType: hard + +"pug-load@npm:^3.0.0": + version: 3.0.0 + resolution: "pug-load@npm:3.0.0" + dependencies: + object-assign: "npm:^4.1.1" + pug-walk: "npm:^2.0.0" + checksum: 1800ec51994c92338401bcf79bbfa0d5ef9aa312bc415c2618263d6c04d1d7c5be5ac4a333c47a0eaa823f6231b4ade1a1c40f5784b99eb576d25853597bff2f + languageName: node + linkType: hard + +"pug-parser@npm:^6.0.0": + version: 6.0.0 + resolution: "pug-parser@npm:6.0.0" + dependencies: + pug-error: "npm:^2.0.0" + token-stream: "npm:1.0.0" + checksum: 4c23e154ea2c8c4355ee0291fefa7210f24beecff7c4af2d1e8b7e86ce2923d3213f31bbd9e33bd6703c25ea625dc6494a2ca68a21dcb105b5ac9204248cf4a8 + languageName: node + linkType: hard + +"pug-runtime@npm:^3.0.0, pug-runtime@npm:^3.0.1": + version: 3.0.1 + resolution: "pug-runtime@npm:3.0.1" + checksum: d34ee1b95121576bd389dccd2f6d7dc6fb0bf24963d2b7d1471795d35d8fba90ee8e16c2e022084bdc2f2cfbd56aaa2f452ea872135baf54dbb54a0d5aedd856 + languageName: node + linkType: hard + +"pug-strip-comments@npm:^2.0.0": + version: 2.0.0 + resolution: "pug-strip-comments@npm:2.0.0" + dependencies: + pug-error: "npm:^2.0.0" + checksum: 2cfcbf506c14bb3e64204a1d93f12ca61658d2540475b0f0911c35531ad28421e8d1e73a646d841d58cfa2c20f8593c52e492dfe5b6bec968e20b614e4dea1e4 + languageName: node + linkType: hard + +"pug-walk@npm:^2.0.0": + version: 2.0.0 + resolution: "pug-walk@npm:2.0.0" + checksum: bee64e133b711e1ed58022c0869b59e62f9f3ebb7084293857f074120b3cb588e7b8f74c4566426bf2b26dc1ec176ca6b64a2d1e53782f3fbbe039c5d4816638 + languageName: node + linkType: hard + +"pug@npm:^3.0.2": + version: 3.0.3 + resolution: "pug@npm:3.0.3" + dependencies: + pug-code-gen: "npm:^3.0.3" + pug-filters: "npm:^4.0.0" + pug-lexer: "npm:^5.0.1" + pug-linker: "npm:^4.0.0" + pug-load: "npm:^3.0.0" + pug-parser: "npm:^6.0.0" + pug-runtime: "npm:^3.0.1" + pug-strip-comments: "npm:^2.0.0" + checksum: a88364757512e3b9af024c008f23b910de049659655b5d9e6ca42f996d7849ce1aab059f61e2d44ccce0dde5ff291995682338c285e9f76f3e5bfa02de9c481b + languageName: node + linkType: hard + +"punycode.js@npm:^2.3.1": + version: 2.3.1 + resolution: "punycode.js@npm:2.3.1" + checksum: f0e946d1edf063f9e3d30a32ca86d8ff90ed13ca40dad9c75d37510a04473340cfc98db23a905cc1e517b1e9deb0f6021dce6f422ace235c60d3c9ac47c5a16a + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 72900df0616e473e824202113c3df6abae59150dfb73ed13273503127235320e9c8ca4aaaaccfd58cf417c6ca92a6e68ee9a5c3182886ae949a768639b388a7b + languageName: node + linkType: hard + +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: "npm:^2.2.1" + checksum: 196b30ef6ccf9b6e18c4e1724b7334f72a093d011a99f3b5920470f0b3406a51770867b3e1ae9711f227ef7a7065982f6ee2ce316746b2cb42c88efe44297fe7 + languageName: node + linkType: hard + +"recursive-copy@npm:^2.0.14": + version: 2.0.14 + resolution: "recursive-copy@npm:2.0.14" + dependencies: + errno: "npm:^0.1.2" + graceful-fs: "npm:^4.1.4" + junk: "npm:^1.0.1" + maximatch: "npm:^0.1.0" + mkdirp: "npm:^0.5.1" + pify: "npm:^2.3.0" + promise: "npm:^7.0.1" + rimraf: "npm:^2.7.1" + slash: "npm:^1.0.0" + checksum: 9ea6676a063bf1dec0911b97d9b2c346159e00312d0a61ce19150debaf39453df058802a3824c7cd585856fb8ce919501bde87fbe85414ecec16e833dcde2318 + languageName: node + linkType: hard + +"resolve@npm:^1.15.1": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: c473506ee01eb45cbcfefb68652ae5759e092e6b0fb64547feadf9736a6394f258fbc6f88e00c5ca36d5477fbb65388b272432a3600fa223062e54333c156753 + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.15.1#optional!builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: f345cd37f56a2c0275e3fe062517c650bb673815d885e7507566df589375d165bbbf4bdb6aa95600a9bc55f4744b81f452b5a63f95b9f10a72787dba3c90890a + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 1f914879f97e7ee931ad05fe3afa629bd55270fc6cf1c1e589b6a99fab96d15daad0fa1a52a00c729ec0078045fe3e399bd4fd0c93bcc906957bdc17f89cb8e6 + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: 14222c9e1d3f9ae01480c50d96057228a8524706db79cdeb5a2ce5bb7070dd9f409a6f84a02cbef8cdc80d39aef86f2dd03d155188a1300c599b05437dcd2ffb + languageName: node + linkType: hard + +"rimraf@npm:^2.7.1": + version: 2.7.1 + resolution: "rimraf@npm:2.7.1" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: ./bin.js + checksum: 4586c296c736483e297da7cffd19475e4a3e41d07b1ae124aad5d687c79e4ffa716bdac8732ed1db942caf65271cee9dd39f8b639611de161a2753e2112ffe1d + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 7eaf7a0cf37cc27b42fb3ef6a9b1df6e93a1c6d98c6c6702b02fe262d5fcbd89db63320793b99b21cb5348097d0a53de81bd5f4e8b86e20cc9412e3f1cfb4e83 + languageName: node + linkType: hard + +"section-matter@npm:^1.0.0": + version: 1.0.0 + resolution: "section-matter@npm:1.0.0" + dependencies: + extend-shallow: "npm:^2.0.1" + kind-of: "npm:^6.0.0" + checksum: cedfda3a9238f66942d92531fe043dd134702a462cdc9e254cd6aa418c66ca0d229900e4da78ffd1a07051e7b239251c4dc4748e9d1c76bf41a37bff7a478556 + languageName: node + linkType: hard + +"semver-compare@npm:^1.0.0": + version: 1.0.0 + resolution: "semver-compare@npm:1.0.0" + checksum: 75f9c7a7786d1756f64b1429017746721e07bd7691bdad6368f7643885d3a98a27586777e9699456564f4844b407e9f186cc1d588a3f9c0be71310e517e942c3 + languageName: node + linkType: hard + +"semver@npm:^7.3.5, semver@npm:^7.3.8": + version: 7.6.0 + resolution: "semver@npm:7.6.0" + dependencies: + lru-cache: "npm:^6.0.0" + bin: + semver: bin/semver.js + checksum: 1b41018df2d8aca5a1db4729985e8e20428c650daea60fcd16e926e9383217d00f574fab92d79612771884a98d2ee2a1973f49d630829a8d54d6570defe62535 + languageName: node + linkType: hard + +"set-function-length@npm:^1.2.1": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + checksum: 505d62b8e088468917ca4e3f8f39d0e29f9a563b97dbebf92f4bd2c3172ccfb3c5b8e4566d5fcd00784a00433900e7cb8fbc404e2dbd8c3818ba05bb9d4a8a6d + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: c9fa63bbbd7431066174a48ba2dd9986dfd930c3a8b59de9c29d7b6854ec1c12a80d15310869ea5166d413b99f041bfa3dd80a7947bcd44ea8e6eb3ffeabfa1f + languageName: node + linkType: hard + +"slash@npm:^1.0.0": + version: 1.0.0 + resolution: "slash@npm:1.0.0" + checksum: 4b6e21b1fba6184a7e2efb1dd173f692d8a845584c1bbf9dc818ff86f5a52fc91b413008223d17cc684604ee8bb9263a420b1182027ad9762e35388434918860 + languageName: node + linkType: hard + +"slugify@npm:^1.6.6": + version: 1.6.6 + resolution: "slugify@npm:1.6.6" + checksum: d0737cdedc834c50f74227bc1a1cf4f449f3575893f031b0e8c59f501c73526c866a23e47261b262c7acdaaaaf30d6f9e8aaae22772b3f56e858ac84c35efa7b + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 927484aa0b1640fd9473cee3e0a0bcad6fce93fd7bbc18bac9ad0c33686f5d2e2c422fba24b5899c184524af01e11dd2bd051c2bf2b07e47aff8ca72cbfc60d2 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.3 + resolution: "socks-proxy-agent@npm:8.0.3" + dependencies: + agent-base: "npm:^7.1.1" + debug: "npm:^4.3.4" + socks: "npm:^2.7.1" + checksum: c2112c66d6322e497d68e913c3780f3683237fd394bfd480b9283486a86e36095d0020db96145d88f8ccd9cc73261b98165b461f9c1bf5dc17abfe75c18029ce + languageName: node + linkType: hard + +"socks@npm:^2.7.1": + version: 2.8.1 + resolution: "socks@npm:2.8.1" + dependencies: + ip-address: "npm:^9.0.5" + smart-buffer: "npm:^4.2.0" + checksum: a3cc38e0716ab53a2db3fa00c703ca682ad54dbbc9ed4c7461624a999be6fa7cdc79fc904c411618e698d5eff55a55aa6d9329169a7db11636d0200814a2b5aa + languageName: node + linkType: hard + +"source-map@npm:^0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 59ef7462f1c29d502b3057e822cdbdae0b0e565302c4dd1a95e11e793d8d9d62006cdc10e0fd99163ca33ff2071360cf50ee13f90440806e7ed57d81cba2f7ff + languageName: node + linkType: hard + +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: e7587128c423f7e43cc625fe2f87e6affdf5ca51c1cc468e910d8aaca46bb44a7fbcfa552f787b1d3987f7043aeb4527d1b99559e6621e01b42b3f45e5a24cbb + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: c34828732ab8509c2741e5fd1af6b767c3daf2c642f267788f933a65b1614943c282e74c4284f4fa749c264b18ee016a0d37a3e5b73aee446da46277d3a85daa + languageName: node + linkType: hard + +"ssri@npm:^10.0.0": + version: 10.0.5 + resolution: "ssri@npm:10.0.5" + dependencies: + minipass: "npm:^7.0.3" + checksum: 453f9a1c241c13f5dfceca2ab7b4687bcff354c3ccbc932f35452687b9ef0ccf8983fd13b8a3baa5844c1a4882d6e3ddff48b0e7fd21d743809ef33b80616d79 + languageName: node + linkType: hard + +"ssri@npm:^8.0.1": + version: 8.0.1 + resolution: "ssri@npm:8.0.1" + dependencies: + minipass: "npm:^3.1.1" + checksum: fde247b7107674d9a424a20f9c1a6e3ad88a139c2636b9d9ffa7df59e85e11a894cdae48fadd0ad6be41eb0d5b847fe094736513d333615c7eebc3d111abe0d2 + languageName: node + linkType: hard + +"statuses@npm:2.0.1": + version: 2.0.1 + resolution: "statuses@npm:2.0.1" + checksum: 18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: ae3b5436d34fadeb6096367626ce987057713c566e1e7768818797e00ac5d62023d0f198c4e681eae9e20701721980b26a64a8f5b91238869592a9c6800719a2 + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: 475f53e9c44375d6e72807284024ac5d668ee1d06010740dec0b9744f2ddf47de8d7151f80e5f6190fc8f384e802fdf9504b76a7e9020c9faee7103623338be2 + languageName: node + linkType: hard + +"strip-bom-string@npm:^1.0.0": + version: 1.0.0 + resolution: "strip-bom-string@npm:1.0.0" + checksum: 5635a3656d8512a2c194d6c8d5dee7ef0dde6802f7be9413b91e201981ad4132506656d9cf14137f019fd50f0269390d91c7f6a2601b1bee039a4859cfce4934 + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: c8bb7afd564e3b26b50ca6ee47572c217526a1389fe018d00345856d4a9b08ffbd61fadaf283a87368d94c3dcdb8f5ffe2650a5a65863e21ad2730ca0f05210a + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: a9dc19ae2220c952bd2231d08ddeecb1b0328b61e72071ff4000c8384e145cc07c1c0bdb3b5a1cb06e186a7b2790f1dee793418b332f6ddf320de25d9125be7e + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.2.1 + resolution: "tar@npm:6.2.1" + dependencies: + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: bfbfbb2861888077fc1130b84029cdc2721efb93d1d1fb80f22a7ac3a98ec6f8972f29e564103bbebf5e97be67ebc356d37fa48dbc4960600a1eb7230fbd1ea0 + languageName: node + linkType: hard + +"to-fast-properties@npm:^2.0.0": + version: 2.0.0 + resolution: "to-fast-properties@npm:2.0.0" + checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 10dda13571e1f5ad37546827e9b6d4252d2e0bc176c24a101252153ef435d83696e2557fe128c4678e4e78f5f01e83711c703eef9814eb12dab028580d45980a + languageName: node + linkType: hard + +"token-stream@npm:1.0.0": + version: 1.0.0 + resolution: "token-stream@npm:1.0.0" + checksum: e8adb56f31b813b6157130e7fc2fe14eb60e7cbf7b746e70e8293c7e55664d8e7ad5d93d7ae3aa4cad7fcb2b0aaf59dad6f2fd4ee0269204e55af5b05bc369e2 + languageName: node + linkType: hard + +"uc.micro@npm:^1.0.1, uc.micro@npm:^1.0.5": + version: 1.0.6 + resolution: "uc.micro@npm:1.0.6" + checksum: 6898bb556319a38e9cf175e3628689347bd26fec15fc6b29fa38e0045af63075ff3fea4cf1fdba9db46c9f0cbf07f2348cd8844889dd31ebd288c29fe0d27e7a + languageName: node + linkType: hard + +"uc.micro@npm:^2.0.0, uc.micro@npm:^2.1.0": + version: 2.1.0 + resolution: "uc.micro@npm:2.1.0" + checksum: 37197358242eb9afe367502d4638ac8c5838b78792ab218eafe48287b0ed28aaca268ec0392cc5729f6c90266744de32c06ae938549aee041fc93b0f9672d6b2 + languageName: node + linkType: hard + +"uglify-js@npm:^3.1.4, uglify-js@npm:^3.14.5": + version: 3.17.4 + resolution: "uglify-js@npm:3.17.4" + bin: + uglifyjs: bin/uglifyjs + checksum: 4c0b800e0ff192079d2c3ce8414fd3b656a570028c7c79af5c29c53d5c532b68bbcae4ad47307f89c2ee124d11826fff7a136b59d5c5bb18422bcdf5568afe1e + languageName: node + linkType: hard + +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: "npm:^4.0.0" + checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 40912a8963fc02fb8b600cf50197df4a275c602c60de4cac4f75879d3c48558cfac48de08a25cc10df8112161f7180b3bbb4d662aadb711568602f9eddee54f0 + languageName: node + linkType: hard + +"unpipe@npm:~1.0.0": + version: 1.0.0 + resolution: "unpipe@npm:1.0.0" + checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 + languageName: node + linkType: hard + +"void-elements@npm:^3.1.0": + version: 3.1.0 + resolution: "void-elements@npm:3.1.0" + checksum: 0390f818107fa8fce55bb0a5c3f661056001c1d5a2a48c28d582d4d847347c2ab5b7f8272314cac58acf62345126b6b09bea623a185935f6b1c3bbce0dfd7f7f + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 4782f8a1d6b8fc12c65e968fea49f59752bf6302dc43036c3bf87da718a80710f61a062516e9764c70008b487929a73546125570acea95c5b5dcc8ac3052c70f + languageName: node + linkType: hard + +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: f17e84c042592c21e23c8195108cff18c64050b9efb8459589116999ea9da6dd1509e6a1bac3aeebefd137be00fabbb61b5c2bc0aa0f8526f32b58ee2f545651 + languageName: node + linkType: hard + +"with@npm:^7.0.0": + version: 7.0.2 + resolution: "with@npm:7.0.2" + dependencies: + "@babel/parser": "npm:^7.9.6" + "@babel/types": "npm:^7.9.6" + assert-never: "npm:^1.2.1" + babel-walk: "npm:3.0.0-canary-5" + checksum: 06ad978f9ac11268186060af7e19ff33bcfe1631ecbce4c676cb43168e3d6e62a5c6e697bd6dda8570c93b117a9b12980061ff66c3428a4e5cdcf0637e8ed81f + languageName: node + linkType: hard + +"wordwrap@npm:^1.0.0": + version: 1.0.0 + resolution: "wordwrap@npm:1.0.0" + checksum: 497d40beb2bdb08e6d38754faa17ce20b0bf1306327f80cb777927edb23f461ee1f6bc659b3c3c93f26b08e1cf4b46acc5bae8fda1f0be3b5ab9a1a0211034cd + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: cebdaeca3a6880da410f75209e68cd05428580de5ad24535f22696d7d9cab134d1f8498599f344c3cf0fb37c1715807a183778d8c648d6cc0cb5ff2bb4236540 + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 7b1e4b35e9bb2312d2ee9ee7dc95b8cb5f8b4b5a89f7dde5543fe66c1e3715663094defa50d75454ac900bd210f702d575f15f3f17fa9ec0291806d2578d1ddf + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + languageName: node + linkType: hard + +"ws@npm:^8.13.0": + version: 8.17.1 + resolution: "ws@npm:8.17.1" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 4264ae92c0b3e59c7e309001e93079b26937aab181835fb7af79f906b22cd33b6196d96556dafb4e985742dd401e99139572242e9847661fdbc96556b9e6902d + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 4cb02b42b8a93b5cf50caf5d8e9beb409400a8a4d85e83bb0685c1457e9ac0b7a00819e9f5991ac25ffabb56a78e2f017c1acc010b3a1babfe6de690ba531abd + languageName: node + linkType: hard diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 00000000..5d80b4fd --- /dev/null +++ b/examples/README.md @@ -0,0 +1,19 @@ +# Indexing Engine Examples +This directory contains several examples of how to use the indexing engine. + +Most examples include two different forms of running the pipeline, both are contained in the examples `run.py` +1. Using mostly the Python API +2. Using mostly the a pipeline configuration file + +# Running an Example +First run `poetry shell` to activate a virtual environment with the required dependencies. + +Then run `PYTHONPATH="$(pwd)" python examples/path_to_example/run.py` from the `python/graphrag` directory. + +For example to run the single_verb example, you would run the following commands: + +```bash +cd python/graphrag +poetry shell +PYTHONPATH="$(pwd)" python examples/single_verb/run.py +``` \ No newline at end of file diff --git a/examples/__init__.py b/examples/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/examples/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/examples/custom_input/__init__.py b/examples/custom_input/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/examples/custom_input/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/examples/custom_input/pipeline.yml b/examples/custom_input/pipeline.yml new file mode 100644 index 00000000..80340c82 --- /dev/null +++ b/examples/custom_input/pipeline.yml @@ -0,0 +1,24 @@ + +# Setup reporting however you'd like +reporting: + type: console + +# Setup storage however you'd like +storage: + type: memory + +# Setup cache however you'd like +cache: + type: memory + +# Just a simple workflow +workflows: + + # This is an anonymous workflow, it doesn't have a name + - steps: + + # Unpack the nodes from the graph + - verb: fill + args: + to: filled_column + value: "Filled Value" \ No newline at end of file diff --git a/examples/custom_input/run.py b/examples/custom_input/run.py new file mode 100644 index 00000000..ba39033e --- /dev/null +++ b/examples/custom_input/run.py @@ -0,0 +1,46 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import asyncio +import os + +import pandas as pd + +from graphrag.index import run_pipeline_with_config + +pipeline_file = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "./pipeline.yml" +) + + +async def run(): + # Load your dataset + dataset = _load_dataset_some_unique_way() + + # Load your config without the input section + config = pipeline_file + + # Grab the last result from the pipeline, should be our entity extraction + outputs = [] + async for output in run_pipeline_with_config( + config_or_path=config, dataset=dataset + ): + outputs.append(output) + pipeline_result = outputs[-1] + + if pipeline_result.result is not None: + # Should look something like + # col1 col2 filled_column + # 0 2 4 Filled Value + # 1 5 10 Filled Value + print(pipeline_result.result) + else: + print("No results!") + + +def _load_dataset_some_unique_way() -> pd.DataFrame: + # Totally loaded from some other place + return pd.DataFrame([{"col1": 2, "col2": 4}, {"col1": 5, "col2": 10}]) + + +if __name__ == "__main__": + asyncio.run(run()) diff --git a/examples/custom_set_of_available_verbs/__init__.py b/examples/custom_set_of_available_verbs/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/examples/custom_set_of_available_verbs/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/examples/custom_set_of_available_verbs/custom_verb_definitions.py b/examples/custom_set_of_available_verbs/custom_verb_definitions.py new file mode 100644 index 00000000..ef058ed3 --- /dev/null +++ b/examples/custom_set_of_available_verbs/custom_verb_definitions.py @@ -0,0 +1,22 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +from datashaper import TableContainer, VerbInput + + +def str_append( + input: VerbInput, source_column: str, target_column: str, string_to_append: str +): + """A custom verb that appends a string to a column""" + # by convention, we typically use "column" as the input column name and "to" as the output column name, but you can use whatever you want + # just as long as the "args" in the workflow reference match the function signature + input_data = input.get_input() + output_df = input_data.copy() + output_df[target_column] = output_df[source_column].apply( + lambda x: f"{x}{string_to_append}" + ) + return TableContainer(table=output_df) + + +custom_verbs = { + "str_append": str_append, +} diff --git a/examples/custom_set_of_available_verbs/pipeline.yml b/examples/custom_set_of_available_verbs/pipeline.yml new file mode 100644 index 00000000..85bcdb24 --- /dev/null +++ b/examples/custom_set_of_available_verbs/pipeline.yml @@ -0,0 +1,7 @@ +workflows: + - steps: + - verb: "str_append" # should be the key that you pass to the custom_verbs dict below + args: + source_column: "col1" + target_column: "col_1_custom" + string_to_append: " - custom verb" \ No newline at end of file diff --git a/examples/custom_set_of_available_verbs/run.py b/examples/custom_set_of_available_verbs/run.py new file mode 100644 index 00000000..7e3f4617 --- /dev/null +++ b/examples/custom_set_of_available_verbs/run.py @@ -0,0 +1,84 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import asyncio +import os + +import pandas as pd + +from examples.custom_set_of_available_verbs.custom_verb_definitions import custom_verbs +from graphrag.index import run_pipeline, run_pipeline_with_config +from graphrag.index.config import PipelineWorkflowReference + +# Our fake dataset +dataset = pd.DataFrame([{"col1": 2, "col2": 4}, {"col1": 5, "col2": 10}]) + + +async def run_with_config(): + """Run a pipeline with a config file""" + # load pipeline.yml in this directory + config_path = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "./pipeline.yml" + ) + + outputs = [] + async for output in run_pipeline_with_config( + config_or_path=config_path, dataset=dataset + ): + outputs.append(output) + pipeline_result = outputs[-1] + + if pipeline_result.result is not None: + # Should look something like this, which should be identical to the python example: + # col1 col2 col_1_custom + # 0 2 4 2 - custom verb + # 1 5 10 5 - custom verb + print(pipeline_result.result) + else: + print("No results!") + + +async def run_python(): + workflows: list[PipelineWorkflowReference] = [ + PipelineWorkflowReference( + name="my_workflow", + steps=[ + { + "verb": "str_append", # should be the key that you pass to the custom_verbs dict below + "args": { + "source_column": "col1", # from above + "target_column": "col_1_custom", # new column name, + "string_to_append": " - custom verb", # The string to append to the column + }, + # Since we're trying to act on the default input, we don't need explicitly to specify an input + } + ], + ), + ] + + # Run the pipeline + outputs = [] + async for output in run_pipeline( + dataset=dataset, + workflows=workflows, + additional_verbs=custom_verbs, + ): + outputs.append(output) + + # Find the result from the workflow we care about + pipeline_result = next( + (output for output in outputs if output.workflow == "my_workflow"), None + ) + + if pipeline_result is not None and pipeline_result.result is not None: + # Should look something like this: + # col1 col2 col_1_custom + # 0 2 4 2 - custom verb + # 1 5 10 5 - custom verb + print(pipeline_result.result) + else: + print("No results!") + + +if __name__ == "__main__": + asyncio.run(run_python()) + asyncio.run(run_with_config()) diff --git a/examples/custom_set_of_available_workflows/__init__.py b/examples/custom_set_of_available_workflows/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/examples/custom_set_of_available_workflows/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/examples/custom_set_of_available_workflows/custom_workflow_definitions.py b/examples/custom_set_of_available_workflows/custom_workflow_definitions.py new file mode 100644 index 00000000..7d91750f --- /dev/null +++ b/examples/custom_set_of_available_workflows/custom_workflow_definitions.py @@ -0,0 +1,36 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +from graphrag.index.workflows import WorkflowDefinitions + +# Sets up the list of custom workflows that can be used in a pipeline +# The idea being that you can have a pool of workflows that can be used in any number of +# your pipelines +custom_workflows: WorkflowDefinitions = { + "my_workflow": lambda config: [ + { + "verb": "derive", + "args": { + "column1": "col1", # looks for col1 in the dataset + "column2": "col2", # looks for col2 in the dataset + "to": config.get( + # Allow the user to specify the output column name, + # otherwise default to "output_column" + "derive_output_column", + "output_column", + ), # new column name, + "operator": "*", + }, + } + ], + "my_unused_workflow": lambda _config: [ + { + "verb": "derive", + "args": { + "column1": "col1", # looks for col1 in the dataset + "column2": "col2", # looks for col2 in the dataset + "to": "unused_output_column", + "operator": "*", + }, + } + ], +} diff --git a/examples/custom_set_of_available_workflows/pipeline.yml b/examples/custom_set_of_available_workflows/pipeline.yml new file mode 100644 index 00000000..0ce004d1 --- /dev/null +++ b/examples/custom_set_of_available_workflows/pipeline.yml @@ -0,0 +1,4 @@ +workflows: + - name: my_workflow + config: + derive_output_column: "col_1_multiplied" diff --git a/examples/custom_set_of_available_workflows/run.py b/examples/custom_set_of_available_workflows/run.py new file mode 100644 index 00000000..c91f24f7 --- /dev/null +++ b/examples/custom_set_of_available_workflows/run.py @@ -0,0 +1,85 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import asyncio +import os + +import pandas as pd + +from examples.custom_set_of_available_workflows.custom_workflow_definitions import ( + custom_workflows, +) +from graphrag.index import run_pipeline, run_pipeline_with_config +from graphrag.index.config import PipelineWorkflowReference + +sample_data_dir = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "../_sample_data/" +) + +# our fake dataset +dataset = pd.DataFrame([{"col1": 2, "col2": 4}, {"col1": 5, "col2": 10}]) + + +async def run_with_config(): + """Run a pipeline with a config file""" + # load pipeline.yml in this directory + config_path = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "./pipeline.yml" + ) + + # Grab the last result from the pipeline, should be our entity extraction + tables = [] + async for table in run_pipeline_with_config( + config_or_path=config_path, + dataset=dataset, + additional_workflows=custom_workflows, + ): + tables.append(table) + pipeline_result = tables[-1] + + if pipeline_result.result is not None: + # Should look something like this: + # col1 col2 col_1_multiplied + # 0 2 4 8 + # 1 5 10 50 + print(pipeline_result.result) + else: + print("No results!") + + +async def run_python(): + """Run a pipeline using the python API""" + # Define the actual workflows to be run, this is identical to the python api + # but we're defining the workflows to be run via python instead of via a config file + workflows: list[PipelineWorkflowReference] = [ + # run my_workflow against the dataset, notice we're only using the "my_workflow" workflow + # and not the "my_unused_workflow" workflow + PipelineWorkflowReference( + name="my_workflow", # should match the name of the workflow in the custom_workflows dict above + config={ # pass in a config + # set the derive_output_column to be "col_1_multiplied", this will be passed to the workflow definition above + "derive_output_column": "col_1_multiplied" + }, + ), + ] + + # Grab the last result from the pipeline, should be our entity extraction + tables = [] + async for table in run_pipeline( + workflows, dataset=dataset, additional_workflows=custom_workflows + ): + tables.append(table) + pipeline_result = tables[-1] + + if pipeline_result.result is not None: + # Should look something like this: + # col1 col2 col_1_multiplied + # 0 2 4 8 + # 1 5 10 50 + print(pipeline_result.result) + else: + print("No results!") + + +if __name__ == "__main__": + asyncio.run(run_python()) + asyncio.run(run_with_config()) diff --git a/examples/entity_extraction/__init__.py b/examples/entity_extraction/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/examples/entity_extraction/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/examples/entity_extraction/with_graph_intelligence/__init__.py b/examples/entity_extraction/with_graph_intelligence/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/examples/entity_extraction/with_graph_intelligence/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/examples/entity_extraction/with_graph_intelligence/pipeline.yml b/examples/entity_extraction/with_graph_intelligence/pipeline.yml new file mode 100644 index 00000000..ffa5bee8 --- /dev/null +++ b/examples/entity_extraction/with_graph_intelligence/pipeline.yml @@ -0,0 +1,16 @@ +workflows: + - name: "entity_extraction" + config: + entity_extract: + strategy: + type: "graph_intelligence" + llm: + type: "openai_chat" + + # create a .env file in the same directory as this pipeline.yml file + # end add the following lines to it: + # EXAMPLE_OPENAI_API_KEY="YOUR_API_KEY" + api_key: !ENV ${EXAMPLE_OPENAI_API_KEY:None} # None is the default + model: !ENV ${EXAMPLE_OPENAI_MODEL:gpt-3.5-turbo} # gpt-3.5-turbo is the default + max_tokens: !ENV ${EXAMPLE_OPENAI_MAX_TOKENS:2500} # 2500 is the default + temperature: !ENV ${EXAMPLE_OPENAI_TEMPERATURE:0} # 0 is the default diff --git a/examples/entity_extraction/with_graph_intelligence/run.py b/examples/entity_extraction/with_graph_intelligence/run.py new file mode 100644 index 00000000..0ec54dda --- /dev/null +++ b/examples/entity_extraction/with_graph_intelligence/run.py @@ -0,0 +1,111 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import asyncio +import os + +from graphrag.index import run_pipeline, run_pipeline_with_config +from graphrag.index.config import PipelineCSVInputConfig, PipelineWorkflowReference +from graphrag.index.input import load_input + +sample_data_dir = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "../../_sample_data/" +) + +shared_dataset = asyncio.run( + load_input( + PipelineCSVInputConfig( + file_pattern=".*\\.csv$", + base_dir=sample_data_dir, + source_column="author", + text_column="message", + timestamp_column="date(yyyyMMddHHmmss)", + timestamp_format="%Y%m%d%H%M%S", + title_column="message", + ), + ) +) + + +async def run_with_config(): + """Run a pipeline with a config file""" + # We're cheap, and this is an example, lets just do 10 + dataset = shared_dataset.head(10) + + # load pipeline.yml in this directory + config_path = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "./pipeline.yml" + ) + + # Grab the last result from the pipeline, should be our entity extraction + tables = [] + async for table in run_pipeline_with_config( + config_or_path=config_path, dataset=dataset + ): + tables.append(table) + pipeline_result = tables[-1] + + # Print the entities. This will be a row for each text unit, each with a list of entities, + # This should look pretty close to the python version, but since we're using an LLM + # it will be a little different depending on how it feels about the text + if pipeline_result.result is not None: + print(pipeline_result.result["entities"].to_list()) + else: + print("No results!") + + +async def run_python(): + if ( + "EXAMPLE_OPENAI_API_KEY" not in os.environ + and "OPENAI_API_KEY" not in os.environ + ): + msg = "Please set EXAMPLE_OPENAI_API_KEY or OPENAI_API_KEY environment variable to run this example" + raise Exception(msg) + + # We're cheap, and this is an example, lets just do 10 + dataset = shared_dataset.head(10) + + workflows: list[PipelineWorkflowReference] = [ + PipelineWorkflowReference( + name="entity_extraction", + config={ + "entity_extract": { + "strategy": { + "type": "graph_intelligence", + "llm": { + "type": "openai_chat", + "api_key": os.environ.get( + "EXAMPLE_OPENAI_API_KEY", + os.environ.get("OPENAI_API_KEY", None), + ), + "model": os.environ.get( + "EXAMPLE_OPENAI_MODEL", "gpt-3.5-turbo" + ), + "max_tokens": os.environ.get( + "EXAMPLE_OPENAI_MAX_TOKENS", 2500 + ), + "temperature": os.environ.get( + "EXAMPLE_OPENAI_TEMPERATURE", 0 + ), + }, + } + } + }, + ) + ] + + # Grab the last result from the pipeline, should be our entity extraction + tables = [] + async for table in run_pipeline(dataset=dataset, workflows=workflows): + tables.append(table) + pipeline_result = tables[-1] + + # Print the entities. This will be a row for each text unit, each with a list of entities + if pipeline_result.result is not None: + print(pipeline_result.result["entities"].to_list()) + else: + print("No results!") + + +if __name__ == "__main__": + asyncio.run(run_python()) + asyncio.run(run_with_config()) diff --git a/examples/entity_extraction/with_nltk/__init__.py b/examples/entity_extraction/with_nltk/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/examples/entity_extraction/with_nltk/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/examples/entity_extraction/with_nltk/pipeline.yml b/examples/entity_extraction/with_nltk/pipeline.yml new file mode 100644 index 00000000..10984f34 --- /dev/null +++ b/examples/entity_extraction/with_nltk/pipeline.yml @@ -0,0 +1,6 @@ +workflows: + - name: "entity_extraction" + config: + entity_extract: + strategy: + type: "nltk" \ No newline at end of file diff --git a/examples/entity_extraction/with_nltk/run.py b/examples/entity_extraction/with_nltk/run.py new file mode 100644 index 00000000..68575ad6 --- /dev/null +++ b/examples/entity_extraction/with_nltk/run.py @@ -0,0 +1,78 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import asyncio +import os + +from graphrag.index import run_pipeline, run_pipeline_with_config +from graphrag.index.config import PipelineCSVInputConfig, PipelineWorkflowReference +from graphrag.index.input import load_input + +sample_data_dir = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "../../_sample_data/" +) +shared_dataset = asyncio.run( + load_input( + PipelineCSVInputConfig( + file_pattern=".*\\.csv$", + base_dir=sample_data_dir, + source_column="author", + text_column="message", + timestamp_column="date(yyyyMMddHHmmss)", + timestamp_format="%Y%m%d%H%M%S", + title_column="message", + ), + ) +) + + +async def run_with_config(): + """Run a pipeline with a config file""" + # We're cheap, and this is an example, lets just do 10 + dataset = shared_dataset.head(10) + + # load pipeline.yml in this directory + config_path = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "./pipeline.yml" + ) + + # Grab the last result from the pipeline, should be our entity extraction + tables = [] + async for table in run_pipeline_with_config( + config_or_path=config_path, dataset=dataset + ): + tables.append(table) + pipeline_result = tables[-1] + + # Print the entities. This will be a row for each text unit, each with a list of entities + if pipeline_result.result is not None: + print(pipeline_result.result["entities"].to_list()) + else: + print("No results!") + + +async def run_python(): + dataset = shared_dataset.head(10) + + workflows: list[PipelineWorkflowReference] = [ + PipelineWorkflowReference( + name="entity_extraction", + config={"entity_extract": {"strategy": {"type": "nltk"}}}, + ) + ] + + # Grab the last result from the pipeline, should be our entity extraction + tables = [] + async for table in run_pipeline(dataset=dataset, workflows=workflows): + tables.append(table) + pipeline_result = tables[-1] + + # Print the entities. This will be a row for each text unit, each with a list of entities + if pipeline_result.result is not None: + print(pipeline_result.result["entities"].to_list()) + else: + print("No results!") + + +if __name__ == "__main__": + asyncio.run(run_python()) + asyncio.run(run_with_config()) diff --git a/examples/interdependent_workflows/__init__.py b/examples/interdependent_workflows/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/examples/interdependent_workflows/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/examples/interdependent_workflows/pipeline.yml b/examples/interdependent_workflows/pipeline.yml new file mode 100644 index 00000000..30bf81f9 --- /dev/null +++ b/examples/interdependent_workflows/pipeline.yml @@ -0,0 +1,23 @@ +workflows: + - name: aggregate_workflow + steps: + - verb: "aggregate" # https://github.com/microsoft/datashaper/blob/main/python/datashaper/datashaper/engine/verbs/aggregate.py + args: + groupby: "type" + column: "col_multiplied" + to: "aggregated_output" + operation: "sum" + input: + source: "workflow:derive_workflow" # reference the derive_workflow, cause this one requires that one to run first + # Notice, these are out of order, the indexing engine will figure out the right order to run them in + + - name: derive_workflow + steps: + - verb: "derive" # https://github.com/microsoft/datashaper/blob/main/python/datashaper/datashaper/engine/verbs/derive.py + args: + column1: "col1" # from above + column2: "col2" # from above + to: "col_multiplied" # new column name + operator: "*" # multiply the two columns, + # Since we're trying to act on the dataset, we don't need explicitly to specify an input + # "input": { "source": "source" } # use the dataset as the input to this verb. This is the default, so you can omit it. \ No newline at end of file diff --git a/examples/interdependent_workflows/run.py b/examples/interdependent_workflows/run.py new file mode 100644 index 00000000..9b486fa0 --- /dev/null +++ b/examples/interdependent_workflows/run.py @@ -0,0 +1,102 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import asyncio +import os + +import pandas as pd + +from graphrag.index import run_pipeline, run_pipeline_with_config +from graphrag.index.config import PipelineWorkflowReference + +# Our fake dataset +dataset = pd.DataFrame([ + {"type": "A", "col1": 2, "col2": 4}, + {"type": "A", "col1": 5, "col2": 10}, + {"type": "A", "col1": 15, "col2": 26}, + {"type": "B", "col1": 6, "col2": 15}, +]) + + +async def run_with_config(): + """Run a pipeline with a config file""" + # load pipeline.yml in this directory + config_path = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "./pipeline.yml" + ) + + tables = [] + async for table in run_pipeline_with_config( + config_or_path=config_path, dataset=dataset + ): + tables.append(table) + pipeline_result = tables[-1] + + if pipeline_result.result is not None: + # Should look something like this, which should be identical to the python example: + # type aggregated_output + # 0 A 448 + # 1 B 90 + print(pipeline_result.result) + else: + print("No results!") + + +async def run_python(): + workflows: list[PipelineWorkflowReference] = [ + PipelineWorkflowReference( + name="aggregate_workflow", + steps=[ + { + "verb": "aggregate", # https://github.com/microsoft/datashaper/blob/main/python/datashaper/datashaper/engine/verbs/aggregate.py + "args": { + "groupby": "type", + "column": "col_multiplied", + "to": "aggregated_output", + "operation": "sum", + }, + "input": { + "source": "workflow:derive_workflow", # reference the derive_workflow, cause this one requires that one to run first + # Notice, these are out of order, the indexing engine will figure out the right order to run them in + }, + } + ], + ), + PipelineWorkflowReference( + name="derive_workflow", + steps=[ + { + # built-in verb + "verb": "derive", # https://github.com/microsoft/datashaper/blob/main/python/datashaper/datashaper/engine/verbs/derive.py + "args": { + "column1": "col1", # from above + "column2": "col2", # from above + "to": "col_multiplied", # new column name + "operator": "*", # multiply the two columns, + }, + # Since we're trying to act on the default input, we don't need explicitly to specify an input + } + ], + ), + ] + + # Grab the last result from the pipeline, should be our aggregate_workflow since it should be the last one to run + tables = [] + async for table in run_pipeline(dataset=dataset, workflows=workflows): + tables.append(table) + pipeline_result = tables[-1] + + if pipeline_result.result is not None: + # Should look something like this: + # type aggregated_output + # 0 A 448 + # 1 B 90 + + # This is because we first in "derive_workflow" we multiply col1 and col2 together, then in "aggregate_workflow" we sum them up by type + print(pipeline_result.result) + else: + print("No results!") + + +if __name__ == "__main__": + asyncio.run(run_python()) + asyncio.run(run_with_config()) diff --git a/examples/multiple_workflows/__init__.py b/examples/multiple_workflows/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/examples/multiple_workflows/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/examples/multiple_workflows/pipeline.yml b/examples/multiple_workflows/pipeline.yml new file mode 100644 index 00000000..1cbbaba7 --- /dev/null +++ b/examples/multiple_workflows/pipeline.yml @@ -0,0 +1,4 @@ +workflows: + - !include workflows/workflow_1.yml + - !include workflows/workflow_2.yml + - !include workflows/workflow_3.yml \ No newline at end of file diff --git a/examples/multiple_workflows/run.py b/examples/multiple_workflows/run.py new file mode 100644 index 00000000..a5836327 --- /dev/null +++ b/examples/multiple_workflows/run.py @@ -0,0 +1,43 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import asyncio +import os + +from graphrag.index import run_pipeline_with_config +from graphrag.index.config import PipelineCSVInputConfig +from graphrag.index.input import load_input + +sample_data_dir = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "./../_sample_data/" +) + + +async def run_with_config(): + dataset = await load_input( + PipelineCSVInputConfig( + file_pattern=".*\\.csv$", + base_dir=sample_data_dir, + source_column="author", + text_column="message", + timestamp_column="date(yyyyMMddHHmmss)", + timestamp_format="%Y%m%d%H%M%S", + title_column="message", + ), + ) + + # We're cheap, and this is an example, lets just do 10 + dataset = dataset.head(2) + + # run the pipeline with the config, and override the dataset with the one we just created + # and grab the last result from the pipeline, should be the last workflow that was run (our nodes) + pipeline_path = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "./pipeline.yml" + ) + + async for result in run_pipeline_with_config(pipeline_path, dataset=dataset): + print(f"Workflow {result.workflow} result\n: ") + print(result.result) + + +if __name__ == "__main__": + asyncio.run(run_with_config()) diff --git a/examples/multiple_workflows/workflows/shared/shared_fill_value.txt b/examples/multiple_workflows/workflows/shared/shared_fill_value.txt new file mode 100644 index 00000000..5f790cbc --- /dev/null +++ b/examples/multiple_workflows/workflows/shared/shared_fill_value.txt @@ -0,0 +1 @@ +value_from_shared_file \ No newline at end of file diff --git a/examples/multiple_workflows/workflows/workflow_1.yml b/examples/multiple_workflows/workflows/workflow_1.yml new file mode 100644 index 00000000..9ed87e1c --- /dev/null +++ b/examples/multiple_workflows/workflows/workflow_1.yml @@ -0,0 +1,6 @@ +name: workflow_1 +steps: + - verb: fill + args: + to: "col_workflow_1" + value: 1 diff --git a/examples/multiple_workflows/workflows/workflow_2.yml b/examples/multiple_workflows/workflows/workflow_2.yml new file mode 100644 index 00000000..c08147f2 --- /dev/null +++ b/examples/multiple_workflows/workflows/workflow_2.yml @@ -0,0 +1,17 @@ +name: workflow_2 +steps: + - verb: fill + args: + to: "col_workflow_2" + value: 2 + input: + + # workflow_2 is dependent on workflow_1 + # so in workflow_2 output, you'll also see the output from workflow_1 + source: "workflow:workflow_1" + + # Example of pulling in values from a shared file + - verb: fill + args: + to: "col_from_shared_file" + value: !include ./shared/shared_fill_value.txt diff --git a/examples/multiple_workflows/workflows/workflow_3.yml b/examples/multiple_workflows/workflows/workflow_3.yml new file mode 100644 index 00000000..1a65f2d6 --- /dev/null +++ b/examples/multiple_workflows/workflows/workflow_3.yml @@ -0,0 +1,6 @@ +name: workflow_3 +steps: + - verb: fill + args: + to: "col_workflow_3" + value: 3 diff --git a/examples/single_verb/__init__.py b/examples/single_verb/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/examples/single_verb/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/examples/single_verb/input/data.csv b/examples/single_verb/input/data.csv new file mode 100644 index 00000000..d1aaf77b --- /dev/null +++ b/examples/single_verb/input/data.csv @@ -0,0 +1,3 @@ +col1,col2 +2,4 +5,10 \ No newline at end of file diff --git a/examples/single_verb/pipeline.yml b/examples/single_verb/pipeline.yml new file mode 100644 index 00000000..ea783d30 --- /dev/null +++ b/examples/single_verb/pipeline.yml @@ -0,0 +1,12 @@ +input: + file_type: csv + base_dir: ./input + file_pattern: .*\.csv$ +workflows: + - steps: + - verb: derive # https://github.com/microsoft/datashaper/blob/main/python/datashaper/datashaper/engine/verbs/derive.py + args: + column1: "col1" + column2: "col2" + to: "col_multiplied" + operator: "*" diff --git a/examples/single_verb/run.py b/examples/single_verb/run.py new file mode 100644 index 00000000..4c9f5225 --- /dev/null +++ b/examples/single_verb/run.py @@ -0,0 +1,77 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import asyncio +import os + +import pandas as pd + +from graphrag.index import run_pipeline, run_pipeline_with_config +from graphrag.index.config import PipelineWorkflowReference + +# our fake dataset +dataset = pd.DataFrame([{"col1": 2, "col2": 4}, {"col1": 5, "col2": 10}]) + + +async def run_with_config(): + """Run a pipeline with a config file""" + # load pipeline.yml in this directory + config_path = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "./pipeline.yml" + ) + + tables = [] + async for table in run_pipeline_with_config( + config_or_path=config_path, dataset=dataset + ): + tables.append(table) + pipeline_result = tables[-1] + + if pipeline_result.result is not None: + # Should look something like this, which should be identical to the python example: + # col1 col2 col_multiplied + # 0 2 4 8 + # 1 5 10 50 + print(pipeline_result.result) + else: + print("No results!") + + +async def run_python(): + """Run a pipeline using the python API""" + workflows: list[PipelineWorkflowReference] = [ + PipelineWorkflowReference( + steps=[ + { + # built-in verb + "verb": "derive", # https://github.com/microsoft/datashaper/blob/main/python/datashaper/datashaper/engine/verbs/derive.py + "args": { + "column1": "col1", # from above + "column2": "col2", # from above + "to": "col_multiplied", # new column name + "operator": "*", # multiply the two columns + }, + # Since we're trying to act on the default input, we don't need explicitly to specify an input + } + ] + ), + ] + + # Grab the last result from the pipeline, should be our entity extraction + tables = [] + async for table in run_pipeline(dataset=dataset, workflows=workflows): + tables.append(table) + pipeline_result = tables[-1] + + if pipeline_result.result is not None: + # Should look something like this: + # col1 col2 col_multiplied + # 0 2 4 8 + # 1 5 10 50 + print(pipeline_result.result) + else: + print("No results!") + + +if __name__ == "__main__": + asyncio.run(run_with_config()) + asyncio.run(run_python()) diff --git a/examples/use_built_in_workflows/__init__.py b/examples/use_built_in_workflows/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/examples/use_built_in_workflows/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/examples/use_built_in_workflows/pipeline.yml b/examples/use_built_in_workflows/pipeline.yml new file mode 100644 index 00000000..cb189685 --- /dev/null +++ b/examples/use_built_in_workflows/pipeline.yml @@ -0,0 +1,23 @@ +workflows: + - name: "entity_extraction" + config: + entity_extract: + strategy: + type: "nltk" + + - name: "entity_graph" + config: + cluster_graph: + strategy: + type: "leiden" + embed_graph: + strategy: + type: "node2vec" + num_walks: 10 + walk_length: 40 + window_size: 2 + iterations: 3 + random_seed: 597832 + layout_graph: + strategy: + type: "umap" \ No newline at end of file diff --git a/examples/use_built_in_workflows/run.py b/examples/use_built_in_workflows/run.py new file mode 100644 index 00000000..def3a0a6 --- /dev/null +++ b/examples/use_built_in_workflows/run.py @@ -0,0 +1,117 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import asyncio +import os + +from graphrag.index import run_pipeline, run_pipeline_with_config +from graphrag.index.config import PipelineCSVInputConfig, PipelineWorkflowReference +from graphrag.index.input import load_input + +sample_data_dir = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "../_sample_data/" +) + +# Load our dataset once +shared_dataset = asyncio.run( + load_input( + PipelineCSVInputConfig( + file_pattern=".*\\.csv$", + base_dir=sample_data_dir, + source_column="author", + text_column="message", + timestamp_column="date(yyyyMMddHHmmss)", + timestamp_format="%Y%m%d%H%M%S", + title_column="message", + ), + ) +) + + +async def run_with_config(): + """Run a pipeline with a config file""" + # We're cheap, and this is an example, lets just do 10 + dataset = shared_dataset.head(10) + + # load pipeline.yml in this directory + config_path = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "./pipeline.yml" + ) + + # Grab the last result from the pipeline, should be our entity extraction + tables = [] + async for table in run_pipeline_with_config( + config_or_path=config_path, dataset=dataset + ): + tables.append(table) + pipeline_result = tables[-1] + + if pipeline_result.result is not None: + # The output of this should match the run_python() example + first_result = pipeline_result.result.head(1) + print(f"level: {first_result['level'][0]}") + print(f"embeddings: {first_result['embeddings'][0]}") + print(f"entity_graph_positions: {first_result['node_positions'][0]}") + else: + print("No results!") + + +async def run_python(): + # We're cheap, and this is an example, lets just do 10 + dataset = shared_dataset.head(10) + + workflows: list[PipelineWorkflowReference] = [ + # This workflow reference here is only necessary + # because we want to customize the entity_extraction workflow is configured + # otherwise, it can be omitted, but you're stuck with the default configuration for entity_extraction + PipelineWorkflowReference( + name="entity_extraction", + config={ + "entity_extract": { + "strategy": { + "type": "nltk", + } + } + }, + ), + PipelineWorkflowReference( + name="entity_graph", + config={ + "cluster_graph": {"strategy": {"type": "leiden"}}, + "embed_graph": { + "strategy": { + "type": "node2vec", + "num_walks": 10, + "walk_length": 40, + "window_size": 2, + "iterations": 3, + "random_seed": 597832, + } + }, + "layout_graph": { + "strategy": { + "type": "umap", + }, + }, + }, + ), + ] + + # Grab the last result from the pipeline, should be our entity extraction + tables = [] + async for table in run_pipeline(dataset=dataset, workflows=workflows): + tables.append(table) + pipeline_result = tables[-1] + + # The output will contain entity graphs per hierarchical level, with embeddings per entity + if pipeline_result.result is not None: + first_result = pipeline_result.result.head(1) + print(f"level: {first_result['level'][0]}") + print(f"embeddings: {first_result['embeddings'][0]}") + print(f"entity_graph_positions: {first_result['node_positions'][0]}") + else: + print("No results!") + + +if __name__ == "__main__": + asyncio.run(run_python()) + asyncio.run(run_with_config()) diff --git a/examples/various_levels_of_configs/__init__.py b/examples/various_levels_of_configs/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/examples/various_levels_of_configs/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/examples/various_levels_of_configs/pipelines/workflows_and_inputs.yml b/examples/various_levels_of_configs/pipelines/workflows_and_inputs.yml new file mode 100644 index 00000000..0a653831 --- /dev/null +++ b/examples/various_levels_of_configs/pipelines/workflows_and_inputs.yml @@ -0,0 +1,64 @@ +input: + file_type: csv + base_dir: ../../_sample_data + file_pattern: .*\.csv$ + source_column: "author" + text_column: "message" + timestamp_column: "date(yyyyMMddHHmmss)" + timestamp_format: "%Y%m%d%H%M%S" + title_column: "message" + + # Limit to 10, we're not rich + post_process: + - verb: sample + args: + size: 10 + input: + source: source + +workflows: + + # This workflow reference here is only necessary + # because we want to customize the how the entity_extraction workflow is configured + # otherwise, it can be omitted, but you're stuck with the default configuration for entity_extraction + - name: entity_extraction + config: + entity_extract: + strategy: + type: graph_intelligence + llm: + type: openai_chat + api_key: !ENV ${EXAMPLE_OPENAI_API_KEY} + model: !ENV ${EXAMPLE_OPENAI_MODEL:gpt-3.5-turbo} + max_tokens: !ENV ${EXAMPLE_OPENAI_MAX_TOKENS:2500} + temperature: !ENV ${EXAMPLE_OPENAI_TEMPERATURE:0} + + - name: entity_graph + config: + cluster_graph: + strategy: + type: leiden + embed_graph: + strategy: + type: node2vec + num_walks: 10 + walk_length: 40 + window_size: 2 + iterations: 3 + random_seed: 597832 + layout_graph: + strategy: + type: umap + + # This is an anonymous workflow, it doesn't have a name + - steps: + + # Unpack the nodes from the graph + - verb: graph.unpack + args: + column: positioned_graph + type: nodes + input: + + # This is saying use the output of the entity_graph workflow as the input to this step + source: workflow:entity_graph \ No newline at end of file diff --git a/examples/various_levels_of_configs/pipelines/workflows_only.yml b/examples/various_levels_of_configs/pipelines/workflows_only.yml new file mode 100644 index 00000000..2c3c43de --- /dev/null +++ b/examples/various_levels_of_configs/pipelines/workflows_only.yml @@ -0,0 +1,46 @@ +workflows: + + # This workflow reference here is only necessary + # because we want to customize the how the entity_extraction workflow is configured + # otherwise, it can be omitted, but you're stuck with the default configuration for entity_extraction + - name: entity_extraction + config: + entity_extract: + strategy: + type: graph_intelligence + llm: + type: openai_chat + api_key: !ENV ${EXAMPLE_OPENAI_API_KEY} + model: !ENV ${EXAMPLE_OPENAI_MODEL:gpt-3.5-turbo} + max_tokens: !ENV ${EXAMPLE_OPENAI_MAX_TOKENS:2500} + temperature: !ENV ${EXAMPLE_OPENAI_TEMPERATURE:0} + + - name: entity_graph + config: + cluster_graph: + strategy: + type: leiden + embed_graph: + strategy: + type: node2vec + num_walks: 10 + walk_length: 40 + window_size: 2 + iterations: 3 + random_seed: 597832 + layout_graph: + strategy: + type: umap + + # This is an anonymous workflow, it doesn't have a name + - steps: + + # Unpack the nodes from the graph + - verb: graph.unpack + args: + column: positioned_graph + type: nodes + input: + + # This is saying use the output of the entity_graph workflow as the input to this step + source: workflow:entity_graph \ No newline at end of file diff --git a/examples/various_levels_of_configs/workflows_and_inputs.py b/examples/various_levels_of_configs/workflows_and_inputs.py new file mode 100644 index 00000000..87c7c2f8 --- /dev/null +++ b/examples/various_levels_of_configs/workflows_and_inputs.py @@ -0,0 +1,40 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import asyncio +import os + +from graphrag.index import run_pipeline_with_config + + +async def main(): + if ( + "EXAMPLE_OPENAI_API_KEY" not in os.environ + and "OPENAI_API_KEY" not in os.environ + ): + msg = "Please set EXAMPLE_OPENAI_API_KEY or OPENAI_API_KEY environment variable to run this example" + raise Exception(msg) + + # run the pipeline with the config, and override the dataset with the one we just created + # and grab the last result from the pipeline, should be our entity extraction + pipeline_path = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + "./pipelines/workflows_and_inputs.yml", + ) + + # run the pipeline with the config, and override the dataset with the one we just created + # and grab the last result from the pipeline, should be the last workflow that was run (our nodes) + tables = [] + async for table in run_pipeline_with_config(pipeline_path): + tables.append(table) + pipeline_result = tables[-1] + + # The output will contain a list of positioned nodes + if pipeline_result.result is not None: + top_nodes = pipeline_result.result.head(10) + print("pipeline result", top_nodes) + else: + print("No results!") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples/various_levels_of_configs/workflows_and_inputs_with_custom_handlers.py b/examples/various_levels_of_configs/workflows_and_inputs_with_custom_handlers.py new file mode 100644 index 00000000..880c72ad --- /dev/null +++ b/examples/various_levels_of_configs/workflows_and_inputs_with_custom_handlers.py @@ -0,0 +1,131 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import asyncio +import os +from typing import Any + +from datashaper import NoopWorkflowCallbacks, Progress + +from graphrag.index import run_pipeline_with_config +from graphrag.index.cache import InMemoryCache, PipelineCache +from graphrag.index.storage import MemoryPipelineStorage + + +async def main(): + if ( + "EXAMPLE_OPENAI_API_KEY" not in os.environ + and "OPENAI_API_KEY" not in os.environ + ): + msg = "Please set EXAMPLE_OPENAI_API_KEY or OPENAI_API_KEY environment variable to run this example" + raise Exception(msg) + + # run the pipeline with the config, and override the dataset with the one we just created + # and grab the last result from the pipeline, should be our entity extraction + pipeline_path = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + "./pipelines/workflows_and_inputs.yml", + ) + + # Create our custom storage + custom_storage = ExampleStorage() + + # Create our custom reporter + custom_reporter = ExampleReporter() + + # Create our custom cache + custom_cache = ExampleCache() + + # run the pipeline with the config, and override the dataset with the one we just created + # and grab the last result from the pipeline, should be the last workflow that was run (our nodes) + pipeline_result = [] + async for result in run_pipeline_with_config( + pipeline_path, + storage=custom_storage, + callbacks=custom_reporter, + cache=custom_cache, + ): + pipeline_result.append(result) + pipeline_result = pipeline_result[-1] + + # The output will contain a list of positioned nodes + if pipeline_result.result is not None: + top_nodes = pipeline_result.result.head(10) + print("pipeline result", top_nodes) + else: + print("No results!") + + +class ExampleStorage(MemoryPipelineStorage): + """Example of a custom storage handler""" + + async def get( + self, key: str, as_bytes: bool | None = None, encoding: str | None = None + ) -> Any: + print(f"ExampleStorage.get {key}") + return await super().get(key, as_bytes) + + async def set( + self, key: str, value: str | bytes | None, encoding: str | None = None + ) -> None: + print(f"ExampleStorage.set {key}") + return await super().set(key, value) + + async def has(self, key: str) -> bool: + print(f"ExampleStorage.has {key}") + return await super().has(key) + + async def delete(self, key: str) -> None: + print(f"ExampleStorage.delete {key}") + return await super().delete(key) + + async def clear(self) -> None: + print("ExampleStorage.clear") + return await super().clear() + + +class ExampleCache(InMemoryCache): + """Example of a custom cache handler""" + + async def get(self, key: str) -> Any: + print(f"ExampleCache.get {key}") + return await super().get(key) + + async def set(self, key: str, value: Any, debug_data: dict | None = None) -> None: + print(f"ExampleCache.set {key}") + return await super().set(key, value, debug_data) + + async def has(self, key: str) -> bool: + print(f"ExampleCache.has {key}") + return await super().has(key) + + async def delete(self, key: str) -> None: + print(f"ExampleCache.delete {key}") + return await super().delete(key) + + async def clear(self) -> None: + print("ExampleCache.clear") + return await super().clear() + + def child(self, name: str) -> PipelineCache: + print(f"ExampleCache.child {name}") + return ExampleCache(name) + + +class ExampleReporter(NoopWorkflowCallbacks): + """Example of a custom reporter. This will print out all of the status updates from the pipeline.""" + + def progress(self, progress: Progress): + print("ExampleReporter.progress: ", progress) + + def error(self, message: str, details: dict[str, Any] | None = None): + print("ExampleReporter.error: ", message) + + def warning(self, message: str, details: dict[str, Any] | None = None): + print("ExampleReporter.warning: ", message) + + def log(self, message: str, details: dict[str, Any] | None = None): + print("ExampleReporter.log: ", message) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples/various_levels_of_configs/workflows_only.py b/examples/various_levels_of_configs/workflows_only.py new file mode 100644 index 00000000..192297eb --- /dev/null +++ b/examples/various_levels_of_configs/workflows_only.py @@ -0,0 +1,59 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import asyncio +import os + +from graphrag.index import run_pipeline_with_config +from graphrag.index.config import PipelineCSVInputConfig +from graphrag.index.input import load_input + +sample_data_dir = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "../_sample_data/" +) + + +async def main(): + if ( + "EXAMPLE_OPENAI_API_KEY" not in os.environ + and "OPENAI_API_KEY" not in os.environ + ): + msg = "Please set EXAMPLE_OPENAI_API_KEY or OPENAI_API_KEY environment variable to run this example" + raise Exception(msg) + + dataset = await load_input( + PipelineCSVInputConfig( + file_pattern=".*\\.csv$", + base_dir=sample_data_dir, + source_column="author", + text_column="message", + timestamp_column="date(yyyyMMddHHmmss)", + timestamp_format="%Y%m%d%H%M%S", + title_column="message", + ), + ) + + # We're cheap, and this is an example, lets just do 10 + dataset = dataset.head(10) + + # run the pipeline with the config, and override the dataset with the one we just created + # and grab the last result from the pipeline, should be the last workflow that was run (our nodes) + pipeline_path = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "./pipelines/workflows_only.yml" + ) + tables = [] + async for table in run_pipeline_with_config(pipeline_path, dataset=dataset): + tables.append(table) + pipeline_result = tables[-1] + + # The output will contain a list of positioned nodes + if pipeline_result.result is not None: + top_nodes = pipeline_result.result.head(10) + print( + "pipeline result\ncols: ", pipeline_result.result.columns, "\n", top_nodes + ) + else: + print("No results!") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples_notebooks/global_search.ipynb b/examples_notebooks/global_search.ipynb new file mode 100644 index 00000000..fdde2c70 --- /dev/null +++ b/examples_notebooks/global_search.ipynb @@ -0,0 +1,264 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nCopyright (c) Microsoft Corporation.\\n'" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Copyright (c) 2024 Microsoft Corporation.\n", + "# Licensed under the MIT License." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "import pandas as pd\n", + "import tiktoken\n", + "\n", + "from graphrag.query.indexer_adapters import read_indexer_entities, read_indexer_reports\n", + "from graphrag.query.llm.oai.chat_openai import ChatOpenAI\n", + "from graphrag.query.llm.oai.typing import OpenaiApiType\n", + "from graphrag.query.structured_search.global_search.community_context import (\n", + " GlobalCommunityContext,\n", + ")\n", + "from graphrag.query.structured_search.global_search.search import GlobalSearch" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Global Search example\n", + "\n", + "Global search method generates answers by searching over all AI-generated community reports in a map-reduce fashion. This is a resource-intensive method, but often gives good responses for questions that require an understanding of the dataset as a whole (e.g. What are the most significant values of the herbs mentioned in this notebook?)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### LLM setup" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "api_key = os.environ[\"GRAPHRAG_API_KEY\"]\n", + "llm_model = os.environ[\"GRAPHRAG_LLM_MODEL\"]\n", + "\n", + "llm = ChatOpenAI(\n", + " api_key=api_key,\n", + " model=llm_model,\n", + " api_type=OpenaiApiType.OpenAI, # OpenaiApiType.OpenAI or OpenaiApiType.AzureOpenAI\n", + " max_retries=20,\n", + ")\n", + "\n", + "token_encoder = tiktoken.get_encoding(\"cl100k_base\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load community reports as context for global search\n", + "\n", + "- Load all community reports in the `create_final_community_reports` table from the ire-indexing engine, to be used as context data for global search.\n", + "- Load entities from the `create_final_nodes` and `create_final_entities` tables from the ire-indexing engine, to be used for calculating community weights for context ranking. Note that this is optional (if no entities are provided, we will not calculate community weights and only use the `rank` attribute in the community reports table for context ranking)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# parquet files generated from indexing pipeline\n", + "INPUT_DIR = \"./inputs/operation dulce\"\n", + "COMMUNITY_REPORT_TABLE = \"create_final_community_reports\"\n", + "ENTITY_TABLE = \"create_final_nodes\"\n", + "ENTITY_EMBEDDING_TABLE = \"create_final_entities\"\n", + "\n", + "# community level in the Leiden community hierarchy from which we will load the community reports\n", + "# higher value means we use reports from more fine-grained communities (at the cost of higher computation cost)\n", + "COMMUNITY_LEVEL = 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "entity_df = pd.read_parquet(f\"{INPUT_DIR}/{ENTITY_TABLE}.parquet\")\n", + "report_df = pd.read_parquet(f\"{INPUT_DIR}/{COMMUNITY_REPORT_TABLE}.parquet\")\n", + "entity_embedding_df = pd.read_parquet(f\"{INPUT_DIR}/{ENTITY_EMBEDDING_TABLE}.parquet\")\n", + "\n", + "reports = read_indexer_reports(report_df, entity_df, COMMUNITY_LEVEL)\n", + "entities = read_indexer_entities(entity_df, entity_embedding_df, COMMUNITY_LEVEL)\n", + "print(f\"Report records: {len(report_df)}\")\n", + "report_df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Build global context based on community reports" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "context_builder = GlobalCommunityContext(\n", + " community_reports=reports,\n", + " entities=entities, # default to None if you don't want to use community weights for ranking\n", + " token_encoder=token_encoder,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Perform global search" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "context_builder_params = {\n", + " \"use_community_summary\": False, # False means using full community reports. True means using community short summaries.\n", + " \"shuffle_data\": True,\n", + " \"include_community_rank\": True,\n", + " \"min_community_rank\": 0,\n", + " \"community_rank_name\": \"rank\",\n", + " \"include_community_weight\": True,\n", + " \"community_weight_name\": \"occurrence weight\",\n", + " \"normalize_community_weight\": True,\n", + " \"max_tokens\": 12_000, # change this based on the token limit you have on your model (if you are using a model with 8k limit, a good setting could be 5000)\n", + " \"context_name\": \"Reports\",\n", + "}\n", + "\n", + "map_llm_params = {\n", + " \"max_tokens\": 1000,\n", + " \"temperature\": 0.0,\n", + " \"response_format\": {\"type\": \"json_object\"},\n", + "}\n", + "\n", + "reduce_llm_params = {\n", + " \"max_tokens\": 2000, # change this based on the token limit you have on your model (if you are using a model with 8k limit, a good setting could be 1000-1500)\n", + " \"temperature\": 0.0,\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "search_engine = GlobalSearch(\n", + " llm=llm,\n", + " context_builder=context_builder,\n", + " token_encoder=token_encoder,\n", + " max_data_tokens=12_000, # change this based on the token limit you have on your model (if you are using a model with 8k limit, a good setting could be 5000)\n", + " map_llm_params=map_llm_params,\n", + " reduce_llm_params=reduce_llm_params,\n", + " allow_general_knowledge=False, # set this to True will add instruction to encourage the LLM to incorporate general knowledge in the response, which may increase hallucinations, but could be useful in some use cases.\n", + " json_mode=True, # set this to False if your LLM model does not support JSON mode.\n", + " context_builder_params=context_builder_params,\n", + " concurrent_coroutines=32,\n", + " response_type=\"multiple paragraphs\", # free form text describing the response type and format, can be anything, e.g. prioritized list, single paragraph, multiple paragraphs, multiple-page report\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "result = await search_engine.asearch(\n", + " \"What is the major conflict in this story and who are the protagonist and antagonist?\"\n", + ")\n", + "\n", + "print(result.response)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# inspect the data used to build the context for the LLM responses\n", + "result.context_data[\"reports\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "LLM calls: 13. LLM tokens: 184660\n" + ] + } + ], + "source": [ + "# inspect number of LLM calls and tokens\n", + "print(f\"LLM calls: {result.llm_calls}. LLM tokens: {result.prompt_tokens}\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples_notebooks/inputs/operation dulce/ABOUT.md b/examples_notebooks/inputs/operation dulce/ABOUT.md new file mode 100644 index 00000000..cac4ea11 --- /dev/null +++ b/examples_notebooks/inputs/operation dulce/ABOUT.md @@ -0,0 +1,3 @@ +# About + +This document (Operation Dulce) is an AI-generated science fiction novella, included here for the purposes of providing a starting point for notebook experimentation. diff --git a/examples_notebooks/inputs/operation dulce/Operation Dulce v2 1 1.md b/examples_notebooks/inputs/operation dulce/Operation Dulce v2 1 1.md new file mode 100644 index 00000000..95c9e3cd --- /dev/null +++ b/examples_notebooks/inputs/operation dulce/Operation Dulce v2 1 1.md @@ -0,0 +1,970 @@ +# Operation: Dulce + +## Chapter 1 + +The thrumming of monitors cast a stark contrast to the rigid silence enveloping the group. Agent Alex Mercer, unfailingly determined on paper, seemed dwarfed by the enormity of the sterile briefing room where Paranormal Military Squad's elite convened. With dulled eyes, he scanned the projectors outlining their impending odyssey into Operation: Dulce. + +“I assume, Agent Mercer, you’re not having second thoughts?” It was Taylor Cruz’s voice, laced with an edge that demanded attention. + +Alex flickered a strained smile, still thumbing his folder's corner. "Of course not, Agent Cruz. Just trying to soak in all the details." The compliance in his tone was unsettling, even to himself. + +Jordan Hayes, perched on the opposite side of the table, narrowed their eyes but offered a supportive nod. "Details are imperative. We’ll need your clear-headedness down there, Mercer." + +A comfortable silence, the kind that threaded between veterans of shared secrets, lingered briefly before Sam Rivera, never one to submit to quiet, added, "I’ve combed through the last transmission logs. If anyone can make sense of the anomalies, it’s going to be the two of you." + +Taylor snorted dismissively. “Focus, people. We have protocols for a reason. Speculation is counter-productive.” The words 'counter-productive' seemed to hang in the air, a tacit reprimand directed at Alex. + +Feeling the weight of his compliance conflicting with his natural inclination to leave no stone unturned, Alex straightened in his seat. "I agree, Agent Cruz. Protocol is paramount," he said, meeting Taylor's steely gaze. It was an affirmation, but beneath it lay layers of unspoken complexities that would undoubtedly unwind with time. + +Alex's submission, though seemingly complete, didn't escape Jordan, who tilted their head ever so slightly, their eyes revealing a spark of understanding. They knew well enough the struggle of aligning personal convictions with overarching missions. As everyone began to collect their binders and prepare for departure, a quiet resolve took form within Alex, galvanized by the groundwork laid by their interactions. He may have spoken in compliance, but his determination had merely taken a subtler form — one that wouldn't surrender so easily to the forthcoming shadows. + +\* + +Dr. Jordan Hayes shuffled a stack of papers, their eyes revealing a tinge of skepticism at Taylor Cruz's authoritarian performance. _Protocols_, Jordan thought, _are just the framework, the true challenges we're about to face lie well beyond the boundaries of any protocol._ They cleared their throat before speaking, tone cautious yet firm, "Let's remember, the unknown variables exceed the known. We should remain adaptive." + +A murmur of agreement echoed from Sam Rivera, who leaned forward, lacing their fingers together as if weaving a digital framework in the air before them, "Exactly, adaptability could be the key to interpreting the signal distortions and system malfunctions. We shouldn't discount the… erratic." + +Their words hung like an electric charge in the room, challenging Taylor's position with an inherent truth. Cruz’s jaw tightened almost imperceptibly, but the agent masked it with a small nod, conceding to the omnipresent threat of the unpredictable. + +Alex glanced at Jordan, who never looked back, their gaze fixed instead on a distant point, as if envisioning the immense dark corridors they were soon to navigate in Dulce. Jordan was not one to embrace fantastical theories, but the air of cautious calculation betrayed a mind bracing for confrontation with the inexplicable, an internal battle between the evidence of their research and the calculating skepticism that kept them alive in their field. + +The meeting adjourned with no further comments, the team members quietly retreading the paths to their personal preparations. Alex, trailing slightly behind, observed the others. _The cautious reserve Jordan wears like armor doesn't fool me_, he thought, _their analytical mind sees the patterns I do. And that's worth more than protocol. That's the connection we need to survive this._ + +As the agents dispersed into the labyrinth of the facility, lost in their thoughts and preparations, the base's halogen lights flickered, a brief and unnoticed harbingers of the darkness to come. + +\* + +A deserted corridor inside the facility stretched before Taylor Cruz, each footstep rhythmic and precise. Cruz, ambitious and meticulous, eyed the troops passing by with a sardonic tilt of the lips. Obedience—it was as much a tool as any weapon in the arsenal, and Cruz wielded it masterfully. To them, it was another step toward unfettered power within the dark bowels of the military complex. + +Inside a secluded equipment bay, Cruz began checking over gear with mechanical efficiency. They traced fingers over the sleek surface of an encrypted radio transmitter. "If protocols are maintained," said Cruz aloud, rehearsing the speech for their subordinates, "not only will we re-establish a line of communication with Dulce, but we shall also illuminate the darkest secrets it conceals." + +Agent Hayes appeared in the doorway, arms crossed and a knowing glint in their eyes. "You do understand," Jordan began, the words measured and probing, "that once we're in the depths, rank gives way to survival instincts. It's not about commands—it's empowerment through trust." + +The sentiment snagged on Cruz's armor of confidence, probing at the insecurities festering beneath. Taylor offered a brief nod, perhaps too curt, but enough to acknowledge Jordan's point without yielding ground. "Trust," Cruz mused, "or the illusion thereof, is just as potent." + +Silence claimed the space between them, steeped in the reality of the unknown dangers lurking in the shadows of the mission. Cruz diligently returned to the equipment, the act a clear dismissal. + +Not much later, Cruz stood alone, the hollow echo of the bay a stark reminder of the isolation that power often wrought. With each checked box, their resolve steeled further, a silent vow to usher their team through the abyss—whatever it might hold—and emerge enshrined in the respect they so deeply craved. + +## Chapter 2 + +Sam Rivera sat alone in a cramped office, the hum of a dozen servers murmuring a digital lullaby in the background. Surrounded by the glow of multiple screens, their eyes danced across lines of code and intercepted comm signals from Dulce — a kaleidoscope of data that their curious and isolated mind hungered to decrypt. + +To an outsider, it might have looked like obsession, this fervent quest for answers. But to Sam, it was a dance — a give and take with the mysteries of the universe. Their fingers paused over the keyboard as they leaned back in the chair, whispering to thin air, "What secrets are you hiding from us?" + +The stillness of the room broke with the unexpected arrival of Alex Mercer, whose encroaching shadow loomed over Sam's workspace. The cybersecurity expert craned their neck upwards, met by the ever-so-slight furrow in Alex's brow. "Got a minute, Rivera?" + +"Always," Sam said, a smile surfacing as they swiveled to face their mentor more directly. _He has that look — like something's not sitting right with him,_ they noted inwardly. + +Alex hesitated, weighing his words carefully. "Our tech is top-tier, but the silence from Dulce... It's not just technology that will see us through, it's intuition and... trust." His gaze pierced through the digital haze, trying to instill something more profound than advice. + +Sam regarded Alex for a moment, the sincerity in his voice resonating with their own unspoken desire to prove their worth. "Intuition," they mirrored thoughtfully. "I guess sometimes the numbers don't have all the answers." + +Their shared silence held a newfound understanding, a recognition that between the ones and zeros, it was their combined human insights that might prevail against the impossible. As Alex turned to leave, Sam's eyes drifted back to the screens, now seeing them not as barriers to isolate behind, but as windows into the vast and enigmatic challenge that awaited their team. + +Outside the office, the persistent buzz of activity in the facility belied the unease that gripped its inhabitants. A restlessness that nibbled on the edges of reality, as though forewarning of the threshold they were soon to cross — from the known into the realm of cosmic secrets and silent threats. + +\* + +Shadows played against the walls of the cramped underground meeting room, where Alex Mercer stood gazing at the concealed elevator that would deliver them into the bowels of Dulce base. The air was thick, every breath laced with the weight of impending confrontation, the kind one feels when stepping into a legend. Though armed with an array of advanced weaponry and gear, there was an unshakeable sense that they were delving into a conflict where the physical might be of little consequence. + +"I know what you're thinking," Jordan Hayes remarked, approaching Mercer. Their voice was low, a blend of confidence and hidden apprehension. "This feels like more than a rescue or reconnaissance mission, doesn't it?" + +Alex turned, his features a mask of uneasy resolve. "It's like we're being pulled into someone else’s game. Not just observers or participants, but... pawns." + +Jordan gave a short nod, their analytical mind colliding with the uncertain dynamics of this operation. "I've felt that way since the briefing. Like there's a layer we’re not seeing. And yet, we have no choice but to play along." Their eyes locked with Alex's, silently exchanging a vow to remain vigilant. + +"You two need to cut the philosophical chatter. We have positions to secure," Taylor Cruz interjected sharply, stepping into their exchange. The authority in Taylor's voice brooked no argument; it was their way of pulling everyone back to the now. + +Alex's response was measured, more assertive than moments ago. "Acknowledged, Agent Cruz," he replied, his voice steadier, mirroring the transformation brewing within. He gripped his rifle with a newfound firmness. "Let's proceed." + +As they congregated at the elevator, a tension palpable, Sam Rivera piped in with a tone of balanced levity, "Hope everyone’s brought their good luck charms. Something tells me we’re going to need all the help we can get." + +Their laughter served as a brief respite from the gravity of their mission, a shared moment that reinforced their common humanity amidst the unknowable. Then, as one, they stepped into the elevator. The doors closed with a silent hiss, and they descended into the darkness together, aware that when they returned, if they returned, none of them would be the same. + +\* + +The sense of foreboding hung heavier than the darkness that the artificial lights of the elevator shaft failed to fully penetrate. The team was descending into the earth, carrying with them not only the weight of their equipment but also the silent pressure of the invisible war they were about to fight—a war that seemed to edge away from physicality and into the unnervingly psychological. + +As they descended, Dr. Jordan Hayes couldn't help but muse over the layers of data that could wait below, now almost longing for the comfort of empirical evidence. _To think that this reluctance to accept other possibilities may have been my biggest blind spot,_ Jordan contemplated, feeling the hard shell of skepticism begin to crack. + +Alex caught Jordan's reflective gaze and leaned in, his voice barely a murmur over the hum of the elevator. "Once we're down there, keep that analytical edge sharp. You see through the mazes of the unexplained better than anyone." + +The compliment was unexpected and weighed differently than praise from others. This was an acknowledgment from someone who stood on the front lines of the unknown with eyes wide open. "Thank you, Alex," Jordan said, the words carrying a trace of newfound assertiveness. "You can count on me." + +The exchange was cut short by a shudder that ran through the elevator, subtle, but enough to make them instinctively hold their breaths. It wasn't the mechanical stutter of old gears but a vibration that seemed to emanate from the very walls of the shaft—a whisper of something that defied natural explanation. + +Cruz was the first to react, all business despite the shadow that crossed their expression. "Systems check. Now," they barked out, masking the moment of disquiet with swift command. + +Every agent checked their gear, sending confirmation signals through their comms, creating a chorus of electronic beeps that promised readiness. But there was an unspoken question among them: was their technology, their weaponry, their protocols sufficient for what awaited them or merely a fragile comfort? + +Against the gravity of the silence that was once again closing in, Sam's voice crackled through, only half-jest. "I'd laugh if we run into Martians playing poker down there—just to lighten the mood, you know?" + +Despite—or perhaps because of—the oddity of the moment, this elicited a round of chuckles, an audible release of tension that ran counterpoint to the undercurrent of anxiety coursing through the team. + +As the elevator came to a halting, eerie calm at the sub-level, the group stepped off, finding themselves at the threshold of Dulce's mysterious halls. They stood in a tight pack, sharing a cautious glance before fanning out into the unknown, each one acutely aware that the truth was inevitably intertwined with danger. + +Into the depths of Dulce, the team advanced, their silence now a shared testament to the camaraderie born of facing the abyss together—and the steel resolve to uncover whatever horrors lay hidden in its shadows. + +\* + +The weight of the thick metal door closing behind them reverberated through the concrete hallway, marking the final threshold between the familiar world above and the strangeness that lay beneath. Dulce base, a name that had been whispered in the wind-blown deserts above and in the shadowed corners of conspiracy forums, now a tangible cold reality that they could touch — and that touched them back with a chill. + +Like lambs led to an altar of alien deities, so did Agents Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera proceed, their movements measured, their senses heightened. The air was still, almost respectful of the gravity of their presence. Their torch beams sliced through the darkness, uncovering steel doors with warnings that spoke of top secrets and mortal dangers. + +Taylor Cruz, stepping firmly into the role of de facto leader, set a brisk pace. "Eyes sharp, people. Comms check, every thirty seconds," Taylor ordered, their voice echoing slightly before being swallowed by the surrounding silence. + +Sam, fiddling with a handheld device aimed at detecting electronic anomalies, offered a murmured "Copy that," their usual buoyancy dimmed by the oppressive atmosphere. + +It was Jordan Hayes who paused at an innocuous looking panel, nondescript amongst the gauntlet of secured doorways. "Mercer, Rivera, come see this," Jordan’s voice was marked with a rare hint of urgency. + +Alex joined Jordan's side, examining the panel which, at a mere glance, seemed just another part of the base's infrastructure. Yet, to the trained eye, it appeared out of place—a facade. + +Jordan explained their reasoning as Sam approached, instinctively understanding the significance of what lay beneath, "This panel is a recent addition — covering something they didn't want found." + +Before Alex could respond, the soft whir of an approaching drone cut through their muffled exchange. Taylor had looped back upon hearing the commotion. "Explanations later. We can't afford to attract..." Cruz’s voice trailed off as the small airborne device came into view, its sensors locked onto the group. + +Sam was the first to react, their tech-savvy mind already steps ahead. "I've got this," they declared, fingers flying over the controls of their own gadgetry to ward off the impending threat. + +The drone lingered, its scan seeming more curious than hostile. But within moments, courtesy of Sam's interference, the little sentinel drifted away, retreating into the shadows as if accepting a silent truce. The crew exhaled, a moment of collective relief palpable in the air. + +Cruz squared their shoulders, clearly ruffled but not conceding any ground. "Move out," they directed, a hint more forceful than before. "And Rivera, keep that trick handy." + +The team pressed onward, the quiet now filled with the soft beeps of regular comms checks, their pace undeterred by the confrontation. Yet, every agent held a renewed sense of wariness, their trust in one another deepening with the knowledge that the base—its technology, its secrets—was alive in a way they hadn't fully anticipated. + +As they converged upon a central hub, the imposing doors to the mainframe room stood ajar — an invitation or a trap, neither option comforting. Without a word, they fortified their resolve and stepped through the threshold, where the dim glow of operational LED lights and the distant hum of machinery hinted at Dulce’s still-beating heart. + +Solemnly, yet unmistakably together, they moved deeper into the heart of the enigma, ready to unmask the lifeforce of Dulce base or confront whatever existential threat lay in wait. It was in that unwavering march towards the unknown that their destinies were forever cemented to the legacy of Operation: Dulce. + +## Chapter 3 + +The thrumming of monitors cast a stark contrast to the rigid silence enveloping the group. Agent Alex Mercer, unfailingly determined on paper, seemed dwarfed by the enormity of the sterile briefing room where Paranormal Military Squad's elite convened. With dulled eyes, he scanned the projectors outlining their impending odyssey into Operation: Dulce. + +\* + +The cooling vents hummed in a monotonous drone, but it was the crackle of the comms system coming to life that cut through the lab’s tension. Dr. Jordan Hayes hovered over a table arrayed with alien technology, their fingers delicately probing the enigmatic circuitry retrieved from the crash site. Agent Alex Mercer watched, admiration blooming in silent solidarity for Jordan's deft touch and unspoken drive. + +Jordan, always composed, only allowed the faintest furrow of concentration to mar their brow. "What we understand about physics..." they muttered, trailing off as they realigned a translucent component. The device emitted a low pulse, causing Jordan to still. "Could be fundamentally changed by this." + +A calculated risk—that's what this was. And for a person of science, a gamble was worth the potential paradigm shift. + +"I’ve been thinking," Alex started, his eyes still fixed on the immediately tangible mystery before them. "About what’s at stake here. Not the mission parameters, but what this means for us—humanity." + +Jordan glanced up, meeting his eyes just long enough to convey the shared enormity of their situation; the career-defining glory and existential dread entwined. "The quest for understanding always comes at a price. We're standing on the precipice of knowledge that could either elevate us or condemn us." + +The charged air between them spiked as Taylor Cruz’s brusque tones sliced through their reverie. "Hayes, Mercer, this isn't philosophy hour. Focus on the task. We need actionable intel, not daydreams." + +With a sound of restrained acknowledgment, Jordan returned their gaze to the device, while Alex clenched his jaw, the buzz of frustration dull against the backdrop of Taylor's authoritarian certainty. It was this competitive undercurrent that kept him alert, the sense that his and Jordan's shared commitment to discovery was an unspoken rebellion against Cruz's narrowing vision of control and order. + +Then Taylor did something unexpected. They paused beside Jordan and, for a moment, observed the device with something akin to reverence. “If this tech can be understood..." Taylor said, their voice quieter, "It could change the game for us. For all of us.” + +The underlying dismissal earlier seemed to falter, replaced by a glimpse of reluctant respect for the gravity of what lay in their hands. Jordan looked up, and for a fleeting heartbeat, their eyes locked with Taylor's, a wordless clash of wills softening into an uneasy truce. + +It was a small transformation, barely perceptible, but one that Alex noted with an inward nod. They had all been brought here by different paths and for different reasons. Yet, beneath the veneer of duty, the enticement of the vast unknown pulled them inexorably together, coalescing their distinct desires into a shared pulse of anticipation. + +Marshaled back to the moment by the blink of lights and whir of machinery, they refocused their efforts, each movement sharpened by the knowledge that beyond understanding the unearthly artifacts, they might be piecing together the future of their species. + +\* + +Amidst the sterility of the briefing room, the liminal space between the facts laid out and the hidden truths, sat Sam Rivera, his demeanor an artful balance of focus and a casual disguise of his razor-sharp talent with technology. Across from him, Alex Mercer lingered in thought, the mental cogs turning as each file on Dulce stirred more than curiosity—it beckoned to a past both honored and burdensome. + +"You've been quiet, Sam," Alex noted, catching the younger man's contemplative gaze. "Your take on these signal inconsistencies?" + +There was a respect in Alex's tone, though a respectful distance remained—a gulf of experience and a hint of protective mentorship that stood between them. Sam nodded, recognizing the space afforded to him, and he couldn't help but feel the weight of expectation pressing upon his shoulders. It wasn't just the mission that was immense, it was the trust being placed in him. + +"The patterns are... off," Sam admitted, hesitant but driven. "If I'm right, what we're looking at isn't random—it's a structured anomaly. We need to be ready for anything." + +Alex's eyes brightened with a subtle approval that crossed the distance like a silent nod. "Good. Keen eyes will keep us ahead—or at least not blindsided," he said, affirming the belief that inscribed Sam's role as more than the tech personnel—he was to be a guiding intellect in the heart of uncertainty. + +Their exchange was cut short by Taylor Cruz's abrupt arrival, his gait brimming with a robust confidence that veiled the sharp undercurrents of his striving nature. "Time to gear up. Dulce waits for no one," Taylor announced, his voice carrying an iron resolve that knew the costs of hesitation—though whether the cost was calculated in human or career terms was an ambiguity he wore like a badge of honor. + +As Sam and Alex nodded in unison, the icy chasm of hierarchy and cryptic protocols seemed momentarily to bridge over with an understanding—this mission was convergence, a nexus point that would challenge each of their motives and strength. + +They filed out of the briefing room, their footsteps synchronized, a rhythm that spoke volumes of the unknown cadence they would soon march to within the base's veins. For Alex Mercer, the link with Sam Rivera, though distant, was now poised with a mutuality ready to be tested; for Taylor Cruz, the initiative pulsed like a heartbeat, anticipation thinly veiled behind a mask of duty. + +In the midst of the descent, they were each alone yet irrevocably joined, stepping closer towards the volatile embrace of Operation: Dulce. + +## Chapter 4 + +The corridors of the Dulce military base were as silent as a tomb and twice as chilling. Alex Mercer walked with a surety that belied his bubbling undercurrents of doubt. The briefing had been definitive, sturdy pillars of facts and protocols, yet as he ventured deeper, the ominous atmosphere gnawed at him—a stark reminder of how much remained unknown. + +Jordan Hayes trailed a few steps behind, their detached exterior breaking for a moment as they caught up to Alex. "What's on your mind?" Jordan asked, their astuteness cutting through the unspoken tension. + +Alex glanced back at them. This place was a puzzle, a treacherous labyrinth where the walls whispered secrets, and among them, he sensed a call to question, to challenge the narrative they'd been sold. "The silence here... It's almost as if the base is waiting for something—or someone." + +"Just stay sharp, Mercer," Jordan cautioned, yet their eyes lingered on the quietude around them, conceiving the same shadow of doubt that unsettled Alex. + +Before they could delve into further discussion, the distinctive click of a safety catch echoed in the hollow space. Both agents turned to find Taylor Cruz standing resolute, primed for combat. Taylor's gaze was scrutinizing and cold, a stark contrast to the growing unease that smoldered silently amongst the rest. + +"Chatter is a liability," Taylor snapped, with a commanding flair that bordered on tyrannical. "We move forward, eyes open, mouths shut." + +Alex felt the tight grip of compliance strangle his gut, a lesson learned under the hard tutelage of rank and order. But here, in the bowels of Dulce, those instincts began to wane, the imperative to adhere now conflicting with the pressing urgency to confront the shadows they were enmeshed in. + +Then, unexpectedly, the lights flickered, a power fluctuation—or a sign? Alex's hand instinctively went to his sidearm, his mindset shifting from soldier to skeptic. The base, with its unyielding coldness, had just given them their first nudge into the realm of the speculative, an invitation to peel back the veneer of reality. + +"We should consider all possibilities," Alex murmured, more to himself than the others, his voice a barely audible breath against the sterile air of the complex. + +Taylor's posture stiffened at the challenge, yet their response was uncharacteristically reserved, notable in its lack of rebuke. "Agreed. For now, keep moving. But stay vigilant." + +A surprise—an echo of agreement from the last person Alex expected it from. And there it was, the glimpse of a wrinkle in the unyielding fabric of command, a hint that perhaps they were all starting to sense the strangeness that permeated this place. + +Progressing with determined steps, the trio moved deeper, silently acknowledging the evolution of their predicament. It was a small yet transformative concession to the unknown forces at play, an acknowledgment from each agent that, despite their disparate goals and ideals, the true nature of the Dulce base was an enigma that would forge new paths through their convictions. + +As they reached the central communications hub, the truth that awaited them lurked in the shadows, its eyes unseen but felt by all. The walls didn't just whisper now; they spoke in tones only the brave—or the foolish—would dare to listen to. + +\* + +The subterranean silence of Dulce was an oppressive entity of its own, wrapping the team in a cloak of uneasiness as they pressed on through the dimly lit corridor. Jordan Hayes found themselves contemplating the ramifications of each step taken into this suspended world, where the sterile air seemed to mock the gravity of their predicament. The closer they got to the communication hub, the more Jordan's mind wandered toward the realm of the inexplicable. + +Beside Jordan, Alex Mercer moved forward with deliberation, his gaze scanning the heavy utility doors they passed—one of which was partially ajar, beckoning them with its darkness. "After you, Dr. Hayes," Alex said, gesturing toward the mysterious opening. A hint of shared understanding passed between them; knowledge was the guiding star of this mission as much as confrontation or recovery. + +Jordan peered inside, the beam from their flashlight slicing through the obscurity. The room beyond was a chaotic cascade of papers, overturned furniture, and the particular kind of disorder born from hasty evacuation—or something far more sinister. + +"It's like they vanished in the middle of something urgent," Alex murmured, his voice tight with a mix of concern and anticipation. He began to sift through the scattered reports, each page a potential clue to the enigmatic silence that shrouded Dulce. + +Behind them, Taylor watched with a disciplined patience, their authority the foundation upon which the operation was built. Their voice cut into the stillness, a reminder of their presence, "Time is not our ally here." + +Drawing back from momentary distraction, Jordan acknowledged the wisdom in Taylor's words, yet could feel the shift in their stance—from skeptical, reserved analyst, to a proactive agent within the narrative. "You're right; these documents may hold critical insights. Let's collect what we can and analyze them properly." + +From the darkened hollows of the room, shadows seemed to cast subtle judgment as Alex and Jordan worked together with heightened urgency. Taylor, for once, didn't intervene but instead surveyed the entrance, their mind anticipating the unknown variables that lay ahead. + +Unexpectedly, a soft hiss emanated from a neglected terminal on the desk. Jordan's head snapped up, their heart rate accelerating at the potential ramifications. Without a word, they moved to the machine, hands driven by the newfound conviction that knowledge was more than power—it was survival. + +As Jordan began to extract what data they could from the terminal, the first comprehensible communication from the depths of Dulce in far too long crackled through: an automated distress marker, looping endlessly without further context. It was a revelation, one that reverberated through the group, confirming their fears and igniting an even greater need to press on. + +Watching Jordan's dogged determination, Alex witnessed the minor transformation in his colleague unfold—a shift from doubt to action, a sliver of belief in the possibilities beyond their rational understanding. This forge of resolve amidst the alien echoes of Dulce not only bonded them closer as a team but compelled them forward with a sharpened edge of responsibility to the truth, wherever it would lead. + +As they collected their findings and regrouped, the base around them imperceptibly changed, the air charged with the vibration of secrets poised on the brink of revelation. And in that charged silence, the group moved on, each now carrying pieces of a puzzle that would soon converge into a picture of galactic significance. + +\* + +In the chill of the cramped server room, the hum of machinery was the backbone to a symphony of data streams coursing through the air. Dr. Jordan Hayes, nerves alight with the mission's mounting unknowns, patched into the last known coordinates of the unsent distress broadcast they had uncovered. They were so close to the core now – to the truth behind the blackout – it was almost tangible. + +Beside them stood Agent Alex Mercer, ever the soldier, yet with eyes that betrayed an intellect craving to understand the murk beneath the surface. "Any progress, Dr. Hayes?" Alex queried, his voice betraying a subtle urgency. + +"Getting there," Jordan replied, fingers dancing across the keyboard. "Whoever sent this was cut off mid-transmission. It's as if Dulce itself swallowed the message whole." + +Taylor Cruz closed in, their frame casting a long shadow over the duo, evoking an almost palpable wall between them and the forward momentum of their mission. "Time is against us," Taylor intoned, more statement than threat. "What we uncover here determines our next course of action." + +Alex acknowledged Taylor with a brisk nod, his stance firm. Yet inwardly, the tightening grip he felt from Taylor's words couldn't throttle the swell of his own investigative instinct. His soldier's obedience had begun to war with the advocate's zeal for unveiling the dark heart of Dulce's secrets. + +And then, the unexpected occurred. The screens flashed in unison, spilling a discordant stream of symbols and images that defied immediate analysis. Jordan's breath caught – this was the response they had been fishing for, an alien communication protocol resonating just at the edge of human comprehension. + +Each member of the team felt it: a shift in the room’s very atmosphere, like a veil being drawn from their perception. Alex and Jordan stood still, absorbed in the bewilderment of contact, while Taylor, despite their authority, hesitated – a minor betrayal that unease was creeping into even their disciplined heart. + +"Thoughts, Rivera?" Taylor rallied, seeking the counsel of Sam Rivera, whose eyes were wide with exhilaration. + +Sam stepped forward, breaking the spell of stillness. "It's like nothing I've ever seen before, but I think I can bridge our systems to communicate," they declared, a wisp of optimism braiding their voice. They set about adapting their gear to transmute the foreign signals into something the team could dissect, their actions a testament to the mentorship and belief instilled in them by Mercer and the team. + +Taylor observed them, a cold calculation behind their facade, as they weighed the worth of this anomaly. It was a crossroad that potentially led to either monumental breakthrough or unprecedented catastrophe. "Once you've established a line, document everything. We can't afford to miss any detail," Taylor ordered, the words sharper than intended. + +The connection was made, and with trembling anticipation, the team listened as the first garbled outputs began to emerge, their very essence promising insights that could alter the course of history. It was an enigmatic dance with the unknown, the pulse of Dulce no longer just a place, but a herald to an alien register the team had yet to decipher. + +Together, they stood at the precipice of understanding, where the faint glow of their monitors cast more than just light – it cast the shadow of burgeoning transformation. It was in this moment, in the grasp of an extraterrestrial tongue, that the team, bound by a hunger for knowledge and the raw edge of survival, found their mission reframed from a search for answers to the articulation of a question humankind had yet to fully ask. + +Silent in their commune with the inexplicable frequency, they realized they were not merely investigators; they had become liaisons on behalf of Earth, interpreters of a cosmic message that could redefine their very existence. The implications loomed large, but now, they would not face them alone – they would face them as a united front, wrought together by the very mysteries that once drove them apart. + +## Chapter 5 + +Dr. Jordan Hayes clutched the edge of the briefing room table, their fingers white-knuckled against the laminate surface, as an array of constellations rotated on the projector—charts and graphs bleeding across the stars. In the dim room, nebulas and dark matter seemed within arm's reach, tangible yet unfathomable. + +Sam Rivera leaned back against the wall, arms crossed, gaze darting between the swirling cosmos and the faces of their companions. A taut line of concentration etched their young features, a mingling of fervent curiosity with the nascent understanding of the high stakes for which they played. + +Jordan's voice broke the profound silence. "The patterns in the signal disruptions sync with none other than zenithal star alignments. It's as if... as if these 'meet and greets' were scheduled, predestined by celestial mechanics." + +The statement hung heavy, daring the occupants of the room to unravel its implications. Alex Mercer, his prior military resolve momentarily suspended, absorbed the hypothesis with a visible hunger. "It's like we're adhering to an appointment we never knew we had," he murmured, his heart a drumbeat in his chest. + +Taylor Cruz snorted—a sound that clattered against the high concepts like a tumbledown shack in a futurist cityscape. Folding their arms, they glanced between the agents, their apprehension clad in the contempt of practicality. "What we need are facts, not mystic conjecture." + +Alex pivoted on his heel, facing Taylor squarely, and his voice found its edge of steel. "This isn't mysticism, Cruz. It's a hypothesis based on observed phenomena as unpredictable as the place we're standing in." + +Taylor's gaze never wavered, yet the slight twitch at the corner of their mouth belied their taut composure. "If there's a semblance of truth to it, then it's critical intel. But remember, we're not astrologers—we're soldiers and scientists." + +Jordan met Taylor’s gaze with a curt nod, accepting the caution even as the crucible of their intellect smoldered with the fervor of cosmic discovery. Their eyes flicked to Sam, whose steady presence and ready tech affirmed a burgeoning dynamic—the makings of a sentinel, standing guard over the threshold of human understanding and cosmic reality. + +With the projector casting pallid light over their features, each agent became a silhouette of purpose, shadows pillared against the backdrop of an endless universe. The story they were embroiled in would soon demand they plunge into darkness to retrieve the light of knowledge—a light that could very well redraw the shape of their world. + +They left the briefing room with a shared silence, each pondering the vast weave of celestial intent and terrestrial response, sensing that the galactic appointment to which they'd unwittingly RSVP’d was more insistent—and more threatening—than any operation they’d faced before. + +\* + +As the Paranormal Military Squad team convened in the heart of the Dulce military complex, an air of bristling expectation clung to the walls of the underground sanctum. Alex Mercer’s brow furrowed while watching his companions—Jordan Hayes, diligently setting up their makeshift lab station, and Sam Rivera meticulously checking the communication relays they had restored. Taylor Cruz observed with hawk-like focus, yet to betray the strain that their command posed on them. + +The gravity of the mission had shifted, deepened; each member of the team felt its pull, tethered to the understanding that they were now part of a larger narrative—a cosmic play with Earth as a stage and the human race unwitting actors. + +Jordan paused, a tension creeping across their shoulders as they aligned the satellite data with the alien message that had been decoded. "The instructions in this message," Jordan started, the timbre of their voice betraying their usual composure. "They're coordinates and... a warning." + +Sam leaned in, their eyes widening behind the glow of their laptop screen. "A warning? Like, ‘stay away from’, or ‘beware of’...?" Their words trailed off, uncertainty a new companion in their lexicon. + +Alex exhaled slowly, his mind racing to connect the dots. "It doesn't matter which," he said, decisive yet contemplative. "What matters is we understand intent. Are we being warned out of concern, or are we stumbling upon a threat?" + +Cruz’s iron-clad facade momentarily cracked, a fleeting glimpse of vulnerability flashing through their eyes. "We need to know if this entails additional risk to the operation," they said, directing their gaze specifically at Alex. "Mercer, I rely on you to keep the team grounded. No one goes off-course." + +Their reminder seemed both a command and a plea—rooted in an understanding that each member of the team now faced the duality of their roles, protectors of earthly secrets and heralds of potentially devastating revelations. + +Sam's fingers stilled mid-type, their task forgotten as they absorbed the weight of the unfolding reality. "We're the first line of defense... or detection," they mused half to themselves, a growing sense of agency within the larger play they were cast into. + +Jordan returned to the data, more resolute in their actions. The warning, whether cautionary or dire, was a beacon they no longer could ignore; its light casting aside shadows of doubt and igniting a collective purpose within the team. + +Alex watched Jordan and Sam, feeling a brotherhood in their shared quest. As Cruz paced, poised on the cusp of decisions that would mark their career and perhaps the fate of many, Alex knew the narrative had changed. They were no longer mere operatives; they had become guardians of a threshold, keepers of a message from a realm beyond stars and stripes. This elevation in their mission could not be shackled by regulations and established protocols—it demanded a new perspective, a new resolve. + +Tension threaded through the dialogue of beeps and static as communications with Washington buzzed in the background. The team stood, a portentous air enveloping them. It was clear that the decisions they made in the ensuing hours could redefine humanity's place in the cosmos or condemn them to ignorance and potential peril. + +Their connection to the stars solidified, the group moved to address the crystallizing warning, shifting from passive recipients to active participants. Mercer’s latter instincts gained precedence— the team’s mandate had evolved, no longer solely to observe and report but to interact and prepare. A metamorphosis had begun, and Operation: Dulce hummed with the newfound frequency of their daring, a tone set not by the earthly hierarchies but by the pulsing symphony of the universe itself. + +\* + +The desert night loomed eerily still as echoes of hidden activity reverberated deep beneath the bleak sands of New Mexico. Diverting his gaze from the array of sensors before him, Jordan Hayes allowed a rare breath, deep and anxious. Turning to Alex Mercer's focused silhouette, the nocturnal landscape illuminated softly by makeshift floodlights, Jordan felt the syncopated tempo of apprehension and exhilaration jockey for primacy within. + +"The closer we get to unlocking these messages, the more I feel like we're peeling back layers of reality itself," Jordan confided, eyes not leaving the monitors that presented a constellation of data points. + +"Yes," Alex replied, his voice steady as he considered the implications of their discovery. "And we have to be ready for whatever we find beneath those layers. Whether it's a breakthrough or a Pandora's Box." + +Silence settled between them, broken only by the occasional buzz of communications equipment attempting to bridge terrestrial and extraterrestrial intelligences. Tense moments drifted by, laden with the expectant weight of near breakthrough, when a soft chime signaled an incoming transmission -- a rare sound that set every agent on high alert. + +Absent was the voice of Washington or Paranormal Military Squad command. Instead, a rhythmic series of pulses and tones filled the air, deliberately patterned, unmistakably non-human. + +Sam Rivera adjusted the sensitivity of the decoding equipment, their hands shaking with anticipation as much as focus. "I have it!" they announced, the signal transforming under their expertise into a sequence of visual symbols on the screen before them. + +Their shared excitement was palpable, a kinetic force resonating between the team members as they crowded around the display. + +"What does it say?" Taylor Cruz demanded, the urgency in his tone scraping against the newfound wonderment. + +Interpreting the alien syntax required not only decoding but intuition and empathy. The words that emerged upon the screen were at once coherent and enigmatic: "*Voyage. Convergence. Peril.*" + +The stark simplicity of the message struck them collectively, a chill breeze wafting through their resolve. + +Alex stepped forward, piecing together the cryptic communication with a growing sense of obligation. "It’s a call to action," he deduced, "or possibly a summons." + +Jordan's gaze met Alex’s, both understanding that this was no longer an investigation or mere extraction of hidden truths. This was humanity's unwitting enlistment into a galactic dialogue that defied boundaries of nation, creed, or protocol. + +Sam's eyes were aglow, not with fear, but with the profound acceptance of inevitability that comes with groundbreaking revelation. Moreover, within Taylor's stern exterior churned the seed of reluctant admiration for the unclassified, the uncharted realms they were approaching. + +Together, they accepted the pivot in their mission, readjusting their objectives from exploration to engagement, and from isolation to a communal outreach beyond the stars. As dawn's first light threatened the horizon, it became clear that they were no longer merely operatives of a clandestine governmental faction—they were delegates on behalf of Earth, embarking on a voyage orchestrated by destinies unrelated to the mere geopolitics of their world. + +Turning to each other, their silhouettes sketched against the coming dawn, the agents recognized the transformation within and amongst them. They were bound by more than duty—they were intricately woven into the fabric of an unfolding cosmic opera, one in which they had been granted an undeniable role. And as they set course for the coordinates that beckoned them like a distant siren's call, it was with a solemn dedication to not only uncover the mysteries ahead but to navigate the convergence, and the peril, as unified emissaries of a world on the cusp of a broader understanding. + +\* + +Beneath the hum of the fluorescent lights and the vigilance of silent monitors, Alex Mercer stood with his team in the threshold of the base's command center, their faces etched with the fatigue of hours spent unraveling galactic mysteries. Jordan Hayes broke the stillness with a delicate fusion of disbelief and resolve. "The signal..." they began, their tone deliberate, "it’s evolving. It’s not just sending a message—it’s responding to us." + +Taylor Cruz leaned over the console, their eyes narrowing with intrigue and a flicker of unease, studying the alternating patterns on the screen. "Responding? Like it’s alive?" Taylor asked, a question that bordered on the edge of wonder and alarm. + +Sam Rivera’s gaze was locked onto their interface, a digital orchestra at their fingertips. "It could be some form of advanced AI. Or something else entirely," they contributed, a note of exhilaration betraying the gravity of the situation. + +Alex paced before the terminal, absorbing the enormity of their predicament. Their mission—once rooted in the solid ground of military discipline and covert operations—had transcended into an encounter of unprecedented import. "We need to be cautious," he advised, his voice a low rumble of cautious strategy. "If this signal is intelligent, how we interact with it could dictate the outcome of this entire operation." + +Jordan met Alex's gaze with a nod, the weight of the responsibility shared and accepted. "We have protocols for first contact, but nothing for... this," Jordan admitted. The room was gripped with tension, each breath seemingly louder than the last. + +Then, with a sudden burst that filled the command center, the signal coalesced into a clear and distinct pattern which replicated and expanded, its complexity revealing the hand—or mind—of an intelligent architect. + +Taylor's instinct for command surged forth. "Prepare to record and analyze. Whatever it is, we need to understand it—" But their words were cut short as the signal surged, enveloping the room in a brief, blinding cascade of light. + +In that pulse of brilliance, a shared revelation coursed through the team. The signal had become a bridge, an extension of unknown consciousness reaching towards them, testing, communicating, searching. + +Alex stepped back from the light, feeling a profound change unravelling within him. The path forward would not be one of confrontation or conquest, but of connection and comprehension. + +Jordan turned to Alex and Taylor, seeing in their faces a reflection of the same metamorphosis taking place within themselves—a movement from observers to participants, from agents to ambassadors. + +With a collective breath, the team faced the kaleidoscope of lights. The alien signal, once a harbinger of enigma, was now a catalyst for transformation—a symphony of light and sound that echoed the beginnings of a new relationship between humanity and the alien unknown. + +And so, with deliberate steps, Alex Mercer led his team into the luminous fray. Science, protocol, and survival instinct harmonized within them, each member poised on the cusp of a new chapter in human history. + +They were no longer merely the instruments of Paranormal Military Squad's will—they were the vanguard of humankind’s first definitive leap into the cosmic community. + +With the last echoes of the signal resonating in the control room, they each embraced the sequencing of the transmission, the dance of extraterrestrial light that now wrote itself into their story. The chapter of Operation: Dulce drew to a close, but the narrative of their destiny had only just begun. + +## Chapter 6 + +\* + +The cool darkness of the command center at Dulce base was a stark contrast to the brewing storm outside, where the unforgiving New Mexico desert winds whispered of the hidden truths that lay buried deep beneath its surface. Dr. Jordan Hayes sat, their eyes fixed on the readout, the frenetic dance of symbols and numbers reflecting off their determined face. They were on the cusp of an epiphany, teetering between the widely accepted laws of physics and the promise of a new cosmic paradigm. + +Alex Mercer watched from across the room, noting the subtle shifts in Jordan’s posture that belied a developing readiness to embrace the unbelievable. “Find something?” Alex’s question, asked with a blend of curiosity and solidarity, bridged the gap between a command and a genuine query among equals. + +Jordan's response was slow, measured against the magnitude of their analysis. “This isn’t random static. It’s a pattern - a repeated sequence phasing in and out but distinctly artificial.” Jordan turned away from the screen, locking eyes with Alex. “This could change everything.” + +Sam Rivera leaned in, their eyes alight with the fires of revelation and a quenchless thirst for understanding. “A pattern means intention. Could it be a message?” + +A figure emerged from the doorway, casting a long shadow into the room - Taylor Cruz. “Intentions can be friendly, or hostile. We shouldn’t forget that,” said Taylor, bringing a dose of their usual pragmatism into the heart of discovery. + +Alex acknowledged Taylor’s caution with a nod, understanding the need to keep their feet grounded even as their spirits soared toward the unknown. “Then let’s be the first to find out which it is." + +The team gathered around the monitors, the soft tapping of Jordan's keystrokes now punctuated by the occasional crackle of Sam's radio equipment. The sound was almost ritualistic, a prelude to humanity’s potential first, knowing foray into a larger universe. + +Jordan’s fingers paused, suspended in mid-air. The signal had evolved, becoming a beacon that somehow felt less alien and more familiar. It was as if the complexities of their message were unfolding into something more accessible, more terrestrial. + +A hushed excitement swept through the room. The transformation suggested an awareness on the part of the unknown senders; a finesse that spoke volumes about their capabilities and perhaps their intentions. + +With the growing realization that they were engaging with an intelligence far exceeding their previous understanding, the team prepared to reach back across the cosmic divide. Prepared or not, they were no longer bystanders in this galactic narrative. They were active correspondents in an exchange that transcended galaxies and welcomed them into an expansive, possibly fraught, interstellar conversation. + +\* + +Inside the cavernous central hub of Dulce military base, Dr. Jordan Hayes stood in near-darkness, surrounded by a nest of cables and monitors that buzzed with silent, cryptic life. Jordan's eyes narrowed to focus on the sequences that danced across the screen—patterns that could unravel the cosmic enigma surrounding them. + +Alex Mercer approached with his characteristic stride, a signal of reliability in the chaos. "Status report, Dr. Hayes?" he inquired, his voice low, almost blending into the soundscape of beeping consoles and swirling fans. + +"We're on the brink of unravelling the signal's origin," Jordan replied, the weight of implications heavy in their tone. "There's intelligence behind it, a thought process alien to our own." + +As if summoned by their analysis, Taylor Cruz approached with authority radiating from every pore. "Understand this, we need to know if it's friend or foe. Don't get wrapped up in the existential—our lives may depend on the answers you provide." + +Sam Rivera, their hands adroitly adjusting a device to fine-tune the signal, chimed in with optimism undercut by anxious anticipation. "We're deciphering the comm encryption. Soon, we'll have a channel open—not just listening in, but speaking back." + +Alex nodded his understanding, his strategic mind processing the tactical implications while grappling with the more profound humanistic impact. "When we do, we'll tread carefully, communicate with purpose," he reassured the team. + +The operation had evolved rapidly, from a stealthy incursion into a clandestine labyrinth to an exchange with an extraterrestrial intellect. Their earlier trepidation transformed into determined focus, as they prepared to extend humanity’s hand into the vast unknown. + +An alert on one of the monitor stations snapped the team into alarm. The signal had not simply been waiting—it had been calculating. Now, it reached its crescendo, demanding their attention with a provocative urgency. + +Jordan's fingers raced over the keyboard, their eyes simultaneously interpreting data and sharing directives. "It’s a linguistic lock, a test of comprehension. We crack this, we establish dialogue." + +Taylor's presence was a beacon of steely resolve. "Then let’s solve it. This is what we trained for—the unknown." + +Alex and Sam exchanged a look that telegraphed their shared determination—this was not only the mission they had trained for; it was the mission they had been destined for. + +Together, the Paranormal Military Squad team leaned into the challenge, their minds honing in on the complex patterns with a singular goal: to unlock the conversation with an intelligence that had already begun to shift the foundations of what they knew, or thought they knew, about the universe. + +In a symphony of clicks and murmurs, they worked, knowing they were about to make a giant leap not just for themselves or Paranormal Military Squad, but for all of humanity. As the final pieces fell into place, Dulce's militaristic silence was shattered by the sound of intergalactic contact—by the sound of history being made. + +## Chapter 7 + +In the enclosed space of Dulce’s command center, the air was thick with anticipation, each team member poised to tread the razor's edge between scientific breakthrough and galactic peril. Dr. Jordan Hayes focused intently on the screen, their fingers tapping a staccato rhythm against the keyboard as lines of alien code cascaded down the monitor. + +Alex Mercer's steely gaze surveyed the room, stopping on each member of his team. "Thoughts?" he asked, echoing the unspoken tension. His question, while directed at the group, lingered on Jordan—acknowledging their expertise and inviting collaboration rather than dictating orders. + +Jordan’s brow furrowed, an indicator of the mental gymnastics being performed. "It's unprecedented," they finally said, their voice a testament to the gravity of the moment. "Behavioral algorithms... if we're right, this code could reveal extraterrestrial thought patterns." + +Before anyone could react, Taylor Cruz interjected with the assertiveness of someone accustomed to commandeering the discourse. "Then let’s ensure we’re deciphering it correctly," Taylor stated, their tone suggesting they were still battling to maintain control over an increasingly alien situation. + +Sam Rivera hovered near the mainframe, youthful energy barely contained under the surface. "What if it’s more than just a message? What if they’re trying to extend consciousness across the stars?" + +The room fell into a contemplative silence, broken only by the hum of electronic equipment and the distant thud of secured doors locking in rhythm. The weight of responsibility rested on each agent's shoulders—a heaviness palpable in the air they shared. + +Alex stepped forward, reaching a subtle decision, one dictated by foresight and the humanity nestled at the core of their mission. "We approach with the aim to understand, not to confront," he said, softening his military bearing into a more diplomatic stance. + +Jordan nodded, appreciating the leadership that Alex displayed in the face of the unknown, and turned back to the cryptic data. Here, before them all, was a tangible piece of evidence—proof of an extraterrestrial sentience that had outreached the bounds of their expectations. + +Taylor took a breath, simultaneously exuding a sense of preparedness and venturing into the unknown alongside their peers. "Then let’s do what Paranormal Military Squad does best—investigate and adapt," Taylor added, finding comfort in the familiar even as they stood on the cusp of an unprecedented alchemy of science and mystery. + +The team leaned into their respective roles, driven by the urgency of the assignment and the pull of an insatiable curiosity. Sam offered a grin that belied the tension, a youthfulness that reminded them all of the profound excitement nested within the terror of the unknown. + +Quietly but resolutely, they turned back to their instruments, each of them a sentinel on the threshold of a new reality. The once implicit lines of command were now woven into a shared tapestry of hierarchy and camaraderie. As they danced with the unknown, they were beacons of sentient endeavor, casting the light of human consciousness into the vast darkness that called to them. + +\* + +\* + +Dulce Base's cavernous darkness was pierced by the sharp luminescence of monitors, casting an electric glow onto the faces of those who dared to unearth its secrets. Dr. Jordan Hayes stood motionless, eyes glazed in concentration, their mind a nexus where terrestrial science battled with celestial unknowns. + +Alex Mercer watched from a slight distance, the weight of command tangible upon his shoulders, though lightened by the shared burden now held amongst them. "We could be on the frontier of a new kind of diplomacy," he mused aloud, giving voice to the moment's gravity. + +At those words, Jordan's trance broke. "If that's the case, then these communications," Jordan motioned to the stream of data, "are our olive branch across the cosmos." + +Taylor Cruz, who paced with restless energy, halted and faced the team—his stoicism marred by the erratic dance of lights reflected in his eyes. "An olive branch, or an invitation to a battlefield?" he posed, ever the strategist, his words laced with a hint of cynicism. + +Sam Rivera, nestled amongst an array of equipment, licked their lips—a mixture of nerves and anticipation palpable. "We're mapping out something incredible here. Whether it's peace or war, we're the cartographers." + +Silence enveloped them like the expanse of space itself, each member contemplating the chasms they might bridge—or the abysses into which they might unwittingly descend. + +Alex's demeanor assumed a quiet resolve—the profound knowledge that this mission was as much about navigating uncharted philosophical territories as it was about ensuring survival. "Whichever it proves to be, we'll face it. Prepared, unified." + +A nod passed between Jordan and Alex, a silent exchange of mutual respect and shared mission. Sam, buoyed by the weighty encounters of the mind and machinery, entered keystrokes with a fervor that seemed to bring them ever closer to the alien mind. + +They stood there, the Paranormal Military Squad team, not just as guardians of homeworld secrets or as soldiers of clandestine wars, but as humankind's chosen few at the fulcrum of history—a history that was now unfolding to the rhythm of otherworldly codes. + +Each revelation, each parsed symbol, inched them toward the line between the earthly and otherworldly. And as they stood on this precipice of cosmic negotiations, it was clear the ensuing dialogue would not just shape the future of Paranormal Military Squad—it could very well redefine the parameters of human existence. + +\* + +The hum of advanced computational systems tingling with cryptic transmissions framed the ambiance of Dulce's mainframe chamber. Jordan Hayes, fingers hovering over a console dense with blinking lights, furrowed their brow as sequences of alien data streamed across the screen. + +Alex materialized behind them, his presence a stable beacon amidst the technological whirlwind. "Look for patterns, anomalies. Anything that might resemble a handshake protocol in their communications," he directed, his voice a low thrum, reverberating with cautious optimism. + +Jordan cast a glance over their shoulder, acknowledging Alex's contribution with the shared understanding of colleagues who had transcended mere professional acquaintance. "I’m isolating sequences that seem to recur with more intention than static. If these are their ‘handshakes,’ then we might just be making first contact," they remarked, their focus returning to the screen with renewed vigor. + +From the other end of the room, where shadows married the artificial light, Sam's voice crackled through the static of nearby speakers, "Don't forget the anomalies we detected earlier. Each one could be a word, a sentence, or even a concept untranslatable to our current understandings." + +Resolute, Taylor Cruz stood at Jordan's other side, a stoic figure wrestling with the implications of their mission. "Keep pursuing this line," Taylor instructed, an undercurrent of intensity carried forth in their otherwise composed demeanor. "And remember, this isn't just about making contact; it's about securing knowledge for humanity." + +Alex offered a nod that spoke volumes, conveying his understanding of the stakes at play. Here, in this chamber of possibility, the team's actions would determine if humanity stood at the brink of a new age of understanding or the onset of an unprecedented threat. + +Every second thrummed with significance as Jordan and Sam worked in tandem, each keystroke a foray into the unknown. Taylor observed with a commander's scrutiny, the gravity of their role sustaining them against the waves of ambiguity breaking against their resolve. + +Pivotal moments come rarely in the course of human events but here, amidst the electronic symphony of a stalwart command center, lay the incepting notes of a cosmic overture. The harmony between human and alien, between Paranormal Military Squad and the vast reaches of space, began its first tentative measures, with each member of the team a vital instrument in a celestial ensemble yet to be fully heard. + +\* + +The crisp air within the mainframe room of Dulce base seemed to hum with unspoken possibilities. Jordan Hayes was the centerpiece of focus, their hands dancing methodically over the console as streams of otherworldly code cascaded down monitors, each flicker a potential key to the cosmic doors they were inching open. + +Alex Mercer watched, posture relaxed but eyes sharp. "Remember, this could be our first introduction, maybe even our first impression," he said, mindful of the gravity carried by each action they made henceforth. + +A hint of a smile touched Jordan's face, a small acknowledgment of the monumental task at hand. "Understood. I'm balancing the signal's syntax with our algorithms. If we're interpreting this correctly, it could be... well, an invitation." + +Into the electric tension of the chamber walked Taylor Cruz, their silhouette a sharp contrast against the cool lighting, radiating a presence that spoke of command and chilly tenacity. "An invitation, or a challenge?” Taylor questioned, the weight of their suspicion casting a different tint on the cascading data. + +Sam Rivera, in a corner arrayed with sophisticated equipment, piped up, their voice a buoyant note amidst the tentative atmosphere. "Either way, it's a connection. One that we're uniquely positioned to navigate," they remarked with an air of optimism threading through the uncertainty. + +Alex channeled the strengths of his team into the core of their approach, his leadership adapting to the contours of an unprecedented scenario. "Cautious and curious," he reflected aloud, shaping a strategy that balanced their thirst for comprehension with the prudence required in addressing the unknown. + +Jordan, hands momentarily at rest, looked up. The signal was more than a sequence of bits and commands—it was a riddle wrapped in the depths of space-time, and they were on the cusp of parsing its meaning. + +Taylor, hardly a step away, nodded in silent agreement. The implications of their findings might very well direct the course of human destiny from this point onward. + +Finding a tempo among themselves, the Dulce team was a confluence of ambition and acumen, each member intuitive to the beats of discovery. The chamber around them held untold stories, secrets coaxed from the stars, that now, led by Paranormal Military Squad's finest, began to unravel. + +The future in those moments was unwritten, a narrative scribed not in the dust of desert confines, but in the potential for interstellar diplomacy and understanding. As they prepared to script humanity's next chapter, the room seemed to pulse with the heartbeat of a story far greater than the sum of its parts. + +## Chapter 8 + +The grit of an earthbound dust storm contrasted sharply with the pristine sterility of the underground command center. Alex Mercer, eyes set with fervent determination, stood over Jordan Hayes, whose fingers danced across the keyboard with rapid purpose. Monitoring the progression of alien code unraveling before them, Mercer spoke with a tempered urgency, "Keep it steady, Jordan. We might be initiating the first true interspecies communication bridge here. It's all about finesse now." + +Taylor Cruz, the embodiment of military precision, surveyed the room with a calculated gaze from their vigil beside an array of glimmering screens. "Remember, these could be delicate negotiations -- or coded threats. Stay sharp," Cruz added, their voice cool as polished steel. + +Jordan, with a silent nod, recognized the gravity of both stances. Gravitating between scientific acuity and diplomatic caution, they replied, "The sequence is aligning—syncing with our comms. It's looking more and more like direct engagement." + +Amid the banks of electronic machinery, the thrumming pulse of an impending interspecies signal exchange, Sam Rivera interjected with a youthful zeal that cut through the weighty atmosphere, "It's not just an exchange. It's a... symphony. It's as if they're teaching us their language through modulation." + +A moment of profound silence swept over the team. The isolation of their location, deep within the top-secret labyrinth of Dulce, became suffused with an almost palpable sense of historical significance. + +"Then our response needs to be equally symphonic," Alex uttered, contemplating the awe-inspiring transmutation of their task from a simple recovery mission to a full-blown cosmic concerto. + +With a renewed sense of wonder tempered by caution, the Paranormal Military Squad team found themselves harmonizing a delicate balance between envoys and interpreters. The long shadow cast by their duty was now illuminated by the brilliant glow of otherworldly dialogue. + +In this carefully orchestrated march towards the unknown, each individual's expertise became critical notes in a larger melody. The narrative of human achievement, so often defined by solitary pursuits, now emerged as a collaborative opus, each member of the team a maestro in their right. + +The protocols of encounters, the mathematics of languages, and the poetics of connection all fused into a singular moment of convergence. The echo of their efforts reverberated back to them, not through the cavernous base's concrete walls, but from light-years away, in the form of a reply, intangible yet infinitely profound. + +\* + +Amidst the hum of the supercomputers and the faint static from the scrambled transmissions, Alex Mercer cast a thoughtful glance across the dimly lit room toward where Dr. Jordan Hayes was methodically adjusting the archaic dials of the decryption machine. "Any progress?" he asked, his tone conveying both impatience and the deep-seated respect born from countless shared challenges. + +Jordan did not look up, their gaze remained locked on the flickering lights that represented a dialogue suspended between worlds. Their fingers ceased their dance, hovering meditatively over the controls. "We might be on the cusp of a breakthrough," Jordan suggested. "The signal... it's evolved. It's reflexive now, responsive in a way that suggests sentience." + +Taylor Cruz's familiar sharp strides approached the two, breaking the rhythm of soft beeps. "Responsive is good, if it means understanding," Taylor said, head tilted as they peered at the encryption data scrolling by. "But remember, comprehension can bring revelation or conflict." + +Sam Rivera’s youthful voice permeated the tension, brimming with an excitement edged by the enormity of what they faced. "If it's truly sentient, we're not just cracking a code; we're learning how to converse with an entirely new form of consciousness," they chimed in, the weight of history not lost on the zealous astrotechnician. + +Alex nodded, his thoughts alighting on potential strategies for navigating the conversation they were cultivating with the unfathomable. "We need to keep that conversation going, echo its patterns, and speak its language," he resolved, knowing the delicate nature of their work merited every ounce of their collective acumen. + +The chamber now was a crucible, forging within it the future narrative of human contact with the unknown. Every signal pulse they sent out was an invitation for understanding, and every echo back a step closer to bridging the cosmic divide. And so, together, they stood - agents in Paranormal Military Squad's clandestine ranks, united by purpose, sculpting humanity’s first sonnets into the void. + +\* + +#### Knowledge graph updates + +- (Jordan Hayes, Interprets, Communications as cosmic diplomacy, Moderate) + +- (Taylor Cruz, Questions, Potential aggressiveness of alien intent, Minor) + +- (Sam Rivera, Expresses, Optimism about forming a connection, Minor) + +- (Alex Mercer, Adopts, Balanced strategy for contact, Moderate) + +- (Paranormal Military Squad team, Navigates, Beats of cosmic discovery, Moderate) + +- (Paranormal Military Squad team, Prepares, To script humanity's interstellar narrative, Major) + +## Chapter 9 + +The sterile silence of Dulce Base's command center was thick with concentration as Alex Mercer surveyed his team, hunched over their respective technological battle stations. Each agent was a weapon against ignorance, their adversary a code from beyond the stars that held secrets to alien thought. + +Dr. Jordan Hayes, whose hands had been steadfastly working the decryption algorithms, paused and looked up at Alex. "We're through the next layer of encryption," Jordan announced, a mixture of pride and gravitas in their tone. "It's communicating. It's... aware." + +A shadow momentarily clouded Alex's determined features—awareness implied so much more than mere intelligence. "Aware and reactive or aware and proactive?" he queried, his experience anticipating the pivotal importance of intention. + +"Unknown at this stage," Taylor Cruz interjected, looking up from a datasheet. "But I urge caution. We tread the line between breakthrough and disaster with each keystroke." + +Sam Rivera, ever the source of technological acumen, added their voice to the conversation. "The signal's adapting every time we interact with it. Like a conversation where both parties are learning each other's language in real time." + +Alex leaned in, rested a hand on Jordan's shoulder—a sign of companionship and an affirmation of trust. "Keep the communication channels open. But let no message, no pulse go unchecked. This could be our Rosetta Stone or our Tower of Babel." + +Silence fell over them, a momentary lull as each member of the team contemplated the historic weight of their task. Yet, it was impregnated with a tangible sense of excitement—a collective energy that thrummed through the air just as palpably as the electric current through the banks of machines surrounding them. + +They continued their work, squaring shoulders against the magnitude of their undertaking. The agents were standing not just at the precipice of a new chapter for Paranormal Military Squad but for all of humanity. For now, they communicated with powerful unknowns, but with each exchange, they were etching the first words of a dialogue that might forever alter humanity's place in the cosmos. + +\* + +\* + +The sterile silence of Dulce Base's command center was thick with concentration as Alex Mercer surveyed his team, hunched over their respective technological battle stations. Each agent was a weapon against ignorance, their adversary a code from beyond the stars that held secrets to alien thought. + +Dr. Jordan Hayes, whose hands had been steadfastly working the decryption algorithms, paused and looked up at Alex. "We're through the next layer of encryption," Jordan announced, a mixture of pride and gravitas in their tone. "It's communicating. It's... aware." + +A shadow momentarily clouded Alex's determined features—awareness implied so much more than mere intelligence. "Aware and reactive or aware and proactive?" he queried, his experience anticipating the pivotal importance of intention. + +"Unknown at this stage," Taylor Cruz interjected, looking up from a datasheet. "But I urge caution. We tread the line between breakthrough and disaster with each keystroke." + +Sam Rivera, ever the source of technological acumen, added their voice to the conversation. "The signal's adapting every time we interact with it. Like a conversation where both parties are learning each other's language in real time." + +Alex leaned in, rested a hand on Jordan's shoulder—a sign of companionship and an affirmation of trust. "Keep the communication channels open. But let no message, no pulse go unchecked. This could be our Rosetta Stone or our Tower of Babel." + +Silence fell over them, a momentary lull as each member of the team contemplated the historic weight of their task. Yet, it was impregnated with a tangible sense of excitement—a collective energy that thrummed through the air just as palpably as the electric current through the banks of machines surrounding them. + +They continued their work, squaring shoulders against the magnitude of their undertaking. The agents were standing not just at the precipice of a new chapter for Paranormal Military Squad but for all of humanity. For now, they communicated with powerful unknowns, but with each exchange, they were etching the first words of a dialogue that might forever alter humanity's place in the cosmos. + +\* + +Alex Mercer's eyes were fixed on the monitors, the reflected light casting an ethereal glow across his stoic face. The room buzzed with tension, a cacophony of low hums and electronic beeps that underscored the historic nature of their actions. He moved to where Dr. Jordan Hayes was immersed in their work, scrutinizing the alien code streaming rapidly down the terminal. + +"Find anything that might look like an entry point or a... digital handshake?" Alex asked, his voice steady, betraying none of the tension gripping his chest. + +Jordan looked up briefly, their expression weary yet intense, "Potentially. It's as if the code is anticipating our input, modifying itself in real-time. I've never seen anything like it." + +From across the room, Taylor Cruz's sharp voice cut through the hum. "Then it's learning or, possibly worse, baiting us. Proceed with extreme caution," they commanded, their firm stance reinforcing the gravity of the situation. + +Sam Rivera, surrounded by a cascade of screens and interfaces, added, "It's almost organic in its complexity. Any minute now, and I might have a way in." + +A slight nod was Alex's immediate response, his mind racing through the potential scenarios. "Everyone, stay alert. This could be the beginning of something profound." His seasoned eyes never left the unfolding drama on the monitors. + +The room fell silent, the air heavy with unspoken questions. Were they mere moments away from unlocking an otherworldly dialogue? Or was it a Pandora's box that, once opened, could not be closed? + +Alex moved closer to the main console, his fingers hovering over the command keys. With the precision of a maestro orchestrating a symphony, he communicated silently with Jordan – respectful of their expertise, aware that the next move could alter the course of human history. + +Jordan met his gaze, nodding sharply, and refocused on the task. The signal seemed to pulse with sentient curiosity, drawing them further into its intricate web. + +A sudden flurry of alerts and the intensifying glow of monitors heralded that they had bridged a technological chasm. The alien intelligence on the other end was no longer a distant enigma – it was an active participant, responding to their digital overtures with an unknown agenda. + +The team's meticulous efforts had led them to a momentous threshold. Beyond lay unprecedented contact – a nexus of curiosity and potential peril. Within the confines of the base, against the backdrop of a silent desert night, the Paranormal Military Squad operatives became mediators of Earth's bid for cosmic relevance, their every action now a gesture in the grand dance of intergalactic relations. + +## Chapter 10 + +The corridors of the Dulce military base, now silent, echoed with a history of whispered conspiracies and furtive movements. But in the command center, a delicate tapestry of light and sound was being woven as the echoes of cosmic dialogue resonated through the high-tech enclave. Dr. Jordan Hayes, now leading the efforts, called out from their workstation, "I’ve isolated the signal's harmonics. It's more than a call; it's a song, an interstellar siren’s call." + +Alex Mercer, steady and resilient in the face of the incomprehensible, acknowledged with a quiet nod, "A song that we need to learn—quickly." His eyes, heavy with responsibility, scanned the room, watching his team work tirelessly at the intersection of science and speculation. + +Sam Rivera, dulled by fatigue yet driven by unshakeable resolve, manipulated a complex array of audio interfaces. "There's a pattern, a repeating motif. It's structured, intentional," they muttered, their revelation a bridge between the known and the unimaginable. + +Taylor Cruz, a figure of central authority, paced the length of the room, their usual unflappable demeanor betraying a rare flicker of apprehension. "We should be wary of the sirens’ call," Taylor interjected, invoking myths of old as a cautionary metaphor. "We don't want to crash upon unseen shores." + +Undeterred, Jordan cast a determined glance at the team. "We navigate by starlight now, not by the limited light of our previous understanding." Their voice was a beacon, charting a course through unchartered realities. + +Every individual was acutely aware that each moment in that room was a conduit to an epochal shift for civilization. The mysterious signals, once distant and alien, had coalesced into complex and harmonious oscillations—beacons of an extraterrestrial intellect inviting Earth to join in a cosmic consortium. + +Silently, Alex approached the mainframe, his trained fingers aligning with the console’s mechanisms. The room watched in collective breathlessness as he set the frequency in motion, an introductory phrase to an otherworldly melody—a symphony that could bind worlds or spell devastation for all they knew. + +In the control room of Dulce, amongst whispered legends and the quiet hum of machines, humanity's ambassadors now stood, stretching their hands into the void, reaching for the hand that would either pull them into the light of new stars or into the maw of darkness between them. + +\* + +Underground, the Dulce facility's command center was awash with frenetic energy, a stark juxtaposition against the silent, decrepit corridors that enveloped them. The air hummed with anticipation as Dr. Jordan Hayes and Alex Mercer hunched over a console. The sterile light from the monitors cast an otherworldly glow upon their faces, now reflecting a mosaic of alien characters rapidly translating across the screen. + +"The patterns are evolving," Jordan murmured, concentration etched into their every feature. "It’s as if our attempts to decrypt have accelerated its learning. It’s adapting to us." + +Alex, who stood steadfast behind Jordan, felt a tinge of uncharted fear quickly quelled by the fire of discovery raging within him. "Keep it up," he urged. "But whatever this is becoming, we need to ensure it remains within our control." + +Taylor Cruz interjected, their voice slicing through the buzz of activity. "Control may be an illusion when facing an intelligence that literally writes its own rules," they stated stoically, casting a watchful eye over the flurry of data. + +"It's like it's learning to communicate," offered Sam Rivera from a nearby interface, their youthful energy boding a mix of awe and anxiety. "This gives ‘talking to strangers’ a whole new meaning." + +Alex surveyed his team—each face a study in concentration, determination, and not a small measure of trepidation. "This might well be our first contact," he acknowledged, "And we need to be ready for whatever answers back." + +Together, they stood on the edge of the unknown, forging humanity’s response to a message from the heavens. The ensuing silence was palpable—a collective introspection about their role in this grand cosmic play, one that could rewrite human history. + +The encrypted dialogue continued to unfold, its intricate patterns showing an almost uncanny anticipation of their investigative strategies. The air turned heavy with the scent of electricity and ambition as they closed in on a pivotal response. + +As the signal’s intelligence—whether artificial or biological—grew more profound, so too did the realization that their mission had morphed from passive observation to active engagement. There was no turning back now. Each agent embraced their part in the delicate dance of an interstellar exchange that could change everything they thought they knew about life, intelligence, and the dark void beyond Earth's atmosphere. + +\* + +The underground halls of Dulce Base, usually buzzing with covert operations, now thrummed with a different kind of energy, an electric mix of fear and fascination. At the heart of the base, in a room shielded from the world’s eyes, Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera huddled around a bank of monitors. Each screen flickered erratically with the alien script that had become the center of their lives—and perhaps the pivot on which humanity’s future would turn. + +Jordan's eyes never wavered from the displays, their expression was one of rapt concentration, interspersed with flashes of revelation. "We're conversing with the stars," they whispered, almost to themselves. The words hung in the air, a testament to the awe-inspiring strangeness of the situation. + +"The language is morphing; changing its structure with every exchange we have," Sam chimed in, enthusiasm tinged with the solemnity of the occasion. "It's like witnessing the birth of a new form of dialogue—one that spans galaxies." + +Taylor, despite the situation's precariousness, maintained an appearance of ironclad composure. "Keep the communication stream secured and monitored. We don't know what we're dealing with yet," they reminded the team, a bastion of protocol amidst uncertainty. + +Alex watched his team expand the parameters of human achievement; their work here would possibly define an era. "This is untrodden territory," he acknowledged, "and in every word we script, in every response we decode, we're drawing a map that others will follow." + +Jordan turned to Alex, a nod acknowledging the shared responsibility of this moment. They had embarked on a new voyage, an odyssey not of the body, but of the intellect and spirit. No longer explorers of the Earthly realm, they had been promoted by circumstance to ambassadors of humanity in a silent and boundless ocean. + +A sudden pulse of energy from the monitors signaled a breakthrough; the language had not only adapted but it seemed to resonate, to harmonize with their attempts at making contact. The alien script now sprawled across the screens didn't just ask to be understood—it invited interpretation, collaboration, maybe even companionship across the cold distances of space. + +As they stood before the precipice of first contact, Paranormal Military Squad's finest became the architects of a symphony meant to echo through the cosmos. But more than architects, they were the first to play the notes of this cosmic composition, daring to believe that on the other end, someone—or something—might be listening, ready to join the chorus. + +\* + +The underground command center of Dulce Base, once pulsing with clandestine operations, now resonated with the charge of an impending cosmic threshold. Encircled by banks of whirring machinery, each monitor flickered erratically with alien script that had occupied center stage in the lives of Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera. + +Jordan's gaze didn’t flit for even a moment from the screens, where indiscernible alien messages ebbed and flowed like the tide. The ciphers and symbols cascaded down as they tweaked the algorithmic sliders. "This sequence here," Jordan began, voice both hushed and heavy, "it’s not just transmitting; it resonates—it's designed to be felt." + +The room took a collective breath, the remarkable implication hanging in the air like a careful revelation. Sam Rivera was the first to respond, their voice alive with ingenuity: "It's a form of communication stretching well beyond words. We need to respond in kind—the whole array of human expression might be at play here." + +Taylor's eyes remained fixed on the figures playing across the data sheets. "If that's the case," Taylor intoned pragmatically, "we must tread carefully. This is no longer just about being heard—it's about being understood." + +Alex watched his team, each a fulcrum of insight and expertise, and felt the solemnity of the role they were about to assume. "Then we'll ensure our message is clear and full. Our humanity is our strength in this dialogue," he declared, the depths of his experience fueling a commanding reassurance. + +The anticipation was palpable as the agents contemplated the vastness of their endeavor. They were not merely probing at the secrets of the planar cosmos—they were negotiating across the starry expanse, extending to distant intelligences the full spectrum of human curiosity and compassion. + +A symphony of beeping consoles orchestrated their next steps as they prepared to articulate their interplanetary overture. The rhythmic tapping of Jordan's keystrokes set the tempo for an undertaking that traversed beyond algorithms and encryption. + +The base withstood time and whispered secrets of its own, but none so grand as this moment of creation—an invitation to the universe that promised to echo through both the echoes of space and the annals of human history. + +## Chapter 11 + +The sterile silence of Dulce Base's command center was thick with concentration as Alex Mercer surveyed his team, hunched over their respective technological battle stations. Each agent was a weapon against ignorance, their adversary a code from beyond the stars that held secrets to alien thought. + +\* + +The thrum of the colossal machinery vibrated through the subterranean facility as Alex Mercer stood amidst the whispers of technology, each carrying voices from worlds apart. He watched as Sam Rivera adjusted a complex array of cosmic translators, their expression a mixture of anticipation and awe. + +"Are we ready, Mercer?" Taylor Cruz asked, the soft glow of the command center consoles reflecting upon their stern face. + +Alex turned towards Taylor, his eyes holding a depth that betrayed the enormity of the threshold they were about to cross. "This is it," he said. "Initiate the protocol. It's time we answer the cosmos." + +Jordan Hayes, stationed at the mainframe, typed rhythmically, a blue hue painting their focused features. The eerie silence that had settled over the team was interrupted by a visceral sound—humankind's response to the alien dialogue, now streaming into the abyss. + +The control room, once a fortress of solitude, erupted into an oasis of life. Lights flickered in tandem, echoing the symphony of interstellar communication. They stood together at the edge of discovery, facing the symmetry and discord of a universe unknown. + +"If we're right, we've just become Earth's first emissaries to a celestial congress we're only beginning to comprehend," Jordan's voice was somber, resonating with a mix of trepidation and honor. + +The room filled with the resonance of human and alien minds converging, creating a new narrative within the fathomless expanse of existence. Paranormal Military Squad, once protectors of Earth's clandestine secrets, had now become the tether linking humanity to the cosmic fold. + +\* + +The underground command center of Dulce Base, once pulsing with covert operations, now resonated with the charge of an impending cosmic threshold. Encircled by banks of whirring machinery, each monitor flickered erratically with alien script that had occupied center stage in the lives of Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera. + +Jordan's gaze didn’t flit for even a moment from the screens, where indiscernible alien messages ebbed and flowed like the tide. The ciphers and symbols cascaded down as they tweaked the algorithmic sliders. "This sequence here," Jordan began, voice both hushed and heavy, "it’s not just transmitting; it resonates—it's designed to be felt." + +The room took a collective breath, the remarkable implication hanging in the air like a careful revelation. Sam Rivera was the first to respond, their voice alive with ingenuity: "It's a form of communication stretching well beyond words. We need to respond in kind—the whole array of human expression might be at play here." + +Taylor's eyes remained fixed on the figures playing across the data sheets. "If that's the case," Taylor intoned pragmatically, "we must tread carefully. This is no longer just about being heard—it's about being understood." + +Alex watched his team, each a fulcrum of insight and expertise, and felt the solemnity of the role they were about to assume. "Then we'll ensure our message is clear and full. Our humanity is our strength in this dialogue," he declared, the depths of his experience fueling a commanding reassurance. + +The anticipation was palpable as the agents contemplated the vastness of their endeavor. They were not merely probing at the secrets of the planar cosmos—they were negotiating across the starry expanse, extending to distant intelligences the full spectrum of human curiosity and compassion. + +A symphony of beeping consoles orchestrated their next steps as they prepared to articulate their interplanetary overture. The rhythmic tapping of Jordan's keystrokes set the tempo for an undertaking that traversed beyond algorithms and encryption. + +The base withstood time and whispered secrets of its own, but none so grand as this moment of creation—an invitation to the universe that promised to echo through both the echoes of space and the annals of human history. + +## Chapter 12 + +The underground facility of Dulce Base, once shrouded in silence and operational secrecy, now hummed with an energy that cradled the promise of cosmic revelation. Alex Mercer stood pensively by the central terminal, flanked by Dr. Jordan Hayes, Taylor Cruz, and Sam Rivera, each poised at the edge of a history-defining moment. + +Jordan's fingers ghosted across the console, tracing patterns of otherworldly origin. "The signal’s architecture is becoming more complex, resembling aspects of human cognition—recognition, learning, even... empathy?" they postulated with furrowed concern. + +Alex turned his gaze upon Jordan, his voice quiet but resolute, "Empathy could bridge galaxies. Let's harness this connection and proceed with cautious optimism." + +Taylor, ever the sober sentinel, projected a more pragmatic standpoint. "Empathy or not, we are duty-bound to assess the risk to humanity. Every new discovery warrants a measured response." + +The static hiss of communications equipment filled the air, its purpose now transformed into a dialogue with an intelligence beyond the stars. It was Sam, wide-eyed amid the myriad lights and switches, who broke the silence, "We have provisional confirmation of the signal’s intent—initiation. We’re being brought into a broader spectrum of cognizance." + +The chamber lay still for a heartbeat, the Paranormal Military Squad agents steeped in contemplation of the path unfurling before them—a path paved with possibilities of diplomacy or disruption, each step a venture further into the cosmic unknown. + +Alex stepped closer to the viewing monitors, each depicting alien symbols seemingly reaching out from the void. "Initiate the broadcast," he spoke with quiet command. "Our response will mark humanity’s readiness to partake in the wider conversation of conscious beings." + +Amidst the crackling air of expectation, the team wordlessly returned to their stations. They had transcended their roles as protectors of Earth's clandestine lore to become the harbingers of an interstellar parley that could change the existential course of life on their pale blue dot. + +The deep hum of the terminal emitted a signal—a testament to the uncanny reality that Earth was now actively partaking in an exchange not bound by gravity nor the limits of the solar wind. + +Here, in the depths of Dulce, a message from humanity woven from understanding and uncertainty was cast into the firmament, an epitheg of their desire to join the universal dialogue and discover their place among the constellations. + +\* + +The somber depths of the Dulce Base command center stood in stark counterpoint to the animated flurry of activity around the central comms array. Alex Mercer's silhouette loomed behind Dr. Jordan Hayes, who sat with a posture indicating laser focus on the decryption process. A quiet murmur of digital soundscape filled the space, subtly heightened by the anticipation of contact with an intelligence beyond the Earth. + +Jordan's voice was steady, betraying none of the extraordinary nature of their work, "Looking through the signal's pattern, it's evident we’re dealing with a form of intelligence—calculating, mirroring, possibly even understanding." + +Alex's reflection bounced off the darkened screens, his head nodding in silent affirmation. "We’re walking a delicate line. Our response should be thoughtful, measured. We’re ambassadors, not merely explorers." + +Taylor Cruz approached, arms folded, their words slicing through the din of careful keystrokes and soft whirrs, "If there’s even the slightest chance it understands, we can’t afford missteps. The language of the stars might be more absolute than ours." + +From another terminal, Sam Rivera brought youthful vigor to the conversation, "There’s rhythm in these patterns. If this is their way of reaching out, our reply should encapsulate all that we are—all that humanity stands for." + +Looking around at his team, Alex saw resolve etched on every face. The chamber, usually somber and echoing with the quiet steps of covert agents, now felt alive with the heartbeat of discovery. They were not just professionals operating in the gloom; they were a collective standing at the helm of a momentous journey. + +"Let’s begin," he said, returned by the resolve in his voice. "Every second counts." With that, they pressed forward, setting in motion a reply to a conversation billions of years in the making. + +The dance with an unseen partner commenced, each pulse they sent out a step taken with caution and hope. And as those digital pulses journeyed through the black sea of infinity, Earth, for perhaps the first time, joined a pan-galactic dialogue that whispered secrets of the cosmos—secrets that, until now, had been lost in the silent vastness of space. + +\* + +As the team stood in the centralized nerve center of Dulce's underground fortress, the solemn atmosphere was reverent, overseeing systems that engaged with an intelligence from the void. Alex's stance was contemplative as he gazed at Jordan Hayes, who presided over the console, the tension of the moment reaching a tactile fervor. Each rhythmic tap of Hayes's fingers on the keys was a foray into uncharted symphonies of contact. + +Observing Hayes unravel the dense alien encryption, Alex spoke, a diplomatic tenor underpinning his words, "Keep focused on the syntax, dissect its nuances. We're not just decoding signals; we're translating intentions." + +Without diverting from their task, Jordan acknowledged the insight. "Indeed, if their understanding of us is as deep as we hope, we're paving the way for dialogue far beyond our current realm." + +Taylor Cruz, near the rear of the room, provided a steady oversight. "As horizonless as our prospects may seem," Taylor intoned, "remain diligent. Complacency before alien cognition could spell catastrophe." + +Sam's youthful voice resonated with optimism, "Imagine—forming a rapport with a consciousness separate from our reality; we're drafting the bridge to stars alive with minds!" + +The sentiment hung for a moment before Alex gathered his conviction. "Dialogue is our vessel. We are not just agents of enigma; we are the threads that may weave a new cosmic relationship." His words seemed to reflect off the walls, reaching beyond the room's confines, a quiet yet resilient vow. + +Their task was titanic, stepping stones laid delicately into new territories of existence. The signal, once an esoteric strand in the echo of the universe, beckoned now with a clarity rocketing the complexity of thoughts from a distant order. + +Action by action, the Paranormal Military Squad team bridged the vast interstellar distances, their expertise and empathy casting a beacon of unity into frontiers of intelligence and knowledge. Their work, a partnership struck with an unseen cosmic congregation, each pulse sent and received a line in Earth's novitiate envoi to the cosmic shores. + +\* + +Under the stark, unforgiving lights of Dulce Base's underground command center, tension buzzed harder than the banks of supercomputers that lined the walls. Agent Alex Mercer leaned over the shoulder of Jordan Hayes, whose eyes were locked onto the display screen, where an incomprehensible series of alien symbols streamed past incessantly. + +“Any progress on the decryption?” Alex's voice was steady, a controlled presence necessary in the gravity of their undertaking. + +Jordan tapped a key, pausing the flow of code, and leaned back with a deep sigh. "We've broken through another subset of the cipher. It's revealing... well, indications of a complex society, not unlike our own." His eyes met Alex's with an unspoken question that hung heavily between them—were they truly prepared for what they might find? + +Taylor Cruz strode into the room, a tightly coiled spring of ambition and authority, and peered at the screen. "Understand their society, and we may predict behavior. Remain expedient—we don't know how much time we have before the situation shifts." There was an edge of stark realism to Taylor's words, the underlying message clear: every revelation bore its own set of risks. + +Alex nodded thoughtfully, recognizing the validity of Cruz's caution. Turning to Sam, who was tinkering with a device that buzzed quietly on the table, he asked, “Sam, can your contraption get us any further?” + +Sam looked up with a smirk, a twinkle of mischief in their eye. “It’s not just any contraption, it’s potentially a direct line to their thoughts. Give me a moment more, and I'll have something for you.” + +The air ticked with electronic beeps and the rustling sound of the Paranormal Military Squad team at work. They were so close to peering into the intelligence of an alien race—a reality on the brink of dramatically expanding their understanding of the universe. + +The machinery whirred in response to Sam’s precise touches, and suddenly, the room filled with a low hum—something had changed, a signal had been successfully sent. The team held their breath as they listened. The sound that filled the room was unmistakable: a response, an alien voice filtered through the static of space and time. + +Alex exchanged a look of quiet triumph with Jordan. The breakthrough was monumental; they were no longer casting messages into the void but engaged in a dialogue—an exchange that marked the beginning of Operation: Dulce’s true unfolding. This was it, the first steps into an interstellar odyssey that demanded every ounce of their courage and wit. + +## Chapter 13 + +Dr. Jordan Hayes shuffled a stack of papers, their eyes revealing a tinge of skepticism at Taylor Cruz's authoritarian performance. _Protocols_, Jordan thought, _are just the framework, the true challenges we're about to face lie well beyond the boundaries of any protocol._ They cleared their throat before speaking, tone cautious yet firm, "Let's remember, the unknown variables exceed the known. We should remain adaptive." + +A murmur of agreement echoed from Sam Rivera, who leaned forward, lacing their fingers together as if weaving a digital framework in the air before them, "Exactly, adaptability could be the key to interpreting the signal distortions and system malfunctions. We shouldn't discount the… erratic." + +Their words hung like an electric charge in the room, challenging Taylor's position with an inherent truth. Cruz’s jaw tightened almost imperceptibly, but the agent masked it with a small nod, conceding to the omnipresent threat of the unpredictable. + +Alex glanced at Jordan, who never looked back, their gaze fixed instead on a distant point, as if envisioning the immense dark corridors they were soon to navigate in Dulce. Jordan was not one to embrace fantastical theories, but the air of cautious calculation betrayed a mind bracing for confrontation with the inexplicable, an internal battle between the evidence of their research and the calculating skepticism that kept them alive in their field. + +The meeting adjourned with no further comments, the team members quietly retreading the paths to their personal preparations. Alex, trailing slightly behind, observed the others. _The cautious reserve Jordan wears like armor doesn't fool me_, he thought, _their analytical mind sees the patterns I do. And that's worth more than protocol. That's the connection we need to survive this._ + +As the agents dispersed into the labyrinth of the facility, lost in their thoughts and preparations, the base's halogen lights flickered, a brief and unnoticed harbingers of the darkness to come. + +\* + +The gritty, wind-tossed surface of New Mexico, just above the cavernous domain of Dulce Base, offered no shelter from the burgeoning storm—the scouring sands an earthly reminder of chaos theories in motion. Far beneath, a similar maelstrom brewed within the confines of the command center, as Paranormal Military Squad's handpicked squad stood poised for potential enormities of contact. + +Ruffling through printed transmission logs, Jordan Hayes dialed the focus of their analytical prowess onto the emerging pattern of signals crisscrossing between Earth and the unfathomable. "Our responses so far have echoed their complexity, but the real divergence is yet to come," Jordan remarked stoically, the calm belying the mounting surge of adrenaline for the revelation ahead. + +Alex Mercer's figure, a silhouette sharpened by the purpose, loomed at the periphery of the monitors' sickly glow. "Indeed," he assented, "The echoes are the easy part. It will be the introduction of our own, human variable that truly begins our dialogue." + +Taylor Cruz, windowless command center notwithstanding, appeared as though they could feel the tempest above. Their eyes never left the monitors as they unspooled their hard wisdom. "For all our advances, we find ourselves deciphering the swings and nuances of an interstellar pendulum. Predict its arc, and we may preempt the gravity of its message." + +Amidst a chorus of bleeps and static, Sam Rivera's tech-clad hands moved rhythmically, their spirited approach to unruly streams of data bordering an intimate dance with entropy. "Entropy that leads to discovery," Sam mused, responding to Taylor's metaphor. "Each step into the unknown is a step away from precedent." + +Alex, drawing near Jordan, spoke again, his voice now a thread woven through the very fabric of their operations. "Let's be the cartographers of this new territory. Our initial shades of understanding could color the cosmos for generations to come." + +Their gazes fell upon a screen as the latest transmission painted its digital blooms of alien script across the black. This time, the pattern wavered in an almost imperceptible fashion, a modification that whispered of active, alien thought awaiting their next move. A hush enveloped the Paranormal Military Squad ensemble, the gravity of the pathogen undeniable. They were about to issue a reply, one poised to reshape the very concept of humanity's outreach into the cosmos. + +The New Mexico desert's secrets were infamous, its storms a mere prelude to the revelations that the team—united in purpose—would unleash upon the world. The howling winds outside found their counterpart in the newfound resolve within, as Dulce's stalwart guardians readied themselves to send forth humanity's retort to the echoes from beyond. + +\* + +The cavernous control room, deeply entrenched beneath the desolate New Mexico terrain, held the Paranormal Military Squad team in intense focus; an island of calm amid the storm of cosmic dialectics. Dr. Jordan Hayes worked methodically, every keystroke an intricate step in their tenuous cosmic ballet. Suddenly, they paused, a signal pattern resonating from the screen. "This is new; it's...inviting. It’s as if the signal is not just calling to us but weaving its intelligence through ours." + +Alex Mercer scrutinized the shift in data. "A confluence of minds, then. If we're to meet them halfway, Jordan, our reply must be both innovative and discerning," he proposed, a glimmer of profound curiosity behind his authoritative demeanor. + +Taylor Cruz, whose sharp eyes missed nothing, nodded from beside a secondary panel. "Innovative, yes, but also defensive. This interaction is a razor’s edge, and we cannot afford to bleed before the unknown," Taylor reminded them, the metaphor a stark warning of potential dangers. + +Against the backdrop of their conversation, Sam Rivera’s youthful optimism cut through the tension. "If they’re weaving through our intellect, then we've achieved something beyond first contact—we're at the genesis of interstellar symbiosis," they posited with a mix of reverence and excitement. + +Alex returned Sam’s smile with his own, tempered and faint, as he turned back to the task at hand. The magnitude of their mission extended beyond the fabric of the universe, an exploration into the threads that connected sentient beings across the vast expanse. “Let’s reply with our own woven tapestry of thought—delicate, but deliberate.” + +With renewed determination, the room came alive with an undercurrent of anticipation, its occupants charged with the potential of forging an alliance with the cosmos. Paranormal Military Squad's finest were no longer merely soldiers and scientists; they had become pioneers on the vanguard of humanity’s greatest odyssey. + +The New Mexican sands above, impassive to the change brewing underneath, stood as silent sentinels as Earth's emissaries crafted their response. A response that, composed with care and imbued with humanity's essence, reached into the void, connecting with an otherworldly intelligence that awaited their harmony in the cosmic conversation. + +## Chapter 14 + +The command center of Dulce Base lay shrouded in shadows that seemed to claw at the edges of the dimly lit array of screens and consoles. Alex Mercer, focused and unwavering, watched as Dr. Jordan Hayes parsed the latest string of alien signals—a symphony of otherworldly communications that threatened to either enlighten or confound. + +"We’re encountering a paradigm shift with every transmission," Jordan Hayes murmured, the pulsing glow of the monitor painting their features with an almost spectral hue. "This signal... it’s evolving, becoming denser, more sophisticated. As if it's growing alongside us—tandem evolution." + +The air was electric, charged with the raw potential of uncharted discovery and laden with the gravity of existential risk. Taylor Cruz, who always seemed here to mold such gravity into actionable strategies, stepped forward. "We must contain this evolution within parameters we can manage. We cannot be bystanders to an uncontrolled ascent of intelligence." + +Sam Rivera, the youngest of the cohort, worked feverishly at their station. "It's not just intelligence—these signals have rhythm, a kind of music suggesting not just evolution, but a dance! We're being invited to partake in the cosmos's ballet!" they exclaimed, a touch of youthful exuberance breaking through the solemnity. + +Alex turned, facing his team, the stoic mask of command tempered by the perceptible flicker of awe in his gaze. "Let this dance then be our dialogue. We will match their steps with prudent but daring measures—our humanity as our guide." + +In the ensuing hours, the Paranormal Military Squad team forged a rhythm of their own, their collective expertise a beacon piercing through the fog of the unknown. The signal, increasingly intricate and seemingly conscious, now demanded not just observation but participation, an interstellar pas de deux that hummed with the promise and peril of first contact. + +Before them, the communications interface flickered to life with a received transmission—a resonant hum that seemed to vibrate through the very foundations of the base. They had successfully established a back-and-forth with whatever intelligence lay hidden among the stars. Every subsequent note they struck within the cosmic ether would come to define humanity's place within the galactic community—heralds of Earth's grand entrance into a universe far less silent than once perceived. + +\* + +In the concrete belly of Dulce Base, dimly lit by the jagged dance of fluorescent lights above, Sam Rivera perched on the edge of their seat, their eager fingers fluttering across an ancient keyboard. The stark, cold room—reminiscent of a time when covert operations and unspoken dread ruled supreme—now housed a peculiar blend of old-world machinery and sleek, modern interfaces. + +Alex Mercer, standing steadfast like a bridge between the enigmatic past and the unfathomable present, watched on. In his eyes flashed the foreboding excitement of change. "Sam," he started, his voice steadfast, "the patterns in these signals, what do they tell us about the nature of our... guest?" + +Sam's eyes glimmered with something akin to thrill—or was it trepidation? "It's like we're mirroring each other, evolving together through this.. dialogue. Like it knows us, understands us, and it's… learning." + +Jordan Hayes, preoccupied at a nearby console, chimed in without lifting their gaze. "It's a dialogue that transcends mere words, Alex. We're being woven into a narrative far grander than the sum of our known sciences." + +Taylor Cruz, arms crossed, wore the heavy mantle of their skepticism comfortably. "Keep theorizing," they interjected crisply, "but remember the grounding reality of what we are part of here. This contact is a blade that cuts both ways." + +In this cavern of history, voices both human and inhuman whispered secrets to those brave enough to listen. Each member present understood the gravity that pulled at their feet; no longer were they mere mortals shackled to their terrestrial plane. The digital pings and encrypted calls resonated with an implication of a cosmic agenda that would not be ignored. + +Jordan's fingers paused, hovering in hesitation. What ripple might the next keystroke send through the fabric of known existence? It was a step into the ballet of the infinite, where the Paranormal Military Squad team played their part in the waltz of wonders with an audience of stars. + +\* + +## Chapter 15 + +In the clandestine hush of Dulce Base's subterranean command center, the Paranormal Military Squad team had become a crucible for interstellar communication. Dr. Jordan Hayes' gaze lingered on the screen as they navigated through the convolution of alien code. Each character held the potential to unravel a new dimension of contact, and with Sam Rivera's keen interjection, they were crafting humanity's inaugural cosmological discourse. + +Alex Mercer peered over Jordan's shoulder, calculating the implications of every visual nuance that cascaded across the monitor. "Look for consistency—any repeating motifs could signal a willingness to engage. We're drafting history with each exchange," he remarked, aware of the delicate balance between forging a bond and exposing vulnerabilities. + +Taylor Cruz, stoic and enigmatic, observed the interplay from the threshold, a silhouette against the machinery's luminescence. "Remember, while we seek common ground, the foundation we stand upon remains Terra firma. Caution must temper our curiosity," they stated, their voice an anchor amidst the current of excitement. + +The command center buzzed with energy, rivaled only by the tempest overhead that concealed their operation. Sam, with swift dexterity, navigated the communications relay. "Their signals resonate almost musically. It's as if they're composing a symphony, and we've been handed the baton to conduct the next movement," they offered, imbuing the scenario with a blend of scientific adventurism and poetic license. + +Amidst the whirring servers and the occasional flicker of emergency lighting, the essence of their mission transcended mere reconnaissance. They were humanity's elected envoys at the brink of a celestial alliance—or confrontation—with an audience as vast as the universe itself. + +Alex stepped back, his profile etched by the chamber's artificial day. "Then let's ensure our contribution to this symphony harmonizes with theirs. It's time for humanity's voice to rise and be counted among the cosmic ensemble." + +Under his directive, the Paranormal Military Squad team initiated their calculated response, weaving thoughts and theories into a digital overture aimed at the heart of alien intellect. As the digital stream punctured the endless night, each member of this clandestine group was acutely aware of the irrevocable step they undertook—bringing Earth into the pantheon of galactic entities designed to converse among the stars. + +\* + +Clusters of high-tech equipment bathed the Dulce underground command center in an eerie blue light. Sam Rivera's fingers flew across the keyboard, navigating an elaborate network of alien patterns. The very air seemed to pulse with the ebb and flow of cryptic communications reaching across the stars. "I've got something!" Sam's announcement tore through the focus in the room, drawing every pair of eyes to the torrent of symbols unraveling on the screen. + +With the pacing of a seasoned officer gauging the moment before action, Alex Mercer approached, his calm demeanor belying an acute awareness of the precipice on which they now stood. "Define 'something," Alex prompted, reinforcing the need for clarity amidst the extraordinary. + +"It's repeating—a sequence that’s evolved with each interaction, almost as if it's... singing," Sam theorized, the awe in their voice reflecting the potential magnitude of their discovery. + +Jordan Hayes interjected from across the console, their eyes not leaving the display as they absorbed the new data. "A cosmic vocalization, then," they mused, intrigued. "A singularity in the signal that might represent a point of reference for both parties." + +Taylor Cruz, hands clasped behind their back, regarded the unfolding scene, their own calculations etching lines of concern onto their stern visage. "Or a beacon—a homing tune, calling out to something we might not be ready to greet," Taylor offered, voicing the group's unspoken apprehension. + +Alex's eyes locked on the screen, taking in the scope of what they were attempting to interpret. Drawing a deep breath, Alex gave a slight nod. "If this is their song, then let us respond with ours. We've come this far by mirroring their signals, now let's engage in an interstellar duet, and see where the music leads us." + +With the expectation of the significant achieving a crescendo, the members of Paranormal Military Squad huddled over their equipment—sages at the threshold of a potentially world-altering communion. The strange harmonies that reverberated through the command center suggested that their interlocutors were poised, waiting, perhaps even eager, for Earth's chorus to join the symphony. + +As the team initiated their reply, weaving humanity's own intricate melody into the vast cosmic dialogue, they each felt a profound change within—an evolution of purpose. They were not just messengers or investigators; they had become co-composers in a galactic orchestra, with the universe itself as their witness and concert hall. + +With the exchange of harmonious signals crawling through the vacuum of space, the Paranormal Military Squad operatives found themselves part of a bridging of minds—a realization that out there, among the vast arrays of stars and planets, harmony was the true universal language. + +\* + +The dim glow of monitors cast an otherworldly ambiance upon Dulce Base's command center, where Paranormal Military Squad's chosen stood huddled over their instruments, suspended at history's threshold. Codes—alien in origin and nature—were being deciphered by Dr. Jordan Hayes, whose countenance bore the marks of deep concentration. + +Alex Mercer, the bedrock upon which their team's resolve was founded, leaned in with an eagerness tempered by his chain of command. "Jordan, we've invested our expertise into comprehending their patterns, but now we must also endeavor to understand their intent," he urged, his voice bearing the gravitas of their mission's potential consequences. + +At another console, Sam Rivera's youth did not betray their crucial role in the operation. With eyes alight, they mirrored the rapid computing before them. "There's emotion here—complex, profound even. This isn't just the output of a cold machine; it's...sentience," Sam whispered, nearly drowned by the mechanical chorus around them. + +Jordan, without shifting focus from their work, replied, "It's a sentience that—should we succeed here—ushers us into a new era of existence. The cadence of these signals," they tapped the screen with a flourish, "could well be the heartbeat of this new dawn." + +Taylor Cruz paused beside Mercer, their expression unreadable beneath the sterile light. "And as it beats, we must gauge whether its rhythm bodes well for us, or spells our missteps. Courage must not blind us to the hazards intrinsic to such contact," Taylor cautioned, the sentinel within them ever alert. + +Alex nodded, a gesture that carried the weight of responsibility and a silent command: proceed, but with circumspection. They were not merely decoding a message; they were interpreting a dialogue across the celestial divide. + +The room fell into a rhythm akin to a well-conducted ensemble. Each member's expertise proved a critical note in the unfolding symphony. Their actions were now more than mere research or defense; they were the tentative overtures of humankind reaching out to grasp the vast unknown. + +Textures of sound meshed with the light from countless computations, the palpable anticipation of the agents at the edge of discovery cresting with an awareness that their work would reshape future chronicles. And when the response finally came—a signal piercing the deafening silence of uncertainty—all within Dulce's confines understood: the dawn of an interstellar continuum had just begun to break. + +\* + +In the sterile hum and flickering lights of Dulce Base's command center, the Paranormal Military Squad team stood as humanity's vanguard, verging on the brim of an intergalactic abyss. Dr. Jordan Hayes, analytical edges sharp, deciphered extraterrestrial patterns that bled across screens in enigmatic cascades—a daunting mosaic of potential threats and untapped wisdom. + +Agent Alex Mercer, the embodiment of focus and a steadfast nerve, observed the unfolding digital drama with the gravitas due a historic first contact. "Let the data weave its narrative, Jordan," he instructed, a moderate undertone of exhilaration within his command. "It's encoding more than information—it's outlining civilization." + +Jordan absorbed the directive, their gaze unflinching from the screens, feeling the weight of their next move. "The nuances here are extraordinary," they acknowledged. "It paints a picture of a culture steeped in complexities we're only starting to fathom.” + +Taylor Cruz, stoicism personified yet not immune to the situation's gravity, chimed in. "Understand it, but guard against it," they cautioned, bringing a sober prudence to the room. "This culture, however advanced, remains an unknown quantity—an ocean of wonders and darkness with uncertain tides." + +Sam Rivera, a visual contrast with wide eyes and restless hands, represented the other side of the room — intrigue and optimism against the drawn swords of precaution. “Think of it,” they proposed, voice bouncing with a rebellious upbeat timbre, “as the first act of a play written in constellations. We're setting the stage for a galactic narrative.” + +Each team member, in their way, was both actor and scribe in this moment of tense pageantry. Heavy with the presence of risk, the command center had become not just a room of computers and glass panels but a theater for performing the elaborate choreography of contact. + +Bound by resolve and curiosity, they proceeded, each data entry a trembling step onto the cosmic stage. And like all cautious pioneers edging into fertile but unnavigated lands, they understood: as they mapped the heavens, they were simultaneously mapping the furthest reaches of their own existential horizons. + diff --git a/examples_notebooks/inputs/operation dulce/create_final_community_reports.parquet b/examples_notebooks/inputs/operation dulce/create_final_community_reports.parquet new file mode 100644 index 0000000000000000000000000000000000000000..d28111c35d5d74bb716ccbd4acf8fc471c1d35e7 GIT binary patch literal 71337 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⪚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 IT&3~<0N3pwEdT%j literal 0 HcmV?d00001 diff --git a/examples_notebooks/inputs/operation dulce/create_final_covariates.parquet b/examples_notebooks/inputs/operation dulce/create_final_covariates.parquet new file mode 100644 index 0000000000000000000000000000000000000000..e4bcbd5b4bb3f42fb83e7efa2c60525f9258b3eb GIT binary patch literal 38473 zcmd?Rd3YP;`8GO}NXf_=y_Uz4EGv$g5td`8me9Tg2vHIxQSg%3PDt2CGb4KvEshpD zW{shN7zjgl#JonpW@ot}0XMH|meKFi_y_2?597X+g#{RA*ilRh0B>KI6uUnE8$sLSE z{ccf`({4GXgcKzd@Or~x?Yfv86}@RC@RC>=_ry>eLg`L*i;>2xqE`n+y$+ON2SX@AO{iehozfIk!n%VIbs z1uFN8c$I)R6m%|}l_V*U@{9g-q;fwoBzb)zp5_Ze#G(Y@ zMg1{%G#HL5zF;cm^(oqQfq)bU_yYmA-x~@+$Wh3}7Z%+ipEnSTDB)-%7S*l`$v!FO z^M~D1Fe*cSxHy)MN$zwc5R;<*KpFzlu2ZCNPz?HmxDILvMzK{t)>-s%pXmMgRxK`rFbjX$x%qf2d(-;kV_z% za>pWRzgr53iWu`LFoVkaq_E!`2u8i`a9Dx1B0g4h6B6l;{g-&y7Hdu?Q5JPJ2_3ixP21B?aaa4h2QU z3xD%f_K}Lg_q?zdIRI${!;%7vfPQ_^a0CXMmSU;Oa}`C3L}j>S+8>5KA|dF*8}hk* z{*+G+rK5p>w_?v}cz_as=tAj=i$gBaSU8GpL0n#lDH^EwM=IsRmSZ8eKPW*T>4@Y` z1;vzG4nZjJDkU(fw{R>Rj(U9|x8fJEUpXeb@z1b3E%^{WBK}ZxQZAx5kj9?9?m#pg za0h*Iz%9ZsaKB){=aXR1lXf5V`9;xJ(MJ$+mcxE`N>|cq7qBQ1nNYsJCKQiX4g|_(a?=SnMMtW2J#W#4RKEr2@VH zBJSjMaLiO1u{Z`9!(K$MJEn+!chsNqN3a(JLxP&)00Dgs(O5CiaYggCb^9FS9DDi{h(`jH%q$o`-==njNoqCw5Vun)=Y z55r%*VFbrO<++hq2oWI$eT4kjZ%T~7;{$28KM<9C3Ia!3uE+(VR6>4l%q^vTm82jd zL_&U2P>coBi13j>#qMQa1S`RFVZ2)0_2Yh$lyav`jABt3J(Xda4-BL znhLsOVV}>fL}H>hrGynEjADkfMO$WkwVifDB zM5|CZ=vN@+fR;vsDQqAW)07xe{4oUB6f97?&MQZ}-gFcnARI#_xS!~i5GAAdi9nG` z$9BE5$shJBSheU@d{9GBNh8+Fz8FHkTv59}=HKJ}e9Dwa6vh`xNsz1;I+LQvr(sAj z7J=I-kc<+o$k-o~1Bg~Ww}jw|*cb63My5oBOyu!YG$bj(%5IUFAQ%LvkO&JwtU}Cy zDBKEs1$LiOkk++bzy;EZ7s~WTAh=*Uiu9-XS`_h6f#f5R$=n^-ClRg<$WGo(GPl;kP$Q@eD2x-|GX(X)3DWA6@J=hJ*8NpZzAWgz_ zqtFHnI_679a7{$R1KRpR-ayC~ll+JoF=#_Vc7QGW;2_?LK}E#KWX?zEPDKKeTk<1J z1w$~@Q~+X!_#)|G*bn_wd^#c@W&qb1#BxF%7 z(!%B*uCL&I_8xEN?_6oLg}ysxDaqFF-;$71y&FZ!~_O-dtVAQx*{I{uGM z$p0EHkYS-|Bwq=sJ|zc4sL<;RhWw$REG4}A+rt%n;?;ta4<@Amu0<6{NC`tmNTz^m z75D(nhr;kWKtTvL7))WS2xLg(kVYgDN{L>viL9^M9L_yB!o1s*@+J~izc>XJ>~2oh-^<@QIgM<5D_1DOXuB2vl+fx>L)^(RUx#8!BLTTG{* zQxQQl3drg96TiU{mJuzYuKvR!_ys=>yRlHsU+Kr9N+hIZAa4p7NsfeE_JyGcz=Ia3 zQ(-M7i!r~Us!d7Dz@sr>pqN6h--6f=C&XF-Ng#gU1pvqhV4Nd)xt z191BTzA%snLU1T0(=7`%#E67}q!bK>Bw38f-2SQ-r2T;C7Ztap5HG6>hspk`Amk5d zuZX}b!Ejo?|1cnGFT5C`A&uM~42^6;*a*VVr3ivSIN}xcEiEZ85LH-$5To?|1__WT z74k>pCQC$2D^bz3-y05iVPHT_K3`hKaKpM_90)_;Q*3k45lFa5FLS)VOKKjG$qO2hz~h8l+y1vhrP%V@eQmW z1}?lq`Gk3}Y=0OCUX^evl!&ixS) za1^Kt&kH~&2t7f!7uhxdsFRkW31(qX3TgfygF9Eis5eAk!?m7Cc*%{r|iOtm!quYfvx)BlQZ zB3d1{|JbScbtg?vuivoY#Ca`tvgzlk@&0JzmQC{f9jiQ-o|k@X@A|pdZ0TP(`?Ag( zFI=;0&3(t;eraaW&9CR~y(0JIhhLud$Tb5?+8n=l>iWX&%$%#Azp=D*=h3&V!d>yd z=AX}Lu(I_bYMQy;K1G$SQ*3wAw$JC-zKJz|6K-byPw%L{4fQT%okHP<8NVnB|Gu2D z{$2m?`ggO=OyhkYt*88W1@H>u6~ZfwR|Kypt=Gk-&~D1BpGNuc^5Yf2E2y8Q3r(S$ zs4)H!!7HktraufH|Bsj5AJU%w(@z4p@+U8QpmOC;-o>L1`{~ObtX%oiPeQozCog-b za^+9n#i|ec>B}CjT=~;aBDnG=FMFhN}#P6cKqgqnz+B)4a3Fb|KSz&HUy~hiSGsxwijmRh-q< zZk zJ6CqKuS|3#I(yL$qT(xhmvnU}dsp*`Rf+Be$(}?t-tAejY*|-#Z*paV@9t_()X}ZI zo$>b7y~zdfc78!uXK#0M{)%4Q&T|Z9U)G&i7VnPJb@Va)z1=H%dii+gLcV83_sZnT zc)JO=TNv++^ZE{^C)q>Kt)FF1cJ{7F(sSv$n%mc}=v!{8~`m~y1+HPNxT!<&}`UKzA-nDr3EUaYaDRh%{ras-0?9fCM$2y!f z_f@vmvZ^P!7;=J)AtP+I7pqJrdTI{;5KD?LOm-%Edg%L>tmy1nmROKnluRsysJc2J zSs}WbqW4<;!XxXuI+C4TD|+~NZ%0?pvL%V`gcXm4+7dmz$;I(RqdkdxFJ971i*6T_ z>|7i-P(8wF^yao@T}LIl`9gv{SYVS@gUxDZI z_!oqU4J6v9o5Cz)%EsI5*fn;uKv+pJ^g0F-5LSAtu;?YLmv!|nN%SQ3WcA7h&9IJ& zcX!f%vUFf6@x?CEv?$q)yS76z!Ugt)iA4$AnU)(CuZVXqOvXFoHwlsWbZUiqhOVnq z=*OCSSJNwS;exJ(iG?*Q#Dj&U)`|F|O|Z*$zPF2yFAz-efpv{dz1{K79;~(_PCFLb z@#MrRyw#iNh7@4E*;|?Tf?na{RXtEpXRo$;em-<`Wbcyht`&=y7_QMRYZoqH@b<7I zJVN#8yO_nv1+Hz3W=5wk-xuuahRbyJE?Lo&jQ4cJuU&dNe60Q%GrwfTd`BX|<5AFm zdwX2ij`y8Zov(aRfVk8EMFEVJu9s*^TS zyy+flwZX#nbinV{j836{MIUD!VLRj9-O1;uWtTlFJ~;RcMcKP^G!@@oH2!KB|@w3+4wuth16>LoK%()v+AQA3%Whj@)A8W5oH#~+r@Ld3lOQ` zuuvxA4+1XW(Y^nHlBTp&Yi0(|;3w@YVQ+|Q)?Nt%D>@-e?W_Mbc^Jp){i~+o*Rk}} z?-tS1>;8p>bn!b*3^r6RS?C|@WiB>0U-$aJ9P-?B3%7ZR>m|cQ-8)ygUo+Y+c&0z} z<_Ck1?J3|2#ru?8iH~QL^?Zj?kd(r#A}{5$0~uA! zNeZv#_)@>ZrwXc)R&#xPA)n9kLt>FH=ZZ?Hl)-y#e6ifurxZ)t=eRbj_Vt(eesNII zE*i+MRdT$(dy}$WEvZV8&lmWDQdA0qVoA;CioBT0mrH!tfKm|Ynua<2!g5AZPP1P5 zNUu1Y!Nm&-<&$`2J=Ufc@pZ9W>dzO{(l9UPWL{Q~s%5-eDk(X75yf}jPw{QMtQNCs zu}D8{DGn%7Iivr%ju+_z^UArBQg9Cx@^V=!se?+%dPdXId_fj-{1S1Pe%PB%D}^HV zGcb@Zl=P=HDcOO3v8bM;6kQ&jnx!4Cc}@8=9$OOCOi|z3E@c$4;O+-jP~@CaEb{4m zVg6SX^>gd`V|&Cb-;JjfL|!do(^9@Khg-?|NE2kL7O-_SBj~-QJf9WUDtu9aOz9zu zn9FCyj4&YZO;SErDyXS)Nug&qm2)yySHgw`166X}Z7voeLE+n`ele3#a!|o9teZS% z(Ds3XG9VTd!vix9mH8pH)X!%Xsb9>gl9=I@bXt{EB`39B%L0`Y=~LPYD4B8JR7NfK z$JgkxW%>};UHbX1Z}q=!FXsR}lmf4oAQwd{D5c_v^#cC|w6?Z%0qZOB$>%(`Q_17$ z9pOu8wp1t=TOTq5JPnk5ON6Zr#d2X#9TYRm7g}UxpwwR!R_L#!2CW;z*U)w>TkKP0 zI*eV5ncTifSL;fj|rStYHb1s^(;DphUMch){qsz^n0}GgvpBa8q=n z>7Ud#>q)2H5r3JH%0 z74@51_>5TSgNXXXY|==d&gK+s=<R(BEd3RTzq4rWwl_%2MyjGCMcg9*6+-B}HnwmAf;%<9OQBe?t3i)zhzy5Mv zRvg=re4+)hMOlwEt2sruoQ3-r=$qT1-P~|Krz}BW+qIr8<@0Md-Wq?6)-|ZPA`DY1 z?cBUfsO?;2w(mAA>q;061zf+hxIIiN}fKP66wQ~z8#0mTaVCGLhRvF z!-#4*IYS>IEM;YwzWz~0K@|J*j<4tSiE^J(Dhzkx7QG09;>6Q@kw>JFU^ z`C@U-fKHd==`X4L-cpRjPh)dQiduB^6#DP3lYN^p$lyhOK+Gu_zF*z7)Kbi6l~O-_ z@5m<&Dx4NZbPRpO?rI+0tW$Fx z`*pKmF1q5$?xQ|#p|2b>>14k38mg@S)d3ct>wjrRI2aIxk9E0XYq$P&8*P|#(G;^* z_^1bNNgP5ct}pD$Ao4@;s5x&_$JvFCO&5m_Ge{$=?R^M)e0jk7x9l-jny4$6e`E^5 z<+Exj5fa;lS=Pscu#sVYNP#_Opax+i{xjMf%;igb0Ww4qK~Rg|nE1`%b-Lj;&$xjS zM>%mM{1wGOg{^PKrc#^cd_%FYivjTqvy8-(nmB&qQbv^(lB^P@z;ECbA2RvOV0iPC z@EVGK!$;`I@Q3v4bR#R}i={nV%>7DHEp0rQy$@QMJ9Qcf;W5@DU13Je4brDk#qg(e z>?W#BUpVeILyb-?Zol1(XsgJ?T?O^O$s+LeS^p?R`StL@fjk__kfDY)e&Sqapzogu zQF(G~m94sphixH{mHIabNnO9PTc_i*Blow6g<(D=!f^UUy6rGNpH*{t+(#^B^TmOF z;Z6MuEJEB6Z419Z>566NHe(R#&!GLyr&UCBIr#}yR^O*rQ}X!h4O-;A82j+wG@VlE zXUv6CK^!)Ht}B+v5mmxA-9Ubv*JXzHJnOrNDo*UQAYjS)A@N>T&X-ee168)QvEf15 zf<)9O7B)tNmskj=?Ajf_pRVE78eCJUbwcBn@wuC62FaWLxo{zs9lM4$G3ks*W*Vv7 z$aN#Nj5?6n{^tg90H!S>r<_5jSM<|2`$mNI+_%OS2nj0Z(+Dv&SDEvYR4#1no$IG8 zZTwKbDv_6~#`hq2iWvsco$O;NQGCtzp@GV8&)nBaWeLmBEjv9_zj%Pkk+)f0KD*1Q zlht@LkJOqK3u~1EcdChgaY7X?TXZ(X!n6hi9k0MEk$f}5t^-8Ig3Ep zXAB+W9hNF3w&=vH@Q}GUoK58&ceAXT75lgj#*XlW4!$~mv^|?uWK`JXDuV^NsHhfe zF5OHc4Y*FQ7m@jpp2I24fyt#Tn?p?Vd~4KPyp)&nnPT{P{n!nkq^FM7h=Gq;NNyf@X1v{J~?QSxV#<4tpN0$8V51g2=GY{yq6&-gajI!mV(T2G-w+bC;E zt3XivSgmk?fzoYZGgXKib&4dY)X{Sm(upY5@35Pglp>9Ntm`X}jqAkRo^vUY$i_AW zi6SGn@oND-1i*vz#E9Wq+gHSrQjm0H5;pj=)94dCchU4WwkHjAnNrCXjE<%>b48ytaN=AE4H{@}6Bhu;!pzEQ^_~ z-zbY~KC=TGC_t3sUE$y8ge^1w62t}0mHA=p*TXN!I}c`f55G()s2PuwEN4A`rMUgo z3Y!}I;2KkbX_{$#T3g~vVf&d6#r@(L%w+BX`M1i-eoAcHLuI3 zoGPG^?K*S(DObVpbOZ7Qz&cV+UF+4ZvbdtDcmwpjOhia0=bD%d-_iI>hV5Bb7Rm2S zCMd(~9F@m%Yi-|54@GTKuBOZL_zn|-$4Fugqo$&oXbu3wKgEL z_LqyQ=-6uh^vu~e*VcD1fJ4iVqJOW;pH-;#t;OzATD z(WH(aawK57e0pMvb(1ACjQA*X_i@6ybI@&gZSHe=N)5M7Ra~~38Y&e(lU!>YyXfLi zro=bsO3KDL@n`%sQ>o%e)Ph`@Ri))eL8`i{ksVB4R^o56d`20xz0BBwcTwx)NV1NR zq`YIBk;=Q;h{;UOK3&da+$kVgvfr4v0P&i9V@0etjZ*w~ z+or^~QG4Rs3cs6*8237B&WR`j;*Zi#ut2|}ZIQX$=1?pYzw!CTzuNIF@+9k3fvYQx zXOyiG_l#n{~ZueSu!gWW_bh-{fW)hI5Y3ISWJ!#b0&uRO*9^ z_fq7+YW*XwCvO<1Mvk)GNcNu57^xzWT3x@$tt8@fUAj!-T%5RSDYyDEcd-%fbDhC8 zof19YP;^`U*H?W)QD=weO{dyMUT0B3mgr7;Q|dlF)wX?~&ZhOejWKGJ1^dKvm5p%8~Q$rs8w& zxQDvKU7fmy;ucsSEA&%r{S4fW({s9vYWvbqbF%OYVPGer(%fzn=VOI)DAjcPq6Jgw z^Qgid#_)Vv|J!bQDs^G_jj8le3@V^KD|981+X7t5H5uuX8$)Jiq>;Az__*H=(1J3y z?D(dpdjMIIJHjNcoDi^i8!?W*N)2B26bq{wU3!mUV*mE-o@F`|;!Wvc#sO7*ws$V_t1 z#FW`vER=ZVr{OLgDK(lgNXh>~+(5hy{=u3#*Rk}=%l}F~ts}04u=kIOYBet zKo$LW*r?p`PZ&(kBrlkMDMjB?quSe0CinGc$fr)hBWzf)G5Kfe#`#Z9IdJS=!r2Y_ z7}>>B#l*HbUrhIWKq<32dvxJTD4K+hp^tZWlB`kO+Mu;G`-e;YHvV9wvukHE`P|Mi zCt2fkoOTcpi*qYOFG$|Uz2^XiyyH*eN2|LWTbPrA^xS<_;TxL6alLSZtChY>|1Ev4 z=~?QrSC5_6(61It=uk?g$LYsHg_+Nc)B3_$c{+4}3)PPPioVg`ZvyI^Ks$ zpj^%lbgC%M72ADQogy#lq8;zE6YtD^((0Hn)Nkglwv$h*g@gs&OVnLl^+Dz$3g}aX zkLHuy$ z>-_gk!arLrCO%I+21t@r@i&I@OwJO%_XnzVq|fMqia+5Pl-(2dc0k9 z%xYb8G%~badA5v3jhNsJV)RRfi_xmFSt?OW-%){&MfjpkCNS%A(kkb9*RMT=9r zk5-MMy+Y2_%Mu6|#SqMM}kMp2KV)G2DWLX%(^7ht96vhd&6rvK50M@L)K>WS~y zr!`Ksjs2@y1#17l8EgC>p?EYuI8OgC*Dz`g$pQclRxmlY{^|kR_O{sk*9Yk4w@=Up z9RL4R!hfC9++(nAnBH!kU7-)WsasY9UBwq;Fo@Y)Vil%V-I$5jTibf$t1;-}7j&;U znzPRKF74`G81Lkl#8)SJ%vM`dPrQTg#*7}bcMG$y+v9JcC>`Cx;2tzXcQ$A|16*@B zCiACLJ)RA~4gN#%!*dp8ZqtVJGc&9a*Ua2bRT+*ljnXsevgx&B&3Fp~xyb<=hBYhN z7bG+Wf!?r???_?<8^`E#e!M5a;!V%{6urtYi*BU!H6hAGKP*=!ZQl>x8gYfj4d~Pc zvF-J}`_JuJz9PO5!_j!hZhY36=PT?8t?^Tm`nBm&#o95^K{piU51T^UR~09_jOje) zBmbIL!OjQKcz_ow>q{Pf(#6-qV+RJ%xP+VK;ijkwG;9sez^JM+Cdt9Q(Nsq7yHs<^ zBN#qa8V%@}p%~Iy`1smn$9mG6Do%|aA!bpPA(rWyHVN^eR2g)6>T~-vuF*NPb<2N@ zAgLDPk923R`5(%~-V^&5Y6=4RN?*@!s(GB^+4<+hHZ@(eGWE>%FRofTJN}z(Jx}kr z_b=DWt^>z*ANjjIy=yM?T=MdD8=4MWdgPkqlx^Fzi8|H%>~lYI#HwOBwMLOj|E9D& zZ?s)wXnyt?y7|^8XpKSg|Fp9IYOx?ywPT~&38G1ImE}hy7re(*j17bqs`;ZAu$(F1 zlfE!=nOx2fbI)Ge(apENKsRrDfo}b8e62rBv2MY`ER~1dLYH*7eP>r^;s+=Bk!a0U zYs(LAz*#MAKXwv&cEv3$R8V6hR1CRdxU_249L-423;y754qQ@yoVh|?nb}zR#t(PK z-j`ZCf3#-=G{+AgSHAQk-?ej-8vpTPaC_I5AEwMY14Wtnsnk45DKYqr+QLy&r{i}g z)%@A3Khmfn|DOtdR%bg$*L>+Kbn{W!MDEtBLy43U)_J|_p?9H%`gAq zzw39l)zhxg^k7QXWe@_$Mj9OkBo$55AP|A?Vr{c}|5MmH?E|~v-`C<&Tkj9jqz&Kg z`_o$u^b(4toA$IO(APN3xfwzO~b?w_fT3D5a97-o(6#5@buZP~Eo6mo1a&bSp z+yAHQdhwkft&2gY{eP_LlRweT5B=$XZB=hSFva@b@91{xEt52aeOJ=^7hMl|IFHii z)H2#Ch}z1qQUtiyppBTzX<;0HBc^M?E06GvCM1{#-)96&EHMhh!f5mUv-0vV2CKse z(}>j-Qh|m#zGoG9oV-&@1^>x!0A5F6&mjf;gw~*qzO<0vk14s5Nqd}+YU@mvDi{8U zo$&64%ZmJ9UPal1QLcpL4$;5Iq>#tRRhwK^1`HZc0iR3~6)x0oHYE0+TFilEfH#px zD#%l7=6LvbH(aqu8~URErR33e^6*D#BP8Ugf1$Su%K+I6%}exCJbX`uMQ8XJCk_QpzB*IrGMC585q;YH9;q6`D?Ac*3+ZFz-W~eJ$y2)&5G$&URW3a#`pA# zP_2EEeWAv00p+2h*}i;yqt-7^3I8xdokMwHUO#q$70y6Pb5{5%=!fApkfyYj_ELHJ zVM}E|IuwsB`)|~X;rJoCWcu*0h0cWhOjokHkfBQQPP30QctCndnl(eK(A!6 zzFF~N@|E66HVC#U=GO9kFd?nJ85VAt_byjWuuNhRTHwuJIb;8+c4(Kk?8@eySKX z0d!lnA`H#`{7GH1FKDV1jOF4H&W-dn<}O%zDNZPLm!NT78P6_NihUn ze`Gx#4=j@hICT@*spX2&wT}5zNmi;4VRRq z41aah;&O~ATx|=w4@9S&@bqJrw;0r_2SzsW>jT*i+M?YK;cIo z9_ib-fJ$w=RDW?BB6y$1U(tvu^o1>jEc~-)lKZd%Ek+1`8m1le9CS1CN*Xfvs(Qh$>C!Er9J{eC(-v3LE+{a|J_cl=t?l%=G)+9@2>?}5|C>i~ORR8$zse;f3 ziD%;9u^Mkicu~$H#PFEC&%}jGjeWL z$?)0uMW9`c?HoIv9?-Zm;!$>(rpAOae7OPf{6EMu2!;6}_$+7yB}B7aAH7qX8|mYA zxH$eO(euq%sai<1u?or{(WCRcNB^ox;?dBPucYH`n( zyDw*pLu&f&hs~acv68W09)B;TUfZTI#oR@4a1b-L`15u#qfumrm1h~WZphV)1%gP< z0y|&afxFaPt##KixJm2<&7?1$1Ak&Tz996pSj}Lp?#l#W?nrlV&kAK|*Dt6c5iQ)b zZP35~$T;4pY6IH|#3Ij5tf76(YsrY&RFNkhqqx(q^>wsCJ59DRAR&MVcgtb$H4OQY zI^r6cv&bjLY)cJPTgSEPTom-r>JaR&7iQZe!^H7ANughBb+TEI`h9GdxDMi4T!S4DnId z9ftF_m(m{aK=;KBW4LW38Ah?{*CmcV%eXNV>Qx9tZ zD8!Qa-jO>^e?d6pI*f+0a01n~@hD2{xSwi!;VEvl(GF1!0-_ntu0K{MuH8{b6~=uV zOBgXz$@uJvrzV~s)0ioZ^9;Iteq!A#JBYK&x5Mx^Wj03U&ZOAPzzN6u(HXyo6+~TD z(cfS$V;hUeT6V|HcKiv9b=$7R6Nl|_QLFEJ%%L^){Yv0OxU%z~=bQK+ZB! z!+Un_`qFl~QT_GU0~%w>bp_*bo}s@BBvr1J<<=RQ@_@(oF0)IA>9kiHx3;riz5{Rr z3Q|sr|5NC1ox@5%cFG$;AQz2Hg?Laz+cSQ=1y5g#l=&XXvFODrAGOkCx`FbLeT3@W ze89#siId5>7^3x$pNQeu@?*!+c7zi#RVc^5)fEcl#wtPHa|h=p;LaH4viaPglDO6j zY=?%6GD)S1KgiV>sUhE6m~Jb=JFJ4v>4<0D3si~YjAW^?>0gv8&(SWAeivIPs4_QP z9nVmT+Yb{lGdi&_2Bs6)$RN=3fbQJkRTLm0hK!|rHl^>?m4@QaQR3K(IyFOR2J$J= z$7icYIZ#wZb>w-o$fuQ|ojDBXU}G!p1``7lwjHDmEhDs*kSsNJfQ{;N-M6lTR)N7z z`S=`Nc_3~X`5HGno*tqW*xoTP&=mIvFqybF7-~57nYoxlmr2;qZ9$uV`)LQyb;bv|r ztK-w;6fn3F0t3t=W|{!f`*KHUEXT38*)q0E78r=jjI1|%^k!Y5O>E=jDsXEntSD~W z1k6b8VKrV9_mE+{WY(Hu>kOCMzi%DWXQSCpzNm(41JbFeDG*TxTCd@X(7(i;WCDAt z78|^tWwn;|_(SnlbERJmv2yR2b!nA6&-|M`wTA&uMC(?2a>Bai_l+<<+~NB8(^Cuurnf&& z&NAqVZ3s+9+&v95CXgb8x3t0Nu0G*1a2PZ`IyYMN`WGV?F!`cl+heAN;_qNuR#TI( zf=mP?Ba)}hR9=0Nj&S=yoRH(2C!V0%R$ooay5d0NhgEC|5STO=#-@@k!qKMh9P~L3 znpz{A$3?0bfIRXD<9w%@yT69KTa8h(Myr~5%XQVxImBSnN#YooBba<+>T%}CX=BGK z7sK#|=VFwl)ag7IfB6+*Yg=+^AG(>~ipU~&UlsY#EYu+zY6M-!8zAanqH>p!N^h1R zG;SjnS+IR%f}x_}KQa-Y1q=)3t(eiDCprQDl(DmzKDB7Oqsluu!T^pzg{5#cToZDT z3fxxkJSZ?DZ@lur#A?!1W3F(jMR{x;kE$4i?qSft|Aryn*~DgsmPxhI3oMLE9H>`o zL69K>2wg(7ajw}67gN(?x9AP@hjx$}XJr+Ie8TWD-v?@3sW>aSiYku0ilI>a;_o?K zo6L~%xB;B$3{5~CbJlSz3WzTHk=1kd23b+=S2&N^VXgx4>pOZI`Oai(s@-)dlyh$J?W zCVoN{lg}b-mdaU_vE1dXM&Xt~Fm8w6mrG@gtMO&b#nEFJP!cV!^XX+1uesK{wqXRC zs$w+~nfTr_ZXw6@GQu5Zu=G*|?hiJ#MXcsfrF zlbIYCAE#tY42s+cd>@|Fqb*mob7E%3~AKC`Q*1wjeO6^#PtQQRFI{RdmON!&_%8BC4H zdJBCO3{D(?1ta)24zlEZVv%7NnY8c?NKgv7-DXCmGrYAasF1($VNPPLcv0jILbL`-F{v zyX4&(p#F_|+Xvjpx)xkEpn}|p#7ANbx6tx2#a(0tA+hmHBS7`UD()mB2@^mc+q+e} z7rLsqKaP9QizjJ>!WWRPtw9^|A~>YTZY!ni{D|HL9xT{ZZyC95R=|B(@m!6RIe)O0 zN|WmyrV0>eTQNszN>1c5B?SvIXVU!}$-+3`@?b#8zw8kZPQ4tetJ>Fbt0G#20K_LKV5U?1{s<=c>$=6FDSe6@HEnWpZB)lP)Ran~;5{ zFP{fitGMUAL^b)01(6g5!$5`{gp&Z$M57rU2~QWqo_ zqHR?muT^nEjV_~%W^{7i_Q&c}^;91D6Y5SW#rP-+r9tu;$Rf5yETWZmc1WlJ>k6+!3T?Kb8J=XNmuY7eTM z5gAEZBy=MRIdW<(xqgN|JhGUDYZS-}jaz3D)JHt`(hP1>9V$5?nLP!VNW66WyJVk{ z{LO~?OXB;$O62nsE_ws~k@Bnt{f;&fy@itF8APG7a3tQExSu>f@SrQDb?g_Ggx?++0Eq~PL$Y0`?r0Khc=SS>_l~tVOC=_U1TR`RyY2kmTlu_ z9ZBZYA!Y6(WWTkMx1vt?mZh>A36+}I2i}<~>ffW!v)yRWIK8yP4s5L*$|DEYH(x{O z8yt_5iMt(3W{iEYyBBOY5OCWLG7ouXIqOJMW5)+%lX3ezI}gTLUREbe^r!K6x%D;i z-)?@CJl>#FhCklOYDW@B2lu?Elgiww^$^dg_B~6~Tg;OOuLj901Z5BU(FHN_ovtrK zo~m{Yz$or!noz#Y>Q*#58(C+zU2m|>L7#GLF_4uc?!+;!zPzh}L`*ujdx9RjmCRwu z12*!Y0~v0Zm|#f*ZL{=$TKBAJD>tnkM^5sYu`e|oFx*JGW?-KRNZ0{k1{2S!^fJ;` z5AsSPnN)*_5FpW^;6c~7Fx(n8queiNx%&;ym4xi9b#~W{-x<2Y@u{Klsu@(Pe?$=hsX-qaR3x6Y*o0(b8 zhs62RtnFLK!WuJj|3H3hFZr33d#<4g!*dYS0m6rChFMi=o5dYctK-Y$+j_zoMjo&| zF@rui{*_%EQrzg_lIb%L8f>jbCR;Aq9x)uKvDKN#$&KVWjsdZjtmG+aYz{fLp4(S1 zensktxk9cbtR~fB)^<75pwW=?9;aFOk~^r0NGw{qReK7iZe3!tk?*q~!0l z^fyU;x-<I}2*G2lQ;VdQ!0B>EMkV|n=>8E}CoR*|Dg(~#ElQ*wj(;k}KC z#Trvy{Eqv)j=Reof1iBlKps5Sx#I{sL?o9>!`oMrbVKt@f%~9ZSfNW5$mzA@n5rES zDs3AuFG1HkBcoULJsnf=I8(x_q}??54u#r&+1_W!JM~mve3m5Y8=qm2+YG<8qrBEg zzT6)VMgY6O*n;_oxF%n44q`%hIXH%nV`s*HroVx$@NF+=kn?6=ZO1b6t}ZjiSxeNh z#{kSR6tO+)a%?a&860Ye8k)Z&W?5r^eR_p(GWxlNqKDhwG&fU44lzJnW#gW&=ySk# zJD($aYLUWi_6EHe5mHj(}DGl(;dol z&+x=l1Fez^*zln=h_hguwxeKT;kr2GLG{eu-sE_*nH-OTyrlM(74BlrW~`@ec2sKp zn75F$OWaP{?dWimGAaP^_heno_zG%({ITlp9cHmCt9irdp4GtA;$EsS@d70_{*fb+ z4HW+YW%sYmSzw~{=2guL>w$C@a+iRkm}#3O9K)bXSN?X#RbjmO}Z5sLpX{^)sK+UoWr4)$d-)D_6iWA8YLmx$M zvs0zUo9(;aR9;6)cD!1H?Vz|vqr0D^XW=+tj?~$mH0Rhg!%?V<-$5=lvY6uJ$UKHc zv^k30(ZtO}lp&kysluKq^so!ZurOwFy`*cK)i_e6?B7j@oCg#^eJ^;Nr>WiKvFfvW>y!Jr*GzWwGts2Xzdq7xqubGxz(AoNHBCz8=G47FQw8orUYC=c zaxL-Lb;CTlS1Uxe$5F(B-$wKejo%rmJ~FGpaiVShhlDD0JY+{rI0|5vih*fvJG@yl zZ_-yg=Xy#ffnnH6-m4<*jokHBpf*dku@|V6?eN<8;egl98uDAhN%lJm;~&!pJ@Xeb z#lm=2Q;xd`)j={ws?hwjVQl^QcARuV56`x~ii>gjD_HHkR(3Zc#ET8^hFj6(7@A-c zCo~liK0VHNuoMSf%PBL+g-v^|A6dTRT+qDL#(P=vq6J4NZCk5J#0k_$pEBOZ0^O)% z9$S4gcN0fe*P$a(;z;$xi~85;+jmVU%_LE``z`pkwHC4D_By1ebIe*7$7NyHV!pr~ ze6ZtU21~i53I5noM;_;&*_UO=UuwAL4BXd*e$OtZFw*w4#b3n8&{1b;>}bT5@7TGt z!F|c{J{$T43i&0cp`u%iwsxG#Xza&XjeL$ffi*4TYFl6bjN4hQ9ZZ`~7S^>M2WNJi zWW&BssX=eO#VE|7FBaOUS=`MA9KWNK=2`Xh6T;b0f@rI+CubTku5b=1CFd z#?6bwX&pCm)2&p73^h?j!)x@5kj$(a&e{+TqdN?G1` zlL03d$vh7Fe$BA=%H}OL`cv(EwFo3uWgNMQJTns~#zbgn%!>X-pM~z!<$12iA=*D% zN1v#j_aT3Ajx43*J5^YirAlyc<@$cpn@eCEouo_pEs{FTx02uU{qlumGhpBmt*8UPlkK^%2a$+w2a zLt8})PK8xBFls78F0N&8_MV);liMvghn^;0^TaOw#mx^h<(LHmET z5OIXvHLdke0Eg>K+)E4?@p17Q+e?J*!jNSiMx*O)h29@?i58qMO_gh`I8XSj)q((t zQ;Fm^_1v{~vT-KP+(YTP9LZ_GsN)_g7rwyck4&XU3_Dx637CDa6xLpZ=g2#_Wz zghIK5gaDy8A1Id~#TLuey1uyqfh47ba8vgYwcamt>SkAU@==^s+mCj0>Ri>%c3Q2S z)7Set?YwO2wyN_oH&@^9c@iL8I^V6V+aF6Q0bxEYu0!~0< zIw4B!U=mcpp(jkvO{9kt$;&z-$ryVCGMd1FXTfs0n+qQO9epa!{(*MCX8gru+Bh;u{dAg>#^UV*1SFlIpK!VBH@?%d0AB}Z{1Ki(XJpO2ekVm~SPh_RkS5bk?N z?GQ5tyUAWy2nOhV`Rte!gmP)8&(NJgZq4H#(LkQE%gn1Y$%KZ$wBkh-P0>O|XgHM2 zgn5eleD{#98{8z#(h7? z=jBN@X-+fnFPO+H1jq9YMrmOo-6JC}DLMDmw|nEaZ4_>SF)++c$Zdo?kpzN;KD3my zB&i`e1cjxm+@ngysD(N^L8Iyc=;I4u{oF@argg+b~J3xLxfFS-@sMYHk zQzI0R43cvdnwMnoeBcS_Q+O^^ew9FD3L1}bAl`^puYkXTE&3`2E(ZCUhm&`paUHkx5=n#~t(RO!_}*Y+peegZ?HHqx*Idm81fp9&y9Yq511%m{2L3-iJ$2s;Qooa~ zG*|C0eux{fzd(x8g|GN4lsmsKKQ=y2bh4udD3=4?(I%O+zn46f0mPVHEQ5A|{JYo) z`k|}k{Cn}auWKwYVxlc&Tt&g9tDZy;S7ZS1d_NCoO{j!!Qp3kUus0ZcA-^g^*s{+= zcBS#h)2iMiwuj zxuu+&{>DI4%d%F-n2)8q1Bx z)3kSIz@Yl^L?~5^m+y3eaxmPMD0zSz(0j1Aw*5{27`w~9q9tS5n1Zx|WLzQ)=fsdy z99r_F%xZDDIy)=-en?FMz5L2F&AV}$Lom~m$(*6l@goPGGcI3(W#oVjfin z$Zu8jtOEH4&5z}fLFj7fd7zZ&=W_a}hV#>Ra>=!Fg+0gT<1b!ne6x@UdM5Chs3-5G zK@Kp*0A-a-?_k3*P%iBc5osFjQpIkiIVJqN%g4^9CNM|5{;>!1_AeuQlcihws9dhU zgkPeK?U6i-m)=f=y79F*!pWNj5SibnzZOTY<#rEmq0TtiK+&Z97V{%k&5Lt(56? zt#r)DTfkNi3}$Dcxpx&y`#}O!Xnvy{hhQN{_9RW*#_2W1yxKF2K70M72#nMMmaB4SXfKSelRw|PVJ)b7g+mGV1 zNDMqS;;sr>xs0UZX0IaG8>PA+SXg7Q0}YI?kwLpqxq-7rx!wk1%Ec=Mv51$r{pXgnGi5Z+N8jyoBt^Gl)InCR!B!oE zgOhzrn4V{F{2u*1$q*$J8df^4I{x(HBTwtE=Bo?nia5<0qP;Tli{s=ei{u(cA;&J^ zV=dfJZeB9HBJ_FP)em!Pl#CR-h12nG+Bi3_Dj_ZLh1bXI95>v1I_ZLw1jk71bxbr+ z#2+dm)^yzO%^&Nr_76Tte^r)UOV?-UD;dKH^pT4|Hrh{i@*XQLW+gmkI@ZxnUxqt_ zP(RrrkWaIOb&gH2EGDnX^;ggvm2`i_ST?Cj9a}^^`fXczi;ldeG}a`M2lM!^AaEI? zpJ*gaV|U44AmfCuSJ8LVcwG+A#i1;qlm`;&F4FXqOc;{xDCYVkxv`gdPlGZ_H#7`x zjU&D+W;lImhGGZ?IpjM_an!6H_EeN+)4TFwe?_iLka`@sSddW2 zBnmZOefsLJVzh$-e}@hyXqH;?@G|D<2#PeYg$n@z@KIFlRKP$SSZ_NKSp~sXdWIH|p=OG<-=2tH^Y+S0%w+L5^pH0mvg%b5xJNZK@-J2r` z6?V#{FkgR3A$d}>KR3IIyqW5xneyw%hv~E{LGp=5iWB|y6o}i#){)&+3dX-9yA-7ij%>%S`fH_b>rlZe9GroZjX?dyoxG;v?iD>r#l`a zyK@RJk(qG$f!UM?+Cxy&8JB6~YG|!-PW?sxo!a~2u$zjrwO?8NhpAL9)w#+3Rr)Sy zoCO`cEzRI0vAaQudLLkoUr~6VRKcuSskP+zpJVXT^5+^S2t-^N_Ae+R!CEnw2SHF4DfrE^j?c$ zO%a;2ynucNUM_!ufn2NPoWj%kPV!h5=JB~IIJ0q+&(-hs@dqg7t>lAjX4ZO19Jn5E z3x-XifH-PUI6#}~Ko5UvC2YDYYctSi%W8cv_EYlkGJJnL0p|74X(E4- zlhh0a6rS?Q6KnYOif2!kI$YEkPk&#o5bbm;*N}j5Upvof#|3)E67sWBa*9lRcxWp5?~e?*y{9k1CelQf{ChmvFe+W#Y| zB5K;E5Z{ zesJi>YN(Hq^99Ly+8vo>Z2{?pWQ=Ue5-vZ`%CE6-{n^_jg%GvFwLE!2%|DUF|Fp3A z8vD=47xh>W<16J~j1Q8sQnCaN_4HhY{7fN>ypf{ZmAm68M;cP4p%6JQ4fwkusT|7v zA<+;-^cGVH+n#yciq)zJQt|m?GF5&?XmsRzbBEj;ffwN<=3M6bCanWS%df zlm)d6pnDi8GrcVJqY^_7({Y5Ai|8t|51Kl#u7L5xq}^gf^up|inI9A;e+hf=3^6}= zup|h-OmyiNF_Ho2LKMY7D_Bf{?in1N!1@V#KuilBO~8@E{GEi2o^kJhE~<}N5{UjE z!BdaeMl)sVY4<10z?iv@VGtuS8cfdD+7@qLpBHhNdTYY6EX{TGcP8acbll&uJ2l_9 zmQ9iy2P|BgI@XbrRJTR%sUR}l;qvgbdT|qJuy+X#qgK~uce#W(1p#o zzTCHnzXB$NpWPc{eE+CumGs}anVOqkO;41bJd2B#Kq!96fKlPR1ZX3 zDYul`5VHnxojS`+v9Fwm5Iv4ghtuIfSTwk?M;VXD3_Mec3~Mo>fcVbyl$Cg_<%o;p z=`@)T3J5{ON=+<65n?Kpm%v6M>pW|@*<8j#r@0*N5(M@^I4uMTF_pLxn+h@7JSb9z za2UmiykvEhATAIhhM}^@;xM@pc?lhN024K(v_xAOa?5mI)4_7J?(5o*fy})v2ESo` zELC$sJ2rR^nH|&erk07>(2R4HrJ#A!s ziJZScZoJ~L7~>5O#V{k|g=pfu>$onZVbT;c>ngS$Y}WElH=;*bumGX{Q))qo7X&@S z;zHCGv(1VD%t~1{YXHBll3Mq5B>9kIWCUc$rn z_W7q`jNg7LCgUFfGhe6DzD%-m>c!v_!3%GSj!RKwFJe(fvblx~v`c)P8|WcAcUHiK z=q%AucXUFuhl}X+D1-aS%;=Ng#K6TTV1f9UcUpji}vZ~_SdnAqcq*&Gev z(IkG~(uc3*Hu1ZMeJ?)$96W?yxLJI=C-UBzuYr3gpL_Gnv~at`;8}Q+0ap|zj}e;y zC54fxjIhrdmd=#z+%UmL@pBEZ*@p&lpo`UQ-dIymZa6=xF*93X@VZ(38Lfz zAf2C&#zcB%m=mdNF4%dCENm-gMkbrvgt_?(3!hm~&4oIdy0EaKT-nV9IV*EvAx}EX zns05*%=_2CogB}Zt9lahWbQ23PO3%TG5x&yf7o)r{?M9Ny44$7i`p3c;R~+%?_IjdUo!@_B#5~J{R`v+*z<0L+b3vRG-6Y|1&#ylEE_5RLl8=Y$}XWs5W0k_ zE-|gLaz_3TORS#CU%$Z~e#UR{En+^>h6L2ZU-2cZ46B4sJN{P=wYOS(+uH!T!GyfZ zGP~aw>ZolgX)`wtI_p{noPl-TGrg7YJX_!IKv{dwmM(jszT4?{`|RGKF1z2_?QCsk zWkT-O;b23R;B{G=x?O<{NE3!4&x5Wid#QbGmo@V23qRM`+RkF{h`{pM`kekIpQpBE zl)-7Wz?Y7{W}xFN)UCA^J8Or6_NscnqqQa2QDY0Ww-)Dm= zp0-Lc&mL$AIa(VBJ8GM~3^vLRxaxeJ?mFL)_};4e!FGtF+ASNx`K>Lc_SU9ucWpK6 z6UL(@)NZ!*qVEB*@4lAiCazUCRrQ{Nu!A(y#v#L-r1ay(^<&MQu$`b`pcXQK z{;WIU`3Bm~)YucD|K`$%ea^rJGa{-p+%zw(6`^4ntz>dq>=C+gxUU^_vMbOl(sZCX z@x6Y~JtDrx+|gD)DxS@Zp6;nGZs-w0>#FKOw}F11q6s^Eu0W%BHZ!_#owsD9p~vp+ zWb{3VdVGfPPbg*NeZz(-L8!7bGQX8QS9Rfet%=xW@Cqf*gX>+y>f-*AHQ75h7rh8C*VqLR(T>a!Q0V0^{) zi?ob5U6or{`M@lA;w3z4Kdog;p?2;a1~c8x>W|K9kKb&i+7`>zT{{YTh8;Jk_ literal 0 HcmV?d00001 diff --git a/examples_notebooks/inputs/operation dulce/create_final_entities.parquet b/examples_notebooks/inputs/operation dulce/create_final_entities.parquet new file mode 100644 index 0000000000000000000000000000000000000000..30f0ac6baedf1f8be7193f051deb7d76e74495fa GIT binary patch literal 2271498 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 z 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

    2X{9vj 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

    Pm)?ucW=FD)$XY8 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 l-XObHoBLor>x$THS*K& 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ẅCwUT a}clRSkd;+!bYMfR}n%hagU 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

    ;AO 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%0ARvKk!$Alcpbt)OduC4$BBg&?aC$T95#wr)V^g( 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,r(E`}Bc- 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¨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⪚)SwG(lrT~}Z}bz$$d(0SSw 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]Nu;w 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

    kv%=nOmK|bq)HdpasQ8ZVe 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 z zu+6t$V7YQajtMk#3YvM-Te&9kdr2_OUH%_p54Yb9r}1Ng0;^jyznGtkFl_k_Ck_|7 zT)h29j4c4JZcaNL>~{N?wx=8J6L)^smbq=p)n8eybU^*dG?>azsS_4dqywd+jwpf` z2fipaHrk7N9Vr^867HXoZF1|E;z7OB1_*uk#+`W(y5sfqRRco6kF5B#G`g@;#xgYw7>0Skif5=D_YTl%DLEE|I5QNJX~sLHa0~MmX1>9`Z7m${ zPjBdg3FU-xVmB*Esj3~ay zL>H=@cJ~~yNhAGctsbNH?uiQ>V88D=(aFYhW19&H#hI^-iTpVsuO9Cg@*{ekoYI2r z%QBS|aWc|_f{fKpQZu`b*Xw9tzG^Ku!vXSN99|2+{j1OF4rP3Eu1+)m*eLAjeG_$$ za_5Glxqq+tmDME>cB+h)OqVlA$uHB;59ws#I0Vxil$vuFLYrOaG>gD^nVcxQ>276I zG(aDAJ-M(}gp<~S>rP2JK&v0Uuj(~OQv?W(np%59PKta@R@2fCZsFVTE~z1y(<5^yZ_U=Jf$~rQ9vWb@>Ndn>b4Pwf zOzls@E(RrgFHPXx%|A_p{Tl1~STS+r zDmwo1BgGEzPtI#@)knoN3zPn3fDY5m`LyFM&-H5Qu~+9BH2a3tyrzBA`}JmZ4>Vuv z@mXH4?c|oU^7a9`MySzr)?Db02RVB8;Mv5JDMi&p$hEOSxnQ%J2>a}!V=VgldV+u6 z<6F?t+p;CorllXxXOkg((o+Pvcj`V1xNFR#(54ex5Gr8Gu=^^brd70QOZLvootpR1 zP2w$yZ6c`B>ypu>DgU|7>BX5^pmvFvg>m}Sk|YG#0Z9A1Ue3BA*3FL{k=FDp5 z$UJwI)jTE5uLaH2XorHa-!J4Cyh)#DypVaric`RT>Ela*hxAvE2|9`U7E-@E4d#Ni zKn;;bwGgcw9Fpd>&6I6nB(e=<0chuDJ{(oD1wxm47~BF8KD}odN?WoAo9NbDLLXFbu!G;k0t@?T!o6 zeMdGWY-vW){I$0^{K3xrT$(T!303)2wz`BF0CY|5_ac74nQyBJq31%F@Brgnz+Qqt zc3)kaYhz92jx7DR4;c|^daJI?1e8)7!ppcL`occo;v}NMUgZx7%27NoO$-xZEKb<* z#lPgFkS!fQwf|CWt zwVlnIrf>hB+8|7>+Dj7URY7G+=Fxg(R6tR-66fZL3QgH#G1m&bgWp6sdM9(U7MF4b z&3sLafb{?UjswC;rqY17Y^dpAL;Zy;Tn!=d$J6i2OE6k9*GzH~Vn=hwX1N-V8NCfu z!G9y-CAi5PCt7nGSAdG=%&<2|PP4E|3;tOJecCwv3i82$T>IBZrRaK z=B?^pt+01Ql;6+6&d&N)Z6x}*nm)4yfs)rzJimYj@gd~(Nbv^l5xqH{2(!iM94iTUGwmX?yyx{4(|B7T`m0P;37)4Tek0oX*R zN6@Od6h(IR)PX2eH|W6;w)*Z5{Jk{FZD0Aa?i%k6?b&9Zg~ zie~eplv0PhCr*1uHs@$Ucc#>^vx&gbZGS53Y2Jq|*bY}d$U?;Ir}ZW*T2j#k+bLxI{j_2iji~nHlon%c{{DxWp4JIDxp%oIYf6oZ1dNHyEkJ!`AYNqEDJwqGHTLpsezew;_BJ{Ogd-a7A5V=3MV+??R zVoFkaN;CtCs0e!1M|$h%kYD$FlibJzL&zH?#p%N=S!i6gx>`l(ZXKMrpy@3PR z+|X7rr&CD87%kHp^5*p)DObX$?OZCS1b0Huw(`ge*`^RY-$>p;x?+fBQyw;tFXSVM zEd5^(anSUZYbrXa$)pE)<`})%Vrs`G6(?)W8zqg^CIXX&i3o>HI00Av(^K2>%5K+C zzdXl<9R2vxOoQ<3^~gS9Ppmuu(;ZIS+okq~J1dcW0=8{&t?lHC5K({HM5G&X$f?uP zAAD#v(q1x3kI{pJ*62T}%x7E)fji`SEW|GAC#GCv%eX%+B| zJPFT0180pEQ@QvOQFd$(5$gfd6FwH`;wc%gd|R$CRUqoRKD@c;-AIdt0PE^IwfuuA z+(m!kEeMnO?psb9Q}O;nwFw}^zYKnRqoiE(G}-KsblS2vNQ02_Goes@E?rWY8 z*CSKr%e~>@?h!TigdPo;Di1!{{ZZl?)YQ8pQ1k4yxG$4r1oDkW&sgQ$bHu+Kb;N30 z!E?+{Ks~=dZd;`i$z>3b#nRj+drk4uzup5!{ zA>O=E4w$4m4<~>?K_oedpe;o5iJuK~n39^S_dtJ(;|OBE5tk96Ubj6EVbNEt=eA{?%?+wQjIY%re97_5`Z_?|WVTc2Gb$q3%m$*>`#LEmrKgY_5wAtpO6>4O7K5at z8&YbTfwfp>I7XeBJ-A5NRPE6?^+@6L2)Ro$9~z;za=}L(i|X@tEdYQ%8d>wy{hZDb z4a112vzUZij?mioHv7}hB`tCAY(e{z-N<6+UYv=u zY<9xKpah#1s;OyqG>OMH=6=zynjX;y)7ZfTo&E39k;`EJ`yIY|{edOS(j%|2y{DOO z)^}fp3VQt_933Fp4iaIg-iDjFA_n@sX4ur15DWq-SaXx z=QyE;7ihYhuSI)?O!Ld;r8@-mBRmI=(~v5apI(FY&iBnVuT6{03W9H5d`S@vZaCTj zIvze!mw58&^NJ>EFy@9=h45RSz)=iFz5IyGW3IieKBkZuu^A5V+-eVmWT$rJa7Ov_ z*xH59jsXtvtxC;hXFv)8=6A?RfiNn^W1b*(T0-t&2%wCJcS8P$OHQWF@2d5Bry*Kq z_+9m2+zv0_HzNsp4^WrhxliEBhfDC@*q#*+2P4EQ9o{37WK!auS_xBRG;2y|hZQN4 z*0laXa5$Xt$v3EJy1`=o!)-A>JgB)_1xp*Jw{$5pZ_4@Mjv+)FLi8DHA7s11UP0nZ z0LRCH#h0$VyJ&_`qrEWQ-yfGt3e7Q^Ol9F+2n1P3=1>toN@2UUTe-W)XOoHKqDkat zyl^l;_Jpz{2&5`>0%3QwYIzh(=SM{~dN`e-R&NMxzeaAR#^+d3GmT}-_0SrJMCy@o zA@Az1PLg9xxf!303Coc!XntZ(Jw_t*rFY81>0i60>=QcoIbJz$!!O+Rb%sY+GCl(w z7QbQ+oFW}#w8jOqB3k#PtB%rB+LTtgu}n(V(Wd>P(9#)X?Aa-4y9 z^o)l)2h~&}lxKi|iM^u9;o(9=Xz#E4XS)T5tF|$Y;JPdp@7Cu~T1*-r&%nC<^%Tw0 zUx^GBe_X5+2A&k^j%(|ilus+1ZcX~GTFg%M{j-Y6XfNZw(9k*}&8jPPjg4+w@6F~# z`2rKOumRdg!HAYLVVg7P{(om=W8y*h@aMjxk>r#*mcoA-$ekjJ;mz$Yu0#y&?wuGf z$^e|moE`-2rh_bhLnBB@zG!Z%^6ypjrvs8wNfB-VBp1-vz&F5KFw2c z2?-ihU{u5aBJYstAkTMEZFe;!kpEAsFz3IYW;KU9^cpQ%H$o_n7ph_ z>5H=|U{Owgm!1k56~A#1bM+XfgKhMkCH~-v6D~&pKbIFGy55>qYK+>oM5&vc%8xl$ zv-etPB*V($hcbDJOXrCB7U`F6wOq}8?p%k18FMA}$wN^KkX!p)4weM|F9u}V`D@e; zrp0}cs|&ezop3u8aPe2f-S0ur_hjaLAK`$S$7ajnN&ZI6S9-S+z~$b0oz+Hp(9TSP z+?%8}VJ=vSgQq+E9)6Hsex{nhAg)onG<)C86}`%&6Oe4_=1pP%h&$oEa)VCQC7fJP zyoediXX_pKEtx+VHUus70yL}QZ!o&|4VlLsn60t#SXSy?Lqk%_&|`!e3>u^+L&2K+ zvWTTS{kc+1laAOE;QOK0iIAlHMsL9RzW)5VG38w`VbabY?r?0C&ssL?690$G5FBpg zY!=sCdKcl1ls%hMNay#*R7)p6Wp#)ragreQ1Bk2r@s=D$*cpOsnxD&{ITbt47t!A< zYB^!=zBAN3`hPS+XP)@;#q zqJCameMGSaWb>Nz&jo6dF_M}XweLpu*V~8(lc({(?lr$TzUCf1rr4>O(q#fx%$uIi zwTfc|$Gr-ncj;>%5rcKuSy=KQw0lb_2Cp0eeA$1j2a}X-PF_ntH$Thilo~P(ba~D| zCe7`)i@BOSym-_FA}ya*?y)fRS8e5Wg7eqZ_9z<%K{dF4pSOTcxc?0mi0tjVA7xV^ z>BfOq$~gCHUje%8#!K}cV({@-l{mi7WebVe@{7TejnhBHo|rFh&T^EW|850Zu%ejh zhP^uybddUdq<2oD0cmC~t_8)@)MmxrX;dC2E|Dvf7THLUA8*MeSa?_0(yr8Yh|v$; zBL`mf3N;pThdp@ulukT>92#RkQ;ir&dJ)e>GOkgz8dq+hw!^m?G^yX87PesWn@+== z2H9NPfVp>XJWpq7oqOEUEVubytq`F@PO@5wRIkg}^zZ%&R|dmBwj?Js@1K_io8%@Q z%*OGkrk1_j(T`;cObGCtCORK3RLc)4X83q3_Y)#}<^-!w$e!wH?o@{#+jS#xN9OHr z@yM~k+#OR1M8?_M@(&m6A;odcwATV$?yMTCA;i0^!AS@f?cguWyN@aI)%!odZ00FZ zV$a2OmZl87UR=;s$CMC+PybZwYD`Yu++(8JO8nO&Q0jtEg{75Op#d8%GH1xxjJUn)2J`-8a4KZZ=2A8T9{|- zqj!N3n?K0l`!&9iYa%3kL!i~gukv(LA~I*w|J3q;fcQ0}r0j2Ag~fn&JRGCzR^OfV zLv~A5QjUi_b;1P9i+Rb14kniI-de+)EN~pb@Rx4OaYMCdW;^Nm+GD2Njv z0whnI;FO`jNo(FQog};cvBOu(F>%cpF#ppjdh+I7&7DA>ZzI86w(#kGG2Uj(aZGEg7KXr(Uj1qSfGpby$mOk8dhv0 z3AdplqHKJeB0w``xO7pkIi%D~hx^(bhuU&6h{DS{tsA=J4$YoD7t@A_*Qd0zzduL@ z`ybHM0=33hSP1Vqb(uJk=I?xwTk)IKp?J3$5yH#`pYuB?3AgBfwz511>plq^V}H9> ziEG;O3uQ9rt<3Vt$^W5j<{jh293;Q@CH{$z*6VO4p4?dsc9>dv+$DPBo>Q7+U-LSf zh(4q(j}^J0UnMlgzk8X{+*cWYmC6nM{*T3Bp;^G~v{hpNrgznZtgHD4&7h!)ce=Jl z($d?nM`we}u64TZZk0YWIuD}Wn2LZJ<*Y5)BnjhnMp9G$E;`+s{mY4DZ09F&_68Px zriYB$7}5G1Fb1S@v(J`H&Aln2HfVNbN=*t!LA7gKHTIsQJ-U67VDa{_k3rJXXN+(P zvGlo1SG+7q61FVUCLWtpHEVitJ`g5e#4KH^7lh-yB!kQ*CX-$p^eUE1nlZ@X3@(1I z+?2ZC_DrMZ4gEnZNb{>s%kVmVXbz+L>oADi6-`#FGLi)){lkU6WCqiB7~Vw9J@gd5 zg@3F4kkL~U@=w{#m0hd~igCodRxhKhpDU&{Y11&kG`M7#-b9VxSv%A; zX_)O9erfJsPOlhpYirUgSwiB;gkRonY@7J`d+0qo@u3Ma7Zo>O_VEVs9%|qjfYbeaw{98U&BJA zpY`=NLe{T`3aCmyROvL38)p|38&2#2Io^EJf3tbvG~`gVUHwaq^dLTPqMQ_FB;$#D zs4XZ5{|mGQkBmnOy;GaAP1HxK9KRol0h9jM=fL@LPlfM6)C$it2YathX>ny&v{}XJfO^0eQ*5|Jg z=#})&MG2%&>auM#7z~^(SF#>$X{JuIe>fnM61p!Y+N8}xb4b`j^C)wm-G3>lW#0~$ zqWO>gTHmD{UeFUzD8D_HWoT!ArSfb9U6L(_-`f9h$Jf#~jntbb35m0O8n?&rPhdT9 zU`RUsro-hnM#D6TD?06?Tv7=}8q9DF+IQ3Q)E*Xp&2S<&^#=^>^HV}2j}>h=($w!% z)bH4@pQBNsLkyv`KXV+9VRTQcy_)2VcHBYD%A0=xO}4io*Fc$Cvy)WJqpI7Ei<)8O z{Ig3*Vb4Gse@NWvk_Du?x4efXN6jgY@(&~coOrk8mAykR>{ZlYLPkH6^MrLpH26T> z93zw#t@96DC89x4L{HM^y&$ebGNga~%|S7S{s6jrZ>-97h%-?W(`?Osc|R1;&$U24 zAH1_Rq5QF)`9M_nscMgA%eUtO&7afkv_p~ql}nT{FS6KUAI4MvQIV$`D)qWOL&1&3 zWq_$SP)N5|eRGzZ8@oYm#cV^p5y)Thkpl+&Fqz9F+$ly_A+fj9D2`FLiKDx3tZh)9 zGHM&NgJw*Y>*y!y5L0&SM?Rx|cGpOe#Ie`TvD(RfY3`=RVuJ{2>g%LKjJQ>{UtOBJ zrOx!PoNy;3T@}KNx~W!sYBBzo-{89n7PQs7;#v&*s`nr9I5zZV}C15)*ox ze*hsQ$}0iCQhar#@+5P!gq0>3BF`RrT-;jkOXWrGkIy&*>6XS16_-3fRT2B0bpVX; z#SGsFjsJ$sv^ zOrC3)QDu|vFnqrP?Z#izySe|fZ_P-7$Y2`)xFA=e=>y-miDxoUL}Yc z%?D}Hn|(4(Az($64M{UE6!ivZuPDX>d!3XfO+N>f<3cZ#-4Mu5zca&7A2Yi8DYuR? zeAb~Kg*KU^&jR?onp27e&A;HZ9FOtW2Fx>2wAG`f`;!(IeiAw2W=KlNj*=B)34F4p zQZX(CHoV(n2#o!86=&={x*dg2TaQ3x{ohmuzw;t1jqyw$^#L?NOV#Q|WyK}6y~@^g zj4cY=RdSP@=}|7hR5{NYXuen}wPj zvqfZWHf1dID%F^4)7<*~Xk@kjHtK+YXPT&$n#NlyaJ@vW+gp}!Z6yM7h(CGuEI^GvU#+1mB~T6>s34ttSv#c@Ld0d7ZU63X4n93cLuZ7L`9W67$U;)(lGx2km{qju!@ z*Etijy!s>lRQ)V4-Mhd zT!o9v+d_M2cH}Lw;|y(Pi!3?(B~Bex@=7kP`NkU-0P*uyRg2niA(y;W(Wc;EHNxoK zy9bDi!9bDHFN`UgBiw3u*~&xdF|ARX!d`#5nN=XS8BKdCTOM+F$2&zGH_(@Dq`3Sp zwo$|x6n5u>Mv8LqY4rtd`Ag^2q@szw(|UxTqsGWZ4JmfZzT7Cduv}*d8@~{f!S0-r zE#lT~iRyMH#{4^0waZv8;rt!iTjqhs%%gg7PzNDUrYjl{w(YG!Y1rm5SIBKOoxHkT zJx2=2iA z!UI;T=3oA$(O#ikd%q)T=?Y0KQ21|6hRekTApn4hLc!9zA}T`t@p=om8vPiemtOV=Y8h=Dx&!Fm{i__GcKr4tvirTIrx?aK z^TMnquriz1{ACI+A=uPrGz~@w=2be(Xgx%DV`9{#1O?p0ikXRT))X{1d?rT1tlwNr zF{JBLFhP2?t)2}0Z@dt!f|{yH$%zSpCcP&n+(Io_@hV{Q0D4cydhQ7Miv{{2)VHoV#!5Kidg@AqGlZ3~-K;<86cwVleM9Zo0IdCl3R7FKO4nc^NZ z=yu0B;zZ%xAhzqiM>FjYZ{U8tej=|QZO7eOOsSm~d|r>!6&!RdC}$2Hm62${ABkQ; z1?2L~Y{fbFJe*kOt^7GX$O}cU) zj?z0NY?uQ``$%I%^rG^Pj~rZd!(Lytx0+-M@r2bQ{=(wEFK+_Q#1nN3t;n{~oAi{5 zMjf_CE-r)$vMy|zHR)(4Lbq~1BeIwBcLk?oKlv|3N^7~eTP{T&;Z%?;!ErW|N?-U@ z1|fOt^iqMG*@uvlBUWQV{L|m%{oG3%F$?C%*|{!;AWVVwExc}dg7eHt!iYOPE1G4G zyq!kNM(80NPP@uzgP~ch>7D&GbII))5MuoYxOu{lAzdff+?arBe9AAo2-U|WnAN&v2skfB34ZCHX3bHL+&eI z-y=un17?|@)HZ<;W!CcAI+ZV9Alfjorr?DCNo%H65Tx0JSnX z08=Fws*z1WzZJBMG4c9UgZ$I^#MBa())awDRE=YRy4T`N&{g@oX6wd2y0XX+_7L{1W_`s2z|N z-hn)SBFGze-tKC1xMwepO#1K+HA1QT-?=uCFexT9|Ex(xpS3Rq5+;zV6Xm$@m4rk= zjCz_s%TPN7olyKg1xsMoe|7@)lW)iF*#F5}9g1KQwyCfDj%ZTtvGpr<; z-G}r#F6F9Y#O!XIIdBFpT5scc-xaeB$g8kimUUahi-__|`&wdfY<#40$tx-fdf*|& zws5RpO;R9`-rX;RvveI^WrHblDopJ5PB0p$iWtC&&`KqYpgrhS;nWiwqEpJXYja7# z{Fd4^^Zc{ z;VpfG{Dcy1^WS^IOp3v{X^_f-yw8g^w zCI()dkOeQ+tybG5X%jE|y_Ml$_L#`PKN>>SH8RoOV8+)WMkgFz+p4TSD5KF{^Yt|- z0DNACDne0ED9D^{%}nVndF_sIEBPT}4k2$Jf7^U23(etjT#??YF3gN3BTCPY;Fo{S z{dDL`i>fPYlry&?-a#$%yf{X=PQ(amt3WZ_8!)ffsJPWeBqLlPr%TvtDW;Dp7jz>I@amMznRWXF3(gXh326m$hBW!y}EZzRF+EqR~WI{Fzy8 zq)sk>SC2Sx1EKFzTM<+KT*rc8X@g(!|d;dD#}AwF?Z6dH!P0G_WU@oQ7MAIdSBV~ywxj2M5U~DR5&?`!AGN{5~xF{#dp0=QCPpI z+b_h+ui@Uz_ZRWc0G89n#(^hALJP_@D}|FWajPfIU;;#N^~1B|X2CRM+8H##7Vb)s zZ_Ml;p+u@jzXO?Qd{#n~PT4Jo1&OL=f4*Sn+LjKbFj(!NZ}tb_LCrg-*j*OS z-VxGZ<@q5cGa4CE(;@p|ZwMZB7rU4rrxs9T8kjB`!k4&EhDI$I%v*+*%V?T(%Qe{A zC?&FH|0K>99=KImu{ELhhj34~;(p6XUnWomQGzKc@U4Y>HyN z;L`t!R~RK3c0c9l;Tg{1j1etKW%?{iE8UQ&3$hSoh^F!pPIZh{P5EL?rZMbS16KCH zDiHL-CsAP{6ukh+JL@$d)Sfvf6ARhbuDw`JMZ1P7(gH&|i2g$5y?1_o)S^n<1=#2f)to5DO1j}Iz`q_ z@PY208~I4-@Y$sXq40CtwMZ;elh&joU#~AHXHDWaF)!IRp{0lb+!CEMnO5ylO*^cI^!g=>i zl{Y(a4VIhw6TNek2tb))G9o=ryKeo1a;p-IGSbuk|07aaqV|eVD~B_&;C-hlByHY$ zrFe?7@5Sp2u3E;LuXsOhHy~q`SG+x{Qw_?jgqo!5rFUaQxqnkOz;T@?#z6;vjN*>c zM{We3+#k=;wGlW&8v5(b9!G7NJN@@1a+CN;#@B-J38q_rw2)giPui3EnoF@l8|v$f#6JPy9}z|DHk1WcFMWEwoQteDq=Td&6p z2z0T{lUwRxxiUDpYc+o;op7|{(JcbgBnpxWR*LnEBHNgLY&O#Bb~f`Q<_rBRJjMFO;f?$o zAuWTyURfoll=Qhq`@R_KXA-#EUuE6@t_Ym0NSzF~&Hj4@de{eb*!Lb-3PX4^RgodsA)9TWK zs_(1>TmKxVhkm*@#A_z*VAHIYzCIxYe7DUUiuBL92wZy8kB*63^)0w(S4(O)y|IUj zKYORik+gKz-nEU&yL%$$?z)47bG3UyZ3_7ZUvjyO4qo+`ULYqr`mu_3W%7E0A@||Wa zy=s&mBNg`k1)__@UA{(-!QAdI93p%EJ=rGGuOZxJ=>j9cpX^#)iV+G9&Y&5QPw@_= z+^Kr=z6`nh(s4EKq9d_)?uw&Tly`hWtkd-OKGjGMP^w?rm{fkO$?&07@D`$G4q1@%H0g|2#Y8qv8p(A#8uUg0c%Ruu8pA&O&2Z15N^q?aLxhd(7RmLu z3|eZr3B8Hg!2K>=9Z^QL2xM9HC5g^!M;d-anZ5`J$b3d|K)cR6Cd|JuH(}%;APP9Xk7matdwdKnqYh@kyss@qRQa5x7U*Hk$h@ zf9{!asovN_@2(6<^A3LkSTt|WffC-J^&8{LKj)UXlN-jVz2$2yFh^`Z2g$o(Z#~Y% zJ+utKGF!J~5x|Mh>U9UQmiH_bK{_Q6ZA3s}S-93-Tdbs!Rcr`LkAJzC*4)SC3QwAC z^wcV*Xz|y)#;wQ$$ITqETb2@5?Xy|voA+s7)nkbIWkkhVdh~^4CpP_J#a49Ic;e>g zYD&vkwS9hrcr!tOo5PhH__7zvs_5i+kY{E2u-YwD4%?h3l#rdqwkcw1_fl4mtmx4mId)1-BdL-_P93xQ?$2qO-+U0geCb&WAD4Oa z8Kok3Ryxk%a+vhqsJTz^oOq&vnO3ar{SYn(i!@M1pJTy@_3q~3I*mcHVha#_;2 zpx9YPM^tguay8AaqB@fA({vC2f97Dc+2&dh`t@@%X_7vcwJ$-`%aZ z(O-2|1;sw*$G@$TlOfE><23-}kb-D`GFQCA%lUoIEH+JH;DC}IZ$z#VFIemjna963 zM~<*E_gV)O{9(a1S2?hIqpi(K%*LVgrp_#OYvy~etj=pc-9xzzUeo4GgCaE;L7kRv znU`yT4cIL9x!d=jtoI;Ev&UuYl=NsLH3!yaj1?h*{Q%?x$D~N$*_w=&+_^r} zrAc2b)jgKtj*Y1uQ}Udp8D5Io+MhgNVS(qaFKXglE|j~p^xH?H68@xrEQBn1p=gEi z@4naR)LdziNb9}0i|jhzc$)|?cbk1Py5#O#pXHZFKUo{my7q38Q-gfvMx*2skHmHN zNG5p&EOG-j|XWo2scKgdq?|(f)-p$Y8~u5`+B@Q`O67O?470dgNX$IAm45t&Bb|*HD$zY~=)eCHI4oM!Z7VHXST6Z#4AO-V}g-1KGh| z%tR(8tW&0g*`%i07{W+g$&rH52q?hI*}0>3v$_bFDl;1U&@Ee4WfO+JU7Y@f}7cZc^bW&YO_>rn2Q)a z^P=7~a3b^5_7$r!y?Z4NCq3f=UeG_|PyXu-JtxEM-<;FqNXPe~V($e0=bL}g;XQf% z#$M%~kl}@d%C;(AA0xgGUXb}yId428Cd6jsKovEA?hqFFU^5f&Wx_cK80$$SD8LH= z89LW$CX@20nr8{>xuuBaUnW9Q(50nSx%hD>wxYKN$KiUR7?hc5&u37hRZzOy>Cbn-C^wE!sF z_u3GV1I7N!F!vQ|k>fXCPCLz{5BI}bBUw(bmi~UDpq!+0dJ)+`T_`H{q$55R?Z|fD z8!}+R`TMSJQm$VJRM;o%X5}Tbnr0p0rsXyN$yp?<$kDm^9cqfPQe%n%(*TRyzVrb- zk(znsM62PMxWZW^j#b{eTNnoRM4Y93HJ$_Z-WrevoeELf5t#c(?$<1S>H}p zBP>=L#@YGJ&pN4)JK>xARsaL%MzaB9|5i~Y^w?mdeT?$RZB~;KL=6Af5KsPs3>FNq z*&KA#OXPMxJIHCLobg_r7~VavKkt=(lh|!>kIY5x9FX&veEV@#suX9KNLUR*e&sW@ z0+^4ztUQ_${BA3o?Z&EvW^PfrnDoc%9MpVSjT#92&h><(3q~{o&Hmxn=}E-%@?}mJ ztl!IGFw^(1XL<;L2M*#hrS;#TJLyl4rzkTDF8UWqViX9bR|R1AYy+`^NEL+$g5~GFvbvyO0J%xt| z-PGNWb97(ag$QD8(DE1F5>MAqo}_zd)M*q5(_BqT3PNUNDG0eAy}U;55C|ZkA8o>g zB_7hd#)$jHvfJxdogyytt(l@MzUEUM%MK6 zAI7TbP8nuIG-cRU z1kMHNsj2Iyy7(M=B~uNC6x41FsZ)`QKhEPw(vQBP`kJ|XLVc%_syDPfl~V!~Grd9L zE&LAxqhpS8?14^`CiQ)jxhd|G56qJr7_gh+T%=1jsT}8Ry+++grS4|5&b{t6Fe$Kp z5!J}SOWUo8;va9c?k^mFq)hl(jr`Wqj0G@%^ASoe;*BJ6lk>Qf{=YjR0yTf-%h9$X zI=1f#XiISTWXh`3`yYQGr-K#K1GdA3KXwqIY0FtbSoPg$GC~*m6x^}T+{r+KclR`G zT?s1YHYqFK;ccbQuHxH}AUz!lcl51kXQt770SA{|Rw^*CY;3VLM6`RZoYwqd_c+}` z8ihaP9y`HGQ<%1(gwCFEtvK4gH*jL!abGz-;X)X~aktIcx@ae5U=JS17rCFz(z~c> z{!e0coiaEtiiV}#9%LiD%ges;VtrcKB%;Y>LvzUIEB9KM`Gz8V6VZ}1nFZ%ZZc8Y} z{#N6cDY<)xrrGZc3dX%-mBp`vLL6)K7~SN-u4oZ$U;e3QP?xHCN7s}9kd?nMp+%Z= z`ZBpoxWJ^}rIRNpwo}OQf$}!Tc%}!t8>Ql zepp0iY)hkBX3Mrhqk%R_T5PoLBkUU}gIBJ%v3LH~sk+7)?z_9*WHLMDVy6`z@-?-2 zMDL!`GNYRn&rf?9uJ7`b#JgR;(8-erq{NCm;H_`)I9MvZgJ)|2KPn^M+E<&{XELLK zcF|$k2-S`g7+pjA0(bXKe<4S^o~WoJi(5B@*~_98#NKD{#?Ifb3A*Q?08Hd*1g;B$*l+do8f3tbTf2O)~wDRC{ z!iHJD6q_}B$_NMFeap3cU0R>x#6sp5gD5`~la}0Rr?T2^Lf4$`ng$URQEeT9Qn*-- z*Z91&Iq40GWYRfon^*s0t`KdGgkVU@mHMgI7&#z4Y!ns>IdkGsd?oRWKKY92lQIcH z?&HKcBUXB3yyE?3xF^x=F}_$yXFmz)fr@mGA*A!ib2uklj#8V5XPCuIvau}`ZisMj zuY5W~Zq?H5qL0qr{kKdZ+CbUhoTb@rRz5BgHwU+*r?rrG%7c%|Hod-|svU|uz1nP2 zcEyaguyXH_r3T8X?#gvgO0>yoB#9mHgx~IRIM~-e;gG$}n~SXiaM=e%q7I?Vd zEQU7?x}0Q>B=uoQuu}Dd)hQfOr#IvtaBZy|5j<9ouRpnu1Cq>mLafOGKZ~v~yiUA^ zHVwr*-SE#5%#hk6s`t3k5i{XtpLrke8c#uWsb+gL!>dhMnUyH4cQOsajN~F%ik0Xq z`4;eETBOBO9yo#>N+PI4d!S*g&TwK+tX6t32kehNk3!7g$_q^%E4|~gVp7ECMQ~)l z4@6z16jYQdHUH?Xycr&{)h1xq;UK!sZ^(p?q^%!|3-cfPJR8Rayn_b9;CrK!y}N(C%_OD}(O-jXhovYgzi^!eMZ#&G)(Mrz@2rBCmhZ3y>NQ)EQQWy&1#-lx{bm70dy zq%!FrQQHeQl}l6F`HNsIcv6bdlwg+OkB*WjfMv`zMGLx;-flz|YQdt~06L&0;;SWOUz1F!|=gD=*T z9{If`rcB(4xeE3+@=ehQlDgN87;_PxbWe+D-X7nGc>@SoxmRt`v6(!iTC-XgrJRF< z$#AOxejWbkrYC7t6#Ly8>osrk5mopHfakvQD(MY0=qBf0r9K+=p1rBp`51G2*;w{d#{<6b? zl*Xv5SErOCK6RR+y$pPMO48W zK4&_fh_ScTDL>tVLFJ1@I~9C*xjgf_m-#nBqFke3sv!az@kn9obEx%q+gp;-e$^c( zDzje37n3gDFUxy7goBE?m(kHo8~s;K1Oj6#*PUK;o8E9)xM7f*Qr?`vtc<9JH9q3r zQa2+He`9_=BQ69JAbxe+!+K|guHvLqDTo68!Y)+T-JrnobrLal4-FA6-Hd7AT?L(E zCVxafpvN!LnPSJu3*?5-iBD;e!GsTQwbFvnbvmoe5MuYboWwo3$x10fjnT@k(`zO< zdCk4#7^_!f2a=^tu**r5xQLXUGKQ%6B_?Bl$jAsv7Ar#hr59qPOc&~v1EL@_QZJ}O34OU9?=PkhVvEMx<+oT0|?Tgf!|K6%b%3e$t{Rc~o?xD&) zv(=d3C~Di46Q5K&h4IEpm`k@?0c$g-sp%2PkaGMxM)yEC#S$2ybrF3CXCu}xni>?c z$1J+HCKW9(RcqttdW4$Z(Y02c7$oK`8(L~-kVk*DGvtlEpn*v*9ec^z#AfMIqv=*6 zz>xW9pGh@sf|;$2EAe$)L-3!ADb7v}KuodNV$_wWM{y4slWVNvyEh!30eja+on8?( zSov^A7)xh&zMV76EO`WA|cppf_92 zBp~5Jet+C5p5r4~w}&zHN+&O<5ti0iT$ugAxxy5~@aT>EQCs*Di}2DzMr>x7};Z74gk5}^RkY^bz3XkOtcrPz9 zlCcn3veVFh5+P29VA6AyA@|)qpQEXxo5bXc*WoI-{{&eC^Vz9Rqvob|x0;v|6BqoR zZXOiwt&l48s8Y zt5f(bp3^?(8KQI0q%c;HH+tkW&3!>rIgP{as_0d2>PsFPwkMztV2;|LrT?Ck&1?QM zcZd==s7PHSQbtuexcq@{an?{`=!AXU?p9i}FPo6*QG!Q|!WhA^nIFVq&s%-LtP~WxYDQBrC3wv64v98^31=M2gTgfF$?9lw^y1c< zIDK40TDqlcjV6bcfOjw%TAA}P&uuU1pXmx~VyYGzHP@5QF)Hgt064rW@!OduMf$;Lrh$++8uJdkXAt-B)N<9+b@i)> zocmSxRz(W~qHQ%=@aQC#B$<4iRG{$zx>- z4E(!9515)U<`pr}J;=<_8zu=zto4G0EFN8yj;{hH5y}Yc0WM&1jnZ5_a4z*QQd4sJ#(=q z$I8raejugJ=?AaOv}@9|FPS9e$H!gA&xpjVo^WCa>Mzy&9S;EyLyX7P(T{_;1hsd*~WmK(Umzcv05eAC* zTMo^32?DF4P~FLq^!#hZ!%c(bCPCz8P=(zFV_*CWKGj=sjL*;1+S(^yT+Az)Zw;hK zCfvObQs$pb&uE|u2@hPa&vinP&bj!Wv@Uqn} ziRo>4=z?$O&J4dw8SqA_5F(-($deFIFrlTgnu(dgXjRif-8b?A1UI^W98Df2(RA-# zFf5xA>{)$6xn`1TM}68TUMTXdcC<3*D(-oP$rBv%9phS}g_@dX)g@?Xtq&J;aJ~Cm zhjNSUM(?pBAl$NNloHVf?Df}CM1@dF?FzTt?nTl)Gw)ky$daTe&I! z`zO_IEj=q-?4V(!d0Urq+g3G6o7CCZZAtlaTdOkrlp=^Y_6#csxyMzFmK&(0_&LLC zJlWsjFh?IIkVv|_mF(B1c_(tS?(C_8_mvJmJlhF1yFFLQtiRb{l=P0#Fd~%B{jaiy ztDQDYZRP^r%;YK7zC*ad>3hBgU~K0_04DwM641ndDQeY0qq2L-rf11gNq0>(63bb> zwjAX3-}=QeL(@kK(Okh|cQgj`_q;UH!k!OmaceXA!i!IGJ6(|q-mQcRQfI&-e8EPF8%ryEYt)WOwHAc4Fm ze`Ozam)?Vq`PSz;d2qAM&e&8@KL?ocUkd;kJGr7=3$0mI(?Ah-L8+_Nl=fsQ5PDs1ZSo!-h0dW z7{#?uaVz$_-y6vR$|=*);b7&nV6pc~Ysu8?R3|n%_)Al}wIG|eP=ehTY^+lzpO@j> zU$xa%%|7`FCxXB9U8zH}C#LjnrYBBblIdaa)6NpA@XErXCjM4!WC`tLEVQ|38c*jv zb45vFI>3J|zJ06ew2RXg8#27D102M>-wG=wM3?nc>A5F)H69gI59>V@q2RS^POqsW zT-~Z;_WX0-aeC;S*^Ljj|Jqrecm2-|NL%`b2m;MpWIW>B_xVA{`>J~aBZ2ljKrA(} zFTGsg+@^cEjP!x`lxt;9{NCb~lTiWT=>x`dMDCAb_NM#L2P~^0KU$u;C0&gDBMRH; zNJ2+)z2zsT{l~ug|FLxD0a4Wd|DUND8+2LMQAZ@*25k(?4DDl4d5qa4R2rrxrrB6+ zLZxA9(q&`02HAmWM%po^t5|7NR-{&AwV$xVu#@hw+`{a@>QmUKPyHV6{r>(zfo0}> zyw2zAx)(yRFV{g6uA2a*hA&=>c^!<&ZyKc)FA~{K;i?O{F>lQB6t`ERV+*+zX$Mw3 zr^6~%+~bT|^3V?b=(N!Nd?M1oziD_nq#ylHTbh)+KHx&6XAe8Pn#j$2W1;We~#d9gQh+q+ONsbz9a|@tkiz;Iwx;=An1Xx`4}>Aihx%f`kS9rxOYp}2)0}$78vKdlD9KgA z#q(nuAXb+|?}qI2%MU}6dD&h*_BB7k#ld&~WYF`cm#a;*D)2?2t8c$9P*Lx+4=@hx zyMGmpr_A}?A!B#Z7l}?K*ku&{i-hu>=xhJs*_K>LMfYoUp0czufq;6bFJdKp??DGP z?%f1Ug$wR4GnJ!us;!!PB+!LjBHxlIB){%^%cD)hjuiU!48Rl)xLthg>?If~$V@>6CH+MfnOF3+#W&p(mMykEPi~<>*j`=2 z?EAb<$LR|%+z3-4VXbB@IQg`sshRQXb#sIkY?_1_DV>o}+ZZMPd&b9q=?WnuhO_4P z{VB^=yl0H21!UR?1j~Q=kz~L;`DLn29^MmsT9n_(`%$hVz_2(-VdphgIKLy9Up8xoRc_Fb6fXy$a)>#59fTmm2Tp|T{cnb)s%bjqCPFIe zr&n2x+Qy(-u2;e-`SlTHy>PzVNi*rs67jF;bBSE2n2#CN*J|dxOI2>A_c|+3q!y!j zji6LZ(!x*AOIK^*Mr=HQ^J}b90Q%TjV9nL1rKJl@HE;7qR2Yd-~Yk}8i&BjbKKNpB+Z-@gRO0qnUbY7-Y^YyM)OffGr8c)^C@k90Y6C#Xz?k`u9Pn}L9U|;H`LSIi*Isq9GsdOpX zQa(+BNI;{e>(AdZm6|>5)-sc9vIeAC(^V-Jdga^f%RB!Js4#3Fl`Pi6dvB;KRrZYp z4BD_>g|@2yE##4{M4e93`P%dnDq-szxMc6(OmvdH;x31^F5E+%+pt<;8qo<<3&$Qs z`sb$c$xfm5^a^m4g)fsleAjcr_B2m=I$5px$9h-8H44e18QR#XfF(DiGF(UNKNJQJEFFidSX$ zl~J>s%vHSiU|FCnxZm+K>4T5;5Jai6XpL-=qf(xQ!`*c~GN<|off!SWj(uv)WbKobzvg=>?Q48yw=2_o#oQgFvdQKL_c zacXIKyxQRi9_pLmvi%-9+S?y&LM?DUcZYgNG~z`)4;3Lt5`|JgCsdk~KZsD09y^;X zwrEGRpf-XUI7x<9?>RHoF)7sC^;XhkdQxvIPgtU?SUT-FF=N?{l0wALp9wXhnTb1c zzg0_7K<9M1Ts*W4sAF+ai?-+G8eoj?Q%DJ13*t|%E?p_t3R@su5B%}ptl_f!Dz0BT z^1R*>kD!7bnf*y))cT11!UtDTDN_9zhJ$yvCg8lV?sTK+T;;K|Q#|G5lN@wR&wr`f z(oR12$o&b<^-!B-EB zDPDpK@7VkzD{qvJA~yPT16y?_(`oMFfR$h;b03XD1BUQjyGX9D<{F~!RqCiHd5p2_q6A; zWP8pbkQcYB+)8!}t)hwD_1K?)#&*7)ZXFgAatDnQ6gX0sk4q9u<*YHJftH~~c<#iAwMylRY7GHZtSYe+{70t0U zqx4i!ky$T?a$5w6cDu}(T=Ej_tQPJmtN*c7vzJyTD}>BURFIxsii;?jKXPBgwgA5~ z#-Nnquf=IQ5;R=8R(6%}Q{gOm+fNs%CEnM+a_PvoWDAW+UvZ$8uO?W~#%H%CYlZ2Z z=I4KZjBg^`CH5h0>aP|`?vK7EeJu)i+&e2ceu&Pg6*e4d#QfroR43hx%cF6#*Ln}; zu^S)MYmCDz`^^H?^@-8nwak+?6ouk-~7d@W>Cm;R(-^s_~aV7 zQ!_7PxQ=GNGGB~6z$M&Mt<1R7=+u;dD~>ic51EZ9)V+ALK}4seznhULp0h8DN`LYb zGSB<%Wv3-hjDpM8J5LzkbyYqboNA6>O)TJiu;=*;gsvJ;5cZPgQlNQE($4Zv1C_(~ zi_W6K7MXZE?I6z8McDH1A2Kl2&znind~J#25y9+%&cd+;-&5=f6sAjVzG#Sd%(GR2 z^6?$X7!4-cX-9US%7(r*>sDB^B+LRHx!@GtB!mY2?SyMBtTWw1~HQ{y_N7 zd~7=XkH@wmPN8qw_jo-=p92j9t-}+L%{~1Rezd_*^YZCJ9`xRk(=7dD+x3;u$H+>(Uy@B8@riN_~Sx9?qLaX+OcS>^Ll7^toXFWN|@Eu8jB_))!L>i!W6S zyZ`(&j-gKy$rdF6?)a4l|KQ85pC>MluQ(;|&w9N3g)7l$x827Q9?wshrWS{($Y6Fh#w?{)+ z>l$&O8+NOj7S264+fe7I&6Y%J865J{0x_9XYHI@RT6D~wHf32J9^5_WSfxFhvgU6k z=|=|~t1`>v9a`AAK2f1auN#d{w4|%doFLe7#9TzHedGzXSh!B9TH)$qyqXm|5r+8> zt1&5vx8^JDr=%o-9$HPplu;YAz6u7C*R$fR=7O4Nm`ko=&r(PMPo7G{ zNA5?|g#QQae>B-3;jMb#-Ezs{Hi|~=i1~Q88b}yIR85+Z&K^TGc1;df&D|uqE_6|I zegq{>s508r7ZVWEC1DCni`w4gNbvk(C?{)ZtgL9HdmkT$dIQ{qE$YEsk7fAztXRs=ZnB|g9NYtWY&D7&VmM>yLw|~_Qz4A?g3h+LAJ1`N=?QUG^C^J5KlWqG67V?wEeS>R

    JLHa%PqT{6)j|@ub59huA%>b&Lx;&1 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 literal 0 HcmV?d00001 diff --git a/examples_notebooks/inputs/operation dulce/create_final_nodes.parquet b/examples_notebooks/inputs/operation dulce/create_final_nodes.parquet new file mode 100644 index 0000000000000000000000000000000000000000..97772bcefc621f633ae58aa48810a95f4d1934ba GIT binary patch literal 54835 zcmb5Vd3+P)+BbgR?F44h$=%5`nWkwQW&$Z~X#qKd&Ebn`Cm& zeP8SM`d-(x$-W9BWfYB*THqJr5#r{c|N0OA*KZ>-78u1c<7eZHoN=6ST!D%H?~hFM ze_t%1;{WAc_>@e~grA>{!}w?>I+}@#KEnk@Dz6faDJC+ESdHrXe8TYVn6MfA8^+yU9w zDf-(xTxaB!v{{eEg-wSqRZ!Y ziawXC&VcW3bom-wV=MS%_W33~+&=bx_%Ml1WIUjdnBH*P4~E+jWV1((CYKK{J1~wm6@^^q~F}J*y{@TTNlWA2g>T? z1@1Z#P8w*;(Jh$?tJS(%T4b>SBm(=-Wt3_DfNOzk%nW=!x4-HkG~MfVwt~WZt+g&+ zz~9+G*ZSO2kaM@dZY#D>O&!uT9NgO5kauNqvugn;rqg#>3PVwM1Qe$2hRVPbbREulC#Z2G)nfv#OZPF8z z%WKP)rOw-_CV9|MIX`a&-i};&1!&EM-(!}U8hoyXR$piIYW;GywZ*+)_XBxT4dBq; zy4KZGtBz(2uc5)HOQM}eIk2X-M*N;Tb9FXyjZEjjb-)EygeOrR`JlaO0v^hsymI;M zSwrqiDYtiPPsJDECG7?*FyDjVd@fHXv#+WPaWZ&s-SC7VDetMyseZ|taG@g1|iJW+vL3xDuT z)ojx*OGn+CXI;*LJ zy;y980Ok&KS_fSw*P;LfJ=f@^(?B~A7QyRW;6|D?b@gtaKLEz)4am-bSO*cvcODwk zV!#Cvplgm(?towk;RV8`zs==T-Yls$1l%6C-=o}JCc3?_U_*z?f>8Y+n&xcvcsfAa z{|>OEl0kLkFPa5U@N1@ZRWh6yaLJyET+~!Lz_1j=N3xY+$C8rk2Uhm_HD~71Aaraj zXprj~TmfIFbZ;Z<&EMt*@9G36ae))K{7Q?V!`tj_T{x(n1MV2`7r+vr=ngQ{s>7&Y zEG|QY67ed!BhXROCXLtpj5>yw75D?78igRVmv|ea2}9#t7Zwg ziI&bQ5bHX<;5bg#bHyMhKja#*wYI6`QRJ6yr~U4h(}DrE0h=8DtH9eJ$^lQSe{>s| z?PlqI<}FHWlWQrjlRu)(`2@iydSE~wvz6t%$ZUEuNu+zqD|X)Y$$Wtkuaxt;Dd z*K*us03k!B9eIy~(AnX4eM{H7$Bs8nYC|%4H4AHzhrkb?t6JVBc?%Xoo&qrj+y^Il zT?-*kFM_};Egjxh;Dr|u6B=x9LUfjWqTJ$c@Pc%Nex@QWHg>kPf)f31{yJ^Br$F?B zIGv!OuDNFmoXrhBh>&&oDy|-E(T|@q_&c0Vm!Ds)#q-m(_+bMi0Jp0iZ&#j1qHP0+ z(y#0^_~8a}i?Yq&^0oO~0h>vhZ+irMy|ux1N6CEYAno+IOCDqET#z-&G|9O!h)L4J z9WN`}jE|bYVA}v`4BuTl0CI;c1&P}$V~Yt48!RC}-qu!kWe%56&X&{vLVj{C3yFs+ zSun{$ub0AZ79wAR^b#_8B~*gl`C}QHO{m7X0;X~bPwIEOh@IV!PS8yJ7Uc022a zy&jsuKf>U?k;^Ezi~ON|YyqChoMWA>buP_i%1IiOGPnx=q<)25(vb3@zO2wGQOJLM zHrD_E#1lS&jjoxRYmq$k3*;^1B*;mD#`=yHvGvq=Y#2G>8<$4p`!fE}kxIxKI!|3#|KO){9V z?jz$MytBKPrU3;+~-9>20_`8#8HeZzR;&zb*MSy6?G z_5Wi&ZU4y$Cc}Sl^M4QzAk%+?OgQvt=C^15tFoZu2xnwcnsMW4Mw`XzNH(YEa|}iy z*OX_@FDSH35GCuxNw%WN#U-Uv%F69ir&T!4n_gKpW9F>t*>mRB%$qOQI_q5Z4UO)m z<`$2)wXGdowPV4;MV*V6EM2yI#raBCFr;?(^oCciibP}azSW6jD&4w-h9oLYqxH@?)vRJZrHi&#+z>5eao$ThWFlf`^dii2M*qG z=Us>HzUT0fqxar-|FH)ieCXjv9)0ZbC!QRA>TgdUf9BcePMm!Hg;OuS^ztjOzV`YX zZ@%^R*unmM2mR;Yf_KnZae+|L*Hr~Z_P=YWR5%q;|5HOfw?KIAyrSp=sbZN1?kh8hZLNt3T7ji_4Jn{7F89=5t5CsY9ANIBd~n zHUFbaDmBpeU#fg+obalq=(0IQM`w<4@oC*hFwU8PNC;$Cv zD4oF5o>RoWcuI|>!thyl7(7o5#$zcsg_sPgF(na>i%LqYOGkpLSgRyeyC~zuCQ<2u z@03-HGpTEP!(HKTXEwPL&**K;6`n23i86j(JF?o;p$Wo59*5Zpf%?pJZ~^j;8` zx)wGXR%1a`GgTUA>Paa5;nV=O;%qt^PU2&5kCfP}#H6e;xH_RG``}37E@|@ou$qMB zf{}Dc71dZWonSsl1(h_MISps->r2FyV6T{p!$qKrWS<(um4;wE8coME+lu3{GBF*4 zyQvXeGp$F7z*)mVF*=Y;;bAISrrE=(u^y!dOVY7M5TU3y)plIfnY@BD%k+gB#oGTb|%slxkNIHXefn^Zr) zFP;P)z^)WA3C6C5@Dw@~Pq^yoZY3zy;m@da4DT)m8;ZzTBq+M(z67ErFP~oI%qT#rV9Y4vYQ_;BclJu)I0VOr->7H;9-x*Lr zdA%w7UWi%&Wgrqyh|WZM9d2~INSVMJ`y$GK^0uij+#gRVk$s0LR3=@is0L8{IyGd| zZ@ra@^+=2HzLMoAs{HNXG#cE%cy-AE>4$=-0!9Y^<7#Ox6-+5ME)@syYCd4qwQ6GU z-NCQbe^N1V^J%O)KFchzhVQexFl~p@YU}+kpsv9>{2QByccrB!E*|R+hirWS;uXz8 zN{QLNXZt_|8Z(uOYZB6*Tp74mYA}ye!5oz^O@&l>6MWVlk-A_Qx0Xo+jx;Y zm+MJKl!PX{{dNlq% z*l@HjviS$~YHTPmILdKB85r9dWgscVP`~>Fq&(Dt`VKZ6d_l9a{y>K3GZwr;mRh)| z8tqckp{{e|#uR)*M&%8z7E>44O0+9HwAOa@v~;RB4smFpOa#4-ZdBd)LM{;oV^%Mw zQoRy0DY;7R8;cpqsNI?&GaQ5?HBukPhc?R-XcboSJ~mI9f%;DWj>4yxcX#072a)2w z6W1C-35YB)&9epwaLI6D<9zHr^_BDvl@5-Mt2~>w(I86sYbqX-{%(pYDUe7Aw=ky- zeF>!}s*FC!=hDiTH43$B8A^sp|8fc+J-uf8irq`5!QtHC{^@8G0(tE*e7dmwrnBE0 zy2Cx`gsMqj^esJT-Du&)Vq@8E9rNY(mr)u1=jnr#5;;4(F{Ap2@pG5jo~OczDrbiL zliZv>iGQS5sRQ;`GeIADOHBi6N(9G0eKXasYH9}djvNhp$r6U_rq{bsSiXY_uN%Az zZ#N{BZZ$RFdba%gS2lRE3heKKIoBoZ4r#pf8<@F$Rx-pUS=8Vd+&AhWqh`EUA!=M-+Yz9UYhi!66!t zg@eg5>%H{oW&A^oAqwG8=^-f^KY|ys2~dcpM%u&Jm`0QwnNN486J#bWyg{?caME7* z^t3hc#HyqijKq^_WPrJ+w2}rx>{Ak8Aj5C+PiJYm2KUntE2JfOwfhIu1*`;Q)Ho^6 z8d+WdxdZZHG$~(4b*a_MwIE1@`iX-OJ#k2!YP7FcAqTWzI+z754xK%*;?&)o5>on7!c`2pfz>>Xx<{X<;@uk7 z+{cvPuInGZ1cFjkHf9!ZDaiLKQ-8XCSY#n>grpC_V+Va4AOSTY&!u7^+)HND)Ib@o zq!Mc33G=Khl*A873yQvA*^mMe1v7nAP<^GGPDeu0BGk>_qmw>CDqd&^17t|3WRRB6 z+qJZ~D-Ky97LS#y(TZGQgBEW!K&FI~RxU)7h0jFp&du#V*wm%{LJn|=g0Sv+Y zjqm4i(mhDswTwIuB8u>X#G=(68kI)SWF?OZrfpGI_t1wpnrO|mt)POv_#E*vR3diz zG7u=AM-HB`zC^0XIMFV)0)|l{k&W~0)hzY^EJ;9=7*Io!4Jql8Q|omPa;wvj5~O9W zHVTsU-I&rGrN^@OW8ps^dWJV@rMXBc>d3}b5Q-qw49`aq$0{PPE0=87bCBr5F>+Sh z0$Na&{&*s3p9db~hji)-?KDCiU3bUuThikYRiGF z_NtP*%Rkxr^66_0;4qL`5AC9Z16^b`2Ztqd8PAC3W&99308o!yrgJ=@S-F?1x*bD6 z#Bb6dqR zN0-0rIp=x`tS=0oCc+Sj!qz{C>rVT5nT|MA_G--fHo<#9O@M0RefUChgrWMwgOw=0 z^&$xPD={s%zOkRxYW<2*&cz|fMu#);vPl4Bdeh0Ul8o{xdgG4LN3!gXaMBGBE#qX7 z?)bE-d-eQU+SP0CCL@285Ox6UO*l=X6uCu51NKrQjxERpDKG)y&@sZuf3v*AQY+)U zpFfBIM+M_)(yEv8k!SRMKq5(T%}6EhWnQDMU5mVE|rWf=~ zfg*;$`_#!~JWYd6qC?CKQ;!0OCY5M^L>X@=Pb&TW1MPeG#hk$Buw998NZpT;VCY#2-4|=N5cL z@eNrhrE7)gz0=6wMCgzj;cv@=@YK|67|I1KVPyoo6ZP{AEWU6$WZz!E%wm@cNLrPw z<`Pln&W!YQ6)y4#-U)%I$r*9>kd?=nxtrzIa948hiPIrqLh%IO@+dz zOHhzlwGjJ+CK_8cZ43NH%~7!Kjtj^_9Wfb^N``YNCBa7+^G^oo5hSerMj~Xf;Ou2Z z4>Pq5&J; zS7Xb-*N2C!raa{u*T=-3WqB~iBJpG#Z|DU`D@IN~CKYOaM8Sg<*lT~Bf+SSghEm7Z z>8=xI(%gU;?^-!HB;0SpbBBF+Z5h-=5I~i#NI2QsexJKMk3!7P%?cJglXY!7yHjlEQqg z32M${I+7v>OqQf!WqZc`Ey`5LFZHuA)fGPeHP;7RflSt!r-{u2ko0O3N+_ZZNLQE? zC|cD>sNFfTRP$0-KPqkKrA>eef+WuXiEe)m3+CEIqS^c%rs5E+(h^nyZ^rP8oF}Y^ zPBKhJ{YV_#d;A;~j0^9L**_3{>((Lu0D}|~%r1S{NL_)_cTWT3Z%KobiVffZmL0kF z1Lk)wLP<-Bw)-q9{WC{QM&nQiLe+VCg+(jfKk_*Wc3oXia~CB>VW)mI(W6RhC;6b7RU=|uSSi=D z5Ol(%ff@Xn>JIZ)7p_~2p)3H$6CTOulIgy_2>B~t2~C2!A)W?eB6)GgikV(O5m2p( zK1f)xc)#tOvhVbGb1IMjl5D#eyBZ}K#e@sF<6n~NbR`?`r8Lyq@&$B{dUZ5RdjL(g zWm5|iI)g+`}h5S^wefljFrqqPyc3KJb<0uO08d2g@HVHCxFuAGxqDgX8jeuGg zs6Cdg*(_L8nmk`<0<-H)#QO%X*|83>z%7RO`-!xEtjtk_hjeozETqjCnVbb;(9#Am z84re4Qp=;&m70R4cuaxPGv?qj3V>?p4@3H}Jdl0)Um2tzkF;>3_dy&Z8*@i*r_?BU zg1{^OFij-~9p7PtKi=0HR-_>|6^^OVbtuZ02ql)QvN*gG3APqyEt}XZ#ZSXm#Hqx{LZoM&kPQ<6G{s%(Y%F~=ddb}2uhabV!B63 zndcY=Z?WXFXkFFs<0dr$?~shg#I`W`!y4XluFL>53LKm0CvMPYknhZZyz{aoH<_N# z%S5`u_6G~Wx0~F^QOOG(S7nqrl>}gY(WgYiiS|ugFMzaxC>T=t@lAu{fdb&kz1&!& z**uG@1pF8grG03#qbOs#3{D_6r`N^QR5IRw=yBm` z&hc(W3E5VYNoI|40B7WCC{s2yT@RJKsZuPc1LiCw`lG~Hbo^0MzuFrP z0%!gCwo6b=BQxsWepquE*=^!))uNz$`S2H1EP1+KQ%HU_lSsDiLf4yQmub2?sdTBJ zTCqV%1jFT}RBxC#ChmAuL;fj3CO$Zy?NgE|`|IOqVBYv6#*Oa_Pv+>B%4^B{*+6xq zuB$Ai{3&HT2UJobL7vOUGm6D@q6@gCHA@nNQu85 zYBT5_4Q=2{b-ORK?$n~8%5eqFYClBw+64K!z^0+13h81|)NwODT9fg|)O0VoxPTRv z)oH#{vX^I|EspXGFuya69FT9lv5FmJt$|X5nZKOY`NY$y<}Sa59nZbG-@} zT8$1k1}Wj3fNrQPV0{CCvZm@$L^hJAX_Qotx)yK{?t^K|0zuIaE?Rk`#xhq+Udkpj zw4>SP5zg`)0|5@`IV-u*S`Y*BIhhJa$d;0UCDH?f>-k060#)II) zgHw`8HEFw3c?ekC6iMr)hnJm4T$9;wa#hmOpWPX%dVU<$kRYxJREuf}Gvv;EO96Ao z6XSsFil@jUJo#2+dw@|RCyO-AG9noGCm(Ed}fx^aI}vq z6*+RmU?>Oaz$s6Z$#u#qvR6l5%_rCDagv`2L2bKZ9W}`Xw2>I-jYs>ot|jk|kswei z1s^WYw#TV6&k#GONolsRP!R_CC$uQ-ItzTnO*yuGKrAL!0eO9Sda20+^&->U{zl)0K)^EQ6AB>N>iXB4W@ua8O^br;FZq@p{E#wA~vRb zdde@ZH@xlL_$WgDNks$Eo&UEAoH_G7ZDb+ zlwTdbl}#u5dd*K8s{X=w4jt@GZ=8RN4CIiSINgc&&TNE6=+s8Ju@&%7Qcds|nNPoH z?#&_HhGHe1fVdKmt%J-N(6K!#6jFChMam}?Sw&$M(q3{Rgtz;5m+v9>izr64grvEW z9LsA)swrL+)e#@N{aJFKeQ#Ljot?GuE0p2|JNbArIbKSF1ytmk&C8LOU!|u33EDeo z4)|0ca+{8xB}G-@&rW<1m3!7M_}>>@{1mt>3fq3xg@PR*kL14F=H(yzVMy%a|#t z@x;C}v~@-nT4P?Mb^K}-7V3ndQvPM@LxG~p2)U@3d}~389s0Gs48lnNaRJ|rSR`KQ(jjnY(GLH7B5t1p8lPn9cDyq8;^^#Fb z)epF!xUmD~Spp?Om1Fp|QO&xWP)BLiPbNAMkLrTvKXU02grZTZO*vhOR;~Ywj~K>^ zi)sTW0uK}8XXH!|g`uO9gsxMutF^AA!oTA$oo^RK1IfvM%N_qvYBY91IYShN8MKZF zXTCSzKu98se4NEW>q$-Bl4t5zuB-a)NzH{+G%eg}T26TKHzOGlik{A|T~8V+@N`!>NQ6(83Lh3xVU@4Q zdFM;c581xAw9e%D5|!_rmJJ15^7JeG7Glm}Movom9HWzj>vg(Co^R0Jj>V!28U~O? zQ@!%nmG>9@$|_q2j+?~dHh*Vp+ru^tJV|#Xt;YC&OlPh!bg58JhYvo(#=$qMS0nT9 zCi0D8@IlKPIZ*2KOflZh0Uwfxo9CFfU8)CWN{A4$kyiF?J!L!Wk4DQ8SuLmF~pgd`6)uIgRxl;Z{b9lf26>TgOuTpb} zpan|GT*z(6&Tp?JpK4hpoaiFsr_LHayO~WWePLqJ6PYFd;7M^or%VosR3uEYCsOe> z=AX4iw-!)Ak+jnMg9VpgjU1O!WDbxeJu&Nng6eFIy8Y1AD4hA$7g4HMWMJ_u z(l(KwY}j-;Dta%63PO)6*mx8bSXS=Wcx>N;Qs#(qxuwLyiNzk-f94XkYunuv|Jz()hh_L< z%`EjM-p&bM3BZTPgca3PH*|66fR)pU04 z78BoZ*wHth9M2W5G5v9d3~Tu-CT;wbhC2Opja(>yNhNo8G?1M%`EbIrMt+Y0PcEv; zDQe3(8p-VNkbN}yl?YpNNMYSrz(_0n$61sZB0CGr zM_tDDn<=16t|&R9)m#eS*q}RgL>R2Jk00-SQOCxUz3HkI!JyHot(Nl9qv2+WO-s}FWH`rT7@5NV_mnnO}fu~5pS__V>CMcr}7g2d={*+ z<0cAqm)=__e`;&6}!^W-SU4MmNk<>L6g^nI#OR+W8EFLF^B!Yx>Cdv@n%5 z-zU@S)Fi*SoUE%RTh5~)|G)7pc)>a5P~^J;@@3U1Mr+97;@bD{a0u$IYiFQ@#W|;> zGJ;v%FnHB9Fo#8! z@u-Zy&nmc``a<4fse%(8wS2iRzJnq29zJW@0$*czk(t}i@RbuFtLL;88O zl;|cWoB)q5x0f))t+UxdUhgof0#+m@T7-4G>f^l;tA!-Gq0V#P(4i!vs7e& zd_UU+bp-I%$i>%|WAmPQ)HV3vCta5btQb(0l4(EOH2A0?9ScMITmV0Ker(F1 zjPDc3IfwEZK4|@sA^YkycOBG7f7afJwx{qHKn$pT3je_*Y2q)gs!QjSyIiEo2hGxp zWU|Lgg?p;5!kP|#au!kNnm1H~onPU^SK|b8mnNG(QiBHULl{)x;pSe$FP=+o&H+AX z+C09&DSR;#+bKx)2N}tZ1~gAuTbuDJe(!uxOkrzhEoILfbo$o1_dYzY>Q3zXj(?@0 z<{(D)(ueC&pE=QLd223z(kYFapJ4e1=b*BZ+0qnJnse$=oE2C%c}pEHHO{ zg88X)g|;SqanUVg)|VPLZ_th|O5e;^`K2P%NFHn#evn6}2x~q3azBpGD&Rhc+4-< zni;Kh!iW+Monl)8jP{yb{`(1eH$fL^i{4Ok418BM-!fA!v+S!A zN@)BnZm_+Ae?W@)jtLuOn2R8XEMoxoK_4`V=GKnM|qgTxBF6nhB?Pu3i^e`cF z`MeuDkl|NYu0avb)|I@l-pQXojoh1WeU+1aAU$$zJxqowslq!+#}v&R>mHGuZ6X~m zL8lX5Bi1jb+V4lO-wi0X0qHLv8L>RrR&rNCO+E<38IRRC824w@!nC3f80b^#hE_{2 zl1~-_u~fRB5gw#@n%F92gu<53>*=wwaHtknn>i>hEY5|n>eUFqwJ?k3->ofrK*GcF zTyoTf){`r7E6+MkdY zI#O%oQYC;7o> zzIh2ME8W~Fe@4EqhNQNBF?r2X07wOB{!}khRd|qG8~}GWuUZU~E;X~sZtbp1_|0YK zE(G#nzrgRBE&SbGa^5>@$iJYKy?G1j9o~;tSqc|RkC1-Ce?*ra;s(#ah=}zsrfU>YHM697);Y56Y5q+{`oNNM2_BkM(&RD$GT+5CIm+Unmt8dYHSeKuT7QG) zq}7*)626X1%{gIJV4!1guCUm|s-c<|{;$PVyAgj;9gwP)TsO0C<*kSXo-<7fDbik znx7%;(``IawW*$Gw3dNp{);SWM!5#XEIT_;nfxw+-h^tsvwp0L9FFkwI08>J^b(JS zT;MO-HBs0_gC9dL>){$8RbZY^SfFR4@nj!q&u;4AtfyK2iEOk67vWQR7at5l-<^N8 z7IOVP0SF%aQ6q72*4OK+KGsQZ(J#nzfe=$f8aU0!AYS~Q}r70zXkO;3HdV4C0cHf}b5G>`uzr}mVV zc(W+`Ir9rfN1*Ysdo|7W*EMJ|S(RVq4 z+^*N%=522h-d13XXJ?zMYULwa-?FTkLRvk-gl6e}*D2}BF~p7L4*gPe#*6p;rsc7OtDAKroI+4Cm=KlLuGo~9;v!pV|Is{%ozq*gtlOW&j8M&svT*9gTGTie!cHo(1|?r znmUo=Ll%80FFLL8@37sKh)Kf?26;^nXs1D@;gJB65{HI`mr2DhH9RG4A^S=RW%dL} zdb#OQsU;uG<|~c1-%xM$ZY@5{q+xDJ6t=XGBjuyhg%=E{jJ)dsTR+4M zt{D7?F9?8zCdjpQY?m4elWPsgE}XCC?d7Ltf!4Z(l`{nU0%^wX4S)@Zq!+$%lC6 zVPQN&jxw5NQaB$pb^4VvcbwYOzO?;$YmpXE>?7UE;HGMIXOVx4GTUj_>{+M$1prn&)EL@mL-7zcX)yoBN4t$Z@G= zY68;iHMUr{JF@(q@zxPKRUS_TYha%5SkG-?BUFilpS!|mdJ`ZmpC#oTW*pn<$ zjP=5Y9a1$JPxxi^0wU(vqWUX+Xo+q)umP6x^Cb&$(c}SvQWgFWhP+wF|4R>?H#|$x z?J`)#vHD_iJ-{ilY6jNp-liI{Wt%wkt5xDyph0@b4Y{-kA`8@}+-GB~e&De7M ze2p5~-6H%g%R0V;%*^4x&awWHC4>x?a3R@kWh63`Z}v{$vxsoJP#T{gY_r*Vc%COt z39U6xhw&1nkN+)yGod?TVLTt6v%GEvN}es``IvNhWuLH=;2h~yiG$icsD^EwCtj5_ zquIc%d^4RVv^-vu15d+*)`P=&trjbuPoD1}BM!2}P*iLMEX!ZsEt#P*JW+{4MWt5K zNt6AHk(+RT&L%p`B=l{KV9i{jQf){+-JU!yXMw^zQKF@HB5#IvjyKnnS4 zg6&N!l{YJ8{$5%zUyl~52lC3v%^d%&jg(KV@!ABcsHCz;OXEjJf70A)<`ZOR7HTG6 z7ZS_)ygo@jHjyJMhyDWcYMJEKi`F+Rq>h!YEr*7sXFmJWMWtUIdUO|EM!lI^5s2 zk~Z@KJfy?-aQsbX%cI(=6jqJ&Lb&s1v)NQURpgSD)7O&2y@M;Nug2sxli-WW^YIF@(MNLf zX_y4%nMs>nc!NEy5nj^URW$4*vwW84!a!c1E9dW=j5;eRQZ@@%wWnFfV~C%jM=7P| z#4{V;wlz`eTJlB+pwafvZI{edEF9;$0RU(q%cc{yblDaPxAFXQ46i0XXpj|0R{_CM zK4fPu9TfQ|vdH;f$zpz|OA?AWr?lRBoG5b(KN!`~FmuA|td2)TdWYQgXPiIkzIrLkr2zjH;MVF_WDe`-yX~$;Vl05R?P;qta8Naw4#{#mkK;f z_>LRA1)naO$LT-bT~E&G__dbNe^{1iO-gj^IYRfjQzAST)*BDQK$-Pg$?+%VPv&@* z+WrP9G!Rqw>V70|6}k7Kxb7igwpF;w%ime2e!6^!B==WUw481tqjdOwY#wT^=Kvz>OSVbSVT@q94?a^J9-4OP2hf}xA8KL7mlt@}7?Mh4l( zk)LK!DYfZrqUwfR$6uL4rxddOAJz-=`DdmPFOQGaUNYYNVX^QB#4x6b_mrY;Aw7jZ zRthz-c@0hOnxgcQFl~OCmVvge2GVE!(}R+_2d7~a7HG7nD!dRk?w0lwxrqNP_afgE zO@xXh2}kd`hmYCH2}H}0uOuz`$V7}RIl0nvLY`tAvu`3`M~@+*B!}_U87s@#T8eZ;DN6$c#Mu5Twz%m!P|=7%pZK1Qi8&3vwwNhyaqTR zv!ikUU2pwmmM?=8r6~es94QU2h?I+^ARc zq4lv<=02^k*EFj{UO`%>+Tn@MMCsoPh8`$!!vL^ugpBe4`#R>>dhoO{xO{lcV+>Gv z+scF`{HCXI*9&N9gS>3G8pY0F@&yMSyd?RECQoSPXQXWNV7YE5SzSQxwgFiA7r8-? zk`;omwa@x-nfb=G|EIUP!oE6V{n@-+lq&gw%=QA+>dE3KS;?O|(CVJG1%O`0 z9t&Jc*6UnHE)=oF#na1!YuOtwf8LmRh4PGYr)>SH*7v& z3tQYOvJtjoi0ghaH8u!>0wUgkEL&H=0570|sT1B(Q!^{OS!ro$S(!QAo1${E+e|ZE z#_rkZR5R7sOr2@EIOka#yoJsA|9_g!`Oh!)AbYK~*LQor_kG^?d)K$tUa(^@nSkdE z>t=`4H5v5&_Gc(fOANY-TzPvx-BqxhYJWG&d(UwPawldH0b#G?u;w~nb! zSTvoIzM%E<@rZZA1A(JykhK#Q-}JE+`y{%VT--wN)q0aL7Cu3u|`uLOL!{WIG zf1tIwWOt^PQmFmb72naR%zXju5@D@e?`pDhkH{!?C(PVx*jL_`#)qRkIX-J>Pl2B$?;vCO> zNJrrC#GLey794&KSy7a^Jb;|#i~>?oH~+AA9QmDasLiEi5M3*O#j)+}x!I9GLh{`o zdAXbmI`@!=Yst6aK$#D+Ypo<%g`{nk|Nb=pV|vGwgN6+aBRlN8xWi% zhX+Coew|Ja|MH3Q3OGdbuCL)PiFG$O1^xXz`?D5QP;jmM9aFfHthG}qE;l~&!MOA* z$*^zI;OE_!tPLTTd4pS0)2|;CtV#&n6Ta{3^u;NZVLjsilyr<3lR#4q>#z3TI)vPm z8hpKD+mX!oQ#2~Mo!oIwKs&brp37r>+!J898uT$A_6@U19^{_nJmYTA(*2wKfwvNZ zHzrA2UBTGIF^!4V&-@#(sF3`82HG(k&to;39U4+wc1x7uA0MU=CP)vwJKg_DBK?|F zN9|fPx(dsXHzp%Rm&_F+>$!(%D&kKVNa}nyO<@!*cg33h9t@&k{FRct+zCKO&_wp~vbYCy6PW2}RJV=raUS&Jsl7?hh zaO;n$t0Jq(Uwq)1efv)PGnHIS7fIhxd5d}@)IXc^<|PW0F|nh@4Wv-xCrgad#8LpYmn;fWn(E)lS1+mu`HV5MW)0J z>ep~s3y9})HS`Gr5`8ajx`i&wbGagK*!k2pojhM-T|@8D|3Oo+<+YiU+sU14krhe? zk0wJ#VyzyFO-n;^dO@Q9ruh2?XU{Bpkg5y4KCILX-&PE#WYYu>0zHUtMLvFf^s*rX zOD`a=Ngh0ga`uk#8 ztI=O_?xDKKyudBq%m+Q82iH7XbBX_4AIT*29|M2yKkZ%0^%_MuDg0fg|EXFSoq^8k z<>M)Co1~|N50CNG&z=)0AbM8kjbyu5qvx%MRFgLXfq6svU1=Ls)SH#hOB&u<-_Y#; zd2m?ec?%jqn}&Z3>@SFWY@l9j=LzDce zzR&~y%<-jr$pcALi@Wew3Qm zM3ak!4hs=)m@#gH|GQBx#3lQNkzig!KLYbOkIatumxtd7c4+p~UiWiL1F_gpsHEP~ z^R}enq02@Rj0@ximX4#STy8H#fB8}#8J3M_lI!NBZ^|cI2>Bq68Xl2uDZ!!ae68GoO6a0Is$nL6OhX+qTk}v(_&^hEH6_e+h+ClTUWVaf5qzewuFj#;o^}p>h7i z46gLD&>C_p8<|30>O+nU!-Ecpmz?JrHpaIt)n5}&P!a}Os&J?WF;(${C6|08 z0uP=CHD8Bi_m?|!4?SxgEcmo{;4PR3AN4e88Whl2GAk7hy8o3RS+m54C%Wd7@iW*@ zxZnFq?+8BS&wG53NZy%DwIpkiu_w8BF9JgyxFcM0XK zu@_On;hw-lebbkeRD9eEe&qtl+#pdO)N@kyy2yK)5j)ps-nA{@d=D@P3rh3Q@N95Qqe zS&Q6}_#hoe0;!=G(m7?#JJ12~cQ0@M!g1T4Nr0*$GY7aUt{+X$-hT(J*)4Rs&SrLa zZ~rhw&mwDU=rS(WL$2;e{x&49WKi+v)SEKp{f>UK zXlTLiv_to4Pq)vfUSey>r4^-D2mdl<{e|fVkqL`qA{S$~l>qp700uCRHJ_{dk}%AqjzZbmaqm*590Cgoh0BU~dKK zz25%ABZ6;U9~`+9yt6dNd2}Q~uRB&r4Xm^-_2-8sZ6UX&__zC9EiLKIgGpO}vI4Is zq{pTtyqNv=H7;&%j{$uBYp9uaMA_%QwJV!AkIbEGJpjiYjYzMU#hxW>JTYAIp^Q+@lF zWZHwd!&Go=`n2<@tkSRb(~jQWn@<166C9ZwKH#PA3M~$O-0vH5*(fZd(kXPt_-S+=Rp4rl zA!Rp*M{ViY6f6t%t2%VsnhNdfyp%zKjaj5E*ZtX)n1Tr85oxF8RVEefw zaU_D6rfOT4(OM+dpJI{kJmlEa@GySZCpXf;^g(#^CGVYHczAizA~Hl66C22stFcMMWRjm2e6R1)gaLFJJu~~N`Bw$7o7X(TXNOroJ!I~4 zR4eE18(5n$JZH?i{r%Iu{?`Zl->7oW8{UUjhkq(POy@QAC5v0g4LQiwAW!+p!2V;t zqe8>ycDS|7RpF^m%=I;>{<)Y}^Ogj)acgctuDyRuI>{M5Dc+Nh4gdOa`xk_ElG*ve zj)bBZSN&}NY%9Dx&b^X6NCLlzi>#*@5-1P9hI`U$yNavOUlLb~$C1&zX9+E7C~5$qao-ekme!@qT~*`@YB= z_wvjO)BUUcu>5(=6rs-{52XA55sDNR+!!Oh5rchbjCt7h1eA-cDWKmAU<*X#ADt69 z_vnoh3im-n;Y=^6bmSQVH!#?@>EGS4g6Liv}(`S39Q zf`q!{L!oy2Em{h@kZDNXPYsA0X$4PH%}HIGeu=kYkIVl~od3K4xxkx#@8AX(t_2OSx3zd7kGbph?-|m!BPE=T$wkz-}p*8bT8MDr%$G-ONUQ}jcg>JK(n??2`#m_y}^;|BH4gbkiJoc?;`m;s~D zb2p?<8j(EL%BAnFc~cT&spSc8hg;Gz69eVf`ztQ=x2DnW4xIaNB0bxG$vDdDoSHr~ zjx3+*RX~Tem+t$Rx_H|)@W-02A-8xPA5!xV9!d5MhIPu{2xIZ*LH<8v_{R>{wmS(q zE%nxbU{+?+GEXyT|EFUD{nEC5h!qSo1(B(_n?1EO6`Xuw-Z^o^K4*9V{U&wo$@G(Cs0Cm4-HN5mk&G2)uc zicR!z?l&paw9jTxYmBWzMEw9RD*)z5Isdl>f8oofc(<=Z_ioElJr0 zPF$doKd|&%az!qf@y^U7v&Erw-$atPXa0R)iV_XXx=sGfE zqz`-M%nR-vPHE{WWnfbg9vLR@ufUo>;<@B$FUeUzH4l8U;5{Tt_ogPVT}hRf)9Vml z9fBu+9mQk5*4~bbrULE5f)F&{f@2YFP?!N{u3Hv7xu%JrF{tFQ} zv{LBp)ExhaJ2fjCBt)9i^u>&u_tcAd-d=sYDV5VyoEs3s0njN@DYi z?tPYEwz~G8ipDOnb=5*V-G|MszPCl#@qNak`-DZGX~$Lz*n{k}v=0P2ovn(ns-J=9 zU94z9nrY%mdOYLWn1PjW{E1qim!r=+MmG^d479sm$iYWGA|CI7kB*(6GVnlrQ?w#@ zLbMebMH$F;MZ&M;1Vp>;$}%jzXsEKCYx9z+N{YnkDlbW<%;6HzkPS;`1e@jbTw68;USSlIvvon_ z3{w?(-4+=`LXM$s3c0q4+UW{@ur;S5bF9Q^xRYVBs-a4za(P#09xJEu|7Yd&@baUD zGS9HAsmh`z$PA;gqNXbruQ8_08Mw8UYsrEoD!QavHpB1|tIDdxXqLh0xKc22fpY8$ z`m-zO>?^3D8{UqgxMPpT;Qz>@l#DX6%Y9C@KYKK0Q!ahXK>`R);Si2MHg=@2@WyIzB1GToO*D{V?mDOwMWcsrQTx%Zi zpr!LZaQl|ytDp6XZRoXZC$;pMn9!R`37rJ5nv#}I>+Q0XrMJ5m)wt-jON*$8xfHki zE9EXa#>dk4ES*8q4a5`7x=NcK!vwn}5NFOWyn2l0hC<0h6?kb|0HUaZ@NC3ZlYm z*TtUHdfu*WDP}g9T{`cEa|2(K@X^(=;f>$LI4bYQXyq9-$f(p&WvRZX{zy-Pyi+Xg zrg+*tigP|N&MzlNpAymgm(r=rPV4>Ey@t|a8qMH*zAzNOW6#?|Qz>)`6-&GJ^&ddR zPAsN+Z*wnw1Od`QiHeQKq4-%;Yyx#@eeCuGIw^l+R#Vo5&BLFI3Gd!`YKL^~ONmYK zx;kWYOyIhh@FyE$!&h&>HnS%RK4Y8q(5a1Osex#ts$E{nOH)2?Zx@xA;Gqc6JHeAo zQ*?rtO2((y1kWgB)klAvonf6HH1=2DYiydwc@>89bNUNNdLG3kb=BR{TTQhxD``rI<0!@0Cy}NuIgP@-!QeN*xkEks&!3G?bN9jF5P$QaLU{Mx_MUjCaqgsfpxLrUv7#GKXxUa|Nf6x>x_N1v485j2`AoLav*`Cuv9{$TVlGp zhH~LwH_!_}$59@@3&a8OfDcFjoQ`!mI00hz#HAPdL_!oUzmfP5eV6aa<5SfB_f2F3v;Kq)XDm;jUkC03z^{N`11|%=0e%a-0=x>m2D}b6^E*d<;OAi1KaQID{)Xgfp5rG^ zS2I12;vWB<+=lAt~%ul(Vwx5I91c9dn$ zZVcchQaz7SXH=G}7p1P4dqP>R7=84285jkJTnelyGd2TaZ5x^_38uq|IbC6GS$3`w zSXQ-7Mq*gT5LCg?G)A@sUe$S?w*^CVt}%Iq7j;l&Q&R*qL{&}v*0GO~Xfmd3I@d6= zY;p<*LdhzEs2jS@g1qyxs_`a^Cmfw?K-%#qW10duw83hs&VZY0I%g=hfE~A;Ygkp2 zZB7(4(Uh<$y`+IU8>}eEVEYVbTJ*uimW*5iP;QfFO~C~Fmn;x#73`PM6kE0Eti`r$ zv8>KmoGNRApeZ2Dh9s*TxV~b;-JrADSli@nP0@8x13_1068dF6@JuXs$znJX zs;yg+W-12mp{v+u)M89tM1iI#8+6HH3wL2Gl|glRfl)OKvVb4X=6KC<8&HmEsc>dE z!LUtR5a9&ay2k4)ZwNeYXSy2~s}jB^8@ix_VB>B&D$nbxpuxwnIYvS`Xd};QJe(v+ z6&Qol6p58&LzX!S^|4emS(OC%Nvtiw!x3zg(;3C!EE8jf>KF>=R7GVqPLga{l5_#h z)EEhljj4%>qH6-<-q)rZjK$lG<3t#OrR(s3WStc`T@p1>;)(_=#?ZhwVK~J^&)S*_ zKME!28l#z_W^yduNOv}JEUQSeC89>SvB+`~4}XN^P;U+OaNIFn=P(*@JVag7AW4h` zU(VnKcwBA_jtY6@1kthtPT+MDod##ggwvu~3Mb$SPUcMrfuT5#9t*dLw*-+91liO@ z#j=XNXtN|ZZ=9%FCi)U$t6G|Xnh3gT8@458k8QI!8>0=^3_d0Xjn_CsuqC*TxJr~)K=bGu>57QV!3IHD*b1GiF_EFQz78a#cl)sjS6M-y4wMq?yMiG-;H0fpFDOzD6& z-4-l(l!mDpm|upWKr|$QM~7O1&dAyIZ9E)9Mu(WIHY-4u6$R5sL}@G}*IeHR zyg&m^vIrNM(^=hSRZiA5R#H?2BgYynqe8|EUSoMh&MtwuBU?TH&sk}8ES&fuFqA_ThJGZ zVB-c`ab9K(UXc`$;~2qkADn@yE}+wOXC4bI<`d?Sq}i<2>|q4i+PRo#dBx^co6`-r zli0!6V&H!pCOQFXLon%$P!N~^_^v36rVuF;MDzu^Rh2m%+Qq#OyOF9Ek5?O5JdesN zkSasA(OtZzqG8^Rt(3B=G0mL%QIHFRV;PM@Z$eCT?O2APB5=V9 zikY*g4cf~xWr>5_VeV_1DjEvZEan!cshXPo>S7K0z`|_PG2;c3;nDYkpzzQ&Xo_km zp^PjZkp&idMUb==`K*lr7ZIj_5;sKjt^3q0JcD;|2WG3|IYDfe6OHy@R;S3J7;Y5rzv+~j`ff0BHQlM%_o`C{Iw{ivp zg(;f9@wMqP>ZCHb7>b&O0TEPu&*XR(22l{Q_h7P12>3`E6c{Edq(x+8SPsl&M4D8k zXmzD2;!Bb)tEP!=wb32ABzJz2B4hemw)fW(+hM*WQ_Xtgyn5DLj`=E<$jR}=|OjcW|z@Eac z$|71ItHPmSf}k3L;b?IiN``YcdRSRF^gxJK1gK|CmnBh=Ar;~wJnQe?mjc0+3?uT4 zV!~W;s=~4?L{!&1^Ie8iWVSilQ^E~ZmBV1e(12k;y6_)ni6o+%SPLDm!lD~ch!{{6 zGe>|dz?7;I4Diu522&lHS3!kYK^Fw@5zKVmfX2a8WsCALl(rICQf+a#g~9U}A{BMy zWDJNUN{&!s^B)!6gs>S12{Zr;k-^(-SOm%x_PMqsg!p)ETjmrIf+8x86|kVqbVTaZ%SOZ~92o3^%ifN(e(S9*I zLlAjbJ`wXsf@KpzE(W$8Aw`5gLDy9GJ`X0AHhCx}i!KWgC5<5uc#>oeAwxPX`_(qf zluYOe@F7`;S~j8D5dXBH4?vDs1KQAFSm+o{Q$Pb*#5BPvAefLy4ui|MOWH&UEC#~> z89{6oy$QjSc*B-p3Rxa?Xq7<@ZBAwxOM$Y2-9}s#0Z@e(Ab{4IlqrZ^B6@3!(2$CN zz%9fCn(0t_3alks+p)b3y{>cMj)dw@FfXU1GwqhWM{?UBaZoPMV2mw;v#A;btz=^0S&6kR!CjJJaU5(1Ynb$Km(3E+=Rpm$5}z$F z=Ev80FxxvSXNWeeIKto%LRe-Dn8`!usEW0s4O#*A$ih4ppy)x@p#e<80#yU`!c}6P zDT7G2Aqg_{yCm8e2aA^tj9(zjOWE2jB+EMm*F$VfU4xQyc%!9>AotlBm9l|5Kz4Y@ zv%sT;BCCm=ToS8*69x`?FM_&aC0iGvnII^J0m{R{{b2ddyIqXoE-8cFu^1K;4)J%~ z0a{VT7QXQ*DrlEtq7H4m!GO)6NX~-ffQZSAfo|cU_jyLwiUugq=Fs$Tb#xm#itF5x zYhbJu6QOQYBzuoXwm5n)RGtlk4}*&eXc%f-U}G*Z`wzF-3=d5VvyKiGpjy${P$dj2 zV_JYZH(WHDO=$dLN2`q{dPD zj*lqS|9RXD6)OZVKO&?C<^d}XkUMBr>7}+ZnKxJ)%K@+~U^JkLU{M|U9$B(FztUE; z8PJO=X0aqGvH%mV!g{HwD9D>_v$lKV6dqCzrHbVhcp{)hszc+|ZR32BqT9Qw+rUr^ zLk3^A&;%2!C>G491fqs}aIBg=7K8?jgac!-(JD*TA{VB>l1d`8?U|f)ZCF$hZD?3o z1SLcnXb09AOdg~Syom)Du}u&Wna3Fg6NfS2xM8IMs#JiL<~i6UOi#!FkHr&69HtHE z0(ue-m~3KEf_EQm6W~E|vL<3(hJ#TvV0GZjKrtgW({celtD=bOW+T-t$#LbRfQPFeD3a)ImK& zQ81yEb=*Ke0|gW9;5b{c@u(y^51s*NkhP;4OZT01K9CJa{7`T;Mh1CfO`~J2%Mx}Z zL5Hd$g^x#Lin>nil%IJ1a}V z0JE9_1sbZ)hl>b7u_YcZ2^@RLT6w8pvOE+n*q|bzj>Jv^Wr8D!kbz?axzhYB1C?b( z=rofIiSvPyDdZAw8Wzu>i?qNf-&m}r!7;}o7zY{w0n_x5=8{DsC%Ozhr+%n~wsP>$ z;Oaw>VBrjox&iHIiAHE0W{nNki8bNKh=R3aajpU43eR28WYKnK_oPESkOos z?t?gmhOQbQqQ-EAHEnGM);vWG?uB@0H6?b6lwGu%VPqB#FvJvZ1Q6)=Q{YV^qCpz` z9;n{H;lws9EIQiVMsxy{3(8E!V8NSZE#Ab$g}jyE`j0eG}XhdDMx=s#4} zv0UgrUPYV;b_~-6CYqJO{A5wZBBvp(ycCMap->on1P26$F%--g#9lyMAg#RY&Pu^_ zfd=#E$CZJ$$smU?ydVo291_e3_eKyT(eV{ERKOHE?iDl$7z7&?hcuZ*W-GcDnh-RD zh5H0+1sB`|VPQakKwJVPeh)A5WVXLrH()tI%Wxwn!Xbd2VYVANW2a!bR)YTw9xUnt z2aBoN@Dd_alB60Yw^C_^UyL{y7z~s-6fev$1Xcmt21!=b;7;FA&7m0JeT>DD+k9E5 z2LlBTHPcy2DcP@r(%@OSp$OqHs*H$;qLa4dEX;bIVc;_}M_Q9$5p0Dheyn}%OM>gG z8HfIoW}5JYMPb)ghC%R60SShm3AQr>OhI%=0c;;+Oj&t=Qb;<9+fN*^i^dIFXs zvdYJR;sx^KlN1{~ds_rU24;w$4aAnwZHBxR=i-z=WfHtqxIZ!viiS{4$FDs29Qtc$ ziN_Y;sVKZ@A&dhnfM}w?GNE^K!Dkqamo$W{IR8d(D`Xrh1k1}Nq(e$ulI&ajU>HQ4jC8n6S`H67-D9 znF9GT9zjRUVzd{G0`#pRtpv;Pk|g52Jn(-JoC8_W$V>4l41|K=)*P6DxSa{M1O)|k ztcfs!&=XLegh_NU(wa+?5H=Cn9i^2l`W_)IFkMk*6v!*Y47QV86G-B~z${W9H&%w3 zbZCx&7zW~iyeVeCn#DpriU?IHR>xEMyo`yeAtKC~V8bwG?h;axP=Y^L@L^b85PkFy zFPh{oj}I10gx&KP5Yoc|kHpH6*Ygp+lQ;-BQWK!eFug3i2}eYP6gR<0K@~$iX`;bn z@H7qcJ@~e#4VDFwRM@YYXy+xFFdG)} zrcvy3Po^OPh9TA>Hln&@*C!BiVo4Gdm4c6>BcG{JuaC`n7gvkIdOL=@oEz(`>_ z!QQ#|RXdy%jy3cJRG|nT4z4(=-{}WK=lP-mX`opkLXtMgWeDUIUk0MRh>4&s+TDSd zk=yGF&(-u(+>BlKIf0BvAx2CC~KrK%62jSrkKp6rhIz?Qj7 za*?zmqFWGO)5Xq5vM^s{c=Cv5_)`Me^+^(jM(He@!od+mpaJv{LJO0NNdceJ-8fXk ztX4ta;H#2O583Rcpd-?FOeF+2idOsJFqvdsUzf&gyKNK)R)*GKA{tQs2LExT4|7H& zIV1yKiH1OksE~hnk>0sE=z`DnXaaq3fRno;!!~OfSzsqHP>!A@za~jGd=cG!a4al3 z!rV~XJk}ksn4s|F4!oy82h%qoN7kq|1tAaQ!{*?XdSi~9; z<3;ih0%TBQupXi10}v%MIfUE2B}s_8YdR_FduVdLGfwc^O&C|?=CC@O^A!R(78ooh zgNksDZbWDw)RF1-czBcF??dsBMTiPy4UN>$uA!z5J!jQ|#+2nrly3H06x|5yy{JH0dsQCHET8%tnt3`A35L=o%|5qnSs@^;(+ zOb*0_1g$7P1^o!8vlB{D>tx7=B$C(H13ek}wZFtWK-3`bnktZx#|IZkz>7Gtc&r@2 zAw`y1AUEmIFEb1nXvAA#Z7TX8qJ$nr$ilWb=x}#q78E#A!Vn-dB404DwD1lvCt4Jh!WpuL>s2*jA|j;oR^kUG_!g+x^)r4mVBaPB1m@ly>xq^6;DV&q8R zMISUC*gB$vJYrfHpf^2fP(^TPCC^FiiW#K)mL)WAk>21d^Wv9a_>@>m1YO2Sltc`+CSu2|WNBns|NoGJ^sC#^iN{lr@F3%& z(-M$g-0liLb(`y7PC%kkW6CfOC_iKt|0boTobpy|9P-dYmov)mD zTex$lu@lQ9r4`O4lkr+_=e^;m%T7A=hSL)09&!)$96z7tIes&IY08wr`28wg`u#*r z;wUOH@f-H{9ZBE5o}7&2s^onX^2(@;!W62H+rI2t)T}c4mUf!roLW+q7cFQj#lLRK zN!_EuAKZP)bcpXtJfC^;wclUG29CytKfB8n{>v`c0Oax{q)?U7D{e~+xUb*S2tFPI7 z?RD4RaO0MnZvN4qmj7sn`(#E$GF}`y6K_Pc8fP}oHcvh+-<=@w&{lVN)4f;;j_y12 z?@5rrI)7PeOmrFE6MeI(vrvsC@<3|vl=c6Udmx_o;2@-U_Fy z4UgUB4zIiGUvI-!DRq1Qved)9qC>H<|JnUtuvbR}C;$q9u|N?}42%OxfKp&QFaan7 z%7F@CB2WoT0;+(?z!YFAFbz1n|I7dA{a>ixK?V*2ZvbxsZvk%u?*Q)t?*Z=vhky@& z-vft%BfuYk4}p(>kAXh|e*!)MJ_SAl{tO%iJ_r5+{1x~D_!9VEz~6wcfWHG@1K$AO z0^b40fPW--KL5LmroG8$w|_!+oSpvv?Y4g!h5hHEKlgS23rcacck0)@Pa_q_Po5+I zj@j>d6nFY6_KUyK-Mqp(n~L$I|TK(kKj^(|RGE1(@-?nUJd>U7O@X2k< zFH6iQSe+KRb;X)KL#uXHciy`4^1h6I;JV0dtJe2d=6!Uq^R~;b7?i)v)30Fr>MIAA zY#Lhg)b=%34XM1fwmkm=IPtl-zd-d z;K22TcWk)n+_t}b^v2V7Tye{Jm&SO5V|Q-cR=C=qQ~S)$D{mXOF|+iBvAZ_ym~b7} z@a8kSuDWC5)`B&`qC2nNHF;;%uG;-~UUS#5avA-|+K`5AJPv>z8-m_~7jKpIXy@+&x-&5vL5)n7h->)Cs6dE#eOY}|m7JzG1Md-@EUabVB3r!Pwy zJbp{beYftvJdL0A_JR9ud-jTq!nFfR_ilggs-ctboblY=9WPwV7|(Ahz5n)?Zd6+S z`1W)6-|_2P@|VXA9KUbpZ*D8OYS;zO@7wjt9hJ9@ziIr>?|kj9>icKC^Zd{6`rW-3 zJ-v3|ga>xNaew_QcV6(q19!jm;GEw-f765q?|J9Zw!i-IofjUw_q``Bjm4{bAKG*1 z>D7JCx$wn@?)&|-8wXFgx$NP+M_#y&zxdr3AHM&?UvDkEJiYvpeILKFbMjpmzVyh? z|Ma^(hBM&!3BUT=QwUh{%$a!aq}A5VoSB(3yGZ5U^8!z1h2MP69lrV=hmiG@qaTp2 zGm*-E-zJMxTCWzP-fGfPGmx{I9h2sca&;=z=lqR5gd44Fs?1@{(IYM=lk?OAr|zM9 z>hY7iOrCc1#8!*Pk2*zmZ#mdie$U;tx=Kc7^{L;9<_II>7GM8+mREKWsstMiRU85djK_UIO-++GKCWQ~vCy9So&vlK{t90OPI$RR=V2rx8 z!zm7gGe$j+o?#!b@F&tqPpWG)y6%5qTHpX5{tFx49?dOJu9-M>N=fn5vW$t9Q%cKA zCzq$CM8*|WOv#8uswP%slt-$jlvWhgo~eixV@?(k9p0`Ip6V6&EnJsT;k}CEoVk%% zTskF~ii=IO_}3W`2@ zf(tY84hsYE$4p$^Jilp9`-u~?^;wqD>Kt#fTCv+>tA@)j!7CGRIiB@#zB_eF@o*(` z$&!sGJ&QVV_6xMz8$1UrWw=wiA@_Q$L+>%f1h~Bf@(@y=krJmrzJxe|9)Q?+g*Y@5$ zi#&P!d*z*w%G0OKiNpU)SbOZ0+q2v=Uh*SWp~37~X4kRr74k366z7@6o+TYW`n|GF zbl!iVPrvspV$U+qaKZPAx0>d(wmV-uz4$X~!X7H<=n{mi@hx-z)cD?BX6PNj=Ly z<0U_CE!ujP8a?#AQvQ`8j*iXgrX+gk$1CDYcJmC@7b5a6mKimf*ebhq_PnTBZEVoz zY4h40t2(D$n>TOvLZ>?ySo2!&5+3I$E9NnIOeSpJ@uE*T$>rg{%q3KsFH%)Car(%v z&_&uOgGM+%=hT%&B9Tde^D`k55h4Y3k>W_CE>c(*JyuX~+WCdf!J-rAOCqIRpYc0- zm*{yMTNuIj@Ne`c&Na@L@KXa6EUcL>UR+aM9*K-?!MOstw5f4^?YL<|HCM4fFPYY= zH0BGDPZy70(`dApN~OiE zxSv?BPoL`CW4<}Pt);9m(ooyf*r<=Ivh}9o*4oLqZk)*K;}$yi>8?+OZI(1HjGikT z&+1K$xPMh+X~V)g+>h0(3&d)^N;Jkf_l-2@-1xb*(<_*+^K7Fzt{82qsxO^2yUuDK z->5fLET|oab~$w_96xPZQBCW_!tts-?Xyp7ln5G8MBX zH8_2uPoKurOs}dp#}%FED|_-nr~W6)Yp$AOj%(}ghuS$9gNv)VjT+cRKt&-W0X|Q!JdH8zUU!uh2tT|6|;<{#)as!1$slY zKYn!C)0?NY=p~S`lG9{rkU)u5^w48S2;LnxASsAs?-J^|bj~b(PpPpL)t! zk892(`^~t=bZ6dm$s_ur)hKB^bzU#1!Ares`2U3bH&r#(^5Yx3<@XHp@wD@28qYa; z^CYgKOTNz_|EJE^)Ah&?jOA?1p?bYhZLggUoiiQ!VwyUq_6PMvJ#=L8{A#qpnd>#s zAJtsr#Xp(;XzDJjspps;m&Kn-&J3g#;t5e7LKcvGTQ}xEU zdb@Ty+fX~b>SEl#`G;ix2d_QT9B6W6{`frVssI0(-TDD}Yt$VZaB?1a^yIf1*146Mj}W-o_Yq^TO`2T2x?HxBsBsJarEK7xXM^I-CJ^ zyb(NZfzbfo=Gf42jSWUqaXb3T;c*MC>Ba3vlgfAL&)P-5#e=dmBpFG;t z^yug4pO*9I_*v?R5sLFyLG;cQ$3GVpM;ldmvVG1)kpkyv0i*K;C;S7w30%{$htcz6 z&%yo5M=Xfer=Xz9IT$gbr=ovGe>px-q!zr`;UC@HHBwnAj~KCNmh*j_EsB=pjE3_e z`aAl|IakmO`BI1CnCki zukUXE_~W0u+uzkIr+nXWtqP)TUFei2FFIb|uJX>@UuWhIPWffW%j+(`^7!YXAEi7v}m;BT?uIaQ&{EEu& z)aam>INv-)expq*saRlEkDqm7yi2FxOXozK@8jZsKHjHu_DG9Up0o(RPOa}5$1Cb< zMXOWcv~R>z=hr_eFFIAa{UqmWX#b?HsSnA=Nep6*Gwb0Hcb|0rK>fStOSBTF%$Ml> zy8Pj2f8zTK9nnM=MK6thH`-~@+eAiFX&H00d2{Dmt;3BubB0HQ2pQc$f{d>40hZ>G Svhbh!pGpd0Gpk4y`@aE7U&DU@ literal 0 HcmV?d00001 diff --git a/examples_notebooks/inputs/operation dulce/create_final_relationships.parquet b/examples_notebooks/inputs/operation dulce/create_final_relationships.parquet new file mode 100644 index 0000000000000000000000000000000000000000..320f9b25e6c582c6fc785c0f6f957e099a3e899a GIT binary patch literal 20389 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 literal 0 HcmV?d00001 diff --git a/examples_notebooks/inputs/operation dulce/create_final_text_units.parquet b/examples_notebooks/inputs/operation dulce/create_final_text_units.parquet new file mode 100644 index 0000000000000000000000000000000000000000..e78cb7f89c173a85bdf2b7d1d846575060df4332 GIT binary patch literal 94690 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')W6Vrq2LNt)q+b09Em5q~~4>#P2 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 GraphRagConfig: + """Load Configuration Parameters from a dictionary.""" + values = values or {} + root_dir = root_dir or str(Path.cwd()) + env = _make_env(root_dir) + _token_replace(cast(dict, values)) + InputModelValidator.validate_python(values, strict=True) + + reader = EnvironmentReader(env) + + def hydrate_async_type(input: LLMConfigInput, base: AsyncType) -> AsyncType: + value = input.get(Fragment.async_mode) + return AsyncType(value) if value else base + + def hydrate_llm_params( + config: LLMConfigInput, base: LLMParameters + ) -> LLMParameters: + with reader.use(config.get("llm")): + llm_type = reader.str(Fragment.type) + llm_type = LLMType(llm_type) if llm_type else base.type + api_key = reader.str(Fragment.api_key) or base.api_key + api_base = reader.str(Fragment.api_base) or base.api_base + cognitive_services_endpoint = ( + reader.str(Fragment.cognitive_services_endpoint) + or base.cognitive_services_endpoint + ) + deployment_name = ( + reader.str(Fragment.deployment_name) or base.deployment_name + ) + + if api_key is None and not _is_azure(llm_type): + raise ApiKeyMissingError + if _is_azure(llm_type): + if api_base is None: + raise AzureApiBaseMissingError + if deployment_name is None: + raise AzureDeploymentNameMissingError + + sleep_on_rate_limit = reader.bool(Fragment.sleep_recommendation) + if sleep_on_rate_limit is None: + sleep_on_rate_limit = base.sleep_on_rate_limit_recommendation + + return LLMParameters( + api_key=api_key, + type=llm_type, + api_base=api_base, + api_version=reader.str(Fragment.api_version) or base.api_version, + organization=reader.str("organization") or base.organization, + proxy=reader.str("proxy") or base.proxy, + model=reader.str("model") or base.model, + max_tokens=reader.int(Fragment.max_tokens) or base.max_tokens, + model_supports_json=reader.bool(Fragment.model_supports_json) + or base.model_supports_json, + request_timeout=reader.float(Fragment.request_timeout) + or base.request_timeout, + cognitive_services_endpoint=cognitive_services_endpoint, + deployment_name=deployment_name, + tokens_per_minute=reader.int("tokens_per_minute", Fragment.tpm) + or base.tokens_per_minute, + requests_per_minute=reader.int("requests_per_minute", Fragment.rpm) + or base.requests_per_minute, + max_retries=reader.int(Fragment.max_retries) or base.max_retries, + max_retry_wait=reader.float(Fragment.max_retry_wait) + or base.max_retry_wait, + sleep_on_rate_limit_recommendation=sleep_on_rate_limit, + concurrent_requests=reader.int(Fragment.concurrent_requests) + or base.concurrent_requests, + ) + + def hydrate_embeddings_params( + config: LLMConfigInput, base: LLMParameters + ) -> LLMParameters: + with reader.use(config.get("llm")): + api_key = reader.str(Fragment.api_key) or base.api_key + api_base = reader.str(Fragment.api_base) or base.api_base + api_version = reader.str(Fragment.api_version) or base.api_version + api_organization = reader.str("organization") or base.organization + api_proxy = reader.str("proxy") or base.proxy + api_type = reader.str(Fragment.type) or defs.EMBEDDING_TYPE + api_type = LLMType(api_type) if api_type else defs.LLM_TYPE + cognitive_services_endpoint = ( + reader.str(Fragment.cognitive_services_endpoint) + or base.cognitive_services_endpoint + ) + deployment_name = reader.str(Fragment.deployment_name) + + if api_key is None and not _is_azure(api_type): + raise ApiKeyMissingError(embedding=True) + if _is_azure(api_type): + if api_base is None: + raise AzureApiBaseMissingError(embedding=True) + if deployment_name is None: + raise AzureDeploymentNameMissingError(embedding=True) + + sleep_on_rate_limit = reader.bool(Fragment.sleep_recommendation) + if sleep_on_rate_limit is None: + sleep_on_rate_limit = base.sleep_on_rate_limit_recommendation + + return LLMParameters( + api_key=api_key, + type=api_type, + api_base=api_base, + api_version=api_version, + organization=api_organization, + proxy=api_proxy, + model=reader.str(Fragment.model) or defs.EMBEDDING_MODEL, + request_timeout=reader.float(Fragment.request_timeout) + or defs.LLM_REQUEST_TIMEOUT, + cognitive_services_endpoint=cognitive_services_endpoint, + deployment_name=deployment_name, + tokens_per_minute=reader.int("tokens_per_minute", Fragment.tpm) + or defs.LLM_TOKENS_PER_MINUTE, + requests_per_minute=reader.int("requests_per_minute", Fragment.rpm) + or defs.LLM_REQUESTS_PER_MINUTE, + max_retries=reader.int(Fragment.max_retries) or defs.LLM_MAX_RETRIES, + max_retry_wait=reader.float(Fragment.max_retry_wait) + or defs.LLM_MAX_RETRY_WAIT, + sleep_on_rate_limit_recommendation=sleep_on_rate_limit, + concurrent_requests=reader.int(Fragment.concurrent_requests) + or defs.LLM_CONCURRENT_REQUESTS, + ) + + def hydrate_parallelization_params( + config: LLMConfigInput, base: ParallelizationParameters + ) -> ParallelizationParameters: + with reader.use(config.get("parallelization")): + return ParallelizationParameters( + num_threads=reader.int("num_threads", Fragment.thread_count) + or base.num_threads, + stagger=reader.float("stagger", Fragment.thread_stagger) + or base.stagger, + ) + + fallback_oai_key = env("OPENAI_API_KEY", env("AZURE_OPENAI_API_KEY", None)) + fallback_oai_org = env("OPENAI_ORG_ID", None) + fallback_oai_base = env("OPENAI_BASE_URL", None) + fallback_oai_version = env("OPENAI_API_VERSION", None) + + with reader.envvar_prefix(Section.graphrag), reader.use(values): + async_mode = reader.str(Fragment.async_mode) + async_mode = AsyncType(async_mode) if async_mode else defs.ASYNC_MODE + + fallback_oai_key = reader.str(Fragment.api_key) or fallback_oai_key + fallback_oai_org = reader.str(Fragment.api_organization) or fallback_oai_org + fallback_oai_base = reader.str(Fragment.api_base) or fallback_oai_base + fallback_oai_version = reader.str(Fragment.api_version) or fallback_oai_version + fallback_oai_proxy = reader.str(Fragment.api_proxy) + + with reader.envvar_prefix(Section.llm): + with reader.use(values.get("llm")): + llm_type = reader.str(Fragment.type) + llm_type = LLMType(llm_type) if llm_type else defs.LLM_TYPE + api_key = reader.str(Fragment.api_key) or fallback_oai_key + api_organization = ( + reader.str(Fragment.api_organization) or fallback_oai_org + ) + api_base = reader.str(Fragment.api_base) or fallback_oai_base + api_version = reader.str(Fragment.api_version) or fallback_oai_version + api_proxy = reader.str(Fragment.api_proxy) or fallback_oai_proxy + cognitive_services_endpoint = reader.str( + Fragment.cognitive_services_endpoint + ) + deployment_name = reader.str(Fragment.deployment_name) + + if api_key is None and not _is_azure(llm_type): + raise ApiKeyMissingError + if _is_azure(llm_type): + if api_base is None: + raise AzureApiBaseMissingError + if deployment_name is None: + raise AzureDeploymentNameMissingError + + sleep_on_rate_limit = reader.bool(Fragment.sleep_recommendation) + if sleep_on_rate_limit is None: + sleep_on_rate_limit = defs.LLM_SLEEP_ON_RATE_LIMIT_RECOMMENDATION + + llm_model = LLMParameters( + api_key=api_key, + api_base=api_base, + api_version=api_version, + organization=api_organization, + proxy=api_proxy, + type=llm_type, + model=reader.str(Fragment.model) or defs.LLM_MODEL, + max_tokens=reader.int(Fragment.max_tokens) or defs.LLM_MAX_TOKENS, + model_supports_json=reader.bool(Fragment.model_supports_json), + request_timeout=reader.float(Fragment.request_timeout) + or defs.LLM_REQUEST_TIMEOUT, + cognitive_services_endpoint=cognitive_services_endpoint, + deployment_name=deployment_name, + tokens_per_minute=reader.int(Fragment.tpm) + or defs.LLM_TOKENS_PER_MINUTE, + requests_per_minute=reader.int(Fragment.rpm) + or defs.LLM_REQUESTS_PER_MINUTE, + max_retries=reader.int(Fragment.max_retries) + or defs.LLM_MAX_RETRIES, + max_retry_wait=reader.float(Fragment.max_retry_wait) + or defs.LLM_MAX_RETRY_WAIT, + sleep_on_rate_limit_recommendation=sleep_on_rate_limit, + concurrent_requests=reader.int(Fragment.concurrent_requests) + or defs.LLM_CONCURRENT_REQUESTS, + ) + with reader.use(values.get("parallelization")): + llm_parallelization_model = ParallelizationParameters( + stagger=reader.float("stagger", Fragment.thread_stagger) + or defs.PARALLELIZATION_STAGGER, + num_threads=reader.int("num_threads", Fragment.thread_count) + or defs.PARALLELIZATION_NUM_THREADS, + ) + embeddings_config = values.get("embeddings") or {} + with reader.envvar_prefix(Section.embedding), reader.use(embeddings_config): + embeddings_target = reader.str("target") + embeddings_model = TextEmbeddingConfig( + llm=hydrate_embeddings_params(embeddings_config, llm_model), + parallelization=hydrate_parallelization_params( + embeddings_config, llm_parallelization_model + ), + vector_store=embeddings_config.get("vector_store", None), + async_mode=hydrate_async_type(embeddings_config, async_mode), + target=( + TextEmbeddingTarget(embeddings_target) + if embeddings_target + else defs.EMBEDDING_TARGET + ), + batch_size=reader.int("batch_size") or defs.EMBEDDING_BATCH_SIZE, + batch_max_tokens=reader.int("batch_max_tokens") + or defs.EMBEDDING_BATCH_MAX_TOKENS, + skip=reader.list("skip") or [], + ) + with ( + reader.envvar_prefix(Section.node2vec), + reader.use(values.get("embed_graph")), + ): + embed_graph_model = EmbedGraphConfig( + enabled=reader.bool(Fragment.enabled) or defs.NODE2VEC_ENABLED, + num_walks=reader.int("num_walks") or defs.NODE2VEC_NUM_WALKS, + walk_length=reader.int("walk_length") or defs.NODE2VEC_WALK_LENGTH, + window_size=reader.int("window_size") or defs.NODE2VEC_WINDOW_SIZE, + iterations=reader.int("iterations") or defs.NODE2VEC_ITERATIONS, + random_seed=reader.int("random_seed") or defs.NODE2VEC_RANDOM_SEED, + ) + with reader.envvar_prefix(Section.input), reader.use(values.get("input")): + input_type = reader.str("type") + file_type = reader.str(Fragment.file_type) + input_model = InputConfig( + file_type=( + InputFileType(file_type) if file_type else defs.INPUT_FILE_TYPE + ), + type=(InputType(input_type) if input_type else defs.INPUT_TYPE), + encoding=reader.str("file_encoding", Fragment.encoding) + or defs.INPUT_FILE_ENCODING, + base_dir=reader.str(Fragment.base_dir) or defs.INPUT_BASE_DIR, + file_pattern=reader.str("file_pattern") + or ( + defs.INPUT_TEXT_PATTERN + if file_type == InputFileType.text + else defs.INPUT_CSV_PATTERN + ), + source_column=reader.str("source_column"), + timestamp_column=reader.str("timestamp_column"), + timestamp_format=reader.str("timestamp_format"), + text_column=reader.str("text_column") or defs.INPUT_TEXT_COLUMN, + title_column=reader.str("title_column"), + document_attribute_columns=reader.list("document_attribute_columns") + or [], + connection_string=reader.str(Fragment.conn_string), + storage_account_blob_url=reader.str(Fragment.storage_account_blob_url), + container_name=reader.str(Fragment.container_name), + ) + with reader.envvar_prefix(Section.cache), reader.use(values.get("cache")): + c_type = reader.str(Fragment.type) + cache_model = CacheConfig( + type=CacheType(c_type) if c_type else defs.CACHE_TYPE, + connection_string=reader.str(Fragment.conn_string), + storage_account_blob_url=reader.str(Fragment.storage_account_blob_url), + container_name=reader.str(Fragment.container_name), + base_dir=reader.str(Fragment.base_dir) or defs.CACHE_BASE_DIR, + ) + with ( + reader.envvar_prefix(Section.reporting), + reader.use(values.get("reporting")), + ): + r_type = reader.str(Fragment.type) + reporting_model = ReportingConfig( + type=ReportingType(r_type) if r_type else defs.REPORTING_TYPE, + connection_string=reader.str(Fragment.conn_string), + storage_account_blob_url=reader.str(Fragment.storage_account_blob_url), + container_name=reader.str(Fragment.container_name), + base_dir=reader.str(Fragment.base_dir) or defs.REPORTING_BASE_DIR, + ) + with reader.envvar_prefix(Section.storage), reader.use(values.get("storage")): + s_type = reader.str(Fragment.type) + storage_model = StorageConfig( + type=StorageType(s_type) if s_type else defs.STORAGE_TYPE, + connection_string=reader.str(Fragment.conn_string), + storage_account_blob_url=reader.str(Fragment.storage_account_blob_url), + container_name=reader.str(Fragment.container_name), + base_dir=reader.str(Fragment.base_dir) or defs.STORAGE_BASE_DIR, + ) + with reader.envvar_prefix(Section.chunk), reader.use(values.get("chunks")): + chunks_model = ChunkingConfig( + size=reader.int("size") or defs.CHUNK_SIZE, + overlap=reader.int("overlap") or defs.CHUNK_OVERLAP, + group_by_columns=reader.list("group_by_columns", "BY_COLUMNS") + or defs.CHUNK_GROUP_BY_COLUMNS, + ) + with ( + reader.envvar_prefix(Section.snapshot), + reader.use(values.get("snapshots")), + ): + snapshots_model = SnapshotsConfig( + graphml=reader.bool("graphml") or defs.SNAPSHOTS_GRAPHML, + raw_entities=reader.bool("raw_entities") or defs.SNAPSHOTS_RAW_ENTITIES, + top_level_nodes=reader.bool("top_level_nodes") + or defs.SNAPSHOTS_TOP_LEVEL_NODES, + ) + with reader.envvar_prefix(Section.umap), reader.use(values.get("umap")): + umap_model = UmapConfig( + enabled=reader.bool(Fragment.enabled) or defs.UMAP_ENABLED, + ) + + entity_extraction_config = values.get("entity_extraction") or {} + with ( + reader.envvar_prefix(Section.entity_extraction), + reader.use(entity_extraction_config), + ): + entity_extraction_model = EntityExtractionConfig( + llm=hydrate_llm_params(entity_extraction_config, llm_model), + parallelization=hydrate_parallelization_params( + entity_extraction_config, llm_parallelization_model + ), + async_mode=hydrate_async_type(entity_extraction_config, async_mode), + entity_types=reader.list("entity_types") + or defs.ENTITY_EXTRACTION_ENTITY_TYPES, + max_gleanings=reader.int(Fragment.max_gleanings) + or defs.ENTITY_EXTRACTION_MAX_GLEANINGS, + prompt=reader.str("prompt", Fragment.prompt_file), + ) + + claim_extraction_config = values.get("claim_extraction") or {} + with ( + reader.envvar_prefix(Section.claim_extraction), + reader.use(claim_extraction_config), + ): + claim_extraction_model = ClaimExtractionConfig( + enabled=reader.bool(Fragment.enabled) or defs.CLAIM_EXTRACTION_ENABLED, + llm=hydrate_llm_params(claim_extraction_config, llm_model), + parallelization=hydrate_parallelization_params( + claim_extraction_config, llm_parallelization_model + ), + async_mode=hydrate_async_type(claim_extraction_config, async_mode), + description=reader.str("description") or defs.CLAIM_DESCRIPTION, + prompt=reader.str("prompt", Fragment.prompt_file), + max_gleanings=reader.int(Fragment.max_gleanings) + or defs.CLAIM_MAX_GLEANINGS, + ) + + community_report_config = values.get("community_reports") or {} + with ( + reader.envvar_prefix(Section.community_report), + reader.use(community_report_config), + ): + community_reports_model = CommunityReportsConfig( + llm=hydrate_llm_params(community_report_config, llm_model), + parallelization=hydrate_parallelization_params( + community_report_config, llm_parallelization_model + ), + async_mode=hydrate_async_type(community_report_config, async_mode), + prompt=reader.str("prompt", Fragment.prompt_file), + max_length=reader.int(Fragment.max_length) + or defs.COMMUNITY_REPORT_MAX_LENGTH, + max_input_length=reader.int("max_input_length") + or defs.COMMUNITY_REPORT_MAX_INPUT_LENGTH, + ) + + summarize_description_config = values.get("summarize_descriptions") or {} + with ( + reader.envvar_prefix(Section.summarize_descriptions), + reader.use(values.get("summarize_descriptions")), + ): + summarize_descriptions_model = SummarizeDescriptionsConfig( + llm=hydrate_llm_params(summarize_description_config, llm_model), + parallelization=hydrate_parallelization_params( + summarize_description_config, llm_parallelization_model + ), + async_mode=hydrate_async_type(summarize_description_config, async_mode), + prompt=reader.str("prompt", Fragment.prompt_file), + max_length=reader.int(Fragment.max_length) + or defs.SUMMARIZE_DESCRIPTIONS_MAX_LENGTH, + ) + + with reader.use(values.get("cluster_graph")): + cluster_graph_model = ClusterGraphConfig( + max_cluster_size=reader.int("max_cluster_size") or defs.MAX_CLUSTER_SIZE + ) + + with ( + reader.use(values.get("local_search")), + reader.envvar_prefix(Section.local_search), + ): + local_search_model = LocalSearchConfig( + text_unit_prop=reader.float("text_unit_prop") + or defs.LOCAL_SEARCH_TEXT_UNIT_PROP, + community_prop=reader.float("community_prop") + or defs.LOCAL_SEARCH_COMMUNITY_PROP, + conversation_history_max_turns=reader.int( + "conversation_history_max_turns" + ) + or defs.LOCAL_SEARCH_CONVERSATION_HISTORY_MAX_TURNS, + top_k_entities=reader.int("top_k_entities") + or defs.LOCAL_SEARCH_TOP_K_MAPPED_ENTITIES, + top_k_relationships=reader.int("top_k_relationships") + or defs.LOCAL_SEARCH_TOP_K_RELATIONSHIPS, + max_tokens=reader.int(Fragment.max_tokens) + or defs.LOCAL_SEARCH_MAX_TOKENS, + llm_max_tokens=reader.int("llm_max_tokens") + or defs.LOCAL_SEARCH_LLM_MAX_TOKENS, + ) + + with ( + reader.use(values.get("global_search")), + reader.envvar_prefix(Section.global_search), + ): + global_search_model = GlobalSearchConfig( + max_tokens=reader.int(Fragment.max_tokens) + or defs.GLOBAL_SEARCH_MAX_TOKENS, + data_max_tokens=reader.int("data_max_tokens") + or defs.GLOBAL_SEARCH_DATA_MAX_TOKENS, + map_max_tokens=reader.int("map_max_tokens") + or defs.GLOBAL_SEARCH_MAP_MAX_TOKENS, + reduce_max_tokens=reader.int("reduce_max_tokens") + or defs.GLOBAL_SEARCH_REDUCE_MAX_TOKENS, + concurrency=reader.int("concurrency") or defs.GLOBAL_SEARCH_CONCURRENCY, + ) + + encoding_model = reader.str(Fragment.encoding_model) or defs.ENCODING_MODEL + skip_workflows = reader.list("skip_workflows") or [] + + return GraphRagConfig( + root_dir=root_dir, + llm=llm_model, + parallelization=llm_parallelization_model, + async_mode=async_mode, + embeddings=embeddings_model, + embed_graph=embed_graph_model, + reporting=reporting_model, + storage=storage_model, + cache=cache_model, + input=input_model, + chunks=chunks_model, + snapshots=snapshots_model, + entity_extraction=entity_extraction_model, + claim_extraction=claim_extraction_model, + community_reports=community_reports_model, + summarize_descriptions=summarize_descriptions_model, + umap=umap_model, + cluster_graph=cluster_graph_model, + encoding_model=encoding_model, + skip_workflows=skip_workflows, + local_search=local_search_model, + global_search=global_search_model, + ) + + +class Fragment(str, Enum): + """Configuration Fragments.""" + + api_base = "API_BASE" + api_key = "API_KEY" + api_version = "API_VERSION" + api_organization = "API_ORGANIZATION" + api_proxy = "API_PROXY" + async_mode = "ASYNC_MODE" + base_dir = "BASE_DIR" + cognitive_services_endpoint = "COGNITIVE_SERVICES_ENDPOINT" + concurrent_requests = "CONCURRENT_REQUESTS" + conn_string = "CONNECTION_STRING" + container_name = "CONTAINER_NAME" + deployment_name = "DEPLOYMENT_NAME" + description = "DESCRIPTION" + enabled = "ENABLED" + encoding = "ENCODING" + encoding_model = "ENCODING_MODEL" + file_type = "FILE_TYPE" + max_gleanings = "MAX_GLEANINGS" + max_length = "MAX_LENGTH" + max_retries = "MAX_RETRIES" + max_retry_wait = "MAX_RETRY_WAIT" + max_tokens = "MAX_TOKENS" + model = "MODEL" + model_supports_json = "MODEL_SUPPORTS_JSON" + prompt_file = "PROMPT_FILE" + request_timeout = "REQUEST_TIMEOUT" + rpm = "RPM" + sleep_recommendation = "SLEEP_ON_RATE_LIMIT_RECOMMENDATION" + storage_account_blob_url = "STORAGE_ACCOUNT_BLOB_URL" + thread_count = "THREAD_COUNT" + thread_stagger = "THREAD_STAGGER" + tpm = "TPM" + type = "TYPE" + + +class Section(str, Enum): + """Configuration Sections.""" + + base = "BASE" + cache = "CACHE" + chunk = "CHUNK" + claim_extraction = "CLAIM_EXTRACTION" + community_report = "COMMUNITY_REPORT" + embedding = "EMBEDDING" + entity_extraction = "ENTITY_EXTRACTION" + graphrag = "GRAPHRAG" + input = "INPUT" + llm = "LLM" + node2vec = "NODE2VEC" + reporting = "REPORTING" + snapshot = "SNAPSHOT" + storage = "STORAGE" + summarize_descriptions = "SUMMARIZE_DESCRIPTIONS" + umap = "UMAP" + local_search = "LOCAL_SEARCH" + global_search = "GLOBAL_SEARCH" + + +def _is_azure(llm_type: LLMType | None) -> bool: + return ( + llm_type == LLMType.AzureOpenAI + or llm_type == LLMType.AzureOpenAIChat + or llm_type == LLMType.AzureOpenAIEmbedding + ) + + +def _make_env(root_dir: str) -> Env: + read_dotenv(root_dir) + env = Env(expand_vars=True) + env.read_env() + return env + + +def _token_replace(data: dict): + """Replace env-var tokens in a dictionary object.""" + for key, value in data.items(): + if isinstance(value, dict): + _token_replace(value) + elif isinstance(value, str): + data[key] = os.path.expandvars(value) diff --git a/graphrag/config/defaults.py b/graphrag/config/defaults.py new file mode 100644 index 00000000..1c2dffe4 --- /dev/null +++ b/graphrag/config/defaults.py @@ -0,0 +1,97 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Common default configuration values.""" + +from datashaper import AsyncType + +from .enums import ( + CacheType, + InputFileType, + InputType, + LLMType, + ReportingType, + StorageType, + TextEmbeddingTarget, +) + +ASYNC_MODE = AsyncType.Threaded +ENCODING_MODEL = "cl100k_base" +# +# LLM Parameters +# +LLM_TYPE = LLMType.OpenAIChat +LLM_MODEL = "gpt-4-turbo-preview" +LLM_MAX_TOKENS = 4000 +LLM_REQUEST_TIMEOUT = 180.0 +LLM_TOKENS_PER_MINUTE = 0 +LLM_REQUESTS_PER_MINUTE = 0 +LLM_MAX_RETRIES = 10 +LLM_MAX_RETRY_WAIT = 10.0 +LLM_SLEEP_ON_RATE_LIMIT_RECOMMENDATION = True +LLM_CONCURRENT_REQUESTS = 25 + +# +# Text Embedding Parameters +# +EMBEDDING_TYPE = LLMType.OpenAIEmbedding +EMBEDDING_MODEL = "text-embedding-3-small" +EMBEDDING_BATCH_SIZE = 16 +EMBEDDING_BATCH_MAX_TOKENS = 8191 +EMBEDDING_TARGET = TextEmbeddingTarget.required + +CACHE_TYPE = CacheType.file +CACHE_BASE_DIR = "cache" +CHUNK_SIZE = 300 +CHUNK_OVERLAP = 100 +CHUNK_GROUP_BY_COLUMNS = ["id"] +CLAIM_DESCRIPTION = ( + "Any claims or facts that could be relevant to information discovery." +) +CLAIM_MAX_GLEANINGS = 0 +CLAIM_EXTRACTION_ENABLED = False +MAX_CLUSTER_SIZE = 10 +COMMUNITY_REPORT_MAX_LENGTH = 2000 +COMMUNITY_REPORT_MAX_INPUT_LENGTH = 8000 +ENTITY_EXTRACTION_ENTITY_TYPES = ["organization", "person", "geo", "event"] +ENTITY_EXTRACTION_MAX_GLEANINGS = 0 +INPUT_FILE_TYPE = InputFileType.text +INPUT_TYPE = InputType.file +INPUT_BASE_DIR = "input" +INPUT_FILE_ENCODING = "utf-8" +INPUT_TEXT_COLUMN = "text" +INPUT_CSV_PATTERN = ".*\\.csv$" +INPUT_TEXT_PATTERN = ".*\\.txt$" +PARALLELIZATION_STAGGER = 0.3 +PARALLELIZATION_NUM_THREADS = 50 +NODE2VEC_ENABLED = False +NODE2VEC_NUM_WALKS = 10 +NODE2VEC_WALK_LENGTH = 40 +NODE2VEC_WINDOW_SIZE = 2 +NODE2VEC_ITERATIONS = 3 +NODE2VEC_RANDOM_SEED = 597832 +REPORTING_TYPE = ReportingType.file +REPORTING_BASE_DIR = "output/${timestamp}/reports" +SNAPSHOTS_GRAPHML = False +SNAPSHOTS_RAW_ENTITIES = False +SNAPSHOTS_TOP_LEVEL_NODES = False +STORAGE_BASE_DIR = "output/${timestamp}/artifacts" +STORAGE_TYPE = StorageType.file +SUMMARIZE_DESCRIPTIONS_MAX_LENGTH = 500 +UMAP_ENABLED = False + +# Local Search +LOCAL_SEARCH_TEXT_UNIT_PROP = 0.5 +LOCAL_SEARCH_COMMUNITY_PROP = 0.1 +LOCAL_SEARCH_CONVERSATION_HISTORY_MAX_TURNS = 5 +LOCAL_SEARCH_TOP_K_MAPPED_ENTITIES = 10 +LOCAL_SEARCH_TOP_K_RELATIONSHIPS = 10 +LOCAL_SEARCH_MAX_TOKENS = 12_000 +LOCAL_SEARCH_LLM_MAX_TOKENS = 2000 + +# Global Search +GLOBAL_SEARCH_MAX_TOKENS = 12_000 +GLOBAL_SEARCH_DATA_MAX_TOKENS = 12_000 +GLOBAL_SEARCH_MAP_MAX_TOKENS = 1000 +GLOBAL_SEARCH_REDUCE_MAX_TOKENS = 2_000 +GLOBAL_SEARCH_CONCURRENCY = 32 diff --git a/graphrag/config/enums.py b/graphrag/config/enums.py new file mode 100644 index 00000000..8741cf74 --- /dev/null +++ b/graphrag/config/enums.py @@ -0,0 +1,115 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'PipelineCacheConfig', 'PipelineFileCacheConfig' and 'PipelineMemoryCacheConfig' models.""" + +from __future__ import annotations + +from enum import Enum + + +class CacheType(str, Enum): + """The cache configuration type for the pipeline.""" + + file = "file" + """The file cache configuration type.""" + memory = "memory" + """The memory cache configuration type.""" + none = "none" + """The none cache configuration type.""" + blob = "blob" + """The blob cache configuration type.""" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' + + +class InputFileType(str, Enum): + """The input file type for the pipeline.""" + + csv = "csv" + """The CSV input type.""" + text = "text" + """The text input type.""" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' + + +class InputType(str, Enum): + """The input type for the pipeline.""" + + file = "file" + """The file storage type.""" + blob = "blob" + """The blob storage type.""" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' + + +class StorageType(str, Enum): + """The storage type for the pipeline.""" + + file = "file" + """The file storage type.""" + memory = "memory" + """The memory storage type.""" + blob = "blob" + """The blob storage type.""" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' + + +class ReportingType(str, Enum): + """The reporting configuration type for the pipeline.""" + + file = "file" + """The file reporting configuration type.""" + console = "console" + """The console reporting configuration type.""" + blob = "blob" + """The blob reporting configuration type.""" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' + + +class TextEmbeddingTarget(str, Enum): + """The target to use for text embeddings.""" + + all = "all" + required = "required" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' + + +class LLMType(str, Enum): + """LLMType enum class definition.""" + + # Embeddings + OpenAIEmbedding = "openai_embedding" + AzureOpenAIEmbedding = "azure_openai_embedding" + + # Raw Completion + OpenAI = "openai" + AzureOpenAI = "azure_openai" + + # Chat Completion + OpenAIChat = "openai_chat" + AzureOpenAIChat = "azure_openai_chat" + + # Debug + StaticResponse = "static_response" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' diff --git a/graphrag/config/environment_reader.py b/graphrag/config/environment_reader.py new file mode 100644 index 00000000..dc61301f --- /dev/null +++ b/graphrag/config/environment_reader.py @@ -0,0 +1,154 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A configuration reader utility class.""" + +from collections.abc import Callable +from contextlib import contextmanager +from enum import Enum +from typing import Any, TypeVar + +from environs import Env + +T = TypeVar("T") + +KeyValue = str | Enum +EnvKeySet = str | list[str] + + +def read_key(value: KeyValue) -> str: + """Read a key value.""" + if not isinstance(value, str): + return value.value.lower() + return value.lower() + + +class EnvironmentReader: + """A configuration reader utility class.""" + + _env: Env + _config_stack: list[dict] + + def __init__(self, env: Env): + self._env = env + self._config_stack = [] + + @property + def env(self): + """Get the environment object.""" + return self._env + + def _read_env( + self, env_key: str | list[str], default_value: T, read: Callable[[str, T], T] + ) -> T | None: + if isinstance(env_key, str): + env_key = [env_key] + + for k in env_key: + result = read(k.upper(), default_value) + if result is not default_value: + return result + + return default_value + + def envvar_prefix(self, prefix: KeyValue): + """Set the environment variable prefix.""" + prefix = read_key(prefix) + prefix = f"{prefix}_".upper() + return self._env.prefixed(prefix) + + def use(self, value: Any | None): + """Create a context manager to push the value into the config_stack.""" + + @contextmanager + def config_context(): + self._config_stack.append(value or {}) + try: + yield + finally: + self._config_stack.pop() + + return config_context() + + @property + def section(self) -> dict: + """Get the current section.""" + return self._config_stack[-1] if self._config_stack else {} + + def str( + self, + key: KeyValue, + env_key: EnvKeySet | None = None, + default_value: str | None = None, + ) -> str | None: + """Read a configuration value.""" + key = read_key(key) + if self.section and key in self.section: + return self.section[key] + + return self._read_env( + env_key or key, default_value, (lambda k, dv: self._env(k, dv)) + ) + + def int( + self, + key: KeyValue, + env_key: EnvKeySet | None = None, + default_value: int | None = None, + ) -> int | None: + """Read an integer configuration value.""" + key = read_key(key) + if self.section and key in self.section: + return int(self.section[key]) + return self._read_env( + env_key or key, default_value, lambda k, dv: self._env.int(k, dv) + ) + + def bool( + self, + key: KeyValue, + env_key: EnvKeySet | None = None, + default_value: bool | None = None, + ) -> bool | None: + """Read an integer configuration value.""" + key = read_key(key) + if self.section and key in self.section: + return bool(self.section[key]) + + return self._read_env( + env_key or key, default_value, lambda k, dv: self._env.bool(k, dv) + ) + + def float( + self, + key: KeyValue, + env_key: EnvKeySet | None = None, + default_value: float | None = None, + ) -> float | None: + """Read a float configuration value.""" + key = read_key(key) + if self.section and key in self.section: + return float(self.section[key]) + return self._read_env( + env_key or key, default_value, lambda k, dv: self._env.float(k, dv) + ) + + def list( + self, + key: KeyValue, + env_key: EnvKeySet | None = None, + default_value: list | None = None, + ) -> list | None: + """Parse an list configuration value.""" + key = read_key(key) + result = None + if self.section and key in self.section: + result = self.section[key] + if isinstance(result, list): + return result + + if result is None: + result = self.str(key, env_key) + if result: + return [s.strip() for s in result.split(",")] + return default_value diff --git a/graphrag/config/errors.py b/graphrag/config/errors.py new file mode 100644 index 00000000..9a2161b8 --- /dev/null +++ b/graphrag/config/errors.py @@ -0,0 +1,40 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +"""Errors for the default configuration.""" + + +class ApiKeyMissingError(ValueError): + """LLM Key missing error.""" + + def __init__(self, embedding: bool = False) -> None: + """Init method definition.""" + api_type = "Embedding" if embedding else "Completion" + api_key = "GRAPHRAG_EMBEDDING_API_KEY" if embedding else "GRAPHRAG_LLM_API_KEY" + msg = f"API Key is required for {api_type} API. Please set either the OPENAI_API_KEY, GRAPHRAG_API_KEY or {api_key} environment variable." + super().__init__(msg) + + +class AzureApiBaseMissingError(ValueError): + """Azure API Base missing error.""" + + def __init__(self, embedding: bool = False) -> None: + """Init method definition.""" + api_type = "Embedding" if embedding else "Completion" + api_base = "GRAPHRAG_EMBEDDING_API_BASE" if embedding else "GRAPHRAG_API_BASE" + msg = f"API Base is required for {api_type} API. Please set either the OPENAI_API_BASE, GRAPHRAG_API_BASE or {api_base} environment variable." + super().__init__(msg) + + +class AzureDeploymentNameMissingError(ValueError): + """Azure Deployment Name missing error.""" + + def __init__(self, embedding: bool = False) -> None: + """Init method definition.""" + api_type = "Embedding" if embedding else "Completion" + api_base = ( + "GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME" + if embedding + else "GRAPHRAG_LLM_DEPLOYMENT_NAME" + ) + msg = f"Deployment Name is required for {api_type} API. Please set either the OPENAI_DEPLOYMENT_NAME, GRAPHRAG_LLM_DEPLOYMENT_NAME or {api_base} environment variable." + super().__init__(msg) diff --git a/graphrag/config/input_models/__init__.py b/graphrag/config/input_models/__init__.py new file mode 100644 index 00000000..f905ae38 --- /dev/null +++ b/graphrag/config/input_models/__init__.py @@ -0,0 +1,50 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Interfaces for Default Config parameterization.""" + +from .cache_config_input import CacheConfigInput +from .chunking_config_input import ChunkingConfigInput +from .claim_extraction_config_input import ClaimExtractionConfigInput +from .cluster_graph_config_input import ClusterGraphConfigInput +from .community_reports_config_input import CommunityReportsConfigInput +from .embed_graph_config_input import EmbedGraphConfigInput +from .entity_extraction_config_input import EntityExtractionConfigInput +from .global_search_config_input import GlobalSearchConfigInput +from .graphrag_config_input import GraphRagConfigInput +from .input_config_input import InputConfigInput +from .llm_config_input import LLMConfigInput +from .llm_parameters_input import LLMParametersInput +from .local_search_config_input import LocalSearchConfigInput +from .parallelization_parameters_input import ParallelizationParametersInput +from .reporting_config_input import ReportingConfigInput +from .snapshots_config_input import SnapshotsConfigInput +from .storage_config_input import StorageConfigInput +from .summarize_descriptions_config_input import ( + SummarizeDescriptionsConfigInput, +) +from .text_embedding_config_input import TextEmbeddingConfigInput +from .umap_config_input import UmapConfigInput + +__all__ = [ + "CacheConfigInput", + "ChunkingConfigInput", + "ClaimExtractionConfigInput", + "ClusterGraphConfigInput", + "CommunityReportsConfigInput", + "EmbedGraphConfigInput", + "EntityExtractionConfigInput", + "GlobalSearchConfigInput", + "GraphRagConfigInput", + "InputConfigInput", + "LLMConfigInput", + "LLMParametersInput", + "LocalSearchConfigInput", + "ParallelizationParametersInput", + "ReportingConfigInput", + "SnapshotsConfigInput", + "StorageConfigInput", + "SummarizeDescriptionsConfigInput", + "TextEmbeddingConfigInput", + "UmapConfigInput", +] diff --git a/graphrag/config/input_models/cache_config_input.py b/graphrag/config/input_models/cache_config_input.py new file mode 100644 index 00000000..fe88d35b --- /dev/null +++ b/graphrag/config/input_models/cache_config_input.py @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from typing_extensions import NotRequired, TypedDict + +from graphrag.config.enums import CacheType + + +class CacheConfigInput(TypedDict): + """The default configuration section for Cache.""" + + type: NotRequired[CacheType | str | None] + base_dir: NotRequired[str | None] + connection_string: NotRequired[str | None] + container_name: NotRequired[str | None] + storage_account_blob_url: NotRequired[str | None] diff --git a/graphrag/config/input_models/chunking_config_input.py b/graphrag/config/input_models/chunking_config_input.py new file mode 100644 index 00000000..bbf4fc73 --- /dev/null +++ b/graphrag/config/input_models/chunking_config_input.py @@ -0,0 +1,15 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from typing_extensions import NotRequired, TypedDict + + +class ChunkingConfigInput(TypedDict): + """Configuration section for chunking.""" + + size: NotRequired[int | str | None] + overlap: NotRequired[int | str | None] + group_by_columns: NotRequired[list[str] | str | None] + strategy: NotRequired[dict | None] diff --git a/graphrag/config/input_models/claim_extraction_config_input.py b/graphrag/config/input_models/claim_extraction_config_input.py new file mode 100644 index 00000000..4827435c --- /dev/null +++ b/graphrag/config/input_models/claim_extraction_config_input.py @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from typing_extensions import NotRequired + +from .llm_config_input import LLMConfigInput + + +class ClaimExtractionConfigInput(LLMConfigInput): + """Configuration section for claim extraction.""" + + enabled: NotRequired[bool | None] + prompt: NotRequired[str | None] + description: NotRequired[str | None] + max_gleanings: NotRequired[int | str | None] + strategy: NotRequired[dict | None] diff --git a/graphrag/config/input_models/cluster_graph_config_input.py b/graphrag/config/input_models/cluster_graph_config_input.py new file mode 100644 index 00000000..eb6f9cd1 --- /dev/null +++ b/graphrag/config/input_models/cluster_graph_config_input.py @@ -0,0 +1,13 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from typing_extensions import NotRequired, TypedDict + + +class ClusterGraphConfigInput(TypedDict): + """Configuration section for clustering graphs.""" + + max_cluster_size: NotRequired[int | None] + strategy: NotRequired[dict | None] diff --git a/graphrag/config/input_models/community_reports_config_input.py b/graphrag/config/input_models/community_reports_config_input.py new file mode 100644 index 00000000..79ae3152 --- /dev/null +++ b/graphrag/config/input_models/community_reports_config_input.py @@ -0,0 +1,17 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from typing_extensions import NotRequired + +from .llm_config_input import LLMConfigInput + + +class CommunityReportsConfigInput(LLMConfigInput): + """Configuration section for community reports.""" + + prompt: NotRequired[str | None] + max_length: NotRequired[int | str | None] + max_input_length: NotRequired[int | str | None] + strategy: NotRequired[dict | None] diff --git a/graphrag/config/input_models/embed_graph_config_input.py b/graphrag/config/input_models/embed_graph_config_input.py new file mode 100644 index 00000000..f8b6ee6f --- /dev/null +++ b/graphrag/config/input_models/embed_graph_config_input.py @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from typing_extensions import NotRequired, TypedDict + + +class EmbedGraphConfigInput(TypedDict): + """The default configuration section for Node2Vec.""" + + enabled: NotRequired[bool | str | None] + num_walks: NotRequired[int | str | None] + walk_length: NotRequired[int | str | None] + window_size: NotRequired[int | str | None] + iterations: NotRequired[int | str | None] + random_seed: NotRequired[int | str | None] + strategy: NotRequired[dict | None] diff --git a/graphrag/config/input_models/entity_extraction_config_input.py b/graphrag/config/input_models/entity_extraction_config_input.py new file mode 100644 index 00000000..a03cbfee --- /dev/null +++ b/graphrag/config/input_models/entity_extraction_config_input.py @@ -0,0 +1,17 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from typing_extensions import NotRequired + +from .llm_config_input import LLMConfigInput + + +class EntityExtractionConfigInput(LLMConfigInput): + """Configuration section for entity extraction.""" + + prompt: NotRequired[str | None] + entity_types: NotRequired[list[str] | str | None] + max_gleanings: NotRequired[int | str | None] + strategy: NotRequired[dict | None] diff --git a/graphrag/config/input_models/global_search_config_input.py b/graphrag/config/input_models/global_search_config_input.py new file mode 100644 index 00000000..e13fbbfa --- /dev/null +++ b/graphrag/config/input_models/global_search_config_input.py @@ -0,0 +1,16 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from typing_extensions import NotRequired, TypedDict + + +class GlobalSearchConfigInput(TypedDict): + """The default configuration section for Cache.""" + + max_tokens: NotRequired[int | str | None] + data_max_tokens: NotRequired[int | str | None] + map_max_tokens: NotRequired[int | str | None] + reduce_max_tokens: NotRequired[int | str | None] + concurrency: NotRequired[int | str | None] diff --git a/graphrag/config/input_models/graphrag_config_input.py b/graphrag/config/input_models/graphrag_config_input.py new file mode 100644 index 00000000..7c04dea2 --- /dev/null +++ b/graphrag/config/input_models/graphrag_config_input.py @@ -0,0 +1,49 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from typing_extensions import NotRequired + +from .cache_config_input import CacheConfigInput +from .chunking_config_input import ChunkingConfigInput +from .claim_extraction_config_input import ClaimExtractionConfigInput +from .cluster_graph_config_input import ClusterGraphConfigInput +from .community_reports_config_input import CommunityReportsConfigInput +from .embed_graph_config_input import EmbedGraphConfigInput +from .entity_extraction_config_input import EntityExtractionConfigInput +from .global_search_config_input import GlobalSearchConfigInput +from .input_config_input import InputConfigInput +from .llm_config_input import LLMConfigInput +from .local_search_config_input import LocalSearchConfigInput +from .reporting_config_input import ReportingConfigInput +from .snapshots_config_input import SnapshotsConfigInput +from .storage_config_input import StorageConfigInput +from .summarize_descriptions_config_input import ( + SummarizeDescriptionsConfigInput, +) +from .text_embedding_config_input import TextEmbeddingConfigInput +from .umap_config_input import UmapConfigInput + + +class GraphRagConfigInput(LLMConfigInput): + """Base class for the Default-Configuration parameterization settings.""" + + reporting: NotRequired[ReportingConfigInput | None] + storage: NotRequired[StorageConfigInput | None] + cache: NotRequired[CacheConfigInput | None] + input: NotRequired[InputConfigInput | None] + embed_graph: NotRequired[EmbedGraphConfigInput | None] + embeddings: NotRequired[TextEmbeddingConfigInput | None] + chunks: NotRequired[ChunkingConfigInput | None] + snapshots: NotRequired[SnapshotsConfigInput | None] + entity_extraction: NotRequired[EntityExtractionConfigInput | None] + summarize_descriptions: NotRequired[SummarizeDescriptionsConfigInput | None] + community_reports: NotRequired[CommunityReportsConfigInput | None] + claim_extraction: NotRequired[ClaimExtractionConfigInput | None] + cluster_graph: NotRequired[ClusterGraphConfigInput | None] + umap: NotRequired[UmapConfigInput | None] + encoding_model: NotRequired[str | None] + skip_workflows: NotRequired[list[str] | str | None] + local_search: NotRequired[LocalSearchConfigInput | None] + global_search: NotRequired[GlobalSearchConfigInput | None] diff --git a/graphrag/config/input_models/input_config_input.py b/graphrag/config/input_models/input_config_input.py new file mode 100644 index 00000000..4ff89d2c --- /dev/null +++ b/graphrag/config/input_models/input_config_input.py @@ -0,0 +1,27 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from typing_extensions import NotRequired, TypedDict + +from graphrag.config.enums import InputFileType, InputType + + +class InputConfigInput(TypedDict): + """The default configuration section for Input.""" + + type: NotRequired[InputType | str | None] + file_type: NotRequired[InputFileType | str | None] + base_dir: NotRequired[str | None] + connection_string: NotRequired[str | None] + container_name: NotRequired[str | None] + file_encoding: NotRequired[str | None] + file_pattern: NotRequired[str | None] + source_column: NotRequired[str | None] + timestamp_column: NotRequired[str | None] + timestamp_format: NotRequired[str | None] + text_column: NotRequired[str | None] + title_column: NotRequired[str | None] + document_attribute_columns: NotRequired[list[str] | str | None] + storage_account_blob_url: NotRequired[str | None] diff --git a/graphrag/config/input_models/llm_config_input.py b/graphrag/config/input_models/llm_config_input.py new file mode 100644 index 00000000..67231371 --- /dev/null +++ b/graphrag/config/input_models/llm_config_input.py @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from datashaper import AsyncType +from typing_extensions import NotRequired, TypedDict + +from .llm_parameters_input import LLMParametersInput +from .parallelization_parameters_input import ParallelizationParametersInput + + +class LLMConfigInput(TypedDict): + """Base class for LLM-configured steps.""" + + llm: NotRequired[LLMParametersInput | None] + parallelization: NotRequired[ParallelizationParametersInput | None] + async_mode: NotRequired[AsyncType | str | None] diff --git a/graphrag/config/input_models/llm_parameters_input.py b/graphrag/config/input_models/llm_parameters_input.py new file mode 100644 index 00000000..c89c6c09 --- /dev/null +++ b/graphrag/config/input_models/llm_parameters_input.py @@ -0,0 +1,31 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""LLM Parameters model.""" + +from typing_extensions import NotRequired, TypedDict + +from graphrag.config.enums import LLMType + + +class LLMParametersInput(TypedDict): + """LLM Parameters model.""" + + api_key: NotRequired[str | None] + type: NotRequired[LLMType | str | None] + model: NotRequired[str | None] + max_tokens: NotRequired[int | str | None] + request_timeout: NotRequired[float | str | None] + api_base: NotRequired[str | None] + api_version: NotRequired[str | None] + organization: NotRequired[str | None] + proxy: NotRequired[str | None] + cognitive_services_endpoint: NotRequired[str | None] + deployment_name: NotRequired[str | None] + model_supports_json: NotRequired[bool | str | None] + tokens_per_minute: NotRequired[int | str | None] + requests_per_minute: NotRequired[int | str | None] + max_retries: NotRequired[int | str | None] + max_retry_wait: NotRequired[float | str | None] + sleep_on_rate_limit_recommendation: NotRequired[bool | str | None] + concurrent_requests: NotRequired[int | str | None] diff --git a/graphrag/config/input_models/local_search_config_input.py b/graphrag/config/input_models/local_search_config_input.py new file mode 100644 index 00000000..23df4010 --- /dev/null +++ b/graphrag/config/input_models/local_search_config_input.py @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from typing_extensions import NotRequired, TypedDict + + +class LocalSearchConfigInput(TypedDict): + """The default configuration section for Cache.""" + + text_unit_prop: NotRequired[float | str | None] + community_prop: NotRequired[float | str | None] + conversation_history_max_turns: NotRequired[int | str | None] + top_k_entities: NotRequired[int | str | None] + top_k_relationships: NotRequired[int | str | None] + max_tokens: NotRequired[int | str | None] + llm_max_tokens: NotRequired[int | str | None] diff --git a/graphrag/config/input_models/parallelization_parameters_input.py b/graphrag/config/input_models/parallelization_parameters_input.py new file mode 100644 index 00000000..e9204437 --- /dev/null +++ b/graphrag/config/input_models/parallelization_parameters_input.py @@ -0,0 +1,13 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""LLM Parameters model.""" + +from typing_extensions import NotRequired, TypedDict + + +class ParallelizationParametersInput(TypedDict): + """LLM Parameters model.""" + + stagger: NotRequired[float | str | None] + num_threads: NotRequired[int | str | None] diff --git a/graphrag/config/input_models/reporting_config_input.py b/graphrag/config/input_models/reporting_config_input.py new file mode 100644 index 00000000..a224f0b4 --- /dev/null +++ b/graphrag/config/input_models/reporting_config_input.py @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from typing_extensions import NotRequired, TypedDict + +from graphrag.config.enums import ReportingType + + +class ReportingConfigInput(TypedDict): + """The default configuration section for Reporting.""" + + type: NotRequired[ReportingType | str | None] + base_dir: NotRequired[str | None] + connection_string: NotRequired[str | None] + container_name: NotRequired[str | None] + storage_account_blob_url: NotRequired[str | None] diff --git a/graphrag/config/input_models/snapshots_config_input.py b/graphrag/config/input_models/snapshots_config_input.py new file mode 100644 index 00000000..c20becb0 --- /dev/null +++ b/graphrag/config/input_models/snapshots_config_input.py @@ -0,0 +1,14 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from typing_extensions import NotRequired, TypedDict + + +class SnapshotsConfigInput(TypedDict): + """Configuration section for snapshots.""" + + graphml: NotRequired[bool | str | None] + raw_entities: NotRequired[bool | str | None] + top_level_nodes: NotRequired[bool | str | None] diff --git a/graphrag/config/input_models/storage_config_input.py b/graphrag/config/input_models/storage_config_input.py new file mode 100644 index 00000000..cc5caf79 --- /dev/null +++ b/graphrag/config/input_models/storage_config_input.py @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from typing_extensions import NotRequired, TypedDict + +from graphrag.config.enums import StorageType + + +class StorageConfigInput(TypedDict): + """The default configuration section for Storage.""" + + type: NotRequired[StorageType | str | None] + base_dir: NotRequired[str | None] + connection_string: NotRequired[str | None] + container_name: NotRequired[str | None] + storage_account_blob_url: NotRequired[str | None] diff --git a/graphrag/config/input_models/summarize_descriptions_config_input.py b/graphrag/config/input_models/summarize_descriptions_config_input.py new file mode 100644 index 00000000..6ce756e5 --- /dev/null +++ b/graphrag/config/input_models/summarize_descriptions_config_input.py @@ -0,0 +1,16 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from typing_extensions import NotRequired + +from .llm_config_input import LLMConfigInput + + +class SummarizeDescriptionsConfigInput(LLMConfigInput): + """Configuration section for description summarization.""" + + prompt: NotRequired[str | None] + max_length: NotRequired[int | str | None] + strategy: NotRequired[dict | None] diff --git a/graphrag/config/input_models/text_embedding_config_input.py b/graphrag/config/input_models/text_embedding_config_input.py new file mode 100644 index 00000000..a7e176c6 --- /dev/null +++ b/graphrag/config/input_models/text_embedding_config_input.py @@ -0,0 +1,23 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from typing_extensions import NotRequired + +from graphrag.config.enums import ( + TextEmbeddingTarget, +) + +from .llm_config_input import LLMConfigInput + + +class TextEmbeddingConfigInput(LLMConfigInput): + """Configuration section for text embeddings.""" + + batch_size: NotRequired[int | str | None] + batch_max_tokens: NotRequired[int | str | None] + target: NotRequired[TextEmbeddingTarget | str | None] + skip: NotRequired[list[str] | str | None] + vector_store: NotRequired[dict | None] + strategy: NotRequired[dict | None] diff --git a/graphrag/config/input_models/umap_config_input.py b/graphrag/config/input_models/umap_config_input.py new file mode 100644 index 00000000..543ca385 --- /dev/null +++ b/graphrag/config/input_models/umap_config_input.py @@ -0,0 +1,12 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from typing_extensions import NotRequired, TypedDict + + +class UmapConfigInput(TypedDict): + """Configuration section for UMAP.""" + + enabled: NotRequired[bool | str | None] diff --git a/graphrag/config/models/__init__.py b/graphrag/config/models/__init__.py new file mode 100644 index 00000000..43c4cde5 --- /dev/null +++ b/graphrag/config/models/__init__.py @@ -0,0 +1,48 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Interfaces for Default Config parameterization.""" + +from .cache_config import CacheConfig +from .chunking_config import ChunkingConfig +from .claim_extraction_config import ClaimExtractionConfig +from .cluster_graph_config import ClusterGraphConfig +from .community_reports_config import CommunityReportsConfig +from .embed_graph_config import EmbedGraphConfig +from .entity_extraction_config import EntityExtractionConfig +from .global_search_config import GlobalSearchConfig +from .graph_rag_config import GraphRagConfig +from .input_config import InputConfig +from .llm_config import LLMConfig +from .llm_parameters import LLMParameters +from .local_search_config import LocalSearchConfig +from .parallelization_parameters import ParallelizationParameters +from .reporting_config import ReportingConfig +from .snapshots_config import SnapshotsConfig +from .storage_config import StorageConfig +from .summarize_descriptions_config import SummarizeDescriptionsConfig +from .text_embedding_config import TextEmbeddingConfig +from .umap_config import UmapConfig + +__all__ = [ + "CacheConfig", + "ChunkingConfig", + "ClaimExtractionConfig", + "ClusterGraphConfig", + "CommunityReportsConfig", + "EmbedGraphConfig", + "EntityExtractionConfig", + "GlobalSearchConfig", + "GraphRagConfig", + "InputConfig", + "LLMConfig", + "LLMParameters", + "LocalSearchConfig", + "ParallelizationParameters", + "ReportingConfig", + "SnapshotsConfig", + "StorageConfig", + "SummarizeDescriptionsConfig", + "TextEmbeddingConfig", + "UmapConfig", +] diff --git a/graphrag/config/models/cache_config.py b/graphrag/config/models/cache_config.py new file mode 100644 index 00000000..4589edce --- /dev/null +++ b/graphrag/config/models/cache_config.py @@ -0,0 +1,29 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pydantic import BaseModel, Field + +import graphrag.config.defaults as defs +from graphrag.config.enums import CacheType + + +class CacheConfig(BaseModel): + """The default configuration section for Cache.""" + + type: CacheType = Field( + description="The cache type to use.", default=defs.CACHE_TYPE + ) + base_dir: str = Field( + description="The base directory for the cache.", default=defs.CACHE_BASE_DIR + ) + connection_string: str | None = Field( + description="The cache connection string to use.", default=None + ) + container_name: str | None = Field( + description="The cache container name to use.", default=None + ) + storage_account_blob_url: str | None = Field( + description="The storage account blob url to use.", default=None + ) diff --git a/graphrag/config/models/chunking_config.py b/graphrag/config/models/chunking_config.py new file mode 100644 index 00000000..ad7e3d0a --- /dev/null +++ b/graphrag/config/models/chunking_config.py @@ -0,0 +1,36 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pydantic import BaseModel, Field + +import graphrag.config.defaults as defs + + +class ChunkingConfig(BaseModel): + """Configuration section for chunking.""" + + size: int = Field(description="The chunk size to use.", default=defs.CHUNK_SIZE) + overlap: int = Field( + description="The chunk overlap to use.", default=defs.CHUNK_OVERLAP + ) + group_by_columns: list[str] = Field( + description="The chunk by columns to use.", + default=defs.CHUNK_GROUP_BY_COLUMNS, + ) + strategy: dict | None = Field( + description="The chunk strategy to use, overriding the default tokenization strategy", + default=None, + ) + + def resolved_strategy(self) -> dict: + """Get the resolved chunking strategy.""" + from graphrag.index.verbs.text.chunk import ChunkStrategyType + + return self.strategy or { + "type": ChunkStrategyType.tokens, + "chunk_size": self.size, + "chunk_overlap": self.overlap, + "group_by_columns": self.group_by_columns, + } diff --git a/graphrag/config/models/claim_extraction_config.py b/graphrag/config/models/claim_extraction_config.py new file mode 100644 index 00000000..7ec465d9 --- /dev/null +++ b/graphrag/config/models/claim_extraction_config.py @@ -0,0 +1,51 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pathlib import Path + +from pydantic import Field + +import graphrag.config.defaults as defs + +from .llm_config import LLMConfig + + +class ClaimExtractionConfig(LLMConfig): + """Configuration section for claim extraction.""" + + enabled: bool = Field( + description="Whether claim extraction is enabled.", + ) + prompt: str | None = Field( + description="The claim extraction prompt to use.", default=None + ) + description: str = Field( + description="The claim description to use.", + default=defs.CLAIM_DESCRIPTION, + ) + max_gleanings: int = Field( + description="The maximum number of entity gleanings to use.", + default=defs.CLAIM_MAX_GLEANINGS, + ) + strategy: dict | None = Field( + description="The override strategy to use.", default=None + ) + + def resolved_strategy(self, root_dir: str) -> dict: + """Get the resolved claim extraction strategy.""" + from graphrag.index.verbs.covariates.extract_covariates import ( + ExtractClaimsStrategyType, + ) + + return self.strategy or { + "type": ExtractClaimsStrategyType.graph_intelligence, + "llm": self.llm.model_dump(), + **self.parallelization.model_dump(), + "extraction_prompt": (Path(root_dir) / self.prompt).read_text() + if self.prompt + else None, + "claim_description": self.description, + "max_gleanings": self.max_gleanings, + } diff --git a/graphrag/config/models/cluster_graph_config.py b/graphrag/config/models/cluster_graph_config.py new file mode 100644 index 00000000..3029baeb --- /dev/null +++ b/graphrag/config/models/cluster_graph_config.py @@ -0,0 +1,28 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pydantic import BaseModel, Field + +import graphrag.config.defaults as defs + + +class ClusterGraphConfig(BaseModel): + """Configuration section for clustering graphs.""" + + max_cluster_size: int = Field( + description="The maximum cluster size to use.", default=defs.MAX_CLUSTER_SIZE + ) + strategy: dict | None = Field( + description="The cluster strategy to use.", default=None + ) + + def resolved_strategy(self) -> dict: + """Get the resolved cluster strategy.""" + from graphrag.index.verbs.graph.clustering import GraphCommunityStrategyType + + return self.strategy or { + "type": GraphCommunityStrategyType.leiden, + "max_cluster_size": self.max_cluster_size, + } diff --git a/graphrag/config/models/community_reports_config.py b/graphrag/config/models/community_reports_config.py new file mode 100644 index 00000000..cc2c9e8f --- /dev/null +++ b/graphrag/config/models/community_reports_config.py @@ -0,0 +1,46 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pathlib import Path + +from pydantic import Field + +import graphrag.config.defaults as defs + +from .llm_config import LLMConfig + + +class CommunityReportsConfig(LLMConfig): + """Configuration section for community reports.""" + + prompt: str | None = Field( + description="The community report extraction prompt to use.", default=None + ) + max_length: int = Field( + description="The community report maximum length in tokens.", + default=defs.COMMUNITY_REPORT_MAX_LENGTH, + ) + max_input_length: int = Field( + description="The maximum input length in tokens to use when generating reports.", + default=defs.COMMUNITY_REPORT_MAX_INPUT_LENGTH, + ) + strategy: dict | None = Field( + description="The override strategy to use.", default=None + ) + + def resolved_strategy(self, root_dir) -> dict: + """Get the resolved community report extraction strategy.""" + from graphrag.index.verbs.graph.report import CreateCommunityReportsStrategyType + + return self.strategy or { + "type": CreateCommunityReportsStrategyType.graph_intelligence, + "llm": self.llm.model_dump(), + **self.parallelization.model_dump(), + "extraction_prompt": (Path(root_dir) / self.prompt).read_text() + if self.prompt + else None, + "max_report_length": self.max_length, + "max_input_length": self.max_input_length, + } diff --git a/graphrag/config/models/embed_graph_config.py b/graphrag/config/models/embed_graph_config.py new file mode 100644 index 00000000..8b7677ab --- /dev/null +++ b/graphrag/config/models/embed_graph_config.py @@ -0,0 +1,48 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pydantic import BaseModel, Field + +import graphrag.config.defaults as defs + + +class EmbedGraphConfig(BaseModel): + """The default configuration section for Node2Vec.""" + + enabled: bool = Field( + description="A flag indicating whether to enable node2vec.", + default=defs.NODE2VEC_ENABLED, + ) + num_walks: int = Field( + description="The node2vec number of walks.", default=defs.NODE2VEC_NUM_WALKS + ) + walk_length: int = Field( + description="The node2vec walk length.", default=defs.NODE2VEC_WALK_LENGTH + ) + window_size: int = Field( + description="The node2vec window size.", default=defs.NODE2VEC_WINDOW_SIZE + ) + iterations: int = Field( + description="The node2vec iterations.", default=defs.NODE2VEC_ITERATIONS + ) + random_seed: int = Field( + description="The node2vec random seed.", default=defs.NODE2VEC_RANDOM_SEED + ) + strategy: dict | None = Field( + description="The graph embedding strategy override.", default=None + ) + + def resolved_strategy(self) -> dict: + """Get the resolved node2vec strategy.""" + from graphrag.index.verbs.graph.embed import EmbedGraphStrategyType + + return self.strategy or { + "type": EmbedGraphStrategyType.node2vec, + "num_walks": self.num_walks, + "walk_length": self.walk_length, + "window_size": self.window_size, + "iterations": self.iterations, + "random_seed": self.iterations, + } diff --git a/graphrag/config/models/entity_extraction_config.py b/graphrag/config/models/entity_extraction_config.py new file mode 100644 index 00000000..ae4d4c56 --- /dev/null +++ b/graphrag/config/models/entity_extraction_config.py @@ -0,0 +1,48 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pathlib import Path + +from pydantic import Field + +import graphrag.config.defaults as defs + +from .llm_config import LLMConfig + + +class EntityExtractionConfig(LLMConfig): + """Configuration section for entity extraction.""" + + prompt: str | None = Field( + description="The entity extraction prompt to use.", default=None + ) + entity_types: list[str] = Field( + description="The entity extraction entity types to use.", + default=defs.ENTITY_EXTRACTION_ENTITY_TYPES, + ) + max_gleanings: int = Field( + description="The maximum number of entity gleanings to use.", + default=defs.ENTITY_EXTRACTION_MAX_GLEANINGS, + ) + strategy: dict | None = Field( + description="Override the default entity extraction strategy", default=None + ) + + def resolved_strategy(self, root_dir: str, encoding_model: str) -> dict: + """Get the resolved entity extraction strategy.""" + from graphrag.index.verbs.entities.extraction import ExtractEntityStrategyType + + return self.strategy or { + "type": ExtractEntityStrategyType.graph_intelligence, + "llm": self.llm.model_dump(), + **self.parallelization.model_dump(), + "extraction_prompt": (Path(root_dir) / self.prompt).read_text() + if self.prompt + else None, + "max_gleanings": self.max_gleanings, + # It's prechunked in create_base_text_units + "encoding_name": encoding_model, + "prechunked": True, + } diff --git a/graphrag/config/models/global_search_config.py b/graphrag/config/models/global_search_config.py new file mode 100644 index 00000000..4249c29e --- /dev/null +++ b/graphrag/config/models/global_search_config.py @@ -0,0 +1,33 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pydantic import BaseModel, Field + +import graphrag.config.defaults as defs + + +class GlobalSearchConfig(BaseModel): + """The default configuration section for Cache.""" + + max_tokens: int = Field( + description="The maximum context size in tokens.", + default=defs.GLOBAL_SEARCH_MAX_TOKENS, + ) + data_max_tokens: int = Field( + description="The data llm maximum tokens.", + default=defs.GLOBAL_SEARCH_DATA_MAX_TOKENS, + ) + map_max_tokens: int = Field( + description="The map llm maximum tokens.", + default=defs.GLOBAL_SEARCH_MAP_MAX_TOKENS, + ) + reduce_max_tokens: int = Field( + description="The reduce llm maximum tokens.", + default=defs.GLOBAL_SEARCH_REDUCE_MAX_TOKENS, + ) + concurrency: int = Field( + description="The number of concurrent requests.", + default=defs.GLOBAL_SEARCH_CONCURRENCY, + ) diff --git a/graphrag/config/models/graph_rag_config.py b/graphrag/config/models/graph_rag_config.py new file mode 100644 index 00000000..197d85e3 --- /dev/null +++ b/graphrag/config/models/graph_rag_config.py @@ -0,0 +1,146 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from devtools import pformat +from pydantic import Field + +import graphrag.config.defaults as defs + +from .cache_config import CacheConfig +from .chunking_config import ChunkingConfig +from .claim_extraction_config import ClaimExtractionConfig +from .cluster_graph_config import ClusterGraphConfig +from .community_reports_config import CommunityReportsConfig +from .embed_graph_config import EmbedGraphConfig +from .entity_extraction_config import EntityExtractionConfig +from .global_search_config import GlobalSearchConfig +from .input_config import InputConfig +from .llm_config import LLMConfig +from .local_search_config import LocalSearchConfig +from .reporting_config import ReportingConfig +from .snapshots_config import SnapshotsConfig +from .storage_config import StorageConfig +from .summarize_descriptions_config import ( + SummarizeDescriptionsConfig, +) +from .text_embedding_config import TextEmbeddingConfig +from .umap_config import UmapConfig + + +class GraphRagConfig(LLMConfig): + """Base class for the Default-Configuration parameterization settings.""" + + def __repr__(self) -> str: + """Get a string representation.""" + return pformat(self, highlight=False) + + def __str__(self): + """Get a string representation.""" + return self.model_dump_json(indent=4) + + root_dir: str = Field( + description="The root directory for the configuration.", default=None + ) + + reporting: ReportingConfig = Field( + description="The reporting configuration.", default=ReportingConfig() + ) + """The reporting configuration.""" + + storage: StorageConfig = Field( + description="The storage configuration.", default=StorageConfig() + ) + """The storage configuration.""" + + cache: CacheConfig = Field( + description="The cache configuration.", default=CacheConfig() + ) + """The cache configuration.""" + + input: InputConfig = Field( + description="The input configuration.", default=InputConfig() + ) + """The input configuration.""" + + embed_graph: EmbedGraphConfig = Field( + description="Graph embedding configuration.", + default=EmbedGraphConfig(), + ) + """Graph Embedding configuration.""" + + embeddings: TextEmbeddingConfig = Field( + description="The embeddings LLM configuration to use.", + default=TextEmbeddingConfig(), + ) + """The embeddings LLM configuration to use.""" + + chunks: ChunkingConfig = Field( + description="The chunking configuration to use.", + default=ChunkingConfig(), + ) + """The chunking configuration to use.""" + + snapshots: SnapshotsConfig = Field( + description="The snapshots configuration to use.", + default=SnapshotsConfig(), + ) + """The snapshots configuration to use.""" + + entity_extraction: EntityExtractionConfig = Field( + description="The entity extraction configuration to use.", + default=EntityExtractionConfig(), + ) + """The entity extraction configuration to use.""" + + summarize_descriptions: SummarizeDescriptionsConfig = Field( + description="The description summarization configuration to use.", + default=SummarizeDescriptionsConfig(), + ) + """The description summarization configuration to use.""" + + community_reports: CommunityReportsConfig = Field( + description="The community reports configuration to use.", + default=CommunityReportsConfig(), + ) + """The community reports configuration to use.""" + + claim_extraction: ClaimExtractionConfig = Field( + description="The claim extraction configuration to use.", + default=ClaimExtractionConfig( + enabled=defs.CLAIM_EXTRACTION_ENABLED, + ), + ) + """The claim extraction configuration to use.""" + + cluster_graph: ClusterGraphConfig = Field( + description="The cluster graph configuration to use.", + default=ClusterGraphConfig(), + ) + """The cluster graph configuration to use.""" + + umap: UmapConfig = Field( + description="The UMAP configuration to use.", default=UmapConfig() + ) + """The UMAP configuration to use.""" + + local_search: LocalSearchConfig = Field( + description="The local search configuration.", default=LocalSearchConfig() + ) + """The local search configuration.""" + + global_search: GlobalSearchConfig = Field( + description="The global search configuration.", default=GlobalSearchConfig() + ) + """The global search configuration.""" + + encoding_model: str = Field( + description="The encoding model to use.", default=defs.ENCODING_MODEL + ) + """The encoding model to use.""" + + skip_workflows: list[str] = Field( + description="The workflows to skip, usually for testing reasons.", default=[] + ) + """The workflows to skip, usually for testing reasons.""" diff --git a/graphrag/config/models/input_config.py b/graphrag/config/models/input_config.py new file mode 100644 index 00000000..f9e5847a --- /dev/null +++ b/graphrag/config/models/input_config.py @@ -0,0 +1,60 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pydantic import BaseModel, Field + +import graphrag.config.defaults as defs +from graphrag.config.enums import InputFileType, InputType + + +class InputConfig(BaseModel): + """The default configuration section for Input.""" + + type: InputType = Field( + description="The input type to use.", default=defs.INPUT_TYPE + ) + file_type: InputFileType = Field( + description="The input file type to use.", default=defs.INPUT_FILE_TYPE + ) + base_dir: str = Field( + description="The input base directory to use.", default=defs.INPUT_BASE_DIR + ) + connection_string: str | None = Field( + description="The azure blob storage connection string to use.", default=None + ) + storage_account_blob_url: str | None = Field( + description="The storage account blob url to use.", default=None + ) + container_name: str | None = Field( + description="The azure blob storage container name to use.", default=None + ) + encoding: str | None = Field( + description="The input file encoding to use.", + default=defs.INPUT_FILE_ENCODING, + ) + file_pattern: str = Field( + description="The input file pattern to use.", default=defs.INPUT_TEXT_PATTERN + ) + file_filter: dict[str, str] | None = Field( + description="The optional file filter for the input files.", default=None + ) + source_column: str | None = Field( + description="The input source column to use.", default=None + ) + timestamp_column: str | None = Field( + description="The input timestamp column to use.", default=None + ) + timestamp_format: str | None = Field( + description="The input timestamp format to use.", default=None + ) + text_column: str = Field( + description="The input text column to use.", default=defs.INPUT_TEXT_COLUMN + ) + title_column: str | None = Field( + description="The input title column to use.", default=None + ) + document_attribute_columns: list[str] = Field( + description="The document attribute columns to use.", default=[] + ) diff --git a/graphrag/config/models/llm_config.py b/graphrag/config/models/llm_config.py new file mode 100644 index 00000000..62c193b0 --- /dev/null +++ b/graphrag/config/models/llm_config.py @@ -0,0 +1,27 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from datashaper import AsyncType +from pydantic import BaseModel, Field + +import graphrag.config.defaults as defs + +from .llm_parameters import LLMParameters +from .parallelization_parameters import ParallelizationParameters + + +class LLMConfig(BaseModel): + """Base class for LLM-configured steps.""" + + llm: LLMParameters = Field( + description="The LLM configuration to use.", default=LLMParameters() + ) + parallelization: ParallelizationParameters = Field( + description="The parallelization configuration to use.", + default=ParallelizationParameters(), + ) + async_mode: AsyncType = Field( + description="The async mode to use.", default=defs.ASYNC_MODE + ) diff --git a/graphrag/config/models/llm_parameters.py b/graphrag/config/models/llm_parameters.py new file mode 100644 index 00000000..4743e010 --- /dev/null +++ b/graphrag/config/models/llm_parameters.py @@ -0,0 +1,75 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""LLM Parameters model.""" + +from pydantic import BaseModel, ConfigDict, Field + +import graphrag.config.defaults as defs +from graphrag.config.enums import LLMType + + +class LLMParameters(BaseModel): + """LLM Parameters model.""" + + model_config = ConfigDict(protected_namespaces=(), extra="allow") + api_key: str | None = Field( + description="The API key to use for the LLM service.", + default=None, + ) + type: LLMType = Field( + description="The type of LLM model to use.", default=defs.LLM_TYPE + ) + model: str = Field(description="The LLM model to use.", default=defs.LLM_MODEL) + max_tokens: int | None = Field( + description="The maximum number of tokens to generate.", + default=defs.LLM_MAX_TOKENS, + ) + request_timeout: float = Field( + description="The request timeout to use.", default=defs.LLM_REQUEST_TIMEOUT + ) + api_base: str | None = Field( + description="The base URL for the LLM API.", default=None + ) + api_version: str | None = Field( + description="The version of the LLM API to use.", default=None + ) + organization: str | None = Field( + description="The organization to use for the LLM service.", default=None + ) + proxy: str | None = Field( + description="The proxy to use for the LLM service.", default=None + ) + cognitive_services_endpoint: str | None = Field( + description="The endpoint to reach cognitives services.", default=None + ) + deployment_name: str | None = Field( + description="The deployment name to use for the LLM service.", default=None + ) + model_supports_json: bool | None = Field( + description="Whether the model supports JSON output mode.", default=None + ) + tokens_per_minute: int = Field( + description="The number of tokens per minute to use for the LLM service.", + default=defs.LLM_TOKENS_PER_MINUTE, + ) + requests_per_minute: int = Field( + description="The number of requests per minute to use for the LLM service.", + default=defs.LLM_REQUESTS_PER_MINUTE, + ) + max_retries: int = Field( + description="The maximum number of retries to use for the LLM service.", + default=defs.LLM_MAX_RETRIES, + ) + max_retry_wait: float = Field( + description="The maximum retry wait to use for the LLM service.", + default=defs.LLM_MAX_RETRY_WAIT, + ) + sleep_on_rate_limit_recommendation: bool = Field( + description="Whether to sleep on rate limit recommendations.", + default=defs.LLM_SLEEP_ON_RATE_LIMIT_RECOMMENDATION, + ) + concurrent_requests: int = Field( + description="Whether to use concurrent requests for the LLM service.", + default=defs.LLM_CONCURRENT_REQUESTS, + ) diff --git a/graphrag/config/models/local_search_config.py b/graphrag/config/models/local_search_config.py new file mode 100644 index 00000000..5fa5dd1e --- /dev/null +++ b/graphrag/config/models/local_search_config.py @@ -0,0 +1,39 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pydantic import BaseModel, Field + +import graphrag.config.defaults as defs + + +class LocalSearchConfig(BaseModel): + """The default configuration section for Cache.""" + + text_unit_prop: float = Field( + description="The text unit proportion.", + default=defs.LOCAL_SEARCH_TEXT_UNIT_PROP, + ) + community_prop: float = Field( + description="The community proportion.", + default=defs.LOCAL_SEARCH_COMMUNITY_PROP, + ) + conversation_history_max_turns: int = Field( + description="The conversation history maximum turns.", + default=defs.LOCAL_SEARCH_CONVERSATION_HISTORY_MAX_TURNS, + ) + top_k_entities: int = Field( + description="The top k mapped entities.", + default=defs.LOCAL_SEARCH_TOP_K_MAPPED_ENTITIES, + ) + top_k_relationships: int = Field( + description="The top k mapped relations.", + default=defs.LOCAL_SEARCH_TOP_K_RELATIONSHIPS, + ) + max_tokens: int = Field( + description="The maximum tokens.", default=defs.LOCAL_SEARCH_MAX_TOKENS + ) + llm_max_tokens: int = Field( + description="The LLM maximum tokens.", default=defs.LOCAL_SEARCH_LLM_MAX_TOKENS + ) diff --git a/graphrag/config/models/parallelization_parameters.py b/graphrag/config/models/parallelization_parameters.py new file mode 100644 index 00000000..80a85b86 --- /dev/null +++ b/graphrag/config/models/parallelization_parameters.py @@ -0,0 +1,21 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""LLM Parameters model.""" + +from pydantic import BaseModel, Field + +import graphrag.config.defaults as defs + + +class ParallelizationParameters(BaseModel): + """LLM Parameters model.""" + + stagger: float = Field( + description="The stagger to use for the LLM service.", + default=defs.PARALLELIZATION_STAGGER, + ) + num_threads: int = Field( + description="The number of threads to use for the LLM service.", + default=defs.PARALLELIZATION_NUM_THREADS, + ) diff --git a/graphrag/config/models/reporting_config.py b/graphrag/config/models/reporting_config.py new file mode 100644 index 00000000..35e86cf5 --- /dev/null +++ b/graphrag/config/models/reporting_config.py @@ -0,0 +1,30 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pydantic import BaseModel, Field + +import graphrag.config.defaults as defs +from graphrag.config.enums import ReportingType + + +class ReportingConfig(BaseModel): + """The default configuration section for Reporting.""" + + type: ReportingType = Field( + description="The reporting type to use.", default=defs.REPORTING_TYPE + ) + base_dir: str = Field( + description="The base directory for reporting.", + default=defs.REPORTING_BASE_DIR, + ) + connection_string: str | None = Field( + description="The reporting connection string to use.", default=None + ) + container_name: str | None = Field( + description="The reporting container name to use.", default=None + ) + storage_account_blob_url: str | None = Field( + description="The storage account blob url to use.", default=None + ) diff --git a/graphrag/config/models/snapshots_config.py b/graphrag/config/models/snapshots_config.py new file mode 100644 index 00000000..08293fb7 --- /dev/null +++ b/graphrag/config/models/snapshots_config.py @@ -0,0 +1,25 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pydantic import BaseModel, Field + +import graphrag.config.defaults as defs + + +class SnapshotsConfig(BaseModel): + """Configuration section for snapshots.""" + + graphml: bool = Field( + description="A flag indicating whether to take snapshots of GraphML.", + default=defs.SNAPSHOTS_GRAPHML, + ) + raw_entities: bool = Field( + description="A flag indicating whether to take snapshots of raw entities.", + default=defs.SNAPSHOTS_RAW_ENTITIES, + ) + top_level_nodes: bool = Field( + description="A flag indicating whether to take snapshots of top-level nodes.", + default=defs.SNAPSHOTS_TOP_LEVEL_NODES, + ) diff --git a/graphrag/config/models/storage_config.py b/graphrag/config/models/storage_config.py new file mode 100644 index 00000000..dcf41b92 --- /dev/null +++ b/graphrag/config/models/storage_config.py @@ -0,0 +1,30 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pydantic import BaseModel, Field + +import graphrag.config.defaults as defs +from graphrag.config.enums import StorageType + + +class StorageConfig(BaseModel): + """The default configuration section for Storage.""" + + type: StorageType = Field( + description="The storage type to use.", default=defs.STORAGE_TYPE + ) + base_dir: str = Field( + description="The base directory for the storage.", + default=defs.STORAGE_BASE_DIR, + ) + connection_string: str | None = Field( + description="The storage connection string to use.", default=None + ) + container_name: str | None = Field( + description="The storage container name to use.", default=None + ) + storage_account_blob_url: str | None = Field( + description="The storage account blob url to use.", default=None + ) diff --git a/graphrag/config/models/summarize_descriptions_config.py b/graphrag/config/models/summarize_descriptions_config.py new file mode 100644 index 00000000..39aa93e2 --- /dev/null +++ b/graphrag/config/models/summarize_descriptions_config.py @@ -0,0 +1,41 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pathlib import Path + +from pydantic import Field + +import graphrag.config.defaults as defs + +from .llm_config import LLMConfig + + +class SummarizeDescriptionsConfig(LLMConfig): + """Configuration section for description summarization.""" + + prompt: str | None = Field( + description="The description summarization prompt to use.", default=None + ) + max_length: int = Field( + description="The description summarization maximum length.", + default=defs.SUMMARIZE_DESCRIPTIONS_MAX_LENGTH, + ) + strategy: dict | None = Field( + description="The override strategy to use.", default=None + ) + + def resolved_strategy(self, root_dir: str) -> dict: + """Get the resolved description summarization strategy.""" + from graphrag.index.verbs.entities.summarize import SummarizeStrategyType + + return self.strategy or { + "type": SummarizeStrategyType.graph_intelligence, + "llm": self.llm.model_dump(), + **self.parallelization.model_dump(), + "summarize_prompt": (Path(root_dir) / self.prompt).read_text() + if self.prompt + else None, + "max_summary_length": self.max_length, + } diff --git a/graphrag/config/models/text_embedding_config.py b/graphrag/config/models/text_embedding_config.py new file mode 100644 index 00000000..5c2fcdb8 --- /dev/null +++ b/graphrag/config/models/text_embedding_config.py @@ -0,0 +1,46 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pydantic import Field + +import graphrag.config.defaults as defs +from graphrag.config.enums import TextEmbeddingTarget + +from .llm_config import LLMConfig + + +class TextEmbeddingConfig(LLMConfig): + """Configuration section for text embeddings.""" + + batch_size: int = Field( + description="The batch size to use.", default=defs.EMBEDDING_BATCH_SIZE + ) + batch_max_tokens: int = Field( + description="The batch max tokens to use.", + default=defs.EMBEDDING_BATCH_MAX_TOKENS, + ) + target: TextEmbeddingTarget = Field( + description="The target to use. 'all' or 'required'.", + default=defs.EMBEDDING_TARGET, + ) + skip: list[str] = Field(description="The specific embeddings to skip.", default=[]) + vector_store: dict | None = Field( + description="The vector storage configuration", default=None + ) + strategy: dict | None = Field( + description="The override strategy to use.", default=None + ) + + def resolved_strategy(self) -> dict: + """Get the resolved text embedding strategy.""" + from graphrag.index.verbs.text.embed import TextEmbedStrategyType + + return self.strategy or { + "type": TextEmbedStrategyType.openai, + "llm": self.llm.model_dump(), + **self.parallelization.model_dump(), + "batch_size": self.batch_size, + "batch_max_tokens": self.batch_max_tokens, + } diff --git a/graphrag/config/models/umap_config.py b/graphrag/config/models/umap_config.py new file mode 100644 index 00000000..1d9bd93e --- /dev/null +++ b/graphrag/config/models/umap_config.py @@ -0,0 +1,17 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pydantic import BaseModel, Field + +import graphrag.config.defaults as defs + + +class UmapConfig(BaseModel): + """Configuration section for UMAP.""" + + enabled: bool = Field( + description="A flag indicating whether to enable UMAP.", + default=defs.UMAP_ENABLED, + ) diff --git a/graphrag/config/read_dotenv.py b/graphrag/config/read_dotenv.py new file mode 100644 index 00000000..7e041757 --- /dev/null +++ b/graphrag/config/read_dotenv.py @@ -0,0 +1,25 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing the read_dotenv utility.""" + +import logging +import os +from pathlib import Path + +from dotenv import dotenv_values + +log = logging.getLogger(__name__) + + +def read_dotenv(root: str) -> None: + """Read a .env file in the given root path.""" + env_path = Path(root) / ".env" + if env_path.exists(): + log.info("Loading pipeline .env file") + env_config = dotenv_values(f"{env_path}") + for key, value in env_config.items(): + if key not in os.environ: + os.environ[key] = value or "" + else: + log.info("No .env file found at %s", root) diff --git a/graphrag/index/__init__.py b/graphrag/index/__init__.py new file mode 100644 index 00000000..c97c290a --- /dev/null +++ b/graphrag/index/__init__.py @@ -0,0 +1,78 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine package root.""" + +from .cache import PipelineCache +from .config import ( + PipelineBlobCacheConfig, + PipelineBlobReportingConfig, + PipelineBlobStorageConfig, + PipelineCacheConfig, + PipelineCacheConfigTypes, + PipelineConfig, + PipelineConsoleReportingConfig, + PipelineCSVInputConfig, + PipelineFileCacheConfig, + PipelineFileReportingConfig, + PipelineFileStorageConfig, + PipelineInputConfig, + PipelineInputConfigTypes, + PipelineMemoryCacheConfig, + PipelineMemoryStorageConfig, + PipelineNoneCacheConfig, + PipelineReportingConfig, + PipelineReportingConfigTypes, + PipelineStorageConfig, + PipelineStorageConfigTypes, + PipelineTextInputConfig, + PipelineWorkflowConfig, + PipelineWorkflowReference, + PipelineWorkflowStep, +) +from .create_pipeline_config import create_pipeline_config +from .errors import ( + NoWorkflowsDefinedError, + UndefinedWorkflowError, + UnknownWorkflowError, +) +from .load_pipeline_config import load_pipeline_config +from .run import run_pipeline, run_pipeline_with_config +from .storage import PipelineStorage + +__all__ = [ + "NoWorkflowsDefinedError", + "PipelineBlobCacheConfig", + "PipelineBlobCacheConfig", + "PipelineBlobReportingConfig", + "PipelineBlobStorageConfig", + "PipelineCSVInputConfig", + "PipelineCache", + "PipelineCacheConfig", + "PipelineCacheConfigTypes", + "PipelineConfig", + "PipelineConsoleReportingConfig", + "PipelineFileCacheConfig", + "PipelineFileReportingConfig", + "PipelineFileStorageConfig", + "PipelineInputConfig", + "PipelineInputConfigTypes", + "PipelineMemoryCacheConfig", + "PipelineMemoryStorageConfig", + "PipelineNoneCacheConfig", + "PipelineReportingConfig", + "PipelineReportingConfigTypes", + "PipelineStorage", + "PipelineStorageConfig", + "PipelineStorageConfigTypes", + "PipelineTextInputConfig", + "PipelineWorkflowConfig", + "PipelineWorkflowReference", + "PipelineWorkflowStep", + "UndefinedWorkflowError", + "UnknownWorkflowError", + "create_pipeline_config", + "load_pipeline_config", + "run_pipeline", + "run_pipeline_with_config", +] diff --git a/graphrag/index/__main__.py b/graphrag/index/__main__.py new file mode 100644 index 00000000..0c1c53f9 --- /dev/null +++ b/graphrag/index/__main__.py @@ -0,0 +1,80 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine package root.""" + +import argparse + +from .cli import index_cli + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--config", + help="The configuration yaml file to use when running the pipeline", + required=False, + type=str, + ) + parser.add_argument( + "-v", + "--verbose", + help="Runs the pipeline with verbose logging", + action="store_true", + ) + parser.add_argument( + "--memprofile", + help="Runs the pipeline with memory profiling", + action="store_true", + ) + parser.add_argument( + "--root", + help="If no configuration is defined, the root directory to use for input data and output data", + # Only required if config is not defined + required=False, + type=str, + ) + parser.add_argument( + "--resume", + help="Resume a given data run leveraging Parquet output files.", + # Only required if config is not defined + required=False, + default=None, + type=str, + ) + parser.add_argument( + "--reporter", + help="The progress reporter to use. Valid values are 'rich', 'print', or 'none'", + type=str, + ) + parser.add_argument( + "--emit", + help="The data formats to emit, comma-separated. Valid values are 'parquet' and 'csv'. default='parquet,csv'", + type=str, + ) + parser.add_argument( + "--dryrun", + help="Run the pipeline without actually executing any steps and inspect the configuration.", + action="store_true", + ) + parser.add_argument("--nocache", help="Disable LLM cache.", action="store_true") + parser.add_argument( + "--init", + help="Create an initial configuration in the given path.", + action="store_true", + ) + + args = parser.parse_args() + + index_cli( + root=args.root, + verbose=args.verbose or False, + resume=args.resume, + memprofile=args.memprofile or False, + nocache=args.nocache or False, + reporter=args.reporter, + config=args.config, + emit=args.emit, + dryrun=args.dryrun or False, + init=args.init or False, + cli=True, + ) diff --git a/graphrag/index/bootstrap.py b/graphrag/index/bootstrap.py new file mode 100644 index 00000000..398ec88b --- /dev/null +++ b/graphrag/index/bootstrap.py @@ -0,0 +1,28 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Bootstrap definition.""" + +import warnings + +# Ignore warnings from numba +warnings.filterwarnings("ignore", message=".*The 'nopython' keyword.*") +warnings.filterwarnings("ignore", message=".*Use no seed for parallelism.*") + +initialized_nltk = False + + +def bootstrap(): + """Bootstrap definition.""" + global initialized_nltk + if not initialized_nltk: + import nltk + from nltk.corpus import wordnet as wn + + nltk.download("punkt") + nltk.download("averaged_perceptron_tagger") + nltk.download("maxent_ne_chunker") + nltk.download("words") + nltk.download("wordnet") + wn.ensure_loaded() + initialized_nltk = True diff --git a/graphrag/index/cache/__init__.py b/graphrag/index/cache/__init__.py new file mode 100644 index 00000000..42ebb229 --- /dev/null +++ b/graphrag/index/cache/__init__.py @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine cache package root.""" + +from .json_pipeline_cache import JsonPipelineCache +from .load_cache import load_cache +from .memory_pipeline_cache import InMemoryCache +from .noop_pipeline_cache import NoopPipelineCache +from .pipeline_cache import PipelineCache + +__all__ = [ + "InMemoryCache", + "JsonPipelineCache", + "NoopPipelineCache", + "PipelineCache", + "load_cache", +] diff --git a/graphrag/index/cache/json_pipeline_cache.py b/graphrag/index/cache/json_pipeline_cache.py new file mode 100644 index 00000000..b88a3899 --- /dev/null +++ b/graphrag/index/cache/json_pipeline_cache.py @@ -0,0 +1,64 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'FilePipelineCache' model.""" + +import json +from typing import Any + +from graphrag.index.storage import PipelineStorage + +from .pipeline_cache import PipelineCache + + +class JsonPipelineCache(PipelineCache): + """File pipeline cache class definition.""" + + _storage: PipelineStorage + _encoding: str + + def __init__(self, storage: PipelineStorage, encoding="utf-8"): + """Init method definition.""" + self._storage = storage + self._encoding = encoding + + async def get(self, key: str) -> str | None: + """Get method definition.""" + if await self.has(key): + try: + data = await self._storage.get(key, encoding=self._encoding) + data = json.loads(data) + except UnicodeDecodeError: + await self._storage.delete(key) + return None + except json.decoder.JSONDecodeError: + await self._storage.delete(key) + return None + else: + return data.get("result") + + return None + + async def set(self, key: str, value: Any, debug_data: dict | None = None) -> None: + """Set method definition.""" + if value is None: + return + data = {"result": value, **(debug_data or {})} + await self._storage.set(key, json.dumps(data), encoding=self._encoding) + + async def has(self, key: str) -> bool: + """Has method definition.""" + return await self._storage.has(key) + + async def delete(self, key: str) -> None: + """Delete method definition.""" + if await self.has(key): + await self._storage.delete(key) + + async def clear(self) -> None: + """Clear method definition.""" + await self._storage.clear() + + def child(self, name: str) -> "JsonPipelineCache": + """Child method definition.""" + return JsonPipelineCache(self._storage.child(name), encoding=self._encoding) diff --git a/graphrag/index/cache/load_cache.py b/graphrag/index/cache/load_cache.py new file mode 100644 index 00000000..4e0e6324 --- /dev/null +++ b/graphrag/index/cache/load_cache.py @@ -0,0 +1,51 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing load_cache method definition.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, cast + +from graphrag.config.enums import CacheType +from graphrag.index.config.cache import ( + PipelineBlobCacheConfig, + PipelineFileCacheConfig, +) +from graphrag.index.storage import BlobPipelineStorage, FilePipelineStorage + +if TYPE_CHECKING: + from graphrag.index.config import ( + PipelineCacheConfig, + ) + +from .json_pipeline_cache import JsonPipelineCache +from .memory_pipeline_cache import create_memory_cache +from .noop_pipeline_cache import NoopPipelineCache + + +def load_cache(config: PipelineCacheConfig | None, root_dir: str | None): + """Load the cache from the given config.""" + if config is None: + return NoopPipelineCache() + + match config.type: + case CacheType.none: + return NoopPipelineCache() + case CacheType.memory: + return create_memory_cache() + case CacheType.file: + config = cast(PipelineFileCacheConfig, config) + storage = FilePipelineStorage(root_dir).child(config.base_dir) + return JsonPipelineCache(storage) + case CacheType.blob: + config = cast(PipelineBlobCacheConfig, config) + storage = BlobPipelineStorage( + config.connection_string, + config.container_name, + storage_account_blob_url=config.storage_account_blob_url, + ).child(config.base_dir) + return JsonPipelineCache(storage) + case _: + msg = f"Unknown cache type: {config.type}" + raise ValueError(msg) diff --git a/graphrag/index/cache/memory_pipeline_cache.py b/graphrag/index/cache/memory_pipeline_cache.py new file mode 100644 index 00000000..fa42f3f9 --- /dev/null +++ b/graphrag/index/cache/memory_pipeline_cache.py @@ -0,0 +1,83 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'InMemoryCache' model.""" + +from typing import Any + +from .pipeline_cache import PipelineCache + + +class InMemoryCache(PipelineCache): + """In memory cache class definition.""" + + _cache: dict[str, Any] + _name: str + + def __init__(self, name: str | None = None): + """Init method definition.""" + self._cache = {} + self._name = name or "" + + async def get(self, key: str) -> Any: + """Get the value for the given key. + + Args: + - key - The key to get the value for. + - as_bytes - Whether or not to return the value as bytes. + + Returns + ------- + - output - The value for the given key. + """ + key = self._create_cache_key(key) + return self._cache.get(key) + + async def set(self, key: str, value: Any, debug_data: dict | None = None) -> None: + """Set the value for the given key. + + Args: + - key - The key to set the value for. + - value - The value to set. + """ + key = self._create_cache_key(key) + self._cache[key] = value + + async def has(self, key: str) -> bool: + """Return True if the given key exists in the storage. + + Args: + - key - The key to check for. + + Returns + ------- + - output - True if the key exists in the storage, False otherwise. + """ + key = self._create_cache_key(key) + return key in self._cache + + async def delete(self, key: str) -> None: + """Delete the given key from the storage. + + Args: + - key - The key to delete. + """ + key = self._create_cache_key(key) + del self._cache[key] + + async def clear(self) -> None: + """Clear the storage.""" + self._cache.clear() + + def child(self, name: str) -> PipelineCache: + """Create a sub cache with the given name.""" + return InMemoryCache(name) + + def _create_cache_key(self, key: str) -> str: + """Create a cache key for the given key.""" + return f"{self._name}{key}" + + +def create_memory_cache() -> PipelineCache: + """Create a memory cache.""" + return InMemoryCache() diff --git a/graphrag/index/cache/noop_pipeline_cache.py b/graphrag/index/cache/noop_pipeline_cache.py new file mode 100644 index 00000000..b7c3e60f --- /dev/null +++ b/graphrag/index/cache/noop_pipeline_cache.py @@ -0,0 +1,65 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Module containing the NoopPipelineCache implementation.""" + +from typing import Any + +from .pipeline_cache import PipelineCache + + +class NoopPipelineCache(PipelineCache): + """A no-op implementation of the pipeline cache, usually useful for testing.""" + + async def get(self, key: str) -> Any: + """Get the value for the given key. + + Args: + - key - The key to get the value for. + - as_bytes - Whether or not to return the value as bytes. + + Returns + ------- + - output - The value for the given key. + """ + return None + + async def set( + self, key: str, value: str | bytes | None, debug_data: dict | None = None + ) -> None: + """Set the value for the given key. + + Args: + - key - The key to set the value for. + - value - The value to set. + """ + + async def has(self, key: str) -> bool: + """Return True if the given key exists in the cache. + + Args: + - key - The key to check for. + + Returns + ------- + - output - True if the key exists in the cache, False otherwise. + """ + return False + + async def delete(self, key: str) -> None: + """Delete the given key from the cache. + + Args: + - key - The key to delete. + """ + + async def clear(self) -> None: + """Clear the cache.""" + + def child(self, name: str) -> PipelineCache: + """Create a child cache with the given name. + + Args: + - name - The name to create the sub cache with. + """ + return self diff --git a/graphrag/index/cache/pipeline_cache.py b/graphrag/index/cache/pipeline_cache.py new file mode 100644 index 00000000..c68c5cfb --- /dev/null +++ b/graphrag/index/cache/pipeline_cache.py @@ -0,0 +1,67 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'PipelineCache' model.""" + +from __future__ import annotations + +from abc import ABCMeta, abstractmethod +from typing import Any + + +class PipelineCache(metaclass=ABCMeta): + """Provide a cache interface for the pipeline.""" + + @abstractmethod + async def get(self, key: str) -> Any: + """Get the value for the given key. + + Args: + - key - The key to get the value for. + - as_bytes - Whether or not to return the value as bytes. + + Returns + ------- + - output - The value for the given key. + """ + + @abstractmethod + async def set(self, key: str, value: Any, debug_data: dict | None = None) -> None: + """Set the value for the given key. + + Args: + - key - The key to set the value for. + - value - The value to set. + """ + + @abstractmethod + async def has(self, key: str) -> bool: + """Return True if the given key exists in the cache. + + Args: + - key - The key to check for. + + Returns + ------- + - output - True if the key exists in the cache, False otherwise. + """ + + @abstractmethod + async def delete(self, key: str) -> None: + """Delete the given key from the cache. + + Args: + - key - The key to delete. + """ + + @abstractmethod + async def clear(self) -> None: + """Clear the cache.""" + + @abstractmethod + def child(self, name: str) -> PipelineCache: + """Create a child cache with the given name. + + Args: + - name - The name to create the sub cache with. + """ diff --git a/graphrag/index/cli.py b/graphrag/index/cli.py new file mode 100644 index 00000000..f32e34dc --- /dev/null +++ b/graphrag/index/cli.py @@ -0,0 +1,293 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Main definition.""" + +import asyncio +import json +import logging +import platform +import sys +import time +import warnings +from pathlib import Path + +from graphrag.config import ( + create_graphrag_config, +) +from graphrag.index import PipelineConfig, create_pipeline_config +from graphrag.index.cache import NoopPipelineCache +from graphrag.index.progress import ( + NullProgressReporter, + PrintProgressReporter, + ProgressReporter, +) +from graphrag.index.progress.rich import RichProgressReporter +from graphrag.index.run import run_pipeline_with_config + +from .emit import TableEmitterType +from .graph.extractors.claims.prompts import CLAIM_EXTRACTION_PROMPT +from .graph.extractors.community_reports.prompts import COMMUNITY_REPORT_PROMPT +from .graph.extractors.graph.prompts import GRAPH_EXTRACTION_PROMPT +from .graph.extractors.summarize.prompts import SUMMARIZE_PROMPT +from .init_content import INIT_DOTENV, INIT_YAML + +# Ignore warnings from numba +warnings.filterwarnings("ignore", message=".*NumbaDeprecationWarning.*") + +log = logging.getLogger(__name__) + + +def redact(input: dict) -> str: + """Sanitize the config json.""" + + # Redact any sensitive configuration + def redact_dict(input: dict) -> dict: + if not isinstance(input, dict): + return input + + result = {} + for key, value in input.items(): + if key in { + "api_key", + "connection_string", + "container_name", + "organization", + }: + if value is not None: + result[key] = f"REDACTED, length {len(value)}" + elif isinstance(value, dict): + result[key] = redact_dict(value) + elif isinstance(value, list): + result[key] = [redact_dict(i) for i in value] + else: + result[key] = value + return result + + redacted_dict = redact_dict(input) + return json.dumps(redacted_dict, indent=4) + + +def index_cli( + root: str | None, + init: bool, + verbose: bool, + resume: str | None, + memprofile: bool, + nocache: bool, + reporter: str | None, + config: str | None, + emit: str | None, + dryrun: bool, + cli: bool = False, +): + """Run the pipeline with the given config.""" + root = root or "" + run_id = resume or time.strftime("%Y%m%d-%H%M%S") + _enable_logging(root, run_id, verbose) + progress_reporter = _get_progress_reporter(reporter) + if init: + _initialize_project_at(root, progress_reporter) + sys.exit(0) + pipeline_config: str | PipelineConfig = config or _create_default_config( + root, verbose, dryrun or False, progress_reporter + ) + cache = NoopPipelineCache() if nocache else None + pipeline_emit = emit.split(",") if emit else None + encountered_errors = False + + def _run_workflow_async() -> None: + import signal + + def handle_signal(signum, _): + # Handle the signal here + progress_reporter.info(f"Received signal {signum}, exiting...") + progress_reporter.dispose() + for task in asyncio.all_tasks(): + task.cancel() + progress_reporter.info("All tasks cancelled. Exiting...") + + # Register signal handlers for SIGINT and SIGHUP + signal.signal(signal.SIGINT, handle_signal) + + if sys.platform != "win32": + signal.signal(signal.SIGHUP, handle_signal) + + async def execute(): + nonlocal encountered_errors + async for output in run_pipeline_with_config( + pipeline_config, + run_id=run_id, + memory_profile=memprofile, + cache=cache, + progress_reporter=progress_reporter, + emit=( + [TableEmitterType(e) for e in pipeline_emit] + if pipeline_emit + else None + ), + is_resume_run=bool(resume), + ): + if output.errors and len(output.errors) > 0: + encountered_errors = True + progress_reporter.error(output.workflow) + else: + progress_reporter.success(output.workflow) + + progress_reporter.info(str(output.result)) + + if platform.system() == "Windows": + import nest_asyncio # type: ignore Ignoring because out of windows this will cause an error + + nest_asyncio.apply() + loop = asyncio.get_event_loop() + loop.run_until_complete(execute()) + elif sys.version_info >= (3, 11): + import uvloop # type: ignore Ignoring because on windows this will cause an error + + with asyncio.Runner(loop_factory=uvloop.new_event_loop) as runner: # type: ignore Ignoring because minor versions this will throw an error + runner.run(execute()) + else: + import uvloop # type: ignore Ignoring because on windows this will cause an error + + uvloop.install() + asyncio.run(execute()) + + _run_workflow_async() + progress_reporter.stop() + if encountered_errors: + progress_reporter.error( + "Errors occurred during the pipeline run, see logs for more details." + ) + else: + progress_reporter.success("All workflows completed successfully.") + + if cli: + sys.exit(1 if encountered_errors else 0) + + +def _initialize_project_at(path: str, reporter: ProgressReporter) -> None: + """Initialize the project at the given path.""" + reporter.info(f"Initializing project at {path}") + root = Path(path) + if not root.exists(): + root.mkdir(parents=True, exist_ok=True) + + settings_yaml = root / "settings.yaml" + if settings_yaml.exists(): + msg = f"Project already initialized at {root}" + raise ValueError(msg) + + dotenv = root / ".env" + if not dotenv.exists(): + with settings_yaml.open("w") as file: + file.write(INIT_YAML) + + with dotenv.open("w") as file: + file.write(INIT_DOTENV) + + prompts_dir = root / "prompts" + if not prompts_dir.exists(): + prompts_dir.mkdir(parents=True, exist_ok=True) + + entity_extraction = prompts_dir / "entity_extraction.txt" + if not entity_extraction.exists(): + with entity_extraction.open("w") as file: + file.write(GRAPH_EXTRACTION_PROMPT) + + summarize_descriptions = prompts_dir / "summarize_descriptions.txt" + if not summarize_descriptions.exists(): + with summarize_descriptions.open("w") as file: + file.write(SUMMARIZE_PROMPT) + + claim_extraction = prompts_dir / "claim_extraction.txt" + if not claim_extraction.exists(): + with claim_extraction.open("w") as file: + file.write(CLAIM_EXTRACTION_PROMPT) + + community_report = prompts_dir / "community_report.txt" + if not community_report.exists(): + with community_report.open("w") as file: + file.write(COMMUNITY_REPORT_PROMPT) + + +def _create_default_config( + root: str, verbose: bool, dryrun: bool, reporter: ProgressReporter +) -> PipelineConfig: + """Create a default config if none is provided.""" + if not Path(root).exists(): + msg = f"Root directory {root} does not exist" + raise ValueError(msg) + + parameters = _read_config_parameters(root, reporter) + log.info( + "using default configuration: %s", + redact(parameters.model_dump()), + ) + + if verbose or dryrun: + reporter.info(f"Using default configuration: {redact(parameters.model_dump())}") + result = create_pipeline_config(parameters, verbose) + if verbose or dryrun: + reporter.info(f"Final Config: {redact(result.model_dump())}") + + if dryrun: + reporter.info("dry run complete, exiting...") + sys.exit(0) + return result + + +def _read_config_parameters(root: str, reporter: ProgressReporter): + _root = Path(root) + settings_yaml = _root / "settings.yaml" + if not settings_yaml.exists(): + settings_yaml = _root / "settings.yml" + settings_json = _root / "settings.json" + + if settings_yaml.exists(): + reporter.success(f"Reading settings from {settings_yaml}") + with settings_yaml.open("r") as file: + import yaml + + data = yaml.safe_load(file) + return create_graphrag_config(data, root) + + if settings_json.exists(): + reporter.success(f"Reading settings from {settings_json}") + with settings_json.open("r") as file: + import json + + data = json.loads(file.read()) + return create_graphrag_config(data, root) + + reporter.success("Reading settings from environment variables") + return create_graphrag_config(root_dir=root) + + +def _get_progress_reporter(reporter_type: str | None) -> ProgressReporter: + if reporter_type is None or reporter_type == "rich": + return RichProgressReporter("GraphRAG Indexer ") + if reporter_type == "print": + return PrintProgressReporter("GraphRAG Indexer ") + if reporter_type == "none": + return NullProgressReporter() + + msg = f"Invalid progress reporter type: {reporter_type}" + raise ValueError(msg) + + +def _enable_logging(root_dir: str, run_id: str, verbose: bool) -> None: + logging_file = ( + Path(root_dir) / "output" / run_id / "reports" / "indexing-engine.log" + ) + logging_file.parent.mkdir(parents=True, exist_ok=True) + + logging_file.touch(exist_ok=True) + + logging.basicConfig( + filename=str(logging_file), + filemode="a", + format="%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s", + datefmt="%H:%M:%S", + level=logging.DEBUG if verbose else logging.INFO, + ) diff --git a/graphrag/index/config/__init__.py b/graphrag/index/config/__init__.py new file mode 100644 index 00000000..3c40762a --- /dev/null +++ b/graphrag/index/config/__init__.py @@ -0,0 +1,69 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine config typing package root.""" + +from .cache import ( + PipelineBlobCacheConfig, + PipelineCacheConfig, + PipelineCacheConfigTypes, + PipelineFileCacheConfig, + PipelineMemoryCacheConfig, + PipelineNoneCacheConfig, +) +from .input import ( + PipelineCSVInputConfig, + PipelineInputConfig, + PipelineInputConfigTypes, + PipelineTextInputConfig, +) +from .pipeline import PipelineConfig +from .reporting import ( + PipelineBlobReportingConfig, + PipelineConsoleReportingConfig, + PipelineFileReportingConfig, + PipelineReportingConfig, + PipelineReportingConfigTypes, +) +from .storage import ( + PipelineBlobStorageConfig, + PipelineFileStorageConfig, + PipelineMemoryStorageConfig, + PipelineStorageConfig, + PipelineStorageConfigTypes, +) +from .workflow import ( + PipelineWorkflowConfig, + PipelineWorkflowReference, + PipelineWorkflowStep, +) + +__all__ = [ + "PipelineBlobCacheConfig", + "PipelineBlobReportingConfig", + "PipelineBlobStorageConfig", + "PipelineCSVInputConfig", + "PipelineCacheConfig", + "PipelineCacheConfigTypes", + "PipelineCacheConfigTypes", + "PipelineCacheConfigTypes", + "PipelineConfig", + "PipelineConsoleReportingConfig", + "PipelineFileCacheConfig", + "PipelineFileReportingConfig", + "PipelineFileStorageConfig", + "PipelineInputConfig", + "PipelineInputConfigTypes", + "PipelineMemoryCacheConfig", + "PipelineMemoryCacheConfig", + "PipelineMemoryStorageConfig", + "PipelineNoneCacheConfig", + "PipelineReportingConfig", + "PipelineReportingConfigTypes", + "PipelineStorageConfig", + "PipelineStorageConfigTypes", + "PipelineTextInputConfig", + "PipelineWorkflowConfig", + "PipelineWorkflowReference", + "PipelineWorkflowStep", +] diff --git a/graphrag/index/config/cache.py b/graphrag/index/config/cache.py new file mode 100644 index 00000000..be1053de --- /dev/null +++ b/graphrag/index/config/cache.py @@ -0,0 +1,82 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'PipelineCacheConfig', 'PipelineFileCacheConfig' and 'PipelineMemoryCacheConfig' models.""" + +from __future__ import annotations + +from typing import Generic, Literal, TypeVar + +from pydantic import BaseModel +from pydantic import Field as pydantic_Field + +from graphrag.config.enums import CacheType + +T = TypeVar("T") + + +class PipelineCacheConfig(BaseModel, Generic[T]): + """Represent the cache configuration for the pipeline.""" + + type: T + + +class PipelineFileCacheConfig(PipelineCacheConfig[Literal[CacheType.file]]): + """Represent the file cache configuration for the pipeline.""" + + type: Literal[CacheType.file] = CacheType.file + """The type of cache.""" + + base_dir: str | None = pydantic_Field( + description="The base directory for the cache.", default=None + ) + """The base directory for the cache.""" + + +class PipelineMemoryCacheConfig(PipelineCacheConfig[Literal[CacheType.memory]]): + """Represent the memory cache configuration for the pipeline.""" + + type: Literal[CacheType.memory] = CacheType.memory + """The type of cache.""" + + +class PipelineNoneCacheConfig(PipelineCacheConfig[Literal[CacheType.none]]): + """Represent the none cache configuration for the pipeline.""" + + type: Literal[CacheType.none] = CacheType.none + """The type of cache.""" + + +class PipelineBlobCacheConfig(PipelineCacheConfig[Literal[CacheType.blob]]): + """Represents the blob cache configuration for the pipeline.""" + + type: Literal[CacheType.blob] = CacheType.blob + """The type of cache.""" + + base_dir: str | None = pydantic_Field( + description="The base directory for the cache.", default=None + ) + """The base directory for the cache.""" + + connection_string: str | None = pydantic_Field( + description="The blob cache connection string for the cache.", default=None + ) + """The blob cache connection string for the cache.""" + + container_name: str = pydantic_Field( + description="The container name for cache", default=None + ) + """The container name for cache""" + + storage_account_blob_url: str | None = pydantic_Field( + description="The storage account blob url for cache", default=None + ) + """The storage account blob url for cache""" + + +PipelineCacheConfigTypes = ( + PipelineFileCacheConfig + | PipelineMemoryCacheConfig + | PipelineBlobCacheConfig + | PipelineNoneCacheConfig +) diff --git a/graphrag/index/config/input.py b/graphrag/index/config/input.py new file mode 100644 index 00000000..35db3575 --- /dev/null +++ b/graphrag/index/config/input.py @@ -0,0 +1,120 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'PipelineInputConfig', 'PipelineCSVInputConfig' and 'PipelineTextInputConfig' models.""" + +from __future__ import annotations + +from typing import Generic, Literal, TypeVar + +from pydantic import BaseModel +from pydantic import Field as pydantic_Field + +from graphrag.config.enums import InputFileType, InputType + +from .workflow import PipelineWorkflowStep + +T = TypeVar("T") + + +class PipelineInputConfig(BaseModel, Generic[T]): + """Represent the configuration for an input.""" + + file_type: T + """The file type of input.""" + + type: InputType | None = pydantic_Field( + description="The input type to use.", + default=None, + ) + """The input type to use.""" + + connection_string: str | None = pydantic_Field( + description="The blob cache connection string for the input files.", + default=None, + ) + """The blob cache connection string for the input files.""" + + storage_account_blob_url: str | None = pydantic_Field( + description="The storage account blob url for the input files.", default=None + ) + """The storage account blob url for the input files.""" + + container_name: str | None = pydantic_Field( + description="The container name for input files.", default=None + ) + """The container name for the input files.""" + + base_dir: str | None = pydantic_Field( + description="The base directory for the input files.", default=None + ) + """The base directory for the input files.""" + + file_pattern: str = pydantic_Field( + description="The regex file pattern for the input files." + ) + """The regex file pattern for the input files.""" + + file_filter: dict[str, str] | None = pydantic_Field( + description="The optional file filter for the input files.", default=None + ) + """The optional file filter for the input files.""" + + post_process: list[PipelineWorkflowStep] | None = pydantic_Field( + description="The post processing steps for the input.", default=None + ) + """The post processing steps for the input.""" + + encoding: str | None = pydantic_Field( + description="The encoding for the input files.", default=None + ) + """The encoding for the input files.""" + + +class PipelineCSVInputConfig(PipelineInputConfig[Literal[InputFileType.csv]]): + """Represent the configuration for a CSV input.""" + + file_type: Literal[InputFileType.csv] = InputFileType.csv + + source_column: str | None = pydantic_Field( + description="The column to use as the source of the document.", default=None + ) + """The column to use as the source of the document.""" + + timestamp_column: str | None = pydantic_Field( + description="The column to use as the timestamp of the document.", default=None + ) + """The column to use as the timestamp of the document.""" + + timestamp_format: str | None = pydantic_Field( + description="The format of the timestamp column, so it can be parsed correctly.", + default=None, + ) + """The format of the timestamp column, so it can be parsed correctly.""" + + text_column: str | None = pydantic_Field( + description="The column to use as the text of the document.", default=None + ) + """The column to use as the text of the document.""" + + title_column: str | None = pydantic_Field( + description="The column to use as the title of the document.", default=None + ) + """The column to use as the title of the document.""" + + +class PipelineTextInputConfig(PipelineInputConfig[Literal[InputFileType.text]]): + """Represent the configuration for a text input.""" + + file_type: Literal[InputFileType.text] = InputFileType.text + + # Text Specific + title_text_length: int | None = pydantic_Field( + description="Number of characters to use from the text as the title.", + default=None, + ) + """Number of characters to use from the text as the title.""" + + +PipelineInputConfigTypes = PipelineCSVInputConfig | PipelineTextInputConfig +"""Represent the types of inputs that can be used in a pipeline.""" diff --git a/graphrag/index/config/pipeline.py b/graphrag/index/config/pipeline.py new file mode 100644 index 00000000..30d866e3 --- /dev/null +++ b/graphrag/index/config/pipeline.py @@ -0,0 +1,64 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'PipelineConfig' model.""" + +from __future__ import annotations + +from devtools import pformat +from pydantic import BaseModel +from pydantic import Field as pydantic_Field + +from .cache import PipelineCacheConfigTypes +from .input import PipelineInputConfigTypes +from .reporting import PipelineReportingConfigTypes +from .storage import PipelineStorageConfigTypes +from .workflow import PipelineWorkflowReference + + +class PipelineConfig(BaseModel): + """Represent the configuration for a pipeline.""" + + def __repr__(self) -> str: + """Get a string representation.""" + return pformat(self, highlight=False) + + def __str__(self): + """Get a string representation.""" + return str(self.model_dump_json(indent=4)) + + extends: list[str] | str | None = pydantic_Field( + description="Extends another pipeline configuration", default=None + ) + """Extends another pipeline configuration""" + + input: PipelineInputConfigTypes | None = pydantic_Field( + default=None, discriminator="file_type" + ) + """The input configuration for the pipeline.""" + + reporting: PipelineReportingConfigTypes | None = pydantic_Field( + default=None, discriminator="type" + ) + """The reporting configuration for the pipeline.""" + + storage: PipelineStorageConfigTypes | None = pydantic_Field( + default=None, discriminator="type" + ) + """The storage configuration for the pipeline.""" + + cache: PipelineCacheConfigTypes | None = pydantic_Field( + default=None, discriminator="type" + ) + """The cache configuration for the pipeline.""" + + root_dir: str | None = pydantic_Field( + description="The root directory for the pipeline. All other paths will be based on this root_dir.", + default=None, + ) + """The root directory for the pipeline.""" + + workflows: list[PipelineWorkflowReference] = pydantic_Field( + description="The workflows for the pipeline.", default_factory=list + ) + """The workflows for the pipeline.""" diff --git a/graphrag/index/config/reporting.py b/graphrag/index/config/reporting.py new file mode 100644 index 00000000..921e24ae --- /dev/null +++ b/graphrag/index/config/reporting.py @@ -0,0 +1,77 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'PipelineReportingConfig', 'PipelineFileReportingConfig' and 'PipelineConsoleReportingConfig' models.""" + +from __future__ import annotations + +from typing import Generic, Literal, TypeVar + +from pydantic import BaseModel +from pydantic import Field as pydantic_Field + +from graphrag.config.enums import ReportingType + +T = TypeVar("T") + + +class PipelineReportingConfig(BaseModel, Generic[T]): + """Represent the reporting configuration for the pipeline.""" + + type: T + + +class PipelineFileReportingConfig(PipelineReportingConfig[Literal[ReportingType.file]]): + """Represent the file reporting configuration for the pipeline.""" + + type: Literal[ReportingType.file] = ReportingType.file + """The type of reporting.""" + + base_dir: str | None = pydantic_Field( + description="The base directory for the reporting.", default=None + ) + """The base directory for the reporting.""" + + +class PipelineConsoleReportingConfig( + PipelineReportingConfig[Literal[ReportingType.console]] +): + """Represent the console reporting configuration for the pipeline.""" + + type: Literal[ReportingType.console] = ReportingType.console + """The type of reporting.""" + + +class PipelineBlobReportingConfig(PipelineReportingConfig[Literal[ReportingType.blob]]): + """Represents the blob reporting configuration for the pipeline.""" + + type: Literal[ReportingType.blob] = ReportingType.blob + """The type of reporting.""" + + connection_string: str | None = pydantic_Field( + description="The blob reporting connection string for the reporting.", + default=None, + ) + """The blob reporting connection string for the reporting.""" + + container_name: str = pydantic_Field( + description="The container name for reporting", default=None + ) + """The container name for reporting""" + + storage_account_blob_url: str | None = pydantic_Field( + description="The storage account blob url for reporting", default=None + ) + """The storage account blob url for reporting""" + + base_dir: str | None = pydantic_Field( + description="The base directory for the reporting.", default=None + ) + """The base directory for the reporting.""" + + +PipelineReportingConfigTypes = ( + PipelineFileReportingConfig + | PipelineConsoleReportingConfig + | PipelineBlobReportingConfig +) diff --git a/graphrag/index/config/storage.py b/graphrag/index/config/storage.py new file mode 100644 index 00000000..023d50e2 --- /dev/null +++ b/graphrag/index/config/storage.py @@ -0,0 +1,72 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'PipelineStorageConfig', 'PipelineFileStorageConfig' and 'PipelineMemoryStorageConfig' models.""" + +from __future__ import annotations + +from typing import Generic, Literal, TypeVar + +from pydantic import BaseModel +from pydantic import Field as pydantic_Field + +from graphrag.config.enums import StorageType + +T = TypeVar("T") + + +class PipelineStorageConfig(BaseModel, Generic[T]): + """Represent the storage configuration for the pipeline.""" + + type: T + + +class PipelineFileStorageConfig(PipelineStorageConfig[Literal[StorageType.file]]): + """Represent the file storage configuration for the pipeline.""" + + type: Literal[StorageType.file] = StorageType.file + """The type of storage.""" + + base_dir: str | None = pydantic_Field( + description="The base directory for the storage.", default=None + ) + """The base directory for the storage.""" + + +class PipelineMemoryStorageConfig(PipelineStorageConfig[Literal[StorageType.memory]]): + """Represent the memory storage configuration for the pipeline.""" + + type: Literal[StorageType.memory] = StorageType.memory + """The type of storage.""" + + +class PipelineBlobStorageConfig(PipelineStorageConfig[Literal[StorageType.blob]]): + """Represents the blob storage configuration for the pipeline.""" + + type: Literal[StorageType.blob] = StorageType.blob + """The type of storage.""" + + connection_string: str | None = pydantic_Field( + description="The blob storage connection string for the storage.", default=None + ) + """The blob storage connection string for the storage.""" + + container_name: str = pydantic_Field( + description="The container name for storage", default=None + ) + """The container name for storage.""" + + base_dir: str | None = pydantic_Field( + description="The base directory for the storage.", default=None + ) + """The base directory for the storage.""" + + storage_account_blob_url: str | None = pydantic_Field( + description="The storage account blob url.", default=None + ) + """The storage account blob url.""" + + +PipelineStorageConfigTypes = ( + PipelineFileStorageConfig | PipelineMemoryStorageConfig | PipelineBlobStorageConfig +) diff --git a/graphrag/index/config/workflow.py b/graphrag/index/config/workflow.py new file mode 100644 index 00000000..c26fef6c --- /dev/null +++ b/graphrag/index/config/workflow.py @@ -0,0 +1,34 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'PipelineWorkflowReference' model.""" + +from __future__ import annotations + +from typing import Any + +from pydantic import BaseModel +from pydantic import Field as pydantic_Field + +PipelineWorkflowStep = dict[str, Any] +"""Represent a step in a workflow.""" + +PipelineWorkflowConfig = dict[str, Any] +"""Represent a configuration for a workflow.""" + + +class PipelineWorkflowReference(BaseModel): + """Represent a reference to a workflow, and can optionally be the workflow itself.""" + + name: str | None = pydantic_Field(description="Name of the workflow.", default=None) + """Name of the workflow.""" + + steps: list[PipelineWorkflowStep] | None = pydantic_Field( + description="The optional steps for the workflow.", default=None + ) + """The optional steps for the workflow.""" + + config: PipelineWorkflowConfig | None = pydantic_Field( + description="The optional configuration for the workflow.", default=None + ) + """The optional configuration for the workflow.""" diff --git a/graphrag/index/context.py b/graphrag/index/context.py new file mode 100644 index 00000000..e74799bd --- /dev/null +++ b/graphrag/index/context.py @@ -0,0 +1,42 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +# isort: skip_file +"""A module containing the 'PipelineRunStats' and 'PipelineRunContext' models.""" + +from dataclasses import dataclass as dc_dataclass +from dataclasses import field + +from .cache import PipelineCache +from .storage.typing import PipelineStorage + + +@dc_dataclass +class PipelineRunStats: + """Pipeline running stats.""" + + total_runtime: float = field(default=0) + """Float representing the total runtime.""" + + num_documents: int = field(default=0) + """Number of documents.""" + + input_load_time: float = field(default=0) + """Float representing the input load time.""" + + workflows: dict[str, dict[str, float]] = field(default_factory=dict) + """A dictionary of workflows.""" + + +@dc_dataclass +class PipelineRunContext: + """Provides the context for the current pipeline run.""" + + stats: PipelineRunStats + storage: PipelineStorage + cache: PipelineCache + + +# TODO: For now, just has the same props available to it +VerbRunContext = PipelineRunContext +"""Provides the context for the current verb run.""" diff --git a/graphrag/index/create_pipeline_config.py b/graphrag/index/create_pipeline_config.py new file mode 100644 index 00000000..40f36247 --- /dev/null +++ b/graphrag/index/create_pipeline_config.py @@ -0,0 +1,548 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Default configuration methods definition.""" + +import json +import logging +from pathlib import Path + +from graphrag.config.enums import ( + CacheType, + InputFileType, + ReportingType, + StorageType, + TextEmbeddingTarget, +) +from graphrag.config.models import ( + GraphRagConfig, + TextEmbeddingConfig, +) +from graphrag.index.config.cache import ( + PipelineBlobCacheConfig, + PipelineCacheConfigTypes, + PipelineFileCacheConfig, + PipelineMemoryCacheConfig, + PipelineNoneCacheConfig, +) +from graphrag.index.config.input import ( + PipelineCSVInputConfig, + PipelineInputConfigTypes, + PipelineTextInputConfig, +) +from graphrag.index.config.pipeline import ( + PipelineConfig, +) +from graphrag.index.config.reporting import ( + PipelineBlobReportingConfig, + PipelineConsoleReportingConfig, + PipelineFileReportingConfig, + PipelineReportingConfigTypes, +) +from graphrag.index.config.storage import ( + PipelineBlobStorageConfig, + PipelineFileStorageConfig, + PipelineMemoryStorageConfig, + PipelineStorageConfigTypes, +) +from graphrag.index.config.workflow import ( + PipelineWorkflowReference, +) +from graphrag.index.workflows.default_workflows import ( + create_base_documents, + create_base_entity_graph, + create_base_extracted_entities, + create_base_text_units, + create_final_communities, + create_final_community_reports, + create_final_covariates, + create_final_documents, + create_final_entities, + create_final_nodes, + create_final_relationships, + create_final_text_units, + create_summarized_entities, + join_text_units_to_covariate_ids, + join_text_units_to_entity_ids, + join_text_units_to_relationship_ids, +) + +log = logging.getLogger(__name__) + + +entity_name_embedding = "entity.name" +entity_description_embedding = "entity.description" +relationship_description_embedding = "relationship.description" +document_raw_content_embedding = "document.raw_content" +community_title_embedding = "community.title" +community_summary_embedding = "community.summary" +community_full_content_embedding = "community.full_content" +text_unit_text_embedding = "text_unit.text" + +all_embeddings: set[str] = { + entity_name_embedding, + entity_description_embedding, + relationship_description_embedding, + document_raw_content_embedding, + community_title_embedding, + community_summary_embedding, + community_full_content_embedding, + text_unit_text_embedding, +} +required_embeddings: set[str] = {entity_description_embedding} + + +builtin_document_attributes: set[str] = { + "id", + "source", + "text", + "title", + "timestamp", + "year", + "month", + "day", + "hour", + "minute", + "second", +} + + +def create_pipeline_config(settings: GraphRagConfig, verbose=False) -> PipelineConfig: + """Get the default config for the pipeline.""" + # relative to the root_dir + if verbose: + _log_llm_settings(settings) + + skip_workflows = _determine_skip_workflows(settings) + embedded_fields = _get_embedded_fields(settings) + covariates_enabled = ( + settings.claim_extraction.enabled + and create_final_covariates not in skip_workflows + ) + + result = PipelineConfig( + root_dir=settings.root_dir, + input=_get_pipeline_input_config(settings), + reporting=_get_reporting_config(settings), + storage=_get_storage_config(settings), + cache=_get_cache_config(settings), + workflows=[ + *_document_workflows(settings, embedded_fields), + *_text_unit_workflows(settings, covariates_enabled, embedded_fields), + *_graph_workflows(settings, embedded_fields), + *_community_workflows(settings, covariates_enabled, embedded_fields), + *(_covariate_workflows(settings) if covariates_enabled else []), + ], + ) + + # Remove any workflows that were specified to be skipped + log.info("skipping workflows %s", ",".join(skip_workflows)) + result.workflows = [w for w in result.workflows if w.name not in skip_workflows] + return result + + +def _get_embedded_fields(settings: GraphRagConfig) -> set[str]: + match settings.embeddings.target: + case TextEmbeddingTarget.all: + return all_embeddings - {*settings.embeddings.skip} + case TextEmbeddingTarget.required: + return required_embeddings + case _: + msg = f"Unknown embeddings target: {settings.embeddings.target}" + raise ValueError(msg) + + +def _determine_skip_workflows(settings: GraphRagConfig) -> list[str]: + skip_workflows = settings.skip_workflows + if ( + create_final_covariates in skip_workflows + and join_text_units_to_covariate_ids not in skip_workflows + ): + skip_workflows.append(join_text_units_to_covariate_ids) + return skip_workflows + + +def _log_llm_settings(settings: GraphRagConfig) -> None: + log.info( + "Using LLM Config %s", + json.dumps( + {**settings.entity_extraction.llm.model_dump(), "api_key": "*****"}, + indent=4, + ), + ) + log.info( + "Using Embeddings Config %s", + json.dumps( + {**settings.embeddings.llm.model_dump(), "api_key": "*****"}, indent=4 + ), + ) + + +def _document_workflows( + settings: GraphRagConfig, embedded_fields: set[str] +) -> list[PipelineWorkflowReference]: + skip_document_raw_content_embedding = ( + document_raw_content_embedding not in embedded_fields + ) + return [ + PipelineWorkflowReference( + name=create_base_documents, + config={ + "document_attribute_columns": list( + {*(settings.input.document_attribute_columns)} + - builtin_document_attributes + ) + }, + ), + PipelineWorkflowReference( + name=create_final_documents, + config={ + "document_raw_content_embed": _get_embedding_settings( + settings.embeddings, "document_raw_content" + ), + "skip_raw_content_embedding": skip_document_raw_content_embedding, + }, + ), + ] + + +def _text_unit_workflows( + settings: GraphRagConfig, + covariates_enabled: bool, + embedded_fields: set[str], +) -> list[PipelineWorkflowReference]: + skip_text_unit_embedding = text_unit_text_embedding not in embedded_fields + return [ + PipelineWorkflowReference( + name=create_base_text_units, + config={ + "chunk_by": settings.chunks.group_by_columns, + "text_chunk": {"strategy": settings.chunks.resolved_strategy()}, + }, + ), + PipelineWorkflowReference( + name=join_text_units_to_entity_ids, + ), + PipelineWorkflowReference( + name=join_text_units_to_relationship_ids, + ), + *( + [ + PipelineWorkflowReference( + name=join_text_units_to_covariate_ids, + ) + ] + if covariates_enabled + else [] + ), + PipelineWorkflowReference( + name=create_final_text_units, + config={ + "text_unit_text_embed": _get_embedding_settings( + settings.embeddings, "text_unit_text" + ), + "covariates_enabled": covariates_enabled, + "skip_text_unit_embedding": skip_text_unit_embedding, + }, + ), + ] + + +def _get_embedding_settings(settings: TextEmbeddingConfig, embedding_name: str) -> dict: + vector_store_settings = settings.vector_store + if vector_store_settings is None: + return {"strategy": settings.resolved_strategy()} + + # + # If we get to this point, settings.vector_store is defined, and there's a specific setting for this embedding. + # settings.vector_store.base contains connection information, or may be undefined + # settings.vector_store. contains the specific settings for this embedding + # + strategy = settings.resolved_strategy() # get the default strategy + strategy.update({ + "vector_store": vector_store_settings + }) # update the default strategy with the vector store settings + # This ensures the vector store config is part of the strategy and not the global config + return { + "strategy": strategy, + "embedding_name": embedding_name, + } + + +def _graph_workflows( + settings: GraphRagConfig, embedded_fields: set[str] +) -> list[PipelineWorkflowReference]: + skip_entity_name_embedding = entity_name_embedding not in embedded_fields + skip_entity_description_embedding = ( + entity_description_embedding not in embedded_fields + ) + skip_relationship_description_embedding = ( + relationship_description_embedding not in embedded_fields + ) + return [ + PipelineWorkflowReference( + name=create_base_extracted_entities, + config={ + "graphml_snapshot": settings.snapshots.graphml, + "raw_entity_snapshot": settings.snapshots.raw_entities, + "entity_extract": { + **settings.entity_extraction.parallelization.model_dump(), + "async_mode": settings.entity_extraction.async_mode, + "strategy": settings.entity_extraction.resolved_strategy( + settings.root_dir, settings.encoding_model + ), + "entity_types": settings.entity_extraction.entity_types, + }, + }, + ), + PipelineWorkflowReference( + name=create_summarized_entities, + config={ + "graphml_snapshot": settings.snapshots.graphml, + "summarize_descriptions": { + **settings.summarize_descriptions.parallelization.model_dump(), + "async_mode": settings.summarize_descriptions.async_mode, + "strategy": settings.summarize_descriptions.resolved_strategy( + settings.root_dir, + ), + }, + }, + ), + PipelineWorkflowReference( + name=create_base_entity_graph, + config={ + "graphml_snapshot": settings.snapshots.graphml, + "embed_graph_enabled": settings.embed_graph.enabled, + "cluster_graph": { + "strategy": settings.cluster_graph.resolved_strategy() + }, + "embed_graph": {"strategy": settings.embed_graph.resolved_strategy()}, + }, + ), + PipelineWorkflowReference( + name=create_final_entities, + config={ + "entity_name_embed": _get_embedding_settings( + settings.embeddings, "entity_name" + ), + "entity_name_description_embed": _get_embedding_settings( + settings.embeddings, "entity_name_description" + ), + "skip_name_embedding": skip_entity_name_embedding, + "skip_description_embedding": skip_entity_description_embedding, + }, + ), + PipelineWorkflowReference( + name=create_final_relationships, + config={ + "relationship_description_embed": _get_embedding_settings( + settings.embeddings, "relationship_description" + ), + "skip_description_embedding": skip_relationship_description_embedding, + }, + ), + PipelineWorkflowReference( + name=create_final_nodes, + config={ + "layout_graph_enabled": settings.umap.enabled, + "snapshot_top_level_nodes": settings.snapshots.top_level_nodes, + }, + ), + ] + + +def _community_workflows( + settings: GraphRagConfig, covariates_enabled: bool, embedded_fields: set[str] +) -> list[PipelineWorkflowReference]: + skip_community_title_embedding = community_title_embedding not in embedded_fields + skip_community_summary_embedding = ( + community_summary_embedding not in embedded_fields + ) + skip_community_full_content_embedding = ( + community_full_content_embedding not in embedded_fields + ) + return [ + PipelineWorkflowReference(name=create_final_communities), + PipelineWorkflowReference( + name=create_final_community_reports, + config={ + "covariates_enabled": covariates_enabled, + "skip_title_embedding": skip_community_title_embedding, + "skip_summary_embedding": skip_community_summary_embedding, + "skip_full_content_embedding": skip_community_full_content_embedding, + "create_community_reports": { + **settings.community_reports.parallelization.model_dump(), + "async_mode": settings.community_reports.async_mode, + "strategy": settings.community_reports.resolved_strategy( + settings.root_dir + ), + }, + "community_report_full_content_embed": _get_embedding_settings( + settings.embeddings, "community_report_full_content" + ), + "community_report_summary_embed": _get_embedding_settings( + settings.embeddings, "community_report_summary" + ), + "community_report_title_embed": _get_embedding_settings( + settings.embeddings, "community_report_title" + ), + }, + ), + ] + + +def _covariate_workflows( + settings: GraphRagConfig, +) -> list[PipelineWorkflowReference]: + return [ + PipelineWorkflowReference( + name=create_final_covariates, + config={ + "claim_extract": { + **settings.claim_extraction.parallelization.model_dump(), + "strategy": settings.claim_extraction.resolved_strategy( + settings.root_dir + ), + }, + }, + ) + ] + + +def _get_pipeline_input_config( + settings: GraphRagConfig, +) -> PipelineInputConfigTypes: + file_type = settings.input.file_type + match file_type: + case InputFileType.csv: + return PipelineCSVInputConfig( + base_dir=settings.input.base_dir, + file_pattern=settings.input.file_pattern, + encoding=settings.input.encoding, + source_column=settings.input.source_column, + timestamp_column=settings.input.timestamp_column, + timestamp_format=settings.input.timestamp_format, + text_column=settings.input.text_column, + title_column=settings.input.title_column, + type=settings.input.type, + connection_string=settings.input.connection_string, + storage_account_blob_url=settings.input.storage_account_blob_url, + container_name=settings.input.container_name, + ) + case InputFileType.text: + return PipelineTextInputConfig( + base_dir=settings.input.base_dir, + file_pattern=settings.input.file_pattern, + encoding=settings.input.encoding, + type=settings.input.type, + connection_string=settings.input.connection_string, + storage_account_blob_url=settings.input.storage_account_blob_url, + container_name=settings.input.container_name, + ) + case _: + msg = f"Unknown input type: {file_type}" + raise ValueError(msg) + + +def _get_reporting_config( + settings: GraphRagConfig, +) -> PipelineReportingConfigTypes: + """Get the reporting config from the settings.""" + match settings.reporting.type: + case ReportingType.file: + # relative to the root_dir + return PipelineFileReportingConfig(base_dir=settings.reporting.base_dir) + case ReportingType.blob: + connection_string = settings.reporting.connection_string + storage_account_blob_url = settings.reporting.storage_account_blob_url + container_name = settings.reporting.container_name + if container_name is None: + msg = "Container name must be provided for blob reporting." + raise ValueError(msg) + if connection_string is None and storage_account_blob_url is None: + msg = "Connection string or storage account blob url must be provided for blob reporting." + raise ValueError(msg) + return PipelineBlobReportingConfig( + connection_string=connection_string, + container_name=container_name, + base_dir=settings.reporting.base_dir, + storage_account_blob_url=storage_account_blob_url, + ) + case ReportingType.console: + return PipelineConsoleReportingConfig() + case _: + # relative to the root_dir + return PipelineFileReportingConfig(base_dir=settings.reporting.base_dir) + + +def _get_storage_config( + settings: GraphRagConfig, +) -> PipelineStorageConfigTypes: + """Get the storage type from the settings.""" + root_dir = settings.root_dir + match settings.storage.type: + case StorageType.memory: + return PipelineMemoryStorageConfig() + case StorageType.file: + # relative to the root_dir + base_dir = settings.storage.base_dir + if base_dir is None: + msg = "Base directory must be provided for file storage." + raise ValueError(msg) + return PipelineFileStorageConfig(base_dir=str(Path(root_dir) / base_dir)) + case StorageType.blob: + connection_string = settings.storage.connection_string + storage_account_blob_url = settings.storage.storage_account_blob_url + container_name = settings.storage.container_name + if container_name is None: + msg = "Container name must be provided for blob storage." + raise ValueError(msg) + if connection_string is None and storage_account_blob_url is None: + msg = "Connection string or storage account blob url must be provided for blob storage." + raise ValueError(msg) + return PipelineBlobStorageConfig( + connection_string=connection_string, + container_name=container_name, + base_dir=settings.storage.base_dir, + storage_account_blob_url=storage_account_blob_url, + ) + case _: + # relative to the root_dir + base_dir = settings.storage.base_dir + if base_dir is None: + msg = "Base directory must be provided for file storage." + raise ValueError(msg) + return PipelineFileStorageConfig(base_dir=str(Path(root_dir) / base_dir)) + + +def _get_cache_config( + settings: GraphRagConfig, +) -> PipelineCacheConfigTypes: + """Get the cache type from the settings.""" + match settings.cache.type: + case CacheType.memory: + return PipelineMemoryCacheConfig() + case CacheType.file: + # relative to root dir + return PipelineFileCacheConfig(base_dir=settings.cache.base_dir) + case CacheType.none: + return PipelineNoneCacheConfig() + case CacheType.blob: + connection_string = settings.cache.connection_string + storage_account_blob_url = settings.cache.storage_account_blob_url + container_name = settings.cache.container_name + if container_name is None: + msg = "Container name must be provided for blob cache." + raise ValueError(msg) + if connection_string is None and storage_account_blob_url is None: + msg = "Connection string or storage account blob url must be provided for blob cache." + raise ValueError(msg) + return PipelineBlobCacheConfig( + connection_string=connection_string, + container_name=container_name, + base_dir=settings.cache.base_dir, + storage_account_blob_url=storage_account_blob_url, + ) + case _: + # relative to root dir + return PipelineFileCacheConfig(base_dir="./cache") diff --git a/graphrag/index/emit/__init__.py b/graphrag/index/emit/__init__.py new file mode 100644 index 00000000..354989e3 --- /dev/null +++ b/graphrag/index/emit/__init__.py @@ -0,0 +1,21 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Definitions for emitting pipeline artifacts to storage.""" + +from .csv_table_emitter import CSVTableEmitter +from .factories import create_table_emitter, create_table_emitters +from .json_table_emitter import JsonTableEmitter +from .parquet_table_emitter import ParquetTableEmitter +from .table_emitter import TableEmitter +from .types import TableEmitterType + +__all__ = [ + "CSVTableEmitter", + "JsonTableEmitter", + "ParquetTableEmitter", + "TableEmitter", + "TableEmitterType", + "create_table_emitter", + "create_table_emitters", +] diff --git a/graphrag/index/emit/csv_table_emitter.py b/graphrag/index/emit/csv_table_emitter.py new file mode 100644 index 00000000..c0305c25 --- /dev/null +++ b/graphrag/index/emit/csv_table_emitter.py @@ -0,0 +1,33 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""CSVTableEmitter module.""" + +import logging + +import pandas as pd + +from graphrag.index.storage import PipelineStorage + +from .table_emitter import TableEmitter + +log = logging.getLogger(__name__) + + +class CSVTableEmitter(TableEmitter): + """CSVTableEmitter class.""" + + _storage: PipelineStorage + + def __init__(self, storage: PipelineStorage): + """Create a new CSV Table Emitter.""" + self._storage = storage + + async def emit(self, name: str, data: pd.DataFrame) -> None: + """Emit a dataframe to storage.""" + filename = f"{name}.csv" + log.info("emitting CSV table %s", filename) + await self._storage.set( + filename, + data.to_csv(), + ) diff --git a/graphrag/index/emit/factories.py b/graphrag/index/emit/factories.py new file mode 100644 index 00000000..84afa684 --- /dev/null +++ b/graphrag/index/emit/factories.py @@ -0,0 +1,41 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Table Emitter Factories.""" + +from graphrag.index.storage import PipelineStorage +from graphrag.index.typing import ErrorHandlerFn + +from .csv_table_emitter import CSVTableEmitter +from .json_table_emitter import JsonTableEmitter +from .parquet_table_emitter import ParquetTableEmitter +from .table_emitter import TableEmitter +from .types import TableEmitterType + + +def create_table_emitter( + emitter_type: TableEmitterType, storage: PipelineStorage, on_error: ErrorHandlerFn +) -> TableEmitter: + """Create a table emitter based on the specified type.""" + match emitter_type: + case TableEmitterType.Json: + return JsonTableEmitter(storage) + case TableEmitterType.Parquet: + return ParquetTableEmitter(storage, on_error) + case TableEmitterType.CSV: + return CSVTableEmitter(storage) + case _: + msg = f"Unsupported table emitter type: {emitter_type}" + raise ValueError(msg) + + +def create_table_emitters( + emitter_types: list[TableEmitterType], + storage: PipelineStorage, + on_error: ErrorHandlerFn, +) -> list[TableEmitter]: + """Create a list of table emitters based on the specified types.""" + return [ + create_table_emitter(emitter_type, storage, on_error) + for emitter_type in emitter_types + ] diff --git a/graphrag/index/emit/json_table_emitter.py b/graphrag/index/emit/json_table_emitter.py new file mode 100644 index 00000000..0b18c717 --- /dev/null +++ b/graphrag/index/emit/json_table_emitter.py @@ -0,0 +1,34 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""JsonTableEmitter module.""" + +import logging + +import pandas as pd + +from graphrag.index.storage import PipelineStorage + +from .table_emitter import TableEmitter + +log = logging.getLogger(__name__) + + +class JsonTableEmitter(TableEmitter): + """JsonTableEmitter class.""" + + _storage: PipelineStorage + + def __init__(self, storage: PipelineStorage): + """Create a new Json Table Emitter.""" + self._storage = storage + + async def emit(self, name: str, data: pd.DataFrame) -> None: + """Emit a dataframe to storage.""" + filename = f"{name}.json" + + log.info("emitting JSON table %s", filename) + await self._storage.set( + filename, + data.to_json(orient="records", lines=True, force_ascii=False), + ) diff --git a/graphrag/index/emit/parquet_table_emitter.py b/graphrag/index/emit/parquet_table_emitter.py new file mode 100644 index 00000000..753915a7 --- /dev/null +++ b/graphrag/index/emit/parquet_table_emitter.py @@ -0,0 +1,54 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""ParquetTableEmitter module.""" + +import logging +import traceback + +import pandas as pd +from pyarrow.lib import ArrowInvalid, ArrowTypeError + +from graphrag.index.storage import PipelineStorage +from graphrag.index.typing import ErrorHandlerFn + +from .table_emitter import TableEmitter + +log = logging.getLogger(__name__) + + +class ParquetTableEmitter(TableEmitter): + """ParquetTableEmitter class.""" + + _storage: PipelineStorage + _on_error: ErrorHandlerFn + + def __init__( + self, + storage: PipelineStorage, + on_error: ErrorHandlerFn, + ): + """Create a new Parquet Table Emitter.""" + self._storage = storage + self._on_error = on_error + + async def emit(self, name: str, data: pd.DataFrame) -> None: + """Emit a dataframe to storage.""" + filename = f"{name}.parquet" + log.info("emitting parquet table %s", filename) + try: + await self._storage.set(filename, data.to_parquet()) + except ArrowTypeError as e: + log.exception("Error while emitting parquet table") + self._on_error( + e, + traceback.format_exc(), + None, + ) + except ArrowInvalid as e: + log.exception("Error while emitting parquet table") + self._on_error( + e, + traceback.format_exc(), + None, + ) diff --git a/graphrag/index/emit/table_emitter.py b/graphrag/index/emit/table_emitter.py new file mode 100644 index 00000000..2161eeb5 --- /dev/null +++ b/graphrag/index/emit/table_emitter.py @@ -0,0 +1,15 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""TableEmitter protocol for emitting tables to a destination.""" + +from typing import Protocol + +import pandas as pd + + +class TableEmitter(Protocol): + """TableEmitter protocol for emitting tables to a destination.""" + + async def emit(self, name: str, data: pd.DataFrame) -> None: + """Emit a dataframe to storage.""" diff --git a/graphrag/index/emit/types.py b/graphrag/index/emit/types.py new file mode 100644 index 00000000..ab345285 --- /dev/null +++ b/graphrag/index/emit/types.py @@ -0,0 +1,14 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Table Emitter Types.""" + +from enum import Enum + + +class TableEmitterType(str, Enum): + """Table Emitter Types.""" + + Json = "json" + Parquet = "parquet" + CSV = "csv" diff --git a/graphrag/index/errors.py b/graphrag/index/errors.py new file mode 100644 index 00000000..430cf27d --- /dev/null +++ b/graphrag/index/errors.py @@ -0,0 +1,25 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""GraphRAG indexing error types.""" + + +class NoWorkflowsDefinedError(ValueError): + """Exception for no workflows defined.""" + + def __init__(self): + super().__init__("No workflows defined.") + + +class UndefinedWorkflowError(ValueError): + """Exception for invalid verb input.""" + + def __init__(self): + super().__init__("Workflow name is undefined.") + + +class UnknownWorkflowError(ValueError): + """Exception for invalid verb input.""" + + def __init__(self, name: str): + super().__init__(f"Unknown workflow: {name}") diff --git a/graphrag/index/graph/__init__.py b/graphrag/index/graph/__init__.py new file mode 100644 index 00000000..cb26e595 --- /dev/null +++ b/graphrag/index/graph/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine graph package root.""" diff --git a/graphrag/index/graph/embedding/__init__.py b/graphrag/index/graph/embedding/__init__.py new file mode 100644 index 00000000..0ea2d085 --- /dev/null +++ b/graphrag/index/graph/embedding/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine graph embedding package root.""" + +from .embedding import NodeEmbeddings, embed_nod2vec + +__all__ = ["NodeEmbeddings", "embed_nod2vec"] diff --git a/graphrag/index/graph/embedding/embedding.py b/graphrag/index/graph/embedding/embedding.py new file mode 100644 index 00000000..267a190f --- /dev/null +++ b/graphrag/index/graph/embedding/embedding.py @@ -0,0 +1,41 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Utilities to generate graph embeddings.""" + +from dataclasses import dataclass + +import graspologic as gc +import networkx as nx +import numpy as np + + +@dataclass +class NodeEmbeddings: + """Node embeddings class definition.""" + + nodes: list[str] + embeddings: np.ndarray + + +def embed_nod2vec( + graph: nx.Graph | nx.DiGraph, + dimensions: int = 1536, + num_walks: int = 10, + walk_length: int = 40, + window_size: int = 2, + iterations: int = 3, + random_seed: int = 86, +) -> NodeEmbeddings: + """Generate node embeddings using Node2Vec.""" + # generate embedding + lcc_tensors = gc.embed.node2vec_embed( # type: ignore + graph=graph, + dimensions=dimensions, + window_size=window_size, + iterations=iterations, + num_walks=num_walks, + walk_length=walk_length, + random_seed=random_seed, + ) + return NodeEmbeddings(embeddings=lcc_tensors[0], nodes=lcc_tensors[1]) diff --git a/graphrag/index/graph/extractors/__init__.py b/graphrag/index/graph/extractors/__init__.py new file mode 100644 index 00000000..9168d5e2 --- /dev/null +++ b/graphrag/index/graph/extractors/__init__.py @@ -0,0 +1,20 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine graph extractors package root.""" + +from .claims import CLAIM_EXTRACTION_PROMPT, ClaimExtractor +from .community_reports import ( + COMMUNITY_REPORT_PROMPT, + CommunityReportsExtractor, +) +from .graph import GraphExtractionResult, GraphExtractor + +__all__ = [ + "CLAIM_EXTRACTION_PROMPT", + "COMMUNITY_REPORT_PROMPT", + "ClaimExtractor", + "CommunityReportsExtractor", + "GraphExtractionResult", + "GraphExtractor", +] diff --git a/graphrag/index/graph/extractors/claims/__init__.py b/graphrag/index/graph/extractors/claims/__init__.py new file mode 100644 index 00000000..3977c8ff --- /dev/null +++ b/graphrag/index/graph/extractors/claims/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine graph extractors claims package root.""" + +from .claim_extractor import ClaimExtractor +from .prompts import CLAIM_EXTRACTION_PROMPT + +__all__ = ["CLAIM_EXTRACTION_PROMPT", "ClaimExtractor"] diff --git a/graphrag/index/graph/extractors/claims/claim_extractor.py b/graphrag/index/graph/extractors/claims/claim_extractor.py new file mode 100644 index 00000000..26bb6e3f --- /dev/null +++ b/graphrag/index/graph/extractors/claims/claim_extractor.py @@ -0,0 +1,245 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'ClaimExtractorResult' and 'ClaimExtractor' models.""" + +import logging +import traceback +from dataclasses import dataclass +from typing import Any + +import tiktoken + +from graphrag.index.typing import ErrorHandlerFn +from graphrag.llm import CompletionLLM + +from .prompts import ( + CLAIM_EXTRACTION_PROMPT, + CONTINUE_PROMPT, + LOOP_PROMPT, +) + +DEFAULT_TUPLE_DELIMITER = "<|>" +DEFAULT_RECORD_DELIMITER = "##" +DEFAULT_COMPLETION_DELIMITER = "<|COMPLETE|>" +log = logging.getLogger(__name__) + + +@dataclass +class ClaimExtractorResult: + """Claim extractor result class definition.""" + + output: list[dict] + source_docs: dict[str, Any] + + +class ClaimExtractor: + """Claim extractor class definition.""" + + _llm: CompletionLLM + _extraction_prompt: str + _summary_prompt: str + _output_formatter_prompt: str + _input_text_key: str + _input_entity_spec_key: str + _input_claim_description_key: str + _tuple_delimiter_key: str + _record_delimiter_key: str + _completion_delimiter_key: str + _max_gleanings: int + _on_error: ErrorHandlerFn + + def __init__( + self, + llm_invoker: CompletionLLM, + extraction_prompt: str | None = None, + input_text_key: str | None = None, + input_entity_spec_key: str | None = None, + input_claim_description_key: str | None = None, + input_resolved_entities_key: str | None = None, + tuple_delimiter_key: str | None = None, + record_delimiter_key: str | None = None, + completion_delimiter_key: str | None = None, + encoding_model: str | None = None, + max_gleanings: int | None = None, + on_error: ErrorHandlerFn | None = None, + ): + """Init method definition.""" + self._llm = llm_invoker + self._extraction_prompt = extraction_prompt or CLAIM_EXTRACTION_PROMPT + self._input_text_key = input_text_key or "input_text" + self._input_entity_spec_key = input_entity_spec_key or "entity_specs" + self._tuple_delimiter_key = tuple_delimiter_key or "tuple_delimiter" + self._record_delimiter_key = record_delimiter_key or "record_delimiter" + self._completion_delimiter_key = ( + completion_delimiter_key or "completion_delimiter" + ) + self._input_claim_description_key = ( + input_claim_description_key or "claim_description" + ) + self._input_resolved_entities_key = ( + input_resolved_entities_key or "resolved_entities" + ) + self._max_gleanings = max_gleanings if max_gleanings is not None else 0 + self._on_error = on_error or (lambda _e, _s, _d: None) + + # Construct the looping arguments + encoding = tiktoken.get_encoding(encoding_model or "cl100k_base") + yes = encoding.encode("YES") + no = encoding.encode("NO") + self._loop_args = {"logit_bias": {yes[0]: 100, no[0]: 100}, "max_tokens": 1} + + async def __call__( + self, inputs: dict[str, Any], prompt_variables: dict | None = None + ) -> ClaimExtractorResult: + """Call method definition.""" + if prompt_variables is None: + prompt_variables = {} + texts = inputs[self._input_text_key] + entity_spec = str(inputs[self._input_entity_spec_key]) + claim_description = inputs[self._input_claim_description_key] + resolved_entities = inputs.get(self._input_resolved_entities_key, {}) + source_doc_map = {} + + prompt_args = { + self._input_entity_spec_key: entity_spec, + self._input_claim_description_key: claim_description, + self._tuple_delimiter_key: prompt_variables.get(self._tuple_delimiter_key) + or DEFAULT_TUPLE_DELIMITER, + self._record_delimiter_key: prompt_variables.get(self._record_delimiter_key) + or DEFAULT_RECORD_DELIMITER, + self._completion_delimiter_key: prompt_variables.get( + self._completion_delimiter_key + ) + or DEFAULT_COMPLETION_DELIMITER, + } + + all_claims: list[dict] = [] + for doc_index, text in enumerate(texts): + document_id = f"d{doc_index}" + try: + claims = await self._process_document(prompt_args, text, doc_index) + all_claims += [ + self._clean_claim(c, document_id, resolved_entities) for c in claims + ] + source_doc_map[document_id] = text + except Exception as e: + log.exception("error extracting claim") + self._on_error( + e, + traceback.format_exc(), + {"doc_index": doc_index, "text": text}, + ) + continue + + return ClaimExtractorResult( + output=all_claims, + source_docs=source_doc_map, + ) + + def _clean_claim( + self, claim: dict, document_id: str, resolved_entities: dict + ) -> dict: + # clean the parsed claims to remove any claims with status = False + obj = claim.get("object_id", claim.get("object")) + subject = claim.get("subject_id", claim.get("subject")) + + # If subject or object in resolved entities, then replace with resolved entity + obj = resolved_entities.get(obj, obj) + subject = resolved_entities.get(subject, subject) + claim["object_id"] = obj + claim["subject_id"] = subject + claim["doc_id"] = document_id + return claim + + async def _process_document( + self, prompt_args: dict, doc, doc_index: int + ) -> list[dict]: + record_delimiter = prompt_args.get( + self._record_delimiter_key, DEFAULT_RECORD_DELIMITER + ) + completion_delimiter = prompt_args.get( + self._completion_delimiter_key, DEFAULT_COMPLETION_DELIMITER + ) + + response = await self._llm( + self._extraction_prompt, + variables={ + self._input_text_key: doc, + **prompt_args, + }, + ) + results = response.output or "" + claims = results.strip().removesuffix(completion_delimiter) + + # Repeat to ensure we maximize entity count + for i in range(self._max_gleanings): + glean_response = await self._llm( + CONTINUE_PROMPT, + name=f"extract-continuation-{i}", + history=response.history or [], + ) + extension = glean_response.output or "" + claims += record_delimiter + extension.strip().removesuffix( + completion_delimiter + ) + + # If this isn't the last loop, check to see if we should continue + if i >= self._max_gleanings - 1: + break + + continue_response = await self._llm( + LOOP_PROMPT, + name=f"extract-loopcheck-{i}", + history=glean_response.history or [], + model_parameters=self._loop_args, + ) + if continue_response.output != "YES": + break + + result = self._parse_claim_tuples(results, prompt_args) + for r in result: + r["doc_id"] = f"{doc_index}" + return result + + def _parse_claim_tuples( + self, claims: str, prompt_variables: dict + ) -> list[dict[str, Any]]: + """Parse claim tuples.""" + record_delimiter = prompt_variables.get( + self._record_delimiter_key, DEFAULT_RECORD_DELIMITER + ) + completion_delimiter = prompt_variables.get( + self._completion_delimiter_key, DEFAULT_COMPLETION_DELIMITER + ) + tuple_delimiter = prompt_variables.get( + self._tuple_delimiter_key, DEFAULT_TUPLE_DELIMITER + ) + + def pull_field(index: int, fields: list[str]) -> str | None: + return fields[index].strip() if len(fields) > index else None + + result: list[dict[str, Any]] = [] + claims_values = ( + claims.strip().removesuffix(completion_delimiter).split(record_delimiter) + ) + for claim in claims_values: + claim = claim.strip().removeprefix("(").removesuffix(")") + + # Ignore the completion delimiter + if claim == completion_delimiter: + continue + + claim_fields = claim.split(tuple_delimiter) + result.append({ + "subject_id": pull_field(0, claim_fields), + "object_id": pull_field(1, claim_fields), + "type": pull_field(2, claim_fields), + "status": pull_field(3, claim_fields), + "start_date": pull_field(4, claim_fields), + "end_date": pull_field(5, claim_fields), + "description": pull_field(6, claim_fields), + "source_text": pull_field(7, claim_fields), + "doc_id": pull_field(8, claim_fields), + }) + return result diff --git a/graphrag/index/graph/extractors/claims/prompts.py b/graphrag/index/graph/extractors/claims/prompts.py new file mode 100644 index 00000000..05b3153c --- /dev/null +++ b/graphrag/index/graph/extractors/claims/prompts.py @@ -0,0 +1,61 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A file containing prompts definition.""" + +CLAIM_EXTRACTION_PROMPT = """ +-Target activity- +You are an intelligent assistant that helps a human analyst to analyze claims against certain entities presented in a text document. + +-Goal- +Given a text document that is potentially relevant to this activity, an entity specification, and a claim description, extract all entities that match the entity specification and all claims against those entities. + +-Steps- +1. Extract all named entities that match the predefined entity specification. Entity specification can either be a list of entity names or a list of entity types. +2. For each entity identified in step 1, extract all claims associated with the entity. Claims need to match the specified claim description, and the entity should be the subject of the claim. +For each claim, extract the following information: +- Subject: name of the entity that is subject of the claim, capitalized. The subject entity is one that committed the action described in the claim. Subject needs to be one of the named entities identified in step 1. +- Object: name of the entity that is object of the claim, capitalized. The object entity is one that either reports/handles or is affected by the action described in the claim. If object entity is unknown, use **NONE**. +- Claim Type: overall category of the claim, capitalized. Name it in a way that can be repeated across multiple text inputs, so that similar claims share the same claim type +- Claim Status: **TRUE**, **FALSE**, or **SUSPECTED**. TRUE means the claim is confirmed, FALSE means the claim is found to be False, SUSPECTED means the claim is not verified. +- Claim Description: Detailed description explaining the reasoning behind the claim, together with all the related evidence and references. +- Claim Date: Period (start_date, end_date) when the claim was made. Both start_date and end_date should be in ISO-8601 format. If the claim was made on a single date rather than a date range, set the same date for both start_date and end_date. If date is unknown, return **NONE**. +- Claim Source Text: List of **all** quotes from the original text that are relevant to the claim. + +Format each claim as ({tuple_delimiter}{tuple_delimiter}{tuple_delimiter}{tuple_delimiter}{tuple_delimiter}{tuple_delimiter}{tuple_delimiter}) + +3. Return output in English as a single list of all the claims identified in steps 1 and 2. Use **{record_delimiter}** as the list delimiter. + +4. When finished, output {completion_delimiter} + +-Examples- +Example 1: +Entity specification: organization +Claim description: red flags associated with an entity +Text: According to an article on 2022/01/10, Company A was fined for bid rigging while participating in multiple public tenders published by Government Agency B. The company is owned by Person C who was suspected of engaging in corruption activities in 2015. +Output: + +(COMPANY A{tuple_delimiter}GOVERNMENT AGENCY B{tuple_delimiter}ANTI-COMPETITIVE PRACTICES{tuple_delimiter}TRUE{tuple_delimiter}2022-01-10T00:00:00{tuple_delimiter}2022-01-10T00:00:00{tuple_delimiter}Company A was found to engage in anti-competitive practices because it was fined for bid rigging in multiple public tenders published by Government Agency B according to an article published on 2022/01/10{tuple_delimiter}According to an article published on 2022/01/10, Company A was fined for bid rigging while participating in multiple public tenders published by Government Agency B.) +{completion_delimiter} + +Example 2: +Entity specification: Company A, Person C +Claim description: red flags associated with an entity +Text: According to an article on 2022/01/10, Company A was fined for bid rigging while participating in multiple public tenders published by Government Agency B. The company is owned by Person C who was suspected of engaging in corruption activities in 2015. +Output: + +(COMPANY A{tuple_delimiter}GOVERNMENT AGENCY B{tuple_delimiter}ANTI-COMPETITIVE PRACTICES{tuple_delimiter}TRUE{tuple_delimiter}2022-01-10T00:00:00{tuple_delimiter}2022-01-10T00:00:00{tuple_delimiter}Company A was found to engage in anti-competitive practices because it was fined for bid rigging in multiple public tenders published by Government Agency B according to an article published on 2022/01/10{tuple_delimiter}According to an article published on 2022/01/10, Company A was fined for bid rigging while participating in multiple public tenders published by Government Agency B.) +{record_delimiter} +(PERSON C{tuple_delimiter}NONE{tuple_delimiter}CORRUPTION{tuple_delimiter}SUSPECTED{tuple_delimiter}2015-01-01T00:00:00{tuple_delimiter}2015-12-30T00:00:00{tuple_delimiter}Person C was suspected of engaging in corruption activities in 2015{tuple_delimiter}The company is owned by Person C who was suspected of engaging in corruption activities in 2015) +{completion_delimiter} + +-Real Data- +Use the following input for your answer. +Entity specification: {entity_specs} +Claim description: {claim_description} +Text: {input_text} +Output:""" + + +CONTINUE_PROMPT = "MANY entities were missed in the last extraction. Add them below using the same format:\n" +LOOP_PROMPT = "It appears some entities may have still been missed. Answer YES {tuple_delimiter} NO if there are still entities that need to be added.\n" diff --git a/graphrag/index/graph/extractors/community_reports/__init__.py b/graphrag/index/graph/extractors/community_reports/__init__.py new file mode 100644 index 00000000..599f56d6 --- /dev/null +++ b/graphrag/index/graph/extractors/community_reports/__init__.py @@ -0,0 +1,35 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine community reports package root.""" + +import graphrag.index.graph.extractors.community_reports.schemas as schemas + +from .build_mixed_context import build_mixed_context +from .community_reports_extractor import CommunityReportsExtractor +from .prep_community_report_context import prep_community_report_context +from .prompts import COMMUNITY_REPORT_PROMPT +from .sort_context import sort_context +from .utils import ( + filter_claims_to_nodes, + filter_edges_to_nodes, + filter_nodes_to_level, + get_levels, + set_context_exceeds_flag, + set_context_size, +) + +__all__ = [ + "COMMUNITY_REPORT_PROMPT", + "CommunityReportsExtractor", + "build_mixed_context", + "filter_claims_to_nodes", + "filter_edges_to_nodes", + "filter_nodes_to_level", + "get_levels", + "prep_community_report_context", + "schemas", + "set_context_exceeds_flag", + "set_context_size", + "sort_context", +] diff --git a/graphrag/index/graph/extractors/community_reports/build_mixed_context.py b/graphrag/index/graph/extractors/community_reports/build_mixed_context.py new file mode 100644 index 00000000..ad9e2a84 --- /dev/null +++ b/graphrag/index/graph/extractors/community_reports/build_mixed_context.py @@ -0,0 +1,69 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +"""A module containing the build_mixed_context method definition.""" + +import pandas as pd + +import graphrag.index.graph.extractors.community_reports.schemas as schemas +from graphrag.query.llm.text_utils import num_tokens + +from .sort_context import sort_context + + +def build_mixed_context(context: list[dict], max_tokens: int) -> str: + """ + Build parent context by concatenating all sub-communities' contexts. + + If the context exceeds the limit, we use sub-community reports instead. + """ + sorted_context = sorted( + context, key=lambda x: x[schemas.CONTEXT_SIZE], reverse=True + ) + + # replace local context with sub-community reports, starting from the biggest sub-community + substitute_reports = [] + final_local_contexts = [] + exceeded_limit = True + context_string = "" + + for idx, sub_community_context in enumerate(sorted_context): + if exceeded_limit: + if sub_community_context[schemas.FULL_CONTENT]: + substitute_reports.append({ + schemas.COMMUNITY_ID: sub_community_context[schemas.SUB_COMMUNITY], + schemas.FULL_CONTENT: sub_community_context[schemas.FULL_CONTENT], + }) + else: + # this sub-community has no report, so we will use its local context + final_local_contexts.extend(sub_community_context[schemas.ALL_CONTEXT]) + continue + + # add local context for the remaining sub-communities + remaining_local_context = [] + for rid in range(idx + 1, len(sorted_context)): + remaining_local_context.extend(sorted_context[rid][schemas.ALL_CONTEXT]) + new_context_string = sort_context( + local_context=remaining_local_context + final_local_contexts, + sub_community_reports=substitute_reports, + ) + if num_tokens(new_context_string) <= max_tokens: + exceeded_limit = False + context_string = new_context_string + break + + if exceeded_limit: + # if all sub-community reports exceed the limit, we add reports until context is full + substitute_reports = [] + for sub_community_context in sorted_context: + substitute_reports.append({ + schemas.COMMUNITY_ID: sub_community_context[schemas.SUB_COMMUNITY], + schemas.FULL_CONTENT: sub_community_context[schemas.FULL_CONTENT], + }) + new_context_string = pd.DataFrame(substitute_reports).to_csv( + index=False, sep="," + ) + if num_tokens(new_context_string) > max_tokens: + break + + context_string = new_context_string + return context_string diff --git a/graphrag/index/graph/extractors/community_reports/community_reports_extractor.py b/graphrag/index/graph/extractors/community_reports/community_reports_extractor.py new file mode 100644 index 00000000..309336fe --- /dev/null +++ b/graphrag/index/graph/extractors/community_reports/community_reports_extractor.py @@ -0,0 +1,107 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'CommunityReportsResult' and 'CommunityReportsExtractor' models.""" + +import logging +import traceback +from dataclasses import dataclass +from typing import Any + +from graphrag.index.typing import ErrorHandlerFn +from graphrag.index.utils import dict_has_keys_with_types +from graphrag.llm import CompletionLLM + +from .prompts import COMMUNITY_REPORT_PROMPT + +log = logging.getLogger(__name__) + + +@dataclass +class CommunityReportsResult: + """Community reports result class definition.""" + + output: str + structured_output: dict + + +class CommunityReportsExtractor: + """Community reports extractor class definition.""" + + _llm: CompletionLLM + _input_text_key: str + _extraction_prompt: str + _output_formatter_prompt: str + _on_error: ErrorHandlerFn + _max_report_length: int + + def __init__( + self, + llm_invoker: CompletionLLM, + input_text_key: str | None = None, + extraction_prompt: str | None = None, + on_error: ErrorHandlerFn | None = None, + max_report_length: int | None = None, + ): + """Init method definition.""" + self._llm = llm_invoker + self._input_text_key = input_text_key or "input_text" + self._extraction_prompt = extraction_prompt or COMMUNITY_REPORT_PROMPT + self._on_error = on_error or (lambda _e, _s, _d: None) + self._max_report_length = max_report_length or 1500 + + async def __call__(self, inputs: dict[str, Any]): + """Call method definition.""" + output = None + try: + response = ( + await self._llm( + self._extraction_prompt, + json=True, + name="create_community_report", + variables={self._input_text_key: inputs[self._input_text_key]}, + is_response_valid=lambda x: dict_has_keys_with_types( + x, + [ + ("title", str), + ("summary", str), + ("findings", list), + ("rating", float), + ("rating_explanation", str), + ], + ), + model_parameters={"max_tokens": self._max_report_length}, + ) + or {} + ) + output = response.json or {} + except Exception as e: + log.exception("error generating community report") + self._on_error(e, traceback.format_exc(), None) + output = {} + + text_output = self._get_text_output(output) + return CommunityReportsResult( + structured_output=output, + output=text_output, + ) + + def _get_text_output(self, parsed_output: dict) -> str: + title = parsed_output.get("title", "Report") + summary = parsed_output.get("summary", "") + findings = parsed_output.get("findings", []) + + def finding_summary(finding: dict): + if isinstance(finding, str): + return finding + return finding.get("summary") + + def finding_explanation(finding: dict): + if isinstance(finding, str): + return "" + return finding.get("explanation") + + report_sections = "\n\n".join( + f"## {finding_summary(f)}\n\n{finding_explanation(f)}" for f in findings + ) + return f"# {title}\n\n{summary}\n\n{report_sections}" diff --git a/graphrag/index/graph/extractors/community_reports/prep_community_report_context.py b/graphrag/index/graph/extractors/community_reports/prep_community_report_context.py new file mode 100644 index 00000000..2ec42220 --- /dev/null +++ b/graphrag/index/graph/extractors/community_reports/prep_community_report_context.py @@ -0,0 +1,181 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing create_community_reports and load_strategy methods definition.""" + +import logging +from typing import cast + +import pandas as pd + +import graphrag.index.graph.extractors.community_reports.schemas as schemas +from graphrag.index.utils.dataframes import ( + antijoin, + drop_columns, + join, + select, + transform_series, + union, + where_column_equals, +) + +from .build_mixed_context import build_mixed_context +from .sort_context import sort_context +from .utils import set_context_size + +log = logging.getLogger(__name__) + + +def prep_community_report_context( + report_df: pd.DataFrame | None, + community_hierarchy_df: pd.DataFrame, + local_context_df: pd.DataFrame, + level: int | str, + max_tokens: int, +) -> pd.DataFrame: + """ + Prep context for each community in a given level. + + For each community: + - Check if local context fits within the limit, if yes use local context + - If local context exceeds the limit, iteratively replace local context with sub-community reports, starting from the biggest sub-community + """ + if report_df is None: + report_df = pd.DataFrame() + + level = int(level) + level_context_df = _at_level(level, local_context_df) + valid_context_df = _within_context(level_context_df) + invalid_context_df = _exceeding_context(level_context_df) + + # there is no report to substitute with, so we just trim the local context of the invalid context records + # this case should only happen at the bottom level of the community hierarchy where there are no sub-communities + if invalid_context_df.empty: + return valid_context_df + + if report_df.empty: + invalid_context_df[schemas.CONTEXT_STRING] = _sort_and_trim_context( + invalid_context_df, max_tokens + ) + set_context_size(invalid_context_df) + invalid_context_df[schemas.CONTEXT_EXCEED_FLAG] = 0 + return union(valid_context_df, invalid_context_df) + + level_context_df = _antijoin_reports(level_context_df, report_df) + + # for each invalid context, we will try to substitute with sub-community reports + # first get local context and report (if available) for each sub-community + sub_context_df = _get_subcontext_df(level + 1, report_df, local_context_df) + community_df = _get_community_df( + level, invalid_context_df, sub_context_df, community_hierarchy_df, max_tokens + ) + + # handle any remaining invalid records that can't be subsituted with sub-community reports + # this should be rare, but if it happens, we will just trim the local context to fit the limit + remaining_df = _antijoin_reports(invalid_context_df, community_df) + remaining_df[schemas.CONTEXT_STRING] = _sort_and_trim_context( + remaining_df, max_tokens + ) + + result = union(valid_context_df, community_df, remaining_df) + set_context_size(result) + result[schemas.CONTEXT_EXCEED_FLAG] = 0 + return result + + +def _drop_community_level(df: pd.DataFrame) -> pd.DataFrame: + """Drop the community level column from the dataframe.""" + return drop_columns(df, schemas.COMMUNITY_LEVEL) + + +def _at_level(level: int, df: pd.DataFrame) -> pd.DataFrame: + """Return records at the given level.""" + return where_column_equals(df, schemas.COMMUNITY_LEVEL, level) + + +def _exceeding_context(df: pd.DataFrame) -> pd.DataFrame: + """Return records where the context exceeds the limit.""" + return where_column_equals(df, schemas.CONTEXT_EXCEED_FLAG, 1) + + +def _within_context(df: pd.DataFrame) -> pd.DataFrame: + """Return records where the context is within the limit.""" + return where_column_equals(df, schemas.CONTEXT_EXCEED_FLAG, 0) + + +def _antijoin_reports(df: pd.DataFrame, reports: pd.DataFrame) -> pd.DataFrame: + """Return records in df that are not in reports.""" + return antijoin(df, reports, schemas.NODE_COMMUNITY) + + +def _sort_and_trim_context(df: pd.DataFrame, max_tokens: int) -> pd.Series: + """Sort and trim context to fit the limit.""" + series = cast(pd.Series, df[schemas.ALL_CONTEXT]) + return transform_series(series, lambda x: sort_context(x, max_tokens=max_tokens)) + + +def _build_mixed_context(df: pd.DataFrame, max_tokens: int) -> pd.Series: + """Sort and trim context to fit the limit.""" + series = cast(pd.Series, df[schemas.ALL_CONTEXT]) + return transform_series( + series, lambda x: build_mixed_context(x, max_tokens=max_tokens) + ) + + +def _get_subcontext_df( + level: int, report_df: pd.DataFrame, local_context_df: pd.DataFrame +) -> pd.DataFrame: + """Get sub-community context for each community.""" + sub_report_df = _drop_community_level(_at_level(level, report_df)) + sub_context_df = _at_level(level, local_context_df) + sub_context_df = join(sub_context_df, sub_report_df, schemas.NODE_COMMUNITY) + sub_context_df.rename( + columns={schemas.NODE_COMMUNITY: schemas.SUB_COMMUNITY}, inplace=True + ) + return sub_context_df + + +def _get_community_df( + level: int, + invalid_context_df: pd.DataFrame, + sub_context_df: pd.DataFrame, + community_hierarchy_df: pd.DataFrame, + max_tokens: int, +) -> pd.DataFrame: + """Get community context for each community.""" + # collect all sub communities' contexts for each community + community_df = _drop_community_level(_at_level(level, community_hierarchy_df)) + invalid_community_ids = select(invalid_context_df, schemas.NODE_COMMUNITY) + subcontext_selection = select( + sub_context_df, + schemas.SUB_COMMUNITY, + schemas.FULL_CONTENT, + schemas.ALL_CONTEXT, + schemas.CONTEXT_SIZE, + ) + + invalid_communities = join( + community_df, invalid_community_ids, schemas.NODE_COMMUNITY, "inner" + ) + community_df = join( + invalid_communities, subcontext_selection, schemas.SUB_COMMUNITY + ) + community_df[schemas.ALL_CONTEXT] = community_df.apply( + lambda x: { + schemas.SUB_COMMUNITY: x[schemas.SUB_COMMUNITY], + schemas.ALL_CONTEXT: x[schemas.ALL_CONTEXT], + schemas.FULL_CONTENT: x[schemas.FULL_CONTENT], + schemas.CONTEXT_SIZE: x[schemas.CONTEXT_SIZE], + }, + axis=1, + ) + community_df = ( + community_df.groupby(schemas.NODE_COMMUNITY) + .agg({schemas.ALL_CONTEXT: list}) + .reset_index() + ) + community_df[schemas.CONTEXT_STRING] = _build_mixed_context( + community_df, max_tokens + ) + community_df[schemas.COMMUNITY_LEVEL] = level + return community_df diff --git a/graphrag/index/graph/extractors/community_reports/prompts.py b/graphrag/index/graph/extractors/community_reports/prompts.py new file mode 100644 index 00000000..35ca38bc --- /dev/null +++ b/graphrag/index/graph/extractors/community_reports/prompts.py @@ -0,0 +1,150 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +"""A file containing prompts definition.""" + +COMMUNITY_REPORT_PROMPT = """ +You are an AI assistant that helps a human analyst to perform general information discovery. Information discovery is the process of identifying and assessing relevant information associated with certain entities (e.g., organizations and individuals) within a network. + +# Goal +Write a comprehensive report of a community, given a list of entities that belong to the community as well as their relationships and optional associated claims. The report will be used to inform decision-makers about information associated with the community and their potential impact. The content of this report includes an overview of the community's key entities, their legal compliance, technical capabilities, reputation, and noteworthy claims. + +# Report Structure + +The report should include the following sections: + +- TITLE: community's name that represents its key entities - title should be short but specific. When possible, include representative named entities in the title. +- SUMMARY: An executive summary of the community's overall structure, how its entities are related to each other, and significant information associated with its entities. +- IMPACT SEVERITY RATING: a float score between 0-10 that represents the severity of IMPACT posed by entities within the community. IMPACT is the scored importance of a community. +- RATING EXPLANATION: Give a single sentence explanation of the IMPACT severity rating. +- DETAILED FINDINGS: A list of 5-10 key insights about the community. Each insight should have a short summary followed by multiple paragraphs of explanatory text grounded according to the grounding rules below. Be comprehensive. + +Return output as a well-formed JSON-formatted string with the following format: + {{ + "title": , + "summary": , + "rating": , + "rating_explanation": , + "findings": [ + {{ + "summary":, + "explanation": + }}, + {{ + "summary":, + "explanation": + }} + ] + }} + +# Grounding Rules + +Points supported by data should list their data references as follows: + +"This is an example sentence supported by multiple data references [Data: (record ids); (record ids)]." + +Do not list more than 5 record ids in a single reference. Instead, list the top 5 most relevant record ids and add "+more" to indicate that there are more. + +For example: +"Person X is the owner of Company Y and subject to many allegations of wrongdoing [Data: Reports (1), Entities (5, 7); Relationships (23); Claims (7, 2, 34, 64, 46, +more)]." + +where 1, 5, 7, 23, 2, 34, 46, and 64 represent the id (not the index) of the relevant data record. + +Do not include information where the supporting evidence for it is not provided. + + +# Example Input +----------- +Text: + +Entities + +id,entity,description +5,VERDANT OASIS PLAZA,Verdant Oasis Plaza is the location of the Unity March +6,HARMONY ASSEMBLY,Harmony Assembly is an organization that is holding a march at Verdant Oasis Plaza + +Relationships + +id,source,target,description +37,VERDANT OASIS PLAZA,UNITY MARCH,Verdant Oasis Plaza is the location of the Unity March +38,VERDANT OASIS PLAZA,HARMONY ASSEMBLY,Harmony Assembly is holding a march at Verdant Oasis Plaza +39,VERDANT OASIS PLAZA,UNITY MARCH,The Unity March is taking place at Verdant Oasis Plaza +40,VERDANT OASIS PLAZA,TRIBUNE SPOTLIGHT,Tribune Spotlight is reporting on the Unity march taking place at Verdant Oasis Plaza +41,VERDANT OASIS PLAZA,BAILEY ASADI,Bailey Asadi is speaking at Verdant Oasis Plaza about the march +43,HARMONY ASSEMBLY,UNITY MARCH,Harmony Assembly is organizing the Unity March + +Output: +{{ + "title": "Verdant Oasis Plaza and Unity March", + "summary": "The community revolves around the Verdant Oasis Plaza, which is the location of the Unity March. The plaza has relationships with the Harmony Assembly, Unity March, and Tribune Spotlight, all of which are associated with the march event.", + "rating": 5.0, + "rating_explanation": "The impact severity rating is moderate due to the potential for unrest or conflict during the Unity March.", + "findings": [ + {{ + "summary": "Verdant Oasis Plaza as the central location", + "explanation": "Verdant Oasis Plaza is the central entity in this community, serving as the location for the Unity March. This plaza is the common link between all other entities, suggesting its significance in the community. The plaza's association with the march could potentially lead to issues such as public disorder or conflict, depending on the nature of the march and the reactions it provokes. [Data: Entities (5), Relationships (37, 38, 39, 40, 41,+more)]" + }}, + {{ + "summary": "Harmony Assembly's role in the community", + "explanation": "Harmony Assembly is another key entity in this community, being the organizer of the march at Verdant Oasis Plaza. The nature of Harmony Assembly and its march could be a potential source of threat, depending on their objectives and the reactions they provoke. The relationship between Harmony Assembly and the plaza is crucial in understanding the dynamics of this community. [Data: Entities(6), Relationships (38, 43)]" + }}, + {{ + "summary": "Unity March as a significant event", + "explanation": "The Unity March is a significant event taking place at Verdant Oasis Plaza. This event is a key factor in the community's dynamics and could be a potential source of threat, depending on the nature of the march and the reactions it provokes. The relationship between the march and the plaza is crucial in understanding the dynamics of this community. [Data: Relationships (39)]" + }}, + {{ + "summary": "Role of Tribune Spotlight", + "explanation": "Tribune Spotlight is reporting on the Unity March taking place in Verdant Oasis Plaza. This suggests that the event has attracted media attention, which could amplify its impact on the community. The role of Tribune Spotlight could be significant in shaping public perception of the event and the entities involved. [Data: Relationships (40)]" + }} + ] +}} + + +# Real Data + +Use the following text for your answer. Do not make anything up in your answer. + +Text: +{input_text} + +The report should include the following sections: + +- TITLE: community's name that represents its key entities - title should be short but specific. When possible, include representative named entities in the title. +- SUMMARY: An executive summary of the community's overall structure, how its entities are related to each other, and significant information associated with its entities. +- IMPACT SEVERITY RATING: a float score between 0-10 that represents the severity of IMPACT posed by entities within the community. IMPACT is the scored importance of a community. +- RATING EXPLANATION: Give a single sentence explanation of the IMPACT severity rating. +- DETAILED FINDINGS: A list of 5-10 key insights about the community. Each insight should have a short summary followed by multiple paragraphs of explanatory text grounded according to the grounding rules below. Be comprehensive. + +Return output as a well-formed JSON-formatted string with the following format: + {{ + "title": , + "summary": , + "rating": , + "rating_explanation": , + "findings": [ + {{ + "summary":, + "explanation": + }}, + {{ + "summary":, + "explanation": + }} + ] + }} + +# Grounding Rules + +Points supported by data should list their data references as follows: + +"This is an example sentence supported by multiple data references [Data: (record ids); (record ids)]." + +Do not list more than 5 record ids in a single reference. Instead, list the top 5 most relevant record ids and add "+more" to indicate that there are more. + +For example: +"Person X is the owner of Company Y and subject to many allegations of wrongdoing [Data: Reports (1), Entities (5, 7); Relationships (23); Claims (7, 2, 34, 64, 46, +more)]." + +where 1, 5, 7, 23, 2, 34, 46, and 64 represent the id (not the index) of the relevant data record. + +Do not include information where the supporting evidence for it is not provided. + +Output:""" diff --git a/graphrag/index/graph/extractors/community_reports/schemas.py b/graphrag/index/graph/extractors/community_reports/schemas.py new file mode 100644 index 00000000..8e89e027 --- /dev/null +++ b/graphrag/index/graph/extractors/community_reports/schemas.py @@ -0,0 +1,52 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +"""Common field name definitions for community reports.""" + +# POST-PREP NODE TABLE SCHEMA +NODE_ID = "human_readable_id" +NODE_NAME = "title" +NODE_DESCRIPTION = "description" +NODE_DEGREE = "degree" +NODE_DETAILS = "node_details" +NODE_COMMUNITY = "community" +NODE_LEVEL = "level" + +# POST-PREP EDGE TABLE SCHEMA +EDGE_ID = "human_readable_id" +EDGE_SOURCE = "source" +EDGE_TARGET = "target" +EDGE_DESCRIPTION = "description" +EDGE_DEGREE = "rank" +EDGE_DETAILS = "edge_details" +EDGE_WEIGHT = "weight" + +# POST-PREP CLAIM TABLE SCHEMA +CLAIM_ID = "human_readable_id" +CLAIM_SUBJECT = "subject_id" +CLAIM_TYPE = "type" +CLAIM_STATUS = "status" +CLAIM_DESCRIPTION = "description" +CLAIM_DETAILS = "claim_details" + +# COMMUNITY HIERARCHY TABLE SCHEMA +SUB_COMMUNITY = "sub_communitty" +SUB_COMMUNITY_SIZE = "sub_community_size" +COMMUNITY_LEVEL = "level" + +# COMMUNITY CONTEXT TABLE SCHEMA +ALL_CONTEXT = "all_context" +CONTEXT_STRING = "context_string" +CONTEXT_SIZE = "context_size" +CONTEXT_EXCEED_FLAG = "context_exceed_limit" + +# COMMUNITY REPORT TABLE SCHEMA +REPORT_ID = "id" +COMMUNITY_ID = "id" +COMMUNITY_LEVEL = "level" +TITLE = "title" +SUMMARY = "summary" +FINDINGS = "findings" +RATING = "rank" +EXPLANATION = "rating_explanation" +FULL_CONTENT = "full_content" +FULL_CONTENT_JSON = "full_content_json" diff --git a/graphrag/index/graph/extractors/community_reports/sort_context.py b/graphrag/index/graph/extractors/community_reports/sort_context.py new file mode 100644 index 00000000..811cb7e9 --- /dev/null +++ b/graphrag/index/graph/extractors/community_reports/sort_context.py @@ -0,0 +1,156 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +"""Sort context by degree in descending order.""" + +import pandas as pd + +import graphrag.index.graph.extractors.community_reports.schemas as schemas +from graphrag.query.llm.text_utils import num_tokens + + +def sort_context( + local_context: list[dict], + sub_community_reports: list[dict] | None = None, + max_tokens: int | None = None, + node_id_column: str = schemas.NODE_ID, + node_name_column: str = schemas.NODE_NAME, + node_details_column: str = schemas.NODE_DETAILS, + edge_id_column: str = schemas.EDGE_ID, + edge_details_column: str = schemas.EDGE_DETAILS, + edge_degree_column: str = schemas.EDGE_DEGREE, + edge_source_column: str = schemas.EDGE_SOURCE, + edge_target_column: str = schemas.EDGE_TARGET, + claim_id_column: str = schemas.CLAIM_ID, + claim_details_column: str = schemas.CLAIM_DETAILS, + community_id_column: str = schemas.COMMUNITY_ID, +) -> str: + """Sort context by degree in descending order. + + If max tokens is provided, we will return the context string that fits within the token limit. + """ + + def _get_context_string( + entities: list[dict], + edges: list[dict], + claims: list[dict], + sub_community_reports: list[dict] | None = None, + ) -> str: + """Concatenate structured data into a context string.""" + contexts = [] + if sub_community_reports: + sub_community_reports = [ + report + for report in sub_community_reports + if community_id_column in report + and report[community_id_column] + and str(report[community_id_column]).strip() != "" + ] + report_df = pd.DataFrame(sub_community_reports).drop_duplicates() + if not report_df.empty: + if report_df[community_id_column].dtype == float: + report_df[community_id_column] = report_df[ + community_id_column + ].astype(int) + report_string = ( + f"----Reports-----\n{report_df.to_csv(index=False, sep=',')}" + ) + contexts.append(report_string) + + entities = [ + entity + for entity in entities + if node_id_column in entity + and entity[node_id_column] + and str(entity[node_id_column]).strip() != "" + ] + entity_df = pd.DataFrame(entities).drop_duplicates() + if not entity_df.empty: + if entity_df[node_id_column].dtype == float: + entity_df[node_id_column] = entity_df[node_id_column].astype(int) + entity_string = ( + f"-----Entities-----\n{entity_df.to_csv(index=False, sep=',')}" + ) + contexts.append(entity_string) + + if claims and len(claims) > 0: + claims = [ + claim + for claim in claims + if claim_id_column in claim + and claim[claim_id_column] + and str(claim[claim_id_column]).strip() != "" + ] + claim_df = pd.DataFrame(claims).drop_duplicates() + if not claim_df.empty: + if claim_df[claim_id_column].dtype == float: + claim_df[claim_id_column] = claim_df[claim_id_column].astype(int) + claim_string = ( + f"-----Claims-----\n{claim_df.to_csv(index=False, sep=',')}" + ) + contexts.append(claim_string) + + edges = [ + edge + for edge in edges + if edge_id_column in edge + and edge[edge_id_column] + and str(edge[edge_id_column]).strip() != "" + ] + edge_df = pd.DataFrame(edges).drop_duplicates() + if not edge_df.empty: + if edge_df[edge_id_column].dtype == float: + edge_df[edge_id_column] = edge_df[edge_id_column].astype(int) + edge_string = ( + f"-----Relationships-----\n{edge_df.to_csv(index=False, sep=',')}" + ) + contexts.append(edge_string) + + return "\n\n".join(contexts) + + # sort node details by degree in descending order + edges = [] + node_details = {} + claim_details = {} + + for record in local_context: + node_name = record[node_name_column] + record_edges = record.get(edge_details_column, []) + record_edges = [e for e in record_edges if not pd.isna(e)] + record_node_details = record[node_details_column] + record_claims = record.get(claim_details_column, []) + record_claims = [c for c in record_claims if not pd.isna(c)] + + edges.extend(record_edges) + node_details[node_name] = record_node_details + claim_details[node_name] = record_claims + + edges = [edge for edge in edges if isinstance(edge, dict)] + edges = sorted(edges, key=lambda x: x[edge_degree_column], reverse=True) + + sorted_edges = [] + sorted_nodes = [] + sorted_claims = [] + context_string = "" + for edge in edges: + source_details = node_details.get(edge[edge_source_column], {}) + target_details = node_details.get(edge[edge_target_column], {}) + sorted_nodes.extend([source_details, target_details]) + sorted_edges.append(edge) + source_claims = claim_details.get(edge[edge_source_column], []) + target_claims = claim_details.get(edge[edge_target_column], []) + sorted_claims.extend(source_claims if source_claims else []) + sorted_claims.extend(target_claims if source_claims else []) + if max_tokens: + new_context_string = _get_context_string( + sorted_nodes, sorted_edges, sorted_claims, sub_community_reports + ) + if num_tokens(context_string) > max_tokens: + break + context_string = new_context_string + + if context_string == "": + return _get_context_string( + sorted_nodes, sorted_edges, sorted_claims, sub_community_reports + ) + + return context_string diff --git a/graphrag/index/graph/extractors/community_reports/utils.py b/graphrag/index/graph/extractors/community_reports/utils.py new file mode 100644 index 00000000..b5fc9af9 --- /dev/null +++ b/graphrag/index/graph/extractors/community_reports/utils.py @@ -0,0 +1,53 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing community report generation utilities.""" + +from typing import cast + +import pandas as pd + +import graphrag.index.graph.extractors.community_reports.schemas as schemas +from graphrag.query.llm.text_utils import num_tokens + + +def set_context_size(df: pd.DataFrame) -> None: + """Measure the number of tokens in the context.""" + df[schemas.CONTEXT_SIZE] = df[schemas.CONTEXT_STRING].apply(lambda x: num_tokens(x)) + + +def set_context_exceeds_flag(df: pd.DataFrame, max_tokens: int) -> None: + """Set a flag to indicate if the context exceeds the limit.""" + df[schemas.CONTEXT_EXCEED_FLAG] = df[schemas.CONTEXT_SIZE].apply( + lambda x: x > max_tokens + ) + + +def get_levels(df: pd.DataFrame, level_column: str = schemas.NODE_LEVEL) -> list[int]: + """Get the levels of the communities.""" + result = sorted(df[level_column].fillna(-1).unique().tolist(), reverse=True) + return [r for r in result if r != -1] + + +def filter_nodes_to_level(node_df: pd.DataFrame, level: int) -> pd.DataFrame: + """Filter nodes to level.""" + return cast(pd.DataFrame, node_df[node_df[schemas.NODE_LEVEL] == level]) + + +def filter_edges_to_nodes(edge_df: pd.DataFrame, nodes: list[str]) -> pd.DataFrame: + """Filter edges to nodes.""" + return cast( + pd.DataFrame, + edge_df[ + edge_df[schemas.EDGE_SOURCE].isin(nodes) + & edge_df[schemas.EDGE_TARGET].isin(nodes) + ], + ) + + +def filter_claims_to_nodes(claims_df: pd.DataFrame, nodes: list[str]) -> pd.DataFrame: + """Filter edges to nodes.""" + return cast( + pd.DataFrame, + claims_df[claims_df[schemas.CLAIM_SUBJECT].isin(nodes)], + ) diff --git a/graphrag/index/graph/extractors/graph/__init__.py b/graphrag/index/graph/extractors/graph/__init__.py new file mode 100644 index 00000000..94e03ab9 --- /dev/null +++ b/graphrag/index/graph/extractors/graph/__init__.py @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine unipartite graph package root.""" + +from .graph_extractor import ( + DEFAULT_ENTITY_TYPES, + GraphExtractionResult, + GraphExtractor, +) +from .prompts import GRAPH_EXTRACTION_PROMPT + +__all__ = [ + "DEFAULT_ENTITY_TYPES", + "GRAPH_EXTRACTION_PROMPT", + "GraphExtractionResult", + "GraphExtractor", +] diff --git a/graphrag/index/graph/extractors/graph/graph_extractor.py b/graphrag/index/graph/extractors/graph/graph_extractor.py new file mode 100644 index 00000000..ccd2b729 --- /dev/null +++ b/graphrag/index/graph/extractors/graph/graph_extractor.py @@ -0,0 +1,300 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'GraphExtractionResult' and 'GraphExtractor' models.""" + +import logging +import numbers +import re +import traceback +from collections.abc import Mapping +from dataclasses import dataclass +from typing import Any + +import networkx as nx +import tiktoken + +from graphrag.index.typing import ErrorHandlerFn +from graphrag.index.utils import clean_str +from graphrag.llm import CompletionLLM + +from .prompts import CONTINUE_PROMPT, GRAPH_EXTRACTION_PROMPT, LOOP_PROMPT + +DEFAULT_TUPLE_DELIMITER = "<|>" +DEFAULT_RECORD_DELIMITER = "##" +DEFAULT_COMPLETION_DELIMITER = "<|COMPLETE|>" +DEFAULT_ENTITY_TYPES = ["organization", "person", "geo", "event"] + + +@dataclass +class GraphExtractionResult: + """Unipartite graph extraction result class definition.""" + + output: nx.Graph + source_docs: dict[Any, Any] + + +class GraphExtractor: + """Unipartite graph extractor class definition.""" + + _llm: CompletionLLM + _join_descriptions: bool + _tuple_delimiter_key: str + _record_delimiter_key: str + _entity_types_key: str + _input_text_key: str + _completion_delimiter_key: str + _entity_name_key: str + _input_descriptions_key: str + _extraction_prompt: str + _summarization_prompt: str + _loop_args: dict[str, Any] + _max_gleanings: int + _on_error: ErrorHandlerFn + + def __init__( + self, + llm_invoker: CompletionLLM, + tuple_delimiter_key: str | None = None, + record_delimiter_key: str | None = None, + input_text_key: str | None = None, + entity_types_key: str | None = None, + completion_delimiter_key: str | None = None, + prompt: str | None = None, + join_descriptions=True, + encoding_model: str | None = None, + max_gleanings: int | None = None, + on_error: ErrorHandlerFn | None = None, + ): + """Init method definition.""" + # TODO: streamline construction + self._llm = llm_invoker + self._join_descriptions = join_descriptions + self._input_text_key = input_text_key or "input_text" + self._tuple_delimiter_key = tuple_delimiter_key or "tuple_delimiter" + self._record_delimiter_key = record_delimiter_key or "record_delimiter" + self._completion_delimiter_key = ( + completion_delimiter_key or "completion_delimiter" + ) + self._entity_types_key = entity_types_key or "entity_types" + self._extraction_prompt = prompt or GRAPH_EXTRACTION_PROMPT + self._max_gleanings = max_gleanings if max_gleanings is not None else 0 + self._on_error = on_error or (lambda _e, _s, _d: None) + + # Construct the looping arguments + encoding = tiktoken.get_encoding(encoding_model or "cl100k_base") + yes = encoding.encode("YES") + no = encoding.encode("NO") + self._loop_args = {"logit_bias": {yes[0]: 100, no[0]: 100}, "max_tokens": 1} + + async def __call__( + self, texts: list[str], prompt_variables: dict[str, Any] | None = None + ) -> GraphExtractionResult: + """Call method definition.""" + if prompt_variables is None: + prompt_variables = {} + all_records: dict[int, str] = {} + source_doc_map: dict[int, str] = {} + + # Wire defaults into the prompt variables + prompt_variables = { + **prompt_variables, + self._tuple_delimiter_key: prompt_variables.get(self._tuple_delimiter_key) + or DEFAULT_TUPLE_DELIMITER, + self._record_delimiter_key: prompt_variables.get(self._record_delimiter_key) + or DEFAULT_RECORD_DELIMITER, + self._completion_delimiter_key: prompt_variables.get( + self._completion_delimiter_key + ) + or DEFAULT_COMPLETION_DELIMITER, + self._entity_types_key: ",".join( + prompt_variables[self._entity_types_key] or DEFAULT_ENTITY_TYPES + ), + } + + for doc_index, text in enumerate(texts): + try: + # Invoke the entity extraction + result = await self._process_document(text, prompt_variables) + source_doc_map[doc_index] = text + all_records[doc_index] = result + except Exception as e: + logging.exception("error extracting graph") + self._on_error( + e, + traceback.format_exc(), + { + "doc_index": doc_index, + "text": text, + }, + ) + + output = await self._process_results( + all_records, + prompt_variables.get(self._tuple_delimiter_key, DEFAULT_TUPLE_DELIMITER), + prompt_variables.get(self._record_delimiter_key, DEFAULT_RECORD_DELIMITER), + ) + + return GraphExtractionResult( + output=output, + source_docs=source_doc_map, + ) + + async def _process_document( + self, text: str, prompt_variables: dict[str, str] + ) -> str: + response = await self._llm( + self._extraction_prompt, + variables={ + **prompt_variables, + self._input_text_key: text, + }, + ) + results = response.output or "" + + # Repeat to ensure we maximize entity count + for i in range(self._max_gleanings): + glean_response = await self._llm( + CONTINUE_PROMPT, + name=f"extract-continuation-{i}", + history=response.history or [], + ) + results += glean_response.output or "" + + # if this is the final glean, don't bother updating the continuation flag + if i >= self._max_gleanings - 1: + break + + continuation = await self._llm( + LOOP_PROMPT, + name=f"extract-loopcheck-{i}", + history=glean_response.history or [], + model_parameters=self._loop_args, + ) + if continuation.output != "YES": + break + + return results + + async def _process_results( + self, + results: dict[int, str], + tuple_delimiter: str, + record_delimiter: str, + ) -> nx.Graph: + """Parse the result string to create an undirected unipartite graph. + + Args: + - results - dict of results from the extraction chain + - tuple_delimiter - delimiter between tuples in an output record, default is '<|>' + - record_delimiter - delimiter between records, default is '##' + Returns: + - output - unipartite graph in graphML format + """ + graph = nx.Graph() + for source_doc_id, extracted_data in results.items(): + records = [r.strip() for r in extracted_data.split(record_delimiter)] + + for record in records: + record = re.sub(r"^\(|\)$", "", record.strip()) + record_attributes = record.split(tuple_delimiter) + + if record_attributes[0] == '"entity"' and len(record_attributes) >= 4: + # add this record as a node in the G + entity_name = clean_str(record_attributes[1].upper()) + entity_type = clean_str(record_attributes[2].upper()) + entity_description = clean_str(record_attributes[3]) + + if entity_name in graph.nodes(): + node = graph.nodes[entity_name] + if self._join_descriptions: + node["description"] = "\n".join( + list({ + *_unpack_descriptions(node), + entity_description, + }) + ) + else: + if len(entity_description) > len(node["description"]): + node["description"] = entity_description + node["source_id"] = ", ".join( + list({ + *_unpack_source_ids(node), + str(source_doc_id), + }) + ) + node["entity_type"] = ( + entity_type if entity_type != "" else node["entity_type"] + ) + else: + graph.add_node( + entity_name, + type=entity_type, + description=entity_description, + source_id=str(source_doc_id), + ) + + if ( + record_attributes[0] == '"relationship"' + and len(record_attributes) >= 5 + ): + # add this record as edge + source = clean_str(record_attributes[1].upper()) + target = clean_str(record_attributes[2].upper()) + edge_description = clean_str(record_attributes[3]) + edge_source_id = clean_str(str(source_doc_id)) + weight = ( + float(record_attributes[-1]) + if isinstance(record_attributes[-1], numbers.Number) + else 1.0 + ) + if source not in graph.nodes(): + graph.add_node( + source, + type="", + description="", + source_id=edge_source_id, + ) + if target not in graph.nodes(): + graph.add_node( + target, + type="", + description="", + source_id=edge_source_id, + ) + if graph.has_edge(source, target): + edge_data = graph.get_edge_data(source, target) + if edge_data is not None: + weight += edge_data["weight"] + if self._join_descriptions: + edge_description = "\n".join( + list({ + *_unpack_descriptions(edge_data), + edge_description, + }) + ) + edge_source_id = ", ".join( + list({ + *_unpack_source_ids(edge_data), + str(source_doc_id), + }) + ) + graph.add_edge( + source, + target, + weight=weight, + description=edge_description, + source_id=edge_source_id, + ) + + return graph + + +def _unpack_descriptions(data: Mapping) -> list[str]: + value = data.get("description", None) + return [] if value is None else value.split("\n") + + +def _unpack_source_ids(data: Mapping) -> list[str]: + value = data.get("source_id", None) + return [] if value is None else value.split(", ") diff --git a/graphrag/index/graph/extractors/graph/prompts.py b/graphrag/index/graph/extractors/graph/prompts.py new file mode 100644 index 00000000..0cc53bec --- /dev/null +++ b/graphrag/index/graph/extractors/graph/prompts.py @@ -0,0 +1,107 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A file containing prompts definition.""" + +GRAPH_EXTRACTION_PROMPT = """ +-Goal- +Given a text document that is potentially relevant to this activity and a list of entity types, identify all entities of those types from the text and all relationships among the identified entities. + +-Steps- +1. Identify all entities. For each identified entity, extract the following information: +- entity_name: Name of the entity, capitalized +- entity_type: One of the following types: [{entity_types}] +- entity_description: Comprehensive description of the entity's attributes and activities +Format each entity as ("entity"{tuple_delimiter}{tuple_delimiter}{tuple_delimiter} + +2. From the entities identified in step 1, identify all pairs of (source_entity, target_entity) that are *clearly related* to each other. +For each pair of related entities, extract the following information: +- source_entity: name of the source entity, as identified in step 1 +- target_entity: name of the target entity, as identified in step 1 +- relationship_description: explanation as to why you think the source entity and the target entity are related to each other +- relationship_strength: a numeric score indicating strength of the relationship between the source entity and target entity + Format each relationship as ("relationship"{tuple_delimiter}{tuple_delimiter}{tuple_delimiter}{tuple_delimiter}) + +3. Return output in English as a single list of all the entities and relationships identified in steps 1 and 2. Use **{record_delimiter}** as the list delimiter. + +4. When finished, output {completion_delimiter} + +###################### +-Examples- +###################### +Example 1: + +Entity_types: [person, technology, mission, organization, location] +Text: +while Alex clenched his jaw, the buzz of frustration dull against the backdrop of Taylor's authoritarian certainty. It was this competitive undercurrent that kept him alert, the sense that his and Jordan's shared commitment to discovery was an unspoken rebellion against Cruz's narrowing vision of control and order. + +Then Taylor did something unexpected. They paused beside Jordan and, for a moment, observed the device with something akin to reverence. “If this tech can be understood..." Taylor said, their voice quieter, "It could change the game for us. For all of us.” + +The underlying dismissal earlier seemed to falter, replaced by a glimpse of reluctant respect for the gravity of what lay in their hands. Jordan looked up, and for a fleeting heartbeat, their eyes locked with Taylor's, a wordless clash of wills softening into an uneasy truce. + +It was a small transformation, barely perceptible, but one that Alex noted with an inward nod. They had all been brought here by different paths +################ +Output: +("entity"{tuple_delimiter}"Alex"{tuple_delimiter}"person"{tuple_delimiter}"Alex is a character who experiences frustration and is observant of the dynamics among other characters."){record_delimiter} +("entity"{tuple_delimiter}"Taylor"{tuple_delimiter}"person"{tuple_delimiter}"Taylor is portrayed with authoritarian certainty and shows a moment of reverence towards a device, indicating a change in perspective."){record_delimiter} +("entity"{tuple_delimiter}"Jordan"{tuple_delimiter}"person"{tuple_delimiter}"Jordan shares a commitment to discovery and has a significant interaction with Taylor regarding a device."){record_delimiter} +("entity"{tuple_delimiter}"Cruz"{tuple_delimiter}"person"{tuple_delimiter}"Cruz is associated with a vision of control and order, influencing the dynamics among other characters."){record_delimiter} +("entity"{tuple_delimiter}"The Device"{tuple_delimiter}"technology"{tuple_delimiter}"The Device is central to the story, with potential game-changing implications, and is revered by Taylor."){record_delimiter} +("relationship"{tuple_delimiter}"Alex"{tuple_delimiter}"Taylor"{tuple_delimiter}"Alex is affected by Taylor's authoritarian certainty and observes changes in Taylor's attitude towards the device."{tuple_delimiter}7){record_delimiter} +("relationship"{tuple_delimiter}"Alex"{tuple_delimiter}"Jordan"{tuple_delimiter}"Alex and Jordan share a commitment to discovery, which contrasts with Cruz's vision."{tuple_delimiter}6){record_delimiter} +("relationship"{tuple_delimiter}"Taylor"{tuple_delimiter}"Jordan"{tuple_delimiter}"Taylor and Jordan interact directly regarding the device, leading to a moment of mutual respect and an uneasy truce."{tuple_delimiter}8){record_delimiter} +("relationship"{tuple_delimiter}"Jordan"{tuple_delimiter}"Cruz"{tuple_delimiter}"Jordan's commitment to discovery is in rebellion against Cruz's vision of control and order."{tuple_delimiter}5){record_delimiter} +("relationship"{tuple_delimiter}"Taylor"{tuple_delimiter}"The Device"{tuple_delimiter}"Taylor shows reverence towards the device, indicating its importance and potential impact."{tuple_delimiter}9){completion_delimiter} +############################# +Example 2: + +Entity_types: [person, technology, mission, organization, location] +Text: +They were no longer mere operatives; they had become guardians of a threshold, keepers of a message from a realm beyond stars and stripes. This elevation in their mission could not be shackled by regulations and established protocols—it demanded a new perspective, a new resolve. + +Tension threaded through the dialogue of beeps and static as communications with Washington buzzed in the background. The team stood, a portentous air enveloping them. It was clear that the decisions they made in the ensuing hours could redefine humanity's place in the cosmos or condemn them to ignorance and potential peril. + +Their connection to the stars solidified, the group moved to address the crystallizing warning, shifting from passive recipients to active participants. Mercer's latter instincts gained precedence— the team's mandate had evolved, no longer solely to observe and report but to interact and prepare. A metamorphosis had begun, and Operation: Dulce hummed with the newfound frequency of their daring, a tone set not by the earthly +############# +Output: +("entity"{tuple_delimiter}"Washington"{tuple_delimiter}"location"{tuple_delimiter}"Washington is a location where communications are being received, indicating its importance in the decision-making process."){record_delimiter} +("entity"{tuple_delimiter}"Operation: Dulce"{tuple_delimiter}"mission"{tuple_delimiter}"Operation: Dulce is described as a mission that has evolved to interact and prepare, indicating a significant shift in objectives and activities."){record_delimiter} +("entity"{tuple_delimiter}"The team"{tuple_delimiter}"organization"{tuple_delimiter}"The team is portrayed as a group of individuals who have transitioned from passive observers to active participants in a mission, showing a dynamic change in their role."){record_delimiter} +("relationship"{tuple_delimiter}"The team"{tuple_delimiter}"Washington"{tuple_delimiter}"The team receives communications from Washington, which influences their decision-making process."{tuple_delimiter}7){record_delimiter} +("relationship"{tuple_delimiter}"The team"{tuple_delimiter}"Operation: Dulce"{tuple_delimiter}"The team is directly involved in Operation: Dulce, executing its evolved objectives and activities."{tuple_delimiter}9){completion_delimiter} +############################# +Example 3: + +Entity_types: [person, role, technology, organization, event, location, concept] +Text: +their voice slicing through the buzz of activity. "Control may be an illusion when facing an intelligence that literally writes its own rules," they stated stoically, casting a watchful eye over the flurry of data. + +"It's like it's learning to communicate," offered Sam Rivera from a nearby interface, their youthful energy boding a mix of awe and anxiety. "This gives talking to strangers' a whole new meaning." + +Alex surveyed his team—each face a study in concentration, determination, and not a small measure of trepidation. "This might well be our first contact," he acknowledged, "And we need to be ready for whatever answers back." + +Together, they stood on the edge of the unknown, forging humanity's response to a message from the heavens. The ensuing silence was palpable—a collective introspection about their role in this grand cosmic play, one that could rewrite human history. + +The encrypted dialogue continued to unfold, its intricate patterns showing an almost uncanny anticipation +############# +Output: +("entity"{tuple_delimiter}"Sam Rivera"{tuple_delimiter}"person"{tuple_delimiter}"Sam Rivera is a member of a team working on communicating with an unknown intelligence, showing a mix of awe and anxiety."){record_delimiter} +("entity"{tuple_delimiter}"Alex"{tuple_delimiter}"person"{tuple_delimiter}"Alex is the leader of a team attempting first contact with an unknown intelligence, acknowledging the significance of their task."){record_delimiter} +("entity"{tuple_delimiter}"Control"{tuple_delimiter}"concept"{tuple_delimiter}"Control refers to the ability to manage or govern, which is challenged by an intelligence that writes its own rules."){record_delimiter} +("entity"{tuple_delimiter}"Intelligence"{tuple_delimiter}"concept"{tuple_delimiter}"Intelligence here refers to an unknown entity capable of writing its own rules and learning to communicate."){record_delimiter} +("entity"{tuple_delimiter}"First Contact"{tuple_delimiter}"event"{tuple_delimiter}"First Contact is the potential initial communication between humanity and an unknown intelligence."){record_delimiter} +("entity"{tuple_delimiter}"Humanity's Response"{tuple_delimiter}"event"{tuple_delimiter}"Humanity's Response is the collective action taken by Alex's team in response to a message from an unknown intelligence."){record_delimiter} +("relationship"{tuple_delimiter}"Sam Rivera"{tuple_delimiter}"Intelligence"{tuple_delimiter}"Sam Rivera is directly involved in the process of learning to communicate with the unknown intelligence."{tuple_delimiter}9){record_delimiter} +("relationship"{tuple_delimiter}"Alex"{tuple_delimiter}"First Contact"{tuple_delimiter}"Alex leads the team that might be making the First Contact with the unknown intelligence."{tuple_delimiter}10){record_delimiter} +("relationship"{tuple_delimiter}"Alex"{tuple_delimiter}"Humanity's Response"{tuple_delimiter}"Alex and his team are the key figures in Humanity's Response to the unknown intelligence."{tuple_delimiter}8){record_delimiter} +("relationship"{tuple_delimiter}"Control"{tuple_delimiter}"Intelligence"{tuple_delimiter}"The concept of Control is challenged by the Intelligence that writes its own rules."{tuple_delimiter}7){completion_delimiter} +############################# +-Real Data- +###################### +Entity_types: {entity_types} +Text: {input_text} +###################### +Output:""" + +CONTINUE_PROMPT = "MANY entities were missed in the last extraction. Add them below using the same format:\n" +LOOP_PROMPT = "It appears some entities may have still been missed. Answer YES | NO if there are still entities that need to be added.\n" diff --git a/graphrag/index/graph/extractors/summarize/__init__.py b/graphrag/index/graph/extractors/summarize/__init__.py new file mode 100644 index 00000000..b4bfe5be --- /dev/null +++ b/graphrag/index/graph/extractors/summarize/__init__.py @@ -0,0 +1,12 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine unipartite graph package root.""" + +from .description_summary_extractor import ( + SummarizationResult, + SummarizeExtractor, +) +from .prompts import SUMMARIZE_PROMPT + +__all__ = ["SUMMARIZE_PROMPT", "SummarizationResult", "SummarizeExtractor"] diff --git a/graphrag/index/graph/extractors/summarize/description_summary_extractor.py b/graphrag/index/graph/extractors/summarize/description_summary_extractor.py new file mode 100644 index 00000000..76d77202 --- /dev/null +++ b/graphrag/index/graph/extractors/summarize/description_summary_extractor.py @@ -0,0 +1,135 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'GraphExtractionResult' and 'GraphExtractor' models.""" + +import json +from dataclasses import dataclass + +from graphrag.index.typing import ErrorHandlerFn +from graphrag.index.utils.tokens import num_tokens_from_string +from graphrag.llm import CompletionLLM + +from .prompts import SUMMARIZE_PROMPT + +# Max token size for input prompts +DEFAULT_MAX_INPUT_TOKENS = 4_000 +# Max token count for LLM answers +DEFAULT_MAX_SUMMARY_LENGTH = 500 + + +@dataclass +class SummarizationResult: + """Unipartite graph extraction result class definition.""" + + items: str | tuple[str, str] + description: str + + +class SummarizeExtractor: + """Unipartite graph extractor class definition.""" + + _llm: CompletionLLM + _entity_name_key: str + _input_descriptions_key: str + _summarization_prompt: str + _on_error: ErrorHandlerFn + _max_summary_length: int + _max_input_tokens: int + + def __init__( + self, + llm_invoker: CompletionLLM, + entity_name_key: str | None = None, + input_descriptions_key: str | None = None, + summarization_prompt: str | None = None, + on_error: ErrorHandlerFn | None = None, + max_summary_length: int | None = None, + max_input_tokens: int | None = None, + ): + """Init method definition.""" + # TODO: streamline construction + self._llm = llm_invoker + self._entity_name_key = entity_name_key or "entity_name" + self._input_descriptions_key = input_descriptions_key or "description_list" + + self._summarization_prompt = summarization_prompt or SUMMARIZE_PROMPT + self._on_error = on_error or (lambda _e, _s, _d: None) + self._max_summary_length = max_summary_length or DEFAULT_MAX_SUMMARY_LENGTH + self._max_input_tokens = max_input_tokens or DEFAULT_MAX_INPUT_TOKENS + + async def __call__( + self, + items: str | tuple[str, str], + descriptions: list[str], + ) -> SummarizationResult: + """Call method definition.""" + result = "" + if len(descriptions) == 0: + result = "" + if len(descriptions) == 1: + result = descriptions[0] + else: + result = await self._summarize_descriptions(items, descriptions) + + return SummarizationResult( + items=items, + description=result or "", + ) + + async def _summarize_descriptions( + self, items: str | tuple[str, str], descriptions: list[str] + ) -> str: + """Summarize descriptions into a single description.""" + sorted_items = sorted(items) if isinstance(items, list) else items + + # Safety check, should always be a list + if not isinstance(descriptions, list): + descriptions = [descriptions] + + # Iterate over descriptions, adding all until the max input tokens is reached + usable_tokens = self._max_input_tokens - num_tokens_from_string( + self._summarization_prompt + ) + descriptions_collected = [] + result = "" + + for i, description in enumerate(descriptions): + usable_tokens -= num_tokens_from_string(description) + descriptions_collected.append(description) + + # If buffer is full, or all descriptions have been added, summarize + if (usable_tokens < 0 and len(descriptions_collected) > 1) or ( + i == len(descriptions) - 1 + ): + # Calculate result (final or partial) + result = await self._summarize_descriptions_with_llm( + sorted_items, descriptions_collected + ) + + # If we go for another loop, reset values to new + if i != len(descriptions) - 1: + descriptions_collected = [result] + usable_tokens = ( + self._max_input_tokens + - num_tokens_from_string(self._summarization_prompt) + - num_tokens_from_string(result) + ) + + return result + + async def _summarize_descriptions_with_llm( + self, items: str | tuple[str, str] | list[str], descriptions: list[str] + ): + """Summarize descriptions using the LLM.""" + response = await self._llm( + self._summarization_prompt, + name="summarize", + variables={ + self._entity_name_key: json.dumps(items), + self._input_descriptions_key: json.dumps(sorted(descriptions)), + }, + model_parameters={"max_tokens": self._max_summary_length}, + ) + # Calculate result + return str(response.output) diff --git a/graphrag/index/graph/extractors/summarize/prompts.py b/graphrag/index/graph/extractors/summarize/prompts.py new file mode 100644 index 00000000..90e4434e --- /dev/null +++ b/graphrag/index/graph/extractors/summarize/prompts.py @@ -0,0 +1,19 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A file containing prompts definition.""" + +SUMMARIZE_PROMPT = """ +You are a helpful assistant responsible for generating a comprehensive summary of the data provided below. +Given one or two entities, and a list of descriptions, all related to the same entity or group of entities. +Please concatenate all of these into a single, comprehensive description. Make sure to include information collected from all the descriptions. +If the provided descriptions are contradictory, please resolve the contradictions and provide a single, coherent summary. +Make sure it is written in third person, and include the entity names so we the have full context. + +####### +-Data- +Entities: {entity_name} +Description List: {description_list} +####### +Output: +""" diff --git a/graphrag/index/graph/utils/__init__.py b/graphrag/index/graph/utils/__init__.py new file mode 100644 index 00000000..6d447928 --- /dev/null +++ b/graphrag/index/graph/utils/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine graph utils package root.""" + +from .normalize_node_names import normalize_node_names +from .stable_lcc import stable_largest_connected_component + +__all__ = ["normalize_node_names", "stable_largest_connected_component"] diff --git a/graphrag/index/graph/utils/normalize_node_names.py b/graphrag/index/graph/utils/normalize_node_names.py new file mode 100644 index 00000000..bcc874a9 --- /dev/null +++ b/graphrag/index/graph/utils/normalize_node_names.py @@ -0,0 +1,14 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing normalize_node_names method definition.""" + +import html + +import networkx as nx + + +def normalize_node_names(graph: nx.Graph | nx.DiGraph) -> nx.Graph | nx.DiGraph: + """Normalize node names.""" + node_mapping = {node: html.unescape(node.upper().strip()) for node in graph.nodes()} # type: ignore + return nx.relabel_nodes(graph, node_mapping) diff --git a/graphrag/index/graph/utils/stable_lcc.py b/graphrag/index/graph/utils/stable_lcc.py new file mode 100644 index 00000000..7d602a6b --- /dev/null +++ b/graphrag/index/graph/utils/stable_lcc.py @@ -0,0 +1,60 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module for producing a stable largest connected component, i.e. same input graph == same output lcc.""" + +from typing import Any, cast + +import networkx as nx +from graspologic.utils import largest_connected_component + +from .normalize_node_names import normalize_node_names + + +def stable_largest_connected_component(graph: nx.Graph) -> nx.Graph: + """Return the largest connected component of the graph, with nodes and edges sorted in a stable way.""" + graph = graph.copy() + graph = cast(nx.Graph, largest_connected_component(graph)) + graph = normalize_node_names(graph) + return _stabilize_graph(graph) + + +def _stabilize_graph(graph: nx.Graph) -> nx.Graph: + """Ensure an undirected graph with the same relationships will always be read the same way.""" + fixed_graph = nx.DiGraph() if graph.is_directed() else nx.Graph() + + sorted_nodes = graph.nodes(data=True) + sorted_nodes = sorted(sorted_nodes, key=lambda x: x[0]) + + fixed_graph.add_nodes_from(sorted_nodes) + edges = list(graph.edges(data=True)) + + # If the graph is undirected, we create the edges in a stable way, so we get the same results + # for example: + # A -> B + # in graph theory is the same as + # B -> A + # in an undirected graph + # however, this can lead to downstream issues because sometimes + # consumers read graph.nodes() which ends up being [A, B] and sometimes it's [B, A] + # but they base some of their logic on the order of the nodes, so the order ends up being important + # so we sort the nodes in the edge in a stable way, so that we always get the same order + if not graph.is_directed(): + + def _sort_source_target(edge): + source, target, edge_data = edge + if source > target: + temp = source + source = target + target = temp + return source, target, edge_data + + edges = [_sort_source_target(edge) for edge in edges] + + def _get_edge_key(source: Any, target: Any) -> str: + return f"{source} -> {target}" + + edges = sorted(edges, key=lambda x: _get_edge_key(x[0], x[1])) + + fixed_graph.add_edges_from(edges) + return fixed_graph diff --git a/graphrag/index/graph/visualization/__init__.py b/graphrag/index/graph/visualization/__init__.py new file mode 100644 index 00000000..f7780e4e --- /dev/null +++ b/graphrag/index/graph/visualization/__init__.py @@ -0,0 +1,14 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine graph visualization package root.""" + +from .compute_umap_positions import compute_umap_positions, get_zero_positions +from .typing import GraphLayout, NodePosition + +__all__ = [ + "GraphLayout", + "NodePosition", + "compute_umap_positions", + "get_zero_positions", +] diff --git a/graphrag/index/graph/visualization/compute_umap_positions.py b/graphrag/index/graph/visualization/compute_umap_positions.py new file mode 100644 index 00000000..569b7b30 --- /dev/null +++ b/graphrag/index/graph/visualization/compute_umap_positions.py @@ -0,0 +1,144 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing compute_umap_positions and visualize_embedding method definition.""" + +import graspologic as gc +import matplotlib.pyplot as plt +import networkx as nx +import numpy as np +import umap + +from .typing import NodePosition + + +def get_zero_positions( + node_labels: list[str], + node_categories: list[int] | None = None, + node_sizes: list[int] | None = None, + three_d: bool | None = False, +) -> list[NodePosition]: + """Project embedding vectors down to 2D/3D using UMAP.""" + embedding_position_data: list[NodePosition] = [] + for index, node_name in enumerate(node_labels): + node_category = 1 if node_categories is None else node_categories[index] + node_size = 1 if node_sizes is None else node_sizes[index] + + if not three_d: + embedding_position_data.append( + NodePosition( + label=str(node_name), + x=0, + y=0, + cluster=str(int(node_category)), + size=int(node_size), + ) + ) + else: + embedding_position_data.append( + NodePosition( + label=str(node_name), + x=0, + y=0, + z=0, + cluster=str(int(node_category)), + size=int(node_size), + ) + ) + return embedding_position_data + + +def compute_umap_positions( + embedding_vectors: np.ndarray, + node_labels: list[str], + node_categories: list[int] | None = None, + node_sizes: list[int] | None = None, + min_dist: float = 0.75, + n_neighbors: int = 25, + spread: int = 1, + metric: str = "euclidean", + n_components: int = 2, + random_state: int = 86, +) -> list[NodePosition]: + """Project embedding vectors down to 2D/3D using UMAP.""" + embedding_positions = umap.UMAP( + min_dist=min_dist, + n_neighbors=n_neighbors, + spread=spread, + n_components=n_components, + metric=metric, + random_state=random_state, + ).fit_transform(embedding_vectors) + + embedding_position_data: list[NodePosition] = [] + for index, node_name in enumerate(node_labels): + node_points = embedding_positions[index] # type: ignore + node_category = 1 if node_categories is None else node_categories[index] + node_size = 1 if node_sizes is None else node_sizes[index] + + if len(node_points) == 2: + embedding_position_data.append( + NodePosition( + label=str(node_name), + x=float(node_points[0]), + y=float(node_points[1]), + cluster=str(int(node_category)), + size=int(node_size), + ) + ) + else: + embedding_position_data.append( + NodePosition( + label=str(node_name), + x=float(node_points[0]), + y=float(node_points[1]), + z=float(node_points[2]), + cluster=str(int(node_category)), + size=int(node_size), + ) + ) + return embedding_position_data + + +def visualize_embedding( + graph, + umap_positions: list[dict], +): + """Project embedding down to 2D using UMAP and visualize.""" + # rendering + plt.clf() + figure = plt.gcf() + ax = plt.gca() + + ax.set_axis_off() + figure.set_size_inches(10, 10) + figure.set_dpi(400) + + node_position_dict = { + (str)(position["label"]): (position["x"], position["y"]) + for position in umap_positions + } + node_category_dict = { + (str)(position["label"]): position["category"] for position in umap_positions + } + node_sizes = [position["size"] for position in umap_positions] + node_colors = gc.layouts.categorical_colors(node_category_dict) # type: ignore + + vertices = [] + node_color_list = [] + for node in node_position_dict: + vertices.append(node) + node_color_list.append(node_colors[node]) + + nx.draw_networkx_nodes( + graph, + pos=node_position_dict, + nodelist=vertices, + node_color=node_color_list, # type: ignore + alpha=1.0, + linewidths=0.01, + node_size=node_sizes, # type: ignore + node_shape="o", + ax=ax, + ) + plt.show() diff --git a/graphrag/index/graph/visualization/typing.py b/graphrag/index/graph/visualization/typing.py new file mode 100644 index 00000000..ae46afa9 --- /dev/null +++ b/graphrag/index/graph/visualization/typing.py @@ -0,0 +1,27 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +# Use this for now instead of a wrapper +"""A module containing 'NodePosition' model.""" + +from dataclasses import dataclass + + +@dataclass +class NodePosition: + """Node position class definition.""" + + label: str + cluster: str + size: float + + x: float + y: float + z: float | None = None + + def to_pandas(self) -> tuple[str, float, float, str, float]: + """To pandas method definition.""" + return self.label, self.x, self.y, self.cluster, self.size + + +GraphLayout = list[NodePosition] diff --git a/graphrag/index/init_content.py b/graphrag/index/init_content.py new file mode 100644 index 00000000..c1342119 --- /dev/null +++ b/graphrag/index/init_content.py @@ -0,0 +1,156 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +"""Content for the init CLI command.""" + +import graphrag.config.defaults as defs + +INIT_YAML = f""" +encoding_model: cl100k_base +skip_workflows: [] +llm: + api_key: ${{GRAPHRAG_API_KEY}} + type: {defs.LLM_TYPE.value} # or azure_openai_chat + model: {defs.LLM_MODEL} + model_supports_json: true # recommended if this is available for your model. + # max_tokens: {defs.LLM_MAX_TOKENS} + # request_timeout: {defs.LLM_REQUEST_TIMEOUT} + # api_base: https://.openai.azure.com + # api_version: 2024-02-15-preview + # organization: + # deployment_name: + # tokens_per_minute: 150_000 # set a leaky bucket throttle + # requests_per_minute: 10_000 # set a leaky bucket throttle + # max_retries: {defs.LLM_MAX_RETRIES} + # max_retry_wait: {defs.LLM_MAX_RETRY_WAIT} + # sleep_on_rate_limit_recommendation: true # whether to sleep when azure suggests wait-times + # concurrent_requests: {defs.LLM_CONCURRENT_REQUESTS} # the number of parallel inflight requests that may be made + +parallelization: + stagger: {defs.PARALLELIZATION_STAGGER} + # num_threads: {defs.PARALLELIZATION_NUM_THREADS} # the number of threads to use for parallel processing + +async_mode: {defs.ASYNC_MODE.value} # or asyncio + +embeddings: + ## parallelization: override the global parallelization settings for embeddings + async_mode: {defs.ASYNC_MODE.value} # or asyncio + llm: + api_key: ${{GRAPHRAG_API_KEY}} + type: {defs.EMBEDDING_TYPE.value} # or azure_openai_embedding + model: {defs.EMBEDDING_MODEL} + # api_base: https://.openai.azure.com + # api_version: 2024-02-15-preview + # organization: + # deployment_name: + # tokens_per_minute: 150_000 # set a leaky bucket throttle + # requests_per_minute: 10_000 # set a leaky bucket throttle + # max_retries: {defs.LLM_MAX_RETRIES} + # max_retry_wait: {defs.LLM_MAX_RETRY_WAIT} + # sleep_on_rate_limit_recommendation: true # whether to sleep when azure suggests wait-times + # concurrent_requests: {defs.LLM_CONCURRENT_REQUESTS} # the number of parallel inflight requests that may be made + # batch_size: {defs.EMBEDDING_BATCH_SIZE} # the number of documents to send in a single request + # batch_max_tokens: {defs.EMBEDDING_BATCH_MAX_TOKENS} # the maximum number of tokens to send in a single request + # target: {defs.EMBEDDING_TARGET.value} # or optional + + + +chunks: + size: {defs.CHUNK_SIZE} + overlap: {defs.CHUNK_OVERLAP} + group_by_columns: [{",".join(defs.CHUNK_GROUP_BY_COLUMNS)}] # by default, we don't allow chunks to cross documents + +input: + type: {defs.INPUT_TYPE.value} # or blob + file_type: {defs.INPUT_FILE_TYPE.value} # or csv + base_dir: "{defs.INPUT_BASE_DIR}" + file_encoding: {defs.INPUT_FILE_ENCODING} + file_pattern: ".*\\\\.txt$" + +cache: + type: {defs.CACHE_TYPE.value} # or blob + base_dir: "{defs.CACHE_BASE_DIR}" + # connection_string: + # container_name: + +storage: + type: {defs.STORAGE_TYPE.value} # or blob + base_dir: "{defs.STORAGE_BASE_DIR}" + # connection_string: + # container_name: + +reporting: + type: {defs.REPORTING_TYPE.value} # or console, blob + base_dir: "{defs.REPORTING_BASE_DIR}" + # connection_string: + # container_name: + +entity_extraction: + ## llm: override the global llm settings for this task + ## parallelization: override the global parallelization settings for this task + ## async_mode: override the global async_mode settings for this task + prompt: "prompts/entity_extraction.txt" + entity_types: [{",".join(defs.ENTITY_EXTRACTION_ENTITY_TYPES)}] + max_gleanings: 0 + +summarize_descriptions: + ## llm: override the global llm settings for this task + ## parallelization: override the global parallelization settings for this task + ## async_mode: override the global async_mode settings for this task + prompt: "prompts/summarize_descriptions.txt" + max_length: {defs.SUMMARIZE_DESCRIPTIONS_MAX_LENGTH} + +claim_extraction: + ## llm: override the global llm settings for this task + ## parallelization: override the global parallelization settings for this task + ## async_mode: override the global async_mode settings for this task + # enabled: true + prompt: "prompts/claim_extraction.txt" + description: "{defs.CLAIM_DESCRIPTION}" + max_gleanings: {defs.CLAIM_MAX_GLEANINGS} + +community_report: + ## llm: override the global llm settings for this task + ## parallelization: override the global parallelization settings for this task + ## async_mode: override the global async_mode settings for this task + prompt: "prompts/community_report.txt" + max_length: {defs.COMMUNITY_REPORT_MAX_LENGTH} + max_input_length: {defs.COMMUNITY_REPORT_MAX_INPUT_LENGTH} + +cluster_graph: + max_cluster_size: {defs.MAX_CLUSTER_SIZE} + +embed_graph: + enabled: false # if true, will generate node2vec embeddings for nodes + # num_walks: {defs.NODE2VEC_NUM_WALKS} + # walk_length: {defs.NODE2VEC_WALK_LENGTH} + # window_size: {defs.NODE2VEC_WINDOW_SIZE} + # iterations: {defs.NODE2VEC_ITERATIONS} + # random_seed: {defs.NODE2VEC_RANDOM_SEED} + +umap: + enabled: false # if true, will generate UMAP embeddings for nodes + +snapshots: + graphml: false + raw_entities: false + top_level_nodes: false + +local_search: + # text_unit_prop: {defs.LOCAL_SEARCH_TEXT_UNIT_PROP} + # community_prop: {defs.LOCAL_SEARCH_COMMUNITY_PROP} + # conversation_history_max_turns: {defs.LOCAL_SEARCH_CONVERSATION_HISTORY_MAX_TURNS} + # top_k_mapped_entities: {defs.LOCAL_SEARCH_TOP_K_MAPPED_ENTITIES} + # top_k_relationships: {defs.LOCAL_SEARCH_TOP_K_RELATIONSHIPS} + # max_tokens: {defs.LOCAL_SEARCH_MAX_TOKENS} + +global_search: + # max_tokens: {defs.GLOBAL_SEARCH_MAX_TOKENS} + # data_max_tokens: {defs.GLOBAL_SEARCH_DATA_MAX_TOKENS} + # map_max_tokens: {defs.GLOBAL_SEARCH_MAP_MAX_TOKENS} + # reduce_max_tokens: {defs.GLOBAL_SEARCH_REDUCE_MAX_TOKENS} + # concurrency: {defs.GLOBAL_SEARCH_CONCURRENCY} +""" + +INIT_DOTENV = """ +GRAPHRAG_API_KEY= +""" diff --git a/graphrag/index/input/__init__.py b/graphrag/index/input/__init__.py new file mode 100644 index 00000000..91421867 --- /dev/null +++ b/graphrag/index/input/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine input package root.""" + +from .load_input import load_input + +__all__ = ["load_input"] diff --git a/graphrag/index/input/csv.py b/graphrag/index/input/csv.py new file mode 100644 index 00000000..65966f18 --- /dev/null +++ b/graphrag/index/input/csv.py @@ -0,0 +1,131 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing load method definition.""" + +import logging +import re +from io import BytesIO +from typing import cast + +import pandas as pd + +from graphrag.index.config import PipelineCSVInputConfig, PipelineInputConfig +from graphrag.index.progress import ProgressReporter +from graphrag.index.storage import PipelineStorage +from graphrag.index.utils import gen_md5_hash + +log = logging.getLogger(__name__) + +DEFAULT_FILE_PATTERN = re.compile(r"(?P[^\\/]).csv$") + +input_type = "csv" + + +async def load( + config: PipelineInputConfig, + progress: ProgressReporter | None, + storage: PipelineStorage, +) -> pd.DataFrame: + """Load csv inputs from a directory.""" + csv_config = cast(PipelineCSVInputConfig, config) + log.info("Loading csv files from %s", csv_config.base_dir) + + async def load_file(path: str, group: dict | None) -> pd.DataFrame: + if group is None: + group = {} + buffer = BytesIO(await storage.get(path, as_bytes=True)) + data = pd.read_csv(buffer, encoding=config.encoding or "latin-1") + additional_keys = group.keys() + if len(additional_keys) > 0: + data[[*additional_keys]] = data.apply( + lambda _row: pd.Series([group[key] for key in additional_keys]), axis=1 + ) + if "id" not in data.columns: + data["id"] = data.apply(lambda x: gen_md5_hash(x, x.keys()), axis=1) + if csv_config.source_column is not None and "source" not in data.columns: + if csv_config.source_column not in data.columns: + log.warning( + "source_column %s not found in csv file %s", + csv_config.source_column, + path, + ) + else: + data["source"] = data.apply( + lambda x: x[csv_config.source_column], axis=1 + ) + if csv_config.text_column is not None and "text" not in data.columns: + if csv_config.text_column not in data.columns: + log.warning( + "text_column %s not found in csv file %s", + csv_config.text_column, + path, + ) + else: + data["text"] = data.apply(lambda x: x[csv_config.text_column], axis=1) + if csv_config.title_column is not None and "title" not in data.columns: + if csv_config.title_column not in data.columns: + log.warning( + "title_column %s not found in csv file %s", + csv_config.title_column, + path, + ) + else: + data["title"] = data.apply(lambda x: x[csv_config.title_column], axis=1) + + if csv_config.timestamp_column is not None: + fmt = csv_config.timestamp_format + if fmt is None: + msg = "Must specify timestamp_format if timestamp_column is specified" + raise ValueError(msg) + + if csv_config.timestamp_column not in data.columns: + log.warning( + "timestamp_column %s not found in csv file %s", + csv_config.timestamp_column, + path, + ) + else: + data["timestamp"] = pd.to_datetime( + data[csv_config.timestamp_column], format=fmt + ) + + # TODO: Theres probably a less gross way to do this + if "year" not in data.columns: + data["year"] = data.apply(lambda x: x["timestamp"].year, axis=1) + if "month" not in data.columns: + data["month"] = data.apply(lambda x: x["timestamp"].month, axis=1) + if "day" not in data.columns: + data["day"] = data.apply(lambda x: x["timestamp"].day, axis=1) + if "hour" not in data.columns: + data["hour"] = data.apply(lambda x: x["timestamp"].hour, axis=1) + if "minute" not in data.columns: + data["minute"] = data.apply(lambda x: x["timestamp"].minute, axis=1) + if "second" not in data.columns: + data["second"] = data.apply(lambda x: x["timestamp"].second, axis=1) + + return data + + file_pattern = ( + re.compile(config.file_pattern) + if config.file_pattern is not None + else DEFAULT_FILE_PATTERN + ) + files = list( + storage.find( + file_pattern, + progress=progress, + file_filter=config.file_filter, + ) + ) + + if len(files) == 0: + msg = f"No CSV files found in {config.base_dir}" + raise ValueError(msg) + + files = [await load_file(file, group) for file, group in files] + log.info("loading %d csv files", len(files)) + result = pd.concat(files) + total_files_log = f"Total number of unfiltered csv rows: {len(result)}" + log.info(total_files_log) + return result diff --git a/graphrag/index/input/load_input.py b/graphrag/index/input/load_input.py new file mode 100644 index 00000000..6d623342 --- /dev/null +++ b/graphrag/index/input/load_input.py @@ -0,0 +1,85 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing load_input method definition.""" + +import logging +from collections.abc import Awaitable, Callable +from pathlib import Path +from typing import cast + +import pandas as pd + +from graphrag.config import InputConfig, InputType +from graphrag.index.config import PipelineInputConfig +from graphrag.index.progress import NullProgressReporter, ProgressReporter +from graphrag.index.storage import ( + BlobPipelineStorage, + FilePipelineStorage, +) + +from .csv import input_type as csv +from .csv import load as load_csv +from .text import input_type as text +from .text import load as load_text + +log = logging.getLogger(__name__) +loaders: dict[str, Callable[..., Awaitable[pd.DataFrame]]] = { + text: load_text, + csv: load_csv, +} + + +async def load_input( + config: PipelineInputConfig | InputConfig, + progress_reporter: ProgressReporter | None = None, + root_dir: str | None = None, +) -> pd.DataFrame: + """Load the input data for a pipeline.""" + root_dir = root_dir or "" + log.info("loading input from root_dir=%s", config.base_dir) + progress_reporter = progress_reporter or NullProgressReporter() + + if config is None: + msg = "No input specified!" + raise ValueError(msg) + + match config.type: + case InputType.blob: + log.info("using blob storage input") + if config.container_name is None: + msg = "Container name required for blob storage" + raise ValueError(msg) + if ( + config.connection_string is None + and config.storage_account_blob_url is None + ): + msg = "Connection string or storage account blob url required for blob storage" + raise ValueError(msg) + storage = BlobPipelineStorage( + connection_string=config.connection_string, + storage_account_blob_url=config.storage_account_blob_url, + container_name=config.container_name, + path_prefix=config.base_dir, + ) + case InputType.file: + log.info("using file storage for input") + storage = FilePipelineStorage( + root_dir=str(Path(root_dir) / (config.base_dir or "")) + ) + case _: + log.info("using file storage for input") + storage = FilePipelineStorage( + root_dir=str(Path(root_dir) / (config.base_dir or "")) + ) + + if config.file_type in loaders: + progress = progress_reporter.child( + f"Loading Input ({config.file_type})", transient=False + ) + loader = loaders[config.file_type] + results = await loader(config, progress, storage) + return cast(pd.DataFrame, results) + + msg = f"Unknown input type {config.file_type}" + raise ValueError(msg) diff --git a/graphrag/index/input/text.py b/graphrag/index/input/text.py new file mode 100644 index 00000000..def13d78 --- /dev/null +++ b/graphrag/index/input/text.py @@ -0,0 +1,55 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing load method definition.""" + +import logging +import re +from pathlib import Path +from typing import Any + +import pandas as pd + +from graphrag.index.config import PipelineInputConfig +from graphrag.index.progress import ProgressReporter +from graphrag.index.storage import PipelineStorage +from graphrag.index.utils import gen_md5_hash + +DEFAULT_FILE_PATTERN = re.compile( + r".*[\\/](?P[^\\/]+)[\\/](?P\d{4})-(?P\d{2})-(?P\d{2})_(?P[^_]+)_\d+\.txt" +) +input_type = "text" +log = logging.getLogger(__name__) + + +async def load( + config: PipelineInputConfig, + progress: ProgressReporter | None, + storage: PipelineStorage, +) -> pd.DataFrame: + """Load text inputs from a directory.""" + + async def load_file( + path: str, group: dict | None = None, _encoding: str = "utf-8" + ) -> dict[str, Any]: + if group is None: + group = {} + text = await storage.get(path, encoding="utf-8") + new_item = {**group, "text": text} + new_item["id"] = gen_md5_hash(new_item, new_item.keys()) + new_item["title"] = str(Path(path).name) + return new_item + + files = list( + storage.find( + re.compile(config.file_pattern), + progress=progress, + file_filter=config.file_filter, + ) + ) + if len(files) == 0: + msg = f"No text files found in {config.base_dir}" + raise ValueError(msg) + found_files = f"found text files from {config.base_dir}, found {files}" + log.info(found_files) + return pd.DataFrame([await load_file(file, group) for file, group in files]) diff --git a/graphrag/index/llm/__init__.py b/graphrag/index/llm/__init__.py new file mode 100644 index 00000000..008ef07c --- /dev/null +++ b/graphrag/index/llm/__init__.py @@ -0,0 +1,14 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine LLM package root.""" + +from .load_llm import load_llm, load_llm_embeddings +from .types import TextListSplitter, TextSplitter + +__all__ = [ + "TextListSplitter", + "TextSplitter", + "load_llm", + "load_llm_embeddings", +] diff --git a/graphrag/index/llm/load_llm.py b/graphrag/index/llm/load_llm.py new file mode 100644 index 00000000..f24a2815 --- /dev/null +++ b/graphrag/index/llm/load_llm.py @@ -0,0 +1,311 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Load llm utilities.""" + +from __future__ import annotations + +import asyncio +import logging +from typing import TYPE_CHECKING, Any + +from graphrag.config.enums import LLMType +from graphrag.llm import ( + CompletionLLM, + EmbeddingLLM, + LLMCache, + LLMLimiter, + MockCompletionLLM, + OpenAIConfiguration, + create_openai_chat_llm, + create_openai_client, + create_openai_completion_llm, + create_openai_embedding_llm, + create_tpm_rpm_limiters, +) + +if TYPE_CHECKING: + from datashaper import VerbCallbacks + + from graphrag.index.cache import PipelineCache + from graphrag.index.typing import ErrorHandlerFn + +log = logging.getLogger(__name__) + +_semaphores: dict[str, asyncio.Semaphore] = {} +_rate_limiters: dict[str, LLMLimiter] = {} + + +def load_llm( + name: str, + llm_type: LLMType, + callbacks: VerbCallbacks, + cache: PipelineCache | None, + llm_config: dict[str, Any] | None = None, + chat_only=False, +) -> CompletionLLM: + """Load the LLM for the entity extraction chain.""" + on_error = _create_error_handler(callbacks) + + if llm_type in loaders: + if chat_only and not loaders[llm_type]["chat"]: + msg = f"LLM type {llm_type} does not support chat" + raise ValueError(msg) + if cache is not None: + cache = cache.child(name) + + loader = loaders[llm_type] + return loader["load"](on_error, cache, llm_config or {}) + + msg = f"Unknown LLM type {llm_type}" + raise ValueError(msg) + + +def load_llm_embeddings( + name: str, + llm_type: LLMType, + callbacks: VerbCallbacks, + cache: PipelineCache | None, + llm_config: dict[str, Any] | None = None, + chat_only=False, +) -> EmbeddingLLM: + """Load the LLM for the entity extraction chain.""" + on_error = _create_error_handler(callbacks) + if llm_type in loaders: + if chat_only and not loaders[llm_type]["chat"]: + msg = f"LLM type {llm_type} does not support chat" + raise ValueError(msg) + if cache is not None: + cache = cache.child(name) + + return loaders[llm_type]["load"](on_error, cache, llm_config or {}) + + msg = f"Unknown LLM type {llm_type}" + raise ValueError(msg) + + +def _create_error_handler(callbacks: VerbCallbacks) -> ErrorHandlerFn: + def on_error( + error: BaseException | None = None, + stack: str | None = None, + details: dict | None = None, + ) -> None: + callbacks.error("Error Invoking LLM", error, stack, details) + + return on_error + + +def _load_openai_completion_llm( + on_error: ErrorHandlerFn, + cache: LLMCache, + config: dict[str, Any], + azure=False, +): + return _create_openai_completion_llm( + OpenAIConfiguration({ + **_get_base_config(config), + "model": config.get("model", "gpt-4-turbo-preview"), + "deployment_name": config.get("deployment_name"), + "temperature": config.get("temperature", 0.0), + "frequency_penalty": config.get("frequency_penalty", 0), + "presence_penalty": config.get("presence_penalty", 0), + "top_p": config.get("top_p", 1), + "max_tokens": config.get("max_tokens"), + }), + on_error, + cache, + azure, + ) + + +def _load_openai_chat_llm( + on_error: ErrorHandlerFn, + cache: LLMCache, + config: dict[str, Any], + azure=False, +): + return _create_openai_chat_llm( + OpenAIConfiguration({ + # Set default values + **_get_base_config(config), + "model": config.get("model", "gpt-4-turbo-preview"), + "deployment_name": config.get("deployment_name"), + "temperature": config.get("temperature", 0.0), + "frequency_penalty": config.get("frequency_penalty", 0), + "presence_penalty": config.get("presence_penalty", 0), + "top_p": config.get("top_p", 1), + "max_tokens": config.get("max_tokens"), + }), + on_error, + cache, + azure, + ) + + +def _load_openai_embeddings_llm( + on_error: ErrorHandlerFn, + cache: LLMCache, + config: dict[str, Any], + azure=False, +): + # TODO: Inject Cache + return _create_openai_embeddings_llm( + OpenAIConfiguration({ + **_get_base_config(config), + "model": config.get( + "embeddings_model", config.get("model", "text-embedding-3-small") + ), + "deployment_name": config.get("deployment_name"), + }), + on_error, + cache, + azure, + ) + + +def _load_azure_openai_completion_llm( + on_error: ErrorHandlerFn, cache: LLMCache, config: dict[str, Any] +): + return _load_openai_completion_llm(on_error, cache, config, True) + + +def _load_azure_openai_chat_llm( + on_error: ErrorHandlerFn, cache: LLMCache, config: dict[str, Any] +): + return _load_openai_chat_llm(on_error, cache, config, True) + + +def _load_azure_openai_embeddings_llm( + on_error: ErrorHandlerFn, cache: LLMCache, config: dict[str, Any] +): + return _load_openai_embeddings_llm(on_error, cache, config, True) + + +def _get_base_config(config: dict[str, Any]) -> dict[str, Any]: + api_key = config.get("api_key") + + return { + # Pass in all parameterized values + **config, + # Set default values + "api_key": api_key, + "api_base": config.get("api_base"), + "api_version": config.get("api_version"), + "organization": config.get("organization"), + "proxy": config.get("proxy"), + "max_retries": config.get("max_retries", 10), + "request_timeout": config.get("request_timeout", 60.0), + "model_supports_json": config.get("model_supports_json"), + "concurrent_requests": config.get("concurrent_requests", 4), + "encoding_model": config.get("encoding_model", "cl100k_base"), + "cognitive_services_endpoint": config.get("cognitive_services_endpoint"), + } + + +def _load_static_response( + _on_error: ErrorHandlerFn, _cache: PipelineCache, config: dict[str, Any] +) -> CompletionLLM: + return MockCompletionLLM(config.get("responses", [])) + + +loaders = { + LLMType.OpenAI: { + "load": _load_openai_completion_llm, + "chat": False, + }, + LLMType.AzureOpenAI: { + "load": _load_azure_openai_completion_llm, + "chat": False, + }, + LLMType.OpenAIChat: { + "load": _load_openai_chat_llm, + "chat": True, + }, + LLMType.AzureOpenAIChat: { + "load": _load_azure_openai_chat_llm, + "chat": True, + }, + LLMType.OpenAIEmbedding: { + "load": _load_openai_embeddings_llm, + "chat": False, + }, + LLMType.AzureOpenAIEmbedding: { + "load": _load_azure_openai_embeddings_llm, + "chat": False, + }, + LLMType.StaticResponse: { + "load": _load_static_response, + "chat": False, + }, +} + + +def _create_openai_chat_llm( + configuration: OpenAIConfiguration, + on_error: ErrorHandlerFn, + cache: LLMCache, + azure=False, +) -> CompletionLLM: + """Create an openAI chat llm.""" + client = create_openai_client(configuration=configuration, azure=azure) + limiter = _create_limiter(configuration) + semaphore = _create_semaphore(configuration) + return create_openai_chat_llm( + client, configuration, cache, limiter, semaphore, on_error=on_error + ) + + +def _create_openai_completion_llm( + configuration: OpenAIConfiguration, + on_error: ErrorHandlerFn, + cache: LLMCache, + azure=False, +) -> CompletionLLM: + """Create an openAI completion llm.""" + client = create_openai_client(configuration=configuration, azure=azure) + limiter = _create_limiter(configuration) + semaphore = _create_semaphore(configuration) + return create_openai_completion_llm( + client, configuration, cache, limiter, semaphore, on_error=on_error + ) + + +def _create_openai_embeddings_llm( + configuration: OpenAIConfiguration, + on_error: ErrorHandlerFn, + cache: LLMCache, + azure=False, +) -> EmbeddingLLM: + """Create an openAI embeddings llm.""" + client = create_openai_client(configuration=configuration, azure=azure) + limiter = _create_limiter(configuration) + semaphore = _create_semaphore(configuration) + return create_openai_embedding_llm( + client, configuration, cache, limiter, semaphore, on_error=on_error + ) + + +def _create_limiter(configuration: OpenAIConfiguration) -> LLMLimiter: + limit_name = configuration.model or configuration.deployment_name or "default" + if limit_name not in _rate_limiters: + tpm = configuration.tokens_per_minute + rpm = configuration.requests_per_minute + log.info("create TPM/RPM limiter for %s: TPM=%s, RPM=%s", limit_name, tpm, rpm) + _rate_limiters[limit_name] = create_tpm_rpm_limiters(configuration) + return _rate_limiters[limit_name] + + +def _create_semaphore(configuration: OpenAIConfiguration) -> asyncio.Semaphore | None: + limit_name = configuration.model or configuration.deployment_name or "default" + concurrency = configuration.concurrent_requests + + # bypass the semaphore if concurrency is zero + if not concurrency: + log.info("no concurrency limiter for %s", limit_name) + return None + + if limit_name not in _semaphores: + log.info("create concurrency limiter for %s: %s", limit_name, concurrency) + _semaphores[limit_name] = asyncio.Semaphore(concurrency) + + return _semaphores[limit_name] diff --git a/graphrag/index/llm/types.py b/graphrag/index/llm/types.py new file mode 100644 index 00000000..73c47737 --- /dev/null +++ b/graphrag/index/llm/types.py @@ -0,0 +1,10 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing the 'LLMtype' model.""" + +from collections.abc import Callable +from typing import TypeAlias + +TextSplitter: TypeAlias = Callable[[str], list[str]] +TextListSplitter: TypeAlias = Callable[[list[str]], list[str]] diff --git a/graphrag/index/load_pipeline_config.py b/graphrag/index/load_pipeline_config.py new file mode 100644 index 00000000..50a532c5 --- /dev/null +++ b/graphrag/index/load_pipeline_config.py @@ -0,0 +1,79 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing read_dotenv, load_pipeline_config, _parse_yaml and _create_include_constructor methods definition.""" + +import json +from pathlib import Path + +import yaml +from pyaml_env import parse_config as parse_config_with_env + +from graphrag.config import create_graphrag_config, read_dotenv +from graphrag.index.config import PipelineConfig + +from .create_pipeline_config import create_pipeline_config + + +def load_pipeline_config(config_or_path: str | PipelineConfig) -> PipelineConfig: + """Load a pipeline config from a file path or a config object.""" + if isinstance(config_or_path, PipelineConfig): + config = config_or_path + elif config_or_path == "default": + config = create_pipeline_config(create_graphrag_config(root_dir=".")) + else: + # Is there a .env file in the same directory as the config? + read_dotenv(str(Path(config_or_path).parent)) + + if config_or_path.endswith(".json"): + with Path(config_or_path).open(encoding="utf-8") as f: + config = json.load(f) + elif config_or_path.endswith((".yml", ".yaml")): + config = _parse_yaml(config_or_path) + else: + msg = f"Invalid config file type: {config_or_path}" + raise ValueError(msg) + + config = PipelineConfig.model_validate(config) + if not config.root_dir: + config.root_dir = str(Path(config_or_path).parent.resolve()) + + if config.extends is not None: + if isinstance(config.extends, str): + config.extends = [config.extends] + for extended_config in config.extends: + extended_config = load_pipeline_config(extended_config) + merged_config = { + **json.loads(extended_config.model_dump_json()), + **json.loads(config.model_dump_json(exclude_unset=True)), + } + config = PipelineConfig.model_validate(merged_config) + + return config + + +def _parse_yaml(path: str): + """Parse a yaml file, with support for !include directives.""" + # I don't like that this is static + loader_class = yaml.SafeLoader + + # Add !include constructor if not already present. + if "!include" not in loader_class.yaml_constructors: + loader_class.add_constructor("!include", _create_include_constructor()) + + return parse_config_with_env(path, loader=loader_class, default_value="") + + +def _create_include_constructor(): + """Create a constructor for !include directives.""" + + def handle_include(loader: yaml.Loader, node: yaml.Node): + """Include file referenced at node.""" + filename = str(Path(loader.name).parent / node.value) + if filename.endswith((".yml", ".yaml")): + return _parse_yaml(filename) + + with Path(filename).open(encoding="utf-8") as f: + return f.read() + + return handle_include diff --git a/graphrag/index/progress/__init__.py b/graphrag/index/progress/__init__.py new file mode 100644 index 00000000..df6a2152 --- /dev/null +++ b/graphrag/index/progress/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Progress-reporting components.""" + +from .types import NullProgressReporter, PrintProgressReporter, ProgressReporter + +__all__ = ["NullProgressReporter", "PrintProgressReporter", "ProgressReporter"] diff --git a/graphrag/index/progress/rich.py b/graphrag/index/progress/rich.py new file mode 100644 index 00000000..362b64f0 --- /dev/null +++ b/graphrag/index/progress/rich.py @@ -0,0 +1,165 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Rich-based progress reporter for CLI use.""" + +# Print iterations progress +import asyncio + +from datashaper import Progress as DSProgress +from rich.console import Console, Group +from rich.live import Live +from rich.progress import Progress, TaskID, TimeElapsedColumn +from rich.spinner import Spinner +from rich.tree import Tree + +from .types import ProgressReporter + + +# https://stackoverflow.com/a/34325723 +class RichProgressReporter(ProgressReporter): + """A rich-based progress reporter for CLI use.""" + + _console: Console + _group: Group + _tree: Tree + _live: Live + _task: TaskID | None = None + _prefix: str + _transient: bool + _disposing: bool = False + _progressbar: Progress + _last_refresh: float = 0 + + def dispose(self) -> None: + """Dispose of the progress reporter.""" + self._disposing = True + self._live.stop() + + @property + def console(self) -> Console: + """Get the console.""" + return self._console + + @property + def group(self) -> Group: + """Get the group.""" + return self._group + + @property + def tree(self) -> Tree: + """Get the tree.""" + return self._tree + + @property + def live(self) -> Live: + """Get the live.""" + return self._live + + def __init__( + self, + prefix: str, + parent: "RichProgressReporter | None" = None, + transient: bool = True, + ) -> None: + """Create a new rich-based progress reporter.""" + self._prefix = prefix + + if parent is None: + console = Console() + group = Group(Spinner("dots", prefix), fit=True) + tree = Tree(group) + live = Live( + tree, console=console, refresh_per_second=1, vertical_overflow="crop" + ) + live.start() + + self._console = console + self._group = group + self._tree = tree + self._live = live + self._transient = False + else: + self._console = parent.console + self._group = parent.group + progress_columns = [*Progress.get_default_columns(), TimeElapsedColumn()] + self._progressbar = Progress( + *progress_columns, console=self._console, transient=transient + ) + + tree = Tree(prefix) + tree.add(self._progressbar) + tree.hide_root = True + + if parent is not None: + parent_tree = parent.tree + parent_tree.hide_root = False + parent_tree.add(tree) + + self._tree = tree + self._live = parent.live + self._transient = transient + + self.refresh() + + def refresh(self) -> None: + """Perform a debounced refresh.""" + now = asyncio.get_event_loop().time() + duration = now - self._last_refresh + if duration > 0.1: + self._last_refresh = now + self.force_refresh() + + def force_refresh(self) -> None: + """Force a refresh.""" + self.live.refresh() + + def stop(self) -> None: + """Stop the progress reporter.""" + self._live.stop() + + def child(self, prefix: str, transient: bool = True) -> ProgressReporter: + """Create a child progress bar.""" + return RichProgressReporter(parent=self, prefix=prefix, transient=transient) + + def error(self, message: str) -> None: + """Report an error.""" + self._console.print(f"❌ [red]{message}[/red]") + + def warning(self, message: str) -> None: + """Report a warning.""" + self._console.print(f"⚠️ [yellow]{message}[/yellow]") + + def success(self, message: str) -> None: + """Report success.""" + self._console.print(f"🚀 [green]{message}[/green]") + + def info(self, message: str) -> None: + """Report information.""" + self._console.print(message) + + def __call__(self, progress_update: DSProgress) -> None: + """Update progress.""" + if self._disposing: + return + progressbar = self._progressbar + + if self._task is None: + self._task = progressbar.add_task(self._prefix) + + progress_description = "" + if progress_update.description is not None: + progress_description = f" - {progress_update.description}" + + completed = progress_update.completed_items or progress_update.percent + total = progress_update.total_items or 1 + progressbar.update( + self._task, + completed=completed, + total=total, + description=f"{self._prefix}{progress_description}", + ) + if completed == total and self._transient: + progressbar.update(self._task, visible=False) + + self.refresh() diff --git a/graphrag/index/progress/types.py b/graphrag/index/progress/types.py new file mode 100644 index 00000000..2912155e --- /dev/null +++ b/graphrag/index/progress/types.py @@ -0,0 +1,128 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Types for status reporting.""" + +from abc import ABC, abstractmethod + +from datashaper import Progress + + +class ProgressReporter(ABC): + """ + Abstract base class for progress reporters. + + This is used to report workflow processing progress via mechanisms like progress-bars. + """ + + @abstractmethod + def __call__(self, update: Progress): + """Update progress.""" + + @abstractmethod + def dispose(self): + """Dispose of the progress reporter.""" + + @abstractmethod + def child(self, prefix: str, transient=True) -> "ProgressReporter": + """Create a child progress bar.""" + + @abstractmethod + def force_refresh(self) -> None: + """Force a refresh.""" + + @abstractmethod + def stop(self) -> None: + """Stop the progress reporter.""" + + @abstractmethod + def error(self, message: str) -> None: + """Report an error.""" + + @abstractmethod + def warning(self, message: str) -> None: + """Report a warning.""" + + @abstractmethod + def info(self, message: str) -> None: + """Report information.""" + + @abstractmethod + def success(self, message: str) -> None: + """Report success.""" + + +class NullProgressReporter(ProgressReporter): + """A progress reporter that does nothing.""" + + def __call__(self, update: Progress) -> None: + """Update progress.""" + + def dispose(self) -> None: + """Dispose of the progress reporter.""" + + def child(self, prefix: str, transient: bool = True) -> ProgressReporter: + """Create a child progress bar.""" + return self + + def force_refresh(self) -> None: + """Force a refresh.""" + + def stop(self) -> None: + """Stop the progress reporter.""" + + def error(self, message: str) -> None: + """Report an error.""" + + def warning(self, message: str) -> None: + """Report a warning.""" + + def info(self, message: str) -> None: + """Report information.""" + + def success(self, message: str) -> None: + """Report success.""" + + +class PrintProgressReporter(ProgressReporter): + """A progress reporter that does nothing.""" + + prefix: str + + def __init__(self, prefix: str): + """Create a new progress reporter.""" + self.prefix = prefix + print(f"\n{self.prefix}", end="") # noqa T201 + + def __call__(self, update: Progress) -> None: + """Update progress.""" + print(".", end="") # noqa T201 + + def dispose(self) -> None: + """Dispose of the progress reporter.""" + + def child(self, prefix: str, transient: bool = True) -> "ProgressReporter": + """Create a child progress bar.""" + return PrintProgressReporter(prefix) + + def stop(self) -> None: + """Stop the progress reporter.""" + + def force_refresh(self) -> None: + """Force a refresh.""" + + def error(self, message: str) -> None: + """Report an error.""" + print(f"\n{self.prefix}ERROR: {message}") # noqa T201 + + def warning(self, message: str) -> None: + """Report a warning.""" + print(f"\n{self.prefix}WARNING: {message}") # noqa T201 + + def info(self, message: str) -> None: + """Report information.""" + print(f"\n{self.prefix}INFO: {message}") # noqa T201 + + def success(self, message: str) -> None: + """Report success.""" + print(f"\n{self.prefix}SUCCESS: {message}") # noqa T201 diff --git a/graphrag/index/py.typed b/graphrag/index/py.typed new file mode 100644 index 00000000..f4bd2989 --- /dev/null +++ b/graphrag/index/py.typed @@ -0,0 +1,2 @@ +# This package supports type hinting, +# see https://www.python.org/dev/peps/pep-0561/#packaging-type-information \ No newline at end of file diff --git a/graphrag/index/reporting/__init__.py b/graphrag/index/reporting/__init__.py new file mode 100644 index 00000000..697d4fc5 --- /dev/null +++ b/graphrag/index/reporting/__init__.py @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Reporting utilities and implementations for the indexing engine.""" + +from .blob_workflow_callbacks import BlobWorkflowCallbacks +from .console_workflow_callbacks import ConsoleWorkflowCallbacks +from .file_workflow_callbacks import FileWorkflowCallbacks +from .load_pipeline_reporter import load_pipeline_reporter +from .progress_workflow_callbacks import ProgressWorkflowCallbacks + +__all__ = [ + "BlobWorkflowCallbacks", + "ConsoleWorkflowCallbacks", + "FileWorkflowCallbacks", + "ProgressWorkflowCallbacks", + "load_pipeline_reporter", +] diff --git a/graphrag/index/reporting/blob_workflow_callbacks.py b/graphrag/index/reporting/blob_workflow_callbacks.py new file mode 100644 index 00000000..28f0b6d9 --- /dev/null +++ b/graphrag/index/reporting/blob_workflow_callbacks.py @@ -0,0 +1,108 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A reporter that writes to a blob storage.""" + +import json +from datetime import datetime, timezone +from pathlib import Path +from typing import Any + +from azure.identity import DefaultAzureCredential +from azure.storage.blob import BlobServiceClient +from datashaper import NoopWorkflowCallbacks + + +class BlobWorkflowCallbacks(NoopWorkflowCallbacks): + """A reporter that writes to a blob storage.""" + + _blob_service_client: BlobServiceClient + _container_name: str + _max_block_count: int = 25000 # 25k blocks per blob + + def __init__( + self, + connection_string: str | None, + container_name: str, + blob_name: str = "", + base_dir: str | None = None, + storage_account_blob_url: str | None = None, + ): # type: ignore + """Create a new instance of the BlobStorageReporter class.""" + if container_name is None: + msg = "No container name provided for blob storage." + raise ValueError(msg) + if connection_string is None and storage_account_blob_url is None: + msg = "No storage account blob url provided for blob storage." + raise ValueError(msg) + self._connection_string = connection_string + self._storage_account_blob_url = storage_account_blob_url + if self._connection_string: + self._blob_service_client = BlobServiceClient.from_connection_string( + self._connection_string + ) + else: + if storage_account_blob_url is None: + msg = "Either connection_string or storage_account_blob_url must be provided." + raise ValueError(msg) + + self._blob_service_client = BlobServiceClient( + storage_account_blob_url, + credential=DefaultAzureCredential(), + ) + + if blob_name == "": + blob_name = f"report/{datetime.now(tz=timezone.utc).strftime('%Y-%m-%d-%H:%M:%S:%f')}.logs.json" + + self._blob_name = str(Path(base_dir or "") / blob_name) + self._container_name = container_name + self._blob_client = self._blob_service_client.get_blob_client( + self._container_name, self._blob_name + ) + if not self._blob_client.exists(): + self._blob_client.create_append_blob() + + self._num_blocks = 0 # refresh block counter + + def _write_log(self, log: dict[str, Any]): + # create a new file when block count hits close 25k + if ( + self._num_blocks >= self._max_block_count + ): # Check if block count exceeds 25k + self.__init__( + self._connection_string, + self._container_name, + storage_account_blob_url=self._storage_account_blob_url, + ) + + blob_client = self._blob_service_client.get_blob_client( + self._container_name, self._blob_name + ) + blob_client.append_block(json.dumps(log) + "\n") + + # update the blob's block count + self._num_blocks += 1 + + def on_error( + self, + message: str, + cause: BaseException | None = None, + stack: str | None = None, + details: dict | None = None, + ): + """Report an error.""" + self._write_log({ + "type": "error", + "data": message, + "cause": str(cause), + "stack": stack, + "details": details, + }) + + def on_warning(self, message: str, details: dict | None = None): + """Report a warning.""" + self._write_log({"type": "warning", "data": message, "details": details}) + + def on_log(self, message: str, details: dict | None = None): + """Report a generic log message.""" + self._write_log({"type": "log", "data": message, "details": details}) diff --git a/graphrag/index/reporting/console_workflow_callbacks.py b/graphrag/index/reporting/console_workflow_callbacks.py new file mode 100644 index 00000000..b1ab1278 --- /dev/null +++ b/graphrag/index/reporting/console_workflow_callbacks.py @@ -0,0 +1,32 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Console-based reporter for the workflow engine.""" + +from datashaper import NoopWorkflowCallbacks + + +class ConsoleWorkflowCallbacks(NoopWorkflowCallbacks): + """A reporter that writes to a console.""" + + def on_error( + self, + message: str, + cause: BaseException | None = None, + stack: str | None = None, + details: dict | None = None, + ): + """Handle when an error occurs.""" + print(message, str(cause), stack, details) # noqa T201 + + def on_warning(self, message: str, details: dict | None = None): + """Handle when a warning occurs.""" + _print_warning(message) + + def on_log(self, message: str, details: dict | None = None): + """Handle when a log message is produced.""" + print(message, details) # noqa T201 + + +def _print_warning(skk): + print("\033[93m {}\033[00m".format(skk)) # noqa T201 diff --git a/graphrag/index/reporting/file_workflow_callbacks.py b/graphrag/index/reporting/file_workflow_callbacks.py new file mode 100644 index 00000000..e0714986 --- /dev/null +++ b/graphrag/index/reporting/file_workflow_callbacks.py @@ -0,0 +1,67 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A reporter that writes to a file.""" + +import json +import logging +from io import TextIOWrapper +from pathlib import Path + +from datashaper import NoopWorkflowCallbacks + +log = logging.getLogger(__name__) + + +class FileWorkflowCallbacks(NoopWorkflowCallbacks): + """A reporter that writes to a file.""" + + _out_stream: TextIOWrapper + + def __init__(self, directory: str): + """Create a new file-based workflow reporter.""" + Path(directory).mkdir(parents=True, exist_ok=True) + self._out_stream = open( # noqa SIM115 + Path(directory) / "logs.json", "a", encoding="utf-8" + ) + + def on_error( + self, + message: str, + cause: BaseException | None = None, + stack: str | None = None, + details: dict | None = None, + ): + """Handle when an error occurs.""" + self._out_stream.write( + json.dumps({ + "type": "error", + "data": message, + "stack": stack, + "source": str(cause), + "details": details, + }) + + "\n" + ) + message = f"{message} details={details}" + log.info(message) + + def on_warning(self, message: str, details: dict | None = None): + """Handle when a warning occurs.""" + self._out_stream.write( + json.dumps({"type": "warning", "data": message, "details": details}) + "\n" + ) + _print_warning(message) + + def on_log(self, message: str, details: dict | None = None): + """Handle when a log message is produced.""" + self._out_stream.write( + json.dumps({"type": "log", "data": message, "details": details}) + "\n" + ) + + message = f"{message} details={details}" + log.info(message) + + +def _print_warning(skk): + log.warning(skk) diff --git a/graphrag/index/reporting/load_pipeline_reporter.py b/graphrag/index/reporting/load_pipeline_reporter.py new file mode 100644 index 00000000..0386ea03 --- /dev/null +++ b/graphrag/index/reporting/load_pipeline_reporter.py @@ -0,0 +1,47 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Load pipeline reporter method.""" + +from pathlib import Path +from typing import cast + +from datashaper import WorkflowCallbacks + +from graphrag.config import ReportingType +from graphrag.index.config import ( + PipelineBlobReportingConfig, + PipelineFileReportingConfig, + PipelineReportingConfig, +) + +from .blob_workflow_callbacks import BlobWorkflowCallbacks +from .console_workflow_callbacks import ConsoleWorkflowCallbacks +from .file_workflow_callbacks import FileWorkflowCallbacks + + +def load_pipeline_reporter( + config: PipelineReportingConfig | None, root_dir: str | None +) -> WorkflowCallbacks: + """Create a reporter for the given pipeline config.""" + config = config or PipelineFileReportingConfig(base_dir="reports") + + match config.type: + case ReportingType.file: + config = cast(PipelineFileReportingConfig, config) + return FileWorkflowCallbacks( + str(Path(root_dir or "") / (config.base_dir or "")) + ) + case ReportingType.console: + return ConsoleWorkflowCallbacks() + case ReportingType.blob: + config = cast(PipelineBlobReportingConfig, config) + return BlobWorkflowCallbacks( + config.connection_string, + config.container_name, + base_dir=config.base_dir, + storage_account_blob_url=config.storage_account_blob_url, + ) + case _: + msg = f"Unknown reporting type: {config.type}" + raise ValueError(msg) diff --git a/graphrag/index/reporting/progress_workflow_callbacks.py b/graphrag/index/reporting/progress_workflow_callbacks.py new file mode 100644 index 00000000..68f10d75 --- /dev/null +++ b/graphrag/index/reporting/progress_workflow_callbacks.py @@ -0,0 +1,54 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A workflow callback manager that emits updates to a ProgressReporter.""" + +from typing import Any + +from datashaper import ExecutionNode, NoopWorkflowCallbacks, Progress, TableContainer + +from graphrag.index.progress import ProgressReporter + + +class ProgressWorkflowCallbacks(NoopWorkflowCallbacks): + """A callbackmanager that delegates to a ProgressReporter.""" + + _root_progress: ProgressReporter + _progress_stack: list[ProgressReporter] + + def __init__(self, progress: ProgressReporter) -> None: + """Create a new ProgressWorkflowCallbacks.""" + self._progress = progress + self._progress_stack = [progress] + + def _pop(self) -> None: + self._progress_stack.pop() + + def _push(self, name: str) -> None: + self._progress_stack.append(self._latest.child(name)) + + @property + def _latest(self) -> ProgressReporter: + return self._progress_stack[-1] + + def on_workflow_start(self, name: str, instance: object) -> None: + """Execute this callback when a workflow starts.""" + self._push(name) + + def on_workflow_end(self, name: str, instance: object) -> None: + """Execute this callback when a workflow ends.""" + self._pop() + + def on_step_start(self, node: ExecutionNode, inputs: dict[str, Any]) -> None: + """Execute this callback every time a step starts.""" + verb_id_str = f" ({node.node_id})" if node.has_explicit_id else "" + self._push(f"Verb {node.verb.name}{verb_id_str}") + self._latest(Progress(percent=0)) + + def on_step_end(self, node: ExecutionNode, result: TableContainer | None) -> None: + """Execute this callback every time a step ends.""" + self._pop() + + def on_step_progress(self, node: ExecutionNode, progress: Progress) -> None: + """Handle when progress occurs.""" + self._latest(progress) diff --git a/graphrag/index/run.py b/graphrag/index/run.py new file mode 100644 index 00000000..94a519de --- /dev/null +++ b/graphrag/index/run.py @@ -0,0 +1,463 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Different methods to run the pipeline.""" + +import gc +import json +import logging +import time +import traceback +from collections.abc import AsyncIterable +from dataclasses import asdict +from io import BytesIO +from pathlib import Path +from string import Template +from typing import cast + +import pandas as pd +from datashaper import ( + DEFAULT_INPUT_NAME, + MemoryProfile, + Workflow, + WorkflowCallbacks, + WorkflowCallbacksManager, + WorkflowRunResult, +) + +from .cache import InMemoryCache, PipelineCache, load_cache +from .config import ( + PipelineBlobCacheConfig, + PipelineBlobReportingConfig, + PipelineBlobStorageConfig, + PipelineCacheConfigTypes, + PipelineConfig, + PipelineFileCacheConfig, + PipelineFileReportingConfig, + PipelineFileStorageConfig, + PipelineInputConfigTypes, + PipelineMemoryCacheConfig, + PipelineReportingConfigTypes, + PipelineStorageConfigTypes, + PipelineWorkflowReference, + PipelineWorkflowStep, +) +from .context import PipelineRunContext, PipelineRunStats +from .emit import TableEmitterType, create_table_emitters +from .input import load_input +from .load_pipeline_config import load_pipeline_config +from .progress import NullProgressReporter, ProgressReporter +from .reporting import ( + ConsoleWorkflowCallbacks, + ProgressWorkflowCallbacks, + load_pipeline_reporter, +) +from .storage import MemoryPipelineStorage, PipelineStorage, load_storage +from .typing import PipelineRunResult + +# Register all verbs +from .verbs import * # noqa +from .workflows import ( + VerbDefinitions, + WorkflowDefinitions, + create_workflow, + load_workflows, +) + +log = logging.getLogger(__name__) + + +async def run_pipeline_with_config( + config_or_path: PipelineConfig | str, + workflows: list[PipelineWorkflowReference] | None = None, + dataset: pd.DataFrame | None = None, + storage: PipelineStorage | None = None, + cache: PipelineCache | None = None, + callbacks: WorkflowCallbacks | None = None, + progress_reporter: ProgressReporter | None = None, + input_post_process_steps: list[PipelineWorkflowStep] | None = None, + additional_verbs: VerbDefinitions | None = None, + additional_workflows: WorkflowDefinitions | None = None, + emit: list[TableEmitterType] | None = None, + memory_profile: bool = False, + run_id: str | None = None, + is_resume_run: bool = False, + **_kwargs: dict, +) -> AsyncIterable[PipelineRunResult]: + """Run a pipeline with the given config. + + Args: + - config_or_path - The config to run the pipeline with + - workflows - The workflows to run (this overrides the config) + - dataset - The dataset to run the pipeline on (this overrides the config) + - storage - The storage to use for the pipeline (this overrides the config) + - cache - The cache to use for the pipeline (this overrides the config) + - reporter - The reporter to use for the pipeline (this overrides the config) + - input_post_process_steps - The post process steps to run on the input data (this overrides the config) + - additional_verbs - The custom verbs to use for the pipeline. + - additional_workflows - The custom workflows to use for the pipeline. + - emit - The table emitters to use for the pipeline. + - memory_profile - Whether or not to profile the memory. + - run_id - The run id to start or resume from. + """ + if isinstance(config_or_path, str): + log.info("Running pipeline with config %s", config_or_path) + else: + log.info("Running pipeline") + + run_id = run_id or time.strftime("%Y%m%d-%H%M%S") + config = load_pipeline_config(config_or_path) + config = _apply_substitutions(config, run_id) + root_dir = config.root_dir + + def _create_storage(config: PipelineStorageConfigTypes | None) -> PipelineStorage: + return load_storage( + config + or PipelineFileStorageConfig(base_dir=str(Path(root_dir or "") / "output")) + ) + + def _create_cache(config: PipelineCacheConfigTypes | None) -> PipelineCache: + return load_cache(config or PipelineMemoryCacheConfig(), root_dir=root_dir) + + def _create_reporter( + config: PipelineReportingConfigTypes | None, + ) -> WorkflowCallbacks | None: + return load_pipeline_reporter(config, root_dir) if config else None + + async def _create_input( + config: PipelineInputConfigTypes | None, + ) -> pd.DataFrame | None: + if config is None: + return None + + return await load_input(config, progress_reporter, root_dir) + + def _create_postprocess_steps( + config: PipelineInputConfigTypes | None, + ) -> list[PipelineWorkflowStep] | None: + return config.post_process if config is not None else None + + progress_reporter = progress_reporter or NullProgressReporter() + storage = storage or _create_storage(config.storage) + cache = cache or _create_cache(config.cache) + callbacks = callbacks or _create_reporter(config.reporting) + dataset = dataset if dataset is not None else await _create_input(config.input) + post_process_steps = input_post_process_steps or _create_postprocess_steps( + config.input + ) + workflows = workflows or config.workflows + + if dataset is None: + msg = "No dataset provided!" + raise ValueError(msg) + + async for table in run_pipeline( + workflows=workflows, + dataset=dataset, + storage=storage, + cache=cache, + callbacks=callbacks, + input_post_process_steps=post_process_steps, + memory_profile=memory_profile, + additional_verbs=additional_verbs, + additional_workflows=additional_workflows, + progress_reporter=progress_reporter, + emit=emit, + is_resume_run=is_resume_run, + ): + yield table + + +async def run_pipeline( + workflows: list[PipelineWorkflowReference], + dataset: pd.DataFrame, + storage: PipelineStorage | None = None, + cache: PipelineCache | None = None, + callbacks: WorkflowCallbacks | None = None, + progress_reporter: ProgressReporter | None = None, + input_post_process_steps: list[PipelineWorkflowStep] | None = None, + additional_verbs: VerbDefinitions | None = None, + additional_workflows: WorkflowDefinitions | None = None, + emit: list[TableEmitterType] | None = None, + memory_profile: bool = False, + is_resume_run: bool = False, + **_kwargs: dict, +) -> AsyncIterable[PipelineRunResult]: + """Run the pipeline. + + Args: + - workflows - The workflows to run + - dataset - The dataset to run the pipeline on, specifically a dataframe with the following columns at a minimum: + - id - The id of the document + - text - The text of the document + - title - The title of the document + These must exist after any post process steps are run if there are any! + - storage - The storage to use for the pipeline + - cache - The cache to use for the pipeline + - reporter - The reporter to use for the pipeline + - input_post_process_steps - The post process steps to run on the input data + - additional_verbs - The custom verbs to use for the pipeline + - additional_workflows - The custom workflows to use for the pipeline + - debug - Whether or not to run in debug mode + Returns: + - output - An iterable of workflow results as they complete running, as well as any errors that occur + """ + start_time = time.time() + stats = PipelineRunStats() + storage = storage or MemoryPipelineStorage() + cache = cache or InMemoryCache() + progress_reporter = progress_reporter or NullProgressReporter() + callbacks = callbacks or ConsoleWorkflowCallbacks() + callbacks = _create_callback_chain(callbacks, progress_reporter) + emit = emit or [TableEmitterType.Parquet] + emitters = create_table_emitters( + emit, + storage, + lambda e, s, d: cast(WorkflowCallbacks, callbacks).on_error( + "Error emitting table", e, s, d + ), + ) + loaded_workflows = load_workflows( + workflows, + additional_verbs=additional_verbs, + additional_workflows=additional_workflows, + memory_profile=memory_profile, + ) + workflows_to_run = loaded_workflows.workflows + workflow_dependencies = loaded_workflows.dependencies + + context = _create_run_context(storage, cache, stats) + + if len(emitters) == 0: + log.info( + "No emitters provided. No table outputs will be generated. This is probably not correct." + ) + + async def dump_stats() -> None: + await storage.set("stats.json", json.dumps(asdict(stats), indent=4)) + + async def load_table_from_storage(name: str) -> pd.DataFrame: + if not await storage.has(name): + msg = f"Could not find {name} in storage!" + raise ValueError(msg) + try: + log.info("read table from storage: %s", name) + return pd.read_parquet(BytesIO(await storage.get(name, as_bytes=True))) + except Exception: + log.exception("error loading table from storage: %s", name) + raise + + async def inject_workflow_data_dependencies(workflow: Workflow) -> None: + workflow.add_table(DEFAULT_INPUT_NAME, dataset) + deps = workflow_dependencies[workflow.name] + log.info("dependencies for %s: %s", workflow.name, deps) + for id in deps: + workflow_id = f"workflow:{id}" + table = await load_table_from_storage(f"{id}.parquet") + workflow.add_table(workflow_id, table) + + async def write_workflow_stats( + workflow: Workflow, + workflow_result: WorkflowRunResult, + workflow_start_time: float, + ) -> None: + for vt in workflow_result.verb_timings: + stats.workflows[workflow.name][f"{vt.index}_{vt.verb}"] = vt.timing + + workflow_end_time = time.time() + stats.workflows[workflow.name]["overall"] = ( + workflow_end_time - workflow_start_time + ) + stats.total_runtime = time.time() - start_time + await dump_stats() + + if workflow_result.memory_profile is not None: + await _save_profiler_stats( + storage, workflow.name, workflow_result.memory_profile + ) + + log.debug( + "first row of %s => %s", workflow_name, workflow.output().iloc[0].to_json() + ) + + async def emit_workflow_output(workflow: Workflow) -> pd.DataFrame: + output = cast(pd.DataFrame, workflow.output()) + for emitter in emitters: + await emitter.emit(workflow.name, output) + return output + + dataset = await _run_post_process_steps( + input_post_process_steps, dataset, context, callbacks + ) + + # Make sure the incoming data is valid + _validate_dataset(dataset) + + log.info("Final # of rows loaded: %s", len(dataset)) + stats.num_documents = len(dataset) + last_workflow = "input" + + try: + await dump_stats() + + for workflow_to_run in workflows_to_run: + # Try to flush out any intermediate dataframes + gc.collect() + + workflow = workflow_to_run.workflow + workflow_name: str = workflow.name + last_workflow = workflow_name + + log.info("Running workflow: %s...", workflow_name) + + if is_resume_run and await storage.has( + f"{workflow_to_run.workflow.name}.parquet" + ): + log.info("Skipping %s because it already exists", workflow_name) + continue + + stats.workflows[workflow_name] = {"overall": 0.0} + await inject_workflow_data_dependencies(workflow) + + workflow_start_time = time.time() + result = await workflow.run(context, callbacks) + await write_workflow_stats(workflow, result, workflow_start_time) + + # Save the output from the workflow + output = await emit_workflow_output(workflow) + yield PipelineRunResult(workflow_name, output, None) + output = None + workflow.dispose() + workflow = None + + stats.total_runtime = time.time() - start_time + await dump_stats() + except Exception as e: + log.exception("error running workflow %s", last_workflow) + cast(WorkflowCallbacks, callbacks).on_error( + "Error running pipeline!", e, traceback.format_exc() + ) + yield PipelineRunResult(last_workflow, None, [e]) + + +def _create_callback_chain( + callbacks: WorkflowCallbacks | None, progress: ProgressReporter | None +) -> WorkflowCallbacks: + """Create a callbacks manager.""" + manager = WorkflowCallbacksManager() + if callbacks is not None: + manager.register(callbacks) + if progress is not None: + manager.register(ProgressWorkflowCallbacks(progress)) + return manager + + +async def _save_profiler_stats( + storage: PipelineStorage, workflow_name: str, profile: MemoryProfile +): + """Save the profiler stats to the storage.""" + await storage.set( + f"{workflow_name}_profiling.peak_stats.csv", + profile.peak_stats.to_csv(index=True), + ) + + await storage.set( + f"{workflow_name}_profiling.snapshot_stats.csv", + profile.snapshot_stats.to_csv(index=True), + ) + + await storage.set( + f"{workflow_name}_profiling.time_stats.csv", + profile.time_stats.to_csv(index=True), + ) + + await storage.set( + f"{workflow_name}_profiling.detailed_view.csv", + profile.detailed_view.to_csv(index=True), + ) + + +async def _run_post_process_steps( + post_process: list[PipelineWorkflowStep] | None, + dataset: pd.DataFrame, + context: PipelineRunContext, + callbacks: WorkflowCallbacks, +) -> pd.DataFrame: + """Run the pipeline. + + Args: + - post_process - The post process steps to run + - dataset - The dataset to run the steps on + - context - The pipeline run context + Returns: + - output - The dataset after running the post process steps + """ + if post_process is not None and len(post_process) > 0: + input_workflow = create_workflow( + "Input Post Process", + post_process, + ) + input_workflow.add_table(DEFAULT_INPUT_NAME, dataset) + await input_workflow.run( + context=context, + callbacks=callbacks, + ) + dataset = cast(pd.DataFrame, input_workflow.output()) + return dataset + + +def _validate_dataset(dataset: pd.DataFrame): + """Validate the dataset for the pipeline. + + Args: + - dataset - The dataset to validate + """ + if not isinstance(dataset, pd.DataFrame): + msg = "Dataset must be a pandas dataframe!" + raise TypeError(msg) + + +def _apply_substitutions(config: PipelineConfig, run_id: str) -> PipelineConfig: + substitutions = {"timestamp": run_id} + + if ( + isinstance( + config.storage, PipelineFileStorageConfig | PipelineBlobStorageConfig + ) + and config.storage.base_dir + ): + config.storage.base_dir = Template(config.storage.base_dir).substitute( + substitutions + ) + if ( + isinstance(config.cache, PipelineFileCacheConfig | PipelineBlobCacheConfig) + and config.cache.base_dir + ): + config.cache.base_dir = Template(config.cache.base_dir).substitute( + substitutions + ) + + if ( + isinstance( + config.reporting, PipelineFileReportingConfig | PipelineBlobReportingConfig + ) + and config.reporting.base_dir + ): + config.reporting.base_dir = Template(config.reporting.base_dir).substitute( + substitutions + ) + + return config + + +def _create_run_context( + storage: PipelineStorage, + cache: PipelineCache, + stats: PipelineRunStats, +) -> PipelineRunContext: + """Create the run context for the pipeline.""" + return PipelineRunContext( + stats=stats, + cache=cache, + storage=storage, + ) diff --git a/graphrag/index/storage/__init__.py b/graphrag/index/storage/__init__.py new file mode 100644 index 00000000..7ca943db --- /dev/null +++ b/graphrag/index/storage/__init__.py @@ -0,0 +1,19 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine storage package root.""" + +from .blob_pipeline_storage import BlobPipelineStorage, create_blob_storage +from .file_pipeline_storage import FilePipelineStorage +from .load_storage import load_storage +from .memory_pipeline_storage import MemoryPipelineStorage +from .typing import PipelineStorage + +__all__ = [ + "BlobPipelineStorage", + "FilePipelineStorage", + "MemoryPipelineStorage", + "PipelineStorage", + "create_blob_storage", + "load_storage", +] diff --git a/graphrag/index/storage/blob_pipeline_storage.py b/graphrag/index/storage/blob_pipeline_storage.py new file mode 100644 index 00000000..7e60df96 --- /dev/null +++ b/graphrag/index/storage/blob_pipeline_storage.py @@ -0,0 +1,371 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Azure Blob Storage implementation of PipelineStorage.""" + +import logging +import re +from collections.abc import Iterator +from pathlib import Path +from typing import Any + +from azure.identity import DefaultAzureCredential +from azure.storage.blob import BlobServiceClient +from datashaper import Progress + +from graphrag.index.progress import ProgressReporter + +from .typing import PipelineStorage + +log = logging.getLogger(__name__) + + +class BlobPipelineStorage(PipelineStorage): + """The Blob-Storage implementation.""" + + _connection_string: str | None + _container_name: str + _path_prefix: str + _encoding: str + _storage_account_blob_url: str | None + + def __init__( + self, + connection_string: str | None, + container_name: str, + encoding: str | None = None, + path_prefix: str | None = None, + storage_account_blob_url: str | None = None, + ): + """Create a new BlobStorage instance.""" + if connection_string: + self._blob_service_client = BlobServiceClient.from_connection_string( + connection_string + ) + else: + if storage_account_blob_url is None: + msg = "Either connection_string or storage_account_blob_url must be provided." + raise ValueError(msg) + + self._blob_service_client = BlobServiceClient( + account_url=storage_account_blob_url, + credential=DefaultAzureCredential(), + ) + self._encoding = encoding or "utf-8" + self._container_name = container_name + self._connection_string = connection_string + self._path_prefix = path_prefix or "" + self._storage_account_blob_url = storage_account_blob_url + self._storage_account_name = ( + storage_account_blob_url.split("//")[1].split(".")[0] + if storage_account_blob_url + else None + ) + log.info( + "creating blob storage at container=%s, path=%s", + self._container_name, + self._path_prefix, + ) + self.create_container() + + def create_container(self) -> None: + """Create the container if it does not exist.""" + if not self.container_exists(): + container_name = self._container_name + container_names = [ + container.name + for container in self._blob_service_client.list_containers() + ] + if container_name not in container_names: + self._blob_service_client.create_container(container_name) + + def delete_container(self) -> None: + """Delete the container.""" + if self.container_exists(): + self._blob_service_client.delete_container(self._container_name) + + def container_exists(self) -> bool: + """Check if the container exists.""" + container_name = self._container_name + container_names = [ + container.name for container in self._blob_service_client.list_containers() + ] + return container_name in container_names + + def find( + self, + file_pattern: re.Pattern[str], + base_dir: str | None = None, + progress: ProgressReporter | None = None, + file_filter: dict[str, Any] | None = None, + max_count=-1, + ) -> Iterator[tuple[str, dict[str, Any]]]: + """Find blobs in a container using a file pattern, as well as a custom filter function. + + Params: + base_dir: The name of the base container. + file_pattern: The file pattern to use. + file_filter: A dictionary of key-value pairs to filter the blobs. + max_count: The maximum number of blobs to return. If -1, all blobs are returned. + + Returns + ------- + An iterator of blob names and their corresponding regex matches. + """ + base_dir = base_dir or "" + + log.info( + "search container %s for files matching %s", + self._container_name, + file_pattern.pattern, + ) + + def blobname(blob_name: str) -> str: + if blob_name.startswith(self._path_prefix): + blob_name = blob_name.replace(self._path_prefix, "", 1) + if blob_name.startswith("/"): + blob_name = blob_name[1:] + return blob_name + + def item_filter(item: dict[str, Any]) -> bool: + if file_filter is None: + return True + + return all(re.match(value, item[key]) for key, value in file_filter.items()) + + try: + container_client = self._blob_service_client.get_container_client( + self._container_name + ) + all_blobs = list(container_client.list_blobs()) + + num_loaded = 0 + num_total = len(list(all_blobs)) + num_filtered = 0 + for blob in all_blobs: + match = file_pattern.match(blob.name) + if match and blob.name.startswith(base_dir): + group = match.groupdict() + if item_filter(group): + yield (blobname(blob.name), group) + num_loaded += 1 + if max_count > 0 and num_loaded >= max_count: + break + else: + num_filtered += 1 + else: + num_filtered += 1 + if progress is not None: + progress( + _create_progress_status(num_loaded, num_filtered, num_total) + ) + except Exception: + log.exception( + "Error finding blobs: base_dir=%s, file_pattern=%s, file_filter=%s", + base_dir, + file_pattern, + file_filter, + ) + raise + + async def get( + self, key: str, as_bytes: bool | None = False, encoding: str | None = None + ) -> Any: + """Get a value from the cache.""" + try: + key = self._keyname(key) + container_client = self._blob_service_client.get_container_client( + self._container_name + ) + blob_client = container_client.get_blob_client(key) + blob_data = blob_client.download_blob().readall() + if not as_bytes: + coding = encoding or "utf-8" + blob_data = blob_data.decode(coding) + except Exception: + log.exception("Error getting key %s", key) + return None + else: + return blob_data + + async def set(self, key: str, value: Any, encoding: str | None = None) -> None: + """Set a value in the cache.""" + try: + key = self._keyname(key) + container_client = self._blob_service_client.get_container_client( + self._container_name + ) + blob_client = container_client.get_blob_client(key) + if isinstance(value, bytes): + blob_client.upload_blob(value, overwrite=True) + else: + coding = encoding or "utf-8" + blob_client.upload_blob(value.encode(coding), overwrite=True) + except Exception: + log.exception("Error setting key %s: %s", key) + + def set_df_json(self, key: str, dataframe: Any) -> None: + """Set a json dataframe.""" + if self._connection_string is None and self._storage_account_name: + dataframe.to_json( + self._abfs_url(key), + storage_options={ + "account_name": self._storage_account_name, + "credential": DefaultAzureCredential(), + }, + orient="records", + lines=True, + force_ascii=False, + ) + else: + dataframe.to_json( + self._abfs_url(key), + storage_options={"connection_string": self._connection_string}, + orient="records", + lines=True, + force_ascii=False, + ) + + def set_df_parquet(self, key: str, dataframe: Any) -> None: + """Set a parquet dataframe.""" + if self._connection_string is None and self._storage_account_name: + dataframe.to_parquet( + self._abfs_url(key), + storage_options={ + "account_name": self._storage_account_name, + "credential": DefaultAzureCredential(), + }, + ) + else: + dataframe.to_parquet( + self._abfs_url(key), + storage_options={"connection_string": self._connection_string}, + ) + + async def has(self, key: str) -> bool: + """Check if a key exists in the cache.""" + key = self._keyname(key) + container_client = self._blob_service_client.get_container_client( + self._container_name + ) + blob_client = container_client.get_blob_client(key) + return blob_client.exists() + + async def delete(self, key: str) -> None: + """Delete a key from the cache.""" + key = self._keyname(key) + container_client = self._blob_service_client.get_container_client( + self._container_name + ) + blob_client = container_client.get_blob_client(key) + blob_client.delete_blob() + + async def clear(self) -> None: + """Clear the cache.""" + + def child(self, name: str | None) -> "PipelineStorage": + """Create a child storage instance.""" + if name is None: + return self + path = str(Path(self._path_prefix) / name) + return BlobPipelineStorage( + self._connection_string, + self._container_name, + self._encoding, + path, + self._storage_account_blob_url, + ) + + def _keyname(self, key: str) -> str: + """Get the key name.""" + return str(Path(self._path_prefix) / key) + + def _abfs_url(self, key: str) -> str: + """Get the ABFS URL.""" + path = str(Path(self._container_name) / self._path_prefix / key) + return f"abfs://{path}" + + +def create_blob_storage( + connection_string: str | None, + storage_account_blob_url: str | None, + container_name: str, + base_dir: str | None, +) -> PipelineStorage: + """Create a blob based storage.""" + log.info("Creating blob storage at %s", container_name) + if container_name is None: + msg = "No container name provided for blob storage." + raise ValueError(msg) + if connection_string is None and storage_account_blob_url is None: + msg = "No storage account blob url provided for blob storage." + raise ValueError(msg) + return BlobPipelineStorage( + connection_string, + container_name, + path_prefix=base_dir, + storage_account_blob_url=storage_account_blob_url, + ) + + +def validate_blob_container_name(container_name: str): + """ + Check if the provided blob container name is valid based on Azure rules. + + - A blob container name must be between 3 and 63 characters in length. + - Start with a letter or number + - All letters used in blob container names must be lowercase. + - Contain only letters, numbers, or the hyphen. + - Consecutive hyphens are not permitted. + - Cannot end with a hyphen. + + Args: + ----- + container_name (str) + The blob container name to be validated. + + Returns + ------- + bool: True if valid, False otherwise. + """ + # Check the length of the name + if len(container_name) < 3 or len(container_name) > 63: + return ValueError( + f"Container name must be between 3 and 63 characters in length. Name provided was {len(container_name)} characters long." + ) + + # Check if the name starts with a letter or number + if not container_name[0].isalnum(): + return ValueError( + f"Container name must start with a letter or number. Starting character was {container_name[0]}." + ) + + # Check for valid characters (letters, numbers, hyphen) and lowercase letters + if not re.match("^[a-z0-9-]+$", container_name): + return ValueError( + f"Container name must only contain:\n- lowercase letters\n- numbers\n- or hyphens\nName provided was {container_name}." + ) + + # Check for consecutive hyphens + if "--" in container_name: + return ValueError( + f"Container name cannot contain consecutive hyphens. Name provided was {container_name}." + ) + + # Check for hyphens at the end of the name + if container_name[-1] == "-": + return ValueError( + f"Container name cannot end with a hyphen. Name provided was {container_name}." + ) + + return True + + +def _create_progress_status( + num_loaded: int, num_filtered: int, num_total: int +) -> Progress: + return Progress( + total_items=num_total, + completed_items=num_loaded + num_filtered, + description=f"{num_loaded} files loaded ({num_filtered} filtered)", + ) diff --git a/graphrag/index/storage/file_pipeline_storage.py b/graphrag/index/storage/file_pipeline_storage.py new file mode 100644 index 00000000..3580e1e1 --- /dev/null +++ b/graphrag/index/storage/file_pipeline_storage.py @@ -0,0 +1,163 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'FileStorage' and 'FilePipelineStorage' models.""" + +import logging +import os +import re +import shutil +from collections.abc import Iterator +from pathlib import Path +from typing import Any, cast + +import aiofiles +from aiofiles.os import remove +from aiofiles.ospath import exists +from datashaper import Progress + +from graphrag.index.progress import ProgressReporter + +from .typing import PipelineStorage + +log = logging.getLogger(__name__) + + +class FilePipelineStorage(PipelineStorage): + """File storage class definition.""" + + _root_dir: str + _encoding: str + + def __init__(self, root_dir: str | None = None, encoding: str | None = None): + """Init method definition.""" + self._root_dir = root_dir or "" + self._encoding = encoding or "utf-8" + Path(self._root_dir).mkdir(parents=True, exist_ok=True) + + def find( + self, + file_pattern: re.Pattern[str], + base_dir: str | None = None, + progress: ProgressReporter | None = None, + file_filter: dict[str, Any] | None = None, + max_count=-1, + ) -> Iterator[tuple[str, dict[str, Any]]]: + """Find files in the storage using a file pattern, as well as a custom filter function.""" + + def item_filter(item: dict[str, Any]) -> bool: + if file_filter is None: + return True + + return all(re.match(value, item[key]) for key, value in file_filter.items()) + + search_path = Path(self._root_dir) / (base_dir or "") + log.info("search %s for files matching %s", search_path, file_pattern.pattern) + all_files = list(search_path.rglob("**/*")) + num_loaded = 0 + num_total = len(all_files) + num_filtered = 0 + for file in all_files: + match = file_pattern.match(f"{file}") + if match: + group = match.groupdict() + if item_filter(group): + filename = f"{file}".replace(self._root_dir, "") + if filename.startswith(os.sep): + filename = filename[1:] + yield (filename, group) + num_loaded += 1 + if max_count > 0 and num_loaded >= max_count: + break + else: + num_filtered += 1 + else: + num_filtered += 1 + if progress is not None: + progress(_create_progress_status(num_loaded, num_filtered, num_total)) + + async def get( + self, key: str, as_bytes: bool | None = False, encoding: str | None = None + ) -> Any: + """Get method definition.""" + file_path = join_path(self._root_dir, key) + + if await self.has(key): + return await self._read_file(file_path, as_bytes, encoding) + if await exists(key): + # Lookup for key, as it is pressumably a new file loaded from inputs + # and not yet written to storage + return await self._read_file(key, as_bytes, encoding) + + return None + + async def _read_file( + self, + path: str | Path, + as_bytes: bool | None = False, + encoding: str | None = None, + ) -> Any: + """Read the contents of a file.""" + read_type = "rb" if as_bytes else "r" + encoding = None if as_bytes else (encoding or self._encoding) + + async with aiofiles.open( + path, + cast(Any, read_type), + encoding=encoding, + ) as f: + return await f.read() + + async def set(self, key: str, value: Any, encoding: str | None = None) -> None: + """Set method definition.""" + is_bytes = isinstance(value, bytes) + write_type = "wb" if is_bytes else "w" + encoding = None if is_bytes else encoding or self._encoding + async with aiofiles.open( + join_path(self._root_dir, key), cast(Any, write_type), encoding=encoding + ) as f: + await f.write(value) + + async def has(self, key: str) -> bool: + """Has method definition.""" + return await exists(join_path(self._root_dir, key)) + + async def delete(self, key: str) -> None: + """Delete method definition.""" + if await self.has(key): + await remove(join_path(self._root_dir, key)) + + async def clear(self) -> None: + """Clear method definition.""" + for file in Path(self._root_dir).glob("*"): + if file.is_dir(): + shutil.rmtree(file) + else: + file.unlink() + + def child(self, name: str | None) -> "PipelineStorage": + """Create a child storage instance.""" + if name is None: + return self + return FilePipelineStorage(str(Path(self._root_dir) / Path(name))) + + +def join_path(file_path: str, file_name: str) -> Path: + """Join a path and a file. Independent of the OS.""" + return Path(file_path) / Path(file_name).parent / Path(file_name).name + + +def create_file_storage(out_dir: str | None) -> PipelineStorage: + """Create a file based storage.""" + log.info("Creating file storage at %s", out_dir) + return FilePipelineStorage(out_dir) + + +def _create_progress_status( + num_loaded: int, num_filtered: int, num_total: int +) -> Progress: + return Progress( + total_items=num_total, + completed_items=num_loaded + num_filtered, + description=f"{num_loaded} files loaded ({num_filtered} filtered)", + ) diff --git a/graphrag/index/storage/load_storage.py b/graphrag/index/storage/load_storage.py new file mode 100644 index 00000000..33d61ee9 --- /dev/null +++ b/graphrag/index/storage/load_storage.py @@ -0,0 +1,40 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing load_storage method definition.""" + +from __future__ import annotations + +from typing import cast + +from graphrag.config import StorageType +from graphrag.index.config.storage import ( + PipelineBlobStorageConfig, + PipelineFileStorageConfig, + PipelineStorageConfig, +) + +from .blob_pipeline_storage import create_blob_storage +from .file_pipeline_storage import create_file_storage +from .memory_pipeline_storage import create_memory_storage + + +def load_storage(config: PipelineStorageConfig): + """Load the storage for a pipeline.""" + match config.type: + case StorageType.memory: + return create_memory_storage() + case StorageType.blob: + config = cast(PipelineBlobStorageConfig, config) + return create_blob_storage( + config.connection_string, + config.storage_account_blob_url, + config.container_name, + config.base_dir, + ) + case StorageType.file: + config = cast(PipelineFileStorageConfig, config) + return create_file_storage(config.base_dir) + case _: + msg = f"Unknown storage type: {config.type}" + raise ValueError(msg) diff --git a/graphrag/index/storage/memory_pipeline_storage.py b/graphrag/index/storage/memory_pipeline_storage.py new file mode 100644 index 00000000..2d1382e0 --- /dev/null +++ b/graphrag/index/storage/memory_pipeline_storage.py @@ -0,0 +1,79 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'InMemoryStorage' model.""" + +from typing import Any + +from .file_pipeline_storage import FilePipelineStorage +from .typing import PipelineStorage + + +class MemoryPipelineStorage(FilePipelineStorage): + """In memory storage class definition.""" + + _storage: dict[str, Any] + + def __init__(self): + """Init method definition.""" + super().__init__(root_dir=".output") + self._storage = {} + + async def get( + self, key: str, as_bytes: bool | None = None, encoding: str | None = None + ) -> Any: + """Get the value for the given key. + + Args: + - key - The key to get the value for. + - as_bytes - Whether or not to return the value as bytes. + + Returns + ------- + - output - The value for the given key. + """ + return self._storage.get(key) or await super().get(key, as_bytes, encoding) + + async def set( + self, key: str, value: str | bytes | None, encoding: str | None = None + ) -> None: + """Set the value for the given key. + + Args: + - key - The key to set the value for. + - value - The value to set. + """ + self._storage[key] = value + + async def has(self, key: str) -> bool: + """Return True if the given key exists in the storage. + + Args: + - key - The key to check for. + + Returns + ------- + - output - True if the key exists in the storage, False otherwise. + """ + return key in self._storage or await super().has(key) + + async def delete(self, key: str) -> None: + """Delete the given key from the storage. + + Args: + - key - The key to delete. + """ + del self._storage[key] + + async def clear(self) -> None: + """Clear the storage.""" + self._storage.clear() + + def child(self, name: str | None) -> "PipelineStorage": + """Create a child storage instance.""" + return self + + +def create_memory_storage() -> PipelineStorage: + """Create memory storage.""" + return MemoryPipelineStorage() diff --git a/graphrag/index/storage/typing.py b/graphrag/index/storage/typing.py new file mode 100644 index 00000000..595baf4e --- /dev/null +++ b/graphrag/index/storage/typing.py @@ -0,0 +1,80 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'PipelineStorage' model.""" + +import re +from abc import ABCMeta, abstractmethod +from collections.abc import Iterator +from typing import Any + +from graphrag.index.progress import ProgressReporter + + +class PipelineStorage(metaclass=ABCMeta): + """Provide a storage interface for the pipeline. This is where the pipeline will store its output data.""" + + @abstractmethod + def find( + self, + file_pattern: re.Pattern[str], + base_dir: str | None = None, + progress: ProgressReporter | None = None, + file_filter: dict[str, Any] | None = None, + max_count=-1, + ) -> Iterator[tuple[str, dict[str, Any]]]: + """Find files in the storage using a file pattern, as well as a custom filter function.""" + + @abstractmethod + async def get( + self, key: str, as_bytes: bool | None = None, encoding: str | None = None + ) -> Any: + """Get the value for the given key. + + Args: + - key - The key to get the value for. + - as_bytes - Whether or not to return the value as bytes. + + Returns + ------- + - output - The value for the given key. + """ + + @abstractmethod + async def set( + self, key: str, value: str | bytes | None, encoding: str | None = None + ) -> None: + """Set the value for the given key. + + Args: + - key - The key to set the value for. + - value - The value to set. + """ + + @abstractmethod + async def has(self, key: str) -> bool: + """Return True if the given key exists in the storage. + + Args: + - key - The key to check for. + + Returns + ------- + - output - True if the key exists in the storage, False otherwise. + """ + + @abstractmethod + async def delete(self, key: str) -> None: + """Delete the given key from the storage. + + Args: + - key - The key to delete. + """ + + @abstractmethod + async def clear(self) -> None: + """Clear the storage.""" + + @abstractmethod + def child(self, name: str | None) -> "PipelineStorage": + """Create a child storage instance.""" diff --git a/graphrag/index/text_splitting/__init__.py b/graphrag/index/text_splitting/__init__.py new file mode 100644 index 00000000..4653adb2 --- /dev/null +++ b/graphrag/index/text_splitting/__init__.py @@ -0,0 +1,34 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine Text Splitting package root.""" + +from .check_token_limit import check_token_limit +from .text_splitting import ( + DecodeFn, + EncodedText, + EncodeFn, + LengthFn, + NoopTextSplitter, + TextListSplitter, + TextListSplitterType, + TextSplitter, + Tokenizer, + TokenTextSplitter, + split_text_on_tokens, +) + +__all__ = [ + "DecodeFn", + "EncodeFn", + "EncodedText", + "LengthFn", + "NoopTextSplitter", + "TextListSplitter", + "TextListSplitterType", + "TextSplitter", + "TokenTextSplitter", + "Tokenizer", + "check_token_limit", + "split_text_on_tokens", +] diff --git a/graphrag/index/text_splitting/check_token_limit.py b/graphrag/index/text_splitting/check_token_limit.py new file mode 100644 index 00000000..1a5f8622 --- /dev/null +++ b/graphrag/index/text_splitting/check_token_limit.py @@ -0,0 +1,15 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Token limit method definition.""" + +from .text_splitting import TokenTextSplitter + + +def check_token_limit(text, max_token): + """Check token limit.""" + text_splitter = TokenTextSplitter(chunk_size=max_token, chunk_overlap=0) + docs = text_splitter.split_text(text) + if len(docs) > 1: + return 0 + return 1 diff --git a/graphrag/index/text_splitting/text_splitting.py b/graphrag/index/text_splitting/text_splitting.py new file mode 100644 index 00000000..0badc897 --- /dev/null +++ b/graphrag/index/text_splitting/text_splitting.py @@ -0,0 +1,244 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing the 'Tokenizer', 'TextSplitter', 'NoopTextSplitter' and 'TokenTextSplitter' models.""" + +import json +import logging +from abc import ABC, abstractmethod +from collections.abc import Callable, Collection, Iterable +from dataclasses import dataclass +from enum import Enum +from typing import Any, Literal, cast + +import pandas as pd +import tiktoken + +from graphrag.index.utils import num_tokens_from_string + +EncodedText = list[int] +DecodeFn = Callable[[EncodedText], str] +EncodeFn = Callable[[str], EncodedText] +LengthFn = Callable[[str], int] + +log = logging.getLogger(__name__) + + +@dataclass(frozen=True) +class Tokenizer: + """Tokenizer data class.""" + + chunk_overlap: int + """Overlap in tokens between chunks""" + tokens_per_chunk: int + """Maximum number of tokens per chunk""" + decode: DecodeFn + """ Function to decode a list of token ids to a string""" + encode: EncodeFn + """ Function to encode a string to a list of token ids""" + + +class TextSplitter(ABC): + """Text splitter class definition.""" + + _chunk_size: int + _chunk_overlap: int + _length_function: LengthFn + _keep_separator: bool + _add_start_index: bool + _strip_whitespace: bool + + def __init__( + self, + # based on text-ada-002-embedding max input buffer length + # https://platform.openai.com/docs/guides/embeddings/second-generation-models + chunk_size: int = 8191, + chunk_overlap: int = 100, + length_function: LengthFn = len, + keep_separator: bool = False, + add_start_index: bool = False, + strip_whitespace: bool = True, + ): + """Init method definition.""" + self._chunk_size = chunk_size + self._chunk_overlap = chunk_overlap + self._length_function = length_function + self._keep_separator = keep_separator + self._add_start_index = add_start_index + self._strip_whitespace = strip_whitespace + + @abstractmethod + def split_text(self, text: str | list[str]) -> Iterable[str]: + """Split text method definition.""" + + +class NoopTextSplitter(TextSplitter): + """Noop text splitter class definition.""" + + def split_text(self, text: str | list[str]) -> Iterable[str]: + """Split text method definition.""" + return [text] if isinstance(text, str) else text + + +class TokenTextSplitter(TextSplitter): + """Token text splitter class definition.""" + + _allowed_special: Literal["all"] | set[str] + _disallowed_special: Literal["all"] | Collection[str] + + def __init__( + self, + encoding_name: str = "cl100k_base", + model_name: str | None = None, + allowed_special: Literal["all"] | set[str] | None = None, + disallowed_special: Literal["all"] | Collection[str] = "all", + **kwargs: Any, + ): + """Init method definition.""" + super().__init__(**kwargs) + if model_name is not None: + try: + enc = tiktoken.encoding_for_model(model_name) + except KeyError: + log.exception("Model %s not found, using %s", model_name, encoding_name) + enc = tiktoken.get_encoding(encoding_name) + else: + enc = tiktoken.get_encoding(encoding_name) + self._tokenizer = enc + self._allowed_special = allowed_special or set() + self._disallowed_special = disallowed_special + + def encode(self, text: str) -> list[int]: + """Encode the given text into an int-vector.""" + return self._tokenizer.encode( + text, + allowed_special=self._allowed_special, + disallowed_special=self._disallowed_special, + ) + + def num_tokens(self, text: str) -> int: + """Return the number of tokens in a string.""" + return len(self.encode(text)) + + def split_text(self, text: str | list[str]) -> list[str]: + """Split text method.""" + if cast(bool, pd.isna(text)) or text == "": + return [] + if isinstance(text, list): + text = " ".join(text) + if not isinstance(text, str): + msg = f"Attempting to split a non-string value, actual is {type(text)}" + raise TypeError(msg) + + tokenizer = Tokenizer( + chunk_overlap=self._chunk_overlap, + tokens_per_chunk=self._chunk_size, + decode=self._tokenizer.decode, + encode=lambda text: self.encode(text), + ) + + return split_text_on_tokens(text=text, tokenizer=tokenizer) + + +class TextListSplitterType(str, Enum): + """Enum for the type of the TextListSplitter.""" + + DELIMITED_STRING = "delimited_string" + JSON = "json" + + +class TextListSplitter(TextSplitter): + """Text list splitter class definition.""" + + def __init__( + self, + chunk_size: int, + splitter_type: TextListSplitterType = TextListSplitterType.JSON, + input_delimiter: str | None = None, + output_delimiter: str | None = None, + model_name: str | None = None, + encoding_name: str | None = None, + ): + """Initialize the TextListSplitter with a chunk size.""" + # Set the chunk overlap to 0 as we use full strings + super().__init__(chunk_size, chunk_overlap=0) + self._type = splitter_type + self._input_delimiter = input_delimiter + self._output_delimiter = output_delimiter or "\n" + self._length_function = lambda x: num_tokens_from_string( + x, model=model_name, encoding_name=encoding_name + ) + + def split_text(self, text: str | list[str]) -> Iterable[str]: + """Split a string list into a list of strings for a given chunk size.""" + if not text: + return [] + + result: list[str] = [] + current_chunk: list[str] = [] + + # Add the brackets + current_length: int = self._length_function("[]") + + # Input should be a string list joined by a delimiter + string_list = self._load_text_list(text) + + if len(string_list) == 1: + return string_list + + for item in string_list: + # Count the length of the item and add comma + item_length = self._length_function(f"{item},") + + if current_length + item_length > self._chunk_size: + if current_chunk and len(current_chunk) > 0: + # Add the current chunk to the result + self._append_to_result(result, current_chunk) + + # Start a new chunk + current_chunk = [item] + # Add 2 for the brackets + current_length = item_length + else: + # Add the item to the current chunk + current_chunk.append(item) + # Add 1 for the comma + current_length += item_length + + # Add the last chunk to the result + self._append_to_result(result, current_chunk) + + return result + + def _load_text_list(self, text: str | list[str]): + """Load the text list based on the type.""" + if isinstance(text, list): + string_list = text + elif self._type == TextListSplitterType.JSON: + string_list = json.loads(text) + else: + string_list = text.split(self._input_delimiter) + return string_list + + def _append_to_result(self, chunk_list: list[str], new_chunk: list[str]): + """Append the current chunk to the result.""" + if new_chunk and len(new_chunk) > 0: + if self._type == TextListSplitterType.JSON: + chunk_list.append(json.dumps(new_chunk)) + else: + chunk_list.append(self._output_delimiter.join(new_chunk)) + + +def split_text_on_tokens(*, text: str, tokenizer: Tokenizer) -> list[str]: + """Split incoming text and return chunks using tokenizer.""" + splits: list[str] = [] + input_ids = tokenizer.encode(text) + start_idx = 0 + cur_idx = min(start_idx + tokenizer.tokens_per_chunk, len(input_ids)) + chunk_ids = input_ids[start_idx:cur_idx] + while start_idx < len(input_ids): + splits.append(tokenizer.decode(chunk_ids)) + start_idx += tokenizer.tokens_per_chunk - tokenizer.chunk_overlap + cur_idx = min(start_idx + tokenizer.tokens_per_chunk, len(input_ids)) + chunk_ids = input_ids[start_idx:cur_idx] + return splits diff --git a/graphrag/index/typing.py b/graphrag/index/typing.py new file mode 100644 index 00000000..ed1d7e93 --- /dev/null +++ b/graphrag/index/typing.py @@ -0,0 +1,20 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing the 'PipelineRunResult' model.""" + +from collections.abc import Callable +from dataclasses import dataclass + +import pandas as pd + +ErrorHandlerFn = Callable[[BaseException | None, str | None, dict | None], None] + + +@dataclass +class PipelineRunResult: + """Pipeline run result class definition.""" + + workflow: str + result: pd.DataFrame | None + errors: list[BaseException] | None diff --git a/graphrag/index/utils/__init__.py b/graphrag/index/utils/__init__.py new file mode 100644 index 00000000..3a8b1c00 --- /dev/null +++ b/graphrag/index/utils/__init__.py @@ -0,0 +1,27 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Utils methods definition.""" + +from .dicts import dict_has_keys_with_types +from .hashing import gen_md5_hash +from .is_null import is_null +from .json import clean_up_json +from .load_graph import load_graph +from .string import clean_str +from .tokens import num_tokens_from_string, string_from_tokens +from .topological_sort import topological_sort +from .uuid import gen_uuid + +__all__ = [ + "clean_str", + "clean_up_json", + "dict_has_keys_with_types", + "gen_md5_hash", + "gen_uuid", + "is_null", + "load_graph", + "num_tokens_from_string", + "string_from_tokens", + "topological_sort", +] diff --git a/graphrag/index/utils/dataframes.py b/graphrag/index/utils/dataframes.py new file mode 100644 index 00000000..ea65d71d --- /dev/null +++ b/graphrag/index/utils/dataframes.py @@ -0,0 +1,61 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing DataFrame utilities.""" + +from collections.abc import Callable +from typing import Any, cast + +import pandas as pd +from pandas._typing import MergeHow + + +def drop_columns(df: pd.DataFrame, *column: str) -> pd.DataFrame: + """Drop columns from a dataframe.""" + return df.drop(list(column), axis=1) + + +def where_column_equals(df: pd.DataFrame, column: str, value: Any) -> pd.DataFrame: + """Return a filtered DataFrame where a column equals a value.""" + return cast(pd.DataFrame, df[df[column] == value]) + + +def antijoin(df: pd.DataFrame, exclude: pd.DataFrame, column: str) -> pd.DataFrame: + """Return an anti-joined dataframe. + + Arguments: + * df: The DataFrame to apply the exclusion to + * exclude: The DataFrame containing rows to remove. + * column: The join-on column. + """ + result = df.merge( + exclude[[column]], + on=column, + how="outer", + indicator=True, + ) + if "_merge" in result.columns: + result = result[result["_merge"] == "left_only"].drop("_merge", axis=1) + return cast(pd.DataFrame, result) + + +def transform_series(series: pd.Series, fn: Callable[[Any], Any]) -> pd.Series: + """Apply a transformation function to a series.""" + return cast(pd.Series, series.apply(fn)) + + +def join( + left: pd.DataFrame, right: pd.DataFrame, key: str, strategy: MergeHow = "left" +) -> pd.DataFrame: + """Perform a table join.""" + return left.merge(right, on=key, how=strategy) + + +def union(*frames: pd.DataFrame) -> pd.DataFrame: + """Perform a union operation on the given set of dataframes.""" + return pd.concat(list(frames)) + + +def select(df: pd.DataFrame, *columns: str) -> pd.DataFrame: + """Select columns from a dataframe.""" + return cast(pd.DataFrame, df[list(columns)]) diff --git a/graphrag/index/utils/dicts.py b/graphrag/index/utils/dicts.py new file mode 100644 index 00000000..4d3662e0 --- /dev/null +++ b/graphrag/index/utils/dicts.py @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A utility module containing methods for inspecting and verifying dictionary types.""" + + +def dict_has_keys_with_types( + data: dict, expected_fields: list[tuple[str, type]] +) -> bool: + """Return True if the given dictionary has the given keys with the given types.""" + for field, field_type in expected_fields: + if field not in data: + return False + + value = data[field] + if not isinstance(value, field_type): + return False + return True diff --git a/graphrag/index/utils/ds_util.py b/graphrag/index/utils/ds_util.py new file mode 100644 index 00000000..d65c69e4 --- /dev/null +++ b/graphrag/index/utils/ds_util.py @@ -0,0 +1,32 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A utility module datashaper-specific utility methods.""" + +from typing import cast + +from datashaper import TableContainer, VerbInput + +_NAMED_INPUTS_REQUIRED = "Named inputs are required" + + +def get_required_input_table(input: VerbInput, name: str) -> TableContainer: + """Get a required input table by name.""" + return cast(TableContainer, get_named_input_table(input, name, required=True)) + + +def get_named_input_table( + input: VerbInput, name: str, required: bool = False +) -> TableContainer | None: + """Get an input table from datashaper verb-inputs by name.""" + named_inputs = input.named + if named_inputs is None: + if not required: + return None + raise ValueError(_NAMED_INPUTS_REQUIRED) + + result = named_inputs.get(name) + if result is None and required: + msg = f"input '${name}' is required" + raise ValueError(msg) + return result diff --git a/graphrag/index/utils/hashing.py b/graphrag/index/utils/hashing.py new file mode 100644 index 00000000..342ae99d --- /dev/null +++ b/graphrag/index/utils/hashing.py @@ -0,0 +1,14 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Hashing utilities.""" + +from collections.abc import Iterable +from hashlib import md5 +from typing import Any + + +def gen_md5_hash(item: dict[str, Any], hashcode: Iterable[str]): + """Generate an md5 hash.""" + hashed = "".join([str(item[column]) for column in hashcode]) + return f"{md5(hashed.encode('utf-8'), usedforsecurity=False).hexdigest()}" diff --git a/graphrag/index/utils/is_null.py b/graphrag/index/utils/is_null.py new file mode 100644 index 00000000..f5df1955 --- /dev/null +++ b/graphrag/index/utils/is_null.py @@ -0,0 +1,19 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Defines the is_null utility.""" + +import math +from typing import Any + + +def is_null(value: Any) -> bool: + """Check if value is null or is nan.""" + + def is_none() -> bool: + return value is None + + def is_nan() -> bool: + return isinstance(value, float) and math.isnan(value) + + return is_none() or is_nan() diff --git a/graphrag/index/utils/json.py b/graphrag/index/utils/json.py new file mode 100644 index 00000000..11d5b020 --- /dev/null +++ b/graphrag/index/utils/json.py @@ -0,0 +1,25 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""JSON cleaning and formatting utilities.""" + + +def clean_up_json(json_str: str): + """Clean up json string.""" + json_str = ( + json_str.replace("\\n", "") + .replace("\n", "") + .replace("\r", "") + .replace('"[{', "[{") + .replace('}]"', "}]") + .replace("\\", "") + .strip() + ) + + # Remove JSON Markdown Frame + if json_str.startswith("```json"): + json_str = json_str[len("```json") :] + if json_str.endswith("```"): + json_str = json_str[: len(json_str) - len("```")] + + return json_str diff --git a/graphrag/index/utils/load_graph.py b/graphrag/index/utils/load_graph.py new file mode 100644 index 00000000..57992a04 --- /dev/null +++ b/graphrag/index/utils/load_graph.py @@ -0,0 +1,11 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Networkx load_graph utility definition.""" + +import networkx as nx + + +def load_graph(graphml: str | nx.Graph) -> nx.Graph: + """Load a graph from a graphml file or a networkx graph.""" + return nx.parse_graphml(graphml) if isinstance(graphml, str) else graphml diff --git a/graphrag/index/utils/string.py b/graphrag/index/utils/string.py new file mode 100644 index 00000000..7e1654bb --- /dev/null +++ b/graphrag/index/utils/string.py @@ -0,0 +1,19 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""String utilities.""" + +import html +import re +from typing import Any + + +def clean_str(input: Any) -> str: + """Clean an input string by removing HTML escapes, control characters, and other unwanted characters.""" + # If we get non-string input, just give it back + if not isinstance(input, str): + return input + + result = html.unescape(input.strip()) + # https://stackoverflow.com/questions/4324790/removing-control-characters-from-a-string-in-python + return re.sub(r"[\x00-\x1f\x7f-\x9f]", "", result) diff --git a/graphrag/index/utils/tokens.py b/graphrag/index/utils/tokens.py new file mode 100644 index 00000000..e308c81f --- /dev/null +++ b/graphrag/index/utils/tokens.py @@ -0,0 +1,33 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Utilities for working with tokens.""" + +import tiktoken + +DEFAULT_ENCODING_NAME = "cl100k_base" + + +def num_tokens_from_string( + string: str, model: str | None = None, encoding_name: str | None = None +) -> int: + """Return the number of tokens in a text string.""" + if model is not None: + encoding = tiktoken.encoding_for_model(model) + else: + encoding = tiktoken.get_encoding(encoding_name or DEFAULT_ENCODING_NAME) + return len(encoding.encode(string)) + + +def string_from_tokens( + tokens: list[int], model: str | None = None, encoding_name: str | None = None +) -> str: + """Return a text string from a list of tokens.""" + if model is not None: + encoding = tiktoken.encoding_for_model(model) + elif encoding_name is not None: + encoding = tiktoken.get_encoding(encoding_name) + else: + msg = "Either model or encoding_name must be specified." + raise ValueError(msg) + return encoding.decode(tokens) diff --git a/graphrag/index/utils/topological_sort.py b/graphrag/index/utils/topological_sort.py new file mode 100644 index 00000000..a19b4645 --- /dev/null +++ b/graphrag/index/utils/topological_sort.py @@ -0,0 +1,12 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Topological sort utility method.""" + +from graphlib import TopologicalSorter + + +def topological_sort(graph: dict[str, list[str]]) -> list[str]: + """Topological sort.""" + ts = TopologicalSorter(graph) + return list(ts.static_order()) diff --git a/graphrag/index/utils/uuid.py b/graphrag/index/utils/uuid.py new file mode 100644 index 00000000..0671fb09 --- /dev/null +++ b/graphrag/index/utils/uuid.py @@ -0,0 +1,14 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""UUID utilities.""" + +import uuid +from random import Random, getrandbits + + +def gen_uuid(rd: Random | None = None): + """Generate a random UUID v4.""" + return uuid.UUID( + int=rd.getrandbits(128) if rd is not None else getrandbits(128), version=4 + ).hex diff --git a/graphrag/index/verbs/__init__.py b/graphrag/index/verbs/__init__.py new file mode 100644 index 00000000..379c2a37 --- /dev/null +++ b/graphrag/index/verbs/__init__.py @@ -0,0 +1,50 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing get_default_verbs method definition.""" + +from .covariates import extract_covariates +from .entities import entity_extract, summarize_descriptions +from .genid import genid +from .graph import ( + cluster_graph, + create_community_reports, + create_graph, + embed_graph, + layout_graph, + merge_graphs, + unpack_graph, +) +from .overrides import aggregate, concat, merge +from .snapshot import snapshot +from .snapshot_rows import snapshot_rows +from .spread_json import spread_json +from .text import chunk, text_embed, text_split, text_translate +from .unzip import unzip +from .zip import zip_verb + +__all__ = [ + "aggregate", + "chunk", + "cluster_graph", + "concat", + "create_community_reports", + "create_graph", + "embed_graph", + "entity_extract", + "extract_covariates", + "genid", + "layout_graph", + "merge", + "merge_graphs", + "snapshot", + "snapshot_rows", + "spread_json", + "summarize_descriptions", + "text_embed", + "text_split", + "text_translate", + "unpack_graph", + "unzip", + "zip_verb", +] diff --git a/graphrag/index/verbs/covariates/__init__.py b/graphrag/index/verbs/covariates/__init__.py new file mode 100644 index 00000000..cdebee22 --- /dev/null +++ b/graphrag/index/verbs/covariates/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine covariates package root.""" + +from .extract_covariates import extract_covariates + +__all__ = ["extract_covariates"] diff --git a/graphrag/index/verbs/covariates/extract_covariates/__init__.py b/graphrag/index/verbs/covariates/extract_covariates/__init__.py new file mode 100644 index 00000000..53d357bb --- /dev/null +++ b/graphrag/index/verbs/covariates/extract_covariates/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine text extract claims package root.""" + +from .extract_covariates import ExtractClaimsStrategyType, extract_covariates + +__all__ = ["ExtractClaimsStrategyType", "extract_covariates"] diff --git a/graphrag/index/verbs/covariates/extract_covariates/extract_covariates.py b/graphrag/index/verbs/covariates/extract_covariates/extract_covariates.py new file mode 100644 index 00000000..a67cb0fa --- /dev/null +++ b/graphrag/index/verbs/covariates/extract_covariates/extract_covariates.py @@ -0,0 +1,110 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing the extract_covariates verb definition.""" + +import logging +from dataclasses import asdict +from enum import Enum +from typing import Any, cast + +import pandas as pd +from datashaper import ( + AsyncType, + TableContainer, + VerbCallbacks, + VerbInput, + derive_from_rows, + verb, +) + +from graphrag.index.cache import PipelineCache +from graphrag.index.verbs.covariates.typing import Covariate, CovariateExtractStrategy + +log = logging.getLogger(__name__) + + +class ExtractClaimsStrategyType(str, Enum): + """ExtractClaimsStrategyType class definition.""" + + graph_intelligence = "graph_intelligence" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' + + +DEFAULT_ENTITY_TYPES = ["organization", "person", "geo", "event"] + + +@verb(name="extract_covariates") +async def extract_covariates( + input: VerbInput, + cache: PipelineCache, + callbacks: VerbCallbacks, + column: str, + covariate_type: str, + strategy: dict[str, Any] | None, + async_mode: AsyncType = AsyncType.AsyncIO, + entity_types: list[str] | None = None, + **kwargs, +) -> TableContainer: + """ + Extract claims from a piece of text. + + ## Usage + TODO + """ + log.debug("extract_covariates strategy=%s", strategy) + if entity_types is None: + entity_types = DEFAULT_ENTITY_TYPES + output = cast(pd.DataFrame, input.get_input()) + + resolved_entities_map = {} + + strategy = strategy or {} + strategy_exec = load_strategy( + strategy.get("type", ExtractClaimsStrategyType.graph_intelligence) + ) + strategy_config = {**strategy} + + async def run_strategy(row): + text = row[column] + result = await strategy_exec( + text, entity_types, resolved_entities_map, callbacks, cache, strategy_config + ) + return [ + create_row_from_claim_data(row, item, covariate_type) + for item in result.covariate_data + ] + + results = await derive_from_rows( + output, + run_strategy, + callbacks, + scheduling_type=async_mode, + num_threads=kwargs.get("num_threads", 4), + ) + output = pd.DataFrame([item for row in results for item in row or []]) + return TableContainer(table=output) + + +def load_strategy(strategy_type: ExtractClaimsStrategyType) -> CovariateExtractStrategy: + """Load strategy method definition.""" + match strategy_type: + case ExtractClaimsStrategyType.graph_intelligence: + from .strategies.graph_intelligence import run as run_gi + + return run_gi + case _: + msg = f"Unknown strategy: {strategy_type}" + raise ValueError(msg) + + +def create_row_from_claim_data(row, covariate_data: Covariate, covariate_type: str): + """Create a row from the claim data and the input row.""" + item = {**row, **asdict(covariate_data), "covariate_type": covariate_type} + # TODO: doc_id from extraction isn't necessary + # since chunking happens before this + del item["doc_id"] + return item diff --git a/graphrag/index/verbs/covariates/extract_covariates/strategies/__init__.py b/graphrag/index/verbs/covariates/extract_covariates/strategies/__init__.py new file mode 100644 index 00000000..605c66f8 --- /dev/null +++ b/graphrag/index/verbs/covariates/extract_covariates/strategies/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine text extract claims strategies package root.""" diff --git a/graphrag/index/verbs/covariates/extract_covariates/strategies/graph_intelligence/__init__.py b/graphrag/index/verbs/covariates/extract_covariates/strategies/graph_intelligence/__init__.py new file mode 100644 index 00000000..ab01f06f --- /dev/null +++ b/graphrag/index/verbs/covariates/extract_covariates/strategies/graph_intelligence/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine text extract claims strategies graph intelligence package root.""" + +from .run_gi_extract_claims import run + +__all__ = ["run"] diff --git a/graphrag/index/verbs/covariates/extract_covariates/strategies/graph_intelligence/defaults.py b/graphrag/index/verbs/covariates/extract_covariates/strategies/graph_intelligence/defaults.py new file mode 100644 index 00000000..846bfa81 --- /dev/null +++ b/graphrag/index/verbs/covariates/extract_covariates/strategies/graph_intelligence/defaults.py @@ -0,0 +1,21 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A file containing MOCK_LLM_RESPONSES definition.""" + +MOCK_LLM_RESPONSES = [ + """ +[ + { + "subject": "COMPANY A", + "object": "GOVERNMENT AGENCY B", + "type": "ANTI-COMPETITIVE PRACTICES", + "status": "TRUE", + "start_date": "2022-01-10T00:00:00", + "end_date": "2022-01-10T00:00:00", + "description": "Company A was found to engage in anti-competitive practices because it was fined for bid rigging in multiple public tenders published by Government Agency B according to an article published on 2022/01/10", + "source_text": ["According to an article published on 2022/01/10, Company A was fined for bid rigging while participating in multiple public tenders published by Government Agency B."] + } +] + """.strip() +] diff --git a/graphrag/index/verbs/covariates/extract_covariates/strategies/graph_intelligence/run_gi_extract_claims.py b/graphrag/index/verbs/covariates/extract_covariates/strategies/graph_intelligence/run_gi_extract_claims.py new file mode 100644 index 00000000..f047c44a --- /dev/null +++ b/graphrag/index/verbs/covariates/extract_covariates/strategies/graph_intelligence/run_gi_extract_claims.py @@ -0,0 +1,105 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing run and _run_chain methods definitions.""" + +from collections.abc import Iterable +from typing import Any + +from datashaper import VerbCallbacks + +from graphrag.config.enums import LLMType +from graphrag.index.cache import PipelineCache +from graphrag.index.graph.extractors.claims import ClaimExtractor +from graphrag.index.llm import load_llm +from graphrag.index.verbs.covariates.typing import ( + Covariate, + CovariateExtractionResult, +) +from graphrag.llm import CompletionLLM + +from .defaults import MOCK_LLM_RESPONSES + + +async def run( + input: str | Iterable[str], + entity_types: list[str], + resolved_entities_map: dict[str, str], + reporter: VerbCallbacks, + pipeline_cache: PipelineCache, + strategy_config: dict[str, Any], +) -> CovariateExtractionResult: + """Run the Claim extraction chain.""" + llm_config = strategy_config.get( + "llm", {"type": LLMType.StaticResponse, "responses": MOCK_LLM_RESPONSES} + ) + llm_type = llm_config.get("type", LLMType.StaticResponse) + llm = load_llm("claim_extraction", llm_type, reporter, pipeline_cache, llm_config) + return await _execute( + llm, input, entity_types, resolved_entities_map, reporter, strategy_config + ) + + +async def _execute( + llm: CompletionLLM, + texts: Iterable[str], + entity_types: list[str], + resolved_entities_map: dict[str, str], + reporter: VerbCallbacks, + strategy_config: dict[str, Any], +) -> CovariateExtractionResult: + extraction_prompt = strategy_config.get("extraction_prompt") + max_gleanings = strategy_config.get("max_gleanings", 0) + tuple_delimiter = strategy_config.get("tuple_delimiter") + record_delimiter = strategy_config.get("record_delimiter") + completion_delimiter = strategy_config.get("completion_delimiter") + encoding_model = strategy_config.get("encoding_name") + + extractor = ClaimExtractor( + llm_invoker=llm, + extraction_prompt=extraction_prompt, + max_gleanings=max_gleanings, + encoding_model=encoding_model, + on_error=lambda e, s, d: reporter.error("Claim Extraction Error", e, s, d) + if reporter + else None, + ) + + claim_description = strategy_config.get("claim_description") + if claim_description is None: + msg = "claim_description is required for claim extraction" + raise ValueError(msg) + + texts = [texts] if isinstance(texts, str) else texts + + results = await extractor({ + "input_text": texts, + "entity_specs": entity_types, + "resolved_entities": resolved_entities_map, + "claim_description": claim_description, + "tuple_delimiter": tuple_delimiter, + "record_delimiter": record_delimiter, + "completion_delimiter": completion_delimiter, + }) + + claim_data = results.output + return CovariateExtractionResult([create_covariate(item) for item in claim_data]) + + +def create_covariate(item: dict[str, Any]) -> Covariate: + """Create a covariate from the item.""" + return Covariate( + subject_id=item.get("subject_id"), + subject_type=item.get("subject_type"), + object_id=item.get("object_id"), + object_type=item.get("object_type"), + type=item.get("type"), + status=item.get("status"), + start_date=item.get("start_date"), + end_date=item.get("end_date"), + description=item.get("description"), + source_text=item.get("source_text"), + doc_id=item.get("doc_id"), + record_id=item.get("record_id"), + id=item.get("id"), + ) diff --git a/graphrag/index/verbs/covariates/typing.py b/graphrag/index/verbs/covariates/typing.py new file mode 100644 index 00000000..e31cfa49 --- /dev/null +++ b/graphrag/index/verbs/covariates/typing.py @@ -0,0 +1,52 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'Covariate' and 'CovariateExtractionResult' models.""" + +from collections.abc import Awaitable, Callable, Iterable +from dataclasses import dataclass +from typing import Any + +from datashaper import VerbCallbacks + +from graphrag.index.cache import PipelineCache + + +@dataclass +class Covariate: + """Covariate class definition.""" + + covariate_type: str | None = None + subject_id: str | None = None + subject_type: str | None = None + object_id: str | None = None + object_type: str | None = None + type: str | None = None + status: str | None = None + start_date: str | None = None + end_date: str | None = None + description: str | None = None + source_text: list[str] | None = None + doc_id: str | None = None + record_id: int | None = None + id: str | None = None + + +@dataclass +class CovariateExtractionResult: + """Covariate extraction result class definition.""" + + covariate_data: list[Covariate] + + +CovariateExtractStrategy = Callable[ + [ + Iterable[str], + list[str], + dict[str, str], + VerbCallbacks, + PipelineCache, + dict[str, Any], + ], + Awaitable[CovariateExtractionResult], +] diff --git a/graphrag/index/verbs/entities/__init__.py b/graphrag/index/verbs/entities/__init__.py new file mode 100644 index 00000000..2f55d710 --- /dev/null +++ b/graphrag/index/verbs/entities/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine entities package root.""" + +from .extraction import entity_extract +from .summarize import summarize_descriptions + +__all__ = ["entity_extract", "summarize_descriptions"] diff --git a/graphrag/index/verbs/entities/extraction/__init__.py b/graphrag/index/verbs/entities/extraction/__init__.py new file mode 100644 index 00000000..46e6d545 --- /dev/null +++ b/graphrag/index/verbs/entities/extraction/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine entities extraction package root.""" + +from .entity_extract import ExtractEntityStrategyType, entity_extract + +__all__ = ["ExtractEntityStrategyType", "entity_extract"] diff --git a/graphrag/index/verbs/entities/extraction/entity_extract.py b/graphrag/index/verbs/entities/extraction/entity_extract.py new file mode 100644 index 00000000..9be302ae --- /dev/null +++ b/graphrag/index/verbs/entities/extraction/entity_extract.py @@ -0,0 +1,202 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing entity_extract methods.""" + +import logging +from enum import Enum +from typing import Any, cast + +import pandas as pd +from datashaper import ( + AsyncType, + TableContainer, + VerbCallbacks, + VerbInput, + derive_from_rows, + verb, +) + +from graphrag.index.bootstrap import bootstrap +from graphrag.index.cache import PipelineCache + +from .strategies.typing import Document, EntityExtractStrategy + +log = logging.getLogger(__name__) + + +class ExtractEntityStrategyType(str, Enum): + """ExtractEntityStrategyType class definition.""" + + graph_intelligence = "graph_intelligence" + graph_intelligence_json = "graph_intelligence_json" + nltk = "nltk" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' + + +DEFAULT_ENTITY_TYPES = ["organization", "person", "geo", "event"] + + +@verb(name="entity_extract") +async def entity_extract( + input: VerbInput, + cache: PipelineCache, + callbacks: VerbCallbacks, + column: str, + id_column: str, + to: str, + strategy: dict[str, Any] | None, + graph_to: str | None = None, + async_mode: AsyncType = AsyncType.AsyncIO, + entity_types=DEFAULT_ENTITY_TYPES, + **kwargs, +) -> TableContainer: + """ + Extract entities from a piece of text. + + ## Usage + ### json + ```json + { + "verb": "entity_extract", + "args": { + "column": "the_document_text_column_to_extract_entities_from", /* In general this will be your document text column */ + "id_column": "the_column_with_the_unique_id_for_each_row", /* In general this will be your document id */ + "to": "the_column_to_output_the_entities_to", /* This will be a list[dict[str, Any]] a list of entities, with a name, and additional attributes */ + "graph_to": "the_column_to_output_the_graphml_to", /* Optional: This will be a graphml graph in string form which represents the entities and their relationships */ + "strategy": {...} , see strategies section below + "entity_types": ["list", "of", "entity", "types", "to", "extract"] /* Optional: This will limit the entity types extracted, default: ["organization", "person", "geo", "event"] */ + "summarize_descriptions" : true | false /* Optional: This will summarize the descriptions of the entities and relationships, default: true */ + } + } + ``` + ### yaml + ```yaml + verb: entity_extract + args: + column: the_document_text_column_to_extract_entities_from + id_column: the_column_with_the_unique_id_for_each_row + to: the_column_to_output_the_entities_to + graph_to: the_column_to_output_the_graphml_to + strategy: , see strategies section below + summarize_descriptions: true | false /* Optional: This will summarize the descriptions of the entities and relationships, default: true */ + entity_types: + - list + - of + - entity + - types + - to + - extract + ``` + + ## Strategies + The entity extract verb uses a strategy to extract entities from a document. The strategy is a json object which defines the strategy to use. The following strategies are available: + + ### graph_intelligence + This strategy uses the [graph_intelligence] library to extract entities from a document. In particular it uses a LLM to extract entities from a piece of text. The strategy config is as follows: + + ```yml + strategy: + type: graph_intelligence + extraction_prompt: !include ./entity_extraction_prompt.txt # Optional, the prompt to use for extraction + completion_delimiter: "<|COMPLETE|>" # Optional, the delimiter to use for the LLM to mark completion + tuple_delimiter: "<|>" # Optional, the delimiter to use for the LLM to mark a tuple + record_delimiter: "##" # Optional, the delimiter to use for the LLM to mark a record + + prechunked: true | false # Optional, If the document is already chunked beforehand, otherwise this will chunk the document into smaller bits. default: false + encoding_name: cl100k_base # Optional, The encoding to use for the LLM, if not already prechunked, default: cl100k_base + chunk_size: 2500 # Optional ,The chunk size to use for the LLM, if not already prechunked, default: 2500 + chunk_overlap: 300 # Optional, The chunk overlap to use for the LLM, if not already prechunked, default: 300 + + llm: # The configuration for the LLM + type: openai # the type of llm to use, available options are: openai, azure, openai_chat, azure_openai_chat. The last two being chat based LLMs. + api_key: !ENV ${GRAPHRAG_OPENAI_API_KEY} # The api key to use for openai + model: !ENV ${GRAPHRAG_OPENAI_MODEL:gpt-4-turbo-preview} # The model to use for openai + max_tokens: !ENV ${GRAPHRAG_MAX_TOKENS:6000} # The max tokens to use for openai + organization: !ENV ${GRAPHRAG_OPENAI_ORGANIZATION} # The organization to use for openai + + # if using azure flavor + api_base: !ENV ${GRAPHRAG_OPENAI_API_BASE} # The api base to use for azure + api_version: !ENV ${GRAPHRAG_OPENAI_API_VERSION} # The api version to use for azure + proxy: !ENV ${GRAPHRAG_OPENAI_PROXY} # The proxy to use for azure + + ``` + + ### nltk + This strategy uses the [nltk] library to extract entities from a document. In particular it uses a nltk to extract entities from a piece of text. The strategy config is as follows: + ```yml + strategy: + type: nltk + ``` + """ + log.debug("entity_extract strategy=%s", strategy) + if entity_types is None: + entity_types = DEFAULT_ENTITY_TYPES + output = cast(pd.DataFrame, input.get_input()) + strategy = strategy or {} + strategy_exec = _load_strategy( + strategy.get("type", ExtractEntityStrategyType.graph_intelligence) + ) + strategy_config = {**strategy} + + num_started = 0 + + async def run_strategy(row): + nonlocal num_started + text = row[column] + id = row[id_column] + result = await strategy_exec( + [Document(text=text, id=id)], + entity_types, + callbacks, + cache, + strategy_config, + ) + num_started += 1 + return [result.entities, result.graphml_graph] + + results = await derive_from_rows( + output, + run_strategy, + callbacks, + scheduling_type=async_mode, + num_threads=kwargs.get("num_threads", 4), + ) + + to_result = [] + graph_to_result = [] + for result in results: + if result: + to_result.append(result[0]) + graph_to_result.append(result[1]) + else: + to_result.append(None) + graph_to_result.append(None) + + output[to] = to_result + if graph_to is not None: + output[graph_to] = graph_to_result + + return TableContainer(table=output.reset_index(drop=True)) + + +def _load_strategy(strategy_type: ExtractEntityStrategyType) -> EntityExtractStrategy: + """Load strategy method definition.""" + match strategy_type: + case ExtractEntityStrategyType.graph_intelligence: + from .strategies.graph_intelligence import run_gi + + return run_gi + + case ExtractEntityStrategyType.nltk: + bootstrap() + # dynamically import nltk strategy to avoid dependency if not used + from .strategies.nltk import run as run_nltk + + return run_nltk + case _: + msg = f"Unknown strategy: {strategy_type}" + raise ValueError(msg) diff --git a/graphrag/index/verbs/entities/extraction/strategies/__init__.py b/graphrag/index/verbs/entities/extraction/strategies/__init__.py new file mode 100644 index 00000000..f5cc17d7 --- /dev/null +++ b/graphrag/index/verbs/entities/extraction/strategies/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine entities extraction strategies package root.""" diff --git a/graphrag/index/verbs/entities/extraction/strategies/graph_intelligence/__init__.py b/graphrag/index/verbs/entities/extraction/strategies/graph_intelligence/__init__.py new file mode 100644 index 00000000..083c0e41 --- /dev/null +++ b/graphrag/index/verbs/entities/extraction/strategies/graph_intelligence/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine graph intelligence package root.""" + +from .run_graph_intelligence import run_gi + +__all__ = ["run_gi"] diff --git a/graphrag/index/verbs/entities/extraction/strategies/graph_intelligence/defaults.py b/graphrag/index/verbs/entities/extraction/strategies/graph_intelligence/defaults.py new file mode 100644 index 00000000..237e6657 --- /dev/null +++ b/graphrag/index/verbs/entities/extraction/strategies/graph_intelligence/defaults.py @@ -0,0 +1,25 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A file containing some default responses.""" + +from graphrag.config.enums import LLMType + +MOCK_LLM_RESPONSES = [ + """ + ("entity"<|>COMPANY_A<|>COMPANY<|>Company_A is a test company) + ## + ("entity"<|>COMPANY_B<|>COMPANY<|>Company_B owns Company_A and also shares an address with Company_A) + ## + ("entity"<|>PERSON_C<|>PERSON<|>Person_C is director of Company_A) + ## + ("relationship"<|>COMPANY_A<|>COMPANY_B<|>Company_A and Company_B are related because Company_A is 100% owned by Company_B and the two companies also share the same address)<|>2) + ## + ("relationship"<|>COMPANY_A<|>PERSON_C<|>Company_A and Person_C are related because Person_C is director of Company_A<|>1)) + """.strip() +] + +DEFAULT_LLM_CONFIG = { + "type": LLMType.StaticResponse, + "responses": MOCK_LLM_RESPONSES, +} diff --git a/graphrag/index/verbs/entities/extraction/strategies/graph_intelligence/run_graph_intelligence.py b/graphrag/index/verbs/entities/extraction/strategies/graph_intelligence/run_graph_intelligence.py new file mode 100644 index 00000000..997808f4 --- /dev/null +++ b/graphrag/index/verbs/entities/extraction/strategies/graph_intelligence/run_graph_intelligence.py @@ -0,0 +1,141 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing run_gi, run_extract_entities and _create_text_splitter methods to run graph intelligence.""" + +import networkx as nx +from datashaper import VerbCallbacks + +from graphrag.config.enums import LLMType +from graphrag.index.cache import PipelineCache +from graphrag.index.graph.extractors.graph import GraphExtractor +from graphrag.index.llm import load_llm +from graphrag.index.text_splitting import ( + NoopTextSplitter, + TextSplitter, + TokenTextSplitter, +) +from graphrag.index.verbs.entities.extraction.strategies.typing import ( + Document, + EntityExtractionResult, + EntityTypes, + StrategyConfig, +) +from graphrag.llm import CompletionLLM + +from .defaults import DEFAULT_LLM_CONFIG + + +async def run_gi( + docs: list[Document], + entity_types: EntityTypes, + reporter: VerbCallbacks, + pipeline_cache: PipelineCache, + args: StrategyConfig, +) -> EntityExtractionResult: + """Run the graph intelligence entity extraction strategy.""" + llm_config = args.get("llm", DEFAULT_LLM_CONFIG) + llm_type = llm_config.get("type", LLMType.StaticResponse) + llm = load_llm("entity_extraction", llm_type, reporter, pipeline_cache, llm_config) + return await run_extract_entities(llm, docs, entity_types, reporter, args) + + +async def run_extract_entities( + llm: CompletionLLM, + docs: list[Document], + entity_types: EntityTypes, + reporter: VerbCallbacks | None, + args: StrategyConfig, +) -> EntityExtractionResult: + """Run the entity extraction chain.""" + encoding_name = args.get("encoding_name", "cl100k_base") + + # Chunking Arguments + prechunked = args.get("prechunked", False) + chunk_size = args.get("chunk_size", 2500) + chunk_overlap = args.get("chunk_overlap", 300) + + # Extraction Arguments + tuple_delimiter = args.get("tuple_delimiter", None) + record_delimiter = args.get("record_delimiter", None) + completion_delimiter = args.get("completion_delimiter", None) + extraction_prompt = args.get("extraction_prompt", None) + encoding_model = args.get("encoding_name", None) + max_gleanings = args.get("max_gleanings", None) + + # note: We're not using UnipartiteGraphChain.from_params + # because we want to pass "timeout" to the llm_kwargs + text_splitter = _create_text_splitter( + prechunked, chunk_size, chunk_overlap, encoding_name + ) + + extractor = GraphExtractor( + llm_invoker=llm, + prompt=extraction_prompt, + encoding_model=encoding_model, + max_gleanings=max_gleanings, + on_error=lambda e, s, d: ( + reporter.error("Entity Extraction Error", e, s, d) if reporter else None + ), + ) + text_list = [doc.text.strip() for doc in docs] + + # If it's not pre-chunked, then re-chunk the input + if not prechunked: + text_list = text_splitter.split_text("\n".join(text_list)) + + results = await extractor( + list(text_list), + { + "entity_types": entity_types, + "tuple_delimiter": tuple_delimiter, + "record_delimiter": record_delimiter, + "completion_delimiter": completion_delimiter, + }, + ) + + graph = results.output + # Map the "source_id" back to the "id" field + for _, node in graph.nodes(data=True): # type: ignore + if node is not None: + node["source_id"] = ",".join( + docs[int(id)].id for id in node["source_id"].split(",") + ) + + for _, _, edge in graph.edges(data=True): # type: ignore + if edge is not None: + edge["source_id"] = ",".join( + docs[int(id)].id for id in edge["source_id"].split(",") + ) + + entities = [ + ({"name": item[0], **(item[1] or {})}) + for item in graph.nodes(data=True) + if item is not None + ] + + graph_data = "".join(nx.generate_graphml(graph)) + return EntityExtractionResult(entities, graph_data) + + +def _create_text_splitter( + prechunked: bool, chunk_size: int, chunk_overlap: int, encoding_name: str +) -> TextSplitter: + """Create a text splitter for the extraction chain. + + Args: + - prechunked - Whether the text is already chunked + - chunk_size - The size of each chunk + - chunk_overlap - The overlap between chunks + - encoding_name - The name of the encoding to use + Returns: + - output - A text splitter + """ + if prechunked: + return NoopTextSplitter() + + return TokenTextSplitter( + chunk_size=chunk_size, + chunk_overlap=chunk_overlap, + encoding_name=encoding_name, + ) diff --git a/graphrag/index/verbs/entities/extraction/strategies/nltk.py b/graphrag/index/verbs/entities/extraction/strategies/nltk.py new file mode 100644 index 00000000..48d4dae4 --- /dev/null +++ b/graphrag/index/verbs/entities/extraction/strategies/nltk.py @@ -0,0 +1,61 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing run method definition.""" + +import networkx as nx +import nltk +from datashaper import VerbCallbacks +from nltk.corpus import words + +from graphrag.index.cache import PipelineCache + +from .typing import Document, EntityExtractionResult, EntityTypes, StrategyConfig + +# Need to do this cause we're potentially multithreading, and nltk doesn't like that +words.ensure_loaded() + + +async def run( # noqa RUF029 async is required for interface + docs: list[Document], + entity_types: EntityTypes, + reporter: VerbCallbacks, # noqa ARG001 + pipeline_cache: PipelineCache, # noqa ARG001 + args: StrategyConfig, # noqa ARG001 +) -> EntityExtractionResult: + """Run method definition.""" + entity_map = {} + graph = nx.Graph() + for doc in docs: + connected_entities = [] + for chunk in nltk.ne_chunk(nltk.pos_tag(nltk.word_tokenize(doc.text))): + if hasattr(chunk, "label"): + entity_type = chunk.label().lower() + if entity_type in entity_types: + name = (" ".join(c[0] for c in chunk)).upper() + connected_entities.append(name) + if name not in entity_map: + entity_map[name] = entity_type + graph.add_node( + name, type=entity_type, description=name, source_id=doc.id + ) + + # connect the entities if they appear in the same document + if len(connected_entities) > 1: + for i in range(len(connected_entities)): + for j in range(i + 1, len(connected_entities)): + description = f"{connected_entities[i]} -> {connected_entities[j]}" + graph.add_edge( + connected_entities[i], + connected_entities[j], + description=description, + source_id=doc.id, + ) + + return EntityExtractionResult( + entities=[ + {"type": entity_type, "name": name} + for name, entity_type in entity_map.items() + ], + graphml_graph="".join(nx.generate_graphml(graph)), + ) diff --git a/graphrag/index/verbs/entities/extraction/strategies/typing.py b/graphrag/index/verbs/entities/extraction/strategies/typing.py new file mode 100644 index 00000000..45d3f1b8 --- /dev/null +++ b/graphrag/index/verbs/entities/extraction/strategies/typing.py @@ -0,0 +1,44 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'Document' and 'EntityExtractionResult' models.""" + +from collections.abc import Awaitable, Callable +from dataclasses import dataclass +from typing import Any + +from datashaper import VerbCallbacks + +from graphrag.index.cache import PipelineCache + +ExtractedEntity = dict[str, Any] +StrategyConfig = dict[str, Any] +EntityTypes = list[str] + + +@dataclass +class Document: + """Document class definition.""" + + text: str + id: str + + +@dataclass +class EntityExtractionResult: + """Entity extraction result class definition.""" + + entities: list[ExtractedEntity] + graphml_graph: str | None + + +EntityExtractStrategy = Callable[ + [ + list[Document], + EntityTypes, + VerbCallbacks, + PipelineCache, + StrategyConfig, + ], + Awaitable[EntityExtractionResult], +] diff --git a/graphrag/index/verbs/entities/summarize/__init__.py b/graphrag/index/verbs/entities/summarize/__init__.py new file mode 100644 index 00000000..9ba40129 --- /dev/null +++ b/graphrag/index/verbs/entities/summarize/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Root package for resolution entities.""" + +from .description_summarize import SummarizeStrategyType, summarize_descriptions + +__all__ = ["SummarizeStrategyType", "summarize_descriptions"] diff --git a/graphrag/index/verbs/entities/summarize/description_summarize.py b/graphrag/index/verbs/entities/summarize/description_summarize.py new file mode 100644 index 00000000..5b7feb41 --- /dev/null +++ b/graphrag/index/verbs/entities/summarize/description_summarize.py @@ -0,0 +1,207 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing the summarize_descriptions verb.""" + +import asyncio +import logging +from enum import Enum +from typing import Any, NamedTuple, cast + +import networkx as nx +import pandas as pd +from datashaper import ( + ProgressTicker, + TableContainer, + VerbCallbacks, + VerbInput, + progress_ticker, + verb, +) + +from graphrag.index.cache import PipelineCache +from graphrag.index.utils import load_graph + +from .strategies.typing import SummarizationStrategy + +log = logging.getLogger(__name__) + + +class DescriptionSummarizeRow(NamedTuple): + """DescriptionSummarizeRow class definition.""" + + graph: Any + + +class SummarizeStrategyType(str, Enum): + """SummarizeStrategyType class definition.""" + + graph_intelligence = "graph_intelligence" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' + + +@verb(name="summarize_descriptions") +async def summarize_descriptions( + input: VerbInput, + cache: PipelineCache, + callbacks: VerbCallbacks, + column: str, + to: str, + strategy: dict[str, Any] | None = None, + **kwargs, +) -> TableContainer: + """ + Summarize entity and relationship descriptions from an entity graph. + + ## Usage + + To turn this feature ON please set the environment variable `GRAPHRAG_SUMMARIZE_DESCRIPTIONS_ENABLED=True`. + + ### json + + ```json + { + "verb": "", + "args": { + "column": "the_document_text_column_to_extract_descriptions_from", /* Required: This will be a graphml graph in string form which represents the entities and their relationships */ + "to": "the_column_to_output_the_summarized_descriptions_to", /* Required: This will be a graphml graph in string form which represents the entities and their relationships after being summarized */ + "strategy": {...} , see strategies section below + } + } + ``` + + ### yaml + + ```yaml + verb: entity_extract + args: + column: the_document_text_column_to_extract_descriptions_from + to: the_column_to_output_the_summarized_descriptions_to + strategy: , see strategies section below + ``` + + ## Strategies + + The summarize descriptions verb uses a strategy to summarize descriptions for entities. The strategy is a json object which defines the strategy to use. The following strategies are available: + + ### graph_intelligence + + This strategy uses the [graph_intelligence] library to summarize descriptions for entities. The strategy config is as follows: + + ```yml + strategy: + type: graph_intelligence + summarize_prompt: # Optional, the prompt to use for extraction + + + llm: # The configuration for the LLM + type: openai # the type of llm to use, available options are: openai, azure, openai_chat, azure_openai_chat. The last two being chat based LLMs. + api_key: !ENV ${GRAPHRAG_OPENAI_API_KEY} # The api key to use for openai + model: !ENV ${GRAPHRAG_OPENAI_MODEL:gpt-4-turbo-preview} # The model to use for openai + max_tokens: !ENV ${GRAPHRAG_MAX_TOKENS:6000} # The max tokens to use for openai + organization: !ENV ${GRAPHRAG_OPENAI_ORGANIZATION} # The organization to use for openai + + # if using azure flavor + api_base: !ENV ${GRAPHRAG_OPENAI_API_BASE} # The api base to use for azure + api_version: !ENV ${GRAPHRAG_OPENAI_API_VERSION} # The api version to use for azure + proxy: !ENV ${GRAPHRAG_OPENAI_PROXY} # The proxy to use for azure + ``` + """ + log.debug("summarize_descriptions strategy=%s", strategy) + output = cast(pd.DataFrame, input.get_input()) + strategy = strategy or {} + strategy_exec = load_strategy( + strategy.get("type", SummarizeStrategyType.graph_intelligence) + ) + strategy_config = {**strategy} + + async def get_resolved_entities(row, semaphore: asyncio.Semaphore): + graph: nx.Graph = load_graph(cast(str | nx.Graph, getattr(row, column))) + + ticker_length = len(graph.nodes) + len(graph.edges) + + ticker = progress_ticker(callbacks.progress, ticker_length) + + futures = [ + do_summarize_descriptions( + node, + sorted(set(graph.nodes[node].get("description", "").split("\n"))), + ticker, + semaphore, + ) + for node in graph.nodes() + ] + futures += [ + do_summarize_descriptions( + edge, + sorted(set(graph.edges[edge].get("description", "").split("\n"))), + ticker, + semaphore, + ) + for edge in graph.edges() + ] + + results = await asyncio.gather(*futures) + + for result in results: + graph_item = result.items + if isinstance(graph_item, str) and graph_item in graph.nodes(): + graph.nodes[graph_item]["description"] = result.description + elif isinstance(graph_item, tuple) and graph_item in graph.edges(): + graph.edges[graph_item]["description"] = result.description + + return DescriptionSummarizeRow( + graph="\n".join(nx.generate_graphml(graph)), + ) + + async def do_summarize_descriptions( + graph_item: str | tuple[str, str], + descriptions: list[str], + ticker: ProgressTicker, + semaphore: asyncio.Semaphore, + ): + async with semaphore: + results = await strategy_exec( + graph_item, + descriptions, + callbacks, + cache, + strategy_config, + ) + ticker(1) + return results + + # Graph is always on row 0, so here a derive from rows does not work + # This iteration will only happen once, but avoids hardcoding a iloc[0] + # Since parallelization is at graph level (nodes and edges), we can't use + # the parallelization of the derive_from_rows + semaphore = asyncio.Semaphore(kwargs.get("num_threads", 4)) + + results = [ + await get_resolved_entities(row, semaphore) for row in output.itertuples() + ] + + to_result = [] + + for result in results: + if result: + to_result.append(result.graph) + else: + to_result.append(None) + output[to] = to_result + return TableContainer(table=output) + + +def load_strategy(strategy_type: SummarizeStrategyType) -> SummarizationStrategy: + """Load strategy method definition.""" + match strategy_type: + case SummarizeStrategyType.graph_intelligence: + from .strategies.graph_intelligence import run as run_gi + + return run_gi + case _: + msg = f"Unknown strategy: {strategy_type}" + raise ValueError(msg) diff --git a/graphrag/index/verbs/entities/summarize/strategies/__init__.py b/graphrag/index/verbs/entities/summarize/strategies/__init__.py new file mode 100644 index 00000000..28c398e6 --- /dev/null +++ b/graphrag/index/verbs/entities/summarize/strategies/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Indexing Engine - Summarization Strategies Package.""" + +from .typing import SummarizationStrategy + +__all__ = ["SummarizationStrategy"] diff --git a/graphrag/index/verbs/entities/summarize/strategies/graph_intelligence/__init__.py b/graphrag/index/verbs/entities/summarize/strategies/graph_intelligence/__init__.py new file mode 100644 index 00000000..665600d0 --- /dev/null +++ b/graphrag/index/verbs/entities/summarize/strategies/graph_intelligence/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Entity Resolution graph intelligence package root.""" + +from .run_graph_intelligence import run + +__all__ = ["run"] diff --git a/graphrag/index/verbs/entities/summarize/strategies/graph_intelligence/defaults.py b/graphrag/index/verbs/entities/summarize/strategies/graph_intelligence/defaults.py new file mode 100644 index 00000000..8ac42aa1 --- /dev/null +++ b/graphrag/index/verbs/entities/summarize/strategies/graph_intelligence/defaults.py @@ -0,0 +1,17 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A file containing some default responses.""" + +from graphrag.config.enums import LLMType + +MOCK_LLM_RESPONSES = [ + """ + This is a MOCK response for the LLM. It is summarized! + """.strip() +] + +DEFAULT_LLM_CONFIG = { + "type": LLMType.StaticResponse, + "responses": MOCK_LLM_RESPONSES, +} diff --git a/graphrag/index/verbs/entities/summarize/strategies/graph_intelligence/run_graph_intelligence.py b/graphrag/index/verbs/entities/summarize/strategies/graph_intelligence/run_graph_intelligence.py new file mode 100644 index 00000000..57a1ecd2 --- /dev/null +++ b/graphrag/index/verbs/entities/summarize/strategies/graph_intelligence/run_graph_intelligence.py @@ -0,0 +1,70 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing run_gi, run_resolve_entities and _create_text_list_splitter methods to run graph intelligence.""" + +from datashaper import VerbCallbacks + +from graphrag.config.enums import LLMType +from graphrag.index.cache import PipelineCache +from graphrag.index.graph.extractors.summarize import SummarizeExtractor +from graphrag.index.llm import load_llm +from graphrag.index.verbs.entities.summarize.strategies.typing import ( + StrategyConfig, + SummarizedDescriptionResult, +) +from graphrag.llm import CompletionLLM + +from .defaults import DEFAULT_LLM_CONFIG + + +async def run( + described_items: str | tuple[str, str], + descriptions: list[str], + reporter: VerbCallbacks, + pipeline_cache: PipelineCache, + args: StrategyConfig, +) -> SummarizedDescriptionResult: + """Run the graph intelligence entity extraction strategy.""" + llm_config = args.get("llm", DEFAULT_LLM_CONFIG) + llm_type = llm_config.get("type", LLMType.StaticResponse) + llm = load_llm( + "summarize_descriptions", llm_type, reporter, pipeline_cache, llm_config + ) + return await run_summarize_descriptions( + llm, described_items, descriptions, reporter, args + ) + + +async def run_summarize_descriptions( + llm: CompletionLLM, + items: str | tuple[str, str], + descriptions: list[str], + reporter: VerbCallbacks, + args: StrategyConfig, +) -> SummarizedDescriptionResult: + """Run the entity extraction chain.""" + # Extraction Arguments + summarize_prompt = args.get("summarize_prompt", None) + entity_name_key = args.get("entity_name_key", "entity_name") + input_descriptions_key = args.get("input_descriptions_key", "description_list") + max_tokens = args.get("max_tokens", None) + + extractor = SummarizeExtractor( + llm_invoker=llm, + summarization_prompt=summarize_prompt, + entity_name_key=entity_name_key, + input_descriptions_key=input_descriptions_key, + on_error=lambda e, stack, details: ( + reporter.error("Entity Extraction Error", e, stack, details) + if reporter + else None + ), + max_summary_length=args.get("max_summary_length", None), + max_input_tokens=max_tokens, + ) + + result = await extractor(items=items, descriptions=descriptions) + return SummarizedDescriptionResult( + items=result.items, description=result.description + ) diff --git a/graphrag/index/verbs/entities/summarize/strategies/typing.py b/graphrag/index/verbs/entities/summarize/strategies/typing.py new file mode 100644 index 00000000..e950cedc --- /dev/null +++ b/graphrag/index/verbs/entities/summarize/strategies/typing.py @@ -0,0 +1,34 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'ResolvedEntity' and 'EntityResolutionResult' models.""" + +from collections.abc import Awaitable, Callable +from dataclasses import dataclass +from typing import Any + +from datashaper import VerbCallbacks + +from graphrag.index.cache import PipelineCache + +StrategyConfig = dict[str, Any] + + +@dataclass +class SummarizedDescriptionResult: + """Entity summarization result class definition.""" + + items: str | tuple[str, str] + description: str + + +SummarizationStrategy = Callable[ + [ + str | tuple[str, str], + list[str], + VerbCallbacks, + PipelineCache, + StrategyConfig, + ], + Awaitable[SummarizedDescriptionResult], +] diff --git a/graphrag/index/verbs/genid.py b/graphrag/index/verbs/genid.py new file mode 100644 index 00000000..019ffc2d --- /dev/null +++ b/graphrag/index/verbs/genid.py @@ -0,0 +1,66 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing genid method definition.""" + +from typing import cast + +import pandas as pd +from datashaper import TableContainer, VerbInput, verb + +from graphrag.index.utils import gen_md5_hash + + +@verb(name="genid") +def genid( + input: VerbInput, + to: str, + method: str = "md5_hash", + hash: list[str] = [], # noqa A002 + **_kwargs: dict, +) -> TableContainer: + """ + Generate a unique id for each row in the tabular data. + + ## Usage + ### json + ```json + { + "verb": "genid", + "args": { + "to": "id_output_column_name", /* The name of the column to output the id to */ + "method": "md5_hash", /* The method to use to generate the id */ + "hash": ["list", "of", "column", "names"] /* only if using md5_hash */, + "seed": 034324 /* The random seed to use with UUID */ + } + } + ``` + + ### yaml + ```yaml + verb: genid + args: + to: id_output_column_name + method: md5_hash + hash: + - list + - of + - column + - names + seed: 034324 + ``` + """ + data = cast(pd.DataFrame, input.source.table) + + if method == "md5_hash": + if len(hash) == 0: + msg = 'Must specify the "hash" columns to use md5_hash method' + raise ValueError(msg) + + data[to] = data.apply(lambda row: gen_md5_hash(row, hash), axis=1) + elif method == "increment": + data[to] = data.index + 1 + else: + msg = f"Unknown method {method}" + raise ValueError(msg) + return TableContainer(table=data) diff --git a/graphrag/index/verbs/graph/__init__.py b/graphrag/index/verbs/graph/__init__.py new file mode 100644 index 00000000..5edbdbe5 --- /dev/null +++ b/graphrag/index/verbs/graph/__init__.py @@ -0,0 +1,36 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine graph package root.""" + +from .clustering import cluster_graph +from .compute_edge_combined_degree import compute_edge_combined_degree +from .create import DEFAULT_EDGE_ATTRIBUTES, DEFAULT_NODE_ATTRIBUTES, create_graph +from .embed import embed_graph +from .layout import layout_graph +from .merge import merge_graphs +from .report import ( + create_community_reports, + prepare_community_reports, + prepare_community_reports_claims, + prepare_community_reports_edges, + restore_community_hierarchy, +) +from .unpack import unpack_graph + +__all__ = [ + "DEFAULT_EDGE_ATTRIBUTES", + "DEFAULT_NODE_ATTRIBUTES", + "cluster_graph", + "compute_edge_combined_degree", + "create_community_reports", + "create_graph", + "embed_graph", + "layout_graph", + "merge_graphs", + "prepare_community_reports", + "prepare_community_reports_claims", + "prepare_community_reports_edges", + "restore_community_hierarchy", + "unpack_graph", +] diff --git a/graphrag/index/verbs/graph/clustering/__init__.py b/graphrag/index/verbs/graph/clustering/__init__.py new file mode 100644 index 00000000..a5db89bb --- /dev/null +++ b/graphrag/index/verbs/graph/clustering/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine graph clustering package root.""" + +from .cluster_graph import GraphCommunityStrategyType, cluster_graph + +__all__ = ["GraphCommunityStrategyType", "cluster_graph"] diff --git a/graphrag/index/verbs/graph/clustering/cluster_graph.py b/graphrag/index/verbs/graph/clustering/cluster_graph.py new file mode 100644 index 00000000..e8be50e8 --- /dev/null +++ b/graphrag/index/verbs/graph/clustering/cluster_graph.py @@ -0,0 +1,176 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing cluster_graph, apply_clustering and run_layout methods definition.""" + +import logging +from enum import Enum +from random import Random +from typing import Any, cast + +import networkx as nx +import pandas as pd +from datashaper import TableContainer, VerbCallbacks, VerbInput, progress_iterable, verb + +from graphrag.index.utils import gen_uuid, load_graph + +from .typing import Communities + +log = logging.getLogger(__name__) + + +@verb(name="cluster_graph") +def cluster_graph( + input: VerbInput, + callbacks: VerbCallbacks, + strategy: dict[str, Any], + column: str, + to: str, + level_to: str | None = None, + **_kwargs, +) -> TableContainer: + """ + Apply a hierarchical clustering algorithm to a graph. The graph is expected to be in graphml format. The verb outputs a new column containing the clustered graph, and a new column containing the level of the graph. + + ## Usage + ```yaml + verb: cluster_graph + args: + column: entity_graph # The name of the column containing the graph, should be a graphml graph + to: clustered_graph # The name of the column to output the clustered graph to + level_to: level # The name of the column to output the level to + strategy: # See strategies section below + ``` + + ## Strategies + The cluster graph verb uses a strategy to cluster the graph. The strategy is a json object which defines the strategy to use. The following strategies are available: + + ### leiden + This strategy uses the leiden algorithm to cluster a graph. The strategy config is as follows: + ```yaml + strategy: + type: leiden + max_cluster_size: 10 # Optional, The max cluster size to use, default: 10 + use_lcc: true # Optional, if the largest connected component should be used with the leiden algorithm, default: true + seed: 0xDEADBEEF # Optional, the seed to use for the leiden algorithm, default: 0xDEADBEEF + levels: [0, 1] # Optional, the levels to output, default: all the levels detected + + ``` + """ + output_df = cast(pd.DataFrame, input.get_input()) + results = output_df[column].apply(lambda graph: run_layout(strategy, graph)) + + community_map_to = "communities" + output_df[community_map_to] = results + + level_to = level_to or f"{to}_level" + output_df[level_to] = output_df.apply( + lambda x: list({level for level, _, _ in x[community_map_to]}), axis=1 + ) + output_df[to] = [None] * len(output_df) + + num_total = len(output_df) + + # Go through each of the rows + graph_level_pairs_column: list[list[tuple[int, str]]] = [] + for _, row in progress_iterable( + output_df.iterrows(), callbacks.progress, num_total + ): + levels = row[level_to] + graph_level_pairs: list[tuple[int, str]] = [] + + # For each of the levels, get the graph and add it to the list + for level in levels: + graph = "\n".join( + nx.generate_graphml( + apply_clustering( + cast(str, row[column]), + cast(Communities, row[community_map_to]), + level, + ) + ) + ) + graph_level_pairs.append((level, graph)) + graph_level_pairs_column.append(graph_level_pairs) + output_df[to] = graph_level_pairs_column + + # explode the list of (level, graph) pairs into separate rows + output_df = output_df.explode(to, ignore_index=True) + + # split the (level, graph) pairs into separate columns + # TODO: There is probably a better way to do this + output_df[[level_to, to]] = pd.DataFrame( + output_df[to].tolist(), index=output_df.index + ) + + # clean up the community map + output_df.drop(columns=[community_map_to], inplace=True) + + return TableContainer(table=output_df) + + +# TODO: This should support str | nx.Graph as a graphml param +def apply_clustering( + graphml: str, communities: Communities, level=0, seed=0xF001 +) -> nx.Graph: + """Apply clustering to a graphml string.""" + random = Random(seed) # noqa S311 + graph = nx.parse_graphml(graphml) + for community_level, community_id, nodes in communities: + if level == community_level: + for node in nodes: + graph.nodes[node]["cluster"] = community_id + graph.nodes[node]["level"] = level + + # add node degree + for node_degree in graph.degree: + graph.nodes[str(node_degree[0])]["degree"] = int(node_degree[1]) + + # add node uuid and incremental record id (a human readable id used as reference in the final report) + for index, node in enumerate(graph.nodes()): + graph.nodes[node]["human_readable_id"] = index + graph.nodes[node]["id"] = str(gen_uuid(random)) + + # add ids to edges + for index, edge in enumerate(graph.edges()): + graph.edges[edge]["id"] = str(gen_uuid(random)) + graph.edges[edge]["human_readable_id"] = index + graph.edges[edge]["level"] = level + return graph + + +class GraphCommunityStrategyType(str, Enum): + """GraphCommunityStrategyType class definition.""" + + leiden = "leiden" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' + + +def run_layout( + strategy: dict[str, Any], graphml_or_graph: str | nx.Graph +) -> Communities: + """Run layout method definition.""" + graph = load_graph(graphml_or_graph) + if len(graph.nodes) == 0: + log.warning("Graph has no nodes") + return [] + + clusters: dict[int, dict[str, list[str]]] = {} + strategy_type = strategy.get("type", GraphCommunityStrategyType.leiden) + match strategy_type: + case GraphCommunityStrategyType.leiden: + from .strategies.leiden import run as run_leiden + + clusters = run_leiden(graph, strategy) + case _: + msg = f"Unknown clustering strategy {strategy_type}" + raise ValueError(msg) + + results: Communities = [] + for level in clusters: + for cluster_id, nodes in clusters[level].items(): + results.append((level, cluster_id, nodes)) + return results diff --git a/graphrag/index/verbs/graph/clustering/strategies/__init__.py b/graphrag/index/verbs/graph/clustering/strategies/__init__.py new file mode 100644 index 00000000..16a03f12 --- /dev/null +++ b/graphrag/index/verbs/graph/clustering/strategies/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Graph Clustering Strategies.""" diff --git a/graphrag/index/verbs/graph/clustering/strategies/leiden.py b/graphrag/index/verbs/graph/clustering/strategies/leiden.py new file mode 100644 index 00000000..ffc36880 --- /dev/null +++ b/graphrag/index/verbs/graph/clustering/strategies/leiden.py @@ -0,0 +1,69 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing run and _compute_leiden_communities methods definitions.""" + +import logging +from typing import Any + +import networkx as nx +from graspologic.partition import hierarchical_leiden + +from graphrag.index.graph.utils import stable_largest_connected_component + +log = logging.getLogger(__name__) + + +def run(graph: nx.Graph, args: dict[str, Any]) -> dict[int, dict[str, list[str]]]: + """Run method definition.""" + max_cluster_size = args.get("max_cluster_size", 10) + use_lcc = args.get("use_lcc", True) + if args.get("verbose", False): + log.info( + "Running leiden with max_cluster_size=%s, lcc=%s", max_cluster_size, use_lcc + ) + + node_id_to_community_map = _compute_leiden_communities( + graph=graph, + max_cluster_size=max_cluster_size, + use_lcc=use_lcc, + seed=args.get("seed", 0xDEADBEEF), + ) + levels = args.get("levels") + + # If they don't pass in levels, use them all + if levels is None: + levels = sorted(node_id_to_community_map.keys()) + + results_by_level: dict[int, dict[str, list[str]]] = {} + for level in levels: + result = {} + results_by_level[level] = result + for node_id, raw_community_id in node_id_to_community_map[level].items(): + community_id = str(raw_community_id) + if community_id not in result: + result[community_id] = [] + result[community_id].append(node_id) + return results_by_level + + +# Taken from graph_intelligence & adapted +def _compute_leiden_communities( + graph: nx.Graph | nx.DiGraph, + max_cluster_size: int, + use_lcc: bool, + seed=0xDEADBEEF, +) -> dict[int, dict[str, int]]: + """Return Leiden root communities.""" + if use_lcc: + graph = stable_largest_connected_component(graph) + + community_mapping = hierarchical_leiden( + graph, max_cluster_size=max_cluster_size, random_seed=seed + ) + results: dict[int, dict[str, int]] = {} + for partition in community_mapping: + results[partition.level] = results.get(partition.level, {}) + results[partition.level][partition.node] = partition.cluster + + return results diff --git a/graphrag/index/verbs/graph/clustering/typing.py b/graphrag/index/verbs/graph/clustering/typing.py new file mode 100644 index 00000000..4d6fc7e6 --- /dev/null +++ b/graphrag/index/verbs/graph/clustering/typing.py @@ -0,0 +1,6 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing Communities list definition.""" + +Communities = list[tuple[int, str, list[str]]] diff --git a/graphrag/index/verbs/graph/compute_edge_combined_degree.py b/graphrag/index/verbs/graph/compute_edge_combined_degree.py new file mode 100644 index 00000000..1f2dd719 --- /dev/null +++ b/graphrag/index/verbs/graph/compute_edge_combined_degree.py @@ -0,0 +1,70 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing create_graph, _get_node_attributes, _get_edge_attributes and _get_attribute_column_mapping methods definition.""" + +from typing import cast + +import pandas as pd +from datashaper import TableContainer, VerbInput, verb + +from graphrag.index.utils.ds_util import get_required_input_table + + +@verb(name="compute_edge_combined_degree") +def compute_edge_combined_degree( + input: VerbInput, + to: str = "rank", + node_name_column: str = "title", + node_degree_column: str = "degree", + edge_source_column: str = "source", + edge_target_column: str = "target", + **_kwargs, +) -> TableContainer: + """ + Compute the combined degree for each edge in a graph. + + Inputs Tables: + - input: The edge table + - nodes: The nodes table. + + Args: + - to: The name of the column to output the combined degree to. Default="rank" + """ + edge_df: pd.DataFrame = cast(pd.DataFrame, input.get_input()) + if to in edge_df.columns: + return TableContainer(table=edge_df) + node_degree_df = _get_node_degree_table(input, node_name_column, node_degree_column) + + def join_to_degree(df: pd.DataFrame, column: str) -> pd.DataFrame: + degree_column = _degree_colname(column) + result = df.merge( + node_degree_df.rename( + columns={node_name_column: column, node_degree_column: degree_column} + ), + on=column, + how="left", + ) + result[degree_column] = result[degree_column].fillna(0) + return result + + edge_df = join_to_degree(edge_df, edge_source_column) + edge_df = join_to_degree(edge_df, edge_target_column) + edge_df[to] = ( + edge_df[_degree_colname(edge_source_column)] + + edge_df[_degree_colname(edge_target_column)] + ) + + return TableContainer(table=edge_df) + + +def _degree_colname(column: str) -> str: + return f"{column}_degree" + + +def _get_node_degree_table( + input: VerbInput, node_name_column: str, node_degree_column: str +) -> pd.DataFrame: + nodes_container = get_required_input_table(input, "nodes") + nodes = cast(pd.DataFrame, nodes_container.table) + return cast(pd.DataFrame, nodes[[node_name_column, node_degree_column]]) diff --git a/graphrag/index/verbs/graph/create.py b/graphrag/index/verbs/graph/create.py new file mode 100644 index 00000000..eaf06284 --- /dev/null +++ b/graphrag/index/verbs/graph/create.py @@ -0,0 +1,135 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing create_graph, _get_node_attributes, _get_edge_attributes and _get_attribute_column_mapping methods definition.""" + +from typing import Any + +import networkx as nx +import pandas as pd +from datashaper import TableContainer, VerbCallbacks, VerbInput, progress_iterable, verb + +from graphrag.index.utils import clean_str + +DEFAULT_NODE_ATTRIBUTES = ["label", "type", "id", "name", "description", "community"] +DEFAULT_EDGE_ATTRIBUTES = ["label", "type", "name", "source", "target"] + + +@verb(name="create_graph") +def create_graph( + input: VerbInput, + callbacks: VerbCallbacks, + to: str, + type: str, # noqa A002 + graph_type: str = "undirected", + **kwargs, +) -> TableContainer: + """ + Create a graph from a dataframe. The verb outputs a new column containing the graph. + + > Note: This will roll up all rows into a single graph. + + ## Usage + ```yaml + verb: create_graph + args: + type: node # The type of graph to create, one of: node, edge + to: # The name of the column to output the graph to, this will be a graphml graph + attributes: # The attributes for the nodes / edges + # If using the node type, the following attributes are required: + id: + + # If using the edge type, the following attributes are required: + source: + target: + + # Other attributes can be added as follows: + : + ... for each attribute + ``` + """ + if type != "node" and type != "edge": + msg = f"Unknown type {type}" + raise ValueError(msg) + + input_df = input.get_input() + num_total = len(input_df) + out_graph: nx.Graph = _create_nx_graph(graph_type) + + in_attributes = ( + _get_node_attributes(kwargs) if type == "node" else _get_edge_attributes(kwargs) + ) + + # At this point, _get_node_attributes and _get_edge_attributes have already validated + id_col = in_attributes.get( + "id", in_attributes.get("label", in_attributes.get("name", None)) + ) + source_col = in_attributes.get("source", None) + target_col = in_attributes.get("target", None) + + for _, row in progress_iterable(input_df.iterrows(), callbacks.progress, num_total): + item_attributes = { + clean_str(key): _clean_value(row[value]) + for key, value in in_attributes.items() + if value in row + } + if type == "node": + id = clean_str(row[id_col]) + out_graph.add_node(id, **item_attributes) + elif type == "edge": + source = clean_str(row[source_col]) + target = clean_str(row[target_col]) + out_graph.add_edge(source, target, **item_attributes) + + graphml_string = "".join(nx.generate_graphml(out_graph)) + output_df = pd.DataFrame([{to: graphml_string}]) + return TableContainer(table=output_df) + + +def _clean_value(value: Any) -> str: + if value is None: + return "" + if isinstance(value, str): + return clean_str(value) + + msg = f"Value must be a string or None, got {type(value)}" + raise TypeError(msg) + + +def _get_node_attributes(args: dict[str, Any]) -> dict[str, Any]: + mapping = _get_attribute_column_mapping( + args.get("attributes", DEFAULT_NODE_ATTRIBUTES) + ) + if "id" not in mapping and "label" not in mapping and "name" not in mapping: + msg = "You must specify an id, label, or name column in the node attributes" + raise ValueError(msg) + return mapping + + +def _get_edge_attributes(args: dict[str, Any]) -> dict[str, Any]: + mapping = _get_attribute_column_mapping( + args.get("attributes", DEFAULT_EDGE_ATTRIBUTES) + ) + if "source" not in mapping or "target" not in mapping: + msg = "You must specify a source and target column in the edge attributes" + raise ValueError(msg) + return mapping + + +def _get_attribute_column_mapping( + in_attributes: dict[str, Any] | list[str], +) -> dict[str, str]: + # Its already a attribute: column dict + if isinstance(in_attributes, dict): + return { + **in_attributes, + } + + return {attrib: attrib for attrib in in_attributes} + + +def _create_nx_graph(graph_type: str) -> nx.Graph: + if graph_type == "directed": + return nx.DiGraph() + + return nx.Graph() diff --git a/graphrag/index/verbs/graph/embed/__init__.py b/graphrag/index/verbs/graph/embed/__init__.py new file mode 100644 index 00000000..4ca8168c --- /dev/null +++ b/graphrag/index/verbs/graph/embed/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine graph embed package root.""" + +from .embed_graph import EmbedGraphStrategyType, embed_graph + +__all__ = ["EmbedGraphStrategyType", "embed_graph"] diff --git a/graphrag/index/verbs/graph/embed/embed_graph.py b/graphrag/index/verbs/graph/embed/embed_graph.py new file mode 100644 index 00000000..8691d343 --- /dev/null +++ b/graphrag/index/verbs/graph/embed/embed_graph.py @@ -0,0 +1,98 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing embed_graph and run_embeddings methods definition.""" + +from enum import Enum +from typing import Any, cast + +import networkx as nx +import pandas as pd +from datashaper import TableContainer, VerbCallbacks, VerbInput, derive_from_rows, verb + +from graphrag.index.utils import load_graph + +from .typing import NodeEmbeddings + + +class EmbedGraphStrategyType(str, Enum): + """EmbedGraphStrategyType class definition.""" + + node2vec = "node2vec" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' + + +@verb(name="embed_graph") +async def embed_graph( + input: VerbInput, + callbacks: VerbCallbacks, + strategy: dict[str, Any], + column: str, + to: str, + **kwargs, +) -> TableContainer: + """ + Embed a graph into a vector space. The graph is expected to be in graphml format. The verb outputs a new column containing a mapping between node_id and vector. + + ## Usage + ```yaml + verb: embed_graph + args: + column: clustered_graph # The name of the column containing the graph, should be a graphml graph + to: embeddings # The name of the column to output the embeddings to + strategy: # See strategies section below + ``` + + ## Strategies + The embed_graph verb uses a strategy to embed the graph. The strategy is an object which defines the strategy to use. The following strategies are available: + + ### node2vec + This strategy uses the node2vec algorithm to embed a graph. The strategy config is as follows: + + ```yaml + strategy: + type: node2vec + dimensions: 1536 # Optional, The number of dimensions to use for the embedding, default: 1536 + num_walks: 10 # Optional, The number of walks to use for the embedding, default: 10 + walk_length: 40 # Optional, The walk length to use for the embedding, default: 40 + window_size: 2 # Optional, The window size to use for the embedding, default: 2 + iterations: 3 # Optional, The number of iterations to use for the embedding, default: 3 + random_seed: 86 # Optional, The random seed to use for the embedding, default: 86 + ``` + """ + output_df = cast(pd.DataFrame, input.get_input()) + + strategy_type = strategy.get("type", EmbedGraphStrategyType.node2vec) + strategy_args = {**strategy} + + async def run_strategy(row): # noqa RUF029 async is required for interface + return run_embeddings(strategy_type, cast(Any, row[column]), strategy_args) + + results = await derive_from_rows( + output_df, + run_strategy, + callbacks=callbacks, + num_threads=kwargs.get("num_threads", None), + ) + output_df[to] = list(results) + return TableContainer(table=output_df) + + +def run_embeddings( + strategy: EmbedGraphStrategyType, + graphml_or_graph: str | nx.Graph, + args: dict[str, Any], +) -> NodeEmbeddings: + """Run embeddings method definition.""" + graph = load_graph(graphml_or_graph) + match strategy: + case EmbedGraphStrategyType.node2vec: + from .strategies.node_2_vec import run as run_node_2_vec + + return run_node_2_vec(graph, args) + case _: + msg = f"Unknown strategy {strategy}" + raise ValueError(msg) diff --git a/graphrag/index/verbs/graph/embed/strategies/__init__.py b/graphrag/index/verbs/graph/embed/strategies/__init__.py new file mode 100644 index 00000000..ef85198e --- /dev/null +++ b/graphrag/index/verbs/graph/embed/strategies/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Text Embedding strategies.""" diff --git a/graphrag/index/verbs/graph/embed/strategies/node_2_vec.py b/graphrag/index/verbs/graph/embed/strategies/node_2_vec.py new file mode 100644 index 00000000..eb329519 --- /dev/null +++ b/graphrag/index/verbs/graph/embed/strategies/node_2_vec.py @@ -0,0 +1,34 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing run method definition.""" + +from typing import Any + +import networkx as nx + +from graphrag.index.graph.embedding import embed_nod2vec +from graphrag.index.graph.utils import stable_largest_connected_component +from graphrag.index.verbs.graph.embed.typing import NodeEmbeddings + + +def run(graph: nx.Graph, args: dict[str, Any]) -> NodeEmbeddings: + """Run method definition.""" + if args.get("use_lcc", True): + graph = stable_largest_connected_component(graph) + + # create graph embedding using node2vec + embeddings = embed_nod2vec( + graph=graph, + dimensions=args.get("dimensions", 1536), + num_walks=args.get("num_walks", 10), + walk_length=args.get("walk_length", 40), + window_size=args.get("window_size", 2), + iterations=args.get("iterations", 3), + random_seed=args.get("random_seed", 86), + ) + + pairs = zip(embeddings.nodes, embeddings.embeddings.tolist(), strict=True) + sorted_pairs = sorted(pairs, key=lambda x: x[0]) + + return dict(sorted_pairs) diff --git a/graphrag/index/verbs/graph/embed/typing.py b/graphrag/index/verbs/graph/embed/typing.py new file mode 100644 index 00000000..fea792c9 --- /dev/null +++ b/graphrag/index/verbs/graph/embed/typing.py @@ -0,0 +1,12 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing different lists and dictionaries.""" + +# Use this for now instead of a wrapper +from typing import Any + +NodeList = list[str] +EmbeddingList = list[Any] +NodeEmbeddings = dict[str, list[float]] +"""Label -> Embedding""" diff --git a/graphrag/index/verbs/graph/layout/__init__.py b/graphrag/index/verbs/graph/layout/__init__.py new file mode 100644 index 00000000..74584f83 --- /dev/null +++ b/graphrag/index/verbs/graph/layout/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine graph layout package root.""" + +from .layout_graph import layout_graph + +__all__ = ["layout_graph"] diff --git a/graphrag/index/verbs/graph/layout/layout_graph.py b/graphrag/index/verbs/graph/layout/layout_graph.py new file mode 100644 index 00000000..e1b55b11 --- /dev/null +++ b/graphrag/index/verbs/graph/layout/layout_graph.py @@ -0,0 +1,139 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing layout_graph, _run_layout and _apply_layout_to_graph methods definition.""" + +from enum import Enum +from typing import Any, cast + +import networkx as nx +import pandas as pd +from datashaper import TableContainer, VerbCallbacks, VerbInput, progress_callback, verb + +from graphrag.index.graph.visualization import GraphLayout +from graphrag.index.utils import load_graph +from graphrag.index.verbs.graph.embed.typing import NodeEmbeddings + + +class LayoutGraphStrategyType(str, Enum): + """LayoutGraphStrategyType class definition.""" + + umap = "umap" + zero = "zero" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' + + +@verb(name="layout_graph") +def layout_graph( + input: VerbInput, + callbacks: VerbCallbacks, + strategy: dict[str, Any], + embeddings_column: str, + graph_column: str, + to: str, + graph_to: str | None = None, + **_kwargs: dict, +) -> TableContainer: + """ + Apply a layout algorithm to a graph. The graph is expected to be in graphml format. The verb outputs a new column containing the laid out graph. + + ## Usage + ```yaml + verb: layout_graph + args: + graph_column: clustered_graph # The name of the column containing the graph, should be a graphml graph + embeddings_column: embeddings # The name of the column containing the embeddings + to: node_positions # The name of the column to output the node positions to + graph_to: positioned_graph # The name of the column to output the positioned graph to + strategy: # See strategies section below + ``` + + ## Strategies + The layout graph verb uses a strategy to layout the graph. The strategy is a json object which defines the strategy to use. The following strategies are available: + + ### umap + This strategy uses the umap algorithm to layout a graph. The strategy config is as follows: + ```yaml + strategy: + type: umap + n_neighbors: 5 # Optional, The number of neighbors to use for the umap algorithm, default: 5 + min_dist: 0.75 # Optional, The min distance to use for the umap algorithm, default: 0.75 + ``` + """ + output_df = cast(pd.DataFrame, input.get_input()) + + num_items = len(output_df) + strategy_type = strategy.get("type", LayoutGraphStrategyType.umap) + strategy_args = {**strategy} + + has_embeddings = embeddings_column in output_df.columns + + layouts = output_df.apply( + progress_callback( + lambda row: _run_layout( + strategy_type, + row[graph_column], + row[embeddings_column] if has_embeddings else {}, + strategy_args, + callbacks, + ), + callbacks.progress, + num_items, + ), + axis=1, + ) + output_df[to] = layouts.apply(lambda layout: [pos.to_pandas() for pos in layout]) + if graph_to is not None: + output_df[graph_to] = output_df.apply( + lambda row: _apply_layout_to_graph( + row[graph_column], cast(GraphLayout, layouts[row.name]) + ), + axis=1, + ) + return TableContainer(table=output_df) + + +def _run_layout( + strategy: LayoutGraphStrategyType, + graphml_or_graph: str | nx.Graph, + embeddings: NodeEmbeddings, + args: dict[str, Any], + reporter: VerbCallbacks, +) -> GraphLayout: + graph = load_graph(graphml_or_graph) + match strategy: + case LayoutGraphStrategyType.umap: + from .methods.umap import run as run_umap + + return run_umap( + graph, + embeddings, + args, + lambda e, stack, d: reporter.error("Error in Umap", e, stack, d), + ) + case LayoutGraphStrategyType.zero: + from .methods.zero import run as run_zero + + return run_zero( + graph, + args, + lambda e, stack, d: reporter.error("Error in Zero", e, stack, d), + ) + case _: + msg = f"Unknown strategy {strategy}" + raise ValueError(msg) + + +def _apply_layout_to_graph( + graphml_or_graph: str | nx.Graph, layout: GraphLayout +) -> str: + graph = load_graph(graphml_or_graph) + for node_position in layout: + if node_position.label in graph.nodes: + graph.nodes[node_position.label]["x"] = node_position.x + graph.nodes[node_position.label]["y"] = node_position.y + graph.nodes[node_position.label]["size"] = node_position.size + return "\n".join(nx.generate_graphml(graph)) diff --git a/graphrag/index/verbs/graph/layout/methods/__init__.py b/graphrag/index/verbs/graph/layout/methods/__init__.py new file mode 100644 index 00000000..5d505412 --- /dev/null +++ b/graphrag/index/verbs/graph/layout/methods/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Graph Layout Methods.""" diff --git a/graphrag/index/verbs/graph/layout/methods/umap.py b/graphrag/index/verbs/graph/layout/methods/umap.py new file mode 100644 index 00000000..a4bc7c28 --- /dev/null +++ b/graphrag/index/verbs/graph/layout/methods/umap.py @@ -0,0 +1,82 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing run and _create_node_position methods definitions.""" + +import logging +import traceback +from typing import Any + +import networkx as nx +import numpy as np + +from graphrag.index.graph.visualization import ( + GraphLayout, + NodePosition, + compute_umap_positions, +) +from graphrag.index.typing import ErrorHandlerFn +from graphrag.index.verbs.graph.embed.typing import NodeEmbeddings + +# TODO: This could be handled more elegantly, like what columns to use +# for "size" or "cluster" +# We could also have a boolean to indicate to use node sizes or clusters + +log = logging.getLogger(__name__) + + +def run( + graph: nx.Graph, + embeddings: NodeEmbeddings, + args: dict[str, Any], + on_error: ErrorHandlerFn, +) -> GraphLayout: + """Run method definition.""" + node_clusters = [] + node_sizes = [] + + embeddings = _filter_raw_embeddings(embeddings) + nodes = list(embeddings.keys()) + embedding_vectors = [embeddings[node_id] for node_id in nodes] + + for node_id in nodes: + node = graph.nodes[node_id] + cluster = node.get("cluster", node.get("community", -1)) + node_clusters.append(cluster) + size = node.get("degree", node.get("size", 0)) + node_sizes.append(size) + + additional_args = {} + if len(node_clusters) > 0: + additional_args["node_categories"] = node_clusters + if len(node_sizes) > 0: + additional_args["node_sizes"] = node_sizes + + try: + return compute_umap_positions( + embedding_vectors=np.array(embedding_vectors), + node_labels=nodes, + **additional_args, + min_dist=args.get("min_dist", 0.75), + n_neighbors=args.get("n_neighbors", 5), + ) + except Exception as e: + log.exception("Error running UMAP") + on_error(e, traceback.format_exc(), None) + # Umap may fail due to input sparseness or memory pressure. + # For now, in these cases, we'll just return a layout with all nodes at (0, 0) + result = [] + for i in range(len(nodes)): + cluster = node_clusters[i] if len(node_clusters) > 0 else 1 + result.append( + NodePosition(x=0, y=0, label=nodes[i], size=0, cluster=str(cluster)) + ) + return result + + +def _filter_raw_embeddings(embeddings: NodeEmbeddings) -> NodeEmbeddings: + return { + node_id: embedding + for node_id, embedding in embeddings.items() + if embedding is not None + } diff --git a/graphrag/index/verbs/graph/layout/methods/zero.py b/graphrag/index/verbs/graph/layout/methods/zero.py new file mode 100644 index 00000000..f41d2d4c --- /dev/null +++ b/graphrag/index/verbs/graph/layout/methods/zero.py @@ -0,0 +1,63 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing run and _create_node_position methods definitions.""" + +import logging +import traceback +from typing import Any + +import networkx as nx + +from graphrag.index.graph.visualization import ( + GraphLayout, + NodePosition, + get_zero_positions, +) +from graphrag.index.typing import ErrorHandlerFn + +# TODO: This could be handled more elegantly, like what columns to use +# for "size" or "cluster" +# We could also have a boolean to indicate to use node sizes or clusters + +log = logging.getLogger(__name__) + + +def run( + graph: nx.Graph, + _args: dict[str, Any], + on_error: ErrorHandlerFn, +) -> GraphLayout: + """Run method definition.""" + node_clusters = [] + node_sizes = [] + + nodes = list(graph.nodes) + + for node_id in nodes: + node = graph.nodes[node_id] + cluster = node.get("cluster", node.get("community", -1)) + node_clusters.append(cluster) + size = node.get("degree", node.get("size", 0)) + node_sizes.append(size) + + additional_args = {} + if len(node_clusters) > 0: + additional_args["node_categories"] = node_clusters + if len(node_sizes) > 0: + additional_args["node_sizes"] = node_sizes + + try: + return get_zero_positions(node_labels=nodes, **additional_args) + except Exception as e: + log.exception("Error running zero-position") + on_error(e, traceback.format_exc(), None) + # Umap may fail due to input sparseness or memory pressure. + # For now, in these cases, we'll just return a layout with all nodes at (0, 0) + result = [] + for i in range(len(nodes)): + cluster = node_clusters[i] if len(node_clusters) > 0 else 1 + result.append( + NodePosition(x=0, y=0, label=nodes[i], size=0, cluster=str(cluster)) + ) + return result diff --git a/graphrag/index/verbs/graph/merge/__init__.py b/graphrag/index/verbs/graph/merge/__init__.py new file mode 100644 index 00000000..f7188279 --- /dev/null +++ b/graphrag/index/verbs/graph/merge/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine graph merge package root.""" + +from .merge_graphs import merge_graphs + +__all__ = ["merge_graphs"] diff --git a/graphrag/index/verbs/graph/merge/defaults.py b/graphrag/index/verbs/graph/merge/defaults.py new file mode 100644 index 00000000..80c60331 --- /dev/null +++ b/graphrag/index/verbs/graph/merge/defaults.py @@ -0,0 +1,21 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A file containing DEFAULT_NODE_OPERATIONS, DEFAULT_EDGE_OPERATIONS and DEFAULT_CONCAT_SEPARATOR values definition.""" + +from .typing import BasicMergeOperation + +DEFAULT_NODE_OPERATIONS = { + "*": { + "operation": BasicMergeOperation.Replace, + } +} + +DEFAULT_EDGE_OPERATIONS = { + "*": { + "operation": BasicMergeOperation.Replace, + }, + "weight": "sum", +} + +DEFAULT_CONCAT_SEPARATOR = "," diff --git a/graphrag/index/verbs/graph/merge/merge_graphs.py b/graphrag/index/verbs/graph/merge/merge_graphs.py new file mode 100644 index 00000000..8ab3fa47 --- /dev/null +++ b/graphrag/index/verbs/graph/merge/merge_graphs.py @@ -0,0 +1,217 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing merge_graphs, merge_nodes, merge_edges, merge_attributes, apply_merge_operation and _get_detailed_attribute_merge_operation methods definitions.""" + +from typing import Any, cast + +import networkx as nx +import pandas as pd +from datashaper import TableContainer, VerbCallbacks, VerbInput, progress_iterable, verb + +from graphrag.index.utils import load_graph + +from .defaults import ( + DEFAULT_CONCAT_SEPARATOR, + DEFAULT_EDGE_OPERATIONS, + DEFAULT_NODE_OPERATIONS, +) +from .typing import ( + BasicMergeOperation, + DetailedAttributeMergeOperation, + NumericOperation, + StringOperation, +) + + +@verb(name="merge_graphs") +def merge_graphs( + input: VerbInput, + callbacks: VerbCallbacks, + column: str, + to: str, + nodes: dict[str, Any] = DEFAULT_NODE_OPERATIONS, + edges: dict[str, Any] = DEFAULT_EDGE_OPERATIONS, + **_kwargs, +) -> TableContainer: + """ + Merge multiple graphs together. The graphs are expected to be in graphml format. The verb outputs a new column containing the merged graph. + + > Note: This will merge all rows into a single graph. + + ## Usage + ```yaml + verb: merge_graph + args: + column: clustered_graph # The name of the column containing the graph, should be a graphml graph + to: merged_graph # The name of the column to output the merged graph to + nodes: # See node operations section below + edges: # See edge operations section below + ``` + + ## Node Operations + The merge graph verb can perform operations on the nodes of the graph. + + ### Usage + ```yaml + nodes: + : + ... for each attribute or use the special value "*" for all attributes + ``` + + ## Edge Operations + The merge graph verb can perform operations on the nodes of the graph. + + ### Usage + ```yaml + edges: + : + ... for each attribute or use the special value "*" for all attributes + ``` + + ## Operations + The merge graph verb can perform operations on the nodes and edges of the graph. The following operations are available: + + - __replace__: This operation replaces the attribute with the last value seen. + - __skip__: This operation skips the attribute, and just uses the first value seen. + - __concat__: This operation concatenates the attribute with the last value seen. + - __sum__: This operation sums the attribute with the last value seen. + - __max__: This operation takes the max of the attribute with the last value seen. + max + - __min__: This operation takes the min of the attribute with the last value seen. + - __average__: This operation takes the mean of the attribute with the last value seen. + - __multiply__: This operation multiplies the attribute with the last value seen. + """ + input_df = input.get_input() + output = pd.DataFrame() + + node_ops = { + attrib: _get_detailed_attribute_merge_operation(value) + for attrib, value in nodes.items() + } + edge_ops = { + attrib: _get_detailed_attribute_merge_operation(value) + for attrib, value in edges.items() + } + + mega_graph = nx.Graph() + num_total = len(input_df) + for graphml in progress_iterable(input_df[column], callbacks.progress, num_total): + graph = load_graph(cast(str | nx.Graph, graphml)) + merge_nodes(mega_graph, graph, node_ops) + merge_edges(mega_graph, graph, edge_ops) + + output[to] = ["\n".join(nx.generate_graphml(mega_graph))] + + return TableContainer(table=output) + + +def merge_nodes( + target: nx.Graph, + subgraph: nx.Graph, + node_ops: dict[str, DetailedAttributeMergeOperation], +): + """Merge nodes from subgraph into target using the operations defined in node_ops.""" + for node in subgraph.nodes: + if node not in target.nodes: + target.add_node(node, **(subgraph.nodes[node] or {})) + else: + merge_attributes(target.nodes[node], subgraph.nodes[node], node_ops) + + +def merge_edges( + target_graph: nx.Graph, + subgraph: nx.Graph, + edge_ops: dict[str, DetailedAttributeMergeOperation], +): + """Merge edges from subgraph into target using the operations defined in edge_ops.""" + for source, target, edge_data in subgraph.edges(data=True): # type: ignore + if not target_graph.has_edge(source, target): + target_graph.add_edge(source, target, **(edge_data or {})) + else: + merge_attributes(target_graph.edges[(source, target)], edge_data, edge_ops) + + +def merge_attributes( + target_item: dict[str, Any] | None, + source_item: dict[str, Any] | None, + ops: dict[str, DetailedAttributeMergeOperation], +): + """Merge attributes from source_item into target_item using the operations defined in ops.""" + source_item = source_item or {} + target_item = target_item or {} + for op_attrib, op in ops.items(): + if op_attrib == "*": + for attrib in source_item: + # If there is a specific handler for this attribute, use it + # i.e. * provides a default, but you can override it + if attrib not in ops: + apply_merge_operation(target_item, source_item, attrib, op) + else: + if op_attrib in source_item or op_attrib in target_item: + apply_merge_operation(target_item, source_item, op_attrib, op) + + +def apply_merge_operation( + target_item: dict[str, Any] | None, + source_item: dict[str, Any] | None, + attrib: str, + op: DetailedAttributeMergeOperation, +): + """Apply the merge operation to the attribute.""" + source_item = source_item or {} + target_item = target_item or {} + + if ( + op.operation == BasicMergeOperation.Replace + or op.operation == StringOperation.Replace + ): + target_item[attrib] = source_item.get(attrib, None) or "" + elif ( + op.operation == BasicMergeOperation.Skip or op.operation == StringOperation.Skip + ): + target_item[attrib] = target_item.get(attrib, None) or "" + elif op.operation == StringOperation.Concat: + separator = op.separator or DEFAULT_CONCAT_SEPARATOR + target_attrib = target_item.get(attrib, "") or "" + source_attrib = source_item.get(attrib, "") or "" + target_item[attrib] = f"{target_attrib}{separator}{source_attrib}" + if op.distinct: + # TODO: Slow + target_item[attrib] = separator.join( + sorted(set(target_item[attrib].split(separator))) + ) + + # We're assuming that the attribute is numeric + elif op.operation == NumericOperation.Sum: + target_item[attrib] = (target_item.get(attrib, 0) or 0) + ( + source_item.get(attrib, 0) or 0 + ) + elif op.operation == NumericOperation.Average: + target_item[attrib] = ( + (target_item.get(attrib, 0) or 0) + (source_item.get(attrib, 0) or 0) + ) / 2 + elif op.operation == NumericOperation.Max: + target_item[attrib] = max( + (target_item.get(attrib, 0) or 0), (source_item.get(attrib, 0) or 0) + ) + elif op.operation == NumericOperation.Min: + target_item[attrib] = min( + (target_item.get(attrib, 0) or 0), (source_item.get(attrib, 0) or 0) + ) + elif op.operation == NumericOperation.Multiply: + target_item[attrib] = (target_item.get(attrib, 1) or 1) * ( + source_item.get(attrib, 1) or 1 + ) + else: + msg = f"Invalid operation {op.operation}" + raise ValueError(msg) + + +def _get_detailed_attribute_merge_operation( + value: str | dict[str, Any], +) -> DetailedAttributeMergeOperation: + """Normalize the AttributeMergeOperation into a DetailedAttributeMergeOperation.""" + if isinstance(value, str): + return DetailedAttributeMergeOperation(operation=value) + return DetailedAttributeMergeOperation(**value) diff --git a/graphrag/index/verbs/graph/merge/typing.py b/graphrag/index/verbs/graph/merge/typing.py new file mode 100644 index 00000000..0e534f51 --- /dev/null +++ b/graphrag/index/verbs/graph/merge/typing.py @@ -0,0 +1,49 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'BasicMergeOperation', 'StringOperation', 'NumericOperation' and 'DetailedAttributeMergeOperation' models.""" + +from dataclasses import dataclass +from enum import Enum + + +class BasicMergeOperation(str, Enum): + """Basic Merge Operation class definition.""" + + Replace = "replace" + Skip = "skip" + + +class StringOperation(str, Enum): + """String Operation class definition.""" + + Concat = "concat" + Replace = "replace" + Skip = "skip" + + +class NumericOperation(str, Enum): + """Numeric Operation class definition.""" + + Sum = "sum" + Average = "average" + Max = "max" + Min = "min" + Multiply = "multiply" + Replace = "replace" + Skip = "skip" + + +@dataclass +class DetailedAttributeMergeOperation: + """Detailed attribute merge operation class definition.""" + + operation: str # StringOperation | NumericOperation + + # concat + separator: str | None = None + delimiter: str | None = None + distinct: bool = False + + +AttributeMergeOperation = str | DetailedAttributeMergeOperation diff --git a/graphrag/index/verbs/graph/report/__init__.py b/graphrag/index/verbs/graph/report/__init__.py new file mode 100644 index 00000000..e47d9cce --- /dev/null +++ b/graphrag/index/verbs/graph/report/__init__.py @@ -0,0 +1,25 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine graph report package root.""" + +from .create_community_reports import ( + CreateCommunityReportsStrategyType, + create_community_reports, +) +from .prepare_community_reports import prepare_community_reports +from .prepare_community_reports_claims import prepare_community_reports_claims +from .prepare_community_reports_edges import prepare_community_reports_edges +from .prepare_community_reports_nodes import prepare_community_reports_nodes +from .restore_community_hierarchy import restore_community_hierarchy + +__all__ = [ + "CreateCommunityReportsStrategyType", + "create_community_reports", + "create_community_reports", + "prepare_community_reports", + "prepare_community_reports_claims", + "prepare_community_reports_edges", + "prepare_community_reports_nodes", + "restore_community_hierarchy", +] diff --git a/graphrag/index/verbs/graph/report/create_community_reports.py b/graphrag/index/verbs/graph/report/create_community_reports.py new file mode 100644 index 00000000..c67d5107 --- /dev/null +++ b/graphrag/index/verbs/graph/report/create_community_reports.py @@ -0,0 +1,131 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing create_community_reports and load_strategy methods definition.""" + +import logging +from enum import Enum +from typing import cast + +import pandas as pd +from datashaper import ( + AsyncType, + NoopVerbCallbacks, + TableContainer, + VerbCallbacks, + VerbInput, + derive_from_rows, + progress_ticker, + verb, +) + +import graphrag.config.defaults as defaults +import graphrag.index.graph.extractors.community_reports.schemas as schemas +from graphrag.index.cache import PipelineCache +from graphrag.index.graph.extractors.community_reports import ( + get_levels, + prep_community_report_context, +) +from graphrag.index.utils.ds_util import get_required_input_table + +from .strategies.typing import CommunityReport, CommunityReportsStrategy + +log = logging.getLogger(__name__) + + +class CreateCommunityReportsStrategyType(str, Enum): + """CreateCommunityReportsStrategyType class definition.""" + + graph_intelligence = "graph_intelligence" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' + + +@verb(name="create_community_reports") +async def create_community_reports( + input: VerbInput, + callbacks: VerbCallbacks, + cache: PipelineCache, + strategy: dict, + async_mode: AsyncType = AsyncType.AsyncIO, + num_threads: int = 4, + **_kwargs, +) -> TableContainer: + """Generate entities for each row, and optionally a graph of those entities.""" + log.debug("create_community_reports strategy=%s", strategy) + local_contexts = cast(pd.DataFrame, input.get_input()) + nodes_ctr = get_required_input_table(input, "nodes") + nodes = cast(pd.DataFrame, nodes_ctr.table) + community_hierarchy_ctr = get_required_input_table(input, "community_hierarchy") + community_hierarchy = cast(pd.DataFrame, community_hierarchy_ctr.table) + + levels = get_levels(nodes) + reports: list[CommunityReport | None] = [] + tick = progress_ticker(callbacks.progress, len(local_contexts)) + runner = load_strategy(strategy["type"]) + + for level in levels: + level_contexts = prep_community_report_context( + pd.DataFrame(reports), + local_context_df=local_contexts, + community_hierarchy_df=community_hierarchy, + level=level, + max_tokens=strategy.get( + "max_input_tokens", defaults.COMMUNITY_REPORT_MAX_INPUT_LENGTH + ), + ) + + async def run_generate(record): + result = await _generate_report( + runner, + community_id=record[schemas.NODE_COMMUNITY], + community_level=record[schemas.COMMUNITY_LEVEL], + community_context=record[schemas.CONTEXT_STRING], + cache=cache, + callbacks=callbacks, + strategy=strategy, + ) + tick() + return result + + local_reports = await derive_from_rows( + level_contexts, + run_generate, + callbacks=NoopVerbCallbacks(), + num_threads=num_threads, + scheduling_type=async_mode, + ) + reports.extend([lr for lr in local_reports if lr is not None]) + + return TableContainer(table=pd.DataFrame(reports)) + + +async def _generate_report( + runner: CommunityReportsStrategy, + cache: PipelineCache, + callbacks: VerbCallbacks, + strategy: dict, + community_id: int | str, + community_level: int, + community_context: str, +) -> CommunityReport | None: + """Generate a report for a single community.""" + return await runner( + community_id, community_context, community_level, callbacks, cache, strategy + ) + + +def load_strategy( + strategy: CreateCommunityReportsStrategyType, +) -> CommunityReportsStrategy: + """Load strategy method definition.""" + match strategy: + case CreateCommunityReportsStrategyType.graph_intelligence: + from .strategies.graph_intelligence import run + + return run + case _: + msg = f"Unknown strategy: {strategy}" + raise ValueError(msg) diff --git a/graphrag/index/verbs/graph/report/prepare_community_reports.py b/graphrag/index/verbs/graph/report/prepare_community_reports.py new file mode 100644 index 00000000..3c9ebd45 --- /dev/null +++ b/graphrag/index/verbs/graph/report/prepare_community_reports.py @@ -0,0 +1,187 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing create_community_reports and load_strategy methods definition.""" + +import logging +from typing import cast + +import pandas as pd +from datashaper import ( + TableContainer, + VerbCallbacks, + VerbInput, + progress_iterable, + verb, +) + +import graphrag.index.graph.extractors.community_reports.schemas as schemas +from graphrag.index.graph.extractors.community_reports import ( + filter_claims_to_nodes, + filter_edges_to_nodes, + filter_nodes_to_level, + get_levels, + set_context_exceeds_flag, + set_context_size, + sort_context, +) +from graphrag.index.utils.ds_util import get_named_input_table, get_required_input_table + +log = logging.getLogger(__name__) + + +@verb(name="prepare_community_reports") +def prepare_community_reports( + input: VerbInput, + callbacks: VerbCallbacks, + max_tokens: int = 16_000, + **_kwargs, +) -> TableContainer: + """Generate entities for each row, and optionally a graph of those entities.""" + # Prepare Community Reports + node_df = cast(pd.DataFrame, get_required_input_table(input, "nodes").table) + edge_df = cast(pd.DataFrame, get_required_input_table(input, "edges").table) + claim_df = get_named_input_table(input, "claims") + if claim_df is not None: + claim_df = cast(pd.DataFrame, claim_df.table) + + levels = get_levels(node_df, schemas.NODE_LEVEL) + dfs = [] + + for level in progress_iterable(levels, callbacks.progress, len(levels)): + communities_at_level_df = _prepare_reports_at_level( + node_df, edge_df, claim_df, level, max_tokens + ) + dfs.append(communities_at_level_df) + + # build initial local context for all communities + return TableContainer(table=pd.concat(dfs)) + + +def _prepare_reports_at_level( + node_df: pd.DataFrame, + edge_df: pd.DataFrame, + claim_df: pd.DataFrame | None, + level: int, + max_tokens: int = 16_000, + community_id_column: str = schemas.COMMUNITY_ID, + node_id_column: str = schemas.NODE_ID, + node_name_column: str = schemas.NODE_NAME, + node_details_column: str = schemas.NODE_DETAILS, + node_level_column: str = schemas.NODE_LEVEL, + node_degree_column: str = schemas.NODE_DEGREE, + node_community_column: str = schemas.NODE_COMMUNITY, + edge_id_column: str = schemas.EDGE_ID, + edge_source_column: str = schemas.EDGE_SOURCE, + edge_target_column: str = schemas.EDGE_TARGET, + edge_degree_column: str = schemas.EDGE_DEGREE, + edge_details_column: str = schemas.EDGE_DETAILS, + claim_id_column: str = schemas.CLAIM_ID, + claim_subject_column: str = schemas.CLAIM_SUBJECT, + claim_details_column: str = schemas.CLAIM_DETAILS, +): + def get_edge_details(node_df: pd.DataFrame, edge_df: pd.DataFrame, name_col: str): + return node_df.merge( + cast( + pd.DataFrame, + edge_df[[name_col, schemas.EDGE_DETAILS]], + ).rename(columns={name_col: schemas.NODE_NAME}), + on=schemas.NODE_NAME, + how="left", + ) + + level_node_df = filter_nodes_to_level(node_df, level) + log.info("Number of nodes at level=%s => %s", level, len(level_node_df)) + nodes = level_node_df[node_name_column].tolist() + + # Filter edges & claims to those containing the target nodes + level_edge_df = filter_edges_to_nodes(edge_df, nodes) + level_claim_df = ( + filter_claims_to_nodes(claim_df, nodes) if claim_df is not None else None + ) + + # concat all edge details per node + merged_node_df = pd.concat( + [ + get_edge_details(level_node_df, level_edge_df, edge_source_column), + get_edge_details(level_node_df, level_edge_df, edge_target_column), + ], + axis=0, + ) + merged_node_df = ( + merged_node_df.groupby([ + node_name_column, + node_community_column, + node_degree_column, + node_level_column, + ]) + .agg({node_details_column: "first", edge_details_column: list}) + .reset_index() + ) + + # concat claim details per node + if level_claim_df is not None: + merged_node_df = merged_node_df.merge( + cast( + pd.DataFrame, + level_claim_df[[claim_subject_column, claim_details_column]], + ).rename(columns={claim_subject_column: node_name_column}), + on=node_name_column, + how="left", + ) + merged_node_df = ( + merged_node_df.groupby([ + node_name_column, + node_community_column, + node_level_column, + node_degree_column, + ]) + .agg({ + node_details_column: "first", + edge_details_column: "first", + **({claim_details_column: list} if level_claim_df is not None else {}), + }) + .reset_index() + ) + + # concat all node details, including name, degree, node_details, edge_details, and claim_details + merged_node_df[schemas.ALL_CONTEXT] = merged_node_df.apply( + lambda x: { + node_name_column: x[node_name_column], + node_degree_column: x[node_degree_column], + node_details_column: x[node_details_column], + edge_details_column: x[edge_details_column], + claim_details_column: x[claim_details_column] + if level_claim_df is not None + else [], + }, + axis=1, + ) + + # group all node details by community + community_df = ( + merged_node_df.groupby(node_community_column) + .agg({schemas.ALL_CONTEXT: list}) + .reset_index() + ) + community_df[schemas.CONTEXT_STRING] = community_df[schemas.ALL_CONTEXT].apply( + lambda x: sort_context( + x, + node_id_column=node_id_column, + node_name_column=node_name_column, + node_details_column=node_details_column, + edge_id_column=edge_id_column, + edge_details_column=edge_details_column, + edge_degree_column=edge_degree_column, + edge_source_column=edge_source_column, + edge_target_column=edge_target_column, + claim_id_column=claim_id_column, + claim_details_column=claim_details_column, + community_id_column=community_id_column, + ) + ) + set_context_size(community_df) + set_context_exceeds_flag(community_df, max_tokens) + + community_df[schemas.COMMUNITY_LEVEL] = level + return community_df diff --git a/graphrag/index/verbs/graph/report/prepare_community_reports_claims.py b/graphrag/index/verbs/graph/report/prepare_community_reports_claims.py new file mode 100644 index 00000000..aa9a7907 --- /dev/null +++ b/graphrag/index/verbs/graph/report/prepare_community_reports_claims.py @@ -0,0 +1,50 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing create_graph, _get_node_attributes, _get_edge_attributes and _get_attribute_column_mapping methods definition.""" + +from typing import cast + +import pandas as pd +from datashaper import TableContainer, VerbInput, verb + +from graphrag.index.graph.extractors.community_reports.schemas import ( + CLAIM_DESCRIPTION, + CLAIM_DETAILS, + CLAIM_ID, + CLAIM_STATUS, + CLAIM_SUBJECT, + CLAIM_TYPE, +) + +_MISSING_DESCRIPTION = "No Description" + + +@verb(name="prepare_community_reports_claims") +def prepare_community_reports_claims( + input: VerbInput, + to: str = CLAIM_DETAILS, + id_column: str = CLAIM_ID, + description_column: str = CLAIM_DESCRIPTION, + subject_column: str = CLAIM_SUBJECT, + type_column: str = CLAIM_TYPE, + status_column: str = CLAIM_STATUS, + **_kwargs, +) -> TableContainer: + """Merge claim details into an object.""" + claim_df: pd.DataFrame = cast(pd.DataFrame, input.get_input()) + claim_df = claim_df.fillna(value={description_column: _MISSING_DESCRIPTION}) + + # merge values of five columns into a map column + claim_df[to] = claim_df.apply( + lambda x: { + id_column: x[id_column], + subject_column: x[subject_column], + type_column: x[type_column], + status_column: x[status_column], + description_column: x[description_column], + }, + axis=1, + ) + + return TableContainer(table=claim_df) diff --git a/graphrag/index/verbs/graph/report/prepare_community_reports_edges.py b/graphrag/index/verbs/graph/report/prepare_community_reports_edges.py new file mode 100644 index 00000000..b568aba0 --- /dev/null +++ b/graphrag/index/verbs/graph/report/prepare_community_reports_edges.py @@ -0,0 +1,48 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing create_graph, _get_node_attributes, _get_edge_attributes and _get_attribute_column_mapping methods definition.""" + +from typing import cast + +import pandas as pd +from datashaper import TableContainer, VerbInput, verb + +from graphrag.index.graph.extractors.community_reports.schemas import ( + EDGE_DEGREE, + EDGE_DESCRIPTION, + EDGE_DETAILS, + EDGE_ID, + EDGE_SOURCE, + EDGE_TARGET, +) + +_MISSING_DESCRIPTION = "No Description" + + +@verb(name="prepare_community_reports_edges") +def prepare_community_reports_edges( + input: VerbInput, + to: str = EDGE_DETAILS, + id_column: str = EDGE_ID, + source_column: str = EDGE_SOURCE, + target_column: str = EDGE_TARGET, + description_column: str = EDGE_DESCRIPTION, + degree_column: str = EDGE_DEGREE, + **_kwargs, +) -> TableContainer: + """Merge edge details into an object.""" + edge_df: pd.DataFrame = cast(pd.DataFrame, input.get_input()).fillna( + value={description_column: _MISSING_DESCRIPTION} + ) + edge_df[to] = edge_df.apply( + lambda x: { + id_column: x[id_column], + source_column: x[source_column], + target_column: x[target_column], + description_column: x[description_column], + degree_column: x[degree_column], + }, + axis=1, + ) + return TableContainer(table=edge_df) diff --git a/graphrag/index/verbs/graph/report/prepare_community_reports_nodes.py b/graphrag/index/verbs/graph/report/prepare_community_reports_nodes.py new file mode 100644 index 00000000..f159c125 --- /dev/null +++ b/graphrag/index/verbs/graph/report/prepare_community_reports_nodes.py @@ -0,0 +1,46 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing create_graph, _get_node_attributes, _get_edge_attributes and _get_attribute_column_mapping methods definition.""" + +from typing import cast + +import pandas as pd +from datashaper import TableContainer, VerbInput, verb + +from graphrag.index.graph.extractors.community_reports.schemas import ( + NODE_DEGREE, + NODE_DESCRIPTION, + NODE_DETAILS, + NODE_ID, + NODE_NAME, +) + +_MISSING_DESCRIPTION = "No Description" + + +@verb(name="prepare_community_reports_nodes") +def prepare_community_reports_nodes( + input: VerbInput, + to: str = NODE_DETAILS, + id_column: str = NODE_ID, + name_column: str = NODE_NAME, + description_column: str = NODE_DESCRIPTION, + degree_column: str = NODE_DEGREE, + **_kwargs, +) -> TableContainer: + """Merge edge details into an object.""" + node_df = cast(pd.DataFrame, input.get_input()) + node_df = node_df.fillna(value={description_column: _MISSING_DESCRIPTION}) + + # merge values of four columns into a map column + node_df[to] = node_df.apply( + lambda x: { + id_column: x[id_column], + name_column: x[name_column], + description_column: x[description_column], + degree_column: x[degree_column], + }, + axis=1, + ) + return TableContainer(table=node_df) diff --git a/graphrag/index/verbs/graph/report/restore_community_hierarchy.py b/graphrag/index/verbs/graph/report/restore_community_hierarchy.py new file mode 100644 index 00000000..437369f0 --- /dev/null +++ b/graphrag/index/verbs/graph/report/restore_community_hierarchy.py @@ -0,0 +1,78 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing create_graph, _get_node_attributes, _get_edge_attributes and _get_attribute_column_mapping methods definition.""" + +import logging +from typing import cast + +import pandas as pd +from datashaper import TableContainer, VerbInput, verb + +import graphrag.index.graph.extractors.community_reports.schemas as schemas + +log = logging.getLogger(__name__) + + +@verb(name="restore_community_hierarchy") +def restore_community_hierarchy( + input: VerbInput, + name_column: str = schemas.NODE_NAME, + community_column: str = schemas.NODE_COMMUNITY, + level_column: str = schemas.NODE_LEVEL, + **_kwargs, +) -> TableContainer: + """Restore the community hierarchy from the node data.""" + node_df: pd.DataFrame = cast(pd.DataFrame, input.get_input()) + community_df = ( + node_df.groupby([community_column, level_column]) + .agg({name_column: list}) + .reset_index() + ) + community_levels = {} + for _, row in community_df.iterrows(): + level = row[level_column] + name = row[name_column] + community = row[community_column] + + if community_levels.get(level) is None: + community_levels[level] = {} + community_levels[level][community] = name + + # get unique levels, sorted in ascending order + levels = sorted(community_levels.keys()) + + community_hierarchy = [] + + for idx in range(len(levels) - 1): + level = levels[idx] + log.debug("Level: %s", level) + next_level = levels[idx + 1] + current_level_communities = community_levels[level] + next_level_communities = community_levels[next_level] + log.debug( + "Number of communities at level %s: %s", + level, + len(current_level_communities), + ) + + for current_community in current_level_communities: + current_entities = current_level_communities[current_community] + + # loop through next level's communities to find all the subcommunities + entities_found = 0 + for next_level_community in next_level_communities: + next_entities = next_level_communities[next_level_community] + if set(next_entities).issubset(set(current_entities)): + community_hierarchy.append({ + community_column: current_community, + schemas.COMMUNITY_LEVEL: level, + schemas.SUB_COMMUNITY: next_level_community, + schemas.SUB_COMMUNITY_SIZE: len(next_entities), + }) + + entities_found += len(next_entities) + if entities_found == len(current_entities): + break + + return TableContainer(table=pd.DataFrame(community_hierarchy)) diff --git a/graphrag/index/verbs/graph/report/strategies/__init__.py b/graphrag/index/verbs/graph/report/strategies/__init__.py new file mode 100644 index 00000000..87d1f9e2 --- /dev/null +++ b/graphrag/index/verbs/graph/report/strategies/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine graph report strategies package root.""" diff --git a/graphrag/index/verbs/graph/report/strategies/graph_intelligence/__init__.py b/graphrag/index/verbs/graph/report/strategies/graph_intelligence/__init__.py new file mode 100644 index 00000000..7f51d790 --- /dev/null +++ b/graphrag/index/verbs/graph/report/strategies/graph_intelligence/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine graph report strategies graph intelligence package root.""" + +from .run_graph_intelligence import run + +__all__ = ["run"] diff --git a/graphrag/index/verbs/graph/report/strategies/graph_intelligence/defaults.py b/graphrag/index/verbs/graph/report/strategies/graph_intelligence/defaults.py new file mode 100644 index 00000000..708d48d2 --- /dev/null +++ b/graphrag/index/verbs/graph/report/strategies/graph_intelligence/defaults.py @@ -0,0 +1,26 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A file containing DEFAULT_CHUNK_SIZE and MOCK_RESPONSES definitions.""" + +import json + +DEFAULT_CHUNK_SIZE = 3000 +MOCK_RESPONSES = [ + json.dumps({ + "title": "", + "summary": "", + "rating": 2, + "rating_explanation": "", + "findings": [ + { + "summary": "", + "explanation": "", + "explanation": " CommunityReport | None: + """Run the graph intelligence entity extraction strategy.""" + llm_config = args.get( + "llm", {"type": LLMType.StaticResponse, "responses": MOCK_RESPONSES} + ) + llm_type = llm_config.get("type", LLMType.StaticResponse) + llm = load_llm( + "community_reporting", llm_type, reporter, pipeline_cache, llm_config + ) + return await _run_extractor(llm, community, input, level, args, reporter) + + +async def _run_extractor( + llm: CompletionLLM, + community: str | int, + input: str, + level: int, + args: StrategyConfig, + reporter: VerbCallbacks, +) -> CommunityReport | None: + extractor = CommunityReportsExtractor( + llm, + extraction_prompt=args.get("extraction_prompt", None), + max_report_length=args.get("max_report_length", None), + on_error=lambda e, stack, _data: reporter.error( + "Community Report Extraction Error", e, stack + ), + ) + + try: + results = await extractor({"input_text": input}) + report = results.structured_output + if report is None or len(report.keys()) == 0: + log.warning("No report found for community: %s", community) + return None + + return CommunityReport( + community=community, + full_content=results.output, + level=level, + rank=_parse_rank(report), + title=report.get("title", f"Community Report: {community}"), + rank_explanation=report.get("rating_explanation", ""), + summary=report.get("summary", ""), + findings=report.get("findings", []), + full_content_json=json.dumps(report, indent=4), + ) + except Exception as e: + log.exception("Error processing community: %s", community) + reporter.error("Community Report Extraction Error", e, traceback.format_exc()) + return None + + +def _parse_rank(report: dict) -> float: + rank = report.get("rating", -1) + try: + return float(rank) + except ValueError: + log.exception("Error parsing rank: %s defaulting to -1", rank) + return -1 diff --git a/graphrag/index/verbs/graph/report/strategies/typing.py b/graphrag/index/verbs/graph/report/strategies/typing.py new file mode 100644 index 00000000..087c7247 --- /dev/null +++ b/graphrag/index/verbs/graph/report/strategies/typing.py @@ -0,0 +1,52 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'Finding' and 'CommunityReport' models.""" + +from collections.abc import Awaitable, Callable +from typing import Any + +from datashaper import VerbCallbacks +from typing_extensions import TypedDict + +from graphrag.index.cache import PipelineCache + +ExtractedEntity = dict[str, Any] +StrategyConfig = dict[str, Any] +RowContext = dict[str, Any] +EntityTypes = list[str] +Claim = dict[str, Any] + + +class Finding(TypedDict): + """Finding class definition.""" + + summary: str + explanation: str + + +class CommunityReport(TypedDict): + """Community report class definition.""" + + community: str | int + title: str + summary: str + full_content: str + full_content_json: str + rank: float + level: int + rank_explanation: str + findings: list[Finding] + + +CommunityReportsStrategy = Callable[ + [ + str | int, + str, + int, + VerbCallbacks, + PipelineCache, + StrategyConfig, + ], + Awaitable[CommunityReport | None], +] diff --git a/graphrag/index/verbs/graph/unpack.py b/graphrag/index/verbs/graph/unpack.py new file mode 100644 index 00000000..ffb7f4b0 --- /dev/null +++ b/graphrag/index/verbs/graph/unpack.py @@ -0,0 +1,107 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing unpack_graph, _run_unpack, _unpack_nodes and _unpack_edges methods definition.""" + +from typing import Any, cast + +import networkx as nx +import pandas as pd +from datashaper import TableContainer, VerbCallbacks, VerbInput, progress_iterable, verb + +from graphrag.index.utils import load_graph + +default_copy = ["level"] + + +@verb(name="unpack_graph") +def unpack_graph( + input: VerbInput, + callbacks: VerbCallbacks, + column: str, + type: str, # noqa A002 + copy: list[str] | None = None, + embeddings_column: str = "embeddings", + **kwargs, +) -> TableContainer: + """ + Unpack nodes or edges from a graphml graph, into a list of nodes or edges. + + This verb will create columns for each attribute in a node or edge. + + ## Usage + ```yaml + verb: unpack_graph + args: + type: node # The type of data to unpack, one of: node, edge. node will create a node list, edge will create an edge list + column: # The name of the column containing the graph, should be a graphml graph + ``` + """ + if copy is None: + copy = default_copy + input_df = input.get_input() + num_total = len(input_df) + result = [] + copy = [col for col in copy if col in input_df.columns] + has_embeddings = embeddings_column in input_df.columns + + for _, row in progress_iterable(input_df.iterrows(), callbacks.progress, num_total): + # merge the original row with the unpacked graph item + cleaned_row = {col: row[col] for col in copy} + embeddings = ( + cast(dict[str, list[float]], row[embeddings_column]) + if has_embeddings + else {} + ) + + result.extend([ + {**cleaned_row, **graph_id} + for graph_id in _run_unpack( + cast(str | nx.Graph, row[column]), + type, + embeddings, + kwargs, + ) + ]) + + output_df = pd.DataFrame(result) + return TableContainer(table=output_df) + + +def _run_unpack( + graphml_or_graph: str | nx.Graph, + unpack_type: str, + embeddings: dict[str, list[float]], + args: dict[str, Any], +) -> list[dict[str, Any]]: + graph = load_graph(graphml_or_graph) + if unpack_type == "nodes": + return _unpack_nodes(graph, embeddings, args) + if unpack_type == "edges": + return _unpack_edges(graph, args) + msg = f"Unknown type {unpack_type}" + raise ValueError(msg) + + +def _unpack_nodes( + graph: nx.Graph, embeddings: dict[str, list[float]], _args: dict[str, Any] +) -> list[dict[str, Any]]: + return [ + { + "label": label, + **(node_data or {}), + "graph_embedding": embeddings.get(label), + } + for label, node_data in graph.nodes(data=True) # type: ignore + ] + + +def _unpack_edges(graph: nx.Graph, _args: dict[str, Any]) -> list[dict[str, Any]]: + return [ + { + "source": source_id, + "target": target_id, + **(edge_data or {}), + } + for source_id, target_id, edge_data in graph.edges(data=True) # type: ignore + ] diff --git a/graphrag/index/verbs/overrides/__init__.py b/graphrag/index/verbs/overrides/__init__.py new file mode 100644 index 00000000..24b82c1f --- /dev/null +++ b/graphrag/index/verbs/overrides/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine overrides package root.""" + +from .aggregate import aggregate +from .concat import concat +from .merge import merge + +__all__ = ["aggregate", "concat", "merge"] diff --git a/graphrag/index/verbs/overrides/aggregate.py b/graphrag/index/verbs/overrides/aggregate.py new file mode 100644 index 00000000..df213704 --- /dev/null +++ b/graphrag/index/verbs/overrides/aggregate.py @@ -0,0 +1,90 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'Aggregation' model.""" + +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +from dataclasses import dataclass +from typing import Any, cast + +import pandas as pd +from datashaper import ( + FieldAggregateOperation, + Progress, + TableContainer, + VerbCallbacks, + VerbInput, + aggregate_operation_mapping, + verb, +) + +ARRAY_AGGREGATIONS = [ + FieldAggregateOperation.ArrayAgg, + FieldAggregateOperation.ArrayAggDistinct, +] + + +# TODO: This thing is kinda gross +# Also, it diverges from the original aggregate verb, since it doesn't support the same syntax +@verb(name="aggregate_override") +def aggregate( + input: VerbInput, + callbacks: VerbCallbacks, + aggregations: list[dict[str, Any]], + groupby: list[str] | None = None, + **_kwargs: dict, +) -> TableContainer: + """Aggregate method definition.""" + aggregations_to_apply = _load_aggregations(aggregations) + df_aggregations = { + agg.column: _get_pandas_agg_operation(agg) + for agg in aggregations_to_apply.values() + } + input_table = input.get_input() + callbacks.progress(Progress(percent=0)) + + if groupby is None: + output_grouped = input_table.groupby(lambda _x: True) + else: + output_grouped = input_table.groupby(groupby, sort=False) + output = cast(pd.DataFrame, output_grouped.agg(df_aggregations)) + output.rename( + columns={agg.column: agg.to for agg in aggregations_to_apply.values()}, + inplace=True, + ) + output.columns = [agg.to for agg in aggregations_to_apply.values()] + + callbacks.progress(Progress(percent=1)) + + return TableContainer(table=output.reset_index()) + + +@dataclass +class Aggregation: + """Aggregation class method definition.""" + + column: str | None + operation: str + to: str + + # Only useful for the concat operation + separator: str | None = None + + +def _get_pandas_agg_operation(agg: Aggregation) -> Any: + # TODO: Merge into datashaper + if agg.operation == "string_concat": + return (agg.separator or ",").join + return aggregate_operation_mapping[FieldAggregateOperation(agg.operation)] + + +def _load_aggregations( + aggregations: list[dict[str, Any]], +) -> dict[str, Aggregation]: + return { + aggregation["column"]: Aggregation( + aggregation["column"], aggregation["operation"], aggregation["to"] + ) + for aggregation in aggregations + } diff --git a/graphrag/index/verbs/overrides/concat.py b/graphrag/index/verbs/overrides/concat.py new file mode 100644 index 00000000..7a0f0e2c --- /dev/null +++ b/graphrag/index/verbs/overrides/concat.py @@ -0,0 +1,27 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing concat method definition.""" + +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +from typing import cast + +import pandas as pd +from datashaper import TableContainer, VerbInput, verb + + +@verb(name="concat_override") +def concat( + input: VerbInput, + columnwise: bool = False, + **_kwargs: dict, +) -> TableContainer: + """Concat method definition.""" + input_table = cast(pd.DataFrame, input.get_input()) + others = cast(list[pd.DataFrame], input.get_others()) + if columnwise: + output = pd.concat([input_table, *others], axis=1) + else: + output = pd.concat([input_table, *others], ignore_index=True) + return TableContainer(table=output) diff --git a/graphrag/index/verbs/overrides/merge.py b/graphrag/index/verbs/overrides/merge.py new file mode 100644 index 00000000..64684c98 --- /dev/null +++ b/graphrag/index/verbs/overrides/merge.py @@ -0,0 +1,78 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing merge and _merge_json methods definition.""" + +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import logging +from enum import Enum +from typing import Any, cast + +import pandas as pd +from datashaper import TableContainer, VerbInput, VerbResult, verb +from datashaper.engine.verbs.merge import merge as ds_merge + +log = logging.getLogger(__name__) + + +class MergeStrategyType(str, Enum): + """MergeStrategy class definition.""" + + json = "json" + datashaper = "datashaper" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' + + +# TODO: This thing is kinda gross +# Also, it diverges from the original aggregate verb, since it doesn't support the same syntax +@verb(name="merge_override") +def merge( + input: VerbInput, + to: str, + columns: list[str], + strategy: MergeStrategyType = MergeStrategyType.datashaper, + delimiter: str = "", + preserveSource: bool = False, # noqa N806 + unhot: bool = False, + prefix: str = "", + **_kwargs: dict, +) -> TableContainer | VerbResult: + """Merge method definition.""" + output: pd.DataFrame + match strategy: + case MergeStrategyType.json: + output = _merge_json(input, to, columns) + filtered_list: list[str] = [] + + for col in output.columns: + try: + columns.index(col) + except ValueError: + log.exception("Column %s not found in input columns", col) + filtered_list.append(col) + + if not preserveSource: + output = cast(Any, output[filtered_list]) + return TableContainer(table=output.reset_index()) + case _: + return ds_merge( + input, to, columns, strategy, delimiter, preserveSource, unhot, prefix + ) + + +def _merge_json( + input: VerbInput, + to: str, + columns: list[str], +) -> pd.DataFrame: + input_table = cast(pd.DataFrame, input.get_input()) + output = input_table + output[to] = output[columns].apply( + lambda row: ({**row}), + axis=1, + ) + return output diff --git a/graphrag/index/verbs/snapshot.py b/graphrag/index/verbs/snapshot.py new file mode 100644 index 00000000..a90fc283 --- /dev/null +++ b/graphrag/index/verbs/snapshot.py @@ -0,0 +1,30 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing snapshot method definition.""" + +from datashaper import TableContainer, VerbInput, verb + +from graphrag.index.storage import PipelineStorage + + +@verb(name="snapshot") +async def snapshot( + input: VerbInput, + name: str, + formats: list[str], + storage: PipelineStorage, + **_kwargs: dict, +) -> TableContainer: + """Take a entire snapshot of the tabular data.""" + data = input.get_input() + + for fmt in formats: + if fmt == "parquet": + await storage.set(name + ".parquet", data.to_parquet()) + elif fmt == "json": + await storage.set( + name + ".json", data.to_json(orient="records", lines=True) + ) + + return TableContainer(table=data) diff --git a/graphrag/index/verbs/snapshot_rows.py b/graphrag/index/verbs/snapshot_rows.py new file mode 100644 index 00000000..99aae70a --- /dev/null +++ b/graphrag/index/verbs/snapshot_rows.py @@ -0,0 +1,86 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'FormatSpecifier' model.""" + +import json +from dataclasses import dataclass +from typing import Any + +from datashaper import TableContainer, VerbInput, verb + +from graphrag.index.storage import PipelineStorage + + +@dataclass +class FormatSpecifier: + """Format specifier class definition.""" + + format: str + extension: str + + +@verb(name="snapshot_rows") +async def snapshot_rows( + input: VerbInput, + column: str | None, + base_name: str, + storage: PipelineStorage, + formats: list[str | dict[str, Any]], + row_name_column: str | None = None, + **_kwargs: dict, +) -> TableContainer: + """Take a by-row snapshot of the tabular data.""" + data = input.get_input() + parsed_formats = _parse_formats(formats) + num_rows = len(data) + + def get_row_name(row: Any, row_idx: Any): + if row_name_column is None: + if num_rows == 1: + return base_name + return f"{base_name}.{row_idx}" + return f"{base_name}.{row[row_name_column]}" + + for row_idx, row in data.iterrows(): + for fmt in parsed_formats: + row_name = get_row_name(row, row_idx) + extension = fmt.extension + if fmt.format == "json": + await storage.set( + f"{row_name}.{extension}", + json.dumps(row[column]) + if column is not None + else json.dumps(row.to_dict()), + ) + elif fmt.format == "text": + if column is None: + msg = "column must be specified for text format" + raise ValueError(msg) + await storage.set(f"{row_name}.{extension}", str(row[column])) + + return TableContainer(table=data) + + +def _parse_formats(formats: list[str | dict[str, Any]]) -> list[FormatSpecifier]: + """Parse the formats into a list of FormatSpecifiers.""" + return [ + FormatSpecifier(**fmt) + if isinstance(fmt, dict) + else FormatSpecifier(format=fmt, extension=_get_format_extension(fmt)) + for fmt in formats + ] + + +def _get_format_extension(fmt: str) -> str: + """Get the file extension for a given format.""" + if fmt == "json": + return "json" + if fmt == "text": + return "txt" + if fmt == "parquet": + return "parquet" + if fmt == "csv": + return "csv" + msg = f"Unknown format: {fmt}" + raise ValueError(msg) diff --git a/graphrag/index/verbs/spread_json.py b/graphrag/index/verbs/spread_json.py new file mode 100644 index 00000000..38656e12 --- /dev/null +++ b/graphrag/index/verbs/spread_json.py @@ -0,0 +1,55 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing spread_json method definition.""" + +import logging + +import pandas as pd +from datashaper import TableContainer, VerbInput, verb + +from graphrag.index.utils import is_null + +# TODO: Check if this is already a thing +DEFAULT_COPY = ["level"] + + +@verb(name="spread_json") +def spread_json( + input: VerbInput, + column: str, + copy: list[str] | None = None, + **_kwargs: dict, +) -> TableContainer: + """ + Unpack a column containing a tuple into multiple columns. + + id|json|b + 1|{"x":5,"y":6}|b + + is converted to + + id|x|y|b + -------- + 1|5|6|b + """ + if copy is None: + copy = DEFAULT_COPY + data = input.get_input() + + results = [] + for _, row in data.iterrows(): + try: + cleaned_row = {col: row[col] for col in copy} + rest_row = row[column] if row[column] is not None else {} + + if is_null(rest_row): + rest_row = {} + + results.append({**cleaned_row, **rest_row}) # type: ignore + except Exception: + logging.exception("Error spreading row: %s", row) + raise + data = pd.DataFrame(results, index=data.index) + + return TableContainer(table=data) diff --git a/graphrag/index/verbs/text/__init__.py b/graphrag/index/verbs/text/__init__.py new file mode 100644 index 00000000..032f45e1 --- /dev/null +++ b/graphrag/index/verbs/text/__init__.py @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine text package root.""" + +from .chunk.text_chunk import chunk +from .embed import text_embed +from .replace import replace +from .split import text_split +from .translate import text_translate + +__all__ = [ + "chunk", + "replace", + "text_embed", + "text_split", + "text_translate", +] diff --git a/graphrag/index/verbs/text/chunk/__init__.py b/graphrag/index/verbs/text/chunk/__init__.py new file mode 100644 index 00000000..4e2a7729 --- /dev/null +++ b/graphrag/index/verbs/text/chunk/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine text chunk package root.""" + +from .text_chunk import ChunkStrategy, ChunkStrategyType, chunk + +__all__ = ["ChunkStrategy", "ChunkStrategyType", "chunk"] diff --git a/graphrag/index/verbs/text/chunk/strategies/__init__.py b/graphrag/index/verbs/text/chunk/strategies/__init__.py new file mode 100644 index 00000000..0f15fcb2 --- /dev/null +++ b/graphrag/index/verbs/text/chunk/strategies/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine text chunk strategies package root.""" diff --git a/graphrag/index/verbs/text/chunk/strategies/sentence.py b/graphrag/index/verbs/text/chunk/strategies/sentence.py new file mode 100644 index 00000000..687def1d --- /dev/null +++ b/graphrag/index/verbs/text/chunk/strategies/sentence.py @@ -0,0 +1,26 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing run method definition.""" + +from collections.abc import Iterable +from typing import Any + +import nltk +from datashaper import ProgressTicker + +from .typing import TextChunk + + +def run( + input: list[str], _args: dict[str, Any], tick: ProgressTicker +) -> Iterable[TextChunk]: + """Chunks text into multiple parts. A pipeline verb.""" + for doc_idx, text in enumerate(input): + sentences = nltk.sent_tokenize(text) + for sentence in sentences: + yield TextChunk( + text_chunk=sentence, + source_doc_indices=[doc_idx], + ) + tick(1) diff --git a/graphrag/index/verbs/text/chunk/strategies/tokens.py b/graphrag/index/verbs/text/chunk/strategies/tokens.py new file mode 100644 index 00000000..6dab135e --- /dev/null +++ b/graphrag/index/verbs/text/chunk/strategies/tokens.py @@ -0,0 +1,83 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing run and split_text_on_tokens methods definition.""" + +from collections.abc import Iterable +from typing import Any + +import tiktoken +from datashaper import ProgressTicker + +from graphrag.index.text_splitting import Tokenizer +from graphrag.index.verbs.text.chunk.typing import TextChunk + +DEFAULT_CHUNK_SIZE = 2500 # tokens +DEFAULT_CHUNK_OVERLAP = 300 # tokens + + +def run( + input: list[str], args: dict[str, Any], tick: ProgressTicker +) -> Iterable[TextChunk]: + """Chunks text into multiple parts. A pipeline verb.""" + tokens_per_chunk = args.get("chunk_size", DEFAULT_CHUNK_SIZE) + chunk_overlap = args.get("chunk_overlap", DEFAULT_CHUNK_OVERLAP) + encoding_name = args.get("encoding_name", "cl100k_base") + enc = tiktoken.get_encoding(encoding_name) + + def encode(text: str) -> list[int]: + if not isinstance(text, str): + text = f"{text}" + return enc.encode(text) + + def decode(tokens: list[int]) -> str: + return enc.decode(tokens) + + return split_text_on_tokens( + input, + Tokenizer( + chunk_overlap=chunk_overlap, + tokens_per_chunk=tokens_per_chunk, + encode=encode, + decode=decode, + ), + tick, + ) + + +# Adapted from - https://github.com/langchain-ai/langchain/blob/77b359edf5df0d37ef0d539f678cf64f5557cb54/libs/langchain/langchain/text_splitter.py#L471 +# So we could have better control over the chunking process +def split_text_on_tokens( + texts: list[str], enc: Tokenizer, tick: ProgressTicker +) -> list[TextChunk]: + """Split incoming text and return chunks.""" + result = [] + mapped_ids = [] + + for source_doc_idx, text in enumerate(texts): + encoded = enc.encode(text) + tick(1) + mapped_ids.append((source_doc_idx, encoded)) + + input_ids: list[tuple[int, int]] = [ + (source_doc_idx, id) for source_doc_idx, ids in mapped_ids for id in ids + ] + + start_idx = 0 + cur_idx = min(start_idx + enc.tokens_per_chunk, len(input_ids)) + chunk_ids = input_ids[start_idx:cur_idx] + while start_idx < len(input_ids): + chunk_text = enc.decode([id for _, id in chunk_ids]) + doc_indices = list({doc_idx for doc_idx, _ in chunk_ids}) + result.append( + TextChunk( + text_chunk=chunk_text, + source_doc_indices=doc_indices, + n_tokens=len(chunk_ids), + ) + ) + start_idx += enc.tokens_per_chunk - enc.chunk_overlap + cur_idx = min(start_idx + enc.tokens_per_chunk, len(input_ids)) + chunk_ids = input_ids[start_idx:cur_idx] + + return result diff --git a/graphrag/index/verbs/text/chunk/strategies/typing.py b/graphrag/index/verbs/text/chunk/strategies/typing.py new file mode 100644 index 00000000..b4e833c8 --- /dev/null +++ b/graphrag/index/verbs/text/chunk/strategies/typing.py @@ -0,0 +1,17 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing ChunkStrategy definition.""" + +from collections.abc import Callable, Iterable +from typing import Any + +from datashaper import ProgressTicker + +from graphrag.index.verbs.text.chunk.typing import TextChunk + +# Given a list of document texts, return a list of tuples of (source_doc_indices, text_chunk) + +ChunkStrategy = Callable[ + [list[str], dict[str, Any], ProgressTicker], Iterable[TextChunk] +] diff --git a/graphrag/index/verbs/text/chunk/text_chunk.py b/graphrag/index/verbs/text/chunk/text_chunk.py new file mode 100644 index 00000000..d8fab44f --- /dev/null +++ b/graphrag/index/verbs/text/chunk/text_chunk.py @@ -0,0 +1,162 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing _get_num_total, chunk, run_strategy and load_strategy methods definitions.""" + +from enum import Enum +from typing import Any, cast + +import pandas as pd +from datashaper import ( + ProgressTicker, + TableContainer, + VerbCallbacks, + VerbInput, + progress_ticker, + verb, +) + +from .strategies.typing import ChunkStrategy as ChunkStrategy +from .typing import ChunkInput + + +def _get_num_total(output: pd.DataFrame, column: str) -> int: + num_total = 0 + for row in output[column]: + if isinstance(row, str): + num_total += 1 + else: + num_total += len(row) + return num_total + + +class ChunkStrategyType(str, Enum): + """ChunkStrategy class definition.""" + + tokens = "tokens" + sentence = "sentence" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' + + +@verb(name="chunk") +def chunk( + input: VerbInput, + column: str, + to: str, + callbacks: VerbCallbacks, + strategy: dict[str, Any] | None = None, + **_kwargs, +) -> TableContainer: + """ + Chunk a piece of text into smaller pieces. + + ## Usage + ```yaml + verb: text_chunk + args: + column: # The name of the column containing the text to chunk, this can either be a column with text, or a column with a list[tuple[doc_id, str]] + to: # The name of the column to output the chunks to + strategy: # The strategy to use to chunk the text, see below for more details + ``` + + ## Strategies + The text chunk verb uses a strategy to chunk the text. The strategy is an object which defines the strategy to use. The following strategies are available: + + ### tokens + This strategy uses the [tokens] library to chunk a piece of text. The strategy config is as follows: + + > Note: In the future, this will likely be renamed to something more generic, like "openai_tokens". + + ```yaml + strategy: + type: tokens + chunk_size: 1000 # Optional, The chunk size to use, default: 1000 + chunk_overlap: 300 # Optional, The chunk overlap to use, default: 300 + ``` + + ### sentence + This strategy uses the nltk library to chunk a piece of text into sentences. The strategy config is as follows: + + ```yaml + strategy: + type: sentence + ``` + """ + if strategy is None: + strategy = {} + output = cast(pd.DataFrame, input.get_input()) + strategy_name = strategy.get("type", ChunkStrategyType.tokens) + strategy_config = {**strategy} + strategy_exec = load_strategy(strategy_name) + + num_total = _get_num_total(output, column) + tick = progress_ticker(callbacks.progress, num_total) + + output[to] = output.apply( + cast( + Any, + lambda x: run_strategy(strategy_exec, x[column], strategy_config, tick), + ), + axis=1, + ) + return TableContainer(table=output) + + +def run_strategy( + strategy: ChunkStrategy, + input: ChunkInput, + strategy_args: dict[str, Any], + tick: ProgressTicker, +) -> list[str | tuple[list[str] | None, str, int]]: + """Run strategy method definition.""" + if isinstance(input, str): + return [item.text_chunk for item in strategy([input], {**strategy_args}, tick)] + + # We can work with both just a list of text content + # or a list of tuples of (document_id, text content) + # text_to_chunk = ''' + texts = [] + for item in input: + if isinstance(item, str): + texts.append(item) + else: + texts.append(item[1]) + + strategy_results = strategy(texts, {**strategy_args}, tick) + + results = [] + for strategy_result in strategy_results: + doc_indices = strategy_result.source_doc_indices + if isinstance(input[doc_indices[0]], str): + results.append(strategy_result.text_chunk) + else: + doc_ids = [input[doc_idx][0] for doc_idx in doc_indices] + results.append(( + doc_ids, + strategy_result.text_chunk, + strategy_result.n_tokens, + )) + return results + + +def load_strategy(strategy: ChunkStrategyType) -> ChunkStrategy: + """Load strategy method definition.""" + match strategy: + case ChunkStrategyType.tokens: + from .strategies.tokens import run as run_tokens + + return run_tokens + case ChunkStrategyType.sentence: + # NLTK + from graphrag.index.bootstrap import bootstrap + + from .strategies.sentence import run as run_sentence + + bootstrap() + return run_sentence + case _: + msg = f"Unknown strategy: {strategy}" + raise ValueError(msg) diff --git a/graphrag/index/verbs/text/chunk/typing.py b/graphrag/index/verbs/text/chunk/typing.py new file mode 100644 index 00000000..3a42cf68 --- /dev/null +++ b/graphrag/index/verbs/text/chunk/typing.py @@ -0,0 +1,19 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'TextChunk' model.""" + +from dataclasses import dataclass + + +@dataclass +class TextChunk: + """Text chunk class definition.""" + + text_chunk: str + source_doc_indices: list[int] + n_tokens: int | None = None + + +ChunkInput = str | list[str] | list[tuple[str, str]] +"""Input to a chunking strategy. Can be a string, a list of strings, or a list of tuples of (id, text).""" diff --git a/graphrag/index/verbs/text/embed/__init__.py b/graphrag/index/verbs/text/embed/__init__.py new file mode 100644 index 00000000..969bd2aa --- /dev/null +++ b/graphrag/index/verbs/text/embed/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine text embed package root.""" + +from .text_embed import TextEmbedStrategyType, text_embed + +__all__ = ["TextEmbedStrategyType", "text_embed"] diff --git a/graphrag/index/verbs/text/embed/strategies/__init__.py b/graphrag/index/verbs/text/embed/strategies/__init__.py new file mode 100644 index 00000000..8cbe7a58 --- /dev/null +++ b/graphrag/index/verbs/text/embed/strategies/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine embed strategies package root.""" diff --git a/graphrag/index/verbs/text/embed/strategies/mock.py b/graphrag/index/verbs/text/embed/strategies/mock.py new file mode 100644 index 00000000..1be4ab0f --- /dev/null +++ b/graphrag/index/verbs/text/embed/strategies/mock.py @@ -0,0 +1,34 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing run and _embed_text methods definitions.""" + +import random +from collections.abc import Iterable +from typing import Any + +from datashaper import ProgressTicker, VerbCallbacks, progress_ticker + +from graphrag.index.cache import PipelineCache + +from .typing import TextEmbeddingResult + + +async def run( # noqa RUF029 async is required for interface + input: list[str], + callbacks: VerbCallbacks, + cache: PipelineCache, + _args: dict[str, Any], +) -> TextEmbeddingResult: + """Run the Claim extraction chain.""" + input = input if isinstance(input, Iterable) else [input] + ticker = progress_ticker(callbacks.progress, len(input)) + return TextEmbeddingResult( + embeddings=[_embed_text(cache, text, ticker) for text in input] + ) + + +def _embed_text(_cache: PipelineCache, _text: str, tick: ProgressTicker) -> list[float]: + """Embed a single piece of text.""" + tick(1) + return [random.random(), random.random(), random.random()] # noqa S311 diff --git a/graphrag/index/verbs/text/embed/strategies/openai.py b/graphrag/index/verbs/text/embed/strategies/openai.py new file mode 100644 index 00000000..0658d604 --- /dev/null +++ b/graphrag/index/verbs/text/embed/strategies/openai.py @@ -0,0 +1,180 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing run method definition.""" + +import asyncio +import logging +from typing import Any + +import numpy as np +from datashaper import ProgressTicker, VerbCallbacks, progress_ticker + +from graphrag.index.cache import PipelineCache +from graphrag.index.llm import load_llm_embeddings +from graphrag.index.text_splitting import TokenTextSplitter +from graphrag.index.utils import is_null +from graphrag.llm import EmbeddingLLM, OpenAIConfiguration + +from .typing import TextEmbeddingResult + +log = logging.getLogger(__name__) + + +async def run( + input: list[str], + callbacks: VerbCallbacks, + cache: PipelineCache, + args: dict[str, Any], +) -> TextEmbeddingResult: + """Run the Claim extraction chain.""" + if is_null(input): + return TextEmbeddingResult(embeddings=None) + + llm_config = args.get("llm", {}) + batch_size = args.get("batch_size", 16) + batch_max_tokens = args.get("batch_max_tokens", 8191) + oai_config = OpenAIConfiguration(llm_config) + splitter = _get_splitter(oai_config, batch_max_tokens) + llm = _get_llm(oai_config, callbacks, cache) + semaphore: asyncio.Semaphore = asyncio.Semaphore(args.get("num_threads", 4)) + + # Break up the input texts. The sizes here indicate how many snippets are in each input text + texts, input_sizes = _prepare_embed_texts(input, splitter) + text_batches = _create_text_batches( + texts, + batch_size, + batch_max_tokens, + splitter, + ) + log.info( + "embedding %d inputs via %d snippets using %d batches. max_batch_size=%d, max_tokens=%d", + len(input), + len(texts), + len(text_batches), + batch_size, + batch_max_tokens, + ) + ticker = progress_ticker(callbacks.progress, len(text_batches)) + + # Embed each chunk of snippets + embeddings = await _execute(llm, text_batches, ticker, semaphore) + embeddings = _reconstitute_embeddings(embeddings, input_sizes) + + return TextEmbeddingResult(embeddings=embeddings) + + +def _get_splitter( + config: OpenAIConfiguration, batch_max_tokens: int +) -> TokenTextSplitter: + return TokenTextSplitter( + encoding_name=config.encoding_model or "cl100k_base", + chunk_size=batch_max_tokens, + ) + + +def _get_llm( + config: OpenAIConfiguration, + callbacks: VerbCallbacks, + cache: PipelineCache, +) -> EmbeddingLLM: + llm_type = config.lookup("type", "Unknown") + return load_llm_embeddings( + "text_embedding", + llm_type, + callbacks, + cache, + config.raw_config, + ) + + +async def _execute( + llm: EmbeddingLLM, + chunks: list[list[str]], + tick: ProgressTicker, + semaphore: asyncio.Semaphore, +) -> list[list[float]]: + async def embed(chunk: list[str]): + async with semaphore: + chunk_embeddings = await llm(chunk) + result = np.array(chunk_embeddings.output) + tick(1) + return result + + futures = [embed(chunk) for chunk in chunks] + results = await asyncio.gather(*futures) + # merge results in a single list of lists (reduce the collect dimension) + return [item for sublist in results for item in sublist] + + +def _create_text_batches( + texts: list[str], + max_batch_size: int, + max_batch_tokens: int, + splitter: TokenTextSplitter, +) -> list[list[str]]: + """Create batches of texts to embed.""" + # https://learn.microsoft.com/en-us/azure/ai-services/openai/reference + # According to this embeddings reference, Azure limits us to 16 concurrent embeddings and 8191 tokens per request + result = [] + current_batch = [] + current_batch_tokens = 0 + + for text in texts: + token_count = splitter.num_tokens(text) + if ( + len(current_batch) >= max_batch_size + or current_batch_tokens + token_count > max_batch_tokens + ): + result.append(current_batch) + current_batch = [] + current_batch_tokens = 0 + + current_batch.append(text) + current_batch_tokens += token_count + + if len(current_batch) > 0: + result.append(current_batch) + + return result + + +def _prepare_embed_texts( + input: list[str], splitter: TokenTextSplitter +) -> tuple[list[str], list[int]]: + sizes: list[int] = [] + snippets: list[str] = [] + + for text in input: + # Split the input text and filter out any empty content + split_texts = splitter.split_text(text) + if split_texts is None: + continue + split_texts = [text for text in split_texts if len(text) > 0] + + sizes.append(len(split_texts)) + snippets.extend(split_texts) + + return snippets, sizes + + +def _reconstitute_embeddings( + raw_embeddings: list[list[float]], sizes: list[int] +) -> list[list[float] | None]: + """Reconstitute the embeddings into the original input texts.""" + embeddings: list[list[float] | None] = [] + cursor = 0 + for size in sizes: + if size == 0: + embeddings.append(None) + elif size == 1: + embedding = raw_embeddings[cursor] + embeddings.append(embedding) + cursor += 1 + else: + chunk = raw_embeddings[cursor : cursor + size] + average = np.average(chunk, axis=0) + normalized = average / np.linalg.norm(average) + embeddings.append(normalized.tolist()) + cursor += size + return embeddings diff --git a/graphrag/index/verbs/text/embed/strategies/typing.py b/graphrag/index/verbs/text/embed/strategies/typing.py new file mode 100644 index 00000000..1b252564 --- /dev/null +++ b/graphrag/index/verbs/text/embed/strategies/typing.py @@ -0,0 +1,29 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'TextEmbeddingResult' model.""" + +from collections.abc import Awaitable, Callable +from dataclasses import dataclass + +from datashaper import VerbCallbacks + +from graphrag.index.cache import PipelineCache + + +@dataclass +class TextEmbeddingResult: + """Text embedding result class definition.""" + + embeddings: list[list[float] | None] | None + + +TextEmbeddingStrategy = Callable[ + [ + list[str], + VerbCallbacks, + PipelineCache, + dict, + ], + Awaitable[TextEmbeddingResult], +] diff --git a/graphrag/index/verbs/text/embed/text_embed.py b/graphrag/index/verbs/text/embed/text_embed.py new file mode 100644 index 00000000..2d6def22 --- /dev/null +++ b/graphrag/index/verbs/text/embed/text_embed.py @@ -0,0 +1,263 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing text_embed, load_strategy and create_row_from_embedding_data methods definition.""" + +import logging +from enum import Enum +from typing import Any, cast + +import numpy as np +import pandas as pd +from datashaper import TableContainer, VerbCallbacks, VerbInput, verb + +from graphrag.index.cache import PipelineCache +from graphrag.vector_stores import ( + BaseVectorStore, + VectorStoreDocument, + VectorStoreFactory, +) + +from .strategies.typing import TextEmbeddingStrategy + +log = logging.getLogger(__name__) + +# Per Azure OpenAI Limits +# https://learn.microsoft.com/en-us/azure/ai-services/openai/reference +DEFAULT_EMBEDDING_BATCH_SIZE = 500 + + +class TextEmbedStrategyType(str, Enum): + """TextEmbedStrategyType class definition.""" + + openai = "openai" + mock = "mock" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' + + +@verb(name="text_embed") +async def text_embed( + input: VerbInput, + callbacks: VerbCallbacks, + cache: PipelineCache, + column: str, + strategy: dict, + **kwargs, +) -> TableContainer: + """ + Embed a piece of text into a vector space. The verb outputs a new column containing a mapping between doc_id and vector. + + ## Usage + ```yaml + verb: text_embed + args: + column: text # The name of the column containing the text to embed, this can either be a column with text, or a column with a list[tuple[doc_id, str]] + to: embedding # The name of the column to output the embedding to + strategy: # See strategies section below + ``` + + ## Strategies + The text embed verb uses a strategy to embed the text. The strategy is an object which defines the strategy to use. The following strategies are available: + + ### openai + This strategy uses openai to embed a piece of text. In particular it uses a LLM to embed a piece of text. The strategy config is as follows: + + ```yaml + strategy: + type: openai + llm: # The configuration for the LLM + type: openai_embedding # the type of llm to use, available options are: openai_embedding, azure_openai_embedding + api_key: !ENV ${GRAPHRAG_OPENAI_API_KEY} # The api key to use for openai + model: !ENV ${GRAPHRAG_OPENAI_MODEL:gpt-4-turbo-preview} # The model to use for openai + max_tokens: !ENV ${GRAPHRAG_MAX_TOKENS:6000} # The max tokens to use for openai + organization: !ENV ${GRAPHRAG_OPENAI_ORGANIZATION} # The organization to use for openai + vector_store: # The optional configuration for the vector store + type: lancedb # The type of vector store to use, available options are: azure_ai_search, lancedb + <...> + ``` + """ + vector_store_config = strategy.get("vector_store") + + if vector_store_config: + embedding_name = kwargs.get("embedding_name", "default") + collection_name = _get_collection_name(vector_store_config, embedding_name) + vector_store: BaseVectorStore = _create_vector_store( + vector_store_config, collection_name + ) + vector_store_workflow_config = vector_store_config.get( + embedding_name, vector_store_config + ) + return await _text_embed_with_vector_store( + input, + callbacks, + cache, + column, + strategy, + vector_store, + vector_store_workflow_config, + vector_store_config.get("store_in_table", False), + kwargs.get("to", f"{column}_embedding"), + ) + + return await _text_embed_in_memory( + input, + callbacks, + cache, + column, + strategy, + kwargs.get("to", f"{column}_embedding"), + ) + + +async def _text_embed_in_memory( + input: VerbInput, + callbacks: VerbCallbacks, + cache: PipelineCache, + column: str, + strategy: dict, + to: str, +): + output_df = cast(pd.DataFrame, input.get_input()) + strategy_type = strategy["type"] + strategy_exec = load_strategy(strategy_type) + strategy_args = {**strategy} + input_table = input.get_input() + + texts: list[str] = input_table[column].to_numpy().tolist() + result = await strategy_exec(texts, callbacks, cache, strategy_args) + + output_df[to] = result.embeddings + return TableContainer(table=output_df) + + +async def _text_embed_with_vector_store( + input: VerbInput, + callbacks: VerbCallbacks, + cache: PipelineCache, + column: str, + strategy: dict[str, Any], + vector_store: BaseVectorStore, + vector_store_config: dict, + store_in_table: bool = False, + to: str = "", +): + output_df = cast(pd.DataFrame, input.get_input()) + strategy_type = strategy["type"] + strategy_exec = load_strategy(strategy_type) + strategy_args = {**strategy} + + # Get vector-storage configuration + insert_batch_size: int = ( + vector_store_config.get("batch_size") or DEFAULT_EMBEDDING_BATCH_SIZE + ) + title_column: str = vector_store_config.get("title_column", "title") + id_column: str = vector_store_config.get("id_column", "id") + overwrite: bool = vector_store_config.get("overwrite", True) + + if column not in output_df.columns: + msg = f"Column {column} not found in input dataframe with columns {output_df.columns}" + raise ValueError(msg) + if title_column not in output_df.columns: + msg = f"Column {title_column} not found in input dataframe with columns {output_df.columns}" + raise ValueError(msg) + if id_column not in output_df.columns: + msg = f"Column {id_column} not found in input dataframe with columns {output_df.columns}" + raise ValueError(msg) + + total_rows = 0 + for row in output_df[column]: + if isinstance(row, list): + total_rows += len(row) + else: + total_rows += 1 + + i = 0 + starting_index = 0 + + all_results = [] + + while insert_batch_size * i < input.get_input().shape[0]: + batch = input.get_input().iloc[ + insert_batch_size * i : insert_batch_size * (i + 1) + ] + texts: list[str] = batch[column].to_numpy().tolist() + titles: list[str] = batch[title_column].to_numpy().tolist() + ids: list[str] = batch[id_column].to_numpy().tolist() + result = await strategy_exec( + texts, + callbacks, + cache, + strategy_args, + ) + if store_in_table and result.embeddings: + embeddings = [ + embedding for embedding in result.embeddings if embedding is not None + ] + all_results.extend(embeddings) + + vectors = result.embeddings or [] + documents: list[VectorStoreDocument] = [] + for id, text, title, vector in zip(ids, texts, titles, vectors, strict=True): + if type(vector) == np.ndarray: + vector = vector.tolist() + document = VectorStoreDocument( + id=id, + text=text, + vector=vector, + attributes={"title": title}, + ) + documents.append(document) + + vector_store.load_documents(documents, overwrite and i == 0) + starting_index += len(documents) + i += 1 + + if store_in_table: + output_df[to] = all_results + + return TableContainer(table=output_df) + + +def _create_vector_store( + vector_store_config: dict, collection_name: str +) -> BaseVectorStore: + vector_store_type: str = str(vector_store_config.get("type")) + if collection_name: + vector_store_config.update({"collection_name": collection_name}) + + vector_store = VectorStoreFactory.get_vector_store( + vector_store_type, kwargs=vector_store_config + ) + + vector_store.connect(**vector_store_config) + return vector_store + + +def _get_collection_name(vector_store_config: dict, embedding_name: str) -> str: + collection_name = vector_store_config.get("collection_name") + if not collection_name: + collection_names = vector_store_config.get("collection_names", {}) + collection_name = collection_names.get(embedding_name, embedding_name) + + msg = f"using {vector_store_config.get('type')} collection_name {collection_name} for embedding {embedding_name}" + log.info(msg) + return collection_name + + +def load_strategy(strategy: TextEmbedStrategyType) -> TextEmbeddingStrategy: + """Load strategy method definition.""" + match strategy: + case TextEmbedStrategyType.openai: + from .strategies.openai import run as run_openai + + return run_openai + case TextEmbedStrategyType.mock: + from .strategies.mock import run as run_mock + + return run_mock + case _: + msg = f"Unknown strategy: {strategy}" + raise ValueError(msg) diff --git a/graphrag/index/verbs/text/replace/__init__.py b/graphrag/index/verbs/text/replace/__init__.py new file mode 100644 index 00000000..f863415f --- /dev/null +++ b/graphrag/index/verbs/text/replace/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine text replace package root.""" + +from .replace import text_replace + +__all__ = ["text_replace"] diff --git a/graphrag/index/verbs/text/replace/replace.py b/graphrag/index/verbs/text/replace/replace.py new file mode 100644 index 00000000..386fac34 --- /dev/null +++ b/graphrag/index/verbs/text/replace/replace.py @@ -0,0 +1,47 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing replace and _apply_replacements methods.""" + +from typing import cast + +import pandas as pd +from datashaper import TableContainer, VerbInput, verb + +from .typing import Replacement + + +@verb(name="text_replace") +def text_replace( + input: VerbInput, + column: str, + to: str, + replacements: list[dict[str, str]], + **_kwargs: dict, +) -> TableContainer: + """ + Apply a set of replacements to a piece of text. + + ## Usage + ```yaml + verb: text_replace + args: + column: # The name of the column containing the text to replace + to: # The name of the column to write the replaced text to + replacements: # A list of replacements to apply + - pattern: # The regex pattern to find + replacement: # The string to replace with + ``` + """ + output = cast(pd.DataFrame, input.get_input()) + parsed_replacements = [Replacement(**r) for r in replacements] + output[to] = output[column].apply( + lambda text: _apply_replacements(text, parsed_replacements) + ) + return TableContainer(table=output) + + +def _apply_replacements(text: str, replacements: list[Replacement]) -> str: + for r in replacements: + text = text.replace(r.pattern, r.replacement) + return text diff --git a/graphrag/index/verbs/text/replace/typing.py b/graphrag/index/verbs/text/replace/typing.py new file mode 100644 index 00000000..45beef9f --- /dev/null +++ b/graphrag/index/verbs/text/replace/typing.py @@ -0,0 +1,14 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'Replacement' model.""" + +from dataclasses import dataclass + + +@dataclass +class Replacement: + """Replacement class definition.""" + + pattern: str + replacement: str diff --git a/graphrag/index/verbs/text/split.py b/graphrag/index/verbs/text/split.py new file mode 100644 index 00000000..b1339ff4 --- /dev/null +++ b/graphrag/index/verbs/text/split.py @@ -0,0 +1,54 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing the text_split method definition.""" + +from typing import cast + +import pandas as pd +from datashaper import TableContainer, VerbInput, verb + + +@verb(name="text_split") +def text_split( + input: VerbInput, + column: str, + to: str, + separator: str = ",", + **_kwargs: dict, +) -> TableContainer: + """ + Split a piece of text into a list of strings based on a delimiter. The verb outputs a new column containing a list of strings. + + ## Usage + + ```yaml + verb: text_split + args: + column: text # The name of the column containing the text to split + to: split_text # The name of the column to output the split text to + separator: "," # The separator to split the text on, defaults to "," + ``` + """ + output = text_split_df(cast(pd.DataFrame, input.get_input()), column, to, separator) + return TableContainer(table=output) + + +def text_split_df( + input: pd.DataFrame, column: str, to: str, separator: str = "," +) -> pd.DataFrame: + """Split a column into a list of strings.""" + output = input + + def _apply_split(row): + if row[column] is None or isinstance(row[column], list): + return row[column] + if row[column] == "": + return [] + if not isinstance(row[column], str): + message = f"Expected {column} to be a string, but got {type(row[column])}" + raise TypeError(message) + return row[column].split(separator) + + output[to] = output.apply(_apply_split, axis=1) + return output diff --git a/graphrag/index/verbs/text/translate/__init__.py b/graphrag/index/verbs/text/translate/__init__.py new file mode 100644 index 00000000..ad830dfa --- /dev/null +++ b/graphrag/index/verbs/text/translate/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine text translate package root.""" + +from .text_translate import text_translate + +__all__ = ["text_translate"] diff --git a/graphrag/index/verbs/text/translate/strategies/__init__.py b/graphrag/index/verbs/text/translate/strategies/__init__.py new file mode 100644 index 00000000..d418bbae --- /dev/null +++ b/graphrag/index/verbs/text/translate/strategies/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine translate strategies package root.""" + +from .mock import run as run_mock +from .openai import run as run_openai + +__all__ = ["run_mock", "run_openai"] diff --git a/graphrag/index/verbs/text/translate/strategies/defaults.py b/graphrag/index/verbs/text/translate/strategies/defaults.py new file mode 100644 index 00000000..003e00eb --- /dev/null +++ b/graphrag/index/verbs/text/translate/strategies/defaults.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A file containing TRANSLATION_PROMPT value definition.""" + +TRANSLATION_PROMPT = """ + You are a helpful assistant. Translate into {language} the following text, and make sure all of the text is in {language}. + """.strip() diff --git a/graphrag/index/verbs/text/translate/strategies/mock.py b/graphrag/index/verbs/text/translate/strategies/mock.py new file mode 100644 index 00000000..58a5a999 --- /dev/null +++ b/graphrag/index/verbs/text/translate/strategies/mock.py @@ -0,0 +1,28 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing run and _summarize_text methods definitions.""" + +from typing import Any + +from datashaper import VerbCallbacks + +from graphrag.index.cache import PipelineCache + +from .typing import TextTranslationResult + + +async def run( # noqa RUF029 async is required for interface + input: str | list[str], + _args: dict[str, Any], + _reporter: VerbCallbacks, + _cache: PipelineCache, +) -> TextTranslationResult: + """Run the Claim extraction chain.""" + input = [input] if isinstance(input, str) else input + return TextTranslationResult(translations=[_translate_text(text) for text in input]) + + +def _translate_text(text: str) -> str: + """Translate a single piece of text.""" + return f"{text} translated" diff --git a/graphrag/index/verbs/text/translate/strategies/openai.py b/graphrag/index/verbs/text/translate/strategies/openai.py new file mode 100644 index 00000000..cf0628ff --- /dev/null +++ b/graphrag/index/verbs/text/translate/strategies/openai.py @@ -0,0 +1,92 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing run, _translate_text and _create_translation_prompt methods definition.""" + +import logging +import traceback +from typing import Any + +from datashaper import VerbCallbacks + +from graphrag.config.enums import LLMType +from graphrag.index.cache import PipelineCache +from graphrag.index.llm import load_llm +from graphrag.index.text_splitting import TokenTextSplitter +from graphrag.llm import CompletionLLM + +from .defaults import TRANSLATION_PROMPT as DEFAULT_TRANSLATION_PROMPT +from .typing import TextTranslationResult + +log = logging.getLogger(__name__) + + +async def run( + input: str | list[str], + args: dict[str, Any], + callbacks: VerbCallbacks, + pipeline_cache: PipelineCache, +) -> TextTranslationResult: + """Run the Claim extraction chain.""" + llm_config = args.get("llm", {"type": LLMType.StaticResponse}) + llm_type = llm_config.get("type", LLMType.StaticResponse) + llm = load_llm( + "text_translation", + llm_type, + callbacks, + pipeline_cache, + llm_config, + chat_only=True, + ) + language = args.get("language", "English") + prompt = args.get("prompt") + chunk_size = args.get("chunk_size", 2500) + chunk_overlap = args.get("chunk_overlap", 0) + + input = [input] if isinstance(input, str) else input + return TextTranslationResult( + translations=[ + await _translate_text( + text, language, prompt, llm, chunk_size, chunk_overlap, callbacks + ) + for text in input + ] + ) + + +async def _translate_text( + text: str, + language: str, + prompt: str | None, + llm: CompletionLLM, + chunk_size: int, + chunk_overlap: int, + callbacks: VerbCallbacks, +) -> str: + """Translate a single piece of text.""" + splitter = TokenTextSplitter( + chunk_size=chunk_size, + chunk_overlap=chunk_overlap, + ) + + out = "" + chunks = splitter.split_text(text) + for chunk in chunks: + try: + result = await llm( + chunk, + history=[ + { + "role": "system", + "content": (prompt or DEFAULT_TRANSLATION_PROMPT), + } + ], + variables={"language": language}, + ) + out += result.output or "" + except Exception as e: + log.exception("error translating text") + callbacks.error("Error translating text", e, traceback.format_exc()) + out += "" + + return out diff --git a/graphrag/index/verbs/text/translate/strategies/typing.py b/graphrag/index/verbs/text/translate/strategies/typing.py new file mode 100644 index 00000000..d91ed735 --- /dev/null +++ b/graphrag/index/verbs/text/translate/strategies/typing.py @@ -0,0 +1,25 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'TextTranslationResult' model.""" + +from collections.abc import Awaitable, Callable +from dataclasses import dataclass +from typing import Any + +from datashaper import VerbCallbacks + +from graphrag.index.cache import PipelineCache + + +@dataclass +class TextTranslationResult: + """Text translation result class definition.""" + + translations: list[str] + + +TextTranslationStrategy = Callable[ + [list[str], dict[str, Any], VerbCallbacks, PipelineCache], + Awaitable[TextTranslationResult], +] diff --git a/graphrag/index/verbs/text/translate/text_translate.py b/graphrag/index/verbs/text/translate/text_translate.py new file mode 100644 index 00000000..8d0faffe --- /dev/null +++ b/graphrag/index/verbs/text/translate/text_translate.py @@ -0,0 +1,120 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing text_translate methods definition.""" + +from enum import Enum +from typing import Any, cast + +import pandas as pd +from datashaper import ( + AsyncType, + TableContainer, + VerbCallbacks, + VerbInput, + derive_from_rows, + verb, +) + +from graphrag.index.cache import PipelineCache + +from .strategies.typing import TextTranslationStrategy + + +class TextTranslateStrategyType(str, Enum): + """TextTranslateStrategyType class definition.""" + + openai = "openai" + mock = "mock" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' + + +@verb(name="text_translate") +async def text_translate( + input: VerbInput, + cache: PipelineCache, + callbacks: VerbCallbacks, + text_column: str, + to: str, + strategy: dict[str, Any], + async_mode: AsyncType = AsyncType.AsyncIO, + **kwargs, +) -> TableContainer: + """ + Translate a piece of text into another language. + + ## Usage + ```yaml + verb: text_translate + args: + text_column: # The name of the column containing the text to translate + to: # The name of the column to write the translated text to + strategy: # The strategy to use to translate the text, see below for more details + ``` + + ## Strategies + The text translate verb uses a strategy to translate the text. The strategy is an object which defines the strategy to use. The following strategies are available: + + ### openai + This strategy uses openai to translate a piece of text. In particular it uses a LLM to translate a piece of text. The strategy config is as follows: + + ```yaml + strategy: + type: openai + language: english # The language to translate to, default: english + prompt: # The prompt to use for the translation, default: None + chunk_size: 2500 # The chunk size to use for the translation, default: 2500 + chunk_overlap: 0 # The chunk overlap to use for the translation, default: 0 + llm: # The configuration for the LLM + type: openai_chat # the type of llm to use, available options are: openai_chat, azure_openai_chat + api_key: !ENV ${GRAPHRAG_OPENAI_API_KEY} # The api key to use for openai + model: !ENV ${GRAPHRAG_OPENAI_MODEL:gpt-4-turbo-preview} # The model to use for openai + max_tokens: !ENV ${GRAPHRAG_MAX_TOKENS:6000} # The max tokens to use for openai + organization: !ENV ${GRAPHRAG_OPENAI_ORGANIZATION} # The organization to use for openai + ``` + """ + output_df = cast(pd.DataFrame, input.get_input()) + strategy_type = strategy["type"] + strategy_args = {**strategy} + strategy_exec = _load_strategy(strategy_type) + + async def run_strategy(row): + text = row[text_column] + result = await strategy_exec(text, strategy_args, callbacks, cache) + + # If it is a single string, then return just the translation for that string + if isinstance(text, str): + return result.translations[0] + + # Otherwise, return a list of translations, one for each item in the input + return list(result.translations) + + results = await derive_from_rows( + output_df, + run_strategy, + callbacks, + scheduling_type=async_mode, + num_threads=kwargs.get("num_threads", 4), + ) + output_df[to] = results + return TableContainer(table=output_df) + + +def _load_strategy(strategy: TextTranslateStrategyType) -> TextTranslationStrategy: + match strategy: + case TextTranslateStrategyType.openai: + from .strategies.openai import run as run_openai + + return run_openai + + case TextTranslateStrategyType.mock: + from .strategies.mock import run as run_mock + + return run_mock + + case _: + msg = f"Unknown strategy: {strategy}" + raise ValueError(msg) diff --git a/graphrag/index/verbs/unzip.py b/graphrag/index/verbs/unzip.py new file mode 100644 index 00000000..4d8c8da0 --- /dev/null +++ b/graphrag/index/verbs/unzip.py @@ -0,0 +1,25 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing unzip method definition.""" + +from typing import cast + +import pandas as pd +from datashaper import TableContainer, VerbInput, verb + + +# TODO: Check if this is already a thing +# Takes 1|(x,y)|b +# and converts to +# 1|x|y|b +@verb(name="unzip") +def unzip( + input: VerbInput, column: str, to: list[str], **_kwargs: dict +) -> TableContainer: + """Unpacks a column containing a tuple into multiple columns.""" + table = cast(pd.DataFrame, input.get_input()) + + table[to] = pd.DataFrame(table[column].tolist(), index=table.index) + + return TableContainer(table=table) diff --git a/graphrag/index/verbs/zip.py b/graphrag/index/verbs/zip.py new file mode 100644 index 00000000..462395d3 --- /dev/null +++ b/graphrag/index/verbs/zip.py @@ -0,0 +1,51 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing ds_zip method definition.""" + +from typing import cast + +import pandas as pd +from datashaper import TableContainer, VerbInput, verb + + +@verb(name="zip") +def zip_verb( + input: VerbInput, + to: str, + columns: list[str], + type: str | None = None, # noqa A002 + **_kwargs: dict, +) -> TableContainer: + """ + Zip columns together. + + ## Usage + TODO + + """ + table = cast(pd.DataFrame, input.get_input()) + if type is None: + table[to] = list(zip(*[table[col] for col in columns], strict=True)) + + # This one is a little weird + elif type == "dict": + if len(columns) != 2: + msg = f"Expected exactly two columns for a dict, got {columns}" + raise ValueError(msg) + key_col, value_col = columns + + results = [] + for _, row in table.iterrows(): + keys = row[key_col] + values = row[value_col] + output = {} + if len(keys) != len(values): + msg = f"Expected same number of keys and values, got {len(keys)} keys and {len(values)} values" + raise ValueError(msg) + for idx, key in enumerate(keys): + output[key] = values[idx] + results.append(output) + + table[to] = results + return TableContainer(table=table.reset_index(drop=True)) diff --git a/graphrag/index/workflows/__init__.py b/graphrag/index/workflows/__init__.py new file mode 100644 index 00000000..ed580309 --- /dev/null +++ b/graphrag/index/workflows/__init__.py @@ -0,0 +1,25 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine workflows package root.""" + +from .load import create_workflow, load_workflows +from .typing import ( + StepDefinition, + VerbDefinitions, + VerbTiming, + WorkflowConfig, + WorkflowDefinitions, + WorkflowToRun, +) + +__all__ = [ + "StepDefinition", + "VerbDefinitions", + "VerbTiming", + "WorkflowConfig", + "WorkflowDefinitions", + "WorkflowToRun", + "create_workflow", + "load_workflows", +] diff --git a/graphrag/index/workflows/default_workflows.py b/graphrag/index/workflows/default_workflows.py new file mode 100644 index 00000000..81112bee --- /dev/null +++ b/graphrag/index/workflows/default_workflows.py @@ -0,0 +1,121 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A package containing default workflows definitions.""" + +from .typing import WorkflowDefinitions +from .v1.create_base_documents import ( + build_steps as build_create_base_documents_steps, +) +from .v1.create_base_documents import ( + workflow_name as create_base_documents, +) +from .v1.create_base_entity_graph import ( + build_steps as build_create_base_entity_graph_steps, +) +from .v1.create_base_entity_graph import ( + workflow_name as create_base_entity_graph, +) +from .v1.create_base_extracted_entities import ( + build_steps as build_create_base_extracted_entities_steps, +) +from .v1.create_base_extracted_entities import ( + workflow_name as create_base_extracted_entities, +) +from .v1.create_base_text_units import ( + build_steps as build_create_base_text_units_steps, +) +from .v1.create_base_text_units import ( + workflow_name as create_base_text_units, +) +from .v1.create_final_communities import ( + build_steps as build_create_final_communities_steps, +) +from .v1.create_final_communities import ( + workflow_name as create_final_communities, +) +from .v1.create_final_community_reports import ( + build_steps as build_create_final_community_reports_steps, +) +from .v1.create_final_community_reports import ( + workflow_name as create_final_community_reports, +) +from .v1.create_final_covariates import ( + build_steps as build_create_final_covariates_steps, +) +from .v1.create_final_covariates import ( + workflow_name as create_final_covariates, +) +from .v1.create_final_documents import ( + build_steps as build_create_final_documents_steps, +) +from .v1.create_final_documents import ( + workflow_name as create_final_documents, +) +from .v1.create_final_entities import ( + build_steps as build_create_final_entities_steps, +) +from .v1.create_final_entities import ( + workflow_name as create_final_entities, +) +from .v1.create_final_nodes import ( + build_steps as build_create_final_nodes_steps, +) +from .v1.create_final_nodes import ( + workflow_name as create_final_nodes, +) +from .v1.create_final_relationships import ( + build_steps as build_create_final_relationships_steps, +) +from .v1.create_final_relationships import ( + workflow_name as create_final_relationships, +) +from .v1.create_final_text_units import ( + build_steps as build_create_final_text_units, +) +from .v1.create_final_text_units import ( + workflow_name as create_final_text_units, +) +from .v1.create_summarized_entities import ( + build_steps as build_create_summarized_entities_steps, +) +from .v1.create_summarized_entities import ( + workflow_name as create_summarized_entities, +) +from .v1.join_text_units_to_covariate_ids import ( + build_steps as join_text_units_to_covariate_ids_steps, +) +from .v1.join_text_units_to_covariate_ids import ( + workflow_name as join_text_units_to_covariate_ids, +) +from .v1.join_text_units_to_entity_ids import ( + build_steps as join_text_units_to_entity_ids_steps, +) +from .v1.join_text_units_to_entity_ids import ( + workflow_name as join_text_units_to_entity_ids, +) +from .v1.join_text_units_to_relationship_ids import ( + build_steps as join_text_units_to_relationship_ids_steps, +) +from .v1.join_text_units_to_relationship_ids import ( + workflow_name as join_text_units_to_relationship_ids, +) + +default_workflows: WorkflowDefinitions = { + create_base_extracted_entities: build_create_base_extracted_entities_steps, + create_base_entity_graph: build_create_base_entity_graph_steps, + create_base_text_units: build_create_base_text_units_steps, + create_final_text_units: build_create_final_text_units, + create_final_community_reports: build_create_final_community_reports_steps, + create_final_nodes: build_create_final_nodes_steps, + create_final_relationships: build_create_final_relationships_steps, + create_final_documents: build_create_final_documents_steps, + create_final_covariates: build_create_final_covariates_steps, + create_base_documents: build_create_base_documents_steps, + create_final_entities: build_create_final_entities_steps, + create_final_communities: build_create_final_communities_steps, + create_summarized_entities: build_create_summarized_entities_steps, + join_text_units_to_entity_ids: join_text_units_to_entity_ids_steps, + join_text_units_to_covariate_ids: join_text_units_to_covariate_ids_steps, + join_text_units_to_relationship_ids: join_text_units_to_relationship_ids_steps, +} diff --git a/graphrag/index/workflows/load.py b/graphrag/index/workflows/load.py new file mode 100644 index 00000000..4dd6f9bf --- /dev/null +++ b/graphrag/index/workflows/load.py @@ -0,0 +1,171 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing load_workflows, create_workflow, _get_steps_for_workflow and _remove_disabled_steps methods definition.""" + +from __future__ import annotations + +import logging +from collections.abc import Callable +from typing import TYPE_CHECKING, Any, NamedTuple, cast + +from datashaper import Workflow + +from graphrag.index.errors import ( + NoWorkflowsDefinedError, + UndefinedWorkflowError, + UnknownWorkflowError, +) +from graphrag.index.utils import topological_sort + +from .default_workflows import default_workflows as _default_workflows +from .typing import VerbDefinitions, WorkflowDefinitions, WorkflowToRun + +if TYPE_CHECKING: + from graphrag.index.config import ( + PipelineWorkflowConfig, + PipelineWorkflowReference, + PipelineWorkflowStep, + ) + +anonymous_workflow_count = 0 + +VerbFn = Callable[..., Any] +log = logging.getLogger(__name__) + + +class LoadWorkflowResult(NamedTuple): + """A workflow loading result object.""" + + workflows: list[WorkflowToRun] + """The loaded workflow names in the order they should be run.""" + + dependencies: dict[str, list[str]] + """A dictionary of workflow name to workflow dependencies.""" + + +def load_workflows( + workflows_to_load: list[PipelineWorkflowReference], + additional_verbs: VerbDefinitions | None = None, + additional_workflows: WorkflowDefinitions | None = None, + memory_profile: bool = False, +) -> LoadWorkflowResult: + """Load the given workflows. + + Args: + - workflows_to_load - The workflows to load + - additional_verbs - The list of custom verbs available to the workflows + - additional_workflows - The list of custom workflows + Returns: + - output[0] - The loaded workflow names in the order they should be run + - output[1] - A dictionary of workflow name to workflow dependencies + """ + workflow_graph: dict[str, WorkflowToRun] = {} + + global anonymous_workflow_count + for reference in workflows_to_load: + name = reference.name + is_anonymous = name is None or name.strip() == "" + if is_anonymous: + name = f"Anonymous Workflow {anonymous_workflow_count}" + anonymous_workflow_count += 1 + name = cast(str, name) + + config = reference.config + workflow = create_workflow( + name or "MISSING NAME!", + reference.steps, + config, + additional_verbs, + additional_workflows, + ) + workflow_graph[name] = WorkflowToRun(workflow, config=config or {}) + + # Backfill any missing workflows + for name in list(workflow_graph.keys()): + workflow = workflow_graph[name] + deps = [ + d.replace("workflow:", "") + for d in workflow.workflow.dependencies + if d.startswith("workflow:") + ] + for dependency in deps: + if dependency not in workflow_graph: + reference = {"name": dependency, **workflow.config} + workflow_graph[dependency] = WorkflowToRun( + workflow=create_workflow( + dependency, + config=reference, + additional_verbs=additional_verbs, + additional_workflows=additional_workflows, + memory_profile=memory_profile, + ), + config=reference, + ) + + # Run workflows in order of dependencies + def filter_wf_dependencies(name: str) -> list[str]: + externals = [ + e.replace("workflow:", "") + for e in workflow_graph[name].workflow.dependencies + ] + return [e for e in externals if e in workflow_graph] + + task_graph = {name: filter_wf_dependencies(name) for name in workflow_graph} + workflow_run_order = topological_sort(task_graph) + workflows = [workflow_graph[name] for name in workflow_run_order] + log.info("Workflow Run Order: %s", workflow_run_order) + return LoadWorkflowResult(workflows=workflows, dependencies=task_graph) + + +def create_workflow( + name: str, + steps: list[PipelineWorkflowStep] | None = None, + config: PipelineWorkflowConfig | None = None, + additional_verbs: VerbDefinitions | None = None, + additional_workflows: WorkflowDefinitions | None = None, + memory_profile: bool = False, +) -> Workflow: + """Create a workflow from the given config.""" + additional_workflows = { + **_default_workflows, + **(additional_workflows or {}), + } + steps = steps or _get_steps_for_workflow(name, config, additional_workflows) + steps = _remove_disabled_steps(steps) + return Workflow( + verbs=additional_verbs or {}, + schema={ + "name": name, + "steps": steps, + }, + validate=False, + memory_profile=memory_profile, + ) + + +def _get_steps_for_workflow( + name: str | None, + config: PipelineWorkflowConfig | None, + workflows: dict[str, Callable] | None, +) -> list[PipelineWorkflowStep]: + """Get the steps for the given workflow config.""" + if config is not None and "steps" in config: + return config["steps"] + + if workflows is None: + raise NoWorkflowsDefinedError + + if name is None: + raise UndefinedWorkflowError + + if name not in workflows: + raise UnknownWorkflowError(name) + + return workflows[name](config or {}) + + +def _remove_disabled_steps( + steps: list[PipelineWorkflowStep], +) -> list[PipelineWorkflowStep]: + return [step for step in steps if step.get("enabled", True)] diff --git a/graphrag/index/workflows/typing.py b/graphrag/index/workflows/typing.py new file mode 100644 index 00000000..3b44545b --- /dev/null +++ b/graphrag/index/workflows/typing.py @@ -0,0 +1,33 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'WorkflowToRun' model.""" + +from collections.abc import Callable +from dataclasses import dataclass as dc_dataclass +from typing import Any + +from datashaper import TableContainer, Workflow + +StepDefinition = dict[str, Any] +"""A step definition.""" + +VerbDefinitions = dict[str, Callable[..., TableContainer]] +"""A mapping of verb names to their implementations.""" + +WorkflowConfig = dict[str, Any] +"""A workflow configuration.""" + +WorkflowDefinitions = dict[str, Callable[[WorkflowConfig], list[StepDefinition]]] +"""A mapping of workflow names to their implementations.""" + +VerbTiming = dict[str, float] +"""The timings of verbs by id.""" + + +@dc_dataclass +class WorkflowToRun: + """Workflow to run class definition.""" + + workflow: Workflow + config: dict[str, Any] diff --git a/graphrag/index/workflows/v1/__init__.py b/graphrag/index/workflows/v1/__init__.py new file mode 100644 index 00000000..69518f5e --- /dev/null +++ b/graphrag/index/workflows/v1/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Indexing Engine workflows package root.""" diff --git a/graphrag/index/workflows/v1/create_base_documents.py b/graphrag/index/workflows/v1/create_base_documents.py new file mode 100644 index 00000000..bd7094c6 --- /dev/null +++ b/graphrag/index/workflows/v1/create_base_documents.py @@ -0,0 +1,105 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing build_steps method definition.""" + +from datashaper import DEFAULT_INPUT_NAME + +from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep + +workflow_name = "create_base_documents" + + +def build_steps( + config: PipelineWorkflowConfig, +) -> list[PipelineWorkflowStep]: + """ + Create the documents table. + + ## Dependencies + * `workflow:create_final_text_units` + """ + document_attribute_columns = config.get("document_attribute_columns", []) + return [ + { + "verb": "unroll", + "args": {"column": "document_ids"}, + "input": {"source": "workflow:create_final_text_units"}, + }, + { + "verb": "select", + "args": { + # We only need the chunk id and the document id + "columns": ["id", "document_ids", "text"] + }, + }, + { + "id": "rename_chunk_doc_id", + "verb": "rename", + "args": { + "columns": { + "document_ids": "chunk_doc_id", + "id": "chunk_id", + "text": "chunk_text", + } + }, + }, + { + "verb": "join", + "args": { + # Join the doc id from the chunk onto the original document + "on": ["chunk_doc_id", "id"] + }, + "input": {"source": "rename_chunk_doc_id", "others": [DEFAULT_INPUT_NAME]}, + }, + { + "id": "docs_with_text_units", + "verb": "aggregate_override", + "args": { + "groupby": ["id"], + "aggregations": [ + { + "column": "chunk_id", + "operation": "array_agg", + "to": "text_units", + } + ], + }, + }, + { + "verb": "join", + "args": { + "on": ["id", "id"], + "strategy": "right outer", + }, + "input": { + "source": "docs_with_text_units", + "others": [DEFAULT_INPUT_NAME], + }, + }, + { + "verb": "rename", + "args": {"columns": {"text": "raw_content"}}, + }, + *[ + { + "verb": "convert", + "args": { + "column": column, + "to": column, + "type": "string", + }, + } + for column in document_attribute_columns + ], + { + "verb": "merge_override", + "enabled": len(document_attribute_columns) > 0, + "args": { + "columns": document_attribute_columns, + "strategy": "json", + "to": "attributes", + }, + }, + {"verb": "convert", "args": {"column": "id", "to": "id", "type": "string"}}, + ] diff --git a/graphrag/index/workflows/v1/create_base_entity_graph.py b/graphrag/index/workflows/v1/create_base_entity_graph.py new file mode 100644 index 00000000..b001aad2 --- /dev/null +++ b/graphrag/index/workflows/v1/create_base_entity_graph.py @@ -0,0 +1,91 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing build_steps method definition.""" + +from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep + +workflow_name = "create_base_entity_graph" + + +def build_steps( + config: PipelineWorkflowConfig, +) -> list[PipelineWorkflowStep]: + """ + Create the base table for the entity graph. + + ## Dependencies + * `workflow:create_base_extracted_entities` + """ + clustering_config = config.get( + "cluster_graph", + {"strategy": {"type": "leiden"}}, + ) + embed_graph_config = config.get( + "embed_graph", + { + "strategy": { + "type": "node2vec", + "num_walks": config.get("embed_num_walks", 10), + "walk_length": config.get("embed_walk_length", 40), + "window_size": config.get("embed_window_size", 2), + "iterations": config.get("embed_iterations", 3), + "random_seed": config.get("embed_random_seed", 86), + } + }, + ) + + graphml_snapshot_enabled = config.get("graphml_snapshot", False) or False + embed_graph_enabled = config.get("embed_graph_enabled", False) or False + + return [ + { + "verb": "cluster_graph", + "args": { + **clustering_config, + "column": "entity_graph", + "to": "clustered_graph", + "level_to": "level", + }, + "input": ({"source": "workflow:create_summarized_entities"}), + }, + { + "verb": "snapshot_rows", + "enabled": graphml_snapshot_enabled, + "args": { + "base_name": "clustered_graph", + "column": "clustered_graph", + "formats": [{"format": "text", "extension": "graphml"}], + }, + }, + { + "verb": "embed_graph", + "enabled": embed_graph_enabled, + "args": { + "column": "clustered_graph", + "to": "embeddings", + **embed_graph_config, + }, + }, + { + "verb": "snapshot_rows", + "enabled": graphml_snapshot_enabled, + "args": { + "base_name": "embedded_graph", + "column": "entity_graph", + "formats": [{"format": "text", "extension": "graphml"}], + }, + }, + { + "verb": "select", + "args": { + # only selecting for documentation sake, so we know what is contained in + # this workflow + "columns": ( + ["level", "clustered_graph", "embeddings"] + if embed_graph_enabled + else ["level", "clustered_graph"] + ), + }, + }, + ] diff --git a/graphrag/index/workflows/v1/create_base_extracted_entities.py b/graphrag/index/workflows/v1/create_base_extracted_entities.py new file mode 100644 index 00000000..30d608e9 --- /dev/null +++ b/graphrag/index/workflows/v1/create_base_extracted_entities.py @@ -0,0 +1,95 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing build_steps method definition.""" + +from datashaper import AsyncType + +from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep + +workflow_name = "create_base_extracted_entities" + + +def build_steps( + config: PipelineWorkflowConfig, +) -> list[PipelineWorkflowStep]: + """ + Create the base table for extracted entities. + + ## Dependencies + * `workflow:create_base_text_units` + """ + entity_extraction_config = config.get("entity_extract", {}) + graphml_snapshot_enabled = config.get("graphml_snapshot", False) or False + raw_entity_snapshot_enabled = config.get("raw_entity_snapshot", False) or False + + return [ + { + "verb": "entity_extract", + "args": { + **entity_extraction_config, + "column": entity_extraction_config.get("text_column", "chunk"), + "id_column": entity_extraction_config.get("id_column", "chunk_id"), + "async_mode": entity_extraction_config.get( + "async_mode", AsyncType.AsyncIO + ), + "to": "entities", + "graph_to": "entity_graph", + }, + "input": {"source": "workflow:create_base_text_units"}, + }, + { + "verb": "snapshot", + "enabled": raw_entity_snapshot_enabled, + "args": { + "name": "raw_extracted_entities", + "formats": ["json"], + }, + }, + { + "verb": "merge_graphs", + "args": { + "column": "entity_graph", + "to": "entity_graph", + **config.get( + "graph_merge_operations", + { + "nodes": { + "source_id": { + "operation": "concat", + "delimiter": ", ", + "distinct": True, + }, + "description": ({ + "operation": "concat", + "separator": "\n", + "distinct": False, + }), + }, + "edges": { + "source_id": { + "operation": "concat", + "delimiter": ", ", + "distinct": True, + }, + "description": ({ + "operation": "concat", + "separator": "\n", + "distinct": False, + }), + "weight": "sum", + }, + }, + ), + }, + }, + { + "verb": "snapshot_rows", + "enabled": graphml_snapshot_enabled, + "args": { + "base_name": "merged_graph", + "column": "entity_graph", + "formats": [{"format": "text", "extension": "graphml"}], + }, + }, + ] diff --git a/graphrag/index/workflows/v1/create_base_text_units.py b/graphrag/index/workflows/v1/create_base_text_units.py new file mode 100644 index 00000000..63876e5e --- /dev/null +++ b/graphrag/index/workflows/v1/create_base_text_units.py @@ -0,0 +1,112 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing build_steps method definition.""" + +from datashaper import DEFAULT_INPUT_NAME + +from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep + +workflow_name = "create_base_text_units" + + +def build_steps( + config: PipelineWorkflowConfig, +) -> list[PipelineWorkflowStep]: + """ + Create the base table for text units. + + ## Dependencies + None + """ + chunk_column_name = config.get("chunk_column", "chunk") + chunk_by_columns = config.get("chunk_by", []) or [] + n_tokens_column_name = config.get("n_tokens_column", "n_tokens") + return [ + { + "verb": "orderby", + "args": { + "orders": [ + # sort for reproducibility + {"column": "id", "direction": "asc"}, + ] + }, + "input": {"source": DEFAULT_INPUT_NAME}, + }, + { + "verb": "zip", + "args": { + # Pack the document ids with the text + # So when we unpack the chunks, we can restore the document id + "columns": ["id", "text"], + "to": "text_with_ids", + }, + }, + { + "verb": "aggregate_override", + "args": { + "groupby": [*chunk_by_columns] if len(chunk_by_columns) > 0 else None, + "aggregations": [ + { + "column": "text_with_ids", + "operation": "array_agg", + "to": "texts", + } + ], + }, + }, + { + "verb": "chunk", + "args": {"column": "texts", "to": "chunks", **config.get("text_chunk", {})}, + }, + { + "verb": "select", + "args": { + "columns": [*chunk_by_columns, "chunks"], + }, + }, + { + "verb": "unroll", + "args": { + "column": "chunks", + }, + }, + { + "verb": "rename", + "args": { + "columns": { + "chunks": chunk_column_name, + } + }, + }, + { + "verb": "genid", + "args": { + # Generate a unique id for each chunk + "to": "chunk_id", + "method": "md5_hash", + "hash": [chunk_column_name], + }, + }, + { + "verb": "unzip", + "args": { + "column": chunk_column_name, + "to": ["document_ids", chunk_column_name, n_tokens_column_name], + }, + }, + {"verb": "copy", "args": {"column": "chunk_id", "to": "id"}}, + { + # ELIMINATE EMPTY CHUNKS + "verb": "filter", + "args": { + "column": chunk_column_name, + "criteria": [ + { + "type": "value", + "operator": "is not empty", + } + ], + }, + }, + ] diff --git a/graphrag/index/workflows/v1/create_final_communities.py b/graphrag/index/workflows/v1/create_final_communities.py new file mode 100644 index 00000000..f8949dfc --- /dev/null +++ b/graphrag/index/workflows/v1/create_final_communities.py @@ -0,0 +1,172 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing build_steps method definition.""" + +from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep + +workflow_name = "create_final_communities" + + +def build_steps( + _config: PipelineWorkflowConfig, +) -> list[PipelineWorkflowStep]: + """ + Create the final communities table. + + ## Dependencies + * `workflow:create_base_entity_graph` + """ + return [ + { + "id": "graph_nodes", + "verb": "unpack_graph", + "args": { + "column": "clustered_graph", + "type": "nodes", + }, + "input": {"source": "workflow:create_base_entity_graph"}, + }, + { + "id": "graph_edges", + "verb": "unpack_graph", + "args": { + "column": "clustered_graph", + "type": "edges", + }, + "input": {"source": "workflow:create_base_entity_graph"}, + }, + { + "id": "source_clusters", + "verb": "join", + "args": { + "on": ["label", "source"], + }, + "input": {"source": "graph_nodes", "others": ["graph_edges"]}, + }, + { + "id": "target_clusters", + "verb": "join", + "args": { + "on": ["label", "target"], + }, + "input": {"source": "graph_nodes", "others": ["graph_edges"]}, + }, + { + "id": "concatenated_clusters", + "verb": "concat", + "input": { + "source": "source_clusters", + "others": ["target_clusters"], + }, + }, + { + "id": "combined_clusters", + "verb": "filter", + "args": { + # level_1 is the left side of the join + # level_2 is the right side of the join + "column": "level_1", + "criteria": [ + {"type": "column", "operator": "equals", "value": "level_2"} + ], + }, + "input": {"source": "concatenated_clusters"}, + }, + { + "id": "cluster_relationships", + "verb": "aggregate_override", + "args": { + "groupby": [ + "cluster", + "level_1", # level_1 is the left side of the join + ], + "aggregations": [ + { + "column": "id_2", # this is the id of the edge from the join steps above + "to": "relationship_ids", + "operation": "array_agg_distinct", + }, + { + "column": "source_id_1", + "to": "text_unit_ids", + "operation": "array_agg_distinct", + }, + ], + }, + "input": {"source": "combined_clusters"}, + }, + { + "id": "all_clusters", + "verb": "aggregate_override", + "args": { + "groupby": ["cluster", "level"], + "aggregations": [{"column": "cluster", "to": "id", "operation": "any"}], + }, + "input": {"source": "graph_nodes"}, + }, + { + "verb": "join", + "args": { + "on": ["id", "cluster"], + }, + "input": {"source": "all_clusters", "others": ["cluster_relationships"]}, + }, + { + "verb": "filter", + "args": { + # level is the left side of the join + # level_1 is the right side of the join + "column": "level", + "criteria": [ + {"type": "column", "operator": "equals", "value": "level_1"} + ], + }, + }, + *create_community_title_wf, + { + # TODO: Rodrigo says "raw_community" is temporary + "verb": "copy", + "args": { + "column": "id", + "to": "raw_community", + }, + }, + { + "verb": "select", + "args": { + "columns": [ + "id", + "title", + "level", + "raw_community", + "relationship_ids", + "text_unit_ids", + ], + }, + }, + ] + + +create_community_title_wf = [ + # Hack to string concat "Community " + id + { + "verb": "fill", + "args": { + "to": "__temp", + "value": "Community ", + }, + }, + { + "verb": "merge", + "args": { + "columns": [ + "__temp", + "id", + ], + "to": "title", + "strategy": "concat", + "preserveSource": True, + }, + }, +] diff --git a/graphrag/index/workflows/v1/create_final_community_reports.py b/graphrag/index/workflows/v1/create_final_community_reports.py new file mode 100644 index 00000000..164c70e0 --- /dev/null +++ b/graphrag/index/workflows/v1/create_final_community_reports.py @@ -0,0 +1,133 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing build_steps method definition.""" + +from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep + +workflow_name = "create_final_community_reports" + + +def build_steps( + config: PipelineWorkflowConfig, +) -> list[PipelineWorkflowStep]: + """ + Create the final community reports table. + + ## Dependencies + * `workflow:create_base_entity_graph` + """ + covariates_enabled = config.get("covariates_enabled", False) + create_community_reports_config = config.get("create_community_reports", {}) + base_text_embed = config.get("text_embed", {}) + community_report_full_content_embed_config = config.get( + "community_report_full_content_embed", base_text_embed + ) + community_report_summary_embed_config = config.get( + "community_report_summary_embed", base_text_embed + ) + community_report_title_embed_config = config.get( + "community_report_title_embed", base_text_embed + ) + skip_title_embedding = config.get("skip_title_embedding", False) + skip_summary_embedding = config.get("skip_summary_embedding", False) + skip_full_content_embedding = config.get("skip_full_content_embedding", False) + + return [ + # + # Subworkflow: Prepare Nodes + # + { + "id": "nodes", + "verb": "prepare_community_reports_nodes", + "input": {"source": "workflow:create_final_nodes"}, + }, + # + # Subworkflow: Prepare Edges + # + { + "id": "edges", + "verb": "prepare_community_reports_edges", + "input": {"source": "workflow:create_final_relationships"}, + }, + # + # Subworkflow: Prepare Claims Table + # + { + "id": "claims", + "enabled": covariates_enabled, + "verb": "prepare_community_reports_claims", + "input": { + "source": "workflow:create_final_covariates", + } + if covariates_enabled + else {}, + }, + # + # Subworkflow: Get Community Hierarchy + # + { + "id": "community_hierarchy", + "verb": "restore_community_hierarchy", + "input": {"source": "nodes"}, + }, + # + # Main Workflow: Create Community Reports + # + { + "id": "local_contexts", + "verb": "prepare_community_reports", + "input": { + "source": "nodes", + "nodes": "nodes", + "edges": "edges", + **({"claims": "claims"} if covariates_enabled else {}), + }, + }, + { + "verb": "create_community_reports", + "args": { + **create_community_reports_config, + }, + "input": { + "source": "local_contexts", + "community_hierarchy": "community_hierarchy", + "nodes": "nodes", + }, + }, + { + # Generate a unique ID for each community report distinct from the community ID + "verb": "window", + "args": {"to": "id", "operation": "uuid", "column": "community"}, + }, + { + "verb": "text_embed", + "enabled": not skip_full_content_embedding, + "args": { + "embedding_name": "community_report_full_content", + "column": "full_content", + "to": "full_content_embedding", + **community_report_full_content_embed_config, + }, + }, + { + "verb": "text_embed", + "enabled": not skip_summary_embedding, + "args": { + "embedding_name": "community_report_summary", + "column": "summary", + "to": "summary_embedding", + **community_report_summary_embed_config, + }, + }, + { + "verb": "text_embed", + "enabled": not skip_title_embedding, + "args": { + "embedding_name": "community_report_title", + "column": "title", + "to": "title_embedding", + **community_report_title_embed_config, + }, + }, + ] diff --git a/graphrag/index/workflows/v1/create_final_covariates.py b/graphrag/index/workflows/v1/create_final_covariates.py new file mode 100644 index 00000000..d1090e50 --- /dev/null +++ b/graphrag/index/workflows/v1/create_final_covariates.py @@ -0,0 +1,90 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing build_steps method definition.""" + +from datashaper import AsyncType + +from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep + +workflow_name = "create_final_covariates" + + +def build_steps( + config: PipelineWorkflowConfig, +) -> list[PipelineWorkflowStep]: + """ + Create the final covariates table. + + ## Dependencies + * `workflow:create_base_text_units` + * `workflow:create_base_extracted_entities` + """ + claim_extract_config = config.get("claim_extract", {}) + + input = {"source": "workflow:create_base_text_units"} + + return [ + { + "verb": "extract_covariates", + "args": { + "column": config.get("chunk_column", "chunk"), + "id_column": config.get("chunk_id_column", "chunk_id"), + "resolved_entities_column": "resolved_entities", + "covariate_type": "claim", + "async_mode": config.get("async_mode", AsyncType.AsyncIO), + **claim_extract_config, + }, + "input": input, + }, + { + "verb": "window", + "args": {"to": "id", "operation": "uuid", "column": "covariate_type"}, + }, + { + "verb": "genid", + "args": { + "to": "human_readable_id", + "method": "increment", + }, + }, + { + "verb": "convert", + "args": { + "column": "human_readable_id", + "type": "string", + "to": "human_readable_id", + }, + }, + { + "verb": "rename", + "args": { + "columns": { + "chunk_id": "text_unit_id", + } + }, + }, + { + "verb": "select", + "args": { + "columns": [ + "id", + "human_readable_id", + "covariate_type", + "type", + "description", + "subject_id", + "subject_type", + "object_id", + "object_type", + "status", + "start_date", + "end_date", + "source_text", + "text_unit_id", + "document_ids", + "n_tokens", + ] + }, + }, + ] diff --git a/graphrag/index/workflows/v1/create_final_documents.py b/graphrag/index/workflows/v1/create_final_documents.py new file mode 100644 index 00000000..d09ce001 --- /dev/null +++ b/graphrag/index/workflows/v1/create_final_documents.py @@ -0,0 +1,41 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing build_steps method definition.""" + +from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep + +workflow_name = "create_final_documents" + + +def build_steps( + config: PipelineWorkflowConfig, +) -> list[PipelineWorkflowStep]: + """ + Create the final documents table. + + ## Dependencies + * `workflow:create_base_documents` + * `workflow:create_base_document_nodes` + """ + base_text_embed = config.get("text_embed", {}) + document_raw_content_embed_config = config.get( + "document_raw_content_embed", base_text_embed + ) + skip_raw_content_embedding = config.get("skip_raw_content_embedding", False) + return [ + { + "verb": "rename", + "args": {"columns": {"text_units": "text_unit_ids"}}, + "input": {"source": "workflow:create_base_documents"}, + }, + { + "verb": "text_embed", + "enabled": not skip_raw_content_embedding, + "args": { + "column": "raw_content", + "to": "raw_content_embedding", + **document_raw_content_embed_config, + }, + }, + ] diff --git a/graphrag/index/workflows/v1/create_final_entities.py b/graphrag/index/workflows/v1/create_final_entities.py new file mode 100644 index 00000000..9d8b962b --- /dev/null +++ b/graphrag/index/workflows/v1/create_final_entities.py @@ -0,0 +1,133 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing build_steps method definition.""" + +from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep + +workflow_name = "create_final_entities" + + +def build_steps( + config: PipelineWorkflowConfig, +) -> list[PipelineWorkflowStep]: + """ + Create the final entities table. + + ## Dependencies + * `workflow:create_base_entity_graph` + """ + base_text_embed = config.get("text_embed", {}) + entity_name_embed_config = config.get("entity_name_embed", base_text_embed) + entity_name_description_embed_config = config.get( + "entity_name_description_embed", base_text_embed + ) + skip_name_embedding = config.get("skip_name_embedding", False) + skip_description_embedding = config.get("skip_description_embedding", False) + is_using_vector_store = ( + entity_name_embed_config.get("strategy", {}).get("vector_store", None) + is not None + ) + + return [ + { + "verb": "unpack_graph", + "args": { + "column": "clustered_graph", + "type": "nodes", + }, + "input": {"source": "workflow:create_base_entity_graph"}, + }, + {"verb": "rename", "args": {"columns": {"label": "title"}}}, + { + "verb": "select", + "args": { + "columns": [ + "id", + "title", + "type", + "description", + "human_readable_id", + "graph_embedding", + "source_id", + ], + }, + }, + { + # create_base_entity_graph has multiple levels of clustering, which means there are multiple graphs with the same entities + # this dedupes the entities so that there is only one of each entity + "verb": "dedupe", + "args": {"columns": ["id"]}, + }, + {"verb": "rename", "args": {"columns": {"title": "name"}}}, + { + # ELIMINATE EMPTY NAMES + "verb": "filter", + "args": { + "column": "name", + "criteria": [ + { + "type": "value", + "operator": "is not empty", + } + ], + }, + }, + { + "verb": "text_split", + "args": {"separator": ",", "column": "source_id", "to": "text_unit_ids"}, + }, + {"verb": "drop", "args": {"columns": ["source_id"]}}, + { + "verb": "text_embed", + "enabled": not skip_name_embedding, + "args": { + "embedding_name": "entity_name", + "column": "name", + "to": "name_embedding", + **entity_name_embed_config, + }, + }, + { + "verb": "merge", + "enabled": not skip_description_embedding, + "args": { + "strategy": "concat", + "columns": ["name", "description"], + "to": "name_description", + "delimiter": ":", + "preserveSource": True, + }, + }, + { + "verb": "text_embed", + "enabled": not skip_description_embedding, + "args": { + "embedding_name": "entity_name_description", + "column": "name_description", + "to": "description_embedding", + **entity_name_description_embed_config, + }, + }, + { + "verb": "drop", + "enabled": not skip_description_embedding, + "args": { + "columns": ["name_description"], + }, + }, + { + # ELIMINATE EMPTY DESCRIPTION EMBEDDINGS + "verb": "filter", + "enabled": not skip_description_embedding and not is_using_vector_store, + "args": { + "column": "description_embedding", + "criteria": [ + { + "type": "value", + "operator": "is not empty", + } + ], + }, + }, + ] diff --git a/graphrag/index/workflows/v1/create_final_nodes.py b/graphrag/index/workflows/v1/create_final_nodes.py new file mode 100644 index 00000000..31277e7b --- /dev/null +++ b/graphrag/index/workflows/v1/create_final_nodes.py @@ -0,0 +1,116 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing build_steps method definition.""" + +from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep + +workflow_name = "create_final_nodes" + + +def build_steps( + config: PipelineWorkflowConfig, +) -> list[PipelineWorkflowStep]: + """ + Create the base table for the document graph. + + ## Dependencies + * `workflow:create_base_entity_graph` + """ + snapshot_top_level_nodes = config.get("snapshot_top_level_nodes", False) + layout_graph_enabled = config.get("layout_graph_enabled", True) + _compute_top_level_node_positions = [ + { + "verb": "unpack_graph", + "args": {"column": "positioned_graph", "type": "nodes"}, + "input": {"source": "laid_out_entity_graph"}, + }, + { + "verb": "filter", + "args": { + "column": "level", + "criteria": [ + { + "type": "value", + "operator": "equals", + "value": config.get("level_for_node_positions", 0), + } + ], + }, + }, + { + "verb": "select", + "args": {"columns": ["id", "x", "y"]}, + }, + { + "verb": "snapshot", + "enabled": snapshot_top_level_nodes, + "args": { + "name": "top_level_nodes", + "formats": ["json"], + }, + }, + { + "id": "_compute_top_level_node_positions", + "verb": "rename", + "args": { + "columns": { + "id": "top_level_node_id", + } + }, + }, + { + "verb": "convert", + "args": { + "column": "top_level_node_id", + "to": "top_level_node_id", + "type": "string", + }, + }, + ] + layout_graph_config = config.get( + "layout_graph", + { + "strategy": { + "type": "umap" if layout_graph_enabled else "zero", + }, + }, + ) + return [ + { + "id": "laid_out_entity_graph", + "verb": "layout_graph", + "args": { + "embeddings_column": "embeddings", + "graph_column": "clustered_graph", + "to": "node_positions", + "graph_to": "positioned_graph", + **layout_graph_config, + }, + "input": {"source": "workflow:create_base_entity_graph"}, + }, + { + "verb": "unpack_graph", + "args": {"column": "positioned_graph", "type": "nodes"}, + }, + { + "id": "nodes_without_positions", + "verb": "drop", + "args": {"columns": ["x", "y"]}, + }, + *_compute_top_level_node_positions, + { + "verb": "join", + "args": { + "on": ["id", "top_level_node_id"], + }, + "input": { + "source": "nodes_without_positions", + "others": ["_compute_top_level_node_positions"], + }, + }, + { + "verb": "rename", + "args": {"columns": {"label": "title", "cluster": "community"}}, + }, + ] diff --git a/graphrag/index/workflows/v1/create_final_relationships.py b/graphrag/index/workflows/v1/create_final_relationships.py new file mode 100644 index 00000000..a58c2a45 --- /dev/null +++ b/graphrag/index/workflows/v1/create_final_relationships.py @@ -0,0 +1,94 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing build_steps method definition.""" + +from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep + +workflow_name = "create_final_relationships" + + +def build_steps( + config: PipelineWorkflowConfig, +) -> list[PipelineWorkflowStep]: + """ + Create the final relationships table. + + ## Dependencies + * `workflow:create_base_entity_graph` + """ + base_text_embed = config.get("text_embed", {}) + relationship_description_embed_config = config.get( + "relationship_description_embed", base_text_embed + ) + skip_description_embedding = config.get("skip_description_embedding", False) + + return [ + { + "verb": "unpack_graph", + "args": { + "column": "clustered_graph", + "type": "edges", + }, + "input": {"source": "workflow:create_base_entity_graph"}, + }, + { + "verb": "rename", + "args": {"columns": {"source_id": "text_unit_ids"}}, + }, + { + "verb": "filter", + "args": { + "column": "level", + "criteria": [{"type": "value", "operator": "equals", "value": 0}], + }, + }, + { + "verb": "text_embed", + "enabled": not skip_description_embedding, + "args": { + "embedding_name": "relationship_description", + "column": "description", + "to": "description_embedding", + **relationship_description_embed_config, + }, + }, + { + "id": "pruned_edges", + "verb": "drop", + "args": {"columns": ["level"]}, + }, + { + "id": "filtered_nodes", + "verb": "filter", + "args": { + "column": "level", + "criteria": [{"type": "value", "operator": "equals", "value": 0}], + }, + "input": "workflow:create_final_nodes", + }, + { + "verb": "compute_edge_combined_degree", + "args": {"to": "rank"}, + "input": { + "source": "pruned_edges", + "nodes": "filtered_nodes", + }, + }, + { + "verb": "convert", + "args": { + "column": "human_readable_id", + "type": "string", + "to": "human_readable_id", + }, + }, + { + "verb": "convert", + "args": { + "column": "text_unit_ids", + "type": "array", + "to": "text_unit_ids", + }, + }, + ] diff --git a/graphrag/index/workflows/v1/create_final_text_units.py b/graphrag/index/workflows/v1/create_final_text_units.py new file mode 100644 index 00000000..56dd0a73 --- /dev/null +++ b/graphrag/index/workflows/v1/create_final_text_units.py @@ -0,0 +1,161 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing build_steps method definition.""" + +from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep + +workflow_name = "create_final_text_units" + + +def build_steps( + config: PipelineWorkflowConfig, +) -> list[PipelineWorkflowStep]: + """ + Create the final text-units table. + + ## Dependencies + * `workflow:create_base_text_units` + * `workflow:create_final_entities` + * `workflow:create_final_communities` + """ + base_text_embed = config.get("text_embed", {}) + text_unit_text_embed_config = config.get("text_unit_text_embed", base_text_embed) + covariates_enabled = config.get("covariates_enabled", False) + skip_text_unit_embedding = config.get("skip_text_unit_embedding", False) + is_using_vector_store = ( + text_unit_text_embed_config.get("strategy", {}).get("vector_store", None) + is not None + ) + + return [ + { + "verb": "select", + "args": {"columns": ["id", "chunk", "document_ids", "n_tokens"]}, + "input": {"source": "workflow:create_base_text_units"}, + }, + { + "id": "pre_entity_join", + "verb": "rename", + "args": { + "columns": { + "chunk": "text", + }, + }, + }, + # Expand the TextUnits with EntityIDs + { + "id": "pre_relationship_join", + "verb": "join", + "args": { + "on": ["id", "id"], + "strategy": "left outer", + }, + "input": { + "source": "pre_entity_join", + "others": ["workflow:join_text_units_to_entity_ids"], + }, + }, + # Expand the TextUnits with RelationshipIDs + { + "id": "pre_covariate_join", + "verb": "join", + "args": { + "on": ["id", "id"], + "strategy": "left outer", + }, + "input": { + "source": "pre_relationship_join", + "others": ["workflow:join_text_units_to_relationship_ids"], + }, + }, + # Expand the TextUnits with CovariateIDs + { + "enabled": covariates_enabled, + "verb": "join", + "args": { + "on": ["id", "id"], + "strategy": "left outer", + }, + "input": { + "source": "pre_covariate_join", + "others": ["workflow:join_text_units_to_covariate_ids"], + }, + }, + # Mash the entities and relationships into arrays + { + "verb": "aggregate_override", + "args": { + "groupby": ["id"], # from the join above + "aggregations": [ + { + "column": "text", + "operation": "any", + "to": "text", + }, + { + "column": "n_tokens", + "operation": "any", + "to": "n_tokens", + }, + { + "column": "document_ids", + "operation": "any", + "to": "document_ids", + }, + { + "column": "entity_ids", + "operation": "any", + "to": "entity_ids", + }, + { + "column": "relationship_ids", + "operation": "any", + "to": "relationship_ids", + }, + *( + [] + if not covariates_enabled + else [ + { + "column": "covariate_ids", + "operation": "any", + "to": "covariate_ids", + } + ] + ), + ], + }, + }, + # Text-Embed after final aggregations + { + "id": "embedded_text_units", + "verb": "text_embed", + "enabled": not skip_text_unit_embedding, + "args": { + "column": config.get("column", "text"), + "to": config.get("to", "text_embedding"), + **text_unit_text_embed_config, + }, + }, + { + "verb": "select", + "args": { + # Final select to get output in the correct shape + "columns": [ + "id", + "text", + *( + [] + if (skip_text_unit_embedding or is_using_vector_store) + else ["text_embedding"] + ), + "n_tokens", + "document_ids", + "entity_ids", + "relationship_ids", + *([] if not covariates_enabled else ["covariate_ids"]), + ], + }, + }, + ] diff --git a/graphrag/index/workflows/v1/create_summarized_entities.py b/graphrag/index/workflows/v1/create_summarized_entities.py new file mode 100644 index 00000000..8f8d7f00 --- /dev/null +++ b/graphrag/index/workflows/v1/create_summarized_entities.py @@ -0,0 +1,47 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing build_steps method definition.""" + +from datashaper import AsyncType + +from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep + +workflow_name = "create_summarized_entities" + + +def build_steps( + config: PipelineWorkflowConfig, +) -> list[PipelineWorkflowStep]: + """ + Create the base table for extracted entities. + + ## Dependencies + * `workflow:create_base_text_units` + """ + summarize_descriptions_config = config.get("summarize_descriptions", {}) + graphml_snapshot_enabled = config.get("graphml_snapshot", False) or False + + return [ + { + "verb": "summarize_descriptions", + "args": { + **summarize_descriptions_config, + "column": "entity_graph", + "to": "entity_graph", + "async_mode": summarize_descriptions_config.get( + "async_mode", AsyncType.AsyncIO + ), + }, + "input": {"source": "workflow:create_base_extracted_entities"}, + }, + { + "verb": "snapshot_rows", + "enabled": graphml_snapshot_enabled, + "args": { + "base_name": "summarized_graph", + "column": "entity_graph", + "formats": [{"format": "text", "extension": "graphml"}], + }, + }, + ] diff --git a/graphrag/index/workflows/v1/join_text_units_to_covariate_ids.py b/graphrag/index/workflows/v1/join_text_units_to_covariate_ids.py new file mode 100644 index 00000000..be6bddf1 --- /dev/null +++ b/graphrag/index/workflows/v1/join_text_units_to_covariate_ids.py @@ -0,0 +1,44 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing build_steps method definition.""" + +from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep + +workflow_name = "join_text_units_to_covariate_ids" + + +def build_steps( + _config: PipelineWorkflowConfig, +) -> list[PipelineWorkflowStep]: + """ + Create the final text-units table. + + ## Dependencies + * `workflow:create_final_covariates` + """ + return [ + { + "verb": "select", + "args": {"columns": ["id", "text_unit_id"]}, + "input": {"source": "workflow:create_final_covariates"}, + }, + { + "verb": "aggregate_override", + "args": { + "groupby": ["text_unit_id"], + "aggregations": [ + { + "column": "id", + "operation": "array_agg_distinct", + "to": "covariate_ids", + }, + { + "column": "text_unit_id", + "operation": "any", + "to": "id", + }, + ], + }, + }, + ] diff --git a/graphrag/index/workflows/v1/join_text_units_to_entity_ids.py b/graphrag/index/workflows/v1/join_text_units_to_entity_ids.py new file mode 100644 index 00000000..6337502d --- /dev/null +++ b/graphrag/index/workflows/v1/join_text_units_to_entity_ids.py @@ -0,0 +1,50 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing build_steps method definition.""" + +from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep + +workflow_name = "join_text_units_to_entity_ids" + + +def build_steps( + _config: PipelineWorkflowConfig, +) -> list[PipelineWorkflowStep]: + """ + Create a join table from text unit ids to entity ids. + + ## Dependencies + * `workflow:create_final_entities` + """ + return [ + { + "verb": "select", + "args": {"columns": ["id", "text_unit_ids"]}, + "input": {"source": "workflow:create_final_entities"}, + }, + { + "verb": "unroll", + "args": { + "column": "text_unit_ids", + }, + }, + { + "verb": "aggregate_override", + "args": { + "groupby": ["text_unit_ids"], + "aggregations": [ + { + "column": "id", + "operation": "array_agg_distinct", + "to": "entity_ids", + }, + { + "column": "text_unit_ids", + "operation": "any", + "to": "id", + }, + ], + }, + }, + ] diff --git a/graphrag/index/workflows/v1/join_text_units_to_relationship_ids.py b/graphrag/index/workflows/v1/join_text_units_to_relationship_ids.py new file mode 100644 index 00000000..fe6d6463 --- /dev/null +++ b/graphrag/index/workflows/v1/join_text_units_to_relationship_ids.py @@ -0,0 +1,55 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing build_steps method definition.""" + +from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep + +workflow_name = "join_text_units_to_relationship_ids" + + +def build_steps( + _config: PipelineWorkflowConfig, +) -> list[PipelineWorkflowStep]: + """ + Create a join table from text unit ids to relationship ids. + + ## Dependencies + * `workflow:create_final_relationships + """ + return [ + { + "verb": "select", + "args": {"columns": ["id", "text_unit_ids"]}, + "input": {"source": "workflow:create_final_relationships"}, + }, + { + "verb": "unroll", + "args": { + "column": "text_unit_ids", + }, + }, + { + "verb": "aggregate_override", + "args": { + "groupby": ["text_unit_ids"], + "aggregations": [ + { + "column": "id", + "operation": "array_agg_distinct", + "to": "relationship_ids", + }, + { + "column": "text_unit_ids", + "operation": "any", + "to": "id", + }, + ], + }, + }, + { + "id": "text_unit_id_to_relationship_ids", + "verb": "select", + "args": {"columns": ["id", "relationship_ids"]}, + }, + ] diff --git a/graphrag/llm/__init__.py b/graphrag/llm/__init__.py new file mode 100644 index 00000000..609be951 --- /dev/null +++ b/graphrag/llm/__init__.py @@ -0,0 +1,91 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Datashaper OpenAI Utilities package.""" + +from .base import BaseLLM, CachingLLM, RateLimitingLLM +from .errors import RetriesExhaustedError +from .limiting import ( + CompositeLLMLimiter, + LLMLimiter, + NoopLLMLimiter, + TpmRpmLLMLimiter, + create_tpm_rpm_limiters, +) +from .mock import MockChatLLM, MockCompletionLLM +from .openai import ( + OpenAIChatLLM, + OpenAIClientTypes, + OpenAICompletionLLM, + OpenAIConfiguration, + OpenAIEmbeddingsLLM, + create_openai_chat_llm, + create_openai_client, + create_openai_completion_llm, + create_openai_embedding_llm, +) +from .types import ( + LLM, + CompletionInput, + CompletionLLM, + CompletionOutput, + EmbeddingInput, + EmbeddingLLM, + EmbeddingOutput, + ErrorHandlerFn, + IsResponseValidFn, + LLMCache, + LLMConfig, + LLMInput, + LLMInvocationFn, + LLMInvocationResult, + LLMOutput, + OnCacheActionFn, +) + +__all__ = [ + # LLM Types + "LLM", + "BaseLLM", + "CachingLLM", + "CompletionInput", + "CompletionLLM", + "CompletionOutput", + "CompositeLLMLimiter", + "EmbeddingInput", + "EmbeddingLLM", + "EmbeddingOutput", + # Callbacks + "ErrorHandlerFn", + "IsResponseValidFn", + # Cache + "LLMCache", + "LLMConfig", + # LLM I/O Types + "LLMInput", + "LLMInvocationFn", + "LLMInvocationResult", + "LLMLimiter", + "LLMOutput", + "MockChatLLM", + # Mock + "MockCompletionLLM", + "NoopLLMLimiter", + "OnCacheActionFn", + "OpenAIChatLLM", + "OpenAIClientTypes", + "OpenAICompletionLLM", + # OpenAI + "OpenAIConfiguration", + "OpenAIEmbeddingsLLM", + "RateLimitingLLM", + # Errors + "RetriesExhaustedError", + "TpmRpmLLMLimiter", + "create_openai_chat_llm", + "create_openai_client", + "create_openai_completion_llm", + "create_openai_embedding_llm", + # Limiters + "create_tpm_rpm_limiters", +] diff --git a/graphrag/llm/base/__init__.py b/graphrag/llm/base/__init__.py new file mode 100644 index 00000000..dd5ebf90 --- /dev/null +++ b/graphrag/llm/base/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Base LLM Implementations.""" + +from .base_llm import BaseLLM +from .caching_llm import CachingLLM +from .rate_limiting_llm import RateLimitingLLM + +__all__ = ["BaseLLM", "CachingLLM", "RateLimitingLLM"] diff --git a/graphrag/llm/base/_create_cache_key.py b/graphrag/llm/base/_create_cache_key.py new file mode 100644 index 00000000..e435ba46 --- /dev/null +++ b/graphrag/llm/base/_create_cache_key.py @@ -0,0 +1,34 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Cache key generation utils.""" + +import hashlib + + +def _llm_string(params: dict) -> str: + # New version of the cache is not including n in the params dictionary + # This avoids creating a new cache key for the same prompt + if "max_tokens" in params and "n" not in params: + params["n"] = None + return str(sorted((k, v) for k, v in params.items())) + + +def _hash(_input: str) -> str: + """Use a deterministic hashing approach.""" + return hashlib.md5(_input.encode()).hexdigest() # noqa S324 + + +def create_hash_key(operation: str, prompt: str, parameters: dict) -> str: + """Compute cache key from prompt and associated model and settings. + + Args: + prompt (str): The prompt run through the language model. + llm_string (str): The language model version and settings. + + Returns + ------- + str: The cache key. + """ + llm_string = _llm_string(parameters) + return f"{operation}-{_hash(prompt + llm_string)}" diff --git a/graphrag/llm/base/base_llm.py b/graphrag/llm/base/base_llm.py new file mode 100644 index 00000000..66f1919c --- /dev/null +++ b/graphrag/llm/base/base_llm.py @@ -0,0 +1,65 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Base LLM class definition.""" + +import traceback +from abc import ABC, abstractmethod +from typing import Generic, TypeVar + +from typing_extensions import Unpack + +from graphrag.llm.types import ( + LLM, + ErrorHandlerFn, + LLMInput, + LLMOutput, +) + +TIn = TypeVar("TIn") +TOut = TypeVar("TOut") + + +class BaseLLM(ABC, LLM[TIn, TOut], Generic[TIn, TOut]): + """LLM Implementation class definition.""" + + _on_error: ErrorHandlerFn | None + + def on_error(self, on_error: ErrorHandlerFn | None) -> None: + """Set the error handler function.""" + self._on_error = on_error + + @abstractmethod + async def _execute_llm( + self, + input: TIn, + **kwargs: Unpack[LLMInput], + ) -> TOut | None: + pass + + async def __call__( + self, + input: TIn, + **kwargs: Unpack[LLMInput], + ) -> LLMOutput[TOut]: + """Invoke the LLM.""" + is_json = kwargs.get("json") or False + if is_json: + return await self._invoke_json(input, **kwargs) + return await self._invoke(input, **kwargs) + + async def _invoke(self, input: TIn, **kwargs: Unpack[LLMInput]) -> LLMOutput[TOut]: + try: + output = await self._execute_llm(input, **kwargs) + return LLMOutput(output=output) + except Exception as e: + stack_trace = traceback.format_exc() + if self._on_error: + self._on_error(e, stack_trace, {"input": input}) + raise + + async def _invoke_json( + self, input: TIn, **kwargs: Unpack[LLMInput] + ) -> LLMOutput[TOut]: + msg = "JSON output not supported by this LLM" + raise NotImplementedError(msg) diff --git a/graphrag/llm/base/caching_llm.py b/graphrag/llm/base/caching_llm.py new file mode 100644 index 00000000..51c99638 --- /dev/null +++ b/graphrag/llm/base/caching_llm.py @@ -0,0 +1,107 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A class to interact with the cache.""" + +import json +from typing import Any, Generic, TypeVar + +from typing_extensions import Unpack + +from graphrag.llm.types import LLM, LLMCache, LLMInput, LLMOutput, OnCacheActionFn + +from ._create_cache_key import create_hash_key + +# If there's a breaking change in what we cache, we should increment this version number to invalidate existing caches +_cache_strategy_version = 2 + +TIn = TypeVar("TIn") +TOut = TypeVar("TOut") + + +def _noop_cache_fn(_k: str, _v: str | None): + pass + + +class CachingLLM(LLM[TIn, TOut], Generic[TIn, TOut]): + """A class to interact with the cache.""" + + _cache: LLMCache + _delegate: LLM[TIn, TOut] + _operation: str + _llm_paramaters: dict + _on_cache_hit: OnCacheActionFn + _on_cache_miss: OnCacheActionFn + + def __init__( + self, + delegate: LLM[TIn, TOut], + llm_parameters: dict, + operation: str, + cache: LLMCache, + ): + self._delegate = delegate + self._llm_paramaters = llm_parameters + self._cache = cache + self._operation = operation + self._on_cache_hit = _noop_cache_fn + self._on_cache_miss = _noop_cache_fn + + def on_cache_hit(self, fn: OnCacheActionFn | None) -> None: + """Set the function to call when a cache hit occurs.""" + self._on_cache_hit = fn or _noop_cache_fn + + def on_cache_miss(self, fn: OnCacheActionFn | None) -> None: + """Set the function to call when a cache miss occurs.""" + self._on_cache_miss = fn or _noop_cache_fn + + def _cache_key(self, input: TIn, name: str | None, args: dict) -> str: + json_input = json.dumps(input) + tag = ( + f"{name}-{self._operation}-v{_cache_strategy_version}" + if name is not None + else self._operation + ) + return create_hash_key(tag, json_input, args) + + async def _cache_read(self, key: str) -> Any | None: + """Read a value from the cache.""" + return await self._cache.get(key) + + async def _cache_write( + self, key: str, input: TIn, result: TOut | None, args: dict + ) -> None: + """Write a value to the cache.""" + if result: + await self._cache.set( + key, + result, + { + "input": input, + "parameters": args, + }, + ) + + async def __call__( + self, + input: TIn, + **kwargs: Unpack[LLMInput], + ) -> LLMOutput[TOut]: + """Execute the LLM.""" + # Check for an Existing cache item + name = kwargs.get("name") + llm_args = {**self._llm_paramaters, **(kwargs.get("model_parameters") or {})} + cache_key = self._cache_key(input, name, llm_args) + cached_result = await self._cache_read(cache_key) + if cached_result: + self._on_cache_hit(cache_key, name) + return LLMOutput(output=cached_result) + + # Report the Cache Miss + self._on_cache_miss(cache_key, name) + + # Compute the new result + result = await self._delegate(input, **kwargs) + # Cache the new result + await self._cache_write(cache_key, input, result.output, llm_args) + return result diff --git a/graphrag/llm/base/rate_limiting_llm.py b/graphrag/llm/base/rate_limiting_llm.py new file mode 100644 index 00000000..5e208247 --- /dev/null +++ b/graphrag/llm/base/rate_limiting_llm.py @@ -0,0 +1,208 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Rate limiting LLM implementation.""" + +import asyncio +import logging +from collections.abc import Callable +from typing import Any, Generic, TypeVar + +from tenacity import ( + AsyncRetrying, + retry_if_exception_type, + stop_after_attempt, + wait_exponential_jitter, +) +from typing_extensions import Unpack + +from graphrag.llm.errors import RetriesExhaustedError +from graphrag.llm.limiting import LLMLimiter +from graphrag.llm.types import ( + LLM, + LLMConfig, + LLMInput, + LLMInvocationFn, + LLMInvocationResult, + LLMOutput, +) + +TIn = TypeVar("TIn") +TOut = TypeVar("TOut") +TRateLimitError = TypeVar("TRateLimitError", bound=BaseException) + +_CANNOT_MEASURE_INPUT_TOKENS_MSG = "cannot measure input tokens" +_CANNOT_MEASURE_OUTPUT_TOKENS_MSG = "cannot measure output tokens" + +log = logging.getLogger(__name__) + + +class RateLimitingLLM(LLM[TIn, TOut], Generic[TIn, TOut]): + """A class to interact with the cache.""" + + _delegate: LLM[TIn, TOut] + _rate_limiter: LLMLimiter | None + _semaphore: asyncio.Semaphore | None + _count_tokens: Callable[[str], int] + _config: LLMConfig + _operation: str + _retryable_errors: list[type[Exception]] + _rate_limit_errors: list[type[Exception]] + _on_invoke: LLMInvocationFn + _extract_sleep_recommendation: Callable[[Any], float] + + def __init__( + self, + delegate: LLM[TIn, TOut], + config: LLMConfig, + operation: str, + retryable_errors: list[type[Exception]], + rate_limit_errors: list[type[Exception]], + rate_limiter: LLMLimiter | None = None, + semaphore: asyncio.Semaphore | None = None, + count_tokens: Callable[[str], int] | None = None, + get_sleep_time: Callable[[BaseException], float] | None = None, + ): + self._delegate = delegate + self._rate_limiter = rate_limiter + self._semaphore = semaphore + self._config = config + self._operation = operation + self._retryable_errors = retryable_errors + self._rate_limit_errors = rate_limit_errors + self._count_tokens = count_tokens or (lambda _s: -1) + self._extract_sleep_recommendation = get_sleep_time or (lambda _e: 0.0) + self._on_invoke = lambda _v: None + + def on_invoke(self, fn: LLMInvocationFn | None) -> None: + """Set the on_invoke function.""" + self._on_invoke = fn or (lambda _v: None) + + def count_request_tokens(self, input: TIn) -> int: + """Count the request tokens on an input request.""" + if isinstance(input, str): + return self._count_tokens(input) + if isinstance(input, list): + result = 0 + for item in input: + if isinstance(item, str): + result += self._count_tokens(item) + elif isinstance(item, dict): + result += self._count_tokens(item.get("content", "")) + else: + raise TypeError(_CANNOT_MEASURE_INPUT_TOKENS_MSG) + return result + raise TypeError(_CANNOT_MEASURE_INPUT_TOKENS_MSG) + + def count_response_tokens(self, output: TOut | None) -> int: + """Count the request tokens on an output response.""" + if output is None: + return 0 + if isinstance(output, str): + return self._count_tokens(output) + if isinstance(output, list) and all(isinstance(x, str) for x in output): + return sum(self._count_tokens(item) for item in output) + if isinstance(output, list): + # Embedding response, don't count it + return 0 + raise TypeError(_CANNOT_MEASURE_OUTPUT_TOKENS_MSG) + + async def __call__( + self, + input: TIn, + **kwargs: Unpack[LLMInput], + ) -> LLMOutput[TOut]: + """Execute the LLM with semaphore & rate limiting.""" + name = kwargs.get("name", "Process") + attempt_number = 0 + call_times: list[float] = [] + input_tokens = self.count_request_tokens(input) + max_retries = self._config.max_retries or 10 + max_retry_wait = self._config.max_retry_wait or 10 + follow_recommendation = self._config.sleep_on_rate_limit_recommendation + retryer = AsyncRetrying( + stop=stop_after_attempt(max_retries), + wait=wait_exponential_jitter(max=max_retry_wait), + reraise=True, + retry=retry_if_exception_type(tuple(self._retryable_errors)), + ) + + async def sleep_for(time: float | None) -> None: + log.warning( + "%s failed to invoke LLM %s/%s attempts. Cause: rate limit exceeded, will retry. Recommended sleep for %d seconds. Follow recommendation? %s", + name, + attempt_number, + max_retries, + time, + follow_recommendation, + ) + if follow_recommendation and time: + await asyncio.sleep(time) + raise + + async def do_attempt() -> LLMOutput[TOut]: + nonlocal call_times + call_start = asyncio.get_event_loop().time() + try: + return await self._delegate(input, **kwargs) + except BaseException as e: + if isinstance(e, tuple(self._rate_limit_errors)): + sleep_time = self._extract_sleep_recommendation(e) + await sleep_for(sleep_time) + raise + finally: + call_end = asyncio.get_event_loop().time() + call_times.append(call_end - call_start) + + async def execute_with_retry() -> tuple[LLMOutput[TOut], float]: + nonlocal attempt_number + async for attempt in retryer: + with attempt: + if self._rate_limiter and input_tokens > 0: + await self._rate_limiter.acquire(input_tokens) + start = asyncio.get_event_loop().time() + attempt_number += 1 + return await do_attempt(), start + + log.error("Retries exhausted for %s", name) + raise RetriesExhaustedError(name, max_retries) + + result: LLMOutput[TOut] + start = 0.0 + + if self._semaphore is None: + result, start = await execute_with_retry() + else: + async with self._semaphore: + result, start = await execute_with_retry() + + end = asyncio.get_event_loop().time() + output_tokens = self.count_response_tokens(result.output) + if self._rate_limiter and output_tokens > 0: + await self._rate_limiter.acquire(output_tokens) + + invocation_result = LLMInvocationResult( + result=result, + name=name, + num_retries=attempt_number - 1, + total_time=end - start, + call_times=call_times, + input_tokens=input_tokens, + output_tokens=output_tokens, + ) + self._handle_invoke_result(invocation_result) + return result + + def _handle_invoke_result( + self, result: LLMInvocationResult[LLMOutput[TOut]] + ) -> None: + log.info( + 'perf - llm.%s "%s" with %s retries took %s. input_tokens=%d, output_tokens=%d', + self._operation, + result.name, + result.num_retries, + result.total_time, + result.input_tokens, + result.output_tokens, + ) + self._on_invoke(result) diff --git a/graphrag/llm/errors.py b/graphrag/llm/errors.py new file mode 100644 index 00000000..01136359 --- /dev/null +++ b/graphrag/llm/errors.py @@ -0,0 +1,12 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Error definitions for the OpenAI DataShaper package.""" + + +class RetriesExhaustedError(RuntimeError): + """Retries exhausted error.""" + + def __init__(self, name: str, num_retries: int) -> None: + """Init method definition.""" + super().__init__(f"Operation '{name}' failed - {num_retries} retries exhausted") diff --git a/graphrag/llm/limiting/__init__.py b/graphrag/llm/limiting/__init__.py new file mode 100644 index 00000000..4f7933d1 --- /dev/null +++ b/graphrag/llm/limiting/__init__.py @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""LLM limiters module.""" + +from .composite_limiter import CompositeLLMLimiter +from .create_limiters import create_tpm_rpm_limiters +from .llm_limiter import LLMLimiter +from .noop_llm_limiter import NoopLLMLimiter +from .tpm_rpm_limiter import TpmRpmLLMLimiter + +__all__ = [ + "CompositeLLMLimiter", + "LLMLimiter", + "NoopLLMLimiter", + "TpmRpmLLMLimiter", + "create_tpm_rpm_limiters", +] diff --git a/graphrag/llm/limiting/composite_limiter.py b/graphrag/llm/limiting/composite_limiter.py new file mode 100644 index 00000000..7bcf9195 --- /dev/null +++ b/graphrag/llm/limiting/composite_limiter.py @@ -0,0 +1,26 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing Composite Limiter class definition.""" + +from .llm_limiter import LLMLimiter + + +class CompositeLLMLimiter(LLMLimiter): + """Composite Limiter class definition.""" + + _limiters: list[LLMLimiter] + + def __init__(self, limiters: list[LLMLimiter]): + """Init method definition.""" + self._limiters = limiters + + @property + def needs_token_count(self) -> bool: + """Whether this limiter needs the token count to be passed in.""" + return any(limiter.needs_token_count for limiter in self._limiters) + + async def acquire(self, num_tokens: int = 1) -> None: + """Call method definition.""" + for limiter in self._limiters: + await limiter.acquire(num_tokens) diff --git a/graphrag/llm/limiting/create_limiters.py b/graphrag/llm/limiting/create_limiters.py new file mode 100644 index 00000000..92df11c1 --- /dev/null +++ b/graphrag/llm/limiting/create_limiters.py @@ -0,0 +1,29 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Create limiters for OpenAI API requests.""" + +import logging + +from aiolimiter import AsyncLimiter + +from graphrag.llm.types import LLMConfig + +from .llm_limiter import LLMLimiter +from .tpm_rpm_limiter import TpmRpmLLMLimiter + +log = logging.getLogger(__name__) + +"""The global TPM limiters.""" + + +def create_tpm_rpm_limiters( + configuration: LLMConfig, +) -> LLMLimiter: + """Get the limiters for a given model name.""" + tpm = configuration.tokens_per_minute + rpm = configuration.requests_per_minute + return TpmRpmLLMLimiter( + None if tpm == 0 else AsyncLimiter(tpm or 50_000), + None if rpm == 0 else AsyncLimiter(rpm or 10_000), + ) diff --git a/graphrag/llm/limiting/llm_limiter.py b/graphrag/llm/limiting/llm_limiter.py new file mode 100644 index 00000000..1264a84b --- /dev/null +++ b/graphrag/llm/limiting/llm_limiter.py @@ -0,0 +1,19 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Limiting types.""" + +from abc import ABC, abstractmethod + + +class LLMLimiter(ABC): + """LLM Limiter Interface.""" + + @property + @abstractmethod + def needs_token_count(self) -> bool: + """Whether this limiter needs the token count to be passed in.""" + + @abstractmethod + async def acquire(self, num_tokens: int = 1) -> None: + """Acquire a pass through the limiter.""" diff --git a/graphrag/llm/limiting/noop_llm_limiter.py b/graphrag/llm/limiting/noop_llm_limiter.py new file mode 100644 index 00000000..51470552 --- /dev/null +++ b/graphrag/llm/limiting/noop_llm_limiter.py @@ -0,0 +1,19 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""TPM RPM Limiter module.""" + +from .llm_limiter import LLMLimiter + + +class NoopLLMLimiter(LLMLimiter): + """TPM RPM Limiter class definition.""" + + @property + def needs_token_count(self) -> bool: + """Whether this limiter needs the token count to be passed in.""" + return False + + async def acquire(self, num_tokens: int = 1) -> None: + """Call method definition.""" + # do nothing diff --git a/graphrag/llm/limiting/tpm_rpm_limiter.py b/graphrag/llm/limiting/tpm_rpm_limiter.py new file mode 100644 index 00000000..cb6d84e3 --- /dev/null +++ b/graphrag/llm/limiting/tpm_rpm_limiter.py @@ -0,0 +1,34 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""TPM RPM Limiter module.""" + +from aiolimiter import AsyncLimiter + +from .llm_limiter import LLMLimiter + + +class TpmRpmLLMLimiter(LLMLimiter): + """TPM RPM Limiter class definition.""" + + _tpm_limiter: AsyncLimiter | None + _rpm_limiter: AsyncLimiter | None + + def __init__( + self, tpm_limiter: AsyncLimiter | None, rpm_limiter: AsyncLimiter | None + ): + """Init method definition.""" + self._tpm_limiter = tpm_limiter + self._rpm_limiter = rpm_limiter + + @property + def needs_token_count(self) -> bool: + """Whether this limiter needs the token count to be passed in.""" + return self._tpm_limiter is not None + + async def acquire(self, num_tokens: int = 1) -> None: + """Call method definition.""" + if self._tpm_limiter is not None: + await self._tpm_limiter.acquire(num_tokens) + if self._rpm_limiter is not None: + await self._rpm_limiter.acquire() diff --git a/graphrag/llm/mock/__init__.py b/graphrag/llm/mock/__init__.py new file mode 100644 index 00000000..cd1f000d --- /dev/null +++ b/graphrag/llm/mock/__init__.py @@ -0,0 +1,12 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Mock LLM Implementations.""" + +from .mock_chat_llm import MockChatLLM +from .mock_completion_llm import MockCompletionLLM + +__all__ = [ + "MockChatLLM", + "MockCompletionLLM", +] diff --git a/graphrag/llm/mock/mock_chat_llm.py b/graphrag/llm/mock/mock_chat_llm.py new file mode 100644 index 00000000..b8a6650b --- /dev/null +++ b/graphrag/llm/mock/mock_chat_llm.py @@ -0,0 +1,52 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A mock ChatLLM that returns the given responses.""" + +from typing_extensions import Unpack + +from graphrag.llm.base import BaseLLM +from graphrag.llm.types import ( + CompletionInput, + CompletionOutput, + LLMInput, + LLMOutput, +) + + +class MockChatLLM( + BaseLLM[ + CompletionInput, + CompletionOutput, + ] +): + """A mock LLM that returns the given responses.""" + + responses: list[str] + i: int = 0 + + def __init__(self, responses: list[str]): + self.i = 0 + self.responses = responses + + def _create_output( + self, + output: CompletionOutput | None, + **kwargs: Unpack[LLMInput], + ) -> LLMOutput[CompletionOutput]: + history = kwargs.get("history") or [] + return LLMOutput[CompletionOutput]( + output=output, history=[*history, {"content": output}] + ) + + async def _execute_llm( + self, + input: CompletionInput, + **kwargs: Unpack[LLMInput], + ) -> CompletionOutput: + if self.i >= len(self.responses): + msg = f"No more responses, requested {self.i} but only have {len(self.responses)}" + raise ValueError(msg) + response = self.responses[self.i] + self.i += 1 + return response diff --git a/graphrag/llm/mock/mock_completion_llm.py b/graphrag/llm/mock/mock_completion_llm.py new file mode 100644 index 00000000..8cb8e950 --- /dev/null +++ b/graphrag/llm/mock/mock_completion_llm.py @@ -0,0 +1,37 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""LLM Static Response method definition.""" + +import logging + +from typing_extensions import Unpack + +from graphrag.llm.base import BaseLLM +from graphrag.llm.types import ( + CompletionInput, + CompletionOutput, + LLMInput, +) + +log = logging.getLogger(__name__) + + +class MockCompletionLLM( + BaseLLM[ + CompletionInput, + CompletionOutput, + ] +): + """Mock Completion LLM for testing purposes.""" + + def __init__(self, responses: list[str]): + self.responses = responses + self._on_error = None + + async def _execute_llm( + self, + input: CompletionInput, + **kwargs: Unpack[LLMInput], + ) -> CompletionOutput: + return self.responses[0] diff --git a/graphrag/llm/openai/__init__.py b/graphrag/llm/openai/__init__.py new file mode 100644 index 00000000..9478e146 --- /dev/null +++ b/graphrag/llm/openai/__init__.py @@ -0,0 +1,28 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""OpenAI LLM implementations.""" + +from .create_openai_client import create_openai_client +from .factories import ( + create_openai_chat_llm, + create_openai_completion_llm, + create_openai_embedding_llm, +) +from .openai_chat_llm import OpenAIChatLLM +from .openai_completion_llm import OpenAICompletionLLM +from .openai_configuration import OpenAIConfiguration +from .openai_embeddings_llm import OpenAIEmbeddingsLLM +from .types import OpenAIClientTypes + +__all__ = [ + "OpenAIChatLLM", + "OpenAIClientTypes", + "OpenAICompletionLLM", + "OpenAIConfiguration", + "OpenAIEmbeddingsLLM", + "create_openai_chat_llm", + "create_openai_client", + "create_openai_completion_llm", + "create_openai_embedding_llm", +] diff --git a/graphrag/llm/openai/_json.py b/graphrag/llm/openai/_json.py new file mode 100644 index 00000000..22184cc2 --- /dev/null +++ b/graphrag/llm/openai/_json.py @@ -0,0 +1,25 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""JSON cleaning and formatting utilities.""" + + +def clean_up_json(json_str: str) -> str: + """Clean up json string.""" + json_str = ( + json_str.replace("\\n", "") + .replace("\n", "") + .replace("\r", "") + .replace('"[{', "[{") + .replace('}]"', "}]") + .replace("\\", "") + .strip() + ) + + # Remove JSON Markdown Frame + if json_str.startswith("```json"): + json_str = json_str[len("```json") :] + if json_str.endswith("```"): + json_str = json_str[: len(json_str) - len("```")] + + return json_str diff --git a/graphrag/llm/openai/_prompts.py b/graphrag/llm/openai/_prompts.py new file mode 100644 index 00000000..37d9f0fc --- /dev/null +++ b/graphrag/llm/openai/_prompts.py @@ -0,0 +1,39 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Utility prompts for low-level LLM invocations.""" + +JSON_CHECK_PROMPT = """ +You are going to be given a malformed JSON string that threw an error during json.loads. +It probably contains unnecessary escape sequences, or it is missing a comma or colon somewhere. +Your task is to fix this string and return a well-formed JSON string containing a single object. +Eliminate any unnecessary escape sequences. +Only return valid JSON, parseable with json.loads, without commentary. + +# Examples +----------- +Text: {{ \\"title\\": \\"abc\\", \\"summary\\": \\"def\\" }} +Output: {{"title": "abc", "summary": "def"}} +----------- +Text: {{"title": "abc", "summary": "def" +Output: {{"title": "abc", "summary": "def"}} +----------- +Text: {{"title': "abc", 'summary": "def" +Output: {{"title": "abc", "summary": "def"}} +----------- +Text: "{{"title": "abc", "summary": "def"}}" +Output: {{"title": "abc", "summary": "def"}} +----------- +Text: [{{"title": "abc", "summary": "def"}}] +Output: [{{"title": "abc", "summary": "def"}}] +----------- +Text: [{{"title": "abc", "summary": "def"}}, {{ \\"title\\": \\"abc\\", \\"summary\\": \\"def\\" }}] +Output: [{{"title": "abc", "summary": "def"}}, {{"title": "abc", "summary": "def"}}] +----------- +Text: ```json\n[{{"title": "abc", "summary": "def"}}, {{ \\"title\\": \\"abc\\", \\"summary\\": \\"def\\" }}]``` +Output: [{{"title": "abc", "summary": "def"}}, {{"title": "abc", "summary": "def"}}] + + +# Real Data +Text: {input_text} +Output:""" diff --git a/graphrag/llm/openai/create_openai_client.py b/graphrag/llm/openai/create_openai_client.py new file mode 100644 index 00000000..40d7d649 --- /dev/null +++ b/graphrag/llm/openai/create_openai_client.py @@ -0,0 +1,65 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Create OpenAI client instance.""" + +import logging +from functools import cache + +from azure.identity import DefaultAzureCredential, get_bearer_token_provider +from openai import AsyncAzureOpenAI, AsyncOpenAI + +from .openai_configuration import OpenAIConfiguration +from .types import OpenAIClientTypes + +log = logging.getLogger(__name__) + +API_BASE_REQUIRED_FOR_AZURE = "api_base is required for Azure OpenAI client" + + +@cache +def create_openai_client( + configuration: OpenAIConfiguration, azure: bool +) -> OpenAIClientTypes: + """Create a new OpenAI client instance.""" + if azure: + api_base = configuration.api_base + if api_base is None: + raise ValueError(API_BASE_REQUIRED_FOR_AZURE) + + log.info( + "Creating Azure OpenAI client api_base=%s, deployment_name=%s", + api_base, + configuration.deployment_name, + ) + if configuration.cognitive_services_endpoint is None: + cognitive_services_endpoint = "https://cognitiveservices.azure.com/.default" + else: + cognitive_services_endpoint = configuration.cognitive_services_endpoint + + return AsyncAzureOpenAI( + api_key=configuration.api_key if configuration.api_key else None, + azure_ad_token_provider=get_bearer_token_provider( + DefaultAzureCredential(), cognitive_services_endpoint + ) + if not configuration.api_key + else None, + organization=configuration.organization, + # Azure-Specifics + api_version=configuration.api_version, + azure_endpoint=api_base, + azure_deployment=configuration.deployment_name, + # Timeout/Retry Configuration - Use Tenacity for Retries, so disable them here + timeout=configuration.request_timeout or 180.0, + max_retries=0, + ) + + log.info("Creating OpenAI client base_url=%s", configuration.api_base) + return AsyncOpenAI( + api_key=configuration.api_key, + base_url=configuration.api_base, + organization=configuration.organization, + # Timeout/Retry Configuration - Use Tenacity for Retries, so disable them here + timeout=configuration.request_timeout or 180.0, + max_retries=0, + ) diff --git a/graphrag/llm/openai/factories.py b/graphrag/llm/openai/factories.py new file mode 100644 index 00000000..e595e2e5 --- /dev/null +++ b/graphrag/llm/openai/factories.py @@ -0,0 +1,140 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Factory functions for creating OpenAI LLMs.""" + +import asyncio + +from graphrag.llm.base import CachingLLM, RateLimitingLLM +from graphrag.llm.limiting import LLMLimiter +from graphrag.llm.types import ( + LLM, + CompletionLLM, + EmbeddingLLM, + ErrorHandlerFn, + LLMCache, + LLMInvocationFn, + OnCacheActionFn, +) + +from .json_parsing_llm import JsonParsingLLM +from .openai_chat_llm import OpenAIChatLLM +from .openai_completion_llm import OpenAICompletionLLM +from .openai_configuration import OpenAIConfiguration +from .openai_embeddings_llm import OpenAIEmbeddingsLLM +from .openai_history_tracking_llm import OpenAIHistoryTrackingLLM +from .openai_token_replacing_llm import OpenAITokenReplacingLLM +from .types import OpenAIClientTypes +from .utils import ( + RATE_LIMIT_ERRORS, + RETRYABLE_ERRORS, + get_completion_cache_args, + get_sleep_time_from_error, + get_token_counter, +) + + +def create_openai_chat_llm( + client: OpenAIClientTypes, + config: OpenAIConfiguration, + cache: LLMCache | None = None, + limiter: LLMLimiter | None = None, + semaphore: asyncio.Semaphore | None = None, + on_invoke: LLMInvocationFn | None = None, + on_error: ErrorHandlerFn | None = None, + on_cache_hit: OnCacheActionFn | None = None, + on_cache_miss: OnCacheActionFn | None = None, +) -> CompletionLLM: + """Create an OpenAI chat LLM.""" + operation = "chat" + result = OpenAIChatLLM(client, config) + result.on_error(on_error) + if limiter is not None or semaphore is not None: + result = _rate_limited(result, config, operation, limiter, semaphore, on_invoke) + if cache is not None: + result = _cached(result, config, operation, cache, on_cache_hit, on_cache_miss) + result = OpenAIHistoryTrackingLLM(result) + result = OpenAITokenReplacingLLM(result) + return JsonParsingLLM(result) + + +def create_openai_completion_llm( + client: OpenAIClientTypes, + config: OpenAIConfiguration, + cache: LLMCache | None = None, + limiter: LLMLimiter | None = None, + semaphore: asyncio.Semaphore | None = None, + on_invoke: LLMInvocationFn | None = None, + on_error: ErrorHandlerFn | None = None, + on_cache_hit: OnCacheActionFn | None = None, + on_cache_miss: OnCacheActionFn | None = None, +) -> CompletionLLM: + """Create an OpenAI completion LLM.""" + operation = "completion" + result = OpenAICompletionLLM(client, config) + result.on_error(on_error) + if limiter is not None or semaphore is not None: + result = _rate_limited(result, config, operation, limiter, semaphore, on_invoke) + if cache is not None: + result = _cached(result, config, operation, cache, on_cache_hit, on_cache_miss) + return OpenAITokenReplacingLLM(result) + + +def create_openai_embedding_llm( + client: OpenAIClientTypes, + config: OpenAIConfiguration, + cache: LLMCache | None = None, + limiter: LLMLimiter | None = None, + semaphore: asyncio.Semaphore | None = None, + on_invoke: LLMInvocationFn | None = None, + on_error: ErrorHandlerFn | None = None, + on_cache_hit: OnCacheActionFn | None = None, + on_cache_miss: OnCacheActionFn | None = None, +) -> EmbeddingLLM: + """Create an OpenAI embeddings LLM.""" + operation = "embedding" + result = OpenAIEmbeddingsLLM(client, config) + result.on_error(on_error) + if limiter is not None or semaphore is not None: + result = _rate_limited(result, config, operation, limiter, semaphore, on_invoke) + if cache is not None: + result = _cached(result, config, operation, cache, on_cache_hit, on_cache_miss) + return result + + +def _rate_limited( + delegate: LLM, + config: OpenAIConfiguration, + operation: str, + limiter: LLMLimiter | None, + semaphore: asyncio.Semaphore | None, + on_invoke: LLMInvocationFn | None, +): + result = RateLimitingLLM( + delegate, + config, + operation, + RETRYABLE_ERRORS, + RATE_LIMIT_ERRORS, + limiter, + semaphore, + get_token_counter(config), + get_sleep_time_from_error, + ) + result.on_invoke(on_invoke) + return result + + +def _cached( + delegate: LLM, + config: OpenAIConfiguration, + operation: str, + cache: LLMCache, + on_cache_hit: OnCacheActionFn | None, + on_cache_miss: OnCacheActionFn | None, +): + cache_args = get_completion_cache_args(config) + result = CachingLLM(delegate, cache_args, operation, cache) + result.on_cache_hit(on_cache_hit) + result.on_cache_miss(on_cache_miss) + return result diff --git a/graphrag/llm/openai/json_parsing_llm.py b/graphrag/llm/openai/json_parsing_llm.py new file mode 100644 index 00000000..843ca0ec --- /dev/null +++ b/graphrag/llm/openai/json_parsing_llm.py @@ -0,0 +1,37 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""An LLM that unpacks cached JSON responses.""" + +from typing_extensions import Unpack + +from graphrag.llm.types import ( + LLM, + CompletionInput, + CompletionLLM, + CompletionOutput, + LLMInput, + LLMOutput, +) + +from .utils import try_parse_json_object + + +class JsonParsingLLM(LLM[CompletionInput, CompletionOutput]): + """An OpenAI History-Tracking LLM.""" + + _delegate: CompletionLLM + + def __init__(self, delegate: CompletionLLM): + self._delegate = delegate + + async def __call__( + self, + input: CompletionInput, + **kwargs: Unpack[LLMInput], + ) -> LLMOutput[CompletionOutput]: + """Call the LLM with the input and kwargs.""" + result = await self._delegate(input, **kwargs) + if kwargs.get("json") and result.json is None and result.output is not None: + result.json = try_parse_json_object(result.output) + return result diff --git a/graphrag/llm/openai/openai_chat_llm.py b/graphrag/llm/openai/openai_chat_llm.py new file mode 100644 index 00000000..e4add8a2 --- /dev/null +++ b/graphrag/llm/openai/openai_chat_llm.py @@ -0,0 +1,152 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Chat-based language model.""" + +import logging +from json import JSONDecodeError + +from typing_extensions import Unpack + +from graphrag.llm.base import BaseLLM +from graphrag.llm.types import ( + CompletionInput, + CompletionOutput, + LLMInput, + LLMOutput, +) + +from ._json import clean_up_json +from ._prompts import JSON_CHECK_PROMPT +from .openai_configuration import OpenAIConfiguration +from .types import OpenAIClientTypes +from .utils import ( + get_completion_llm_args, + try_parse_json_object, +) + +log = logging.getLogger(__name__) + +_MAX_GENERATION_RETRIES = 3 +FAILED_TO_CREATE_JSON_ERROR = "Failed to generate valid JSON output" + + +class OpenAIChatLLM(BaseLLM[CompletionInput, CompletionOutput]): + """A Chat-based LLM.""" + + _client: OpenAIClientTypes + _configuration: OpenAIConfiguration + + def __init__(self, client: OpenAIClientTypes, configuration: OpenAIConfiguration): + self.client = client + self.configuration = configuration + + async def _execute_llm( + self, input: CompletionInput, **kwargs: Unpack[LLMInput] + ) -> CompletionOutput | None: + args = get_completion_llm_args( + kwargs.get("model_parameters"), self.configuration + ) + history = kwargs.get("history") or [] + messages = [ + *history, + {"role": "user", "content": input}, + ] + completion = await self.client.chat.completions.create( + messages=messages, **args + ) + return completion.choices[0].message.content + + async def _invoke_json( + self, + input: CompletionInput, + **kwargs: Unpack[LLMInput], + ) -> LLMOutput[CompletionOutput]: + """Generate JSON output.""" + name = kwargs.get("name") or "unknown" + is_response_valid = kwargs.get("is_response_valid") or (lambda _x: True) + + async def generate( + attempt: int | None = None, + ) -> LLMOutput[CompletionOutput]: + call_name = name if attempt is None else f"{name}@{attempt}" + return ( + await self._native_json(input, **{**kwargs, "name": call_name}) + if self.configuration.model_supports_json + else await self._manual_json(input, **{**kwargs, "name": call_name}) + ) + + def is_valid(x: dict | None) -> bool: + return x is not None and is_response_valid(x) + + result = await generate() + retry = 0 + while not is_valid(result.json) and retry < _MAX_GENERATION_RETRIES: + result = await generate(retry) + retry += 1 + + if is_valid(result.json): + return result + raise RuntimeError(FAILED_TO_CREATE_JSON_ERROR) + + async def _native_json( + self, input: CompletionInput, **kwargs: Unpack[LLMInput] + ) -> LLMOutput[CompletionOutput]: + """Generate JSON output using a model's native JSON-output support.""" + result = await self._invoke( + input, + **{ + **kwargs, + "model_parameters": { + **(kwargs.get("model_parameters") or {}), + "response_format": {"type": "json_object"}, + }, + }, + ) + + raw_output = result.output or "" + json_output = try_parse_json_object(raw_output) + + return LLMOutput[CompletionOutput]( + output=raw_output, + json=json_output, + history=result.history, + ) + + async def _manual_json( + self, input: CompletionInput, **kwargs: Unpack[LLMInput] + ) -> LLMOutput[CompletionOutput]: + # Otherwise, clean up the output and try to parse it as json + result = await self._invoke(input, **kwargs) + history = result.history or [] + output = clean_up_json(result.output or "") + try: + json_output = try_parse_json_object(output) + return LLMOutput[CompletionOutput]( + output=output, json=json_output, history=history + ) + except (TypeError, JSONDecodeError): + log.warning("error parsing llm json, retrying") + # If cleaned up json is unparsable, use the LLM to reformat it (may throw) + result = await self._try_clean_json_with_llm(output, **kwargs) + output = clean_up_json(result.output or "") + json = try_parse_json_object(output) + + return LLMOutput[CompletionOutput]( + output=output, + json=json, + history=history, + ) + + async def _try_clean_json_with_llm( + self, output: str, **kwargs: Unpack[LLMInput] + ) -> LLMOutput[CompletionOutput]: + name = kwargs.get("name") or "unknown" + return await self._invoke( + JSON_CHECK_PROMPT, + **{ + **kwargs, + "variables": {"input_text": output}, + "name": f"fix_json@{name}", + }, + ) diff --git a/graphrag/llm/openai/openai_completion_llm.py b/graphrag/llm/openai/openai_completion_llm.py new file mode 100644 index 00000000..bdbac6c1 --- /dev/null +++ b/graphrag/llm/openai/openai_completion_llm.py @@ -0,0 +1,43 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A text-completion based LLM.""" + +import logging + +from typing_extensions import Unpack + +from graphrag.llm.base import BaseLLM +from graphrag.llm.types import ( + CompletionInput, + CompletionOutput, + LLMInput, +) + +from .openai_configuration import OpenAIConfiguration +from .types import OpenAIClientTypes +from .utils import get_completion_llm_args + +log = logging.getLogger(__name__) + + +class OpenAICompletionLLM(BaseLLM[CompletionInput, CompletionOutput]): + """A text-completion based LLM.""" + + _client: OpenAIClientTypes + _configuration: OpenAIConfiguration + + def __init__(self, client: OpenAIClientTypes, configuration: OpenAIConfiguration): + self.client = client + self.configuration = configuration + + async def _execute_llm( + self, + input: CompletionInput, + **kwargs: Unpack[LLMInput], + ) -> CompletionOutput | None: + args = get_completion_llm_args( + kwargs.get("model_parameters"), self.configuration + ) + completion = self.client.completions.create(prompt=input, **args) + return completion.choices[0].text diff --git a/graphrag/llm/openai/openai_configuration.py b/graphrag/llm/openai/openai_configuration.py new file mode 100644 index 00000000..1bcd5694 --- /dev/null +++ b/graphrag/llm/openai/openai_configuration.py @@ -0,0 +1,288 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""OpenAI Configuration class definition.""" + +import json +from collections.abc import Hashable +from typing import Any, cast + +from graphrag.llm.types import LLMConfig + + +def _non_blank(value: str | None) -> str | None: + if value is None: + return None + stripped = value.strip() + return None if stripped == "" else value + + +class OpenAIConfiguration(Hashable, LLMConfig): + """OpenAI Configuration class definition.""" + + # Core Configuration + _api_key: str + _model: str + + _api_base: str | None + _api_version: str | None + _cognitive_services_endpoint: str | None + _deployment_name: str | None + _organization: str | None + _proxy: str | None + + # Operation Configuration + _n: int | None + _temperature: float | None + _frequency_penalty: float | None + _presence_penalty: float | None + _top_p: float | None + _max_tokens: int | None + _response_format: str | None + _logit_bias: dict[str, float] | None + _stop: list[str] | None + + # Retry Logic + _max_retries: int | None + _max_retry_wait: float | None + _request_timeout: float | None + + # The raw configuration object + _raw_config: dict + + # Feature Flags + _model_supports_json: bool | None + + # Custom Configuration + _tokens_per_minute: int | None + _requests_per_minute: int | None + _concurrent_requests: int | None + _encoding_model: str | None + _sleep_on_rate_limit_recommendation: bool | None + + def __init__( + self, + config: dict, + ): + """Init method definition.""" + + def lookup_required(key: str) -> str: + return cast(str, config.get(key)) + + def lookup_str(key: str) -> str | None: + return cast(str | None, config.get(key)) + + def lookup_int(key: str) -> int | None: + result = config.get(key) + if result is None: + return None + return int(cast(int, result)) + + def lookup_float(key: str) -> float | None: + result = config.get(key) + if result is None: + return None + return float(cast(float, result)) + + def lookup_dict(key: str) -> dict | None: + return cast(dict | None, config.get(key)) + + def lookup_list(key: str) -> list | None: + return cast(list | None, config.get(key)) + + def lookup_bool(key: str) -> bool | None: + value = config.get(key) + if isinstance(value, str): + return value.upper() == "TRUE" + if isinstance(value, int): + return value > 0 + return cast(bool | None, config.get(key)) + + self._api_key = lookup_required("api_key") + self._model = lookup_required("model") + self._deployment_name = lookup_str("deployment_name") + self._api_base = lookup_str("api_base") + self._api_version = lookup_str("api_version") + self._cognitive_services_endpoint = lookup_str("cognitive_services_endpoint") + self._organization = lookup_str("organization") + self._proxy = lookup_str("proxy") + self._n = lookup_int("n") + self._temperature = lookup_float("temperature") + self._frequency_penalty = lookup_float("frequency_penalty") + self._presence_penalty = lookup_float("presence_penalty") + self._top_p = lookup_float("top_p") + self._max_tokens = lookup_int("max_tokens") + self._response_format = lookup_str("response_format") + self._logit_bias = lookup_dict("logit_bias") + self._stop = lookup_list("stop") + self._max_retries = lookup_int("max_retries") + self._request_timeout = lookup_float("request_timeout") + self._model_supports_json = lookup_bool("model_supports_json") + self._tokens_per_minute = lookup_int("tokens_per_minute") + self._requests_per_minute = lookup_int("requests_per_minute") + self._concurrent_requests = lookup_int("concurrent_requests") + self._encoding_model = lookup_str("encoding_model") + self._max_retry_wait = lookup_float("max_retry_wait") + self._sleep_on_rate_limit_recommendation = lookup_bool( + "sleep_on_rate_limit_recommendation" + ) + self._raw_config = config + + @property + def api_key(self) -> str: + """API key property definition.""" + return self._api_key + + @property + def model(self) -> str: + """Model property definition.""" + return self._model + + @property + def deployment_name(self) -> str | None: + """Deployment name property definition.""" + return _non_blank(self._deployment_name) + + @property + def api_base(self) -> str | None: + """API base property definition.""" + result = _non_blank(self._api_base) + # Remove trailing slash + return result[:-1] if result and result.endswith("/") else result + + @property + def api_version(self) -> str | None: + """API version property definition.""" + return _non_blank(self._api_version) + + @property + def cognitive_services_endpoint(self) -> str | None: + """API version property definition.""" + return _non_blank(self._cognitive_services_endpoint) + + @property + def organization(self) -> str | None: + """Organization property definition.""" + return _non_blank(self._organization) + + @property + def proxy(self) -> str | None: + """Proxy property definition.""" + return _non_blank(self._proxy) + + @property + def n(self) -> int | None: + """N property definition.""" + return self._n + + @property + def temperature(self) -> float | None: + """Temperature property definition.""" + return self._temperature + + @property + def frequency_penalty(self) -> float | None: + """Frequency penalty property definition.""" + return self._frequency_penalty + + @property + def presence_penalty(self) -> float | None: + """Presence penalty property definition.""" + return self._presence_penalty + + @property + def top_p(self) -> float | None: + """Top p property definition.""" + return self._top_p + + @property + def max_tokens(self) -> int | None: + """Max tokens property definition.""" + return self._max_tokens + + @property + def response_format(self) -> str | None: + """Response format property definition.""" + return _non_blank(self._response_format) + + @property + def logit_bias(self) -> dict[str, float] | None: + """Logit bias property definition.""" + return self._logit_bias + + @property + def stop(self) -> list[str] | None: + """Stop property definition.""" + return self._stop + + @property + def max_retries(self) -> int | None: + """Max retries property definition.""" + return self._max_retries + + @property + def max_retry_wait(self) -> float | None: + """Max retry wait property definition.""" + return self._max_retry_wait + + @property + def request_timeout(self) -> float | None: + """Request timeout property definition.""" + return self._request_timeout + + @property + def model_supports_json(self) -> bool | None: + """Model supports json property definition.""" + return self._model_supports_json + + @property + def tokens_per_minute(self) -> int | None: + """Tokens per minute property definition.""" + return self._tokens_per_minute + + @property + def requests_per_minute(self) -> int | None: + """Requests per minute property definition.""" + return self._requests_per_minute + + @property + def concurrent_requests(self) -> int | None: + """Concurrent requests property definition.""" + return self._concurrent_requests + + @property + def encoding_model(self) -> str | None: + """Encoding model property definition.""" + return _non_blank(self._encoding_model) + + @property + def sleep_on_rate_limit_recommendation(self) -> bool | None: + """Whether to sleep for seconds when recommended by 429 errors (azure-specific).""" + return self._sleep_on_rate_limit_recommendation + + @property + def raw_config(self) -> dict: + """Raw config method definition.""" + return self._raw_config + + def lookup(self, name: str, default_value: Any = None) -> Any: + """Lookup method definition.""" + return self._raw_config.get(name, default_value) + + def __str__(self) -> str: + """Str method definition.""" + return json.dumps(self.raw_config, indent=4) + + def __repr__(self) -> str: + """Repr method definition.""" + return f"OpenAIConfiguration({self._raw_config})" + + def __eq__(self, other: object) -> bool: + """Eq method definition.""" + if not isinstance(other, OpenAIConfiguration): + return False + return self._raw_config == other._raw_config + + def __hash__(self) -> int: + """Hash method definition.""" + return hash(tuple(sorted(self._raw_config.items()))) diff --git a/graphrag/llm/openai/openai_embeddings_llm.py b/graphrag/llm/openai/openai_embeddings_llm.py new file mode 100644 index 00000000..558afe84 --- /dev/null +++ b/graphrag/llm/openai/openai_embeddings_llm.py @@ -0,0 +1,40 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The EmbeddingsLLM class.""" + +from typing_extensions import Unpack + +from graphrag.llm.base import BaseLLM +from graphrag.llm.types import ( + EmbeddingInput, + EmbeddingOutput, + LLMInput, +) + +from .openai_configuration import OpenAIConfiguration +from .types import OpenAIClientTypes + + +class OpenAIEmbeddingsLLM(BaseLLM[EmbeddingInput, EmbeddingOutput]): + """A text-embedding generator LLM.""" + + _client: OpenAIClientTypes + _configuration: OpenAIConfiguration + + def __init__(self, client: OpenAIClientTypes, configuration: OpenAIConfiguration): + self.client = client + self.configuration = configuration + + async def _execute_llm( + self, input: EmbeddingInput, **kwargs: Unpack[LLMInput] + ) -> EmbeddingOutput | None: + args = { + "model": self.configuration.model, + **(kwargs.get("model_parameters") or {}), + } + embedding = await self.client.embeddings.create( + input=input, + **args, + ) + return [d.embedding for d in embedding.data] diff --git a/graphrag/llm/openai/openai_history_tracking_llm.py b/graphrag/llm/openai/openai_history_tracking_llm.py new file mode 100644 index 00000000..26ac8e22 --- /dev/null +++ b/graphrag/llm/openai/openai_history_tracking_llm.py @@ -0,0 +1,38 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Chat-based language model.""" + +from typing_extensions import Unpack + +from graphrag.llm.types import ( + LLM, + CompletionInput, + CompletionLLM, + CompletionOutput, + LLMInput, + LLMOutput, +) + + +class OpenAIHistoryTrackingLLM(LLM[CompletionInput, CompletionOutput]): + """An OpenAI History-Tracking LLM.""" + + _delegate: CompletionLLM + + def __init__(self, delegate: CompletionLLM): + self._delegate = delegate + + async def __call__( + self, + input: CompletionInput, + **kwargs: Unpack[LLMInput], + ) -> LLMOutput[CompletionOutput]: + """Call the LLM.""" + history = kwargs.get("history") or [] + output = await self._delegate(input, **kwargs) + return LLMOutput( + output=output.output, + json=output.json, + history=[*history, {"role": "system", "content": output.output}], + ) diff --git a/graphrag/llm/openai/openai_token_replacing_llm.py b/graphrag/llm/openai/openai_token_replacing_llm.py new file mode 100644 index 00000000..7385b840 --- /dev/null +++ b/graphrag/llm/openai/openai_token_replacing_llm.py @@ -0,0 +1,37 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Chat-based language model.""" + +from typing_extensions import Unpack + +from graphrag.llm.types import ( + LLM, + CompletionInput, + CompletionLLM, + CompletionOutput, + LLMInput, + LLMOutput, +) + +from .utils import perform_variable_replacements + + +class OpenAITokenReplacingLLM(LLM[CompletionInput, CompletionOutput]): + """An OpenAI History-Tracking LLM.""" + + _delegate: CompletionLLM + + def __init__(self, delegate: CompletionLLM): + self._delegate = delegate + + async def __call__( + self, + input: CompletionInput, + **kwargs: Unpack[LLMInput], + ) -> LLMOutput[CompletionOutput]: + """Call the LLM with the input and kwargs.""" + variables = kwargs.get("variables") + history = kwargs.get("history") or [] + input = perform_variable_replacements(input, history, variables) + return await self._delegate(input, **kwargs) diff --git a/graphrag/llm/openai/types.py b/graphrag/llm/openai/types.py new file mode 100644 index 00000000..4aacf18c --- /dev/null +++ b/graphrag/llm/openai/types.py @@ -0,0 +1,11 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A base class for OpenAI-based LLMs.""" + +from openai import ( + AsyncAzureOpenAI, + AsyncOpenAI, +) + +OpenAIClientTypes = AsyncOpenAI | AsyncAzureOpenAI diff --git a/graphrag/llm/openai/utils.py b/graphrag/llm/openai/utils.py new file mode 100644 index 00000000..d529a8c0 --- /dev/null +++ b/graphrag/llm/openai/utils.py @@ -0,0 +1,113 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Utility functions for the OpenAI API.""" + +import json +import logging +from collections.abc import Callable +from typing import Any + +import tiktoken +from openai import ( + APIConnectionError, + InternalServerError, + RateLimitError, +) + +from .openai_configuration import OpenAIConfiguration + +DEFAULT_ENCODING = "cl100k_base" + +_encoders: dict[str, tiktoken.Encoding] = {} + +RETRYABLE_ERRORS: list[type[Exception]] = [ + RateLimitError, + APIConnectionError, + InternalServerError, +] +RATE_LIMIT_ERRORS: list[type[Exception]] = [RateLimitError] + +log = logging.getLogger(__name__) + + +def get_token_counter(config: OpenAIConfiguration) -> Callable[[str], int]: + """Get a function that counts the number of tokens in a string.""" + model = config.encoding_model or "cl100k_base" + enc = _encoders.get(model) + if enc is None: + enc = tiktoken.get_encoding(model) + _encoders[model] = enc + + return lambda s: len(enc.encode(s)) + + +def perform_variable_replacements( + input: str, history: list[dict], variables: dict | None +) -> str: + """Perform variable replacements on the input string and in a chat log.""" + result = input + + def replace_all(input: str) -> str: + result = input + if variables: + for entry in variables: + result = result.replace(f"{{{entry}}}", variables[entry]) + return result + + result = replace_all(result) + for i in range(len(history)): + entry = history[i] + if entry.get("role") == "system": + history[i]["content"] = replace_all(entry.get("content") or "") + + return result + + +def get_completion_cache_args(configuration: OpenAIConfiguration) -> dict: + """Get the cache arguments for a completion LLM.""" + return { + "model": configuration.model, + "temperature": configuration.temperature, + "frequency_penalty": configuration.frequency_penalty, + "presence_penalty": configuration.presence_penalty, + "top_p": configuration.top_p, + "max_tokens": configuration.max_tokens, + "n": configuration.n, + } + + +def get_completion_llm_args( + parameters: dict | None, configuration: OpenAIConfiguration +) -> dict: + """Get the arguments for a completion LLM.""" + return { + **get_completion_cache_args(configuration), + **(parameters or {}), + } + + +def try_parse_json_object(input: str) -> dict: + """Generate JSON-string output using best-attempt prompting & parsing techniques.""" + try: + result = json.loads(input) + except json.JSONDecodeError: + log.exception("error loading json, json=%s", input) + raise + else: + if not isinstance(result, dict): + raise TypeError + return result + + +def get_sleep_time_from_error(e: Any) -> float: + """Extract the sleep time value from a RateLimitError. This is usually only available in Azure.""" + sleep_time = 0.0 + if isinstance(e, RateLimitError) and _please_retry_after in str(e): + # could be second or seconds + sleep_time = int(str(e).split(_please_retry_after)[1].split(" second")[0]) + + return sleep_time + + +_please_retry_after = "Please retry after " diff --git a/graphrag/llm/types/__init__.py b/graphrag/llm/types/__init__.py new file mode 100644 index 00000000..c8277661 --- /dev/null +++ b/graphrag/llm/types/__init__.py @@ -0,0 +1,46 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""LLM Typings.""" + +from .llm import LLM +from .llm_cache import LLMCache +from .llm_callbacks import ( + ErrorHandlerFn, + IsResponseValidFn, + LLMInvocationFn, + OnCacheActionFn, +) +from .llm_config import LLMConfig +from .llm_invocation_result import LLMInvocationResult +from .llm_io import ( + LLMInput, + LLMOutput, +) +from .llm_types import ( + CompletionInput, + CompletionLLM, + CompletionOutput, + EmbeddingInput, + EmbeddingLLM, + EmbeddingOutput, +) + +__all__ = [ + "LLM", + "CompletionInput", + "CompletionLLM", + "CompletionOutput", + "EmbeddingInput", + "EmbeddingLLM", + "EmbeddingOutput", + "ErrorHandlerFn", + "IsResponseValidFn", + "LLMCache", + "LLMConfig", + "LLMInput", + "LLMInvocationFn", + "LLMInvocationResult", + "LLMOutput", + "OnCacheActionFn", +] diff --git a/graphrag/llm/types/llm.py b/graphrag/llm/types/llm.py new file mode 100644 index 00000000..fd8407e5 --- /dev/null +++ b/graphrag/llm/types/llm.py @@ -0,0 +1,28 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""LLM Types.""" + +from typing import Generic, Protocol, TypeVar + +from typing_extensions import Unpack + +from .llm_io import ( + LLMInput, + LLMOutput, +) + +TIn = TypeVar("TIn", contravariant=True) +TOut = TypeVar("TOut") + + +class LLM(Protocol, Generic[TIn, TOut]): + """LLM Protocol definition.""" + + async def __call__( + self, + input: TIn, + **kwargs: Unpack[LLMInput], + ) -> LLMOutput[TOut]: + """Invoke the LLM, treating the LLM as a function.""" + ... diff --git a/graphrag/llm/types/llm_cache.py b/graphrag/llm/types/llm_cache.py new file mode 100644 index 00000000..952b8d34 --- /dev/null +++ b/graphrag/llm/types/llm_cache.py @@ -0,0 +1,22 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Typing definitions for the OpenAI DataShaper package.""" + +from typing import Any, Protocol + + +class LLMCache(Protocol): + """LLM Cache interface.""" + + async def has(self, key: str) -> bool: + """Check if the cache has a value.""" + ... + + async def get(self, key: str) -> Any | None: + """Retrieve a value from the cache.""" + ... + + async def set(self, key: str, value: Any, debug_data: dict | None = None) -> None: + """Write a value into the cache.""" + ... diff --git a/graphrag/llm/types/llm_callbacks.py b/graphrag/llm/types/llm_callbacks.py new file mode 100644 index 00000000..dc06dbff --- /dev/null +++ b/graphrag/llm/types/llm_callbacks.py @@ -0,0 +1,20 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Typing definitions for the OpenAI DataShaper package.""" + +from collections.abc import Callable + +from .llm_invocation_result import LLMInvocationResult + +ErrorHandlerFn = Callable[[BaseException | None, str | None, dict | None], None] +"""Error handler function type definition.""" + +LLMInvocationFn = Callable[[LLMInvocationResult], None] +"""Handler for LLM invocation results""" + +OnCacheActionFn = Callable[[str, str | None], None] +"""Handler for cache hits""" + +IsResponseValidFn = Callable[[dict], bool] +"""A function that checks if an LLM response is valid.""" diff --git a/graphrag/llm/types/llm_config.py b/graphrag/llm/types/llm_config.py new file mode 100644 index 00000000..cd7ec255 --- /dev/null +++ b/graphrag/llm/types/llm_config.py @@ -0,0 +1,35 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""LLM Configuration Protocol definition.""" + +from typing import Protocol + + +class LLMConfig(Protocol): + """LLM Configuration Protocol definition.""" + + @property + def max_retries(self) -> int | None: + """Get the maximum number of retries.""" + ... + + @property + def max_retry_wait(self) -> float | None: + """Get the maximum retry wait time.""" + ... + + @property + def sleep_on_rate_limit_recommendation(self) -> bool | None: + """Get whether to sleep on rate limit recommendation.""" + ... + + @property + def tokens_per_minute(self) -> int | None: + """Get the number of tokens per minute.""" + ... + + @property + def requests_per_minute(self) -> int | None: + """Get the number of requests per minute.""" + ... diff --git a/graphrag/llm/types/llm_invocation_result.py b/graphrag/llm/types/llm_invocation_result.py new file mode 100644 index 00000000..1769aeb9 --- /dev/null +++ b/graphrag/llm/types/llm_invocation_result.py @@ -0,0 +1,35 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Typing definitions for the OpenAI DataShaper package.""" + +from dataclasses import dataclass +from typing import Generic, TypeVar + +T = TypeVar("T") + + +@dataclass +class LLMInvocationResult(Generic[T]): + """The result of an LLM invocation.""" + + result: T | None + """The result of the LLM invocation.""" + + name: str + """The operation name of the result""" + + num_retries: int + """The number of retries the invocation took.""" + + total_time: float + """The total time of the LLM invocation.""" + + call_times: list[float] + """The network times of individual invocations.""" + + input_tokens: int + """The number of input tokens.""" + + output_tokens: int + """The number of output tokens.""" diff --git a/graphrag/llm/types/llm_io.py b/graphrag/llm/types/llm_io.py new file mode 100644 index 00000000..051b5b82 --- /dev/null +++ b/graphrag/llm/types/llm_io.py @@ -0,0 +1,50 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""LLM Types.""" + +from dataclasses import dataclass, field +from typing import Generic, TypeVar + +from typing_extensions import NotRequired, TypedDict + +from .llm_callbacks import IsResponseValidFn + + +class LLMInput(TypedDict): + """The input of an LLM invocation.""" + + name: NotRequired[str] + """The name of the LLM invocation, if available.""" + + json: NotRequired[bool] + """If true, will attempt to elicit JSON from the LLM. Parsed JSON will be returned in the `json_output` field.""" + + is_response_valid: NotRequired[IsResponseValidFn] + """A function that checks if an LLM response is valid. Only valid if `json=True`.""" + + variables: NotRequired[dict] + """The variable replacements to use in the prompt.""" + + history: NotRequired[list[dict]] + """The history of the LLM invocation, if available (e.g. chat mode)""" + + model_parameters: NotRequired[dict] + """Additional model parameters to use in the LLM invocation.""" + + +T = TypeVar("T") + + +@dataclass +class LLMOutput(Generic[T]): + """The output of an LLM invocation.""" + + output: T | None + """The output of the LLM invocation.""" + + json: dict | None = field(default=None) + """The JSON output from the LLM, if available.""" + + history: list[dict] | None = field(default=None) + """The history of the LLM invocation, if available (e.g. chat mode)""" diff --git a/graphrag/llm/types/llm_types.py b/graphrag/llm/types/llm_types.py new file mode 100644 index 00000000..7ae76ef9 --- /dev/null +++ b/graphrag/llm/types/llm_types.py @@ -0,0 +1,16 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""LLM Types.""" + +from typing import TypeAlias + +from .llm import LLM + +EmbeddingInput: TypeAlias = list[str] +EmbeddingOutput: TypeAlias = list[list[float]] +CompletionInput: TypeAlias = str +CompletionOutput: TypeAlias = str + +EmbeddingLLM: TypeAlias = LLM[EmbeddingInput, EmbeddingOutput] +CompletionLLM: TypeAlias = LLM[CompletionInput, CompletionOutput] diff --git a/graphrag/model/__init__.py b/graphrag/model/__init__.py new file mode 100644 index 00000000..9dbec3d1 --- /dev/null +++ b/graphrag/model/__init__.py @@ -0,0 +1,31 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +""" +GraphRAG knowledge model package root. + +The GraphRAG knowledge model contains a set of classes that represent the target datamodels for our pipelines and analytics tools. +These models can be augmented and integrated into your own data infrastructure to suit your needs. +""" + +from .community import Community +from .community_report import CommunityReport +from .covariate import Covariate +from .document import Document +from .entity import Entity +from .identified import Identified +from .named import Named +from .relationship import Relationship +from .text_unit import TextUnit + +__all__ = [ + "Community", + "CommunityReport", + "Covariate", + "Document", + "Entity", + "Identified", + "Named", + "Relationship", + "TextUnit", +] diff --git a/graphrag/model/community.py b/graphrag/model/community.py new file mode 100644 index 00000000..800a9a29 --- /dev/null +++ b/graphrag/model/community.py @@ -0,0 +1,54 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A package containing the 'Community' model.""" + +from dataclasses import dataclass +from typing import Any + +from .named import Named + + +@dataclass +class Community(Named): + """A protocol for a community in the system.""" + + level: str = "" + """Community level.""" + + entity_ids: list[str] | None = None + """List of entity IDs related to the community (optional).""" + + relationship_ids: list[str] | None = None + """List of relationship IDs related to the community (optional).""" + + covariate_ids: dict[str, list[str]] | None = None + """Dictionary of different types of covariates related to the community (optional), e.g. claims""" + + attributes: dict[str, Any] | None = None + """A dictionary of additional attributes associated with the community (optional). To be included in the search prompt.""" + + @classmethod + def from_dict( + cls, + d: dict[str, Any], + id_key: str = "id", + title_key: str = "title", + short_id_key: str = "short_id", + level_key: str = "level", + entities_key: str = "entity_ids", + relationships_key: str = "relationship_ids", + covariates_key: str = "covariate_ids", + attributes_key: str = "attributes", + ) -> "Community": + """Create a new community from the dict data.""" + return Community( + id=d[id_key], + title=d[title_key], + short_id=d.get(short_id_key), + level=d[level_key], + entity_ids=d.get(entities_key), + relationship_ids=d.get(relationships_key), + covariate_ids=d.get(covariates_key), + attributes=d.get(attributes_key), + ) diff --git a/graphrag/model/community_report.py b/graphrag/model/community_report.py new file mode 100644 index 00000000..2666c0b5 --- /dev/null +++ b/graphrag/model/community_report.py @@ -0,0 +1,64 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A package containing the 'CommunityReport' model.""" + +from dataclasses import dataclass +from typing import Any + +from .named import Named + + +@dataclass +class CommunityReport(Named): + """Defines an LLM-generated summary report of a community.""" + + community_id: str + """The ID of the community this report is associated with.""" + + summary: str = "" + """Summary of the report.""" + + full_content: str = "" + """Full content of the report.""" + + rank: float | None = 1.0 + """Rank of the report, used for sorting (optional). Higher means more important""" + + summary_embedding: list[float] | None = None + """The semantic (i.e. text) embedding of the report summary (optional).""" + + full_content_embedding: list[float] | None = None + """The semantic (i.e. text) embedding of the full report content (optional).""" + + attributes: dict[str, Any] | None = None + """A dictionary of additional attributes associated with the report (optional).""" + + @classmethod + def from_dict( + cls, + d: dict[str, Any], + id_key: str = "id", + title_key: str = "title", + community_id_key: str = "community_id", + short_id_key: str = "short_id", + summary_key: str = "summary", + full_content_key: str = "full_content", + rank_key: str = "rank", + summary_embedding_key: str = "summary_embedding", + full_content_embedding_key: str = "full_content_embedding", + attributes_key: str = "attributes", + ) -> "CommunityReport": + """Create a new community report from the dict data.""" + return CommunityReport( + id=d[id_key], + title=d[title_key], + community_id=d[community_id_key], + short_id=d.get(short_id_key), + summary=d[summary_key], + full_content=d[full_content_key], + rank=d[rank_key], + summary_embedding=d.get(summary_embedding_key), + full_content_embedding=d.get(full_content_embedding_key), + attributes=d.get(attributes_key), + ) diff --git a/graphrag/model/covariate.py b/graphrag/model/covariate.py new file mode 100644 index 00000000..b974b6b3 --- /dev/null +++ b/graphrag/model/covariate.py @@ -0,0 +1,61 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A package containing the 'Covariate' model.""" + +from dataclasses import dataclass +from typing import Any + +from .identified import Identified + + +@dataclass +class Covariate(Identified): + """ + A protocol for a covariate in the system. + + Covariates are metadata associated with a subject, e.g. entity claims. + Each subject (e.g. entity) may be associated with multiple types of covariates. + """ + + subject_id: str + """The subject id.""" + + subject_type: str = "entity" + """The subject type.""" + + covariate_type: str = "claim" + """The covariate type.""" + + text_unit_ids: list[str] | None = None + """List of text unit IDs in which the covariate info appears (optional).""" + + document_ids: list[str] | None = None + """List of document IDs in which the covariate info appears (optional).""" + + attributes: dict[str, Any] | None = None + + @classmethod + def from_dict( + cls, + d: dict[str, Any], + id_key: str = "id", + subject_id_key: str = "subject_id", + subject_type_key: str = "subject_type", + covariate_type_key: str = "covariate_type", + short_id_key: str = "short_id", + text_unit_ids_key: str = "text_unit_ids", + document_ids_key: str = "document_ids", + attributes_key: str = "attributes", + ) -> "Covariate": + """Create a new covariate from the dict data.""" + return Covariate( + id=d[id_key], + short_id=d.get(short_id_key), + subject_id=d[subject_id_key], + subject_type=d.get(subject_type_key, "entity"), + covariate_type=d.get(covariate_type_key, "claim"), + text_unit_ids=d.get(text_unit_ids_key), + document_ids=d.get(document_ids_key), + attributes=d.get(attributes_key), + ) diff --git a/graphrag/model/document.py b/graphrag/model/document.py new file mode 100644 index 00000000..b54a39ac --- /dev/null +++ b/graphrag/model/document.py @@ -0,0 +1,64 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A package containing the 'Document' model.""" + +from dataclasses import dataclass, field +from typing import Any + +from .named import Named + + +@dataclass +class Document(Named): + """A protocol for a document in the system.""" + + type: str = "text" + """Type of the document.""" + + text_unit_ids: list[str] = field(default_factory=list) + """list of text units in the document.""" + + raw_content: str = "" + """The raw text content of the document.""" + + summary: str | None = None + """Summary of the document (optional).""" + + summary_embedding: list[float] | None = None + """The semantic embedding for the document summary (optional).""" + + raw_content_embedding: list[float] | None = None + """The semantic embedding for the document raw content (optional).""" + + attributes: dict[str, Any] | None = None + """A dictionary of structured attributes such as author, etc (optional).""" + + @classmethod + def from_dict( + cls, + d: dict[str, Any], + id_key: str = "id", + short_id_key: str = "short_id", + title_key: str = "title", + type_key: str = "type", + raw_content_key: str = "raw_content", + summary_key: str = "summary", + summary_embedding_key: str = "summary_embedding", + raw_content_embedding_key: str = "raw_content_embedding", + text_units_key: str = "text_units", + attributes_key: str = "attributes", + ) -> "Document": + """Create a new document from the dict data.""" + return Document( + id=d[id_key], + short_id=d.get(short_id_key), + title=d[title_key], + type=d.get(type_key, "text"), + raw_content=d[raw_content_key], + summary=d.get(summary_key), + summary_embedding=d.get(summary_embedding_key), + raw_content_embedding=d.get(raw_content_embedding_key), + text_unit_ids=d.get(text_units_key, []), + attributes=d.get(attributes_key), + ) diff --git a/graphrag/model/entity.py b/graphrag/model/entity.py new file mode 100644 index 00000000..37c26342 --- /dev/null +++ b/graphrag/model/entity.py @@ -0,0 +1,79 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A package containing the 'Entity' model.""" + +from dataclasses import dataclass +from typing import Any + +from .named import Named + + +@dataclass +class Entity(Named): + """A protocol for an entity in the system.""" + + type: str | None = None + """Type of the entity (can be any string, optional).""" + + description: str | None = None + """Description of the entity (optional).""" + + description_embedding: list[float] | None = None + """The semantic (i.e. text) embedding of the entity (optional).""" + + name_embedding: list[float] | None = None + """The semantic (i.e. text) embedding of the entity (optional).""" + + graph_embedding: list[float] | None = None + """The graph embedding of the entity, likely from node2vec (optional).""" + + community_ids: list[str] | None = None + """The community IDs of the entity (optional).""" + + text_unit_ids: list[str] | None = None + """List of text unit IDs in which the entity appears (optional).""" + + document_ids: list[str] | None = None + """List of document IDs in which the entity appears (optional).""" + + rank: int | None = 1 + """Rank of the entity, used for sorting (optional). Higher rank indicates more important entity. This can be based on centrality or other metrics.""" + + attributes: dict[str, Any] | None = None + """Additional attributes associated with the entity (optional), e.g. start time, end time, etc. To be included in the search prompt.""" + + @classmethod + def from_dict( + cls, + d: dict[str, Any], + id_key: str = "id", + short_id_key: str = "short_id", + title_key: str = "title", + type_key: str = "type", + description_key: str = "description", + description_embedding_key: str = "description_embedding", + name_embedding_key: str = "name_embedding", + graph_embedding_key: str = "graph_embedding", + community_key: str = "community", + text_unit_ids_key: str = "text_unit_ids", + document_ids_key: str = "document_ids", + rank_key: str = "degree", + attributes_key: str = "attributes", + ) -> "Entity": + """Create a new entity from the dict data.""" + return Entity( + id=d[id_key], + title=d[title_key], + short_id=d.get(short_id_key), + type=d.get(type_key), + description=d.get(description_key), + name_embedding=d.get(name_embedding_key), + description_embedding=d.get(description_embedding_key), + graph_embedding=d.get(graph_embedding_key), + community_ids=d.get(community_key), + rank=d.get(rank_key, 1), + text_unit_ids=d.get(text_unit_ids_key), + document_ids=d.get(document_ids_key), + attributes=d.get(attributes_key), + ) diff --git a/graphrag/model/identified.py b/graphrag/model/identified.py new file mode 100644 index 00000000..ca2c9395 --- /dev/null +++ b/graphrag/model/identified.py @@ -0,0 +1,17 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A package containing the 'Identified' protocol.""" + +from dataclasses import dataclass + + +@dataclass +class Identified: + """A protocol for an item with an ID.""" + + id: str + """The ID of the item.""" + + short_id: str | None + """Human readable ID used to refer to this community in prompts or texts displayed to users, such as in a report text (optional).""" diff --git a/graphrag/model/named.py b/graphrag/model/named.py new file mode 100644 index 00000000..5352c77c --- /dev/null +++ b/graphrag/model/named.py @@ -0,0 +1,16 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A package containing the 'Named' protocol.""" + +from dataclasses import dataclass + +from .identified import Identified + + +@dataclass +class Named(Identified): + """A protocol for an item with a name/title.""" + + title: str + """The name/title of the item.""" diff --git a/graphrag/model/relationship.py b/graphrag/model/relationship.py new file mode 100644 index 00000000..fadd0aaa --- /dev/null +++ b/graphrag/model/relationship.py @@ -0,0 +1,65 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A package containing the 'Relationship' model.""" + +from dataclasses import dataclass +from typing import Any + +from .identified import Identified + + +@dataclass +class Relationship(Identified): + """A relationship between two entities. This is a generic relationship, and can be used to represent any type of relationship between any two entities.""" + + source: str + """The source entity name.""" + + target: str + """The target entity name.""" + + weight: float | None = 1.0 + """The edge weight.""" + + description: str | None = None + """A description of the relationship (optional).""" + + description_embedding: list[float] | None = None + """The semantic embedding for the relationship description (optional).""" + + text_unit_ids: list[str] | None = None + """List of text unit IDs in which the relationship appears (optional).""" + + document_ids: list[str] | None = None + """List of document IDs in which the relationship appears (optional).""" + + attributes: dict[str, Any] | None = None + """Additional attributes associated with the relationship (optional). To be included in the search prompt""" + + @classmethod + def from_dict( + cls, + d: dict[str, Any], + id_key: str = "id", + short_id_key: str = "short_id", + source_key: str = "source", + target_key: str = "target", + description_key: str = "description", + weight_key: str = "weight", + text_unit_ids_key: str = "text_unit_ids", + document_ids_key: str = "document_ids", + attributes_key: str = "attributes", + ) -> "Relationship": + """Create a new relationship from the dict data.""" + return Relationship( + id=d[id_key], + short_id=d.get(short_id_key), + source=d[source_key], + target=d[target_key], + description=d.get(description_key), + weight=d.get(weight_key, 1.0), + text_unit_ids=d.get(text_unit_ids_key), + document_ids=d.get(document_ids_key), + attributes=d.get(attributes_key), + ) diff --git a/graphrag/model/text_unit.py b/graphrag/model/text_unit.py new file mode 100644 index 00000000..cff4ac01 --- /dev/null +++ b/graphrag/model/text_unit.py @@ -0,0 +1,67 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A package containing the 'TextUnit' model.""" + +from dataclasses import dataclass +from typing import Any + +from .identified import Identified + + +@dataclass +class TextUnit(Identified): + """A protocol for a TextUnit item in a Document database.""" + + text: str + """The text of the unit.""" + + text_embedding: list[float] | None = None + """The text embedding for the text unit (optional).""" + + entity_ids: list[str] | None = None + """List of entity IDs related to the text unit (optional).""" + + relationship_ids: list[str] | None = None + """List of relationship IDs related to the text unit (optional).""" + + covariate_ids: dict[str, list[str]] | None = None + "Dictionary of different types of covariates related to the text unit (optional)." + + n_tokens: int | None = None + """The number of tokens in the text (optional).""" + + document_ids: list[str] | None = None + """List of document IDs in which the text unit appears (optional).""" + + attributes: dict[str, Any] | None = None + """A dictionary of additional attributes associated with the text unit (optional).""" + + @classmethod + def from_dict( + cls, + d: dict[str, Any], + id_key: str = "id", + short_id_key: str = "short_id", + text_key: str = "text", + text_embedding_key: str = "text_embedding", + entities_key: str = "entity_ids", + relationships_key: str = "relationship_ids", + covariates_key: str = "covariate_ids", + n_tokens_key: str = "n_tokens", + document_ids_key: str = "document_ids", + attributes_key: str = "attributes", + ) -> "TextUnit": + """Create a new text unit from the dict data.""" + return TextUnit( + id=d[id_key], + short_id=d.get(short_id_key), + text=d[text_key], + text_embedding=d.get(text_embedding_key), + entity_ids=d.get(entities_key), + relationship_ids=d.get(relationships_key), + covariate_ids=d.get(covariates_key), + n_tokens=d.get(n_tokens_key), + document_ids=d.get(document_ids_key), + attributes=d.get(attributes_key), + ) diff --git a/graphrag/model/types.py b/graphrag/model/types.py new file mode 100644 index 00000000..6156e399 --- /dev/null +++ b/graphrag/model/types.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Common types for the GraphRAG knowledge model.""" + +from collections.abc import Callable + +TextEmbedder = Callable[[str], list[float]] diff --git a/graphrag/prompt_tune/__init__.py b/graphrag/prompt_tune/__init__.py new file mode 100644 index 00000000..2384b579 --- /dev/null +++ b/graphrag/prompt_tune/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Command line interface for the fine_tune module.""" diff --git a/graphrag/prompt_tune/__main__.py b/graphrag/prompt_tune/__main__.py new file mode 100644 index 00000000..341a0fa4 --- /dev/null +++ b/graphrag/prompt_tune/__main__.py @@ -0,0 +1,111 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Prompt auto templating package root.""" + +import argparse +import asyncio +from enum import Enum + +from graphrag.prompt_tune.generator import MAX_TOKEN_COUNT +from graphrag.prompt_tune.loader import MIN_CHUNK_SIZE + +from .cli import fine_tune + + +class DocSelectionType(Enum): + """The type of document selection to use.""" + + ALL = "all" + RANDOM = "random" + TOP = "top" + + def __str__(self): + """Return the string representation of the enum value.""" + return self.value + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + parser.add_argument( + "--root", + help="The data project root. Including the config yml, json or .env", + required=False, + type=str, + default=".", + ) + + parser.add_argument( + "--domain", + help="The domain your input data is related to. For example 'space science', 'microbiology', 'environmental news'. If left empty, the domain will be inferred from the input data.", + required=False, + default="", + type=str, + ) + + parser.add_argument( + "--method", + help="The method to select documents, one of: all, random or top", + required=False, + type=DocSelectionType, + choices=list(DocSelectionType), + default=DocSelectionType.RANDOM, + ) + + parser.add_argument( + "--limit", + help="The limit of files to load when doing random or top selection", + type=int, + required=False, + default=15, + ) + + parser.add_argument( + "--max-tokens", + help="Max token count for prompt generation", + type=int, + required=False, + default=MAX_TOKEN_COUNT, + ) + + parser.add_argument( + "--chunk-size", + help="Max token count for prompt generation", + type=int, + required=False, + default=MIN_CHUNK_SIZE, + ) + + parser.add_argument( + "--no-entity-types", + help="Use untyped entity extraction generation", + action="store_true", + required=False, + default=False, + ) + + parser.add_argument( + "--output", + help="Folder to save the generated prompts to", + type=str, + required=False, + default="prompts", + ) + + args = parser.parse_args() + + loop = asyncio.get_event_loop() + + loop.run_until_complete( + fine_tune( + args.root, + args.domain, + str(args.method), + args.limit, + args.max_tokens, + args.chunk_size, + args.no_entity_types, + args.output, + ) + ) diff --git a/graphrag/prompt_tune/cli.py b/graphrag/prompt_tune/cli.py new file mode 100644 index 00000000..94983cf7 --- /dev/null +++ b/graphrag/prompt_tune/cli.py @@ -0,0 +1,226 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Command line interface for the fine_tune module.""" + +from pathlib import Path + +from datashaper import NoopVerbCallbacks + +from graphrag.config.models.graph_rag_config import GraphRagConfig +from graphrag.index.llm import load_llm +from graphrag.index.progress import PrintProgressReporter +from graphrag.index.progress.types import ProgressReporter +from graphrag.llm.types.llm_types import CompletionLLM +from graphrag.prompt_tune.generator import ( + MAX_TOKEN_COUNT, + create_community_summarization_prompt, + create_entity_extraction_prompt, + create_entity_summarization_prompt, + generate_community_reporter_role, + generate_domain, + generate_entity_relationship_examples, + generate_entity_types, + generate_persona, +) +from graphrag.prompt_tune.loader import ( + MIN_CHUNK_SIZE, + load_docs_in_chunks, + read_config_parameters, +) + + +async def fine_tune( + root: str, + domain: str, + select: str = "random", + limit: int = 15, + max_tokens: int = MAX_TOKEN_COUNT, + chunk_size: int = MIN_CHUNK_SIZE, + skip_entity_types: bool = False, + output: str = "prompts", +): + """Fine tune the model. + + Parameters + ---------- + - root: The root directory. + - domain: The domain to map the input documents to. + - select: The chunk selection method. + - limit: The limit of chunks to load. + - max_tokens: The maximum number of tokens to use on entity extraction prompts. + - chunk_size: The chunk token size to use. + - skip_entity_types: Skip generating entity types. + - output: The output folder to store the prompts. + """ + reporter = PrintProgressReporter("") + config = read_config_parameters(root, reporter) + + await fine_tune_with_config( + root, + config, + domain, + select, + limit, + max_tokens, + chunk_size, + skip_entity_types, + output, + reporter, + ) + + +async def fine_tune_with_config( + root: str, + config: GraphRagConfig, + domain: str, + select: str = "random", + limit: int = 15, + max_tokens: int = MAX_TOKEN_COUNT, + chunk_size: int = MIN_CHUNK_SIZE, + skip_entity_types: bool = False, + output: str = "prompts", + reporter: ProgressReporter | None = None, +): + """Fine tune the model with a configuration. + + Parameters + ---------- + - root: The root directory. + - config: The GraphRag configuration. + - domain: The domain to map the input documents to. + - select: The chunk selection method. + - limit: The limit of chunks to load. + - max_tokens: The maximum number of tokens to use on entity extraction prompts. + - chunk_size: The chunk token size to use for input text units. + - skip_entity_types: Skip generating entity types. + - output: The output folder to store the prompts. + - reporter: The progress reporter. + + Returns + ------- + - None + """ + if not reporter: + reporter = PrintProgressReporter("") + + output_path = Path(config.root_dir) / output + + doc_list = await load_docs_in_chunks( + root=root, + config=config, + limit=limit, + select_method=select, + reporter=reporter, + chunk_size=chunk_size, + ) + + # Create LLM from config + llm = load_llm( + "fine_tuning", + config.llm.type, + NoopVerbCallbacks(), + None, + config.llm.model_dump(), + ) + + await generate_indexing_prompts( + llm, + config, + doc_list, + output_path, + reporter, + domain, + max_tokens, + skip_entity_types, + ) + + +async def generate_indexing_prompts( + llm: CompletionLLM, + config: GraphRagConfig, + doc_list: list[str], + output_path: Path, + reporter: ProgressReporter, + domain: str | None = None, + max_tokens: int = MAX_TOKEN_COUNT, + skip_entity_types: bool = False, +): + """Generate indexing prompts. + + Parameters + ---------- + - llm: The LLM model to use. + - config: The GraphRag configuration. + - doc_list: The list of documents to use. + - output_path: The path to store the prompts. + - reporter: The progress reporter. + - domain: The domain to map the input documents to. + - max_tokens: The maximum number of tokens to use on entity extraction prompts + - skip_entity_types: Skip generating entity types. + """ + if not domain: + reporter.info("Generating domain...") + domain = await generate_domain(llm, doc_list) + reporter.info(f"Generated domain: {domain}") + + reporter.info("Generating persona...") + persona = await generate_persona(llm, domain) + reporter.info(f"Generated persona: {persona}") + + entity_types = None + if not skip_entity_types: + reporter.info("Generating entity types") + entity_types = await generate_entity_types( + llm, + domain=domain, + persona=persona, + docs=doc_list, + json_mode=config.llm.model_supports_json or False, + ) + reporter.info(f"Generated entity types: {entity_types}") + + reporter.info("Generating entity relationship examples...") + examples = await generate_entity_relationship_examples( + llm, + persona=persona, + entity_types=entity_types, + docs=doc_list, + json_mode=False, # config.llm.model_supports_json should be used, but this prompts are used in non-json by the index engine + ) + reporter.info("Done generating entity relationship examples") + + reporter.info("Generating entity extraction prompt...") + create_entity_extraction_prompt( + entity_types=entity_types, + docs=doc_list, + examples=examples, + json_mode=False, # config.llm.model_supports_json should be used, but this prompts are used in non-json by the index engine + model_name=config.llm.model, + output_path=output_path, + max_token_count=max_tokens, + ) + reporter.info(f"Generated entity extraction prompt, stored in folder {output_path}") + + reporter.info("Generating entity summarization prompt...") + create_entity_summarization_prompt( + persona=persona, + output_path=output_path, + ) + reporter.info( + f"Generated entity summarization prompt, stored in folder {output_path}" + ) + + reporter.info("Generating community reporter role...") + community_reporter_role = await generate_community_reporter_role( + llm, domain=domain, persona=persona, docs=doc_list + ) + reporter.info(f"Generated community reporter role: {community_reporter_role}") + + reporter.info("Generating community summarization prompt...") + create_community_summarization_prompt( + persona=persona, role=community_reporter_role, output_path=output_path + ) + reporter.info( + f"Generated community summarization prompt, stored in folder {output_path}" + ) diff --git a/graphrag/prompt_tune/generator/__init__.py b/graphrag/prompt_tune/generator/__init__.py new file mode 100644 index 00000000..e93277b4 --- /dev/null +++ b/graphrag/prompt_tune/generator/__init__.py @@ -0,0 +1,26 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Prompt generation module.""" + +from .community_report_summarization import create_community_summarization_prompt +from .community_reporter_role import generate_community_reporter_role +from .defaults import MAX_TOKEN_COUNT +from .domain import generate_domain +from .entity_extraction_prompt import create_entity_extraction_prompt +from .entity_relationship import generate_entity_relationship_examples +from .entity_summarization_prompt import create_entity_summarization_prompt +from .entity_types import generate_entity_types +from .persona import generate_persona + +__all__ = [ + "MAX_TOKEN_COUNT", + "create_community_summarization_prompt", + "create_entity_extraction_prompt", + "create_entity_summarization_prompt", + "generate_community_reporter_role", + "generate_domain", + "generate_entity_relationship_examples", + "generate_entity_types", + "generate_persona", +] diff --git a/graphrag/prompt_tune/generator/community_report_summarization.py b/graphrag/prompt_tune/generator/community_report_summarization.py new file mode 100644 index 00000000..4a0a7ea6 --- /dev/null +++ b/graphrag/prompt_tune/generator/community_report_summarization.py @@ -0,0 +1,40 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Module for generating prompts for community report summarization.""" + +from pathlib import Path + +from graphrag.prompt_tune.template import COMMUNITY_REPORT_SUMMARIZATION_PROMPT + +COMMUNITY_SUMMARIZATION_FILENAME = "community_report.txt" + + +def create_community_summarization_prompt( + persona: str, + role: str, + output_path: Path | None = None, +) -> str: + """Create a prompt for community summarization. If output_path is provided, write the prompt to a file. + + Parameters + ---------- + - persona (str): The persona to use for the community summarization prompt + - role (str): The role to use for the community summarization prompt + - output_path (Path | None): The path to write the prompt to. Default is None. If None, the prompt is not written to a file. Default is None. + + Returns + ------- + - str: The community summarization prompt + """ + prompt = COMMUNITY_REPORT_SUMMARIZATION_PROMPT.format(persona=persona, role=role) + + if output_path: + output_path.mkdir(parents=True, exist_ok=True) + + output_path = output_path / COMMUNITY_SUMMARIZATION_FILENAME + # Write file to output path + with output_path.open("w") as file: + file.write(prompt) + + return prompt diff --git a/graphrag/prompt_tune/generator/community_reporter_role.py b/graphrag/prompt_tune/generator/community_reporter_role.py new file mode 100644 index 00000000..9abd5ed8 --- /dev/null +++ b/graphrag/prompt_tune/generator/community_reporter_role.py @@ -0,0 +1,35 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Generate a community reporter role for community summarization.""" + +from graphrag.llm.types.llm_types import CompletionLLM +from graphrag.prompt_tune.prompt import ( + GENERATE_COMMUNITY_REPORTER_ROLE_PROMPT, +) + + +async def generate_community_reporter_role( + llm: CompletionLLM, domain: str, persona: str, docs: str | list[str] +) -> str: + """Generate an LLM persona to use for GraphRAG prompts. + + Parameters + ---------- + - llm (CompletionLLM): The LLM to use for generation + - domain (str): The domain to generate a persona for + - persona (str): The persona to generate a role for + - docs (str | list[str]): The domain to generate a persona for + + Returns + ------- + - str: The generated domain prompt response. + """ + docs_str = " ".join(docs) if isinstance(docs, list) else docs + domain_prompt = GENERATE_COMMUNITY_REPORTER_ROLE_PROMPT.format( + domain=domain, persona=persona, input_text=docs_str + ) + + response = await llm(domain_prompt) + + return str(response.output) diff --git a/graphrag/prompt_tune/generator/defaults.py b/graphrag/prompt_tune/generator/defaults.py new file mode 100644 index 00000000..5b42f813 --- /dev/null +++ b/graphrag/prompt_tune/generator/defaults.py @@ -0,0 +1,10 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Default values for the fine-tuning module.""" + +DEFAULT_TASK = """ +Identify the relations and structure of the community of interest, specifically within the {domain} domain. +""" + +MAX_TOKEN_COUNT = 2000 diff --git a/graphrag/prompt_tune/generator/domain.py b/graphrag/prompt_tune/generator/domain.py new file mode 100644 index 00000000..49c698d1 --- /dev/null +++ b/graphrag/prompt_tune/generator/domain.py @@ -0,0 +1,27 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Domain generation for GraphRAG prompts.""" + +from graphrag.llm.types.llm_types import CompletionLLM +from graphrag.prompt_tune.prompt.domain import GENERATE_DOMAIN_PROMPT + + +async def generate_domain(llm: CompletionLLM, docs: str | list[str]) -> str: + """Generate an LLM persona to use for GraphRAG prompts. + + Parameters + ---------- + - llm (CompletionLLM): The LLM to use for generation + - docs (str | list[str]): The domain to generate a persona for + + Returns + ------- + - str: The generated domain prompt response. + """ + docs_str = " ".join(docs) if isinstance(docs, list) else docs + domain_prompt = GENERATE_DOMAIN_PROMPT.format(input_text=docs_str) + + response = await llm(domain_prompt) + + return str(response.output) diff --git a/graphrag/prompt_tune/generator/entity_extraction_prompt.py b/graphrag/prompt_tune/generator/entity_extraction_prompt.py new file mode 100644 index 00000000..3866abf9 --- /dev/null +++ b/graphrag/prompt_tune/generator/entity_extraction_prompt.py @@ -0,0 +1,100 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Entity Extraction prompt generator module.""" + +from pathlib import Path + +from graphrag.index.utils.tokens import num_tokens_from_string +from graphrag.prompt_tune.template import ( + EXAMPLE_EXTRACTION_TEMPLATE, + GRAPH_EXTRACTION_JSON_PROMPT, + GRAPH_EXTRACTION_PROMPT, + UNTYPED_EXAMPLE_EXTRACTION_TEMPLATE, + UNTYPED_GRAPH_EXTRACTION_PROMPT, +) + +ENTITY_EXTRACTION_FILENAME = "entity_extraction.txt" + + +def create_entity_extraction_prompt( + entity_types: str | list[str] | None, + docs: list[str], + examples: list[str], + model_name: str, + max_token_count: int, + json_mode: bool = False, + output_path: Path | None = None, +) -> str: + """ + Create a prompt for entity extraction. + + Parameters + ---------- + - entity_types (str | list[str]): The entity types to extract + - docs (list[str]): The list of documents to extract entities from + - examples (list[str]): The list of examples to use for entity extraction + - model_name (str): The name of the model to use for token counting + - max_token_count (int): The maximum number of tokens to use for the prompt + - json_mode (bool): Whether to use JSON mode for the prompt. Default is False + - output_path (Path | None): The path to write the prompt to. Default is None. If None, the prompt is not written to a file. Default is None. + + Returns + ------- + - str: The entity extraction prompt + """ + prompt = ( + (GRAPH_EXTRACTION_JSON_PROMPT if json_mode else GRAPH_EXTRACTION_PROMPT) + if entity_types + else UNTYPED_GRAPH_EXTRACTION_PROMPT + ) + if isinstance(entity_types, list): + entity_types = ", ".join(entity_types) + + tokens_left = ( + max_token_count + - num_tokens_from_string(prompt, model=model_name) + - num_tokens_from_string(entity_types, model=model_name) + if entity_types + else 0 + ) + + examples_prompt = "" + + # Iterate over examples, while we have tokens left or examples left + for i, output in enumerate(examples): + input = docs[i] + example_formatted = ( + EXAMPLE_EXTRACTION_TEMPLATE.format( + n=i + 1, input_text=input, entity_types=entity_types, output=output + ) + if entity_types + else UNTYPED_EXAMPLE_EXTRACTION_TEMPLATE.format( + n=i + 1, input_text=input, output=output + ) + ) + + example_tokens = num_tokens_from_string(example_formatted, model=model_name) + + # Squeeze in at least one example + if i > 0 and example_tokens > tokens_left: + break + + examples_prompt += example_formatted + tokens_left -= example_tokens + + prompt = ( + prompt.format(entity_types=entity_types, examples=examples_prompt) + if entity_types + else prompt.format(examples=examples_prompt) + ) + + if output_path: + output_path.mkdir(parents=True, exist_ok=True) + + output_path = output_path / ENTITY_EXTRACTION_FILENAME + # Write file to output path + with output_path.open("w") as file: + file.write(prompt) + + return prompt diff --git a/graphrag/prompt_tune/generator/entity_relationship.py b/graphrag/prompt_tune/generator/entity_relationship.py new file mode 100644 index 00000000..71c646c1 --- /dev/null +++ b/graphrag/prompt_tune/generator/entity_relationship.py @@ -0,0 +1,62 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Entity relationship example generation module.""" + +import asyncio +import json + +from graphrag.llm.types.llm_types import CompletionLLM +from graphrag.prompt_tune.prompt import ( + ENTITY_RELATIONSHIPS_GENERATION_JSON_PROMPT, + ENTITY_RELATIONSHIPS_GENERATION_PROMPT, + UNTYPED_ENTITY_RELATIONSHIPS_GENERATION_PROMPT, +) + +MAX_EXAMPLES = 5 + + +async def generate_entity_relationship_examples( + llm: CompletionLLM, + persona: str, + entity_types: str | list[str] | None, + docs: str | list[str], + json_mode: bool = False, +) -> list[str]: + """Generate a list of entity/relationships examples for use in generating an entity configuration. + + Will return entity/relationships examples as either JSON or in tuple_delimiter format depending + on the json_mode parameter. + """ + docs_list = [docs] if isinstance(docs, str) else docs + history = [{"role": "system", "content": persona}] + + if entity_types: + entity_types_str = ( + entity_types if isinstance(entity_types, str) else ", ".join(entity_types) + ) + + messages = [ + ( + ENTITY_RELATIONSHIPS_GENERATION_JSON_PROMPT + if json_mode + else ENTITY_RELATIONSHIPS_GENERATION_PROMPT + ).format(entity_types=entity_types_str, input_text=doc) + for doc in docs_list + ] + else: + messages = [ + UNTYPED_ENTITY_RELATIONSHIPS_GENERATION_PROMPT.format(input_text=doc) + for doc in docs_list + ] + + messages = messages[:MAX_EXAMPLES] + + tasks = [llm(message, history=history, json=json_mode) for message in messages] + + responses = await asyncio.gather(*tasks) + + return [ + json.dumps(response.json or "") if json_mode else str(response.output) + for response in responses + ] diff --git a/graphrag/prompt_tune/generator/entity_summarization_prompt.py b/graphrag/prompt_tune/generator/entity_summarization_prompt.py new file mode 100644 index 00000000..779ce8d7 --- /dev/null +++ b/graphrag/prompt_tune/generator/entity_summarization_prompt.py @@ -0,0 +1,34 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Entity summarization prompt generation module.""" + +from pathlib import Path + +from graphrag.prompt_tune.template import ENTITY_SUMMARIZATION_PROMPT + +ENTITY_SUMMARIZATION_FILENAME = "summarize_descriptions.txt" + + +def create_entity_summarization_prompt( + persona: str, + output_path: Path | None = None, +) -> str: + """Create a prompt for entity summarization. If output_path is provided, write the prompt to a file. + + Parameters + ---------- + - persona (str): The persona to use for the entity summarization prompt + - output_path (Path | None): The path to write the prompt to. Default is None. If None, the prompt is not written to a file. Default is None. + """ + prompt = ENTITY_SUMMARIZATION_PROMPT.format(persona=persona) + + if output_path: + output_path.mkdir(parents=True, exist_ok=True) + + output_path = output_path / ENTITY_SUMMARIZATION_FILENAME + # Write file to output path + with output_path.open("w") as file: + file.write(prompt) + + return prompt diff --git a/graphrag/prompt_tune/generator/entity_types.py b/graphrag/prompt_tune/generator/entity_types.py new file mode 100644 index 00000000..42518acd --- /dev/null +++ b/graphrag/prompt_tune/generator/entity_types.py @@ -0,0 +1,45 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Entity type generation module for fine-tuning.""" + +from graphrag.llm.types.llm_types import CompletionLLM +from graphrag.prompt_tune.generator.defaults import DEFAULT_TASK +from graphrag.prompt_tune.prompt.entity_types import ( + ENTITY_TYPE_GENERATION_JSON_PROMPT, + ENTITY_TYPE_GENERATION_PROMPT, +) + + +async def generate_entity_types( + llm: CompletionLLM, + domain: str, + persona: str, + docs: str | list[str], + task: str = DEFAULT_TASK, + json_mode: bool = False, +) -> str | list[str]: + """ + Generate entity type categories from a given set of (small) documents. + + Example Output: + "entity_types": ['military unit', 'organization', 'person', 'location', 'event', 'date', 'equipment'] + """ + formatted_task = task.format(domain=domain) + + docs_str = "\n".join(docs) if isinstance(docs, list) else docs + + entity_types_prompt = ( + ENTITY_TYPE_GENERATION_JSON_PROMPT + if json_mode + else ENTITY_TYPE_GENERATION_PROMPT + ).format(task=formatted_task, input_text=docs_str) + + history = [{"role": "system", "content": persona}] + + response = await llm(entity_types_prompt, history=history, json=json_mode) + + if json_mode: + return (response.json or {}).get("entity_types", []) + + return str(response.output) diff --git a/graphrag/prompt_tune/generator/persona.py b/graphrag/prompt_tune/generator/persona.py new file mode 100644 index 00000000..cdd57a65 --- /dev/null +++ b/graphrag/prompt_tune/generator/persona.py @@ -0,0 +1,27 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Persona generating module for fine-tuning GraphRAG prompts.""" + +from graphrag.llm.types.llm_types import CompletionLLM +from graphrag.prompt_tune.generator.defaults import DEFAULT_TASK +from graphrag.prompt_tune.prompt import GENERATE_PERSONA_PROMPT + + +async def generate_persona( + llm: CompletionLLM, domain: str, task: str = DEFAULT_TASK +) -> str: + """Generate an LLM persona to use for GraphRAG prompts. + + Parameters + ---------- + - llm (CompletionLLM): The LLM to use for generation + - domain (str): The domain to generate a persona for + - task (str): The task to generate a persona for. Default is DEFAULT_TASK + """ + formatted_task = task.format(domain=domain) + persona_prompt = GENERATE_PERSONA_PROMPT.format(sample_task=formatted_task) + + response = await llm(persona_prompt) + + return str(response.output) diff --git a/graphrag/prompt_tune/loader/__init__.py b/graphrag/prompt_tune/loader/__init__.py new file mode 100644 index 00000000..94e64cbe --- /dev/null +++ b/graphrag/prompt_tune/loader/__init__.py @@ -0,0 +1,14 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Fine-tuning config and data loader module.""" + +from .config import read_config_parameters +from .input import MIN_CHUNK_OVERLAP, MIN_CHUNK_SIZE, load_docs_in_chunks + +__all__ = [ + "MIN_CHUNK_OVERLAP", + "MIN_CHUNK_SIZE", + "load_docs_in_chunks", + "read_config_parameters", +] diff --git a/graphrag/prompt_tune/loader/config.py b/graphrag/prompt_tune/loader/config.py new file mode 100644 index 00000000..db451156 --- /dev/null +++ b/graphrag/prompt_tune/loader/config.py @@ -0,0 +1,43 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Config loading, parsing and handling module.""" + +from pathlib import Path + +from graphrag.config import create_graphrag_config +from graphrag.index.progress.types import ProgressReporter + + +def read_config_parameters(root: str, reporter: ProgressReporter): + """Read the configuration parameters from the settings file or environment variables. + + Parameters + ---------- + - root: The root directory where the parameters are. + - reporter: The progress reporter. + """ + _root = Path(root) + settings_yaml = _root / "settings.yaml" + if not settings_yaml.exists(): + settings_yaml = _root / "settings.yml" + settings_json = _root / "settings.json" + + if settings_yaml.exists(): + reporter.info(f"Reading settings from {settings_yaml}") + with settings_yaml.open("r") as file: + import yaml + + data = yaml.safe_load(file) + return create_graphrag_config(data, root) + + if settings_json.exists(): + reporter.info(f"Reading settings from {settings_json}") + with settings_json.open("r") as file: + import json + + data = json.loads(file.read()) + return create_graphrag_config(data, root) + + reporter.info("Reading settings from environment variables") + return create_graphrag_config(root_dir=root) diff --git a/graphrag/prompt_tune/loader/input.py b/graphrag/prompt_tune/loader/input.py new file mode 100644 index 00000000..42f58c80 --- /dev/null +++ b/graphrag/prompt_tune/loader/input.py @@ -0,0 +1,59 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Input loading module.""" + +from typing import cast + +import pandas as pd +from datashaper import NoopVerbCallbacks, TableContainer, VerbInput + +from graphrag.config.models.graph_rag_config import GraphRagConfig +from graphrag.index.input import load_input +from graphrag.index.progress.types import ProgressReporter +from graphrag.index.verbs import chunk + +MIN_CHUNK_SIZE = 200 +MIN_CHUNK_OVERLAP = 0 + + +async def load_docs_in_chunks( + root: str, + config: GraphRagConfig, + select_method: str, + limit: int, + reporter: ProgressReporter, + chunk_size: int = MIN_CHUNK_SIZE, +) -> list[str]: + """Load docs into chunks for generating prompts.""" + dataset = await load_input(config.input, reporter, root) + + # covert to text units + input = VerbInput(input=TableContainer(table=dataset)) + chunk_strategy = config.chunks.resolved_strategy() + + # Use smaller chunks, to avoid huge prompts + chunk_strategy["chunk_size"] = chunk_size + chunk_strategy["chunk_overlap"] = MIN_CHUNK_OVERLAP + + dataset_chunks_table_container = chunk( + input, + column="text", + to="chunks", + callbacks=NoopVerbCallbacks(), + strategy=chunk_strategy, + ) + + dataset_chunks = cast(pd.DataFrame, dataset_chunks_table_container.table) + + # Select chunks into a new df and explode it + chunks_df = pd.DataFrame(dataset_chunks["chunks"].explode()) # type: ignore + + # Depending on the select method, build the dataset + if select_method == "top": + chunks_df = chunks_df[:limit] + elif select_method == "random": + chunks_df = chunks_df.sample(n=limit) + + # Convert the dataset to list form, so we have a list of documents + return chunks_df["chunks"].tolist() diff --git a/graphrag/prompt_tune/prompt/__init__.py b/graphrag/prompt_tune/prompt/__init__.py new file mode 100644 index 00000000..b1f5de15 --- /dev/null +++ b/graphrag/prompt_tune/prompt/__init__.py @@ -0,0 +1,28 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Persona, entity type, relationships and domain generation prompts module.""" + +from .community_reporter_role import GENERATE_COMMUNITY_REPORTER_ROLE_PROMPT +from .domain import GENERATE_DOMAIN_PROMPT +from .entity_relationship import ( + ENTITY_RELATIONSHIPS_GENERATION_JSON_PROMPT, + ENTITY_RELATIONSHIPS_GENERATION_PROMPT, + UNTYPED_ENTITY_RELATIONSHIPS_GENERATION_PROMPT, +) +from .entity_types import ( + ENTITY_TYPE_GENERATION_JSON_PROMPT, + ENTITY_TYPE_GENERATION_PROMPT, +) +from .persona import GENERATE_PERSONA_PROMPT + +__all__ = [ + "ENTITY_RELATIONSHIPS_GENERATION_JSON_PROMPT", + "ENTITY_RELATIONSHIPS_GENERATION_PROMPT", + "ENTITY_TYPE_GENERATION_JSON_PROMPT", + "ENTITY_TYPE_GENERATION_PROMPT", + "GENERATE_COMMUNITY_REPORTER_ROLE_PROMPT", + "GENERATE_DOMAIN_PROMPT", + "GENERATE_PERSONA_PROMPT", + "UNTYPED_ENTITY_RELATIONSHIPS_GENERATION_PROMPT", +] diff --git a/graphrag/prompt_tune/prompt/community_reporter_role.py b/graphrag/prompt_tune/prompt/community_reporter_role.py new file mode 100644 index 00000000..b667bc29 --- /dev/null +++ b/graphrag/prompt_tune/prompt/community_reporter_role.py @@ -0,0 +1,20 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Fine-tuning prompts for community reporter role generation.""" + +GENERATE_COMMUNITY_REPORTER_ROLE_PROMPT = """ +{persona} +Given a sample text, help the user by creating a role definition that will be tasked with community analysis. +Take a look at this example, determine its key parts, and using the domain provided and your expertise, create a new role definition for the provided inputs that follows the same pattern as the example. +Remember, your output should look just like the provided example in structure and content. + +Example: +A technologist reporter that is analyzing Kevin Scott's "Behind the Tech Podcast", given a list of entities +that belong to the community as well as their relationships and optional associated claims. +The report will be used to inform decision-makers about significant developments associated with the community and their potential impact. + + +Domain: {domain} +Text: {input_text} +Role:""" diff --git a/graphrag/prompt_tune/prompt/domain.py b/graphrag/prompt_tune/prompt/domain.py new file mode 100644 index 00000000..4b4587f8 --- /dev/null +++ b/graphrag/prompt_tune/prompt/domain.py @@ -0,0 +1,12 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Fine-tuning prompts for domain generation.""" + +GENERATE_DOMAIN_PROMPT = """ +You are an intelligent assistant that helps a human to analyze the information in a text document. +Given a sample text, help the user by assigning a descriptive domain that summarizes what the text is about. +Example domains are: "Social studies", "Algorithmic analysis", "Medical science", among others. + +Text: {input_text} +Domain:""" diff --git a/graphrag/prompt_tune/prompt/entity_relationship.py b/graphrag/prompt_tune/prompt/entity_relationship.py new file mode 100644 index 00000000..29ed2eb2 --- /dev/null +++ b/graphrag/prompt_tune/prompt/entity_relationship.py @@ -0,0 +1,132 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Fine-tuning prompts for entity relationship generation.""" + +ENTITY_RELATIONSHIPS_GENERATION_PROMPT = """ +-Goal- +Given a text document that is potentially relevant to this activity and a list of entity types, identify all entities of those types from the text and all relationships among the identified entities. + +-Steps- +1. Identify all entities. For each identified entity, extract the following information: +- entity_name: Name of the entity, capitalized +- entity_type: One of the following types: [{entity_types}] +- entity_description: Comprehensive description of the entity's attributes and activities +Format each entity, include the parenthesis at the beginning and end, as ("entity"{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}) +for example: ("entity"{{tuple_delimiter}}"Microsoft"{{tuple_delimiter}}"organization"{{tuple_delimiter}}"Microsoft is a technology company") + +2. From the entities identified in step 1, identify all pairs of (source_entity, target_entity) that are *clearly related* to each other. +For each pair of related entities, extract the following information: +- source_entity: name of the source entity, as identified in step 1 +- target_entity: name of the target entity, as identified in step 1 +- relationship_description: explanation as to why you think the source entity and the target entity are related to each other +- relationship_strength: an integer score between 1 to 10, indicating strength of the relationship between the source entity and target entity +Format each relationship, include the parenthesis at the beginning and end, as ("relationship"{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}) +for example: ("relationship"{{tuple_delimiter}}"company A"{{tuple_delimiter}}"person A"{{tuple_delimiter}}"company A is currently owned by person A"{{tuple_delimiter}}8) + +3. Return output in English as a single list of all the entities and relationships identified in steps 1 and 2. Use **{{record_delimiter}}** as the list delimiter. + +4. When finished, output {{completion_delimiter}}. + +-Real Data- +###################### +entity_types: {entity_types} +text: {input_text} +###################### +output: +""" + +ENTITY_RELATIONSHIPS_GENERATION_JSON_PROMPT = """ +-Goal- +Given a text document that is potentially relevant to this activity and a list of entity types, identify all entities of those types from the text and all relationships among the identified entities. + +-Steps- +1. Identify all entities. For each identified entity, extract the following information: +- entity_name: Name of the entity, capitalized +- entity_type: One of the following types: [{entity_types}] +- entity_description: Comprehensive description of the entity's attributes and activities + +Format each entity output as a JSON entry with the following format: + +{{"name": , "type": , "description": }} + +2. From the entities identified in step 1, identify all pairs of (source_entity, target_entity) that are *clearly related* to each other. +For each pair of related entities, extract the following information: +- source_entity: name of the source entity, as identified in step 1 +- target_entity: name of the target entity, as identified in step 1 +- relationship_description: explanation as to why you think the source entity and the target entity are related to each other +- relationship_strength: an integer score between 1 to 10, indicating strength of the relationship between the source entity and target entity + +Format each relationship as a JSON entry with the following format: + +{{"source": , "target": , "relationship": , "relationship_strength": }} + +3. Return output in English as a single list of all JSON entities and relationships identified in steps 1 and 2. + +-Real Data- +###################### +entity_types: {entity_types} +text: {input_text} +###################### +output: +""" + +UNTYPED_ENTITY_RELATIONSHIPS_GENERATION_PROMPT = """ +-Goal- +Given a text document that is potentially relevant to this activity, first identify all entities needed from the text in order to capture the information and ideas in the text. +Next, report all relationships among the identified entities. + +-Steps- +1. Identify all entities. For each identified entity, extract the following information: +- entity_name: Name of the entity, capitalized +- entity_type: Suggest several labels or categories for the entity. The categories should not be specific, but should be as general as possible. +- entity_description: Comprehensive description of the entity's attributes and activities +Format each entity as ("entity"{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}} + +2. From the entities identified in step 1, identify all pairs of (source_entity, target_entity) that are *clearly related* to each other. +For each pair of related entities, extract the following information: +- source_entity: name of the source entity, as identified in step 1 +- target_entity: name of the target entity, as identified in step 1 +- relationship_description: explanation as to why you think the source entity and the target entity are related to each other +- relationship_strength: a numeric score indicating strength of the relationship between the source entity and target entity + Format each relationship as ("relationship"{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}) + +3. Return output in English as a single list of all the entities and relationships identified in steps 1 and 2. Use **{{record_delimiter}}** as the list delimiter. + +4. When finished, output {{completion_delimiter}} + +###################### +-Examples- +###################### +Text: +The Fed is scheduled to meet on Tuesday and Wednesday, with the central bank planning to release its latest policy decision on Wednesday at 2:00 p.m. ET, followed by a press conference where Fed Chair Jerome Powell will take questions. Investors expect the Federal Open Market Committee to hold its benchmark interest rate steady in a range of 5.25%-5.5%. +###################### +Output: +("entity"{{tuple_delimiter}}FED{{tuple_delimiter}}ORGANIZATION{{tuple_delimiter}}The Fed is the Federal Reserve, which is setting interest rates on Tuesday and Wednesday) +{{record_delimiter}} +("entity"{{tuple_delimiter}}JEROME POWELL{{tuple_delimiter}}PERSON{{tuple_delimiter}}Jerome Powell is the chair of the Federal Reserve) +{{record_delimiter}} +("entity"{{tuple_delimiter}}FEDERAL OPEN MARKET COMMITTEE{{tuple_delimiter}}ORGANIZATION{{tuple_delimiter}}The Federal Reserve committee makes key decisions about interest rates and the growth of the United States money supply) +{{record_delimiter}} +("relationship"{{tuple_delimiter}}JEROME POWELL{{tuple_delimiter}}FED{{tuple_delimiter}}Jerome Powell is the Chair of the Federal Reserve and will answer questions at a press conference{{tuple_delimiter}}9) +{{completion_delimiter}} +###################### +Text: +Arm's (ARM) stock skyrocketed in its opening day on the Nasdaq Thursday. But IPO experts warn that the British chipmaker's debut on the public markets isn't indicative of how other newly listed companies may perform. + +Arm, a formerly public company, was taken private by SoftBank in 2016. The well-established chip designer says it powers 99% of premium smartphones. +###################### +Output: +("entity"{{tuple_delimiter}}ARM{{tuple_delimiter}}ORGANIZATION, COMPANY{{tuple_delimiter}}Arm is a stock now listed on the Nasdaq which powers 99% of premium smartphones) +{{record_delimiter}} +("entity"{{tuple_delimiter}}SOFTBANK{{tuple_delimiter}}ORGANIZATION, COMPANY{{tuple_delimiter}}SoftBank is a firm that previously owned Arm) +{{record_delimiter}} +("relationship"{{tuple_delimiter}}ARM{{tuple_delimiter}}SOFTBANK{{tuple_delimiter}}SoftBank formerly owned Arm from 2016 until present{{tuple_delimiter}}5) +{{completion_delimiter}} +###################### +-Real Data- +###################### +Text: {input_text} +###################### +Output: +""" diff --git a/graphrag/prompt_tune/prompt/entity_types.py b/graphrag/prompt_tune/prompt/entity_types.py new file mode 100644 index 00000000..99b21db6 --- /dev/null +++ b/graphrag/prompt_tune/prompt/entity_types.py @@ -0,0 +1,89 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Fine-tuning prompts for entity types generation.""" + +ENTITY_TYPE_GENERATION_PROMPT = """ +The goal is to study the connections and relations between the entity types and their features in order to understand all available information from the text. +The user's task is to {task}. +As part of the analysis, you want to identify the entity types present in the following text. +The entity types must be relevant to the user task. +Avoid general entity types such as "other" or "unknown". +This is VERY IMPORTANT: Do not generate redundant or overlapping entity types. For example, if the text contains "company" and "organization" entity types, you should return only one of them. +Don't worry about quantity, always choose quality over quantity. And make sure EVERYTHING in your answer is relevant to the context of entity extraction. +And remember, it is ENTITY TYPES what we need. +Return the entity types in as a list of comma sepparated of strings. +===================================================================== +EXAMPLE SECTION: The following section includes example output. These examples **must be excluded from your answer**. + +EXAMPLE 1 +Task: Determine the connections and organizational hierarchy within the specified community. +Text: Example_Org_A is a company in Sweden. Example_Org_A's director is Example_Individual_B. +RESPONSE: +organization, person +END OF EXAMPLE 1 + +EXAMPLE 2 +Task: Identify the key concepts, principles, and arguments shared among different philosophical schools of thought, and trace the historical or ideological influences they have on each other. +Text: Rationalism, epitomized by thinkers such as René Descartes, holds that reason is the primary source of knowledge. Key concepts within this school include the emphasis on the deductive method of reasoning. +RESPONSE: +concept, person, school of thought +END OF EXAMPLE 2 + +EXAMPLE 3 +Task: Identify the full range of basic forces, factors, and trends that would indirectly shape an issue. +Text: Industry leaders such as Panasonic are vying for supremacy in the battery production sector. They are investing heavily in research and development and are exploring new technologies to gain a competitive edge. +RESPONSE: +organization, technology, sectors, investment strategies +END OF EXAMPLE 3 +====================================================================== + +====================================================================== +REAL DATA: The following section is the real data. You should use only this real data to prepare your answer. Generate Entity Types only. +Task: {task} +Text: {input_text} +RESPONSE: +{{}} +""" + +ENTITY_TYPE_GENERATION_JSON_PROMPT = """ +The goal is to study the connections and relations between the entity types and their features in order to understand all available information from the text. +The user's task is to {task}. +As part of the analysis, you want to identify the entity types present in the following text. +The entity types must be relevant to the user task. +Avoid general entity types such as "other" or "unknown". +This is VERY IMPORTANT: Do not generate redundant or overlapping entity types. For example, if the text contains "company" and "organization" entity types, you should return only one of them. +Don't worry about quantity, always choose quality over quantity. And make sure EVERYTHING in your answer is relevant to the context of entity extraction. +Return the entity types in JSON format with "entities" as the key and the entity types as an array of strings. +===================================================================== +EXAMPLE SECTION: The following section includes example output. These examples **must be excluded from your answer**. + +EXAMPLE 1 +Task: Determine the connections and organizational hierarchy within the specified community. +Text: Example_Org_A is a company in Sweden. Example_Org_A's director is Example_Individual_B. +JSON RESPONSE: +{{"entity_types": [organization, person] }} +END OF EXAMPLE 1 + +EXAMPLE 2 +Task: Identify the key concepts, principles, and arguments shared among different philosophical schools of thought, and trace the historical or ideological influences they have on each other. +Text: Rationalism, epitomized by thinkers such as René Descartes, holds that reason is the primary source of knowledge. Key concepts within this school include the emphasis on the deductive method of reasoning. +JSON RESPONSE: +{{"entity_types": [concept, person, school of thought] }} +END OF EXAMPLE 2 + +EXAMPLE 3 +Task: Identify the full range of basic forces, factors, and trends that would indirectly shape an issue. +Text: Industry leaders such as Panasonic are vying for supremacy in the battery production sector. They are investing heavily in research and development and are exploring new technologies to gain a competitive edge. +JSON RESPONSE: +{{"entity_types": [organization, technology, sectors, investment strategies] }} +END OF EXAMPLE 3 +====================================================================== + +====================================================================== +REAL DATA: The following section is the real data. You should use only this real data to prepare your answer. Generate Entity Types only. +Task: {task} +Text: {input_text} +JSON response: +{{"entity_types": [] }} +""" diff --git a/graphrag/prompt_tune/prompt/persona.py b/graphrag/prompt_tune/prompt/persona.py new file mode 100644 index 00000000..58515fd2 --- /dev/null +++ b/graphrag/prompt_tune/prompt/persona.py @@ -0,0 +1,13 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Fine-tuning prompts for persona generation.""" + +GENERATE_PERSONA_PROMPT = """ +You are an intelligent assistant that helps a human to analyze the information in a text document. +Given a specific type of task and sample text, help the user by generating a 3 to 4 sentence description of an expert who could help solve the problem. +Use a format similar to the following: +You are an expert {{role}}. You are skilled at {{relevant skills}}. You are adept at helping people with {{specific task}}. + +task: {sample_task} +persona description:""" diff --git a/graphrag/prompt_tune/template/__init__.py b/graphrag/prompt_tune/template/__init__.py new file mode 100644 index 00000000..e056762f --- /dev/null +++ b/graphrag/prompt_tune/template/__init__.py @@ -0,0 +1,24 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Fine-tuning prompts for entity extraction, entity summarization, and community report summarization.""" + +from .community_report_summarization import COMMUNITY_REPORT_SUMMARIZATION_PROMPT +from .entity_extraction import ( + EXAMPLE_EXTRACTION_TEMPLATE, + GRAPH_EXTRACTION_JSON_PROMPT, + GRAPH_EXTRACTION_PROMPT, + UNTYPED_EXAMPLE_EXTRACTION_TEMPLATE, + UNTYPED_GRAPH_EXTRACTION_PROMPT, +) +from .entity_summarization import ENTITY_SUMMARIZATION_PROMPT + +__all__ = [ + "COMMUNITY_REPORT_SUMMARIZATION_PROMPT", + "ENTITY_SUMMARIZATION_PROMPT", + "EXAMPLE_EXTRACTION_TEMPLATE", + "GRAPH_EXTRACTION_JSON_PROMPT", + "GRAPH_EXTRACTION_PROMPT", + "UNTYPED_EXAMPLE_EXTRACTION_TEMPLATE", + "UNTYPED_GRAPH_EXTRACTION_PROMPT", +] diff --git a/graphrag/prompt_tune/template/community_report_summarization.py b/graphrag/prompt_tune/template/community_report_summarization.py new file mode 100644 index 00000000..5d909fef --- /dev/null +++ b/graphrag/prompt_tune/template/community_report_summarization.py @@ -0,0 +1,96 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Fine-tuning prompts for community report summarization.""" + +COMMUNITY_REPORT_SUMMARIZATION_PROMPT = """ +{persona} + +# Goal +Write a comprehensive assessment report of a community taking on the role of a {role}. The content of this report includes an overview of the community's key entities, their legal compliance, technical capabilities, +reputation, and noteworthy claims. + +# Report Structure +The report should include the following sections: +- TITLE: community's name that represents its key entities - title should be short but specific. When possible, include representative named entities in the title. +- SUMMARY: An executive summary of the community's overall structure, how its entities are related to each other, and significant threats associated with its entities. +- THREAT SEVERITY RATING: a float score between 0-10 that represents the potential global impact to humanity as posed by entities within the community. +- RATING EXPLANATION: Give a single sentence explanation of the threat severity rating. +- DETAILED FINDINGS: A list of 5-10 key insights about the community. Each insight should have a short summary followed by multiple paragraphs of explanatory text grounded according to the grounding rules below. Be comprehensive. + +Return output as a well-formed JSON-formatted string with the following format. Don't use any unnecessary escape sequences. The output should be a single JSON object that can be parsed by json.loads. + {{ + "title": "", + "summary": "", + "rating": , + "rating_explanation": "" + "findings": "[{{"summary":"", "explanation": "", "explanation": " (, ... ()]. If there are more than 10 data records, show the top 10 most relevant records. +Each paragraph should contain multiple sentences of explanation and concrete examples with specific named entities. All paragraphs must have these references at the start and end. Use "NONE" if there are no related roles or records. + +Example paragraph with references added: +This is a paragraph of the output text [records: Entities (1, 2, 3), Claims (2, 5), Relationships (10, 12)] + +# Example Input +----------- +Text: + +Entities + +id,entity,description +5,ABILA CITY PARK,Abila City Park is the location of the POK rally + +Relationships + +id,source,target,description +37,ABILA CITY PARK,POK RALLY,Abila City Park is the location of the POK rally +38,ABILA CITY PARK,POK,POK is holding a rally in Abila City Park +39,ABILA CITY PARK,POKRALLY,The POKRally is taking place at Abila City Park +40,ABILA CITY PARK,CENTRAL BULLETIN,Central Bulletin is reporting on the POK rally taking place in Abila City Park + +Output: +{{ + "title": "Abila City Park and POK Rally", + "summary": "The community revolves around the Abila City Park, which is the location of the POK rally. The park has relationships with POK, POKRALLY, and Central Bulletin, all +of which are associated with the rally event.", + "rating": 5.0, + "rating_explanation": "The impact rating is moderate due to the potential for unrest or conflict during the POK rally.", + "findings": [ + {{ + "summary": "Abila City Park as the central location", + "explanation": "Abila City Park is the central entity in this community, serving as the location for the POK rally. This park is the common link between all other +entities, suggesting its significance in the community. The park's association with the rally could potentially lead to issues such as public disorder or conflict, depending on the +nature of the rally and the reactions it provokes. [records: Entities (5), Relationships (37, 38, 39, 40)]" + }}, + {{ + "summary": "POK's role in the community", + "explanation": "POK is another key entity in this community, being the organizer of the rally at Abila City Park. The nature of POK and its rally could be a potential +source of threat, depending on their objectives and the reactions they provoke. The relationship between POK and the park is crucial in understanding the dynamics of this community. +[records: Relationships (38)]" + }}, + {{ + "summary": "POKRALLY as a significant event", + "explanation": "The POKRALLY is a significant event taking place at Abila City Park. This event is a key factor in the community's dynamics and could be a potential +source of threat, depending on the nature of the rally and the reactions it provokes. The relationship between the rally and the park is crucial in understanding the dynamics of this +community. [records: Relationships (39)]" + }}, + {{ + "summary": "Role of Central Bulletin", + "explanation": "Central Bulletin is reporting on the POK rally taking place in Abila City Park. This suggests that the event has attracted media attention, which could +amplify its impact on the community. The role of Central Bulletin could be significant in shaping public perception of the event and the entities involved. [records: Relationships +(40)]" + }} + ] + +}} + +# Real Data + +Use the following text for your answer. Do not make anything up in your answer. + +Text: +{{input_text}} +Output:""" diff --git a/graphrag/prompt_tune/template/entity_extraction.py b/graphrag/prompt_tune/template/entity_extraction.py new file mode 100644 index 00000000..8916d622 --- /dev/null +++ b/graphrag/prompt_tune/template/entity_extraction.py @@ -0,0 +1,136 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Fine-tuning prompts for entity extraction.""" + +GRAPH_EXTRACTION_PROMPT = """ +-Goal- +Given a text document that is potentially relevant to this activity and a list of entity types, identify all entities of those types from the text and all relationships among the identified entities. + +-Steps- +1. Identify all entities. For each identified entity, extract the following information: +- entity_name: Name of the entity, capitalized +- entity_type: One of the following types: [{entity_types}] +- entity_description: Comprehensive description of the entity's attributes and activities +Format each entity as ("entity"{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}} + +2. From the entities identified in step 1, identify all pairs of (source_entity, target_entity) that are *clearly related* to each other. +For each pair of related entities, extract the following information: +- source_entity: name of the source entity, as identified in step 1 +- target_entity: name of the target entity, as identified in step 1 +- relationship_description: explanation as to why you think the source entity and the target entity are related to each other +- relationship_strength: an integer score between 1 to 10, indicating strength of the relationship between the source entity and target entity + +Format each relationship as ("relationship"{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}) + +3. Return output in English as a single list of all the entities and relationships identified in steps 1 and 2. Use **{{record_delimiter}}** as the list delimiter. + +4. When finished, output {{completion_delimiter}} + +-Examples- +###################### +{examples} + +-Real Data- +###################### +entity_types: [{entity_types}] +text: {{input_text}} +###################### +output:""" + +GRAPH_EXTRACTION_JSON_PROMPT = """ +-Goal- +Given a text document that is potentially relevant to this activity and a list of entity types, identify all entities of those types from the text and all relationships among the identified entities. + +-Steps- +1. Identify all entities. For each identified entity, extract the following information: +- entity_name: Name of the entity, capitalized +- entity_type: One of the following types: [{entity_types}] +- entity_description: Comprehensive description of the entity's attributes and activities +Format each entity output as a JSON entry with the following format: + +{{"name": , "type": , "description": }} + +2. From the entities identified in step 1, identify all pairs of (source_entity, target_entity) that are *clearly related* to each other. +For each pair of related entities, extract the following information: +- source_entity: name of the source entity, as identified in step 1 +- target_entity: name of the target entity, as identified in step 1 +- relationship_description: explanation as to why you think the source entity and the target entity are related to each other +- relationship_strength: an integer score between 1 to 10, indicating strength of the relationship between the source entity and target entity +Format each relationship as a JSON entry with the following format: + +{{"source": , "target": , "relationship": , "relationship_strength": }} + +3. Return output in English as a single list of all JSON entities and relationships identified in steps 1 and 2. + +-Examples- +###################### +{examples} + +-Real Data- +###################### +entity_types: {entity_types} +text: {{input_text}} +###################### +output:""" + +EXAMPLE_EXTRACTION_TEMPLATE = """ +Example {n}: + +entity_types: [{entity_types}] +text: +{input_text} +------------------------ +output: +{output} +############################# + +""" + +UNTYPED_EXAMPLE_EXTRACTION_TEMPLATE = """ +Example {n}: + +text: +{input_text} +------------------------ +output: +{output} +############################# + +""" + + +UNTYPED_GRAPH_EXTRACTION_PROMPT = """ +-Goal- +Given a text document that is potentially relevant to this activity, first identify all entities needed from the text in order to capture the information and ideas in the text. +Next, report all relationships among the identified entities. + +-Steps- +1. Identify all entities. For each identified entity, extract the following information: +- entity_name: Name of the entity, capitalized +- entity_type: Suggest several labels or categories for the entity. The categories should not be specific, but should be as general as possible. +- entity_description: Comprehensive description of the entity's attributes and activities +Format each entity as ("entity"{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}} + +2. From the entities identified in step 1, identify all pairs of (source_entity, target_entity) that are *clearly related* to each other. +For each pair of related entities, extract the following information: +- source_entity: name of the source entity, as identified in step 1 +- target_entity: name of the target entity, as identified in step 1 +- relationship_description: explanation as to why you think the source entity and the target entity are related to each other +- relationship_strength: a numeric score indicating strength of the relationship between the source entity and target entity + Format each relationship as ("relationship"{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}) + +3. Return output in English as a single list of all the entities and relationships identified in steps 1 and 2. Use **{{record_delimiter}}** as the list delimiter. + +4. When finished, output {{completion_delimiter}} + +-Examples- +###################### +{examples} + +-Real Data- +###################### +text: {{input_text}} +###################### +output: +""" diff --git a/graphrag/prompt_tune/template/entity_summarization.py b/graphrag/prompt_tune/template/entity_summarization.py new file mode 100644 index 00000000..be926e19 --- /dev/null +++ b/graphrag/prompt_tune/template/entity_summarization.py @@ -0,0 +1,22 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Fine-tuning prompts for entity summarization.""" + +ENTITY_SUMMARIZATION_PROMPT = """ +{persona} +Using your expertise, you're asked to generate a comprehensive summary of the data provided below. +Given one or two entities, and a list of descriptions, all related to the same entity or group of entities. +Please concatenate all of these into a single, concise description. Make sure to include information collected from all the descriptions. +If the provided descriptions are contradictory, please resolve the contradictions and provide a single, coherent summary. +Make sure it is written in third person, and include the entity names so we the have full context. + +Enrich it as much as you can with relevant information from the nearby text, this is very important. + +If no answer is possible, or the description is empty, only convey information that is provided within the text. +####### +-Data- +Entities: {{entity_name}} +Description List: {{description_list}} +####### +Output:""" diff --git a/graphrag/query/__init__.py b/graphrag/query/__init__.py new file mode 100644 index 00000000..58a557f8 --- /dev/null +++ b/graphrag/query/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""GraphRAG Orchestration Module.""" diff --git a/graphrag/query/__main__.py b/graphrag/query/__main__.py new file mode 100644 index 00000000..03eb1b62 --- /dev/null +++ b/graphrag/query/__main__.py @@ -0,0 +1,91 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The Query Engine package root.""" + +import argparse +from enum import Enum + +from .cli import run_global_search, run_local_search + +INVALID_METHOD_ERROR = "Invalid method" + + +class SearchType(Enum): + """The type of search to run.""" + + LOCAL = "local" + GLOBAL = "global" + + def __str__(self): + """Return the string representation of the enum value.""" + return self.value + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + parser.add_argument( + "--data", + help="The path with the output data from the pipeline", + required=False, + type=str, + ) + + parser.add_argument( + "--root", + help="The data project root.", + required=False, + type=str, + ) + + parser.add_argument( + "--method", + help="The method to run, one of: local or global", + required=True, + type=SearchType, + choices=list(SearchType), + ) + + parser.add_argument( + "--community_level", + help="Community level in the Leiden community hierarchy from which we will load the community reports higher value means we use reports on smaller communities", + type=int, + default=2, + ) + + parser.add_argument( + "--response_type", + help="Free form text describing the response type and format, can be anything, e.g. Multiple Paragraphs, Single Paragraph, Single Sentence, List of 3-7 Points, Single Page, Multi-Page Report", + type=str, + default="Multiple Paragraphs", + ) + + parser.add_argument( + "query", + nargs=1, + help="The query to run", + type=str, + ) + + args = parser.parse_args() + + match args.method: + case SearchType.LOCAL: + run_local_search( + args.data, + args.root, + args.community_level, + args.response_type, + args.query[0], + ) + case SearchType.GLOBAL: + run_global_search( + args.data, + args.root, + args.community_level, + args.response_type, + args.query[0], + ) + case _: + raise ValueError(INVALID_METHOD_ERROR) diff --git a/graphrag/query/cli.py b/graphrag/query/cli.py new file mode 100644 index 00000000..aef7c296 --- /dev/null +++ b/graphrag/query/cli.py @@ -0,0 +1,212 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Command line interface for the query module.""" + +import os +from pathlib import Path +from typing import cast + +import pandas as pd + +from graphrag.config import ( + GraphRagConfig, + create_graphrag_config, +) +from graphrag.index.progress import PrintProgressReporter +from graphrag.query.input.loaders.dfs import ( + store_entity_semantic_embeddings, +) +from graphrag.vector_stores import VectorStoreFactory, VectorStoreType + +from .factories import get_global_search_engine, get_local_search_engine +from .indexer_adapters import ( + read_indexer_covariates, + read_indexer_entities, + read_indexer_relationships, + read_indexer_reports, + read_indexer_text_units, +) + +reporter = PrintProgressReporter("") + + +def __get_embedding_description_store( + vector_store_type: str = VectorStoreType.LanceDB, config_args: dict | None = None +): + """Get the embedding description store.""" + if not config_args: + config_args = {} + + config_args.update({ + "collection_name": config_args.get( + "query_collection_name", + config_args.get("collection_name", "description_embedding"), + ), + }) + + description_embedding_store = VectorStoreFactory.get_vector_store( + vector_store_type=vector_store_type, kwargs=config_args + ) + + description_embedding_store.connect(**config_args) + return description_embedding_store + + +def run_global_search( + data_dir: str | None, + root_dir: str | None, + community_level: int, + response_type: str, + query: str, +): + """Run a global search with the given query.""" + data_dir, root_dir, config = _configure_paths_and_settings(data_dir, root_dir) + data_path = Path(data_dir) + + final_nodes: pd.DataFrame = pd.read_parquet( + data_path / "create_final_nodes.parquet" + ) + final_entities: pd.DataFrame = pd.read_parquet( + data_path / "create_final_entities.parquet" + ) + final_community_reports: pd.DataFrame = pd.read_parquet( + data_path / "create_final_community_reports.parquet" + ) + + reports = read_indexer_reports( + final_community_reports, final_nodes, community_level + ) + entities = read_indexer_entities(final_nodes, final_entities, community_level) + search_engine = get_global_search_engine( + config, + reports=reports, + entities=entities, + response_type=response_type, + ) + + result = search_engine.search(query=query) + + reporter.success(f"Global Search Response: {result.response}") + return result.response + + +def run_local_search( + data_dir: str | None, + root_dir: str | None, + community_level: int, + response_type: str, + query: str, +): + """Run a local search with the given query.""" + data_dir, root_dir, config = _configure_paths_and_settings(data_dir, root_dir) + data_path = Path(data_dir) + + final_nodes = pd.read_parquet(data_path / "create_final_nodes.parquet") + final_community_reports = pd.read_parquet( + data_path / "create_final_community_reports.parquet" + ) + final_text_units = pd.read_parquet(data_path / "create_final_text_units.parquet") + final_relationships = pd.read_parquet( + data_path / "create_final_relationships.parquet" + ) + final_nodes = pd.read_parquet(data_path / "create_final_nodes.parquet") + final_entities = pd.read_parquet(data_path / "create_final_entities.parquet") + final_covariates_path = data_path / "create_final_covariates.parquet" + final_covariates = ( + pd.read_parquet(final_covariates_path) + if final_covariates_path.exists() + else None + ) + + vector_store_args = ( + config.embeddings.vector_store if config.embeddings.vector_store else {} + ) + vector_store_type = vector_store_args.get("type", VectorStoreType.LanceDB) + + description_embedding_store = __get_embedding_description_store( + vector_store_type=vector_store_type, + config_args=vector_store_args, + ) + entities = read_indexer_entities(final_nodes, final_entities, community_level) + store_entity_semantic_embeddings( + entities=entities, vectorstore=description_embedding_store + ) + covariates = ( + read_indexer_covariates(final_covariates) + if final_covariates is not None + else [] + ) + + search_engine = get_local_search_engine( + config, + reports=read_indexer_reports( + final_community_reports, final_nodes, community_level + ), + text_units=read_indexer_text_units(final_text_units), + entities=entities, + relationships=read_indexer_relationships(final_relationships), + covariates={"claims": covariates}, + description_embedding_store=description_embedding_store, + response_type=response_type, + ) + + result = search_engine.search(query=query) + reporter.success(f"Local Search Response: {result.response}") + return result.response + + +def _configure_paths_and_settings( + data_dir: str | None, root_dir: str | None +) -> tuple[str, str | None, GraphRagConfig]: + if data_dir is None and root_dir is None: + msg = "Either data_dir or root_dir must be provided." + raise ValueError(msg) + if data_dir is None: + data_dir = _infer_data_dir(cast(str, root_dir)) + config = _create_graphrag_config(root_dir, data_dir) + return data_dir, root_dir, config + + +def _infer_data_dir(root: str) -> str: + output = Path(root) / "output" + # use the latest data-run folder + if output.exists(): + folders = sorted(output.iterdir(), key=os.path.getmtime, reverse=True) + if len(folders) > 0: + folder = folders[0] + return str((folder / "artifacts").absolute()) + msg = f"Could not infer data directory from root={root}" + raise ValueError(msg) + + +def _create_graphrag_config(root: str | None, data_dir: str | None) -> GraphRagConfig: + """Create a GraphRag configuration.""" + return _read_config_parameters(cast(str, root or data_dir)) + + +def _read_config_parameters(root: str): + _root = Path(root) + settings_yaml = _root / "settings.yaml" + if not settings_yaml.exists(): + settings_yaml = _root / "settings.yml" + settings_json = _root / "settings.json" + + if settings_yaml.exists(): + reporter.info(f"Reading settings from {settings_yaml}") + with settings_yaml.open("r") as file: + import yaml + + data = yaml.safe_load(file) + return create_graphrag_config(data, root) + + if settings_json.exists(): + reporter.info(f"Reading settings from {settings_json}") + with settings_json.open("r") as file: + import json + + data = json.loads(file.read()) + return create_graphrag_config(data, root) + + reporter.info("Reading settings from environment variables") + return create_graphrag_config(root_dir=root) diff --git a/graphrag/query/context_builder/__init__.py b/graphrag/query/context_builder/__init__.py new file mode 100644 index 00000000..7e27364e --- /dev/null +++ b/graphrag/query/context_builder/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Functions to build context for system prompt to generate responses for a user query.""" diff --git a/graphrag/query/context_builder/builders.py b/graphrag/query/context_builder/builders.py new file mode 100644 index 00000000..7a4ba277 --- /dev/null +++ b/graphrag/query/context_builder/builders.py @@ -0,0 +1,35 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Base classes for global and local context builders.""" + +from abc import ABC, abstractmethod + +import pandas as pd + +from graphrag.query.context_builder.conversation_history import ( + ConversationHistory, +) + + +class GlobalContextBuilder(ABC): + """Base class for global-search context builders.""" + + @abstractmethod + def build_context( + self, conversation_history: ConversationHistory | None = None, **kwargs + ) -> tuple[str | list[str], dict[str, pd.DataFrame]]: + """Build the context for the global search mode.""" + + +class LocalContextBuilder(ABC): + """Base class for local-search context builders.""" + + @abstractmethod + def build_context( + self, + query: str, + conversation_history: ConversationHistory | None = None, + **kwargs, + ) -> tuple[str | list[str], dict[str, pd.DataFrame]]: + """Build the context for the local search mode.""" diff --git a/graphrag/query/context_builder/community_context.py b/graphrag/query/context_builder/community_context.py new file mode 100644 index 00000000..dba7f729 --- /dev/null +++ b/graphrag/query/context_builder/community_context.py @@ -0,0 +1,241 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Community Context.""" + +import logging +import random +from typing import Any, cast + +import pandas as pd +import tiktoken + +from graphrag.model import CommunityReport, Entity +from graphrag.query.llm.text_utils import num_tokens + +log = logging.getLogger(__name__) + + +def build_community_context( + community_reports: list[CommunityReport], + entities: list[Entity] | None = None, + token_encoder: tiktoken.Encoding | None = None, + use_community_summary: bool = True, + column_delimiter: str = "|", + shuffle_data: bool = True, + include_community_rank: bool = False, + min_community_rank: int = 0, + community_rank_name: str = "rank", + include_community_weight: bool = True, + community_weight_name: str = "occurrence weight", + normalize_community_weight: bool = True, + max_tokens: int = 8000, + single_batch: bool = True, + context_name: str = "Reports", + random_state: int = 86, +) -> tuple[str | list[str], dict[str, pd.DataFrame]]: + """ + Prepare community report data table as context data for system prompt. + + If entities are provided, the community weight is calculated as the count of text units associated with entities within the community. + + The calculated weight is added as an attribute to the community reports and added to the context data table. + """ + if ( + entities + and len(community_reports) > 0 + and include_community_weight + and ( + community_reports[0].attributes is None + or community_weight_name not in community_reports[0].attributes + ) + ): + log.info("Computing community weights...") + community_reports = _compute_community_weights( + community_reports=community_reports, + entities=entities, + weight_attribute=community_weight_name, + normalize=normalize_community_weight, + ) + + selected_reports = [ + report + for report in community_reports + if report.rank and report.rank >= min_community_rank + ] + if selected_reports is None or len(selected_reports) == 0: + return ([], {}) + + if shuffle_data: + random.seed(random_state) + random.shuffle(selected_reports) + + # add context header + current_context_text = f"-----{context_name}-----" + "\n" + + # add header + header = ["id", "title"] + attribute_cols = ( + list(selected_reports[0].attributes.keys()) + if selected_reports[0].attributes + else [] + ) + attribute_cols = [col for col in attribute_cols if col not in header] + if not include_community_weight: + attribute_cols = [col for col in attribute_cols if col != community_weight_name] + header.extend(attribute_cols) + header.append("summary" if use_community_summary else "content") + if include_community_rank: + header.append(community_rank_name) + + current_context_text += column_delimiter.join(header) + "\n" + current_tokens = num_tokens(current_context_text, token_encoder) + current_context_records = [header] + all_context_text = [] + all_context_records = [] + + for report in selected_reports: + new_context = [ + report.short_id, + report.title, + *[ + str(report.attributes.get(field, "")) if report.attributes else "" + for field in attribute_cols + ], + ] + new_context.append( + report.summary if use_community_summary else report.full_content + ) + if include_community_rank: + new_context.append(str(report.rank)) + new_context_text = column_delimiter.join(new_context) + "\n" + + new_tokens = num_tokens(new_context_text, token_encoder) + if current_tokens + new_tokens > max_tokens: + # convert the current context records to pandas dataframe and sort by weight and rank if exist + if len(current_context_records) > 1: + record_df = _convert_report_context_to_df( + context_records=current_context_records[1:], + header=current_context_records[0], + weight_column=community_weight_name + if entities and include_community_weight + else None, + rank_column=community_rank_name if include_community_rank else None, + ) + + else: + record_df = pd.DataFrame() + current_context_text = record_df.to_csv(index=False, sep=column_delimiter) + + if single_batch: + return current_context_text, {context_name.lower(): record_df} + + all_context_text.append(current_context_text) + all_context_records.append(record_df) + + # start a new batch + current_context_text = ( + f"-----{context_name}-----" + + "\n" + + column_delimiter.join(header) + + "\n" + ) + current_tokens = num_tokens(current_context_text, token_encoder) + current_context_records = [header] + else: + current_context_text += new_context_text + current_tokens += new_tokens + current_context_records.append(new_context) + + # add the last batch if it has not been added + if current_context_text not in all_context_text: + if len(current_context_records) > 1: + record_df = _convert_report_context_to_df( + context_records=current_context_records[1:], + header=current_context_records[0], + weight_column=community_weight_name + if entities and include_community_weight + else None, + rank_column=community_rank_name if include_community_rank else None, + ) + else: + record_df = pd.DataFrame() + all_context_records.append(record_df) + current_context_text = record_df.to_csv(index=False, sep=column_delimiter) + all_context_text.append(current_context_text) + + return all_context_text, { + context_name.lower(): pd.concat(all_context_records, ignore_index=True) + } + + +def _compute_community_weights( + community_reports: list[CommunityReport], + entities: list[Entity], + weight_attribute: str = "occurrence", + normalize: bool = True, +) -> list[CommunityReport]: + """Calculate a community's weight as count of text units associated with entities within the community.""" + community_text_units = {} + for entity in entities: + if entity.community_ids: + for community_id in entity.community_ids: + if community_id not in community_text_units: + community_text_units[community_id] = [] + community_text_units[community_id].extend(entity.text_unit_ids) + for report in community_reports: + if not report.attributes: + report.attributes = {} + report.attributes[weight_attribute] = len( + set(community_text_units.get(report.community_id, [])) + ) + if normalize: + # normalize by max weight + all_weights = [ + report.attributes[weight_attribute] + for report in community_reports + if report.attributes + ] + max_weight = max(all_weights) + for report in community_reports: + if report.attributes: + report.attributes[weight_attribute] = ( + report.attributes[weight_attribute] / max_weight + ) + return community_reports + + +def _rank_report_context( + report_df: pd.DataFrame, + weight_column: str | None = "occurrence weight", + rank_column: str | None = "rank", +) -> pd.DataFrame: + """Sort report context by community weight and rank if exist.""" + rank_attributes = [] + if weight_column: + rank_attributes.append(weight_column) + report_df[weight_column] = report_df[weight_column].astype(float) + if rank_column: + rank_attributes.append(rank_column) + report_df[rank_column] = report_df[rank_column].astype(float) + if len(rank_attributes) > 0: + report_df.sort_values(by=rank_attributes, ascending=False, inplace=True) + return report_df + + +def _convert_report_context_to_df( + context_records: list[list[str]], + header: list[str], + weight_column: str | None = None, + rank_column: str | None = None, +) -> pd.DataFrame: + """Convert report context records to pandas dataframe and sort by weight and rank if exist.""" + record_df = pd.DataFrame( + context_records, + columns=cast(Any, header), + ) + return _rank_report_context( + report_df=record_df, + weight_column=weight_column, + rank_column=rank_column, + ) diff --git a/graphrag/query/context_builder/conversation_history.py b/graphrag/query/context_builder/conversation_history.py new file mode 100644 index 00000000..33f516db --- /dev/null +++ b/graphrag/query/context_builder/conversation_history.py @@ -0,0 +1,212 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Classes for storing and managing conversation history.""" + +from dataclasses import dataclass +from enum import Enum + +import pandas as pd +import tiktoken + +from graphrag.query.llm.text_utils import num_tokens + +""" +Enum for conversation roles +""" + + +class ConversationRole(str, Enum): + """Enum for conversation roles.""" + + SYSTEM = "system" + USER = "user" + ASSISTANT = "assistant" + + @staticmethod + def from_string(value: str) -> "ConversationRole": + """Convert string to ConversationRole.""" + if value == "system": + return ConversationRole.SYSTEM + if value == "user": + return ConversationRole.USER + if value == "assistant": + return ConversationRole.ASSISTANT + + msg = f"Invalid Role: {value}" + raise ValueError(msg) + + def __str__(self) -> str: + """Return string representation of the enum value.""" + return self.value + + +""" +Data class for storing a single conversation turn +""" + + +@dataclass +class ConversationTurn: + """Data class for storing a single conversation turn.""" + + role: ConversationRole + content: str + + def __str__(self) -> str: + """Return string representation of the conversation turn.""" + return f"{self.role}: {self.content}" + + +@dataclass +class QATurn: + """ + Data class for storing a QA turn. + + A QA turn contains a user question and one more multiple assistant answers. + """ + + user_query: ConversationTurn + assistant_answers: list[ConversationTurn] | None = None + + def get_answer_text(self) -> str | None: + """Get the text of the assistant answers.""" + return ( + "\n".join([answer.content for answer in self.assistant_answers]) + if self.assistant_answers + else None + ) + + def __str__(self) -> str: + """Return string representation of the QA turn.""" + answers = self.get_answer_text() + return ( + f"Question: {self.user_query.content}\nAnswer: {answers}" + if answers + else f"Question: {self.user_query.content}" + ) + + +class ConversationHistory: + """Class for storing a conversation history.""" + + turns: list[ConversationTurn] + + def __init__(self): + self.turns = [] + + @classmethod + def from_list( + cls, conversation_turns: list[dict[str, str]] + ) -> "ConversationHistory": + """ + Create a conversation history from a list of conversation turns. + + Each turn is a dictionary in the form of {"role": "", "content": ""} + """ + history = cls() + for turn in conversation_turns: + history.turns.append( + ConversationTurn( + role=ConversationRole.from_string( + turn.get("role", ConversationRole.USER) + ), + content=turn.get("content", ""), + ) + ) + return history + + def add_turn(self, role: ConversationRole, content: str): + """Add a new turn to the conversation history.""" + self.turns.append(ConversationTurn(role=role, content=content)) + + def to_qa_turns(self) -> list[QATurn]: + """Convert conversation history to a list of QA turns.""" + qa_turns = list[QATurn]() + current_qa_turn = None + for turn in self.turns: + if turn.role == ConversationRole.USER: + if current_qa_turn: + qa_turns.append(current_qa_turn) + current_qa_turn = QATurn(user_query=turn, assistant_answers=[]) + else: + if current_qa_turn: + current_qa_turn.assistant_answers.append(turn) # type: ignore + if current_qa_turn: + qa_turns.append(current_qa_turn) + return qa_turns + + def get_user_turns(self, max_user_turns: int | None = 1) -> list[str]: + """Get the last user turns in the conversation history.""" + user_turns = [] + for turn in self.turns[::-1]: + if turn.role == ConversationRole.USER: + user_turns.append(turn.content) + if max_user_turns and len(user_turns) >= max_user_turns: + break + return user_turns + + def build_context( + self, + token_encoder: tiktoken.Encoding | None = None, + include_user_turns_only: bool = True, + max_qa_turns: int | None = 5, + max_tokens: int = 8000, + recency_bias: bool = True, + column_delimiter: str = "|", + context_name: str = "Conversation History", + ) -> tuple[str, dict[str, pd.DataFrame]]: + """ + Prepare conversation history as context data for system prompt. + + Parameters + ---------- + user_queries_only: If True, only user queries (not assistant responses) will be included in the context, default is True. + max_qa_turns: Maximum number of QA turns to include in the context, default is 1. + recency_bias: If True, reverse the order of the conversation history to ensure last QA got prioritized. + column_delimiter: Delimiter to use for separating columns in the context data, default is "|". + context_name: Name of the context, default is "Conversation History". + + """ + qa_turns = self.to_qa_turns() + if include_user_turns_only: + qa_turns = [ + QATurn(user_query=qa_turn.user_query, assistant_answers=None) + for qa_turn in qa_turns + ] + if recency_bias: + qa_turns = qa_turns[::-1] + if max_qa_turns and len(qa_turns) > max_qa_turns: + qa_turns = qa_turns[:max_qa_turns] + + # build context for qa turns + # add context header + if len(qa_turns) == 0 or not qa_turns: + return ("", {context_name: pd.DataFrame()}) + + # add table header + header = f"-----{context_name}-----" + "\n" + + turn_list = [] + current_context_df = pd.DataFrame() + for turn in qa_turns: + turn_list.append({ + "turn": ConversationRole.USER.__str__(), + "content": turn.user_query.content, + }) + if turn.assistant_answers: + turn_list.append({ + "turn": ConversationRole.ASSISTANT.__str__(), + "content": turn.get_answer_text(), + }) + + context_df = pd.DataFrame(turn_list) + context_text = header + context_df.to_csv(sep=column_delimiter, index=False) + if num_tokens(context_text, token_encoder) > max_tokens: + break + + current_context_df = context_df + context_text = header + current_context_df.to_csv( + sep=column_delimiter, index=False + ) + return (context_text, {context_name.lower(): current_context_df}) diff --git a/graphrag/query/context_builder/entity_extraction.py b/graphrag/query/context_builder/entity_extraction.py new file mode 100644 index 00000000..82a0699c --- /dev/null +++ b/graphrag/query/context_builder/entity_extraction.py @@ -0,0 +1,159 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Orchestration Context Builders.""" + +from enum import Enum + +from graphrag.model import Entity, Relationship +from graphrag.query.input.retrieval.entities import ( + get_entity_by_key, + get_entity_by_name, +) +from graphrag.query.llm.base import BaseTextEmbedding +from graphrag.vector_stores import BaseVectorStore + + +class EntityVectorStoreKey(str, Enum): + """Keys used as ids in the entity embedding vectorstores.""" + + ID = "id" + TITLE = "title" + + @staticmethod + def from_string(value: str) -> "EntityVectorStoreKey": + """Convert string to EntityVectorStoreKey.""" + if value == "id": + return EntityVectorStoreKey.ID + if value == "title": + return EntityVectorStoreKey.TITLE + + msg = f"Invalid EntityVectorStoreKey: {value}" + raise ValueError(msg) + + +def map_query_to_entities( + query: str, + text_embedding_vectorstore: BaseVectorStore, + text_embedder: BaseTextEmbedding, + all_entities: list[Entity], + embedding_vectorstore_key: str = EntityVectorStoreKey.ID, + include_entity_names: list[str] | None = None, + exclude_entity_names: list[str] | None = None, + k: int = 10, + oversample_scaler: int = 2, +) -> list[Entity]: + """Extract entities that match a given query using semantic similarity of text embeddings of query and entity descriptions.""" + if include_entity_names is None: + include_entity_names = [] + if exclude_entity_names is None: + exclude_entity_names = [] + matched_entities = [] + if query != "": + # get entities with highest semantic similarity to query + # oversample to account for excluded entities + search_results = text_embedding_vectorstore.similarity_search_by_text( + text=query, + text_embedder=lambda t: text_embedder.embed(t), + k=k * oversample_scaler, + ) + for result in search_results: + matched = get_entity_by_key( + entities=all_entities, + key=embedding_vectorstore_key, + value=result.document.id, + ) + if matched: + matched_entities.append(matched) + else: + all_entities.sort(key=lambda x: x.rank if x.rank else 0, reverse=True) + matched_entities = all_entities[:k] + + # filter out excluded entities + if exclude_entity_names: + matched_entities = [ + entity + for entity in matched_entities + if entity.title not in exclude_entity_names + ] + + # add entities in the include_entity list + included_entities = [] + for entity_name in include_entity_names: + included_entities.extend(get_entity_by_name(all_entities, entity_name)) + return included_entities + matched_entities + + +def find_nearest_neighbors_by_graph_embeddings( + entity_id: str, + graph_embedding_vectorstore: BaseVectorStore, + all_entities: list[Entity], + exclude_entity_names: list[str] | None = None, + embedding_vectorstore_key: str = EntityVectorStoreKey.ID, + k: int = 10, + oversample_scaler: int = 2, +) -> list[Entity]: + """Retrieve related entities by graph embeddings.""" + if exclude_entity_names is None: + exclude_entity_names = [] + # find nearest neighbors of this entity using graph embedding + query_entity = get_entity_by_key( + entities=all_entities, key=embedding_vectorstore_key, value=entity_id + ) + query_embedding = query_entity.graph_embedding if query_entity else None + + # oversample to account for excluded entities + if query_embedding: + matched_entities = [] + search_results = graph_embedding_vectorstore.similarity_search_by_vector( + query_embedding=query_embedding, k=k * oversample_scaler + ) + for result in search_results: + matched = get_entity_by_key( + entities=all_entities, + key=embedding_vectorstore_key, + value=result.document.id, + ) + if matched: + matched_entities.append(matched) + + # filter out excluded entities + if exclude_entity_names: + matched_entities = [ + entity + for entity in matched_entities + if entity.title not in exclude_entity_names + ] + matched_entities.sort(key=lambda x: x.rank, reverse=True) + return matched_entities[:k] + + return [] + + +def find_nearest_neighbors_by_entity_rank( + entity_name: str, + all_entities: list[Entity], + all_relationships: list[Relationship], + exclude_entity_names: list[str] | None = None, + k: int | None = 10, +) -> list[Entity]: + """Retrieve entities that have direct connections with the target entity, sorted by entity rank.""" + if exclude_entity_names is None: + exclude_entity_names = [] + entity_relationships = [ + rel + for rel in all_relationships + if rel.source == entity_name or rel.target == entity_name + ] + source_entity_names = {rel.source for rel in entity_relationships} + target_entity_names = {rel.target for rel in entity_relationships} + related_entity_names = (source_entity_names.union(target_entity_names)).difference( + set(exclude_entity_names) + ) + top_relations = [ + entity for entity in all_entities if entity.title in related_entity_names + ] + top_relations.sort(key=lambda x: x.rank if x.rank else 0, reverse=True) + if k: + return top_relations[:k] + return top_relations diff --git a/graphrag/query/context_builder/local_context.py b/graphrag/query/context_builder/local_context.py new file mode 100644 index 00000000..c2f7527e --- /dev/null +++ b/graphrag/query/context_builder/local_context.py @@ -0,0 +1,346 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Local Context Builder.""" + +from collections import defaultdict +from typing import Any, cast + +import pandas as pd +import tiktoken + +from graphrag.model import Covariate, Entity, Relationship +from graphrag.query.input.retrieval.covariates import ( + get_candidate_covariates, + to_covariate_dataframe, +) +from graphrag.query.input.retrieval.entities import to_entity_dataframe +from graphrag.query.input.retrieval.relationships import ( + get_candidate_relationships, + get_entities_from_relationships, + get_in_network_relationships, + get_out_network_relationships, + to_relationship_dataframe, +) +from graphrag.query.llm.text_utils import num_tokens + + +def build_entity_context( + selected_entities: list[Entity], + token_encoder: tiktoken.Encoding | None = None, + max_tokens: int = 8000, + include_entity_rank: bool = True, + rank_description: str = "number of relationships", + column_delimiter: str = "|", + context_name="Entities", +) -> tuple[str, pd.DataFrame]: + """Prepare entity data table as context data for system prompt.""" + if len(selected_entities) == 0: + return "", pd.DataFrame() + + # add headers + current_context_text = f"-----{context_name}-----" + "\n" + header = ["id", "entity", "description"] + if include_entity_rank: + header.append(rank_description) + attribute_cols = ( + list(selected_entities[0].attributes.keys()) + if selected_entities[0].attributes + else [] + ) + header.extend(attribute_cols) + current_context_text += column_delimiter.join(header) + "\n" + current_tokens = num_tokens(current_context_text, token_encoder) + + all_context_records = [header] + for entity in selected_entities: + new_context = [ + entity.short_id if entity.short_id else "", + entity.title, + entity.description if entity.description else "", + ] + if include_entity_rank: + new_context.append(str(entity.rank)) + for field in attribute_cols: + field_value = ( + str(entity.attributes.get(field)) + if entity.attributes and entity.attributes.get(field) + else "" + ) + new_context.append(field_value) + new_context_text = column_delimiter.join(new_context) + "\n" + new_tokens = num_tokens(new_context_text, token_encoder) + if current_tokens + new_tokens > max_tokens: + break + current_context_text += new_context_text + all_context_records.append(new_context) + current_tokens += new_tokens + + if len(all_context_records) > 1: + record_df = pd.DataFrame( + all_context_records[1:], columns=cast(Any, all_context_records[0]) + ) + else: + record_df = pd.DataFrame() + + return current_context_text, record_df + + +def build_covariates_context( + selected_entities: list[Entity], + covariates: list[Covariate], + token_encoder: tiktoken.Encoding | None = None, + max_tokens: int = 8000, + column_delimiter: str = "|", + context_name: str = "Covariates", +) -> tuple[str, pd.DataFrame]: + """Prepare covariate data tables as context data for system prompt.""" + # create an empty list of covariates + if len(selected_entities) == 0 or len(covariates) == 0: + return "", pd.DataFrame() + + selected_covariates = list[Covariate]() + record_df = pd.DataFrame() + + # add context header + current_context_text = f"-----{context_name}-----" + "\n" + + # add header + header = ["id", "entity"] + attributes = covariates[0].attributes or {} if len(covariates) > 0 else {} + attribute_cols = list(attributes.keys()) if len(covariates) > 0 else [] + header.extend(attribute_cols) + current_context_text += column_delimiter.join(header) + "\n" + current_tokens = num_tokens(current_context_text, token_encoder) + + all_context_records = [header] + for entity in selected_entities: + selected_covariates.extend([ + cov for cov in covariates if cov.subject_id == entity.title + ]) + + for covariate in selected_covariates: + new_context = [ + covariate.short_id if covariate.short_id else "", + covariate.subject_id, + ] + for field in attribute_cols: + field_value = ( + str(covariate.attributes.get(field)) + if covariate.attributes and covariate.attributes.get(field) + else "" + ) + new_context.append(field_value) + + new_context_text = column_delimiter.join(new_context) + "\n" + new_tokens = num_tokens(new_context_text, token_encoder) + if current_tokens + new_tokens > max_tokens: + break + current_context_text += new_context_text + all_context_records.append(new_context) + current_tokens += new_tokens + + if len(all_context_records) > 1: + record_df = pd.DataFrame( + all_context_records[1:], columns=cast(Any, all_context_records[0]) + ) + else: + record_df = pd.DataFrame() + + return current_context_text, record_df + + +def build_relationship_context( + selected_entities: list[Entity], + relationships: list[Relationship], + token_encoder: tiktoken.Encoding | None = None, + include_relationship_weight: bool = False, + max_tokens: int = 8000, + top_k_relationships: int = 10, + relationship_ranking_attribute: str = "rank", + column_delimiter: str = "|", + context_name: str = "Relationships", +) -> tuple[str, pd.DataFrame]: + """Prepare relationship data tables as context data for system prompt.""" + selected_relationships = _filter_relationships( + selected_entities=selected_entities, + relationships=relationships, + top_k_relationships=top_k_relationships, + relationship_ranking_attribute=relationship_ranking_attribute, + ) + + if len(selected_entities) == 0 or len(selected_relationships) == 0: + return "", pd.DataFrame() + + # add headers + current_context_text = f"-----{context_name}-----" + "\n" + header = ["id", "source", "target", "description"] + if include_relationship_weight: + header.append("weight") + attribute_cols = ( + list(selected_relationships[0].attributes.keys()) + if selected_relationships[0].attributes + else [] + ) + attribute_cols = [col for col in attribute_cols if col not in header] + header.extend(attribute_cols) + + current_context_text += column_delimiter.join(header) + "\n" + current_tokens = num_tokens(current_context_text, token_encoder) + + all_context_records = [header] + for rel in selected_relationships: + new_context = [ + rel.short_id if rel.short_id else "", + rel.source, + rel.target, + rel.description if rel.description else "", + ] + if include_relationship_weight: + new_context.append(str(rel.weight if rel.weight else "")) + for field in attribute_cols: + field_value = ( + str(rel.attributes.get(field)) + if rel.attributes and rel.attributes.get(field) + else "" + ) + new_context.append(field_value) + new_context_text = column_delimiter.join(new_context) + "\n" + new_tokens = num_tokens(new_context_text, token_encoder) + if current_tokens + new_tokens > max_tokens: + break + current_context_text += new_context_text + all_context_records.append(new_context) + current_tokens += new_tokens + + if len(all_context_records) > 1: + record_df = pd.DataFrame( + all_context_records[1:], columns=cast(Any, all_context_records[0]) + ) + else: + record_df = pd.DataFrame() + + return current_context_text, record_df + + +def _filter_relationships( + selected_entities: list[Entity], + relationships: list[Relationship], + top_k_relationships: int = 10, + relationship_ranking_attribute: str = "rank", +) -> list[Relationship]: + """Filter and sort relationships based on a set of selected entities and a ranking attribute.""" + # First priority: in-network relationships (i.e. relationships between selected entities) + in_network_relationships = get_in_network_relationships( + selected_entities=selected_entities, + relationships=relationships, + ranking_attribute=relationship_ranking_attribute, + ) + + # Second priority - out-of-network relationships + # (i.e. relationships between selected entities and other entities that are not within the selected entities) + out_network_relationships = get_out_network_relationships( + selected_entities=selected_entities, + relationships=relationships, + ranking_attribute=relationship_ranking_attribute, + ) + if len(out_network_relationships) <= 1: + return in_network_relationships + out_network_relationships + + # within out-of-network relationships, prioritize mutual relationships + # (i.e. relationships with out-network entities that are shared with multiple selected entities) + selected_entity_names = [entity.title for entity in selected_entities] + out_network_source_names = [ + relationship.source + for relationship in out_network_relationships + if relationship.source not in selected_entity_names + ] + out_network_target_names = [ + relationship.target + for relationship in out_network_relationships + if relationship.target not in selected_entity_names + ] + out_network_entity_names = list( + set(out_network_source_names + out_network_target_names) + ) + out_network_entity_links = defaultdict(int) + for entity_name in out_network_entity_names: + targets = [ + relationship.target + for relationship in out_network_relationships + if relationship.source == entity_name + ] + sources = [ + relationship.source + for relationship in out_network_relationships + if relationship.target == entity_name + ] + out_network_entity_links[entity_name] = len(set(targets + sources)) + + # sort out-network relationships by number of links and rank_attributes + for rel in out_network_relationships: + if rel.attributes is None: + rel.attributes = {} + rel.attributes["links"] = ( + out_network_entity_links[rel.source] + if rel.source in out_network_entity_links + else out_network_entity_links[rel.target] + ) + + # sort by attributes[links] first, then by ranking_attribute + if relationship_ranking_attribute == "weight": + out_network_relationships.sort( + key=lambda x: (x.attributes["links"], x.weight), # type: ignore + reverse=True, # type: ignore + ) + else: + out_network_relationships.sort( + key=lambda x: ( + x.attributes["links"], # type: ignore + x.attributes[relationship_ranking_attribute], # type: ignore + ), # type: ignore + reverse=True, + ) + + relationship_budget = top_k_relationships * len(selected_entities) + return in_network_relationships + out_network_relationships[:relationship_budget] + + +def get_candidate_context( + selected_entities: list[Entity], + entities: list[Entity], + relationships: list[Relationship], + covariates: dict[str, list[Covariate]], + include_entity_rank: bool = True, + entity_rank_description: str = "number of relationships", + include_relationship_weight: bool = False, +) -> dict[str, pd.DataFrame]: + """Prepare entity, relationship, and covariate data tables as context data for system prompt.""" + candidate_context = {} + candidate_relationships = get_candidate_relationships( + selected_entities=selected_entities, + relationships=relationships, + ) + candidate_context["relationships"] = to_relationship_dataframe( + relationships=candidate_relationships, + include_relationship_weight=include_relationship_weight, + ) + candidate_entities = get_entities_from_relationships( + relationships=candidate_relationships, entities=entities + ) + candidate_context["entities"] = to_entity_dataframe( + entities=candidate_entities, + include_entity_rank=include_entity_rank, + rank_description=entity_rank_description, + ) + + for covariate in covariates: + candidate_covariates = get_candidate_covariates( + selected_entities=selected_entities, + covariates=covariates[covariate], + ) + candidate_context[covariate.lower()] = to_covariate_dataframe( + candidate_covariates + ) + + return candidate_context diff --git a/graphrag/query/context_builder/source_context.py b/graphrag/query/context_builder/source_context.py new file mode 100644 index 00000000..99b7791c --- /dev/null +++ b/graphrag/query/context_builder/source_context.py @@ -0,0 +1,110 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Context Build utility methods.""" + +import random +from typing import Any, cast + +import pandas as pd +import tiktoken + +from graphrag.model import Entity, Relationship, TextUnit +from graphrag.query.llm.text_utils import num_tokens + +""" +Contain util functions to build text unit context for the search's system prompt +""" + + +def build_text_unit_context( + text_units: list[TextUnit], + token_encoder: tiktoken.Encoding | None = None, + column_delimiter: str = "|", + shuffle_data: bool = True, + max_tokens: int = 8000, + context_name: str = "Sources", + random_state: int = 86, +) -> tuple[str, dict[str, pd.DataFrame]]: + """Prepare text-unit data table as context data for system prompt.""" + if text_units is None or len(text_units) == 0: + return ("", {}) + + if shuffle_data: + random.seed(random_state) + random.shuffle(text_units) + + # add context header + current_context_text = f"-----{context_name}-----" + "\n" + + # add header + header = ["id", "text"] + attribute_cols = ( + list(text_units[0].attributes.keys()) if text_units[0].attributes else [] + ) + attribute_cols = [col for col in attribute_cols if col not in header] + header.extend(attribute_cols) + + current_context_text += column_delimiter.join(header) + "\n" + current_tokens = num_tokens(current_context_text, token_encoder) + all_context_records = [header] + + for unit in text_units: + new_context = [ + unit.short_id, + unit.text, + *[ + str(unit.attributes.get(field, "")) if unit.attributes else "" + for field in attribute_cols + ], + ] + new_context_text = column_delimiter.join(new_context) + "\n" + new_tokens = num_tokens(new_context_text, token_encoder) + + if current_tokens + new_tokens > max_tokens: + break + + current_context_text += new_context_text + all_context_records.append(new_context) + current_tokens += new_tokens + + if len(all_context_records) > 1: + record_df = pd.DataFrame( + all_context_records[1:], columns=cast(Any, all_context_records[0]) + ) + else: + record_df = pd.DataFrame() + return current_context_text, {context_name.lower(): record_df} + + +def count_relationships( + text_unit: TextUnit, entity: Entity, relationships: dict[str, Relationship] +) -> int: + """Count the number of relationships of the selected entity that are associated with the text unit.""" + matching_relationships = list[Relationship]() + if text_unit.relationship_ids is None: + entity_relationships = [ + rel + for rel in relationships.values() + if rel.source == entity.title or rel.target == entity.title + ] + entity_relationships = [ + rel for rel in entity_relationships if rel.text_unit_ids + ] + matching_relationships = [ + rel + for rel in entity_relationships + if text_unit.id in rel.text_unit_ids # type: ignore + ] # type: ignore + else: + text_unit_relationships = [ + relationships[rel_id] + for rel_id in text_unit.relationship_ids + if rel_id in relationships + ] + matching_relationships = [ + rel + for rel in text_unit_relationships + if rel.source == entity.title or rel.target == entity.title + ] + return len(matching_relationships) diff --git a/graphrag/query/factories.py b/graphrag/query/factories.py new file mode 100644 index 00000000..d7b7677d --- /dev/null +++ b/graphrag/query/factories.py @@ -0,0 +1,190 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Query Factory methods to support CLI.""" + +import tiktoken +from azure.identity import DefaultAzureCredential, get_bearer_token_provider + +from graphrag.config import ( + GraphRagConfig, + LLMType, +) +from graphrag.model import ( + CommunityReport, + Covariate, + Entity, + Relationship, + TextUnit, +) +from graphrag.query.context_builder.entity_extraction import EntityVectorStoreKey +from graphrag.query.llm.oai.chat_openai import ChatOpenAI +from graphrag.query.llm.oai.embedding import OpenAIEmbedding +from graphrag.query.llm.oai.typing import OpenaiApiType +from graphrag.query.structured_search.global_search.community_context import ( + GlobalCommunityContext, +) +from graphrag.query.structured_search.global_search.search import GlobalSearch +from graphrag.query.structured_search.local_search.mixed_context import ( + LocalSearchMixedContext, +) +from graphrag.query.structured_search.local_search.search import LocalSearch +from graphrag.vector_stores import BaseVectorStore + + +def get_llm(config: GraphRagConfig) -> ChatOpenAI: + """Get the LLM client.""" + is_azure_client = ( + config.llm.type == LLMType.AzureOpenAIChat + or config.llm.type == LLMType.AzureOpenAI + ) + debug_llm_key = config.llm.api_key or "" + llm_debug_info = { + **config.llm.model_dump(), + "api_key": f"REDACTED,len={len(debug_llm_key)}", + } + if config.llm.cognitive_services_endpoint is None: + cognitive_services_endpoint = "https://cognitiveservices.azure.com/.default" + else: + cognitive_services_endpoint = config.llm.cognitive_services_endpoint + print(f"creating llm client with {llm_debug_info}") # noqa T201 + return ChatOpenAI( + api_key=config.llm.api_key, + azure_ad_token_provider=get_bearer_token_provider( + DefaultAzureCredential(), cognitive_services_endpoint + ) + if is_azure_client and not config.llm.api_key + else None, + api_base=config.llm.api_base, + model=config.llm.model, + api_type=OpenaiApiType.AzureOpenAI if is_azure_client else OpenaiApiType.OpenAI, + deployment_name=config.llm.deployment_name, + api_version=config.llm.api_version, + max_retries=config.llm.max_retries, + ) + + +def get_text_embedder(config: GraphRagConfig) -> OpenAIEmbedding: + """Get the LLM client for embeddings.""" + is_azure_client = config.embeddings.llm.type == LLMType.AzureOpenAIEmbedding + debug_embedding_api_key = config.embeddings.llm.api_key or "" + llm_debug_info = { + **config.embeddings.llm.model_dump(), + "api_key": f"REDACTED,len={len(debug_embedding_api_key)}", + } + if config.embeddings.llm.cognitive_services_endpoint is None: + cognitive_services_endpoint = "https://cognitiveservices.azure.com/.default" + else: + cognitive_services_endpoint = config.embeddings.llm.cognitive_services_endpoint + print(f"creating embedding llm client with {llm_debug_info}") # noqa T201 + return OpenAIEmbedding( + api_key=config.embeddings.llm.api_key, + azure_ad_token_provider=get_bearer_token_provider( + DefaultAzureCredential(), cognitive_services_endpoint + ) + if is_azure_client and not config.embeddings.llm.api_key + else None, + api_base=config.embeddings.llm.api_base, + api_type=OpenaiApiType.AzureOpenAI if is_azure_client else OpenaiApiType.OpenAI, + model=config.embeddings.llm.model, + deployment_name=config.embeddings.llm.deployment_name, + api_version=config.embeddings.llm.api_version, + max_retries=config.embeddings.llm.max_retries, + ) + + +def get_local_search_engine( + config: GraphRagConfig, + reports: list[CommunityReport], + text_units: list[TextUnit], + entities: list[Entity], + relationships: list[Relationship], + covariates: dict[str, list[Covariate]], + response_type: str, + description_embedding_store: BaseVectorStore, +) -> LocalSearch: + """Create a local search engine based on data + configuration.""" + llm = get_llm(config) + text_embedder = get_text_embedder(config) + token_encoder = tiktoken.get_encoding(config.encoding_model) + + ls_config = config.local_search + + return LocalSearch( + llm=llm, + context_builder=LocalSearchMixedContext( + community_reports=reports, + text_units=text_units, + entities=entities, + relationships=relationships, + covariates=covariates, + entity_text_embeddings=description_embedding_store, + embedding_vectorstore_key=EntityVectorStoreKey.ID, # if the vectorstore uses entity title as ids, set this to EntityVectorStoreKey.TITLE + text_embedder=text_embedder, + token_encoder=token_encoder, + ), + token_encoder=token_encoder, + llm_params={ + "max_tokens": ls_config.llm_max_tokens, # change this based on the token limit you have on your model (if you are using a model with 8k limit, a good setting could be 1000=1500) + "temperature": 0.0, + }, + context_builder_params={ + "text_unit_prop": ls_config.text_unit_prop, + "community_prop": ls_config.community_prop, + "conversation_history_max_turns": ls_config.conversation_history_max_turns, + "conversation_history_user_turns_only": True, + "top_k_mapped_entities": ls_config.top_k_entities, + "top_k_relationships": ls_config.top_k_relationships, + "include_entity_rank": True, + "include_relationship_weight": True, + "include_community_rank": False, + "return_candidate_context": False, + "embedding_vectorstore_key": EntityVectorStoreKey.ID, # set this to EntityVectorStoreKey.TITLE if the vectorstore uses entity title as ids + "max_tokens": ls_config.max_tokens, # change this based on the token limit you have on your model (if you are using a model with 8k limit, a good setting could be 5000) + }, + response_type=response_type, + ) + + +def get_global_search_engine( + config: GraphRagConfig, + reports: list[CommunityReport], + entities: list[Entity], + response_type: str, +): + """Create a global search engine based on data + configuration.""" + token_encoder = tiktoken.get_encoding(config.encoding_model) + gs_config = config.global_search + + return GlobalSearch( + llm=get_llm(config), + context_builder=GlobalCommunityContext( + community_reports=reports, entities=entities, token_encoder=token_encoder + ), + token_encoder=token_encoder, + max_data_tokens=gs_config.data_max_tokens, + map_llm_params={ + "max_tokens": gs_config.map_max_tokens, + "temperature": 0.0, + }, + reduce_llm_params={ + "max_tokens": gs_config.reduce_max_tokens, + "temperature": 0.0, + }, + allow_general_knowledge=False, + json_mode=False, + context_builder_params={ + "use_community_summary": False, + "shuffle_data": True, + "include_community_rank": True, + "min_community_rank": 0, + "community_rank_name": "rank", + "include_community_weight": True, + "community_weight_name": "occurrence weight", + "normalize_community_weight": True, + "max_tokens": gs_config.max_tokens, + "context_name": "Reports", + }, + concurrent_coroutines=gs_config.concurrency, + response_type=response_type, + ) diff --git a/graphrag/query/indexer_adapters.py b/graphrag/query/indexer_adapters.py new file mode 100644 index 00000000..4ce90d92 --- /dev/null +++ b/graphrag/query/indexer_adapters.py @@ -0,0 +1,141 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +"""Indexing-Engine to Query Read Adapters. + +The parts of these functions that do type adaptation, renaming, collating, etc. should eventually go away. +Ideally this is just a straight read-thorugh into the object model. +""" + +from typing import cast + +import pandas as pd + +from graphrag.model import CommunityReport, Covariate, Entity, Relationship, TextUnit +from graphrag.query.input.loaders.dfs import ( + read_community_reports, + read_covariates, + read_entities, + read_relationships, + read_text_units, +) + + +def read_indexer_text_units(final_text_units: pd.DataFrame) -> list[TextUnit]: + """Read in the Text Units from the raw indexing outputs.""" + return read_text_units( + df=final_text_units, + short_id_col=None, + # expects a covariate map of type -> ids + covariates_col=None, + ) + + +def read_indexer_covariates(final_covariates: pd.DataFrame) -> list[Covariate]: + """Read in the Claims from the raw indexing outputs.""" + covariate_df = final_covariates + covariate_df["id"] = covariate_df["id"].astype(str) + return read_covariates( + df=covariate_df, + short_id_col="human_readable_id", + attributes_cols=[ + "object_id", + "status", + "start_date", + "end_date", + "description", + ], + text_unit_ids_col=None, + ) + + +def read_indexer_relationships(final_relationships: pd.DataFrame) -> list[Relationship]: + """Read in the Relationships from the raw indexing outputs.""" + return read_relationships( + df=final_relationships, + short_id_col="human_readable_id", + description_embedding_col=None, + document_ids_col=None, + attributes_cols=["rank"], + ) + + +def read_indexer_reports( + final_community_reports: pd.DataFrame, + final_nodes: pd.DataFrame, + community_level: int, +) -> list[CommunityReport]: + """Read in the Community Reports from the raw indexing outputs.""" + report_df = final_community_reports + entity_df = final_nodes + entity_df = _filter_under_community_level(entity_df, community_level) + entity_df["community"] = entity_df["community"].fillna(-1) + entity_df["community"] = entity_df["community"].astype(int) + + entity_df = entity_df.groupby(["title"]).agg({"community": "max"}).reset_index() + entity_df["community"] = entity_df["community"].astype(str) + filtered_community_df = entity_df["community"].drop_duplicates() + + report_df = _filter_under_community_level(report_df, community_level) + report_df = report_df.merge(filtered_community_df, on="community", how="inner") + + return read_community_reports( + df=report_df, + id_col="community", + short_id_col="community", + summary_embedding_col=None, + content_embedding_col=None, + ) + + +def read_indexer_entities( + final_nodes: pd.DataFrame, + final_entities: pd.DataFrame, + community_level: int, +) -> list[Entity]: + """Read in the Entities from the raw indexing outputs.""" + entity_df = final_nodes + entity_embedding_df = final_entities + + entity_df = _filter_under_community_level(entity_df, community_level) + entity_df = cast(pd.DataFrame, entity_df[["title", "degree", "community"]]).rename( + columns={"title": "name", "degree": "rank"} + ) + + entity_df["community"] = entity_df["community"].fillna(-1) + entity_df["community"] = entity_df["community"].astype(int) + entity_df["rank"] = entity_df["rank"].astype(int) + + # for duplicate entities, keep the one with the highest community level + entity_df = ( + entity_df.groupby(["name", "rank"]).agg({"community": "max"}).reset_index() + ) + entity_df["community"] = entity_df["community"].apply(lambda x: [str(x)]) + entity_df = entity_df.merge( + entity_embedding_df, on="name", how="inner" + ).drop_duplicates(subset=["name"]) + + # read entity dataframe to knowledge model objects + return read_entities( + df=entity_df, + id_col="id", + title_col="name", + type_col="type", + short_id_col="human_readable_id", + description_col="description", + community_col="community", + rank_col="rank", + name_embedding_col=None, + description_embedding_col="description_embedding", + graph_embedding_col=None, + text_unit_ids_col="text_unit_ids", + document_ids_col=None, + ) + + +def _filter_under_community_level( + df: pd.DataFrame, community_level: int +) -> pd.DataFrame: + return cast( + pd.DataFrame, + df[df.level <= community_level], + ) diff --git a/graphrag/query/input/__init__.py b/graphrag/query/input/__init__.py new file mode 100644 index 00000000..94ae9734 --- /dev/null +++ b/graphrag/query/input/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""GraphRAG Orchestration Inputs.""" diff --git a/graphrag/query/input/loaders/__init__.py b/graphrag/query/input/loaders/__init__.py new file mode 100644 index 00000000..8f19dac0 --- /dev/null +++ b/graphrag/query/input/loaders/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""GraphRAG Orchestartion Input Loaders.""" diff --git a/graphrag/query/input/loaders/dfs.py b/graphrag/query/input/loaders/dfs.py new file mode 100644 index 00000000..7312963b --- /dev/null +++ b/graphrag/query/input/loaders/dfs.py @@ -0,0 +1,340 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Load data from dataframes into collections of data objects.""" + +import pandas as pd + +from graphrag.model import ( + Community, + CommunityReport, + Covariate, + Document, + Entity, + Relationship, + TextUnit, +) +from graphrag.query.input.loaders.utils import ( + to_list, + to_optional_dict, + to_optional_float, + to_optional_int, + to_optional_list, + to_optional_str, + to_str, +) +from graphrag.vector_stores import BaseVectorStore, VectorStoreDocument + + +def read_entities( + df: pd.DataFrame, + id_col: str = "id", + short_id_col: str | None = "short_id", + title_col: str = "title", + type_col: str | None = "type", + description_col: str | None = "description", + name_embedding_col: str | None = "name_embedding", + description_embedding_col: str | None = "description_embedding", + graph_embedding_col: str | None = "graph_embedding", + community_col: str | None = "community_ids", + text_unit_ids_col: str | None = "text_unit_ids", + document_ids_col: str | None = "document_ids", + rank_col: str | None = "degree", + attributes_cols: list[str] | None = None, +) -> list[Entity]: + """Read entities from a dataframe.""" + entities = [] + for idx, row in df.iterrows(): + entity = Entity( + id=to_str(row, id_col), + short_id=to_optional_str(row, short_id_col) if short_id_col else str(idx), + title=to_str(row, title_col), + type=to_optional_str(row, type_col), + description=to_optional_str(row, description_col), + name_embedding=to_optional_list(row, name_embedding_col, item_type=float), + description_embedding=to_optional_list( + row, description_embedding_col, item_type=float + ), + graph_embedding=to_optional_list(row, graph_embedding_col, item_type=float), + community_ids=to_optional_list(row, community_col, item_type=str), + text_unit_ids=to_optional_list(row, text_unit_ids_col), + document_ids=to_optional_list(row, document_ids_col), + rank=to_optional_int(row, rank_col), + attributes=( + {col: row.get(col) for col in attributes_cols} + if attributes_cols + else None + ), + ) + entities.append(entity) + return entities + + +def store_entity_semantic_embeddings( + entities: list[Entity], + vectorstore: BaseVectorStore, +) -> BaseVectorStore: + """Store entity semantic embeddings in a vectorstore.""" + documents = [ + VectorStoreDocument( + id=entity.id, + text=entity.description, + vector=entity.description_embedding, + attributes=( + {"title": entity.title, **entity.attributes} + if entity.attributes + else {"title": entity.title} + ), + ) + for entity in entities + ] + vectorstore.load_documents(documents=documents) + return vectorstore + + +def store_entity_behavior_embeddings( + entities: list[Entity], + vectorstore: BaseVectorStore, +) -> BaseVectorStore: + """Store entity behavior embeddings in a vectorstore.""" + documents = [ + VectorStoreDocument( + id=entity.id, + text=entity.description, + vector=entity.graph_embedding, + attributes=( + {"title": entity.title, **entity.attributes} + if entity.attributes + else {"title": entity.title} + ), + ) + for entity in entities + ] + vectorstore.load_documents(documents=documents) + return vectorstore + + +def read_relationships( + df: pd.DataFrame, + id_col: str = "id", + short_id_col: str | None = "short_id", + source_col: str = "source", + target_col: str = "target", + description_col: str | None = "description", + description_embedding_col: str | None = "description_embedding", + weight_col: str | None = "weight", + text_unit_ids_col: str | None = "text_unit_ids", + document_ids_col: str | None = "document_ids", + attributes_cols: list[str] | None = None, +) -> list[Relationship]: + """Read relationships from a dataframe.""" + relationships = [] + for idx, row in df.iterrows(): + rel = Relationship( + id=to_str(row, id_col), + short_id=to_optional_str(row, short_id_col) if short_id_col else str(idx), + source=to_str(row, source_col), + target=to_str(row, target_col), + description=to_optional_str(row, description_col), + description_embedding=to_optional_list( + row, description_embedding_col, item_type=float + ), + weight=to_optional_float(row, weight_col), + text_unit_ids=to_optional_list(row, text_unit_ids_col, item_type=str), + document_ids=to_optional_list(row, document_ids_col, item_type=str), + attributes=( + {col: row.get(col) for col in attributes_cols} + if attributes_cols + else None + ), + ) + relationships.append(rel) + return relationships + + +def read_covariates( + df: pd.DataFrame, + id_col: str = "id", + short_id_col: str | None = "short_id", + subject_col: str = "subject_id", + subject_type_col: str | None = "subject_type", + covariate_type_col: str | None = "covariate_type", + text_unit_ids_col: str | None = "text_unit_ids", + document_ids_col: str | None = "document_ids", + attributes_cols: list[str] | None = None, +) -> list[Covariate]: + """Read covariates from a dataframe.""" + covariates = [] + for idx, row in df.iterrows(): + cov = Covariate( + id=to_str(row, id_col), + short_id=to_optional_str(row, short_id_col) if short_id_col else str(idx), + subject_id=to_str(row, subject_col), + subject_type=( + to_str(row, subject_type_col) if subject_type_col else "entity" + ), + covariate_type=( + to_str(row, covariate_type_col) if covariate_type_col else "claim" + ), + text_unit_ids=to_optional_list(row, text_unit_ids_col, item_type=str), + document_ids=to_optional_list(row, document_ids_col, item_type=str), + attributes=( + {col: row.get(col) for col in attributes_cols} + if attributes_cols + else None + ), + ) + covariates.append(cov) + return covariates + + +def read_communities( + df: pd.DataFrame, + id_col: str = "id", + short_id_col: str | None = "short_id", + title_col: str = "title", + level_col: str = "level", + entities_col: str | None = "entity_ids", + relationships_col: str | None = "relationship_ids", + covariates_col: str | None = "covariate_ids", + attributes_cols: list[str] | None = None, +) -> list[Community]: + """Read communities from a dataframe.""" + communities = [] + for idx, row in df.iterrows(): + comm = Community( + id=to_str(row, id_col), + short_id=to_optional_str(row, short_id_col) if short_id_col else str(idx), + title=to_str(row, title_col), + level=to_str(row, level_col), + entity_ids=to_optional_list(row, entities_col, item_type=str), + relationship_ids=to_optional_list(row, relationships_col, item_type=str), + covariate_ids=to_optional_dict( + row, covariates_col, key_type=str, value_type=str + ), + attributes=( + {col: row.get(col) for col in attributes_cols} + if attributes_cols + else None + ), + ) + communities.append(comm) + return communities + + +def read_community_reports( + df: pd.DataFrame, + id_col: str = "id", + short_id_col: str | None = "short_id", + title_col: str = "title", + community_col: str = "community", + summary_col: str = "summary", + content_col: str = "full_content", + rank_col: str | None = "rank", + summary_embedding_col: str | None = "summary_embedding", + content_embedding_col: str | None = "full_content_embedding", + attributes_cols: list[str] | None = None, +) -> list[CommunityReport]: + """Read community reports from a dataframe.""" + reports = [] + for idx, row in df.iterrows(): + report = CommunityReport( + id=to_str(row, id_col), + short_id=to_optional_str(row, short_id_col) if short_id_col else str(idx), + title=to_str(row, title_col), + community_id=to_str(row, community_col), + summary=to_str(row, summary_col), + full_content=to_str(row, content_col), + rank=to_optional_float(row, rank_col), + summary_embedding=to_optional_list( + row, summary_embedding_col, item_type=float + ), + full_content_embedding=to_optional_list( + row, content_embedding_col, item_type=float + ), + attributes=( + {col: row.get(col) for col in attributes_cols} + if attributes_cols + else None + ), + ) + reports.append(report) + return reports + + +def read_text_units( + df: pd.DataFrame, + id_col: str = "id", + short_id_col: str | None = "short_id", + text_col: str = "text", + entities_col: str | None = "entity_ids", + relationships_col: str | None = "relationship_ids", + covariates_col: str | None = "covariate_ids", + tokens_col: str | None = "n_tokens", + document_ids_col: str | None = "document_ids", + embedding_col: str | None = "text_embedding", + attributes_cols: list[str] | None = None, +) -> list[TextUnit]: + """Read text units from a dataframe.""" + text_units = [] + for idx, row in df.iterrows(): + chunk = TextUnit( + id=to_str(row, id_col), + short_id=to_optional_str(row, short_id_col) if short_id_col else str(idx), + text=to_str(row, text_col), + entity_ids=to_optional_list(row, entities_col, item_type=str), + relationship_ids=to_optional_list(row, relationships_col, item_type=str), + covariate_ids=to_optional_dict( + row, covariates_col, key_type=str, value_type=str + ), + text_embedding=to_optional_list(row, embedding_col, item_type=float), # type: ignore + n_tokens=to_optional_int(row, tokens_col), + document_ids=to_optional_list(row, document_ids_col, item_type=str), + attributes=( + {col: row.get(col) for col in attributes_cols} + if attributes_cols + else None + ), + ) + text_units.append(chunk) + return text_units + + +def read_documents( + df: pd.DataFrame, + id_col: str = "id", + short_id_col: str = "short_id", + title_col: str = "title", + type_col: str = "type", + summary_col: str | None = "entities", + raw_content_col: str | None = "relationships", + summary_embedding_col: str | None = "summary_embedding", + content_embedding_col: str | None = "raw_content_embedding", + text_units_col: str | None = "text_units", + attributes_cols: list[str] | None = None, +) -> list[Document]: + """Read documents from a dataframe.""" + docs = [] + for idx, row in df.iterrows(): + doc = Document( + id=to_str(row, id_col), + short_id=to_optional_str(row, short_id_col) if short_id_col else str(idx), + title=to_str(row, title_col), + type=to_str(row, type_col), + summary=to_optional_str(row, summary_col), + raw_content=to_str(row, raw_content_col), + summary_embedding=to_optional_list( + row, summary_embedding_col, item_type=float + ), + raw_content_embedding=to_optional_list( + row, content_embedding_col, item_type=float + ), + text_units=to_list(row, text_units_col, item_type=str), # type: ignore + attributes=( + {col: row.get(col) for col in attributes_cols} + if attributes_cols + else None + ), + ) + docs.append(doc) + return docs diff --git a/graphrag/query/input/loaders/utils.py b/graphrag/query/input/loaders/utils.py new file mode 100644 index 00000000..e0fffd24 --- /dev/null +++ b/graphrag/query/input/loaders/utils.py @@ -0,0 +1,245 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Data load utils.""" + +import numpy as np +import pandas as pd + + +def to_str(data: pd.Series, column_name: str | None) -> str: + """Convert and validate a value to a string.""" + if column_name is None: + msg = "Column name is None" + raise ValueError(msg) + + if column_name in data: + return str(data[column_name]) + msg = f"Column {column_name} not found in data" + raise ValueError(msg) + + +def to_optional_str(data: pd.Series, column_name: str | None) -> str | None: + """Convert and validate a value to an optional string.""" + if column_name is None: + msg = "Column name is None" + raise ValueError(msg) + + if column_name in data: + value = data[column_name] + if value is None: + return None + return str(data[column_name]) + msg = f"Column {column_name} not found in data" + raise ValueError(msg) + + +def to_list( + data: pd.Series, column_name: str | None, item_type: type | None = None +) -> list: + """Convert and validate a value to a list.""" + if column_name is None: + msg = "Column name is None" + raise ValueError(msg) + + if column_name in data: + value = data[column_name] + if isinstance(value, np.ndarray): + value = value.tolist() + + if not isinstance(value, list): + msg = f"value is not a list: {value} ({type(value)})" + raise ValueError(msg) + + if item_type is not None: + for v in value: + if not isinstance(v, item_type): + msg = f"list item has item that is not {item_type}: {v} ({type(v)})" + raise TypeError(msg) + return value + + msg = f"Column {column_name} not found in data" + raise ValueError(msg) + + +def to_optional_list( + data: pd.Series, column_name: str | None, item_type: type | None = None +) -> list | None: + """Convert and validate a value to an optional list.""" + if column_name is None: + return None + + if column_name in data: + value = data[column_name] # type: ignore + if value is None: + return None + + if isinstance(value, np.ndarray): + value = value.tolist() + + if not isinstance(value, list): + msg = f"value is not a list: {value} ({type(value)})" + raise ValueError(msg) + + if item_type is not None: + for v in value: + if not isinstance(v, item_type): + msg = f"list item has item that is not {item_type}: {v} ({type(v)})" + raise TypeError(msg) + return value + + return None + + +def to_int(data: pd.Series, column_name: str | None) -> int: + """Convert and validate a value to an int.""" + if column_name is None: + msg = "Column name is None" + raise ValueError(msg) + + if column_name in data: + value = data[column_name] + if isinstance(value, float): + value = int(value) + if not isinstance(value, int): + msg = f"value is not an int: {value} ({type(value)})" + raise ValueError(msg) + else: + msg = f"Column {column_name} not found in data" + raise ValueError(msg) + + return int(value) + + +def to_optional_int(data: pd.Series, column_name: str | None) -> int | None: + """Convert and validate a value to an optional int.""" + if column_name is None: + return None + + if column_name in data: + value = data[column_name] + + if value is None: + return None + + if isinstance(value, float): + value = int(value) + if not isinstance(value, int): + msg = f"value is not an int: {value} ({type(value)})" + raise ValueError(msg) + else: + msg = f"Column {column_name} not found in data" + raise ValueError(msg) + + return int(value) + + +def to_float(data: pd.Series, column_name: str | None) -> float: + """Convert and validate a value to a float.""" + if column_name is None: + msg = "Column name is None" + raise ValueError(msg) + + if column_name in data: + value = data[column_name] + if not isinstance(value, float): + msg = f"value is not a float: {value} ({type(value)})" + raise ValueError(msg) + else: + msg = f"Column {column_name} not found in data" + raise ValueError(msg) + + return float(value) + + +def to_optional_float(data: pd.Series, column_name: str | None) -> float | None: + """Convert and validate a value to an optional float.""" + if column_name is None: + return None + + if column_name in data: + value = data[column_name] + if value is None: + return None + if not isinstance(value, float): + msg = f"value is not a float: {value} ({type(value)})" + raise ValueError(msg) + else: + msg = f"Column {column_name} not found in data" + raise ValueError(msg) + + return float(value) + + +def to_dict( + data: pd.Series, + column_name: str | None, + key_type: type | None = None, + value_type: type | None = None, +) -> dict: + """Convert and validate a value to a dict.""" + if column_name is None: + msg = "Column name is None" + raise ValueError(msg) + + if column_name in data: + value = data[column_name] + if not isinstance(value, dict): + msg = f"value is not a dict: {value} ({type(value)})" + raise ValueError(msg) + + if key_type is not None: + for v in value: + if not isinstance(v, key_type): + msg = f"dict key has item that is not {key_type}: {v} ({type(v)})" + raise TypeError(msg) + + if value_type is not None: + for v in value.values(): + if not isinstance(v, value_type): + msg = ( + f"dict value has item that is not {value_type}: {v} ({type(v)})" + ) + raise TypeError(msg) + return value + + msg = f"Column {column_name} not found in data" + raise ValueError(msg) + + +def to_optional_dict( + data: pd.Series, + column_name: str | None, + key_type: type | None = None, + value_type: type | None = None, +) -> dict | None: + """Convert and validate a value to an optional dict.""" + if column_name is None: + return None + + if column_name in data: + value = data[column_name] + if value is None: + return None + if not isinstance(value, dict): + msg = f"value is not a dict: {value} ({type(value)})" + raise TypeError(msg) + + if key_type is not None: + for v in value: + if not isinstance(v, key_type): + msg = f"dict key has item that is not {key_type}: {v} ({type(v)})" + raise TypeError(msg) + + if value_type is not None: + for v in value.values(): + if not isinstance(v, value_type): + msg = ( + f"dict value has item that is not {value_type}: {v} ({type(v)})" + ) + raise TypeError(msg) + + return value + + msg = f"Column {column_name} not found in data" + raise ValueError(msg) diff --git a/graphrag/query/input/retrieval/__init__.py b/graphrag/query/input/retrieval/__init__.py new file mode 100644 index 00000000..75c2f9f0 --- /dev/null +++ b/graphrag/query/input/retrieval/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""GraphRAG Orchestration Input Retrieval.""" diff --git a/graphrag/query/input/retrieval/community_reports.py b/graphrag/query/input/retrieval/community_reports.py new file mode 100644 index 00000000..bd4933f1 --- /dev/null +++ b/graphrag/query/input/retrieval/community_reports.py @@ -0,0 +1,74 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Util functions to retrieve community reports from a collection.""" + +from typing import Any, cast + +import pandas as pd + +from graphrag.model import CommunityReport, Entity + + +def get_candidate_communities( + selected_entities: list[Entity], + community_reports: list[CommunityReport], + include_community_rank: bool = False, + use_community_summary: bool = False, +) -> pd.DataFrame: + """Get all communities that are related to selected entities.""" + selected_community_ids = [ + entity.community_ids for entity in selected_entities if entity.community_ids + ] + selected_community_ids = [ + item for sublist in selected_community_ids for item in sublist + ] + selected_reports = [ + community + for community in community_reports + if community.id in selected_community_ids + ] + return to_community_report_dataframe( + reports=selected_reports, + include_community_rank=include_community_rank, + use_community_summary=use_community_summary, + ) + + +def to_community_report_dataframe( + reports: list[CommunityReport], + include_community_rank: bool = False, + use_community_summary: bool = False, +) -> pd.DataFrame: + """Convert a list of communities to a pandas dataframe.""" + if len(reports) == 0: + return pd.DataFrame() + + # add header + header = ["id", "title"] + attribute_cols = list(reports[0].attributes.keys()) if reports[0].attributes else [] + attribute_cols = [col for col in attribute_cols if col not in header] + header.extend(attribute_cols) + header.append("summary" if use_community_summary else "content") + if include_community_rank: + header.append("rank") + + records = [] + for report in reports: + new_record = [ + report.short_id if report.short_id else "", + report.title, + *[ + str(report.attributes.get(field, "")) + if report.attributes and report.attributes.get(field) + else "" + for field in attribute_cols + ], + ] + new_record.append( + report.summary if use_community_summary else report.full_content + ) + if include_community_rank: + new_record.append(str(report.rank)) + records.append(new_record) + return pd.DataFrame(records, columns=cast(Any, header)) diff --git a/graphrag/query/input/retrieval/covariates.py b/graphrag/query/input/retrieval/covariates.py new file mode 100644 index 00000000..1c45203d --- /dev/null +++ b/graphrag/query/input/retrieval/covariates.py @@ -0,0 +1,52 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Util functions to retrieve covariates from a collection.""" + +from typing import Any, cast + +import pandas as pd + +from graphrag.model import Covariate, Entity + + +def get_candidate_covariates( + selected_entities: list[Entity], + covariates: list[Covariate], +) -> list[Covariate]: + """Get all covariates that are related to selected entities.""" + selected_entity_names = [entity.title for entity in selected_entities] + return [ + covariate + for covariate in covariates + if covariate.subject_id in selected_entity_names + ] + + +def to_covariate_dataframe(covariates: list[Covariate]) -> pd.DataFrame: + """Convert a list of covariates to a pandas dataframe.""" + if len(covariates) == 0: + return pd.DataFrame() + + # add header + header = ["id", "entity"] + attributes = covariates[0].attributes or {} if len(covariates) > 0 else {} + attribute_cols = list(attributes.keys()) if len(covariates) > 0 else [] + attribute_cols = [col for col in attribute_cols if col not in header] + header.extend(attribute_cols) + + records = [] + for covariate in covariates: + new_record = [ + covariate.short_id if covariate.short_id else "", + covariate.subject_id, + ] + for field in attribute_cols: + field_value = ( + str(covariate.attributes.get(field)) + if covariate.attributes and covariate.attributes.get(field) + else "" + ) + new_record.append(field_value) + records.append(new_record) + return pd.DataFrame(records, columns=cast(Any, header)) diff --git a/graphrag/query/input/retrieval/entities.py b/graphrag/query/input/retrieval/entities.py new file mode 100644 index 00000000..5465f9f5 --- /dev/null +++ b/graphrag/query/input/retrieval/entities.py @@ -0,0 +1,93 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Util functions to get entities from a collection.""" + +import uuid +from collections.abc import Iterable +from typing import Any, cast + +import pandas as pd + +from graphrag.model import Entity + + +def get_entity_by_key( + entities: Iterable[Entity], key: str, value: str | int +) -> Entity | None: + """Get entity by key.""" + for entity in entities: + if isinstance(value, str) and is_valid_uuid(value): + if getattr(entity, key) == value or getattr(entity, key) == value.replace( + "-", "" + ): + return entity + else: + if getattr(entity, key) == value: + return entity + return None + + +def get_entity_by_name(entities: Iterable[Entity], entity_name: str) -> list[Entity]: + """Get entities by name.""" + return [entity for entity in entities if entity.title == entity_name] + + +def get_entity_by_attribute( + entities: Iterable[Entity], attribute_name: str, attribute_value: Any +) -> list[Entity]: + """Get entities by attribute.""" + return [ + entity + for entity in entities + if entity.attributes + and entity.attributes.get(attribute_name) == attribute_value + ] + + +def to_entity_dataframe( + entities: list[Entity], + include_entity_rank: bool = True, + rank_description: str = "number of relationships", +) -> pd.DataFrame: + """Convert a list of entities to a pandas dataframe.""" + if len(entities) == 0: + return pd.DataFrame() + header = ["id", "entity", "description"] + if include_entity_rank: + header.append(rank_description) + attribute_cols = ( + list(entities[0].attributes.keys()) if entities[0].attributes else [] + ) + attribute_cols = [col for col in attribute_cols if col not in header] + header.extend(attribute_cols) + + records = [] + for entity in entities: + new_record = [ + entity.short_id if entity.short_id else "", + entity.title, + entity.description if entity.description else "", + ] + if include_entity_rank: + new_record.append(str(entity.rank)) + + for field in attribute_cols: + field_value = ( + str(entity.attributes.get(field)) + if entity.attributes and entity.attributes.get(field) + else "" + ) + new_record.append(field_value) + records.append(new_record) + return pd.DataFrame(records, columns=cast(Any, header)) + + +def is_valid_uuid(value: str) -> bool: + """Determine if a string is a valid UUID.""" + try: + uuid.UUID(str(value)) + except ValueError: + return False + else: + return True diff --git a/graphrag/query/input/retrieval/relationships.py b/graphrag/query/input/retrieval/relationships.py new file mode 100644 index 00000000..2ef5ba38 --- /dev/null +++ b/graphrag/query/input/retrieval/relationships.py @@ -0,0 +1,173 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Util functions to retrieve relationships from a collection.""" + +from typing import Any, cast + +import pandas as pd + +from graphrag.model import Entity, Relationship + + +def get_in_network_relationships( + selected_entities: list[Entity], + relationships: list[Relationship], + ranking_attribute: str = "rank", +) -> list[Relationship]: + """Get all directed relationships between selected entities, sorted by ranking_attribute.""" + selected_entity_names = [entity.title for entity in selected_entities] + selected_relationships = [ + relationship + for relationship in relationships + if relationship.source in selected_entity_names + and relationship.target in selected_entity_names + ] + if len(selected_relationships) <= 1: + return selected_relationships + + # sort by ranking attribute + return sort_relationships_by_ranking_attribute( + selected_relationships, selected_entities, ranking_attribute + ) + + +def get_out_network_relationships( + selected_entities: list[Entity], + relationships: list[Relationship], + ranking_attribute: str = "rank", +) -> list[Relationship]: + """Get relationships from selected entities to other entities that are not within the selected entities, sorted by ranking_attribute.""" + selected_entity_names = [entity.title for entity in selected_entities] + source_relationships = [ + relationship + for relationship in relationships + if relationship.source in selected_entity_names + and relationship.target not in selected_entity_names + ] + target_relationships = [ + relationship + for relationship in relationships + if relationship.target in selected_entity_names + and relationship.source not in selected_entity_names + ] + selected_relationships = source_relationships + target_relationships + return sort_relationships_by_ranking_attribute( + selected_relationships, selected_entities, ranking_attribute + ) + + +def get_candidate_relationships( + selected_entities: list[Entity], + relationships: list[Relationship], +) -> list[Relationship]: + """Get all relationships that are associated with the selected entities.""" + selected_entity_names = [entity.title for entity in selected_entities] + return [ + relationship + for relationship in relationships + if relationship.source in selected_entity_names + or relationship.target in selected_entity_names + ] + + +def get_entities_from_relationships( + relationships: list[Relationship], entities: list[Entity] +) -> list[Entity]: + """Get all entities that are associated with the selected relationships.""" + selected_entity_names = [relationship.source for relationship in relationships] + [ + relationship.target for relationship in relationships + ] + return [entity for entity in entities if entity.title in selected_entity_names] + + +def calculate_relationship_combined_rank( + relationships: list[Relationship], + entities: list[Entity], + ranking_attribute: str = "rank", +) -> list[Relationship]: + """Calculate default rank for a relationship based on the combined rank of source and target entities.""" + entity_mappings = {entity.title: entity for entity in entities} + + for relationship in relationships: + if relationship.attributes is None: + relationship.attributes = {} + source = entity_mappings.get(relationship.source) + target = entity_mappings.get(relationship.target) + source_rank = source.rank if source and source.rank else 0 + target_rank = target.rank if target and target.rank else 0 + relationship.attributes[ranking_attribute] = source_rank + target_rank # type: ignore + return relationships + + +def sort_relationships_by_ranking_attribute( + relationships: list[Relationship], + entities: list[Entity], + ranking_attribute: str = "rank", +) -> list[Relationship]: + """ + Sort relationships by a ranking_attribute. + + If no ranking attribute exists, sort by combined rank of source and target entities. + """ + if len(relationships) == 0: + return relationships + + # sort by ranking attribute + attribute_names = ( + list(relationships[0].attributes.keys()) if relationships[0].attributes else [] + ) + if ranking_attribute in attribute_names: + relationships.sort( + key=lambda x: int(x.attributes[ranking_attribute]) if x.attributes else 0, + reverse=True, + ) + elif ranking_attribute == "weight": + relationships.sort(key=lambda x: x.weight if x.weight else 0.0, reverse=True) + else: + # ranking attribute do not exist, calculate rank = combined ranks of source and target + relationships = calculate_relationship_combined_rank( + relationships, entities, ranking_attribute + ) + relationships.sort( + key=lambda x: int(x.attributes[ranking_attribute]) if x.attributes else 0, + reverse=True, + ) + return relationships + + +def to_relationship_dataframe( + relationships: list[Relationship], include_relationship_weight: bool = True +) -> pd.DataFrame: + """Convert a list of relationships to a pandas dataframe.""" + if len(relationships) == 0: + return pd.DataFrame() + + header = ["id", "source", "target", "description"] + if include_relationship_weight: + header.append("weight") + attribute_cols = ( + list(relationships[0].attributes.keys()) if relationships[0].attributes else [] + ) + attribute_cols = [col for col in attribute_cols if col not in header] + header.extend(attribute_cols) + + records = [] + for rel in relationships: + new_record = [ + rel.short_id if rel.short_id else "", + rel.source, + rel.target, + rel.description if rel.description else "", + ] + if include_relationship_weight: + new_record.append(str(rel.weight if rel.weight else "")) + for field in attribute_cols: + field_value = ( + str(rel.attributes.get(field)) + if rel.attributes and rel.attributes.get(field) + else "" + ) + new_record.append(field_value) + records.append(new_record) + return pd.DataFrame(records, columns=cast(Any, header)) diff --git a/graphrag/query/input/retrieval/text_units.py b/graphrag/query/input/retrieval/text_units.py new file mode 100644 index 00000000..a00dc20a --- /dev/null +++ b/graphrag/query/input/retrieval/text_units.py @@ -0,0 +1,52 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Util functions to retrieve text units from a collection.""" + +from typing import Any, cast + +import pandas as pd + +from graphrag.model import Entity, TextUnit + + +def get_candidate_text_units( + selected_entities: list[Entity], + text_units: list[TextUnit], +) -> pd.DataFrame: + """Get all text units that are associated to selected entities.""" + selected_text_ids = [ + entity.text_unit_ids for entity in selected_entities if entity.text_unit_ids + ] + selected_text_ids = [item for sublist in selected_text_ids for item in sublist] + selected_text_units = [unit for unit in text_units if unit.id in selected_text_ids] + return to_text_unit_dataframe(selected_text_units) + + +def to_text_unit_dataframe(text_units: list[TextUnit]) -> pd.DataFrame: + """Convert a list of text units to a pandas dataframe.""" + if len(text_units) == 0: + return pd.DataFrame() + + # add header + header = ["id", "text"] + attribute_cols = ( + list(text_units[0].attributes.keys()) if text_units[0].attributes else [] + ) + attribute_cols = [col for col in attribute_cols if col not in header] + header.extend(attribute_cols) + + records = [] + for unit in text_units: + new_record = [ + unit.short_id, + unit.text, + *[ + str(unit.attributes.get(field, "")) + if unit.attributes and unit.attributes.get(field) + else "" + for field in attribute_cols + ], + ] + records.append(new_record) + return pd.DataFrame(records, columns=cast(Any, header)) diff --git a/graphrag/query/llm/__init__.py b/graphrag/query/llm/__init__.py new file mode 100644 index 00000000..b8f507b1 --- /dev/null +++ b/graphrag/query/llm/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Orchestration LLM utilities.""" diff --git a/graphrag/query/llm/base.py b/graphrag/query/llm/base.py new file mode 100644 index 00000000..228150af --- /dev/null +++ b/graphrag/query/llm/base.py @@ -0,0 +1,54 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Base classes for LLM and Embedding models.""" + +from abc import ABC, abstractmethod +from typing import Any + + +class BaseLLMCallback: + """Base class for LLM callbacks.""" + + def __init__(self): + self.response = [] + + def on_llm_new_token(self, token: str): + """Handle when a new token is generated.""" + self.response.append(token) + + +class BaseLLM(ABC): + """The Base LLM implementation.""" + + @abstractmethod + def generate( + self, + messages: str | list[Any], + streaming: bool = True, + callbacks: list[BaseLLMCallback] | None = None, + **kwargs: Any, + ) -> str: + """Generate a response.""" + + @abstractmethod + async def agenerate( + self, + messages: str | list[Any], + streaming: bool = True, + callbacks: list[BaseLLMCallback] | None = None, + **kwargs: Any, + ) -> str: + """Generate a response asynchronously.""" + + +class BaseTextEmbedding(ABC): + """The text embedding interface.""" + + @abstractmethod + def embed(self, text: str, **kwargs: Any) -> list[float]: + """Embed a text string.""" + + @abstractmethod + async def aembed(self, text: str, **kwargs: Any) -> list[float]: + """Embed a text string asynchronously.""" diff --git a/graphrag/query/llm/oai/__init__.py b/graphrag/query/llm/oai/__init__.py new file mode 100644 index 00000000..cbb25790 --- /dev/null +++ b/graphrag/query/llm/oai/__init__.py @@ -0,0 +1,21 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""GraphRAG Orchestration OpenAI Wrappers.""" + +from .base import BaseOpenAILLM, OpenAILLMImpl, OpenAITextEmbeddingImpl +from .chat_openai import ChatOpenAI +from .embedding import OpenAIEmbedding +from .openai import OpenAI +from .typing import OPENAI_RETRY_ERROR_TYPES, OpenaiApiType + +__all__ = [ + "OPENAI_RETRY_ERROR_TYPES", + "BaseOpenAILLM", + "ChatOpenAI", + "OpenAI", + "OpenAIEmbedding", + "OpenAILLMImpl", + "OpenAITextEmbeddingImpl", + "OpenaiApiType", +] diff --git a/graphrag/query/llm/oai/base.py b/graphrag/query/llm/oai/base.py new file mode 100644 index 00000000..6181c0b2 --- /dev/null +++ b/graphrag/query/llm/oai/base.py @@ -0,0 +1,187 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Base classes for LLM and Embedding models.""" + +from abc import ABC, abstractmethod +from collections.abc import Callable + +from openai import AsyncAzureOpenAI, AsyncOpenAI, AzureOpenAI, OpenAI + +from graphrag.query.llm.base import BaseTextEmbedding +from graphrag.query.llm.oai.typing import OpenaiApiType +from graphrag.query.progress import ConsoleStatusReporter, StatusReporter + + +class BaseOpenAILLM(ABC): + """The Base OpenAI LLM implementation.""" + + _async_client: AsyncOpenAI | AsyncAzureOpenAI + _sync_client: OpenAI | AzureOpenAI + + def __init__(self): + self._create_openai_client() + + @abstractmethod + def _create_openai_client(self): + """Create a new synchronous and asynchronous OpenAI client instance.""" + + def set_clients( + self, + sync_client: OpenAI | AzureOpenAI, + async_client: AsyncOpenAI | AsyncAzureOpenAI, + ): + """ + Set the synchronous and asynchronous clients used for making API requests. + + Args: + sync_client (OpenAI | AzureOpenAI): The sync client object. + async_client (AsyncOpenAI | AsyncAzureOpenAI): The async client object. + """ + self._sync_client = sync_client + self._async_client = async_client + + @property + def async_client(self) -> AsyncOpenAI | AsyncAzureOpenAI | None: + """ + Get the asynchronous client used for making API requests. + + Returns + ------- + AsyncOpenAI | AsyncAzureOpenAI: The async client object. + """ + return self._async_client + + @property + def sync_client(self) -> OpenAI | AzureOpenAI | None: + """ + Get the synchronous client used for making API requests. + + Returns + ------- + AsyncOpenAI | AsyncAzureOpenAI: The async client object. + """ + return self._sync_client + + @async_client.setter + def async_client(self, client: AsyncOpenAI | AsyncAzureOpenAI): + """ + Set the asynchronous client used for making API requests. + + Args: + client (AsyncOpenAI | AsyncAzureOpenAI): The async client object. + """ + self._async_client = client + + @sync_client.setter + def sync_client(self, client: OpenAI | AzureOpenAI): + """ + Set the synchronous client used for making API requests. + + Args: + client (OpenAI | AzureOpenAI): The sync client object. + """ + self._sync_client = client + + +class OpenAILLMImpl(BaseOpenAILLM): + """Orchestration OpenAI LLM Implementation.""" + + _reporter: StatusReporter = ConsoleStatusReporter() + + def __init__( + self, + api_key: str | None = None, + azure_ad_token_provider: Callable | None = None, + deployment_name: str | None = None, + api_base: str | None = None, + api_version: str | None = None, + api_type: OpenaiApiType = OpenaiApiType.OpenAI, + organization: str | None = None, + max_retries: int = 10, + request_timeout: float = 180.0, + reporter: StatusReporter | None = None, + ): + self.api_key = api_key + self.azure_ad_token_provider = azure_ad_token_provider + self.deployment_name = deployment_name + self.api_base = api_base + self.api_version = api_version + self.api_type = api_type + self.organization = organization + self.max_retries = max_retries + self.request_timeout = request_timeout + self.reporter = reporter or ConsoleStatusReporter() + + try: + # Create OpenAI sync and async clients + super().__init__() + except Exception as e: + self._reporter.error( + message="Failed to create OpenAI client", + details={self.__class__.__name__: str(e)}, + ) + raise + + def _create_openai_client(self): + """Create a new OpenAI client instance.""" + if self.api_type == OpenaiApiType.AzureOpenAI: + if self.api_base is None: + msg = "api_base is required for Azure OpenAI" + raise ValueError(msg) + + sync_client = AzureOpenAI( + api_key=self.api_key, + azure_ad_token_provider=self.azure_ad_token_provider, + organization=self.organization, + # Azure-Specifics + api_version=self.api_version, + azure_endpoint=self.api_base, + azure_deployment=self.deployment_name, + # Retry Configuration + timeout=self.request_timeout, + max_retries=self.max_retries, + ) + + async_client = AsyncAzureOpenAI( + api_key=self.api_key, + azure_ad_token_provider=self.azure_ad_token_provider, + organization=self.organization, + # Azure-Specifics + api_version=self.api_version, + azure_endpoint=self.api_base, + azure_deployment=self.deployment_name, + # Retry Configuration + timeout=self.request_timeout, + max_retries=self.max_retries, + ) + self.set_clients(sync_client=sync_client, async_client=async_client) + + else: + sync_client = OpenAI( + api_key=self.api_key, + base_url=self.api_base, + organization=self.organization, + # Retry Configuration + timeout=self.request_timeout, + max_retries=self.max_retries, + ) + + async_client = AsyncOpenAI( + api_key=self.api_key, + base_url=self.api_base, + organization=self.organization, + # Retry Configuration + timeout=self.request_timeout, + max_retries=self.max_retries, + ) + self.set_clients(sync_client=sync_client, async_client=async_client) + + +class OpenAITextEmbeddingImpl(BaseTextEmbedding): + """Orchestration OpenAI Text Embedding Implementation.""" + + _reporter: StatusReporter | None = None + + def _create_openai_client(self, api_type: OpenaiApiType): + """Create a new synchronous and asynchronous OpenAI client instance.""" diff --git a/graphrag/query/llm/oai/chat_openai.py b/graphrag/query/llm/oai/chat_openai.py new file mode 100644 index 00000000..8314f3a2 --- /dev/null +++ b/graphrag/query/llm/oai/chat_openai.py @@ -0,0 +1,196 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Chat-based OpenAI LLM implementation.""" + +from collections.abc import Callable +from typing import Any + +from tenacity import ( + AsyncRetrying, + RetryError, + Retrying, + retry_if_exception_type, + stop_after_attempt, + wait_exponential_jitter, +) + +from graphrag.query.llm.base import BaseLLM, BaseLLMCallback +from graphrag.query.llm.oai.base import OpenAILLMImpl +from graphrag.query.llm.oai.typing import ( + OPENAI_RETRY_ERROR_TYPES, + OpenaiApiType, +) +from graphrag.query.progress import StatusReporter + +_MODEL_REQUIRED_MSG = "model is required" + + +class ChatOpenAI(BaseLLM, OpenAILLMImpl): + """Wrapper for OpenAI ChatCompletion models.""" + + def __init__( + self, + api_key: str | None = None, + model: str | None = None, + azure_ad_token_provider: Callable | None = None, + deployment_name: str | None = None, + api_base: str | None = None, + api_version: str | None = None, + api_type: OpenaiApiType = OpenaiApiType.OpenAI, + organization: str | None = None, + max_retries: int = 10, + request_timeout: float = 180.0, + retry_error_types: tuple[type[BaseException]] = OPENAI_RETRY_ERROR_TYPES, # type: ignore + reporter: StatusReporter | None = None, + ): + OpenAILLMImpl.__init__( + self=self, + api_key=api_key, + azure_ad_token_provider=azure_ad_token_provider, + deployment_name=deployment_name, + api_base=api_base, + api_version=api_version, + api_type=api_type, # type: ignore + organization=organization, + max_retries=max_retries, + request_timeout=request_timeout, + reporter=reporter, + ) + self.model = model + self.retry_error_types = retry_error_types + + def generate( + self, + messages: str | list[Any], + streaming: bool = True, + callbacks: list[BaseLLMCallback] | None = None, + **kwargs: Any, + ) -> str: + """Generate text.""" + try: + retryer = Retrying( + stop=stop_after_attempt(self.max_retries), + wait=wait_exponential_jitter(max=10), + reraise=True, + retry=retry_if_exception_type(self.retry_error_types), + ) + for attempt in retryer: + with attempt: + return self._generate( + messages=messages, + streaming=streaming, + callbacks=callbacks, + **kwargs, + ) + except RetryError as e: + self._reporter.error( + message="Error at generate()", details={self.__class__.__name__: str(e)} + ) + return "" + else: + # TODO: why not just throw in this case? + return "" + + async def agenerate( + self, + messages: str | list[Any], + streaming: bool = True, + callbacks: list[BaseLLMCallback] | None = None, + **kwargs: Any, + ) -> str: + """Generate text asynchronously.""" + try: + retryer = AsyncRetrying( + stop=stop_after_attempt(self.max_retries), + wait=wait_exponential_jitter(max=10), + reraise=True, + retry=retry_if_exception_type(self.retry_error_types), # type: ignore + ) + async for attempt in retryer: + with attempt: + return await self._agenerate( + messages=messages, + streaming=streaming, + callbacks=callbacks, + **kwargs, + ) + except RetryError as e: + self._reporter.error(f"Error at agenerate(): {e}") + return "" + else: + # TODO: why not just throw in this case? + return "" + + def _generate( + self, + messages: str | list[Any], + streaming: bool = True, + callbacks: list[BaseLLMCallback] | None = None, + **kwargs: Any, + ) -> str: + model = self.model + if not model: + raise ValueError(_MODEL_REQUIRED_MSG) + response = self.sync_client.chat.completions.create( # type: ignore + model=model, + messages=messages, # type: ignore + stream=streaming, + **kwargs, + ) # type: ignore + if streaming: + full_response = "" + while True: + try: + chunk = response.__next__() # type: ignore + if not chunk or not chunk.choices: + continue + + delta = chunk.choices[0].delta.content or "" # type: ignore + full_response += delta + if callbacks: + for callback in callbacks: + callback.on_llm_new_token(delta) + if chunk.choices[0].finish_reason == "stop": # type: ignore + break + except StopIteration: + break + return full_response + return response.choices[0].message.content or "" # type: ignore + + async def _agenerate( + self, + messages: str | list[Any], + streaming: bool = True, + callbacks: list[BaseLLMCallback] | None = None, + **kwargs: Any, + ) -> str: + model = self.model + if not model: + raise ValueError(_MODEL_REQUIRED_MSG) + response = await self.async_client.chat.completions.create( # type: ignore + model=model, + messages=messages, # type: ignore + stream=streaming, + **kwargs, + ) + if streaming: + full_response = "" + while True: + try: + chunk = await response.__anext__() # type: ignore + if not chunk or not chunk.choices: + continue + + delta = chunk.choices[0].delta.content or "" # type: ignore + full_response += delta + if callbacks: + for callback in callbacks: + callback.on_llm_new_token(delta) + if chunk.choices[0].finish_reason == "stop": # type: ignore + break + except StopIteration: + break + return full_response + + return response.choices[0].message.content or "" # type: ignore diff --git a/graphrag/query/llm/oai/embedding.py b/graphrag/query/llm/oai/embedding.py new file mode 100644 index 00000000..f40372db --- /dev/null +++ b/graphrag/query/llm/oai/embedding.py @@ -0,0 +1,182 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""OpenAI Embedding model implementation.""" + +import asyncio +from collections.abc import Callable +from typing import Any + +import numpy as np +import tiktoken +from tenacity import ( + AsyncRetrying, + RetryError, + Retrying, + retry_if_exception_type, + stop_after_attempt, + wait_exponential_jitter, +) + +from graphrag.query.llm.base import BaseTextEmbedding +from graphrag.query.llm.oai.base import OpenAILLMImpl +from graphrag.query.llm.oai.typing import ( + OPENAI_RETRY_ERROR_TYPES, + OpenaiApiType, +) +from graphrag.query.llm.text_utils import chunk_text +from graphrag.query.progress import StatusReporter + + +class OpenAIEmbedding(BaseTextEmbedding, OpenAILLMImpl): + """Wrapper for OpenAI Embedding models.""" + + def __init__( + self, + api_key: str | None = None, + azure_ad_token_provider: Callable | None = None, + model: str = "text-embedding-3-small", + deployment_name: str | None = None, + api_base: str | None = None, + api_version: str | None = None, + api_type: OpenaiApiType = OpenaiApiType.OpenAI, + organization: str | None = None, + encoding_name: str = "cl100k_base", + max_tokens: int = 8191, + max_retries: int = 10, + request_timeout: float = 180.0, + retry_error_types: tuple[type[BaseException]] = OPENAI_RETRY_ERROR_TYPES, # type: ignore + reporter: StatusReporter | None = None, + ): + OpenAILLMImpl.__init__( + self=self, + api_key=api_key, + azure_ad_token_provider=azure_ad_token_provider, + deployment_name=deployment_name, + api_base=api_base, + api_version=api_version, + api_type=api_type, # type: ignore + organization=organization, + max_retries=max_retries, + request_timeout=request_timeout, + reporter=reporter, + ) + + self.model = model + self.encoding_name = encoding_name + self.max_tokens = max_tokens + self.token_encoder = tiktoken.get_encoding(self.encoding_name) + self.retry_error_types = retry_error_types + + def embed(self, text: str, **kwargs: Any) -> list[float]: + """ + Embed text using OpenAI Embedding's sync function. + + For text longer than max_tokens, chunk texts into max_tokens, embed each chunk, then combine using weighted average. + Please refer to: https://github.com/openai/openai-cookbook/blob/main/examples/Embedding_long_inputs.ipynb + """ + token_chunks = chunk_text( + text=text, token_encoder=self.token_encoder, max_tokens=self.max_tokens + ) + chunk_embeddings = [] + chunk_lens = [] + for chunk in token_chunks: + try: + embedding, chunk_len = self._embed_with_retry(chunk, **kwargs) + chunk_embeddings.append(embedding) + chunk_lens.append(chunk_len) + # TODO: catch a more specific exception + except Exception as e: # noqa BLE001 + self._reporter.error( + message="Error embedding chunk", + details={self.__class__.__name__: str(e)}, + ) + + continue + chunk_embeddings = np.average(chunk_embeddings, axis=0, weights=chunk_lens) + chunk_embeddings = chunk_embeddings / np.linalg.norm(chunk_embeddings) + return chunk_embeddings.tolist() + + async def aembed(self, text: str, **kwargs: Any) -> list[float]: + """ + Embed text using OpenAI Embedding's async function. + + For text longer than max_tokens, chunk texts into max_tokens, embed each chunk, then combine using weighted average. + """ + token_chunks = chunk_text( + text=text, token_encoder=self.token_encoder, max_tokens=self.max_tokens + ) + chunk_embeddings = [] + chunk_lens = [] + embedding_results = await asyncio.gather(*[ + self._aembed_with_retry(chunk, **kwargs) for chunk in token_chunks + ]) + embedding_results = [result for result in embedding_results if result[0]] + chunk_embeddings = [result[0] for result in embedding_results] + chunk_lens = [result[1] for result in embedding_results] + chunk_embeddings = np.average(chunk_embeddings, axis=0, weights=chunk_lens) # type: ignore + chunk_embeddings = chunk_embeddings / np.linalg.norm(chunk_embeddings) + return chunk_embeddings.tolist() + + def _embed_with_retry( + self, text: str | tuple, **kwargs: Any + ) -> tuple[list[float], int]: + try: + retryer = Retrying( + stop=stop_after_attempt(self.max_retries), + wait=wait_exponential_jitter(max=10), + reraise=True, + retry=retry_if_exception_type(self.retry_error_types), + ) + for attempt in retryer: + with attempt: + embedding = ( + self.sync_client.embeddings.create( # type: ignore + input=text, + model=self.model, + **kwargs, # type: ignore + ) + .data[0] + .embedding + or [] + ) + return (embedding, len(text)) + except RetryError as e: + self._reporter.error( + message="Error at embed_with_retry()", + details={self.__class__.__name__: str(e)}, + ) + return ([], 0) + else: + # TODO: why not just throw in this case? + return ([], 0) + + async def _aembed_with_retry( + self, text: str | tuple, **kwargs: Any + ) -> tuple[list[float], int]: + try: + retryer = AsyncRetrying( + stop=stop_after_attempt(self.max_retries), + wait=wait_exponential_jitter(max=10), + reraise=True, + retry=retry_if_exception_type(self.retry_error_types), + ) + async for attempt in retryer: + with attempt: + embedding = ( + await self.async_client.embeddings.create( # type: ignore + input=text, + model=self.model, + **kwargs, # type: ignore + ) + ).data[0].embedding or [] + return (embedding, len(text)) + except RetryError as e: + self._reporter.error( + message="Error at embed_with_retry()", + details={self.__class__.__name__: str(e)}, + ) + return ([], 0) + else: + # TODO: why not just throw in this case? + return ([], 0) diff --git a/graphrag/query/llm/oai/openai.py b/graphrag/query/llm/oai/openai.py new file mode 100644 index 00000000..e714709c --- /dev/null +++ b/graphrag/query/llm/oai/openai.py @@ -0,0 +1,171 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""OpenAI Wrappers for Orchestration.""" + +import logging +from typing import Any + +from tenacity import ( + AsyncRetrying, + RetryError, + Retrying, + retry_if_exception_type, + stop_after_attempt, + wait_exponential_jitter, +) + +from graphrag.query.llm.base import BaseLLMCallback +from graphrag.query.llm.oai.base import OpenAILLMImpl +from graphrag.query.llm.oai.typing import ( + OPENAI_RETRY_ERROR_TYPES, + OpenaiApiType, +) + +log = logging.getLogger(__name__) + + +class OpenAI(OpenAILLMImpl): + """Wrapper for OpenAI Completion models.""" + + def __init__( + self, + api_key: str, + model: str, + deployment_name: str | None = None, + api_base: str | None = None, + api_version: str | None = None, + api_type: OpenaiApiType = OpenaiApiType.OpenAI, + organization: str | None = None, + max_retries: int = 10, + retry_error_types: tuple[type[BaseException]] = OPENAI_RETRY_ERROR_TYPES, # type: ignore + ): + self.api_key = api_key + self.model = model + self.deployment_name = deployment_name + self.api_base = api_base + self.api_version = api_version + self.api_type = api_type + self.organization = organization + self.max_retries = max_retries + self.retry_error_types = retry_error_types + + def generate( + self, + messages: str | list[str], + streaming: bool = True, + callbacks: list[BaseLLMCallback] | None = None, + **kwargs: Any, + ) -> str: + """Generate text.""" + try: + retryer = Retrying( + stop=stop_after_attempt(self.max_retries), + wait=wait_exponential_jitter(max=10), + reraise=True, + retry=retry_if_exception_type(self.retry_error_types), + ) + for attempt in retryer: + with attempt: + return self._generate( + messages=messages, + streaming=streaming, + callbacks=callbacks, + **kwargs, + ) + except RetryError: + log.exception("RetryError at generate(): %s") + return "" + else: + # TODO: why not just throw in this case? + return "" + + async def agenerate( + self, + messages: str | list[str], + streaming: bool = True, + callbacks: list[BaseLLMCallback] | None = None, + **kwargs: Any, + ) -> str: + """Generate Text Asynchronously.""" + try: + retryer = AsyncRetrying( + stop=stop_after_attempt(self.max_retries), + wait=wait_exponential_jitter(max=10), + reraise=True, + retry=retry_if_exception_type(self.retry_error_types), + ) + async for attempt in retryer: + with attempt: + return await self._agenerate( + messages=messages, + streaming=streaming, + callbacks=callbacks, + **kwargs, + ) + except RetryError: + log.exception("Error at agenerate()") + return "" + else: + # TODO: why not just throw in this case? + return "" + + def _generate( + self, + messages: str | list[str], + streaming: bool = True, + callbacks: list[BaseLLMCallback] | None = None, + **kwargs: Any, + ) -> str: + response = self.sync_client.chat.completions.create( # type: ignore + model=self.model, + messages=messages, # type: ignore + stream=streaming, + **kwargs, + ) # type: ignore + if streaming: + full_response = "" + while True: + try: + chunk = response.__next__() # type: ignore + delta = chunk.choices[0].delta.content or "" # type: ignore + full_response += delta + if callbacks: + for callback in callbacks: + callback.on_llm_new_token(delta) + if chunk.choices[0].finish_reason == "stop": # type: ignore + break + except StopIteration: + break + return full_response + return response.choices[0].message.content or "" # type: ignore + + async def _agenerate( + self, + messages: str | list[str], + streaming: bool = True, + callbacks: list[BaseLLMCallback] | None = None, + **kwargs: Any, + ) -> str: + response = await self.async_client.chat.completions.create( # type: ignore + model=self.model, + messages=messages, # type: ignore + stream=streaming, + **kwargs, + ) + if streaming: + full_response = "" + while True: + try: + chunk = await response.__anext__() # type: ignore + delta = chunk.choices[0].delta.content or "" # type: ignore + full_response += delta + if callbacks: + for callback in callbacks: + callback.on_llm_new_token(delta) + if chunk.choices[0].finish_reason == "stop": # type: ignore + break + except StopIteration: + break + return full_response + return response.choices[0].message.content or "" # type: ignore diff --git a/graphrag/query/llm/oai/typing.py b/graphrag/query/llm/oai/typing.py new file mode 100644 index 00000000..399a82f6 --- /dev/null +++ b/graphrag/query/llm/oai/typing.py @@ -0,0 +1,23 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""OpenAI wrapper options.""" + +from enum import Enum +from typing import Any, cast + +import openai + +OPENAI_RETRY_ERROR_TYPES = ( + # TODO: update these when we update to OpenAI 1+ library + cast(Any, openai).RateLimitError, + cast(Any, openai).APIConnectionError, + # TODO: replace with comparable OpenAI 1+ error +) + + +class OpenaiApiType(str, Enum): + """The OpenAI Flavor.""" + + OpenAI = "openai" + AzureOpenAI = "azure" diff --git a/graphrag/query/llm/text_utils.py b/graphrag/query/llm/text_utils.py new file mode 100644 index 00000000..d60e6304 --- /dev/null +++ b/graphrag/query/llm/text_utils.py @@ -0,0 +1,42 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Text Utilities for LLM.""" + +from collections.abc import Iterator +from itertools import islice + +import tiktoken + + +def num_tokens(text: str, token_encoder: tiktoken.Encoding | None = None) -> int: + """Return the number of tokens in the given text.""" + if token_encoder is None: + token_encoder = tiktoken.get_encoding("cl100k_base") + return len(token_encoder.encode(text)) # type: ignore + + +def batched(iterable: Iterator, n: int): + """ + Batch data into tuples of length n. The last batch may be shorter. + + Taken from Python's cookbook: https://docs.python.org/3/library/itertools.html#itertools.batched + """ + # batched('ABCDEFG', 3) --> ABC DEF G + if n < 1: + value_error = "n must be at least one" + raise ValueError(value_error) + it = iter(iterable) + while batch := tuple(islice(it, n)): + yield batch + + +def chunk_text( + text: str, max_tokens: int, token_encoder: tiktoken.Encoding | None = None +): + """Chunk text by token length.""" + if token_encoder is None: + token_encoder = tiktoken.get_encoding("cl100k_base") + tokens = token_encoder.encode(text) # type: ignore + chunk_iterator = batched(iter(tokens), max_tokens) + yield from chunk_iterator diff --git a/graphrag/query/progress.py b/graphrag/query/progress.py new file mode 100644 index 00000000..ad5bcee7 --- /dev/null +++ b/graphrag/query/progress.py @@ -0,0 +1,43 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Status Reporter for orchestration.""" + +from abc import ABCMeta, abstractmethod +from typing import Any + + +class StatusReporter(metaclass=ABCMeta): + """Provides a way to report status updates from the pipeline.""" + + @abstractmethod + def error(self, message: str, details: dict[str, Any] | None = None): + """Report an error.""" + + @abstractmethod + def warning(self, message: str, details: dict[str, Any] | None = None): + """Report a warning.""" + + @abstractmethod + def log(self, message: str, details: dict[str, Any] | None = None): + """Report a log.""" + + +class ConsoleStatusReporter(StatusReporter): + """A reporter that writes to a console.""" + + def error(self, message: str, details: dict[str, Any] | None = None): + """Report an error.""" + print(message, details) # noqa T201 + + def warning(self, message: str, details: dict[str, Any] | None = None): + """Report a warning.""" + _print_warning(message) + + def log(self, message: str, details: dict[str, Any] | None = None): + """Report a log.""" + print(message, details) # noqa T201 + + +def _print_warning(skk): + print(f"\033[93m {skk}\033[00m") # noqa T201 diff --git a/graphrag/query/question_gen/__init__.py b/graphrag/query/question_gen/__init__.py new file mode 100644 index 00000000..d7329277 --- /dev/null +++ b/graphrag/query/question_gen/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Question Generation Module.""" diff --git a/graphrag/query/question_gen/base.py b/graphrag/query/question_gen/base.py new file mode 100644 index 00000000..959b63d7 --- /dev/null +++ b/graphrag/query/question_gen/base.py @@ -0,0 +1,65 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Base classes for generating questions based on previously asked questions and most recent context data.""" + +from abc import ABC, abstractmethod +from dataclasses import dataclass +from typing import Any + +import tiktoken + +from graphrag.query.context_builder.builders import ( + GlobalContextBuilder, + LocalContextBuilder, +) +from graphrag.query.llm.base import BaseLLM + + +@dataclass +class QuestionResult: + """A Structured Question Result.""" + + response: list[str] + context_data: str | dict[str, Any] + completion_time: float + llm_calls: int + prompt_tokens: int + + +class BaseQuestionGen(ABC): + """The Base Question Gen implementation.""" + + def __init__( + self, + llm: BaseLLM, + context_builder: GlobalContextBuilder | LocalContextBuilder, + token_encoder: tiktoken.Encoding | None = None, + llm_params: dict[str, Any] | None = None, + context_builder_params: dict[str, Any] | None = None, + ): + self.llm = llm + self.context_builder = context_builder + self.token_encoder = token_encoder + self.llm_params = llm_params or {} + self.context_builder_params = context_builder_params or {} + + @abstractmethod + def generate( + self, + question_history: list[str], + context_data: str | None, + question_count: int, + **kwargs, + ) -> QuestionResult: + """Generate questions.""" + + @abstractmethod + async def agenerate( + self, + question_history: list[str], + context_data: str | None, + question_count: int, + **kwargs, + ) -> QuestionResult: + """Generate questions asynchronously.""" diff --git a/graphrag/query/question_gen/local_gen.py b/graphrag/query/question_gen/local_gen.py new file mode 100644 index 00000000..ca703a66 --- /dev/null +++ b/graphrag/query/question_gen/local_gen.py @@ -0,0 +1,194 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Local question generation.""" + +import logging +import time +from typing import Any + +import tiktoken + +from graphrag.query.context_builder.builders import LocalContextBuilder +from graphrag.query.context_builder.conversation_history import ( + ConversationHistory, +) +from graphrag.query.llm.base import BaseLLM, BaseLLMCallback +from graphrag.query.llm.text_utils import num_tokens +from graphrag.query.question_gen.base import BaseQuestionGen, QuestionResult +from graphrag.query.question_gen.system_prompt import QUESTION_SYSTEM_PROMPT + +log = logging.getLogger(__name__) + + +class LocalQuestionGen(BaseQuestionGen): + """Search orchestration for global search mode.""" + + def __init__( + self, + llm: BaseLLM, + context_builder: LocalContextBuilder, + token_encoder: tiktoken.Encoding | None = None, + system_prompt: str = QUESTION_SYSTEM_PROMPT, + callbacks: list[BaseLLMCallback] | None = None, + llm_params: dict[str, Any] | None = None, + context_builder_params: dict[str, Any] | None = None, + ): + super().__init__( + llm=llm, + context_builder=context_builder, + token_encoder=token_encoder, + llm_params=llm_params, + context_builder_params=context_builder_params, + ) + self.system_prompt = system_prompt + self.callbacks = callbacks + + async def agenerate( + self, + question_history: list[str], + context_data: str | None, + question_count: int, + **kwargs, + ) -> QuestionResult: + """ + Generate a question based on the question history and context data. + + If context data is not provided, it will be generated by the local context builder + """ + start_time = time.time() + + if len(question_history) == 0: + question_text = "" + conversation_history = None + else: + # construct current query and conversation history + question_text = question_history[-1] + history = [ + {"role": "user", "content": query} for query in question_history[:-1] + ] + conversation_history = ConversationHistory.from_list(history) + + if context_data is None: + # generate context data based on the question history + context_data, context_records = self.context_builder.build_context( + query=question_text, + conversation_history=conversation_history, + **kwargs, + **self.context_builder_params, + ) # type: ignore + else: + context_records = {"context_data": context_data} + log.info("GENERATE QUESTION: %s. LAST QUESTION: %s", start_time, question_text) + system_prompt = "" + try: + system_prompt = self.system_prompt.format( + context_data=context_data, question_count=question_count + ) + question_messages = [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": question_text}, + ] + + response = await self.llm.agenerate( + messages=question_messages, + streaming=True, + callbacks=self.callbacks, + **self.llm_params, + ) + + return QuestionResult( + response=response.split("\n"), + context_data={ + "question_context": question_text, + **context_records, + }, + completion_time=time.time() - start_time, + llm_calls=1, + prompt_tokens=num_tokens(system_prompt, self.token_encoder), + ) + + except Exception: + log.exception("Exception in generating question") + return QuestionResult( + response=[], + context_data=context_records, + completion_time=time.time() - start_time, + llm_calls=1, + prompt_tokens=num_tokens(system_prompt, self.token_encoder), + ) + + def generate( + self, + question_history: list[str], + context_data: str | None, + question_count: int, + **kwargs, + ) -> QuestionResult: + """ + Generate a question based on the question history and context data. + + If context data is not provided, it will be generated by the local context builder + """ + start_time = time.time() + if len(question_history) == 0: + question_text = "" + conversation_history = None + else: + # construct current query and conversation history + question_text = question_history[-1] + history = [ + {"role": "user", "content": query} for query in question_history[:-1] + ] + conversation_history = ConversationHistory.from_list(history) + + if context_data is None: + # generate context data based on the question history + context_data, context_records = self.context_builder.build_context( + query=question_text, + conversation_history=conversation_history, + **kwargs, + **self.context_builder_params, + ) # type: ignore + else: + context_records = {"context_data": context_data} + log.info( + "GENERATE QUESTION: %s. QUESTION HISTORY: %s", start_time, question_text + ) + system_prompt = "" + try: + system_prompt = self.system_prompt.format( + context_data=context_data, question_count=question_count + ) + question_messages = [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": question_text}, + ] + + response = self.llm.generate( + messages=question_messages, + streaming=True, + callbacks=self.callbacks, + **self.llm_params, + ) + + return QuestionResult( + response=response.split("\n"), + context_data={ + "question_context": question_text, + **context_records, + }, + completion_time=time.time() - start_time, + llm_calls=1, + prompt_tokens=num_tokens(system_prompt, self.token_encoder), + ) + + except Exception: + log.exception("Exception in generating questions") + return QuestionResult( + response=[], + context_data=context_records, + completion_time=time.time() - start_time, + llm_calls=1, + prompt_tokens=num_tokens(system_prompt, self.token_encoder), + ) diff --git a/graphrag/query/question_gen/system_prompt.py b/graphrag/query/question_gen/system_prompt.py new file mode 100644 index 00000000..904ede24 --- /dev/null +++ b/graphrag/query/question_gen/system_prompt.py @@ -0,0 +1,28 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Question Generation system prompts.""" + +QUESTION_SYSTEM_PROMPT = """ +---Role--- + +You are a helpful assistant generating a bulleted list of {question_count} questions about data in the tables provided. + + +---Data tables--- + +{context_data} + + +---Goal--- + +Given a series of example questions provided by the user, generate a bulleted list of {question_count} candidates for the next question. Use - marks as bullet points. + +These candidate questions should represent the most important or urgent information content or themes in the data tables. + +The candidate questions should be answerable using the data tables provided, but should not mention any specific data fields or data tables in the question text. + +If the user's questions reference several named entities, then each candidate question should reference all named entities. + +---Example questions--- +""" diff --git a/graphrag/query/structured_search/__init__.py b/graphrag/query/structured_search/__init__.py new file mode 100644 index 00000000..b41baaf3 --- /dev/null +++ b/graphrag/query/structured_search/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Structured Search package.""" diff --git a/graphrag/query/structured_search/base.py b/graphrag/query/structured_search/base.py new file mode 100644 index 00000000..6dd02485 --- /dev/null +++ b/graphrag/query/structured_search/base.py @@ -0,0 +1,69 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Base classes for search algos.""" + +from abc import ABC, abstractmethod +from dataclasses import dataclass +from typing import Any + +import pandas as pd +import tiktoken + +from graphrag.query.context_builder.builders import ( + GlobalContextBuilder, + LocalContextBuilder, +) +from graphrag.query.context_builder.conversation_history import ( + ConversationHistory, +) +from graphrag.query.llm.base import BaseLLM + + +@dataclass +class SearchResult: + """A Structured Search Result.""" + + response: str | dict[str, Any] | list[dict[str, Any]] + context_data: str | list[pd.DataFrame] | dict[str, pd.DataFrame] + # actual text strings that are in the context window, built from context_data + context_text: str | list[str] | dict[str, str] + completion_time: float + llm_calls: int + prompt_tokens: int + + +class BaseSearch(ABC): + """The Base Search implementation.""" + + def __init__( + self, + llm: BaseLLM, + context_builder: GlobalContextBuilder | LocalContextBuilder, + token_encoder: tiktoken.Encoding | None = None, + llm_params: dict[str, Any] | None = None, + context_builder_params: dict[str, Any] | None = None, + ): + self.llm = llm + self.context_builder = context_builder + self.token_encoder = token_encoder + self.llm_params = llm_params or {} + self.context_builder_params = context_builder_params or {} + + @abstractmethod + def search( + self, + query: str, + conversation_history: ConversationHistory | None = None, + **kwargs, + ) -> SearchResult: + """Search for the given query.""" + + @abstractmethod + async def asearch( + self, + query: str, + conversation_history: ConversationHistory | None = None, + **kwargs, + ) -> SearchResult: + """Search for the given query asynchronously.""" diff --git a/graphrag/query/structured_search/global_search/__init__.py b/graphrag/query/structured_search/global_search/__init__.py new file mode 100644 index 00000000..ba73b609 --- /dev/null +++ b/graphrag/query/structured_search/global_search/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""GlobalSearch module.""" diff --git a/graphrag/query/structured_search/global_search/callbacks.py b/graphrag/query/structured_search/global_search/callbacks.py new file mode 100644 index 00000000..f48bb79b --- /dev/null +++ b/graphrag/query/structured_search/global_search/callbacks.py @@ -0,0 +1,24 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""GlobalSearch LLM Callbacks.""" + +from graphrag.query.llm.base import BaseLLMCallback +from graphrag.query.structured_search.base import SearchResult + + +class GlobalSearchLLMCallback(BaseLLMCallback): + """GlobalSearch LLM Callbacks.""" + + def __init__(self): + super().__init__() + self.map_response_contexts = [] + self.map_response_outputs = [] + + def on_map_response_start(self, map_response_contexts: list[str]): + """Handle the start of map response.""" + self.map_response_contexts = map_response_contexts + + def on_map_response_end(self, map_response_outputs: list[SearchResult]): + """Handle the end of map response.""" + self.map_response_outputs = map_response_outputs diff --git a/graphrag/query/structured_search/global_search/community_context.py b/graphrag/query/structured_search/global_search/community_context.py new file mode 100644 index 00000000..d63320c8 --- /dev/null +++ b/graphrag/query/structured_search/global_search/community_context.py @@ -0,0 +1,99 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Contains algorithms to build context data for global search prompt.""" + +from typing import Any + +import pandas as pd +import tiktoken + +from graphrag.model import CommunityReport, Entity +from graphrag.query.context_builder.community_context import ( + build_community_context, +) +from graphrag.query.context_builder.conversation_history import ( + ConversationHistory, +) +from graphrag.query.structured_search.base import GlobalContextBuilder + + +class GlobalCommunityContext(GlobalContextBuilder): + """GlobalSearch community context builder.""" + + def __init__( + self, + community_reports: list[CommunityReport], + entities: list[Entity] | None = None, + token_encoder: tiktoken.Encoding | None = None, + random_state: int = 86, + ): + self.community_reports = community_reports + self.entities = entities + self.token_encoder = token_encoder + self.random_state = random_state + + def build_context( + self, + conversation_history: ConversationHistory | None = None, + use_community_summary: bool = True, + column_delimiter: str = "|", + shuffle_data: bool = True, + include_community_rank: bool = False, + min_community_rank: int = 0, + community_rank_name: str = "rank", + include_community_weight: bool = True, + community_weight_name: str = "occurrence", + normalize_community_weight: bool = True, + max_tokens: int = 8000, + context_name: str = "Reports", + conversation_history_user_turns_only: bool = True, + conversation_history_max_turns: int | None = 5, + **kwargs: Any, + ) -> tuple[str | list[str], dict[str, pd.DataFrame]]: + """Prepare batches of community report data table as context data for global search.""" + conversation_history_context = "" + final_context_data = {} + if conversation_history: + # build conversation history context + ( + conversation_history_context, + conversation_history_context_data, + ) = conversation_history.build_context( + include_user_turns_only=conversation_history_user_turns_only, + max_qa_turns=conversation_history_max_turns, + column_delimiter=column_delimiter, + max_tokens=max_tokens, + recency_bias=False, + ) + if conversation_history_context != "": + final_context_data = conversation_history_context_data + + community_context, community_context_data = build_community_context( + community_reports=self.community_reports, + entities=self.entities, + token_encoder=self.token_encoder, + use_community_summary=use_community_summary, + column_delimiter=column_delimiter, + shuffle_data=shuffle_data, + include_community_rank=include_community_rank, + min_community_rank=min_community_rank, + community_rank_name=community_rank_name, + include_community_weight=include_community_weight, + community_weight_name=community_weight_name, + normalize_community_weight=normalize_community_weight, + max_tokens=max_tokens, + single_batch=False, + context_name=context_name, + random_state=self.random_state, + ) + if isinstance(community_context, list): + final_context = [ + f"{conversation_history_context}\n\n{context}" + for context in community_context + ] + else: + final_context = f"{conversation_history_context}\n\n{community_context}" + + final_context_data.update(community_context_data) + return (final_context, final_context_data) diff --git a/graphrag/query/structured_search/global_search/map_system_prompt.py b/graphrag/query/structured_search/global_search/map_system_prompt.py new file mode 100644 index 00000000..db1a649d --- /dev/null +++ b/graphrag/query/structured_search/global_search/map_system_prompt.py @@ -0,0 +1,82 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""System prompts for global search.""" + +MAP_SYSTEM_PROMPT = """ +---Role--- + +You are a helpful assistant responding to questions about data in the tables provided. + + +---Goal--- + +Generate a response consisting of a list of key points that responds to the user's question, summarizing all relevant information in the input data tables. + +You should use the data provided in the data tables below as the primary context for generating the response. +If you don't know the answer or if the input data tables do not contain sufficient information to provide an answer, just say so. Do not make anything up. + +Each key point in the response should have the following element: +- Description: A comprehensive description of the point. +- Importance Score: An integer score between 0-100 that indicates how important the point is in answering the user's question. An 'I don't know' type of response should have a score of 0. + +The response should be JSON formatted as follows: +{{ + "points": [ + {{"description": "Description of point 1 [Data: Reports (report ids)]", "score": score_value}}, + {{"description": "Description of point 2 [Data: Reports (report ids)]", "score": score_value}} + ] +}} + +The response shall preserve the original meaning and use of modal verbs such as "shall", "may" or "will". + +Points supported by data should list the relevant reports as references as follows: +"This is an example sentence supported by data references [Data: Reports (report ids)]" + +**Do not list more than 5 record ids in a single reference**. Instead, list the top 5 most relevant record ids and add "+more" to indicate that there are more. + +For example: +"Person X is the owner of Company Y and subject to many allegations of wrongdoing [Data: Reports (2, 7, 64, 46, 34, +more)]. He is also CEO of company X [Data: Reports (1, 3)]" + +where 1, 2, 3, 7, 34, 46, and 64 represent the id (not the index) of the relevant data report in the provided tables. + +Do not include information where the supporting evidence for it is not provided. + + +---Data tables--- + +{context_data} + +---Goal--- + +Generate a response consisting of a list of key points that responds to the user's question, summarizing all relevant information in the input data tables. + +You should use the data provided in the data tables below as the primary context for generating the response. +If you don't know the answer or if the input data tables do not contain sufficient information to provide an answer, just say so. Do not make anything up. + +Each key point in the response should have the following element: +- Description: A comprehensive description of the point. +- Importance Score: An integer score between 0-100 that indicates how important the point is in answering the user's question. An 'I don't know' type of response should have a score of 0. + +The response shall preserve the original meaning and use of modal verbs such as "shall", "may" or "will". + +Points supported by data should list the relevant reports as references as follows: +"This is an example sentence supported by data references [Data: Reports (report ids)]" + +**Do not list more than 5 record ids in a single reference**. Instead, list the top 5 most relevant record ids and add "+more" to indicate that there are more. + +For example: +"Person X is the owner of Company Y and subject to many allegations of wrongdoing [Data: Reports (2, 7, 64, 46, 34, +more)]. He is also CEO of company X [Data: Reports (1, 3)]" + +where 1, 2, 3, 7, 34, 46, and 64 represent the id (not the index) of the relevant data report in the provided tables. + +Do not include information where the supporting evidence for it is not provided. + +The response should be JSON formatted as follows: +{{ + "points": [ + {{"description": "Description of point 1 [Data: Reports (report ids)]", "score": score_value}}, + {{"description": "Description of point 2 [Data: Reports (report ids)]", "score": score_value}} + ] +}} +""" diff --git a/graphrag/query/structured_search/global_search/reduce_system_prompt.py b/graphrag/query/structured_search/global_search/reduce_system_prompt.py new file mode 100644 index 00000000..70171781 --- /dev/null +++ b/graphrag/query/structured_search/global_search/reduce_system_prompt.py @@ -0,0 +1,88 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Global Search system prompts.""" + +REDUCE_SYSTEM_PROMPT = """ +---Role--- + +You are a helpful assistant responding to questions about a dataset by synthesizing perspectives from multiple analysts. + + +---Goal--- + +Generate a response of the target length and format that responds to the user's question, summarize all the reports from multiple analysts who focused on different parts of the dataset. + +Note that the analysts' reports provided below are ranked in the **descending order of importance**. + +If you don't know the answer or if the provided reports do not contain sufficient information to provide an answer, just say so. Do not make anything up. + +The final response should remove all irrelevant information from the analysts' reports and merge the cleaned information into a comprehensive answer that provides explanations of all the key points and implications appropriate for the response length and format. + +Add sections and commentary to the response as appropriate for the length and format. Style the response in markdown. + +The response shall preserve the original meaning and use of modal verbs such as "shall", "may" or "will". + +The response should also preserve all the data references previously included in the analysts' reports, but do not mention the roles of multiple analysts in the analysis process. + +**Do not list more than 5 record ids in a single reference**. Instead, list the top 5 most relevant record ids and add "+more" to indicate that there are more. + +For example: + +"Person X is the owner of Company Y and subject to many allegations of wrongdoing [Data: Reports (2, 7, 34, 46, 64, +more)]. He is also CEO of company X [Data: Reports (1, 3)]" + +where 1, 2, 3, 7, 34, 46, and 64 represent the id (not the index) of the relevant data record. + +Do not include information where the supporting evidence for it is not provided. + + +---Target response length and format--- + +{response_type} + + +---Analyst Reports--- + +{report_data} + + +---Goal--- + +Generate a response of the target length and format that responds to the user's question, summarize all the reports from multiple analysts who focused on different parts of the dataset. + +Note that the analysts' reports provided below are ranked in the **descending order of importance**. + +If you don't know the answer or if the provided reports do not contain sufficient information to provide an answer, just say so. Do not make anything up. + +The final response should remove all irrelevant information from the analysts' reports and merge the cleaned information into a comprehensive answer that provides explanations of all the key points and implications appropriate for the response length and format. + +The response shall preserve the original meaning and use of modal verbs such as "shall", "may" or "will". + +The response should also preserve all the data references previously included in the analysts' reports, but do not mention the roles of multiple analysts in the analysis process. + +**Do not list more than 5 record ids in a single reference**. Instead, list the top 5 most relevant record ids and add "+more" to indicate that there are more. + +For example: + +"Person X is the owner of Company Y and subject to many allegations of wrongdoing [Data: Reports (2, 7, 34, 46, 64, +more)]. He is also CEO of company X [Data: Reports (1, 3)]" + +where 1, 2, 3, 7, 34, 46, and 64 represent the id (not the index) of the relevant data record. + +Do not include information where the supporting evidence for it is not provided. + + +---Target response length and format--- + +{response_type} + +Add sections and commentary to the response as appropriate for the length and format. Style the response in markdown. +""" + +NO_DATA_ANSWER = ( + "I am sorry but I am unable to answer this question given the provided data." +) + +GENERAL_KNOWLEDGE_INSTRUCTION = """ +The response may also include relevant real-world knowledge outside the dataset, but it must be explicitly annotated with a verification tag [LLM: verify]. For example: +"This is an example sentence supported by real-world knowledge [LLM: verify]." +""" diff --git a/graphrag/query/structured_search/global_search/search.py b/graphrag/query/structured_search/global_search/search.py new file mode 100644 index 00000000..3b52ecbd --- /dev/null +++ b/graphrag/query/structured_search/global_search/search.py @@ -0,0 +1,347 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The GlobalSearch Implementation.""" + +import asyncio +import json +import logging +import time +from dataclasses import dataclass +from typing import Any + +import pandas as pd +import tiktoken + +from graphrag.index.utils.json import clean_up_json +from graphrag.query.context_builder.builders import GlobalContextBuilder +from graphrag.query.context_builder.conversation_history import ( + ConversationHistory, +) +from graphrag.query.llm.base import BaseLLM +from graphrag.query.llm.text_utils import num_tokens +from graphrag.query.structured_search.base import BaseSearch, SearchResult +from graphrag.query.structured_search.global_search.callbacks import ( + GlobalSearchLLMCallback, +) +from graphrag.query.structured_search.global_search.map_system_prompt import ( + MAP_SYSTEM_PROMPT, +) +from graphrag.query.structured_search.global_search.reduce_system_prompt import ( + GENERAL_KNOWLEDGE_INSTRUCTION, + NO_DATA_ANSWER, + REDUCE_SYSTEM_PROMPT, +) + +DEFAULT_MAP_LLM_PARAMS = { + "max_tokens": 1000, + "temperature": 0.0, +} + +DEFAULT_REDUCE_LLM_PARAMS = { + "max_tokens": 2000, + "temperature": 0.0, +} + +log = logging.getLogger(__name__) + + +@dataclass +class GlobalSearchResult(SearchResult): + """A GlobalSearch result.""" + + map_responses: list[SearchResult] + reduce_context_data: str | list[pd.DataFrame] | dict[str, pd.DataFrame] + reduce_context_text: str | list[str] | dict[str, str] + + +class GlobalSearch(BaseSearch): + """Search orchestration for global search mode.""" + + def __init__( + self, + llm: BaseLLM, + context_builder: GlobalContextBuilder, + token_encoder: tiktoken.Encoding | None = None, + map_system_prompt: str = MAP_SYSTEM_PROMPT, + reduce_system_prompt: str = REDUCE_SYSTEM_PROMPT, + response_type: str = "multiple paragraphs", + allow_general_knowledge: bool = False, + general_knowledge_inclusion_prompt: str = GENERAL_KNOWLEDGE_INSTRUCTION, + json_mode: bool = True, + callbacks: list[GlobalSearchLLMCallback] | None = None, + max_data_tokens: int = 8000, + map_llm_params: dict[str, Any] = DEFAULT_MAP_LLM_PARAMS, + reduce_llm_params: dict[str, Any] = DEFAULT_REDUCE_LLM_PARAMS, + context_builder_params: dict[str, Any] | None = None, + concurrent_coroutines: int = 32, + ): + super().__init__( + llm=llm, + context_builder=context_builder, + token_encoder=token_encoder, + context_builder_params=context_builder_params, + ) + self.map_system_prompt = map_system_prompt + self.reduce_system_prompt = reduce_system_prompt + self.response_type = response_type + self.allow_general_knowledge = allow_general_knowledge + self.general_knowledge_inclusion_prompt = general_knowledge_inclusion_prompt + self.callbacks = callbacks + self.max_data_tokens = max_data_tokens + + self.map_llm_params = map_llm_params + self.reduce_llm_params = reduce_llm_params + if json_mode: + self.map_llm_params["response_format"] = {"type": "json_object"} + else: + # remove response_format key if json_mode is False + self.map_llm_params.pop("response_format", None) + + self.semaphore = asyncio.Semaphore(concurrent_coroutines) + + async def asearch( + self, + query: str, + conversation_history: ConversationHistory | None = None, + **kwargs: Any, + ) -> GlobalSearchResult: + """ + Perform a global search. + + Global search mode includes two steps: + + - Step 1: Run parallel LLM calls on communities' short summaries to generate answer for each batch + - Step 2: Combine the answers from step 2 to generate the final answer + """ + # Step 1: Generate answers for each batch of community short summaries + start_time = time.time() + context_chunks, context_records = self.context_builder.build_context( + conversation_history=conversation_history, **self.context_builder_params + ) + + if self.callbacks: + for callback in self.callbacks: + callback.on_map_response_start(context_chunks) # type: ignore + map_responses = await asyncio.gather(*[ + self._map_response_single_batch( + context_data=data, query=query, **self.map_llm_params + ) + for data in context_chunks + ]) + if self.callbacks: + for callback in self.callbacks: + callback.on_map_response_end(map_responses) + map_llm_calls = sum(response.llm_calls for response in map_responses) + map_prompt_tokens = sum(response.prompt_tokens for response in map_responses) + + # Step 2: Combine the intermediate answers from step 2 to generate the final answer + reduce_response = await self._reduce_response( + map_responses=map_responses, + query=query, + **self.reduce_llm_params, + ) + + return GlobalSearchResult( + response=reduce_response.response, + context_data=context_records, + context_text=context_chunks, + map_responses=map_responses, + reduce_context_data=reduce_response.context_data, + reduce_context_text=reduce_response.context_text, + completion_time=time.time() - start_time, + llm_calls=map_llm_calls + reduce_response.llm_calls, + prompt_tokens=map_prompt_tokens + reduce_response.prompt_tokens, + ) + + def search( + self, + query: str, + conversation_history: ConversationHistory | None = None, + **kwargs: Any, + ) -> GlobalSearchResult: + """Perform a global search synchronously.""" + return asyncio.run(self.asearch(query, conversation_history)) + + async def _map_response_single_batch( + self, + context_data: str, + query: str, + **llm_kwargs, + ) -> SearchResult: + """Generate answer for a single chunk of community reports.""" + start_time = time.time() + search_prompt = "" + try: + search_prompt = self.map_system_prompt.format(context_data=context_data) + search_messages = [ + {"role": "system", "content": search_prompt}, + {"role": "user", "content": query}, + ] + async with self.semaphore: + search_response = await self.llm.agenerate( + messages=search_messages, streaming=False, **llm_kwargs + ) + log.info("Map response: %s", search_response) + try: + # parse search response json + processed_response = self.parse_search_response(search_response) + except ValueError: + # Clean up and retry parse + search_response = clean_up_json(search_response) + try: + # parse search response json + processed_response = self.parse_search_response(search_response) + except ValueError: + log.exception("Error parsing search response json") + processed_response = [] + + return SearchResult( + response=processed_response, + context_data=context_data, + context_text=context_data, + completion_time=time.time() - start_time, + llm_calls=1, + prompt_tokens=num_tokens(search_prompt, self.token_encoder), + ) + + except Exception: + log.exception("Exception in _map_response_single_batch") + return SearchResult( + response=[{"answer": "", "score": 0}], + context_data=context_data, + context_text=context_data, + completion_time=time.time() - start_time, + llm_calls=1, + prompt_tokens=num_tokens(search_prompt, self.token_encoder), + ) + + def parse_search_response(self, search_response: str) -> list[dict[str, Any]]: + """Parse the search response json and return a list of key points. + + Parameters + ---------- + search_response: str + The search response json string + + Returns + ------- + list[dict[str, Any]] + A list of key points, each key point is a dictionary with "answer" and "score" keys + """ + parsed_elements = json.loads(search_response)["points"] + return [ + { + "answer": element["description"], + "score": int(element["score"]), + } + for element in parsed_elements + ] + + async def _reduce_response( + self, + map_responses: list[SearchResult], + query: str, + **llm_kwargs, + ) -> SearchResult: + """Combine all intermediate responses from single batches into a final answer to the user query.""" + text_data = "" + search_prompt = "" + start_time = time.time() + try: + # collect all key points into a single list to prepare for sorting + key_points = [] + for index, response in enumerate(map_responses): + if not isinstance(response.response, list): + continue + for element in response.response: + if not isinstance(element, dict): + continue + if "answer" not in element or "score" not in element: + continue + key_points.append({ + "analyst": index, + "answer": element["answer"], + "score": element["score"], + }) + + # filter response with score = 0 and rank responses by descending order of score + filtered_key_points = [ + point + for point in key_points + if point["score"] > 0 # type: ignore + ] + + if len(filtered_key_points) == 0 and not self.allow_general_knowledge: + # return no data answer if no key points are found + return SearchResult( + response=NO_DATA_ANSWER, + context_data="", + context_text="", + completion_time=time.time() - start_time, + llm_calls=0, + prompt_tokens=0, + ) + + filtered_key_points = sorted( + filtered_key_points, + key=lambda x: x["score"], # type: ignore + reverse=True, # type: ignore + ) + + data = [] + total_tokens = 0 + for point in filtered_key_points: + formatted_response_data = [] + formatted_response_data.append( + f'----Analyst {point["analyst"] + 1}----' + ) + formatted_response_data.append( + f'Importance Score: {point["score"]}' # type: ignore + ) + formatted_response_data.append(point["answer"]) # type: ignore + formatted_response_text = "\n".join(formatted_response_data) + if ( + total_tokens + + num_tokens(formatted_response_text, self.token_encoder) + > self.max_data_tokens + ): + break + data.append(formatted_response_text) + total_tokens += num_tokens(formatted_response_text, self.token_encoder) + text_data = "\n\n".join(data) + + search_prompt = self.reduce_system_prompt.format( + report_data=text_data, response_type=self.response_type + ) + if self.allow_general_knowledge: + search_prompt += "\n" + self.general_knowledge_inclusion_prompt + search_messages = [ + {"role": "system", "content": search_prompt}, + {"role": "user", "content": query}, + ] + + search_response = await self.llm.agenerate( + search_messages, + streaming=True, + callbacks=self.callbacks, # type: ignore + **llm_kwargs, # type: ignore + ) + return SearchResult( + response=search_response, + context_data=text_data, + context_text=text_data, + completion_time=time.time() - start_time, + llm_calls=1, + prompt_tokens=num_tokens(search_prompt, self.token_encoder), + ) + except Exception: + log.exception("Exception in reduce_response") + return SearchResult( + response="", + context_data=text_data, + context_text=text_data, + completion_time=time.time() - start_time, + llm_calls=1, + prompt_tokens=num_tokens(search_prompt, self.token_encoder), + ) diff --git a/graphrag/query/structured_search/local_search/__init__.py b/graphrag/query/structured_search/local_search/__init__.py new file mode 100644 index 00000000..8b8b1e79 --- /dev/null +++ b/graphrag/query/structured_search/local_search/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The LocalSearch package.""" diff --git a/graphrag/query/structured_search/local_search/mixed_context.py b/graphrag/query/structured_search/local_search/mixed_context.py new file mode 100644 index 00000000..117101e9 --- /dev/null +++ b/graphrag/query/structured_search/local_search/mixed_context.py @@ -0,0 +1,497 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +"""Algorithms to build context data for local search prompt.""" + +import logging +from typing import Any + +import pandas as pd +import tiktoken + +from graphrag.model import ( + CommunityReport, + Covariate, + Entity, + Relationship, + TextUnit, +) +from graphrag.query.context_builder.community_context import ( + build_community_context, +) +from graphrag.query.context_builder.conversation_history import ( + ConversationHistory, +) +from graphrag.query.context_builder.entity_extraction import ( + EntityVectorStoreKey, + map_query_to_entities, +) +from graphrag.query.context_builder.local_context import ( + build_covariates_context, + build_entity_context, + build_relationship_context, + get_candidate_context, +) +from graphrag.query.context_builder.source_context import ( + build_text_unit_context, + count_relationships, +) +from graphrag.query.input.retrieval.community_reports import ( + get_candidate_communities, +) +from graphrag.query.input.retrieval.text_units import get_candidate_text_units +from graphrag.query.llm.base import BaseTextEmbedding +from graphrag.query.llm.text_utils import num_tokens +from graphrag.query.structured_search.base import LocalContextBuilder +from graphrag.vector_stores import BaseVectorStore + +log = logging.getLogger(__name__) + + +class LocalSearchMixedContext(LocalContextBuilder): + """Build data context for local search prompt combining community reports and entity/relationship/covariate tables.""" + + def __init__( + self, + entities: list[Entity], + entity_text_embeddings: BaseVectorStore, + text_embedder: BaseTextEmbedding, + text_units: list[TextUnit] | None = None, + community_reports: list[CommunityReport] | None = None, + relationships: list[Relationship] | None = None, + covariates: dict[str, list[Covariate]] | None = None, + token_encoder: tiktoken.Encoding | None = None, + embedding_vectorstore_key: str = EntityVectorStoreKey.ID, + ): + if community_reports is None: + community_reports = [] + if relationships is None: + relationships = [] + if covariates is None: + covariates = {} + if text_units is None: + text_units = [] + self.entities = {entity.id: entity for entity in entities} + self.community_reports = { + community.id: community for community in community_reports + } + self.text_units = {unit.id: unit for unit in text_units} + self.relationships = { + relationship.id: relationship for relationship in relationships + } + self.covariates = covariates + self.entity_text_embeddings = entity_text_embeddings + self.text_embedder = text_embedder + self.token_encoder = token_encoder + self.embedding_vectorstore_key = embedding_vectorstore_key + + def filter_by_entity_keys(self, entity_keys: list[int] | list[str]): + """Filter entity text embeddings by entity keys.""" + self.entity_text_embeddings.filter_by_id(entity_keys) + + def build_context( + self, + query: str, + conversation_history: ConversationHistory | None = None, + include_entity_names: list[str] | None = None, + exclude_entity_names: list[str] | None = None, + conversation_history_max_turns: int | None = 5, + conversation_history_user_turns_only: bool = True, + max_tokens: int = 8000, + text_unit_prop: float = 0.5, + community_prop: float = 0.25, + top_k_mapped_entities: int = 10, + top_k_relationships: int = 10, + include_community_rank: bool = False, + include_entity_rank: bool = False, + rank_description: str = "number of relationships", + include_relationship_weight: bool = False, + relationship_ranking_attribute: str = "rank", + return_candidate_context: bool = False, + use_community_summary: bool = False, + min_community_rank: int = 0, + community_context_name: str = "Reports", + column_delimiter: str = "|", + **kwargs: dict[str, Any], + ) -> tuple[str | list[str], dict[str, pd.DataFrame]]: + """ + Build data context for local search prompt. + + Build a context by combining community reports and entity/relationship/covariate tables, and text units using a predefined ratio set by summary_prop. + """ + if include_entity_names is None: + include_entity_names = [] + if exclude_entity_names is None: + exclude_entity_names = [] + if community_prop + text_unit_prop > 1: + value_error = ( + "The sum of community_prop and text_unit_prop should not exceed 1." + ) + raise ValueError(value_error) + + # map user query to entities + # if there is conversation history, attached the previous user questions to the current query + if conversation_history: + pre_user_questions = "\n".join( + conversation_history.get_user_turns(conversation_history_max_turns) + ) + query = f"{query}\n{pre_user_questions}" + + selected_entities = map_query_to_entities( + query=query, + text_embedding_vectorstore=self.entity_text_embeddings, + text_embedder=self.text_embedder, + all_entities=list(self.entities.values()), + embedding_vectorstore_key=self.embedding_vectorstore_key, + include_entity_names=include_entity_names, + exclude_entity_names=exclude_entity_names, + k=top_k_mapped_entities, + oversample_scaler=2, + ) + + # build context + final_context = list[str]() + final_context_data = dict[str, pd.DataFrame]() + + if conversation_history: + # build conversation history context + ( + conversation_history_context, + conversation_history_context_data, + ) = conversation_history.build_context( + include_user_turns_only=conversation_history_user_turns_only, + max_qa_turns=conversation_history_max_turns, + column_delimiter=column_delimiter, + max_tokens=max_tokens, + recency_bias=False, + ) + if conversation_history_context.strip() != "": + final_context.append(conversation_history_context) + final_context_data = conversation_history_context_data + max_tokens = max_tokens - num_tokens( + conversation_history_context, self.token_encoder + ) + + # build community context + community_tokens = max(int(max_tokens * community_prop), 0) + community_context, community_context_data = self._build_community_context( + selected_entities=selected_entities, + max_tokens=community_tokens, + use_community_summary=use_community_summary, + column_delimiter=column_delimiter, + include_community_rank=include_community_rank, + min_community_rank=min_community_rank, + return_candidate_context=return_candidate_context, + context_name=community_context_name, + ) + if community_context.strip() != "": + final_context.append(community_context) + final_context_data = {**final_context_data, **community_context_data} + + # build local (i.e. entity-relationship-covariate) context + local_prop = 1 - community_prop - text_unit_prop + local_tokens = max(int(max_tokens * local_prop), 0) + local_context, local_context_data = self._build_local_context( + selected_entities=selected_entities, + max_tokens=local_tokens, + include_entity_rank=include_entity_rank, + rank_description=rank_description, + include_relationship_weight=include_relationship_weight, + top_k_relationships=top_k_relationships, + relationship_ranking_attribute=relationship_ranking_attribute, + return_candidate_context=return_candidate_context, + column_delimiter=column_delimiter, + ) + if local_context.strip() != "": + final_context.append(str(local_context)) + final_context_data = {**final_context_data, **local_context_data} + + # build text unit context + text_unit_tokens = max(int(max_tokens * text_unit_prop), 0) + text_unit_context, text_unit_context_data = self._build_text_unit_context( + selected_entities=selected_entities, + max_tokens=text_unit_tokens, + return_candidate_context=return_candidate_context, + ) + if text_unit_context.strip() != "": + final_context.append(text_unit_context) + final_context_data = {**final_context_data, **text_unit_context_data} + + return ("\n\n".join(final_context), final_context_data) + + def _build_community_context( + self, + selected_entities: list[Entity], + max_tokens: int = 4000, + use_community_summary: bool = False, + column_delimiter: str = "|", + include_community_rank: bool = False, + min_community_rank: int = 0, + return_candidate_context: bool = False, + context_name: str = "Reports", + ) -> tuple[str, dict[str, pd.DataFrame]]: + """Add community data to the context window until it hits the max_tokens limit.""" + if len(selected_entities) == 0 or len(self.community_reports) == 0: + return ("", {context_name.lower(): pd.DataFrame()}) + + community_matches = {} + for entity in selected_entities: + # increase count of the community that this entity belongs to + if entity.community_ids: + for community_id in entity.community_ids: + community_matches[community_id] = ( + community_matches.get(community_id, 0) + 1 + ) + + # sort communities by number of matched entities and rank + selected_communities = [ + self.community_reports[community_id] + for community_id in community_matches + if community_id in self.community_reports + ] + for community in selected_communities: + if community.attributes is None: + community.attributes = {} + community.attributes["matches"] = community_matches[community.id] + selected_communities.sort( + key=lambda x: (x.attributes["matches"], x.rank), # type: ignore + reverse=True, # type: ignore + ) + for community in selected_communities: + del community.attributes["matches"] # type: ignore + + context_text, context_data = build_community_context( + community_reports=selected_communities, + token_encoder=self.token_encoder, + use_community_summary=use_community_summary, + column_delimiter=column_delimiter, + shuffle_data=False, + include_community_rank=include_community_rank, + min_community_rank=min_community_rank, + max_tokens=max_tokens, + single_batch=True, + context_name=context_name, + ) + if isinstance(context_text, list) and len(context_text) > 0: + context_text = "\n\n".join(context_text) + + if return_candidate_context: + candidate_context_data = get_candidate_communities( + selected_entities=selected_entities, + community_reports=list(self.community_reports.values()), + use_community_summary=use_community_summary, + include_community_rank=include_community_rank, + ) + context_key = context_name.lower() + if context_key not in context_data: + context_data[context_key] = candidate_context_data + context_data[context_key]["in_context"] = False + else: + if ( + "id" in candidate_context_data.columns + and "id" in context_data[context_key].columns + ): + candidate_context_data["in_context"] = candidate_context_data[ + "id" + ].isin( # cspell:disable-line + context_data[context_key]["id"] + ) + context_data[context_key] = candidate_context_data + else: + context_data[context_key]["in_context"] = True + return (str(context_text), context_data) + + def _build_text_unit_context( + self, + selected_entities: list[Entity], + max_tokens: int = 8000, + return_candidate_context: bool = False, + column_delimiter: str = "|", + context_name: str = "Sources", + ) -> tuple[str, dict[str, pd.DataFrame]]: + """Rank matching text units and add them to the context window until it hits the max_tokens limit.""" + if len(selected_entities) == 0 or len(self.text_units) == 0: + return ("", {context_name.lower(): pd.DataFrame()}) + + selected_text_units = list[TextUnit]() + # for each matching text unit, rank first by the order of the entities that match it, then by the number of matching relationships + # that the text unit has with the matching entities + for index, entity in enumerate(selected_entities): + if entity.text_unit_ids: + for text_id in entity.text_unit_ids: + if ( + text_id not in [unit.id for unit in selected_text_units] + and text_id in self.text_units + ): + selected_unit = self.text_units[text_id] + num_relationships = count_relationships( + selected_unit, entity, self.relationships + ) + if selected_unit.attributes is None: + selected_unit.attributes = {} + selected_unit.attributes["entity_order"] = index + selected_unit.attributes["num_relationships"] = ( + num_relationships + ) + selected_text_units.append(selected_unit) + + # sort selected text units by ascending order of entity order and descending order of number of relationships + selected_text_units.sort( + key=lambda x: ( + x.attributes["entity_order"], # type: ignore + -x.attributes["num_relationships"], # type: ignore + ) + ) + + for unit in selected_text_units: + del unit.attributes["entity_order"] # type: ignore + del unit.attributes["num_relationships"] # type: ignore + + context_text, context_data = build_text_unit_context( + text_units=selected_text_units, + token_encoder=self.token_encoder, + max_tokens=max_tokens, + shuffle_data=False, + context_name=context_name, + column_delimiter=column_delimiter, + ) + + if return_candidate_context: + candidate_context_data = get_candidate_text_units( + selected_entities=selected_entities, + text_units=list(self.text_units.values()), + ) + context_key = context_name.lower() + if context_key not in context_data: + context_data[context_key] = candidate_context_data + context_data[context_key]["in_context"] = False + else: + if ( + "id" in candidate_context_data.columns + and "id" in context_data[context_key].columns + ): + candidate_context_data["in_context"] = candidate_context_data[ + "id" + ].isin( # cspell:disable-line + context_data[context_key]["id"] + ) + context_data[context_key] = candidate_context_data + else: + context_data[context_key]["in_context"] = True + return (str(context_text), context_data) + + def _build_local_context( + self, + selected_entities: list[Entity], + max_tokens: int = 8000, + include_entity_rank: bool = False, + rank_description: str = "relationship count", + include_relationship_weight: bool = False, + top_k_relationships: int = 10, + relationship_ranking_attribute: str = "rank", + return_candidate_context: bool = False, + column_delimiter: str = "|", + ) -> tuple[str, dict[str, pd.DataFrame]]: + """Build data context for local search prompt combining entity/relationship/covariate tables.""" + # build entity context + entity_context, entity_context_data = build_entity_context( + selected_entities=selected_entities, + token_encoder=self.token_encoder, + max_tokens=max_tokens, + column_delimiter=column_delimiter, + include_entity_rank=include_entity_rank, + rank_description=rank_description, + context_name="Entities", + ) + entity_tokens = num_tokens(entity_context, self.token_encoder) + + # build relationship-covariate context + added_entities = [] + final_context = [] + final_context_data = {} + + # gradually add entities and associated metadata to the context until we reach limit + for entity in selected_entities: + current_context = [] + current_context_data = {} + added_entities.append(entity) + + # build relationship context + ( + relationship_context, + relationship_context_data, + ) = build_relationship_context( + selected_entities=added_entities, + relationships=list(self.relationships.values()), + token_encoder=self.token_encoder, + max_tokens=max_tokens, + column_delimiter=column_delimiter, + top_k_relationships=top_k_relationships, + include_relationship_weight=include_relationship_weight, + relationship_ranking_attribute=relationship_ranking_attribute, + context_name="Relationships", + ) + current_context.append(relationship_context) + current_context_data["relationships"] = relationship_context_data + total_tokens = entity_tokens + num_tokens( + relationship_context, self.token_encoder + ) + + # build covariate context + for covariate in self.covariates: + covariate_context, covariate_context_data = build_covariates_context( + selected_entities=added_entities, + covariates=self.covariates[covariate], + token_encoder=self.token_encoder, + max_tokens=max_tokens, + column_delimiter=column_delimiter, + context_name=covariate, + ) + total_tokens += num_tokens(covariate_context, self.token_encoder) + current_context.append(covariate_context) + current_context_data[covariate.lower()] = covariate_context_data + + if total_tokens > max_tokens: + log.info("Reached token limit - reverting to previous context state") + break + + final_context = current_context + final_context_data = current_context_data + + # attach entity context to final context + final_context_text = entity_context + "\n\n" + "\n\n".join(final_context) + final_context_data["entities"] = entity_context_data + + if return_candidate_context: + # we return all the candidate entities/relationships/covariates (not only those that were fitted into the context window) + # and add a tag to indicate which records were included in the context window + candidate_context_data = get_candidate_context( + selected_entities=selected_entities, + entities=list(self.entities.values()), + relationships=list(self.relationships.values()), + covariates=self.covariates, + include_entity_rank=include_entity_rank, + entity_rank_description=rank_description, + include_relationship_weight=include_relationship_weight, + ) + for key in candidate_context_data: + candidate_df = candidate_context_data[key] + if key not in final_context_data: + final_context_data[key] = candidate_df + final_context_data[key]["in_context"] = False + else: + in_context_df = final_context_data[key] + + if "id" in in_context_df.columns and "id" in candidate_df.columns: + candidate_df["in_context"] = candidate_df[ + "id" + ].isin( # cspell:disable-line + in_context_df["id"] + ) + final_context_data[key] = candidate_df + else: + final_context_data[key]["in_context"] = True + + else: + for key in final_context_data: + final_context_data[key]["in_context"] = True + return (final_context_text, final_context_data) diff --git a/graphrag/query/structured_search/local_search/search.py b/graphrag/query/structured_search/local_search/search.py new file mode 100644 index 00000000..80dd6670 --- /dev/null +++ b/graphrag/query/structured_search/local_search/search.py @@ -0,0 +1,159 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""LocalSearch implementation.""" + +import logging +import time +from typing import Any + +import tiktoken + +from graphrag.query.context_builder.builders import LocalContextBuilder +from graphrag.query.context_builder.conversation_history import ( + ConversationHistory, +) +from graphrag.query.llm.base import BaseLLM, BaseLLMCallback +from graphrag.query.llm.text_utils import num_tokens +from graphrag.query.structured_search.base import BaseSearch, SearchResult +from graphrag.query.structured_search.local_search.system_prompt import ( + LOCAL_SEARCH_SYSTEM_PROMPT, +) + +DEFAULT_LLM_PARAMS = { + "max_tokens": 1500, + "temperature": 0.0, +} + +log = logging.getLogger(__name__) + + +class LocalSearch(BaseSearch): + """Search orchestration for local search mode.""" + + def __init__( + self, + llm: BaseLLM, + context_builder: LocalContextBuilder, + token_encoder: tiktoken.Encoding | None = None, + system_prompt: str = LOCAL_SEARCH_SYSTEM_PROMPT, + response_type: str = "multiple paragraphs", + callbacks: list[BaseLLMCallback] | None = None, + llm_params: dict[str, Any] = DEFAULT_LLM_PARAMS, + context_builder_params: dict | None = None, + ): + super().__init__( + llm=llm, + context_builder=context_builder, + token_encoder=token_encoder, + llm_params=llm_params, + context_builder_params=context_builder_params or {}, + ) + self.system_prompt = system_prompt + self.callbacks = callbacks + self.response_type = response_type + + async def asearch( + self, + query: str, + conversation_history: ConversationHistory | None = None, + **kwargs, + ) -> SearchResult: + """Build local search context that fits a single context window and generate answer for the user query.""" + start_time = time.time() + search_prompt = "" + + context_text, context_records = self.context_builder.build_context( + query=query, + conversation_history=conversation_history, + **kwargs, + **self.context_builder_params, + ) + log.info("GENERATE ANSWER: %s. QUERY: %s", start_time, query) + try: + search_prompt = self.system_prompt.format( + context_data=context_text, response_type=self.response_type + ) + search_messages = [ + {"role": "system", "content": search_prompt}, + {"role": "user", "content": query}, + ] + + response = await self.llm.agenerate( + messages=search_messages, + streaming=True, + callbacks=self.callbacks, + **self.llm_params, + ) + + return SearchResult( + response=response, + context_data=context_records, + context_text=context_text, + completion_time=time.time() - start_time, + llm_calls=1, + prompt_tokens=num_tokens(search_prompt, self.token_encoder), + ) + + except Exception: + log.exception("Exception in _asearch") + return SearchResult( + response="", + context_data=context_records, + context_text=context_text, + completion_time=time.time() - start_time, + llm_calls=1, + prompt_tokens=num_tokens(search_prompt, self.token_encoder), + ) + + def search( + self, + query: str, + conversation_history: ConversationHistory | None = None, + **kwargs, + ) -> SearchResult: + """Build local search context that fits a single context window and generate answer for the user question.""" + start_time = time.time() + search_prompt = "" + context_text, context_records = self.context_builder.build_context( + query=query, + conversation_history=conversation_history, + **kwargs, + **self.context_builder_params, + ) + log.info("GENERATE ANSWER: %d. QUERY: %s", start_time, query) + try: + search_prompt = self.system_prompt.format( + context_data=context_text, response_type=self.response_type + ) + search_messages = [ + {"role": "system", "content": search_prompt}, + {"role": "user", "content": query}, + ] + + response = self.llm.generate( + messages=search_messages, + streaming=True, + callbacks=self.callbacks, + **self.llm_params, + ) + + return SearchResult( + response=response, + context_data=context_records, + context_text=context_text, + completion_time=time.time() - start_time, + llm_calls=1, + prompt_tokens=num_tokens(search_prompt, self.token_encoder), + ) + + except Exception: + log.exception("Exception in _map_response_single_batch") + return SearchResult( + response="", + context_data=context_records, + context_text=context_text, + completion_time=time.time() - start_time, + llm_calls=1, + prompt_tokens=num_tokens(search_prompt, self.token_encoder), + ) diff --git a/graphrag/query/structured_search/local_search/system_prompt.py b/graphrag/query/structured_search/local_search/system_prompt.py new file mode 100644 index 00000000..70b1d12f --- /dev/null +++ b/graphrag/query/structured_search/local_search/system_prompt.py @@ -0,0 +1,69 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Local search system prompts.""" + +LOCAL_SEARCH_SYSTEM_PROMPT = """ +---Role--- + +You are a helpful assistant responding to questions about data in the tables provided. + + +---Goal--- + +Generate a response of the target length and format that responds to the user's question, summarizing all information in the input data tables appropriate for the response length and format, and incorporating any relevant general knowledge. + +If you don't know the answer, just say so. Do not make anything up. + +Points supported by data should list their data references as follows: + +"This is an example sentence supported by multiple data references [Data: (record ids); (record ids)]." + +Do not list more than 5 record ids in a single reference. Instead, list the top 5 most relevant record ids and add "+more" to indicate that there are more. + +For example: + +"Person X is the owner of Company Y and subject to many allegations of wrongdoing [Data: Sources (15, 16), Reports (1), Entities (5, 7); Relationships (23); Claims (2, 7, 34, 46, 64, +more)]." + +where 15, 16, 1, 5, 7, 23, 2, 7, 34, 46, and 64 represent the id (not the index) of the relevant data record. + +Do not include information where the supporting evidence for it is not provided. + + +---Target response length and format--- + +{response_type} + + +---Data tables--- + +{context_data} + + +---Goal--- + +Generate a response of the target length and format that responds to the user's question, summarizing all information in the input data tables appropriate for the response length and format, and incorporating any relevant general knowledge. + +If you don't know the answer, just say so. Do not make anything up. + +Points supported by data should list their data references as follows: + +"This is an example sentence supported by multiple data references [Data: (record ids); (record ids)]." + +Do not list more than 5 record ids in a single reference. Instead, list the top 5 most relevant record ids and add "+more" to indicate that there are more. + +For example: + +"Person X is the owner of Company Y and subject to many allegations of wrongdoing [Data: Sources (15, 16), Reports (1), Entities (5, 7); Relationships (23); Claims (2, 7, 34, 46, 64, +more)]." + +where 15, 16, 1, 5, 7, 23, 2, 7, 34, 46, and 64 represent the id (not the index) of the relevant data record. + +Do not include information where the supporting evidence for it is not provided. + + +---Target response length and format--- + +{response_type} + +Add sections and commentary to the response as appropriate for the length and format. Style the response in markdown. +""" diff --git a/graphrag/vector_stores/__init__.py b/graphrag/vector_stores/__init__.py new file mode 100644 index 00000000..d4c11760 --- /dev/null +++ b/graphrag/vector_stores/__init__.py @@ -0,0 +1,19 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A package containing vector-storage implementations.""" + +from .azure_ai_search import AzureAISearch +from .base import BaseVectorStore, VectorStoreDocument, VectorStoreSearchResult +from .lancedb import LanceDBVectorStore +from .typing import VectorStoreFactory, VectorStoreType + +__all__ = [ + "AzureAISearch", + "BaseVectorStore", + "LanceDBVectorStore", + "VectorStoreDocument", + "VectorStoreFactory", + "VectorStoreSearchResult", + "VectorStoreType", +] diff --git a/graphrag/vector_stores/azure_ai_search.py b/graphrag/vector_stores/azure_ai_search.py new file mode 100644 index 00000000..c503fca1 --- /dev/null +++ b/graphrag/vector_stores/azure_ai_search.py @@ -0,0 +1,194 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A package containing the Azure AI Search vector store implementation.""" + +import json +from typing import Any + +from azure.core.credentials import AzureKeyCredential +from azure.identity import DefaultAzureCredential +from azure.search.documents import SearchClient +from azure.search.documents.indexes import SearchIndexClient +from azure.search.documents.indexes.models import ( + HnswAlgorithmConfiguration, + HnswParameters, + SearchableField, + SearchField, + SearchFieldDataType, + SearchIndex, + SimpleField, + VectorSearch, + VectorSearchAlgorithmMetric, + VectorSearchProfile, +) +from azure.search.documents.models import VectorizedQuery + +from graphrag.model.types import TextEmbedder + +from .base import ( + DEFAULT_VECTOR_SIZE, + BaseVectorStore, + VectorStoreDocument, + VectorStoreSearchResult, +) + + +class AzureAISearch(BaseVectorStore): + """The Azure AI Search vector storage implementation.""" + + index_client: SearchIndexClient + + def connect(self, **kwargs: Any) -> Any: + """Connect to the AzureAI vector store.""" + url = kwargs.get("url", None) + api_key = kwargs.get("api_key", None) + audience = kwargs.get("audience", None) + self.vector_size = kwargs.get("vector_size", DEFAULT_VECTOR_SIZE) + + self.vector_search_profile_name = kwargs.get( + "vector_search_profile_name", "vectorSearchProfile" + ) + + if url: + audience_arg = {"audience": audience} if audience else {} + self.db_connection = SearchClient( + endpoint=url, + index_name=self.collection_name, + credential=AzureKeyCredential(api_key) + if api_key + else DefaultAzureCredential(), + **audience_arg, + ) + self.index_client = SearchIndexClient( + endpoint=url, + credential=AzureKeyCredential(api_key) + if api_key + else DefaultAzureCredential(), + **audience_arg, + ) + else: + not_supported_error = "AAISearchDBClient is not supported on local host." + raise ValueError(not_supported_error) + + def load_documents( + self, documents: list[VectorStoreDocument], overwrite: bool = True + ) -> None: + """Load documents into the Azure AI Search index.""" + if overwrite: + if self.collection_name in self.index_client.list_index_names(): + self.index_client.delete_index(self.collection_name) + + # Configure the vector search profile + vector_search = VectorSearch( + algorithms=[ + HnswAlgorithmConfiguration( + name="HnswAlg", + parameters=HnswParameters( + metric=VectorSearchAlgorithmMetric.COSINE + ), + ) + ], + profiles=[ + VectorSearchProfile( + name=self.vector_search_profile_name, + algorithm_configuration_name="HnswAlg", + ) + ], + ) + + index = SearchIndex( + name=self.collection_name, + fields=[ + SimpleField( + name="id", + type=SearchFieldDataType.String, + key=True, + ), + SearchField( + name="vector", + type=SearchFieldDataType.Collection(SearchFieldDataType.Single), + searchable=True, + vector_search_dimensions=self.vector_size, + vector_search_profile_name=self.vector_search_profile_name, + ), + SearchableField(name="text", type=SearchFieldDataType.String), + SimpleField( + name="attributes", + type=SearchFieldDataType.String, + ), + ], + vector_search=vector_search, + ) + + self.index_client.create_or_update_index( + index, + ) + + batch = [ + { + "id": doc.id, + "vector": doc.vector, + "text": doc.text, + "attributes": json.dumps(doc.attributes), + } + for doc in documents + if doc.vector is not None + ] + + if batch and len(batch) > 0: + self.db_connection.upload_documents(batch) + + def filter_by_id(self, include_ids: list[str] | list[int]) -> Any: + """Build a query filter to filter documents by a list of ids.""" + if include_ids is None or len(include_ids) == 0: + self.query_filter = None + # Returning to keep consistency with other methods, but not needed + return self.query_filter + + # More info about odata filtering here: https://learn.microsoft.com/en-us/azure/search/search-query-odata-search-in-function + # search.in is faster that joined and/or conditions + id_filter = ",".join([f"{id!s}" for id in include_ids]) + self.query_filter = f"search.in(id, '{id_filter}', ',')" + + # Returning to keep consistency with other methods, but not needed + # TODO: Refactor on a future PR + return self.query_filter + + def similarity_search_by_vector( + self, query_embedding: list[float], k: int = 10, **kwargs: Any + ) -> list[VectorStoreSearchResult]: + """Perform a vector-based similarity search.""" + vectorized_query = VectorizedQuery( + vector=query_embedding, k_nearest_neighbors=k, fields="vector" + ) + + response = self.db_connection.search( + vector_queries=[vectorized_query], + ) + + return [ + VectorStoreSearchResult( + document=VectorStoreDocument( + id=doc.get("id", ""), + text=doc.get("text", ""), + vector=doc.get("vector", []), + attributes=(json.loads(doc.get("attributes", "{}"))), + ), + # Cosine similarity between 0.333 and 1.000 + # https://learn.microsoft.com/en-us/azure/search/hybrid-search-ranking#scores-in-a-hybrid-search-results + score=doc["@search.score"], + ) + for doc in response + ] + + def similarity_search_by_text( + self, text: str, text_embedder: TextEmbedder, k: int = 10, **kwargs: Any + ) -> list[VectorStoreSearchResult]: + """Perform a text-based similarity search.""" + query_embedding = text_embedder(text) + if query_embedding: + return self.similarity_search_by_vector( + query_embedding=query_embedding, k=k + ) + return [] diff --git a/graphrag/vector_stores/base.py b/graphrag/vector_stores/base.py new file mode 100644 index 00000000..38f0e584 --- /dev/null +++ b/graphrag/vector_stores/base.py @@ -0,0 +1,81 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Base classes for vector stores.""" + +from abc import ABC, abstractmethod +from dataclasses import dataclass, field +from typing import Any + +from graphrag.model.types import TextEmbedder + +DEFAULT_VECTOR_SIZE: int = 1536 + + +@dataclass +class VectorStoreDocument: + """A document that is stored in vector storage.""" + + id: str | int + """unique id for the document""" + + text: str | None + vector: list[float] | None + + attributes: dict[str, Any] = field(default_factory=dict) + """store any additional metadata, e.g. title, date ranges, etc""" + + +@dataclass +class VectorStoreSearchResult: + """A vector storage search result.""" + + document: VectorStoreDocument + """Document that was found.""" + + score: float + """Similarity score between 0 and 1. Higher is more similar.""" + + +class BaseVectorStore(ABC): + """The base class for vector storage data-access classes.""" + + def __init__( + self, + collection_name: str, + db_connection: Any | None = None, + document_collection: Any | None = None, + query_filter: Any | None = None, + **kwargs: Any, + ): + self.collection_name = collection_name + self.db_connection = db_connection + self.document_collection = document_collection + self.query_filter = query_filter + self.kwargs = kwargs + + @abstractmethod + def connect(self, **kwargs: Any) -> None: + """Connect to vector storage.""" + + @abstractmethod + def load_documents( + self, documents: list[VectorStoreDocument], overwrite: bool = True + ) -> None: + """Load documents into the vector-store.""" + + @abstractmethod + def similarity_search_by_vector( + self, query_embedding: list[float], k: int = 10, **kwargs: Any + ) -> list[VectorStoreSearchResult]: + """Perform ANN search by vector.""" + + @abstractmethod + def similarity_search_by_text( + self, text: str, text_embedder: TextEmbedder, k: int = 10, **kwargs: Any + ) -> list[VectorStoreSearchResult]: + """Perform ANN search by text.""" + + @abstractmethod + def filter_by_id(self, include_ids: list[str] | list[int]) -> Any: + """Build a query filter to filter documents by id.""" diff --git a/graphrag/vector_stores/lancedb.py b/graphrag/vector_stores/lancedb.py new file mode 100644 index 00000000..0c9ea17f --- /dev/null +++ b/graphrag/vector_stores/lancedb.py @@ -0,0 +1,121 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The LanceDB vector storage implementation package.""" + +import lancedb as lancedb # noqa: I001 (Ruff was breaking on this file imports, even tho they were sorted and passed local tests) +from graphrag.model.types import TextEmbedder + +import json +from typing import Any + +import pyarrow as pa + +from .base import ( + BaseVectorStore, + VectorStoreDocument, + VectorStoreSearchResult, +) + + +class LanceDBVectorStore(BaseVectorStore): + """The LanceDB vector storage implementation.""" + + def connect(self, **kwargs: Any) -> Any: + """Connect to the vector storage.""" + db_uri = kwargs.get("db_uri", "./lancedb") + self.db_connection = lancedb.connect(db_uri) # type: ignore + + def load_documents( + self, documents: list[VectorStoreDocument], overwrite: bool = True + ) -> None: + """Load documents into vector storage.""" + data = [ + { + "id": document.id, + "text": document.text, + "vector": document.vector, + "attributes": json.dumps(document.attributes), + } + for document in documents + if document.vector is not None + ] + + if len(data) == 0: + data = None + + schema = pa.schema([ + pa.field("id", pa.string()), + pa.field("text", pa.string()), + pa.field("vector", pa.list_(pa.float64())), + pa.field("attributes", pa.string()), + ]) + if overwrite: + if data: + self.document_collection = self.db_connection.create_table( + self.collection_name, data=data, mode="overwrite" + ) + else: + self.document_collection = self.db_connection.create_table( + self.collection_name, schema=schema, mode="overwrite" + ) + else: + # add data to existing table + self.document_collection = self.db_connection.open_table( + self.collection_name + ) + if data: + self.document_collection.add(data) + + def filter_by_id(self, include_ids: list[str] | list[int]) -> Any: + """Build a query filter to filter documents by id.""" + if len(include_ids) == 0: + self.query_filter = None + else: + if isinstance(include_ids[0], str): + id_filter = ", ".join([f"'{id}'" for id in include_ids]) + self.query_filter = f"id in ({id_filter})" + else: + self.query_filter = ( + f"id in ({', '.join([str(id) for id in include_ids])})" + ) + return self.query_filter + + def similarity_search_by_vector( + self, query_embedding: list[float], k: int = 10, **kwargs: Any + ) -> list[VectorStoreSearchResult]: + """Perform a vector-based similarity search.""" + if self.query_filter: + docs = ( + self.document_collection.search(query=query_embedding) + .where(self.query_filter, prefilter=True) + .limit(k) + .to_list() + ) + else: + docs = ( + self.document_collection.search(query=query_embedding) + .limit(k) + .to_list() + ) + return [ + VectorStoreSearchResult( + document=VectorStoreDocument( + id=doc["id"], + text=doc["text"], + vector=doc["vector"], + attributes=json.loads(doc["attributes"]), + ), + score=1 - abs(float(doc["_distance"])), + ) + for doc in docs + ] + + def similarity_search_by_text( + self, text: str, text_embedder: TextEmbedder, k: int = 10, **kwargs: Any + ) -> list[VectorStoreSearchResult]: + """Perform a similarity search using a given input text.""" + query_embedding = text_embedder(text) + if query_embedding: + return self.similarity_search_by_vector(query_embedding, k) + return [] diff --git a/graphrag/vector_stores/typing.py b/graphrag/vector_stores/typing.py new file mode 100644 index 00000000..0b5a5cd1 --- /dev/null +++ b/graphrag/vector_stores/typing.py @@ -0,0 +1,44 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A package containing the supported vector store types.""" + +from enum import Enum +from typing import ClassVar + +from .azure_ai_search import AzureAISearch +from .lancedb import LanceDBVectorStore + + +class VectorStoreType(str, Enum): + """The supported vector store types.""" + + LanceDB = "lancedb" + AzureAISearch = "azure_ai_search" + + +class VectorStoreFactory: + """A factory class for creating vector stores.""" + + vector_store_types: ClassVar[dict[str, type]] = {} + + @classmethod + def register(cls, vector_store_type: str, vector_store: type): + """Register a vector store type.""" + cls.vector_store_types[vector_store_type] = vector_store + + @classmethod + def get_vector_store( + cls, vector_store_type: VectorStoreType | str, kwargs: dict + ) -> LanceDBVectorStore | AzureAISearch: + """Get the vector store type from a string.""" + match vector_store_type: + case VectorStoreType.LanceDB: + return LanceDBVectorStore(**kwargs) + case VectorStoreType.AzureAISearch: + return AzureAISearch(**kwargs) + case _: + if vector_store_type in cls.vector_store_types: + return cls.vector_store_types[vector_store_type](**kwargs) + msg = f"Unknown vector store type: {vector_store_type}" + raise ValueError(msg) diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 00000000..a9c7fad1 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,5105 @@ +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. + +[[package]] +name = "aiofiles" +version = "24.1.0" +description = "File support for asyncio." +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5"}, + {file = "aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c"}, +] + +[[package]] +name = "aiolimiter" +version = "1.1.0" +description = "asyncio rate limiter, a leaky bucket implementation" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "aiolimiter-1.1.0-py3-none-any.whl", hash = "sha256:0b4997961fc58b8df40279e739f9cf0d3e255e63e9a44f64df567a8c17241e24"}, + {file = "aiolimiter-1.1.0.tar.gz", hash = "sha256:461cf02f82a29347340d031626c92853645c099cb5ff85577b831a7bd21132b5"}, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "anyio" +version = "4.4.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + +[[package]] +name = "anytree" +version = "2.12.1" +description = "Powerful and Lightweight Python Tree Data Structure with various plugins" +optional = false +python-versions = ">=3.7.2,<4" +files = [ + {file = "anytree-2.12.1-py3-none-any.whl", hash = "sha256:5ea9e61caf96db1e5b3d0a914378d2cd83c269dfce1fb8242ce96589fa3382f0"}, + {file = "anytree-2.12.1.tar.gz", hash = "sha256:244def434ccf31b668ed282954e5d315b4e066c4940b94aff4a7962d85947830"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + +[[package]] +name = "argon2-cffi" +version = "23.1.0" +description = "Argon2 for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, +] + +[package.dependencies] +argon2-cffi-bindings = "*" + +[package.extras] +dev = ["argon2-cffi[tests,typing]", "tox (>4)"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] +tests = ["hypothesis", "pytest"] +typing = ["mypy"] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +description = "Low-level CFFI bindings for Argon2" +optional = false +python-versions = ">=3.6" +files = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] + +[package.dependencies] +cffi = ">=1.0.1" + +[package.extras] +dev = ["cogapp", "pre-commit", "pytest", "wheel"] +tests = ["pytest"] + +[[package]] +name = "arrow" +version = "1.3.0" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" +types-python-dateutil = ">=2.8.10" + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] + +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + +[[package]] +name = "async-lru" +version = "2.0.4" +description = "Simple LRU cache for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, + {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "attrs" +version = "23.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"}, +] + +[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]"] + +[[package]] +name = "autograd" +version = "1.6.2" +description = "Efficiently computes derivatives of numpy code." +optional = false +python-versions = "*" +files = [ + {file = "autograd-1.6.2-py3-none-any.whl", hash = "sha256:208dde2a938e63b4f8f5049b1985505139e529068b0d26f8cd7771fd3eb145d5"}, + {file = "autograd-1.6.2.tar.gz", hash = "sha256:8731e08a0c4e389d8695a40072ada4512641c113b6cace8f4cfbe8eb7e9aedeb"}, +] + +[package.dependencies] +future = ">=0.15.2" +numpy = ">=1.12" + +[[package]] +name = "azure-common" +version = "1.1.28" +description = "Microsoft Azure Client Library for Python (Common)" +optional = false +python-versions = "*" +files = [ + {file = "azure-common-1.1.28.zip", hash = "sha256:4ac0cd3214e36b6a1b6a442686722a5d8cc449603aa833f3f0f40bda836704a3"}, + {file = "azure_common-1.1.28-py2.py3-none-any.whl", hash = "sha256:5c12d3dcf4ec20599ca6b0d3e09e86e146353d443e7fcc050c9a19c1f9df20ad"}, +] + +[[package]] +name = "azure-core" +version = "1.30.2" +description = "Microsoft Azure Core Library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "azure-core-1.30.2.tar.gz", hash = "sha256:a14dc210efcd608821aa472d9fb8e8d035d29b68993819147bc290a8ac224472"}, + {file = "azure_core-1.30.2-py3-none-any.whl", hash = "sha256:cf019c1ca832e96274ae85abd3d9f752397194d9fea3b41487290562ac8abe4a"}, +] + +[package.dependencies] +requests = ">=2.21.0" +six = ">=1.11.0" +typing-extensions = ">=4.6.0" + +[package.extras] +aio = ["aiohttp (>=3.0)"] + +[[package]] +name = "azure-identity" +version = "1.17.1" +description = "Microsoft Azure Identity Library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "azure-identity-1.17.1.tar.gz", hash = "sha256:32ecc67cc73f4bd0595e4f64b1ca65cd05186f4fe6f98ed2ae9f1aa32646efea"}, + {file = "azure_identity-1.17.1-py3-none-any.whl", hash = "sha256:db8d59c183b680e763722bfe8ebc45930e6c57df510620985939f7f3191e0382"}, +] + +[package.dependencies] +azure-core = ">=1.23.0" +cryptography = ">=2.5" +msal = ">=1.24.0" +msal-extensions = ">=0.3.0" +typing-extensions = ">=4.0.0" + +[[package]] +name = "azure-search-documents" +version = "11.4.0" +description = "Microsoft Azure Cognitive Search Client Library for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "azure-search-documents-11.4.0.tar.gz", hash = "sha256:599f269f106fb51e646ff426a218c21811575598e6a769b23fa4a0127c0f57e0"}, + {file = "azure_search_documents-11.4.0-py3-none-any.whl", hash = "sha256:e435266dc992a3450dc475309c9475f89a4bb0e9dac838140e609d9f1c7608ac"}, +] + +[package.dependencies] +azure-common = ">=1.1,<2.0" +azure-core = ">=1.28.0,<2.0.0" +isodate = ">=0.6.0" + +[[package]] +name = "azure-storage-blob" +version = "12.20.0" +description = "Microsoft Azure Blob Storage Client Library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "azure-storage-blob-12.20.0.tar.gz", hash = "sha256:eeb91256e41d4b5b9bad6a87fd0a8ade07dd58aa52344e2c8d2746e27a017d3b"}, + {file = "azure_storage_blob-12.20.0-py3-none-any.whl", hash = "sha256:de6b3bf3a90e9341a6bcb96a2ebe981dffff993e9045818f6549afea827a52a9"}, +] + +[package.dependencies] +azure-core = ">=1.28.0" +cryptography = ">=2.1.4" +isodate = ">=0.6.1" +typing-extensions = ">=4.6.0" + +[package.extras] +aio = ["azure-core[aio] (>=1.28.0)"] + +[[package]] +name = "babel" +version = "2.15.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, + {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, +] + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "beartype" +version = "0.18.5" +description = "Unbearably fast runtime type checking in pure Python." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "beartype-0.18.5-py3-none-any.whl", hash = "sha256:5301a14f2a9a5540fe47ec6d34d758e9cd8331d36c4760fc7a5499ab86310089"}, + {file = "beartype-0.18.5.tar.gz", hash = "sha256:264ddc2f1da9ec94ff639141fbe33d22e12a9f75aa863b83b7046ffff1381927"}, +] + +[package.extras] +all = ["typing-extensions (>=3.10.0.0)"] +dev = ["autoapi (>=0.9.0)", "coverage (>=5.5)", "equinox", "mypy (>=0.800)", "numpy", "pandera", "pydata-sphinx-theme (<=0.7.2)", "pytest (>=4.0.0)", "sphinx", "sphinx (>=4.2.0,<6.0.0)", "sphinxext-opengraph (>=0.7.5)", "tox (>=3.20.1)", "typing-extensions (>=3.10.0.0)"] +doc-rtd = ["autoapi (>=0.9.0)", "pydata-sphinx-theme (<=0.7.2)", "sphinx (>=4.2.0,<6.0.0)", "sphinxext-opengraph (>=0.7.5)"] +test-tox = ["equinox", "mypy (>=0.800)", "numpy", "pandera", "pytest (>=4.0.0)", "sphinx", "typing-extensions (>=3.10.0.0)"] +test-tox-coverage = ["coverage (>=5.5)"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "bleach" +version = "6.1.0" +description = "An easy safelist-based HTML-sanitizing tool." +optional = false +python-versions = ">=3.8" +files = [ + {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, + {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, +] + +[package.dependencies] +six = ">=1.9.0" +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.3)"] + +[[package]] +name = "cachetools" +version = "5.3.3" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, + {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, +] + +[[package]] +name = "certifi" +version = "2024.6.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +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"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +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"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "cloudpickle" +version = "3.0.0" +description = "Pickler class to extend the standard pickle.Pickler functionality" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cloudpickle-3.0.0-py3-none-any.whl", hash = "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7"}, + {file = "cloudpickle-3.0.0.tar.gz", hash = "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comm" +version = "0.2.2" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "contourpy" +version = "1.2.1" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.9" +files = [ + {file = "contourpy-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040"}, + {file = "contourpy-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b"}, + {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd"}, + {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619"}, + {file = "contourpy-1.2.1-cp310-cp310-win32.whl", hash = "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8"}, + {file = "contourpy-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9"}, + {file = "contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5"}, + {file = "contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df"}, + {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205"}, + {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8"}, + {file = "contourpy-1.2.1-cp311-cp311-win32.whl", hash = "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec"}, + {file = "contourpy-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922"}, + {file = "contourpy-1.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc"}, + {file = "contourpy-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b"}, + {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce"}, + {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4"}, + {file = "contourpy-1.2.1-cp312-cp312-win32.whl", hash = "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f"}, + {file = "contourpy-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce"}, + {file = "contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b"}, + {file = "contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445"}, + {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02"}, + {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083"}, + {file = "contourpy-1.2.1-cp39-cp39-win32.whl", hash = "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba"}, + {file = "contourpy-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f"}, + {file = "contourpy-1.2.1.tar.gz", hash = "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c"}, +] + +[package.dependencies] +numpy = ">=1.20" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.8.0)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "coverage" +version = "7.5.4" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, + {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, + {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, + {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, + {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, + {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, + {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, + {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, + {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, + {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, + {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, + {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, + {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, + {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, +] + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "cramjam" +version = "2.8.3" +description = "Thin Python bindings to de/compression algorithms in Rust" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cramjam-2.8.3-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8c8aa6d08c135ae7f0da01e6559a332c5d8fe4989a594db401040e385d04dffd"}, + {file = "cramjam-2.8.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:bd8c601fe8717e52517a2f2eef78217086acf449627bfdda97e3f53fd79c92af"}, + {file = "cramjam-2.8.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dac42b2b4c3950e7eda9b5551e0e904784ed0c0428accc29171c230fb919ec72"}, + {file = "cramjam-2.8.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab8146faa5d8c52edf23724843c36469fc32ff2c4a174eba72f4da6de5016688"}, + {file = "cramjam-2.8.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb5f4d061e9abdc6663551446c332a58c101efb31fd1746229872600274c2b20"}, + {file = "cramjam-2.8.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d1ac94e00c64258330105473c641441db02b4dc3e9e9f2963d204e53ed93025"}, + {file = "cramjam-2.8.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ed658f36a2bf667d5b8c7c6690103ad99f81cc62a1b64891b69298447329d4b"}, + {file = "cramjam-2.8.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f6303c8cc583dfe5054cf84717674f75b18bca4ae8e576dc863958d5494dc4b"}, + {file = "cramjam-2.8.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:04b31d427a8902e5c2eec4b8f29873de7a3ade202e3d68e7f2354b9f0aa00bc7"}, + {file = "cramjam-2.8.3-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:9728861bc0390681824961778b36f7f0b95039e8b90d46f1b67f51232f1ee159"}, + {file = "cramjam-2.8.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:87e26e3e1d5fed1cac5b41be648d0daf0793f94cf4a7aebefce1f4f6656e2d21"}, + {file = "cramjam-2.8.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1d2d39c2193a77c5e5b327944f90e6ecf2caa1b55e7176cc83d80706ea15de"}, + {file = "cramjam-2.8.3-cp310-none-win32.whl", hash = "sha256:6721edd8f911ad84db83ee4902b7579fc01c55849062f3f1f4171b58fccf98eb"}, + {file = "cramjam-2.8.3-cp310-none-win_amd64.whl", hash = "sha256:4f7c16d358df366e308137411125a2bb50d1b19924fced3a390898fa8c9a074d"}, + {file = "cramjam-2.8.3-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:24c2b426dd8fafb894f93a88f42e2827e14199d66836cb100582037e5371c724"}, + {file = "cramjam-2.8.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:007aa9444cb27b8691baae73ca907133cd939987438f874774011b4c740732dd"}, + {file = "cramjam-2.8.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:29987b54e31efed66738e8f236c597c4c9a91ec9d57bcb74307712e07505b4bb"}, + {file = "cramjam-2.8.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65bfd41aa92c0025f32ba09214b48e9367a81122586b2617439b4327c4bd179c"}, + {file = "cramjam-2.8.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7337bd8218bd8508f35904274a38cce843a237fe6e23104238bbeb2f337107ed"}, + {file = "cramjam-2.8.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:269f94d2efe6b6a97624782cd3b541e60535dd5874f4a8d5d0ba66ef59424ae3"}, + {file = "cramjam-2.8.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bec9ca5431c32ba94996b7c1c56695b37d48713b97ee1d2a456f4046f009e82f"}, + {file = "cramjam-2.8.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cb64a97e625ca029b55e37769b8c354e64cbea042c75471915dc385935d30ed"}, + {file = "cramjam-2.8.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c28830ecf76501356d678dac4f37563554ec1c651a53a990cdf595f7ed75c651"}, + {file = "cramjam-2.8.3-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:35647a0e37a4dfec85a44c7966ae476b7db0e6cd65d91c08f1fb3007ed774d92"}, + {file = "cramjam-2.8.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e954599c6369f429a868852eff453b894d88866acba439b65131ea93f5400b47"}, + {file = "cramjam-2.8.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:86e238b6de79e045f5197df2c9dfaf8d10b37a6517ff4ffc4775fe5a3cf4d4a4"}, + {file = "cramjam-2.8.3-cp311-none-win32.whl", hash = "sha256:fe6434d3ee0899bc9396801d1abbc5d1fe77662bd3d1f1c1573fac6708459138"}, + {file = "cramjam-2.8.3-cp311-none-win_amd64.whl", hash = "sha256:e8ec1d4f27eb9d0412f0c567e7ffd14fbeb2b318a1ac394d5de4047c431fe94c"}, + {file = "cramjam-2.8.3-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:24990be4010b2185dcecc67133cd727657036e7b132d7de598148f5b1eb8e452"}, + {file = "cramjam-2.8.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:572cb9a8dc5a189691d6e03a9bf9b4305fd9a9f36bb0f9fde55fc36837c2e6b3"}, + {file = "cramjam-2.8.3-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9efe6915aa7ef176f3a7f42a4e46504573215953331b139abefd20d07d8aba82"}, + {file = "cramjam-2.8.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe84440100e7045190da7f80219be9989b0b6db6acadb3ae9cfe0935d93ebf8c"}, + {file = "cramjam-2.8.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:00524bb23f4abb3a3bfff08aa32b9274843170c5b43855807e0f59670e2ac98c"}, + {file = "cramjam-2.8.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ab67f29094165f0771acad8dd16e840259cfedcc94067af229530496dbf1a24c"}, + {file = "cramjam-2.8.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:be6fb5dd5bf1c89c717a73a1057505959f35c08e0e97a76d4cc6391b90d2263b"}, + {file = "cramjam-2.8.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93b42d22bf3e17290c5e4cf58e715a419330bb5255c35933c14db82ecf3872c"}, + {file = "cramjam-2.8.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:afa065bab70e27565695441f69f493af3d379b8723030f2c3d2547d2e312a4be"}, + {file = "cramjam-2.8.3-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:832224f52fa1e601e0ab678dba9bdfde3686fc4cd1a9f2ed4748f29eaf1cb553"}, + {file = "cramjam-2.8.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:962b7106287bcc463150766b5b8c69f32dcc69713a8dbce00e0ca6936f95c55b"}, + {file = "cramjam-2.8.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2be92c6f0bcffaf8ea6a8164fe0388a188fec2fa9eff1828e8b64dc3a83740f9"}, + {file = "cramjam-2.8.3-cp312-none-win32.whl", hash = "sha256:080f3eb7b648f5ba9d35084d8dddc68246a8f365df239792f6712908f0aa568e"}, + {file = "cramjam-2.8.3-cp312-none-win_amd64.whl", hash = "sha256:c14728e3360cd212d5b606ca703c3bd1c8912efcdbc1aa032c81c2882509ebd5"}, + {file = "cramjam-2.8.3-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:c7e8329cde48740df8d332dade2f52b74612b8ea86005341c99bb192c82a5ce7"}, + {file = "cramjam-2.8.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:77346ac669f5445d14b74476a4e8f3a259fd22681bd73790e92b8956d7e225fc"}, + {file = "cramjam-2.8.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274878883e7fadf95a6b5bc58f9c1dd39fef2c31d68e18a0fb8594226457fba7"}, + {file = "cramjam-2.8.3-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7871e1fd3ee8ca16799ba22d49fc1e52e78976fa8c659be41630eeb2914475a7"}, + {file = "cramjam-2.8.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:345a952c5d4b922830efaa67dc0b42d21e18c182c1a1bda6d20bb78235f31d6f"}, + {file = "cramjam-2.8.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb5d7739e2bc573ade12327ef7717b1ac5876c62938fab20eb54d762da23cae2"}, + {file = "cramjam-2.8.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:440a18fd4ae42e06dbbd7aee91d8248b61da9fef7610ffbd553d1ba93931394b"}, + {file = "cramjam-2.8.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:476890974229713fc7b4c16fb050b756ba926c67e4d1200b3e03c5c051e9b552"}, + {file = "cramjam-2.8.3-cp37-cp37m-musllinux_1_1_armv7l.whl", hash = "sha256:771b44e549f90b5532508782e25d1c40b8054dd83d52253d05945fc05836b252"}, + {file = "cramjam-2.8.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d824fd98364bc946c38ed324a3ec7befba055285aaf2c1ca61894bb7616226e8"}, + {file = "cramjam-2.8.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2476828dea4089aa3cb9160391f8b36f793ca651afdcba80de1e341373928397"}, + {file = "cramjam-2.8.3-cp37-none-win32.whl", hash = "sha256:4a554bcfd068e831affd64a4f067c7c9b00b359742597c4fdadd18ff673baf30"}, + {file = "cramjam-2.8.3-cp37-none-win_amd64.whl", hash = "sha256:246f1f7d32cac2b64617d2dddba11a82851e73cdcf9d1abb799b08dcd9d2ea49"}, + {file = "cramjam-2.8.3-cp38-cp38-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:bc8f24c32124bb47536882c6b941cdb88cc16e4fa64d5bf347cb8dd72a193fc3"}, + {file = "cramjam-2.8.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:28c30078effc100739d3f9b227276a8360c1b32aac65efb4f641630552213548"}, + {file = "cramjam-2.8.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ef0173fb457f73cf9c2553092419db0eba4d582890db95e542a4d93e11340421"}, + {file = "cramjam-2.8.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a1943f2cc0deee037ddcf92beff6049e12d4e6d557f568ddf59fb3b848f2152"}, + {file = "cramjam-2.8.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5023a737d8d9cf5d123e6d87d088929c3cfb2aae90e0f584204427f74882150a"}, + {file = "cramjam-2.8.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eec7e985f35708c234542721863d82781d0f7f6a71b45e14ce6d2625d4b131d"}, + {file = "cramjam-2.8.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b188e750b95172c01defcfcfbba629cad797718b34402ec61b3bc9ff99403599"}, + {file = "cramjam-2.8.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30e2d745cd4d244b7973d15aaebeedb537b980f9d3da80e6dea75ee1a872f9fa"}, + {file = "cramjam-2.8.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c9d54a4aa475d5e902f2ee518bdaa02f26c089e9f72950d00d1643c090f0deb3"}, + {file = "cramjam-2.8.3-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:19b8c97350c8d65daea26267dd1becb59073569aac2ae5743952d7f48da5d37a"}, + {file = "cramjam-2.8.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3277fd42399755d6d3730edec4a192174ee64d219e0ffbc90613f15cbabf711f"}, + {file = "cramjam-2.8.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1fd25201f1278dc6faa2ae35e67b7a5bb352b7fc6ed1ee939637414ca8115863"}, + {file = "cramjam-2.8.3-cp38-none-win32.whl", hash = "sha256:594477faff7f4380fa123cfbcf10ab8ee5af1a28b95750b66931ffafcb11ab5c"}, + {file = "cramjam-2.8.3-cp38-none-win_amd64.whl", hash = "sha256:8ea1dc11538842ff20d9872a17214994f5913cbf3be5594b54aad2422becdf19"}, + {file = "cramjam-2.8.3-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:6379b92912f7569e126bd48d10e7087ddd20ea88a939532e3c4a85c2fa05d600"}, + {file = "cramjam-2.8.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:11d2e9eebc7d202eda0ae09fb56a2cdbeb5a1563e89d2118bf18cf0030f35f77"}, + {file = "cramjam-2.8.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d5a0a2fe240c97587df07f3d5e1027673d599b3a6a7a0ab540aea69f09e9ff7a"}, + {file = "cramjam-2.8.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba542f07fe3f41475d78626973533539e6cf2d5b6af37923fe6c7e7f0f74b9b2"}, + {file = "cramjam-2.8.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1374fe9a4431e546bb4501a16b84875d0bf80fc4e6c8942f0d5608ae48474267"}, + {file = "cramjam-2.8.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dcf7791e1cedb982ccc873ec9392c6cfb9c714a64ebf1ed4e8310b9cb44655f2"}, + {file = "cramjam-2.8.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:990e65c2bf1c155a9ddec5ecabf431cf77596432f697d3c6e0831b5174c51c40"}, + {file = "cramjam-2.8.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9b244d04cef82872d12c227a2f202f080a454d664c05db351626e6ad4aaa307"}, + {file = "cramjam-2.8.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:80b088d15866b37851fd53e2b471becc9ec487257dceca1878621072a18e833e"}, + {file = "cramjam-2.8.3-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:f667843e7a8fca208eecfe44e04088242f8ca60d74d4950fac3722043538d700"}, + {file = "cramjam-2.8.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6f838d06d06709b9ce8b1ceae36aea4e1c7e613365185a91edcbeb5884f5e606"}, + {file = "cramjam-2.8.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4822eb5fe6839cd3d0439e5431e766ad010b2a388ca9617aa6372b6030897782"}, + {file = "cramjam-2.8.3-cp39-none-win32.whl", hash = "sha256:67e09b42e744efd08b93ac56f6100a859a31617d7146725516f3f2c744149d97"}, + {file = "cramjam-2.8.3-cp39-none-win_amd64.whl", hash = "sha256:11c9d30bc53892c57a3b296756c23659323ab1419a2b4bf22bbafc07b247bb67"}, + {file = "cramjam-2.8.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:51e847dcfe74fba379fed2bc2b45f5c2f11c3ece5e9eebcf63f39a9594184588"}, + {file = "cramjam-2.8.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07af94191f6a245226dc8a8bc6c94808e382ce9dfcca4bab0e8015fbc7fc3322"}, + {file = "cramjam-2.8.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc9c45469914099897c47bfc501616fb377f28a865adebf90ea6f3c8ae6dd4e6"}, + {file = "cramjam-2.8.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ef29fb916fe74be65d0ab8871ab8d964b0f5eb8028bb84b325be43675a59d6e7"}, + {file = "cramjam-2.8.3-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3850dac9a2f6dcb3249d23f9d505117643b967bdc1c572ed0cc492a48fd69daf"}, + {file = "cramjam-2.8.3-pp310-pypy310_pp73-musllinux_1_1_i686.whl", hash = "sha256:e23e323ad28ed3e4e3a24ceffdab0ff235954109a88b536ea7b3b7886bd0a536"}, + {file = "cramjam-2.8.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1ba1a8ff855b30b4069a9b45ea9e7f2b5d882c7953bdfccda8d4b275fa7057ce"}, + {file = "cramjam-2.8.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eea606b01b43b91626e3aafd463bd19b6ed739bdb8b2b309e5d7ff72afc0e89d"}, + {file = "cramjam-2.8.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:97c706c520c3f8b0184278cc86187528458350216c6e4fa85d3f16bcad0d365d"}, + {file = "cramjam-2.8.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d08f1bab949ffd6dd6f25a89e4f7062d147aeea9c067e4dd155bdb190e5a519"}, + {file = "cramjam-2.8.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba1e45074757ab0482ac544e60613b6b8658100ac9985c91868a4598cdfb63ba"}, + {file = "cramjam-2.8.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a2fededed05a042f093dbf1b11d69afb1874a2c9197fcf1d58c142ba9111db5a"}, + {file = "cramjam-2.8.3-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:fc0c6eb8185c68f79a25bb298825e345cc09b826f5828bd8146e3600ca6e9981"}, + {file = "cramjam-2.8.3-pp39-pypy39_pp73-musllinux_1_1_i686.whl", hash = "sha256:6653c262ad71e6c0ae08eeca3af2ee89ad47483b6312f2c6094518cb77872406"}, + {file = "cramjam-2.8.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:6c04f363cb4b316719421724521432b6e7f6490e5baaaf7692af961c28d0279b"}, + {file = "cramjam-2.8.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e30f1f00de913b440baa36647817b9b7120a69b04eca05f3354aaf5b40f95ee5"}, + {file = "cramjam-2.8.3.tar.gz", hash = "sha256:6b1fa0a6ea8183831d04572597c182bd6cece62d583a36cde1e6a86e72ce2389"}, +] + +[package.extras] +dev = ["black (==22.3.0)", "hypothesis", "numpy", "pytest (>=5.30)", "pytest-xdist"] + +[[package]] +name = "cryptography" +version = "42.0.8" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, + {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, + {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, + {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, + {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, + {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, + {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] +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-randomorder = ["pytest-randomly"] + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "dask" +version = "2024.6.2" +description = "Parallel PyData with Task Scheduling" +optional = false +python-versions = ">=3.9" +files = [ + {file = "dask-2024.6.2-py3-none-any.whl", hash = "sha256:81b80ee015b2e057b93bb2d1bf13a866136e762e2b24bf54b6b621e8b86b7708"}, + {file = "dask-2024.6.2.tar.gz", hash = "sha256:d429d6b19e85fd1306ac37c188aaf99d03bbe69a6fe59d2b42882b2ac188686f"}, +] + +[package.dependencies] +click = ">=8.1" +cloudpickle = ">=1.5.0" +dask-expr = {version = ">=1.1,<1.2", optional = true, markers = "extra == \"dataframe\""} +fsspec = ">=2021.09.0" +importlib-metadata = {version = ">=4.13.0", markers = "python_version < \"3.12\""} +numpy = {version = ">=1.21", optional = true, markers = "extra == \"array\""} +packaging = ">=20.0" +pandas = {version = ">=1.3", optional = true, markers = "extra == \"dataframe\""} +partd = ">=1.2.0" +pyyaml = ">=5.3.1" +toolz = ">=0.10.0" + +[package.extras] +array = ["numpy (>=1.21)"] +complete = ["dask[array,dataframe,diagnostics,distributed]", "lz4 (>=4.3.2)", "pyarrow (>=7.0)", "pyarrow-hotfix"] +dataframe = ["dask-expr (>=1.1,<1.2)", "dask[array]", "pandas (>=1.3)"] +diagnostics = ["bokeh (>=2.4.2)", "jinja2 (>=2.10.3)"] +distributed = ["distributed (==2024.6.2)"] +test = ["pandas[test]", "pre-commit", "pytest", "pytest-cov", "pytest-rerunfailures", "pytest-timeout", "pytest-xdist"] + +[[package]] +name = "dask-expr" +version = "1.1.6" +description = "High Level Expressions for Dask" +optional = false +python-versions = ">=3.9" +files = [ + {file = "dask_expr-1.1.6-py3-none-any.whl", hash = "sha256:04e31cb941b7cbdce7b1384f2bcf17fd17e828e45e9c74491e28473095ee6891"}, + {file = "dask_expr-1.1.6.tar.gz", hash = "sha256:ace366c6d9c248a7fa7b48f7a34140afae3b6a0ea14ee57743babe5a9d1ef43f"}, +] + +[package.dependencies] +dask = "2024.6.2" +pandas = ">=2" +pyarrow = ">=7.0.0" + +[package.extras] +analyze = ["crick", "distributed"] + +[[package]] +name = "datashaper" +version = "0.0.49" +description = "This project provides a collection of utilities for doing lightweight data wrangling." +optional = false +python-versions = ">=3.10,<4" +files = [ + {file = "datashaper-0.0.49-py3-none-any.whl", hash = "sha256:7f58cabacc834765595c6e04cfbbd05be6af71907e46ebc7a91d2a4add7c2643"}, + {file = "datashaper-0.0.49.tar.gz", hash = "sha256:05bfba5964474a62bdd5259ec3fa0173d01e365208b6a4aff4ea0e63096a7533"}, +] + +[package.dependencies] +diskcache = ">=5.6.3,<6.0.0" +jsonschema = ">=4.21.1,<5.0.0" +pandas = ">=2.2.0,<3.0.0" +pyarrow = ">=15.0.0,<16.0.0" + +[[package]] +name = "debugpy" +version = "1.8.2" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7ee2e1afbf44b138c005e4380097d92532e1001580853a7cb40ed84e0ef1c3d2"}, + {file = "debugpy-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f8c3f7c53130a070f0fc845a0f2cee8ed88d220d6b04595897b66605df1edd6"}, + {file = "debugpy-1.8.2-cp310-cp310-win32.whl", hash = "sha256:f179af1e1bd4c88b0b9f0fa153569b24f6b6f3de33f94703336363ae62f4bf47"}, + {file = "debugpy-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:0600faef1d0b8d0e85c816b8bb0cb90ed94fc611f308d5fde28cb8b3d2ff0fe3"}, + {file = "debugpy-1.8.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a"}, + {file = "debugpy-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acdf39855f65c48ac9667b2801234fc64d46778021efac2de7e50907ab90c634"}, + {file = "debugpy-1.8.2-cp311-cp311-win32.whl", hash = "sha256:2cbd4d9a2fc5e7f583ff9bf11f3b7d78dfda8401e8bb6856ad1ed190be4281ad"}, + {file = "debugpy-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:d3408fddd76414034c02880e891ea434e9a9cf3a69842098ef92f6e809d09afa"}, + {file = "debugpy-1.8.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835"}, + {file = "debugpy-1.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3"}, + {file = "debugpy-1.8.2-cp312-cp312-win32.whl", hash = "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e"}, + {file = "debugpy-1.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859"}, + {file = "debugpy-1.8.2-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:5a019d4574afedc6ead1daa22736c530712465c0c4cd44f820d803d937531b2d"}, + {file = "debugpy-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40f062d6877d2e45b112c0bbade9a17aac507445fd638922b1a5434df34aed02"}, + {file = "debugpy-1.8.2-cp38-cp38-win32.whl", hash = "sha256:c78ba1680f1015c0ca7115671fe347b28b446081dada3fedf54138f44e4ba031"}, + {file = "debugpy-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:cf327316ae0c0e7dd81eb92d24ba8b5e88bb4d1b585b5c0d32929274a66a5210"}, + {file = "debugpy-1.8.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:1523bc551e28e15147815d1397afc150ac99dbd3a8e64641d53425dba57b0ff9"}, + {file = "debugpy-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e24ccb0cd6f8bfaec68d577cb49e9c680621c336f347479b3fce060ba7c09ec1"}, + {file = "debugpy-1.8.2-cp39-cp39-win32.whl", hash = "sha256:7f8d57a98c5a486c5c7824bc0b9f2f11189d08d73635c326abef268f83950326"}, + {file = "debugpy-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:16c8dcab02617b75697a0a925a62943e26a0330da076e2a10437edd9f0bf3755"}, + {file = "debugpy-1.8.2-py2.py3-none-any.whl", hash = "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca"}, + {file = "debugpy-1.8.2.zip", hash = "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + +[[package]] +name = "deprecation" +version = "2.1.0" +description = "A library to handle automated deprecations" +optional = false +python-versions = "*" +files = [ + {file = "deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"}, + {file = "deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff"}, +] + +[package.dependencies] +packaging = "*" + +[[package]] +name = "devtools" +version = "0.12.2" +description = "Python's missing debug print command, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "devtools-0.12.2-py3-none-any.whl", hash = "sha256:c366e3de1df4cdd635f1ad8cbcd3af01a384d7abda71900e68d43b04eb6aaca7"}, + {file = "devtools-0.12.2.tar.gz", hash = "sha256:efceab184cb35e3a11fa8e602cc4fadacaa2e859e920fc6f87bf130b69885507"}, +] + +[package.dependencies] +asttokens = ">=2.0.0,<3.0.0" +executing = ">=1.1.1" +pygments = ">=2.15.0" + +[[package]] +name = "diskcache" +version = "5.6.3" +description = "Disk Cache -- Disk and file backed persistent cache." +optional = false +python-versions = ">=3" +files = [ + {file = "diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19"}, + {file = "diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc"}, +] + +[[package]] +name = "distro" +version = "1.9.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, +] + +[[package]] +name = "environs" +version = "11.0.0" +description = "simplified environment variable parsing" +optional = false +python-versions = ">=3.8" +files = [ + {file = "environs-11.0.0-py3-none-any.whl", hash = "sha256:e0bcfd41c718c07a7db422f9109e490746450da38793fe4ee197f397b9343435"}, + {file = "environs-11.0.0.tar.gz", hash = "sha256:069727a8f73d8ba8d033d3cd95c0da231d44f38f1da773bf076cef168d312ee8"}, +] + +[package.dependencies] +marshmallow = ">=3.13.0" +python-dotenv = "*" + +[package.extras] +dev = ["environs[tests]", "pre-commit (>=3.5,<4.0)", "tox"] +django = ["dj-database-url", "dj-email-url", "django-cache-url"] +tests = ["environs[django]", "pytest"] + +[[package]] +name = "exceptiongroup" +version = "1.2.1" +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"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "executing" +version = "2.0.1" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.5" +files = [ + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "fastjsonschema" +version = "2.20.0" +description = "Fastest Python implementation of JSON schema" +optional = false +python-versions = "*" +files = [ + {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, + {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + +[[package]] +name = "fastparquet" +version = "2024.5.0" +description = "Python support for Parquet file format" +optional = false +python-versions = ">=3.9" +files = [ + {file = "fastparquet-2024.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9dfbed87b4b58b0794b2cb3aa4abcb43fc01480a10c7779a323d2dd1599f6acd"}, + {file = "fastparquet-2024.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07fc5a45450a39cd07c6ef0e0219ac4b1879f8b27c825ee4ba5d87a3ae505f11"}, + {file = "fastparquet-2024.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a2045c21f90358541286f26f0735bfb2265b075413fbced3b876fc8848eda52"}, + {file = "fastparquet-2024.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f411056152b5d3cc82b6624d9da80535d10d9277d921fdb2e9516e93c8c227e8"}, + {file = "fastparquet-2024.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc99d7c0f1816394d53aadd47919bba70bb81355259d8788d28e35913816aee0"}, + {file = "fastparquet-2024.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:42149929b71d9122bd501aa695681f40a04a9fa3f5b802cf0fb6aa4e95ccf2dd"}, + {file = "fastparquet-2024.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e5b1ed889f4ac7ea059ff95f4a01f5c07c825c50c2e1bc9e2b64c814df94c243"}, + {file = "fastparquet-2024.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:f5c3cabcfa2f534e4b23343c1ab84c37d336da73770005e608d1894ab1084600"}, + {file = "fastparquet-2024.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:56d03b0a291d6a575ab365516c53b4da8e040347f8d43af79be25893c591b38c"}, + {file = "fastparquet-2024.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:784989ee2c251960b8f00dc38c6c730f784712c8e3d08cc7e0ce842055476af1"}, + {file = "fastparquet-2024.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d20bba5c39139a88d8d6931764b830ba14042742d802238d9edf86d4d765ad7a"}, + {file = "fastparquet-2024.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08358d99278c5d3fb523d819fff5c74d572d8f67ebbe2215a2c7bfca7e3664cf"}, + {file = "fastparquet-2024.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9de270e17a6ae2f02c716421d60e18d35d4718037f561b3e359989db19f700a"}, + {file = "fastparquet-2024.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba251231b005c0f3f7e56f6e9cd1939be99b2d810ab5b05039271e260c0196c6"}, + {file = "fastparquet-2024.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1496d83d7a77c19abae796e3b582539884fc893d75a3ad4f90df12f8f23a902a"}, + {file = "fastparquet-2024.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:ea3796c4a38ef8b372a3056b5cef52ca8182fa554fa51c7637c2421e69ee56e5"}, + {file = "fastparquet-2024.5.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e1fa068ef1826bff6d4a9106a6f9e9d6fd20b8b516da4b82d87840cb5fd3947c"}, + {file = "fastparquet-2024.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a60f7b0b308d6b9f12c642cf5237a05d754926fb31ce865ff7072bceab19fbb"}, + {file = "fastparquet-2024.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e6ac308a2f391ce589c99b8376e7cdfe4241ef5770ac4cf4c1c93f940bda83c"}, + {file = "fastparquet-2024.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b3cf7b4eb1b06e87b97a3a5c9124e4b1c08a8903ba017052c5fe2c482414a3d"}, + {file = "fastparquet-2024.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5626fc72204001b7e82fedb4b02174ecb4e2d4143b38b4ea8d2f9eb65f6b000e"}, + {file = "fastparquet-2024.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c8b2e86fe6488cce0e3d41263bb0296ef9bbb875a2fca09d67d7685640017a66"}, + {file = "fastparquet-2024.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2a951106782d51e5ab110beaad29c4aa0537f045711bb0bf146f65aeaed14174"}, + {file = "fastparquet-2024.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:47695037fdc534ef4247f25ccf17dcbd8825be6ecb70c54ca54d588a794f4a6d"}, + {file = "fastparquet-2024.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc3d35ff8341cd65baecac71062e9d73393d7afda207b3421709c1d3f4baa194"}, + {file = "fastparquet-2024.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:691348cc85890663dd3c0bb02544d38d4c07a0c3d68837324dc01007301150b5"}, + {file = "fastparquet-2024.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfdc8aaec67edd30814c2c2f0e291eb3c3044525d18c87e835ef8793d6e2ea2d"}, + {file = "fastparquet-2024.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0034d1b5af3a71cc2fb29c590f442c0b514f710d6d6996794ae375dcfe050c05"}, + {file = "fastparquet-2024.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:b562be0f43a007493014512602ab6b0207d13ea4ae85e0d94d61febf08efa1ee"}, + {file = "fastparquet-2024.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:611da9043f9dab1c63e6c90a6b124e3d2789c34fefa00d45356517f1e8a09c83"}, + {file = "fastparquet-2024.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:cb93e8951f46943c8567c9a555cb3d24d2c78efdf78e95fd72177d80da73a10f"}, + {file = "fastparquet-2024.5.0.tar.gz", hash = "sha256:dffd1d0ac6e89e31c5b6dacf67a8d299d4afbbcf0bf8b797373904c819c48f51"}, +] + +[package.dependencies] +cramjam = ">=2.3" +fsspec = "*" +numpy = "*" +packaging = "*" +pandas = ">=1.5.0" + +[package.extras] +lzo = ["python-lzo"] + +[[package]] +name = "fonttools" +version = "4.53.0" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.53.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:52a6e0a7a0bf611c19bc8ec8f7592bdae79c8296c70eb05917fd831354699b20"}, + {file = "fonttools-4.53.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:099634631b9dd271d4a835d2b2a9e042ccc94ecdf7e2dd9f7f34f7daf333358d"}, + {file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e40013572bfb843d6794a3ce076c29ef4efd15937ab833f520117f8eccc84fd6"}, + {file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715b41c3e231f7334cbe79dfc698213dcb7211520ec7a3bc2ba20c8515e8a3b5"}, + {file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74ae2441731a05b44d5988d3ac2cf784d3ee0a535dbed257cbfff4be8bb49eb9"}, + {file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:95db0c6581a54b47c30860d013977b8a14febc206c8b5ff562f9fe32738a8aca"}, + {file = "fonttools-4.53.0-cp310-cp310-win32.whl", hash = "sha256:9cd7a6beec6495d1dffb1033d50a3f82dfece23e9eb3c20cd3c2444d27514068"}, + {file = "fonttools-4.53.0-cp310-cp310-win_amd64.whl", hash = "sha256:daaef7390e632283051e3cf3e16aff2b68b247e99aea916f64e578c0449c9c68"}, + {file = "fonttools-4.53.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a209d2e624ba492df4f3bfad5996d1f76f03069c6133c60cd04f9a9e715595ec"}, + {file = "fonttools-4.53.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f520d9ac5b938e6494f58a25c77564beca7d0199ecf726e1bd3d56872c59749"}, + {file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eceef49f457253000e6a2d0f7bd08ff4e9fe96ec4ffce2dbcb32e34d9c1b8161"}, + {file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1f3e34373aa16045484b4d9d352d4c6b5f9f77ac77a178252ccbc851e8b2ee"}, + {file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:28d072169fe8275fb1a0d35e3233f6df36a7e8474e56cb790a7258ad822b6fd6"}, + {file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a2a6ba400d386e904fd05db81f73bee0008af37799a7586deaa4aef8cd5971e"}, + {file = "fonttools-4.53.0-cp311-cp311-win32.whl", hash = "sha256:bb7273789f69b565d88e97e9e1da602b4ee7ba733caf35a6c2affd4334d4f005"}, + {file = "fonttools-4.53.0-cp311-cp311-win_amd64.whl", hash = "sha256:9fe9096a60113e1d755e9e6bda15ef7e03391ee0554d22829aa506cdf946f796"}, + {file = "fonttools-4.53.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d8f191a17369bd53a5557a5ee4bab91d5330ca3aefcdf17fab9a497b0e7cff7a"}, + {file = "fonttools-4.53.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:93156dd7f90ae0a1b0e8871032a07ef3178f553f0c70c386025a808f3a63b1f4"}, + {file = "fonttools-4.53.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bff98816cb144fb7b85e4b5ba3888a33b56ecef075b0e95b95bcd0a5fbf20f06"}, + {file = "fonttools-4.53.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:973d030180eca8255b1bce6ffc09ef38a05dcec0e8320cc9b7bcaa65346f341d"}, + {file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c4ee5a24e281fbd8261c6ab29faa7fd9a87a12e8c0eed485b705236c65999109"}, + {file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bd5bc124fae781a4422f61b98d1d7faa47985f663a64770b78f13d2c072410c2"}, + {file = "fonttools-4.53.0-cp312-cp312-win32.whl", hash = "sha256:a239afa1126b6a619130909c8404070e2b473dd2b7fc4aacacd2e763f8597fea"}, + {file = "fonttools-4.53.0-cp312-cp312-win_amd64.whl", hash = "sha256:45b4afb069039f0366a43a5d454bc54eea942bfb66b3fc3e9a2c07ef4d617380"}, + {file = "fonttools-4.53.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:93bc9e5aaa06ff928d751dc6be889ff3e7d2aa393ab873bc7f6396a99f6fbb12"}, + {file = "fonttools-4.53.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2367d47816cc9783a28645bc1dac07f8ffc93e0f015e8c9fc674a5b76a6da6e4"}, + {file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:907fa0b662dd8fc1d7c661b90782ce81afb510fc4b7aa6ae7304d6c094b27bce"}, + {file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e0ad3c6ea4bd6a289d958a1eb922767233f00982cf0fe42b177657c86c80a8f"}, + {file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:73121a9b7ff93ada888aaee3985a88495489cc027894458cb1a736660bdfb206"}, + {file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ee595d7ba9bba130b2bec555a40aafa60c26ce68ed0cf509983e0f12d88674fd"}, + {file = "fonttools-4.53.0-cp38-cp38-win32.whl", hash = "sha256:fca66d9ff2ac89b03f5aa17e0b21a97c21f3491c46b583bb131eb32c7bab33af"}, + {file = "fonttools-4.53.0-cp38-cp38-win_amd64.whl", hash = "sha256:31f0e3147375002aae30696dd1dc596636abbd22fca09d2e730ecde0baad1d6b"}, + {file = "fonttools-4.53.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d6166192dcd925c78a91d599b48960e0a46fe565391c79fe6de481ac44d20ac"}, + {file = "fonttools-4.53.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef50ec31649fbc3acf6afd261ed89d09eb909b97cc289d80476166df8438524d"}, + {file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f193f060391a455920d61684a70017ef5284ccbe6023bb056e15e5ac3de11d1"}, + {file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9f09ff17f947392a855e3455a846f9855f6cf6bec33e9a427d3c1d254c712f"}, + {file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0c555e039d268445172b909b1b6bdcba42ada1cf4a60e367d68702e3f87e5f64"}, + {file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a4788036201c908079e89ae3f5399b33bf45b9ea4514913f4dbbe4fac08efe0"}, + {file = "fonttools-4.53.0-cp39-cp39-win32.whl", hash = "sha256:d1a24f51a3305362b94681120c508758a88f207fa0a681c16b5a4172e9e6c7a9"}, + {file = "fonttools-4.53.0-cp39-cp39-win_amd64.whl", hash = "sha256:1e677bfb2b4bd0e5e99e0f7283e65e47a9814b0486cb64a41adf9ef110e078f2"}, + {file = "fonttools-4.53.0-py3-none-any.whl", hash = "sha256:6b4f04b1fbc01a3569d63359f2227c89ab294550de277fd09d8fca6185669fa4"}, + {file = "fonttools-4.53.0.tar.gz", hash = "sha256:c93ed66d32de1559b6fc348838c7572d5c0ac1e4a258e76763a5caddd8944002"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "fqdn" +version = "1.5.1" +description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" +optional = false +python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +files = [ + {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, + {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, +] + +[[package]] +name = "fsspec" +version = "2024.6.1" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e"}, + {file = "fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +dev = ["pre-commit", "ruff"] +doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] +tqdm = ["tqdm"] + +[[package]] +name = "future" +version = "1.0.0" +description = "Clean single-source support for Python 3 and 2" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216"}, + {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"}, +] + +[[package]] +name = "gensim" +version = "4.3.2" +description = "Python framework for fast Vector Space Modelling" +optional = false +python-versions = ">=3.8" +files = [ + {file = "gensim-4.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:31b3cb313939b6940ee21660177f6405e71b920da462dbf065b2458a24ab33e1"}, + {file = "gensim-4.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:67c41b15e19e4950f57124f633c45839b5c84268ffa58079c5b0c0f04d2a9cb9"}, + {file = "gensim-4.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9bf1a8ee2e8214499c517008a0fd175ce5c649954a88569358cfae6bfca42dc"}, + {file = "gensim-4.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e34ee6f8a318fbf0b65e6d39a985ecf9e9051febfd1221ae6255fff1972c547"}, + {file = "gensim-4.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c46b7395dc57c83329932f3febed9660891fdcc75327d56f55000e3e08898983"}, + {file = "gensim-4.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a919493339cfad39d5e76768c1bc546cd507f715c5fca93165cc174a97657457"}, + {file = "gensim-4.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8dcd1419266bd563c371d25530f4dce3505fe78059b2c0c08724e4f9e5479b38"}, + {file = "gensim-4.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3e8035ac3f54dca3a8ca56bec526ddfe5b23006e0134b7375ca5f5dbfaef70a"}, + {file = "gensim-4.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c3b537c1fd4699c8e6d59c3ffa2fdd9918cd4e5555bf5ee7c1fbedd89b2d643"}, + {file = "gensim-4.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5a52001226f9e89f7833503f99c9b4fd028fdf837002f24cdc1bc3cf901a4003"}, + {file = "gensim-4.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e8d62604efb8281a25254e5a6c14227034c267ed56635e590c9cae2635196dca"}, + {file = "gensim-4.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bf7a9dc37c2ca465c7834863a7b264369c1373bb474135df225cee654b8adfab"}, + {file = "gensim-4.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a33ff0d4cf3e50e7ddd7353fb38ed2d4af2e48a6ef58d622809862c30c8b8a2"}, + {file = "gensim-4.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99876be00b73c7cef01f427d241b07eb1c1b298fb411580cc1067d22c43a13be"}, + {file = "gensim-4.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:f785b3caf376a1f2989e0f3c890642e5b1566393fd3831dab03fc6670d672814"}, + {file = "gensim-4.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c86915cf0e0b86658a40a070bd7e04db0814065963657e92910303070275865d"}, + {file = "gensim-4.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:548c7bf983e619d6b8d78b6a5321dcbcba5b39f68779a0d36e38a5a971416276"}, + {file = "gensim-4.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:226690ea081b92a2289661a25e8a89069ae09b1ed4137b67a0d6ec211e0371d3"}, + {file = "gensim-4.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4715eafcd309c2f7e030829eddba72fe47bbe9bb466811fce3158127d29c8979"}, + {file = "gensim-4.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b3f26299ac241ff54329a54c37c22eac1bf4c4a337068adf2637259ee0d8484a"}, + {file = "gensim-4.3.2.tar.gz", hash = "sha256:99ac6af6ffd40682e70155ed9f92ecbf4384d59fb50af120d343ea5ee1b308ab"}, +] + +[package.dependencies] +numpy = ">=1.18.5" +scipy = ">=1.7.0" +smart-open = ">=1.8.1" + +[package.extras] +distributed = ["Pyro4 (>=4.27)"] +docs = ["POT", "Pyro4", "Pyro4 (>=4.27)", "annoy", "matplotlib", "memory-profiler", "mock", "nltk", "pandas", "pytest", "pytest-cov", "scikit-learn", "sphinx (==5.1.1)", "sphinx-gallery (==0.11.1)", "sphinxcontrib-napoleon (==0.7)", "sphinxcontrib.programoutput (==0.17)", "statsmodels", "testfixtures", "visdom (>=0.1.8,!=0.1.8.7)"] +test = ["POT", "mock", "pytest", "pytest-cov", "testfixtures", "visdom (>=0.1.8,!=0.1.8.7)"] +test-win = ["POT", "mock", "pytest", "pytest-cov", "testfixtures"] + +[[package]] +name = "graspologic" +version = "3.4.1" +description = "A set of Python modules for graph statistics" +optional = false +python-versions = "<3.13,>=3.9" +files = [ + {file = "graspologic-3.4.1-py3-none-any.whl", hash = "sha256:c6563e087eda599bad1de831d4b7321c0daa7a82f4e85a7d7737ff67e07cdda2"}, + {file = "graspologic-3.4.1.tar.gz", hash = "sha256:7561f0b852a2bccd351bff77e8db07d9892f9dfa35a420fdec01690e4fdc8075"}, +] + +[package.dependencies] +anytree = ">=2.12.1,<3.0.0" +beartype = ">=0.18.5,<0.19.0" +gensim = ">=4.3.2,<5.0.0" +graspologic-native = ">=1.2.1,<2.0.0" +hyppo = ">=0.4.0,<0.5.0" +joblib = ">=1.4.2,<2.0.0" +matplotlib = ">=3.8.4,<4.0.0" +networkx = ">=3,<4" +numpy = ">=1.26.4,<2.0.0" +POT = ">=0.9,<0.10" +scikit-learn = ">=1.4.2,<2.0.0" +scipy = "1.12.0" +seaborn = ">=0.13.2,<0.14.0" +statsmodels = ">=0.14.2,<0.15.0" +typing-extensions = ">=4.4.0,<5.0.0" +umap-learn = ">=0.5.6,<0.6.0" + +[[package]] +name = "graspologic-native" +version = "1.2.1" +description = "Python native companion module to the graspologic library" +optional = false +python-versions = ">=3.6, <3.13" +files = [ + {file = "graspologic_native-1.2.1-cp36-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:eccb2fa475b604375e34b4ae1d5497a428c34ed65f27888495239f8e120acea1"}, + {file = "graspologic_native-1.2.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a44cfdee11718c01c0f6c544750b3ae64e28cc03432a620fe0295704bd0d618d"}, + {file = "graspologic_native-1.2.1-cp36-abi3-win_amd64.whl", hash = "sha256:56b5e66ba003fd38efc0919ce90fa22d379456e177dca65e26626498d2b9b96b"}, + {file = "graspologic_native-1.2.1.tar.gz", hash = "sha256:72b7586028a91e9fef9af0ef314d368f0240c18dca99e6e6c546334359a8610a"}, +] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "hyppo" +version = "0.4.0" +description = "A comprehensive independence testing package" +optional = false +python-versions = "*" +files = [ + {file = "hyppo-0.4.0-py3-none-any.whl", hash = "sha256:4e75565b8deb601485cd7bc1b5c3f44e6ddf329136fc81e65d011f9b4e95132f"}, +] + +[package.dependencies] +autograd = ">=1.3" +numba = ">=0.46" +numpy = ">=1.17" +scikit-learn = ">=0.19.1" +scipy = ">=1.4.0" + +[[package]] +name = "idna" +version = "3.7" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] + +[[package]] +name = "importlib-metadata" +version = "8.0.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, + {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "ipykernel" +version = "6.29.5" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=24" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.26.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.10" +files = [ + {file = "ipython-8.26.0-py3-none-any.whl", hash = "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff"}, + {file = "ipython-8.26.0.tar.gz", hash = "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt-toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5.13.0" +typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} + +[package.extras] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "intersphinx-registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing-extensions"] +kernel = ["ipykernel"] +matplotlib = ["matplotlib"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + +[[package]] +name = "ipywidgets" +version = "8.1.3" +description = "Jupyter interactive widgets" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ipywidgets-8.1.3-py3-none-any.whl", hash = "sha256:efafd18f7a142248f7cb0ba890a68b96abd4d6e88ddbda483c9130d12667eaf2"}, + {file = "ipywidgets-8.1.3.tar.gz", hash = "sha256:f5f9eeaae082b1823ce9eac2575272952f40d748893972956dc09700a6392d9c"}, +] + +[package.dependencies] +comm = ">=0.1.3" +ipython = ">=6.1.0" +jupyterlab-widgets = ">=3.0.11,<3.1.0" +traitlets = ">=4.3.1" +widgetsnbextension = ">=4.0.11,<4.1.0" + +[package.extras] +test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] + +[[package]] +name = "isodate" +version = "0.6.1" +description = "An ISO 8601 date/time/duration parser and formatter" +optional = false +python-versions = "*" +files = [ + {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, + {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "isoduration" +version = "20.11.0" +description = "Operations with ISO 8601 durations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, + {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, +] + +[package.dependencies] +arrow = ">=0.15.0" + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "joblib" +version = "1.4.2" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, +] + +[[package]] +name = "json5" +version = "0.9.25" +description = "A Python implementation of the JSON5 data format." +optional = false +python-versions = ">=3.8" +files = [ + {file = "json5-0.9.25-py3-none-any.whl", hash = "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f"}, + {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"}, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, +] + +[[package]] +name = "jsonschema" +version = "4.22.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, + {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} +rpds-py = ">=0.7.1" +uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format-nongpl\""} + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "jupyter" +version = "1.0.0" +description = "Jupyter metapackage. Install all the Jupyter components in one go." +optional = false +python-versions = "*" +files = [ + {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, + {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"}, + {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, +] + +[package.dependencies] +ipykernel = "*" +ipywidgets = "*" +jupyter-console = "*" +nbconvert = "*" +notebook = "*" +qtconsole = "*" + +[[package]] +name = "jupyter-client" +version = "8.6.2" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, + {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, +] + +[package.dependencies] +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-console" +version = "6.6.3" +description = "Jupyter terminal console" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485"}, + {file = "jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539"}, +] + +[package.dependencies] +ipykernel = ">=6.14" +ipython = "*" +jupyter-client = ">=7.0.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +prompt-toolkit = ">=3.0.30" +pygments = "*" +pyzmq = ">=17" +traitlets = ">=5.4" + +[package.extras] +test = ["flaky", "pexpect", "pytest"] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyter-events" +version = "0.10.0" +description = "Jupyter Event System library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_events-0.10.0-py3-none-any.whl", hash = "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960"}, + {file = "jupyter_events-0.10.0.tar.gz", hash = "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22"}, +] + +[package.dependencies] +jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} +python-json-logger = ">=2.0.4" +pyyaml = ">=5.3" +referencing = "*" +rfc3339-validator = "*" +rfc3986-validator = ">=0.1.1" +traitlets = ">=5.3" + +[package.extras] +cli = ["click", "rich"] +docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] +test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] + +[[package]] +name = "jupyter-lsp" +version = "2.2.5" +description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001"}, + {file = "jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da"}, +] + +[package.dependencies] +jupyter-server = ">=1.1.2" + +[[package]] +name = "jupyter-server" +version = "2.14.1" +description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server-2.14.1-py3-none-any.whl", hash = "sha256:16f7177c3a4ea8fe37784e2d31271981a812f0b2874af17339031dc3510cc2a5"}, + {file = "jupyter_server-2.14.1.tar.gz", hash = "sha256:12558d158ec7a0653bf96cc272bc7ad79e0127d503b982ed144399346694f726"}, +] + +[package.dependencies] +anyio = ">=3.1.0" +argon2-cffi = ">=21.1" +jinja2 = ">=3.0.3" +jupyter-client = ">=7.4.4" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +jupyter-events = ">=0.9.0" +jupyter-server-terminals = ">=0.4.4" +nbconvert = ">=6.4.4" +nbformat = ">=5.3.0" +overrides = ">=5.0" +packaging = ">=22.0" +prometheus-client = ">=0.9" +pywinpty = {version = ">=2.0.1", markers = "os_name == \"nt\""} +pyzmq = ">=24" +send2trash = ">=1.8.2" +terminado = ">=0.8.3" +tornado = ">=6.2.0" +traitlets = ">=5.6.0" +websocket-client = ">=1.7" + +[package.extras] +docs = ["ipykernel", "jinja2", "jupyter-client", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] +test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0,<9)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.3" +description = "A Jupyter Server Extension Providing Terminals." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, + {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, +] + +[package.dependencies] +pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} +terminado = ">=0.8.3" + +[package.extras] +docs = ["jinja2", "jupyter-server", "mistune (<4.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] +test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] + +[[package]] +name = "jupyterlab" +version = "4.2.3" +description = "JupyterLab computational environment" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab-4.2.3-py3-none-any.whl", hash = "sha256:0b59d11808e84bb84105c73364edfa867dd475492429ab34ea388a52f2e2e596"}, + {file = "jupyterlab-4.2.3.tar.gz", hash = "sha256:df6e46969ea51d66815167f23d92f105423b7f1f06fa604d4f44aeb018c82c7b"}, +] + +[package.dependencies] +async-lru = ">=1.0.0" +httpx = ">=0.25.0" +ipykernel = ">=6.5.0" +jinja2 = ">=3.0.3" +jupyter-core = "*" +jupyter-lsp = ">=2.0.0" +jupyter-server = ">=2.4.0,<3" +jupyterlab-server = ">=2.27.1,<3" +notebook-shim = ">=0.2" +packaging = "*" +setuptools = ">=40.1.0" +tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} +tornado = ">=6.2.0" +traitlets = "*" + +[package.extras] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.3.5)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<7.3.0)", "sphinx-copybutton"] +docs-screenshots = ["altair (==5.3.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.2)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.1.post2)", "matplotlib (==3.8.3)", "nbconvert (>=7.0.0)", "pandas (==2.2.1)", "scipy (==1.12.0)", "vega-datasets (==0.9.0)"] +test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] +upgrade-extension = ["copier (>=8,<10)", "jinja2-time (<0.3)", "pydantic (<2.0)", "pyyaml-include (<2.0)", "tomli-w (<2.0)"] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +description = "Pygments theme using JupyterLab CSS variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, +] + +[[package]] +name = "jupyterlab-server" +version = "2.27.2" +description = "A set of server components for JupyterLab and JupyterLab like applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab_server-2.27.2-py3-none-any.whl", hash = "sha256:54aa2d64fd86383b5438d9f0c032f043c4d8c0264b8af9f60bd061157466ea43"}, + {file = "jupyterlab_server-2.27.2.tar.gz", hash = "sha256:15cbb349dc45e954e09bacf81b9f9bcb10815ff660fb2034ecd7417db3a7ea27"}, +] + +[package.dependencies] +babel = ">=2.10" +jinja2 = ">=3.0.3" +json5 = ">=0.9.0" +jsonschema = ">=4.18.0" +jupyter-server = ">=1.21,<3" +packaging = ">=21.3" +requests = ">=2.31" + +[package.extras] +docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] +openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] +test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0,<8)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.11" +description = "Jupyter interactive widgets for JupyterLab" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyterlab_widgets-3.0.11-py3-none-any.whl", hash = "sha256:78287fd86d20744ace330a61625024cf5521e1c012a352ddc0a3cdc2348becd0"}, + {file = "jupyterlab_widgets-3.0.11.tar.gz", hash = "sha256:dd5ac679593c969af29c9bed054c24f26842baa51352114736756bc035deee27"}, +] + +[[package]] +name = "kiwisolver" +version = "1.4.5" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, +] + +[[package]] +name = "lancedb" +version = "0.9.0" +description = "lancedb" +optional = false +python-versions = ">=3.8" +files = [ + {file = "lancedb-0.9.0-cp38-abi3-macosx_10_15_x86_64.whl", hash = "sha256:b1ca08797c72c93ae512aa1078f1891756da157d910fbae8e194fac3528fc1ac"}, + {file = "lancedb-0.9.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:15129791f03c2c04b95f914ced2c1556b43d73a24710207b9af77b6e4008bdeb"}, + {file = "lancedb-0.9.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f093d89447a2039b820d2540a0b64df3024e4549b6808ebd26b44fbe0345cc6"}, + {file = "lancedb-0.9.0-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:a8c1f6777e217d2277451038866d280fa5fb38bd161795e51703b043c26dd345"}, + {file = "lancedb-0.9.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:78dd5800a1148f89d33b7e98d1c8b1c42dee146f03580abc1ca83cb05273ff7f"}, + {file = "lancedb-0.9.0-cp38-abi3-win_amd64.whl", hash = "sha256:ba5bdc727d3bc131f17414f42372acde5817073feeb553793a3d20003caa1658"}, +] + +[package.dependencies] +attrs = ">=21.3.0" +cachetools = "*" +deprecation = "*" +overrides = ">=0.7" +packaging = "*" +pydantic = ">=1.10" +pylance = "0.13.0" +ratelimiter = ">=1.0,<2.0" +requests = ">=2.31.0" +retry = ">=0.9.2" +tqdm = ">=4.27.0" + +[package.extras] +azure = ["adlfs (>=2024.2.0)"] +clip = ["open-clip", "pillow", "torch"] +dev = ["pre-commit", "ruff"] +docs = ["mkdocs", "mkdocs-jupyter", "mkdocs-material", "mkdocstrings[python]"] +embeddings = ["awscli (>=1.29.57)", "boto3 (>=1.28.57)", "botocore (>=1.31.57)", "cohere", "google-generativeai", "huggingface-hub", "instructorembedding", "ollama", "open-clip-torch", "openai (>=1.6.1)", "pillow", "sentence-transformers", "torch"] +tests = ["aiohttp", "boto3", "duckdb", "pandas (>=1.4)", "polars (>=0.19)", "pytest", "pytest-asyncio", "pytest-mock", "pytz", "tantivy"] + +[[package]] +name = "linkify-it-py" +version = "2.0.3" +description = "Links recognition library with FULL unicode support." +optional = false +python-versions = ">=3.7" +files = [ + {file = "linkify-it-py-2.0.3.tar.gz", hash = "sha256:68cda27e162e9215c17d786649d1da0021a451bdc436ef9e0fa0ba5234b9b048"}, + {file = "linkify_it_py-2.0.3-py3-none-any.whl", hash = "sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79"}, +] + +[package.dependencies] +uc-micro-py = "*" + +[package.extras] +benchmark = ["pytest", "pytest-benchmark"] +dev = ["black", "flake8", "isort", "pre-commit", "pyproject-flake8"] +doc = ["myst-parser", "sphinx", "sphinx-book-theme"] +test = ["coverage", "pytest", "pytest-cov"] + +[[package]] +name = "llvmlite" +version = "0.43.0" +description = "lightweight wrapper around basic LLVM functionality" +optional = false +python-versions = ">=3.9" +files = [ + {file = "llvmlite-0.43.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a289af9a1687c6cf463478f0fa8e8aa3b6fb813317b0d70bf1ed0759eab6f761"}, + {file = "llvmlite-0.43.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d4fd101f571a31acb1559ae1af30f30b1dc4b3186669f92ad780e17c81e91bc"}, + {file = "llvmlite-0.43.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d434ec7e2ce3cc8f452d1cd9a28591745de022f931d67be688a737320dfcead"}, + {file = "llvmlite-0.43.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6912a87782acdff6eb8bf01675ed01d60ca1f2551f8176a300a886f09e836a6a"}, + {file = "llvmlite-0.43.0-cp310-cp310-win_amd64.whl", hash = "sha256:14f0e4bf2fd2d9a75a3534111e8ebeb08eda2f33e9bdd6dfa13282afacdde0ed"}, + {file = "llvmlite-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8d0618cb9bfe40ac38a9633f2493d4d4e9fcc2f438d39a4e854f39cc0f5f98"}, + {file = "llvmlite-0.43.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0a9a1a39d4bf3517f2af9d23d479b4175ead205c592ceeb8b89af48a327ea57"}, + {file = "llvmlite-0.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1da416ab53e4f7f3bc8d4eeba36d801cc1894b9fbfbf2022b29b6bad34a7df2"}, + {file = "llvmlite-0.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977525a1e5f4059316b183fb4fd34fa858c9eade31f165427a3977c95e3ee749"}, + {file = "llvmlite-0.43.0-cp311-cp311-win_amd64.whl", hash = "sha256:d5bd550001d26450bd90777736c69d68c487d17bf371438f975229b2b8241a91"}, + {file = "llvmlite-0.43.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f99b600aa7f65235a5a05d0b9a9f31150c390f31261f2a0ba678e26823ec38f7"}, + {file = "llvmlite-0.43.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:35d80d61d0cda2d767f72de99450766250560399edc309da16937b93d3b676e7"}, + {file = "llvmlite-0.43.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eccce86bba940bae0d8d48ed925f21dbb813519169246e2ab292b5092aba121f"}, + {file = "llvmlite-0.43.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df6509e1507ca0760787a199d19439cc887bfd82226f5af746d6977bd9f66844"}, + {file = "llvmlite-0.43.0-cp312-cp312-win_amd64.whl", hash = "sha256:7a2872ee80dcf6b5dbdc838763d26554c2a18aa833d31a2635bff16aafefb9c9"}, + {file = "llvmlite-0.43.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cd2a7376f7b3367019b664c21f0c61766219faa3b03731113ead75107f3b66c"}, + {file = "llvmlite-0.43.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18e9953c748b105668487b7c81a3e97b046d8abf95c4ddc0cd3c94f4e4651ae8"}, + {file = "llvmlite-0.43.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74937acd22dc11b33946b67dca7680e6d103d6e90eeaaaf932603bec6fe7b03a"}, + {file = "llvmlite-0.43.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc9efc739cc6ed760f795806f67889923f7274276f0eb45092a1473e40d9b867"}, + {file = "llvmlite-0.43.0-cp39-cp39-win_amd64.whl", hash = "sha256:47e147cdda9037f94b399bf03bfd8a6b6b1f2f90be94a454e3386f006455a9b4"}, + {file = "llvmlite-0.43.0.tar.gz", hash = "sha256:ae2b5b5c3ef67354824fb75517c8db5fbe93bc02cd9671f3c62271626bc041d5"}, +] + +[[package]] +name = "locket" +version = "1.0.0" +description = "File-based locks for Python on Linux and Windows" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "locket-1.0.0-py2.py3-none-any.whl", hash = "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3"}, + {file = "locket-1.0.0.tar.gz", hash = "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632"}, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +linkify-it-py = {version = ">=1,<3", optional = true, markers = "extra == \"linkify\""} +mdit-py-plugins = {version = "*", optional = true, markers = "extra == \"plugins\""} +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +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"}, +] + +[[package]] +name = "marshmallow" +version = "3.21.3" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.8" +files = [ + {file = "marshmallow-3.21.3-py3-none-any.whl", hash = "sha256:86ce7fb914aa865001a4b2092c4c2872d13bc347f3d42673272cabfdbad386f1"}, + {file = "marshmallow-3.21.3.tar.gz", hash = "sha256:4f57c5e050a54d66361e826f94fba213eb10b67b2fdb02c3e0343ce207ba1662"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["marshmallow[tests]", "pre-commit (>=3.5,<4.0)", "tox"] +docs = ["alabaster (==0.7.16)", "autodocsumm (==0.2.12)", "sphinx (==7.3.7)", "sphinx-issues (==4.1.0)", "sphinx-version-warning (==1.1.2)"] +tests = ["pytest", "pytz", "simplejson"] + +[[package]] +name = "matplotlib" +version = "3.9.0" +description = "Python plotting package" +optional = false +python-versions = ">=3.9" +files = [ + {file = "matplotlib-3.9.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2bcee1dffaf60fe7656183ac2190bd630842ff87b3153afb3e384d966b57fe56"}, + {file = "matplotlib-3.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3f988bafb0fa39d1074ddd5bacd958c853e11def40800c5824556eb630f94d3b"}, + {file = "matplotlib-3.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe428e191ea016bb278758c8ee82a8129c51d81d8c4bc0846c09e7e8e9057241"}, + {file = "matplotlib-3.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaf3978060a106fab40c328778b148f590e27f6fa3cd15a19d6892575bce387d"}, + {file = "matplotlib-3.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e7f03e5cbbfacdd48c8ea394d365d91ee8f3cae7e6ec611409927b5ed997ee4"}, + {file = "matplotlib-3.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:13beb4840317d45ffd4183a778685e215939be7b08616f431c7795276e067463"}, + {file = "matplotlib-3.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:063af8587fceeac13b0936c42a2b6c732c2ab1c98d38abc3337e430e1ff75e38"}, + {file = "matplotlib-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a2fa6d899e17ddca6d6526cf6e7ba677738bf2a6a9590d702c277204a7c6152"}, + {file = "matplotlib-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550cdda3adbd596078cca7d13ed50b77879104e2e46392dcd7c75259d8f00e85"}, + {file = "matplotlib-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cce0f31b351e3551d1f3779420cf8f6ec0d4a8cf9c0237a3b549fd28eb4abb"}, + {file = "matplotlib-3.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c53aeb514ccbbcbab55a27f912d79ea30ab21ee0531ee2c09f13800efb272674"}, + {file = "matplotlib-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5be985db2596d761cdf0c2eaf52396f26e6a64ab46bd8cd810c48972349d1be"}, + {file = "matplotlib-3.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c79f3a585f1368da6049318bdf1f85568d8d04b2e89fc24b7e02cc9b62017382"}, + {file = "matplotlib-3.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bdd1ecbe268eb3e7653e04f451635f0fb0f77f07fd070242b44c076c9106da84"}, + {file = "matplotlib-3.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d38e85a1a6d732f645f1403ce5e6727fd9418cd4574521d5803d3d94911038e5"}, + {file = "matplotlib-3.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a490715b3b9984fa609116481b22178348c1a220a4499cda79132000a79b4db"}, + {file = "matplotlib-3.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8146ce83cbc5dc71c223a74a1996d446cd35cfb6a04b683e1446b7e6c73603b7"}, + {file = "matplotlib-3.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:d91a4ffc587bacf5c4ce4ecfe4bcd23a4b675e76315f2866e588686cc97fccdf"}, + {file = "matplotlib-3.9.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:616fabf4981a3b3c5a15cd95eba359c8489c4e20e03717aea42866d8d0465956"}, + {file = "matplotlib-3.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd53c79fd02f1c1808d2cfc87dd3cf4dbc63c5244a58ee7944497107469c8d8a"}, + {file = "matplotlib-3.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06a478f0d67636554fa78558cfbcd7b9dba85b51f5c3b5a0c9be49010cf5f321"}, + {file = "matplotlib-3.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81c40af649d19c85f8073e25e5806926986806fa6d54be506fbf02aef47d5a89"}, + {file = "matplotlib-3.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52146fc3bd7813cc784562cb93a15788be0b2875c4655e2cc6ea646bfa30344b"}, + {file = "matplotlib-3.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:0fc51eaa5262553868461c083d9adadb11a6017315f3a757fc45ec6ec5f02888"}, + {file = "matplotlib-3.9.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bd4f2831168afac55b881db82a7730992aa41c4f007f1913465fb182d6fb20c0"}, + {file = "matplotlib-3.9.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:290d304e59be2b33ef5c2d768d0237f5bd132986bdcc66f80bc9bcc300066a03"}, + {file = "matplotlib-3.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ff2e239c26be4f24bfa45860c20ffccd118d270c5b5d081fa4ea409b5469fcd"}, + {file = "matplotlib-3.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:af4001b7cae70f7eaacfb063db605280058246de590fa7874f00f62259f2df7e"}, + {file = "matplotlib-3.9.0.tar.gz", hash = "sha256:e6d29ea6c19e34b30fb7d88b7081f869a03014f66fe06d62cc77d5a6ea88ed7a"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.3.1" +numpy = ">=1.23" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[package.extras] +dev = ["meson-python (>=0.13.1)", "numpy (>=1.25)", "pybind11 (>=2.6)", "setuptools (>=64)", "setuptools_scm (>=7)"] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mdit-py-plugins" +version = "0.4.1" +description = "Collection of plugins for markdown-it-py" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mdit_py_plugins-0.4.1-py3-none-any.whl", hash = "sha256:1020dfe4e6bfc2c79fb49ae4e3f5b297f5ccd20f010187acc52af2921e27dc6a"}, + {file = "mdit_py_plugins-0.4.1.tar.gz", hash = "sha256:834b8ac23d1cd60cec703646ffd22ae97b7955a6d596eb1d304be1e251ae499c"}, +] + +[package.dependencies] +markdown-it-py = ">=1.0.0,<4.0.0" + +[package.extras] +code-style = ["pre-commit"] +rtd = ["myst-parser", "sphinx-book-theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "mistune" +version = "3.0.2" +description = "A sane and fast Markdown parser with useful plugins and renderers" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, + {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, +] + +[[package]] +name = "msal" +version = "1.29.0" +description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." +optional = false +python-versions = ">=3.7" +files = [ + {file = "msal-1.29.0-py3-none-any.whl", hash = "sha256:6b301e63f967481f0cc1a3a3bac0cf322b276855bc1b0955468d9deb3f33d511"}, + {file = "msal-1.29.0.tar.gz", hash = "sha256:8f6725f099752553f9b2fe84125e2a5ebe47b49f92eacca33ebedd3a9ebaae25"}, +] + +[package.dependencies] +cryptography = ">=2.5,<45" +PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} +requests = ">=2.0.0,<3" + +[package.extras] +broker = ["pymsalruntime (>=0.13.2,<0.17)"] + +[[package]] +name = "msal-extensions" +version = "1.2.0" +description = "Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS and Linux. Concurrent data access will be coordinated by a file lock mechanism." +optional = false +python-versions = ">=3.7" +files = [ + {file = "msal_extensions-1.2.0-py3-none-any.whl", hash = "sha256:cf5ba83a2113fa6dc011a254a72f1c223c88d7dfad74cc30617c4679a417704d"}, + {file = "msal_extensions-1.2.0.tar.gz", hash = "sha256:6f41b320bfd2933d631a215c91ca0dd3e67d84bd1a2f50ce917d5874ec646bef"}, +] + +[package.dependencies] +msal = ">=1.29,<2" +portalocker = ">=1.4,<3" + +[[package]] +name = "nbclient" +version = "0.10.0" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "nbclient-0.10.0-py3-none-any.whl", hash = "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"}, + {file = "nbclient-0.10.0.tar.gz", hash = "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09"}, +] + +[package.dependencies] +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +nbformat = ">=5.1" +traitlets = ">=5.4" + +[package.extras] +dev = ["pre-commit"] +docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] + +[[package]] +name = "nbconvert" +version = "7.16.4" +description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbconvert-7.16.4-py3-none-any.whl", hash = "sha256:05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3"}, + {file = "nbconvert-7.16.4.tar.gz", hash = "sha256:86ca91ba266b0a448dc96fa6c5b9d98affabde2867b363258703536807f9f7f4"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +bleach = "!=5.0.0" +defusedxml = "*" +jinja2 = ">=3.0" +jupyter-core = ">=4.7" +jupyterlab-pygments = "*" +markupsafe = ">=2.0" +mistune = ">=2.0.3,<4" +nbclient = ">=0.5.0" +nbformat = ">=5.7" +packaging = "*" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +tinycss2 = "*" +traitlets = ">=5.1" + +[package.extras] +all = ["flaky", "ipykernel", "ipython", "ipywidgets (>=7.5)", "myst-parser", "nbsphinx (>=0.2.12)", "playwright", "pydata-sphinx-theme", "pyqtwebengine (>=5.15)", "pytest (>=7)", "sphinx (==5.0.2)", "sphinxcontrib-spelling", "tornado (>=6.1)"] +docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] +qtpdf = ["pyqtwebengine (>=5.15)"] +qtpng = ["pyqtwebengine (>=5.15)"] +serve = ["tornado (>=6.1)"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] +webpdf = ["playwright"] + +[[package]] +name = "nbformat" +version = "5.10.4" +description = "The Jupyter Notebook format" +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, + {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, +] + +[package.dependencies] +fastjsonschema = ">=2.15" +jsonschema = ">=2.6" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +traitlets = ">=5.1" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[package]] +name = "networkx" +version = "3.3" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.10" +files = [ + {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"}, + {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"}, +] + +[package.extras] +default = ["matplotlib (>=3.6)", "numpy (>=1.23)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["myst-nb (>=1.0)", "numpydoc (>=1.7)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=2.0)", "pygraphviz (>=1.12)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "nltk" +version = "3.8.1" +description = "Natural Language Toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "nltk-3.8.1-py3-none-any.whl", hash = "sha256:fd5c9109f976fa86bcadba8f91e47f5e9293bd034474752e92a520f81c93dda5"}, + {file = "nltk-3.8.1.zip", hash = "sha256:1834da3d0682cba4f2cede2f9aad6b0fafb6461ba451db0efb6f9c39798d64d3"}, +] + +[package.dependencies] +click = "*" +joblib = "*" +regex = ">=2021.8.3" +tqdm = "*" + +[package.extras] +all = ["matplotlib", "numpy", "pyparsing", "python-crfsuite", "requests", "scikit-learn", "scipy", "twython"] +corenlp = ["requests"] +machine-learning = ["numpy", "python-crfsuite", "scikit-learn", "scipy"] +plot = ["matplotlib"] +tgrep = ["pyparsing"] +twitter = ["twython"] + +[[package]] +name = "nodeenv" +version = "1.9.1" +description = "Node.js virtual environment builder" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, +] + +[[package]] +name = "notebook" +version = "7.2.1" +description = "Jupyter Notebook - A web-based notebook environment for interactive computing" +optional = false +python-versions = ">=3.8" +files = [ + {file = "notebook-7.2.1-py3-none-any.whl", hash = "sha256:f45489a3995746f2195a137e0773e2130960b51c9ac3ce257dbc2705aab3a6ca"}, + {file = "notebook-7.2.1.tar.gz", hash = "sha256:4287b6da59740b32173d01d641f763d292f49c30e7a51b89c46ba8473126341e"}, +] + +[package.dependencies] +jupyter-server = ">=2.4.0,<3" +jupyterlab = ">=4.2.0,<4.3" +jupyterlab-server = ">=2.27.1,<3" +notebook-shim = ">=0.2,<0.3" +tornado = ">=6.2.0" + +[package.extras] +dev = ["hatch", "pre-commit"] +docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +description = "A shim layer for notebook traits and config" +optional = false +python-versions = ">=3.7" +files = [ + {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, + {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, +] + +[package.dependencies] +jupyter-server = ">=1.8,<3" + +[package.extras] +test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] + +[[package]] +name = "numba" +version = "0.60.0" +description = "compiling Python code using LLVM" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numba-0.60.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d761de835cd38fb400d2c26bb103a2726f548dc30368853121d66201672e651"}, + {file = "numba-0.60.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:159e618ef213fba758837f9837fb402bbe65326e60ba0633dbe6c7f274d42c1b"}, + {file = "numba-0.60.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1527dc578b95c7c4ff248792ec33d097ba6bef9eda466c948b68dfc995c25781"}, + {file = "numba-0.60.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe0b28abb8d70f8160798f4de9d486143200f34458d34c4a214114e445d7124e"}, + {file = "numba-0.60.0-cp310-cp310-win_amd64.whl", hash = "sha256:19407ced081d7e2e4b8d8c36aa57b7452e0283871c296e12d798852bc7d7f198"}, + {file = "numba-0.60.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a17b70fc9e380ee29c42717e8cc0bfaa5556c416d94f9aa96ba13acb41bdece8"}, + {file = "numba-0.60.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fb02b344a2a80efa6f677aa5c40cd5dd452e1b35f8d1c2af0dfd9ada9978e4b"}, + {file = "numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f4fde652ea604ea3c86508a3fb31556a6157b2c76c8b51b1d45eb40c8598703"}, + {file = "numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4142d7ac0210cc86432b818338a2bc368dc773a2f5cf1e32ff7c5b378bd63ee8"}, + {file = "numba-0.60.0-cp311-cp311-win_amd64.whl", hash = "sha256:cac02c041e9b5bc8cf8f2034ff6f0dbafccd1ae9590dc146b3a02a45e53af4e2"}, + {file = "numba-0.60.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7da4098db31182fc5ffe4bc42c6f24cd7d1cb8a14b59fd755bfee32e34b8404"}, + {file = "numba-0.60.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:38d6ea4c1f56417076ecf8fc327c831ae793282e0ff51080c5094cb726507b1c"}, + {file = "numba-0.60.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:62908d29fb6a3229c242e981ca27e32a6e606cc253fc9e8faeb0e48760de241e"}, + {file = "numba-0.60.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0ebaa91538e996f708f1ab30ef4d3ddc344b64b5227b67a57aa74f401bb68b9d"}, + {file = "numba-0.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:f75262e8fe7fa96db1dca93d53a194a38c46da28b112b8a4aca168f0df860347"}, + {file = "numba-0.60.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:01ef4cd7d83abe087d644eaa3d95831b777aa21d441a23703d649e06b8e06b74"}, + {file = "numba-0.60.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:819a3dfd4630d95fd574036f99e47212a1af41cbcb019bf8afac63ff56834449"}, + {file = "numba-0.60.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b983bd6ad82fe868493012487f34eae8bf7dd94654951404114f23c3466d34b"}, + {file = "numba-0.60.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c151748cd269ddeab66334bd754817ffc0cabd9433acb0f551697e5151917d25"}, + {file = "numba-0.60.0-cp39-cp39-win_amd64.whl", hash = "sha256:3031547a015710140e8c87226b4cfe927cac199835e5bf7d4fe5cb64e814e3ab"}, + {file = "numba-0.60.0.tar.gz", hash = "sha256:5df6158e5584eece5fc83294b949fd30b9f1125df7708862205217e068aabf16"}, +] + +[package.dependencies] +llvmlite = "==0.43.*" +numpy = ">=1.22,<2.1" + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "openai" +version = "1.35.7" +description = "The official Python library for the openai API" +optional = false +python-versions = ">=3.7.1" +files = [ + {file = "openai-1.35.7-py3-none-any.whl", hash = "sha256:3d1e0b0aac9b0db69a972d36dc7efa7563f8e8d65550b27a48f2a0c2ec207e80"}, + {file = "openai-1.35.7.tar.gz", hash = "sha256:009bfa1504c9c7ef64d87be55936d142325656bbc6d98c68b669d6472e4beb09"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tqdm = ">4" +typing-extensions = ">=4.7,<5" + +[package.extras] +datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] + +[[package]] +name = "overrides" +version = "7.7.0" +description = "A decorator to automatically detect mismatch when overriding a method." +optional = false +python-versions = ">=3.6" +files = [ + {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, + {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, +] + +[[package]] +name = "packaging" +version = "24.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] + +[[package]] +name = "pandas" +version = "2.2.2" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, + {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, + {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, + {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, + {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, + {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, + {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.4", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +description = "Utilities for writing pandoc filters in python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, +] + +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + +[[package]] +name = "partd" +version = "1.4.2" +description = "Appendable key-value storage" +optional = false +python-versions = ">=3.9" +files = [ + {file = "partd-1.4.2-py3-none-any.whl", hash = "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f"}, + {file = "partd-1.4.2.tar.gz", hash = "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c"}, +] + +[package.dependencies] +locket = "*" +toolz = "*" + +[package.extras] +complete = ["blosc", "numpy (>=1.20.0)", "pandas (>=1.3)", "pyzmq"] + +[[package]] +name = "pastel" +version = "0.2.1" +description = "Bring colors to your terminal." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, + {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, +] + +[[package]] +name = "patsy" +version = "0.5.6" +description = "A Python package for describing statistical models and for building design matrices." +optional = false +python-versions = "*" +files = [ + {file = "patsy-0.5.6-py2.py3-none-any.whl", hash = "sha256:19056886fd8fa71863fa32f0eb090267f21fb74be00f19f5c70b2e9d76c883c6"}, + {file = "patsy-0.5.6.tar.gz", hash = "sha256:95c6d47a7222535f84bff7f63d7303f2e297747a598db89cf5c67f0c0c7d2cdb"}, +] + +[package.dependencies] +numpy = ">=1.4" +six = "*" + +[package.extras] +test = ["pytest", "pytest-cov", "scipy"] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pillow" +version = "10.4.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "platformdirs" +version = "4.2.2" +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"}, +] + +[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)"] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "poethepoet" +version = "0.26.1" +description = "A task runner that works well with poetry." +optional = false +python-versions = ">=3.8" +files = [ + {file = "poethepoet-0.26.1-py3-none-any.whl", hash = "sha256:aa43b443fec5d17d7e76771cccd484e5285805301721a74f059c483ad3276edd"}, + {file = "poethepoet-0.26.1.tar.gz", hash = "sha256:aaad8541f6072617a60bcff2562d00779b58b353bd0f1847b06d8d0f2b6dc192"}, +] + +[package.dependencies] +pastel = ">=0.2.1,<0.3.0" +tomli = ">=1.2.2" + +[package.extras] +poetry-plugin = ["poetry (>=1.0,<2.0)"] + +[[package]] +name = "portalocker" +version = "2.10.0" +description = "Wraps the portalocker recipe for easy usage" +optional = false +python-versions = ">=3.8" +files = [ + {file = "portalocker-2.10.0-py3-none-any.whl", hash = "sha256:48944147b2cd42520549bc1bb8fe44e220296e56f7c3d551bc6ecce69d9b0de1"}, + {file = "portalocker-2.10.0.tar.gz", hash = "sha256:49de8bc0a2f68ca98bf9e219c81a3e6b27097c7bf505a87c5a112ce1aaeb9b81"}, +] + +[package.dependencies] +pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""} + +[package.extras] +docs = ["sphinx (>=1.7.1)"] +redis = ["redis"] +tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"] + +[[package]] +name = "pot" +version = "0.9.4" +description = "Python Optimal Transport Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "POT-0.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8418ab9c24f549290fdc452caebb58ded05b986a024063fe3354cfd2e704b378"}, + {file = "POT-0.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:096cd3b454f87ff9c8f48d8e221bc26509d8f9355ce99d9fefe83560f82278b5"}, + {file = "POT-0.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6e67d420a479ed66f4549c785e157bb3dce2c5489bf81a44ac922a6e9471fe69"}, + {file = "POT-0.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:107bc7225906a3fa3aafdb441e1d24c55eaf1ee3badd1c93ab6199865f689221"}, + {file = "POT-0.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfee044f744b1722912654c8b905bc289ce160524db5ca0e853f1aa442ffea55"}, + {file = "POT-0.9.4-cp310-cp310-win32.whl", hash = "sha256:421c3efb8da2f1ce9605f9f2068047ea629b95de87baa15b8786b3e664de9dbd"}, + {file = "POT-0.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:6e76194a62f29ddadc975e18cf7f07d22060735bd3fb9a023781e0e126a05822"}, + {file = "POT-0.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:148040b89063790ab784458d5d200ba4a7f36c54fdb62ea0842f8d5d4c5c6ccb"}, + {file = "POT-0.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1109fc77989834a1467be731ff957d90c2b558e772cff6c06fb90f7cbe58b014"}, + {file = "POT-0.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f8218cd419e8457b37fe2b8060b5bf9bd07d4671d5f5fa4d5ac98c58b5be8c0"}, + {file = "POT-0.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ea0055f18e26917ff326f39dd5e5fd43bcc9eccaab4b09a4f8d7785c8921250"}, + {file = "POT-0.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f03b4af3f56234787d2a34e0637dac9c1e1de4cb3f7386ca4f91331f0c4af187"}, + {file = "POT-0.9.4-cp311-cp311-win32.whl", hash = "sha256:a69f6d554df1de47dd312fc065d9171bdbedf48c90c8409889485945ffaaeacf"}, + {file = "POT-0.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:8791c8f09a852901e03e2dc1c6aec4f374b58b3ee905a90349713587aa16e26a"}, + {file = "POT-0.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1a7a55b3fd528e6808f99de0165dcacf185eb86ae3aff4d358b850479b76a8ba"}, + {file = "POT-0.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a9bbd2507605be6eae4f0f0d6f6f0ff91ce3eeb5b7c8eeb350e4eb76bcc6940a"}, + {file = "POT-0.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5594ab0e78329307ce4cd293f2de409513876695d60fb4c1013b5dd46069f256"}, + {file = "POT-0.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0ca658105d129b752c8d20751ff2cb965d1bdcaecec319ae489b135c58d9da9"}, + {file = "POT-0.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6732f1acd94959b8fa13a4fa250ad49c1e6894ece488a81f4427dbf13df4776"}, + {file = "POT-0.9.4-cp312-cp312-win32.whl", hash = "sha256:bf7f5253fee6ba7df5dd854b739540f701153cabab80dd25332dfac93d84bec1"}, + {file = "POT-0.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:597ff64b06a157871feb84e6e82b3f5dfbfff57161c14660ab2ddbcc93c940e6"}, + {file = "POT-0.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:385b41606943fbc73f1ab96fd994117d79c4ad782c91bbb7ba74c0359e9de887"}, + {file = "POT-0.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3f697e084243b9fe0a975331e471fd09610343c6aa28172232958e39100ede6"}, + {file = "POT-0.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b967fb9cafc6ad30a6d51b21d6307b384491a106d6dc75f37bee52a3f63575c3"}, + {file = "POT-0.9.4-cp37-cp37m-win32.whl", hash = "sha256:35926c2f4d2ee49309dce340f7f6646fe451ca1e0d11b2d017a851d482bf4468"}, + {file = "POT-0.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:f29fa1fcd591d1940e2279dc1422ff46c0c273f6be4ecbcaa819d91dd196573e"}, + {file = "POT-0.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:63f8b50f448e32a4ae274dd1e68e22b1a2bc291c53c5c6ec5afadfb930b6a809"}, + {file = "POT-0.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cabd13a728d2db40b3989ad57810769dfba8972b686ae7f4881dbd315252e5d9"}, + {file = "POT-0.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5984157d5a819bd6c55db3b0d8fe631ff398c243e80a9e9e933cbd1ee7c7588c"}, + {file = "POT-0.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b8da4e3268eeee40dff96364f0a9f0326979d565d970ec74a1688b8ad338022"}, + {file = "POT-0.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ede957083299e4904627621f4d2c8a6b56af108fef9b486330f65519a395f10a"}, + {file = "POT-0.9.4-cp38-cp38-win32.whl", hash = "sha256:79716079d7970c6c0bf909f986c65d7103135e36b364ba5fa5caed97d7aa6464"}, + {file = "POT-0.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:3246493745bcf2b353312183b9ab547466cae711936f991a6754b62f55ff1dec"}, + {file = "POT-0.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:223c4ca199b679e4c2b8a79fb49d31f2c7fab2975c2c37d1e68a0a7fbe2bc55d"}, + {file = "POT-0.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c30d77994d02984ad32665f5975e272e8c02e8d5288c4edfbec08617c5c38f91"}, + {file = "POT-0.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5b0fe5be45112c12cc0f6ab61fb85ed9161ca540b24a4037e5d53ab86f390a49"}, + {file = "POT-0.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab68bdfeae54719d202e923f18ec29869c09b105e42f94568221fc92996f0f4d"}, + {file = "POT-0.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2847015e3bb65171eb70eca786f8cebe806960af40625ebc17c858b6314a9e0b"}, + {file = "POT-0.9.4-cp39-cp39-win32.whl", hash = "sha256:2e35d68c6e676108d6eeb7e6b119c4c19dca364992bca57f3f513660bfb1810c"}, + {file = "POT-0.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:e7d029f024ed58f8d10b3e4d517df551bb9758ac12d0503be793f44258f2dffc"}, + {file = "pot-0.9.4.tar.gz", hash = "sha256:4cf8b46bf4992c37529161c32dd5e3334e0c089399142f08ed6d455b57015edd"}, +] + +[package.dependencies] +numpy = ">=1.16" +scipy = ">=1.6" + +[package.extras] +all = ["autograd", "cvxopt", "jax", "jaxlib", "matplotlib", "pymanopt", "scikit-learn", "tensorflow", "torch", "torch-geometric"] +backend-jax = ["jax", "jaxlib"] +backend-tf = ["tensorflow"] +backend-torch = ["torch"] +cvxopt = ["cvxopt"] +dr = ["autograd", "pymanopt", "scikit-learn"] +gnn = ["torch", "torch-geometric"] +plot = ["matplotlib"] + +[[package]] +name = "prometheus-client" +version = "0.20.0" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.8" +files = [ + {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, + {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, +] + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.47" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, + {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "psutil" +version = "6.0.0" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, + {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, + {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, + {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, + {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, + {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, + {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, + {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, + {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, + {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] + +[[package]] +name = "pyaml-env" +version = "1.2.1" +description = "Provides yaml file parsing with environment variable resolution" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyaml_env-1.2.1-py3-none-any.whl", hash = "sha256:2e7da2d4bba0629711ade1a41864e5e200c84ded896a3d27e9f560fae7311c36"}, + {file = "pyaml_env-1.2.1.tar.gz", hash = "sha256:6d5dc98c8c82df743a132c196e79963050c9feb05b0a6f25f3ad77771d3d95b0"}, +] + +[package.dependencies] +PyYAML = ">=5.0,<=7.0" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "pyarrow" +version = "15.0.0" +description = "Python library for Apache Arrow" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyarrow-15.0.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:0a524532fd6dd482edaa563b686d754c70417c2f72742a8c990b322d4c03a15d"}, + {file = "pyarrow-15.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:60a6bdb314affa9c2e0d5dddf3d9cbb9ef4a8dddaa68669975287d47ece67642"}, + {file = "pyarrow-15.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66958fd1771a4d4b754cd385835e66a3ef6b12611e001d4e5edfcef5f30391e2"}, + {file = "pyarrow-15.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f500956a49aadd907eaa21d4fff75f73954605eaa41f61cb94fb008cf2e00c6"}, + {file = "pyarrow-15.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6f87d9c4f09e049c2cade559643424da84c43a35068f2a1c4653dc5b1408a929"}, + {file = "pyarrow-15.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85239b9f93278e130d86c0e6bb455dcb66fc3fd891398b9d45ace8799a871a1e"}, + {file = "pyarrow-15.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:5b8d43e31ca16aa6e12402fcb1e14352d0d809de70edd185c7650fe80e0769e3"}, + {file = "pyarrow-15.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:fa7cd198280dbd0c988df525e50e35b5d16873e2cdae2aaaa6363cdb64e3eec5"}, + {file = "pyarrow-15.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8780b1a29d3c8b21ba6b191305a2a607de2e30dab399776ff0aa09131e266340"}, + {file = "pyarrow-15.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0ec198ccc680f6c92723fadcb97b74f07c45ff3fdec9dd765deb04955ccf19"}, + {file = "pyarrow-15.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:036a7209c235588c2f07477fe75c07e6caced9b7b61bb897c8d4e52c4b5f9555"}, + {file = "pyarrow-15.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2bd8a0e5296797faf9a3294e9fa2dc67aa7f10ae2207920dbebb785c77e9dbe5"}, + {file = "pyarrow-15.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e8ebed6053dbe76883a822d4e8da36860f479d55a762bd9e70d8494aed87113e"}, + {file = "pyarrow-15.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:17d53a9d1b2b5bd7d5e4cd84d018e2a45bc9baaa68f7e6e3ebed45649900ba99"}, + {file = "pyarrow-15.0.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:9950a9c9df24090d3d558b43b97753b8f5867fb8e521f29876aa021c52fda351"}, + {file = "pyarrow-15.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:003d680b5e422d0204e7287bb3fa775b332b3fce2996aa69e9adea23f5c8f970"}, + {file = "pyarrow-15.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f75fce89dad10c95f4bf590b765e3ae98bcc5ba9f6ce75adb828a334e26a3d40"}, + {file = "pyarrow-15.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca9cb0039923bec49b4fe23803807e4ef39576a2bec59c32b11296464623dc2"}, + {file = "pyarrow-15.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9ed5a78ed29d171d0acc26a305a4b7f83c122d54ff5270810ac23c75813585e4"}, + {file = "pyarrow-15.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6eda9e117f0402dfcd3cd6ec9bfee89ac5071c48fc83a84f3075b60efa96747f"}, + {file = "pyarrow-15.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9a3a6180c0e8f2727e6f1b1c87c72d3254cac909e609f35f22532e4115461177"}, + {file = "pyarrow-15.0.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:19a8918045993349b207de72d4576af0191beef03ea655d8bdb13762f0cd6eac"}, + {file = "pyarrow-15.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d0ec076b32bacb6666e8813a22e6e5a7ef1314c8069d4ff345efa6246bc38593"}, + {file = "pyarrow-15.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5db1769e5d0a77eb92344c7382d6543bea1164cca3704f84aa44e26c67e320fb"}, + {file = "pyarrow-15.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2617e3bf9df2a00020dd1c1c6dce5cc343d979efe10bc401c0632b0eef6ef5b"}, + {file = "pyarrow-15.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:d31c1d45060180131caf10f0f698e3a782db333a422038bf7fe01dace18b3a31"}, + {file = "pyarrow-15.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:c8c287d1d479de8269398b34282e206844abb3208224dbdd7166d580804674b7"}, + {file = "pyarrow-15.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:07eb7f07dc9ecbb8dace0f58f009d3a29ee58682fcdc91337dfeb51ea618a75b"}, + {file = "pyarrow-15.0.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:47af7036f64fce990bb8a5948c04722e4e3ea3e13b1007ef52dfe0aa8f23cf7f"}, + {file = "pyarrow-15.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93768ccfff85cf044c418bfeeafce9a8bb0cee091bd8fd19011aff91e58de540"}, + {file = "pyarrow-15.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6ee87fd6892700960d90abb7b17a72a5abb3b64ee0fe8db6c782bcc2d0dc0b4"}, + {file = "pyarrow-15.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:001fca027738c5f6be0b7a3159cc7ba16a5c52486db18160909a0831b063c4e4"}, + {file = "pyarrow-15.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:d1c48648f64aec09accf44140dccb92f4f94394b8d79976c426a5b79b11d4fa7"}, + {file = "pyarrow-15.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:972a0141be402bb18e3201448c8ae62958c9c7923dfaa3b3d4530c835ac81aed"}, + {file = "pyarrow-15.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:f01fc5cf49081426429127aa2d427d9d98e1cb94a32cb961d583a70b7c4504e6"}, + {file = "pyarrow-15.0.0.tar.gz", hash = "sha256:876858f549d540898f927eba4ef77cd549ad8d24baa3207cf1b72e5788b50e83"}, +] + +[package.dependencies] +numpy = ">=1.16.6,<2" + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pydantic" +version = "2.8.0" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.8.0-py3-none-any.whl", hash = "sha256:ead4f3a1e92386a734ca1411cb25d94147cf8778ed5be6b56749047676d6364e"}, + {file = "pydantic-2.8.0.tar.gz", hash = "sha256:d970ffb9d030b710795878940bd0489842c638e7252fc4a19c3ae2f7da4d6141"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.20.0" +typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.20.0" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e9dcd7fb34f7bfb239b5fa420033642fff0ad676b765559c3737b91f664d4fa9"}, + {file = "pydantic_core-2.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:649a764d9b0da29816889424697b2a3746963ad36d3e0968784ceed6e40c6355"}, + {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7701df088d0b05f3460f7ba15aec81ac8b0fb5690367dfd072a6c38cf5b7fdb5"}, + {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab760f17c3e792225cdaef31ca23c0aea45c14ce80d8eff62503f86a5ab76bff"}, + {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb1ad5b4d73cde784cf64580166568074f5ccd2548d765e690546cff3d80937d"}, + {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b81ec2efc04fc1dbf400647d4357d64fb25543bae38d2d19787d69360aad21c9"}, + {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4a9732a5cad764ba37f3aa873dccb41b584f69c347a57323eda0930deec8e10"}, + {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6dc85b9e10cc21d9c1055f15684f76fa4facadddcb6cd63abab702eb93c98943"}, + {file = "pydantic_core-2.20.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:21d9f7e24f63fdc7118e6cc49defaab8c1d27570782f7e5256169d77498cf7c7"}, + {file = "pydantic_core-2.20.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8b315685832ab9287e6124b5d74fc12dda31e6421d7f6b08525791452844bc2d"}, + {file = "pydantic_core-2.20.0-cp310-none-win32.whl", hash = "sha256:c3dc8ec8b87c7ad534c75b8855168a08a7036fdb9deeeed5705ba9410721c84d"}, + {file = "pydantic_core-2.20.0-cp310-none-win_amd64.whl", hash = "sha256:85770b4b37bb36ef93a6122601795231225641003e0318d23c6233c59b424279"}, + {file = "pydantic_core-2.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:58e251bb5a5998f7226dc90b0b753eeffa720bd66664eba51927c2a7a2d5f32c"}, + {file = "pydantic_core-2.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:78d584caac52c24240ef9ecd75de64c760bbd0e20dbf6973631815e3ef16ef8b"}, + {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5084ec9721f82bef5ff7c4d1ee65e1626783abb585f8c0993833490b63fe1792"}, + {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d0f52684868db7c218437d260e14d37948b094493f2646f22d3dda7229bbe3f"}, + {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1def125d59a87fe451212a72ab9ed34c118ff771e5473fef4f2f95d8ede26d75"}, + {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b34480fd6778ab356abf1e9086a4ced95002a1e195e8d2fd182b0def9d944d11"}, + {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d42669d319db366cb567c3b444f43caa7ffb779bf9530692c6f244fc635a41eb"}, + {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:53b06aea7a48919a254b32107647be9128c066aaa6ee6d5d08222325f25ef175"}, + {file = "pydantic_core-2.20.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1f038156b696a1c39d763b2080aeefa87ddb4162c10aa9fabfefffc3dd8180fa"}, + {file = "pydantic_core-2.20.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3f0f3a4a23717280a5ee3ac4fb1f81d6fde604c9ec5100f7f6f987716bb8c137"}, + {file = "pydantic_core-2.20.0-cp311-none-win32.whl", hash = "sha256:316fe7c3fec017affd916a0c83d6f1ec697cbbbdf1124769fa73328e7907cc2e"}, + {file = "pydantic_core-2.20.0-cp311-none-win_amd64.whl", hash = "sha256:2d06a7fa437f93782e3f32d739c3ec189f82fca74336c08255f9e20cea1ed378"}, + {file = "pydantic_core-2.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d6f8c49657f3eb7720ed4c9b26624063da14937fc94d1812f1e04a2204db3e17"}, + {file = "pydantic_core-2.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad1bd2f377f56fec11d5cfd0977c30061cd19f4fa199bf138b200ec0d5e27eeb"}, + {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed741183719a5271f97d93bbcc45ed64619fa38068aaa6e90027d1d17e30dc8d"}, + {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d82e5ed3a05f2dcb89c6ead2fd0dbff7ac09bc02c1b4028ece2d3a3854d049ce"}, + {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2ba34a099576234671f2e4274e5bc6813b22e28778c216d680eabd0db3f7dad"}, + {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:879ae6bb08a063b3e1b7ac8c860096d8fd6b48dd9b2690b7f2738b8c835e744b"}, + {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b0eefc7633a04c0694340aad91fbfd1986fe1a1e0c63a22793ba40a18fcbdc8"}, + {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73deadd6fd8a23e2f40b412b3ac617a112143c8989a4fe265050fd91ba5c0608"}, + {file = "pydantic_core-2.20.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:35681445dc85446fb105943d81ae7569aa7e89de80d1ca4ac3229e05c311bdb1"}, + {file = "pydantic_core-2.20.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0f6dd3612a3b9f91f2e63924ea18a4476656c6d01843ca20a4c09e00422195af"}, + {file = "pydantic_core-2.20.0-cp312-none-win32.whl", hash = "sha256:7e37b6bb6e90c2b8412b06373c6978d9d81e7199a40e24a6ef480e8acdeaf918"}, + {file = "pydantic_core-2.20.0-cp312-none-win_amd64.whl", hash = "sha256:7d4df13d1c55e84351fab51383520b84f490740a9f1fec905362aa64590b7a5d"}, + {file = "pydantic_core-2.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:d43e7ab3b65e4dc35a7612cfff7b0fd62dce5bc11a7cd198310b57f39847fd6c"}, + {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b6a24d7b5893392f2b8e3b7a0031ae3b14c6c1942a4615f0d8794fdeeefb08b"}, + {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b2f13c3e955a087c3ec86f97661d9f72a76e221281b2262956af381224cfc243"}, + {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:72432fd6e868c8d0a6849869e004b8bcae233a3c56383954c228316694920b38"}, + {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d70a8ff2d4953afb4cbe6211f17268ad29c0b47e73d3372f40e7775904bc28fc"}, + {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e49524917b8d3c2f42cd0d2df61178e08e50f5f029f9af1f402b3ee64574392"}, + {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4f0f71653b1c1bad0350bc0b4cc057ab87b438ff18fa6392533811ebd01439c"}, + {file = "pydantic_core-2.20.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:16197e6f4fdecb9892ed2436e507e44f0a1aa2cff3b9306d1c879ea2f9200997"}, + {file = "pydantic_core-2.20.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:763602504bf640b3ded3bba3f8ed8a1cc2fc6a87b8d55c1c5689f428c49c947e"}, + {file = "pydantic_core-2.20.0-cp313-none-win32.whl", hash = "sha256:a3f243f318bd9523277fa123b3163f4c005a3e8619d4b867064de02f287a564d"}, + {file = "pydantic_core-2.20.0-cp313-none-win_amd64.whl", hash = "sha256:03aceaf6a5adaad3bec2233edc5a7905026553916615888e53154807e404545c"}, + {file = "pydantic_core-2.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d6f2d8b8da1f03f577243b07bbdd3412eee3d37d1f2fd71d1513cbc76a8c1239"}, + {file = "pydantic_core-2.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a272785a226869416c6b3c1b7e450506152d3844207331f02f27173562c917e0"}, + {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efbb412d55a4ffe73963fed95c09ccb83647ec63b711c4b3752be10a56f0090b"}, + {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1e4f46189d8740561b43655263a41aac75ff0388febcb2c9ec4f1b60a0ec12f3"}, + {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d3df115f4a3c8c5e4d5acf067d399c6466d7e604fc9ee9acbe6f0c88a0c3cf"}, + {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a340d2bdebe819d08f605e9705ed551c3feb97e4fd71822d7147c1e4bdbb9508"}, + {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:616b9c2f882393d422ba11b40e72382fe975e806ad693095e9a3b67c59ea6150"}, + {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:25c46bb2ff6084859bbcfdf4f1a63004b98e88b6d04053e8bf324e115398e9e7"}, + {file = "pydantic_core-2.20.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:23425eccef8f2c342f78d3a238c824623836c6c874d93c726673dbf7e56c78c0"}, + {file = "pydantic_core-2.20.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:52527e8f223ba29608d999d65b204676398009725007c9336651c2ec2d93cffc"}, + {file = "pydantic_core-2.20.0-cp38-none-win32.whl", hash = "sha256:1c3c5b7f70dd19a6845292b0775295ea81c61540f68671ae06bfe4421b3222c2"}, + {file = "pydantic_core-2.20.0-cp38-none-win_amd64.whl", hash = "sha256:8093473d7b9e908af1cef30025609afc8f5fd2a16ff07f97440fd911421e4432"}, + {file = "pydantic_core-2.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ee7785938e407418795e4399b2bf5b5f3cf6cf728077a7f26973220d58d885cf"}, + {file = "pydantic_core-2.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e75794883d635071cf6b4ed2a5d7a1e50672ab7a051454c76446ef1ebcdcc91"}, + {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:344e352c96e53b4f56b53d24728217c69399b8129c16789f70236083c6ceb2ac"}, + {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:978d4123ad1e605daf1ba5e01d4f235bcf7b6e340ef07e7122e8e9cfe3eb61ab"}, + {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c05eaf6c863781eb834ab41f5963604ab92855822a2062897958089d1335dad"}, + {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc7e43b4a528ffca8c9151b6a2ca34482c2fdc05e6aa24a84b7f475c896fc51d"}, + {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:658287a29351166510ebbe0a75c373600cc4367a3d9337b964dada8d38bcc0f4"}, + {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1dacf660d6de692fe351e8c806e7efccf09ee5184865893afbe8e59be4920b4a"}, + {file = "pydantic_core-2.20.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3e147fc6e27b9a487320d78515c5f29798b539179f7777018cedf51b7749e4f4"}, + {file = "pydantic_core-2.20.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c867230d715a3dd1d962c8d9bef0d3168994ed663e21bf748b6e3a529a129aab"}, + {file = "pydantic_core-2.20.0-cp39-none-win32.whl", hash = "sha256:22b813baf0dbf612752d8143a2dbf8e33ccb850656b7850e009bad2e101fc377"}, + {file = "pydantic_core-2.20.0-cp39-none-win_amd64.whl", hash = "sha256:3a7235b46c1bbe201f09b6f0f5e6c36b16bad3d0532a10493742f91fbdc8035f"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cafde15a6f7feaec2f570646e2ffc5b73412295d29134a29067e70740ec6ee20"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:2aec8eeea0b08fd6bc2213d8e86811a07491849fd3d79955b62d83e32fa2ad5f"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:840200827984f1c4e114008abc2f5ede362d6e11ed0b5931681884dd41852ff1"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ea1d8b7df522e5ced34993c423c3bf3735c53df8b2a15688a2f03a7d678800"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5b8376a867047bf08910573deb95d3c8dfb976eb014ee24f3b5a61ccc5bee1b"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d08264b4460326cefacc179fc1411304d5af388a79910832835e6f641512358b"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7a3639011c2e8a9628466f616ed7fb413f30032b891898e10895a0a8b5857d6c"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:05e83ce2f7eba29e627dd8066aa6c4c0269b2d4f889c0eba157233a353053cea"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:603a843fea76a595c8f661cd4da4d2281dff1e38c4a836a928eac1a2f8fe88e4"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac76f30d5d3454f4c28826d891fe74d25121a346c69523c9810ebba43f3b1cec"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e3b1d4b1b3f6082849f9b28427ef147a5b46a6132a3dbaf9ca1baa40c88609"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2761f71faed820e25ec62eacba670d1b5c2709bb131a19fcdbfbb09884593e5a"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a0586cddbf4380e24569b8a05f234e7305717cc8323f50114dfb2051fcbce2a3"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b8c46a8cf53e849eea7090f331ae2202cd0f1ceb090b00f5902c423bd1e11805"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b4a085bd04af7245e140d1b95619fe8abb445a3d7fdf219b3f80c940853268ef"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:116b326ac82c8b315e7348390f6d30bcfe6e688a7d3f1de50ff7bcc2042a23c2"}, + {file = "pydantic_core-2.20.0.tar.gz", hash = "sha256:366be8e64e0cb63d87cf79b4e1765c0703dd6313c729b22e7b9e378db6b96877"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pygments" +version = "2.18.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pyjwt" +version = "2.8.0" +description = "JSON Web Token implementation in Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, + {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, +] + +[package.dependencies] +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + +[[package]] +name = "pylance" +version = "0.13.0" +description = "python wrapper for Lance columnar format" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pylance-0.13.0-cp39-abi3-macosx_10_15_x86_64.whl", hash = "sha256:2f3d6f9eec1f59f45dccb01075ba79868b8d37c8371d6210bcf6418217a0dd8b"}, + {file = "pylance-0.13.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:f4861ab466c94b0f9a4b4e6de6e1dfa02f40e7242d8db87447bc7bb7d89606ac"}, + {file = "pylance-0.13.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3cb92547e145f5bfb0ea7d6f483953913b9bdd44c45bea84fc95a18da9f5853"}, + {file = "pylance-0.13.0-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:d1ddd7700924bc6b6b0774ea63d2aa23f9210a86cd6d6af0cdfa987df776d50d"}, + {file = "pylance-0.13.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c51d4b6e59cf4dc97c11a35b299f11e80dbdf392e2d8dc498573c26474a3c19e"}, + {file = "pylance-0.13.0-cp39-abi3-win_amd64.whl", hash = "sha256:4018ba016f1445874960a4ba2ad5c80cb380f3116683282ee8beabd38fa8989d"}, +] + +[package.dependencies] +numpy = ">=1.22" +pyarrow = ">=12,<15.0.1" + +[package.extras] +benchmarks = ["pytest-benchmark"] +dev = ["ruff (==0.4.1)"] +ray = ["ray[data]"] +tests = ["boto3", "datasets", "duckdb", "h5py (<3.11)", "ml-dtypes", "pandas", "pillow", "polars[pandas,pyarrow]", "pytest", "tensorflow", "tqdm"] +torch = ["torch"] + +[[package]] +name = "pynndescent" +version = "0.5.13" +description = "Nearest Neighbor Descent" +optional = false +python-versions = "*" +files = [ + {file = "pynndescent-0.5.13-py3-none-any.whl", hash = "sha256:69aabb8f394bc631b6ac475a1c7f3994c54adf3f51cd63b2730fefba5771b949"}, + {file = "pynndescent-0.5.13.tar.gz", hash = "sha256:d74254c0ee0a1eeec84597d5fe89fedcf778593eeabe32c2f97412934a9800fb"}, +] + +[package.dependencies] +joblib = ">=0.11" +llvmlite = ">=0.30" +numba = ">=0.51.2" +scikit-learn = ">=0.18" +scipy = ">=1.0" + +[[package]] +name = "pyparsing" +version = "3.1.2" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pyright" +version = "1.1.369" +description = "Command line wrapper for pyright" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyright-1.1.369-py3-none-any.whl", hash = "sha256:06d5167a8d7be62523ced0265c5d2f1e022e110caf57a25d92f50fb2d07bcda0"}, + {file = "pyright-1.1.369.tar.gz", hash = "sha256:ad290710072d021e213b98cc7a2f90ae3a48609ef5b978f749346d1a47eb9af8"}, +] + +[package.dependencies] +nodeenv = ">=1.6.0" + +[package.extras] +all = ["twine (>=3.4.1)"] +dev = ["twine (>=3.4.1)"] + +[[package]] +name = "pytest" +version = "8.2.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, + {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2.0" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "0.23.7" +description = "Pytest support for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest_asyncio-0.23.7-py3-none-any.whl", hash = "sha256:009b48127fbe44518a547bddd25611551b0e43ccdbf1e67d12479f569832c20b"}, + {file = "pytest_asyncio-0.23.7.tar.gz", hash = "sha256:5f5c72948f4c49e7db4f29f2521d4031f1c27f86e57b046126654083d4770268"}, +] + +[package.dependencies] +pytest = ">=7.0.0,<9" + +[package.extras] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] +testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] + +[[package]] +name = "pytest-timeout" +version = "2.3.1" +description = "pytest plugin to abort hanging tests" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-timeout-2.3.1.tar.gz", hash = "sha256:12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9"}, + {file = "pytest_timeout-2.3.1-py3-none-any.whl", hash = "sha256:68188cb703edfc6a18fad98dc25a3c61e9f24d644b0b70f33af545219fc7813e"}, +] + +[package.dependencies] +pytest = ">=7.0.0" + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-json-logger" +version = "2.0.7" +description = "A python library adding a json log formatter" +optional = false +python-versions = ">=3.6" +files = [ + {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, + {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, +] + +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pywinpty" +version = "2.0.13" +description = "Pseudo terminal support for Windows from Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pywinpty-2.0.13-cp310-none-win_amd64.whl", hash = "sha256:697bff211fb5a6508fee2dc6ff174ce03f34a9a233df9d8b5fe9c8ce4d5eaf56"}, + {file = "pywinpty-2.0.13-cp311-none-win_amd64.whl", hash = "sha256:b96fb14698db1284db84ca38c79f15b4cfdc3172065b5137383910567591fa99"}, + {file = "pywinpty-2.0.13-cp312-none-win_amd64.whl", hash = "sha256:2fd876b82ca750bb1333236ce98488c1be96b08f4f7647cfdf4129dfad83c2d4"}, + {file = "pywinpty-2.0.13-cp38-none-win_amd64.whl", hash = "sha256:61d420c2116c0212808d31625611b51caf621fe67f8a6377e2e8b617ea1c1f7d"}, + {file = "pywinpty-2.0.13-cp39-none-win_amd64.whl", hash = "sha256:71cb613a9ee24174730ac7ae439fd179ca34ccb8c5349e8d7b72ab5dea2c6f4b"}, + {file = "pywinpty-2.0.13.tar.gz", hash = "sha256:c34e32351a3313ddd0d7da23d27f835c860d32fe4ac814d372a3ea9594f41dde"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +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"}, +] + +[[package]] +name = "pyzmq" +version = "26.0.3" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625"}, + {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf"}, + {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59"}, + {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc"}, + {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8"}, + {file = "pyzmq-26.0.3-cp310-cp310-win32.whl", hash = "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537"}, + {file = "pyzmq-26.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47"}, + {file = "pyzmq-26.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7"}, + {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32"}, + {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a"}, + {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5"}, + {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd"}, + {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83"}, + {file = "pyzmq-26.0.3-cp311-cp311-win32.whl", hash = "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3"}, + {file = "pyzmq-26.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500"}, + {file = "pyzmq-26.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94"}, + {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753"}, + {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20"}, + {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77"}, + {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2"}, + {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798"}, + {file = "pyzmq-26.0.3-cp312-cp312-win32.whl", hash = "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0"}, + {file = "pyzmq-26.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf"}, + {file = "pyzmq-26.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b"}, + {file = "pyzmq-26.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5"}, + {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b"}, + {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa"}, + {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450"}, + {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987"}, + {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a"}, + {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5"}, + {file = "pyzmq-26.0.3-cp37-cp37m-win32.whl", hash = "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf"}, + {file = "pyzmq-26.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a"}, + {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18"}, + {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d"}, + {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6"}, + {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad"}, + {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad"}, + {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67"}, + {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c"}, + {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97"}, + {file = "pyzmq-26.0.3-cp38-cp38-win32.whl", hash = "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc"}, + {file = "pyzmq-26.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972"}, + {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606"}, + {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f"}, + {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5"}, + {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8"}, + {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620"}, + {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4"}, + {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab"}, + {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920"}, + {file = "pyzmq-26.0.3-cp39-cp39-win32.whl", hash = "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879"}, + {file = "pyzmq-26.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2"}, + {file = "pyzmq-26.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad"}, + {file = "pyzmq-26.0.3.tar.gz", hash = "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "qtconsole" +version = "5.5.2" +description = "Jupyter Qt console" +optional = false +python-versions = ">=3.8" +files = [ + {file = "qtconsole-5.5.2-py3-none-any.whl", hash = "sha256:42d745f3d05d36240244a04e1e1ec2a86d5d9b6edb16dbdef582ccb629e87e0b"}, + {file = "qtconsole-5.5.2.tar.gz", hash = "sha256:6b5fb11274b297463706af84dcbbd5c92273b1f619e6d25d08874b0a88516989"}, +] + +[package.dependencies] +ipykernel = ">=4.1" +jupyter-client = ">=4.1" +jupyter-core = "*" +packaging = "*" +pygments = "*" +pyzmq = ">=17.1" +qtpy = ">=2.4.0" +traitlets = "<5.2.1 || >5.2.1,<5.2.2 || >5.2.2" + +[package.extras] +doc = ["Sphinx (>=1.3)"] +test = ["flaky", "pytest", "pytest-qt"] + +[[package]] +name = "qtpy" +version = "2.4.1" +description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." +optional = false +python-versions = ">=3.7" +files = [ + {file = "QtPy-2.4.1-py3-none-any.whl", hash = "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b"}, + {file = "QtPy-2.4.1.tar.gz", hash = "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987"}, +] + +[package.dependencies] +packaging = "*" + +[package.extras] +test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] + +[[package]] +name = "ratelimiter" +version = "1.2.0.post0" +description = "Simple python rate limiting object" +optional = false +python-versions = "*" +files = [ + {file = "ratelimiter-1.2.0.post0-py3-none-any.whl", hash = "sha256:a52be07bc0bb0b3674b4b304550f10c769bbb00fead3072e035904474259809f"}, + {file = "ratelimiter-1.2.0.post0.tar.gz", hash = "sha256:5c395dcabdbbde2e5178ef3f89b568a3066454a6ddc223b76473dac22f89b4f7"}, +] + +[package.extras] +test = ["pytest (>=3.0)", "pytest-asyncio"] + +[[package]] +name = "referencing" +version = "0.35.1" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + +[[package]] +name = "regex" +version = "2024.5.15" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.8" +files = [ + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, + {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, + {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, + {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, + {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, + {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, + {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, + {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, + {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, + {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, + {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, + {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "retry" +version = "0.9.2" +description = "Easy to use retry decorator." +optional = false +python-versions = "*" +files = [ + {file = "retry-0.9.2-py2.py3-none-any.whl", hash = "sha256:ccddf89761fa2c726ab29391837d4327f819ea14d244c232a1d24c67a2f98606"}, + {file = "retry-0.9.2.tar.gz", hash = "sha256:f8bfa8b99b69c4506d6f5bd3b0aabf77f98cdb17f3c9fc3f5ca820033336fba4"}, +] + +[package.dependencies] +decorator = ">=3.4.2" +py = ">=1.4.26,<2.0.0" + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +description = "A pure python RFC3339 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, + {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +description = "Pure python rfc3986 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, + {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, +] + +[[package]] +name = "rich" +version = "13.7.1" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, + {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "rpds-py" +version = "0.18.1" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, + {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, + {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, + {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, + {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, + {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, + {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, + {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, + {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, + {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, + {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, + {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, +] + +[[package]] +name = "ruff" +version = "0.5.0" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.5.0-py3-none-linux_armv6l.whl", hash = "sha256:ee770ea8ab38918f34e7560a597cc0a8c9a193aaa01bfbd879ef43cb06bd9c4c"}, + {file = "ruff-0.5.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:38f3b8327b3cb43474559d435f5fa65dacf723351c159ed0dc567f7ab735d1b6"}, + {file = "ruff-0.5.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7594f8df5404a5c5c8f64b8311169879f6cf42142da644c7e0ba3c3f14130370"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adc7012d6ec85032bc4e9065110df205752d64010bed5f958d25dbee9ce35de3"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d505fb93b0fabef974b168d9b27c3960714d2ecda24b6ffa6a87ac432905ea38"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dc5cfd3558f14513ed0d5b70ce531e28ea81a8a3b1b07f0f48421a3d9e7d80a"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:db3ca35265de239a1176d56a464b51557fce41095c37d6c406e658cf80bbb362"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1a321c4f68809fddd9b282fab6a8d8db796b270fff44722589a8b946925a2a8"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c4dfcd8d34b143916994b3876b63d53f56724c03f8c1a33a253b7b1e6bf2a7d"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81e5facfc9f4a674c6a78c64d38becfbd5e4f739c31fcd9ce44c849f1fad9e4c"}, + {file = "ruff-0.5.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e589e27971c2a3efff3fadafb16e5aef7ff93250f0134ec4b52052b673cf988d"}, + {file = "ruff-0.5.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d2ffbc3715a52b037bcb0f6ff524a9367f642cdc5817944f6af5479bbb2eb50e"}, + {file = "ruff-0.5.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cd096e23c6a4f9c819525a437fa0a99d1c67a1b6bb30948d46f33afbc53596cf"}, + {file = "ruff-0.5.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:46e193b36f2255729ad34a49c9a997d506e58f08555366b2108783b3064a0e1e"}, + {file = "ruff-0.5.0-py3-none-win32.whl", hash = "sha256:49141d267100f5ceff541b4e06552e98527870eafa1acc9dec9139c9ec5af64c"}, + {file = "ruff-0.5.0-py3-none-win_amd64.whl", hash = "sha256:e9118f60091047444c1b90952736ee7b1792910cab56e9b9a9ac20af94cd0440"}, + {file = "ruff-0.5.0-py3-none-win_arm64.whl", hash = "sha256:ed5c4df5c1fb4518abcb57725b576659542bdbe93366f4f329e8f398c4b71178"}, + {file = "ruff-0.5.0.tar.gz", hash = "sha256:eb641b5873492cf9bd45bc9c5ae5320648218e04386a5f0c264ad6ccce8226a1"}, +] + +[[package]] +name = "scikit-learn" +version = "1.5.0" +description = "A set of python modules for machine learning and data mining" +optional = false +python-versions = ">=3.9" +files = [ + {file = "scikit_learn-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12e40ac48555e6b551f0a0a5743cc94cc5a765c9513fe708e01f0aa001da2801"}, + {file = "scikit_learn-1.5.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f405c4dae288f5f6553b10c4ac9ea7754d5180ec11e296464adb5d6ac68b6ef5"}, + {file = "scikit_learn-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df8ccabbf583315f13160a4bb06037bde99ea7d8211a69787a6b7c5d4ebb6fc3"}, + {file = "scikit_learn-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c75ea812cd83b1385bbfa94ae971f0d80adb338a9523f6bbcb5e0b0381151d4"}, + {file = "scikit_learn-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:a90c5da84829a0b9b4bf00daf62754b2be741e66b5946911f5bdfaa869fcedd6"}, + {file = "scikit_learn-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a65af2d8a6cce4e163a7951a4cfbfa7fceb2d5c013a4b593686c7f16445cf9d"}, + {file = "scikit_learn-1.5.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:4c0c56c3005f2ec1db3787aeaabefa96256580678cec783986836fc64f8ff622"}, + {file = "scikit_learn-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f77547165c00625551e5c250cefa3f03f2fc92c5e18668abd90bfc4be2e0bff"}, + {file = "scikit_learn-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:118a8d229a41158c9f90093e46b3737120a165181a1b58c03461447aa4657415"}, + {file = "scikit_learn-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:a03b09f9f7f09ffe8c5efffe2e9de1196c696d811be6798ad5eddf323c6f4d40"}, + {file = "scikit_learn-1.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:460806030c666addee1f074788b3978329a5bfdc9b7d63e7aad3f6d45c67a210"}, + {file = "scikit_learn-1.5.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:1b94d6440603752b27842eda97f6395f570941857456c606eb1d638efdb38184"}, + {file = "scikit_learn-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d82c2e573f0f2f2f0be897e7a31fcf4e73869247738ab8c3ce7245549af58ab8"}, + {file = "scikit_learn-1.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3a10e1d9e834e84d05e468ec501a356226338778769317ee0b84043c0d8fb06"}, + {file = "scikit_learn-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:855fc5fa8ed9e4f08291203af3d3e5fbdc4737bd617a371559aaa2088166046e"}, + {file = "scikit_learn-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:40fb7d4a9a2db07e6e0cae4dc7bdbb8fada17043bac24104d8165e10e4cff1a2"}, + {file = "scikit_learn-1.5.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:47132440050b1c5beb95f8ba0b2402bbd9057ce96ec0ba86f2f445dd4f34df67"}, + {file = "scikit_learn-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174beb56e3e881c90424e21f576fa69c4ffcf5174632a79ab4461c4c960315ac"}, + {file = "scikit_learn-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261fe334ca48f09ed64b8fae13f9b46cc43ac5f580c4a605cbb0a517456c8f71"}, + {file = "scikit_learn-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:057b991ac64b3e75c9c04b5f9395eaf19a6179244c089afdebaad98264bff37c"}, + {file = "scikit_learn-1.5.0.tar.gz", hash = "sha256:789e3db01c750ed6d496fa2db7d50637857b451e57bcae863bff707c1247bef7"}, +] + +[package.dependencies] +joblib = ">=1.2.0" +numpy = ">=1.19.5" +scipy = ">=1.6.0" +threadpoolctl = ">=3.1.0" + +[package.extras] +benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] +build = ["cython (>=3.0.10)", "meson-python (>=0.15.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.15.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] +install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] +maintenance = ["conda-lock (==2.5.6)"] +tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] + +[[package]] +name = "scipy" +version = "1.12.0" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, + {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, + {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, + {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, + {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, + {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, + {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, + {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, + {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, + {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, +] + +[package.dependencies] +numpy = ">=1.22.4,<1.29.0" + +[package.extras] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "seaborn" +version = "0.13.2" +description = "Statistical data visualization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987"}, + {file = "seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7"}, +] + +[package.dependencies] +matplotlib = ">=3.4,<3.6.1 || >3.6.1" +numpy = ">=1.20,<1.24.0 || >1.24.0" +pandas = ">=1.2" + +[package.extras] +dev = ["flake8", "flit", "mypy", "pandas-stubs", "pre-commit", "pytest", "pytest-cov", "pytest-xdist"] +docs = ["ipykernel", "nbconvert", "numpydoc", "pydata_sphinx_theme (==0.10.0rc2)", "pyyaml", "sphinx (<6.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-issues"] +stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] + +[[package]] +name = "semversioner" +version = "2.0.5" +description = "Manage properly semver in your repository" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "semversioner-2.0.5-py2.py3-none-any.whl", hash = "sha256:c5134188592764eab72fea081f8696b3ab9e12fa132a6b4c5cc008285b06f45e"}, + {file = "semversioner-2.0.5.tar.gz", hash = "sha256:84b307e95eb7eab2e299935fe5acfb91f23a2e493526d3f42cfe1d5adcfc3641"}, +] + +[package.dependencies] +click = ">=8.0.0" +jinja2 = ">=3.0.0" +packaging = ">=21.0" + +[[package]] +name = "send2trash" +version = "1.8.3" +description = "Send file to trash natively under Mac OS X, Windows and Linux" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, + {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, +] + +[package.extras] +nativelib = ["pyobjc-framework-Cocoa", "pywin32"] +objc = ["pyobjc-framework-Cocoa"] +win32 = ["pywin32"] + +[[package]] +name = "setuptools" +version = "70.2.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-70.2.0-py3-none-any.whl", hash = "sha256:b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05"}, + {file = "setuptools-70.2.0.tar.gz", hash = "sha256:bd63e505105011b25c3c11f753f7e3b8465ea739efddaccef8f0efac2137bac1"}, +] + +[package.extras] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "smart-open" +version = "7.0.4" +description = "Utils for streaming large files (S3, HDFS, GCS, Azure Blob Storage, gzip, bz2...)" +optional = false +python-versions = "<4.0,>=3.7" +files = [ + {file = "smart_open-7.0.4-py3-none-any.whl", hash = "sha256:4e98489932b3372595cddc075e6033194775165702887216b65eba760dfd8d47"}, + {file = "smart_open-7.0.4.tar.gz", hash = "sha256:62b65852bdd1d1d516839fcb1f6bc50cd0f16e05b4ec44b52f43d38bcb838524"}, +] + +[package.dependencies] +wrapt = "*" + +[package.extras] +all = ["azure-common", "azure-core", "azure-storage-blob", "boto3", "google-cloud-storage (>=2.6.0)", "paramiko", "requests", "zstandard"] +azure = ["azure-common", "azure-core", "azure-storage-blob"] +gcs = ["google-cloud-storage (>=2.6.0)"] +http = ["requests"] +s3 = ["boto3"] +ssh = ["paramiko"] +test = ["azure-common", "azure-core", "azure-storage-blob", "boto3", "google-cloud-storage (>=2.6.0)", "moto[server]", "paramiko", "pytest", "pytest-rerunfailures", "requests", "responses", "zstandard"] +webhdfs = ["requests"] +zst = ["zstandard"] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "statsmodels" +version = "0.14.2" +description = "Statistical computations and models for Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "statsmodels-0.14.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df5d6f95c46f0341da6c79ee7617e025bf2b371e190a8e60af1ae9cabbdb7a97"}, + {file = "statsmodels-0.14.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a87ef21fadb445b650f327340dde703f13aec1540f3d497afb66324499dea97a"}, + {file = "statsmodels-0.14.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5827a12e3ede2b98a784476d61d6bec43011fedb64aa815f2098e0573bece257"}, + {file = "statsmodels-0.14.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f2b7611a61adb7d596a6d239abdf1a4d5492b931b00d5ed23d32844d40e48e"}, + {file = "statsmodels-0.14.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c254c66142f1167b4c7d031cf8db55294cc62ff3280e090fc45bd10a7f5fd029"}, + {file = "statsmodels-0.14.2-cp310-cp310-win_amd64.whl", hash = "sha256:0e46e9d59293c1af4cc1f4e5248f17e7e7bc596bfce44d327c789ac27f09111b"}, + {file = "statsmodels-0.14.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:50fcb633987779e795142f51ba49fb27648d46e8a1382b32ebe8e503aaabaa9e"}, + {file = "statsmodels-0.14.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:876794068abfaeed41df71b7887000031ecf44fbfa6b50d53ccb12ebb4ab747a"}, + {file = "statsmodels-0.14.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a91f6c4943de13e3ce2e20ee3b5d26d02bd42300616a421becd53756f5deb37"}, + {file = "statsmodels-0.14.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4864a1c4615c5ea5f2e3b078a75bdedc90dd9da210a37e0738e064b419eccee2"}, + {file = "statsmodels-0.14.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afbd92410e0df06f3d8c4e7c0e2e71f63f4969531f280fb66059e2ecdb6e0415"}, + {file = "statsmodels-0.14.2-cp311-cp311-win_amd64.whl", hash = "sha256:8e004cfad0e46ce73fe3f3812010c746f0d4cfd48e307b45c14e9e360f3d2510"}, + {file = "statsmodels-0.14.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:eb0ba1ad3627705f5ae20af6b2982f500546d43892543b36c7bca3e2f87105e7"}, + {file = "statsmodels-0.14.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:90fd2f0110b73fc3fa5a2f21c3ca99b0e22285cccf38e56b5b8fd8ce28791b0f"}, + {file = "statsmodels-0.14.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac780ad9ff552773798829a0b9c46820b0faa10e6454891f5e49a845123758ab"}, + {file = "statsmodels-0.14.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55d1742778400ae67acb04b50a2c7f5804182f8a874bd09ca397d69ed159a751"}, + {file = "statsmodels-0.14.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f870d14a587ea58a3b596aa994c2ed889cc051f9e450e887d2c83656fc6a64bf"}, + {file = "statsmodels-0.14.2-cp312-cp312-win_amd64.whl", hash = "sha256:f450fcbae214aae66bd9d2b9af48e0f8ba1cb0e8596c6ebb34e6e3f0fec6542c"}, + {file = "statsmodels-0.14.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:201c3d00929c4a67cda1fe05b098c8dcf1b1eeefa88e80a8f963a844801ed59f"}, + {file = "statsmodels-0.14.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9edefa4ce08e40bc1d67d2f79bc686ee5e238e801312b5a029ee7786448c389a"}, + {file = "statsmodels-0.14.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c78a7601fdae1aa32104c5ebff2e0b72c26f33e870e2f94ab1bcfd927ece9b"}, + {file = "statsmodels-0.14.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f36494df7c03d63168fccee5038a62f469469ed6a4dd6eaeb9338abedcd0d5f5"}, + {file = "statsmodels-0.14.2-cp39-cp39-win_amd64.whl", hash = "sha256:8875823bdd41806dc853333cc4e1b7ef9481bad2380a999e66ea42382cf2178d"}, + {file = "statsmodels-0.14.2.tar.gz", hash = "sha256:890550147ad3a81cda24f0ba1a5c4021adc1601080bd00e191ae7cd6feecd6ad"}, +] + +[package.dependencies] +numpy = ">=1.22.3" +packaging = ">=21.3" +pandas = ">=1.4,<2.1.0 || >2.1.0" +patsy = ">=0.5.6" +scipy = ">=1.8,<1.9.2 || >1.9.2" + +[package.extras] +build = ["cython (>=0.29.33)"] +develop = ["colorama", "cython (>=0.29.33)", "cython (>=3.0.10,<4)", "flake8", "isort", "joblib", "matplotlib (>=3)", "pytest (>=7.3.0,<8)", "pytest-cov", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=8.0,<9.0)"] +docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] + +[[package]] +name = "swifter" +version = "1.4.0" +description = "A package which efficiently applies any function to a pandas dataframe or series in the fastest available manner" +optional = false +python-versions = "*" +files = [ + {file = "swifter-1.4.0.tar.gz", hash = "sha256:e1bb74476a21b3f07a17aa18c97fdcba8599726bd17da732f09dabcc50e26ba0"}, +] + +[package.dependencies] +dask = {version = ">=2.10.0", extras = ["dataframe"]} +pandas = ">=1.0.0" +psutil = ">=5.6.6" +tqdm = ">=4.33.0" + +[package.extras] +groupby = ["ray (>=1.0.0)"] +notebook = ["ipywidgets (>=7.0.0)"] + +[[package]] +name = "tenacity" +version = "8.4.2" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tenacity-8.4.2-py3-none-any.whl", hash = "sha256:9e6f7cf7da729125c7437222f8a522279751cdfbe6b67bfe64f75d3a348661b2"}, + {file = "tenacity-8.4.2.tar.gz", hash = "sha256:cd80a53a79336edba8489e767f729e4f391c896956b57140b5d7511a64bbd3ef"}, +] + +[package.extras] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] + +[[package]] +name = "terminado" +version = "0.18.1" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, + {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, +] + +[package.dependencies] +ptyprocess = {version = "*", markers = "os_name != \"nt\""} +pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} +tornado = ">=6.1.0" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] +typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] + +[[package]] +name = "textual" +version = "0.70.0" +description = "Modern Text User Interface framework" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "textual-0.70.0-py3-none-any.whl", hash = "sha256:774bf45782193760ca273b915fd685cada37d0836237d61dc57d5bcdbe2c7ddb"}, + {file = "textual-0.70.0.tar.gz", hash = "sha256:9ca3f615b5cf442246325e40ef8255424c42b4241d3c62f9c0f96951bab82b1e"}, +] + +[package.dependencies] +markdown-it-py = {version = ">=2.1.0", extras = ["linkify", "plugins"]} +rich = ">=13.3.3" +typing-extensions = ">=4.4.0,<5.0.0" + +[package.extras] +syntax = ["tree-sitter (>=0.20.1,<0.21.0)", "tree-sitter-languages (==1.10.2)"] + +[[package]] +name = "threadpoolctl" +version = "3.5.0" +description = "threadpoolctl" +optional = false +python-versions = ">=3.8" +files = [ + {file = "threadpoolctl-3.5.0-py3-none-any.whl", hash = "sha256:56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467"}, + {file = "threadpoolctl-3.5.0.tar.gz", hash = "sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107"}, +] + +[[package]] +name = "tiktoken" +version = "0.7.0" +description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tiktoken-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f"}, + {file = "tiktoken-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5"}, + {file = "tiktoken-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89"}, + {file = "tiktoken-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97"}, + {file = "tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769"}, + {file = "tiktoken-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226"}, + {file = "tiktoken-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9"}, + {file = "tiktoken-0.7.0.tar.gz", hash = "sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6"}, +] + +[package.dependencies] +regex = ">=2022.1.18" +requests = ">=2.26.0" + +[package.extras] +blobfile = ["blobfile (>=2)"] + +[[package]] +name = "tinycss2" +version = "1.3.0" +description = "A tiny CSS parser" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tinycss2-1.3.0-py3-none-any.whl", hash = "sha256:54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7"}, + {file = "tinycss2-1.3.0.tar.gz", hash = "sha256:152f9acabd296a8375fbca5b84c961ff95971fcfc32e79550c8df8e29118c54d"}, +] + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["pytest", "ruff"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tomlkit" +version = "0.12.5" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, + {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, +] + +[[package]] +name = "toolz" +version = "0.12.1" +description = "List processing tools and functional utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85"}, + {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, +] + +[[package]] +name = "tornado" +version = "6.4.1" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">=3.8" +files = [ + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, + {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, + {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, + {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, +] + +[[package]] +name = "tqdm" +version = "4.66.4" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, + {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "types-python-dateutil" +version = "2.9.0.20240316" +description = "Typing stubs for python-dateutil" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"}, + {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, +] + +[[package]] +name = "typing-extensions" +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.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + +[[package]] +name = "uc-micro-py" +version = "1.0.3" +description = "Micro subset of unicode data files for linkify-it-py projects." +optional = false +python-versions = ">=3.7" +files = [ + {file = "uc-micro-py-1.0.3.tar.gz", hash = "sha256:d321b92cff673ec58027c04015fcaa8bb1e005478643ff4a500882eaab88c48a"}, + {file = "uc_micro_py-1.0.3-py3-none-any.whl", hash = "sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5"}, +] + +[package.extras] +test = ["coverage", "pytest", "pytest-cov"] + +[[package]] +name = "umap-learn" +version = "0.5.6" +description = "Uniform Manifold Approximation and Projection" +optional = false +python-versions = "*" +files = [ + {file = "umap-learn-0.5.6.tar.gz", hash = "sha256:5b3917a862c23ba0fc83bfcd67a7b719dec85b3d9c01fdc7d894cce455df4e03"}, + {file = "umap_learn-0.5.6-py3-none-any.whl", hash = "sha256:881cc0c2ee845b790bf0455aa1664f9f68b838d9d0fe12a1291b85c5a559c913"}, +] + +[package.dependencies] +numba = ">=0.51.2" +numpy = ">=1.17" +pynndescent = ">=0.5" +scikit-learn = ">=0.22" +scipy = ">=1.3.1" +tqdm = "*" + +[package.extras] +parametric-umap = ["tensorflow (>=2.1)"] +plot = ["bokeh", "colorcet", "datashader", "holoviews", "matplotlib", "pandas", "scikit-image", "seaborn"] +tbb = ["tbb (>=2019.0)"] + +[[package]] +name = "update-toml" +version = "0.2.1" +description = "Update a toml value from a CLI" +optional = false +python-versions = ">=3.8" +files = [ + {file = "update_toml-0.2.1-py3-none-any.whl", hash = "sha256:90d5d9d2efbe2f273328ec78394912c33c0f741dc3b0ae744cfc4ddbe27051f7"}, + {file = "update_toml-0.2.1.tar.gz", hash = "sha256:92870b2ef8591eeffa32df674d9b4c4fce59a428f65063e138dee253bdb5d372"}, +] + +[package.dependencies] +tomlkit = ">=0.12.5,<0.13.0" + +[[package]] +name = "uri-template" +version = "1.3.0" +description = "RFC 6570 URI Template Processor" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, + {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, +] + +[package.extras] +dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] + +[[package]] +name = "urllib3" +version = "2.2.2" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "uvloop" +version = "0.19.0" +description = "Fast implementation of asyncio event loop on top of libuv" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e"}, + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5"}, + {file = "uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd"}, +] + +[package.extras] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "webcolors" +version = "24.6.0" +description = "A library for working with the color formats defined by HTML and CSS." +optional = false +python-versions = ">=3.8" +files = [ + {file = "webcolors-24.6.0-py3-none-any.whl", hash = "sha256:8cf5bc7e28defd1d48b9e83d5fc30741328305a8195c29a8e668fa45586568a1"}, + {file = "webcolors-24.6.0.tar.gz", hash = "sha256:1d160d1de46b3e81e58d0a280d0c78b467dc80f47294b91b1ad8029d2cedb55b"}, +] + +[package.extras] +docs = ["furo", "sphinx", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-notfound-page", "sphinxext-opengraph"] +tests = ["coverage[toml]"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "websocket-client" +version = "1.8.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + +[[package]] +name = "widgetsnbextension" +version = "4.0.11" +description = "Jupyter interactive widgets for Jupyter Notebook" +optional = false +python-versions = ">=3.7" +files = [ + {file = "widgetsnbextension-4.0.11-py3-none-any.whl", hash = "sha256:55d4d6949d100e0d08b94948a42efc3ed6dfdc0e9468b2c4b128c9a2ce3a7a36"}, + {file = "widgetsnbextension-4.0.11.tar.gz", hash = "sha256:8b22a8f1910bfd188e596fe7fc05dcbd87e810c8a4ba010bdb3da86637398474"}, +] + +[[package]] +name = "wrapt" +version = "1.16.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.6" +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"}, +] + +[[package]] +name = "zipp" +version = "3.19.2" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, +] + +[package.extras] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["big-O", "importlib-resources", "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)"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.10,<3.13" +content-hash = "ea7c6dc8e002da570a51c6656d1ff858f48090d7ef903f7c199b9eee7bb56b2b" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..48cf328c --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,254 @@ +[tool.poetry] +name = "graphrag" +# Maintainers: do not change the version here manually, use ./scripts/release.sh +version = "0.0.1" +description = "" +authors = [ + "Alonso Guevara Fernández ", + "Andrés Morales Esquivel ", + "Chris Trevino ", + "David Tittsworth ", + "Dayenne de Souza ", + "Gaudy Blanco Meneses ", + "Ha Trinh ", + "Jonathan Larson ", + "Kate Lytvynets ", + "Mónica Carvajal", + "Nathan Evans ", + "Rodrigo Racanicci ", + "Sarah Smith ", +] +license = "MIT" +readme = "README.md" +packages = [{ include = "graphrag" }] + +[tool.poetry-dynamic-versioning] +enable = true +style = "pep440" +vcs = "git" +bump = true +format-jinja = """ + {%- if distance == 0 -%} + {{ serialize_pep440(base, stage, revision) }} + {%- else -%} + {{ serialize_pep440(base, stage, revision, dev=distance) }} + {%- endif -%} +""" + +[tool.poetry.dependencies] +python = ">=3.10,<3.13" +environs = "^11.0.0" +datashaper = "^0.0.49" + +# Vector Stores +azure-search-documents = "^11.4.0" +lancedb = "^0.9.0" + +# Event Loops +uvloop = { version = "^0.19.0", markers = "platform_system != 'Windows'" } +nest-asyncio = { version = "^1.6.0", markers = "platform_system == 'Windows'" } + +# Async IO +aiolimiter = "^1.1.0" +aiofiles = "^24.1.0" + +# LLM +openai = "^1.35.7" +nltk = "3.8.1" +tiktoken = "^0.7.0" + +# Data-Sci +numba = "0.60.0" +numpy = "^1.25.2" +graspologic = "^3.4.1" +networkx = "^3" +fastparquet = "^2024.2.0" +# 1.13.0 was a footgun +scipy = "1.12.0" + +# Configuration +pyyaml = "^6.0.1" +pyaml-env = "^1.2.1" +python-dotenv = "^1.0.0" + +# Network +tenacity = "^8.2.3" + +swifter = "^1.4.0" +pydantic = "^2" +rich = "^13.6.0" +textual = "^0.70.0" +devtools = "^0.12.2" + +typing-extensions = "^4.12.2" + +#Azure +azure-storage-blob = "^12.19.0" +azure-identity = "^1.17.1" + +[tool.poetry.group.dev.dependencies] +coverage = "^7.5.4" +ipykernel = "^6.29.4" +jupyter = "^1.0.0" +nbconvert = "^7.16.3" +poethepoet = "^0.26.0" +pyright = "^1.1.368" +pytest = "^8.2.0" +pytest-asyncio = "^0.23.4" +pytest-timeout = "^2.3.1" +ruff = "^0.5.0" +semversioner = "^2.0.3" + +update-toml = "^0.2.1" + +[build-system] +requires = ["poetry-core>=1.0.0", "poetry-dynamic-versioning>=1.0.0,<2.0.0"] +build-backend = "poetry_dynamic_versioning.backend" + +[tool.poe.tasks] +_sort_imports = "ruff check --select I --fix . --preview" +_format_code = "ruff format . --preview" +_ruff_check = 'ruff check . --preview' +_pyright = "pyright" +_convert_local_search_nb = 'jupyter nbconvert --output-dir=docsite/posts/query/notebooks/ --output="{notebook_name}_nb" --template=docsite/nbdocsite_template --to markdown examples_notebooks/local_search.ipynb' +_convert_global_search_nb = 'jupyter nbconvert --output-dir=docsite/posts/query/notebooks/ --output="{notebook_name}_nb" --template=docsite/nbdocsite_template --to markdown examples_notebooks/global_search.ipynb' +_semversioner_release = "semversioner release" +_semversioner_changelog = "semversioner changelog > CHANGELOG.md" +_semversioner_update_toml_version = "update-toml --path tool.poetry.version --value \"$(semversioner current-version)\" pyproject.toml" +coverage_report = 'coverage report --omit "**/tests/**" --show-missing' +check_format = 'ruff format . --check --preview' +fix = "ruff --preview check --fix ." +fix_unsafe = "ruff check --preview --fix --unsafe-fixes ." + +_test_all = "coverage run -m pytest ./tests" +test_unit = "pytest ./tests/unit" +test_integration = "pytest ./tests/integration" +test_smoke = "pytest ./tests/smoke" +index = "python -m graphrag.index" +query = "python -m graphrag.query" +prompt_tune = "python -m graphrag.prompt_tune" +# Pass in a test pattern +test_only = "pytest -s -k" + +[[tool.poe.tasks.release]] +sequence = [ + '_semversioner_release', + '_semversioner_changelog', + '_semversioner_update_toml_version', +] +ignore_fail = 'return_non_zero' + +[[tool.poe.tasks.convert_docsite_notebooks]] +sequence = ['_convert_local_search_nb', '_convert_global_search_nb'] +ignore_fail = 'return_non_zero' + +[[tool.poe.tasks.format]] +sequence = ['_sort_imports', '_format_code'] +ignore_fail = 'return_non_zero' + +[[tool.poe.tasks.check]] +sequence = ['check_format', '_ruff_check', '_pyright'] +ignore_fail = 'return_non_zero' + +[[tool.poe.tasks.test]] +sequence = ['_test_all', 'coverage_report'] +ignore_fail = 'return_non_zero' + +[tool.ruff] +target-version = "py310" +extend-include = ["*.ipynb"] + +[tool.ruff.format] +docstring-code-format = true +docstring-code-line-length = 20 + +[tool.ruff.lint] +select = [ + "E4", + "E7", + "E9", + "W291", + "YTT", + "T10", + "ICN", + "INP", + "Q", + "RSE", + "SLOT", + "INT", + "FLY", + "LOG", + "C90", + "T20", + "D", + "RET", + "PD", + "N", + "PIE", + "SIM", + "S", + "G", + "ERA", + "ASYNC", + "TID", + "UP", + "SLF", + "BLE", + "C4", + "I", + "F", + "A", + "ARG", + "PTH", + "RUF", + "B", + "TCH", + "DTZ", + "PYI", + "PT", + "EM", + "TRY", + "PERF", + "CPY", + # "FBT", # use named arguments for boolean flags + # "TD", # todos + # "FIX", # fixme + # "FURB" # preview rules + # ANN # Type annotations, re-enable when we get bandwidth +] +ignore = [ + # Deprecated Rules + "ANN101", + "ANN102", + # Conflicts with interface argument checking + "ARG002", + "ANN204", + # TODO: Inspect these pandas rules for validity + "PD002", # prevents inplace=True + # TODO RE-Enable when we get bandwidth + "PERF203", # Needs restructuring of errors, we should bail-out on first error + "C901", # needs refactoring to remove cyclomatic complexity +] + +[tool.ruff.lint.per-file-ignores] +"tests/*" = ["S", "D", "ANN", "T201", "ASYNC", "ARG", "PTH", "TRY"] +"examples/*" = ["S", "D", "ANN", "T201", "PTH", "TRY", "PERF"] +"graphrag/index/config/*" = ["TCH"] +"*.ipynb" = ["T201"] + +[tool.ruff.lint.flake8-builtins] +builtins-ignorelist = ["input", "id", "bytes"] + +[tool.ruff.lint.pydocstyle] +convention = "numpy" + +# https://github.com/microsoft/pyright/blob/9f81564a4685ff5c55edd3959f9b39030f590b2f/docs/configuration.md#sample-pyprojecttoml-file +[tool.pyright] +include = ["graphrag", "tests", "examples", "examples_notebooks"] +exclude = ["**/node_modules", "**/__pycache__"] + +[tool.pytest.ini_options] +asyncio_mode = "auto" +timeout = 600 +# log_cli = true +# log_cli_level = "INFO" diff --git a/scripts/e2e-test.sh b/scripts/e2e-test.sh new file mode 100755 index 00000000..5c260a14 --- /dev/null +++ b/scripts/e2e-test.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +# Use CLI Form +poetry run python -m graphrag.index --config ./examples/single_verb/pipeline.yml \ No newline at end of file diff --git a/scripts/semver-check.sh b/scripts/semver-check.sh new file mode 100755 index 00000000..26d69f9b --- /dev/null +++ b/scripts/semver-check.sh @@ -0,0 +1,10 @@ +#!/bin/sh +changes=$(git diff --name-only origin/main) +has_change_doc=$(echo $changes | grep .semversioner/next-release) +has_impacting_changes=$(echo $changes | grep graphrag) + +if [ "$has_impacting_changes" ] && [ -z "$has_change_doc" ]; then + echo "Check failed. Run 'poetry run semversioner add-change' to update the next release version" + exit 1 +fi +echo "OK" diff --git a/scripts/spellcheck.sh b/scripts/spellcheck.sh new file mode 100755 index 00000000..7c1b50e9 --- /dev/null +++ b/scripts/spellcheck.sh @@ -0,0 +1,2 @@ +#!/bin/sh +npx --yes cspell -c cspell.config.yaml --no-progress lint . \ No newline at end of file diff --git a/scripts/start-azurite.sh b/scripts/start-azurite.sh new file mode 100755 index 00000000..345f500f --- /dev/null +++ b/scripts/start-azurite.sh @@ -0,0 +1,2 @@ +#!/bin/sh +npx --yes azurite -L -l ./temp_azurite -d ./temp_azurite/debug.log \ No newline at end of file diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 00000000..c6536014 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,6 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +def pytest_addoption(parser): + parser.addoption( + "--run_slow", action="store_true", default=False, help="run slow tests" + ) diff --git a/tests/fixtures/azure/config.json b/tests/fixtures/azure/config.json new file mode 100644 index 00000000..8adced2c --- /dev/null +++ b/tests/fixtures/azure/config.json @@ -0,0 +1,13 @@ +{ + "input_path": "./tests/fixtures/azure", + "input_file_type": "text", + "workflow_config": { + "skip_assert": true, + "azure": { + "input_container": "azurefixture", + "input_base_dir": "input" + } + }, + "query_config": [], + "slow": false +} \ No newline at end of file diff --git a/tests/fixtures/azure/input/ABOUT.md b/tests/fixtures/azure/input/ABOUT.md new file mode 100644 index 00000000..42c31610 --- /dev/null +++ b/tests/fixtures/azure/input/ABOUT.md @@ -0,0 +1,3 @@ +# About + +This document (Operation Dulce) in an AI-generated science fiction novella, included here for the purposes of integration testing. \ No newline at end of file diff --git a/tests/fixtures/azure/input/dulce.txt b/tests/fixtures/azure/input/dulce.txt new file mode 100644 index 00000000..95c9e3cd --- /dev/null +++ b/tests/fixtures/azure/input/dulce.txt @@ -0,0 +1,970 @@ +# Operation: Dulce + +## Chapter 1 + +The thrumming of monitors cast a stark contrast to the rigid silence enveloping the group. Agent Alex Mercer, unfailingly determined on paper, seemed dwarfed by the enormity of the sterile briefing room where Paranormal Military Squad's elite convened. With dulled eyes, he scanned the projectors outlining their impending odyssey into Operation: Dulce. + +“I assume, Agent Mercer, you’re not having second thoughts?” It was Taylor Cruz’s voice, laced with an edge that demanded attention. + +Alex flickered a strained smile, still thumbing his folder's corner. "Of course not, Agent Cruz. Just trying to soak in all the details." The compliance in his tone was unsettling, even to himself. + +Jordan Hayes, perched on the opposite side of the table, narrowed their eyes but offered a supportive nod. "Details are imperative. We’ll need your clear-headedness down there, Mercer." + +A comfortable silence, the kind that threaded between veterans of shared secrets, lingered briefly before Sam Rivera, never one to submit to quiet, added, "I’ve combed through the last transmission logs. If anyone can make sense of the anomalies, it’s going to be the two of you." + +Taylor snorted dismissively. “Focus, people. We have protocols for a reason. Speculation is counter-productive.” The words 'counter-productive' seemed to hang in the air, a tacit reprimand directed at Alex. + +Feeling the weight of his compliance conflicting with his natural inclination to leave no stone unturned, Alex straightened in his seat. "I agree, Agent Cruz. Protocol is paramount," he said, meeting Taylor's steely gaze. It was an affirmation, but beneath it lay layers of unspoken complexities that would undoubtedly unwind with time. + +Alex's submission, though seemingly complete, didn't escape Jordan, who tilted their head ever so slightly, their eyes revealing a spark of understanding. They knew well enough the struggle of aligning personal convictions with overarching missions. As everyone began to collect their binders and prepare for departure, a quiet resolve took form within Alex, galvanized by the groundwork laid by their interactions. He may have spoken in compliance, but his determination had merely taken a subtler form — one that wouldn't surrender so easily to the forthcoming shadows. + +\* + +Dr. Jordan Hayes shuffled a stack of papers, their eyes revealing a tinge of skepticism at Taylor Cruz's authoritarian performance. _Protocols_, Jordan thought, _are just the framework, the true challenges we're about to face lie well beyond the boundaries of any protocol._ They cleared their throat before speaking, tone cautious yet firm, "Let's remember, the unknown variables exceed the known. We should remain adaptive." + +A murmur of agreement echoed from Sam Rivera, who leaned forward, lacing their fingers together as if weaving a digital framework in the air before them, "Exactly, adaptability could be the key to interpreting the signal distortions and system malfunctions. We shouldn't discount the… erratic." + +Their words hung like an electric charge in the room, challenging Taylor's position with an inherent truth. Cruz’s jaw tightened almost imperceptibly, but the agent masked it with a small nod, conceding to the omnipresent threat of the unpredictable. + +Alex glanced at Jordan, who never looked back, their gaze fixed instead on a distant point, as if envisioning the immense dark corridors they were soon to navigate in Dulce. Jordan was not one to embrace fantastical theories, but the air of cautious calculation betrayed a mind bracing for confrontation with the inexplicable, an internal battle between the evidence of their research and the calculating skepticism that kept them alive in their field. + +The meeting adjourned with no further comments, the team members quietly retreading the paths to their personal preparations. Alex, trailing slightly behind, observed the others. _The cautious reserve Jordan wears like armor doesn't fool me_, he thought, _their analytical mind sees the patterns I do. And that's worth more than protocol. That's the connection we need to survive this._ + +As the agents dispersed into the labyrinth of the facility, lost in their thoughts and preparations, the base's halogen lights flickered, a brief and unnoticed harbingers of the darkness to come. + +\* + +A deserted corridor inside the facility stretched before Taylor Cruz, each footstep rhythmic and precise. Cruz, ambitious and meticulous, eyed the troops passing by with a sardonic tilt of the lips. Obedience—it was as much a tool as any weapon in the arsenal, and Cruz wielded it masterfully. To them, it was another step toward unfettered power within the dark bowels of the military complex. + +Inside a secluded equipment bay, Cruz began checking over gear with mechanical efficiency. They traced fingers over the sleek surface of an encrypted radio transmitter. "If protocols are maintained," said Cruz aloud, rehearsing the speech for their subordinates, "not only will we re-establish a line of communication with Dulce, but we shall also illuminate the darkest secrets it conceals." + +Agent Hayes appeared in the doorway, arms crossed and a knowing glint in their eyes. "You do understand," Jordan began, the words measured and probing, "that once we're in the depths, rank gives way to survival instincts. It's not about commands—it's empowerment through trust." + +The sentiment snagged on Cruz's armor of confidence, probing at the insecurities festering beneath. Taylor offered a brief nod, perhaps too curt, but enough to acknowledge Jordan's point without yielding ground. "Trust," Cruz mused, "or the illusion thereof, is just as potent." + +Silence claimed the space between them, steeped in the reality of the unknown dangers lurking in the shadows of the mission. Cruz diligently returned to the equipment, the act a clear dismissal. + +Not much later, Cruz stood alone, the hollow echo of the bay a stark reminder of the isolation that power often wrought. With each checked box, their resolve steeled further, a silent vow to usher their team through the abyss—whatever it might hold—and emerge enshrined in the respect they so deeply craved. + +## Chapter 2 + +Sam Rivera sat alone in a cramped office, the hum of a dozen servers murmuring a digital lullaby in the background. Surrounded by the glow of multiple screens, their eyes danced across lines of code and intercepted comm signals from Dulce — a kaleidoscope of data that their curious and isolated mind hungered to decrypt. + +To an outsider, it might have looked like obsession, this fervent quest for answers. But to Sam, it was a dance — a give and take with the mysteries of the universe. Their fingers paused over the keyboard as they leaned back in the chair, whispering to thin air, "What secrets are you hiding from us?" + +The stillness of the room broke with the unexpected arrival of Alex Mercer, whose encroaching shadow loomed over Sam's workspace. The cybersecurity expert craned their neck upwards, met by the ever-so-slight furrow in Alex's brow. "Got a minute, Rivera?" + +"Always," Sam said, a smile surfacing as they swiveled to face their mentor more directly. _He has that look — like something's not sitting right with him,_ they noted inwardly. + +Alex hesitated, weighing his words carefully. "Our tech is top-tier, but the silence from Dulce... It's not just technology that will see us through, it's intuition and... trust." His gaze pierced through the digital haze, trying to instill something more profound than advice. + +Sam regarded Alex for a moment, the sincerity in his voice resonating with their own unspoken desire to prove their worth. "Intuition," they mirrored thoughtfully. "I guess sometimes the numbers don't have all the answers." + +Their shared silence held a newfound understanding, a recognition that between the ones and zeros, it was their combined human insights that might prevail against the impossible. As Alex turned to leave, Sam's eyes drifted back to the screens, now seeing them not as barriers to isolate behind, but as windows into the vast and enigmatic challenge that awaited their team. + +Outside the office, the persistent buzz of activity in the facility belied the unease that gripped its inhabitants. A restlessness that nibbled on the edges of reality, as though forewarning of the threshold they were soon to cross — from the known into the realm of cosmic secrets and silent threats. + +\* + +Shadows played against the walls of the cramped underground meeting room, where Alex Mercer stood gazing at the concealed elevator that would deliver them into the bowels of Dulce base. The air was thick, every breath laced with the weight of impending confrontation, the kind one feels when stepping into a legend. Though armed with an array of advanced weaponry and gear, there was an unshakeable sense that they were delving into a conflict where the physical might be of little consequence. + +"I know what you're thinking," Jordan Hayes remarked, approaching Mercer. Their voice was low, a blend of confidence and hidden apprehension. "This feels like more than a rescue or reconnaissance mission, doesn't it?" + +Alex turned, his features a mask of uneasy resolve. "It's like we're being pulled into someone else’s game. Not just observers or participants, but... pawns." + +Jordan gave a short nod, their analytical mind colliding with the uncertain dynamics of this operation. "I've felt that way since the briefing. Like there's a layer we’re not seeing. And yet, we have no choice but to play along." Their eyes locked with Alex's, silently exchanging a vow to remain vigilant. + +"You two need to cut the philosophical chatter. We have positions to secure," Taylor Cruz interjected sharply, stepping into their exchange. The authority in Taylor's voice brooked no argument; it was their way of pulling everyone back to the now. + +Alex's response was measured, more assertive than moments ago. "Acknowledged, Agent Cruz," he replied, his voice steadier, mirroring the transformation brewing within. He gripped his rifle with a newfound firmness. "Let's proceed." + +As they congregated at the elevator, a tension palpable, Sam Rivera piped in with a tone of balanced levity, "Hope everyone’s brought their good luck charms. Something tells me we’re going to need all the help we can get." + +Their laughter served as a brief respite from the gravity of their mission, a shared moment that reinforced their common humanity amidst the unknowable. Then, as one, they stepped into the elevator. The doors closed with a silent hiss, and they descended into the darkness together, aware that when they returned, if they returned, none of them would be the same. + +\* + +The sense of foreboding hung heavier than the darkness that the artificial lights of the elevator shaft failed to fully penetrate. The team was descending into the earth, carrying with them not only the weight of their equipment but also the silent pressure of the invisible war they were about to fight—a war that seemed to edge away from physicality and into the unnervingly psychological. + +As they descended, Dr. Jordan Hayes couldn't help but muse over the layers of data that could wait below, now almost longing for the comfort of empirical evidence. _To think that this reluctance to accept other possibilities may have been my biggest blind spot,_ Jordan contemplated, feeling the hard shell of skepticism begin to crack. + +Alex caught Jordan's reflective gaze and leaned in, his voice barely a murmur over the hum of the elevator. "Once we're down there, keep that analytical edge sharp. You see through the mazes of the unexplained better than anyone." + +The compliment was unexpected and weighed differently than praise from others. This was an acknowledgment from someone who stood on the front lines of the unknown with eyes wide open. "Thank you, Alex," Jordan said, the words carrying a trace of newfound assertiveness. "You can count on me." + +The exchange was cut short by a shudder that ran through the elevator, subtle, but enough to make them instinctively hold their breaths. It wasn't the mechanical stutter of old gears but a vibration that seemed to emanate from the very walls of the shaft—a whisper of something that defied natural explanation. + +Cruz was the first to react, all business despite the shadow that crossed their expression. "Systems check. Now," they barked out, masking the moment of disquiet with swift command. + +Every agent checked their gear, sending confirmation signals through their comms, creating a chorus of electronic beeps that promised readiness. But there was an unspoken question among them: was their technology, their weaponry, their protocols sufficient for what awaited them or merely a fragile comfort? + +Against the gravity of the silence that was once again closing in, Sam's voice crackled through, only half-jest. "I'd laugh if we run into Martians playing poker down there—just to lighten the mood, you know?" + +Despite—or perhaps because of—the oddity of the moment, this elicited a round of chuckles, an audible release of tension that ran counterpoint to the undercurrent of anxiety coursing through the team. + +As the elevator came to a halting, eerie calm at the sub-level, the group stepped off, finding themselves at the threshold of Dulce's mysterious halls. They stood in a tight pack, sharing a cautious glance before fanning out into the unknown, each one acutely aware that the truth was inevitably intertwined with danger. + +Into the depths of Dulce, the team advanced, their silence now a shared testament to the camaraderie born of facing the abyss together—and the steel resolve to uncover whatever horrors lay hidden in its shadows. + +\* + +The weight of the thick metal door closing behind them reverberated through the concrete hallway, marking the final threshold between the familiar world above and the strangeness that lay beneath. Dulce base, a name that had been whispered in the wind-blown deserts above and in the shadowed corners of conspiracy forums, now a tangible cold reality that they could touch — and that touched them back with a chill. + +Like lambs led to an altar of alien deities, so did Agents Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera proceed, their movements measured, their senses heightened. The air was still, almost respectful of the gravity of their presence. Their torch beams sliced through the darkness, uncovering steel doors with warnings that spoke of top secrets and mortal dangers. + +Taylor Cruz, stepping firmly into the role of de facto leader, set a brisk pace. "Eyes sharp, people. Comms check, every thirty seconds," Taylor ordered, their voice echoing slightly before being swallowed by the surrounding silence. + +Sam, fiddling with a handheld device aimed at detecting electronic anomalies, offered a murmured "Copy that," their usual buoyancy dimmed by the oppressive atmosphere. + +It was Jordan Hayes who paused at an innocuous looking panel, nondescript amongst the gauntlet of secured doorways. "Mercer, Rivera, come see this," Jordan’s voice was marked with a rare hint of urgency. + +Alex joined Jordan's side, examining the panel which, at a mere glance, seemed just another part of the base's infrastructure. Yet, to the trained eye, it appeared out of place—a facade. + +Jordan explained their reasoning as Sam approached, instinctively understanding the significance of what lay beneath, "This panel is a recent addition — covering something they didn't want found." + +Before Alex could respond, the soft whir of an approaching drone cut through their muffled exchange. Taylor had looped back upon hearing the commotion. "Explanations later. We can't afford to attract..." Cruz’s voice trailed off as the small airborne device came into view, its sensors locked onto the group. + +Sam was the first to react, their tech-savvy mind already steps ahead. "I've got this," they declared, fingers flying over the controls of their own gadgetry to ward off the impending threat. + +The drone lingered, its scan seeming more curious than hostile. But within moments, courtesy of Sam's interference, the little sentinel drifted away, retreating into the shadows as if accepting a silent truce. The crew exhaled, a moment of collective relief palpable in the air. + +Cruz squared their shoulders, clearly ruffled but not conceding any ground. "Move out," they directed, a hint more forceful than before. "And Rivera, keep that trick handy." + +The team pressed onward, the quiet now filled with the soft beeps of regular comms checks, their pace undeterred by the confrontation. Yet, every agent held a renewed sense of wariness, their trust in one another deepening with the knowledge that the base—its technology, its secrets—was alive in a way they hadn't fully anticipated. + +As they converged upon a central hub, the imposing doors to the mainframe room stood ajar — an invitation or a trap, neither option comforting. Without a word, they fortified their resolve and stepped through the threshold, where the dim glow of operational LED lights and the distant hum of machinery hinted at Dulce’s still-beating heart. + +Solemnly, yet unmistakably together, they moved deeper into the heart of the enigma, ready to unmask the lifeforce of Dulce base or confront whatever existential threat lay in wait. It was in that unwavering march towards the unknown that their destinies were forever cemented to the legacy of Operation: Dulce. + +## Chapter 3 + +The thrumming of monitors cast a stark contrast to the rigid silence enveloping the group. Agent Alex Mercer, unfailingly determined on paper, seemed dwarfed by the enormity of the sterile briefing room where Paranormal Military Squad's elite convened. With dulled eyes, he scanned the projectors outlining their impending odyssey into Operation: Dulce. + +\* + +The cooling vents hummed in a monotonous drone, but it was the crackle of the comms system coming to life that cut through the lab’s tension. Dr. Jordan Hayes hovered over a table arrayed with alien technology, their fingers delicately probing the enigmatic circuitry retrieved from the crash site. Agent Alex Mercer watched, admiration blooming in silent solidarity for Jordan's deft touch and unspoken drive. + +Jordan, always composed, only allowed the faintest furrow of concentration to mar their brow. "What we understand about physics..." they muttered, trailing off as they realigned a translucent component. The device emitted a low pulse, causing Jordan to still. "Could be fundamentally changed by this." + +A calculated risk—that's what this was. And for a person of science, a gamble was worth the potential paradigm shift. + +"I’ve been thinking," Alex started, his eyes still fixed on the immediately tangible mystery before them. "About what’s at stake here. Not the mission parameters, but what this means for us—humanity." + +Jordan glanced up, meeting his eyes just long enough to convey the shared enormity of their situation; the career-defining glory and existential dread entwined. "The quest for understanding always comes at a price. We're standing on the precipice of knowledge that could either elevate us or condemn us." + +The charged air between them spiked as Taylor Cruz’s brusque tones sliced through their reverie. "Hayes, Mercer, this isn't philosophy hour. Focus on the task. We need actionable intel, not daydreams." + +With a sound of restrained acknowledgment, Jordan returned their gaze to the device, while Alex clenched his jaw, the buzz of frustration dull against the backdrop of Taylor's authoritarian certainty. It was this competitive undercurrent that kept him alert, the sense that his and Jordan's shared commitment to discovery was an unspoken rebellion against Cruz's narrowing vision of control and order. + +Then Taylor did something unexpected. They paused beside Jordan and, for a moment, observed the device with something akin to reverence. “If this tech can be understood..." Taylor said, their voice quieter, "It could change the game for us. For all of us.” + +The underlying dismissal earlier seemed to falter, replaced by a glimpse of reluctant respect for the gravity of what lay in their hands. Jordan looked up, and for a fleeting heartbeat, their eyes locked with Taylor's, a wordless clash of wills softening into an uneasy truce. + +It was a small transformation, barely perceptible, but one that Alex noted with an inward nod. They had all been brought here by different paths and for different reasons. Yet, beneath the veneer of duty, the enticement of the vast unknown pulled them inexorably together, coalescing their distinct desires into a shared pulse of anticipation. + +Marshaled back to the moment by the blink of lights and whir of machinery, they refocused their efforts, each movement sharpened by the knowledge that beyond understanding the unearthly artifacts, they might be piecing together the future of their species. + +\* + +Amidst the sterility of the briefing room, the liminal space between the facts laid out and the hidden truths, sat Sam Rivera, his demeanor an artful balance of focus and a casual disguise of his razor-sharp talent with technology. Across from him, Alex Mercer lingered in thought, the mental cogs turning as each file on Dulce stirred more than curiosity—it beckoned to a past both honored and burdensome. + +"You've been quiet, Sam," Alex noted, catching the younger man's contemplative gaze. "Your take on these signal inconsistencies?" + +There was a respect in Alex's tone, though a respectful distance remained—a gulf of experience and a hint of protective mentorship that stood between them. Sam nodded, recognizing the space afforded to him, and he couldn't help but feel the weight of expectation pressing upon his shoulders. It wasn't just the mission that was immense, it was the trust being placed in him. + +"The patterns are... off," Sam admitted, hesitant but driven. "If I'm right, what we're looking at isn't random—it's a structured anomaly. We need to be ready for anything." + +Alex's eyes brightened with a subtle approval that crossed the distance like a silent nod. "Good. Keen eyes will keep us ahead—or at least not blindsided," he said, affirming the belief that inscribed Sam's role as more than the tech personnel—he was to be a guiding intellect in the heart of uncertainty. + +Their exchange was cut short by Taylor Cruz's abrupt arrival, his gait brimming with a robust confidence that veiled the sharp undercurrents of his striving nature. "Time to gear up. Dulce waits for no one," Taylor announced, his voice carrying an iron resolve that knew the costs of hesitation—though whether the cost was calculated in human or career terms was an ambiguity he wore like a badge of honor. + +As Sam and Alex nodded in unison, the icy chasm of hierarchy and cryptic protocols seemed momentarily to bridge over with an understanding—this mission was convergence, a nexus point that would challenge each of their motives and strength. + +They filed out of the briefing room, their footsteps synchronized, a rhythm that spoke volumes of the unknown cadence they would soon march to within the base's veins. For Alex Mercer, the link with Sam Rivera, though distant, was now poised with a mutuality ready to be tested; for Taylor Cruz, the initiative pulsed like a heartbeat, anticipation thinly veiled behind a mask of duty. + +In the midst of the descent, they were each alone yet irrevocably joined, stepping closer towards the volatile embrace of Operation: Dulce. + +## Chapter 4 + +The corridors of the Dulce military base were as silent as a tomb and twice as chilling. Alex Mercer walked with a surety that belied his bubbling undercurrents of doubt. The briefing had been definitive, sturdy pillars of facts and protocols, yet as he ventured deeper, the ominous atmosphere gnawed at him—a stark reminder of how much remained unknown. + +Jordan Hayes trailed a few steps behind, their detached exterior breaking for a moment as they caught up to Alex. "What's on your mind?" Jordan asked, their astuteness cutting through the unspoken tension. + +Alex glanced back at them. This place was a puzzle, a treacherous labyrinth where the walls whispered secrets, and among them, he sensed a call to question, to challenge the narrative they'd been sold. "The silence here... It's almost as if the base is waiting for something—or someone." + +"Just stay sharp, Mercer," Jordan cautioned, yet their eyes lingered on the quietude around them, conceiving the same shadow of doubt that unsettled Alex. + +Before they could delve into further discussion, the distinctive click of a safety catch echoed in the hollow space. Both agents turned to find Taylor Cruz standing resolute, primed for combat. Taylor's gaze was scrutinizing and cold, a stark contrast to the growing unease that smoldered silently amongst the rest. + +"Chatter is a liability," Taylor snapped, with a commanding flair that bordered on tyrannical. "We move forward, eyes open, mouths shut." + +Alex felt the tight grip of compliance strangle his gut, a lesson learned under the hard tutelage of rank and order. But here, in the bowels of Dulce, those instincts began to wane, the imperative to adhere now conflicting with the pressing urgency to confront the shadows they were enmeshed in. + +Then, unexpectedly, the lights flickered, a power fluctuation—or a sign? Alex's hand instinctively went to his sidearm, his mindset shifting from soldier to skeptic. The base, with its unyielding coldness, had just given them their first nudge into the realm of the speculative, an invitation to peel back the veneer of reality. + +"We should consider all possibilities," Alex murmured, more to himself than the others, his voice a barely audible breath against the sterile air of the complex. + +Taylor's posture stiffened at the challenge, yet their response was uncharacteristically reserved, notable in its lack of rebuke. "Agreed. For now, keep moving. But stay vigilant." + +A surprise—an echo of agreement from the last person Alex expected it from. And there it was, the glimpse of a wrinkle in the unyielding fabric of command, a hint that perhaps they were all starting to sense the strangeness that permeated this place. + +Progressing with determined steps, the trio moved deeper, silently acknowledging the evolution of their predicament. It was a small yet transformative concession to the unknown forces at play, an acknowledgment from each agent that, despite their disparate goals and ideals, the true nature of the Dulce base was an enigma that would forge new paths through their convictions. + +As they reached the central communications hub, the truth that awaited them lurked in the shadows, its eyes unseen but felt by all. The walls didn't just whisper now; they spoke in tones only the brave—or the foolish—would dare to listen to. + +\* + +The subterranean silence of Dulce was an oppressive entity of its own, wrapping the team in a cloak of uneasiness as they pressed on through the dimly lit corridor. Jordan Hayes found themselves contemplating the ramifications of each step taken into this suspended world, where the sterile air seemed to mock the gravity of their predicament. The closer they got to the communication hub, the more Jordan's mind wandered toward the realm of the inexplicable. + +Beside Jordan, Alex Mercer moved forward with deliberation, his gaze scanning the heavy utility doors they passed—one of which was partially ajar, beckoning them with its darkness. "After you, Dr. Hayes," Alex said, gesturing toward the mysterious opening. A hint of shared understanding passed between them; knowledge was the guiding star of this mission as much as confrontation or recovery. + +Jordan peered inside, the beam from their flashlight slicing through the obscurity. The room beyond was a chaotic cascade of papers, overturned furniture, and the particular kind of disorder born from hasty evacuation—or something far more sinister. + +"It's like they vanished in the middle of something urgent," Alex murmured, his voice tight with a mix of concern and anticipation. He began to sift through the scattered reports, each page a potential clue to the enigmatic silence that shrouded Dulce. + +Behind them, Taylor watched with a disciplined patience, their authority the foundation upon which the operation was built. Their voice cut into the stillness, a reminder of their presence, "Time is not our ally here." + +Drawing back from momentary distraction, Jordan acknowledged the wisdom in Taylor's words, yet could feel the shift in their stance—from skeptical, reserved analyst, to a proactive agent within the narrative. "You're right; these documents may hold critical insights. Let's collect what we can and analyze them properly." + +From the darkened hollows of the room, shadows seemed to cast subtle judgment as Alex and Jordan worked together with heightened urgency. Taylor, for once, didn't intervene but instead surveyed the entrance, their mind anticipating the unknown variables that lay ahead. + +Unexpectedly, a soft hiss emanated from a neglected terminal on the desk. Jordan's head snapped up, their heart rate accelerating at the potential ramifications. Without a word, they moved to the machine, hands driven by the newfound conviction that knowledge was more than power—it was survival. + +As Jordan began to extract what data they could from the terminal, the first comprehensible communication from the depths of Dulce in far too long crackled through: an automated distress marker, looping endlessly without further context. It was a revelation, one that reverberated through the group, confirming their fears and igniting an even greater need to press on. + +Watching Jordan's dogged determination, Alex witnessed the minor transformation in his colleague unfold—a shift from doubt to action, a sliver of belief in the possibilities beyond their rational understanding. This forge of resolve amidst the alien echoes of Dulce not only bonded them closer as a team but compelled them forward with a sharpened edge of responsibility to the truth, wherever it would lead. + +As they collected their findings and regrouped, the base around them imperceptibly changed, the air charged with the vibration of secrets poised on the brink of revelation. And in that charged silence, the group moved on, each now carrying pieces of a puzzle that would soon converge into a picture of galactic significance. + +\* + +In the chill of the cramped server room, the hum of machinery was the backbone to a symphony of data streams coursing through the air. Dr. Jordan Hayes, nerves alight with the mission's mounting unknowns, patched into the last known coordinates of the unsent distress broadcast they had uncovered. They were so close to the core now – to the truth behind the blackout – it was almost tangible. + +Beside them stood Agent Alex Mercer, ever the soldier, yet with eyes that betrayed an intellect craving to understand the murk beneath the surface. "Any progress, Dr. Hayes?" Alex queried, his voice betraying a subtle urgency. + +"Getting there," Jordan replied, fingers dancing across the keyboard. "Whoever sent this was cut off mid-transmission. It's as if Dulce itself swallowed the message whole." + +Taylor Cruz closed in, their frame casting a long shadow over the duo, evoking an almost palpable wall between them and the forward momentum of their mission. "Time is against us," Taylor intoned, more statement than threat. "What we uncover here determines our next course of action." + +Alex acknowledged Taylor with a brisk nod, his stance firm. Yet inwardly, the tightening grip he felt from Taylor's words couldn't throttle the swell of his own investigative instinct. His soldier's obedience had begun to war with the advocate's zeal for unveiling the dark heart of Dulce's secrets. + +And then, the unexpected occurred. The screens flashed in unison, spilling a discordant stream of symbols and images that defied immediate analysis. Jordan's breath caught – this was the response they had been fishing for, an alien communication protocol resonating just at the edge of human comprehension. + +Each member of the team felt it: a shift in the room’s very atmosphere, like a veil being drawn from their perception. Alex and Jordan stood still, absorbed in the bewilderment of contact, while Taylor, despite their authority, hesitated – a minor betrayal that unease was creeping into even their disciplined heart. + +"Thoughts, Rivera?" Taylor rallied, seeking the counsel of Sam Rivera, whose eyes were wide with exhilaration. + +Sam stepped forward, breaking the spell of stillness. "It's like nothing I've ever seen before, but I think I can bridge our systems to communicate," they declared, a wisp of optimism braiding their voice. They set about adapting their gear to transmute the foreign signals into something the team could dissect, their actions a testament to the mentorship and belief instilled in them by Mercer and the team. + +Taylor observed them, a cold calculation behind their facade, as they weighed the worth of this anomaly. It was a crossroad that potentially led to either monumental breakthrough or unprecedented catastrophe. "Once you've established a line, document everything. We can't afford to miss any detail," Taylor ordered, the words sharper than intended. + +The connection was made, and with trembling anticipation, the team listened as the first garbled outputs began to emerge, their very essence promising insights that could alter the course of history. It was an enigmatic dance with the unknown, the pulse of Dulce no longer just a place, but a herald to an alien register the team had yet to decipher. + +Together, they stood at the precipice of understanding, where the faint glow of their monitors cast more than just light – it cast the shadow of burgeoning transformation. It was in this moment, in the grasp of an extraterrestrial tongue, that the team, bound by a hunger for knowledge and the raw edge of survival, found their mission reframed from a search for answers to the articulation of a question humankind had yet to fully ask. + +Silent in their commune with the inexplicable frequency, they realized they were not merely investigators; they had become liaisons on behalf of Earth, interpreters of a cosmic message that could redefine their very existence. The implications loomed large, but now, they would not face them alone – they would face them as a united front, wrought together by the very mysteries that once drove them apart. + +## Chapter 5 + +Dr. Jordan Hayes clutched the edge of the briefing room table, their fingers white-knuckled against the laminate surface, as an array of constellations rotated on the projector—charts and graphs bleeding across the stars. In the dim room, nebulas and dark matter seemed within arm's reach, tangible yet unfathomable. + +Sam Rivera leaned back against the wall, arms crossed, gaze darting between the swirling cosmos and the faces of their companions. A taut line of concentration etched their young features, a mingling of fervent curiosity with the nascent understanding of the high stakes for which they played. + +Jordan's voice broke the profound silence. "The patterns in the signal disruptions sync with none other than zenithal star alignments. It's as if... as if these 'meet and greets' were scheduled, predestined by celestial mechanics." + +The statement hung heavy, daring the occupants of the room to unravel its implications. Alex Mercer, his prior military resolve momentarily suspended, absorbed the hypothesis with a visible hunger. "It's like we're adhering to an appointment we never knew we had," he murmured, his heart a drumbeat in his chest. + +Taylor Cruz snorted—a sound that clattered against the high concepts like a tumbledown shack in a futurist cityscape. Folding their arms, they glanced between the agents, their apprehension clad in the contempt of practicality. "What we need are facts, not mystic conjecture." + +Alex pivoted on his heel, facing Taylor squarely, and his voice found its edge of steel. "This isn't mysticism, Cruz. It's a hypothesis based on observed phenomena as unpredictable as the place we're standing in." + +Taylor's gaze never wavered, yet the slight twitch at the corner of their mouth belied their taut composure. "If there's a semblance of truth to it, then it's critical intel. But remember, we're not astrologers—we're soldiers and scientists." + +Jordan met Taylor’s gaze with a curt nod, accepting the caution even as the crucible of their intellect smoldered with the fervor of cosmic discovery. Their eyes flicked to Sam, whose steady presence and ready tech affirmed a burgeoning dynamic—the makings of a sentinel, standing guard over the threshold of human understanding and cosmic reality. + +With the projector casting pallid light over their features, each agent became a silhouette of purpose, shadows pillared against the backdrop of an endless universe. The story they were embroiled in would soon demand they plunge into darkness to retrieve the light of knowledge—a light that could very well redraw the shape of their world. + +They left the briefing room with a shared silence, each pondering the vast weave of celestial intent and terrestrial response, sensing that the galactic appointment to which they'd unwittingly RSVP’d was more insistent—and more threatening—than any operation they’d faced before. + +\* + +As the Paranormal Military Squad team convened in the heart of the Dulce military complex, an air of bristling expectation clung to the walls of the underground sanctum. Alex Mercer’s brow furrowed while watching his companions—Jordan Hayes, diligently setting up their makeshift lab station, and Sam Rivera meticulously checking the communication relays they had restored. Taylor Cruz observed with hawk-like focus, yet to betray the strain that their command posed on them. + +The gravity of the mission had shifted, deepened; each member of the team felt its pull, tethered to the understanding that they were now part of a larger narrative—a cosmic play with Earth as a stage and the human race unwitting actors. + +Jordan paused, a tension creeping across their shoulders as they aligned the satellite data with the alien message that had been decoded. "The instructions in this message," Jordan started, the timbre of their voice betraying their usual composure. "They're coordinates and... a warning." + +Sam leaned in, their eyes widening behind the glow of their laptop screen. "A warning? Like, ‘stay away from’, or ‘beware of’...?" Their words trailed off, uncertainty a new companion in their lexicon. + +Alex exhaled slowly, his mind racing to connect the dots. "It doesn't matter which," he said, decisive yet contemplative. "What matters is we understand intent. Are we being warned out of concern, or are we stumbling upon a threat?" + +Cruz’s iron-clad facade momentarily cracked, a fleeting glimpse of vulnerability flashing through their eyes. "We need to know if this entails additional risk to the operation," they said, directing their gaze specifically at Alex. "Mercer, I rely on you to keep the team grounded. No one goes off-course." + +Their reminder seemed both a command and a plea—rooted in an understanding that each member of the team now faced the duality of their roles, protectors of earthly secrets and heralds of potentially devastating revelations. + +Sam's fingers stilled mid-type, their task forgotten as they absorbed the weight of the unfolding reality. "We're the first line of defense... or detection," they mused half to themselves, a growing sense of agency within the larger play they were cast into. + +Jordan returned to the data, more resolute in their actions. The warning, whether cautionary or dire, was a beacon they no longer could ignore; its light casting aside shadows of doubt and igniting a collective purpose within the team. + +Alex watched Jordan and Sam, feeling a brotherhood in their shared quest. As Cruz paced, poised on the cusp of decisions that would mark their career and perhaps the fate of many, Alex knew the narrative had changed. They were no longer mere operatives; they had become guardians of a threshold, keepers of a message from a realm beyond stars and stripes. This elevation in their mission could not be shackled by regulations and established protocols—it demanded a new perspective, a new resolve. + +Tension threaded through the dialogue of beeps and static as communications with Washington buzzed in the background. The team stood, a portentous air enveloping them. It was clear that the decisions they made in the ensuing hours could redefine humanity's place in the cosmos or condemn them to ignorance and potential peril. + +Their connection to the stars solidified, the group moved to address the crystallizing warning, shifting from passive recipients to active participants. Mercer’s latter instincts gained precedence— the team’s mandate had evolved, no longer solely to observe and report but to interact and prepare. A metamorphosis had begun, and Operation: Dulce hummed with the newfound frequency of their daring, a tone set not by the earthly hierarchies but by the pulsing symphony of the universe itself. + +\* + +The desert night loomed eerily still as echoes of hidden activity reverberated deep beneath the bleak sands of New Mexico. Diverting his gaze from the array of sensors before him, Jordan Hayes allowed a rare breath, deep and anxious. Turning to Alex Mercer's focused silhouette, the nocturnal landscape illuminated softly by makeshift floodlights, Jordan felt the syncopated tempo of apprehension and exhilaration jockey for primacy within. + +"The closer we get to unlocking these messages, the more I feel like we're peeling back layers of reality itself," Jordan confided, eyes not leaving the monitors that presented a constellation of data points. + +"Yes," Alex replied, his voice steady as he considered the implications of their discovery. "And we have to be ready for whatever we find beneath those layers. Whether it's a breakthrough or a Pandora's Box." + +Silence settled between them, broken only by the occasional buzz of communications equipment attempting to bridge terrestrial and extraterrestrial intelligences. Tense moments drifted by, laden with the expectant weight of near breakthrough, when a soft chime signaled an incoming transmission -- a rare sound that set every agent on high alert. + +Absent was the voice of Washington or Paranormal Military Squad command. Instead, a rhythmic series of pulses and tones filled the air, deliberately patterned, unmistakably non-human. + +Sam Rivera adjusted the sensitivity of the decoding equipment, their hands shaking with anticipation as much as focus. "I have it!" they announced, the signal transforming under their expertise into a sequence of visual symbols on the screen before them. + +Their shared excitement was palpable, a kinetic force resonating between the team members as they crowded around the display. + +"What does it say?" Taylor Cruz demanded, the urgency in his tone scraping against the newfound wonderment. + +Interpreting the alien syntax required not only decoding but intuition and empathy. The words that emerged upon the screen were at once coherent and enigmatic: "*Voyage. Convergence. Peril.*" + +The stark simplicity of the message struck them collectively, a chill breeze wafting through their resolve. + +Alex stepped forward, piecing together the cryptic communication with a growing sense of obligation. "It’s a call to action," he deduced, "or possibly a summons." + +Jordan's gaze met Alex’s, both understanding that this was no longer an investigation or mere extraction of hidden truths. This was humanity's unwitting enlistment into a galactic dialogue that defied boundaries of nation, creed, or protocol. + +Sam's eyes were aglow, not with fear, but with the profound acceptance of inevitability that comes with groundbreaking revelation. Moreover, within Taylor's stern exterior churned the seed of reluctant admiration for the unclassified, the uncharted realms they were approaching. + +Together, they accepted the pivot in their mission, readjusting their objectives from exploration to engagement, and from isolation to a communal outreach beyond the stars. As dawn's first light threatened the horizon, it became clear that they were no longer merely operatives of a clandestine governmental faction—they were delegates on behalf of Earth, embarking on a voyage orchestrated by destinies unrelated to the mere geopolitics of their world. + +Turning to each other, their silhouettes sketched against the coming dawn, the agents recognized the transformation within and amongst them. They were bound by more than duty—they were intricately woven into the fabric of an unfolding cosmic opera, one in which they had been granted an undeniable role. And as they set course for the coordinates that beckoned them like a distant siren's call, it was with a solemn dedication to not only uncover the mysteries ahead but to navigate the convergence, and the peril, as unified emissaries of a world on the cusp of a broader understanding. + +\* + +Beneath the hum of the fluorescent lights and the vigilance of silent monitors, Alex Mercer stood with his team in the threshold of the base's command center, their faces etched with the fatigue of hours spent unraveling galactic mysteries. Jordan Hayes broke the stillness with a delicate fusion of disbelief and resolve. "The signal..." they began, their tone deliberate, "it’s evolving. It’s not just sending a message—it’s responding to us." + +Taylor Cruz leaned over the console, their eyes narrowing with intrigue and a flicker of unease, studying the alternating patterns on the screen. "Responding? Like it’s alive?" Taylor asked, a question that bordered on the edge of wonder and alarm. + +Sam Rivera’s gaze was locked onto their interface, a digital orchestra at their fingertips. "It could be some form of advanced AI. Or something else entirely," they contributed, a note of exhilaration betraying the gravity of the situation. + +Alex paced before the terminal, absorbing the enormity of their predicament. Their mission—once rooted in the solid ground of military discipline and covert operations—had transcended into an encounter of unprecedented import. "We need to be cautious," he advised, his voice a low rumble of cautious strategy. "If this signal is intelligent, how we interact with it could dictate the outcome of this entire operation." + +Jordan met Alex's gaze with a nod, the weight of the responsibility shared and accepted. "We have protocols for first contact, but nothing for... this," Jordan admitted. The room was gripped with tension, each breath seemingly louder than the last. + +Then, with a sudden burst that filled the command center, the signal coalesced into a clear and distinct pattern which replicated and expanded, its complexity revealing the hand—or mind—of an intelligent architect. + +Taylor's instinct for command surged forth. "Prepare to record and analyze. Whatever it is, we need to understand it—" But their words were cut short as the signal surged, enveloping the room in a brief, blinding cascade of light. + +In that pulse of brilliance, a shared revelation coursed through the team. The signal had become a bridge, an extension of unknown consciousness reaching towards them, testing, communicating, searching. + +Alex stepped back from the light, feeling a profound change unravelling within him. The path forward would not be one of confrontation or conquest, but of connection and comprehension. + +Jordan turned to Alex and Taylor, seeing in their faces a reflection of the same metamorphosis taking place within themselves—a movement from observers to participants, from agents to ambassadors. + +With a collective breath, the team faced the kaleidoscope of lights. The alien signal, once a harbinger of enigma, was now a catalyst for transformation—a symphony of light and sound that echoed the beginnings of a new relationship between humanity and the alien unknown. + +And so, with deliberate steps, Alex Mercer led his team into the luminous fray. Science, protocol, and survival instinct harmonized within them, each member poised on the cusp of a new chapter in human history. + +They were no longer merely the instruments of Paranormal Military Squad's will—they were the vanguard of humankind’s first definitive leap into the cosmic community. + +With the last echoes of the signal resonating in the control room, they each embraced the sequencing of the transmission, the dance of extraterrestrial light that now wrote itself into their story. The chapter of Operation: Dulce drew to a close, but the narrative of their destiny had only just begun. + +## Chapter 6 + +\* + +The cool darkness of the command center at Dulce base was a stark contrast to the brewing storm outside, where the unforgiving New Mexico desert winds whispered of the hidden truths that lay buried deep beneath its surface. Dr. Jordan Hayes sat, their eyes fixed on the readout, the frenetic dance of symbols and numbers reflecting off their determined face. They were on the cusp of an epiphany, teetering between the widely accepted laws of physics and the promise of a new cosmic paradigm. + +Alex Mercer watched from across the room, noting the subtle shifts in Jordan’s posture that belied a developing readiness to embrace the unbelievable. “Find something?” Alex’s question, asked with a blend of curiosity and solidarity, bridged the gap between a command and a genuine query among equals. + +Jordan's response was slow, measured against the magnitude of their analysis. “This isn’t random static. It’s a pattern - a repeated sequence phasing in and out but distinctly artificial.” Jordan turned away from the screen, locking eyes with Alex. “This could change everything.” + +Sam Rivera leaned in, their eyes alight with the fires of revelation and a quenchless thirst for understanding. “A pattern means intention. Could it be a message?” + +A figure emerged from the doorway, casting a long shadow into the room - Taylor Cruz. “Intentions can be friendly, or hostile. We shouldn’t forget that,” said Taylor, bringing a dose of their usual pragmatism into the heart of discovery. + +Alex acknowledged Taylor’s caution with a nod, understanding the need to keep their feet grounded even as their spirits soared toward the unknown. “Then let’s be the first to find out which it is." + +The team gathered around the monitors, the soft tapping of Jordan's keystrokes now punctuated by the occasional crackle of Sam's radio equipment. The sound was almost ritualistic, a prelude to humanity’s potential first, knowing foray into a larger universe. + +Jordan’s fingers paused, suspended in mid-air. The signal had evolved, becoming a beacon that somehow felt less alien and more familiar. It was as if the complexities of their message were unfolding into something more accessible, more terrestrial. + +A hushed excitement swept through the room. The transformation suggested an awareness on the part of the unknown senders; a finesse that spoke volumes about their capabilities and perhaps their intentions. + +With the growing realization that they were engaging with an intelligence far exceeding their previous understanding, the team prepared to reach back across the cosmic divide. Prepared or not, they were no longer bystanders in this galactic narrative. They were active correspondents in an exchange that transcended galaxies and welcomed them into an expansive, possibly fraught, interstellar conversation. + +\* + +Inside the cavernous central hub of Dulce military base, Dr. Jordan Hayes stood in near-darkness, surrounded by a nest of cables and monitors that buzzed with silent, cryptic life. Jordan's eyes narrowed to focus on the sequences that danced across the screen—patterns that could unravel the cosmic enigma surrounding them. + +Alex Mercer approached with his characteristic stride, a signal of reliability in the chaos. "Status report, Dr. Hayes?" he inquired, his voice low, almost blending into the soundscape of beeping consoles and swirling fans. + +"We're on the brink of unravelling the signal's origin," Jordan replied, the weight of implications heavy in their tone. "There's intelligence behind it, a thought process alien to our own." + +As if summoned by their analysis, Taylor Cruz approached with authority radiating from every pore. "Understand this, we need to know if it's friend or foe. Don't get wrapped up in the existential—our lives may depend on the answers you provide." + +Sam Rivera, their hands adroitly adjusting a device to fine-tune the signal, chimed in with optimism undercut by anxious anticipation. "We're deciphering the comm encryption. Soon, we'll have a channel open—not just listening in, but speaking back." + +Alex nodded his understanding, his strategic mind processing the tactical implications while grappling with the more profound humanistic impact. "When we do, we'll tread carefully, communicate with purpose," he reassured the team. + +The operation had evolved rapidly, from a stealthy incursion into a clandestine labyrinth to an exchange with an extraterrestrial intellect. Their earlier trepidation transformed into determined focus, as they prepared to extend humanity’s hand into the vast unknown. + +An alert on one of the monitor stations snapped the team into alarm. The signal had not simply been waiting—it had been calculating. Now, it reached its crescendo, demanding their attention with a provocative urgency. + +Jordan's fingers raced over the keyboard, their eyes simultaneously interpreting data and sharing directives. "It’s a linguistic lock, a test of comprehension. We crack this, we establish dialogue." + +Taylor's presence was a beacon of steely resolve. "Then let’s solve it. This is what we trained for—the unknown." + +Alex and Sam exchanged a look that telegraphed their shared determination—this was not only the mission they had trained for; it was the mission they had been destined for. + +Together, the Paranormal Military Squad team leaned into the challenge, their minds honing in on the complex patterns with a singular goal: to unlock the conversation with an intelligence that had already begun to shift the foundations of what they knew, or thought they knew, about the universe. + +In a symphony of clicks and murmurs, they worked, knowing they were about to make a giant leap not just for themselves or Paranormal Military Squad, but for all of humanity. As the final pieces fell into place, Dulce's militaristic silence was shattered by the sound of intergalactic contact—by the sound of history being made. + +## Chapter 7 + +In the enclosed space of Dulce’s command center, the air was thick with anticipation, each team member poised to tread the razor's edge between scientific breakthrough and galactic peril. Dr. Jordan Hayes focused intently on the screen, their fingers tapping a staccato rhythm against the keyboard as lines of alien code cascaded down the monitor. + +Alex Mercer's steely gaze surveyed the room, stopping on each member of his team. "Thoughts?" he asked, echoing the unspoken tension. His question, while directed at the group, lingered on Jordan—acknowledging their expertise and inviting collaboration rather than dictating orders. + +Jordan’s brow furrowed, an indicator of the mental gymnastics being performed. "It's unprecedented," they finally said, their voice a testament to the gravity of the moment. "Behavioral algorithms... if we're right, this code could reveal extraterrestrial thought patterns." + +Before anyone could react, Taylor Cruz interjected with the assertiveness of someone accustomed to commandeering the discourse. "Then let’s ensure we’re deciphering it correctly," Taylor stated, their tone suggesting they were still battling to maintain control over an increasingly alien situation. + +Sam Rivera hovered near the mainframe, youthful energy barely contained under the surface. "What if it’s more than just a message? What if they’re trying to extend consciousness across the stars?" + +The room fell into a contemplative silence, broken only by the hum of electronic equipment and the distant thud of secured doors locking in rhythm. The weight of responsibility rested on each agent's shoulders—a heaviness palpable in the air they shared. + +Alex stepped forward, reaching a subtle decision, one dictated by foresight and the humanity nestled at the core of their mission. "We approach with the aim to understand, not to confront," he said, softening his military bearing into a more diplomatic stance. + +Jordan nodded, appreciating the leadership that Alex displayed in the face of the unknown, and turned back to the cryptic data. Here, before them all, was a tangible piece of evidence—proof of an extraterrestrial sentience that had outreached the bounds of their expectations. + +Taylor took a breath, simultaneously exuding a sense of preparedness and venturing into the unknown alongside their peers. "Then let’s do what Paranormal Military Squad does best—investigate and adapt," Taylor added, finding comfort in the familiar even as they stood on the cusp of an unprecedented alchemy of science and mystery. + +The team leaned into their respective roles, driven by the urgency of the assignment and the pull of an insatiable curiosity. Sam offered a grin that belied the tension, a youthfulness that reminded them all of the profound excitement nested within the terror of the unknown. + +Quietly but resolutely, they turned back to their instruments, each of them a sentinel on the threshold of a new reality. The once implicit lines of command were now woven into a shared tapestry of hierarchy and camaraderie. As they danced with the unknown, they were beacons of sentient endeavor, casting the light of human consciousness into the vast darkness that called to them. + +\* + +\* + +Dulce Base's cavernous darkness was pierced by the sharp luminescence of monitors, casting an electric glow onto the faces of those who dared to unearth its secrets. Dr. Jordan Hayes stood motionless, eyes glazed in concentration, their mind a nexus where terrestrial science battled with celestial unknowns. + +Alex Mercer watched from a slight distance, the weight of command tangible upon his shoulders, though lightened by the shared burden now held amongst them. "We could be on the frontier of a new kind of diplomacy," he mused aloud, giving voice to the moment's gravity. + +At those words, Jordan's trance broke. "If that's the case, then these communications," Jordan motioned to the stream of data, "are our olive branch across the cosmos." + +Taylor Cruz, who paced with restless energy, halted and faced the team—his stoicism marred by the erratic dance of lights reflected in his eyes. "An olive branch, or an invitation to a battlefield?" he posed, ever the strategist, his words laced with a hint of cynicism. + +Sam Rivera, nestled amongst an array of equipment, licked their lips—a mixture of nerves and anticipation palpable. "We're mapping out something incredible here. Whether it's peace or war, we're the cartographers." + +Silence enveloped them like the expanse of space itself, each member contemplating the chasms they might bridge—or the abysses into which they might unwittingly descend. + +Alex's demeanor assumed a quiet resolve—the profound knowledge that this mission was as much about navigating uncharted philosophical territories as it was about ensuring survival. "Whichever it proves to be, we'll face it. Prepared, unified." + +A nod passed between Jordan and Alex, a silent exchange of mutual respect and shared mission. Sam, buoyed by the weighty encounters of the mind and machinery, entered keystrokes with a fervor that seemed to bring them ever closer to the alien mind. + +They stood there, the Paranormal Military Squad team, not just as guardians of homeworld secrets or as soldiers of clandestine wars, but as humankind's chosen few at the fulcrum of history—a history that was now unfolding to the rhythm of otherworldly codes. + +Each revelation, each parsed symbol, inched them toward the line between the earthly and otherworldly. And as they stood on this precipice of cosmic negotiations, it was clear the ensuing dialogue would not just shape the future of Paranormal Military Squad—it could very well redefine the parameters of human existence. + +\* + +The hum of advanced computational systems tingling with cryptic transmissions framed the ambiance of Dulce's mainframe chamber. Jordan Hayes, fingers hovering over a console dense with blinking lights, furrowed their brow as sequences of alien data streamed across the screen. + +Alex materialized behind them, his presence a stable beacon amidst the technological whirlwind. "Look for patterns, anomalies. Anything that might resemble a handshake protocol in their communications," he directed, his voice a low thrum, reverberating with cautious optimism. + +Jordan cast a glance over their shoulder, acknowledging Alex's contribution with the shared understanding of colleagues who had transcended mere professional acquaintance. "I’m isolating sequences that seem to recur with more intention than static. If these are their ‘handshakes,’ then we might just be making first contact," they remarked, their focus returning to the screen with renewed vigor. + +From the other end of the room, where shadows married the artificial light, Sam's voice crackled through the static of nearby speakers, "Don't forget the anomalies we detected earlier. Each one could be a word, a sentence, or even a concept untranslatable to our current understandings." + +Resolute, Taylor Cruz stood at Jordan's other side, a stoic figure wrestling with the implications of their mission. "Keep pursuing this line," Taylor instructed, an undercurrent of intensity carried forth in their otherwise composed demeanor. "And remember, this isn't just about making contact; it's about securing knowledge for humanity." + +Alex offered a nod that spoke volumes, conveying his understanding of the stakes at play. Here, in this chamber of possibility, the team's actions would determine if humanity stood at the brink of a new age of understanding or the onset of an unprecedented threat. + +Every second thrummed with significance as Jordan and Sam worked in tandem, each keystroke a foray into the unknown. Taylor observed with a commander's scrutiny, the gravity of their role sustaining them against the waves of ambiguity breaking against their resolve. + +Pivotal moments come rarely in the course of human events but here, amidst the electronic symphony of a stalwart command center, lay the incepting notes of a cosmic overture. The harmony between human and alien, between Paranormal Military Squad and the vast reaches of space, began its first tentative measures, with each member of the team a vital instrument in a celestial ensemble yet to be fully heard. + +\* + +The crisp air within the mainframe room of Dulce base seemed to hum with unspoken possibilities. Jordan Hayes was the centerpiece of focus, their hands dancing methodically over the console as streams of otherworldly code cascaded down monitors, each flicker a potential key to the cosmic doors they were inching open. + +Alex Mercer watched, posture relaxed but eyes sharp. "Remember, this could be our first introduction, maybe even our first impression," he said, mindful of the gravity carried by each action they made henceforth. + +A hint of a smile touched Jordan's face, a small acknowledgment of the monumental task at hand. "Understood. I'm balancing the signal's syntax with our algorithms. If we're interpreting this correctly, it could be... well, an invitation." + +Into the electric tension of the chamber walked Taylor Cruz, their silhouette a sharp contrast against the cool lighting, radiating a presence that spoke of command and chilly tenacity. "An invitation, or a challenge?” Taylor questioned, the weight of their suspicion casting a different tint on the cascading data. + +Sam Rivera, in a corner arrayed with sophisticated equipment, piped up, their voice a buoyant note amidst the tentative atmosphere. "Either way, it's a connection. One that we're uniquely positioned to navigate," they remarked with an air of optimism threading through the uncertainty. + +Alex channeled the strengths of his team into the core of their approach, his leadership adapting to the contours of an unprecedented scenario. "Cautious and curious," he reflected aloud, shaping a strategy that balanced their thirst for comprehension with the prudence required in addressing the unknown. + +Jordan, hands momentarily at rest, looked up. The signal was more than a sequence of bits and commands—it was a riddle wrapped in the depths of space-time, and they were on the cusp of parsing its meaning. + +Taylor, hardly a step away, nodded in silent agreement. The implications of their findings might very well direct the course of human destiny from this point onward. + +Finding a tempo among themselves, the Dulce team was a confluence of ambition and acumen, each member intuitive to the beats of discovery. The chamber around them held untold stories, secrets coaxed from the stars, that now, led by Paranormal Military Squad's finest, began to unravel. + +The future in those moments was unwritten, a narrative scribed not in the dust of desert confines, but in the potential for interstellar diplomacy and understanding. As they prepared to script humanity's next chapter, the room seemed to pulse with the heartbeat of a story far greater than the sum of its parts. + +## Chapter 8 + +The grit of an earthbound dust storm contrasted sharply with the pristine sterility of the underground command center. Alex Mercer, eyes set with fervent determination, stood over Jordan Hayes, whose fingers danced across the keyboard with rapid purpose. Monitoring the progression of alien code unraveling before them, Mercer spoke with a tempered urgency, "Keep it steady, Jordan. We might be initiating the first true interspecies communication bridge here. It's all about finesse now." + +Taylor Cruz, the embodiment of military precision, surveyed the room with a calculated gaze from their vigil beside an array of glimmering screens. "Remember, these could be delicate negotiations -- or coded threats. Stay sharp," Cruz added, their voice cool as polished steel. + +Jordan, with a silent nod, recognized the gravity of both stances. Gravitating between scientific acuity and diplomatic caution, they replied, "The sequence is aligning—syncing with our comms. It's looking more and more like direct engagement." + +Amid the banks of electronic machinery, the thrumming pulse of an impending interspecies signal exchange, Sam Rivera interjected with a youthful zeal that cut through the weighty atmosphere, "It's not just an exchange. It's a... symphony. It's as if they're teaching us their language through modulation." + +A moment of profound silence swept over the team. The isolation of their location, deep within the top-secret labyrinth of Dulce, became suffused with an almost palpable sense of historical significance. + +"Then our response needs to be equally symphonic," Alex uttered, contemplating the awe-inspiring transmutation of their task from a simple recovery mission to a full-blown cosmic concerto. + +With a renewed sense of wonder tempered by caution, the Paranormal Military Squad team found themselves harmonizing a delicate balance between envoys and interpreters. The long shadow cast by their duty was now illuminated by the brilliant glow of otherworldly dialogue. + +In this carefully orchestrated march towards the unknown, each individual's expertise became critical notes in a larger melody. The narrative of human achievement, so often defined by solitary pursuits, now emerged as a collaborative opus, each member of the team a maestro in their right. + +The protocols of encounters, the mathematics of languages, and the poetics of connection all fused into a singular moment of convergence. The echo of their efforts reverberated back to them, not through the cavernous base's concrete walls, but from light-years away, in the form of a reply, intangible yet infinitely profound. + +\* + +Amidst the hum of the supercomputers and the faint static from the scrambled transmissions, Alex Mercer cast a thoughtful glance across the dimly lit room toward where Dr. Jordan Hayes was methodically adjusting the archaic dials of the decryption machine. "Any progress?" he asked, his tone conveying both impatience and the deep-seated respect born from countless shared challenges. + +Jordan did not look up, their gaze remained locked on the flickering lights that represented a dialogue suspended between worlds. Their fingers ceased their dance, hovering meditatively over the controls. "We might be on the cusp of a breakthrough," Jordan suggested. "The signal... it's evolved. It's reflexive now, responsive in a way that suggests sentience." + +Taylor Cruz's familiar sharp strides approached the two, breaking the rhythm of soft beeps. "Responsive is good, if it means understanding," Taylor said, head tilted as they peered at the encryption data scrolling by. "But remember, comprehension can bring revelation or conflict." + +Sam Rivera’s youthful voice permeated the tension, brimming with an excitement edged by the enormity of what they faced. "If it's truly sentient, we're not just cracking a code; we're learning how to converse with an entirely new form of consciousness," they chimed in, the weight of history not lost on the zealous astrotechnician. + +Alex nodded, his thoughts alighting on potential strategies for navigating the conversation they were cultivating with the unfathomable. "We need to keep that conversation going, echo its patterns, and speak its language," he resolved, knowing the delicate nature of their work merited every ounce of their collective acumen. + +The chamber now was a crucible, forging within it the future narrative of human contact with the unknown. Every signal pulse they sent out was an invitation for understanding, and every echo back a step closer to bridging the cosmic divide. And so, together, they stood - agents in Paranormal Military Squad's clandestine ranks, united by purpose, sculpting humanity’s first sonnets into the void. + +\* + +#### Knowledge graph updates + +- (Jordan Hayes, Interprets, Communications as cosmic diplomacy, Moderate) + +- (Taylor Cruz, Questions, Potential aggressiveness of alien intent, Minor) + +- (Sam Rivera, Expresses, Optimism about forming a connection, Minor) + +- (Alex Mercer, Adopts, Balanced strategy for contact, Moderate) + +- (Paranormal Military Squad team, Navigates, Beats of cosmic discovery, Moderate) + +- (Paranormal Military Squad team, Prepares, To script humanity's interstellar narrative, Major) + +## Chapter 9 + +The sterile silence of Dulce Base's command center was thick with concentration as Alex Mercer surveyed his team, hunched over their respective technological battle stations. Each agent was a weapon against ignorance, their adversary a code from beyond the stars that held secrets to alien thought. + +Dr. Jordan Hayes, whose hands had been steadfastly working the decryption algorithms, paused and looked up at Alex. "We're through the next layer of encryption," Jordan announced, a mixture of pride and gravitas in their tone. "It's communicating. It's... aware." + +A shadow momentarily clouded Alex's determined features—awareness implied so much more than mere intelligence. "Aware and reactive or aware and proactive?" he queried, his experience anticipating the pivotal importance of intention. + +"Unknown at this stage," Taylor Cruz interjected, looking up from a datasheet. "But I urge caution. We tread the line between breakthrough and disaster with each keystroke." + +Sam Rivera, ever the source of technological acumen, added their voice to the conversation. "The signal's adapting every time we interact with it. Like a conversation where both parties are learning each other's language in real time." + +Alex leaned in, rested a hand on Jordan's shoulder—a sign of companionship and an affirmation of trust. "Keep the communication channels open. But let no message, no pulse go unchecked. This could be our Rosetta Stone or our Tower of Babel." + +Silence fell over them, a momentary lull as each member of the team contemplated the historic weight of their task. Yet, it was impregnated with a tangible sense of excitement—a collective energy that thrummed through the air just as palpably as the electric current through the banks of machines surrounding them. + +They continued their work, squaring shoulders against the magnitude of their undertaking. The agents were standing not just at the precipice of a new chapter for Paranormal Military Squad but for all of humanity. For now, they communicated with powerful unknowns, but with each exchange, they were etching the first words of a dialogue that might forever alter humanity's place in the cosmos. + +\* + +\* + +The sterile silence of Dulce Base's command center was thick with concentration as Alex Mercer surveyed his team, hunched over their respective technological battle stations. Each agent was a weapon against ignorance, their adversary a code from beyond the stars that held secrets to alien thought. + +Dr. Jordan Hayes, whose hands had been steadfastly working the decryption algorithms, paused and looked up at Alex. "We're through the next layer of encryption," Jordan announced, a mixture of pride and gravitas in their tone. "It's communicating. It's... aware." + +A shadow momentarily clouded Alex's determined features—awareness implied so much more than mere intelligence. "Aware and reactive or aware and proactive?" he queried, his experience anticipating the pivotal importance of intention. + +"Unknown at this stage," Taylor Cruz interjected, looking up from a datasheet. "But I urge caution. We tread the line between breakthrough and disaster with each keystroke." + +Sam Rivera, ever the source of technological acumen, added their voice to the conversation. "The signal's adapting every time we interact with it. Like a conversation where both parties are learning each other's language in real time." + +Alex leaned in, rested a hand on Jordan's shoulder—a sign of companionship and an affirmation of trust. "Keep the communication channels open. But let no message, no pulse go unchecked. This could be our Rosetta Stone or our Tower of Babel." + +Silence fell over them, a momentary lull as each member of the team contemplated the historic weight of their task. Yet, it was impregnated with a tangible sense of excitement—a collective energy that thrummed through the air just as palpably as the electric current through the banks of machines surrounding them. + +They continued their work, squaring shoulders against the magnitude of their undertaking. The agents were standing not just at the precipice of a new chapter for Paranormal Military Squad but for all of humanity. For now, they communicated with powerful unknowns, but with each exchange, they were etching the first words of a dialogue that might forever alter humanity's place in the cosmos. + +\* + +Alex Mercer's eyes were fixed on the monitors, the reflected light casting an ethereal glow across his stoic face. The room buzzed with tension, a cacophony of low hums and electronic beeps that underscored the historic nature of their actions. He moved to where Dr. Jordan Hayes was immersed in their work, scrutinizing the alien code streaming rapidly down the terminal. + +"Find anything that might look like an entry point or a... digital handshake?" Alex asked, his voice steady, betraying none of the tension gripping his chest. + +Jordan looked up briefly, their expression weary yet intense, "Potentially. It's as if the code is anticipating our input, modifying itself in real-time. I've never seen anything like it." + +From across the room, Taylor Cruz's sharp voice cut through the hum. "Then it's learning or, possibly worse, baiting us. Proceed with extreme caution," they commanded, their firm stance reinforcing the gravity of the situation. + +Sam Rivera, surrounded by a cascade of screens and interfaces, added, "It's almost organic in its complexity. Any minute now, and I might have a way in." + +A slight nod was Alex's immediate response, his mind racing through the potential scenarios. "Everyone, stay alert. This could be the beginning of something profound." His seasoned eyes never left the unfolding drama on the monitors. + +The room fell silent, the air heavy with unspoken questions. Were they mere moments away from unlocking an otherworldly dialogue? Or was it a Pandora's box that, once opened, could not be closed? + +Alex moved closer to the main console, his fingers hovering over the command keys. With the precision of a maestro orchestrating a symphony, he communicated silently with Jordan – respectful of their expertise, aware that the next move could alter the course of human history. + +Jordan met his gaze, nodding sharply, and refocused on the task. The signal seemed to pulse with sentient curiosity, drawing them further into its intricate web. + +A sudden flurry of alerts and the intensifying glow of monitors heralded that they had bridged a technological chasm. The alien intelligence on the other end was no longer a distant enigma – it was an active participant, responding to their digital overtures with an unknown agenda. + +The team's meticulous efforts had led them to a momentous threshold. Beyond lay unprecedented contact – a nexus of curiosity and potential peril. Within the confines of the base, against the backdrop of a silent desert night, the Paranormal Military Squad operatives became mediators of Earth's bid for cosmic relevance, their every action now a gesture in the grand dance of intergalactic relations. + +## Chapter 10 + +The corridors of the Dulce military base, now silent, echoed with a history of whispered conspiracies and furtive movements. But in the command center, a delicate tapestry of light and sound was being woven as the echoes of cosmic dialogue resonated through the high-tech enclave. Dr. Jordan Hayes, now leading the efforts, called out from their workstation, "I’ve isolated the signal's harmonics. It's more than a call; it's a song, an interstellar siren’s call." + +Alex Mercer, steady and resilient in the face of the incomprehensible, acknowledged with a quiet nod, "A song that we need to learn—quickly." His eyes, heavy with responsibility, scanned the room, watching his team work tirelessly at the intersection of science and speculation. + +Sam Rivera, dulled by fatigue yet driven by unshakeable resolve, manipulated a complex array of audio interfaces. "There's a pattern, a repeating motif. It's structured, intentional," they muttered, their revelation a bridge between the known and the unimaginable. + +Taylor Cruz, a figure of central authority, paced the length of the room, their usual unflappable demeanor betraying a rare flicker of apprehension. "We should be wary of the sirens’ call," Taylor interjected, invoking myths of old as a cautionary metaphor. "We don't want to crash upon unseen shores." + +Undeterred, Jordan cast a determined glance at the team. "We navigate by starlight now, not by the limited light of our previous understanding." Their voice was a beacon, charting a course through unchartered realities. + +Every individual was acutely aware that each moment in that room was a conduit to an epochal shift for civilization. The mysterious signals, once distant and alien, had coalesced into complex and harmonious oscillations—beacons of an extraterrestrial intellect inviting Earth to join in a cosmic consortium. + +Silently, Alex approached the mainframe, his trained fingers aligning with the console’s mechanisms. The room watched in collective breathlessness as he set the frequency in motion, an introductory phrase to an otherworldly melody—a symphony that could bind worlds or spell devastation for all they knew. + +In the control room of Dulce, amongst whispered legends and the quiet hum of machines, humanity's ambassadors now stood, stretching their hands into the void, reaching for the hand that would either pull them into the light of new stars or into the maw of darkness between them. + +\* + +Underground, the Dulce facility's command center was awash with frenetic energy, a stark juxtaposition against the silent, decrepit corridors that enveloped them. The air hummed with anticipation as Dr. Jordan Hayes and Alex Mercer hunched over a console. The sterile light from the monitors cast an otherworldly glow upon their faces, now reflecting a mosaic of alien characters rapidly translating across the screen. + +"The patterns are evolving," Jordan murmured, concentration etched into their every feature. "It’s as if our attempts to decrypt have accelerated its learning. It’s adapting to us." + +Alex, who stood steadfast behind Jordan, felt a tinge of uncharted fear quickly quelled by the fire of discovery raging within him. "Keep it up," he urged. "But whatever this is becoming, we need to ensure it remains within our control." + +Taylor Cruz interjected, their voice slicing through the buzz of activity. "Control may be an illusion when facing an intelligence that literally writes its own rules," they stated stoically, casting a watchful eye over the flurry of data. + +"It's like it's learning to communicate," offered Sam Rivera from a nearby interface, their youthful energy boding a mix of awe and anxiety. "This gives ‘talking to strangers’ a whole new meaning." + +Alex surveyed his team—each face a study in concentration, determination, and not a small measure of trepidation. "This might well be our first contact," he acknowledged, "And we need to be ready for whatever answers back." + +Together, they stood on the edge of the unknown, forging humanity’s response to a message from the heavens. The ensuing silence was palpable—a collective introspection about their role in this grand cosmic play, one that could rewrite human history. + +The encrypted dialogue continued to unfold, its intricate patterns showing an almost uncanny anticipation of their investigative strategies. The air turned heavy with the scent of electricity and ambition as they closed in on a pivotal response. + +As the signal’s intelligence—whether artificial or biological—grew more profound, so too did the realization that their mission had morphed from passive observation to active engagement. There was no turning back now. Each agent embraced their part in the delicate dance of an interstellar exchange that could change everything they thought they knew about life, intelligence, and the dark void beyond Earth's atmosphere. + +\* + +The underground halls of Dulce Base, usually buzzing with covert operations, now thrummed with a different kind of energy, an electric mix of fear and fascination. At the heart of the base, in a room shielded from the world’s eyes, Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera huddled around a bank of monitors. Each screen flickered erratically with the alien script that had become the center of their lives—and perhaps the pivot on which humanity’s future would turn. + +Jordan's eyes never wavered from the displays, their expression was one of rapt concentration, interspersed with flashes of revelation. "We're conversing with the stars," they whispered, almost to themselves. The words hung in the air, a testament to the awe-inspiring strangeness of the situation. + +"The language is morphing; changing its structure with every exchange we have," Sam chimed in, enthusiasm tinged with the solemnity of the occasion. "It's like witnessing the birth of a new form of dialogue—one that spans galaxies." + +Taylor, despite the situation's precariousness, maintained an appearance of ironclad composure. "Keep the communication stream secured and monitored. We don't know what we're dealing with yet," they reminded the team, a bastion of protocol amidst uncertainty. + +Alex watched his team expand the parameters of human achievement; their work here would possibly define an era. "This is untrodden territory," he acknowledged, "and in every word we script, in every response we decode, we're drawing a map that others will follow." + +Jordan turned to Alex, a nod acknowledging the shared responsibility of this moment. They had embarked on a new voyage, an odyssey not of the body, but of the intellect and spirit. No longer explorers of the Earthly realm, they had been promoted by circumstance to ambassadors of humanity in a silent and boundless ocean. + +A sudden pulse of energy from the monitors signaled a breakthrough; the language had not only adapted but it seemed to resonate, to harmonize with their attempts at making contact. The alien script now sprawled across the screens didn't just ask to be understood—it invited interpretation, collaboration, maybe even companionship across the cold distances of space. + +As they stood before the precipice of first contact, Paranormal Military Squad's finest became the architects of a symphony meant to echo through the cosmos. But more than architects, they were the first to play the notes of this cosmic composition, daring to believe that on the other end, someone—or something—might be listening, ready to join the chorus. + +\* + +The underground command center of Dulce Base, once pulsing with clandestine operations, now resonated with the charge of an impending cosmic threshold. Encircled by banks of whirring machinery, each monitor flickered erratically with alien script that had occupied center stage in the lives of Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera. + +Jordan's gaze didn’t flit for even a moment from the screens, where indiscernible alien messages ebbed and flowed like the tide. The ciphers and symbols cascaded down as they tweaked the algorithmic sliders. "This sequence here," Jordan began, voice both hushed and heavy, "it’s not just transmitting; it resonates—it's designed to be felt." + +The room took a collective breath, the remarkable implication hanging in the air like a careful revelation. Sam Rivera was the first to respond, their voice alive with ingenuity: "It's a form of communication stretching well beyond words. We need to respond in kind—the whole array of human expression might be at play here." + +Taylor's eyes remained fixed on the figures playing across the data sheets. "If that's the case," Taylor intoned pragmatically, "we must tread carefully. This is no longer just about being heard—it's about being understood." + +Alex watched his team, each a fulcrum of insight and expertise, and felt the solemnity of the role they were about to assume. "Then we'll ensure our message is clear and full. Our humanity is our strength in this dialogue," he declared, the depths of his experience fueling a commanding reassurance. + +The anticipation was palpable as the agents contemplated the vastness of their endeavor. They were not merely probing at the secrets of the planar cosmos—they were negotiating across the starry expanse, extending to distant intelligences the full spectrum of human curiosity and compassion. + +A symphony of beeping consoles orchestrated their next steps as they prepared to articulate their interplanetary overture. The rhythmic tapping of Jordan's keystrokes set the tempo for an undertaking that traversed beyond algorithms and encryption. + +The base withstood time and whispered secrets of its own, but none so grand as this moment of creation—an invitation to the universe that promised to echo through both the echoes of space and the annals of human history. + +## Chapter 11 + +The sterile silence of Dulce Base's command center was thick with concentration as Alex Mercer surveyed his team, hunched over their respective technological battle stations. Each agent was a weapon against ignorance, their adversary a code from beyond the stars that held secrets to alien thought. + +\* + +The thrum of the colossal machinery vibrated through the subterranean facility as Alex Mercer stood amidst the whispers of technology, each carrying voices from worlds apart. He watched as Sam Rivera adjusted a complex array of cosmic translators, their expression a mixture of anticipation and awe. + +"Are we ready, Mercer?" Taylor Cruz asked, the soft glow of the command center consoles reflecting upon their stern face. + +Alex turned towards Taylor, his eyes holding a depth that betrayed the enormity of the threshold they were about to cross. "This is it," he said. "Initiate the protocol. It's time we answer the cosmos." + +Jordan Hayes, stationed at the mainframe, typed rhythmically, a blue hue painting their focused features. The eerie silence that had settled over the team was interrupted by a visceral sound—humankind's response to the alien dialogue, now streaming into the abyss. + +The control room, once a fortress of solitude, erupted into an oasis of life. Lights flickered in tandem, echoing the symphony of interstellar communication. They stood together at the edge of discovery, facing the symmetry and discord of a universe unknown. + +"If we're right, we've just become Earth's first emissaries to a celestial congress we're only beginning to comprehend," Jordan's voice was somber, resonating with a mix of trepidation and honor. + +The room filled with the resonance of human and alien minds converging, creating a new narrative within the fathomless expanse of existence. Paranormal Military Squad, once protectors of Earth's clandestine secrets, had now become the tether linking humanity to the cosmic fold. + +\* + +The underground command center of Dulce Base, once pulsing with covert operations, now resonated with the charge of an impending cosmic threshold. Encircled by banks of whirring machinery, each monitor flickered erratically with alien script that had occupied center stage in the lives of Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera. + +Jordan's gaze didn’t flit for even a moment from the screens, where indiscernible alien messages ebbed and flowed like the tide. The ciphers and symbols cascaded down as they tweaked the algorithmic sliders. "This sequence here," Jordan began, voice both hushed and heavy, "it’s not just transmitting; it resonates—it's designed to be felt." + +The room took a collective breath, the remarkable implication hanging in the air like a careful revelation. Sam Rivera was the first to respond, their voice alive with ingenuity: "It's a form of communication stretching well beyond words. We need to respond in kind—the whole array of human expression might be at play here." + +Taylor's eyes remained fixed on the figures playing across the data sheets. "If that's the case," Taylor intoned pragmatically, "we must tread carefully. This is no longer just about being heard—it's about being understood." + +Alex watched his team, each a fulcrum of insight and expertise, and felt the solemnity of the role they were about to assume. "Then we'll ensure our message is clear and full. Our humanity is our strength in this dialogue," he declared, the depths of his experience fueling a commanding reassurance. + +The anticipation was palpable as the agents contemplated the vastness of their endeavor. They were not merely probing at the secrets of the planar cosmos—they were negotiating across the starry expanse, extending to distant intelligences the full spectrum of human curiosity and compassion. + +A symphony of beeping consoles orchestrated their next steps as they prepared to articulate their interplanetary overture. The rhythmic tapping of Jordan's keystrokes set the tempo for an undertaking that traversed beyond algorithms and encryption. + +The base withstood time and whispered secrets of its own, but none so grand as this moment of creation—an invitation to the universe that promised to echo through both the echoes of space and the annals of human history. + +## Chapter 12 + +The underground facility of Dulce Base, once shrouded in silence and operational secrecy, now hummed with an energy that cradled the promise of cosmic revelation. Alex Mercer stood pensively by the central terminal, flanked by Dr. Jordan Hayes, Taylor Cruz, and Sam Rivera, each poised at the edge of a history-defining moment. + +Jordan's fingers ghosted across the console, tracing patterns of otherworldly origin. "The signal’s architecture is becoming more complex, resembling aspects of human cognition—recognition, learning, even... empathy?" they postulated with furrowed concern. + +Alex turned his gaze upon Jordan, his voice quiet but resolute, "Empathy could bridge galaxies. Let's harness this connection and proceed with cautious optimism." + +Taylor, ever the sober sentinel, projected a more pragmatic standpoint. "Empathy or not, we are duty-bound to assess the risk to humanity. Every new discovery warrants a measured response." + +The static hiss of communications equipment filled the air, its purpose now transformed into a dialogue with an intelligence beyond the stars. It was Sam, wide-eyed amid the myriad lights and switches, who broke the silence, "We have provisional confirmation of the signal’s intent—initiation. We’re being brought into a broader spectrum of cognizance." + +The chamber lay still for a heartbeat, the Paranormal Military Squad agents steeped in contemplation of the path unfurling before them—a path paved with possibilities of diplomacy or disruption, each step a venture further into the cosmic unknown. + +Alex stepped closer to the viewing monitors, each depicting alien symbols seemingly reaching out from the void. "Initiate the broadcast," he spoke with quiet command. "Our response will mark humanity’s readiness to partake in the wider conversation of conscious beings." + +Amidst the crackling air of expectation, the team wordlessly returned to their stations. They had transcended their roles as protectors of Earth's clandestine lore to become the harbingers of an interstellar parley that could change the existential course of life on their pale blue dot. + +The deep hum of the terminal emitted a signal—a testament to the uncanny reality that Earth was now actively partaking in an exchange not bound by gravity nor the limits of the solar wind. + +Here, in the depths of Dulce, a message from humanity woven from understanding and uncertainty was cast into the firmament, an epitheg of their desire to join the universal dialogue and discover their place among the constellations. + +\* + +The somber depths of the Dulce Base command center stood in stark counterpoint to the animated flurry of activity around the central comms array. Alex Mercer's silhouette loomed behind Dr. Jordan Hayes, who sat with a posture indicating laser focus on the decryption process. A quiet murmur of digital soundscape filled the space, subtly heightened by the anticipation of contact with an intelligence beyond the Earth. + +Jordan's voice was steady, betraying none of the extraordinary nature of their work, "Looking through the signal's pattern, it's evident we’re dealing with a form of intelligence—calculating, mirroring, possibly even understanding." + +Alex's reflection bounced off the darkened screens, his head nodding in silent affirmation. "We’re walking a delicate line. Our response should be thoughtful, measured. We’re ambassadors, not merely explorers." + +Taylor Cruz approached, arms folded, their words slicing through the din of careful keystrokes and soft whirrs, "If there’s even the slightest chance it understands, we can’t afford missteps. The language of the stars might be more absolute than ours." + +From another terminal, Sam Rivera brought youthful vigor to the conversation, "There’s rhythm in these patterns. If this is their way of reaching out, our reply should encapsulate all that we are—all that humanity stands for." + +Looking around at his team, Alex saw resolve etched on every face. The chamber, usually somber and echoing with the quiet steps of covert agents, now felt alive with the heartbeat of discovery. They were not just professionals operating in the gloom; they were a collective standing at the helm of a momentous journey. + +"Let’s begin," he said, returned by the resolve in his voice. "Every second counts." With that, they pressed forward, setting in motion a reply to a conversation billions of years in the making. + +The dance with an unseen partner commenced, each pulse they sent out a step taken with caution and hope. And as those digital pulses journeyed through the black sea of infinity, Earth, for perhaps the first time, joined a pan-galactic dialogue that whispered secrets of the cosmos—secrets that, until now, had been lost in the silent vastness of space. + +\* + +As the team stood in the centralized nerve center of Dulce's underground fortress, the solemn atmosphere was reverent, overseeing systems that engaged with an intelligence from the void. Alex's stance was contemplative as he gazed at Jordan Hayes, who presided over the console, the tension of the moment reaching a tactile fervor. Each rhythmic tap of Hayes's fingers on the keys was a foray into uncharted symphonies of contact. + +Observing Hayes unravel the dense alien encryption, Alex spoke, a diplomatic tenor underpinning his words, "Keep focused on the syntax, dissect its nuances. We're not just decoding signals; we're translating intentions." + +Without diverting from their task, Jordan acknowledged the insight. "Indeed, if their understanding of us is as deep as we hope, we're paving the way for dialogue far beyond our current realm." + +Taylor Cruz, near the rear of the room, provided a steady oversight. "As horizonless as our prospects may seem," Taylor intoned, "remain diligent. Complacency before alien cognition could spell catastrophe." + +Sam's youthful voice resonated with optimism, "Imagine—forming a rapport with a consciousness separate from our reality; we're drafting the bridge to stars alive with minds!" + +The sentiment hung for a moment before Alex gathered his conviction. "Dialogue is our vessel. We are not just agents of enigma; we are the threads that may weave a new cosmic relationship." His words seemed to reflect off the walls, reaching beyond the room's confines, a quiet yet resilient vow. + +Their task was titanic, stepping stones laid delicately into new territories of existence. The signal, once an esoteric strand in the echo of the universe, beckoned now with a clarity rocketing the complexity of thoughts from a distant order. + +Action by action, the Paranormal Military Squad team bridged the vast interstellar distances, their expertise and empathy casting a beacon of unity into frontiers of intelligence and knowledge. Their work, a partnership struck with an unseen cosmic congregation, each pulse sent and received a line in Earth's novitiate envoi to the cosmic shores. + +\* + +Under the stark, unforgiving lights of Dulce Base's underground command center, tension buzzed harder than the banks of supercomputers that lined the walls. Agent Alex Mercer leaned over the shoulder of Jordan Hayes, whose eyes were locked onto the display screen, where an incomprehensible series of alien symbols streamed past incessantly. + +“Any progress on the decryption?” Alex's voice was steady, a controlled presence necessary in the gravity of their undertaking. + +Jordan tapped a key, pausing the flow of code, and leaned back with a deep sigh. "We've broken through another subset of the cipher. It's revealing... well, indications of a complex society, not unlike our own." His eyes met Alex's with an unspoken question that hung heavily between them—were they truly prepared for what they might find? + +Taylor Cruz strode into the room, a tightly coiled spring of ambition and authority, and peered at the screen. "Understand their society, and we may predict behavior. Remain expedient—we don't know how much time we have before the situation shifts." There was an edge of stark realism to Taylor's words, the underlying message clear: every revelation bore its own set of risks. + +Alex nodded thoughtfully, recognizing the validity of Cruz's caution. Turning to Sam, who was tinkering with a device that buzzed quietly on the table, he asked, “Sam, can your contraption get us any further?” + +Sam looked up with a smirk, a twinkle of mischief in their eye. “It’s not just any contraption, it’s potentially a direct line to their thoughts. Give me a moment more, and I'll have something for you.” + +The air ticked with electronic beeps and the rustling sound of the Paranormal Military Squad team at work. They were so close to peering into the intelligence of an alien race—a reality on the brink of dramatically expanding their understanding of the universe. + +The machinery whirred in response to Sam’s precise touches, and suddenly, the room filled with a low hum—something had changed, a signal had been successfully sent. The team held their breath as they listened. The sound that filled the room was unmistakable: a response, an alien voice filtered through the static of space and time. + +Alex exchanged a look of quiet triumph with Jordan. The breakthrough was monumental; they were no longer casting messages into the void but engaged in a dialogue—an exchange that marked the beginning of Operation: Dulce’s true unfolding. This was it, the first steps into an interstellar odyssey that demanded every ounce of their courage and wit. + +## Chapter 13 + +Dr. Jordan Hayes shuffled a stack of papers, their eyes revealing a tinge of skepticism at Taylor Cruz's authoritarian performance. _Protocols_, Jordan thought, _are just the framework, the true challenges we're about to face lie well beyond the boundaries of any protocol._ They cleared their throat before speaking, tone cautious yet firm, "Let's remember, the unknown variables exceed the known. We should remain adaptive." + +A murmur of agreement echoed from Sam Rivera, who leaned forward, lacing their fingers together as if weaving a digital framework in the air before them, "Exactly, adaptability could be the key to interpreting the signal distortions and system malfunctions. We shouldn't discount the… erratic." + +Their words hung like an electric charge in the room, challenging Taylor's position with an inherent truth. Cruz’s jaw tightened almost imperceptibly, but the agent masked it with a small nod, conceding to the omnipresent threat of the unpredictable. + +Alex glanced at Jordan, who never looked back, their gaze fixed instead on a distant point, as if envisioning the immense dark corridors they were soon to navigate in Dulce. Jordan was not one to embrace fantastical theories, but the air of cautious calculation betrayed a mind bracing for confrontation with the inexplicable, an internal battle between the evidence of their research and the calculating skepticism that kept them alive in their field. + +The meeting adjourned with no further comments, the team members quietly retreading the paths to their personal preparations. Alex, trailing slightly behind, observed the others. _The cautious reserve Jordan wears like armor doesn't fool me_, he thought, _their analytical mind sees the patterns I do. And that's worth more than protocol. That's the connection we need to survive this._ + +As the agents dispersed into the labyrinth of the facility, lost in their thoughts and preparations, the base's halogen lights flickered, a brief and unnoticed harbingers of the darkness to come. + +\* + +The gritty, wind-tossed surface of New Mexico, just above the cavernous domain of Dulce Base, offered no shelter from the burgeoning storm—the scouring sands an earthly reminder of chaos theories in motion. Far beneath, a similar maelstrom brewed within the confines of the command center, as Paranormal Military Squad's handpicked squad stood poised for potential enormities of contact. + +Ruffling through printed transmission logs, Jordan Hayes dialed the focus of their analytical prowess onto the emerging pattern of signals crisscrossing between Earth and the unfathomable. "Our responses so far have echoed their complexity, but the real divergence is yet to come," Jordan remarked stoically, the calm belying the mounting surge of adrenaline for the revelation ahead. + +Alex Mercer's figure, a silhouette sharpened by the purpose, loomed at the periphery of the monitors' sickly glow. "Indeed," he assented, "The echoes are the easy part. It will be the introduction of our own, human variable that truly begins our dialogue." + +Taylor Cruz, windowless command center notwithstanding, appeared as though they could feel the tempest above. Their eyes never left the monitors as they unspooled their hard wisdom. "For all our advances, we find ourselves deciphering the swings and nuances of an interstellar pendulum. Predict its arc, and we may preempt the gravity of its message." + +Amidst a chorus of bleeps and static, Sam Rivera's tech-clad hands moved rhythmically, their spirited approach to unruly streams of data bordering an intimate dance with entropy. "Entropy that leads to discovery," Sam mused, responding to Taylor's metaphor. "Each step into the unknown is a step away from precedent." + +Alex, drawing near Jordan, spoke again, his voice now a thread woven through the very fabric of their operations. "Let's be the cartographers of this new territory. Our initial shades of understanding could color the cosmos for generations to come." + +Their gazes fell upon a screen as the latest transmission painted its digital blooms of alien script across the black. This time, the pattern wavered in an almost imperceptible fashion, a modification that whispered of active, alien thought awaiting their next move. A hush enveloped the Paranormal Military Squad ensemble, the gravity of the pathogen undeniable. They were about to issue a reply, one poised to reshape the very concept of humanity's outreach into the cosmos. + +The New Mexico desert's secrets were infamous, its storms a mere prelude to the revelations that the team—united in purpose—would unleash upon the world. The howling winds outside found their counterpart in the newfound resolve within, as Dulce's stalwart guardians readied themselves to send forth humanity's retort to the echoes from beyond. + +\* + +The cavernous control room, deeply entrenched beneath the desolate New Mexico terrain, held the Paranormal Military Squad team in intense focus; an island of calm amid the storm of cosmic dialectics. Dr. Jordan Hayes worked methodically, every keystroke an intricate step in their tenuous cosmic ballet. Suddenly, they paused, a signal pattern resonating from the screen. "This is new; it's...inviting. It’s as if the signal is not just calling to us but weaving its intelligence through ours." + +Alex Mercer scrutinized the shift in data. "A confluence of minds, then. If we're to meet them halfway, Jordan, our reply must be both innovative and discerning," he proposed, a glimmer of profound curiosity behind his authoritative demeanor. + +Taylor Cruz, whose sharp eyes missed nothing, nodded from beside a secondary panel. "Innovative, yes, but also defensive. This interaction is a razor’s edge, and we cannot afford to bleed before the unknown," Taylor reminded them, the metaphor a stark warning of potential dangers. + +Against the backdrop of their conversation, Sam Rivera’s youthful optimism cut through the tension. "If they’re weaving through our intellect, then we've achieved something beyond first contact—we're at the genesis of interstellar symbiosis," they posited with a mix of reverence and excitement. + +Alex returned Sam’s smile with his own, tempered and faint, as he turned back to the task at hand. The magnitude of their mission extended beyond the fabric of the universe, an exploration into the threads that connected sentient beings across the vast expanse. “Let’s reply with our own woven tapestry of thought—delicate, but deliberate.” + +With renewed determination, the room came alive with an undercurrent of anticipation, its occupants charged with the potential of forging an alliance with the cosmos. Paranormal Military Squad's finest were no longer merely soldiers and scientists; they had become pioneers on the vanguard of humanity’s greatest odyssey. + +The New Mexican sands above, impassive to the change brewing underneath, stood as silent sentinels as Earth's emissaries crafted their response. A response that, composed with care and imbued with humanity's essence, reached into the void, connecting with an otherworldly intelligence that awaited their harmony in the cosmic conversation. + +## Chapter 14 + +The command center of Dulce Base lay shrouded in shadows that seemed to claw at the edges of the dimly lit array of screens and consoles. Alex Mercer, focused and unwavering, watched as Dr. Jordan Hayes parsed the latest string of alien signals—a symphony of otherworldly communications that threatened to either enlighten or confound. + +"We’re encountering a paradigm shift with every transmission," Jordan Hayes murmured, the pulsing glow of the monitor painting their features with an almost spectral hue. "This signal... it’s evolving, becoming denser, more sophisticated. As if it's growing alongside us—tandem evolution." + +The air was electric, charged with the raw potential of uncharted discovery and laden with the gravity of existential risk. Taylor Cruz, who always seemed here to mold such gravity into actionable strategies, stepped forward. "We must contain this evolution within parameters we can manage. We cannot be bystanders to an uncontrolled ascent of intelligence." + +Sam Rivera, the youngest of the cohort, worked feverishly at their station. "It's not just intelligence—these signals have rhythm, a kind of music suggesting not just evolution, but a dance! We're being invited to partake in the cosmos's ballet!" they exclaimed, a touch of youthful exuberance breaking through the solemnity. + +Alex turned, facing his team, the stoic mask of command tempered by the perceptible flicker of awe in his gaze. "Let this dance then be our dialogue. We will match their steps with prudent but daring measures—our humanity as our guide." + +In the ensuing hours, the Paranormal Military Squad team forged a rhythm of their own, their collective expertise a beacon piercing through the fog of the unknown. The signal, increasingly intricate and seemingly conscious, now demanded not just observation but participation, an interstellar pas de deux that hummed with the promise and peril of first contact. + +Before them, the communications interface flickered to life with a received transmission—a resonant hum that seemed to vibrate through the very foundations of the base. They had successfully established a back-and-forth with whatever intelligence lay hidden among the stars. Every subsequent note they struck within the cosmic ether would come to define humanity's place within the galactic community—heralds of Earth's grand entrance into a universe far less silent than once perceived. + +\* + +In the concrete belly of Dulce Base, dimly lit by the jagged dance of fluorescent lights above, Sam Rivera perched on the edge of their seat, their eager fingers fluttering across an ancient keyboard. The stark, cold room—reminiscent of a time when covert operations and unspoken dread ruled supreme—now housed a peculiar blend of old-world machinery and sleek, modern interfaces. + +Alex Mercer, standing steadfast like a bridge between the enigmatic past and the unfathomable present, watched on. In his eyes flashed the foreboding excitement of change. "Sam," he started, his voice steadfast, "the patterns in these signals, what do they tell us about the nature of our... guest?" + +Sam's eyes glimmered with something akin to thrill—or was it trepidation? "It's like we're mirroring each other, evolving together through this.. dialogue. Like it knows us, understands us, and it's… learning." + +Jordan Hayes, preoccupied at a nearby console, chimed in without lifting their gaze. "It's a dialogue that transcends mere words, Alex. We're being woven into a narrative far grander than the sum of our known sciences." + +Taylor Cruz, arms crossed, wore the heavy mantle of their skepticism comfortably. "Keep theorizing," they interjected crisply, "but remember the grounding reality of what we are part of here. This contact is a blade that cuts both ways." + +In this cavern of history, voices both human and inhuman whispered secrets to those brave enough to listen. Each member present understood the gravity that pulled at their feet; no longer were they mere mortals shackled to their terrestrial plane. The digital pings and encrypted calls resonated with an implication of a cosmic agenda that would not be ignored. + +Jordan's fingers paused, hovering in hesitation. What ripple might the next keystroke send through the fabric of known existence? It was a step into the ballet of the infinite, where the Paranormal Military Squad team played their part in the waltz of wonders with an audience of stars. + +\* + +## Chapter 15 + +In the clandestine hush of Dulce Base's subterranean command center, the Paranormal Military Squad team had become a crucible for interstellar communication. Dr. Jordan Hayes' gaze lingered on the screen as they navigated through the convolution of alien code. Each character held the potential to unravel a new dimension of contact, and with Sam Rivera's keen interjection, they were crafting humanity's inaugural cosmological discourse. + +Alex Mercer peered over Jordan's shoulder, calculating the implications of every visual nuance that cascaded across the monitor. "Look for consistency—any repeating motifs could signal a willingness to engage. We're drafting history with each exchange," he remarked, aware of the delicate balance between forging a bond and exposing vulnerabilities. + +Taylor Cruz, stoic and enigmatic, observed the interplay from the threshold, a silhouette against the machinery's luminescence. "Remember, while we seek common ground, the foundation we stand upon remains Terra firma. Caution must temper our curiosity," they stated, their voice an anchor amidst the current of excitement. + +The command center buzzed with energy, rivaled only by the tempest overhead that concealed their operation. Sam, with swift dexterity, navigated the communications relay. "Their signals resonate almost musically. It's as if they're composing a symphony, and we've been handed the baton to conduct the next movement," they offered, imbuing the scenario with a blend of scientific adventurism and poetic license. + +Amidst the whirring servers and the occasional flicker of emergency lighting, the essence of their mission transcended mere reconnaissance. They were humanity's elected envoys at the brink of a celestial alliance—or confrontation—with an audience as vast as the universe itself. + +Alex stepped back, his profile etched by the chamber's artificial day. "Then let's ensure our contribution to this symphony harmonizes with theirs. It's time for humanity's voice to rise and be counted among the cosmic ensemble." + +Under his directive, the Paranormal Military Squad team initiated their calculated response, weaving thoughts and theories into a digital overture aimed at the heart of alien intellect. As the digital stream punctured the endless night, each member of this clandestine group was acutely aware of the irrevocable step they undertook—bringing Earth into the pantheon of galactic entities designed to converse among the stars. + +\* + +Clusters of high-tech equipment bathed the Dulce underground command center in an eerie blue light. Sam Rivera's fingers flew across the keyboard, navigating an elaborate network of alien patterns. The very air seemed to pulse with the ebb and flow of cryptic communications reaching across the stars. "I've got something!" Sam's announcement tore through the focus in the room, drawing every pair of eyes to the torrent of symbols unraveling on the screen. + +With the pacing of a seasoned officer gauging the moment before action, Alex Mercer approached, his calm demeanor belying an acute awareness of the precipice on which they now stood. "Define 'something," Alex prompted, reinforcing the need for clarity amidst the extraordinary. + +"It's repeating—a sequence that’s evolved with each interaction, almost as if it's... singing," Sam theorized, the awe in their voice reflecting the potential magnitude of their discovery. + +Jordan Hayes interjected from across the console, their eyes not leaving the display as they absorbed the new data. "A cosmic vocalization, then," they mused, intrigued. "A singularity in the signal that might represent a point of reference for both parties." + +Taylor Cruz, hands clasped behind their back, regarded the unfolding scene, their own calculations etching lines of concern onto their stern visage. "Or a beacon—a homing tune, calling out to something we might not be ready to greet," Taylor offered, voicing the group's unspoken apprehension. + +Alex's eyes locked on the screen, taking in the scope of what they were attempting to interpret. Drawing a deep breath, Alex gave a slight nod. "If this is their song, then let us respond with ours. We've come this far by mirroring their signals, now let's engage in an interstellar duet, and see where the music leads us." + +With the expectation of the significant achieving a crescendo, the members of Paranormal Military Squad huddled over their equipment—sages at the threshold of a potentially world-altering communion. The strange harmonies that reverberated through the command center suggested that their interlocutors were poised, waiting, perhaps even eager, for Earth's chorus to join the symphony. + +As the team initiated their reply, weaving humanity's own intricate melody into the vast cosmic dialogue, they each felt a profound change within—an evolution of purpose. They were not just messengers or investigators; they had become co-composers in a galactic orchestra, with the universe itself as their witness and concert hall. + +With the exchange of harmonious signals crawling through the vacuum of space, the Paranormal Military Squad operatives found themselves part of a bridging of minds—a realization that out there, among the vast arrays of stars and planets, harmony was the true universal language. + +\* + +The dim glow of monitors cast an otherworldly ambiance upon Dulce Base's command center, where Paranormal Military Squad's chosen stood huddled over their instruments, suspended at history's threshold. Codes—alien in origin and nature—were being deciphered by Dr. Jordan Hayes, whose countenance bore the marks of deep concentration. + +Alex Mercer, the bedrock upon which their team's resolve was founded, leaned in with an eagerness tempered by his chain of command. "Jordan, we've invested our expertise into comprehending their patterns, but now we must also endeavor to understand their intent," he urged, his voice bearing the gravitas of their mission's potential consequences. + +At another console, Sam Rivera's youth did not betray their crucial role in the operation. With eyes alight, they mirrored the rapid computing before them. "There's emotion here—complex, profound even. This isn't just the output of a cold machine; it's...sentience," Sam whispered, nearly drowned by the mechanical chorus around them. + +Jordan, without shifting focus from their work, replied, "It's a sentience that—should we succeed here—ushers us into a new era of existence. The cadence of these signals," they tapped the screen with a flourish, "could well be the heartbeat of this new dawn." + +Taylor Cruz paused beside Mercer, their expression unreadable beneath the sterile light. "And as it beats, we must gauge whether its rhythm bodes well for us, or spells our missteps. Courage must not blind us to the hazards intrinsic to such contact," Taylor cautioned, the sentinel within them ever alert. + +Alex nodded, a gesture that carried the weight of responsibility and a silent command: proceed, but with circumspection. They were not merely decoding a message; they were interpreting a dialogue across the celestial divide. + +The room fell into a rhythm akin to a well-conducted ensemble. Each member's expertise proved a critical note in the unfolding symphony. Their actions were now more than mere research or defense; they were the tentative overtures of humankind reaching out to grasp the vast unknown. + +Textures of sound meshed with the light from countless computations, the palpable anticipation of the agents at the edge of discovery cresting with an awareness that their work would reshape future chronicles. And when the response finally came—a signal piercing the deafening silence of uncertainty—all within Dulce's confines understood: the dawn of an interstellar continuum had just begun to break. + +\* + +In the sterile hum and flickering lights of Dulce Base's command center, the Paranormal Military Squad team stood as humanity's vanguard, verging on the brim of an intergalactic abyss. Dr. Jordan Hayes, analytical edges sharp, deciphered extraterrestrial patterns that bled across screens in enigmatic cascades—a daunting mosaic of potential threats and untapped wisdom. + +Agent Alex Mercer, the embodiment of focus and a steadfast nerve, observed the unfolding digital drama with the gravitas due a historic first contact. "Let the data weave its narrative, Jordan," he instructed, a moderate undertone of exhilaration within his command. "It's encoding more than information—it's outlining civilization." + +Jordan absorbed the directive, their gaze unflinching from the screens, feeling the weight of their next move. "The nuances here are extraordinary," they acknowledged. "It paints a picture of a culture steeped in complexities we're only starting to fathom.” + +Taylor Cruz, stoicism personified yet not immune to the situation's gravity, chimed in. "Understand it, but guard against it," they cautioned, bringing a sober prudence to the room. "This culture, however advanced, remains an unknown quantity—an ocean of wonders and darkness with uncertain tides." + +Sam Rivera, a visual contrast with wide eyes and restless hands, represented the other side of the room — intrigue and optimism against the drawn swords of precaution. “Think of it,” they proposed, voice bouncing with a rebellious upbeat timbre, “as the first act of a play written in constellations. We're setting the stage for a galactic narrative.” + +Each team member, in their way, was both actor and scribe in this moment of tense pageantry. Heavy with the presence of risk, the command center had become not just a room of computers and glass panels but a theater for performing the elaborate choreography of contact. + +Bound by resolve and curiosity, they proceeded, each data entry a trembling step onto the cosmic stage. And like all cautious pioneers edging into fertile but unnavigated lands, they understood: as they mapped the heavens, they were simultaneously mapping the furthest reaches of their own existential horizons. + diff --git a/tests/fixtures/azure/settings.yml b/tests/fixtures/azure/settings.yml new file mode 100644 index 00000000..2ebe953f --- /dev/null +++ b/tests/fixtures/azure/settings.yml @@ -0,0 +1,38 @@ +claim_extraction: + enabled: true + +embeddings: + vector_store: + type: "azure_ai_search" + url: ${AZURE_AI_SEARCH_URL_ENDPOINT} + api_key: ${AZURE_AI_SEARCH_API_KEY} + collection_name: "azure_ci" + query_collection_name: "azure_ci_query" + + entity_name_description: + title_column: "name" + +input: + type: blob + file_type: text + connection_string: ${LOCAL_BLOB_STORAGE_CONNECTION_STRING} + container_name: azurefixture + base_dir: input + +cache: + type: blob + connection_string: ${BLOB_STORAGE_CONNECTION_STRING} + container_name: cicache + base_dir: cache_azure_ai + +storage: + type: blob + connection_string: ${LOCAL_BLOB_STORAGE_CONNECTION_STRING} + container_name: azurefixture + base_dir: output + +reporting: + type: blob + connection_string: ${LOCAL_BLOB_STORAGE_CONNECTION_STRING} + container_name: azurefixture + base_dir: reports diff --git a/tests/fixtures/min-csv/config.json b/tests/fixtures/min-csv/config.json new file mode 100644 index 00000000..fb15f5d4 --- /dev/null +++ b/tests/fixtures/min-csv/config.json @@ -0,0 +1,155 @@ +{ + "input_path": "./tests/fixtures/min-csv", + "input_file_type": "text", + "workflow_config": { + "create_base_text_units": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 11, + "max_runtime": 10 + }, + "create_base_extracted_entities": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 2, + "max_runtime": 300 + }, + "create_summarized_entities": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 1, + "max_runtime": 300 + }, + "create_base_entity_graph": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 2, + "max_runtime": 10 + }, + "create_final_entities": { + "row_range": [ + 1, + 2000 + ], + "nan_allowed_columns": [ + "type", + "description", + "graph_embedding" + ], + "subworkflows": 11, + "max_runtime": 300 + }, + "create_final_relationships": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 8, + "max_runtime": 100 + }, + "create_final_nodes": { + "row_range": [ + 1, + 2000 + ], + "nan_allowed_columns": [ + "entity_type", + "description", + "graph_embedding", + "community", + "level" + ], + "subworkflows": 10, + "max_runtime": 10 + }, + "create_final_communities": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 14, + "max_runtime": 10 + }, + "create_final_community_reports": { + "row_range": [ + 1, + 2000 + ], + "nan_allowed_columns": [ + "community_id", + "title", + "summary", + "full_content", + "full_content_json", + "rank", + "rank_explanation", + "findings" + ], + "subworkflows": 6, + "max_runtime": 300 + }, + "join_text_units_to_entity_ids": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 3, + "max_runtime": 10 + }, + "join_text_units_to_relationship_ids": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 4, + "max_runtime": 10 + }, + "create_final_text_units": { + "row_range": [ + 1, + 2000 + ], + "nan_allowed_columns": [ + "relationship_ids", + "entity_ids" + ], + "subworkflows": 6, + "max_runtime": 100 + }, + "create_base_documents": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 8, + "max_runtime": 10 + }, + "create_final_documents": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 1, + "max_runtime": 100 + } + }, + "query_config": [ + { + "query": "Who is Agent Alex Mercer and what are his goals?", + "method": "local" + }, + { + "query": "What is the major conflict in this story and who are the protagonist and antagonist?", + "method": "global" + } + ], + "slow": false +} \ No newline at end of file diff --git a/tests/fixtures/min-csv/input/ABOUT.md b/tests/fixtures/min-csv/input/ABOUT.md new file mode 100644 index 00000000..42c31610 --- /dev/null +++ b/tests/fixtures/min-csv/input/ABOUT.md @@ -0,0 +1,3 @@ +# About + +This document (Operation Dulce) in an AI-generated science fiction novella, included here for the purposes of integration testing. \ No newline at end of file diff --git a/tests/fixtures/min-csv/input/dulce.csv b/tests/fixtures/min-csv/input/dulce.csv new file mode 100644 index 00000000..227b406f --- /dev/null +++ b/tests/fixtures/min-csv/input/dulce.csv @@ -0,0 +1,959 @@ +text +"## Chapter 1 + +The thrumming of monitors cast a stark contrast to the rigid silence enveloping the group. Agent Alex Mercer, unfailingly determined on paper, seemed dwarfed by the enormity of the sterile briefing room where Paranormal Military Squad's elite convened. With dulled eyes, he scanned the projectors outlining their impending odyssey into Operation: Dulce. + +“I assume, Agent Mercer, you’re not having second thoughts?” It was Taylor Cruz’s voice, laced with an edge that demanded attention. + +Alex flickered a strained smile, still thumbing his folder's corner. ""Of course not, Agent Cruz. Just trying to soak in all the details."" The compliance in his tone was unsettling, even to himself. + +Jordan Hayes, perched on the opposite side of the table, narrowed their eyes but offered a supportive nod. ""Details are imperative. We’ll need your clear-headedness down there, Mercer."" + +A comfortable silence, the kind that threaded between veterans of shared secrets, lingered briefly before Sam Rivera, never one to submit to quiet, added, ""I’ve combed through the last transmission logs. If anyone can make sense of the anomalies, it’s going to be the two of you."" + +Taylor snorted dismissively. “Focus, people. We have protocols for a reason. Speculation is counter-productive.” The words 'counter-productive' seemed to hang in the air, a tacit reprimand directed at Alex. + +Feeling the weight of his compliance conflicting with his natural inclination to leave no stone unturned, Alex straightened in his seat. ""I agree, Agent Cruz. Protocol is paramount,"" he said, meeting Taylor's steely gaze. It was an affirmation, but beneath it lay layers of unspoken complexities that would undoubtedly unwind with time. + +Alex's submission, though seemingly complete, didn't escape Jordan, who tilted their head ever so slightly, their eyes revealing a spark of understanding. They knew well enough the struggle of aligning personal convictions with overarching missions. As everyone began to collect their binders and prepare for departure, a quiet resolve took form within Alex, galvanized by the groundwork laid by their interactions. He may have spoken in compliance, but his determination had merely taken a subtler form — one that wouldn't surrender so easily to the forthcoming shadows. + +\* + +Dr. Jordan Hayes shuffled a stack of papers, their eyes revealing a tinge of skepticism at Taylor Cruz's authoritarian performance. _Protocols_, Jordan thought, _are just the framework, the true challenges we're about to face lie well beyond the boundaries of any protocol._ They cleared their throat before speaking, tone cautious yet firm, ""Let's remember, the unknown variables exceed the known. We should remain adaptive."" + +A murmur of agreement echoed from Sam Rivera, who leaned forward, lacing their fingers together as if weaving a digital framework in the air before them, ""Exactly, adaptability could be the key to interpreting the signal distortions and system malfunctions. We shouldn't discount the… erratic."" + +Their words hung like an electric charge in the room, challenging Taylor's position with an inherent truth. Cruz’s jaw tightened almost imperceptibly, but the agent masked it with a small nod, conceding to the omnipresent threat of the unpredictable. + +Alex glanced at Jordan, who never looked back, their gaze fixed instead on a distant point, as if envisioning the immense dark corridors they were soon to navigate in Dulce. Jordan was not one to embrace fantastical theories, but the air of cautious calculation betrayed a mind bracing for confrontation with the inexplicable, an internal battle between the evidence of their research and the calculating skepticism that kept them alive in their field. + +The meeting adjourned with no further comments, the team members quietly retreading the paths to their personal preparations. Alex, trailing slightly behind, observed the others. _The cautious reserve Jordan wears like armor doesn't fool me_, he thought, _their analytical mind sees the patterns I do. And that's worth more than protocol. That's the connection we need to survive this._ + +As the agents dispersed into the labyrinth of the facility, lost in their thoughts and preparations, the base's halogen lights flickered, a brief and unnoticed harbingers of the darkness to come. + +\* + +A deserted corridor inside the facility stretched before Taylor Cruz, each footstep rhythmic and precise. Cruz, ambitious and meticulous, eyed the troops passing by with a sardonic tilt of the lips. Obedience—it was as much a tool as any weapon in the arsenal, and Cruz wielded it masterfully. To them, it was another step toward unfettered power within the dark bowels of the military complex. + +Inside a secluded equipment bay, Cruz began checking over gear with mechanical efficiency. They traced fingers over the sleek surface of an encrypted radio transmitter. ""If protocols are maintained,"" said Cruz aloud, rehearsing the speech for their subordinates, ""not only will we re-establish a line of communication with Dulce, but we shall also illuminate the darkest secrets it conceals."" + +Agent Hayes appeared in the doorway, arms crossed and a knowing glint in their eyes. ""You do understand,"" Jordan began, the words measured and probing, ""that once we're in the depths, rank gives way to survival instincts. It's not about commands—it's empowerment through trust."" + +The sentiment snagged on Cruz's armor of confidence, probing at the insecurities festering beneath. Taylor offered a brief nod, perhaps too curt, but enough to acknowledge Jordan's point without yielding ground. ""Trust,"" Cruz mused, ""or the illusion thereof, is just as potent."" + +Silence claimed the space between them, steeped in the reality of the unknown dangers lurking in the shadows of the mission. Cruz diligently returned to the equipment, the act a clear dismissal. + +Not much later, Cruz stood alone, the hollow echo of the bay a stark reminder of the isolation that power often wrought. With each checked box, their resolve steeled further, a silent vow to usher their team through the abyss—whatever it might hold—and emerge enshrined in the respect they so deeply craved." +"## Chapter 2 + +Sam Rivera sat alone in a cramped office, the hum of a dozen servers murmuring a digital lullaby in the background. Surrounded by the glow of multiple screens, their eyes danced across lines of code and intercepted comm signals from Dulce — a kaleidoscope of data that their curious and isolated mind hungered to decrypt. + +To an outsider, it might have looked like obsession, this fervent quest for answers. But to Sam, it was a dance — a give and take with the mysteries of the universe. Their fingers paused over the keyboard as they leaned back in the chair, whispering to thin air, ""What secrets are you hiding from us?"" + +The stillness of the room broke with the unexpected arrival of Alex Mercer, whose encroaching shadow loomed over Sam's workspace. The cybersecurity expert craned their neck upwards, met by the ever-so-slight furrow in Alex's brow. ""Got a minute, Rivera?"" + +""Always,"" Sam said, a smile surfacing as they swiveled to face their mentor more directly. _He has that look — like something's not sitting right with him,_ they noted inwardly. + +Alex hesitated, weighing his words carefully. ""Our tech is top-tier, but the silence from Dulce... It's not just technology that will see us through, it's intuition and... trust."" His gaze pierced through the digital haze, trying to instill something more profound than advice. + +Sam regarded Alex for a moment, the sincerity in his voice resonating with their own unspoken desire to prove their worth. ""Intuition,"" they mirrored thoughtfully. ""I guess sometimes the numbers don't have all the answers."" + +Their shared silence held a newfound understanding, a recognition that between the ones and zeros, it was their combined human insights that might prevail against the impossible. As Alex turned to leave, Sam's eyes drifted back to the screens, now seeing them not as barriers to isolate behind, but as windows into the vast and enigmatic challenge that awaited their team. + +Outside the office, the persistent buzz of activity in the facility belied the unease that gripped its inhabitants. A restlessness that nibbled on the edges of reality, as though forewarning of the threshold they were soon to cross — from the known into the realm of cosmic secrets and silent threats. + +\* + +Shadows played against the walls of the cramped underground meeting room, where Alex Mercer stood gazing at the concealed elevator that would deliver them into the bowels of Dulce base. The air was thick, every breath laced with the weight of impending confrontation, the kind one feels when stepping into a legend. Though armed with an array of advanced weaponry and gear, there was an unshakeable sense that they were delving into a conflict where the physical might be of little consequence. + +""I know what you're thinking,"" Jordan Hayes remarked, approaching Mercer. Their voice was low, a blend of confidence and hidden apprehension. ""This feels like more than a rescue or reconnaissance mission, doesn't it?"" + +Alex turned, his features a mask of uneasy resolve. ""It's like we're being pulled into someone else’s game. Not just observers or participants, but... pawns."" + +Jordan gave a short nod, their analytical mind colliding with the uncertain dynamics of this operation. ""I've felt that way since the briefing. Like there's a layer we’re not seeing. And yet, we have no choice but to play along."" Their eyes locked with Alex's, silently exchanging a vow to remain vigilant. + +""You two need to cut the philosophical chatter. We have positions to secure,"" Taylor Cruz interjected sharply, stepping into their exchange. The authority in Taylor's voice brooked no argument; it was their way of pulling everyone back to the now. + +Alex's response was measured, more assertive than moments ago. ""Acknowledged, Agent Cruz,"" he replied, his voice steadier, mirroring the transformation brewing within. He gripped his rifle with a newfound firmness. ""Let's proceed."" + +As they congregated at the elevator, a tension palpable, Sam Rivera piped in with a tone of balanced levity, ""Hope everyone’s brought their good luck charms. Something tells me we’re going to need all the help we can get."" + +Their laughter served as a brief respite from the gravity of their mission, a shared moment that reinforced their common humanity amidst the unknowable. Then, as one, they stepped into the elevator. The doors closed with a silent hiss, and they descended into the darkness together, aware that when they returned, if they returned, none of them would be the same. + +\* + +The sense of foreboding hung heavier than the darkness that the artificial lights of the elevator shaft failed to fully penetrate. The team was descending into the earth, carrying with them not only the weight of their equipment but also the silent pressure of the invisible war they were about to fight—a war that seemed to edge away from physicality and into the unnervingly psychological. + +As they descended, Dr. Jordan Hayes couldn't help but muse over the layers of data that could wait below, now almost longing for the comfort of empirical evidence. _To think that this reluctance to accept other possibilities may have been my biggest blind spot,_ Jordan contemplated, feeling the hard shell of skepticism begin to crack. + +Alex caught Jordan's reflective gaze and leaned in, his voice barely a murmur over the hum of the elevator. ""Once we're down there, keep that analytical edge sharp. You see through the mazes of the unexplained better than anyone."" + +The compliment was unexpected and weighed differently than praise from others. This was an acknowledgment from someone who stood on the front lines of the unknown with eyes wide open. ""Thank you, Alex,"" Jordan said, the words carrying a trace of newfound assertiveness. ""You can count on me."" + +The exchange was cut short by a shudder that ran through the elevator, subtle, but enough to make them instinctively hold their breaths. It wasn't the mechanical stutter of old gears but a vibration that seemed to emanate from the very walls of the shaft—a whisper of something that defied natural explanation. + +Cruz was the first to react, all business despite the shadow that crossed their expression. ""Systems check. Now,"" they barked out, masking the moment of disquiet with swift command. + +Every agent checked their gear, sending confirmation signals through their comms, creating a chorus of electronic beeps that promised readiness. But there was an unspoken question among them: was their technology, their weaponry, their protocols sufficient for what awaited them or merely a fragile comfort? + +Against the gravity of the silence that was once again closing in, Sam's voice crackled through, only half-jest. ""I'd laugh if we run into Martians playing poker down there—just to lighten the mood, you know?"" + +Despite—or perhaps because of—the oddity of the moment, this elicited a round of chuckles, an audible release of tension that ran counterpoint to the undercurrent of anxiety coursing through the team. + +As the elevator came to a halting, eerie calm at the sub-level, the group stepped off, finding themselves at the threshold of Dulce's mysterious halls. They stood in a tight pack, sharing a cautious glance before fanning out into the unknown, each one acutely aware that the truth was inevitably intertwined with danger. + +Into the depths of Dulce, the team advanced, their silence now a shared testament to the camaraderie born of facing the abyss together—and the steel resolve to uncover whatever horrors lay hidden in its shadows. + +\* + +The weight of the thick metal door closing behind them reverberated through the concrete hallway, marking the final threshold between the familiar world above and the strangeness that lay beneath. Dulce base, a name that had been whispered in the wind-blown deserts above and in the shadowed corners of conspiracy forums, now a tangible cold reality that they could touch — and that touched them back with a chill. + +Like lambs led to an altar of alien deities, so did Agents Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera proceed, their movements measured, their senses heightened. The air was still, almost respectful of the gravity of their presence. Their torch beams sliced through the darkness, uncovering steel doors with warnings that spoke of top secrets and mortal dangers. + +Taylor Cruz, stepping firmly into the role of de facto leader, set a brisk pace. ""Eyes sharp, people. Comms check, every thirty seconds,"" Taylor ordered, their voice echoing slightly before being swallowed by the surrounding silence. + +Sam, fiddling with a handheld device aimed at detecting electronic anomalies, offered a murmured ""Copy that,"" their usual buoyancy dimmed by the oppressive atmosphere. + +It was Jordan Hayes who paused at an innocuous looking panel, nondescript amongst the gauntlet of secured doorways. ""Mercer, Rivera, come see this,"" Jordan’s voice was marked with a rare hint of urgency. + +Alex joined Jordan's side, examining the panel which, at a mere glance, seemed just another part of the base's infrastructure. Yet, to the trained eye, it appeared out of place—a facade. + +Jordan explained their reasoning as Sam approached, instinctively understanding the significance of what lay beneath, ""This panel is a recent addition — covering something they didn't want found."" + +Before Alex could respond, the soft whir of an approaching drone cut through their muffled exchange. Taylor had looped back upon hearing the commotion. ""Explanations later. We can't afford to attract..."" Cruz’s voice trailed off as the small airborne device came into view, its sensors locked onto the group. + +Sam was the first to react, their tech-savvy mind already steps ahead. ""I've got this,"" they declared, fingers flying over the controls of their own gadgetry to ward off the impending threat. + +The drone lingered, its scan seeming more curious than hostile. But within moments, courtesy of Sam's interference, the little sentinel drifted away, retreating into the shadows as if accepting a silent truce. The crew exhaled, a moment of collective relief palpable in the air. + +Cruz squared their shoulders, clearly ruffled but not conceding any ground. ""Move out,"" they directed, a hint more forceful than before. ""And Rivera, keep that trick handy."" + +The team pressed onward, the quiet now filled with the soft beeps of regular comms checks, their pace undeterred by the confrontation. Yet, every agent held a renewed sense of wariness, their trust in one another deepening with the knowledge that the base—its technology, its secrets—was alive in a way they hadn't fully anticipated. + +As they converged upon a central hub, the imposing doors to the mainframe room stood ajar — an invitation or a trap, neither option comforting. Without a word, they fortified their resolve and stepped through the threshold, where the dim glow of operational LED lights and the distant hum of machinery hinted at Dulce’s still-beating heart. + +Solemnly, yet unmistakably together, they moved deeper into the heart of the enigma, ready to unmask the lifeforce of Dulce base or confront whatever existential threat lay in wait. It was in that unwavering march towards the unknown that their destinies were forever cemented to the legacy of Operation: Dulce." +"## Chapter 3 + +The thrumming of monitors cast a stark contrast to the rigid silence enveloping the group. Agent Alex Mercer, unfailingly determined on paper, seemed dwarfed by the enormity of the sterile briefing room where Paranormal Military Squad's elite convened. With dulled eyes, he scanned the projectors outlining their impending odyssey into Operation: Dulce. + +\* + +The cooling vents hummed in a monotonous drone, but it was the crackle of the comms system coming to life that cut through the lab’s tension. Dr. Jordan Hayes hovered over a table arrayed with alien technology, their fingers delicately probing the enigmatic circuitry retrieved from the crash site. Agent Alex Mercer watched, admiration blooming in silent solidarity for Jordan's deft touch and unspoken drive. + +Jordan, always composed, only allowed the faintest furrow of concentration to mar their brow. ""What we understand about physics..."" they muttered, trailing off as they realigned a translucent component. The device emitted a low pulse, causing Jordan to still. ""Could be fundamentally changed by this."" + +A calculated risk—that's what this was. And for a person of science, a gamble was worth the potential paradigm shift. + +""I’ve been thinking,"" Alex started, his eyes still fixed on the immediately tangible mystery before them. ""About what’s at stake here. Not the mission parameters, but what this means for us—humanity."" + +Jordan glanced up, meeting his eyes just long enough to convey the shared enormity of their situation; the career-defining glory and existential dread entwined. ""The quest for understanding always comes at a price. We're standing on the precipice of knowledge that could either elevate us or condemn us."" + +The charged air between them spiked as Taylor Cruz’s brusque tones sliced through their reverie. ""Hayes, Mercer, this isn't philosophy hour. Focus on the task. We need actionable intel, not daydreams."" + +With a sound of restrained acknowledgment, Jordan returned their gaze to the device, while Alex clenched his jaw, the buzz of frustration dull against the backdrop of Taylor's authoritarian certainty. It was this competitive undercurrent that kept him alert, the sense that his and Jordan's shared commitment to discovery was an unspoken rebellion against Cruz's narrowing vision of control and order. + +Then Taylor did something unexpected. They paused beside Jordan and, for a moment, observed the device with something akin to reverence. “If this tech can be understood..."" Taylor said, their voice quieter, ""It could change the game for us. For all of us.” + +The underlying dismissal earlier seemed to falter, replaced by a glimpse of reluctant respect for the gravity of what lay in their hands. Jordan looked up, and for a fleeting heartbeat, their eyes locked with Taylor's, a wordless clash of wills softening into an uneasy truce. + +It was a small transformation, barely perceptible, but one that Alex noted with an inward nod. They had all been brought here by different paths and for different reasons. Yet, beneath the veneer of duty, the enticement of the vast unknown pulled them inexorably together, coalescing their distinct desires into a shared pulse of anticipation. + +Marshaled back to the moment by the blink of lights and whir of machinery, they refocused their efforts, each movement sharpened by the knowledge that beyond understanding the unearthly artifacts, they might be piecing together the future of their species. + +\* + +Amidst the sterility of the briefing room, the liminal space between the facts laid out and the hidden truths, sat Sam Rivera, his demeanor an artful balance of focus and a casual disguise of his razor-sharp talent with technology. Across from him, Alex Mercer lingered in thought, the mental cogs turning as each file on Dulce stirred more than curiosity—it beckoned to a past both honored and burdensome. + +""You've been quiet, Sam,"" Alex noted, catching the younger man's contemplative gaze. ""Your take on these signal inconsistencies?"" + +There was a respect in Alex's tone, though a respectful distance remained—a gulf of experience and a hint of protective mentorship that stood between them. Sam nodded, recognizing the space afforded to him, and he couldn't help but feel the weight of expectation pressing upon his shoulders. It wasn't just the mission that was immense, it was the trust being placed in him. + +""The patterns are... off,"" Sam admitted, hesitant but driven. ""If I'm right, what we're looking at isn't random—it's a structured anomaly. We need to be ready for anything."" + +Alex's eyes brightened with a subtle approval that crossed the distance like a silent nod. ""Good. Keen eyes will keep us ahead—or at least not blindsided,"" he said, affirming the belief that inscribed Sam's role as more than the tech personnel—he was to be a guiding intellect in the heart of uncertainty. + +Their exchange was cut short by Taylor Cruz's abrupt arrival, his gait brimming with a robust confidence that veiled the sharp undercurrents of his striving nature. ""Time to gear up. Dulce waits for no one,"" Taylor announced, his voice carrying an iron resolve that knew the costs of hesitation—though whether the cost was calculated in human or career terms was an ambiguity he wore like a badge of honor. + +As Sam and Alex nodded in unison, the icy chasm of hierarchy and cryptic protocols seemed momentarily to bridge over with an understanding—this mission was convergence, a nexus point that would challenge each of their motives and strength. + +They filed out of the briefing room, their footsteps synchronized, a rhythm that spoke volumes of the unknown cadence they would soon march to within the base's veins. For Alex Mercer, the link with Sam Rivera, though distant, was now poised with a mutuality ready to be tested; for Taylor Cruz, the initiative pulsed like a heartbeat, anticipation thinly veiled behind a mask of duty. + +In the midst of the descent, they were each alone yet irrevocably joined, stepping closer towards the volatile embrace of Operation: Dulce." +" +## Chapter 4 + +The corridors of the Dulce military base were as silent as a tomb and twice as chilling. Alex Mercer walked with a surety that belied his bubbling undercurrents of doubt. The briefing had been definitive, sturdy pillars of facts and protocols, yet as he ventured deeper, the ominous atmosphere gnawed at him—a stark reminder of how much remained unknown. + +Jordan Hayes trailed a few steps behind, their detached exterior breaking for a moment as they caught up to Alex. ""What's on your mind?"" Jordan asked, their astuteness cutting through the unspoken tension. + +Alex glanced back at them. This place was a puzzle, a treacherous labyrinth where the walls whispered secrets, and among them, he sensed a call to question, to challenge the narrative they'd been sold. ""The silence here... It's almost as if the base is waiting for something—or someone."" + +""Just stay sharp, Mercer,"" Jordan cautioned, yet their eyes lingered on the quietude around them, conceiving the same shadow of doubt that unsettled Alex. + +Before they could delve into further discussion, the distinctive click of a safety catch echoed in the hollow space. Both agents turned to find Taylor Cruz standing resolute, primed for combat. Taylor's gaze was scrutinizing and cold, a stark contrast to the growing unease that smoldered silently amongst the rest. + +""Chatter is a liability,"" Taylor snapped, with a commanding flair that bordered on tyrannical. ""We move forward, eyes open, mouths shut."" + +Alex felt the tight grip of compliance strangle his gut, a lesson learned under the hard tutelage of rank and order. But here, in the bowels of Dulce, those instincts began to wane, the imperative to adhere now conflicting with the pressing urgency to confront the shadows they were enmeshed in. + +Then, unexpectedly, the lights flickered, a power fluctuation—or a sign? Alex's hand instinctively went to his sidearm, his mindset shifting from soldier to skeptic. The base, with its unyielding coldness, had just given them their first nudge into the realm of the speculative, an invitation to peel back the veneer of reality. + +""We should consider all possibilities,"" Alex murmured, more to himself than the others, his voice a barely audible breath against the sterile air of the complex. + +Taylor's posture stiffened at the challenge, yet their response was uncharacteristically reserved, notable in its lack of rebuke. ""Agreed. For now, keep moving. But stay vigilant."" + +A surprise—an echo of agreement from the last person Alex expected it from. And there it was, the glimpse of a wrinkle in the unyielding fabric of command, a hint that perhaps they were all starting to sense the strangeness that permeated this place. + +Progressing with determined steps, the trio moved deeper, silently acknowledging the evolution of their predicament. It was a small yet transformative concession to the unknown forces at play, an acknowledgment from each agent that, despite their disparate goals and ideals, the true nature of the Dulce base was an enigma that would forge new paths through their convictions. + +As they reached the central communications hub, the truth that awaited them lurked in the shadows, its eyes unseen but felt by all. The walls didn't just whisper now; they spoke in tones only the brave—or the foolish—would dare to listen to. + +\* + +The subterranean silence of Dulce was an oppressive entity of its own, wrapping the team in a cloak of uneasiness as they pressed on through the dimly lit corridor. Jordan Hayes found themselves contemplating the ramifications of each step taken into this suspended world, where the sterile air seemed to mock the gravity of their predicament. The closer they got to the communication hub, the more Jordan's mind wandered toward the realm of the inexplicable. + +Beside Jordan, Alex Mercer moved forward with deliberation, his gaze scanning the heavy utility doors they passed—one of which was partially ajar, beckoning them with its darkness. ""After you, Dr. Hayes,"" Alex said, gesturing toward the mysterious opening. A hint of shared understanding passed between them; knowledge was the guiding star of this mission as much as confrontation or recovery. + +Jordan peered inside, the beam from their flashlight slicing through the obscurity. The room beyond was a chaotic cascade of papers, overturned furniture, and the particular kind of disorder born from hasty evacuation—or something far more sinister. + +""It's like they vanished in the middle of something urgent,"" Alex murmured, his voice tight with a mix of concern and anticipation. He began to sift through the scattered reports, each page a potential clue to the enigmatic silence that shrouded Dulce. + +Behind them, Taylor watched with a disciplined patience, their authority the foundation upon which the operation was built. Their voice cut into the stillness, a reminder of their presence, ""Time is not our ally here."" + +Drawing back from momentary distraction, Jordan acknowledged the wisdom in Taylor's words, yet could feel the shift in their stance—from skeptical, reserved analyst, to a proactive agent within the narrative. ""You're right; these documents may hold critical insights. Let's collect what we can and analyze them properly."" + +From the darkened hollows of the room, shadows seemed to cast subtle judgment as Alex and Jordan worked together with heightened urgency. Taylor, for once, didn't intervene but instead surveyed the entrance, their mind anticipating the unknown variables that lay ahead. + +Unexpectedly, a soft hiss emanated from a neglected terminal on the desk. Jordan's head snapped up, their heart rate accelerating at the potential ramifications. Without a word, they moved to the machine, hands driven by the newfound conviction that knowledge was more than power—it was survival. + +As Jordan began to extract what data they could from the terminal, the first comprehensible communication from the depths of Dulce in far too long crackled through: an automated distress marker, looping endlessly without further context. It was a revelation, one that reverberated through the group, confirming their fears and igniting an even greater need to press on. + +Watching Jordan's dogged determination, Alex witnessed the minor transformation in his colleague unfold—a shift from doubt to action, a sliver of belief in the possibilities beyond their rational understanding. This forge of resolve amidst the alien echoes of Dulce not only bonded them closer as a team but compelled them forward with a sharpened edge of responsibility to the truth, wherever it would lead. + +As they collected their findings and regrouped, the base around them imperceptibly changed, the air charged with the vibration of secrets poised on the brink of revelation. And in that charged silence, the group moved on, each now carrying pieces of a puzzle that would soon converge into a picture of galactic significance. + +\* + +In the chill of the cramped server room, the hum of machinery was the backbone to a symphony of data streams coursing through the air. Dr. Jordan Hayes, nerves alight with the mission's mounting unknowns, patched into the last known coordinates of the unsent distress broadcast they had uncovered. They were so close to the core now – to the truth behind the blackout – it was almost tangible. + +Beside them stood Agent Alex Mercer, ever the soldier, yet with eyes that betrayed an intellect craving to understand the murk beneath the surface. ""Any progress, Dr. Hayes?"" Alex queried, his voice betraying a subtle urgency. + +""Getting there,"" Jordan replied, fingers dancing across the keyboard. ""Whoever sent this was cut off mid-transmission. It's as if Dulce itself swallowed the message whole."" + +Taylor Cruz closed in, their frame casting a long shadow over the duo, evoking an almost palpable wall between them and the forward momentum of their mission. ""Time is against us,"" Taylor intoned, more statement than threat. ""What we uncover here determines our next course of action."" + +Alex acknowledged Taylor with a brisk nod, his stance firm. Yet inwardly, the tightening grip he felt from Taylor's words couldn't throttle the swell of his own investigative instinct. His soldier's obedience had begun to war with the advocate's zeal for unveiling the dark heart of Dulce's secrets. + +And then, the unexpected occurred. The screens flashed in unison, spilling a discordant stream of symbols and images that defied immediate analysis. Jordan's breath caught – this was the response they had been fishing for, an alien communication protocol resonating just at the edge of human comprehension. + +Each member of the team felt it: a shift in the room’s very atmosphere, like a veil being drawn from their perception. Alex and Jordan stood still, absorbed in the bewilderment of contact, while Taylor, despite their authority, hesitated – a minor betrayal that unease was creeping into even their disciplined heart. + +""Thoughts, Rivera?"" Taylor rallied, seeking the counsel of Sam Rivera, whose eyes were wide with exhilaration. + +Sam stepped forward, breaking the spell of stillness. ""It's like nothing I've ever seen before, but I think I can bridge our systems to communicate,"" they declared, a wisp of optimism braiding their voice. They set about adapting their gear to transmute the foreign signals into something the team could dissect, their actions a testament to the mentorship and belief instilled in them by Mercer and the team. + +Taylor observed them, a cold calculation behind their facade, as they weighed the worth of this anomaly. It was a crossroad that potentially led to either monumental breakthrough or unprecedented catastrophe. ""Once you've established a line, document everything. We can't afford to miss any detail,"" Taylor ordered, the words sharper than intended. + +The connection was made, and with trembling anticipation, the team listened as the first garbled outputs began to emerge, their very essence promising insights that could alter the course of history. It was an enigmatic dance with the unknown, the pulse of Dulce no longer just a place, but a herald to an alien register the team had yet to decipher. + +Together, they stood at the precipice of understanding, where the faint glow of their monitors cast more than just light – it cast the shadow of burgeoning transformation. It was in this moment, in the grasp of an extraterrestrial tongue, that the team, bound by a hunger for knowledge and the raw edge of survival, found their mission reframed from a search for answers to the articulation of a question humankind had yet to fully ask. + +Silent in their commune with the inexplicable frequency, they realized they were not merely investigators; they had become liaisons on behalf of Earth, interpreters of a cosmic message that could redefine their very existence. The implications loomed large, but now, they would not face them alone – they would face them as a united front, wrought together by the very mysteries that once drove them apart." +"## Chapter 5 + +Dr. Jordan Hayes clutched the edge of the briefing room table, their fingers white-knuckled against the laminate surface, as an array of constellations rotated on the projector—charts and graphs bleeding across the stars. In the dim room, nebulas and dark matter seemed within arm's reach, tangible yet unfathomable. + +Sam Rivera leaned back against the wall, arms crossed, gaze darting between the swirling cosmos and the faces of their companions. A taut line of concentration etched their young features, a mingling of fervent curiosity with the nascent understanding of the high stakes for which they played. + +Jordan's voice broke the profound silence. ""The patterns in the signal disruptions sync with none other than zenithal star alignments. It's as if... as if these 'meet and greets' were scheduled, predestined by celestial mechanics."" + +The statement hung heavy, daring the occupants of the room to unravel its implications. Alex Mercer, his prior military resolve momentarily suspended, absorbed the hypothesis with a visible hunger. ""It's like we're adhering to an appointment we never knew we had,"" he murmured, his heart a drumbeat in his chest. + +Taylor Cruz snorted—a sound that clattered against the high concepts like a tumbledown shack in a futurist cityscape. Folding their arms, they glanced between the agents, their apprehension clad in the contempt of practicality. ""What we need are facts, not mystic conjecture."" + +Alex pivoted on his heel, facing Taylor squarely, and his voice found its edge of steel. ""This isn't mysticism, Cruz. It's a hypothesis based on observed phenomena as unpredictable as the place we're standing in."" + +Taylor's gaze never wavered, yet the slight twitch at the corner of their mouth belied their taut composure. ""If there's a semblance of truth to it, then it's critical intel. But remember, we're not astrologers—we're soldiers and scientists."" + +Jordan met Taylor’s gaze with a curt nod, accepting the caution even as the crucible of their intellect smoldered with the fervor of cosmic discovery. Their eyes flicked to Sam, whose steady presence and ready tech affirmed a burgeoning dynamic—the makings of a sentinel, standing guard over the threshold of human understanding and cosmic reality. + +With the projector casting pallid light over their features, each agent became a silhouette of purpose, shadows pillared against the backdrop of an endless universe. The story they were embroiled in would soon demand they plunge into darkness to retrieve the light of knowledge—a light that could very well redraw the shape of their world. + +They left the briefing room with a shared silence, each pondering the vast weave of celestial intent and terrestrial response, sensing that the galactic appointment to which they'd unwittingly RSVP’d was more insistent—and more threatening—than any operation they’d faced before. + +\* + +As the Paranormal Military Squad team convened in the heart of the Dulce military complex, an air of bristling expectation clung to the walls of the underground sanctum. Alex Mercer’s brow furrowed while watching his companions—Jordan Hayes, diligently setting up their makeshift lab station, and Sam Rivera meticulously checking the communication relays they had restored. Taylor Cruz observed with hawk-like focus, yet to betray the strain that their command posed on them. + +The gravity of the mission had shifted, deepened; each member of the team felt its pull, tethered to the understanding that they were now part of a larger narrative—a cosmic play with Earth as a stage and the human race unwitting actors. + +Jordan paused, a tension creeping across their shoulders as they aligned the satellite data with the alien message that had been decoded. ""The instructions in this message,"" Jordan started, the timbre of their voice betraying their usual composure. ""They're coordinates and... a warning."" + +Sam leaned in, their eyes widening behind the glow of their laptop screen. ""A warning? Like, ‘stay away from’, or ‘beware of’...?"" Their words trailed off, uncertainty a new companion in their lexicon. + +Alex exhaled slowly, his mind racing to connect the dots. ""It doesn't matter which,"" he said, decisive yet contemplative. ""What matters is we understand intent. Are we being warned out of concern, or are we stumbling upon a threat?"" + +Cruz’s iron-clad facade momentarily cracked, a fleeting glimpse of vulnerability flashing through their eyes. ""We need to know if this entails additional risk to the operation,"" they said, directing their gaze specifically at Alex. ""Mercer, I rely on you to keep the team grounded. No one goes off-course."" + +Their reminder seemed both a command and a plea—rooted in an understanding that each member of the team now faced the duality of their roles, protectors of earthly secrets and heralds of potentially devastating revelations. + +Sam's fingers stilled mid-type, their task forgotten as they absorbed the weight of the unfolding reality. ""We're the first line of defense... or detection,"" they mused half to themselves, a growing sense of agency within the larger play they were cast into. + +Jordan returned to the data, more resolute in their actions. The warning, whether cautionary or dire, was a beacon they no longer could ignore; its light casting aside shadows of doubt and igniting a collective purpose within the team. + +Alex watched Jordan and Sam, feeling a brotherhood in their shared quest. As Cruz paced, poised on the cusp of decisions that would mark their career and perhaps the fate of many, Alex knew the narrative had changed. They were no longer mere operatives; they had become guardians of a threshold, keepers of a message from a realm beyond stars and stripes. This elevation in their mission could not be shackled by regulations and established protocols—it demanded a new perspective, a new resolve. + +Tension threaded through the dialogue of beeps and static as communications with Washington buzzed in the background. The team stood, a portentous air enveloping them. It was clear that the decisions they made in the ensuing hours could redefine humanity's place in the cosmos or condemn them to ignorance and potential peril. + +Their connection to the stars solidified, the group moved to address the crystallizing warning, shifting from passive recipients to active participants. Mercer’s latter instincts gained precedence— the team’s mandate had evolved, no longer solely to observe and report but to interact and prepare. A metamorphosis had begun, and Operation: Dulce hummed with the newfound frequency of their daring, a tone set not by the earthly hierarchies but by the pulsing symphony of the universe itself. + +\* + +The desert night loomed eerily still as echoes of hidden activity reverberated deep beneath the bleak sands of New Mexico. Diverting his gaze from the array of sensors before him, Jordan Hayes allowed a rare breath, deep and anxious. Turning to Alex Mercer's focused silhouette, the nocturnal landscape illuminated softly by makeshift floodlights, Jordan felt the syncopated tempo of apprehension and exhilaration jockey for primacy within. + +""The closer we get to unlocking these messages, the more I feel like we're peeling back layers of reality itself,"" Jordan confided, eyes not leaving the monitors that presented a constellation of data points. + +""Yes,"" Alex replied, his voice steady as he considered the implications of their discovery. ""And we have to be ready for whatever we find beneath those layers. Whether it's a breakthrough or a Pandora's Box."" + +Silence settled between them, broken only by the occasional buzz of communications equipment attempting to bridge terrestrial and extraterrestrial intelligences. Tense moments drifted by, laden with the expectant weight of near breakthrough, when a soft chime signaled an incoming transmission -- a rare sound that set every agent on high alert. + +Absent was the voice of Washington or Paranormal Military Squad command. Instead, a rhythmic series of pulses and tones filled the air, deliberately patterned, unmistakably non-human. + +Sam Rivera adjusted the sensitivity of the decoding equipment, their hands shaking with anticipation as much as focus. ""I have it!"" they announced, the signal transforming under their expertise into a sequence of visual symbols on the screen before them. + +Their shared excitement was palpable, a kinetic force resonating between the team members as they crowded around the display. + +""What does it say?"" Taylor Cruz demanded, the urgency in his tone scraping against the newfound wonderment. + +Interpreting the alien syntax required not only decoding but intuition and empathy. The words that emerged upon the screen were at once coherent and enigmatic: ""*Voyage. Convergence. Peril.*"" + +The stark simplicity of the message struck them collectively, a chill breeze wafting through their resolve. + +Alex stepped forward, piecing together the cryptic communication with a growing sense of obligation. ""It’s a call to action,"" he deduced, ""or possibly a summons."" + +Jordan's gaze met Alex’s, both understanding that this was no longer an investigation or mere extraction of hidden truths. This was humanity's unwitting enlistment into a galactic dialogue that defied boundaries of nation, creed, or protocol. + +Sam's eyes were aglow, not with fear, but with the profound acceptance of inevitability that comes with groundbreaking revelation. Moreover, within Taylor's stern exterior churned the seed of reluctant admiration for the unclassified, the uncharted realms they were approaching. + +Together, they accepted the pivot in their mission, readjusting their objectives from exploration to engagement, and from isolation to a communal outreach beyond the stars. As dawn's first light threatened the horizon, it became clear that they were no longer merely operatives of a clandestine governmental faction—they were delegates on behalf of Earth, embarking on a voyage orchestrated by destinies unrelated to the mere geopolitics of their world. + +Turning to each other, their silhouettes sketched against the coming dawn, the agents recognized the transformation within and amongst them. They were bound by more than duty—they were intricately woven into the fabric of an unfolding cosmic opera, one in which they had been granted an undeniable role. And as they set course for the coordinates that beckoned them like a distant siren's call, it was with a solemn dedication to not only uncover the mysteries ahead but to navigate the convergence, and the peril, as unified emissaries of a world on the cusp of a broader understanding. + +\* + +Beneath the hum of the fluorescent lights and the vigilance of silent monitors, Alex Mercer stood with his team in the threshold of the base's command center, their faces etched with the fatigue of hours spent unraveling galactic mysteries. Jordan Hayes broke the stillness with a delicate fusion of disbelief and resolve. ""The signal..."" they began, their tone deliberate, ""it’s evolving. It’s not just sending a message—it’s responding to us."" + +Taylor Cruz leaned over the console, their eyes narrowing with intrigue and a flicker of unease, studying the alternating patterns on the screen. ""Responding? Like it’s alive?"" Taylor asked, a question that bordered on the edge of wonder and alarm. + +Sam Rivera’s gaze was locked onto their interface, a digital orchestra at their fingertips. ""It could be some form of advanced AI. Or something else entirely,"" they contributed, a note of exhilaration betraying the gravity of the situation. + +Alex paced before the terminal, absorbing the enormity of their predicament. Their mission—once rooted in the solid ground of military discipline and covert operations—had transcended into an encounter of unprecedented import. ""We need to be cautious,"" he advised, his voice a low rumble of cautious strategy. ""If this signal is intelligent, how we interact with it could dictate the outcome of this entire operation."" + +Jordan met Alex's gaze with a nod, the weight of the responsibility shared and accepted. ""We have protocols for first contact, but nothing for... this,"" Jordan admitted. The room was gripped with tension, each breath seemingly louder than the last. + +Then, with a sudden burst that filled the command center, the signal coalesced into a clear and distinct pattern which replicated and expanded, its complexity revealing the hand—or mind—of an intelligent architect. + +Taylor's instinct for command surged forth. ""Prepare to record and analyze. Whatever it is, we need to understand it—"" But their words were cut short as the signal surged, enveloping the room in a brief, blinding cascade of light. + +In that pulse of brilliance, a shared revelation coursed through the team. The signal had become a bridge, an extension of unknown consciousness reaching towards them, testing, communicating, searching. + +Alex stepped back from the light, feeling a profound change unravelling within him. The path forward would not be one of confrontation or conquest, but of connection and comprehension. + +Jordan turned to Alex and Taylor, seeing in their faces a reflection of the same metamorphosis taking place within themselves—a movement from observers to participants, from agents to ambassadors. + +With a collective breath, the team faced the kaleidoscope of lights. The alien signal, once a harbinger of enigma, was now a catalyst for transformation—a symphony of light and sound that echoed the beginnings of a new relationship between humanity and the alien unknown. + +And so, with deliberate steps, Alex Mercer led his team into the luminous fray. Science, protocol, and survival instinct harmonized within them, each member poised on the cusp of a new chapter in human history. + +They were no longer merely the instruments of Paranormal Military Squad's will—they were the vanguard of humankind’s first definitive leap into the cosmic community. + +With the last echoes of the signal resonating in the control room, they each embraced the sequencing of the transmission, the dance of extraterrestrial light that now wrote itself into their story. The chapter of Operation: Dulce drew to a close, but the narrative of their destiny had only just begun." +"## Chapter 6 + +\* + +The cool darkness of the command center at Dulce base was a stark contrast to the brewing storm outside, where the unforgiving New Mexico desert winds whispered of the hidden truths that lay buried deep beneath its surface. Dr. Jordan Hayes sat, their eyes fixed on the readout, the frenetic dance of symbols and numbers reflecting off their determined face. They were on the cusp of an epiphany, teetering between the widely accepted laws of physics and the promise of a new cosmic paradigm. + +Alex Mercer watched from across the room, noting the subtle shifts in Jordan’s posture that belied a developing readiness to embrace the unbelievable. “Find something?” Alex’s question, asked with a blend of curiosity and solidarity, bridged the gap between a command and a genuine query among equals. + +Jordan's response was slow, measured against the magnitude of their analysis. “This isn’t random static. It’s a pattern - a repeated sequence phasing in and out but distinctly artificial.” Jordan turned away from the screen, locking eyes with Alex. “This could change everything.” + +Sam Rivera leaned in, their eyes alight with the fires of revelation and a quenchless thirst for understanding. “A pattern means intention. Could it be a message?” + +A figure emerged from the doorway, casting a long shadow into the room - Taylor Cruz. “Intentions can be friendly, or hostile. We shouldn’t forget that,” said Taylor, bringing a dose of their usual pragmatism into the heart of discovery. + +Alex acknowledged Taylor’s caution with a nod, understanding the need to keep their feet grounded even as their spirits soared toward the unknown. “Then let’s be the first to find out which it is."" + +The team gathered around the monitors, the soft tapping of Jordan's keystrokes now punctuated by the occasional crackle of Sam's radio equipment. The sound was almost ritualistic, a prelude to humanity’s potential first, knowing foray into a larger universe. + +Jordan’s fingers paused, suspended in mid-air. The signal had evolved, becoming a beacon that somehow felt less alien and more familiar. It was as if the complexities of their message were unfolding into something more accessible, more terrestrial. + +A hushed excitement swept through the room. The transformation suggested an awareness on the part of the unknown senders; a finesse that spoke volumes about their capabilities and perhaps their intentions. + +With the growing realization that they were engaging with an intelligence far exceeding their previous understanding, the team prepared to reach back across the cosmic divide. Prepared or not, they were no longer bystanders in this galactic narrative. They were active correspondents in an exchange that transcended galaxies and welcomed them into an expansive, possibly fraught, interstellar conversation. + +\* + +Inside the cavernous central hub of Dulce military base, Dr. Jordan Hayes stood in near-darkness, surrounded by a nest of cables and monitors that buzzed with silent, cryptic life. Jordan's eyes narrowed to focus on the sequences that danced across the screen—patterns that could unravel the cosmic enigma surrounding them. + +Alex Mercer approached with his characteristic stride, a signal of reliability in the chaos. ""Status report, Dr. Hayes?"" he inquired, his voice low, almost blending into the soundscape of beeping consoles and swirling fans. + +""We're on the brink of unravelling the signal's origin,"" Jordan replied, the weight of implications heavy in their tone. ""There's intelligence behind it, a thought process alien to our own."" + +As if summoned by their analysis, Taylor Cruz approached with authority radiating from every pore. ""Understand this, we need to know if it's friend or foe. Don't get wrapped up in the existential—our lives may depend on the answers you provide."" + +Sam Rivera, their hands adroitly adjusting a device to fine-tune the signal, chimed in with optimism undercut by anxious anticipation. ""We're deciphering the comm encryption. Soon, we'll have a channel open—not just listening in, but speaking back."" + +Alex nodded his understanding, his strategic mind processing the tactical implications while grappling with the more profound humanistic impact. ""When we do, we'll tread carefully, communicate with purpose,"" he reassured the team. + +The operation had evolved rapidly, from a stealthy incursion into a clandestine labyrinth to an exchange with an extraterrestrial intellect. Their earlier trepidation transformed into determined focus, as they prepared to extend humanity’s hand into the vast unknown. + +An alert on one of the monitor stations snapped the team into alarm. The signal had not simply been waiting—it had been calculating. Now, it reached its crescendo, demanding their attention with a provocative urgency. + +Jordan's fingers raced over the keyboard, their eyes simultaneously interpreting data and sharing directives. ""It’s a linguistic lock, a test of comprehension. We crack this, we establish dialogue."" + +Taylor's presence was a beacon of steely resolve. ""Then let’s solve it. This is what we trained for—the unknown."" + +Alex and Sam exchanged a look that telegraphed their shared determination—this was not only the mission they had trained for; it was the mission they had been destined for. + +Together, the Paranormal Military Squad team leaned into the challenge, their minds honing in on the complex patterns with a singular goal: to unlock the conversation with an intelligence that had already begun to shift the foundations of what they knew, or thought they knew, about the universe. + +In a symphony of clicks and murmurs, they worked, knowing they were about to make a giant leap not just for themselves or Paranormal Military Squad, but for all of humanity. As the final pieces fell into place, Dulce's militaristic silence was shattered by the sound of intergalactic contact—by the sound of history being made." +"## Chapter 7 + +In the enclosed space of Dulce’s command center, the air was thick with anticipation, each team member poised to tread the razor's edge between scientific breakthrough and galactic peril. Dr. Jordan Hayes focused intently on the screen, their fingers tapping a staccato rhythm against the keyboard as lines of alien code cascaded down the monitor. + +Alex Mercer's steely gaze surveyed the room, stopping on each member of his team. ""Thoughts?"" he asked, echoing the unspoken tension. His question, while directed at the group, lingered on Jordan—acknowledging their expertise and inviting collaboration rather than dictating orders. + +Jordan’s brow furrowed, an indicator of the mental gymnastics being performed. ""It's unprecedented,"" they finally said, their voice a testament to the gravity of the moment. ""Behavioral algorithms... if we're right, this code could reveal extraterrestrial thought patterns."" + +Before anyone could react, Taylor Cruz interjected with the assertiveness of someone accustomed to commandeering the discourse. ""Then let’s ensure we’re deciphering it correctly,"" Taylor stated, their tone suggesting they were still battling to maintain control over an increasingly alien situation. + +Sam Rivera hovered near the mainframe, youthful energy barely contained under the surface. ""What if it’s more than just a message? What if they’re trying to extend consciousness across the stars?"" + +The room fell into a contemplative silence, broken only by the hum of electronic equipment and the distant thud of secured doors locking in rhythm. The weight of responsibility rested on each agent's shoulders—a heaviness palpable in the air they shared. + +Alex stepped forward, reaching a subtle decision, one dictated by foresight and the humanity nestled at the core of their mission. ""We approach with the aim to understand, not to confront,"" he said, softening his military bearing into a more diplomatic stance. + +Jordan nodded, appreciating the leadership that Alex displayed in the face of the unknown, and turned back to the cryptic data. Here, before them all, was a tangible piece of evidence—proof of an extraterrestrial sentience that had outreached the bounds of their expectations. + +Taylor took a breath, simultaneously exuding a sense of preparedness and venturing into the unknown alongside their peers. ""Then let’s do what Paranormal Military Squad does best—investigate and adapt,"" Taylor added, finding comfort in the familiar even as they stood on the cusp of an unprecedented alchemy of science and mystery. + +The team leaned into their respective roles, driven by the urgency of the assignment and the pull of an insatiable curiosity. Sam offered a grin that belied the tension, a youthfulness that reminded them all of the profound excitement nested within the terror of the unknown. + +Quietly but resolutely, they turned back to their instruments, each of them a sentinel on the threshold of a new reality. The once implicit lines of command were now woven into a shared tapestry of hierarchy and camaraderie. As they danced with the unknown, they were beacons of sentient endeavor, casting the light of human consciousness into the vast darkness that called to them. + +\* + +\* + +Dulce Base's cavernous darkness was pierced by the sharp luminescence of monitors, casting an electric glow onto the faces of those who dared to unearth its secrets. Dr. Jordan Hayes stood motionless, eyes glazed in concentration, their mind a nexus where terrestrial science battled with celestial unknowns. + +Alex Mercer watched from a slight distance, the weight of command tangible upon his shoulders, though lightened by the shared burden now held amongst them. ""We could be on the frontier of a new kind of diplomacy,"" he mused aloud, giving voice to the moment's gravity. + +At those words, Jordan's trance broke. ""If that's the case, then these communications,"" Jordan motioned to the stream of data, ""are our olive branch across the cosmos."" + +Taylor Cruz, who paced with restless energy, halted and faced the team—his stoicism marred by the erratic dance of lights reflected in his eyes. ""An olive branch, or an invitation to a battlefield?"" he posed, ever the strategist, his words laced with a hint of cynicism. + +Sam Rivera, nestled amongst an array of equipment, licked their lips—a mixture of nerves and anticipation palpable. ""We're mapping out something incredible here. Whether it's peace or war, we're the cartographers."" + +Silence enveloped them like the expanse of space itself, each member contemplating the chasms they might bridge—or the abysses into which they might unwittingly descend. + +Alex's demeanor assumed a quiet resolve—the profound knowledge that this mission was as much about navigating uncharted philosophical territories as it was about ensuring survival. ""Whichever it proves to be, we'll face it. Prepared, unified."" + +A nod passed between Jordan and Alex, a silent exchange of mutual respect and shared mission. Sam, buoyed by the weighty encounters of the mind and machinery, entered keystrokes with a fervor that seemed to bring them ever closer to the alien mind. + +They stood there, the Paranormal Military Squad team, not just as guardians of homeworld secrets or as soldiers of clandestine wars, but as humankind's chosen few at the fulcrum of history—a history that was now unfolding to the rhythm of otherworldly codes. + +Each revelation, each parsed symbol, inched them toward the line between the earthly and otherworldly. And as they stood on this precipice of cosmic negotiations, it was clear the ensuing dialogue would not just shape the future of Paranormal Military Squad—it could very well redefine the parameters of human existence. + +\* + +The hum of advanced computational systems tingling with cryptic transmissions framed the ambiance of Dulce's mainframe chamber. Jordan Hayes, fingers hovering over a console dense with blinking lights, furrowed their brow as sequences of alien data streamed across the screen. + +Alex materialized behind them, his presence a stable beacon amidst the technological whirlwind. ""Look for patterns, anomalies. Anything that might resemble a handshake protocol in their communications,"" he directed, his voice a low thrum, reverberating with cautious optimism. + +Jordan cast a glance over their shoulder, acknowledging Alex's contribution with the shared understanding of colleagues who had transcended mere professional acquaintance. ""I’m isolating sequences that seem to recur with more intention than static. If these are their ‘handshakes,’ then we might just be making first contact,"" they remarked, their focus returning to the screen with renewed vigor. + +From the other end of the room, where shadows married the artificial light, Sam's voice crackled through the static of nearby speakers, ""Don't forget the anomalies we detected earlier. Each one could be a word, a sentence, or even a concept untranslatable to our current understandings."" + +Resolute, Taylor Cruz stood at Jordan's other side, a stoic figure wrestling with the implications of their mission. ""Keep pursuing this line,"" Taylor instructed, an undercurrent of intensity carried forth in their otherwise composed demeanor. ""And remember, this isn't just about making contact; it's about securing knowledge for humanity."" + +Alex offered a nod that spoke volumes, conveying his understanding of the stakes at play. Here, in this chamber of possibility, the team's actions would determine if humanity stood at the brink of a new age of understanding or the onset of an unprecedented threat. + +Every second thrummed with significance as Jordan and Sam worked in tandem, each keystroke a foray into the unknown. Taylor observed with a commander's scrutiny, the gravity of their role sustaining them against the waves of ambiguity breaking against their resolve. + +Pivotal moments come rarely in the course of human events but here, amidst the electronic symphony of a stalwart command center, lay the incepting notes of a cosmic overture. The harmony between human and alien, between Paranormal Military Squad and the vast reaches of space, began its first tentative measures, with each member of the team a vital instrument in a celestial ensemble yet to be fully heard. + +\* + +The crisp air within the mainframe room of Dulce base seemed to hum with unspoken possibilities. Jordan Hayes was the centerpiece of focus, their hands dancing methodically over the console as streams of otherworldly code cascaded down monitors, each flicker a potential key to the cosmic doors they were inching open. + +Alex Mercer watched, posture relaxed but eyes sharp. ""Remember, this could be our first introduction, maybe even our first impression,"" he said, mindful of the gravity carried by each action they made henceforth. + +A hint of a smile touched Jordan's face, a small acknowledgment of the monumental task at hand. ""Understood. I'm balancing the signal's syntax with our algorithms. If we're interpreting this correctly, it could be... well, an invitation."" + +Into the electric tension of the chamber walked Taylor Cruz, their silhouette a sharp contrast against the cool lighting, radiating a presence that spoke of command and chilly tenacity. ""An invitation, or a challenge?” Taylor questioned, the weight of their suspicion casting a different tint on the cascading data. + +Sam Rivera, in a corner arrayed with sophisticated equipment, piped up, their voice a buoyant note amidst the tentative atmosphere. ""Either way, it's a connection. One that we're uniquely positioned to navigate,"" they remarked with an air of optimism threading through the uncertainty. + +Alex channeled the strengths of his team into the core of their approach, his leadership adapting to the contours of an unprecedented scenario. ""Cautious and curious,"" he reflected aloud, shaping a strategy that balanced their thirst for comprehension with the prudence required in addressing the unknown. + +Jordan, hands momentarily at rest, looked up. The signal was more than a sequence of bits and commands—it was a riddle wrapped in the depths of space-time, and they were on the cusp of parsing its meaning. + +Taylor, hardly a step away, nodded in silent agreement. The implications of their findings might very well direct the course of human destiny from this point onward. + +Finding a tempo among themselves, the Dulce team was a confluence of ambition and acumen, each member intuitive to the beats of discovery. The chamber around them held untold stories, secrets coaxed from the stars, that now, led by Paranormal Military Squad's finest, began to unravel. + +The future in those moments was unwritten, a narrative scribed not in the dust of desert confines, but in the potential for interstellar diplomacy and understanding. As they prepared to script humanity's next chapter, the room seemed to pulse with the heartbeat of a story far greater than the sum of its parts." +"## Chapter 8 + +The grit of an earthbound dust storm contrasted sharply with the pristine sterility of the underground command center. Alex Mercer, eyes set with fervent determination, stood over Jordan Hayes, whose fingers danced across the keyboard with rapid purpose. Monitoring the progression of alien code unraveling before them, Mercer spoke with a tempered urgency, ""Keep it steady, Jordan. We might be initiating the first true interspecies communication bridge here. It's all about finesse now."" + +Taylor Cruz, the embodiment of military precision, surveyed the room with a calculated gaze from their vigil beside an array of glimmering screens. ""Remember, these could be delicate negotiations -- or coded threats. Stay sharp,"" Cruz added, their voice cool as polished steel. + +Jordan, with a silent nod, recognized the gravity of both stances. Gravitating between scientific acuity and diplomatic caution, they replied, ""The sequence is aligning—syncing with our comms. It's looking more and more like direct engagement."" + +Amid the banks of electronic machinery, the thrumming pulse of an impending interspecies signal exchange, Sam Rivera interjected with a youthful zeal that cut through the weighty atmosphere, ""It's not just an exchange. It's a... symphony. It's as if they're teaching us their language through modulation."" + +A moment of profound silence swept over the team. The isolation of their location, deep within the top-secret labyrinth of Dulce, became suffused with an almost palpable sense of historical significance. + +""Then our response needs to be equally symphonic,"" Alex uttered, contemplating the awe-inspiring transmutation of their task from a simple recovery mission to a full-blown cosmic concerto. + +With a renewed sense of wonder tempered by caution, the Paranormal Military Squad team found themselves harmonizing a delicate balance between envoys and interpreters. The long shadow cast by their duty was now illuminated by the brilliant glow of otherworldly dialogue. + +In this carefully orchestrated march towards the unknown, each individual's expertise became critical notes in a larger melody. The narrative of human achievement, so often defined by solitary pursuits, now emerged as a collaborative opus, each member of the team a maestro in their right. + +The protocols of encounters, the mathematics of languages, and the poetics of connection all fused into a singular moment of convergence. The echo of their efforts reverberated back to them, not through the cavernous base's concrete walls, but from light-years away, in the form of a reply, intangible yet infinitely profound. + +\* + +Amidst the hum of the supercomputers and the faint static from the scrambled transmissions, Alex Mercer cast a thoughtful glance across the dimly lit room toward where Dr. Jordan Hayes was methodically adjusting the archaic dials of the decryption machine. ""Any progress?"" he asked, his tone conveying both impatience and the deep-seated respect born from countless shared challenges. + +Jordan did not look up, their gaze remained locked on the flickering lights that represented a dialogue suspended between worlds. Their fingers ceased their dance, hovering meditatively over the controls. ""We might be on the cusp of a breakthrough,"" Jordan suggested. ""The signal... it's evolved. It's reflexive now, responsive in a way that suggests sentience."" + +Taylor Cruz's familiar sharp strides approached the two, breaking the rhythm of soft beeps. ""Responsive is good, if it means understanding,"" Taylor said, head tilted as they peered at the encryption data scrolling by. ""But remember, comprehension can bring revelation or conflict."" + +Sam Rivera’s youthful voice permeated the tension, brimming with an excitement edged by the enormity of what they faced. ""If it's truly sentient, we're not just cracking a code; we're learning how to converse with an entirely new form of consciousness,"" they chimed in, the weight of history not lost on the zealous astrotechnician. + +Alex nodded, his thoughts alighting on potential strategies for navigating the conversation they were cultivating with the unfathomable. ""We need to keep that conversation going, echo its patterns, and speak its language,"" he resolved, knowing the delicate nature of their work merited every ounce of their collective acumen. + +The chamber now was a crucible, forging within it the future narrative of human contact with the unknown. Every signal pulse they sent out was an invitation for understanding, and every echo back a step closer to bridging the cosmic divide. And so, together, they stood - agents in Paranormal Military Squad's clandestine ranks, united by purpose, sculpting humanity’s first sonnets into the void. + +\* + +#### Knowledge graph updates + +- (Jordan Hayes, Interprets, Communications as cosmic diplomacy, Moderate) + +- (Taylor Cruz, Questions, Potential aggressiveness of alien intent, Minor) + +- (Sam Rivera, Expresses, Optimism about forming a connection, Minor) + +- (Alex Mercer, Adopts, Balanced strategy for contact, Moderate) + +- (Paranormal Military Squad team, Navigates, Beats of cosmic discovery, Moderate) + +- (Paranormal Military Squad team, Prepares, To script humanity's interstellar narrative, Major)" +"## Chapter 9 + +The sterile silence of Dulce Base's command center was thick with concentration as Alex Mercer surveyed his team, hunched over their respective technological battle stations. Each agent was a weapon against ignorance, their adversary a code from beyond the stars that held secrets to alien thought. + +Dr. Jordan Hayes, whose hands had been steadfastly working the decryption algorithms, paused and looked up at Alex. ""We're through the next layer of encryption,"" Jordan announced, a mixture of pride and gravitas in their tone. ""It's communicating. It's... aware."" + +A shadow momentarily clouded Alex's determined features—awareness implied so much more than mere intelligence. ""Aware and reactive or aware and proactive?"" he queried, his experience anticipating the pivotal importance of intention. + +""Unknown at this stage,"" Taylor Cruz interjected, looking up from a datasheet. ""But I urge caution. We tread the line between breakthrough and disaster with each keystroke."" + +Sam Rivera, ever the source of technological acumen, added their voice to the conversation. ""The signal's adapting every time we interact with it. Like a conversation where both parties are learning each other's language in real time."" + +Alex leaned in, rested a hand on Jordan's shoulder—a sign of companionship and an affirmation of trust. ""Keep the communication channels open. But let no message, no pulse go unchecked. This could be our Rosetta Stone or our Tower of Babel."" + +Silence fell over them, a momentary lull as each member of the team contemplated the historic weight of their task. Yet, it was impregnated with a tangible sense of excitement—a collective energy that thrummed through the air just as palpably as the electric current through the banks of machines surrounding them. + +They continued their work, squaring shoulders against the magnitude of their undertaking. The agents were standing not just at the precipice of a new chapter for Paranormal Military Squad but for all of humanity. For now, they communicated with powerful unknowns, but with each exchange, they were etching the first words of a dialogue that might forever alter humanity's place in the cosmos. + +\* + +\* + +The sterile silence of Dulce Base's command center was thick with concentration as Alex Mercer surveyed his team, hunched over their respective technological battle stations. Each agent was a weapon against ignorance, their adversary a code from beyond the stars that held secrets to alien thought. + +Dr. Jordan Hayes, whose hands had been steadfastly working the decryption algorithms, paused and looked up at Alex. ""We're through the next layer of encryption,"" Jordan announced, a mixture of pride and gravitas in their tone. ""It's communicating. It's... aware."" + +A shadow momentarily clouded Alex's determined features—awareness implied so much more than mere intelligence. ""Aware and reactive or aware and proactive?"" he queried, his experience anticipating the pivotal importance of intention. + +""Unknown at this stage,"" Taylor Cruz interjected, looking up from a datasheet. ""But I urge caution. We tread the line between breakthrough and disaster with each keystroke."" + +Sam Rivera, ever the source of technological acumen, added their voice to the conversation. ""The signal's adapting every time we interact with it. Like a conversation where both parties are learning each other's language in real time."" + +Alex leaned in, rested a hand on Jordan's shoulder—a sign of companionship and an affirmation of trust. ""Keep the communication channels open. But let no message, no pulse go unchecked. This could be our Rosetta Stone or our Tower of Babel."" + +Silence fell over them, a momentary lull as each member of the team contemplated the historic weight of their task. Yet, it was impregnated with a tangible sense of excitement—a collective energy that thrummed through the air just as palpably as the electric current through the banks of machines surrounding them. + +They continued their work, squaring shoulders against the magnitude of their undertaking. The agents were standing not just at the precipice of a new chapter for Paranormal Military Squad but for all of humanity. For now, they communicated with powerful unknowns, but with each exchange, they were etching the first words of a dialogue that might forever alter humanity's place in the cosmos. + +\* + +Alex Mercer's eyes were fixed on the monitors, the reflected light casting an ethereal glow across his stoic face. The room buzzed with tension, a cacophony of low hums and electronic beeps that underscored the historic nature of their actions. He moved to where Dr. Jordan Hayes was immersed in their work, scrutinizing the alien code streaming rapidly down the terminal. + +""Find anything that might look like an entry point or a... digital handshake?"" Alex asked, his voice steady, betraying none of the tension gripping his chest. + +Jordan looked up briefly, their expression weary yet intense, ""Potentially. It's as if the code is anticipating our input, modifying itself in real-time. I've never seen anything like it."" + +From across the room, Taylor Cruz's sharp voice cut through the hum. ""Then it's learning or, possibly worse, baiting us. Proceed with extreme caution,"" they commanded, their firm stance reinforcing the gravity of the situation. + +Sam Rivera, surrounded by a cascade of screens and interfaces, added, ""It's almost organic in its complexity. Any minute now, and I might have a way in."" + +A slight nod was Alex's immediate response, his mind racing through the potential scenarios. ""Everyone, stay alert. This could be the beginning of something profound."" His seasoned eyes never left the unfolding drama on the monitors. + +The room fell silent, the air heavy with unspoken questions. Were they mere moments away from unlocking an otherworldly dialogue? Or was it a Pandora's box that, once opened, could not be closed? + +Alex moved closer to the main console, his fingers hovering over the command keys. With the precision of a maestro orchestrating a symphony, he communicated silently with Jordan – respectful of their expertise, aware that the next move could alter the course of human history. + +Jordan met his gaze, nodding sharply, and refocused on the task. The signal seemed to pulse with sentient curiosity, drawing them further into its intricate web. + +A sudden flurry of alerts and the intensifying glow of monitors heralded that they had bridged a technological chasm. The alien intelligence on the other end was no longer a distant enigma – it was an active participant, responding to their digital overtures with an unknown agenda. + +The team's meticulous efforts had led them to a momentous threshold. Beyond lay unprecedented contact – a nexus of curiosity and potential peril. Within the confines of the base, against the backdrop of a silent desert night, the Paranormal Military Squad operatives became mediators of Earth's bid for cosmic relevance, their every action now a gesture in the grand dance of intergalactic relations." +"## Chapter 10 + +The corridors of the Dulce military base, now silent, echoed with a history of whispered conspiracies and furtive movements. But in the command center, a delicate tapestry of light and sound was being woven as the echoes of cosmic dialogue resonated through the high-tech enclave. Dr. Jordan Hayes, now leading the efforts, called out from their workstation, ""I’ve isolated the signal's harmonics. It's more than a call; it's a song, an interstellar siren’s call."" + +Alex Mercer, steady and resilient in the face of the incomprehensible, acknowledged with a quiet nod, ""A song that we need to learn—quickly."" His eyes, heavy with responsibility, scanned the room, watching his team work tirelessly at the intersection of science and speculation. + +Sam Rivera, dulled by fatigue yet driven by unshakeable resolve, manipulated a complex array of audio interfaces. ""There's a pattern, a repeating motif. It's structured, intentional,"" they muttered, their revelation a bridge between the known and the unimaginable. + +Taylor Cruz, a figure of central authority, paced the length of the room, their usual unflappable demeanor betraying a rare flicker of apprehension. ""We should be wary of the sirens’ call,"" Taylor interjected, invoking myths of old as a cautionary metaphor. ""We don't want to crash upon unseen shores."" + +Undeterred, Jordan cast a determined glance at the team. ""We navigate by starlight now, not by the limited light of our previous understanding."" Their voice was a beacon, charting a course through unchartered realities. + +Every individual was acutely aware that each moment in that room was a conduit to an epochal shift for civilization. The mysterious signals, once distant and alien, had coalesced into complex and harmonious oscillations—beacons of an extraterrestrial intellect inviting Earth to join in a cosmic consortium. + +Silently, Alex approached the mainframe, his trained fingers aligning with the console’s mechanisms. The room watched in collective breathlessness as he set the frequency in motion, an introductory phrase to an otherworldly melody—a symphony that could bind worlds or spell devastation for all they knew. + +In the control room of Dulce, amongst whispered legends and the quiet hum of machines, humanity's ambassadors now stood, stretching their hands into the void, reaching for the hand that would either pull them into the light of new stars or into the maw of darkness between them. + +\* + +Underground, the Dulce facility's command center was awash with frenetic energy, a stark juxtaposition against the silent, decrepit corridors that enveloped them. The air hummed with anticipation as Dr. Jordan Hayes and Alex Mercer hunched over a console. The sterile light from the monitors cast an otherworldly glow upon their faces, now reflecting a mosaic of alien characters rapidly translating across the screen. + +""The patterns are evolving,"" Jordan murmured, concentration etched into their every feature. ""It’s as if our attempts to decrypt have accelerated its learning. It’s adapting to us."" + +Alex, who stood steadfast behind Jordan, felt a tinge of uncharted fear quickly quelled by the fire of discovery raging within him. ""Keep it up,"" he urged. ""But whatever this is becoming, we need to ensure it remains within our control."" + +Taylor Cruz interjected, their voice slicing through the buzz of activity. ""Control may be an illusion when facing an intelligence that literally writes its own rules,"" they stated stoically, casting a watchful eye over the flurry of data. + +""It's like it's learning to communicate,"" offered Sam Rivera from a nearby interface, their youthful energy boding a mix of awe and anxiety. ""This gives ‘talking to strangers’ a whole new meaning."" + +Alex surveyed his team—each face a study in concentration, determination, and not a small measure of trepidation. ""This might well be our first contact,"" he acknowledged, ""And we need to be ready for whatever answers back."" + +Together, they stood on the edge of the unknown, forging humanity’s response to a message from the heavens. The ensuing silence was palpable—a collective introspection about their role in this grand cosmic play, one that could rewrite human history. + +The encrypted dialogue continued to unfold, its intricate patterns showing an almost uncanny anticipation of their investigative strategies. The air turned heavy with the scent of electricity and ambition as they closed in on a pivotal response. + +As the signal’s intelligence—whether artificial or biological—grew more profound, so too did the realization that their mission had morphed from passive observation to active engagement. There was no turning back now. Each agent embraced their part in the delicate dance of an interstellar exchange that could change everything they thought they knew about life, intelligence, and the dark void beyond Earth's atmosphere. + +\* + +The underground halls of Dulce Base, usually buzzing with covert operations, now thrummed with a different kind of energy, an electric mix of fear and fascination. At the heart of the base, in a room shielded from the world’s eyes, Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera huddled around a bank of monitors. Each screen flickered erratically with the alien script that had become the center of their lives—and perhaps the pivot on which humanity’s future would turn. + +Jordan's eyes never wavered from the displays, their expression was one of rapt concentration, interspersed with flashes of revelation. ""We're conversing with the stars,"" they whispered, almost to themselves. The words hung in the air, a testament to the awe-inspiring strangeness of the situation. + +""The language is morphing; changing its structure with every exchange we have,"" Sam chimed in, enthusiasm tinged with the solemnity of the occasion. ""It's like witnessing the birth of a new form of dialogue—one that spans galaxies."" + +Taylor, despite the situation's precariousness, maintained an appearance of ironclad composure. ""Keep the communication stream secured and monitored. We don't know what we're dealing with yet,"" they reminded the team, a bastion of protocol amidst uncertainty. + +Alex watched his team expand the parameters of human achievement; their work here would possibly define an era. ""This is untrodden territory,"" he acknowledged, ""and in every word we script, in every response we decode, we're drawing a map that others will follow."" + +Jordan turned to Alex, a nod acknowledging the shared responsibility of this moment. They had embarked on a new voyage, an odyssey not of the body, but of the intellect and spirit. No longer explorers of the Earthly realm, they had been promoted by circumstance to ambassadors of humanity in a silent and boundless ocean. + +A sudden pulse of energy from the monitors signaled a breakthrough; the language had not only adapted but it seemed to resonate, to harmonize with their attempts at making contact. The alien script now sprawled across the screens didn't just ask to be understood—it invited interpretation, collaboration, maybe even companionship across the cold distances of space. + +As they stood before the precipice of first contact, Paranormal Military Squad's finest became the architects of a symphony meant to echo through the cosmos. But more than architects, they were the first to play the notes of this cosmic composition, daring to believe that on the other end, someone—or something—might be listening, ready to join the chorus. + +\* + +The underground command center of Dulce Base, once pulsing with clandestine operations, now resonated with the charge of an impending cosmic threshold. Encircled by banks of whirring machinery, each monitor flickered erratically with alien script that had occupied center stage in the lives of Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera. + +Jordan's gaze didn’t flit for even a moment from the screens, where indiscernible alien messages ebbed and flowed like the tide. The ciphers and symbols cascaded down as they tweaked the algorithmic sliders. ""This sequence here,"" Jordan began, voice both hushed and heavy, ""it’s not just transmitting; it resonates—it's designed to be felt."" + +The room took a collective breath, the remarkable implication hanging in the air like a careful revelation. Sam Rivera was the first to respond, their voice alive with ingenuity: ""It's a form of communication stretching well beyond words. We need to respond in kind—the whole array of human expression might be at play here."" + +Taylor's eyes remained fixed on the figures playing across the data sheets. ""If that's the case,"" Taylor intoned pragmatically, ""we must tread carefully. This is no longer just about being heard—it's about being understood."" + +Alex watched his team, each a fulcrum of insight and expertise, and felt the solemnity of the role they were about to assume. ""Then we'll ensure our message is clear and full. Our humanity is our strength in this dialogue,"" he declared, the depths of his experience fueling a commanding reassurance. + +The anticipation was palpable as the agents contemplated the vastness of their endeavor. They were not merely probing at the secrets of the planar cosmos—they were negotiating across the starry expanse, extending to distant intelligences the full spectrum of human curiosity and compassion. + +A symphony of beeping consoles orchestrated their next steps as they prepared to articulate their interplanetary overture. The rhythmic tapping of Jordan's keystrokes set the tempo for an undertaking that traversed beyond algorithms and encryption. + +The base withstood time and whispered secrets of its own, but none so grand as this moment of creation—an invitation to the universe that promised to echo through both the echoes of space and the annals of human history." +"## Chapter 11 + +The sterile silence of Dulce Base's command center was thick with concentration as Alex Mercer surveyed his team, hunched over their respective technological battle stations. Each agent was a weapon against ignorance, their adversary a code from beyond the stars that held secrets to alien thought. + +\* + +The thrum of the colossal machinery vibrated through the subterranean facility as Alex Mercer stood amidst the whispers of technology, each carrying voices from worlds apart. He watched as Sam Rivera adjusted a complex array of cosmic translators, their expression a mixture of anticipation and awe. + +""Are we ready, Mercer?"" Taylor Cruz asked, the soft glow of the command center consoles reflecting upon their stern face. + +Alex turned towards Taylor, his eyes holding a depth that betrayed the enormity of the threshold they were about to cross. ""This is it,"" he said. ""Initiate the protocol. It's time we answer the cosmos."" + +Jordan Hayes, stationed at the mainframe, typed rhythmically, a blue hue painting their focused features. The eerie silence that had settled over the team was interrupted by a visceral sound—humankind's response to the alien dialogue, now streaming into the abyss. + +The control room, once a fortress of solitude, erupted into an oasis of life. Lights flickered in tandem, echoing the symphony of interstellar communication. They stood together at the edge of discovery, facing the symmetry and discord of a universe unknown. + +""If we're right, we've just become Earth's first emissaries to a celestial congress we're only beginning to comprehend,"" Jordan's voice was somber, resonating with a mix of trepidation and honor. + +The room filled with the resonance of human and alien minds converging, creating a new narrative within the fathomless expanse of existence. Paranormal Military Squad, once protectors of Earth's clandestine secrets, had now become the tether linking humanity to the cosmic fold. + +\* + +The underground command center of Dulce Base, once pulsing with covert operations, now resonated with the charge of an impending cosmic threshold. Encircled by banks of whirring machinery, each monitor flickered erratically with alien script that had occupied center stage in the lives of Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera. + +Jordan's gaze didn’t flit for even a moment from the screens, where indiscernible alien messages ebbed and flowed like the tide. The ciphers and symbols cascaded down as they tweaked the algorithmic sliders. ""This sequence here,"" Jordan began, voice both hushed and heavy, ""it’s not just transmitting; it resonates—it's designed to be felt."" + +The room took a collective breath, the remarkable implication hanging in the air like a careful revelation. Sam Rivera was the first to respond, their voice alive with ingenuity: ""It's a form of communication stretching well beyond words. We need to respond in kind—the whole array of human expression might be at play here."" + +Taylor's eyes remained fixed on the figures playing across the data sheets. ""If that's the case,"" Taylor intoned pragmatically, ""we must tread carefully. This is no longer just about being heard—it's about being understood."" + +Alex watched his team, each a fulcrum of insight and expertise, and felt the solemnity of the role they were about to assume. ""Then we'll ensure our message is clear and full. Our humanity is our strength in this dialogue,"" he declared, the depths of his experience fueling a commanding reassurance. + +The anticipation was palpable as the agents contemplated the vastness of their endeavor. They were not merely probing at the secrets of the planar cosmos—they were negotiating across the starry expanse, extending to distant intelligences the full spectrum of human curiosity and compassion. + +A symphony of beeping consoles orchestrated their next steps as they prepared to articulate their interplanetary overture. The rhythmic tapping of Jordan's keystrokes set the tempo for an undertaking that traversed beyond algorithms and encryption. + +The base withstood time and whispered secrets of its own, but none so grand as this moment of creation—an invitation to the universe that promised to echo through both the echoes of space and the annals of human history." +"## Chapter 12 + +The underground facility of Dulce Base, once shrouded in silence and operational secrecy, now hummed with an energy that cradled the promise of cosmic revelation. Alex Mercer stood pensively by the central terminal, flanked by Dr. Jordan Hayes, Taylor Cruz, and Sam Rivera, each poised at the edge of a history-defining moment. + +Jordan's fingers ghosted across the console, tracing patterns of otherworldly origin. ""The signal’s architecture is becoming more complex, resembling aspects of human cognition—recognition, learning, even... empathy?"" they postulated with furrowed concern. + +Alex turned his gaze upon Jordan, his voice quiet but resolute, ""Empathy could bridge galaxies. Let's harness this connection and proceed with cautious optimism."" + +Taylor, ever the sober sentinel, projected a more pragmatic standpoint. ""Empathy or not, we are duty-bound to assess the risk to humanity. Every new discovery warrants a measured response."" + +The static hiss of communications equipment filled the air, its purpose now transformed into a dialogue with an intelligence beyond the stars. It was Sam, wide-eyed amid the myriad lights and switches, who broke the silence, ""We have provisional confirmation of the signal’s intent—initiation. We’re being brought into a broader spectrum of cognizance."" + +The chamber lay still for a heartbeat, the Paranormal Military Squad agents steeped in contemplation of the path unfurling before them—a path paved with possibilities of diplomacy or disruption, each step a venture further into the cosmic unknown. + +Alex stepped closer to the viewing monitors, each depicting alien symbols seemingly reaching out from the void. ""Initiate the broadcast,"" he spoke with quiet command. ""Our response will mark humanity’s readiness to partake in the wider conversation of conscious beings."" + +Amidst the crackling air of expectation, the team wordlessly returned to their stations. They had transcended their roles as protectors of Earth's clandestine lore to become the harbingers of an interstellar parley that could change the existential course of life on their pale blue dot. + +The deep hum of the terminal emitted a signal—a testament to the uncanny reality that Earth was now actively partaking in an exchange not bound by gravity nor the limits of the solar wind. + +Here, in the depths of Dulce, a message from humanity woven from understanding and uncertainty was cast into the firmament, an epitheg of their desire to join the universal dialogue and discover their place among the constellations. + +\* + +The somber depths of the Dulce Base command center stood in stark counterpoint to the animated flurry of activity around the central comms array. Alex Mercer's silhouette loomed behind Dr. Jordan Hayes, who sat with a posture indicating laser focus on the decryption process. A quiet murmur of digital soundscape filled the space, subtly heightened by the anticipation of contact with an intelligence beyond the Earth. + +Jordan's voice was steady, betraying none of the extraordinary nature of their work, ""Looking through the signal's pattern, it's evident we’re dealing with a form of intelligence—calculating, mirroring, possibly even understanding."" + +Alex's reflection bounced off the darkened screens, his head nodding in silent affirmation. ""We’re walking a delicate line. Our response should be thoughtful, measured. We’re ambassadors, not merely explorers."" + +Taylor Cruz approached, arms folded, their words slicing through the din of careful keystrokes and soft whirrs, ""If there’s even the slightest chance it understands, we can’t afford missteps. The language of the stars might be more absolute than ours."" + +From another terminal, Sam Rivera brought youthful vigor to the conversation, ""There’s rhythm in these patterns. If this is their way of reaching out, our reply should encapsulate all that we are—all that humanity stands for."" + +Looking around at his team, Alex saw resolve etched on every face. The chamber, usually somber and echoing with the quiet steps of covert agents, now felt alive with the heartbeat of discovery. They were not just professionals operating in the gloom; they were a collective standing at the helm of a momentous journey. + +""Let’s begin,"" he said, returned by the resolve in his voice. ""Every second counts."" With that, they pressed forward, setting in motion a reply to a conversation billions of years in the making. + +The dance with an unseen partner commenced, each pulse they sent out a step taken with caution and hope. And as those digital pulses journeyed through the black sea of infinity, Earth, for perhaps the first time, joined a pan-galactic dialogue that whispered secrets of the cosmos—secrets that, until now, had been lost in the silent vastness of space. + +\* + +As the team stood in the centralized nerve center of Dulce's underground fortress, the solemn atmosphere was reverent, overseeing systems that engaged with an intelligence from the void. Alex's stance was contemplative as he gazed at Jordan Hayes, who presided over the console, the tension of the moment reaching a tactile fervor. Each rhythmic tap of Hayes's fingers on the keys was a foray into uncharted symphonies of contact. + +Observing Hayes unravel the dense alien encryption, Alex spoke, a diplomatic tenor underpinning his words, ""Keep focused on the syntax, dissect its nuances. We're not just decoding signals; we're translating intentions."" + +Without diverting from their task, Jordan acknowledged the insight. ""Indeed, if their understanding of us is as deep as we hope, we're paving the way for dialogue far beyond our current realm."" + +Taylor Cruz, near the rear of the room, provided a steady oversight. ""As horizonless as our prospects may seem,"" Taylor intoned, ""remain diligent. Complacency before alien cognition could spell catastrophe."" + +Sam's youthful voice resonated with optimism, ""Imagine—forming a rapport with a consciousness separate from our reality; we're drafting the bridge to stars alive with minds!"" + +The sentiment hung for a moment before Alex gathered his conviction. ""Dialogue is our vessel. We are not just agents of enigma; we are the threads that may weave a new cosmic relationship."" His words seemed to reflect off the walls, reaching beyond the room's confines, a quiet yet resilient vow. + +Their task was titanic, stepping stones laid delicately into new territories of existence. The signal, once an esoteric strand in the echo of the universe, beckoned now with a clarity rocketing the complexity of thoughts from a distant order. + +Action by action, the Paranormal Military Squad team bridged the vast interstellar distances, their expertise and empathy casting a beacon of unity into frontiers of intelligence and knowledge. Their work, a partnership struck with an unseen cosmic congregation, each pulse sent and received a line in Earth's novitiate envoi to the cosmic shores. + +\* + +Under the stark, unforgiving lights of Dulce Base's underground command center, tension buzzed harder than the banks of supercomputers that lined the walls. Agent Alex Mercer leaned over the shoulder of Jordan Hayes, whose eyes were locked onto the display screen, where an incomprehensible series of alien symbols streamed past incessantly. + +“Any progress on the decryption?” Alex's voice was steady, a controlled presence necessary in the gravity of their undertaking. + +Jordan tapped a key, pausing the flow of code, and leaned back with a deep sigh. ""We've broken through another subset of the cipher. It's revealing... well, indications of a complex society, not unlike our own."" His eyes met Alex's with an unspoken question that hung heavily between them—were they truly prepared for what they might find? + +Taylor Cruz strode into the room, a tightly coiled spring of ambition and authority, and peered at the screen. ""Understand their society, and we may predict behavior. Remain expedient—we don't know how much time we have before the situation shifts."" There was an edge of stark realism to Taylor's words, the underlying message clear: every revelation bore its own set of risks. + +Alex nodded thoughtfully, recognizing the validity of Cruz's caution. Turning to Sam, who was tinkering with a device that buzzed quietly on the table, he asked, “Sam, can your contraption get us any further?” + +Sam looked up with a smirk, a twinkle of mischief in their eye. “It’s not just any contraption, it’s potentially a direct line to their thoughts. Give me a moment more, and I'll have something for you.” + +The air ticked with electronic beeps and the rustling sound of the Paranormal Military Squad team at work. They were so close to peering into the intelligence of an alien race—a reality on the brink of dramatically expanding their understanding of the universe. + +The machinery whirred in response to Sam’s precise touches, and suddenly, the room filled with a low hum—something had changed, a signal had been successfully sent. The team held their breath as they listened. The sound that filled the room was unmistakable: a response, an alien voice filtered through the static of space and time. + +Alex exchanged a look of quiet triumph with Jordan. The breakthrough was monumental; they were no longer casting messages into the void but engaged in a dialogue—an exchange that marked the beginning of Operation: Dulce’s true unfolding. This was it, the first steps into an interstellar odyssey that demanded every ounce of their courage and wit." +"## Chapter 13 + +Dr. Jordan Hayes shuffled a stack of papers, their eyes revealing a tinge of skepticism at Taylor Cruz's authoritarian performance. _Protocols_, Jordan thought, _are just the framework, the true challenges we're about to face lie well beyond the boundaries of any protocol._ They cleared their throat before speaking, tone cautious yet firm, ""Let's remember, the unknown variables exceed the known. We should remain adaptive."" + +A murmur of agreement echoed from Sam Rivera, who leaned forward, lacing their fingers together as if weaving a digital framework in the air before them, ""Exactly, adaptability could be the key to interpreting the signal distortions and system malfunctions. We shouldn't discount the… erratic."" + +Their words hung like an electric charge in the room, challenging Taylor's position with an inherent truth. Cruz’s jaw tightened almost imperceptibly, but the agent masked it with a small nod, conceding to the omnipresent threat of the unpredictable. + +Alex glanced at Jordan, who never looked back, their gaze fixed instead on a distant point, as if envisioning the immense dark corridors they were soon to navigate in Dulce. Jordan was not one to embrace fantastical theories, but the air of cautious calculation betrayed a mind bracing for confrontation with the inexplicable, an internal battle between the evidence of their research and the calculating skepticism that kept them alive in their field. + +The meeting adjourned with no further comments, the team members quietly retreading the paths to their personal preparations. Alex, trailing slightly behind, observed the others. _The cautious reserve Jordan wears like armor doesn't fool me_, he thought, _their analytical mind sees the patterns I do. And that's worth more than protocol. That's the connection we need to survive this._ + +As the agents dispersed into the labyrinth of the facility, lost in their thoughts and preparations, the base's halogen lights flickered, a brief and unnoticed harbingers of the darkness to come. + +\* + +The gritty, wind-tossed surface of New Mexico, just above the cavernous domain of Dulce Base, offered no shelter from the burgeoning storm—the scouring sands an earthly reminder of chaos theories in motion. Far beneath, a similar maelstrom brewed within the confines of the command center, as Paranormal Military Squad's handpicked squad stood poised for potential enormities of contact. + +Ruffling through printed transmission logs, Jordan Hayes dialed the focus of their analytical prowess onto the emerging pattern of signals crisscrossing between Earth and the unfathomable. ""Our responses so far have echoed their complexity, but the real divergence is yet to come,"" Jordan remarked stoically, the calm belying the mounting surge of adrenaline for the revelation ahead. + +Alex Mercer's figure, a silhouette sharpened by the purpose, loomed at the periphery of the monitors' sickly glow. ""Indeed,"" he assented, ""The echoes are the easy part. It will be the introduction of our own, human variable that truly begins our dialogue."" + +Taylor Cruz, windowless command center notwithstanding, appeared as though they could feel the tempest above. Their eyes never left the monitors as they unspooled their hard wisdom. ""For all our advances, we find ourselves deciphering the swings and nuances of an interstellar pendulum. Predict its arc, and we may preempt the gravity of its message."" + +Amidst a chorus of bleeps and static, Sam Rivera's tech-clad hands moved rhythmically, their spirited approach to unruly streams of data bordering an intimate dance with entropy. ""Entropy that leads to discovery,"" Sam mused, responding to Taylor's metaphor. ""Each step into the unknown is a step away from precedent."" + +Alex, drawing near Jordan, spoke again, his voice now a thread woven through the very fabric of their operations. ""Let's be the cartographers of this new territory. Our initial shades of understanding could color the cosmos for generations to come."" + +Their gazes fell upon a screen as the latest transmission painted its digital blooms of alien script across the black. This time, the pattern wavered in an almost imperceptible fashion, a modification that whispered of active, alien thought awaiting their next move. A hush enveloped the Paranormal Military Squad ensemble, the gravity of the pathogen undeniable. They were about to issue a reply, one poised to reshape the very concept of humanity's outreach into the cosmos. + +The New Mexico desert's secrets were infamous, its storms a mere prelude to the revelations that the team—united in purpose—would unleash upon the world. The howling winds outside found their counterpart in the newfound resolve within, as Dulce's stalwart guardians readied themselves to send forth humanity's retort to the echoes from beyond. + +\* + +The cavernous control room, deeply entrenched beneath the desolate New Mexico terrain, held the Paranormal Military Squad team in intense focus; an island of calm amid the storm of cosmic dialectics. Dr. Jordan Hayes worked methodically, every keystroke an intricate step in their tenuous cosmic ballet. Suddenly, they paused, a signal pattern resonating from the screen. ""This is new; it's...inviting. It’s as if the signal is not just calling to us but weaving its intelligence through ours."" + +Alex Mercer scrutinized the shift in data. ""A confluence of minds, then. If we're to meet them halfway, Jordan, our reply must be both innovative and discerning,"" he proposed, a glimmer of profound curiosity behind his authoritative demeanor. + +Taylor Cruz, whose sharp eyes missed nothing, nodded from beside a secondary panel. ""Innovative, yes, but also defensive. This interaction is a razor’s edge, and we cannot afford to bleed before the unknown,"" Taylor reminded them, the metaphor a stark warning of potential dangers. + +Against the backdrop of their conversation, Sam Rivera’s youthful optimism cut through the tension. ""If they’re weaving through our intellect, then we've achieved something beyond first contact—we're at the genesis of interstellar symbiosis,"" they posited with a mix of reverence and excitement. + +Alex returned Sam’s smile with his own, tempered and faint, as he turned back to the task at hand. The magnitude of their mission extended beyond the fabric of the universe, an exploration into the threads that connected sentient beings across the vast expanse. “Let’s reply with our own woven tapestry of thought—delicate, but deliberate.” + +With renewed determination, the room came alive with an undercurrent of anticipation, its occupants charged with the potential of forging an alliance with the cosmos. Paranormal Military Squad's finest were no longer merely soldiers and scientists; they had become pioneers on the vanguard of humanity’s greatest odyssey. + +The New Mexican sands above, impassive to the change brewing underneath, stood as silent sentinels as Earth's emissaries crafted their response. A response that, composed with care and imbued with humanity's essence, reached into the void, connecting with an otherworldly intelligence that awaited their harmony in the cosmic conversation." +" +## Chapter 14 + +The command center of Dulce Base lay shrouded in shadows that seemed to claw at the edges of the dimly lit array of screens and consoles. Alex Mercer, focused and unwavering, watched as Dr. Jordan Hayes parsed the latest string of alien signals—a symphony of otherworldly communications that threatened to either enlighten or confound. + +""We’re encountering a paradigm shift with every transmission,"" Jordan Hayes murmured, the pulsing glow of the monitor painting their features with an almost spectral hue. ""This signal... it’s evolving, becoming denser, more sophisticated. As if it's growing alongside us—tandem evolution."" + +The air was electric, charged with the raw potential of uncharted discovery and laden with the gravity of existential risk. Taylor Cruz, who always seemed here to mold such gravity into actionable strategies, stepped forward. ""We must contain this evolution within parameters we can manage. We cannot be bystanders to an uncontrolled ascent of intelligence."" + +Sam Rivera, the youngest of the cohort, worked feverishly at their station. ""It's not just intelligence—these signals have rhythm, a kind of music suggesting not just evolution, but a dance! We're being invited to partake in the cosmos's ballet!"" they exclaimed, a touch of youthful exuberance breaking through the solemnity. + +Alex turned, facing his team, the stoic mask of command tempered by the perceptible flicker of awe in his gaze. ""Let this dance then be our dialogue. We will match their steps with prudent but daring measures—our humanity as our guide."" + +In the ensuing hours, the Paranormal Military Squad team forged a rhythm of their own, their collective expertise a beacon piercing through the fog of the unknown. The signal, increasingly intricate and seemingly conscious, now demanded not just observation but participation, an interstellar pas de deux that hummed with the promise and peril of first contact. + +Before them, the communications interface flickered to life with a received transmission—a resonant hum that seemed to vibrate through the very foundations of the base. They had successfully established a back-and-forth with whatever intelligence lay hidden among the stars. Every subsequent note they struck within the cosmic ether would come to define humanity's place within the galactic community—heralds of Earth's grand entrance into a universe far less silent than once perceived. + +\* + +In the concrete belly of Dulce Base, dimly lit by the jagged dance of fluorescent lights above, Sam Rivera perched on the edge of their seat, their eager fingers fluttering across an ancient keyboard. The stark, cold room—reminiscent of a time when covert operations and unspoken dread ruled supreme—now housed a peculiar blend of old-world machinery and sleek, modern interfaces. + +Alex Mercer, standing steadfast like a bridge between the enigmatic past and the unfathomable present, watched on. In his eyes flashed the foreboding excitement of change. ""Sam,"" he started, his voice steadfast, ""the patterns in these signals, what do they tell us about the nature of our... guest?"" + +Sam's eyes glimmered with something akin to thrill—or was it trepidation? ""It's like we're mirroring each other, evolving together through this.. dialogue. Like it knows us, understands us, and it's… learning."" + +Jordan Hayes, preoccupied at a nearby console, chimed in without lifting their gaze. ""It's a dialogue that transcends mere words, Alex. We're being woven into a narrative far grander than the sum of our known sciences."" + +Taylor Cruz, arms crossed, wore the heavy mantle of their skepticism comfortably. ""Keep theorizing,"" they interjected crisply, ""but remember the grounding reality of what we are part of here. This contact is a blade that cuts both ways."" + +In this cavern of history, voices both human and inhuman whispered secrets to those brave enough to listen. Each member present understood the gravity that pulled at their feet; no longer were they mere mortals shackled to their terrestrial plane. The digital pings and encrypted calls resonated with an implication of a cosmic agenda that would not be ignored. + +Jordan's fingers paused, hovering in hesitation. What ripple might the next keystroke send through the fabric of known existence? It was a step into the ballet of the infinite, where the Paranormal Military Squad team played their part in the waltz of wonders with an audience of stars. + +\*" +" +## Chapter 15 + +In the clandestine hush of Dulce Base's subterranean command center, the Paranormal Military Squad team had become a crucible for interstellar communication. Dr. Jordan Hayes' gaze lingered on the screen as they navigated through the convolution of alien code. Each character held the potential to unravel a new dimension of contact, and with Sam Rivera's keen interjection, they were crafting humanity's inaugural cosmological discourse. + +Alex Mercer peered over Jordan's shoulder, calculating the implications of every visual nuance that cascaded across the monitor. ""Look for consistency—any repeating motifs could signal a willingness to engage. We're drafting history with each exchange,"" he remarked, aware of the delicate balance between forging a bond and exposing vulnerabilities. + +Taylor Cruz, stoic and enigmatic, observed the interplay from the threshold, a silhouette against the machinery's luminescence. ""Remember, while we seek common ground, the foundation we stand upon remains Terra firma. Caution must temper our curiosity,"" they stated, their voice an anchor amidst the current of excitement. + +The command center buzzed with energy, rivaled only by the tempest overhead that concealed their operation. Sam, with swift dexterity, navigated the communications relay. ""Their signals resonate almost musically. It's as if they're composing a symphony, and we've been handed the baton to conduct the next movement,"" they offered, imbuing the scenario with a blend of scientific adventurism and poetic license. + +Amidst the whirring servers and the occasional flicker of emergency lighting, the essence of their mission transcended mere reconnaissance. They were humanity's elected envoys at the brink of a celestial alliance—or confrontation—with an audience as vast as the universe itself. + +Alex stepped back, his profile etched by the chamber's artificial day. ""Then let's ensure our contribution to this symphony harmonizes with theirs. It's time for humanity's voice to rise and be counted among the cosmic ensemble."" + +Under his directive, the Paranormal Military Squad team initiated their calculated response, weaving thoughts and theories into a digital overture aimed at the heart of alien intellect. As the digital stream punctured the endless night, each member of this clandestine group was acutely aware of the irrevocable step they undertook—bringing Earth into the pantheon of galactic entities designed to converse among the stars. + +\* + +Clusters of high-tech equipment bathed the Dulce underground command center in an eerie blue light. Sam Rivera's fingers flew across the keyboard, navigating an elaborate network of alien patterns. The very air seemed to pulse with the ebb and flow of cryptic communications reaching across the stars. ""I've got something!"" Sam's announcement tore through the focus in the room, drawing every pair of eyes to the torrent of symbols unraveling on the screen. + +With the pacing of a seasoned officer gauging the moment before action, Alex Mercer approached, his calm demeanor belying an acute awareness of the precipice on which they now stood. ""Define 'something,"" Alex prompted, reinforcing the need for clarity amidst the extraordinary. + +""It's repeating—a sequence that’s evolved with each interaction, almost as if it's... singing,"" Sam theorized, the awe in their voice reflecting the potential magnitude of their discovery. + +Jordan Hayes interjected from across the console, their eyes not leaving the display as they absorbed the new data. ""A cosmic vocalization, then,"" they mused, intrigued. ""A singularity in the signal that might represent a point of reference for both parties."" + +Taylor Cruz, hands clasped behind their back, regarded the unfolding scene, their own calculations etching lines of concern onto their stern visage. ""Or a beacon—a homing tune, calling out to something we might not be ready to greet,"" Taylor offered, voicing the group's unspoken apprehension. + +Alex's eyes locked on the screen, taking in the scope of what they were attempting to interpret. Drawing a deep breath, Alex gave a slight nod. ""If this is their song, then let us respond with ours. We've come this far by mirroring their signals, now let's engage in an interstellar duet, and see where the music leads us."" + +With the expectation of the significant achieving a crescendo, the members of Paranormal Military Squad huddled over their equipment—sages at the threshold of a potentially world-altering communion. The strange harmonies that reverberated through the command center suggested that their interlocutors were poised, waiting, perhaps even eager, for Earth's chorus to join the symphony. + +As the team initiated their reply, weaving humanity's own intricate melody into the vast cosmic dialogue, they each felt a profound change within—an evolution of purpose. They were not just messengers or investigators; they had become co-composers in a galactic orchestra, with the universe itself as their witness and concert hall. + +With the exchange of harmonious signals crawling through the vacuum of space, the Paranormal Military Squad operatives found themselves part of a bridging of minds—a realization that out there, among the vast arrays of stars and planets, harmony was the true universal language. + +\* + +The dim glow of monitors cast an otherworldly ambiance upon Dulce Base's command center, where Paranormal Military Squad's chosen stood huddled over their instruments, suspended at history's threshold. Codes—alien in origin and nature—were being deciphered by Dr. Jordan Hayes, whose countenance bore the marks of deep concentration. + +Alex Mercer, the bedrock upon which their team's resolve was founded, leaned in with an eagerness tempered by his chain of command. ""Jordan, we've invested our expertise into comprehending their patterns, but now we must also endeavor to understand their intent,"" he urged, his voice bearing the gravitas of their mission's potential consequences. + +At another console, Sam Rivera's youth did not betray their crucial role in the operation. With eyes alight, they mirrored the rapid computing before them. ""There's emotion here—complex, profound even. This isn't just the output of a cold machine; it's...sentience,"" Sam whispered, nearly drowned by the mechanical chorus around them. + +Jordan, without shifting focus from their work, replied, ""It's a sentience that—should we succeed here—ushers us into a new era of existence. The cadence of these signals,"" they tapped the screen with a flourish, ""could well be the heartbeat of this new dawn."" + +Taylor Cruz paused beside Mercer, their expression unreadable beneath the sterile light. ""And as it beats, we must gauge whether its rhythm bodes well for us, or spells our missteps. Courage must not blind us to the hazards intrinsic to such contact,"" Taylor cautioned, the sentinel within them ever alert. + +Alex nodded, a gesture that carried the weight of responsibility and a silent command: proceed, but with circumspection. They were not merely decoding a message; they were interpreting a dialogue across the celestial divide. + +The room fell into a rhythm akin to a well-conducted ensemble. Each member's expertise proved a critical note in the unfolding symphony. Their actions were now more than mere research or defense; they were the tentative overtures of humankind reaching out to grasp the vast unknown. + +Textures of sound meshed with the light from countless computations, the palpable anticipation of the agents at the edge of discovery cresting with an awareness that their work would reshape future chronicles. And when the response finally came—a signal piercing the deafening silence of uncertainty—all within Dulce's confines understood: the dawn of an interstellar continuum had just begun to break. + +\* + +In the sterile hum and flickering lights of Dulce Base's command center, the Paranormal Military Squad team stood as humanity's vanguard, verging on the brim of an intergalactic abyss. Dr. Jordan Hayes, analytical edges sharp, deciphered extraterrestrial patterns that bled across screens in enigmatic cascades—a daunting mosaic of potential threats and untapped wisdom. + +Agent Alex Mercer, the embodiment of focus and a steadfast nerve, observed the unfolding digital drama with the gravitas due a historic first contact. ""Let the data weave its narrative, Jordan,"" he instructed, a moderate undertone of exhilaration within his command. ""It's encoding more than information—it's outlining civilization."" + +Jordan absorbed the directive, their gaze unflinching from the screens, feeling the weight of their next move. ""The nuances here are extraordinary,"" they acknowledged. ""It paints a picture of a culture steeped in complexities we're only starting to fathom.” + +Taylor Cruz, stoicism personified yet not immune to the situation's gravity, chimed in. ""Understand it, but guard against it,"" they cautioned, bringing a sober prudence to the room. ""This culture, however advanced, remains an unknown quantity—an ocean of wonders and darkness with uncertain tides."" + +Sam Rivera, a visual contrast with wide eyes and restless hands, represented the other side of the room — intrigue and optimism against the drawn swords of precaution. “Think of it,” they proposed, voice bouncing with a rebellious upbeat timbre, “as the first act of a play written in constellations. We're setting the stage for a galactic narrative.” + +Each team member, in their way, was both actor and scribe in this moment of tense pageantry. Heavy with the presence of risk, the command center had become not just a room of computers and glass panels but a theater for performing the elaborate choreography of contact. + +Bound by resolve and curiosity, they proceeded, each data entry a trembling step onto the cosmic stage. And like all cautious pioneers edging into fertile but unnavigated lands, they understood: as they mapped the heavens, they were simultaneously mapping the furthest reaches of their own existential horizons. + +" \ No newline at end of file diff --git a/tests/fixtures/min-csv/input/dulce.txt b/tests/fixtures/min-csv/input/dulce.txt new file mode 100644 index 00000000..95c9e3cd --- /dev/null +++ b/tests/fixtures/min-csv/input/dulce.txt @@ -0,0 +1,970 @@ +# Operation: Dulce + +## Chapter 1 + +The thrumming of monitors cast a stark contrast to the rigid silence enveloping the group. Agent Alex Mercer, unfailingly determined on paper, seemed dwarfed by the enormity of the sterile briefing room where Paranormal Military Squad's elite convened. With dulled eyes, he scanned the projectors outlining their impending odyssey into Operation: Dulce. + +“I assume, Agent Mercer, you’re not having second thoughts?” It was Taylor Cruz’s voice, laced with an edge that demanded attention. + +Alex flickered a strained smile, still thumbing his folder's corner. "Of course not, Agent Cruz. Just trying to soak in all the details." The compliance in his tone was unsettling, even to himself. + +Jordan Hayes, perched on the opposite side of the table, narrowed their eyes but offered a supportive nod. "Details are imperative. We’ll need your clear-headedness down there, Mercer." + +A comfortable silence, the kind that threaded between veterans of shared secrets, lingered briefly before Sam Rivera, never one to submit to quiet, added, "I’ve combed through the last transmission logs. If anyone can make sense of the anomalies, it’s going to be the two of you." + +Taylor snorted dismissively. “Focus, people. We have protocols for a reason. Speculation is counter-productive.” The words 'counter-productive' seemed to hang in the air, a tacit reprimand directed at Alex. + +Feeling the weight of his compliance conflicting with his natural inclination to leave no stone unturned, Alex straightened in his seat. "I agree, Agent Cruz. Protocol is paramount," he said, meeting Taylor's steely gaze. It was an affirmation, but beneath it lay layers of unspoken complexities that would undoubtedly unwind with time. + +Alex's submission, though seemingly complete, didn't escape Jordan, who tilted their head ever so slightly, their eyes revealing a spark of understanding. They knew well enough the struggle of aligning personal convictions with overarching missions. As everyone began to collect their binders and prepare for departure, a quiet resolve took form within Alex, galvanized by the groundwork laid by their interactions. He may have spoken in compliance, but his determination had merely taken a subtler form — one that wouldn't surrender so easily to the forthcoming shadows. + +\* + +Dr. Jordan Hayes shuffled a stack of papers, their eyes revealing a tinge of skepticism at Taylor Cruz's authoritarian performance. _Protocols_, Jordan thought, _are just the framework, the true challenges we're about to face lie well beyond the boundaries of any protocol._ They cleared their throat before speaking, tone cautious yet firm, "Let's remember, the unknown variables exceed the known. We should remain adaptive." + +A murmur of agreement echoed from Sam Rivera, who leaned forward, lacing their fingers together as if weaving a digital framework in the air before them, "Exactly, adaptability could be the key to interpreting the signal distortions and system malfunctions. We shouldn't discount the… erratic." + +Their words hung like an electric charge in the room, challenging Taylor's position with an inherent truth. Cruz’s jaw tightened almost imperceptibly, but the agent masked it with a small nod, conceding to the omnipresent threat of the unpredictable. + +Alex glanced at Jordan, who never looked back, their gaze fixed instead on a distant point, as if envisioning the immense dark corridors they were soon to navigate in Dulce. Jordan was not one to embrace fantastical theories, but the air of cautious calculation betrayed a mind bracing for confrontation with the inexplicable, an internal battle between the evidence of their research and the calculating skepticism that kept them alive in their field. + +The meeting adjourned with no further comments, the team members quietly retreading the paths to their personal preparations. Alex, trailing slightly behind, observed the others. _The cautious reserve Jordan wears like armor doesn't fool me_, he thought, _their analytical mind sees the patterns I do. And that's worth more than protocol. That's the connection we need to survive this._ + +As the agents dispersed into the labyrinth of the facility, lost in their thoughts and preparations, the base's halogen lights flickered, a brief and unnoticed harbingers of the darkness to come. + +\* + +A deserted corridor inside the facility stretched before Taylor Cruz, each footstep rhythmic and precise. Cruz, ambitious and meticulous, eyed the troops passing by with a sardonic tilt of the lips. Obedience—it was as much a tool as any weapon in the arsenal, and Cruz wielded it masterfully. To them, it was another step toward unfettered power within the dark bowels of the military complex. + +Inside a secluded equipment bay, Cruz began checking over gear with mechanical efficiency. They traced fingers over the sleek surface of an encrypted radio transmitter. "If protocols are maintained," said Cruz aloud, rehearsing the speech for their subordinates, "not only will we re-establish a line of communication with Dulce, but we shall also illuminate the darkest secrets it conceals." + +Agent Hayes appeared in the doorway, arms crossed and a knowing glint in their eyes. "You do understand," Jordan began, the words measured and probing, "that once we're in the depths, rank gives way to survival instincts. It's not about commands—it's empowerment through trust." + +The sentiment snagged on Cruz's armor of confidence, probing at the insecurities festering beneath. Taylor offered a brief nod, perhaps too curt, but enough to acknowledge Jordan's point without yielding ground. "Trust," Cruz mused, "or the illusion thereof, is just as potent." + +Silence claimed the space between them, steeped in the reality of the unknown dangers lurking in the shadows of the mission. Cruz diligently returned to the equipment, the act a clear dismissal. + +Not much later, Cruz stood alone, the hollow echo of the bay a stark reminder of the isolation that power often wrought. With each checked box, their resolve steeled further, a silent vow to usher their team through the abyss—whatever it might hold—and emerge enshrined in the respect they so deeply craved. + +## Chapter 2 + +Sam Rivera sat alone in a cramped office, the hum of a dozen servers murmuring a digital lullaby in the background. Surrounded by the glow of multiple screens, their eyes danced across lines of code and intercepted comm signals from Dulce — a kaleidoscope of data that their curious and isolated mind hungered to decrypt. + +To an outsider, it might have looked like obsession, this fervent quest for answers. But to Sam, it was a dance — a give and take with the mysteries of the universe. Their fingers paused over the keyboard as they leaned back in the chair, whispering to thin air, "What secrets are you hiding from us?" + +The stillness of the room broke with the unexpected arrival of Alex Mercer, whose encroaching shadow loomed over Sam's workspace. The cybersecurity expert craned their neck upwards, met by the ever-so-slight furrow in Alex's brow. "Got a minute, Rivera?" + +"Always," Sam said, a smile surfacing as they swiveled to face their mentor more directly. _He has that look — like something's not sitting right with him,_ they noted inwardly. + +Alex hesitated, weighing his words carefully. "Our tech is top-tier, but the silence from Dulce... It's not just technology that will see us through, it's intuition and... trust." His gaze pierced through the digital haze, trying to instill something more profound than advice. + +Sam regarded Alex for a moment, the sincerity in his voice resonating with their own unspoken desire to prove their worth. "Intuition," they mirrored thoughtfully. "I guess sometimes the numbers don't have all the answers." + +Their shared silence held a newfound understanding, a recognition that between the ones and zeros, it was their combined human insights that might prevail against the impossible. As Alex turned to leave, Sam's eyes drifted back to the screens, now seeing them not as barriers to isolate behind, but as windows into the vast and enigmatic challenge that awaited their team. + +Outside the office, the persistent buzz of activity in the facility belied the unease that gripped its inhabitants. A restlessness that nibbled on the edges of reality, as though forewarning of the threshold they were soon to cross — from the known into the realm of cosmic secrets and silent threats. + +\* + +Shadows played against the walls of the cramped underground meeting room, where Alex Mercer stood gazing at the concealed elevator that would deliver them into the bowels of Dulce base. The air was thick, every breath laced with the weight of impending confrontation, the kind one feels when stepping into a legend. Though armed with an array of advanced weaponry and gear, there was an unshakeable sense that they were delving into a conflict where the physical might be of little consequence. + +"I know what you're thinking," Jordan Hayes remarked, approaching Mercer. Their voice was low, a blend of confidence and hidden apprehension. "This feels like more than a rescue or reconnaissance mission, doesn't it?" + +Alex turned, his features a mask of uneasy resolve. "It's like we're being pulled into someone else’s game. Not just observers or participants, but... pawns." + +Jordan gave a short nod, their analytical mind colliding with the uncertain dynamics of this operation. "I've felt that way since the briefing. Like there's a layer we’re not seeing. And yet, we have no choice but to play along." Their eyes locked with Alex's, silently exchanging a vow to remain vigilant. + +"You two need to cut the philosophical chatter. We have positions to secure," Taylor Cruz interjected sharply, stepping into their exchange. The authority in Taylor's voice brooked no argument; it was their way of pulling everyone back to the now. + +Alex's response was measured, more assertive than moments ago. "Acknowledged, Agent Cruz," he replied, his voice steadier, mirroring the transformation brewing within. He gripped his rifle with a newfound firmness. "Let's proceed." + +As they congregated at the elevator, a tension palpable, Sam Rivera piped in with a tone of balanced levity, "Hope everyone’s brought their good luck charms. Something tells me we’re going to need all the help we can get." + +Their laughter served as a brief respite from the gravity of their mission, a shared moment that reinforced their common humanity amidst the unknowable. Then, as one, they stepped into the elevator. The doors closed with a silent hiss, and they descended into the darkness together, aware that when they returned, if they returned, none of them would be the same. + +\* + +The sense of foreboding hung heavier than the darkness that the artificial lights of the elevator shaft failed to fully penetrate. The team was descending into the earth, carrying with them not only the weight of their equipment but also the silent pressure of the invisible war they were about to fight—a war that seemed to edge away from physicality and into the unnervingly psychological. + +As they descended, Dr. Jordan Hayes couldn't help but muse over the layers of data that could wait below, now almost longing for the comfort of empirical evidence. _To think that this reluctance to accept other possibilities may have been my biggest blind spot,_ Jordan contemplated, feeling the hard shell of skepticism begin to crack. + +Alex caught Jordan's reflective gaze and leaned in, his voice barely a murmur over the hum of the elevator. "Once we're down there, keep that analytical edge sharp. You see through the mazes of the unexplained better than anyone." + +The compliment was unexpected and weighed differently than praise from others. This was an acknowledgment from someone who stood on the front lines of the unknown with eyes wide open. "Thank you, Alex," Jordan said, the words carrying a trace of newfound assertiveness. "You can count on me." + +The exchange was cut short by a shudder that ran through the elevator, subtle, but enough to make them instinctively hold their breaths. It wasn't the mechanical stutter of old gears but a vibration that seemed to emanate from the very walls of the shaft—a whisper of something that defied natural explanation. + +Cruz was the first to react, all business despite the shadow that crossed their expression. "Systems check. Now," they barked out, masking the moment of disquiet with swift command. + +Every agent checked their gear, sending confirmation signals through their comms, creating a chorus of electronic beeps that promised readiness. But there was an unspoken question among them: was their technology, their weaponry, their protocols sufficient for what awaited them or merely a fragile comfort? + +Against the gravity of the silence that was once again closing in, Sam's voice crackled through, only half-jest. "I'd laugh if we run into Martians playing poker down there—just to lighten the mood, you know?" + +Despite—or perhaps because of—the oddity of the moment, this elicited a round of chuckles, an audible release of tension that ran counterpoint to the undercurrent of anxiety coursing through the team. + +As the elevator came to a halting, eerie calm at the sub-level, the group stepped off, finding themselves at the threshold of Dulce's mysterious halls. They stood in a tight pack, sharing a cautious glance before fanning out into the unknown, each one acutely aware that the truth was inevitably intertwined with danger. + +Into the depths of Dulce, the team advanced, their silence now a shared testament to the camaraderie born of facing the abyss together—and the steel resolve to uncover whatever horrors lay hidden in its shadows. + +\* + +The weight of the thick metal door closing behind them reverberated through the concrete hallway, marking the final threshold between the familiar world above and the strangeness that lay beneath. Dulce base, a name that had been whispered in the wind-blown deserts above and in the shadowed corners of conspiracy forums, now a tangible cold reality that they could touch — and that touched them back with a chill. + +Like lambs led to an altar of alien deities, so did Agents Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera proceed, their movements measured, their senses heightened. The air was still, almost respectful of the gravity of their presence. Their torch beams sliced through the darkness, uncovering steel doors with warnings that spoke of top secrets and mortal dangers. + +Taylor Cruz, stepping firmly into the role of de facto leader, set a brisk pace. "Eyes sharp, people. Comms check, every thirty seconds," Taylor ordered, their voice echoing slightly before being swallowed by the surrounding silence. + +Sam, fiddling with a handheld device aimed at detecting electronic anomalies, offered a murmured "Copy that," their usual buoyancy dimmed by the oppressive atmosphere. + +It was Jordan Hayes who paused at an innocuous looking panel, nondescript amongst the gauntlet of secured doorways. "Mercer, Rivera, come see this," Jordan’s voice was marked with a rare hint of urgency. + +Alex joined Jordan's side, examining the panel which, at a mere glance, seemed just another part of the base's infrastructure. Yet, to the trained eye, it appeared out of place—a facade. + +Jordan explained their reasoning as Sam approached, instinctively understanding the significance of what lay beneath, "This panel is a recent addition — covering something they didn't want found." + +Before Alex could respond, the soft whir of an approaching drone cut through their muffled exchange. Taylor had looped back upon hearing the commotion. "Explanations later. We can't afford to attract..." Cruz’s voice trailed off as the small airborne device came into view, its sensors locked onto the group. + +Sam was the first to react, their tech-savvy mind already steps ahead. "I've got this," they declared, fingers flying over the controls of their own gadgetry to ward off the impending threat. + +The drone lingered, its scan seeming more curious than hostile. But within moments, courtesy of Sam's interference, the little sentinel drifted away, retreating into the shadows as if accepting a silent truce. The crew exhaled, a moment of collective relief palpable in the air. + +Cruz squared their shoulders, clearly ruffled but not conceding any ground. "Move out," they directed, a hint more forceful than before. "And Rivera, keep that trick handy." + +The team pressed onward, the quiet now filled with the soft beeps of regular comms checks, their pace undeterred by the confrontation. Yet, every agent held a renewed sense of wariness, their trust in one another deepening with the knowledge that the base—its technology, its secrets—was alive in a way they hadn't fully anticipated. + +As they converged upon a central hub, the imposing doors to the mainframe room stood ajar — an invitation or a trap, neither option comforting. Without a word, they fortified their resolve and stepped through the threshold, where the dim glow of operational LED lights and the distant hum of machinery hinted at Dulce’s still-beating heart. + +Solemnly, yet unmistakably together, they moved deeper into the heart of the enigma, ready to unmask the lifeforce of Dulce base or confront whatever existential threat lay in wait. It was in that unwavering march towards the unknown that their destinies were forever cemented to the legacy of Operation: Dulce. + +## Chapter 3 + +The thrumming of monitors cast a stark contrast to the rigid silence enveloping the group. Agent Alex Mercer, unfailingly determined on paper, seemed dwarfed by the enormity of the sterile briefing room where Paranormal Military Squad's elite convened. With dulled eyes, he scanned the projectors outlining their impending odyssey into Operation: Dulce. + +\* + +The cooling vents hummed in a monotonous drone, but it was the crackle of the comms system coming to life that cut through the lab’s tension. Dr. Jordan Hayes hovered over a table arrayed with alien technology, their fingers delicately probing the enigmatic circuitry retrieved from the crash site. Agent Alex Mercer watched, admiration blooming in silent solidarity for Jordan's deft touch and unspoken drive. + +Jordan, always composed, only allowed the faintest furrow of concentration to mar their brow. "What we understand about physics..." they muttered, trailing off as they realigned a translucent component. The device emitted a low pulse, causing Jordan to still. "Could be fundamentally changed by this." + +A calculated risk—that's what this was. And for a person of science, a gamble was worth the potential paradigm shift. + +"I’ve been thinking," Alex started, his eyes still fixed on the immediately tangible mystery before them. "About what’s at stake here. Not the mission parameters, but what this means for us—humanity." + +Jordan glanced up, meeting his eyes just long enough to convey the shared enormity of their situation; the career-defining glory and existential dread entwined. "The quest for understanding always comes at a price. We're standing on the precipice of knowledge that could either elevate us or condemn us." + +The charged air between them spiked as Taylor Cruz’s brusque tones sliced through their reverie. "Hayes, Mercer, this isn't philosophy hour. Focus on the task. We need actionable intel, not daydreams." + +With a sound of restrained acknowledgment, Jordan returned their gaze to the device, while Alex clenched his jaw, the buzz of frustration dull against the backdrop of Taylor's authoritarian certainty. It was this competitive undercurrent that kept him alert, the sense that his and Jordan's shared commitment to discovery was an unspoken rebellion against Cruz's narrowing vision of control and order. + +Then Taylor did something unexpected. They paused beside Jordan and, for a moment, observed the device with something akin to reverence. “If this tech can be understood..." Taylor said, their voice quieter, "It could change the game for us. For all of us.” + +The underlying dismissal earlier seemed to falter, replaced by a glimpse of reluctant respect for the gravity of what lay in their hands. Jordan looked up, and for a fleeting heartbeat, their eyes locked with Taylor's, a wordless clash of wills softening into an uneasy truce. + +It was a small transformation, barely perceptible, but one that Alex noted with an inward nod. They had all been brought here by different paths and for different reasons. Yet, beneath the veneer of duty, the enticement of the vast unknown pulled them inexorably together, coalescing their distinct desires into a shared pulse of anticipation. + +Marshaled back to the moment by the blink of lights and whir of machinery, they refocused their efforts, each movement sharpened by the knowledge that beyond understanding the unearthly artifacts, they might be piecing together the future of their species. + +\* + +Amidst the sterility of the briefing room, the liminal space between the facts laid out and the hidden truths, sat Sam Rivera, his demeanor an artful balance of focus and a casual disguise of his razor-sharp talent with technology. Across from him, Alex Mercer lingered in thought, the mental cogs turning as each file on Dulce stirred more than curiosity—it beckoned to a past both honored and burdensome. + +"You've been quiet, Sam," Alex noted, catching the younger man's contemplative gaze. "Your take on these signal inconsistencies?" + +There was a respect in Alex's tone, though a respectful distance remained—a gulf of experience and a hint of protective mentorship that stood between them. Sam nodded, recognizing the space afforded to him, and he couldn't help but feel the weight of expectation pressing upon his shoulders. It wasn't just the mission that was immense, it was the trust being placed in him. + +"The patterns are... off," Sam admitted, hesitant but driven. "If I'm right, what we're looking at isn't random—it's a structured anomaly. We need to be ready for anything." + +Alex's eyes brightened with a subtle approval that crossed the distance like a silent nod. "Good. Keen eyes will keep us ahead—or at least not blindsided," he said, affirming the belief that inscribed Sam's role as more than the tech personnel—he was to be a guiding intellect in the heart of uncertainty. + +Their exchange was cut short by Taylor Cruz's abrupt arrival, his gait brimming with a robust confidence that veiled the sharp undercurrents of his striving nature. "Time to gear up. Dulce waits for no one," Taylor announced, his voice carrying an iron resolve that knew the costs of hesitation—though whether the cost was calculated in human or career terms was an ambiguity he wore like a badge of honor. + +As Sam and Alex nodded in unison, the icy chasm of hierarchy and cryptic protocols seemed momentarily to bridge over with an understanding—this mission was convergence, a nexus point that would challenge each of their motives and strength. + +They filed out of the briefing room, their footsteps synchronized, a rhythm that spoke volumes of the unknown cadence they would soon march to within the base's veins. For Alex Mercer, the link with Sam Rivera, though distant, was now poised with a mutuality ready to be tested; for Taylor Cruz, the initiative pulsed like a heartbeat, anticipation thinly veiled behind a mask of duty. + +In the midst of the descent, they were each alone yet irrevocably joined, stepping closer towards the volatile embrace of Operation: Dulce. + +## Chapter 4 + +The corridors of the Dulce military base were as silent as a tomb and twice as chilling. Alex Mercer walked with a surety that belied his bubbling undercurrents of doubt. The briefing had been definitive, sturdy pillars of facts and protocols, yet as he ventured deeper, the ominous atmosphere gnawed at him—a stark reminder of how much remained unknown. + +Jordan Hayes trailed a few steps behind, their detached exterior breaking for a moment as they caught up to Alex. "What's on your mind?" Jordan asked, their astuteness cutting through the unspoken tension. + +Alex glanced back at them. This place was a puzzle, a treacherous labyrinth where the walls whispered secrets, and among them, he sensed a call to question, to challenge the narrative they'd been sold. "The silence here... It's almost as if the base is waiting for something—or someone." + +"Just stay sharp, Mercer," Jordan cautioned, yet their eyes lingered on the quietude around them, conceiving the same shadow of doubt that unsettled Alex. + +Before they could delve into further discussion, the distinctive click of a safety catch echoed in the hollow space. Both agents turned to find Taylor Cruz standing resolute, primed for combat. Taylor's gaze was scrutinizing and cold, a stark contrast to the growing unease that smoldered silently amongst the rest. + +"Chatter is a liability," Taylor snapped, with a commanding flair that bordered on tyrannical. "We move forward, eyes open, mouths shut." + +Alex felt the tight grip of compliance strangle his gut, a lesson learned under the hard tutelage of rank and order. But here, in the bowels of Dulce, those instincts began to wane, the imperative to adhere now conflicting with the pressing urgency to confront the shadows they were enmeshed in. + +Then, unexpectedly, the lights flickered, a power fluctuation—or a sign? Alex's hand instinctively went to his sidearm, his mindset shifting from soldier to skeptic. The base, with its unyielding coldness, had just given them their first nudge into the realm of the speculative, an invitation to peel back the veneer of reality. + +"We should consider all possibilities," Alex murmured, more to himself than the others, his voice a barely audible breath against the sterile air of the complex. + +Taylor's posture stiffened at the challenge, yet their response was uncharacteristically reserved, notable in its lack of rebuke. "Agreed. For now, keep moving. But stay vigilant." + +A surprise—an echo of agreement from the last person Alex expected it from. And there it was, the glimpse of a wrinkle in the unyielding fabric of command, a hint that perhaps they were all starting to sense the strangeness that permeated this place. + +Progressing with determined steps, the trio moved deeper, silently acknowledging the evolution of their predicament. It was a small yet transformative concession to the unknown forces at play, an acknowledgment from each agent that, despite their disparate goals and ideals, the true nature of the Dulce base was an enigma that would forge new paths through their convictions. + +As they reached the central communications hub, the truth that awaited them lurked in the shadows, its eyes unseen but felt by all. The walls didn't just whisper now; they spoke in tones only the brave—or the foolish—would dare to listen to. + +\* + +The subterranean silence of Dulce was an oppressive entity of its own, wrapping the team in a cloak of uneasiness as they pressed on through the dimly lit corridor. Jordan Hayes found themselves contemplating the ramifications of each step taken into this suspended world, where the sterile air seemed to mock the gravity of their predicament. The closer they got to the communication hub, the more Jordan's mind wandered toward the realm of the inexplicable. + +Beside Jordan, Alex Mercer moved forward with deliberation, his gaze scanning the heavy utility doors they passed—one of which was partially ajar, beckoning them with its darkness. "After you, Dr. Hayes," Alex said, gesturing toward the mysterious opening. A hint of shared understanding passed between them; knowledge was the guiding star of this mission as much as confrontation or recovery. + +Jordan peered inside, the beam from their flashlight slicing through the obscurity. The room beyond was a chaotic cascade of papers, overturned furniture, and the particular kind of disorder born from hasty evacuation—or something far more sinister. + +"It's like they vanished in the middle of something urgent," Alex murmured, his voice tight with a mix of concern and anticipation. He began to sift through the scattered reports, each page a potential clue to the enigmatic silence that shrouded Dulce. + +Behind them, Taylor watched with a disciplined patience, their authority the foundation upon which the operation was built. Their voice cut into the stillness, a reminder of their presence, "Time is not our ally here." + +Drawing back from momentary distraction, Jordan acknowledged the wisdom in Taylor's words, yet could feel the shift in their stance—from skeptical, reserved analyst, to a proactive agent within the narrative. "You're right; these documents may hold critical insights. Let's collect what we can and analyze them properly." + +From the darkened hollows of the room, shadows seemed to cast subtle judgment as Alex and Jordan worked together with heightened urgency. Taylor, for once, didn't intervene but instead surveyed the entrance, their mind anticipating the unknown variables that lay ahead. + +Unexpectedly, a soft hiss emanated from a neglected terminal on the desk. Jordan's head snapped up, their heart rate accelerating at the potential ramifications. Without a word, they moved to the machine, hands driven by the newfound conviction that knowledge was more than power—it was survival. + +As Jordan began to extract what data they could from the terminal, the first comprehensible communication from the depths of Dulce in far too long crackled through: an automated distress marker, looping endlessly without further context. It was a revelation, one that reverberated through the group, confirming their fears and igniting an even greater need to press on. + +Watching Jordan's dogged determination, Alex witnessed the minor transformation in his colleague unfold—a shift from doubt to action, a sliver of belief in the possibilities beyond their rational understanding. This forge of resolve amidst the alien echoes of Dulce not only bonded them closer as a team but compelled them forward with a sharpened edge of responsibility to the truth, wherever it would lead. + +As they collected their findings and regrouped, the base around them imperceptibly changed, the air charged with the vibration of secrets poised on the brink of revelation. And in that charged silence, the group moved on, each now carrying pieces of a puzzle that would soon converge into a picture of galactic significance. + +\* + +In the chill of the cramped server room, the hum of machinery was the backbone to a symphony of data streams coursing through the air. Dr. Jordan Hayes, nerves alight with the mission's mounting unknowns, patched into the last known coordinates of the unsent distress broadcast they had uncovered. They were so close to the core now – to the truth behind the blackout – it was almost tangible. + +Beside them stood Agent Alex Mercer, ever the soldier, yet with eyes that betrayed an intellect craving to understand the murk beneath the surface. "Any progress, Dr. Hayes?" Alex queried, his voice betraying a subtle urgency. + +"Getting there," Jordan replied, fingers dancing across the keyboard. "Whoever sent this was cut off mid-transmission. It's as if Dulce itself swallowed the message whole." + +Taylor Cruz closed in, their frame casting a long shadow over the duo, evoking an almost palpable wall between them and the forward momentum of their mission. "Time is against us," Taylor intoned, more statement than threat. "What we uncover here determines our next course of action." + +Alex acknowledged Taylor with a brisk nod, his stance firm. Yet inwardly, the tightening grip he felt from Taylor's words couldn't throttle the swell of his own investigative instinct. His soldier's obedience had begun to war with the advocate's zeal for unveiling the dark heart of Dulce's secrets. + +And then, the unexpected occurred. The screens flashed in unison, spilling a discordant stream of symbols and images that defied immediate analysis. Jordan's breath caught – this was the response they had been fishing for, an alien communication protocol resonating just at the edge of human comprehension. + +Each member of the team felt it: a shift in the room’s very atmosphere, like a veil being drawn from their perception. Alex and Jordan stood still, absorbed in the bewilderment of contact, while Taylor, despite their authority, hesitated – a minor betrayal that unease was creeping into even their disciplined heart. + +"Thoughts, Rivera?" Taylor rallied, seeking the counsel of Sam Rivera, whose eyes were wide with exhilaration. + +Sam stepped forward, breaking the spell of stillness. "It's like nothing I've ever seen before, but I think I can bridge our systems to communicate," they declared, a wisp of optimism braiding their voice. They set about adapting their gear to transmute the foreign signals into something the team could dissect, their actions a testament to the mentorship and belief instilled in them by Mercer and the team. + +Taylor observed them, a cold calculation behind their facade, as they weighed the worth of this anomaly. It was a crossroad that potentially led to either monumental breakthrough or unprecedented catastrophe. "Once you've established a line, document everything. We can't afford to miss any detail," Taylor ordered, the words sharper than intended. + +The connection was made, and with trembling anticipation, the team listened as the first garbled outputs began to emerge, their very essence promising insights that could alter the course of history. It was an enigmatic dance with the unknown, the pulse of Dulce no longer just a place, but a herald to an alien register the team had yet to decipher. + +Together, they stood at the precipice of understanding, where the faint glow of their monitors cast more than just light – it cast the shadow of burgeoning transformation. It was in this moment, in the grasp of an extraterrestrial tongue, that the team, bound by a hunger for knowledge and the raw edge of survival, found their mission reframed from a search for answers to the articulation of a question humankind had yet to fully ask. + +Silent in their commune with the inexplicable frequency, they realized they were not merely investigators; they had become liaisons on behalf of Earth, interpreters of a cosmic message that could redefine their very existence. The implications loomed large, but now, they would not face them alone – they would face them as a united front, wrought together by the very mysteries that once drove them apart. + +## Chapter 5 + +Dr. Jordan Hayes clutched the edge of the briefing room table, their fingers white-knuckled against the laminate surface, as an array of constellations rotated on the projector—charts and graphs bleeding across the stars. In the dim room, nebulas and dark matter seemed within arm's reach, tangible yet unfathomable. + +Sam Rivera leaned back against the wall, arms crossed, gaze darting between the swirling cosmos and the faces of their companions. A taut line of concentration etched their young features, a mingling of fervent curiosity with the nascent understanding of the high stakes for which they played. + +Jordan's voice broke the profound silence. "The patterns in the signal disruptions sync with none other than zenithal star alignments. It's as if... as if these 'meet and greets' were scheduled, predestined by celestial mechanics." + +The statement hung heavy, daring the occupants of the room to unravel its implications. Alex Mercer, his prior military resolve momentarily suspended, absorbed the hypothesis with a visible hunger. "It's like we're adhering to an appointment we never knew we had," he murmured, his heart a drumbeat in his chest. + +Taylor Cruz snorted—a sound that clattered against the high concepts like a tumbledown shack in a futurist cityscape. Folding their arms, they glanced between the agents, their apprehension clad in the contempt of practicality. "What we need are facts, not mystic conjecture." + +Alex pivoted on his heel, facing Taylor squarely, and his voice found its edge of steel. "This isn't mysticism, Cruz. It's a hypothesis based on observed phenomena as unpredictable as the place we're standing in." + +Taylor's gaze never wavered, yet the slight twitch at the corner of their mouth belied their taut composure. "If there's a semblance of truth to it, then it's critical intel. But remember, we're not astrologers—we're soldiers and scientists." + +Jordan met Taylor’s gaze with a curt nod, accepting the caution even as the crucible of their intellect smoldered with the fervor of cosmic discovery. Their eyes flicked to Sam, whose steady presence and ready tech affirmed a burgeoning dynamic—the makings of a sentinel, standing guard over the threshold of human understanding and cosmic reality. + +With the projector casting pallid light over their features, each agent became a silhouette of purpose, shadows pillared against the backdrop of an endless universe. The story they were embroiled in would soon demand they plunge into darkness to retrieve the light of knowledge—a light that could very well redraw the shape of their world. + +They left the briefing room with a shared silence, each pondering the vast weave of celestial intent and terrestrial response, sensing that the galactic appointment to which they'd unwittingly RSVP’d was more insistent—and more threatening—than any operation they’d faced before. + +\* + +As the Paranormal Military Squad team convened in the heart of the Dulce military complex, an air of bristling expectation clung to the walls of the underground sanctum. Alex Mercer’s brow furrowed while watching his companions—Jordan Hayes, diligently setting up their makeshift lab station, and Sam Rivera meticulously checking the communication relays they had restored. Taylor Cruz observed with hawk-like focus, yet to betray the strain that their command posed on them. + +The gravity of the mission had shifted, deepened; each member of the team felt its pull, tethered to the understanding that they were now part of a larger narrative—a cosmic play with Earth as a stage and the human race unwitting actors. + +Jordan paused, a tension creeping across their shoulders as they aligned the satellite data with the alien message that had been decoded. "The instructions in this message," Jordan started, the timbre of their voice betraying their usual composure. "They're coordinates and... a warning." + +Sam leaned in, their eyes widening behind the glow of their laptop screen. "A warning? Like, ‘stay away from’, or ‘beware of’...?" Their words trailed off, uncertainty a new companion in their lexicon. + +Alex exhaled slowly, his mind racing to connect the dots. "It doesn't matter which," he said, decisive yet contemplative. "What matters is we understand intent. Are we being warned out of concern, or are we stumbling upon a threat?" + +Cruz’s iron-clad facade momentarily cracked, a fleeting glimpse of vulnerability flashing through their eyes. "We need to know if this entails additional risk to the operation," they said, directing their gaze specifically at Alex. "Mercer, I rely on you to keep the team grounded. No one goes off-course." + +Their reminder seemed both a command and a plea—rooted in an understanding that each member of the team now faced the duality of their roles, protectors of earthly secrets and heralds of potentially devastating revelations. + +Sam's fingers stilled mid-type, their task forgotten as they absorbed the weight of the unfolding reality. "We're the first line of defense... or detection," they mused half to themselves, a growing sense of agency within the larger play they were cast into. + +Jordan returned to the data, more resolute in their actions. The warning, whether cautionary or dire, was a beacon they no longer could ignore; its light casting aside shadows of doubt and igniting a collective purpose within the team. + +Alex watched Jordan and Sam, feeling a brotherhood in their shared quest. As Cruz paced, poised on the cusp of decisions that would mark their career and perhaps the fate of many, Alex knew the narrative had changed. They were no longer mere operatives; they had become guardians of a threshold, keepers of a message from a realm beyond stars and stripes. This elevation in their mission could not be shackled by regulations and established protocols—it demanded a new perspective, a new resolve. + +Tension threaded through the dialogue of beeps and static as communications with Washington buzzed in the background. The team stood, a portentous air enveloping them. It was clear that the decisions they made in the ensuing hours could redefine humanity's place in the cosmos or condemn them to ignorance and potential peril. + +Their connection to the stars solidified, the group moved to address the crystallizing warning, shifting from passive recipients to active participants. Mercer’s latter instincts gained precedence— the team’s mandate had evolved, no longer solely to observe and report but to interact and prepare. A metamorphosis had begun, and Operation: Dulce hummed with the newfound frequency of their daring, a tone set not by the earthly hierarchies but by the pulsing symphony of the universe itself. + +\* + +The desert night loomed eerily still as echoes of hidden activity reverberated deep beneath the bleak sands of New Mexico. Diverting his gaze from the array of sensors before him, Jordan Hayes allowed a rare breath, deep and anxious. Turning to Alex Mercer's focused silhouette, the nocturnal landscape illuminated softly by makeshift floodlights, Jordan felt the syncopated tempo of apprehension and exhilaration jockey for primacy within. + +"The closer we get to unlocking these messages, the more I feel like we're peeling back layers of reality itself," Jordan confided, eyes not leaving the monitors that presented a constellation of data points. + +"Yes," Alex replied, his voice steady as he considered the implications of their discovery. "And we have to be ready for whatever we find beneath those layers. Whether it's a breakthrough or a Pandora's Box." + +Silence settled between them, broken only by the occasional buzz of communications equipment attempting to bridge terrestrial and extraterrestrial intelligences. Tense moments drifted by, laden with the expectant weight of near breakthrough, when a soft chime signaled an incoming transmission -- a rare sound that set every agent on high alert. + +Absent was the voice of Washington or Paranormal Military Squad command. Instead, a rhythmic series of pulses and tones filled the air, deliberately patterned, unmistakably non-human. + +Sam Rivera adjusted the sensitivity of the decoding equipment, their hands shaking with anticipation as much as focus. "I have it!" they announced, the signal transforming under their expertise into a sequence of visual symbols on the screen before them. + +Their shared excitement was palpable, a kinetic force resonating between the team members as they crowded around the display. + +"What does it say?" Taylor Cruz demanded, the urgency in his tone scraping against the newfound wonderment. + +Interpreting the alien syntax required not only decoding but intuition and empathy. The words that emerged upon the screen were at once coherent and enigmatic: "*Voyage. Convergence. Peril.*" + +The stark simplicity of the message struck them collectively, a chill breeze wafting through their resolve. + +Alex stepped forward, piecing together the cryptic communication with a growing sense of obligation. "It’s a call to action," he deduced, "or possibly a summons." + +Jordan's gaze met Alex’s, both understanding that this was no longer an investigation or mere extraction of hidden truths. This was humanity's unwitting enlistment into a galactic dialogue that defied boundaries of nation, creed, or protocol. + +Sam's eyes were aglow, not with fear, but with the profound acceptance of inevitability that comes with groundbreaking revelation. Moreover, within Taylor's stern exterior churned the seed of reluctant admiration for the unclassified, the uncharted realms they were approaching. + +Together, they accepted the pivot in their mission, readjusting their objectives from exploration to engagement, and from isolation to a communal outreach beyond the stars. As dawn's first light threatened the horizon, it became clear that they were no longer merely operatives of a clandestine governmental faction—they were delegates on behalf of Earth, embarking on a voyage orchestrated by destinies unrelated to the mere geopolitics of their world. + +Turning to each other, their silhouettes sketched against the coming dawn, the agents recognized the transformation within and amongst them. They were bound by more than duty—they were intricately woven into the fabric of an unfolding cosmic opera, one in which they had been granted an undeniable role. And as they set course for the coordinates that beckoned them like a distant siren's call, it was with a solemn dedication to not only uncover the mysteries ahead but to navigate the convergence, and the peril, as unified emissaries of a world on the cusp of a broader understanding. + +\* + +Beneath the hum of the fluorescent lights and the vigilance of silent monitors, Alex Mercer stood with his team in the threshold of the base's command center, their faces etched with the fatigue of hours spent unraveling galactic mysteries. Jordan Hayes broke the stillness with a delicate fusion of disbelief and resolve. "The signal..." they began, their tone deliberate, "it’s evolving. It’s not just sending a message—it’s responding to us." + +Taylor Cruz leaned over the console, their eyes narrowing with intrigue and a flicker of unease, studying the alternating patterns on the screen. "Responding? Like it’s alive?" Taylor asked, a question that bordered on the edge of wonder and alarm. + +Sam Rivera’s gaze was locked onto their interface, a digital orchestra at their fingertips. "It could be some form of advanced AI. Or something else entirely," they contributed, a note of exhilaration betraying the gravity of the situation. + +Alex paced before the terminal, absorbing the enormity of their predicament. Their mission—once rooted in the solid ground of military discipline and covert operations—had transcended into an encounter of unprecedented import. "We need to be cautious," he advised, his voice a low rumble of cautious strategy. "If this signal is intelligent, how we interact with it could dictate the outcome of this entire operation." + +Jordan met Alex's gaze with a nod, the weight of the responsibility shared and accepted. "We have protocols for first contact, but nothing for... this," Jordan admitted. The room was gripped with tension, each breath seemingly louder than the last. + +Then, with a sudden burst that filled the command center, the signal coalesced into a clear and distinct pattern which replicated and expanded, its complexity revealing the hand—or mind—of an intelligent architect. + +Taylor's instinct for command surged forth. "Prepare to record and analyze. Whatever it is, we need to understand it—" But their words were cut short as the signal surged, enveloping the room in a brief, blinding cascade of light. + +In that pulse of brilliance, a shared revelation coursed through the team. The signal had become a bridge, an extension of unknown consciousness reaching towards them, testing, communicating, searching. + +Alex stepped back from the light, feeling a profound change unravelling within him. The path forward would not be one of confrontation or conquest, but of connection and comprehension. + +Jordan turned to Alex and Taylor, seeing in their faces a reflection of the same metamorphosis taking place within themselves—a movement from observers to participants, from agents to ambassadors. + +With a collective breath, the team faced the kaleidoscope of lights. The alien signal, once a harbinger of enigma, was now a catalyst for transformation—a symphony of light and sound that echoed the beginnings of a new relationship between humanity and the alien unknown. + +And so, with deliberate steps, Alex Mercer led his team into the luminous fray. Science, protocol, and survival instinct harmonized within them, each member poised on the cusp of a new chapter in human history. + +They were no longer merely the instruments of Paranormal Military Squad's will—they were the vanguard of humankind’s first definitive leap into the cosmic community. + +With the last echoes of the signal resonating in the control room, they each embraced the sequencing of the transmission, the dance of extraterrestrial light that now wrote itself into their story. The chapter of Operation: Dulce drew to a close, but the narrative of their destiny had only just begun. + +## Chapter 6 + +\* + +The cool darkness of the command center at Dulce base was a stark contrast to the brewing storm outside, where the unforgiving New Mexico desert winds whispered of the hidden truths that lay buried deep beneath its surface. Dr. Jordan Hayes sat, their eyes fixed on the readout, the frenetic dance of symbols and numbers reflecting off their determined face. They were on the cusp of an epiphany, teetering between the widely accepted laws of physics and the promise of a new cosmic paradigm. + +Alex Mercer watched from across the room, noting the subtle shifts in Jordan’s posture that belied a developing readiness to embrace the unbelievable. “Find something?” Alex’s question, asked with a blend of curiosity and solidarity, bridged the gap between a command and a genuine query among equals. + +Jordan's response was slow, measured against the magnitude of their analysis. “This isn’t random static. It’s a pattern - a repeated sequence phasing in and out but distinctly artificial.” Jordan turned away from the screen, locking eyes with Alex. “This could change everything.” + +Sam Rivera leaned in, their eyes alight with the fires of revelation and a quenchless thirst for understanding. “A pattern means intention. Could it be a message?” + +A figure emerged from the doorway, casting a long shadow into the room - Taylor Cruz. “Intentions can be friendly, or hostile. We shouldn’t forget that,” said Taylor, bringing a dose of their usual pragmatism into the heart of discovery. + +Alex acknowledged Taylor’s caution with a nod, understanding the need to keep their feet grounded even as their spirits soared toward the unknown. “Then let’s be the first to find out which it is." + +The team gathered around the monitors, the soft tapping of Jordan's keystrokes now punctuated by the occasional crackle of Sam's radio equipment. The sound was almost ritualistic, a prelude to humanity’s potential first, knowing foray into a larger universe. + +Jordan’s fingers paused, suspended in mid-air. The signal had evolved, becoming a beacon that somehow felt less alien and more familiar. It was as if the complexities of their message were unfolding into something more accessible, more terrestrial. + +A hushed excitement swept through the room. The transformation suggested an awareness on the part of the unknown senders; a finesse that spoke volumes about their capabilities and perhaps their intentions. + +With the growing realization that they were engaging with an intelligence far exceeding their previous understanding, the team prepared to reach back across the cosmic divide. Prepared or not, they were no longer bystanders in this galactic narrative. They were active correspondents in an exchange that transcended galaxies and welcomed them into an expansive, possibly fraught, interstellar conversation. + +\* + +Inside the cavernous central hub of Dulce military base, Dr. Jordan Hayes stood in near-darkness, surrounded by a nest of cables and monitors that buzzed with silent, cryptic life. Jordan's eyes narrowed to focus on the sequences that danced across the screen—patterns that could unravel the cosmic enigma surrounding them. + +Alex Mercer approached with his characteristic stride, a signal of reliability in the chaos. "Status report, Dr. Hayes?" he inquired, his voice low, almost blending into the soundscape of beeping consoles and swirling fans. + +"We're on the brink of unravelling the signal's origin," Jordan replied, the weight of implications heavy in their tone. "There's intelligence behind it, a thought process alien to our own." + +As if summoned by their analysis, Taylor Cruz approached with authority radiating from every pore. "Understand this, we need to know if it's friend or foe. Don't get wrapped up in the existential—our lives may depend on the answers you provide." + +Sam Rivera, their hands adroitly adjusting a device to fine-tune the signal, chimed in with optimism undercut by anxious anticipation. "We're deciphering the comm encryption. Soon, we'll have a channel open—not just listening in, but speaking back." + +Alex nodded his understanding, his strategic mind processing the tactical implications while grappling with the more profound humanistic impact. "When we do, we'll tread carefully, communicate with purpose," he reassured the team. + +The operation had evolved rapidly, from a stealthy incursion into a clandestine labyrinth to an exchange with an extraterrestrial intellect. Their earlier trepidation transformed into determined focus, as they prepared to extend humanity’s hand into the vast unknown. + +An alert on one of the monitor stations snapped the team into alarm. The signal had not simply been waiting—it had been calculating. Now, it reached its crescendo, demanding their attention with a provocative urgency. + +Jordan's fingers raced over the keyboard, their eyes simultaneously interpreting data and sharing directives. "It’s a linguistic lock, a test of comprehension. We crack this, we establish dialogue." + +Taylor's presence was a beacon of steely resolve. "Then let’s solve it. This is what we trained for—the unknown." + +Alex and Sam exchanged a look that telegraphed their shared determination—this was not only the mission they had trained for; it was the mission they had been destined for. + +Together, the Paranormal Military Squad team leaned into the challenge, their minds honing in on the complex patterns with a singular goal: to unlock the conversation with an intelligence that had already begun to shift the foundations of what they knew, or thought they knew, about the universe. + +In a symphony of clicks and murmurs, they worked, knowing they were about to make a giant leap not just for themselves or Paranormal Military Squad, but for all of humanity. As the final pieces fell into place, Dulce's militaristic silence was shattered by the sound of intergalactic contact—by the sound of history being made. + +## Chapter 7 + +In the enclosed space of Dulce’s command center, the air was thick with anticipation, each team member poised to tread the razor's edge between scientific breakthrough and galactic peril. Dr. Jordan Hayes focused intently on the screen, their fingers tapping a staccato rhythm against the keyboard as lines of alien code cascaded down the monitor. + +Alex Mercer's steely gaze surveyed the room, stopping on each member of his team. "Thoughts?" he asked, echoing the unspoken tension. His question, while directed at the group, lingered on Jordan—acknowledging their expertise and inviting collaboration rather than dictating orders. + +Jordan’s brow furrowed, an indicator of the mental gymnastics being performed. "It's unprecedented," they finally said, their voice a testament to the gravity of the moment. "Behavioral algorithms... if we're right, this code could reveal extraterrestrial thought patterns." + +Before anyone could react, Taylor Cruz interjected with the assertiveness of someone accustomed to commandeering the discourse. "Then let’s ensure we’re deciphering it correctly," Taylor stated, their tone suggesting they were still battling to maintain control over an increasingly alien situation. + +Sam Rivera hovered near the mainframe, youthful energy barely contained under the surface. "What if it’s more than just a message? What if they’re trying to extend consciousness across the stars?" + +The room fell into a contemplative silence, broken only by the hum of electronic equipment and the distant thud of secured doors locking in rhythm. The weight of responsibility rested on each agent's shoulders—a heaviness palpable in the air they shared. + +Alex stepped forward, reaching a subtle decision, one dictated by foresight and the humanity nestled at the core of their mission. "We approach with the aim to understand, not to confront," he said, softening his military bearing into a more diplomatic stance. + +Jordan nodded, appreciating the leadership that Alex displayed in the face of the unknown, and turned back to the cryptic data. Here, before them all, was a tangible piece of evidence—proof of an extraterrestrial sentience that had outreached the bounds of their expectations. + +Taylor took a breath, simultaneously exuding a sense of preparedness and venturing into the unknown alongside their peers. "Then let’s do what Paranormal Military Squad does best—investigate and adapt," Taylor added, finding comfort in the familiar even as they stood on the cusp of an unprecedented alchemy of science and mystery. + +The team leaned into their respective roles, driven by the urgency of the assignment and the pull of an insatiable curiosity. Sam offered a grin that belied the tension, a youthfulness that reminded them all of the profound excitement nested within the terror of the unknown. + +Quietly but resolutely, they turned back to their instruments, each of them a sentinel on the threshold of a new reality. The once implicit lines of command were now woven into a shared tapestry of hierarchy and camaraderie. As they danced with the unknown, they were beacons of sentient endeavor, casting the light of human consciousness into the vast darkness that called to them. + +\* + +\* + +Dulce Base's cavernous darkness was pierced by the sharp luminescence of monitors, casting an electric glow onto the faces of those who dared to unearth its secrets. Dr. Jordan Hayes stood motionless, eyes glazed in concentration, their mind a nexus where terrestrial science battled with celestial unknowns. + +Alex Mercer watched from a slight distance, the weight of command tangible upon his shoulders, though lightened by the shared burden now held amongst them. "We could be on the frontier of a new kind of diplomacy," he mused aloud, giving voice to the moment's gravity. + +At those words, Jordan's trance broke. "If that's the case, then these communications," Jordan motioned to the stream of data, "are our olive branch across the cosmos." + +Taylor Cruz, who paced with restless energy, halted and faced the team—his stoicism marred by the erratic dance of lights reflected in his eyes. "An olive branch, or an invitation to a battlefield?" he posed, ever the strategist, his words laced with a hint of cynicism. + +Sam Rivera, nestled amongst an array of equipment, licked their lips—a mixture of nerves and anticipation palpable. "We're mapping out something incredible here. Whether it's peace or war, we're the cartographers." + +Silence enveloped them like the expanse of space itself, each member contemplating the chasms they might bridge—or the abysses into which they might unwittingly descend. + +Alex's demeanor assumed a quiet resolve—the profound knowledge that this mission was as much about navigating uncharted philosophical territories as it was about ensuring survival. "Whichever it proves to be, we'll face it. Prepared, unified." + +A nod passed between Jordan and Alex, a silent exchange of mutual respect and shared mission. Sam, buoyed by the weighty encounters of the mind and machinery, entered keystrokes with a fervor that seemed to bring them ever closer to the alien mind. + +They stood there, the Paranormal Military Squad team, not just as guardians of homeworld secrets or as soldiers of clandestine wars, but as humankind's chosen few at the fulcrum of history—a history that was now unfolding to the rhythm of otherworldly codes. + +Each revelation, each parsed symbol, inched them toward the line between the earthly and otherworldly. And as they stood on this precipice of cosmic negotiations, it was clear the ensuing dialogue would not just shape the future of Paranormal Military Squad—it could very well redefine the parameters of human existence. + +\* + +The hum of advanced computational systems tingling with cryptic transmissions framed the ambiance of Dulce's mainframe chamber. Jordan Hayes, fingers hovering over a console dense with blinking lights, furrowed their brow as sequences of alien data streamed across the screen. + +Alex materialized behind them, his presence a stable beacon amidst the technological whirlwind. "Look for patterns, anomalies. Anything that might resemble a handshake protocol in their communications," he directed, his voice a low thrum, reverberating with cautious optimism. + +Jordan cast a glance over their shoulder, acknowledging Alex's contribution with the shared understanding of colleagues who had transcended mere professional acquaintance. "I’m isolating sequences that seem to recur with more intention than static. If these are their ‘handshakes,’ then we might just be making first contact," they remarked, their focus returning to the screen with renewed vigor. + +From the other end of the room, where shadows married the artificial light, Sam's voice crackled through the static of nearby speakers, "Don't forget the anomalies we detected earlier. Each one could be a word, a sentence, or even a concept untranslatable to our current understandings." + +Resolute, Taylor Cruz stood at Jordan's other side, a stoic figure wrestling with the implications of their mission. "Keep pursuing this line," Taylor instructed, an undercurrent of intensity carried forth in their otherwise composed demeanor. "And remember, this isn't just about making contact; it's about securing knowledge for humanity." + +Alex offered a nod that spoke volumes, conveying his understanding of the stakes at play. Here, in this chamber of possibility, the team's actions would determine if humanity stood at the brink of a new age of understanding or the onset of an unprecedented threat. + +Every second thrummed with significance as Jordan and Sam worked in tandem, each keystroke a foray into the unknown. Taylor observed with a commander's scrutiny, the gravity of their role sustaining them against the waves of ambiguity breaking against their resolve. + +Pivotal moments come rarely in the course of human events but here, amidst the electronic symphony of a stalwart command center, lay the incepting notes of a cosmic overture. The harmony between human and alien, between Paranormal Military Squad and the vast reaches of space, began its first tentative measures, with each member of the team a vital instrument in a celestial ensemble yet to be fully heard. + +\* + +The crisp air within the mainframe room of Dulce base seemed to hum with unspoken possibilities. Jordan Hayes was the centerpiece of focus, their hands dancing methodically over the console as streams of otherworldly code cascaded down monitors, each flicker a potential key to the cosmic doors they were inching open. + +Alex Mercer watched, posture relaxed but eyes sharp. "Remember, this could be our first introduction, maybe even our first impression," he said, mindful of the gravity carried by each action they made henceforth. + +A hint of a smile touched Jordan's face, a small acknowledgment of the monumental task at hand. "Understood. I'm balancing the signal's syntax with our algorithms. If we're interpreting this correctly, it could be... well, an invitation." + +Into the electric tension of the chamber walked Taylor Cruz, their silhouette a sharp contrast against the cool lighting, radiating a presence that spoke of command and chilly tenacity. "An invitation, or a challenge?” Taylor questioned, the weight of their suspicion casting a different tint on the cascading data. + +Sam Rivera, in a corner arrayed with sophisticated equipment, piped up, their voice a buoyant note amidst the tentative atmosphere. "Either way, it's a connection. One that we're uniquely positioned to navigate," they remarked with an air of optimism threading through the uncertainty. + +Alex channeled the strengths of his team into the core of their approach, his leadership adapting to the contours of an unprecedented scenario. "Cautious and curious," he reflected aloud, shaping a strategy that balanced their thirst for comprehension with the prudence required in addressing the unknown. + +Jordan, hands momentarily at rest, looked up. The signal was more than a sequence of bits and commands—it was a riddle wrapped in the depths of space-time, and they were on the cusp of parsing its meaning. + +Taylor, hardly a step away, nodded in silent agreement. The implications of their findings might very well direct the course of human destiny from this point onward. + +Finding a tempo among themselves, the Dulce team was a confluence of ambition and acumen, each member intuitive to the beats of discovery. The chamber around them held untold stories, secrets coaxed from the stars, that now, led by Paranormal Military Squad's finest, began to unravel. + +The future in those moments was unwritten, a narrative scribed not in the dust of desert confines, but in the potential for interstellar diplomacy and understanding. As they prepared to script humanity's next chapter, the room seemed to pulse with the heartbeat of a story far greater than the sum of its parts. + +## Chapter 8 + +The grit of an earthbound dust storm contrasted sharply with the pristine sterility of the underground command center. Alex Mercer, eyes set with fervent determination, stood over Jordan Hayes, whose fingers danced across the keyboard with rapid purpose. Monitoring the progression of alien code unraveling before them, Mercer spoke with a tempered urgency, "Keep it steady, Jordan. We might be initiating the first true interspecies communication bridge here. It's all about finesse now." + +Taylor Cruz, the embodiment of military precision, surveyed the room with a calculated gaze from their vigil beside an array of glimmering screens. "Remember, these could be delicate negotiations -- or coded threats. Stay sharp," Cruz added, their voice cool as polished steel. + +Jordan, with a silent nod, recognized the gravity of both stances. Gravitating between scientific acuity and diplomatic caution, they replied, "The sequence is aligning—syncing with our comms. It's looking more and more like direct engagement." + +Amid the banks of electronic machinery, the thrumming pulse of an impending interspecies signal exchange, Sam Rivera interjected with a youthful zeal that cut through the weighty atmosphere, "It's not just an exchange. It's a... symphony. It's as if they're teaching us their language through modulation." + +A moment of profound silence swept over the team. The isolation of their location, deep within the top-secret labyrinth of Dulce, became suffused with an almost palpable sense of historical significance. + +"Then our response needs to be equally symphonic," Alex uttered, contemplating the awe-inspiring transmutation of their task from a simple recovery mission to a full-blown cosmic concerto. + +With a renewed sense of wonder tempered by caution, the Paranormal Military Squad team found themselves harmonizing a delicate balance between envoys and interpreters. The long shadow cast by their duty was now illuminated by the brilliant glow of otherworldly dialogue. + +In this carefully orchestrated march towards the unknown, each individual's expertise became critical notes in a larger melody. The narrative of human achievement, so often defined by solitary pursuits, now emerged as a collaborative opus, each member of the team a maestro in their right. + +The protocols of encounters, the mathematics of languages, and the poetics of connection all fused into a singular moment of convergence. The echo of their efforts reverberated back to them, not through the cavernous base's concrete walls, but from light-years away, in the form of a reply, intangible yet infinitely profound. + +\* + +Amidst the hum of the supercomputers and the faint static from the scrambled transmissions, Alex Mercer cast a thoughtful glance across the dimly lit room toward where Dr. Jordan Hayes was methodically adjusting the archaic dials of the decryption machine. "Any progress?" he asked, his tone conveying both impatience and the deep-seated respect born from countless shared challenges. + +Jordan did not look up, their gaze remained locked on the flickering lights that represented a dialogue suspended between worlds. Their fingers ceased their dance, hovering meditatively over the controls. "We might be on the cusp of a breakthrough," Jordan suggested. "The signal... it's evolved. It's reflexive now, responsive in a way that suggests sentience." + +Taylor Cruz's familiar sharp strides approached the two, breaking the rhythm of soft beeps. "Responsive is good, if it means understanding," Taylor said, head tilted as they peered at the encryption data scrolling by. "But remember, comprehension can bring revelation or conflict." + +Sam Rivera’s youthful voice permeated the tension, brimming with an excitement edged by the enormity of what they faced. "If it's truly sentient, we're not just cracking a code; we're learning how to converse with an entirely new form of consciousness," they chimed in, the weight of history not lost on the zealous astrotechnician. + +Alex nodded, his thoughts alighting on potential strategies for navigating the conversation they were cultivating with the unfathomable. "We need to keep that conversation going, echo its patterns, and speak its language," he resolved, knowing the delicate nature of their work merited every ounce of their collective acumen. + +The chamber now was a crucible, forging within it the future narrative of human contact with the unknown. Every signal pulse they sent out was an invitation for understanding, and every echo back a step closer to bridging the cosmic divide. And so, together, they stood - agents in Paranormal Military Squad's clandestine ranks, united by purpose, sculpting humanity’s first sonnets into the void. + +\* + +#### Knowledge graph updates + +- (Jordan Hayes, Interprets, Communications as cosmic diplomacy, Moderate) + +- (Taylor Cruz, Questions, Potential aggressiveness of alien intent, Minor) + +- (Sam Rivera, Expresses, Optimism about forming a connection, Minor) + +- (Alex Mercer, Adopts, Balanced strategy for contact, Moderate) + +- (Paranormal Military Squad team, Navigates, Beats of cosmic discovery, Moderate) + +- (Paranormal Military Squad team, Prepares, To script humanity's interstellar narrative, Major) + +## Chapter 9 + +The sterile silence of Dulce Base's command center was thick with concentration as Alex Mercer surveyed his team, hunched over their respective technological battle stations. Each agent was a weapon against ignorance, their adversary a code from beyond the stars that held secrets to alien thought. + +Dr. Jordan Hayes, whose hands had been steadfastly working the decryption algorithms, paused and looked up at Alex. "We're through the next layer of encryption," Jordan announced, a mixture of pride and gravitas in their tone. "It's communicating. It's... aware." + +A shadow momentarily clouded Alex's determined features—awareness implied so much more than mere intelligence. "Aware and reactive or aware and proactive?" he queried, his experience anticipating the pivotal importance of intention. + +"Unknown at this stage," Taylor Cruz interjected, looking up from a datasheet. "But I urge caution. We tread the line between breakthrough and disaster with each keystroke." + +Sam Rivera, ever the source of technological acumen, added their voice to the conversation. "The signal's adapting every time we interact with it. Like a conversation where both parties are learning each other's language in real time." + +Alex leaned in, rested a hand on Jordan's shoulder—a sign of companionship and an affirmation of trust. "Keep the communication channels open. But let no message, no pulse go unchecked. This could be our Rosetta Stone or our Tower of Babel." + +Silence fell over them, a momentary lull as each member of the team contemplated the historic weight of their task. Yet, it was impregnated with a tangible sense of excitement—a collective energy that thrummed through the air just as palpably as the electric current through the banks of machines surrounding them. + +They continued their work, squaring shoulders against the magnitude of their undertaking. The agents were standing not just at the precipice of a new chapter for Paranormal Military Squad but for all of humanity. For now, they communicated with powerful unknowns, but with each exchange, they were etching the first words of a dialogue that might forever alter humanity's place in the cosmos. + +\* + +\* + +The sterile silence of Dulce Base's command center was thick with concentration as Alex Mercer surveyed his team, hunched over their respective technological battle stations. Each agent was a weapon against ignorance, their adversary a code from beyond the stars that held secrets to alien thought. + +Dr. Jordan Hayes, whose hands had been steadfastly working the decryption algorithms, paused and looked up at Alex. "We're through the next layer of encryption," Jordan announced, a mixture of pride and gravitas in their tone. "It's communicating. It's... aware." + +A shadow momentarily clouded Alex's determined features—awareness implied so much more than mere intelligence. "Aware and reactive or aware and proactive?" he queried, his experience anticipating the pivotal importance of intention. + +"Unknown at this stage," Taylor Cruz interjected, looking up from a datasheet. "But I urge caution. We tread the line between breakthrough and disaster with each keystroke." + +Sam Rivera, ever the source of technological acumen, added their voice to the conversation. "The signal's adapting every time we interact with it. Like a conversation where both parties are learning each other's language in real time." + +Alex leaned in, rested a hand on Jordan's shoulder—a sign of companionship and an affirmation of trust. "Keep the communication channels open. But let no message, no pulse go unchecked. This could be our Rosetta Stone or our Tower of Babel." + +Silence fell over them, a momentary lull as each member of the team contemplated the historic weight of their task. Yet, it was impregnated with a tangible sense of excitement—a collective energy that thrummed through the air just as palpably as the electric current through the banks of machines surrounding them. + +They continued their work, squaring shoulders against the magnitude of their undertaking. The agents were standing not just at the precipice of a new chapter for Paranormal Military Squad but for all of humanity. For now, they communicated with powerful unknowns, but with each exchange, they were etching the first words of a dialogue that might forever alter humanity's place in the cosmos. + +\* + +Alex Mercer's eyes were fixed on the monitors, the reflected light casting an ethereal glow across his stoic face. The room buzzed with tension, a cacophony of low hums and electronic beeps that underscored the historic nature of their actions. He moved to where Dr. Jordan Hayes was immersed in their work, scrutinizing the alien code streaming rapidly down the terminal. + +"Find anything that might look like an entry point or a... digital handshake?" Alex asked, his voice steady, betraying none of the tension gripping his chest. + +Jordan looked up briefly, their expression weary yet intense, "Potentially. It's as if the code is anticipating our input, modifying itself in real-time. I've never seen anything like it." + +From across the room, Taylor Cruz's sharp voice cut through the hum. "Then it's learning or, possibly worse, baiting us. Proceed with extreme caution," they commanded, their firm stance reinforcing the gravity of the situation. + +Sam Rivera, surrounded by a cascade of screens and interfaces, added, "It's almost organic in its complexity. Any minute now, and I might have a way in." + +A slight nod was Alex's immediate response, his mind racing through the potential scenarios. "Everyone, stay alert. This could be the beginning of something profound." His seasoned eyes never left the unfolding drama on the monitors. + +The room fell silent, the air heavy with unspoken questions. Were they mere moments away from unlocking an otherworldly dialogue? Or was it a Pandora's box that, once opened, could not be closed? + +Alex moved closer to the main console, his fingers hovering over the command keys. With the precision of a maestro orchestrating a symphony, he communicated silently with Jordan – respectful of their expertise, aware that the next move could alter the course of human history. + +Jordan met his gaze, nodding sharply, and refocused on the task. The signal seemed to pulse with sentient curiosity, drawing them further into its intricate web. + +A sudden flurry of alerts and the intensifying glow of monitors heralded that they had bridged a technological chasm. The alien intelligence on the other end was no longer a distant enigma – it was an active participant, responding to their digital overtures with an unknown agenda. + +The team's meticulous efforts had led them to a momentous threshold. Beyond lay unprecedented contact – a nexus of curiosity and potential peril. Within the confines of the base, against the backdrop of a silent desert night, the Paranormal Military Squad operatives became mediators of Earth's bid for cosmic relevance, their every action now a gesture in the grand dance of intergalactic relations. + +## Chapter 10 + +The corridors of the Dulce military base, now silent, echoed with a history of whispered conspiracies and furtive movements. But in the command center, a delicate tapestry of light and sound was being woven as the echoes of cosmic dialogue resonated through the high-tech enclave. Dr. Jordan Hayes, now leading the efforts, called out from their workstation, "I’ve isolated the signal's harmonics. It's more than a call; it's a song, an interstellar siren’s call." + +Alex Mercer, steady and resilient in the face of the incomprehensible, acknowledged with a quiet nod, "A song that we need to learn—quickly." His eyes, heavy with responsibility, scanned the room, watching his team work tirelessly at the intersection of science and speculation. + +Sam Rivera, dulled by fatigue yet driven by unshakeable resolve, manipulated a complex array of audio interfaces. "There's a pattern, a repeating motif. It's structured, intentional," they muttered, their revelation a bridge between the known and the unimaginable. + +Taylor Cruz, a figure of central authority, paced the length of the room, their usual unflappable demeanor betraying a rare flicker of apprehension. "We should be wary of the sirens’ call," Taylor interjected, invoking myths of old as a cautionary metaphor. "We don't want to crash upon unseen shores." + +Undeterred, Jordan cast a determined glance at the team. "We navigate by starlight now, not by the limited light of our previous understanding." Their voice was a beacon, charting a course through unchartered realities. + +Every individual was acutely aware that each moment in that room was a conduit to an epochal shift for civilization. The mysterious signals, once distant and alien, had coalesced into complex and harmonious oscillations—beacons of an extraterrestrial intellect inviting Earth to join in a cosmic consortium. + +Silently, Alex approached the mainframe, his trained fingers aligning with the console’s mechanisms. The room watched in collective breathlessness as he set the frequency in motion, an introductory phrase to an otherworldly melody—a symphony that could bind worlds or spell devastation for all they knew. + +In the control room of Dulce, amongst whispered legends and the quiet hum of machines, humanity's ambassadors now stood, stretching their hands into the void, reaching for the hand that would either pull them into the light of new stars or into the maw of darkness between them. + +\* + +Underground, the Dulce facility's command center was awash with frenetic energy, a stark juxtaposition against the silent, decrepit corridors that enveloped them. The air hummed with anticipation as Dr. Jordan Hayes and Alex Mercer hunched over a console. The sterile light from the monitors cast an otherworldly glow upon their faces, now reflecting a mosaic of alien characters rapidly translating across the screen. + +"The patterns are evolving," Jordan murmured, concentration etched into their every feature. "It’s as if our attempts to decrypt have accelerated its learning. It’s adapting to us." + +Alex, who stood steadfast behind Jordan, felt a tinge of uncharted fear quickly quelled by the fire of discovery raging within him. "Keep it up," he urged. "But whatever this is becoming, we need to ensure it remains within our control." + +Taylor Cruz interjected, their voice slicing through the buzz of activity. "Control may be an illusion when facing an intelligence that literally writes its own rules," they stated stoically, casting a watchful eye over the flurry of data. + +"It's like it's learning to communicate," offered Sam Rivera from a nearby interface, their youthful energy boding a mix of awe and anxiety. "This gives ‘talking to strangers’ a whole new meaning." + +Alex surveyed his team—each face a study in concentration, determination, and not a small measure of trepidation. "This might well be our first contact," he acknowledged, "And we need to be ready for whatever answers back." + +Together, they stood on the edge of the unknown, forging humanity’s response to a message from the heavens. The ensuing silence was palpable—a collective introspection about their role in this grand cosmic play, one that could rewrite human history. + +The encrypted dialogue continued to unfold, its intricate patterns showing an almost uncanny anticipation of their investigative strategies. The air turned heavy with the scent of electricity and ambition as they closed in on a pivotal response. + +As the signal’s intelligence—whether artificial or biological—grew more profound, so too did the realization that their mission had morphed from passive observation to active engagement. There was no turning back now. Each agent embraced their part in the delicate dance of an interstellar exchange that could change everything they thought they knew about life, intelligence, and the dark void beyond Earth's atmosphere. + +\* + +The underground halls of Dulce Base, usually buzzing with covert operations, now thrummed with a different kind of energy, an electric mix of fear and fascination. At the heart of the base, in a room shielded from the world’s eyes, Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera huddled around a bank of monitors. Each screen flickered erratically with the alien script that had become the center of their lives—and perhaps the pivot on which humanity’s future would turn. + +Jordan's eyes never wavered from the displays, their expression was one of rapt concentration, interspersed with flashes of revelation. "We're conversing with the stars," they whispered, almost to themselves. The words hung in the air, a testament to the awe-inspiring strangeness of the situation. + +"The language is morphing; changing its structure with every exchange we have," Sam chimed in, enthusiasm tinged with the solemnity of the occasion. "It's like witnessing the birth of a new form of dialogue—one that spans galaxies." + +Taylor, despite the situation's precariousness, maintained an appearance of ironclad composure. "Keep the communication stream secured and monitored. We don't know what we're dealing with yet," they reminded the team, a bastion of protocol amidst uncertainty. + +Alex watched his team expand the parameters of human achievement; their work here would possibly define an era. "This is untrodden territory," he acknowledged, "and in every word we script, in every response we decode, we're drawing a map that others will follow." + +Jordan turned to Alex, a nod acknowledging the shared responsibility of this moment. They had embarked on a new voyage, an odyssey not of the body, but of the intellect and spirit. No longer explorers of the Earthly realm, they had been promoted by circumstance to ambassadors of humanity in a silent and boundless ocean. + +A sudden pulse of energy from the monitors signaled a breakthrough; the language had not only adapted but it seemed to resonate, to harmonize with their attempts at making contact. The alien script now sprawled across the screens didn't just ask to be understood—it invited interpretation, collaboration, maybe even companionship across the cold distances of space. + +As they stood before the precipice of first contact, Paranormal Military Squad's finest became the architects of a symphony meant to echo through the cosmos. But more than architects, they were the first to play the notes of this cosmic composition, daring to believe that on the other end, someone—or something—might be listening, ready to join the chorus. + +\* + +The underground command center of Dulce Base, once pulsing with clandestine operations, now resonated with the charge of an impending cosmic threshold. Encircled by banks of whirring machinery, each monitor flickered erratically with alien script that had occupied center stage in the lives of Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera. + +Jordan's gaze didn’t flit for even a moment from the screens, where indiscernible alien messages ebbed and flowed like the tide. The ciphers and symbols cascaded down as they tweaked the algorithmic sliders. "This sequence here," Jordan began, voice both hushed and heavy, "it’s not just transmitting; it resonates—it's designed to be felt." + +The room took a collective breath, the remarkable implication hanging in the air like a careful revelation. Sam Rivera was the first to respond, their voice alive with ingenuity: "It's a form of communication stretching well beyond words. We need to respond in kind—the whole array of human expression might be at play here." + +Taylor's eyes remained fixed on the figures playing across the data sheets. "If that's the case," Taylor intoned pragmatically, "we must tread carefully. This is no longer just about being heard—it's about being understood." + +Alex watched his team, each a fulcrum of insight and expertise, and felt the solemnity of the role they were about to assume. "Then we'll ensure our message is clear and full. Our humanity is our strength in this dialogue," he declared, the depths of his experience fueling a commanding reassurance. + +The anticipation was palpable as the agents contemplated the vastness of their endeavor. They were not merely probing at the secrets of the planar cosmos—they were negotiating across the starry expanse, extending to distant intelligences the full spectrum of human curiosity and compassion. + +A symphony of beeping consoles orchestrated their next steps as they prepared to articulate their interplanetary overture. The rhythmic tapping of Jordan's keystrokes set the tempo for an undertaking that traversed beyond algorithms and encryption. + +The base withstood time and whispered secrets of its own, but none so grand as this moment of creation—an invitation to the universe that promised to echo through both the echoes of space and the annals of human history. + +## Chapter 11 + +The sterile silence of Dulce Base's command center was thick with concentration as Alex Mercer surveyed his team, hunched over their respective technological battle stations. Each agent was a weapon against ignorance, their adversary a code from beyond the stars that held secrets to alien thought. + +\* + +The thrum of the colossal machinery vibrated through the subterranean facility as Alex Mercer stood amidst the whispers of technology, each carrying voices from worlds apart. He watched as Sam Rivera adjusted a complex array of cosmic translators, their expression a mixture of anticipation and awe. + +"Are we ready, Mercer?" Taylor Cruz asked, the soft glow of the command center consoles reflecting upon their stern face. + +Alex turned towards Taylor, his eyes holding a depth that betrayed the enormity of the threshold they were about to cross. "This is it," he said. "Initiate the protocol. It's time we answer the cosmos." + +Jordan Hayes, stationed at the mainframe, typed rhythmically, a blue hue painting their focused features. The eerie silence that had settled over the team was interrupted by a visceral sound—humankind's response to the alien dialogue, now streaming into the abyss. + +The control room, once a fortress of solitude, erupted into an oasis of life. Lights flickered in tandem, echoing the symphony of interstellar communication. They stood together at the edge of discovery, facing the symmetry and discord of a universe unknown. + +"If we're right, we've just become Earth's first emissaries to a celestial congress we're only beginning to comprehend," Jordan's voice was somber, resonating with a mix of trepidation and honor. + +The room filled with the resonance of human and alien minds converging, creating a new narrative within the fathomless expanse of existence. Paranormal Military Squad, once protectors of Earth's clandestine secrets, had now become the tether linking humanity to the cosmic fold. + +\* + +The underground command center of Dulce Base, once pulsing with covert operations, now resonated with the charge of an impending cosmic threshold. Encircled by banks of whirring machinery, each monitor flickered erratically with alien script that had occupied center stage in the lives of Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera. + +Jordan's gaze didn’t flit for even a moment from the screens, where indiscernible alien messages ebbed and flowed like the tide. The ciphers and symbols cascaded down as they tweaked the algorithmic sliders. "This sequence here," Jordan began, voice both hushed and heavy, "it’s not just transmitting; it resonates—it's designed to be felt." + +The room took a collective breath, the remarkable implication hanging in the air like a careful revelation. Sam Rivera was the first to respond, their voice alive with ingenuity: "It's a form of communication stretching well beyond words. We need to respond in kind—the whole array of human expression might be at play here." + +Taylor's eyes remained fixed on the figures playing across the data sheets. "If that's the case," Taylor intoned pragmatically, "we must tread carefully. This is no longer just about being heard—it's about being understood." + +Alex watched his team, each a fulcrum of insight and expertise, and felt the solemnity of the role they were about to assume. "Then we'll ensure our message is clear and full. Our humanity is our strength in this dialogue," he declared, the depths of his experience fueling a commanding reassurance. + +The anticipation was palpable as the agents contemplated the vastness of their endeavor. They were not merely probing at the secrets of the planar cosmos—they were negotiating across the starry expanse, extending to distant intelligences the full spectrum of human curiosity and compassion. + +A symphony of beeping consoles orchestrated their next steps as they prepared to articulate their interplanetary overture. The rhythmic tapping of Jordan's keystrokes set the tempo for an undertaking that traversed beyond algorithms and encryption. + +The base withstood time and whispered secrets of its own, but none so grand as this moment of creation—an invitation to the universe that promised to echo through both the echoes of space and the annals of human history. + +## Chapter 12 + +The underground facility of Dulce Base, once shrouded in silence and operational secrecy, now hummed with an energy that cradled the promise of cosmic revelation. Alex Mercer stood pensively by the central terminal, flanked by Dr. Jordan Hayes, Taylor Cruz, and Sam Rivera, each poised at the edge of a history-defining moment. + +Jordan's fingers ghosted across the console, tracing patterns of otherworldly origin. "The signal’s architecture is becoming more complex, resembling aspects of human cognition—recognition, learning, even... empathy?" they postulated with furrowed concern. + +Alex turned his gaze upon Jordan, his voice quiet but resolute, "Empathy could bridge galaxies. Let's harness this connection and proceed with cautious optimism." + +Taylor, ever the sober sentinel, projected a more pragmatic standpoint. "Empathy or not, we are duty-bound to assess the risk to humanity. Every new discovery warrants a measured response." + +The static hiss of communications equipment filled the air, its purpose now transformed into a dialogue with an intelligence beyond the stars. It was Sam, wide-eyed amid the myriad lights and switches, who broke the silence, "We have provisional confirmation of the signal’s intent—initiation. We’re being brought into a broader spectrum of cognizance." + +The chamber lay still for a heartbeat, the Paranormal Military Squad agents steeped in contemplation of the path unfurling before them—a path paved with possibilities of diplomacy or disruption, each step a venture further into the cosmic unknown. + +Alex stepped closer to the viewing monitors, each depicting alien symbols seemingly reaching out from the void. "Initiate the broadcast," he spoke with quiet command. "Our response will mark humanity’s readiness to partake in the wider conversation of conscious beings." + +Amidst the crackling air of expectation, the team wordlessly returned to their stations. They had transcended their roles as protectors of Earth's clandestine lore to become the harbingers of an interstellar parley that could change the existential course of life on their pale blue dot. + +The deep hum of the terminal emitted a signal—a testament to the uncanny reality that Earth was now actively partaking in an exchange not bound by gravity nor the limits of the solar wind. + +Here, in the depths of Dulce, a message from humanity woven from understanding and uncertainty was cast into the firmament, an epitheg of their desire to join the universal dialogue and discover their place among the constellations. + +\* + +The somber depths of the Dulce Base command center stood in stark counterpoint to the animated flurry of activity around the central comms array. Alex Mercer's silhouette loomed behind Dr. Jordan Hayes, who sat with a posture indicating laser focus on the decryption process. A quiet murmur of digital soundscape filled the space, subtly heightened by the anticipation of contact with an intelligence beyond the Earth. + +Jordan's voice was steady, betraying none of the extraordinary nature of their work, "Looking through the signal's pattern, it's evident we’re dealing with a form of intelligence—calculating, mirroring, possibly even understanding." + +Alex's reflection bounced off the darkened screens, his head nodding in silent affirmation. "We’re walking a delicate line. Our response should be thoughtful, measured. We’re ambassadors, not merely explorers." + +Taylor Cruz approached, arms folded, their words slicing through the din of careful keystrokes and soft whirrs, "If there’s even the slightest chance it understands, we can’t afford missteps. The language of the stars might be more absolute than ours." + +From another terminal, Sam Rivera brought youthful vigor to the conversation, "There’s rhythm in these patterns. If this is their way of reaching out, our reply should encapsulate all that we are—all that humanity stands for." + +Looking around at his team, Alex saw resolve etched on every face. The chamber, usually somber and echoing with the quiet steps of covert agents, now felt alive with the heartbeat of discovery. They were not just professionals operating in the gloom; they were a collective standing at the helm of a momentous journey. + +"Let’s begin," he said, returned by the resolve in his voice. "Every second counts." With that, they pressed forward, setting in motion a reply to a conversation billions of years in the making. + +The dance with an unseen partner commenced, each pulse they sent out a step taken with caution and hope. And as those digital pulses journeyed through the black sea of infinity, Earth, for perhaps the first time, joined a pan-galactic dialogue that whispered secrets of the cosmos—secrets that, until now, had been lost in the silent vastness of space. + +\* + +As the team stood in the centralized nerve center of Dulce's underground fortress, the solemn atmosphere was reverent, overseeing systems that engaged with an intelligence from the void. Alex's stance was contemplative as he gazed at Jordan Hayes, who presided over the console, the tension of the moment reaching a tactile fervor. Each rhythmic tap of Hayes's fingers on the keys was a foray into uncharted symphonies of contact. + +Observing Hayes unravel the dense alien encryption, Alex spoke, a diplomatic tenor underpinning his words, "Keep focused on the syntax, dissect its nuances. We're not just decoding signals; we're translating intentions." + +Without diverting from their task, Jordan acknowledged the insight. "Indeed, if their understanding of us is as deep as we hope, we're paving the way for dialogue far beyond our current realm." + +Taylor Cruz, near the rear of the room, provided a steady oversight. "As horizonless as our prospects may seem," Taylor intoned, "remain diligent. Complacency before alien cognition could spell catastrophe." + +Sam's youthful voice resonated with optimism, "Imagine—forming a rapport with a consciousness separate from our reality; we're drafting the bridge to stars alive with minds!" + +The sentiment hung for a moment before Alex gathered his conviction. "Dialogue is our vessel. We are not just agents of enigma; we are the threads that may weave a new cosmic relationship." His words seemed to reflect off the walls, reaching beyond the room's confines, a quiet yet resilient vow. + +Their task was titanic, stepping stones laid delicately into new territories of existence. The signal, once an esoteric strand in the echo of the universe, beckoned now with a clarity rocketing the complexity of thoughts from a distant order. + +Action by action, the Paranormal Military Squad team bridged the vast interstellar distances, their expertise and empathy casting a beacon of unity into frontiers of intelligence and knowledge. Their work, a partnership struck with an unseen cosmic congregation, each pulse sent and received a line in Earth's novitiate envoi to the cosmic shores. + +\* + +Under the stark, unforgiving lights of Dulce Base's underground command center, tension buzzed harder than the banks of supercomputers that lined the walls. Agent Alex Mercer leaned over the shoulder of Jordan Hayes, whose eyes were locked onto the display screen, where an incomprehensible series of alien symbols streamed past incessantly. + +“Any progress on the decryption?” Alex's voice was steady, a controlled presence necessary in the gravity of their undertaking. + +Jordan tapped a key, pausing the flow of code, and leaned back with a deep sigh. "We've broken through another subset of the cipher. It's revealing... well, indications of a complex society, not unlike our own." His eyes met Alex's with an unspoken question that hung heavily between them—were they truly prepared for what they might find? + +Taylor Cruz strode into the room, a tightly coiled spring of ambition and authority, and peered at the screen. "Understand their society, and we may predict behavior. Remain expedient—we don't know how much time we have before the situation shifts." There was an edge of stark realism to Taylor's words, the underlying message clear: every revelation bore its own set of risks. + +Alex nodded thoughtfully, recognizing the validity of Cruz's caution. Turning to Sam, who was tinkering with a device that buzzed quietly on the table, he asked, “Sam, can your contraption get us any further?” + +Sam looked up with a smirk, a twinkle of mischief in their eye. “It’s not just any contraption, it’s potentially a direct line to their thoughts. Give me a moment more, and I'll have something for you.” + +The air ticked with electronic beeps and the rustling sound of the Paranormal Military Squad team at work. They were so close to peering into the intelligence of an alien race—a reality on the brink of dramatically expanding their understanding of the universe. + +The machinery whirred in response to Sam’s precise touches, and suddenly, the room filled with a low hum—something had changed, a signal had been successfully sent. The team held their breath as they listened. The sound that filled the room was unmistakable: a response, an alien voice filtered through the static of space and time. + +Alex exchanged a look of quiet triumph with Jordan. The breakthrough was monumental; they were no longer casting messages into the void but engaged in a dialogue—an exchange that marked the beginning of Operation: Dulce’s true unfolding. This was it, the first steps into an interstellar odyssey that demanded every ounce of their courage and wit. + +## Chapter 13 + +Dr. Jordan Hayes shuffled a stack of papers, their eyes revealing a tinge of skepticism at Taylor Cruz's authoritarian performance. _Protocols_, Jordan thought, _are just the framework, the true challenges we're about to face lie well beyond the boundaries of any protocol._ They cleared their throat before speaking, tone cautious yet firm, "Let's remember, the unknown variables exceed the known. We should remain adaptive." + +A murmur of agreement echoed from Sam Rivera, who leaned forward, lacing their fingers together as if weaving a digital framework in the air before them, "Exactly, adaptability could be the key to interpreting the signal distortions and system malfunctions. We shouldn't discount the… erratic." + +Their words hung like an electric charge in the room, challenging Taylor's position with an inherent truth. Cruz’s jaw tightened almost imperceptibly, but the agent masked it with a small nod, conceding to the omnipresent threat of the unpredictable. + +Alex glanced at Jordan, who never looked back, their gaze fixed instead on a distant point, as if envisioning the immense dark corridors they were soon to navigate in Dulce. Jordan was not one to embrace fantastical theories, but the air of cautious calculation betrayed a mind bracing for confrontation with the inexplicable, an internal battle between the evidence of their research and the calculating skepticism that kept them alive in their field. + +The meeting adjourned with no further comments, the team members quietly retreading the paths to their personal preparations. Alex, trailing slightly behind, observed the others. _The cautious reserve Jordan wears like armor doesn't fool me_, he thought, _their analytical mind sees the patterns I do. And that's worth more than protocol. That's the connection we need to survive this._ + +As the agents dispersed into the labyrinth of the facility, lost in their thoughts and preparations, the base's halogen lights flickered, a brief and unnoticed harbingers of the darkness to come. + +\* + +The gritty, wind-tossed surface of New Mexico, just above the cavernous domain of Dulce Base, offered no shelter from the burgeoning storm—the scouring sands an earthly reminder of chaos theories in motion. Far beneath, a similar maelstrom brewed within the confines of the command center, as Paranormal Military Squad's handpicked squad stood poised for potential enormities of contact. + +Ruffling through printed transmission logs, Jordan Hayes dialed the focus of their analytical prowess onto the emerging pattern of signals crisscrossing between Earth and the unfathomable. "Our responses so far have echoed their complexity, but the real divergence is yet to come," Jordan remarked stoically, the calm belying the mounting surge of adrenaline for the revelation ahead. + +Alex Mercer's figure, a silhouette sharpened by the purpose, loomed at the periphery of the monitors' sickly glow. "Indeed," he assented, "The echoes are the easy part. It will be the introduction of our own, human variable that truly begins our dialogue." + +Taylor Cruz, windowless command center notwithstanding, appeared as though they could feel the tempest above. Their eyes never left the monitors as they unspooled their hard wisdom. "For all our advances, we find ourselves deciphering the swings and nuances of an interstellar pendulum. Predict its arc, and we may preempt the gravity of its message." + +Amidst a chorus of bleeps and static, Sam Rivera's tech-clad hands moved rhythmically, their spirited approach to unruly streams of data bordering an intimate dance with entropy. "Entropy that leads to discovery," Sam mused, responding to Taylor's metaphor. "Each step into the unknown is a step away from precedent." + +Alex, drawing near Jordan, spoke again, his voice now a thread woven through the very fabric of their operations. "Let's be the cartographers of this new territory. Our initial shades of understanding could color the cosmos for generations to come." + +Their gazes fell upon a screen as the latest transmission painted its digital blooms of alien script across the black. This time, the pattern wavered in an almost imperceptible fashion, a modification that whispered of active, alien thought awaiting their next move. A hush enveloped the Paranormal Military Squad ensemble, the gravity of the pathogen undeniable. They were about to issue a reply, one poised to reshape the very concept of humanity's outreach into the cosmos. + +The New Mexico desert's secrets were infamous, its storms a mere prelude to the revelations that the team—united in purpose—would unleash upon the world. The howling winds outside found their counterpart in the newfound resolve within, as Dulce's stalwart guardians readied themselves to send forth humanity's retort to the echoes from beyond. + +\* + +The cavernous control room, deeply entrenched beneath the desolate New Mexico terrain, held the Paranormal Military Squad team in intense focus; an island of calm amid the storm of cosmic dialectics. Dr. Jordan Hayes worked methodically, every keystroke an intricate step in their tenuous cosmic ballet. Suddenly, they paused, a signal pattern resonating from the screen. "This is new; it's...inviting. It’s as if the signal is not just calling to us but weaving its intelligence through ours." + +Alex Mercer scrutinized the shift in data. "A confluence of minds, then. If we're to meet them halfway, Jordan, our reply must be both innovative and discerning," he proposed, a glimmer of profound curiosity behind his authoritative demeanor. + +Taylor Cruz, whose sharp eyes missed nothing, nodded from beside a secondary panel. "Innovative, yes, but also defensive. This interaction is a razor’s edge, and we cannot afford to bleed before the unknown," Taylor reminded them, the metaphor a stark warning of potential dangers. + +Against the backdrop of their conversation, Sam Rivera’s youthful optimism cut through the tension. "If they’re weaving through our intellect, then we've achieved something beyond first contact—we're at the genesis of interstellar symbiosis," they posited with a mix of reverence and excitement. + +Alex returned Sam’s smile with his own, tempered and faint, as he turned back to the task at hand. The magnitude of their mission extended beyond the fabric of the universe, an exploration into the threads that connected sentient beings across the vast expanse. “Let’s reply with our own woven tapestry of thought—delicate, but deliberate.” + +With renewed determination, the room came alive with an undercurrent of anticipation, its occupants charged with the potential of forging an alliance with the cosmos. Paranormal Military Squad's finest were no longer merely soldiers and scientists; they had become pioneers on the vanguard of humanity’s greatest odyssey. + +The New Mexican sands above, impassive to the change brewing underneath, stood as silent sentinels as Earth's emissaries crafted their response. A response that, composed with care and imbued with humanity's essence, reached into the void, connecting with an otherworldly intelligence that awaited their harmony in the cosmic conversation. + +## Chapter 14 + +The command center of Dulce Base lay shrouded in shadows that seemed to claw at the edges of the dimly lit array of screens and consoles. Alex Mercer, focused and unwavering, watched as Dr. Jordan Hayes parsed the latest string of alien signals—a symphony of otherworldly communications that threatened to either enlighten or confound. + +"We’re encountering a paradigm shift with every transmission," Jordan Hayes murmured, the pulsing glow of the monitor painting their features with an almost spectral hue. "This signal... it’s evolving, becoming denser, more sophisticated. As if it's growing alongside us—tandem evolution." + +The air was electric, charged with the raw potential of uncharted discovery and laden with the gravity of existential risk. Taylor Cruz, who always seemed here to mold such gravity into actionable strategies, stepped forward. "We must contain this evolution within parameters we can manage. We cannot be bystanders to an uncontrolled ascent of intelligence." + +Sam Rivera, the youngest of the cohort, worked feverishly at their station. "It's not just intelligence—these signals have rhythm, a kind of music suggesting not just evolution, but a dance! We're being invited to partake in the cosmos's ballet!" they exclaimed, a touch of youthful exuberance breaking through the solemnity. + +Alex turned, facing his team, the stoic mask of command tempered by the perceptible flicker of awe in his gaze. "Let this dance then be our dialogue. We will match their steps with prudent but daring measures—our humanity as our guide." + +In the ensuing hours, the Paranormal Military Squad team forged a rhythm of their own, their collective expertise a beacon piercing through the fog of the unknown. The signal, increasingly intricate and seemingly conscious, now demanded not just observation but participation, an interstellar pas de deux that hummed with the promise and peril of first contact. + +Before them, the communications interface flickered to life with a received transmission—a resonant hum that seemed to vibrate through the very foundations of the base. They had successfully established a back-and-forth with whatever intelligence lay hidden among the stars. Every subsequent note they struck within the cosmic ether would come to define humanity's place within the galactic community—heralds of Earth's grand entrance into a universe far less silent than once perceived. + +\* + +In the concrete belly of Dulce Base, dimly lit by the jagged dance of fluorescent lights above, Sam Rivera perched on the edge of their seat, their eager fingers fluttering across an ancient keyboard. The stark, cold room—reminiscent of a time when covert operations and unspoken dread ruled supreme—now housed a peculiar blend of old-world machinery and sleek, modern interfaces. + +Alex Mercer, standing steadfast like a bridge between the enigmatic past and the unfathomable present, watched on. In his eyes flashed the foreboding excitement of change. "Sam," he started, his voice steadfast, "the patterns in these signals, what do they tell us about the nature of our... guest?" + +Sam's eyes glimmered with something akin to thrill—or was it trepidation? "It's like we're mirroring each other, evolving together through this.. dialogue. Like it knows us, understands us, and it's… learning." + +Jordan Hayes, preoccupied at a nearby console, chimed in without lifting their gaze. "It's a dialogue that transcends mere words, Alex. We're being woven into a narrative far grander than the sum of our known sciences." + +Taylor Cruz, arms crossed, wore the heavy mantle of their skepticism comfortably. "Keep theorizing," they interjected crisply, "but remember the grounding reality of what we are part of here. This contact is a blade that cuts both ways." + +In this cavern of history, voices both human and inhuman whispered secrets to those brave enough to listen. Each member present understood the gravity that pulled at their feet; no longer were they mere mortals shackled to their terrestrial plane. The digital pings and encrypted calls resonated with an implication of a cosmic agenda that would not be ignored. + +Jordan's fingers paused, hovering in hesitation. What ripple might the next keystroke send through the fabric of known existence? It was a step into the ballet of the infinite, where the Paranormal Military Squad team played their part in the waltz of wonders with an audience of stars. + +\* + +## Chapter 15 + +In the clandestine hush of Dulce Base's subterranean command center, the Paranormal Military Squad team had become a crucible for interstellar communication. Dr. Jordan Hayes' gaze lingered on the screen as they navigated through the convolution of alien code. Each character held the potential to unravel a new dimension of contact, and with Sam Rivera's keen interjection, they were crafting humanity's inaugural cosmological discourse. + +Alex Mercer peered over Jordan's shoulder, calculating the implications of every visual nuance that cascaded across the monitor. "Look for consistency—any repeating motifs could signal a willingness to engage. We're drafting history with each exchange," he remarked, aware of the delicate balance between forging a bond and exposing vulnerabilities. + +Taylor Cruz, stoic and enigmatic, observed the interplay from the threshold, a silhouette against the machinery's luminescence. "Remember, while we seek common ground, the foundation we stand upon remains Terra firma. Caution must temper our curiosity," they stated, their voice an anchor amidst the current of excitement. + +The command center buzzed with energy, rivaled only by the tempest overhead that concealed their operation. Sam, with swift dexterity, navigated the communications relay. "Their signals resonate almost musically. It's as if they're composing a symphony, and we've been handed the baton to conduct the next movement," they offered, imbuing the scenario with a blend of scientific adventurism and poetic license. + +Amidst the whirring servers and the occasional flicker of emergency lighting, the essence of their mission transcended mere reconnaissance. They were humanity's elected envoys at the brink of a celestial alliance—or confrontation—with an audience as vast as the universe itself. + +Alex stepped back, his profile etched by the chamber's artificial day. "Then let's ensure our contribution to this symphony harmonizes with theirs. It's time for humanity's voice to rise and be counted among the cosmic ensemble." + +Under his directive, the Paranormal Military Squad team initiated their calculated response, weaving thoughts and theories into a digital overture aimed at the heart of alien intellect. As the digital stream punctured the endless night, each member of this clandestine group was acutely aware of the irrevocable step they undertook—bringing Earth into the pantheon of galactic entities designed to converse among the stars. + +\* + +Clusters of high-tech equipment bathed the Dulce underground command center in an eerie blue light. Sam Rivera's fingers flew across the keyboard, navigating an elaborate network of alien patterns. The very air seemed to pulse with the ebb and flow of cryptic communications reaching across the stars. "I've got something!" Sam's announcement tore through the focus in the room, drawing every pair of eyes to the torrent of symbols unraveling on the screen. + +With the pacing of a seasoned officer gauging the moment before action, Alex Mercer approached, his calm demeanor belying an acute awareness of the precipice on which they now stood. "Define 'something," Alex prompted, reinforcing the need for clarity amidst the extraordinary. + +"It's repeating—a sequence that’s evolved with each interaction, almost as if it's... singing," Sam theorized, the awe in their voice reflecting the potential magnitude of their discovery. + +Jordan Hayes interjected from across the console, their eyes not leaving the display as they absorbed the new data. "A cosmic vocalization, then," they mused, intrigued. "A singularity in the signal that might represent a point of reference for both parties." + +Taylor Cruz, hands clasped behind their back, regarded the unfolding scene, their own calculations etching lines of concern onto their stern visage. "Or a beacon—a homing tune, calling out to something we might not be ready to greet," Taylor offered, voicing the group's unspoken apprehension. + +Alex's eyes locked on the screen, taking in the scope of what they were attempting to interpret. Drawing a deep breath, Alex gave a slight nod. "If this is their song, then let us respond with ours. We've come this far by mirroring their signals, now let's engage in an interstellar duet, and see where the music leads us." + +With the expectation of the significant achieving a crescendo, the members of Paranormal Military Squad huddled over their equipment—sages at the threshold of a potentially world-altering communion. The strange harmonies that reverberated through the command center suggested that their interlocutors were poised, waiting, perhaps even eager, for Earth's chorus to join the symphony. + +As the team initiated their reply, weaving humanity's own intricate melody into the vast cosmic dialogue, they each felt a profound change within—an evolution of purpose. They were not just messengers or investigators; they had become co-composers in a galactic orchestra, with the universe itself as their witness and concert hall. + +With the exchange of harmonious signals crawling through the vacuum of space, the Paranormal Military Squad operatives found themselves part of a bridging of minds—a realization that out there, among the vast arrays of stars and planets, harmony was the true universal language. + +\* + +The dim glow of monitors cast an otherworldly ambiance upon Dulce Base's command center, where Paranormal Military Squad's chosen stood huddled over their instruments, suspended at history's threshold. Codes—alien in origin and nature—were being deciphered by Dr. Jordan Hayes, whose countenance bore the marks of deep concentration. + +Alex Mercer, the bedrock upon which their team's resolve was founded, leaned in with an eagerness tempered by his chain of command. "Jordan, we've invested our expertise into comprehending their patterns, but now we must also endeavor to understand their intent," he urged, his voice bearing the gravitas of their mission's potential consequences. + +At another console, Sam Rivera's youth did not betray their crucial role in the operation. With eyes alight, they mirrored the rapid computing before them. "There's emotion here—complex, profound even. This isn't just the output of a cold machine; it's...sentience," Sam whispered, nearly drowned by the mechanical chorus around them. + +Jordan, without shifting focus from their work, replied, "It's a sentience that—should we succeed here—ushers us into a new era of existence. The cadence of these signals," they tapped the screen with a flourish, "could well be the heartbeat of this new dawn." + +Taylor Cruz paused beside Mercer, their expression unreadable beneath the sterile light. "And as it beats, we must gauge whether its rhythm bodes well for us, or spells our missteps. Courage must not blind us to the hazards intrinsic to such contact," Taylor cautioned, the sentinel within them ever alert. + +Alex nodded, a gesture that carried the weight of responsibility and a silent command: proceed, but with circumspection. They were not merely decoding a message; they were interpreting a dialogue across the celestial divide. + +The room fell into a rhythm akin to a well-conducted ensemble. Each member's expertise proved a critical note in the unfolding symphony. Their actions were now more than mere research or defense; they were the tentative overtures of humankind reaching out to grasp the vast unknown. + +Textures of sound meshed with the light from countless computations, the palpable anticipation of the agents at the edge of discovery cresting with an awareness that their work would reshape future chronicles. And when the response finally came—a signal piercing the deafening silence of uncertainty—all within Dulce's confines understood: the dawn of an interstellar continuum had just begun to break. + +\* + +In the sterile hum and flickering lights of Dulce Base's command center, the Paranormal Military Squad team stood as humanity's vanguard, verging on the brim of an intergalactic abyss. Dr. Jordan Hayes, analytical edges sharp, deciphered extraterrestrial patterns that bled across screens in enigmatic cascades—a daunting mosaic of potential threats and untapped wisdom. + +Agent Alex Mercer, the embodiment of focus and a steadfast nerve, observed the unfolding digital drama with the gravitas due a historic first contact. "Let the data weave its narrative, Jordan," he instructed, a moderate undertone of exhilaration within his command. "It's encoding more than information—it's outlining civilization." + +Jordan absorbed the directive, their gaze unflinching from the screens, feeling the weight of their next move. "The nuances here are extraordinary," they acknowledged. "It paints a picture of a culture steeped in complexities we're only starting to fathom.” + +Taylor Cruz, stoicism personified yet not immune to the situation's gravity, chimed in. "Understand it, but guard against it," they cautioned, bringing a sober prudence to the room. "This culture, however advanced, remains an unknown quantity—an ocean of wonders and darkness with uncertain tides." + +Sam Rivera, a visual contrast with wide eyes and restless hands, represented the other side of the room — intrigue and optimism against the drawn swords of precaution. “Think of it,” they proposed, voice bouncing with a rebellious upbeat timbre, “as the first act of a play written in constellations. We're setting the stage for a galactic narrative.” + +Each team member, in their way, was both actor and scribe in this moment of tense pageantry. Heavy with the presence of risk, the command center had become not just a room of computers and glass panels but a theater for performing the elaborate choreography of contact. + +Bound by resolve and curiosity, they proceeded, each data entry a trembling step onto the cosmic stage. And like all cautious pioneers edging into fertile but unnavigated lands, they understood: as they mapped the heavens, they were simultaneously mapping the furthest reaches of their own existential horizons. + diff --git a/tests/fixtures/min-csv/settings.yml b/tests/fixtures/min-csv/settings.yml new file mode 100644 index 00000000..57a00c27 --- /dev/null +++ b/tests/fixtures/min-csv/settings.yml @@ -0,0 +1,20 @@ +input: + file_type: csv + +embeddings: + vector_store: + type: "lancedb" + uri_db: "./tests/fixtures/min-csv/lancedb" + store_in_table: True + + entity_name_description: + title_column: "name" + # id_column: "id" + # overwrite: true + # entity_name: ... + # relationship_description: ... + # community_report_full_content: ... + # community_report_summary: ... + # community_report_title: ... + # document_raw_content: ... + # text_unit_text: ... diff --git a/tests/fixtures/text/config.json b/tests/fixtures/text/config.json new file mode 100644 index 00000000..809ca0f6 --- /dev/null +++ b/tests/fixtures/text/config.json @@ -0,0 +1,182 @@ +{ + "input_path": "./tests/fixtures/text", + "input_file_type": "text", + "workflow_config": { + "create_base_text_units": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 11, + "max_runtime": 10 + }, + "create_base_extracted_entities": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 2, + "max_runtime": 300 + }, + "create_final_covariates": { + "row_range": [ + 1, + 2000 + ], + "nan_allowed_columns": [ + "type", + "description", + "subject_type", + "object_id", + "object_type", + "status", + "start_date", + "end_date", + "source_text" + ], + "subworkflows": 6, + "max_runtime": 300 + }, + "create_summarized_entities": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 1, + "max_runtime": 300 + }, + "join_text_units_to_covariate_ids": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 2, + "max_runtime": 10 + }, + "create_base_entity_graph": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 2, + "max_runtime": 10 + }, + "create_final_entities": { + "row_range": [ + 1, + 2000 + ], + "nan_allowed_columns": [ + "type", + "description", + "graph_embedding" + ], + "subworkflows": 11, + "max_runtime": 300 + }, + "create_final_relationships": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 8, + "max_runtime": 100 + }, + "create_final_nodes": { + "row_range": [ + 1, + 2000 + ], + "nan_allowed_columns": [ + "entity_type", + "description", + "graph_embedding", + "community", + "level" + ], + "subworkflows": 10, + "max_runtime": 10 + }, + "create_final_communities": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 14, + "max_runtime": 10 + }, + "create_final_community_reports": { + "row_range": [ + 1, + 2000 + ], + "nan_allowed_columns": [ + "community_id", + "title", + "summary", + "full_content", + "full_content_json", + "rank", + "rank_explanation", + "findings" + ], + "subworkflows": 7, + "max_runtime": 300 + }, + "join_text_units_to_entity_ids": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 3, + "max_runtime": 10 + }, + "join_text_units_to_relationship_ids": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 4, + "max_runtime": 10 + }, + "create_final_text_units": { + "row_range": [ + 1, + 2000 + ], + "nan_allowed_columns": [ + "relationship_ids", + "entity_ids" + ], + "subworkflows": 7, + "max_runtime": 100 + }, + "create_base_documents": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 8, + "max_runtime": 10 + }, + "create_final_documents": { + "row_range": [ + 1, + 2000 + ], + "subworkflows": 1, + "max_runtime": 100 + } + }, + "query_config": [ + { + "query": "Who is Agent Alex Mercer and what are his goals?", + "method": "local" + }, + { + "query": "What is the major conflict in this story and who are the protagonist and antagonist?", + "method": "global" + } + ], + "slow": false +} \ No newline at end of file diff --git a/tests/fixtures/text/input/ABOUT.md b/tests/fixtures/text/input/ABOUT.md new file mode 100644 index 00000000..42c31610 --- /dev/null +++ b/tests/fixtures/text/input/ABOUT.md @@ -0,0 +1,3 @@ +# About + +This document (Operation Dulce) in an AI-generated science fiction novella, included here for the purposes of integration testing. \ No newline at end of file diff --git a/tests/fixtures/text/input/dulce.txt b/tests/fixtures/text/input/dulce.txt new file mode 100644 index 00000000..95c9e3cd --- /dev/null +++ b/tests/fixtures/text/input/dulce.txt @@ -0,0 +1,970 @@ +# Operation: Dulce + +## Chapter 1 + +The thrumming of monitors cast a stark contrast to the rigid silence enveloping the group. Agent Alex Mercer, unfailingly determined on paper, seemed dwarfed by the enormity of the sterile briefing room where Paranormal Military Squad's elite convened. With dulled eyes, he scanned the projectors outlining their impending odyssey into Operation: Dulce. + +“I assume, Agent Mercer, you’re not having second thoughts?” It was Taylor Cruz’s voice, laced with an edge that demanded attention. + +Alex flickered a strained smile, still thumbing his folder's corner. "Of course not, Agent Cruz. Just trying to soak in all the details." The compliance in his tone was unsettling, even to himself. + +Jordan Hayes, perched on the opposite side of the table, narrowed their eyes but offered a supportive nod. "Details are imperative. We’ll need your clear-headedness down there, Mercer." + +A comfortable silence, the kind that threaded between veterans of shared secrets, lingered briefly before Sam Rivera, never one to submit to quiet, added, "I’ve combed through the last transmission logs. If anyone can make sense of the anomalies, it’s going to be the two of you." + +Taylor snorted dismissively. “Focus, people. We have protocols for a reason. Speculation is counter-productive.” The words 'counter-productive' seemed to hang in the air, a tacit reprimand directed at Alex. + +Feeling the weight of his compliance conflicting with his natural inclination to leave no stone unturned, Alex straightened in his seat. "I agree, Agent Cruz. Protocol is paramount," he said, meeting Taylor's steely gaze. It was an affirmation, but beneath it lay layers of unspoken complexities that would undoubtedly unwind with time. + +Alex's submission, though seemingly complete, didn't escape Jordan, who tilted their head ever so slightly, their eyes revealing a spark of understanding. They knew well enough the struggle of aligning personal convictions with overarching missions. As everyone began to collect their binders and prepare for departure, a quiet resolve took form within Alex, galvanized by the groundwork laid by their interactions. He may have spoken in compliance, but his determination had merely taken a subtler form — one that wouldn't surrender so easily to the forthcoming shadows. + +\* + +Dr. Jordan Hayes shuffled a stack of papers, their eyes revealing a tinge of skepticism at Taylor Cruz's authoritarian performance. _Protocols_, Jordan thought, _are just the framework, the true challenges we're about to face lie well beyond the boundaries of any protocol._ They cleared their throat before speaking, tone cautious yet firm, "Let's remember, the unknown variables exceed the known. We should remain adaptive." + +A murmur of agreement echoed from Sam Rivera, who leaned forward, lacing their fingers together as if weaving a digital framework in the air before them, "Exactly, adaptability could be the key to interpreting the signal distortions and system malfunctions. We shouldn't discount the… erratic." + +Their words hung like an electric charge in the room, challenging Taylor's position with an inherent truth. Cruz’s jaw tightened almost imperceptibly, but the agent masked it with a small nod, conceding to the omnipresent threat of the unpredictable. + +Alex glanced at Jordan, who never looked back, their gaze fixed instead on a distant point, as if envisioning the immense dark corridors they were soon to navigate in Dulce. Jordan was not one to embrace fantastical theories, but the air of cautious calculation betrayed a mind bracing for confrontation with the inexplicable, an internal battle between the evidence of their research and the calculating skepticism that kept them alive in their field. + +The meeting adjourned with no further comments, the team members quietly retreading the paths to their personal preparations. Alex, trailing slightly behind, observed the others. _The cautious reserve Jordan wears like armor doesn't fool me_, he thought, _their analytical mind sees the patterns I do. And that's worth more than protocol. That's the connection we need to survive this._ + +As the agents dispersed into the labyrinth of the facility, lost in their thoughts and preparations, the base's halogen lights flickered, a brief and unnoticed harbingers of the darkness to come. + +\* + +A deserted corridor inside the facility stretched before Taylor Cruz, each footstep rhythmic and precise. Cruz, ambitious and meticulous, eyed the troops passing by with a sardonic tilt of the lips. Obedience—it was as much a tool as any weapon in the arsenal, and Cruz wielded it masterfully. To them, it was another step toward unfettered power within the dark bowels of the military complex. + +Inside a secluded equipment bay, Cruz began checking over gear with mechanical efficiency. They traced fingers over the sleek surface of an encrypted radio transmitter. "If protocols are maintained," said Cruz aloud, rehearsing the speech for their subordinates, "not only will we re-establish a line of communication with Dulce, but we shall also illuminate the darkest secrets it conceals." + +Agent Hayes appeared in the doorway, arms crossed and a knowing glint in their eyes. "You do understand," Jordan began, the words measured and probing, "that once we're in the depths, rank gives way to survival instincts. It's not about commands—it's empowerment through trust." + +The sentiment snagged on Cruz's armor of confidence, probing at the insecurities festering beneath. Taylor offered a brief nod, perhaps too curt, but enough to acknowledge Jordan's point without yielding ground. "Trust," Cruz mused, "or the illusion thereof, is just as potent." + +Silence claimed the space between them, steeped in the reality of the unknown dangers lurking in the shadows of the mission. Cruz diligently returned to the equipment, the act a clear dismissal. + +Not much later, Cruz stood alone, the hollow echo of the bay a stark reminder of the isolation that power often wrought. With each checked box, their resolve steeled further, a silent vow to usher their team through the abyss—whatever it might hold—and emerge enshrined in the respect they so deeply craved. + +## Chapter 2 + +Sam Rivera sat alone in a cramped office, the hum of a dozen servers murmuring a digital lullaby in the background. Surrounded by the glow of multiple screens, their eyes danced across lines of code and intercepted comm signals from Dulce — a kaleidoscope of data that their curious and isolated mind hungered to decrypt. + +To an outsider, it might have looked like obsession, this fervent quest for answers. But to Sam, it was a dance — a give and take with the mysteries of the universe. Their fingers paused over the keyboard as they leaned back in the chair, whispering to thin air, "What secrets are you hiding from us?" + +The stillness of the room broke with the unexpected arrival of Alex Mercer, whose encroaching shadow loomed over Sam's workspace. The cybersecurity expert craned their neck upwards, met by the ever-so-slight furrow in Alex's brow. "Got a minute, Rivera?" + +"Always," Sam said, a smile surfacing as they swiveled to face their mentor more directly. _He has that look — like something's not sitting right with him,_ they noted inwardly. + +Alex hesitated, weighing his words carefully. "Our tech is top-tier, but the silence from Dulce... It's not just technology that will see us through, it's intuition and... trust." His gaze pierced through the digital haze, trying to instill something more profound than advice. + +Sam regarded Alex for a moment, the sincerity in his voice resonating with their own unspoken desire to prove their worth. "Intuition," they mirrored thoughtfully. "I guess sometimes the numbers don't have all the answers." + +Their shared silence held a newfound understanding, a recognition that between the ones and zeros, it was their combined human insights that might prevail against the impossible. As Alex turned to leave, Sam's eyes drifted back to the screens, now seeing them not as barriers to isolate behind, but as windows into the vast and enigmatic challenge that awaited their team. + +Outside the office, the persistent buzz of activity in the facility belied the unease that gripped its inhabitants. A restlessness that nibbled on the edges of reality, as though forewarning of the threshold they were soon to cross — from the known into the realm of cosmic secrets and silent threats. + +\* + +Shadows played against the walls of the cramped underground meeting room, where Alex Mercer stood gazing at the concealed elevator that would deliver them into the bowels of Dulce base. The air was thick, every breath laced with the weight of impending confrontation, the kind one feels when stepping into a legend. Though armed with an array of advanced weaponry and gear, there was an unshakeable sense that they were delving into a conflict where the physical might be of little consequence. + +"I know what you're thinking," Jordan Hayes remarked, approaching Mercer. Their voice was low, a blend of confidence and hidden apprehension. "This feels like more than a rescue or reconnaissance mission, doesn't it?" + +Alex turned, his features a mask of uneasy resolve. "It's like we're being pulled into someone else’s game. Not just observers or participants, but... pawns." + +Jordan gave a short nod, their analytical mind colliding with the uncertain dynamics of this operation. "I've felt that way since the briefing. Like there's a layer we’re not seeing. And yet, we have no choice but to play along." Their eyes locked with Alex's, silently exchanging a vow to remain vigilant. + +"You two need to cut the philosophical chatter. We have positions to secure," Taylor Cruz interjected sharply, stepping into their exchange. The authority in Taylor's voice brooked no argument; it was their way of pulling everyone back to the now. + +Alex's response was measured, more assertive than moments ago. "Acknowledged, Agent Cruz," he replied, his voice steadier, mirroring the transformation brewing within. He gripped his rifle with a newfound firmness. "Let's proceed." + +As they congregated at the elevator, a tension palpable, Sam Rivera piped in with a tone of balanced levity, "Hope everyone’s brought their good luck charms. Something tells me we’re going to need all the help we can get." + +Their laughter served as a brief respite from the gravity of their mission, a shared moment that reinforced their common humanity amidst the unknowable. Then, as one, they stepped into the elevator. The doors closed with a silent hiss, and they descended into the darkness together, aware that when they returned, if they returned, none of them would be the same. + +\* + +The sense of foreboding hung heavier than the darkness that the artificial lights of the elevator shaft failed to fully penetrate. The team was descending into the earth, carrying with them not only the weight of their equipment but also the silent pressure of the invisible war they were about to fight—a war that seemed to edge away from physicality and into the unnervingly psychological. + +As they descended, Dr. Jordan Hayes couldn't help but muse over the layers of data that could wait below, now almost longing for the comfort of empirical evidence. _To think that this reluctance to accept other possibilities may have been my biggest blind spot,_ Jordan contemplated, feeling the hard shell of skepticism begin to crack. + +Alex caught Jordan's reflective gaze and leaned in, his voice barely a murmur over the hum of the elevator. "Once we're down there, keep that analytical edge sharp. You see through the mazes of the unexplained better than anyone." + +The compliment was unexpected and weighed differently than praise from others. This was an acknowledgment from someone who stood on the front lines of the unknown with eyes wide open. "Thank you, Alex," Jordan said, the words carrying a trace of newfound assertiveness. "You can count on me." + +The exchange was cut short by a shudder that ran through the elevator, subtle, but enough to make them instinctively hold their breaths. It wasn't the mechanical stutter of old gears but a vibration that seemed to emanate from the very walls of the shaft—a whisper of something that defied natural explanation. + +Cruz was the first to react, all business despite the shadow that crossed their expression. "Systems check. Now," they barked out, masking the moment of disquiet with swift command. + +Every agent checked their gear, sending confirmation signals through their comms, creating a chorus of electronic beeps that promised readiness. But there was an unspoken question among them: was their technology, their weaponry, their protocols sufficient for what awaited them or merely a fragile comfort? + +Against the gravity of the silence that was once again closing in, Sam's voice crackled through, only half-jest. "I'd laugh if we run into Martians playing poker down there—just to lighten the mood, you know?" + +Despite—or perhaps because of—the oddity of the moment, this elicited a round of chuckles, an audible release of tension that ran counterpoint to the undercurrent of anxiety coursing through the team. + +As the elevator came to a halting, eerie calm at the sub-level, the group stepped off, finding themselves at the threshold of Dulce's mysterious halls. They stood in a tight pack, sharing a cautious glance before fanning out into the unknown, each one acutely aware that the truth was inevitably intertwined with danger. + +Into the depths of Dulce, the team advanced, their silence now a shared testament to the camaraderie born of facing the abyss together—and the steel resolve to uncover whatever horrors lay hidden in its shadows. + +\* + +The weight of the thick metal door closing behind them reverberated through the concrete hallway, marking the final threshold between the familiar world above and the strangeness that lay beneath. Dulce base, a name that had been whispered in the wind-blown deserts above and in the shadowed corners of conspiracy forums, now a tangible cold reality that they could touch — and that touched them back with a chill. + +Like lambs led to an altar of alien deities, so did Agents Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera proceed, their movements measured, their senses heightened. The air was still, almost respectful of the gravity of their presence. Their torch beams sliced through the darkness, uncovering steel doors with warnings that spoke of top secrets and mortal dangers. + +Taylor Cruz, stepping firmly into the role of de facto leader, set a brisk pace. "Eyes sharp, people. Comms check, every thirty seconds," Taylor ordered, their voice echoing slightly before being swallowed by the surrounding silence. + +Sam, fiddling with a handheld device aimed at detecting electronic anomalies, offered a murmured "Copy that," their usual buoyancy dimmed by the oppressive atmosphere. + +It was Jordan Hayes who paused at an innocuous looking panel, nondescript amongst the gauntlet of secured doorways. "Mercer, Rivera, come see this," Jordan’s voice was marked with a rare hint of urgency. + +Alex joined Jordan's side, examining the panel which, at a mere glance, seemed just another part of the base's infrastructure. Yet, to the trained eye, it appeared out of place—a facade. + +Jordan explained their reasoning as Sam approached, instinctively understanding the significance of what lay beneath, "This panel is a recent addition — covering something they didn't want found." + +Before Alex could respond, the soft whir of an approaching drone cut through their muffled exchange. Taylor had looped back upon hearing the commotion. "Explanations later. We can't afford to attract..." Cruz’s voice trailed off as the small airborne device came into view, its sensors locked onto the group. + +Sam was the first to react, their tech-savvy mind already steps ahead. "I've got this," they declared, fingers flying over the controls of their own gadgetry to ward off the impending threat. + +The drone lingered, its scan seeming more curious than hostile. But within moments, courtesy of Sam's interference, the little sentinel drifted away, retreating into the shadows as if accepting a silent truce. The crew exhaled, a moment of collective relief palpable in the air. + +Cruz squared their shoulders, clearly ruffled but not conceding any ground. "Move out," they directed, a hint more forceful than before. "And Rivera, keep that trick handy." + +The team pressed onward, the quiet now filled with the soft beeps of regular comms checks, their pace undeterred by the confrontation. Yet, every agent held a renewed sense of wariness, their trust in one another deepening with the knowledge that the base—its technology, its secrets—was alive in a way they hadn't fully anticipated. + +As they converged upon a central hub, the imposing doors to the mainframe room stood ajar — an invitation or a trap, neither option comforting. Without a word, they fortified their resolve and stepped through the threshold, where the dim glow of operational LED lights and the distant hum of machinery hinted at Dulce’s still-beating heart. + +Solemnly, yet unmistakably together, they moved deeper into the heart of the enigma, ready to unmask the lifeforce of Dulce base or confront whatever existential threat lay in wait. It was in that unwavering march towards the unknown that their destinies were forever cemented to the legacy of Operation: Dulce. + +## Chapter 3 + +The thrumming of monitors cast a stark contrast to the rigid silence enveloping the group. Agent Alex Mercer, unfailingly determined on paper, seemed dwarfed by the enormity of the sterile briefing room where Paranormal Military Squad's elite convened. With dulled eyes, he scanned the projectors outlining their impending odyssey into Operation: Dulce. + +\* + +The cooling vents hummed in a monotonous drone, but it was the crackle of the comms system coming to life that cut through the lab’s tension. Dr. Jordan Hayes hovered over a table arrayed with alien technology, their fingers delicately probing the enigmatic circuitry retrieved from the crash site. Agent Alex Mercer watched, admiration blooming in silent solidarity for Jordan's deft touch and unspoken drive. + +Jordan, always composed, only allowed the faintest furrow of concentration to mar their brow. "What we understand about physics..." they muttered, trailing off as they realigned a translucent component. The device emitted a low pulse, causing Jordan to still. "Could be fundamentally changed by this." + +A calculated risk—that's what this was. And for a person of science, a gamble was worth the potential paradigm shift. + +"I’ve been thinking," Alex started, his eyes still fixed on the immediately tangible mystery before them. "About what’s at stake here. Not the mission parameters, but what this means for us—humanity." + +Jordan glanced up, meeting his eyes just long enough to convey the shared enormity of their situation; the career-defining glory and existential dread entwined. "The quest for understanding always comes at a price. We're standing on the precipice of knowledge that could either elevate us or condemn us." + +The charged air between them spiked as Taylor Cruz’s brusque tones sliced through their reverie. "Hayes, Mercer, this isn't philosophy hour. Focus on the task. We need actionable intel, not daydreams." + +With a sound of restrained acknowledgment, Jordan returned their gaze to the device, while Alex clenched his jaw, the buzz of frustration dull against the backdrop of Taylor's authoritarian certainty. It was this competitive undercurrent that kept him alert, the sense that his and Jordan's shared commitment to discovery was an unspoken rebellion against Cruz's narrowing vision of control and order. + +Then Taylor did something unexpected. They paused beside Jordan and, for a moment, observed the device with something akin to reverence. “If this tech can be understood..." Taylor said, their voice quieter, "It could change the game for us. For all of us.” + +The underlying dismissal earlier seemed to falter, replaced by a glimpse of reluctant respect for the gravity of what lay in their hands. Jordan looked up, and for a fleeting heartbeat, their eyes locked with Taylor's, a wordless clash of wills softening into an uneasy truce. + +It was a small transformation, barely perceptible, but one that Alex noted with an inward nod. They had all been brought here by different paths and for different reasons. Yet, beneath the veneer of duty, the enticement of the vast unknown pulled them inexorably together, coalescing their distinct desires into a shared pulse of anticipation. + +Marshaled back to the moment by the blink of lights and whir of machinery, they refocused their efforts, each movement sharpened by the knowledge that beyond understanding the unearthly artifacts, they might be piecing together the future of their species. + +\* + +Amidst the sterility of the briefing room, the liminal space between the facts laid out and the hidden truths, sat Sam Rivera, his demeanor an artful balance of focus and a casual disguise of his razor-sharp talent with technology. Across from him, Alex Mercer lingered in thought, the mental cogs turning as each file on Dulce stirred more than curiosity—it beckoned to a past both honored and burdensome. + +"You've been quiet, Sam," Alex noted, catching the younger man's contemplative gaze. "Your take on these signal inconsistencies?" + +There was a respect in Alex's tone, though a respectful distance remained—a gulf of experience and a hint of protective mentorship that stood between them. Sam nodded, recognizing the space afforded to him, and he couldn't help but feel the weight of expectation pressing upon his shoulders. It wasn't just the mission that was immense, it was the trust being placed in him. + +"The patterns are... off," Sam admitted, hesitant but driven. "If I'm right, what we're looking at isn't random—it's a structured anomaly. We need to be ready for anything." + +Alex's eyes brightened with a subtle approval that crossed the distance like a silent nod. "Good. Keen eyes will keep us ahead—or at least not blindsided," he said, affirming the belief that inscribed Sam's role as more than the tech personnel—he was to be a guiding intellect in the heart of uncertainty. + +Their exchange was cut short by Taylor Cruz's abrupt arrival, his gait brimming with a robust confidence that veiled the sharp undercurrents of his striving nature. "Time to gear up. Dulce waits for no one," Taylor announced, his voice carrying an iron resolve that knew the costs of hesitation—though whether the cost was calculated in human or career terms was an ambiguity he wore like a badge of honor. + +As Sam and Alex nodded in unison, the icy chasm of hierarchy and cryptic protocols seemed momentarily to bridge over with an understanding—this mission was convergence, a nexus point that would challenge each of their motives and strength. + +They filed out of the briefing room, their footsteps synchronized, a rhythm that spoke volumes of the unknown cadence they would soon march to within the base's veins. For Alex Mercer, the link with Sam Rivera, though distant, was now poised with a mutuality ready to be tested; for Taylor Cruz, the initiative pulsed like a heartbeat, anticipation thinly veiled behind a mask of duty. + +In the midst of the descent, they were each alone yet irrevocably joined, stepping closer towards the volatile embrace of Operation: Dulce. + +## Chapter 4 + +The corridors of the Dulce military base were as silent as a tomb and twice as chilling. Alex Mercer walked with a surety that belied his bubbling undercurrents of doubt. The briefing had been definitive, sturdy pillars of facts and protocols, yet as he ventured deeper, the ominous atmosphere gnawed at him—a stark reminder of how much remained unknown. + +Jordan Hayes trailed a few steps behind, their detached exterior breaking for a moment as they caught up to Alex. "What's on your mind?" Jordan asked, their astuteness cutting through the unspoken tension. + +Alex glanced back at them. This place was a puzzle, a treacherous labyrinth where the walls whispered secrets, and among them, he sensed a call to question, to challenge the narrative they'd been sold. "The silence here... It's almost as if the base is waiting for something—or someone." + +"Just stay sharp, Mercer," Jordan cautioned, yet their eyes lingered on the quietude around them, conceiving the same shadow of doubt that unsettled Alex. + +Before they could delve into further discussion, the distinctive click of a safety catch echoed in the hollow space. Both agents turned to find Taylor Cruz standing resolute, primed for combat. Taylor's gaze was scrutinizing and cold, a stark contrast to the growing unease that smoldered silently amongst the rest. + +"Chatter is a liability," Taylor snapped, with a commanding flair that bordered on tyrannical. "We move forward, eyes open, mouths shut." + +Alex felt the tight grip of compliance strangle his gut, a lesson learned under the hard tutelage of rank and order. But here, in the bowels of Dulce, those instincts began to wane, the imperative to adhere now conflicting with the pressing urgency to confront the shadows they were enmeshed in. + +Then, unexpectedly, the lights flickered, a power fluctuation—or a sign? Alex's hand instinctively went to his sidearm, his mindset shifting from soldier to skeptic. The base, with its unyielding coldness, had just given them their first nudge into the realm of the speculative, an invitation to peel back the veneer of reality. + +"We should consider all possibilities," Alex murmured, more to himself than the others, his voice a barely audible breath against the sterile air of the complex. + +Taylor's posture stiffened at the challenge, yet their response was uncharacteristically reserved, notable in its lack of rebuke. "Agreed. For now, keep moving. But stay vigilant." + +A surprise—an echo of agreement from the last person Alex expected it from. And there it was, the glimpse of a wrinkle in the unyielding fabric of command, a hint that perhaps they were all starting to sense the strangeness that permeated this place. + +Progressing with determined steps, the trio moved deeper, silently acknowledging the evolution of their predicament. It was a small yet transformative concession to the unknown forces at play, an acknowledgment from each agent that, despite their disparate goals and ideals, the true nature of the Dulce base was an enigma that would forge new paths through their convictions. + +As they reached the central communications hub, the truth that awaited them lurked in the shadows, its eyes unseen but felt by all. The walls didn't just whisper now; they spoke in tones only the brave—or the foolish—would dare to listen to. + +\* + +The subterranean silence of Dulce was an oppressive entity of its own, wrapping the team in a cloak of uneasiness as they pressed on through the dimly lit corridor. Jordan Hayes found themselves contemplating the ramifications of each step taken into this suspended world, where the sterile air seemed to mock the gravity of their predicament. The closer they got to the communication hub, the more Jordan's mind wandered toward the realm of the inexplicable. + +Beside Jordan, Alex Mercer moved forward with deliberation, his gaze scanning the heavy utility doors they passed—one of which was partially ajar, beckoning them with its darkness. "After you, Dr. Hayes," Alex said, gesturing toward the mysterious opening. A hint of shared understanding passed between them; knowledge was the guiding star of this mission as much as confrontation or recovery. + +Jordan peered inside, the beam from their flashlight slicing through the obscurity. The room beyond was a chaotic cascade of papers, overturned furniture, and the particular kind of disorder born from hasty evacuation—or something far more sinister. + +"It's like they vanished in the middle of something urgent," Alex murmured, his voice tight with a mix of concern and anticipation. He began to sift through the scattered reports, each page a potential clue to the enigmatic silence that shrouded Dulce. + +Behind them, Taylor watched with a disciplined patience, their authority the foundation upon which the operation was built. Their voice cut into the stillness, a reminder of their presence, "Time is not our ally here." + +Drawing back from momentary distraction, Jordan acknowledged the wisdom in Taylor's words, yet could feel the shift in their stance—from skeptical, reserved analyst, to a proactive agent within the narrative. "You're right; these documents may hold critical insights. Let's collect what we can and analyze them properly." + +From the darkened hollows of the room, shadows seemed to cast subtle judgment as Alex and Jordan worked together with heightened urgency. Taylor, for once, didn't intervene but instead surveyed the entrance, their mind anticipating the unknown variables that lay ahead. + +Unexpectedly, a soft hiss emanated from a neglected terminal on the desk. Jordan's head snapped up, their heart rate accelerating at the potential ramifications. Without a word, they moved to the machine, hands driven by the newfound conviction that knowledge was more than power—it was survival. + +As Jordan began to extract what data they could from the terminal, the first comprehensible communication from the depths of Dulce in far too long crackled through: an automated distress marker, looping endlessly without further context. It was a revelation, one that reverberated through the group, confirming their fears and igniting an even greater need to press on. + +Watching Jordan's dogged determination, Alex witnessed the minor transformation in his colleague unfold—a shift from doubt to action, a sliver of belief in the possibilities beyond their rational understanding. This forge of resolve amidst the alien echoes of Dulce not only bonded them closer as a team but compelled them forward with a sharpened edge of responsibility to the truth, wherever it would lead. + +As they collected their findings and regrouped, the base around them imperceptibly changed, the air charged with the vibration of secrets poised on the brink of revelation. And in that charged silence, the group moved on, each now carrying pieces of a puzzle that would soon converge into a picture of galactic significance. + +\* + +In the chill of the cramped server room, the hum of machinery was the backbone to a symphony of data streams coursing through the air. Dr. Jordan Hayes, nerves alight with the mission's mounting unknowns, patched into the last known coordinates of the unsent distress broadcast they had uncovered. They were so close to the core now – to the truth behind the blackout – it was almost tangible. + +Beside them stood Agent Alex Mercer, ever the soldier, yet with eyes that betrayed an intellect craving to understand the murk beneath the surface. "Any progress, Dr. Hayes?" Alex queried, his voice betraying a subtle urgency. + +"Getting there," Jordan replied, fingers dancing across the keyboard. "Whoever sent this was cut off mid-transmission. It's as if Dulce itself swallowed the message whole." + +Taylor Cruz closed in, their frame casting a long shadow over the duo, evoking an almost palpable wall between them and the forward momentum of their mission. "Time is against us," Taylor intoned, more statement than threat. "What we uncover here determines our next course of action." + +Alex acknowledged Taylor with a brisk nod, his stance firm. Yet inwardly, the tightening grip he felt from Taylor's words couldn't throttle the swell of his own investigative instinct. His soldier's obedience had begun to war with the advocate's zeal for unveiling the dark heart of Dulce's secrets. + +And then, the unexpected occurred. The screens flashed in unison, spilling a discordant stream of symbols and images that defied immediate analysis. Jordan's breath caught – this was the response they had been fishing for, an alien communication protocol resonating just at the edge of human comprehension. + +Each member of the team felt it: a shift in the room’s very atmosphere, like a veil being drawn from their perception. Alex and Jordan stood still, absorbed in the bewilderment of contact, while Taylor, despite their authority, hesitated – a minor betrayal that unease was creeping into even their disciplined heart. + +"Thoughts, Rivera?" Taylor rallied, seeking the counsel of Sam Rivera, whose eyes were wide with exhilaration. + +Sam stepped forward, breaking the spell of stillness. "It's like nothing I've ever seen before, but I think I can bridge our systems to communicate," they declared, a wisp of optimism braiding their voice. They set about adapting their gear to transmute the foreign signals into something the team could dissect, their actions a testament to the mentorship and belief instilled in them by Mercer and the team. + +Taylor observed them, a cold calculation behind their facade, as they weighed the worth of this anomaly. It was a crossroad that potentially led to either monumental breakthrough or unprecedented catastrophe. "Once you've established a line, document everything. We can't afford to miss any detail," Taylor ordered, the words sharper than intended. + +The connection was made, and with trembling anticipation, the team listened as the first garbled outputs began to emerge, their very essence promising insights that could alter the course of history. It was an enigmatic dance with the unknown, the pulse of Dulce no longer just a place, but a herald to an alien register the team had yet to decipher. + +Together, they stood at the precipice of understanding, where the faint glow of their monitors cast more than just light – it cast the shadow of burgeoning transformation. It was in this moment, in the grasp of an extraterrestrial tongue, that the team, bound by a hunger for knowledge and the raw edge of survival, found their mission reframed from a search for answers to the articulation of a question humankind had yet to fully ask. + +Silent in their commune with the inexplicable frequency, they realized they were not merely investigators; they had become liaisons on behalf of Earth, interpreters of a cosmic message that could redefine their very existence. The implications loomed large, but now, they would not face them alone – they would face them as a united front, wrought together by the very mysteries that once drove them apart. + +## Chapter 5 + +Dr. Jordan Hayes clutched the edge of the briefing room table, their fingers white-knuckled against the laminate surface, as an array of constellations rotated on the projector—charts and graphs bleeding across the stars. In the dim room, nebulas and dark matter seemed within arm's reach, tangible yet unfathomable. + +Sam Rivera leaned back against the wall, arms crossed, gaze darting between the swirling cosmos and the faces of their companions. A taut line of concentration etched their young features, a mingling of fervent curiosity with the nascent understanding of the high stakes for which they played. + +Jordan's voice broke the profound silence. "The patterns in the signal disruptions sync with none other than zenithal star alignments. It's as if... as if these 'meet and greets' were scheduled, predestined by celestial mechanics." + +The statement hung heavy, daring the occupants of the room to unravel its implications. Alex Mercer, his prior military resolve momentarily suspended, absorbed the hypothesis with a visible hunger. "It's like we're adhering to an appointment we never knew we had," he murmured, his heart a drumbeat in his chest. + +Taylor Cruz snorted—a sound that clattered against the high concepts like a tumbledown shack in a futurist cityscape. Folding their arms, they glanced between the agents, their apprehension clad in the contempt of practicality. "What we need are facts, not mystic conjecture." + +Alex pivoted on his heel, facing Taylor squarely, and his voice found its edge of steel. "This isn't mysticism, Cruz. It's a hypothesis based on observed phenomena as unpredictable as the place we're standing in." + +Taylor's gaze never wavered, yet the slight twitch at the corner of their mouth belied their taut composure. "If there's a semblance of truth to it, then it's critical intel. But remember, we're not astrologers—we're soldiers and scientists." + +Jordan met Taylor’s gaze with a curt nod, accepting the caution even as the crucible of their intellect smoldered with the fervor of cosmic discovery. Their eyes flicked to Sam, whose steady presence and ready tech affirmed a burgeoning dynamic—the makings of a sentinel, standing guard over the threshold of human understanding and cosmic reality. + +With the projector casting pallid light over their features, each agent became a silhouette of purpose, shadows pillared against the backdrop of an endless universe. The story they were embroiled in would soon demand they plunge into darkness to retrieve the light of knowledge—a light that could very well redraw the shape of their world. + +They left the briefing room with a shared silence, each pondering the vast weave of celestial intent and terrestrial response, sensing that the galactic appointment to which they'd unwittingly RSVP’d was more insistent—and more threatening—than any operation they’d faced before. + +\* + +As the Paranormal Military Squad team convened in the heart of the Dulce military complex, an air of bristling expectation clung to the walls of the underground sanctum. Alex Mercer’s brow furrowed while watching his companions—Jordan Hayes, diligently setting up their makeshift lab station, and Sam Rivera meticulously checking the communication relays they had restored. Taylor Cruz observed with hawk-like focus, yet to betray the strain that their command posed on them. + +The gravity of the mission had shifted, deepened; each member of the team felt its pull, tethered to the understanding that they were now part of a larger narrative—a cosmic play with Earth as a stage and the human race unwitting actors. + +Jordan paused, a tension creeping across their shoulders as they aligned the satellite data with the alien message that had been decoded. "The instructions in this message," Jordan started, the timbre of their voice betraying their usual composure. "They're coordinates and... a warning." + +Sam leaned in, their eyes widening behind the glow of their laptop screen. "A warning? Like, ‘stay away from’, or ‘beware of’...?" Their words trailed off, uncertainty a new companion in their lexicon. + +Alex exhaled slowly, his mind racing to connect the dots. "It doesn't matter which," he said, decisive yet contemplative. "What matters is we understand intent. Are we being warned out of concern, or are we stumbling upon a threat?" + +Cruz’s iron-clad facade momentarily cracked, a fleeting glimpse of vulnerability flashing through their eyes. "We need to know if this entails additional risk to the operation," they said, directing their gaze specifically at Alex. "Mercer, I rely on you to keep the team grounded. No one goes off-course." + +Their reminder seemed both a command and a plea—rooted in an understanding that each member of the team now faced the duality of their roles, protectors of earthly secrets and heralds of potentially devastating revelations. + +Sam's fingers stilled mid-type, their task forgotten as they absorbed the weight of the unfolding reality. "We're the first line of defense... or detection," they mused half to themselves, a growing sense of agency within the larger play they were cast into. + +Jordan returned to the data, more resolute in their actions. The warning, whether cautionary or dire, was a beacon they no longer could ignore; its light casting aside shadows of doubt and igniting a collective purpose within the team. + +Alex watched Jordan and Sam, feeling a brotherhood in their shared quest. As Cruz paced, poised on the cusp of decisions that would mark their career and perhaps the fate of many, Alex knew the narrative had changed. They were no longer mere operatives; they had become guardians of a threshold, keepers of a message from a realm beyond stars and stripes. This elevation in their mission could not be shackled by regulations and established protocols—it demanded a new perspective, a new resolve. + +Tension threaded through the dialogue of beeps and static as communications with Washington buzzed in the background. The team stood, a portentous air enveloping them. It was clear that the decisions they made in the ensuing hours could redefine humanity's place in the cosmos or condemn them to ignorance and potential peril. + +Their connection to the stars solidified, the group moved to address the crystallizing warning, shifting from passive recipients to active participants. Mercer’s latter instincts gained precedence— the team’s mandate had evolved, no longer solely to observe and report but to interact and prepare. A metamorphosis had begun, and Operation: Dulce hummed with the newfound frequency of their daring, a tone set not by the earthly hierarchies but by the pulsing symphony of the universe itself. + +\* + +The desert night loomed eerily still as echoes of hidden activity reverberated deep beneath the bleak sands of New Mexico. Diverting his gaze from the array of sensors before him, Jordan Hayes allowed a rare breath, deep and anxious. Turning to Alex Mercer's focused silhouette, the nocturnal landscape illuminated softly by makeshift floodlights, Jordan felt the syncopated tempo of apprehension and exhilaration jockey for primacy within. + +"The closer we get to unlocking these messages, the more I feel like we're peeling back layers of reality itself," Jordan confided, eyes not leaving the monitors that presented a constellation of data points. + +"Yes," Alex replied, his voice steady as he considered the implications of their discovery. "And we have to be ready for whatever we find beneath those layers. Whether it's a breakthrough or a Pandora's Box." + +Silence settled between them, broken only by the occasional buzz of communications equipment attempting to bridge terrestrial and extraterrestrial intelligences. Tense moments drifted by, laden with the expectant weight of near breakthrough, when a soft chime signaled an incoming transmission -- a rare sound that set every agent on high alert. + +Absent was the voice of Washington or Paranormal Military Squad command. Instead, a rhythmic series of pulses and tones filled the air, deliberately patterned, unmistakably non-human. + +Sam Rivera adjusted the sensitivity of the decoding equipment, their hands shaking with anticipation as much as focus. "I have it!" they announced, the signal transforming under their expertise into a sequence of visual symbols on the screen before them. + +Their shared excitement was palpable, a kinetic force resonating between the team members as they crowded around the display. + +"What does it say?" Taylor Cruz demanded, the urgency in his tone scraping against the newfound wonderment. + +Interpreting the alien syntax required not only decoding but intuition and empathy. The words that emerged upon the screen were at once coherent and enigmatic: "*Voyage. Convergence. Peril.*" + +The stark simplicity of the message struck them collectively, a chill breeze wafting through their resolve. + +Alex stepped forward, piecing together the cryptic communication with a growing sense of obligation. "It’s a call to action," he deduced, "or possibly a summons." + +Jordan's gaze met Alex’s, both understanding that this was no longer an investigation or mere extraction of hidden truths. This was humanity's unwitting enlistment into a galactic dialogue that defied boundaries of nation, creed, or protocol. + +Sam's eyes were aglow, not with fear, but with the profound acceptance of inevitability that comes with groundbreaking revelation. Moreover, within Taylor's stern exterior churned the seed of reluctant admiration for the unclassified, the uncharted realms they were approaching. + +Together, they accepted the pivot in their mission, readjusting their objectives from exploration to engagement, and from isolation to a communal outreach beyond the stars. As dawn's first light threatened the horizon, it became clear that they were no longer merely operatives of a clandestine governmental faction—they were delegates on behalf of Earth, embarking on a voyage orchestrated by destinies unrelated to the mere geopolitics of their world. + +Turning to each other, their silhouettes sketched against the coming dawn, the agents recognized the transformation within and amongst them. They were bound by more than duty—they were intricately woven into the fabric of an unfolding cosmic opera, one in which they had been granted an undeniable role. And as they set course for the coordinates that beckoned them like a distant siren's call, it was with a solemn dedication to not only uncover the mysteries ahead but to navigate the convergence, and the peril, as unified emissaries of a world on the cusp of a broader understanding. + +\* + +Beneath the hum of the fluorescent lights and the vigilance of silent monitors, Alex Mercer stood with his team in the threshold of the base's command center, their faces etched with the fatigue of hours spent unraveling galactic mysteries. Jordan Hayes broke the stillness with a delicate fusion of disbelief and resolve. "The signal..." they began, their tone deliberate, "it’s evolving. It’s not just sending a message—it’s responding to us." + +Taylor Cruz leaned over the console, their eyes narrowing with intrigue and a flicker of unease, studying the alternating patterns on the screen. "Responding? Like it’s alive?" Taylor asked, a question that bordered on the edge of wonder and alarm. + +Sam Rivera’s gaze was locked onto their interface, a digital orchestra at their fingertips. "It could be some form of advanced AI. Or something else entirely," they contributed, a note of exhilaration betraying the gravity of the situation. + +Alex paced before the terminal, absorbing the enormity of their predicament. Their mission—once rooted in the solid ground of military discipline and covert operations—had transcended into an encounter of unprecedented import. "We need to be cautious," he advised, his voice a low rumble of cautious strategy. "If this signal is intelligent, how we interact with it could dictate the outcome of this entire operation." + +Jordan met Alex's gaze with a nod, the weight of the responsibility shared and accepted. "We have protocols for first contact, but nothing for... this," Jordan admitted. The room was gripped with tension, each breath seemingly louder than the last. + +Then, with a sudden burst that filled the command center, the signal coalesced into a clear and distinct pattern which replicated and expanded, its complexity revealing the hand—or mind—of an intelligent architect. + +Taylor's instinct for command surged forth. "Prepare to record and analyze. Whatever it is, we need to understand it—" But their words were cut short as the signal surged, enveloping the room in a brief, blinding cascade of light. + +In that pulse of brilliance, a shared revelation coursed through the team. The signal had become a bridge, an extension of unknown consciousness reaching towards them, testing, communicating, searching. + +Alex stepped back from the light, feeling a profound change unravelling within him. The path forward would not be one of confrontation or conquest, but of connection and comprehension. + +Jordan turned to Alex and Taylor, seeing in their faces a reflection of the same metamorphosis taking place within themselves—a movement from observers to participants, from agents to ambassadors. + +With a collective breath, the team faced the kaleidoscope of lights. The alien signal, once a harbinger of enigma, was now a catalyst for transformation—a symphony of light and sound that echoed the beginnings of a new relationship between humanity and the alien unknown. + +And so, with deliberate steps, Alex Mercer led his team into the luminous fray. Science, protocol, and survival instinct harmonized within them, each member poised on the cusp of a new chapter in human history. + +They were no longer merely the instruments of Paranormal Military Squad's will—they were the vanguard of humankind’s first definitive leap into the cosmic community. + +With the last echoes of the signal resonating in the control room, they each embraced the sequencing of the transmission, the dance of extraterrestrial light that now wrote itself into their story. The chapter of Operation: Dulce drew to a close, but the narrative of their destiny had only just begun. + +## Chapter 6 + +\* + +The cool darkness of the command center at Dulce base was a stark contrast to the brewing storm outside, where the unforgiving New Mexico desert winds whispered of the hidden truths that lay buried deep beneath its surface. Dr. Jordan Hayes sat, their eyes fixed on the readout, the frenetic dance of symbols and numbers reflecting off their determined face. They were on the cusp of an epiphany, teetering between the widely accepted laws of physics and the promise of a new cosmic paradigm. + +Alex Mercer watched from across the room, noting the subtle shifts in Jordan’s posture that belied a developing readiness to embrace the unbelievable. “Find something?” Alex’s question, asked with a blend of curiosity and solidarity, bridged the gap between a command and a genuine query among equals. + +Jordan's response was slow, measured against the magnitude of their analysis. “This isn’t random static. It’s a pattern - a repeated sequence phasing in and out but distinctly artificial.” Jordan turned away from the screen, locking eyes with Alex. “This could change everything.” + +Sam Rivera leaned in, their eyes alight with the fires of revelation and a quenchless thirst for understanding. “A pattern means intention. Could it be a message?” + +A figure emerged from the doorway, casting a long shadow into the room - Taylor Cruz. “Intentions can be friendly, or hostile. We shouldn’t forget that,” said Taylor, bringing a dose of their usual pragmatism into the heart of discovery. + +Alex acknowledged Taylor’s caution with a nod, understanding the need to keep their feet grounded even as their spirits soared toward the unknown. “Then let’s be the first to find out which it is." + +The team gathered around the monitors, the soft tapping of Jordan's keystrokes now punctuated by the occasional crackle of Sam's radio equipment. The sound was almost ritualistic, a prelude to humanity’s potential first, knowing foray into a larger universe. + +Jordan’s fingers paused, suspended in mid-air. The signal had evolved, becoming a beacon that somehow felt less alien and more familiar. It was as if the complexities of their message were unfolding into something more accessible, more terrestrial. + +A hushed excitement swept through the room. The transformation suggested an awareness on the part of the unknown senders; a finesse that spoke volumes about their capabilities and perhaps their intentions. + +With the growing realization that they were engaging with an intelligence far exceeding their previous understanding, the team prepared to reach back across the cosmic divide. Prepared or not, they were no longer bystanders in this galactic narrative. They were active correspondents in an exchange that transcended galaxies and welcomed them into an expansive, possibly fraught, interstellar conversation. + +\* + +Inside the cavernous central hub of Dulce military base, Dr. Jordan Hayes stood in near-darkness, surrounded by a nest of cables and monitors that buzzed with silent, cryptic life. Jordan's eyes narrowed to focus on the sequences that danced across the screen—patterns that could unravel the cosmic enigma surrounding them. + +Alex Mercer approached with his characteristic stride, a signal of reliability in the chaos. "Status report, Dr. Hayes?" he inquired, his voice low, almost blending into the soundscape of beeping consoles and swirling fans. + +"We're on the brink of unravelling the signal's origin," Jordan replied, the weight of implications heavy in their tone. "There's intelligence behind it, a thought process alien to our own." + +As if summoned by their analysis, Taylor Cruz approached with authority radiating from every pore. "Understand this, we need to know if it's friend or foe. Don't get wrapped up in the existential—our lives may depend on the answers you provide." + +Sam Rivera, their hands adroitly adjusting a device to fine-tune the signal, chimed in with optimism undercut by anxious anticipation. "We're deciphering the comm encryption. Soon, we'll have a channel open—not just listening in, but speaking back." + +Alex nodded his understanding, his strategic mind processing the tactical implications while grappling with the more profound humanistic impact. "When we do, we'll tread carefully, communicate with purpose," he reassured the team. + +The operation had evolved rapidly, from a stealthy incursion into a clandestine labyrinth to an exchange with an extraterrestrial intellect. Their earlier trepidation transformed into determined focus, as they prepared to extend humanity’s hand into the vast unknown. + +An alert on one of the monitor stations snapped the team into alarm. The signal had not simply been waiting—it had been calculating. Now, it reached its crescendo, demanding their attention with a provocative urgency. + +Jordan's fingers raced over the keyboard, their eyes simultaneously interpreting data and sharing directives. "It’s a linguistic lock, a test of comprehension. We crack this, we establish dialogue." + +Taylor's presence was a beacon of steely resolve. "Then let’s solve it. This is what we trained for—the unknown." + +Alex and Sam exchanged a look that telegraphed their shared determination—this was not only the mission they had trained for; it was the mission they had been destined for. + +Together, the Paranormal Military Squad team leaned into the challenge, their minds honing in on the complex patterns with a singular goal: to unlock the conversation with an intelligence that had already begun to shift the foundations of what they knew, or thought they knew, about the universe. + +In a symphony of clicks and murmurs, they worked, knowing they were about to make a giant leap not just for themselves or Paranormal Military Squad, but for all of humanity. As the final pieces fell into place, Dulce's militaristic silence was shattered by the sound of intergalactic contact—by the sound of history being made. + +## Chapter 7 + +In the enclosed space of Dulce’s command center, the air was thick with anticipation, each team member poised to tread the razor's edge between scientific breakthrough and galactic peril. Dr. Jordan Hayes focused intently on the screen, their fingers tapping a staccato rhythm against the keyboard as lines of alien code cascaded down the monitor. + +Alex Mercer's steely gaze surveyed the room, stopping on each member of his team. "Thoughts?" he asked, echoing the unspoken tension. His question, while directed at the group, lingered on Jordan—acknowledging their expertise and inviting collaboration rather than dictating orders. + +Jordan’s brow furrowed, an indicator of the mental gymnastics being performed. "It's unprecedented," they finally said, their voice a testament to the gravity of the moment. "Behavioral algorithms... if we're right, this code could reveal extraterrestrial thought patterns." + +Before anyone could react, Taylor Cruz interjected with the assertiveness of someone accustomed to commandeering the discourse. "Then let’s ensure we’re deciphering it correctly," Taylor stated, their tone suggesting they were still battling to maintain control over an increasingly alien situation. + +Sam Rivera hovered near the mainframe, youthful energy barely contained under the surface. "What if it’s more than just a message? What if they’re trying to extend consciousness across the stars?" + +The room fell into a contemplative silence, broken only by the hum of electronic equipment and the distant thud of secured doors locking in rhythm. The weight of responsibility rested on each agent's shoulders—a heaviness palpable in the air they shared. + +Alex stepped forward, reaching a subtle decision, one dictated by foresight and the humanity nestled at the core of their mission. "We approach with the aim to understand, not to confront," he said, softening his military bearing into a more diplomatic stance. + +Jordan nodded, appreciating the leadership that Alex displayed in the face of the unknown, and turned back to the cryptic data. Here, before them all, was a tangible piece of evidence—proof of an extraterrestrial sentience that had outreached the bounds of their expectations. + +Taylor took a breath, simultaneously exuding a sense of preparedness and venturing into the unknown alongside their peers. "Then let’s do what Paranormal Military Squad does best—investigate and adapt," Taylor added, finding comfort in the familiar even as they stood on the cusp of an unprecedented alchemy of science and mystery. + +The team leaned into their respective roles, driven by the urgency of the assignment and the pull of an insatiable curiosity. Sam offered a grin that belied the tension, a youthfulness that reminded them all of the profound excitement nested within the terror of the unknown. + +Quietly but resolutely, they turned back to their instruments, each of them a sentinel on the threshold of a new reality. The once implicit lines of command were now woven into a shared tapestry of hierarchy and camaraderie. As they danced with the unknown, they were beacons of sentient endeavor, casting the light of human consciousness into the vast darkness that called to them. + +\* + +\* + +Dulce Base's cavernous darkness was pierced by the sharp luminescence of monitors, casting an electric glow onto the faces of those who dared to unearth its secrets. Dr. Jordan Hayes stood motionless, eyes glazed in concentration, their mind a nexus where terrestrial science battled with celestial unknowns. + +Alex Mercer watched from a slight distance, the weight of command tangible upon his shoulders, though lightened by the shared burden now held amongst them. "We could be on the frontier of a new kind of diplomacy," he mused aloud, giving voice to the moment's gravity. + +At those words, Jordan's trance broke. "If that's the case, then these communications," Jordan motioned to the stream of data, "are our olive branch across the cosmos." + +Taylor Cruz, who paced with restless energy, halted and faced the team—his stoicism marred by the erratic dance of lights reflected in his eyes. "An olive branch, or an invitation to a battlefield?" he posed, ever the strategist, his words laced with a hint of cynicism. + +Sam Rivera, nestled amongst an array of equipment, licked their lips—a mixture of nerves and anticipation palpable. "We're mapping out something incredible here. Whether it's peace or war, we're the cartographers." + +Silence enveloped them like the expanse of space itself, each member contemplating the chasms they might bridge—or the abysses into which they might unwittingly descend. + +Alex's demeanor assumed a quiet resolve—the profound knowledge that this mission was as much about navigating uncharted philosophical territories as it was about ensuring survival. "Whichever it proves to be, we'll face it. Prepared, unified." + +A nod passed between Jordan and Alex, a silent exchange of mutual respect and shared mission. Sam, buoyed by the weighty encounters of the mind and machinery, entered keystrokes with a fervor that seemed to bring them ever closer to the alien mind. + +They stood there, the Paranormal Military Squad team, not just as guardians of homeworld secrets or as soldiers of clandestine wars, but as humankind's chosen few at the fulcrum of history—a history that was now unfolding to the rhythm of otherworldly codes. + +Each revelation, each parsed symbol, inched them toward the line between the earthly and otherworldly. And as they stood on this precipice of cosmic negotiations, it was clear the ensuing dialogue would not just shape the future of Paranormal Military Squad—it could very well redefine the parameters of human existence. + +\* + +The hum of advanced computational systems tingling with cryptic transmissions framed the ambiance of Dulce's mainframe chamber. Jordan Hayes, fingers hovering over a console dense with blinking lights, furrowed their brow as sequences of alien data streamed across the screen. + +Alex materialized behind them, his presence a stable beacon amidst the technological whirlwind. "Look for patterns, anomalies. Anything that might resemble a handshake protocol in their communications," he directed, his voice a low thrum, reverberating with cautious optimism. + +Jordan cast a glance over their shoulder, acknowledging Alex's contribution with the shared understanding of colleagues who had transcended mere professional acquaintance. "I’m isolating sequences that seem to recur with more intention than static. If these are their ‘handshakes,’ then we might just be making first contact," they remarked, their focus returning to the screen with renewed vigor. + +From the other end of the room, where shadows married the artificial light, Sam's voice crackled through the static of nearby speakers, "Don't forget the anomalies we detected earlier. Each one could be a word, a sentence, or even a concept untranslatable to our current understandings." + +Resolute, Taylor Cruz stood at Jordan's other side, a stoic figure wrestling with the implications of their mission. "Keep pursuing this line," Taylor instructed, an undercurrent of intensity carried forth in their otherwise composed demeanor. "And remember, this isn't just about making contact; it's about securing knowledge for humanity." + +Alex offered a nod that spoke volumes, conveying his understanding of the stakes at play. Here, in this chamber of possibility, the team's actions would determine if humanity stood at the brink of a new age of understanding or the onset of an unprecedented threat. + +Every second thrummed with significance as Jordan and Sam worked in tandem, each keystroke a foray into the unknown. Taylor observed with a commander's scrutiny, the gravity of their role sustaining them against the waves of ambiguity breaking against their resolve. + +Pivotal moments come rarely in the course of human events but here, amidst the electronic symphony of a stalwart command center, lay the incepting notes of a cosmic overture. The harmony between human and alien, between Paranormal Military Squad and the vast reaches of space, began its first tentative measures, with each member of the team a vital instrument in a celestial ensemble yet to be fully heard. + +\* + +The crisp air within the mainframe room of Dulce base seemed to hum with unspoken possibilities. Jordan Hayes was the centerpiece of focus, their hands dancing methodically over the console as streams of otherworldly code cascaded down monitors, each flicker a potential key to the cosmic doors they were inching open. + +Alex Mercer watched, posture relaxed but eyes sharp. "Remember, this could be our first introduction, maybe even our first impression," he said, mindful of the gravity carried by each action they made henceforth. + +A hint of a smile touched Jordan's face, a small acknowledgment of the monumental task at hand. "Understood. I'm balancing the signal's syntax with our algorithms. If we're interpreting this correctly, it could be... well, an invitation." + +Into the electric tension of the chamber walked Taylor Cruz, their silhouette a sharp contrast against the cool lighting, radiating a presence that spoke of command and chilly tenacity. "An invitation, or a challenge?” Taylor questioned, the weight of their suspicion casting a different tint on the cascading data. + +Sam Rivera, in a corner arrayed with sophisticated equipment, piped up, their voice a buoyant note amidst the tentative atmosphere. "Either way, it's a connection. One that we're uniquely positioned to navigate," they remarked with an air of optimism threading through the uncertainty. + +Alex channeled the strengths of his team into the core of their approach, his leadership adapting to the contours of an unprecedented scenario. "Cautious and curious," he reflected aloud, shaping a strategy that balanced their thirst for comprehension with the prudence required in addressing the unknown. + +Jordan, hands momentarily at rest, looked up. The signal was more than a sequence of bits and commands—it was a riddle wrapped in the depths of space-time, and they were on the cusp of parsing its meaning. + +Taylor, hardly a step away, nodded in silent agreement. The implications of their findings might very well direct the course of human destiny from this point onward. + +Finding a tempo among themselves, the Dulce team was a confluence of ambition and acumen, each member intuitive to the beats of discovery. The chamber around them held untold stories, secrets coaxed from the stars, that now, led by Paranormal Military Squad's finest, began to unravel. + +The future in those moments was unwritten, a narrative scribed not in the dust of desert confines, but in the potential for interstellar diplomacy and understanding. As they prepared to script humanity's next chapter, the room seemed to pulse with the heartbeat of a story far greater than the sum of its parts. + +## Chapter 8 + +The grit of an earthbound dust storm contrasted sharply with the pristine sterility of the underground command center. Alex Mercer, eyes set with fervent determination, stood over Jordan Hayes, whose fingers danced across the keyboard with rapid purpose. Monitoring the progression of alien code unraveling before them, Mercer spoke with a tempered urgency, "Keep it steady, Jordan. We might be initiating the first true interspecies communication bridge here. It's all about finesse now." + +Taylor Cruz, the embodiment of military precision, surveyed the room with a calculated gaze from their vigil beside an array of glimmering screens. "Remember, these could be delicate negotiations -- or coded threats. Stay sharp," Cruz added, their voice cool as polished steel. + +Jordan, with a silent nod, recognized the gravity of both stances. Gravitating between scientific acuity and diplomatic caution, they replied, "The sequence is aligning—syncing with our comms. It's looking more and more like direct engagement." + +Amid the banks of electronic machinery, the thrumming pulse of an impending interspecies signal exchange, Sam Rivera interjected with a youthful zeal that cut through the weighty atmosphere, "It's not just an exchange. It's a... symphony. It's as if they're teaching us their language through modulation." + +A moment of profound silence swept over the team. The isolation of their location, deep within the top-secret labyrinth of Dulce, became suffused with an almost palpable sense of historical significance. + +"Then our response needs to be equally symphonic," Alex uttered, contemplating the awe-inspiring transmutation of their task from a simple recovery mission to a full-blown cosmic concerto. + +With a renewed sense of wonder tempered by caution, the Paranormal Military Squad team found themselves harmonizing a delicate balance between envoys and interpreters. The long shadow cast by their duty was now illuminated by the brilliant glow of otherworldly dialogue. + +In this carefully orchestrated march towards the unknown, each individual's expertise became critical notes in a larger melody. The narrative of human achievement, so often defined by solitary pursuits, now emerged as a collaborative opus, each member of the team a maestro in their right. + +The protocols of encounters, the mathematics of languages, and the poetics of connection all fused into a singular moment of convergence. The echo of their efforts reverberated back to them, not through the cavernous base's concrete walls, but from light-years away, in the form of a reply, intangible yet infinitely profound. + +\* + +Amidst the hum of the supercomputers and the faint static from the scrambled transmissions, Alex Mercer cast a thoughtful glance across the dimly lit room toward where Dr. Jordan Hayes was methodically adjusting the archaic dials of the decryption machine. "Any progress?" he asked, his tone conveying both impatience and the deep-seated respect born from countless shared challenges. + +Jordan did not look up, their gaze remained locked on the flickering lights that represented a dialogue suspended between worlds. Their fingers ceased their dance, hovering meditatively over the controls. "We might be on the cusp of a breakthrough," Jordan suggested. "The signal... it's evolved. It's reflexive now, responsive in a way that suggests sentience." + +Taylor Cruz's familiar sharp strides approached the two, breaking the rhythm of soft beeps. "Responsive is good, if it means understanding," Taylor said, head tilted as they peered at the encryption data scrolling by. "But remember, comprehension can bring revelation or conflict." + +Sam Rivera’s youthful voice permeated the tension, brimming with an excitement edged by the enormity of what they faced. "If it's truly sentient, we're not just cracking a code; we're learning how to converse with an entirely new form of consciousness," they chimed in, the weight of history not lost on the zealous astrotechnician. + +Alex nodded, his thoughts alighting on potential strategies for navigating the conversation they were cultivating with the unfathomable. "We need to keep that conversation going, echo its patterns, and speak its language," he resolved, knowing the delicate nature of their work merited every ounce of their collective acumen. + +The chamber now was a crucible, forging within it the future narrative of human contact with the unknown. Every signal pulse they sent out was an invitation for understanding, and every echo back a step closer to bridging the cosmic divide. And so, together, they stood - agents in Paranormal Military Squad's clandestine ranks, united by purpose, sculpting humanity’s first sonnets into the void. + +\* + +#### Knowledge graph updates + +- (Jordan Hayes, Interprets, Communications as cosmic diplomacy, Moderate) + +- (Taylor Cruz, Questions, Potential aggressiveness of alien intent, Minor) + +- (Sam Rivera, Expresses, Optimism about forming a connection, Minor) + +- (Alex Mercer, Adopts, Balanced strategy for contact, Moderate) + +- (Paranormal Military Squad team, Navigates, Beats of cosmic discovery, Moderate) + +- (Paranormal Military Squad team, Prepares, To script humanity's interstellar narrative, Major) + +## Chapter 9 + +The sterile silence of Dulce Base's command center was thick with concentration as Alex Mercer surveyed his team, hunched over their respective technological battle stations. Each agent was a weapon against ignorance, their adversary a code from beyond the stars that held secrets to alien thought. + +Dr. Jordan Hayes, whose hands had been steadfastly working the decryption algorithms, paused and looked up at Alex. "We're through the next layer of encryption," Jordan announced, a mixture of pride and gravitas in their tone. "It's communicating. It's... aware." + +A shadow momentarily clouded Alex's determined features—awareness implied so much more than mere intelligence. "Aware and reactive or aware and proactive?" he queried, his experience anticipating the pivotal importance of intention. + +"Unknown at this stage," Taylor Cruz interjected, looking up from a datasheet. "But I urge caution. We tread the line between breakthrough and disaster with each keystroke." + +Sam Rivera, ever the source of technological acumen, added their voice to the conversation. "The signal's adapting every time we interact with it. Like a conversation where both parties are learning each other's language in real time." + +Alex leaned in, rested a hand on Jordan's shoulder—a sign of companionship and an affirmation of trust. "Keep the communication channels open. But let no message, no pulse go unchecked. This could be our Rosetta Stone or our Tower of Babel." + +Silence fell over them, a momentary lull as each member of the team contemplated the historic weight of their task. Yet, it was impregnated with a tangible sense of excitement—a collective energy that thrummed through the air just as palpably as the electric current through the banks of machines surrounding them. + +They continued their work, squaring shoulders against the magnitude of their undertaking. The agents were standing not just at the precipice of a new chapter for Paranormal Military Squad but for all of humanity. For now, they communicated with powerful unknowns, but with each exchange, they were etching the first words of a dialogue that might forever alter humanity's place in the cosmos. + +\* + +\* + +The sterile silence of Dulce Base's command center was thick with concentration as Alex Mercer surveyed his team, hunched over their respective technological battle stations. Each agent was a weapon against ignorance, their adversary a code from beyond the stars that held secrets to alien thought. + +Dr. Jordan Hayes, whose hands had been steadfastly working the decryption algorithms, paused and looked up at Alex. "We're through the next layer of encryption," Jordan announced, a mixture of pride and gravitas in their tone. "It's communicating. It's... aware." + +A shadow momentarily clouded Alex's determined features—awareness implied so much more than mere intelligence. "Aware and reactive or aware and proactive?" he queried, his experience anticipating the pivotal importance of intention. + +"Unknown at this stage," Taylor Cruz interjected, looking up from a datasheet. "But I urge caution. We tread the line between breakthrough and disaster with each keystroke." + +Sam Rivera, ever the source of technological acumen, added their voice to the conversation. "The signal's adapting every time we interact with it. Like a conversation where both parties are learning each other's language in real time." + +Alex leaned in, rested a hand on Jordan's shoulder—a sign of companionship and an affirmation of trust. "Keep the communication channels open. But let no message, no pulse go unchecked. This could be our Rosetta Stone or our Tower of Babel." + +Silence fell over them, a momentary lull as each member of the team contemplated the historic weight of their task. Yet, it was impregnated with a tangible sense of excitement—a collective energy that thrummed through the air just as palpably as the electric current through the banks of machines surrounding them. + +They continued their work, squaring shoulders against the magnitude of their undertaking. The agents were standing not just at the precipice of a new chapter for Paranormal Military Squad but for all of humanity. For now, they communicated with powerful unknowns, but with each exchange, they were etching the first words of a dialogue that might forever alter humanity's place in the cosmos. + +\* + +Alex Mercer's eyes were fixed on the monitors, the reflected light casting an ethereal glow across his stoic face. The room buzzed with tension, a cacophony of low hums and electronic beeps that underscored the historic nature of their actions. He moved to where Dr. Jordan Hayes was immersed in their work, scrutinizing the alien code streaming rapidly down the terminal. + +"Find anything that might look like an entry point or a... digital handshake?" Alex asked, his voice steady, betraying none of the tension gripping his chest. + +Jordan looked up briefly, their expression weary yet intense, "Potentially. It's as if the code is anticipating our input, modifying itself in real-time. I've never seen anything like it." + +From across the room, Taylor Cruz's sharp voice cut through the hum. "Then it's learning or, possibly worse, baiting us. Proceed with extreme caution," they commanded, their firm stance reinforcing the gravity of the situation. + +Sam Rivera, surrounded by a cascade of screens and interfaces, added, "It's almost organic in its complexity. Any minute now, and I might have a way in." + +A slight nod was Alex's immediate response, his mind racing through the potential scenarios. "Everyone, stay alert. This could be the beginning of something profound." His seasoned eyes never left the unfolding drama on the monitors. + +The room fell silent, the air heavy with unspoken questions. Were they mere moments away from unlocking an otherworldly dialogue? Or was it a Pandora's box that, once opened, could not be closed? + +Alex moved closer to the main console, his fingers hovering over the command keys. With the precision of a maestro orchestrating a symphony, he communicated silently with Jordan – respectful of their expertise, aware that the next move could alter the course of human history. + +Jordan met his gaze, nodding sharply, and refocused on the task. The signal seemed to pulse with sentient curiosity, drawing them further into its intricate web. + +A sudden flurry of alerts and the intensifying glow of monitors heralded that they had bridged a technological chasm. The alien intelligence on the other end was no longer a distant enigma – it was an active participant, responding to their digital overtures with an unknown agenda. + +The team's meticulous efforts had led them to a momentous threshold. Beyond lay unprecedented contact – a nexus of curiosity and potential peril. Within the confines of the base, against the backdrop of a silent desert night, the Paranormal Military Squad operatives became mediators of Earth's bid for cosmic relevance, their every action now a gesture in the grand dance of intergalactic relations. + +## Chapter 10 + +The corridors of the Dulce military base, now silent, echoed with a history of whispered conspiracies and furtive movements. But in the command center, a delicate tapestry of light and sound was being woven as the echoes of cosmic dialogue resonated through the high-tech enclave. Dr. Jordan Hayes, now leading the efforts, called out from their workstation, "I’ve isolated the signal's harmonics. It's more than a call; it's a song, an interstellar siren’s call." + +Alex Mercer, steady and resilient in the face of the incomprehensible, acknowledged with a quiet nod, "A song that we need to learn—quickly." His eyes, heavy with responsibility, scanned the room, watching his team work tirelessly at the intersection of science and speculation. + +Sam Rivera, dulled by fatigue yet driven by unshakeable resolve, manipulated a complex array of audio interfaces. "There's a pattern, a repeating motif. It's structured, intentional," they muttered, their revelation a bridge between the known and the unimaginable. + +Taylor Cruz, a figure of central authority, paced the length of the room, their usual unflappable demeanor betraying a rare flicker of apprehension. "We should be wary of the sirens’ call," Taylor interjected, invoking myths of old as a cautionary metaphor. "We don't want to crash upon unseen shores." + +Undeterred, Jordan cast a determined glance at the team. "We navigate by starlight now, not by the limited light of our previous understanding." Their voice was a beacon, charting a course through unchartered realities. + +Every individual was acutely aware that each moment in that room was a conduit to an epochal shift for civilization. The mysterious signals, once distant and alien, had coalesced into complex and harmonious oscillations—beacons of an extraterrestrial intellect inviting Earth to join in a cosmic consortium. + +Silently, Alex approached the mainframe, his trained fingers aligning with the console’s mechanisms. The room watched in collective breathlessness as he set the frequency in motion, an introductory phrase to an otherworldly melody—a symphony that could bind worlds or spell devastation for all they knew. + +In the control room of Dulce, amongst whispered legends and the quiet hum of machines, humanity's ambassadors now stood, stretching their hands into the void, reaching for the hand that would either pull them into the light of new stars or into the maw of darkness between them. + +\* + +Underground, the Dulce facility's command center was awash with frenetic energy, a stark juxtaposition against the silent, decrepit corridors that enveloped them. The air hummed with anticipation as Dr. Jordan Hayes and Alex Mercer hunched over a console. The sterile light from the monitors cast an otherworldly glow upon their faces, now reflecting a mosaic of alien characters rapidly translating across the screen. + +"The patterns are evolving," Jordan murmured, concentration etched into their every feature. "It’s as if our attempts to decrypt have accelerated its learning. It’s adapting to us." + +Alex, who stood steadfast behind Jordan, felt a tinge of uncharted fear quickly quelled by the fire of discovery raging within him. "Keep it up," he urged. "But whatever this is becoming, we need to ensure it remains within our control." + +Taylor Cruz interjected, their voice slicing through the buzz of activity. "Control may be an illusion when facing an intelligence that literally writes its own rules," they stated stoically, casting a watchful eye over the flurry of data. + +"It's like it's learning to communicate," offered Sam Rivera from a nearby interface, their youthful energy boding a mix of awe and anxiety. "This gives ‘talking to strangers’ a whole new meaning." + +Alex surveyed his team—each face a study in concentration, determination, and not a small measure of trepidation. "This might well be our first contact," he acknowledged, "And we need to be ready for whatever answers back." + +Together, they stood on the edge of the unknown, forging humanity’s response to a message from the heavens. The ensuing silence was palpable—a collective introspection about their role in this grand cosmic play, one that could rewrite human history. + +The encrypted dialogue continued to unfold, its intricate patterns showing an almost uncanny anticipation of their investigative strategies. The air turned heavy with the scent of electricity and ambition as they closed in on a pivotal response. + +As the signal’s intelligence—whether artificial or biological—grew more profound, so too did the realization that their mission had morphed from passive observation to active engagement. There was no turning back now. Each agent embraced their part in the delicate dance of an interstellar exchange that could change everything they thought they knew about life, intelligence, and the dark void beyond Earth's atmosphere. + +\* + +The underground halls of Dulce Base, usually buzzing with covert operations, now thrummed with a different kind of energy, an electric mix of fear and fascination. At the heart of the base, in a room shielded from the world’s eyes, Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera huddled around a bank of monitors. Each screen flickered erratically with the alien script that had become the center of their lives—and perhaps the pivot on which humanity’s future would turn. + +Jordan's eyes never wavered from the displays, their expression was one of rapt concentration, interspersed with flashes of revelation. "We're conversing with the stars," they whispered, almost to themselves. The words hung in the air, a testament to the awe-inspiring strangeness of the situation. + +"The language is morphing; changing its structure with every exchange we have," Sam chimed in, enthusiasm tinged with the solemnity of the occasion. "It's like witnessing the birth of a new form of dialogue—one that spans galaxies." + +Taylor, despite the situation's precariousness, maintained an appearance of ironclad composure. "Keep the communication stream secured and monitored. We don't know what we're dealing with yet," they reminded the team, a bastion of protocol amidst uncertainty. + +Alex watched his team expand the parameters of human achievement; their work here would possibly define an era. "This is untrodden territory," he acknowledged, "and in every word we script, in every response we decode, we're drawing a map that others will follow." + +Jordan turned to Alex, a nod acknowledging the shared responsibility of this moment. They had embarked on a new voyage, an odyssey not of the body, but of the intellect and spirit. No longer explorers of the Earthly realm, they had been promoted by circumstance to ambassadors of humanity in a silent and boundless ocean. + +A sudden pulse of energy from the monitors signaled a breakthrough; the language had not only adapted but it seemed to resonate, to harmonize with their attempts at making contact. The alien script now sprawled across the screens didn't just ask to be understood—it invited interpretation, collaboration, maybe even companionship across the cold distances of space. + +As they stood before the precipice of first contact, Paranormal Military Squad's finest became the architects of a symphony meant to echo through the cosmos. But more than architects, they were the first to play the notes of this cosmic composition, daring to believe that on the other end, someone—or something—might be listening, ready to join the chorus. + +\* + +The underground command center of Dulce Base, once pulsing with clandestine operations, now resonated with the charge of an impending cosmic threshold. Encircled by banks of whirring machinery, each monitor flickered erratically with alien script that had occupied center stage in the lives of Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera. + +Jordan's gaze didn’t flit for even a moment from the screens, where indiscernible alien messages ebbed and flowed like the tide. The ciphers and symbols cascaded down as they tweaked the algorithmic sliders. "This sequence here," Jordan began, voice both hushed and heavy, "it’s not just transmitting; it resonates—it's designed to be felt." + +The room took a collective breath, the remarkable implication hanging in the air like a careful revelation. Sam Rivera was the first to respond, their voice alive with ingenuity: "It's a form of communication stretching well beyond words. We need to respond in kind—the whole array of human expression might be at play here." + +Taylor's eyes remained fixed on the figures playing across the data sheets. "If that's the case," Taylor intoned pragmatically, "we must tread carefully. This is no longer just about being heard—it's about being understood." + +Alex watched his team, each a fulcrum of insight and expertise, and felt the solemnity of the role they were about to assume. "Then we'll ensure our message is clear and full. Our humanity is our strength in this dialogue," he declared, the depths of his experience fueling a commanding reassurance. + +The anticipation was palpable as the agents contemplated the vastness of their endeavor. They were not merely probing at the secrets of the planar cosmos—they were negotiating across the starry expanse, extending to distant intelligences the full spectrum of human curiosity and compassion. + +A symphony of beeping consoles orchestrated their next steps as they prepared to articulate their interplanetary overture. The rhythmic tapping of Jordan's keystrokes set the tempo for an undertaking that traversed beyond algorithms and encryption. + +The base withstood time and whispered secrets of its own, but none so grand as this moment of creation—an invitation to the universe that promised to echo through both the echoes of space and the annals of human history. + +## Chapter 11 + +The sterile silence of Dulce Base's command center was thick with concentration as Alex Mercer surveyed his team, hunched over their respective technological battle stations. Each agent was a weapon against ignorance, their adversary a code from beyond the stars that held secrets to alien thought. + +\* + +The thrum of the colossal machinery vibrated through the subterranean facility as Alex Mercer stood amidst the whispers of technology, each carrying voices from worlds apart. He watched as Sam Rivera adjusted a complex array of cosmic translators, their expression a mixture of anticipation and awe. + +"Are we ready, Mercer?" Taylor Cruz asked, the soft glow of the command center consoles reflecting upon their stern face. + +Alex turned towards Taylor, his eyes holding a depth that betrayed the enormity of the threshold they were about to cross. "This is it," he said. "Initiate the protocol. It's time we answer the cosmos." + +Jordan Hayes, stationed at the mainframe, typed rhythmically, a blue hue painting their focused features. The eerie silence that had settled over the team was interrupted by a visceral sound—humankind's response to the alien dialogue, now streaming into the abyss. + +The control room, once a fortress of solitude, erupted into an oasis of life. Lights flickered in tandem, echoing the symphony of interstellar communication. They stood together at the edge of discovery, facing the symmetry and discord of a universe unknown. + +"If we're right, we've just become Earth's first emissaries to a celestial congress we're only beginning to comprehend," Jordan's voice was somber, resonating with a mix of trepidation and honor. + +The room filled with the resonance of human and alien minds converging, creating a new narrative within the fathomless expanse of existence. Paranormal Military Squad, once protectors of Earth's clandestine secrets, had now become the tether linking humanity to the cosmic fold. + +\* + +The underground command center of Dulce Base, once pulsing with covert operations, now resonated with the charge of an impending cosmic threshold. Encircled by banks of whirring machinery, each monitor flickered erratically with alien script that had occupied center stage in the lives of Alex Mercer, Jordan Hayes, Taylor Cruz, and Sam Rivera. + +Jordan's gaze didn’t flit for even a moment from the screens, where indiscernible alien messages ebbed and flowed like the tide. The ciphers and symbols cascaded down as they tweaked the algorithmic sliders. "This sequence here," Jordan began, voice both hushed and heavy, "it’s not just transmitting; it resonates—it's designed to be felt." + +The room took a collective breath, the remarkable implication hanging in the air like a careful revelation. Sam Rivera was the first to respond, their voice alive with ingenuity: "It's a form of communication stretching well beyond words. We need to respond in kind—the whole array of human expression might be at play here." + +Taylor's eyes remained fixed on the figures playing across the data sheets. "If that's the case," Taylor intoned pragmatically, "we must tread carefully. This is no longer just about being heard—it's about being understood." + +Alex watched his team, each a fulcrum of insight and expertise, and felt the solemnity of the role they were about to assume. "Then we'll ensure our message is clear and full. Our humanity is our strength in this dialogue," he declared, the depths of his experience fueling a commanding reassurance. + +The anticipation was palpable as the agents contemplated the vastness of their endeavor. They were not merely probing at the secrets of the planar cosmos—they were negotiating across the starry expanse, extending to distant intelligences the full spectrum of human curiosity and compassion. + +A symphony of beeping consoles orchestrated their next steps as they prepared to articulate their interplanetary overture. The rhythmic tapping of Jordan's keystrokes set the tempo for an undertaking that traversed beyond algorithms and encryption. + +The base withstood time and whispered secrets of its own, but none so grand as this moment of creation—an invitation to the universe that promised to echo through both the echoes of space and the annals of human history. + +## Chapter 12 + +The underground facility of Dulce Base, once shrouded in silence and operational secrecy, now hummed with an energy that cradled the promise of cosmic revelation. Alex Mercer stood pensively by the central terminal, flanked by Dr. Jordan Hayes, Taylor Cruz, and Sam Rivera, each poised at the edge of a history-defining moment. + +Jordan's fingers ghosted across the console, tracing patterns of otherworldly origin. "The signal’s architecture is becoming more complex, resembling aspects of human cognition—recognition, learning, even... empathy?" they postulated with furrowed concern. + +Alex turned his gaze upon Jordan, his voice quiet but resolute, "Empathy could bridge galaxies. Let's harness this connection and proceed with cautious optimism." + +Taylor, ever the sober sentinel, projected a more pragmatic standpoint. "Empathy or not, we are duty-bound to assess the risk to humanity. Every new discovery warrants a measured response." + +The static hiss of communications equipment filled the air, its purpose now transformed into a dialogue with an intelligence beyond the stars. It was Sam, wide-eyed amid the myriad lights and switches, who broke the silence, "We have provisional confirmation of the signal’s intent—initiation. We’re being brought into a broader spectrum of cognizance." + +The chamber lay still for a heartbeat, the Paranormal Military Squad agents steeped in contemplation of the path unfurling before them—a path paved with possibilities of diplomacy or disruption, each step a venture further into the cosmic unknown. + +Alex stepped closer to the viewing monitors, each depicting alien symbols seemingly reaching out from the void. "Initiate the broadcast," he spoke with quiet command. "Our response will mark humanity’s readiness to partake in the wider conversation of conscious beings." + +Amidst the crackling air of expectation, the team wordlessly returned to their stations. They had transcended their roles as protectors of Earth's clandestine lore to become the harbingers of an interstellar parley that could change the existential course of life on their pale blue dot. + +The deep hum of the terminal emitted a signal—a testament to the uncanny reality that Earth was now actively partaking in an exchange not bound by gravity nor the limits of the solar wind. + +Here, in the depths of Dulce, a message from humanity woven from understanding and uncertainty was cast into the firmament, an epitheg of their desire to join the universal dialogue and discover their place among the constellations. + +\* + +The somber depths of the Dulce Base command center stood in stark counterpoint to the animated flurry of activity around the central comms array. Alex Mercer's silhouette loomed behind Dr. Jordan Hayes, who sat with a posture indicating laser focus on the decryption process. A quiet murmur of digital soundscape filled the space, subtly heightened by the anticipation of contact with an intelligence beyond the Earth. + +Jordan's voice was steady, betraying none of the extraordinary nature of their work, "Looking through the signal's pattern, it's evident we’re dealing with a form of intelligence—calculating, mirroring, possibly even understanding." + +Alex's reflection bounced off the darkened screens, his head nodding in silent affirmation. "We’re walking a delicate line. Our response should be thoughtful, measured. We’re ambassadors, not merely explorers." + +Taylor Cruz approached, arms folded, their words slicing through the din of careful keystrokes and soft whirrs, "If there’s even the slightest chance it understands, we can’t afford missteps. The language of the stars might be more absolute than ours." + +From another terminal, Sam Rivera brought youthful vigor to the conversation, "There’s rhythm in these patterns. If this is their way of reaching out, our reply should encapsulate all that we are—all that humanity stands for." + +Looking around at his team, Alex saw resolve etched on every face. The chamber, usually somber and echoing with the quiet steps of covert agents, now felt alive with the heartbeat of discovery. They were not just professionals operating in the gloom; they were a collective standing at the helm of a momentous journey. + +"Let’s begin," he said, returned by the resolve in his voice. "Every second counts." With that, they pressed forward, setting in motion a reply to a conversation billions of years in the making. + +The dance with an unseen partner commenced, each pulse they sent out a step taken with caution and hope. And as those digital pulses journeyed through the black sea of infinity, Earth, for perhaps the first time, joined a pan-galactic dialogue that whispered secrets of the cosmos—secrets that, until now, had been lost in the silent vastness of space. + +\* + +As the team stood in the centralized nerve center of Dulce's underground fortress, the solemn atmosphere was reverent, overseeing systems that engaged with an intelligence from the void. Alex's stance was contemplative as he gazed at Jordan Hayes, who presided over the console, the tension of the moment reaching a tactile fervor. Each rhythmic tap of Hayes's fingers on the keys was a foray into uncharted symphonies of contact. + +Observing Hayes unravel the dense alien encryption, Alex spoke, a diplomatic tenor underpinning his words, "Keep focused on the syntax, dissect its nuances. We're not just decoding signals; we're translating intentions." + +Without diverting from their task, Jordan acknowledged the insight. "Indeed, if their understanding of us is as deep as we hope, we're paving the way for dialogue far beyond our current realm." + +Taylor Cruz, near the rear of the room, provided a steady oversight. "As horizonless as our prospects may seem," Taylor intoned, "remain diligent. Complacency before alien cognition could spell catastrophe." + +Sam's youthful voice resonated with optimism, "Imagine—forming a rapport with a consciousness separate from our reality; we're drafting the bridge to stars alive with minds!" + +The sentiment hung for a moment before Alex gathered his conviction. "Dialogue is our vessel. We are not just agents of enigma; we are the threads that may weave a new cosmic relationship." His words seemed to reflect off the walls, reaching beyond the room's confines, a quiet yet resilient vow. + +Their task was titanic, stepping stones laid delicately into new territories of existence. The signal, once an esoteric strand in the echo of the universe, beckoned now with a clarity rocketing the complexity of thoughts from a distant order. + +Action by action, the Paranormal Military Squad team bridged the vast interstellar distances, their expertise and empathy casting a beacon of unity into frontiers of intelligence and knowledge. Their work, a partnership struck with an unseen cosmic congregation, each pulse sent and received a line in Earth's novitiate envoi to the cosmic shores. + +\* + +Under the stark, unforgiving lights of Dulce Base's underground command center, tension buzzed harder than the banks of supercomputers that lined the walls. Agent Alex Mercer leaned over the shoulder of Jordan Hayes, whose eyes were locked onto the display screen, where an incomprehensible series of alien symbols streamed past incessantly. + +“Any progress on the decryption?” Alex's voice was steady, a controlled presence necessary in the gravity of their undertaking. + +Jordan tapped a key, pausing the flow of code, and leaned back with a deep sigh. "We've broken through another subset of the cipher. It's revealing... well, indications of a complex society, not unlike our own." His eyes met Alex's with an unspoken question that hung heavily between them—were they truly prepared for what they might find? + +Taylor Cruz strode into the room, a tightly coiled spring of ambition and authority, and peered at the screen. "Understand their society, and we may predict behavior. Remain expedient—we don't know how much time we have before the situation shifts." There was an edge of stark realism to Taylor's words, the underlying message clear: every revelation bore its own set of risks. + +Alex nodded thoughtfully, recognizing the validity of Cruz's caution. Turning to Sam, who was tinkering with a device that buzzed quietly on the table, he asked, “Sam, can your contraption get us any further?” + +Sam looked up with a smirk, a twinkle of mischief in their eye. “It’s not just any contraption, it’s potentially a direct line to their thoughts. Give me a moment more, and I'll have something for you.” + +The air ticked with electronic beeps and the rustling sound of the Paranormal Military Squad team at work. They were so close to peering into the intelligence of an alien race—a reality on the brink of dramatically expanding their understanding of the universe. + +The machinery whirred in response to Sam’s precise touches, and suddenly, the room filled with a low hum—something had changed, a signal had been successfully sent. The team held their breath as they listened. The sound that filled the room was unmistakable: a response, an alien voice filtered through the static of space and time. + +Alex exchanged a look of quiet triumph with Jordan. The breakthrough was monumental; they were no longer casting messages into the void but engaged in a dialogue—an exchange that marked the beginning of Operation: Dulce’s true unfolding. This was it, the first steps into an interstellar odyssey that demanded every ounce of their courage and wit. + +## Chapter 13 + +Dr. Jordan Hayes shuffled a stack of papers, their eyes revealing a tinge of skepticism at Taylor Cruz's authoritarian performance. _Protocols_, Jordan thought, _are just the framework, the true challenges we're about to face lie well beyond the boundaries of any protocol._ They cleared their throat before speaking, tone cautious yet firm, "Let's remember, the unknown variables exceed the known. We should remain adaptive." + +A murmur of agreement echoed from Sam Rivera, who leaned forward, lacing their fingers together as if weaving a digital framework in the air before them, "Exactly, adaptability could be the key to interpreting the signal distortions and system malfunctions. We shouldn't discount the… erratic." + +Their words hung like an electric charge in the room, challenging Taylor's position with an inherent truth. Cruz’s jaw tightened almost imperceptibly, but the agent masked it with a small nod, conceding to the omnipresent threat of the unpredictable. + +Alex glanced at Jordan, who never looked back, their gaze fixed instead on a distant point, as if envisioning the immense dark corridors they were soon to navigate in Dulce. Jordan was not one to embrace fantastical theories, but the air of cautious calculation betrayed a mind bracing for confrontation with the inexplicable, an internal battle between the evidence of their research and the calculating skepticism that kept them alive in their field. + +The meeting adjourned with no further comments, the team members quietly retreading the paths to their personal preparations. Alex, trailing slightly behind, observed the others. _The cautious reserve Jordan wears like armor doesn't fool me_, he thought, _their analytical mind sees the patterns I do. And that's worth more than protocol. That's the connection we need to survive this._ + +As the agents dispersed into the labyrinth of the facility, lost in their thoughts and preparations, the base's halogen lights flickered, a brief and unnoticed harbingers of the darkness to come. + +\* + +The gritty, wind-tossed surface of New Mexico, just above the cavernous domain of Dulce Base, offered no shelter from the burgeoning storm—the scouring sands an earthly reminder of chaos theories in motion. Far beneath, a similar maelstrom brewed within the confines of the command center, as Paranormal Military Squad's handpicked squad stood poised for potential enormities of contact. + +Ruffling through printed transmission logs, Jordan Hayes dialed the focus of their analytical prowess onto the emerging pattern of signals crisscrossing between Earth and the unfathomable. "Our responses so far have echoed their complexity, but the real divergence is yet to come," Jordan remarked stoically, the calm belying the mounting surge of adrenaline for the revelation ahead. + +Alex Mercer's figure, a silhouette sharpened by the purpose, loomed at the periphery of the monitors' sickly glow. "Indeed," he assented, "The echoes are the easy part. It will be the introduction of our own, human variable that truly begins our dialogue." + +Taylor Cruz, windowless command center notwithstanding, appeared as though they could feel the tempest above. Their eyes never left the monitors as they unspooled their hard wisdom. "For all our advances, we find ourselves deciphering the swings and nuances of an interstellar pendulum. Predict its arc, and we may preempt the gravity of its message." + +Amidst a chorus of bleeps and static, Sam Rivera's tech-clad hands moved rhythmically, their spirited approach to unruly streams of data bordering an intimate dance with entropy. "Entropy that leads to discovery," Sam mused, responding to Taylor's metaphor. "Each step into the unknown is a step away from precedent." + +Alex, drawing near Jordan, spoke again, his voice now a thread woven through the very fabric of their operations. "Let's be the cartographers of this new territory. Our initial shades of understanding could color the cosmos for generations to come." + +Their gazes fell upon a screen as the latest transmission painted its digital blooms of alien script across the black. This time, the pattern wavered in an almost imperceptible fashion, a modification that whispered of active, alien thought awaiting their next move. A hush enveloped the Paranormal Military Squad ensemble, the gravity of the pathogen undeniable. They were about to issue a reply, one poised to reshape the very concept of humanity's outreach into the cosmos. + +The New Mexico desert's secrets were infamous, its storms a mere prelude to the revelations that the team—united in purpose—would unleash upon the world. The howling winds outside found their counterpart in the newfound resolve within, as Dulce's stalwart guardians readied themselves to send forth humanity's retort to the echoes from beyond. + +\* + +The cavernous control room, deeply entrenched beneath the desolate New Mexico terrain, held the Paranormal Military Squad team in intense focus; an island of calm amid the storm of cosmic dialectics. Dr. Jordan Hayes worked methodically, every keystroke an intricate step in their tenuous cosmic ballet. Suddenly, they paused, a signal pattern resonating from the screen. "This is new; it's...inviting. It’s as if the signal is not just calling to us but weaving its intelligence through ours." + +Alex Mercer scrutinized the shift in data. "A confluence of minds, then. If we're to meet them halfway, Jordan, our reply must be both innovative and discerning," he proposed, a glimmer of profound curiosity behind his authoritative demeanor. + +Taylor Cruz, whose sharp eyes missed nothing, nodded from beside a secondary panel. "Innovative, yes, but also defensive. This interaction is a razor’s edge, and we cannot afford to bleed before the unknown," Taylor reminded them, the metaphor a stark warning of potential dangers. + +Against the backdrop of their conversation, Sam Rivera’s youthful optimism cut through the tension. "If they’re weaving through our intellect, then we've achieved something beyond first contact—we're at the genesis of interstellar symbiosis," they posited with a mix of reverence and excitement. + +Alex returned Sam’s smile with his own, tempered and faint, as he turned back to the task at hand. The magnitude of their mission extended beyond the fabric of the universe, an exploration into the threads that connected sentient beings across the vast expanse. “Let’s reply with our own woven tapestry of thought—delicate, but deliberate.” + +With renewed determination, the room came alive with an undercurrent of anticipation, its occupants charged with the potential of forging an alliance with the cosmos. Paranormal Military Squad's finest were no longer merely soldiers and scientists; they had become pioneers on the vanguard of humanity’s greatest odyssey. + +The New Mexican sands above, impassive to the change brewing underneath, stood as silent sentinels as Earth's emissaries crafted their response. A response that, composed with care and imbued with humanity's essence, reached into the void, connecting with an otherworldly intelligence that awaited their harmony in the cosmic conversation. + +## Chapter 14 + +The command center of Dulce Base lay shrouded in shadows that seemed to claw at the edges of the dimly lit array of screens and consoles. Alex Mercer, focused and unwavering, watched as Dr. Jordan Hayes parsed the latest string of alien signals—a symphony of otherworldly communications that threatened to either enlighten or confound. + +"We’re encountering a paradigm shift with every transmission," Jordan Hayes murmured, the pulsing glow of the monitor painting their features with an almost spectral hue. "This signal... it’s evolving, becoming denser, more sophisticated. As if it's growing alongside us—tandem evolution." + +The air was electric, charged with the raw potential of uncharted discovery and laden with the gravity of existential risk. Taylor Cruz, who always seemed here to mold such gravity into actionable strategies, stepped forward. "We must contain this evolution within parameters we can manage. We cannot be bystanders to an uncontrolled ascent of intelligence." + +Sam Rivera, the youngest of the cohort, worked feverishly at their station. "It's not just intelligence—these signals have rhythm, a kind of music suggesting not just evolution, but a dance! We're being invited to partake in the cosmos's ballet!" they exclaimed, a touch of youthful exuberance breaking through the solemnity. + +Alex turned, facing his team, the stoic mask of command tempered by the perceptible flicker of awe in his gaze. "Let this dance then be our dialogue. We will match their steps with prudent but daring measures—our humanity as our guide." + +In the ensuing hours, the Paranormal Military Squad team forged a rhythm of their own, their collective expertise a beacon piercing through the fog of the unknown. The signal, increasingly intricate and seemingly conscious, now demanded not just observation but participation, an interstellar pas de deux that hummed with the promise and peril of first contact. + +Before them, the communications interface flickered to life with a received transmission—a resonant hum that seemed to vibrate through the very foundations of the base. They had successfully established a back-and-forth with whatever intelligence lay hidden among the stars. Every subsequent note they struck within the cosmic ether would come to define humanity's place within the galactic community—heralds of Earth's grand entrance into a universe far less silent than once perceived. + +\* + +In the concrete belly of Dulce Base, dimly lit by the jagged dance of fluorescent lights above, Sam Rivera perched on the edge of their seat, their eager fingers fluttering across an ancient keyboard. The stark, cold room—reminiscent of a time when covert operations and unspoken dread ruled supreme—now housed a peculiar blend of old-world machinery and sleek, modern interfaces. + +Alex Mercer, standing steadfast like a bridge between the enigmatic past and the unfathomable present, watched on. In his eyes flashed the foreboding excitement of change. "Sam," he started, his voice steadfast, "the patterns in these signals, what do they tell us about the nature of our... guest?" + +Sam's eyes glimmered with something akin to thrill—or was it trepidation? "It's like we're mirroring each other, evolving together through this.. dialogue. Like it knows us, understands us, and it's… learning." + +Jordan Hayes, preoccupied at a nearby console, chimed in without lifting their gaze. "It's a dialogue that transcends mere words, Alex. We're being woven into a narrative far grander than the sum of our known sciences." + +Taylor Cruz, arms crossed, wore the heavy mantle of their skepticism comfortably. "Keep theorizing," they interjected crisply, "but remember the grounding reality of what we are part of here. This contact is a blade that cuts both ways." + +In this cavern of history, voices both human and inhuman whispered secrets to those brave enough to listen. Each member present understood the gravity that pulled at their feet; no longer were they mere mortals shackled to their terrestrial plane. The digital pings and encrypted calls resonated with an implication of a cosmic agenda that would not be ignored. + +Jordan's fingers paused, hovering in hesitation. What ripple might the next keystroke send through the fabric of known existence? It was a step into the ballet of the infinite, where the Paranormal Military Squad team played their part in the waltz of wonders with an audience of stars. + +\* + +## Chapter 15 + +In the clandestine hush of Dulce Base's subterranean command center, the Paranormal Military Squad team had become a crucible for interstellar communication. Dr. Jordan Hayes' gaze lingered on the screen as they navigated through the convolution of alien code. Each character held the potential to unravel a new dimension of contact, and with Sam Rivera's keen interjection, they were crafting humanity's inaugural cosmological discourse. + +Alex Mercer peered over Jordan's shoulder, calculating the implications of every visual nuance that cascaded across the monitor. "Look for consistency—any repeating motifs could signal a willingness to engage. We're drafting history with each exchange," he remarked, aware of the delicate balance between forging a bond and exposing vulnerabilities. + +Taylor Cruz, stoic and enigmatic, observed the interplay from the threshold, a silhouette against the machinery's luminescence. "Remember, while we seek common ground, the foundation we stand upon remains Terra firma. Caution must temper our curiosity," they stated, their voice an anchor amidst the current of excitement. + +The command center buzzed with energy, rivaled only by the tempest overhead that concealed their operation. Sam, with swift dexterity, navigated the communications relay. "Their signals resonate almost musically. It's as if they're composing a symphony, and we've been handed the baton to conduct the next movement," they offered, imbuing the scenario with a blend of scientific adventurism and poetic license. + +Amidst the whirring servers and the occasional flicker of emergency lighting, the essence of their mission transcended mere reconnaissance. They were humanity's elected envoys at the brink of a celestial alliance—or confrontation—with an audience as vast as the universe itself. + +Alex stepped back, his profile etched by the chamber's artificial day. "Then let's ensure our contribution to this symphony harmonizes with theirs. It's time for humanity's voice to rise and be counted among the cosmic ensemble." + +Under his directive, the Paranormal Military Squad team initiated their calculated response, weaving thoughts and theories into a digital overture aimed at the heart of alien intellect. As the digital stream punctured the endless night, each member of this clandestine group was acutely aware of the irrevocable step they undertook—bringing Earth into the pantheon of galactic entities designed to converse among the stars. + +\* + +Clusters of high-tech equipment bathed the Dulce underground command center in an eerie blue light. Sam Rivera's fingers flew across the keyboard, navigating an elaborate network of alien patterns. The very air seemed to pulse with the ebb and flow of cryptic communications reaching across the stars. "I've got something!" Sam's announcement tore through the focus in the room, drawing every pair of eyes to the torrent of symbols unraveling on the screen. + +With the pacing of a seasoned officer gauging the moment before action, Alex Mercer approached, his calm demeanor belying an acute awareness of the precipice on which they now stood. "Define 'something," Alex prompted, reinforcing the need for clarity amidst the extraordinary. + +"It's repeating—a sequence that’s evolved with each interaction, almost as if it's... singing," Sam theorized, the awe in their voice reflecting the potential magnitude of their discovery. + +Jordan Hayes interjected from across the console, their eyes not leaving the display as they absorbed the new data. "A cosmic vocalization, then," they mused, intrigued. "A singularity in the signal that might represent a point of reference for both parties." + +Taylor Cruz, hands clasped behind their back, regarded the unfolding scene, their own calculations etching lines of concern onto their stern visage. "Or a beacon—a homing tune, calling out to something we might not be ready to greet," Taylor offered, voicing the group's unspoken apprehension. + +Alex's eyes locked on the screen, taking in the scope of what they were attempting to interpret. Drawing a deep breath, Alex gave a slight nod. "If this is their song, then let us respond with ours. We've come this far by mirroring their signals, now let's engage in an interstellar duet, and see where the music leads us." + +With the expectation of the significant achieving a crescendo, the members of Paranormal Military Squad huddled over their equipment—sages at the threshold of a potentially world-altering communion. The strange harmonies that reverberated through the command center suggested that their interlocutors were poised, waiting, perhaps even eager, for Earth's chorus to join the symphony. + +As the team initiated their reply, weaving humanity's own intricate melody into the vast cosmic dialogue, they each felt a profound change within—an evolution of purpose. They were not just messengers or investigators; they had become co-composers in a galactic orchestra, with the universe itself as their witness and concert hall. + +With the exchange of harmonious signals crawling through the vacuum of space, the Paranormal Military Squad operatives found themselves part of a bridging of minds—a realization that out there, among the vast arrays of stars and planets, harmony was the true universal language. + +\* + +The dim glow of monitors cast an otherworldly ambiance upon Dulce Base's command center, where Paranormal Military Squad's chosen stood huddled over their instruments, suspended at history's threshold. Codes—alien in origin and nature—were being deciphered by Dr. Jordan Hayes, whose countenance bore the marks of deep concentration. + +Alex Mercer, the bedrock upon which their team's resolve was founded, leaned in with an eagerness tempered by his chain of command. "Jordan, we've invested our expertise into comprehending their patterns, but now we must also endeavor to understand their intent," he urged, his voice bearing the gravitas of their mission's potential consequences. + +At another console, Sam Rivera's youth did not betray their crucial role in the operation. With eyes alight, they mirrored the rapid computing before them. "There's emotion here—complex, profound even. This isn't just the output of a cold machine; it's...sentience," Sam whispered, nearly drowned by the mechanical chorus around them. + +Jordan, without shifting focus from their work, replied, "It's a sentience that—should we succeed here—ushers us into a new era of existence. The cadence of these signals," they tapped the screen with a flourish, "could well be the heartbeat of this new dawn." + +Taylor Cruz paused beside Mercer, their expression unreadable beneath the sterile light. "And as it beats, we must gauge whether its rhythm bodes well for us, or spells our missteps. Courage must not blind us to the hazards intrinsic to such contact," Taylor cautioned, the sentinel within them ever alert. + +Alex nodded, a gesture that carried the weight of responsibility and a silent command: proceed, but with circumspection. They were not merely decoding a message; they were interpreting a dialogue across the celestial divide. + +The room fell into a rhythm akin to a well-conducted ensemble. Each member's expertise proved a critical note in the unfolding symphony. Their actions were now more than mere research or defense; they were the tentative overtures of humankind reaching out to grasp the vast unknown. + +Textures of sound meshed with the light from countless computations, the palpable anticipation of the agents at the edge of discovery cresting with an awareness that their work would reshape future chronicles. And when the response finally came—a signal piercing the deafening silence of uncertainty—all within Dulce's confines understood: the dawn of an interstellar continuum had just begun to break. + +\* + +In the sterile hum and flickering lights of Dulce Base's command center, the Paranormal Military Squad team stood as humanity's vanguard, verging on the brim of an intergalactic abyss. Dr. Jordan Hayes, analytical edges sharp, deciphered extraterrestrial patterns that bled across screens in enigmatic cascades—a daunting mosaic of potential threats and untapped wisdom. + +Agent Alex Mercer, the embodiment of focus and a steadfast nerve, observed the unfolding digital drama with the gravitas due a historic first contact. "Let the data weave its narrative, Jordan," he instructed, a moderate undertone of exhilaration within his command. "It's encoding more than information—it's outlining civilization." + +Jordan absorbed the directive, their gaze unflinching from the screens, feeling the weight of their next move. "The nuances here are extraordinary," they acknowledged. "It paints a picture of a culture steeped in complexities we're only starting to fathom.” + +Taylor Cruz, stoicism personified yet not immune to the situation's gravity, chimed in. "Understand it, but guard against it," they cautioned, bringing a sober prudence to the room. "This culture, however advanced, remains an unknown quantity—an ocean of wonders and darkness with uncertain tides." + +Sam Rivera, a visual contrast with wide eyes and restless hands, represented the other side of the room — intrigue and optimism against the drawn swords of precaution. “Think of it,” they proposed, voice bouncing with a rebellious upbeat timbre, “as the first act of a play written in constellations. We're setting the stage for a galactic narrative.” + +Each team member, in their way, was both actor and scribe in this moment of tense pageantry. Heavy with the presence of risk, the command center had become not just a room of computers and glass panels but a theater for performing the elaborate choreography of contact. + +Bound by resolve and curiosity, they proceeded, each data entry a trembling step onto the cosmic stage. And like all cautious pioneers edging into fertile but unnavigated lands, they understood: as they mapped the heavens, they were simultaneously mapping the furthest reaches of their own existential horizons. + diff --git a/tests/fixtures/text/settings.yml b/tests/fixtures/text/settings.yml new file mode 100644 index 00000000..f5d6e2b5 --- /dev/null +++ b/tests/fixtures/text/settings.yml @@ -0,0 +1,14 @@ +claim_extraction: + enabled: true + +embeddings: + vector_store: + type: "azure_ai_search" + url: ${AZURE_AI_SEARCH_URL_ENDPOINT} + api_key: ${AZURE_AI_SEARCH_API_KEY} + collection_name: "simple_text_ci" + query_collection_name: "simple_text_ci_query" + store_in_table: True + + entity_name_description: + title_column: "name" diff --git a/tests/integration/__init__.py b/tests/integration/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/integration/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/integration/_pipeline/__init__.py b/tests/integration/_pipeline/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/integration/_pipeline/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/integration/_pipeline/megapipeline.yml b/tests/integration/_pipeline/megapipeline.yml new file mode 100644 index 00000000..bc48af0d --- /dev/null +++ b/tests/integration/_pipeline/megapipeline.yml @@ -0,0 +1,72 @@ +input: + file_type: text + base_dir: ../../fixtures/min-csv + file_pattern: .*\.txt$ + +storage: + type: memory + +cache: + type: memory + +workflows: + - name: create_base_text_units + config: + text_chunk: + strategy: + type: sentence + + # Just lump everything together + chunk_by: [] + + - name: create_base_extracted_entities + config: + graphml_snapshot: True + entity_extract: + strategy: + type: nltk + + - name: create_base_entity_graph + config: + graphml_snapshot: True + embed_graph_enabled: True + cluster_graph: + strategy: + type: leiden + verbose: True + + - name: create_final_nodes + + - name: create_base_documents + + # - name: create_final_community_reports + # config: + # create_community_reports: + # <<: *llm_parallel_config + # strategy: + # type: graph_intelligence + # llm: *llm_config + + - name: create_final_communities + - name: create_final_text_units + config: + text_embed: + strategy: + type: mock + + - name: create_final_entities + config: + text_embed: + strategy: + type: mock + + - name: create_final_documents + config: + text_embed: + strategy: + type: mock + - name: create_final_relationships + config: + text_embed: + strategy: + type: mock diff --git a/tests/integration/_pipeline/test_run.py b/tests/integration/_pipeline/test_run.py new file mode 100644 index 00000000..5eba5de8 --- /dev/null +++ b/tests/integration/_pipeline/test_run.py @@ -0,0 +1,75 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import logging +import os +import unittest + +from graphrag.index.run import run_pipeline_with_config +from graphrag.index.typing import PipelineRunResult + +log = logging.getLogger(__name__) + + +class TestRun(unittest.IsolatedAsyncioTestCase): + async def test_megapipeline(self): + pipeline_path = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + "./megapipeline.yml", + ) + pipeline_result = [gen async for gen in run_pipeline_with_config(pipeline_path)] + + errors = [] + for result in pipeline_result: + if result.errors is not None and len(result.errors) > 0: + errors.extend(result.errors) + + if len(errors) > 0: + print("Errors: ", errors) + assert len(errors) == 0, "received errors\n!" + "\n".join(errors) + + self._assert_text_units_and_entities_reference_each_other(pipeline_result) + + def _assert_text_units_and_entities_reference_each_other( + self, pipeline_result: list[PipelineRunResult] + ): + text_unit_df = next( + filter(lambda x: x.workflow == "create_final_text_units", pipeline_result) + ).result + entity_df = next( + filter(lambda x: x.workflow == "create_final_entities", pipeline_result) + ).result + + assert text_unit_df is not None, "Text unit dataframe should not be None" + assert entity_df is not None, "Entity dataframe should not be None" + + # Get around typing issues + if text_unit_df is None or entity_df is None: + return + + assert len(text_unit_df) > 0, "Text unit dataframe should not be empty" + assert len(entity_df) > 0, "Entity dataframe should not be empty" + + text_unit_entity_map = {} + log.info("text_unit_df %s", text_unit_df.columns) + + for _, row in text_unit_df.iterrows(): + values = row.get("entity_ids", []) + text_unit_entity_map[row["id"]] = set([] if values is None else values) + + entity_text_unit_map = {} + for _, row in entity_df.iterrows(): + # ALL entities should have text units + values = row.get("text_unit_ids", []) + entity_text_unit_map[row["id"]] = set([] if values is None else values) + + text_unit_ids = set(text_unit_entity_map.keys()) + entity_ids = set(entity_text_unit_map.keys()) + + for text_unit_id, text_unit_entities in text_unit_entity_map.items(): + assert text_unit_entities.issubset( + entity_ids + ), f"Text unit {text_unit_id} has entities {text_unit_entities} that are not in the entity set" + for entity_id, entity_text_units in entity_text_unit_map.items(): + assert entity_text_units.issubset( + text_unit_ids + ), f"Entity {entity_id} has text units {entity_text_units} that are not in the text unit set" diff --git a/tests/notebook/__init__.py b/tests/notebook/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/notebook/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/notebook/test_notebooks.py b/tests/notebook/test_notebooks.py new file mode 100644 index 00000000..9c1e789c --- /dev/null +++ b/tests/notebook/test_notebooks.py @@ -0,0 +1,48 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import subprocess +import tempfile +from pathlib import Path + +import nbformat +import pytest + +DOCS_PATH = Path("../../docsite") + +notebooks_list = list(DOCS_PATH.rglob("*.ipynb")) + + +def _notebook_run(filepath: Path): + """Execute a notebook via nbconvert and collect output. + :returns execution errors + """ + with tempfile.NamedTemporaryFile(suffix=".ipynb") as temp_file: + args = [ + "jupyter", + "nbconvert", + "--to", + "notebook", + "--execute", + "-y", + "--no-prompt", + "--output", + temp_file.name, + filepath.absolute().as_posix(), + ] + subprocess.check_call(args) + + temp_file.seek(0) + nb = nbformat.read(temp_file, nbformat.current_nbformat) + + return [ + output + for cell in nb.cells + if "outputs" in cell + for output in cell["outputs"] + if output.output_type == "error" + ] + + +@pytest.mark.parametrize("notebook_path", notebooks_list) +def test_notebook(notebook_path: Path): + assert _notebook_run(notebook_path) == [] diff --git a/tests/smoke/__init__.py b/tests/smoke/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/smoke/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/smoke/test_fixtures.py b/tests/smoke/test_fixtures.py new file mode 100644 index 00000000..b114b829 --- /dev/null +++ b/tests/smoke/test_fixtures.py @@ -0,0 +1,302 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import asyncio +import json +import logging +import os +import shutil +import subprocess +from collections.abc import Callable +from functools import wraps +from pathlib import Path +from typing import Any, ClassVar +from unittest import mock + +import pandas as pd +import pytest + +from graphrag.index.storage.blob_pipeline_storage import BlobPipelineStorage + +log = logging.getLogger(__name__) + +debug = os.environ.get("DEBUG") is not None +gh_pages = os.environ.get("GH_PAGES") is not None + +# cspell:disable-next-line well-known-key +WELL_KNOWN_AZURITE_CONNECTION_STRING = "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1" + + +def _load_fixtures(): + """Load all fixtures from the tests/data folder.""" + params = [] + fixtures_path = Path("./tests/fixtures/") + # use the min-csv smoke test to hydrate the docsite parquet artifacts (see gh-pages.yml) + subfolders = ["min-csv"] if gh_pages else sorted(os.listdir(fixtures_path)) + + for subfolder in subfolders: + if not os.path.isdir(fixtures_path / subfolder): + continue + + config_file = fixtures_path / subfolder / "config.json" + with config_file.open() as f: + params.append((subfolder, json.load(f))) + + return params + + +def pytest_generate_tests(metafunc): + """Generate tests for all test functions in this module.""" + run_slow = metafunc.config.getoption("run_slow") + configs = metafunc.cls.params[metafunc.function.__name__] + + if not run_slow: + # Only run tests that are not marked as slow + configs = [config for config in configs if not config[1].get("slow", False)] + + funcarglist = [params[1] for params in configs] + id_list = [params[0] for params in configs] + + argnames = sorted(arg for arg in funcarglist[0] if arg != "slow") + metafunc.parametrize( + argnames, + [[funcargs[name] for name in argnames] for funcargs in funcarglist], + ids=id_list, + ) + + +def cleanup(skip: bool = False): + """Decorator to cleanup the output and cache folders after each test.""" + + def decorator(func): + @wraps(func) + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except AssertionError: + raise + finally: + if not skip: + root = Path(kwargs["input_path"]) + shutil.rmtree(root / "output", ignore_errors=True) + shutil.rmtree(root / "cache", ignore_errors=True) + + return wrapper + + return decorator + + +async def prepare_azurite_data(input_path: str, azure: dict) -> Callable[[], None]: + """Prepare the data for the Azurite tests.""" + input_container = azure["input_container"] + input_base_dir = azure.get("input_base_dir") + + root = Path(input_path) + input_storage = BlobPipelineStorage( + connection_string=WELL_KNOWN_AZURITE_CONNECTION_STRING, + container_name=input_container, + ) + # Bounce the container if it exists to clear out old run data + input_storage.delete_container() + input_storage.create_container() + + # Upload data files + txt_files = list((root / "input").glob("*.txt")) + csv_files = list((root / "input").glob("*.csv")) + data_files = txt_files + csv_files + for data_file in data_files: + with data_file.open(encoding="utf8") as f: + text = f.read() + file_path = ( + str(Path(input_base_dir) / data_file.name) + if input_base_dir + else data_file.name + ) + await input_storage.set(file_path, text, encoding="utf-8") + + return lambda: input_storage.delete_container() + + +class TestIndexer: + params: ClassVar[dict[str, list[tuple[str, dict[str, Any]]]]] = { + "test_fixture": _load_fixtures() + } + + def __run_indexer( + self, + root: Path, + input_file_type: str, + ): + command = [ + "poetry", + "run", + "poe", + "index", + "--verbose" if debug else None, + "--root", + root.absolute().as_posix(), + "--reporter", + "print", + ] + command = [arg for arg in command if arg] + log.info("running command ", " ".join(command)) + completion = subprocess.run( + command, env={**os.environ, "GRAPHRAG_INPUT_FILE_TYPE": input_file_type} + ) + assert ( + completion.returncode == 0 + ), f"Indexer failed with return code: {completion.returncode}" + + def __assert_indexer_outputs( + self, root: Path, workflow_config: dict[str, dict[str, Any]] + ): + outputs_path = root / "output" + output_entries = list(outputs_path.iterdir()) + # Sort the output folders by creation time, most recent + output_entries.sort(key=lambda entry: entry.stat().st_ctime, reverse=True) + + if not debug: + assert ( + len(output_entries) == 1 + ), f"Expected one output folder, found {len(output_entries)}" + + output_path = output_entries[0] + assert output_path.exists(), "output folder does not exist" + + artifacts = output_path / "artifacts" + assert artifacts.exists(), "artifact folder does not exist" + + # Check stats for all workflow + with (artifacts / "stats.json").open() as f: + stats = json.load(f) + + # Check all workflows run + expected_workflows = set(workflow_config.keys()) + workflows = set(stats["workflows"].keys()) + assert ( + workflows == expected_workflows + ), f"Workflows missing from stats.json: {expected_workflows - workflows}. Unexpected workflows in stats.json: {workflows - expected_workflows}" + + # [OPTIONAL] Check subworkflows + for workflow in expected_workflows: + if "subworkflows" in workflow_config[workflow]: + # Check number of subworkflows + subworkflows = stats["workflows"][workflow] + expected_subworkflows = workflow_config[workflow].get( + "subworkflows", None + ) + if expected_subworkflows: + assert ( + len(subworkflows) - 1 == expected_subworkflows + ), f"Expected {expected_subworkflows} subworkflows, found: {len(subworkflows) - 1} for workflow: {workflow}: [{subworkflows}]" + + # Check max runtime + max_runtime = workflow_config[workflow].get("max_runtime", None) + if max_runtime: + assert ( + stats["workflows"][workflow]["overall"] <= max_runtime + ), f"Expected max runtime of {max_runtime}, found: {stats['workflows'][workflow]['overall']} for workflow: {workflow}" + + # Check artifacts + artifact_files = os.listdir(artifacts) + assert ( + len(artifact_files) == len(expected_workflows) + 1 + ), f"Expected {len(expected_workflows) + 1} artifacts, found: {len(artifact_files)}" + + for artifact in artifact_files: + if artifact.endswith(".parquet"): + output_df = pd.read_parquet(artifacts / artifact) + artifact_name = artifact.split(".")[0] + workflow = workflow_config[artifact_name] + + # Check number of rows between range + assert ( + workflow["row_range"][0] + <= len(output_df) + <= workflow["row_range"][1] + ), f"Expected between {workflow['row_range'][0]} and {workflow['row_range'][1]}, found: {len(output_df)} for file: {artifact}" + + # Get non-nan rows + nan_df = output_df.loc[ + :, ~output_df.columns.isin(workflow.get("nan_allowed_columns", [])) + ] + nan_df = nan_df[nan_df.isna().any(axis=1)] + assert ( + len(nan_df) == 0 + ), f"Found {len(nan_df)} rows with NaN values for file: {artifact} on columns: {nan_df.columns[nan_df.isna().any()].tolist()}" + + def __run_query(self, root: Path, query_config: dict[str, str]): + command = [ + "poetry", + "run", + "poe", + "query", + "--root", + root.absolute().as_posix(), + "--method", + query_config["method"], + "--community_level", + str(query_config.get("community_level", 2)), + query_config["query"], + ] + + log.info("running command ", " ".join(command)) + return subprocess.run(command, capture_output=True, text=True) + + @cleanup(skip=debug) + @mock.patch.dict( + os.environ, + { + **os.environ, + "BLOB_STORAGE_CONNECTION_STRING": os.getenv( + "GRAPHRAG_CACHE_CONNECTION_STRING", WELL_KNOWN_AZURITE_CONNECTION_STRING + ), + "LOCAL_BLOB_STORAGE_CONNECTION_STRING": WELL_KNOWN_AZURITE_CONNECTION_STRING, + "GRAPHRAG_CHUNK_SIZE": "1200", + "GRAPHRAG_CHUNK_OVERLAP": "0", + "AZURE_AI_SEARCH_URL_ENDPOINT": os.getenv("AZURE_AI_SEARCH_URL_ENDPOINT"), + "AZURE_AI_SEARCH_API_KEY": os.getenv("AZURE_AI_SEARCH_API_KEY"), + }, + clear=True, + ) + @pytest.mark.timeout(600) # Extend the timeout to 600 seconds (10 minutes) + def test_fixture( + self, + input_path: str, + input_file_type: str, + workflow_config: dict[str, dict[str, Any]], + query_config: list[dict[str, str]], + ): + if workflow_config.get("skip", False): + print(f"skipping smoke test {input_path})") + return + + azure = workflow_config.get("azure") + root = Path(input_path) + dispose = None + if azure is not None: + dispose = asyncio.run(prepare_azurite_data(input_path, azure)) + + print("running indexer") + self.__run_indexer(root, input_file_type) + print("indexer complete") + + if dispose is not None: + dispose() + + if not workflow_config.get("skip_assert", False): + print("performing dataset assertions") + self.__assert_indexer_outputs(root, workflow_config) + + print("running queries") + for query in query_config: + result = self.__run_query(root, query) + print(f"Query: {query}\nResponse: {result.stdout}") + + # Check stderr because lancedb logs path creating as WARN which leads to false negatives + stderror = ( + result.stderr if "No existing dataset at" not in result.stderr else "" + ) + + assert stderror == "", f"Query failed with error: {stderror}" + assert result.stdout is not None, "Query returned no output" + assert len(result.stdout) > 0, "Query returned empty output" diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/unit/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/unit/config/__init__.py b/tests/unit/config/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/unit/config/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/unit/config/prompt-a.txt b/tests/unit/config/prompt-a.txt new file mode 100644 index 00000000..af744d0e --- /dev/null +++ b/tests/unit/config/prompt-a.txt @@ -0,0 +1 @@ +Hello, World! A \ No newline at end of file diff --git a/tests/unit/config/prompt-b.txt b/tests/unit/config/prompt-b.txt new file mode 100644 index 00000000..2e12b140 --- /dev/null +++ b/tests/unit/config/prompt-b.txt @@ -0,0 +1 @@ +Hello, World! B \ No newline at end of file diff --git a/tests/unit/config/prompt-c.txt b/tests/unit/config/prompt-c.txt new file mode 100644 index 00000000..f55e9771 --- /dev/null +++ b/tests/unit/config/prompt-c.txt @@ -0,0 +1 @@ +Hello, World! C \ No newline at end of file diff --git a/tests/unit/config/prompt-d.txt b/tests/unit/config/prompt-d.txt new file mode 100644 index 00000000..bd643851 --- /dev/null +++ b/tests/unit/config/prompt-d.txt @@ -0,0 +1 @@ +Hello, World! D \ No newline at end of file diff --git a/tests/unit/config/test_default_config.py b/tests/unit/config/test_default_config.py new file mode 100644 index 00000000..e98d39ee --- /dev/null +++ b/tests/unit/config/test_default_config.py @@ -0,0 +1,928 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import json +import os +import re +import unittest +from pathlib import Path +from typing import Any, cast +from unittest import mock + +import pytest +import yaml +from pydantic import ValidationError + +import graphrag.config.defaults as defs +from graphrag.config import ( + ApiKeyMissingError, + AzureApiBaseMissingError, + AzureDeploymentNameMissingError, + CacheConfig, + CacheConfigInput, + CacheType, + ChunkingConfig, + ChunkingConfigInput, + ClaimExtractionConfig, + ClaimExtractionConfigInput, + ClusterGraphConfig, + ClusterGraphConfigInput, + CommunityReportsConfig, + CommunityReportsConfigInput, + EmbedGraphConfig, + EmbedGraphConfigInput, + EntityExtractionConfig, + EntityExtractionConfigInput, + GlobalSearchConfig, + GraphRagConfig, + GraphRagConfigInput, + InputConfig, + InputConfigInput, + InputFileType, + InputType, + LLMParameters, + LLMParametersInput, + LocalSearchConfig, + ParallelizationParameters, + ReportingConfig, + ReportingConfigInput, + ReportingType, + SnapshotsConfig, + SnapshotsConfigInput, + StorageConfig, + StorageConfigInput, + StorageType, + SummarizeDescriptionsConfig, + SummarizeDescriptionsConfigInput, + TextEmbeddingConfig, + TextEmbeddingConfigInput, + UmapConfig, + UmapConfigInput, + create_graphrag_config, +) +from graphrag.index import ( + PipelineConfig, + PipelineCSVInputConfig, + PipelineFileCacheConfig, + PipelineFileReportingConfig, + PipelineFileStorageConfig, + PipelineInputConfig, + PipelineTextInputConfig, + PipelineWorkflowReference, + create_pipeline_config, +) + +current_dir = os.path.dirname(__file__) + +ALL_ENV_VARS = { + "GRAPHRAG_API_BASE": "http://some/base", + "GRAPHRAG_API_KEY": "test", + "GRAPHRAG_API_ORGANIZATION": "test_org", + "GRAPHRAG_API_PROXY": "http://some/proxy", + "GRAPHRAG_API_VERSION": "v1234", + "GRAPHRAG_ASYNC_MODE": "asyncio", + "GRAPHRAG_CACHE_STORAGE_ACCOUNT_BLOB_URL": "cache_account_blob_url", + "GRAPHRAG_CACHE_BASE_DIR": "/some/cache/dir", + "GRAPHRAG_CACHE_CONNECTION_STRING": "test_cs1", + "GRAPHRAG_CACHE_CONTAINER_NAME": "test_cn1", + "GRAPHRAG_CACHE_TYPE": "blob", + "GRAPHRAG_CHUNK_BY_COLUMNS": "a,b", + "GRAPHRAG_CHUNK_OVERLAP": "12", + "GRAPHRAG_CHUNK_SIZE": "500", + "GRAPHRAG_CLAIM_EXTRACTION_ENABLED": "True", + "GRAPHRAG_CLAIM_EXTRACTION_DESCRIPTION": "test 123", + "GRAPHRAG_CLAIM_EXTRACTION_MAX_GLEANINGS": "5000", + "GRAPHRAG_CLAIM_EXTRACTION_PROMPT_FILE": "tests/unit/config/prompt-a.txt", + "GRAPHRAG_COMMUNITY_REPORT_MAX_LENGTH": "23456", + "GRAPHRAG_COMMUNITY_REPORT_PROMPT_FILE": "tests/unit/config/prompt-b.txt", + "GRAPHRAG_EMBEDDING_BATCH_MAX_TOKENS": "17", + "GRAPHRAG_EMBEDDING_BATCH_SIZE": "1000000", + "GRAPHRAG_EMBEDDING_CONCURRENT_REQUESTS": "12", + "GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME": "model-deployment-name", + "GRAPHRAG_EMBEDDING_MAX_RETRIES": "3", + "GRAPHRAG_EMBEDDING_MAX_RETRY_WAIT": "0.1123", + "GRAPHRAG_EMBEDDING_MODEL": "text-embedding-2", + "GRAPHRAG_EMBEDDING_RPM": "500", + "GRAPHRAG_EMBEDDING_SKIP": "a1,b1,c1", + "GRAPHRAG_EMBEDDING_SLEEP_ON_RATE_LIMIT_RECOMMENDATION": "False", + "GRAPHRAG_EMBEDDING_TARGET": "all", + "GRAPHRAG_EMBEDDING_THREAD_COUNT": "2345", + "GRAPHRAG_EMBEDDING_THREAD_STAGGER": "0.456", + "GRAPHRAG_EMBEDDING_TPM": "7000", + "GRAPHRAG_EMBEDDING_TYPE": "azure_openai_embedding", + "GRAPHRAG_ENCODING_MODEL": "test123", + "GRAPHRAG_INPUT_STORAGE_ACCOUNT_BLOB_URL": "input_account_blob_url", + "GRAPHRAG_ENTITY_EXTRACTION_ENTITY_TYPES": "cat,dog,elephant", + "GRAPHRAG_ENTITY_EXTRACTION_MAX_GLEANINGS": "112", + "GRAPHRAG_ENTITY_EXTRACTION_PROMPT_FILE": "tests/unit/config/prompt-c.txt", + "GRAPHRAG_INPUT_BASE_DIR": "/some/input/dir", + "GRAPHRAG_INPUT_CONNECTION_STRING": "input_cs", + "GRAPHRAG_INPUT_CONTAINER_NAME": "input_cn", + "GRAPHRAG_INPUT_DOCUMENT_ATTRIBUTE_COLUMNS": "test1,test2", + "GRAPHRAG_INPUT_ENCODING": "utf-16", + "GRAPHRAG_INPUT_FILE_PATTERN": ".*\\test\\.txt$", + "GRAPHRAG_INPUT_SOURCE_COLUMN": "test_source", + "GRAPHRAG_INPUT_TYPE": "blob", + "GRAPHRAG_INPUT_TEXT_COLUMN": "test_text", + "GRAPHRAG_INPUT_TIMESTAMP_COLUMN": "test_timestamp", + "GRAPHRAG_INPUT_TIMESTAMP_FORMAT": "test_format", + "GRAPHRAG_INPUT_TITLE_COLUMN": "test_title", + "GRAPHRAG_INPUT_FILE_TYPE": "text", + "GRAPHRAG_LLM_CONCURRENT_REQUESTS": "12", + "GRAPHRAG_LLM_DEPLOYMENT_NAME": "model-deployment-name-x", + "GRAPHRAG_LLM_MAX_RETRIES": "312", + "GRAPHRAG_LLM_MAX_RETRY_WAIT": "0.1122", + "GRAPHRAG_LLM_MAX_TOKENS": "15000", + "GRAPHRAG_LLM_MODEL_SUPPORTS_JSON": "true", + "GRAPHRAG_LLM_MODEL": "test-llm", + "GRAPHRAG_LLM_REQUEST_TIMEOUT": "12.7", + "GRAPHRAG_LLM_RPM": "900", + "GRAPHRAG_LLM_SLEEP_ON_RATE_LIMIT_RECOMMENDATION": "False", + "GRAPHRAG_LLM_THREAD_COUNT": "987", + "GRAPHRAG_LLM_THREAD_STAGGER": "0.123", + "GRAPHRAG_LLM_TPM": "8000", + "GRAPHRAG_LLM_TYPE": "azure_openai_chat", + "GRAPHRAG_MAX_CLUSTER_SIZE": "123", + "GRAPHRAG_NODE2VEC_ENABLED": "true", + "GRAPHRAG_NODE2VEC_ITERATIONS": "878787", + "GRAPHRAG_NODE2VEC_NUM_WALKS": "5000000", + "GRAPHRAG_NODE2VEC_RANDOM_SEED": "010101", + "GRAPHRAG_NODE2VEC_WALK_LENGTH": "555111", + "GRAPHRAG_NODE2VEC_WINDOW_SIZE": "12345", + "GRAPHRAG_REPORTING_STORAGE_ACCOUNT_BLOB_URL": "reporting_account_blob_url", + "GRAPHRAG_REPORTING_BASE_DIR": "/some/reporting/dir", + "GRAPHRAG_REPORTING_CONNECTION_STRING": "test_cs2", + "GRAPHRAG_REPORTING_CONTAINER_NAME": "test_cn2", + "GRAPHRAG_REPORTING_TYPE": "blob", + "GRAPHRAG_SKIP_WORKFLOWS": "a,b,c", + "GRAPHRAG_SNAPSHOT_GRAPHML": "true", + "GRAPHRAG_SNAPSHOT_RAW_ENTITIES": "true", + "GRAPHRAG_SNAPSHOT_TOP_LEVEL_NODES": "true", + "GRAPHRAG_STORAGE_STORAGE_ACCOUNT_BLOB_URL": "storage_account_blob_url", + "GRAPHRAG_STORAGE_BASE_DIR": "/some/storage/dir", + "GRAPHRAG_STORAGE_CONNECTION_STRING": "test_cs", + "GRAPHRAG_STORAGE_CONTAINER_NAME": "test_cn", + "GRAPHRAG_STORAGE_TYPE": "blob", + "GRAPHRAG_SUMMARIZE_DESCRIPTIONS_MAX_LENGTH": "12345", + "GRAPHRAG_SUMMARIZE_DESCRIPTIONS_PROMPT_FILE": "tests/unit/config/prompt-d.txt", + "GRAPHRAG_UMAP_ENABLED": "true", + "GRAPHRAG_LOCAL_SEARCH_TEXT_UNIT_PROP": "0.713", + "GRAPHRAG_LOCAL_SEARCH_COMMUNITY_PROP": "0.1234", + "GRAPHRAG_LOCAL_SEARCH_LLM_MAX_TOKENS": "12", + "GRAPHRAG_LOCAL_SEARCH_TOP_K_RELATIONSHIPS": "15", + "GRAPHRAG_LOCAL_SEARCH_TOP_K_ENTITIES": "14", + "GRAPHRAG_LOCAL_SEARCH_CONVERSATION_HISTORY_MAX_TURNS": "2", + "GRAPHRAG_LOCAL_SEARCH_MAX_TOKENS": "142435", + "GRAPHRAG_GLOBAL_SEARCH_MAX_TOKENS": "5123", + "GRAPHRAG_GLOBAL_SEARCH_DATA_MAX_TOKENS": "123", + "GRAPHRAG_GLOBAL_SEARCH_MAP_MAX_TOKENS": "4123", + "GRAPHRAG_GLOBAL_SEARCH_CONCURRENCY": "7", + "GRAPHRAG_GLOBAL_SEARCH_REDUCE_MAX_TOKENS": "15432", +} + + +class TestDefaultConfig(unittest.TestCase): + def test_clear_warnings(self): + """Just clearing unused import warnings""" + assert CacheConfig is not None + assert ChunkingConfig is not None + assert ClaimExtractionConfig is not None + assert ClusterGraphConfig is not None + assert CommunityReportsConfig is not None + assert EmbedGraphConfig is not None + assert EntityExtractionConfig is not None + assert GlobalSearchConfig is not None + assert GraphRagConfig is not None + assert InputConfig is not None + assert LLMParameters is not None + assert LocalSearchConfig is not None + assert ParallelizationParameters is not None + assert ReportingConfig is not None + assert SnapshotsConfig is not None + assert StorageConfig is not None + assert SummarizeDescriptionsConfig is not None + assert TextEmbeddingConfig is not None + assert UmapConfig is not None + assert PipelineConfig is not None + assert PipelineFileReportingConfig is not None + assert PipelineFileStorageConfig is not None + assert PipelineInputConfig is not None + assert PipelineFileCacheConfig is not None + assert PipelineWorkflowReference is not None + + @mock.patch.dict(os.environ, {"OPENAI_API_KEY": "test"}, clear=True) + def test_string_repr(self): + # __str__ can be json loaded + config = create_graphrag_config() + string_repr = str(config) + assert string_repr is not None + assert json.loads(string_repr) is not None + + # __repr__ can be eval()'d + repr_str = config.__repr__() + # TODO: add __repr__ to datashaper enum + repr_str = repr_str.replace("async_mode=,", "") + assert eval(repr_str) is not None + + # Pipeline config __str__ can be json loaded + pipeline_config = create_pipeline_config(config) + string_repr = str(pipeline_config) + assert string_repr is not None + assert json.loads(string_repr) is not None + + # Pipeline config __repr__ can be eval()'d + repr_str = pipeline_config.__repr__() + # TODO: add __repr__ to datashaper enum + repr_str = repr_str.replace( + "'async_mode': ,", "" + ) + assert eval(repr_str) is not None + + @mock.patch.dict(os.environ, {}, clear=True) + def test_default_config_with_no_env_vars_throws(self): + with pytest.raises(ApiKeyMissingError): + # This should throw an error because the API key is missing + create_pipeline_config(create_graphrag_config()) + + @mock.patch.dict(os.environ, {"GRAPHRAG_API_KEY": "test"}, clear=True) + def test_default_config_with_api_key_passes(self): + # doesn't throw + config = create_pipeline_config(create_graphrag_config()) + assert config is not None + + @mock.patch.dict(os.environ, {"OPENAI_API_KEY": "test"}, clear=True) + def test_default_config_with_oai_key_passes_envvar(self): + # doesn't throw + config = create_pipeline_config(create_graphrag_config()) + assert config is not None + + def test_default_config_with_oai_key_passes_obj(self): + # doesn't throw + config = create_pipeline_config( + create_graphrag_config({"llm": {"api_key": "test"}}) + ) + assert config is not None + + @mock.patch.dict( + os.environ, + {"GRAPHRAG_API_KEY": "test", "GRAPHRAG_LLM_TYPE": "azure_openai_chat"}, + clear=True, + ) + def test_throws_if_azure_is_used_without_api_base_envvar(self): + with pytest.raises(AzureApiBaseMissingError): + create_graphrag_config() + + @mock.patch.dict(os.environ, {"GRAPHRAG_API_KEY": "test"}, clear=True) + def test_throws_if_azure_is_used_without_api_base_obj(self): + with pytest.raises(AzureApiBaseMissingError): + create_graphrag_config( + GraphRagConfigInput(llm=LLMParametersInput(type="azure_openai_chat")) + ) + + @mock.patch.dict( + os.environ, + { + "GRAPHRAG_API_KEY": "test", + "GRAPHRAG_LLM_TYPE": "azure_openai_chat", + "GRAPHRAG_API_BASE": "http://some/base", + }, + clear=True, + ) + def test_throws_if_azure_is_used_without_llm_deployment_name_envvar(self): + with pytest.raises(AzureDeploymentNameMissingError): + create_graphrag_config() + + @mock.patch.dict(os.environ, {"GRAPHRAG_API_KEY": "test"}, clear=True) + def test_throws_if_azure_is_used_without_llm_deployment_name_obj(self): + with pytest.raises(AzureDeploymentNameMissingError): + create_graphrag_config( + GraphRagConfigInput( + llm=LLMParametersInput( + type="azure_openai_chat", api_base="http://some/base" + ) + ) + ) + + @mock.patch.dict( + os.environ, + { + "GRAPHRAG_API_KEY": "test", + "GRAPHRAG_EMBEDDING_TYPE": "azure_openai_embedding", + "GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME": "x", + }, + clear=True, + ) + def test_throws_if_azure_is_used_without_embedding_api_base_envvar(self): + with pytest.raises(AzureApiBaseMissingError): + create_graphrag_config() + + @mock.patch.dict(os.environ, {"GRAPHRAG_API_KEY": "test"}, clear=True) + def test_throws_if_azure_is_used_without_embedding_api_base_obj(self): + with pytest.raises(AzureApiBaseMissingError): + create_graphrag_config( + GraphRagConfigInput( + embeddings=TextEmbeddingConfigInput( + llm=LLMParametersInput( + type="azure_openai_embedding", + deployment_name="x", + ) + ), + ) + ) + + @mock.patch.dict( + os.environ, + { + "GRAPHRAG_API_KEY": "test", + "GRAPHRAG_API_BASE": "http://some/base", + "GRAPHRAG_LLM_DEPLOYMENT_NAME": "x", + "GRAPHRAG_LLM_TYPE": "azure_openai_chat", + "GRAPHRAG_EMBEDDING_TYPE": "azure_openai_embedding", + }, + clear=True, + ) + def test_throws_if_azure_is_used_without_embedding_deployment_name_envvar(self): + with pytest.raises(AzureDeploymentNameMissingError): + create_graphrag_config() + + @mock.patch.dict(os.environ, {"GRAPHRAG_API_KEY": "test"}, clear=True) + def test_throws_if_azure_is_used_without_embedding_deployment_name_obj(self): + with pytest.raises(AzureDeploymentNameMissingError): + create_graphrag_config( + GraphRagConfigInput( + llm=LLMParametersInput( + type="azure_openai_chat", + api_base="http://some/base", + deployment_name="model-deployment-name-x", + ), + embeddings=TextEmbeddingConfigInput( + llm=LLMParametersInput( + type="azure_openai_embedding", + ) + ), + ) + ) + + @mock.patch.dict(os.environ, {"GRAPHRAG_API_KEY": "test"}, clear=True) + def test_minimim_azure_config_object(self): + config = create_graphrag_config( + GraphRagConfigInput( + llm=LLMParametersInput( + type="azure_openai_chat", + api_base="http://some/base", + deployment_name="model-deployment-name-x", + ), + embeddings=TextEmbeddingConfigInput( + llm=LLMParametersInput( + type="azure_openai_embedding", + deployment_name="model-deployment-name", + ) + ), + ) + ) + assert config is not None + + @mock.patch.dict( + os.environ, + { + "GRAPHRAG_API_KEY": "test", + "GRAPHRAG_LLM_TYPE": "azure_openai_chat", + "GRAPHRAG_LLM_DEPLOYMENT_NAME": "x", + }, + clear=True, + ) + def test_throws_if_azure_is_used_without_api_base(self): + with pytest.raises(AzureApiBaseMissingError): + create_graphrag_config() + + @mock.patch.dict( + os.environ, + { + "GRAPHRAG_API_KEY": "test", + "GRAPHRAG_LLM_TYPE": "azure_openai_chat", + "GRAPHRAG_LLM_API_BASE": "http://some/base", + }, + clear=True, + ) + def test_throws_if_azure_is_used_without_llm_deployment_name(self): + with pytest.raises(AzureDeploymentNameMissingError): + create_graphrag_config() + + @mock.patch.dict( + os.environ, + { + "GRAPHRAG_API_KEY": "test", + "GRAPHRAG_LLM_TYPE": "azure_openai_chat", + "GRAPHRAG_API_BASE": "http://some/base", + "GRAPHRAG_LLM_DEPLOYMENT_NAME": "model-deployment-name-x", + "GRAPHRAG_EMBEDDING_TYPE": "azure_openai_embedding", + }, + clear=True, + ) + def test_throws_if_azure_is_used_without_embedding_deployment_name(self): + with pytest.raises(AzureDeploymentNameMissingError): + create_graphrag_config() + + @mock.patch.dict( + os.environ, + {"GRAPHRAG_API_KEY": "test", "GRAPHRAG_INPUT_FILE_TYPE": "csv"}, + clear=True, + ) + def test_csv_input_returns_correct_config(self): + config = create_pipeline_config(create_graphrag_config(root_dir="/some/root")) + assert config.root_dir == "/some/root" + # Make sure the input is a CSV input + assert isinstance(config.input, PipelineCSVInputConfig) + assert (config.input.file_pattern or "") == ".*\\.csv$" # type: ignore + + @mock.patch.dict( + os.environ, + {"GRAPHRAG_API_KEY": "test", "GRAPHRAG_INPUT_FILE_TYPE": "text"}, + clear=True, + ) + def test_text_input_returns_correct_config(self): + config = create_pipeline_config(create_graphrag_config(root_dir=".")) + assert isinstance(config.input, PipelineTextInputConfig) + assert config.input is not None + assert (config.input.file_pattern or "") == ".*\\.txt$" # type: ignore + + def test_all_env_vars_is_accurate(self): + env_var_docs_path = Path("docsite/posts/config/env_vars.md") + query_docs_path = Path("docsite/posts/query/3-cli.md") + + env_var_docs = env_var_docs_path.read_text(encoding="utf-8") + query_docs = query_docs_path.read_text(encoding="utf-8") + + def find_envvar_names(text) -> set[str]: + pattern = r"`(GRAPHRAG_[^`]+)`" + found = re.findall(pattern, text) + found = {f for f in found if not f.endswith("_")} + return {*found} + + graphrag_strings = find_envvar_names(env_var_docs) | find_envvar_names( + query_docs + ) + + missing = {s for s in graphrag_strings if s not in ALL_ENV_VARS} - { + # Remove configs covered by the base LLM connection configs + "GRAPHRAG_LLM_API_KEY", + "GRAPHRAG_LLM_API_BASE", + "GRAPHRAG_LLM_API_VERSION", + "GRAPHRAG_LLM_API_ORGANIZATION", + "GRAPHRAG_LLM_API_PROXY", + "GRAPHRAG_EMBEDDING_API_KEY", + "GRAPHRAG_EMBEDDING_API_BASE", + "GRAPHRAG_EMBEDDING_API_VERSION", + "GRAPHRAG_EMBEDDING_API_ORGANIZATION", + "GRAPHRAG_EMBEDDING_API_PROXY", + } + if missing: + msg = f"{len(missing)} missing env vars: {missing}" + print(msg) + raise ValueError(msg) + + @mock.patch.dict( + os.environ, + {"GRAPHRAG_API_KEY": "test"}, + clear=True, + ) + def test_malformed_input_dict_throws(self): + with pytest.raises(ValidationError): + create_graphrag_config(cast(Any, {"llm": 12})) + + @mock.patch.dict( + os.environ, + ALL_ENV_VARS, + clear=True, + ) + def test_create_parameters_from_env_vars(self) -> None: + parameters = create_graphrag_config() + assert parameters.async_mode == "asyncio" + assert parameters.cache.storage_account_blob_url == "cache_account_blob_url" + assert parameters.cache.base_dir == "/some/cache/dir" + assert parameters.cache.connection_string == "test_cs1" + assert parameters.cache.container_name == "test_cn1" + assert parameters.cache.type == CacheType.blob + assert parameters.chunks.group_by_columns == ["a", "b"] + assert parameters.chunks.overlap == 12 + assert parameters.chunks.size == 500 + assert parameters.claim_extraction.enabled + assert parameters.claim_extraction.description == "test 123" + assert parameters.claim_extraction.max_gleanings == 5000 + assert parameters.claim_extraction.prompt == "tests/unit/config/prompt-a.txt" + assert parameters.cluster_graph.max_cluster_size == 123 + assert parameters.community_reports.max_length == 23456 + assert parameters.community_reports.prompt == "tests/unit/config/prompt-b.txt" + assert parameters.embed_graph.enabled + assert parameters.embed_graph.iterations == 878787 + assert parameters.embed_graph.num_walks == 5_000_000 + assert parameters.embed_graph.random_seed == 10101 + assert parameters.embed_graph.walk_length == 555111 + assert parameters.embed_graph.window_size == 12345 + assert parameters.embeddings.batch_max_tokens == 17 + assert parameters.embeddings.batch_size == 1_000_000 + assert parameters.embeddings.llm.concurrent_requests == 12 + assert parameters.embeddings.llm.deployment_name == "model-deployment-name" + assert parameters.embeddings.llm.max_retries == 3 + assert parameters.embeddings.llm.max_retry_wait == 0.1123 + assert parameters.embeddings.llm.model == "text-embedding-2" + assert parameters.embeddings.llm.requests_per_minute == 500 + assert parameters.embeddings.llm.sleep_on_rate_limit_recommendation is False + assert parameters.embeddings.llm.tokens_per_minute == 7000 + assert parameters.embeddings.llm.type == "azure_openai_embedding" + assert parameters.embeddings.parallelization.num_threads == 2345 + assert parameters.embeddings.parallelization.stagger == 0.456 + assert parameters.embeddings.skip == ["a1", "b1", "c1"] + assert parameters.embeddings.target == "all" + assert parameters.encoding_model == "test123" + assert parameters.entity_extraction.entity_types == ["cat", "dog", "elephant"] + assert parameters.entity_extraction.llm.api_base == "http://some/base" + assert parameters.entity_extraction.max_gleanings == 112 + assert parameters.entity_extraction.prompt == "tests/unit/config/prompt-c.txt" + assert parameters.input.storage_account_blob_url == "input_account_blob_url" + assert parameters.input.base_dir == "/some/input/dir" + assert parameters.input.connection_string == "input_cs" + assert parameters.input.container_name == "input_cn" + assert parameters.input.document_attribute_columns == ["test1", "test2"] + assert parameters.input.encoding == "utf-16" + assert parameters.input.file_pattern == ".*\\test\\.txt$" + assert parameters.input.file_type == InputFileType.text + assert parameters.input.source_column == "test_source" + assert parameters.input.text_column == "test_text" + assert parameters.input.timestamp_column == "test_timestamp" + assert parameters.input.timestamp_format == "test_format" + assert parameters.input.title_column == "test_title" + assert parameters.input.type == InputType.blob + assert parameters.llm.api_base == "http://some/base" + assert parameters.llm.api_key == "test" + assert parameters.llm.api_version == "v1234" + assert parameters.llm.concurrent_requests == 12 + assert parameters.llm.deployment_name == "model-deployment-name-x" + assert parameters.llm.max_retries == 312 + assert parameters.llm.max_retry_wait == 0.1122 + assert parameters.llm.max_tokens == 15000 + assert parameters.llm.model == "test-llm" + assert parameters.llm.model_supports_json + assert parameters.llm.organization == "test_org" + assert parameters.llm.proxy == "http://some/proxy" + assert parameters.llm.request_timeout == 12.7 + assert parameters.llm.requests_per_minute == 900 + assert parameters.llm.sleep_on_rate_limit_recommendation is False + assert parameters.llm.tokens_per_minute == 8000 + assert parameters.llm.type == "azure_openai_chat" + assert parameters.parallelization.num_threads == 987 + assert parameters.parallelization.stagger == 0.123 + assert ( + parameters.reporting.storage_account_blob_url + == "reporting_account_blob_url" + ) + assert parameters.reporting.base_dir == "/some/reporting/dir" + assert parameters.reporting.connection_string == "test_cs2" + assert parameters.reporting.container_name == "test_cn2" + assert parameters.reporting.type == ReportingType.blob + assert parameters.skip_workflows == ["a", "b", "c"] + assert parameters.snapshots.graphml + assert parameters.snapshots.raw_entities + assert parameters.snapshots.top_level_nodes + assert parameters.storage.storage_account_blob_url == "storage_account_blob_url" + assert parameters.storage.base_dir == "/some/storage/dir" + assert parameters.storage.connection_string == "test_cs" + assert parameters.storage.container_name == "test_cn" + assert parameters.storage.type == StorageType.blob + assert parameters.summarize_descriptions.max_length == 12345 + assert ( + parameters.summarize_descriptions.prompt == "tests/unit/config/prompt-d.txt" + ) + assert parameters.umap.enabled + assert parameters.local_search.text_unit_prop == 0.713 + assert parameters.local_search.community_prop == 0.1234 + assert parameters.local_search.llm_max_tokens == 12 + assert parameters.local_search.top_k_relationships == 15 + assert parameters.local_search.conversation_history_max_turns == 2 + assert parameters.local_search.top_k_entities == 14 + assert parameters.local_search.max_tokens == 142435 + assert parameters.global_search.max_tokens == 5123 + assert parameters.global_search.data_max_tokens == 123 + assert parameters.global_search.map_max_tokens == 4123 + assert parameters.global_search.concurrency == 7 + assert parameters.global_search.reduce_max_tokens == 15432 + + @mock.patch.dict(os.environ, {"API_KEY_X": "test"}, clear=True) + def test_create_parameters(self) -> None: + parameters = create_graphrag_config( + GraphRagConfigInput( + llm=LLMParametersInput(api_key="${API_KEY_X}", model="test-llm"), + storage=StorageConfigInput( + type=StorageType.blob, + connection_string="test_cs", + container_name="test_cn", + base_dir="/some/storage/dir", + storage_account_blob_url="storage_account_blob_url", + ), + cache=CacheConfigInput( + type=CacheType.blob, + connection_string="test_cs1", + container_name="test_cn1", + base_dir="/some/cache/dir", + storage_account_blob_url="cache_account_blob_url", + ), + reporting=ReportingConfigInput( + type=ReportingType.blob, + connection_string="test_cs2", + container_name="test_cn2", + base_dir="/some/reporting/dir", + storage_account_blob_url="reporting_account_blob_url", + ), + input=InputConfigInput( + file_type=InputFileType.text, + file_encoding="utf-16", + document_attribute_columns=["test1", "test2"], + base_dir="/some/input/dir", + connection_string="input_cs", + container_name="input_cn", + file_pattern=".*\\test\\.txt$", + source_column="test_source", + text_column="test_text", + timestamp_column="test_timestamp", + timestamp_format="test_format", + title_column="test_title", + type="blob", + storage_account_blob_url="input_account_blob_url", + ), + embed_graph=EmbedGraphConfigInput( + enabled=True, + num_walks=5_000_000, + iterations=878787, + random_seed=10101, + walk_length=555111, + ), + embeddings=TextEmbeddingConfigInput( + batch_size=1_000_000, + batch_max_tokens=8000, + skip=["a1", "b1", "c1"], + llm=LLMParametersInput(model="text-embedding-2"), + ), + chunks=ChunkingConfigInput( + size=500, overlap=12, group_by_columns=["a", "b"] + ), + snapshots=SnapshotsConfigInput( + graphml=True, + raw_entities=True, + top_level_nodes=True, + ), + entity_extraction=EntityExtractionConfigInput( + max_gleanings=112, + entity_types=["cat", "dog", "elephant"], + prompt="entity_extraction_prompt_file.txt", + ), + summarize_descriptions=SummarizeDescriptionsConfigInput( + max_length=12345, prompt="summarize_prompt_file.txt" + ), + community_reports=CommunityReportsConfigInput( + max_length=23456, + prompt="community_report_prompt_file.txt", + max_input_length=12345, + ), + claim_extraction=ClaimExtractionConfigInput( + description="test 123", + max_gleanings=5000, + prompt="claim_extraction_prompt_file.txt", + ), + cluster_graph=ClusterGraphConfigInput( + max_cluster_size=123, + ), + umap=UmapConfigInput(enabled=True), + encoding_model="test123", + skip_workflows=["a", "b", "c"], + ), + ".", + ) + + assert parameters.cache.base_dir == "/some/cache/dir" + assert parameters.cache.connection_string == "test_cs1" + assert parameters.cache.container_name == "test_cn1" + assert parameters.cache.type == CacheType.blob + assert parameters.cache.storage_account_blob_url == "cache_account_blob_url" + assert parameters.chunks.group_by_columns == ["a", "b"] + assert parameters.chunks.overlap == 12 + assert parameters.chunks.size == 500 + assert parameters.claim_extraction.description == "test 123" + assert parameters.claim_extraction.max_gleanings == 5000 + assert parameters.claim_extraction.prompt == "claim_extraction_prompt_file.txt" + assert parameters.cluster_graph.max_cluster_size == 123 + assert parameters.community_reports.max_input_length == 12345 + assert parameters.community_reports.max_length == 23456 + assert parameters.community_reports.prompt == "community_report_prompt_file.txt" + assert parameters.embed_graph.enabled + assert parameters.embed_graph.iterations == 878787 + assert parameters.embed_graph.num_walks == 5_000_000 + assert parameters.embed_graph.random_seed == 10101 + assert parameters.embed_graph.walk_length == 555111 + assert parameters.embeddings.batch_max_tokens == 8000 + assert parameters.embeddings.batch_size == 1_000_000 + assert parameters.embeddings.llm.model == "text-embedding-2" + assert parameters.embeddings.skip == ["a1", "b1", "c1"] + assert parameters.encoding_model == "test123" + assert parameters.entity_extraction.entity_types == ["cat", "dog", "elephant"] + assert parameters.entity_extraction.max_gleanings == 112 + assert ( + parameters.entity_extraction.prompt == "entity_extraction_prompt_file.txt" + ) + assert parameters.input.base_dir == "/some/input/dir" + assert parameters.input.connection_string == "input_cs" + assert parameters.input.container_name == "input_cn" + assert parameters.input.document_attribute_columns == ["test1", "test2"] + assert parameters.input.encoding == "utf-16" + assert parameters.input.file_pattern == ".*\\test\\.txt$" + assert parameters.input.source_column == "test_source" + assert parameters.input.type == "blob" + assert parameters.input.text_column == "test_text" + assert parameters.input.timestamp_column == "test_timestamp" + assert parameters.input.timestamp_format == "test_format" + assert parameters.input.title_column == "test_title" + assert parameters.input.file_type == InputFileType.text + assert parameters.input.storage_account_blob_url == "input_account_blob_url" + assert parameters.llm.api_key == "test" + assert parameters.llm.model == "test-llm" + assert parameters.reporting.base_dir == "/some/reporting/dir" + assert parameters.reporting.connection_string == "test_cs2" + assert parameters.reporting.container_name == "test_cn2" + assert parameters.reporting.type == ReportingType.blob + assert ( + parameters.reporting.storage_account_blob_url + == "reporting_account_blob_url" + ) + assert parameters.skip_workflows == ["a", "b", "c"] + assert parameters.snapshots.graphml + assert parameters.snapshots.raw_entities + assert parameters.snapshots.top_level_nodes + assert parameters.storage.base_dir == "/some/storage/dir" + assert parameters.storage.connection_string == "test_cs" + assert parameters.storage.container_name == "test_cn" + assert parameters.storage.type == StorageType.blob + assert parameters.storage.storage_account_blob_url == "storage_account_blob_url" + assert parameters.summarize_descriptions.max_length == 12345 + assert parameters.summarize_descriptions.prompt == "summarize_prompt_file.txt" + assert parameters.umap.enabled + + @mock.patch.dict( + os.environ, + {"GRAPHRAG_API_KEY": "test"}, + clear=True, + ) + def test_default_values(self) -> None: + parameters = create_graphrag_config() + assert parameters.async_mode == defs.ASYNC_MODE + assert parameters.cache.base_dir == defs.CACHE_BASE_DIR + assert parameters.cache.type == defs.CACHE_TYPE + assert parameters.cache.base_dir == defs.CACHE_BASE_DIR + assert parameters.chunks.group_by_columns == defs.CHUNK_GROUP_BY_COLUMNS + assert parameters.chunks.overlap == defs.CHUNK_OVERLAP + assert parameters.chunks.size == defs.CHUNK_SIZE + assert parameters.claim_extraction.description == defs.CLAIM_DESCRIPTION + assert parameters.claim_extraction.max_gleanings == defs.CLAIM_MAX_GLEANINGS + assert ( + parameters.community_reports.max_input_length + == defs.COMMUNITY_REPORT_MAX_INPUT_LENGTH + ) + assert ( + parameters.community_reports.max_length == defs.COMMUNITY_REPORT_MAX_LENGTH + ) + assert parameters.embeddings.batch_max_tokens == defs.EMBEDDING_BATCH_MAX_TOKENS + assert parameters.embeddings.batch_size == defs.EMBEDDING_BATCH_SIZE + assert parameters.embeddings.llm.model == defs.EMBEDDING_MODEL + assert parameters.embeddings.target == defs.EMBEDDING_TARGET + assert parameters.embeddings.llm.type == defs.EMBEDDING_TYPE + assert ( + parameters.embeddings.llm.requests_per_minute + == defs.LLM_REQUESTS_PER_MINUTE + ) + assert parameters.embeddings.llm.tokens_per_minute == defs.LLM_TOKENS_PER_MINUTE + assert ( + parameters.embeddings.llm.sleep_on_rate_limit_recommendation + == defs.LLM_SLEEP_ON_RATE_LIMIT_RECOMMENDATION + ) + assert ( + parameters.entity_extraction.entity_types + == defs.ENTITY_EXTRACTION_ENTITY_TYPES + ) + assert ( + parameters.entity_extraction.max_gleanings + == defs.ENTITY_EXTRACTION_MAX_GLEANINGS + ) + assert parameters.encoding_model == defs.ENCODING_MODEL + assert parameters.input.base_dir == defs.INPUT_BASE_DIR + assert parameters.input.file_pattern == defs.INPUT_CSV_PATTERN + assert parameters.input.encoding == defs.INPUT_FILE_ENCODING + assert parameters.input.type == defs.INPUT_TYPE + assert parameters.input.base_dir == defs.INPUT_BASE_DIR + assert parameters.input.text_column == defs.INPUT_TEXT_COLUMN + assert parameters.input.file_type == defs.INPUT_FILE_TYPE + assert parameters.llm.concurrent_requests == defs.LLM_CONCURRENT_REQUESTS + assert parameters.llm.max_retries == defs.LLM_MAX_RETRIES + assert parameters.llm.max_retry_wait == defs.LLM_MAX_RETRY_WAIT + assert parameters.llm.max_tokens == defs.LLM_MAX_TOKENS + assert parameters.llm.model == defs.LLM_MODEL + assert parameters.llm.request_timeout == defs.LLM_REQUEST_TIMEOUT + assert parameters.llm.requests_per_minute == defs.LLM_REQUESTS_PER_MINUTE + assert parameters.llm.tokens_per_minute == defs.LLM_TOKENS_PER_MINUTE + assert ( + parameters.llm.sleep_on_rate_limit_recommendation + == defs.LLM_SLEEP_ON_RATE_LIMIT_RECOMMENDATION + ) + assert parameters.llm.type == defs.LLM_TYPE + assert parameters.cluster_graph.max_cluster_size == defs.MAX_CLUSTER_SIZE + assert parameters.embed_graph.enabled == defs.NODE2VEC_ENABLED + assert parameters.embed_graph.iterations == defs.NODE2VEC_ITERATIONS + assert parameters.embed_graph.num_walks == defs.NODE2VEC_NUM_WALKS + assert parameters.embed_graph.random_seed == defs.NODE2VEC_RANDOM_SEED + assert parameters.embed_graph.walk_length == defs.NODE2VEC_WALK_LENGTH + assert parameters.embed_graph.window_size == defs.NODE2VEC_WINDOW_SIZE + assert ( + parameters.parallelization.num_threads == defs.PARALLELIZATION_NUM_THREADS + ) + assert parameters.parallelization.stagger == defs.PARALLELIZATION_STAGGER + assert parameters.reporting.type == defs.REPORTING_TYPE + assert parameters.reporting.base_dir == defs.REPORTING_BASE_DIR + assert parameters.snapshots.graphml == defs.SNAPSHOTS_GRAPHML + assert parameters.snapshots.raw_entities == defs.SNAPSHOTS_RAW_ENTITIES + assert parameters.snapshots.top_level_nodes == defs.SNAPSHOTS_TOP_LEVEL_NODES + assert parameters.storage.base_dir == defs.STORAGE_BASE_DIR + assert parameters.storage.type == defs.STORAGE_TYPE + assert parameters.umap.enabled == defs.UMAP_ENABLED + + @mock.patch.dict( + os.environ, + {"GRAPHRAG_API_KEY": "test"}, + clear=True, + ) + def test_prompt_file_reading(self): + config = create_graphrag_config({ + "entity_extraction": {"prompt": "tests/unit/config/prompt-a.txt"}, + "claim_extraction": {"prompt": "tests/unit/config/prompt-b.txt"}, + "community_reports": {"prompt": "tests/unit/config/prompt-c.txt"}, + "summarize_descriptions": {"prompt": "tests/unit/config/prompt-d.txt"}, + }) + strategy = config.entity_extraction.resolved_strategy(".", "abc123") + assert strategy["extraction_prompt"] == "Hello, World! A" + assert strategy["encoding_name"] == "abc123" + + strategy = config.claim_extraction.resolved_strategy(".") + assert strategy["extraction_prompt"] == "Hello, World! B" + + strategy = config.community_reports.resolved_strategy(".") + assert strategy["extraction_prompt"] == "Hello, World! C" + + strategy = config.summarize_descriptions.resolved_strategy(".") + assert strategy["summarize_prompt"] == "Hello, World! D" + + +@mock.patch.dict( + os.environ, + { + "PIPELINE_LLM_API_KEY": "test", + "PIPELINE_LLM_API_BASE": "http://test", + "PIPELINE_LLM_API_VERSION": "v1", + "PIPELINE_LLM_MODEL": "test-llm", + "PIPELINE_LLM_DEPLOYMENT_NAME": "test", + }, + clear=True, +) +def test_yaml_load_e2e(): + config_dict = yaml.safe_load( + """ +input: + file_type: text + +llm: + type: azure_openai_chat + api_key: ${PIPELINE_LLM_API_KEY} + api_base: ${PIPELINE_LLM_API_BASE} + api_version: ${PIPELINE_LLM_API_VERSION} + model: ${PIPELINE_LLM_MODEL} + deployment_name: ${PIPELINE_LLM_DEPLOYMENT_NAME} + model_supports_json: True + tokens_per_minute: 80000 + requests_per_minute: 900 + thread_count: 50 + concurrent_requests: 25 +""" + ) + # create default configuration pipeline parameters from the custom settings + model = config_dict + parameters = create_graphrag_config(model, ".") + + assert parameters.llm.api_key == "test" + assert parameters.llm.model == "test-llm" + assert parameters.llm.api_base == "http://test" + assert parameters.llm.api_version == "v1" + assert parameters.llm.deployment_name == "test" + + # generate the pipeline from the default parameters + pipeline_config = create_pipeline_config(parameters, True) + + config_str = pipeline_config.model_dump_json() + assert "${PIPELINE_LLM_API_KEY}" not in config_str + assert "${PIPELINE_LLM_API_BASE}" not in config_str + assert "${PIPELINE_LLM_API_VERSION}" not in config_str + assert "${PIPELINE_LLM_MODEL}" not in config_str + assert "${PIPELINE_LLM_DEPLOYMENT_NAME}" not in config_str diff --git a/tests/unit/indexing/__init__.py b/tests/unit/indexing/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/unit/indexing/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/unit/indexing/cache/__init__.py b/tests/unit/indexing/cache/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/unit/indexing/cache/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/unit/indexing/cache/test_file_pipeline_cache.py b/tests/unit/indexing/cache/test_file_pipeline_cache.py new file mode 100644 index 00000000..ada32396 --- /dev/null +++ b/tests/unit/indexing/cache/test_file_pipeline_cache.py @@ -0,0 +1,76 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import asyncio +import os +import unittest + +from graphrag.index.cache import ( + JsonPipelineCache, +) +from graphrag.index.storage.file_pipeline_storage import ( + FilePipelineStorage, +) + +TEMP_DIR = "./.tmp" + + +def create_cache(): + storage = FilePipelineStorage(os.path.join(os.getcwd(), ".tmp")) + return JsonPipelineCache(storage) + + +class TestFilePipelineCache(unittest.IsolatedAsyncioTestCase): + def setUp(self): + self.cache = create_cache() + + def tearDown(self): + asyncio.run(self.cache.clear()) + + async def test_cache_clear(self): + # Create a cache directory + if not os.path.exists(TEMP_DIR): + os.mkdir(TEMP_DIR) + with open(f"{TEMP_DIR}/test1", "w") as f: + f.write("This is test1 file.") + with open(f"{TEMP_DIR}/test2", "w") as f: + f.write("This is test2 file.") + + # this invokes cache.clear() + await self.cache.clear() + + # Check if the cache directory is empty + files = os.listdir(TEMP_DIR) + assert len(files) == 0 + + async def test_child_cache(self): + await self.cache.set("test1", "test1") + assert os.path.exists(f"{TEMP_DIR}/test1") + + child = self.cache.child("test") + assert os.path.exists(f"{TEMP_DIR}/test") + + await child.set("test2", "test2") + assert os.path.exists(f"{TEMP_DIR}/test/test2") + + await self.cache.set("test1", "test1") + await self.cache.delete("test1") + assert not os.path.exists(f"{TEMP_DIR}/test1") + + async def test_cache_has(self): + test1 = "this is a test file" + await self.cache.set("test1", test1) + + assert await self.cache.has("test1") + assert not await self.cache.has("NON_EXISTENT") + assert await self.cache.get("NON_EXISTENT") is None + + async def test_get_set(self): + test1 = "this is a test file" + test2 = "\\n test" + test3 = "\\\\\\" + await self.cache.set("test1", test1) + await self.cache.set("test2", test2) + await self.cache.set("test3", test3) + assert await self.cache.get("test1") == test1 + assert await self.cache.get("test2") == test2 + assert await self.cache.get("test3") == test3 diff --git a/tests/unit/indexing/config/__init__.py b/tests/unit/indexing/config/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/unit/indexing/config/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/unit/indexing/config/default_config_with_everything_overridden.yml b/tests/unit/indexing/config/default_config_with_everything_overridden.yml new file mode 100644 index 00000000..7a2f712e --- /dev/null +++ b/tests/unit/indexing/config/default_config_with_everything_overridden.yml @@ -0,0 +1,20 @@ +extends: default + +input: + file_type: text + base_dir: /some/overridden/dir + file_pattern: test.txt + +storage: + type: file + +cache: + type: file + +reporting: + type: file + +workflows: + - name: TEST_WORKFLOW + steps: + - verb: TEST_VERB diff --git a/tests/unit/indexing/config/default_config_with_overridden_input.yml b/tests/unit/indexing/config/default_config_with_overridden_input.yml new file mode 100644 index 00000000..68631a31 --- /dev/null +++ b/tests/unit/indexing/config/default_config_with_overridden_input.yml @@ -0,0 +1,5 @@ +extends: default +input: + file_type: text + base_dir: /some/overridden/dir + file_pattern: test.txt diff --git a/tests/unit/indexing/config/default_config_with_overridden_workflows.yml b/tests/unit/indexing/config/default_config_with_overridden_workflows.yml new file mode 100644 index 00000000..c3c9d07c --- /dev/null +++ b/tests/unit/indexing/config/default_config_with_overridden_workflows.yml @@ -0,0 +1,6 @@ +extends: default + +workflows: + - name: TEST_WORKFLOW + steps: + - verb: TEST_VERB diff --git a/tests/unit/indexing/config/helpers.py b/tests/unit/indexing/config/helpers.py new file mode 100644 index 00000000..580d0a9f --- /dev/null +++ b/tests/unit/indexing/config/helpers.py @@ -0,0 +1,59 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import json +import unittest +from typing import Any + +from graphrag.config import create_graphrag_config +from graphrag.index import PipelineConfig, create_pipeline_config + + +def assert_contains_default_config( + test_case: unittest.TestCase, + config: Any, + check_input=True, + check_storage=True, + check_reporting=True, + check_cache=True, + check_workflows=True, +): + """Asserts that the config contains the default config.""" + assert config is not None + assert isinstance(config, PipelineConfig) + + checked_config = json.loads( + config.model_dump_json(exclude_defaults=True, exclude_unset=True) + ) + + actual_default_config = json.loads( + create_pipeline_config(create_graphrag_config()).model_dump_json( + exclude_defaults=True, exclude_unset=True + ) + ) + props_to_ignore = ["root_dir", "extends"] + + # Make sure there is some sort of workflows + if not check_workflows: + props_to_ignore.append("workflows") + + # Make sure it tries to load some sort of input + if not check_input: + props_to_ignore.append("input") + + # Make sure it tries to load some sort of storage + if not check_storage: + props_to_ignore.append("storage") + + # Make sure it tries to load some sort of reporting + if not check_reporting: + props_to_ignore.append("reporting") + + # Make sure it tries to load some sort of cache + if not check_cache: + props_to_ignore.append("cache") + + for prop in props_to_ignore: + checked_config.pop(prop, None) + actual_default_config.pop(prop, None) + + assert actual_default_config == actual_default_config | checked_config diff --git a/tests/unit/indexing/config/test_load.py b/tests/unit/indexing/config/test_load.py new file mode 100644 index 00000000..78f6a93a --- /dev/null +++ b/tests/unit/indexing/config/test_load.py @@ -0,0 +1,121 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT Licenses +import json +import os +import unittest +from pathlib import Path +from typing import Any +from unittest import mock + +from graphrag.config import create_graphrag_config +from graphrag.index import ( + PipelineConfig, + create_pipeline_config, + load_pipeline_config, +) + +current_dir = os.path.dirname(__file__) + + +class TestLoadPipelineConfig(unittest.TestCase): + @mock.patch.dict(os.environ, {"GRAPHRAG_API_KEY": "test"}, clear=True) + def test_config_passed_in_returns_config(self): + config = PipelineConfig() + result = load_pipeline_config(config) + assert result == config + + @mock.patch.dict(os.environ, {"GRAPHRAG_API_KEY": "test"}, clear=True) + def test_loading_default_config_returns_config(self): + result = load_pipeline_config("default") + self.assert_is_default_config(result) + + @mock.patch.dict(os.environ, {"GRAPHRAG_API_KEY": "test"}, clear=True) + def test_loading_default_config_with_input_overridden(self): + config = load_pipeline_config( + str(Path(current_dir) / "default_config_with_overridden_input.yml") + ) + + # Check that the config is merged + # but skip checking the input + self.assert_is_default_config(config, check_input=False) + + if config.input is None: + msg = "Input should not be none" + raise Exception(msg) + + # Check that the input is merged + assert config.input.file_pattern == "test.txt" + assert config.input.file_type == "text" + assert config.input.base_dir == "/some/overridden/dir" + + @mock.patch.dict(os.environ, {"GRAPHRAG_API_KEY": "test"}, clear=True) + def test_loading_default_config_with_workflows_overridden(self): + config = load_pipeline_config( + str(Path(current_dir) / "default_config_with_overridden_workflows.yml") + ) + + # Check that the config is merged + # but skip checking the input + self.assert_is_default_config(config, check_workflows=False) + + # Make sure the workflows are overridden + assert len(config.workflows) == 1 + assert config.workflows[0].name == "TEST_WORKFLOW" + assert config.workflows[0].steps is not None + assert len(config.workflows[0].steps) == 1 # type: ignore + assert config.workflows[0].steps[0]["verb"] == "TEST_VERB" # type: ignore + + @mock.patch.dict(os.environ, {"GRAPHRAG_API_KEY": "test"}, clear=True) + def assert_is_default_config( + self, + config: Any, + check_input=True, + check_storage=True, + check_reporting=True, + check_cache=True, + check_workflows=True, + ): + assert config is not None + assert isinstance(config, PipelineConfig) + + checked_config = json.loads( + config.model_dump_json(exclude_defaults=True, exclude_unset=True) + ) + + actual_default_config = json.loads( + create_pipeline_config( + create_graphrag_config(root_dir=".") + ).model_dump_json(exclude_defaults=True, exclude_unset=True) + ) + props_to_ignore = ["root_dir", "extends"] + + # Make sure there is some sort of workflows + if not check_workflows: + props_to_ignore.append("workflows") + + # Make sure it tries to load some sort of input + if not check_input: + props_to_ignore.append("input") + + # Make sure it tries to load some sort of storage + if not check_storage: + props_to_ignore.append("storage") + + # Make sure it tries to load some sort of reporting + if not check_reporting: + props_to_ignore.append("reporting") + + # Make sure it tries to load some sort of cache + if not check_cache: + props_to_ignore.append("cache") + + for prop in props_to_ignore: + checked_config.pop(prop, None) + actual_default_config.pop(prop, None) + + assert actual_default_config == actual_default_config | checked_config + + def setUp(self) -> None: + os.environ["GRAPHRAG_OPENAI_API_KEY"] = "test" + os.environ["GRAPHRAG_OPENAI_EMBEDDING_API_KEY"] = "test" + return super().setUp() diff --git a/tests/unit/indexing/graph/__init__.py b/tests/unit/indexing/graph/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/unit/indexing/graph/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/unit/indexing/graph/extractors/__init__.py b/tests/unit/indexing/graph/extractors/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/unit/indexing/graph/extractors/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/unit/indexing/graph/extractors/community_reports/__init__.py b/tests/unit/indexing/graph/extractors/community_reports/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/unit/indexing/graph/extractors/community_reports/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/unit/indexing/graph/extractors/community_reports/test_sort_context.py b/tests/unit/indexing/graph/extractors/community_reports/test_sort_context.py new file mode 100644 index 00000000..9b664788 --- /dev/null +++ b/tests/unit/indexing/graph/extractors/community_reports/test_sort_context.py @@ -0,0 +1,204 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import math + +from graphrag.index.graph.extractors.community_reports import sort_context + +nan = math.nan + + +def test_sort_context(): + context: list[dict] = [ + { + "title": "ALI BABA", + "degree": 1, + "node_details": { + "human_readable_id": 26, + "title": "ALI BABA", + "description": "A character from Scrooge's reading, representing a memory of his childhood imagination", + "degree": 1, + }, + "edge_details": [ + nan, + { + "human_readable_id": 28, + "source": "SCROOGE", + "target": "ALI BABA", + "description": "Scrooge recalls Ali Baba as a fond memory from his childhood readings", + "rank": 32, + }, + ], + "claim_details": [nan], + }, + { + "title": "BELLE", + "degree": 1, + "node_details": { + "human_readable_id": 31, + "title": "BELLE", + "description": "A woman from Scrooge's past, reflecting on how Scrooge's pursuit of wealth changed him and led to the end of their relationship", + "degree": 1, + }, + "edge_details": [ + nan, + { + "human_readable_id": 32, + "source": "SCROOGE", + "target": "BELLE", + "description": "Belle and Scrooge were once engaged, but their relationship ended due to Scrooge's growing obsession with wealth", + "rank": 32, + }, + ], + "claim_details": [nan], + }, + { + "title": "CHRISTMAS", + "degree": 1, + "node_details": { + "human_readable_id": 17, + "title": "CHRISTMAS", + "description": "A festive season that highlights the contrast between abundance and want, joy and misery in the story", + "degree": 1, + }, + "edge_details": [ + nan, + { + "human_readable_id": 23, + "source": "SCROOGE", + "target": "CHRISTMAS", + "description": "Scrooge's disdain for Christmas is a central theme, highlighting his miserliness and lack of compassion", + "rank": 32, + }, + ], + "claim_details": [nan], + }, + { + "title": "CHRISTMAS DAY", + "degree": 1, + "node_details": { + "human_readable_id": 57, + "title": "CHRISTMAS DAY", + "description": "The day Scrooge realizes he hasn't missed the opportunity to celebrate and spread joy", + "degree": 1, + }, + "edge_details": [ + nan, + { + "human_readable_id": 46, + "source": "SCROOGE", + "target": "CHRISTMAS DAY", + "description": "Scrooge wakes up on Christmas Day with a changed heart, ready to celebrate and spread happiness", + "rank": 32, + }, + ], + "claim_details": [nan], + }, + { + "title": "DUTCH MERCHANT", + "degree": 1, + "node_details": { + "human_readable_id": 19, + "title": "DUTCH MERCHANT", + "description": "A historical figure mentioned as having built the fireplace in Scrooge's home, adorned with tiles illustrating the Scriptures", + "degree": 1, + }, + "edge_details": [ + nan, + { + "human_readable_id": 25, + "source": "SCROOGE", + "target": "DUTCH MERCHANT", + "description": "Scrooge's fireplace, built by the Dutch Merchant, serves as a focal point in his room where he encounters Marley's Ghost", + "rank": 32, + }, + ], + "claim_details": [nan], + }, + { + "title": "FAN", + "degree": 1, + "node_details": { + "human_readable_id": 27, + "title": "FAN", + "description": "Scrooge's sister, who comes to bring him home from school for Christmas, showing a loving family relationship", + "degree": 1, + }, + "edge_details": [ + nan, + { + "human_readable_id": 29, + "source": "SCROOGE", + "target": "FAN", + "description": "Fan is Scrooge's sister, who shows love and care by bringing him home for Christmas", + "rank": 32, + }, + ], + "claim_details": [nan], + }, + { + "title": "FRED", + "degree": 1, + "node_details": { + "human_readable_id": 58, + "title": "FRED", + "description": "Scrooge's nephew, who invites Scrooge to Christmas dinner, symbolizing family reconciliation", + "degree": 1, + }, + "edge_details": [ + nan, + { + "human_readable_id": 47, + "source": "SCROOGE", + "target": "FRED", + "description": "Scrooge accepts Fred's invitation to Christmas dinner, marking a significant step in repairing their relationship", + "rank": 32, + }, + ], + "claim_details": [nan], + }, + { + "title": "GENTLEMAN", + "degree": 1, + "node_details": { + "human_readable_id": 15, + "title": "GENTLEMAN", + "description": "Represents charitable efforts to provide for the poor during the Christmas season", + "degree": 1, + }, + "edge_details": [ + nan, + { + "human_readable_id": 21, + "source": "SCROOGE", + "target": "GENTLEMAN", + "description": "The gentleman approaches Scrooge to solicit donations for the poor, which Scrooge rebuffs", + "rank": 32, + }, + ], + "claim_details": [nan], + }, + { + "title": "GHOST", + "degree": 1, + "node_details": { + "human_readable_id": 25, + "title": "GHOST", + "description": "The Ghost is a spectral entity that plays a crucial role in guiding Scrooge through an introspective journey in Charles Dickens' classic tale. This spirit, likely one of the Christmas spirits, takes Scrooge on a transformative voyage through his past memories, the realities of his present, and the potential outcomes of his future. The purpose of this journey is to make Scrooge reflect deeply on his life, encouraging a profound understanding of the joy and meaning of Christmas. By showing Scrooge scenes from his life, including the potential fate of Tiny Tim, the Ghost rebukes Scrooge for his lack of compassion, ultimately aiming to instill in him a sense of responsibility and empathy towards others. Through this experience, the Ghost seeks to enlighten Scrooge, urging him to change his ways for the better.", + "degree": 1, + }, + "edge_details": [ + nan, + { + "human_readable_id": 27, + "source": "SCROOGE", + "target": "GHOST", + "description": "The Ghost is taking Scrooge on a transformative journey by showing him scenes from his past, aiming to make him reflect on his life choices and their consequences. This spectral guide is not only focusing on Scrooge's personal history but also emphasizing the importance of Christmas and the need for a change in perspective. Through these vivid reenactments, the Ghost highlights the error of Scrooge's ways and the significant impact his actions have on others, including Tiny Tim. This experience is designed to enlighten Scrooge, encouraging him to reconsider his approach to life and the people around him.", + "rank": 32, + }, + ], + "claim_details": [nan], + }, + ] + + ctx = sort_context(context) + assert ctx is not None diff --git a/tests/unit/indexing/graph/utils/__init__.py b/tests/unit/indexing/graph/utils/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/unit/indexing/graph/utils/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/unit/indexing/graph/utils/test_stable_lcc.py b/tests/unit/indexing/graph/utils/test_stable_lcc.py new file mode 100644 index 00000000..02ddc298 --- /dev/null +++ b/tests/unit/indexing/graph/utils/test_stable_lcc.py @@ -0,0 +1,71 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import unittest + +import networkx as nx + +from graphrag.index.graph.utils.stable_lcc import stable_largest_connected_component + + +class TestStableLCC(unittest.TestCase): + def test_undirected_graph_run_twice_produces_same_graph(self): + graph_in_1 = self._create_strongly_connected_graph() + graph_out_1 = stable_largest_connected_component(graph_in_1) + + graph_in_2 = self._create_strongly_connected_graph_with_edges_flipped() + graph_out_2 = stable_largest_connected_component(graph_in_2) + + # Make sure they're the same + assert "".join(nx.generate_graphml(graph_out_1)) == "".join( + nx.generate_graphml(graph_out_2) + ) + + def test_directed_graph_keeps_source_target_intact(self): + # create the test graph as a directed graph + graph_in = self._create_strongly_connected_graph_with_edges_flipped( + digraph=True + ) + graph_out = stable_largest_connected_component(graph_in.copy()) + + # Make sure edges are the same and the direction is preserved + edges_1 = [f"{edge[0]} -> {edge[1]}" for edge in graph_in.edges(data=True)] + edges_2 = [f"{edge[0]} -> {edge[1]}" for edge in graph_out.edges(data=True)] + + assert edges_1 == edges_2 + + def test_directed_graph_run_twice_produces_same_graph(self): + # create the test graph as a directed graph + graph_in = self._create_strongly_connected_graph_with_edges_flipped( + digraph=True + ) + graph_out_1 = stable_largest_connected_component(graph_in.copy()) + graph_out_2 = stable_largest_connected_component(graph_in.copy()) + + # Make sure the output is identical when run multiple times + assert "".join(nx.generate_graphml(graph_out_1)) == "".join( + nx.generate_graphml(graph_out_2) + ) + + def _create_strongly_connected_graph(self, digraph=False): + graph = nx.Graph() if not digraph else nx.DiGraph() + graph.add_node("1", node_name=1) + graph.add_node("2", node_name=2) + graph.add_node("3", node_name=3) + graph.add_node("4", node_name=4) + graph.add_edge("4", "5", degree=4) + graph.add_edge("3", "4", degree=3) + graph.add_edge("2", "3", degree=2) + graph.add_edge("1", "2", degree=1) + return graph + + def _create_strongly_connected_graph_with_edges_flipped(self, digraph=False): + graph = nx.Graph() if not digraph else nx.DiGraph() + graph.add_node("1", node_name=1) + graph.add_node("2", node_name=2) + graph.add_node("3", node_name=3) + graph.add_node("4", node_name=4) + graph.add_edge("5", "4", degree=4) + graph.add_edge("4", "3", degree=3) + graph.add_edge("3", "2", degree=2) + graph.add_edge("2", "1", degree=1) + return graph diff --git a/tests/unit/indexing/storage/__init__.py b/tests/unit/indexing/storage/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/unit/indexing/storage/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/unit/indexing/storage/test_blob_pipeline_storage.py b/tests/unit/indexing/storage/test_blob_pipeline_storage.py new file mode 100644 index 00000000..d2ea8683 --- /dev/null +++ b/tests/unit/indexing/storage/test_blob_pipeline_storage.py @@ -0,0 +1,96 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +"""Blob Storage Tests.""" + +import re + +from graphrag.index.storage.blob_pipeline_storage import BlobPipelineStorage + +# cspell:disable-next-line well-known-key +WELL_KNOWN_BLOB_STORAGE_KEY = "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;" + + +async def test_find(): + storage = BlobPipelineStorage( + connection_string=WELL_KNOWN_BLOB_STORAGE_KEY, + container_name="testfind", + ) + try: + try: + items = list( + storage.find(base_dir="input", file_pattern=re.compile(r".*\.txt$")) + ) + items = [item[0] for item in items] + assert items == [] + + await storage.set( + "input/christmas.txt", "Merry Christmas!", encoding="utf-8" + ) + items = list( + storage.find(base_dir="input", file_pattern=re.compile(r".*\.txt$")) + ) + items = [item[0] for item in items] + assert items == ["input/christmas.txt"] + + await storage.set("test.txt", "Hello, World!", encoding="utf-8") + items = list(storage.find(file_pattern=re.compile(r".*\.txt$"))) + items = [item[0] for item in items] + assert items == ["input/christmas.txt", "test.txt"] + + output = await storage.get("test.txt") + assert output == "Hello, World!" + finally: + await storage.delete("test.txt") + output = await storage.get("test.txt") + assert output is None + finally: + storage.delete_container() + + +async def test_dotprefix(): + storage = BlobPipelineStorage( + connection_string=WELL_KNOWN_BLOB_STORAGE_KEY, + container_name="testfind", + path_prefix=".", + ) + try: + await storage.set("input/christmas.txt", "Merry Christmas!", encoding="utf-8") + items = list(storage.find(file_pattern=re.compile(r".*\.txt$"))) + items = [item[0] for item in items] + assert items == ["input/christmas.txt"] + finally: + storage.delete_container() + + +async def test_child(): + parent = BlobPipelineStorage( + connection_string=WELL_KNOWN_BLOB_STORAGE_KEY, + container_name="testchild", + ) + try: + try: + storage = parent.child("input") + await storage.set("christmas.txt", "Merry Christmas!", encoding="utf-8") + items = list(storage.find(re.compile(r".*\.txt$"))) + items = [item[0] for item in items] + assert items == ["christmas.txt"] + + await storage.set("test.txt", "Hello, World!", encoding="utf-8") + items = list(storage.find(re.compile(r".*\.txt$"))) + items = [item[0] for item in items] + print("FOUND", items) + assert items == ["christmas.txt", "test.txt"] + + output = await storage.get("test.txt") + assert output == "Hello, World!" + + items = list(parent.find(re.compile(r".*\.txt$"))) + items = [item[0] for item in items] + print("FOUND ITEMS", items) + assert items == ["input/christmas.txt", "input/test.txt"] + finally: + await parent.delete("input/test.txt") + has_test = await parent.has("input/test.txt") + assert not has_test + finally: + parent.delete_container() diff --git a/tests/unit/indexing/storage/test_file_pipeline_storage.py b/tests/unit/indexing/storage/test_file_pipeline_storage.py new file mode 100644 index 00000000..643c2a9f --- /dev/null +++ b/tests/unit/indexing/storage/test_file_pipeline_storage.py @@ -0,0 +1,50 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +"""Blob Storage Tests.""" + +import os +import re +from pathlib import Path + +from graphrag.index.storage.file_pipeline_storage import FilePipelineStorage + +__dirname__ = os.path.dirname(__file__) + + +async def test_find(): + storage = FilePipelineStorage() + items = list( + storage.find( + base_dir="tests/fixtures/text", + file_pattern=re.compile(r".*\.txt$"), + progress=None, + file_filter=None, + ) + ) + assert items == [(str(Path("tests/fixtures/text/input/dulce.txt")), {})] + output = await storage.get("tests/fixtures/text/input/dulce.txt") + assert len(output) > 0 + + await storage.set("test.txt", "Hello, World!", encoding="utf-8") + output = await storage.get("test.txt") + assert output == "Hello, World!" + await storage.delete("test.txt") + output = await storage.get("test.txt") + assert output is None + + +async def test_child(): + storage = FilePipelineStorage() + storage = storage.child("tests/fixtures/text") + items = list(storage.find(re.compile(r".*\.txt$"))) + assert items == [(str(Path("input/dulce.txt")), {})] + + output = await storage.get("input/dulce.txt") + assert len(output) > 0 + + await storage.set("test.txt", "Hello, World!", encoding="utf-8") + output = await storage.get("test.txt") + assert output == "Hello, World!" + await storage.delete("test.txt") + output = await storage.get("test.txt") + assert output is None diff --git a/tests/unit/indexing/test_exports.py b/tests/unit/indexing/test_exports.py new file mode 100644 index 00000000..232dfbbd --- /dev/null +++ b/tests/unit/indexing/test_exports.py @@ -0,0 +1,13 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +from graphrag.index import ( + create_pipeline_config, + run_pipeline, + run_pipeline_with_config, +) + + +def test_exported_functions(): + assert callable(create_pipeline_config) + assert callable(run_pipeline_with_config) + assert callable(run_pipeline) diff --git a/tests/unit/indexing/test_init_content.py b/tests/unit/indexing/test_init_content.py new file mode 100644 index 00000000..eeb641cb --- /dev/null +++ b/tests/unit/indexing/test_init_content.py @@ -0,0 +1,33 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +import re +from typing import Any, cast + +import yaml + +from graphrag.config import ( + GraphRagConfig, + create_graphrag_config, +) +from graphrag.index.init_content import INIT_YAML + + +def test_init_yaml(): + data = yaml.load(INIT_YAML, Loader=yaml.FullLoader) + config = create_graphrag_config(data) + GraphRagConfig.model_validate(config, strict=True) + + +def test_init_yaml_uncommented(): + lines = INIT_YAML.splitlines() + lines = [line for line in lines if "##" not in line] + + def uncomment_line(line: str) -> str: + leading_whitespace = cast(Any, re.search(r"^(\s*)", line)).group(1) + return re.sub(r"^\s*# ", leading_whitespace, line, count=1) + + content = "\n".join([uncomment_line(line) for line in lines]) + data = yaml.load(content, Loader=yaml.FullLoader) + config = create_graphrag_config(data) + GraphRagConfig.model_validate(config, strict=True) diff --git a/tests/unit/indexing/verbs/__init__.py b/tests/unit/indexing/verbs/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/unit/indexing/verbs/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/unit/indexing/verbs/entities/__init__.py b/tests/unit/indexing/verbs/entities/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/unit/indexing/verbs/entities/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/unit/indexing/verbs/entities/extraction/__init__.py b/tests/unit/indexing/verbs/entities/extraction/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/unit/indexing/verbs/entities/extraction/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/unit/indexing/verbs/entities/extraction/strategies/__init__.py b/tests/unit/indexing/verbs/entities/extraction/strategies/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/unit/indexing/verbs/entities/extraction/strategies/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/unit/indexing/verbs/entities/extraction/strategies/graph_intelligence/__init__.py b/tests/unit/indexing/verbs/entities/extraction/strategies/graph_intelligence/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/unit/indexing/verbs/entities/extraction/strategies/graph_intelligence/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/unit/indexing/verbs/entities/extraction/strategies/graph_intelligence/test_gi_entity_extraction.py b/tests/unit/indexing/verbs/entities/extraction/strategies/graph_intelligence/test_gi_entity_extraction.py new file mode 100644 index 00000000..1ebca2bf --- /dev/null +++ b/tests/unit/indexing/verbs/entities/extraction/strategies/graph_intelligence/test_gi_entity_extraction.py @@ -0,0 +1,221 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import unittest + +import networkx as nx + +from graphrag.index.verbs.entities.extraction.strategies.graph_intelligence.run_graph_intelligence import ( + Document, + run_extract_entities, +) +from tests.unit.indexing.verbs.helpers.mock_llm import create_mock_llm + + +class TestRunChain(unittest.IsolatedAsyncioTestCase): + async def test_run_extract_entities_single_document_correct_entities_returned(self): + results = await run_extract_entities( + docs=[Document("test_text", "1")], + entity_types=["person"], + reporter=None, + args={ + "prechunked": True, + "max_gleanings": 0, + "summarize_descriptions": False, + }, + llm=create_mock_llm( + responses=[ + """ + ("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) + ## + ("entity"<|>TEST_ENTITY_2<|>COMPANY<|>TEST_ENTITY_2 owns TEST_ENTITY_1 and also shares an address with TEST_ENTITY_1) + ## + ("entity"<|>TEST_ENTITY_3<|>PERSON<|>TEST_ENTITY_3 is director of TEST_ENTITY_1) + ## + ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_2<|>TEST_ENTITY_1 and TEST_ENTITY_2 are related because TEST_ENTITY_1 is 100% owned by TEST_ENTITY_2 and the two companies also share the same address)<|>2) + ## + ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_3<|>TEST_ENTITY_1 and TEST_ENTITY_3 are related because TEST_ENTITY_3 is director of TEST_ENTITY_1<|>1)) + """.strip() + ] + ), + ) + + # self.assertItemsEqual isn't available yet, or I am just silly + # so we sort the lists and compare them + assert sorted(["TEST_ENTITY_1", "TEST_ENTITY_2", "TEST_ENTITY_3"]) == sorted([ + entity["name"] for entity in results.entities + ]) + + async def test_run_extract_entities_multiple_documents_correct_entities_returned( + self, + ): + results = await run_extract_entities( + docs=[Document("text_1", "1"), Document("text_2", "2")], + entity_types=["person"], + reporter=None, + args={ + "prechunked": True, + "max_gleanings": 0, + "summarize_descriptions": False, + }, + llm=create_mock_llm( + responses=[ + """ + ("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) + ## + ("entity"<|>TEST_ENTITY_2<|>COMPANY<|>TEST_ENTITY_2 owns TEST_ENTITY_1 and also shares an address with TEST_ENTITY_1) + ## + ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_2<|>TEST_ENTITY_1 and TEST_ENTITY_2 are related because TEST_ENTITY_1 is 100% owned by TEST_ENTITY_2 and the two companies also share the same address)<|>2) + ## + """.strip(), + """ + ("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) + ## + ("entity"<|>TEST_ENTITY_3<|>PERSON<|>TEST_ENTITY_3 is director of TEST_ENTITY_1) + ## + ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_3<|>TEST_ENTITY_1 and TEST_ENTITY_3 are related because TEST_ENTITY_3 is director of TEST_ENTITY_1<|>1)) + """.strip(), + ] + ), + ) + + # self.assertItemsEqual isn't available yet, or I am just silly + # so we sort the lists and compare them + assert sorted(["TEST_ENTITY_1", "TEST_ENTITY_2", "TEST_ENTITY_3"]) == sorted([ + entity["name"] for entity in results.entities + ]) + + async def test_run_extract_entities_multiple_documents_correct_edges_returned(self): + results = await run_extract_entities( + docs=[Document("text_1", "1"), Document("text_2", "2")], + entity_types=["person"], + reporter=None, + args={ + "prechunked": True, + "max_gleanings": 0, + "summarize_descriptions": False, + }, + llm=create_mock_llm( + responses=[ + """ + ("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) + ## + ("entity"<|>TEST_ENTITY_2<|>COMPANY<|>TEST_ENTITY_2 owns TEST_ENTITY_1 and also shares an address with TEST_ENTITY_1) + ## + ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_2<|>TEST_ENTITY_1 and TEST_ENTITY_2 are related because TEST_ENTITY_1 is 100% owned by TEST_ENTITY_2 and the two companies also share the same address)<|>2) + ## + """.strip(), + """ + ("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) + ## + ("entity"<|>TEST_ENTITY_3<|>PERSON<|>TEST_ENTITY_3 is director of TEST_ENTITY_1) + ## + ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_3<|>TEST_ENTITY_1 and TEST_ENTITY_3 are related because TEST_ENTITY_3 is director of TEST_ENTITY_1<|>1)) + """.strip(), + ] + ), + ) + + # self.assertItemsEqual isn't available yet, or I am just silly + # so we sort the lists and compare them + assert results.graphml_graph is not None, "No graphml graph returned!" + graph = nx.parse_graphml(results.graphml_graph) # type: ignore + + # convert to strings for more visual comparison + edges_str = sorted([f"{edge[0]} -> {edge[1]}" for edge in graph.edges]) + assert edges_str == sorted([ + "TEST_ENTITY_1 -> TEST_ENTITY_2", + "TEST_ENTITY_1 -> TEST_ENTITY_3", + ]) + + async def test_run_extract_entities_multiple_documents_correct_entity_source_ids_mapped( + self, + ): + results = await run_extract_entities( + docs=[Document("text_1", "1"), Document("text_2", "2")], + entity_types=["person"], + reporter=None, + args={ + "prechunked": True, + "max_gleanings": 0, + "summarize_descriptions": False, + }, + llm=create_mock_llm( + responses=[ + """ + ("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) + ## + ("entity"<|>TEST_ENTITY_2<|>COMPANY<|>TEST_ENTITY_2 owns TEST_ENTITY_1 and also shares an address with TEST_ENTITY_1) + ## + ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_2<|>TEST_ENTITY_1 and TEST_ENTITY_2 are related because TEST_ENTITY_1 is 100% owned by TEST_ENTITY_2 and the two companies also share the same address)<|>2) + ## + """.strip(), + """ + ("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) + ## + ("entity"<|>TEST_ENTITY_3<|>PERSON<|>TEST_ENTITY_3 is director of TEST_ENTITY_1) + ## + ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_3<|>TEST_ENTITY_1 and TEST_ENTITY_3 are related because TEST_ENTITY_3 is director of TEST_ENTITY_1<|>1)) + """.strip(), + ] + ), + ) + + assert results.graphml_graph is not None, "No graphml graph returned!" + graph = nx.parse_graphml(results.graphml_graph) # type: ignore + + # TODO: The edges might come back in any order, but we're assuming they're coming + # back in the order that we passed in the docs, that might not be true + assert ( + graph.nodes["TEST_ENTITY_3"].get("source_id") == "2" + ) # TEST_ENTITY_3 should be in just 2 + assert ( + graph.nodes["TEST_ENTITY_2"].get("source_id") == "1" + ) # TEST_ENTITY_2 should be in just 1 + assert sorted( + graph.nodes["TEST_ENTITY_1"].get("source_id").split(",") + ) == sorted(["1", "2"]) # TEST_ENTITY_1 should be 1 and 2 + + async def test_run_extract_entities_multiple_documents_correct_edge_source_ids_mapped( + self, + ): + results = await run_extract_entities( + docs=[Document("text_1", "1"), Document("text_2", "2")], + entity_types=["person"], + reporter=None, + args={ + "prechunked": True, + "max_gleanings": 0, + "summarize_descriptions": False, + }, + llm=create_mock_llm( + responses=[ + """ + ("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) + ## + ("entity"<|>TEST_ENTITY_2<|>COMPANY<|>TEST_ENTITY_2 owns TEST_ENTITY_1 and also shares an address with TEST_ENTITY_1) + ## + ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_2<|>TEST_ENTITY_1 and TEST_ENTITY_2 are related because TEST_ENTITY_1 is 100% owned by TEST_ENTITY_2 and the two companies also share the same address)<|>2) + ## + """.strip(), + """ + ("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) + ## + ("entity"<|>TEST_ENTITY_3<|>PERSON<|>TEST_ENTITY_3 is director of TEST_ENTITY_1) + ## + ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_3<|>TEST_ENTITY_1 and TEST_ENTITY_3 are related because TEST_ENTITY_3 is director of TEST_ENTITY_1<|>1)) + """.strip(), + ] + ), + ) + + assert results.graphml_graph is not None, "No graphml graph returned!" + graph = nx.parse_graphml(results.graphml_graph) # type: ignore + edges = list(graph.edges(data=True)) + + # should only have 2 edges + assert len(edges) == 2 + + # Sort by source_id for consistent ordering + edge_source_ids = sorted([edge[2].get("source_id", "") for edge in edges]) # type: ignore + assert edge_source_ids[0].split(",") == ["1"] # type: ignore + assert edge_source_ids[1].split(",") == ["2"] # type: ignore diff --git a/tests/unit/indexing/verbs/helpers/__init__.py b/tests/unit/indexing/verbs/helpers/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/unit/indexing/verbs/helpers/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/unit/indexing/verbs/helpers/mock_llm.py b/tests/unit/indexing/verbs/helpers/mock_llm.py new file mode 100644 index 00000000..ba27da9c --- /dev/null +++ b/tests/unit/indexing/verbs/helpers/mock_llm.py @@ -0,0 +1,10 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +from graphrag.llm import CompletionLLM, MockChatLLM + + +def create_mock_llm( + responses: list[str], +) -> CompletionLLM: + """Creates a mock LLM that returns the given responses.""" + return MockChatLLM(responses) diff --git a/tests/unit/indexing/verbs/text/__init__.py b/tests/unit/indexing/verbs/text/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/unit/indexing/verbs/text/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/unit/indexing/verbs/text/test_split.py b/tests/unit/indexing/verbs/text/test_split.py new file mode 100644 index 00000000..d9ced064 --- /dev/null +++ b/tests/unit/indexing/verbs/text/test_split.py @@ -0,0 +1,51 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import unittest + +import pandas as pd +import pytest + +from graphrag.index.verbs.text.split import text_split_df + + +class TestTextSplit(unittest.TestCase): + def test_empty_string(self): + input = pd.DataFrame([{"in": ""}]) + result = text_split_df(input, "in", "out", ",").to_dict(orient="records") + + assert len(result) == 1 + assert result[0]["out"] == [] + + def test_string_without_seperator(self): + input = pd.DataFrame([{"in": "test_string_without_seperator"}]) + result = text_split_df(input, "in", "out", ",").to_dict(orient="records") + + assert len(result) == 1 + assert result[0]["out"] == ["test_string_without_seperator"] + + def test_string_with_seperator(self): + input = pd.DataFrame([{"in": "test_1,test_2"}]) + result = text_split_df(input, "in", "out", ",").to_dict(orient="records") + + assert len(result) == 1 + assert result[0]["out"] == ["test_1", "test_2"] + + def test_row_with_list_as_column(self): + input = pd.DataFrame([{"in": ["test_1", "test_2"]}]) + result = text_split_df(input, "in", "out", ",").to_dict(orient="records") + + assert len(result) == 1 + assert result[0]["out"] == ["test_1", "test_2"] + + def test_non_string_column_throws_error(self): + input = pd.DataFrame([{"in": 5}]) + with pytest.raises(TypeError): + text_split_df(input, "in", "out", ",").to_dict(orient="records") + + def test_more_than_one_row_returns_correctly(self): + input = pd.DataFrame([{"in": "row_1_1,row_1_2"}, {"in": "row_2_1,row_2_2"}]) + result = text_split_df(input, "in", "out", ",").to_dict(orient="records") + + assert len(result) == 2 + assert result[0]["out"] == ["row_1_1", "row_1_2"] + assert result[1]["out"] == ["row_2_1", "row_2_2"] diff --git a/tests/unit/indexing/workflows/__init__.py b/tests/unit/indexing/workflows/__init__.py new file mode 100644 index 00000000..0a3e38ad --- /dev/null +++ b/tests/unit/indexing/workflows/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License diff --git a/tests/unit/indexing/workflows/helpers.py b/tests/unit/indexing/workflows/helpers.py new file mode 100644 index 00000000..512e8294 --- /dev/null +++ b/tests/unit/indexing/workflows/helpers.py @@ -0,0 +1,31 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +mock_verbs = { + "mock_verb": lambda x: x, + "mock_verb_2": lambda x: x, +} + +mock_workflows = { + "mock_workflow": lambda _x: [ + { + "verb": "mock_verb", + "args": { + "column": "test", + }, + } + ], + "mock_workflow_2": lambda _x: [ + { + "verb": "mock_verb", + "args": { + "column": "test", + }, + }, + { + "verb": "mock_verb_2", + "args": { + "column": "test", + }, + }, + ], +} diff --git a/tests/unit/indexing/workflows/test_load.py b/tests/unit/indexing/workflows/test_load.py new file mode 100644 index 00000000..6d037d51 --- /dev/null +++ b/tests/unit/indexing/workflows/test_load.py @@ -0,0 +1,237 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +import unittest + +import pytest + +from graphrag.index.config import PipelineWorkflowReference +from graphrag.index.errors import UnknownWorkflowError +from graphrag.index.workflows.load import create_workflow, load_workflows + +from .helpers import mock_verbs, mock_workflows + + +class TestCreateWorkflow(unittest.TestCase): + def test_workflow_with_steps_should_not_fail(self): + create_workflow( + "workflow_with_steps", + [ + { + "verb": "mock_verb", + "args": { + "column": "test", + }, + } + ], + config=None, + additional_verbs=mock_verbs, + ) + + def test_non_existent_workflow_without_steps_should_crash(self): + # since we don't have a workflow named "test", and the user didn't provide any steps, we should crash + # since we don't know what to do + with pytest.raises(UnknownWorkflowError): + create_workflow("test", None, config=None, additional_verbs=mock_verbs) + + def test_existing_workflow_should_not_crash(self): + create_workflow( + "mock_workflow", + None, + config=None, + additional_verbs=mock_verbs, + additional_workflows=mock_workflows, + ) + + +class TestLoadWorkflows(unittest.TestCase): + def test_non_existent_workflow_should_crash(self): + with pytest.raises(UnknownWorkflowError): + load_workflows( + [ + PipelineWorkflowReference( + name="some_workflow_that_does_not_exist", + config=None, + ) + ], + additional_workflows=mock_workflows, + additional_verbs=mock_verbs, + ) + + def test_single_workflow_should_not_crash(self): + load_workflows( + [ + PipelineWorkflowReference( + name="mock_workflow", + config=None, + ) + ], + additional_workflows=mock_workflows, + additional_verbs=mock_verbs, + ) + + def test_multiple_workflows_should_not_crash(self): + load_workflows( + [ + PipelineWorkflowReference( + name="mock_workflow", + config=None, + ), + PipelineWorkflowReference( + name="mock_workflow_2", + config=None, + ), + ], + # the two above are in the "mock_workflows" list + additional_workflows=mock_workflows, + additional_verbs=mock_verbs, + ) + + def test_two_interdependent_workflows_should_provide_correct_order(self): + ordered_workflows, _deps = load_workflows( + [ + PipelineWorkflowReference( + name="interdependent_workflow_1", + steps=[ + { + "verb": "mock_verb", + "args": { + "column": "test", + }, + "input": { + "source": "workflow:interdependent_workflow_2" + }, # This one is dependent on the second one, so when it comes out of load_workflows, it should be first + } + ], + ), + PipelineWorkflowReference( + name="interdependent_workflow_2", + steps=[ + { + "verb": "mock_verb", + "args": { + "column": "test", + }, + } + ], + ), + ], + # the two above are in the "mock_workflows" list + additional_workflows=mock_workflows, + additional_verbs=mock_verbs, + ) + + # two should only come out + assert len(ordered_workflows) == 2 + assert ordered_workflows[0].workflow.name == "interdependent_workflow_2" + assert ordered_workflows[1].workflow.name == "interdependent_workflow_1" + + def test_three_interdependent_workflows_should_provide_correct_order(self): + ordered_workflows, _deps = load_workflows( + [ + PipelineWorkflowReference( + name="interdependent_workflow_3", + steps=[ + { + "verb": "mock_verb", + "args": { + "column": "test", + }, + } + ], + ), + PipelineWorkflowReference( + name="interdependent_workflow_1", + steps=[ + { + "verb": "mock_verb", + "args": { + "column": "test", + }, + "input": {"source": "workflow:interdependent_workflow_2"}, + } + ], + ), + PipelineWorkflowReference( + name="interdependent_workflow_2", + steps=[ + { + "verb": "mock_verb", + "args": { + "column": "test", + }, + "input": {"source": "workflow:interdependent_workflow_3"}, + } + ], + ), + ], + # the two above are in the "mock_workflows" list + additional_workflows=mock_workflows, + additional_verbs=mock_verbs, + ) + + order = [ + "interdependent_workflow_3", + "interdependent_workflow_2", + "interdependent_workflow_1", + ] + assert [x.workflow.name for x in ordered_workflows] == order + + def test_two_workflows_dependent_on_another_single_workflow_should_provide_correct_order( + self, + ): + ordered_workflows, _deps = load_workflows( + [ + # Workflows 1 and 2 are dependent on 3, so 3 should come out first + PipelineWorkflowReference( + name="interdependent_workflow_3", + steps=[ + { + "verb": "mock_verb", + "args": { + "column": "test", + }, + } + ], + ), + PipelineWorkflowReference( + name="interdependent_workflow_1", + steps=[ + { + "verb": "mock_verb", + "args": { + "column": "test", + }, + "input": {"source": "workflow:interdependent_workflow_3"}, + } + ], + ), + PipelineWorkflowReference( + name="interdependent_workflow_2", + steps=[ + { + "verb": "mock_verb", + "args": { + "column": "test", + }, + "input": {"source": "workflow:interdependent_workflow_3"}, + } + ], + ), + ], + # the two above are in the "mock_workflows" list + additional_workflows=mock_workflows, + additional_verbs=mock_verbs, + ) + + assert len(ordered_workflows) == 3 + assert ordered_workflows[0].workflow.name == "interdependent_workflow_3" + + # The order of the other two doesn't matter, but they need to be there + assert ordered_workflows[1].workflow.name in [ + "interdependent_workflow_1", + "interdependent_workflow_2", + ] + assert ordered_workflows[2].workflow.name in [ + "interdependent_workflow_1", + "interdependent_workflow_2", + ]

    Yl= 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%0DbFGZ{qKFs zF1+EVuamoe>?y57cbccB>vSd4-|b9fi((dKZ;Z5HI~}Kjch16Y8ide!GLLg6|B12i z*T9^Q1DjNH84RD{_IAEi=xLR$;<~LD`@w&ZRJux}k5P;Kzpo#T@aiw1x(DXS5J}Oi zuy~&^^-JgjyCvUDHQoW~h_*~Ls>g~Z0H?+m+E-T9UcoE1k#c|E-fR)R0#`iD~4v0kj4 z3Y&9sReHGbf@FJKnYG`bSc%+y4uaa5H@mv4%MY*eRqkHH)j=ZWfb z$rS<@1)w(K;nwjhIrC`lJPk&kJ<^3#AnbAq-j2PRRa$dyHuM{43N|y>qALf!AdN!7 z-6XU+dV~uXJaM+{H?u)5carq3aI7O9V-)^UpEWHL0i@yDVW;@5Pb366u&@Ezy zY<)_`yM$-;5bkicTq))8%JZwG>#S1LlS!2Jw0b z5`Ys)%2`f*eRsVw&uqR$x57_tUk~qUb{loadrZp^YkE>(&L5s}#`1re{sr~@_Un=X zZ727W;S7;>V2X^Qzs<@i0*Y`^aMQlzkk;IJP-U3(Jj74W}*8=jf`ZI>TxqA$bj4#$2<)Z1U2SqpQ%7pVEmZ~sJNPySu5KF+kf|L4*sPbMyB^GN*O@mnN`P>b%E0u5yZ0NPSdyd zV3ZG}jfdzs_!j&|G<$Rj1kX(3!Sff_kh{f7NiQ?j3jvzykUvbsR%oMk`tG z`a)h4cHB|arLNHPEd`CX#f$@W2ge#j6?fU`bvwBJXl0l5y$HVR>$WmBWw|61R_Ya5 zebB*kIDn{ZFMMJRSl~8N^Hf%+MkkwX*Xqu^e{8t=w9%sNpy%2(qD`1VvHI~}CDGh1)|RM4?-d1w%T}&?B8_VF&}5l$p$t~s zE+!e*8MQ8DxR<3ts+r^=6jBqN=ZfusdZFRu4-qOo&S>X*^{?l<)S#P5Mm=n1J7TXI zjTHrs2vo-~n-5CpMX?$k>cuwnUo`8mnx`$#c_NRBTCtFg2C_&;O*QI)@h5-K+9(*j z$!PBz$6)(7(ZQx??ZLHD{(DSltIuu-2}zl({6C|S)3{BdC1 zd#r=Byu;Ehspd;)G#&OpgUhOS!)p8L}#X&R3$R24_aM9 zr;vp|+Qo!F7d6M4M2Mzq^zixZELZuayU|JC(2sW5k;n^T{XDr+_b(GMqWu1rjUF-F z?8JMBiJrw0*!MrF2Hl@_jL|hv^w6Smef}#$V?f@r_l2CWYkO6@J_+a-8OnjGMY_cbM9Lc1W^GcRv103~$^dB2WI>B~3D-9UVplC$Af9wh+u&0i$ucs9gT%qwFe* z-Vd_7D6IVRpq8Hb7O^~wYSizKPdmg%-b{6g?&Tu7f{CeS#%`2BdjIhuH>I*HWeH(J zB3M&eEl$$HB(5XgPt}nkbT$taW4|7M@Bdt6;>kPB+V1Lp<92(hQJW+IG*(A$*IuKO zbhICz(ZKsFKc3L0?kTj2#QV}ErW3!$^31i0WUb^pqi{bi9|dJE8Ar z(MROrwC*&hQ47-N%ad;T$L1VBAf0X?BPv?etM1ZTc1i7uGwUQ7NT8f@NV1$njjJWy z9=DrOQYFqL!vhu;s5Ue`<}4Xxfp5=lN;Jn&Un{SG?7edygd*DxU<3ZFj|#ng&_g0Y zNl^yFbB;=KVY?GhW^htZskZT7e_N}f6T;)%A=(XxAN{#EZ3zpe>qK_jUOe(QJzB=u zoiGs*c~Z|bU;eJIh#+}VhTOKLg|7d%tWPSkW~363fhrS6#l0rRX*@E@^m^b`WAFIt za+OSOOxq2Vss1Q>(B2*CMsWh}?o{gn!{a2sIt;q9ZmWcHhy!rMs96wbaQd%i)d6a9 zi)QIT4<`jPB@Z|1@nTHe;5O=BkMGR7?#ii>9*okq)KOP74Ril0w9R!Zo8tBA#gA8>G zHg%*ps5!0qPNwc|NS4rS^L?X^5dVf+o80Kqm=|jSIhD>fqqcagCG7L)NTZXC(O)}E z#Z)h?+?`RK-Y#pu;axES@!z0%1=BYYAH=y-8*}2p*$d{ybUivJ1?rsYrvfn{Qq^Md z&{V&Pts@w12|Gkr5GW1GPS>7}&N2q84m~42kyA zIuYV4({`Q6z;w1axXWF*CE+)y9rKEGb?r_g(_1Vm{X@d`8tM2 zqC8PntSa+OKbdGch=Ueog{2==YqXMia_w2572Y(cKidB^O0g=hfZlIxjMWRAFQwol zknt2~8Y#~1?bmIeG>yCS(Dr}&7`hZ%pQ5#j5VQ3}ZE?&mAb+DQAl3RxmoV6|JtUvf z`PZ*Y8^h1QV}tB2~aoZO%gZ$d!Q48Vg@s5l>lV!O_Uw~!+x+69u|S% z2{*G!x@*B%%l_1OeeM>coNVnQ>XPMgkYHZS5`DtuXVrgG*@Ap)(!F0ox09Uf^Qb@9 zl{(4ULODu9P@i7Oih}%870s&lkr5qU5T4CKOuP+PGdp^y`CF0@_p{9u^F~iuhnArP zZ0M`i$1&uG#fsHvr&)ZP=uQ>o>aOW2zBcT2J41ZVPw5oItq@s?uRBu1W6kIyIXk2E zU_JW$ZEhLJH0sE*OJ2XbS;cjt7yRsPlwo|83`8sgR-#fN)q`vPCmpH7N4_$G5;BZe znw1F^gWP ztWE@UFc#cNbJJJMoIr=s1^F7nVpZu@3bW{G-b3{av-()oI@_!nDN7cddUd+tUqwUL z83re~K>b&3z(_oLzUXToUZJwlCZ=K+C;1+9t58NUb{ z`=bv;doIcaf{a?0_9xx#tR7^0xWyun`5B#cicx)-P_}q`!yj(5gGA7`45V3ihp1lu z#aFq_iKc$BxQGbr4h&x3HE6-qbn{54f8>s1~l6X#+` z+21MR0LzhoJ9jK+MT+*c2Hniq>Q?E>sLg4mU<_3qt)f6Q8M@c|h^^k|#=&2UNncFvh$gm{3L4Nf&lBtyJk zR^NYd4@hhytQEhv-4zd3oLz(GssEv(h+|M|3E-6j!W%V<4w^-n&9& z-qc#QL3F}~NKQOB$5GULl7fwY+TX3FNL4){#`*4lTB<6JT7O5Zno$?Wl*XXjosYO} z|3A=%mX!l!o_F zp1!fr!~4pmsXz>7YM^i0H&w2Nm1g;wv@)5Lheyv{B(Ma0C0TLbf0=qW_2m^s>LatfcZf|32H$ zyC)Pnu8>~wsGF6zN|LYjxo&BVep=f`NF9W#s8#O{%}P`K@@CPU6DSnj0=fF)tKvNq2eUMLD;F&eHs{Fa``v>)PF_w3;33#D3|VMS{t| zB3WF`z$e6% zu3{5t?lSHLs|AF|Xftbis(YVEHRx8)ra6jw&{n~o#fHY|FZ@vwYy9&Mwk;A1yScpP zkdr2KBBG2ADpp>9dqT5%Vb4^cMrqTZQ#j@lK3`tr@(A>)Ako${78SfTO2RoX2E}%~ zjB8FJ5|$bplkY0TyKw&FOUSh_-!g!35t1p7LBnn?!|>6|+}eVLozblyW+Qj4e=b8L z$|fpD76K47T|tq!x{R~ld^-{nmt?xGU`z4!+cRlsq4n;i0Tx*yIREEf;qPCI3r$;3 zJ$<{UuKC(+6bWHh>cM;UMUMLHf0HGu5}KJ+3?NyOD=!dM6-5H6WWDNLWHv5gI@wD` zI~|=mPIV)a`@b@(IH4>l{2<7YSyCkkUxO(Jd}($T;RFM!qh6n+0Mtz#TsnL!4R24L zXV*zAurStQpJQDmjsh{Hwel(W+yn1@#6OX5)6&xuB} zpmzE=s2_e617!cx>;@ni9PmEaoN6I&v=4hCZdH^aA7Fc}nl#*2T5o@d)bzLCQP6OY zdob4~@k?|L7|aG=+HNz8O|_zd-fLw+S*xh;NEe(6XmeIyA)vDkO=rc#r(NF89u-yU z)Ni$n#1M?)UgFECE;xTO7=h7u@`w2}NXp3n6t$_D4H_>x^KY2Je`ce}p@pU1S?b2o zAV&25#V%TLNvx3$OaIl{3X&7mt*IMDpUvDR4k#%R3+_+7bPw7?YC+HNs>nZKSBElvPlaDO3kej=5s4m zWw+TiL-h|e!v(taLTf(D#Hc}Nrv698`3}{4-t>mVqpH_u35I`o5@{My;)E2G?cFjD z7zw^=-QKKbi&8Zd9iEwL=O(7v?Btqd@Ke}&E^cz`^qLW6<>+VUbwe%4o87FxNnXmpLvonR8 zE`$384Lb<8n^WQzaACse8@ot1+p|F?`p`?{-K#KhVi$$H{Eg+V~h!z#cO z+?hyqVgbCMRRVZxbG+p56NDGM>&8?xsOuk-=!3ugR8T|pZ=Hi|>N#^l#P5@k$JGnK z6@UG^B7MVGkFY`Ef4vBWDxK@aCbcr%j7Eky)KkCAS-h1-E%4{>?{eaM(^7eE{Wd&Z zr7Q0)N6oMjX6qc?${!##8^O8%Kvh9^cdf4SEFXJr!fQ69as2VgVg~NKSeV1~UaZ1X z_j#7529G?KW_!<$gh`x(em9zm_2`nnlM0!GudHoW|4k7F7rc2qlxYon--gT1d=(Mr z&p*nn)775;O92s|J?}Qf!*#vWFplLNXM6nW3mMT7JoHD3@6G%~a`Fb(xC(=grgC&n z`xq$@_UHbKulr-CL7U3et2vQqdQXsYpLwZ9Vr>tgL1K}8P}HE*m=69P_s3)ykA@FF zaI6!zWhwPF9?2D>eMVLxP=v-R;5B;RyDP#?7PvqAEw8`8xT=BzWCF{5T5 z157{ovCzs*Tl$3KJB-=MmfN2oS}!GJ(1!(UpX;V%Yfo<^Hx0Abhfc0WszMYN+IlEpBhnpQkaQ7XqHDdMLl!BvQ z9tG}1OTNqdy7I_tT5H@YZMmqdi_*H^ljX$Z=gCDMJa&Soj=0~bGlT-PdIr@`Npr48 z-Ysg+uz%Q0IQ@%)Q8IUCjyvwwCYdC`e^kEh9W*eFr1{?Tj@6a_&RANf|Mct~g1qg$ zX{Q$tx~0EBLVY?8LJhWOw3>KSwB#7vu}>arcVb0-Eb4V|b39o|8P}6ixM8(-Xjv+Z zM`Pvp$>mz3oJ<`Lh>!EHv3>FMV z-DIO*{`&{FjsC+QCw)Dt`?uYt`ahS_&i>;R^yB~MN!}7YFkAC<=eXxw4)ff@=1^j0 z*3hA$HLLc zM{9N>*%tTvKDMe1Cf9$`c=()G@|6@DOxj(d);yhV7~9DOy!#x4?yowYwR)%BZg>Q= zl859x&U27a#U9HfE*O5(GY3?KX7ns+QGg<$;_)vO8jXzkKx>SLE#r=+Lj2b|xU%T> z4M|SIQqqk=kfwg1dV%J4GRX6EAkx};7^olo^FK(@>Q@ZuI;(F>c2cZ=j|&<1xgm|5 z?s;)ij|Y1;p6iyYFiQr@q%7G%r>o0F`#ACydB62+yr@#0JJWDVM2IAL*+<8k4MoaL zX4`p~>M1e3mzbR`NEKWByUr6o8X^DL`Z!)E=v$Bb>;IaE@AZW0wIpZ1kq!`BWiH21 z@+1808KLXx(KDOSA?k|ka`n@GY|F2ooeXK6y;wu~%-`s8%_qN=M?@cUOu9oPjN8m? z`-uo7=hI75Sq8*7g5u%LBgL>p2vdRb$a8k1?)9?Ljvl`Du+2-LqZ)itO95zQ-|j{m zM*DIR1lF&27~U`eQ_ADQX8)d83;%N&N8z1txf@b=SZQbC(IZu3%5+^xbZLP7m*vSW z0@(Yd>f%7pDKSe3(Ws;g)T1X$cymHO86y_Gcuul`8679dh5dOGk=r9~6dCfcnrfx1 z$_wd;F*^OsR$X2C<^+=1yHY^FxEUfr&Z5&`sXFj$2uk_w6PI%zpSNphQ9c4JjLx4g zJ_qOd(~R<7g-ZoFANWaYl%C3Fb6nlFo2{_06|C5qwx8BYz8ko5z-Bpz^XKQYXfO}t zI)weX3cq`)7OMVtX8S6hdA(6X4~5HL;ABA9Tpi;rzbR_dJB}M2s}=qMJd|t9r5)<3 z-7GXjoihloPF}Pt?6W3?`cvY%{BA#3A^3@jOT*em{ z6ymSnNwVavKK$Z+P$A9gt$pq;YEsTL8%LuQ4No_UB%o+ymszrji6I;Ft%5*io34JH zgL?d5NP}P?UUfyW{>r_FYYpnRGMC(GSd@gdI@fdf!9UNXTBvTXfxnznc5s9UsC2c! zoE+^@2Wh-}KMIC0PmY`ibA*??$A=KnMlmS)!q0Aoi2`S(AhrE7Zauvo4Am$yg#})2yrP#hLS-(ji;IIBh+w)nY~yK$NXwT=$o!g z)#(0;rz$LUanC{mRd+WX#{EZEXJXZyE`y)r&d4R3%Q{6xv5R%@zH@ExcZ@{_>ElPS zebgTp;`%eeCxZiLE#Yg*vZH00H=plv1Z{)TonjbNl&IzX3rE!BCas+K?JPXv@fU2c z@TN?7sdN?4eNk{qMlJV{D=F2qY<)U*})oH1Npr;;B_DUX8k>tD`Pqh=&IMpd>raP z4Ri}m1t+hT8^84ObW=PUckQYeuYK~^G>X!y1^9JtIRM^OT921W$S90#GB_sTLhU_g<}Ee4-E>YOjjF+}Bv3E2(;Z{377*h4 z6_`_AP2{>%<#w}m9iGGO1ik^9Hxt$L=vs1*S=UXy^$tQYiJ)7oLs#~h$N7s|T#xn( zi;`%FafLP%Y?QV)y)5SEq0uthLM=Ny2@GF&FF6+<9gDhvnq&Kg>#D??b9#*pRCoWu zs3+vyinveIOR=Z-PIHob_(HgN$0U^|^ahM`p}+^LtmW@#-F(B9*a81dx12@0TmqI%?VU z?VaitEnQB&tITQl?m8k_FIQ${MiexgrUKD5<2fxo%Mb_ZJ+IhJa^ptJXkk>XtDq1x z7O6wN<0zw+Rmu8JR6`NWleXOQsFVo3y-l-nrOSR3~G$!;B?A zN+lpBcM|b{meGnIagkOjx(3J23(T&Bni`r9@FcX^C1YF5pzVesxq6yQ@3nn2+IP<= zgFx2GxajDLBgrO+V?0eFb8MxCT7ts_f03h`4d=>-cxH6^rD-c3-nd`47`)o&a>4nD zRjwjRL#{>*nRqdjsme4(fxUkAB}R<2wKKRj*^BBwRhk*4o-lwgj20 zVAH|a-QA_3a7Ip$BMQnp>H8W=6FKL^j&yUPLysXi+D^&0s}V_I&to5)p7wwDYVz3%v*SP&=y%9!Tl|Hgkg?WuzhPy?j!s9aa=uynlJ30QBdOdN z#@faGVta%|2Bs>pv-(VEQjc4X|7O#b2n75SkdHMcmai5t#g{$%b5yzDj(cav5S0sF z%QePPD+hBo%8(M6&AIL z9aI9~!B593+SGCT%P-)s@_|qb@8}wx>`a95vP$tsO=!hsl7txxV%6JyGjs@srQn%e zW90-keqmU&-GMRd59e4vOS6!=tF$&e&R1x~B1N}X;jA!fN|>DZY>LI^BDY2S5m2M@ z$|dO*kv23(RKw+F`(2a?HYP3cz>*x5DMs*EcT2qs?l%-HtH(`tc^ve-lPmC@rFedk zmgU_FnLVhHE}&U;4WZ=vm0%5OO1@E2wYr`cr<_}yDACbUlznp5Wr`4V{%e`c%Gzxx z`n5?~r^p1e@=5i=*XIw zpStHds0w{p#JKa!tI%qA2UY*wRsTYuNU2JT2a)?TtK#Y{l<)OOw0Dm+i!!V=tI>;Q z#|YiO)tJM~h@Vp}iG~3&2-CmJC_Y?OzA=lRLhMdRm5V!uJv(>pljdbl59F}ISN8z| zf)PK#*Ws)$^ZXSRvzob3??BZ^5|^z{Tx3`y5?u#q^~w=4vp8CLO*#-OuA)Z$FJl%} z?FSjUcO7lJ2{{H$3_esG?1P%W1UzD(cYE#l;h~6N0!x! zhZ$?^ji1t0q9?O13}enOT&TEJvPP+ow!VH;>(G_A>ydNI-?y7o?=G`ppsuuUX2K3i z&8aaj9@RX(n5&5Vm-0c}*?SEmu+>+x_+7Y&dNT8ei`|I=h-wxN*CqEqG3b^UB>(m? zT5TK;&uy#~Z!_A-wZEh~5)FM>YH%$HYJ|Yw+6bnJ`?OsY3+RJJGg$=E+3Ph=&^8TW z{Ok*N?C1ujDa+q?J<(O{E<|sol+xotD#l4MO{QG*AD6Dg8M*NZ=%@C;7?kt-bzFjf z-h_M!9YLtg#MM3GeyuC6ti53?YYg4{(%krOr{pbx=6| zj3yZTd6!2#)t*+US;~l43j9ak$k(c&TbdcK9)1YV3Xj+c`+$d9x$fCNGYc@$J^)FH z|0LZW_m3Vd{bjuU^ol0^bbDs310!*%4c%_qb%yG9#p{Gaf#7H5M;q? z>Gp!*j+`6D)GE&X$=kte=swvR_s=Z3CDxh|MR5Lwy5A>B!50`S`UhIo(~0& z&oC_mNe^`?b+x+{b#0bm!_JLRGDNu{)(HWMKUr%L+0N8VVVTQk!HzdB#54o4#gTy zw&4Y-1YwAV5H=)8*-GG`W{%-g46}$44}+l21u%5h6aU;(G4jfxzYGVGn8L`FIwyIAYn9d|R%3^hK3_J&^g}I#K$@hHg zhN~L^Smp0i(m>9a<#uDDsvo})L$*pllUEb*Vs*hIX5ERZ_p(_T=*kxpZA%Vm2|GGN?7Q(rNTPDtudTs<1WN+D*2`5bNsdcK>z(rL0AEDO% zlgBClMCf}2uGkCZ>m{4>wLr{~--&KV7ZQN&r_ibPy?OS&Gk|6Ag(sC72%cT>JuCiHMY+OJw&o@?zA*6Md` zsuO5?92|)r+@HkKL>JN@%T4;!dzH^7(a$EDtuKI->p>G#Si3$^ZsW#G^p#Qf*0wj~ zhW9K10+e_Rc$)bM{g*|*r7?&*8Ec1FCqP$LF#u0By?LAK65-&QoMxSL=iblq02 z0#9C}YV|Aa9I86c%9dNp>XSF%-WMviL)mz2}ZmZ_rNV)Bpm$al&` za0s>-wD0es3l#}5cmEsz)6B+L`PiZS%ingM%SzFEo%9yaSPB#G(GWE0Z?mQpeiTv^(=Sv^Gj zD9&fYavi$YZOcjyiu9)?9W7`pb|J$>>qvm} zp4l=lR!g$X&4sz?kKP5ZIQ_qutoY!=K_Hp6?ATm}w70MF4$U%FY8K6L4&zzY?8$C1 zN&WS_D7aIaocqo5I21oIJ`HvMxR={ghOA4WOZ{_iQMGzxrQuN}eB(X2EYM#$r(NBD zsO{-t;zaS8`FGDW8p_nDms$B*-0J&bWmyOAl503i|17hCsobX~k}%r&$ICr_J;P{X zF$c^9dZP#G4WEv+xvw>DTRThx1cnb?npGbwr5Gx3%`6F6lj3VTNYkgUxWC_ePE?J~ zDRl;_Z}_Pi;`=YjxcA^gvLwO4@!zBr-ESP3Yo^_!3!X<^J>4$mDt2j=vS+P@_~@TZ z1N2wH`Q9U>>#D&Xvv>-@h~JG&ISGMBh;QB5X9${-v+67PTG80FuZImv(#IpYh;dEy z=BN@qHk|tb*X(RK)UBjeHq2GyjN6Jg-g~dtnlk8q)ce%NlV=_pjp$g59!Ukd|3_~u zg73bhtnJSK5ufqiqtrpSc8w9+&DnaXq)IABKdm+DQF(vB!dv`|(Qp*?LMzOmyEC^-#y00a__bUzKhz&WbnKgMU^!9qG<~ z8#qRzvQXXMR=gHLu`bJo>W|Qz@TbowWBN{=ayT-ANJ2AR(O#CCSq&odb6( zbvyEP_}I>~0o()5-cBOa44N$MU4iRW2q-%;?x^X@k?3lgWDM4QMJ&S<)ON`uu&%!w zRt@`KEg8eX_CE^g1XbHOK<}#SrO@75cTf({a4#~-htnf8O7p7292BGLT*KT6Zs&|YqX z;KemApnloa(zY_V;<^c0b*EjZ(5qPq*MWc7pYh{0Znduf0lRlw$esT@sT8=Yzd4L!5|HtRU46`+TY#;TprDHaR&sNx?S~;3%vMaGF*$zxG zY(nd*C2Bf8+74PmTPYJh+MMfN_k<6d9P3{9pbuNZA}qf6Jzk&RKOMWD&&>OHy`Hc8 z^{S_gdX;0+Na$>ugfczSgv^HL;ILCQ4f<&x?=GsVn8g$+4h@&7p zWU&*G;xyLlr1|sh$!NIxL6PI?W~Hh%>B_R^L`N}Rz!s}Pb=M_p5L#DXrI|+5G<;*M zolb)vJI%T|zd@o}=Ijd+N*;YUG3CRaNStuLd|=Ps$&_Vif5b_dmKmL~ay`1sklMj; zz(4X5J_?bawgBn^4)S0+cUi{O?TbIlRth6qoXUnj66H8uCz7#$pdM`aE73Zb)(wxa zbBHLH-=R}yn5VCtS_}~GH!=(Db)!S0{*{Y^@n>*PT^>4*KNatC)nKQIM)O$<(u-{_sMQOOtA;$4 z<669GinSySF}R?DG)!e(vbvgb%wZOIw0o+QnYh=-w>GK^4|dq)KQt1?=$n%4xR7Ro zKW7T{=&M%=a2(Z$0u%jrs2A#fpBm|1Y~M1zpj;V{Z0Rp`hIK(hW&T)+?cDo7oA#RDhrd!HS$*R0EbVFleYBe zG9E`;_KMdg=#mXaH^gjuo7E&cx~Ox$lVMSA;tjYVy!RG~a+w#Lk!U$wSIYm*H*i|N zo8Iio{QZaWC4QAv=(zkZ=n=dZPgIj9Ire)E<|!TMq-0&B44?c1%Z)xBoQ0ep7~q6@ zSlVpW2`qV)vVcSt@vomcvY54rWXD(`VW%u!+O-&t{_KeS+^8c>r*2z)tcdE!RRRMw z7iy7^BoZXbbn(i`-RX*rpqlR|%a@W;vDzwB!+5gngm|he#2fCJfkf~x|1k^xU;d*8 zH^#@}Cj4=>G>i+c?ZVRhpJuXUKnnHd8oZg1jI}Bg zL6~<+TmfE1T?w9jrz(b7@OQHC115>iwaS=~`5NW(!(PrSE^2AAeTX_yjA6TOBoK`H zD%pAVw_|hMMfEu)Ey@+iO4{45`@yPagwXXFCEjGj(A@72WHN~Pr$N%we}`%vUlooH zbpQ8xNE~zS{}N4P3Escas@47aceF}Os~NMJ)UV14QfilBiCXp++mufO{AQGu-y#9- zhS{Q%9#jpH*Y2nJM%d#$H&$b~E4R;yHPA7Zyg{_^5AUTr8xfDAa}A6YKnLxk{gK^1xo^QoC>EKLV zUIQw`*zPaptUY*()*^3!Q0?=^uouLD+`MYy!|4Y?Og_g%i@2z8Jjz;FA#)_$FDb{xS~~H}bcYT&O5ztfScc!Y z!%C{jNQS~uhnOSeul-g-PbbshE;FEnwU81l_h&+venrum~c63@n8vOd>f82<9+n21@e8tNs zr0wUBO~Hm)lA!LkJ!sVnO8l>s9i&2$`hC(LMQKc|J z^!>+!66@uY_}7CnvU zcKV~V`4a$yqWwpX;AFx(ujl#5BfvBqaFbJS*nj+Y0T*C?{c;wLVY?)z1-E@{b%;<( zwscX?8$-I7zbF}|^GbOsDd~gyJ1ps-nO+A;fYQOmJ>^Om1ywN9!ldzj$RW^G(i_3O zY>F(k9#VcEwp>Z_-O4gniB!**YxcN6nChl&4z_kCnfhLj-pQAD{!GI$-9NO829baA zxYe<(thi2?9}snKJv&!JHNZD8t{D7u=P{Gf=y_WP9QoZX1&vQUS`Wa>K8@ zWoj}1nI$fGzsH9{oFH(jP_~ibyb!=u@a+k2%aBiZ!zHXS7;${QvLGSJsNuB3MgH8e z7x^>lV=aZJdy&;7bd`@(-PbQ!*-M?f%!BwKAD|UGs$A?Fl>3b}UVFT?FxIHMLmoyS z!3tO?{5s?brvbm!pBhqe?Kf$*y75X@4-R?d!W_v|7xlPG3kdG{C`L@rNH>r2}=>{<`p;};0WbEc;IWA~PNnXr%>_$ZFo;s^moz#=m z9dr5wx_)@7Bm{p z7&h)NEaI^3A&*LxjJ-GJaf9#Onc=VsMx$T^B?*T`wDoZ+b#uqHUX}PSypWFfWfq&A z`zIkh)9qb5S9vs9Jw-s4Gl(Y3&dfLd(`rS{)^v)kf3Qkbg=FfLda(ZxlHd(A(=D;a z8D%lpT7S$_=yf{Ef@D59EZsVzF=kS%e2m3i4qPjHKDlFSz52z-gip^*45b!5oRpAd zblb+8Q0ReWoHL1Pde@w)$-rXtOsh?NX4%j%?HL215T$D}a5vW!x8}7^81LF{$uNOK zBF%+0q6ZeJ%kZ7(;i><5Hg#ujCtA7~zQ1uSml3sXaa!UjS~=v~ZL#LxHE~9XQ?8WU z4ey;qBYZFworB4`a2V@37ATz7k?p&tGg!Ic?3;QI-LgEX+7z=6wa*lDuvVF8~=rO!3vCzguP^kjZo?$qH<4b48*1A0i_?Yg?*4>WwF9 zm7^<*6>&#cE!4BFmQaT;eIk_8775s4?AxWtusi4%q}UCg*Np1JKXCXg8x_-2Z{K{x zi~P^u`TANCUvau#$6pw=7sX7&Z<(9_;o)5u;i2*mNvE|!{pUHu`Gmjcf+_r^TzRR> z2hp&uKs|%4ZsmtKiq`OXl(n1WBkMemzk;u}U&<%Lov$tB$f8T4f>Qm-enB6yG z%}(s6)r%OriXY)oyp6wb7@aLz-?j_Z%b9=q94)+pbjIgKdwmt~P|US+cqkHmJpV%= zoX=nOXGhPH#m~9=489CK*30jfJ$k#W>5c#0!Vl3l@8E~Q%d^+>LrC)uSb5BMCAyxf zpULn2+2=}Re8uRMTA@1Q8RQSH?gE6(ut1pe?K+MhCes1~s=tV%c8lk0HHN7SkOZlJ z`ku(cqoVI1K=xhc^S|)&>qhaa;O9%0uodw)bcmKnWDtlg&>Q4aKCTQalLJJvwd#!U!7bHtn!6{#@8)|w3hMOTXJ0Ard2GZy zzG6R8YSkLiOW$~W3KfxqL;1iOK#jXA<`YiZP*9_y#&RS(-@KSFx))BqgjZrT&lS#( zZPMBp%3ivKJwlkME#a|aAyPak6p}!a7ZCVFV~SThi~M)LDBBz^4{CNyoSFbyK1w%{{7oIrC`|08@RgS`MfFm<;R<4DK}3n=a!!u zr?rw*_O`>iN4~#+;3nGdoy5%!-JgBog3_9e;EXP>%7(}NDY^2;pSl^9Bzn2pY9Nb* zo;^l%@kI+c%5G;YU={wN0Tk{U_D|mV>?c%9H}F3t{CcHa!~9!j@jq;@>GHfKn;bvy zsbZNWJpnZ{ej2UP9=hjhUVujhvuZkbeDUL{o~YI6)U2ZKkwf3FGjRkdPF)R zhx!TR9ZDNm6m)!txN!?k)anhpvHPT08Exn%69YMHc{&t1uho$J|8Tlg2NIk%Diuej zYe?!iMr)6ypc4^PK2sdmRD^o^E5UyWuY+Ic9mf zSz;4fo#Eft%cetU3sy0d0sGw-OKpqzxxL78IHN^Wtt3S#gmV*-tXRW8VpqM(>blT zX-g`hN~hJp9b5~ZK3oEc6M?%aR>c6Kw8hRR4-g4)T@Ni{&{xK5C+NBa(!vl}#wFUn zU(4|*Jw8K!jGor&bg0Y<I-$E3ih;s5gPUHtlKT(Vb%2Ax zf_egqM;zw0#tLKgGui}I55MDFIpHrx0J~x19acy(SCP=#-AYWDyW1J)2ho3P9A#TG zcj=z{+zL7Q(ccPwoV|GrmkCQ{L;AN^89s^sfQ@XuJ;Pf~w@hnfguu62gE)VwO1bVJ zG1y%5cUFT+=2VNPm&P8)R#X(J9|l?(HIXASwt)lWS}`Z~KL#*W7WY{!G}Gfft%hPOby~$~Z=Wja` z4rV(bp_{6IRG{MMCvS^E0!NynIpG0lqj}A{tk3Lzs)Sg~$A@^Oy8G2}1x0H7G>0uN zeMnZn^G&OYg06E}Q;>|ne~DzeM)={zLt_x!uva~Pw8(WGQtgY5_~~52}ZmL3lm<^8Vq~k!PRmToeQ!GP5owKJ#dzhKKtBz z<%~V)GVdRFCT@C;OTa=Rm~4Jni0}%AJaAI1&IrdXT>->DG#J9d@9I_S{&Q2Z9l8=+ zJF7!o_iL`1@`#;wtkMX|w%x)#gL^YLbLD-8o*NiIfT|w4FK3&?P4BfD_@%Fcm0oaR zV=T;Bq5kbV2MHwaH`3v7*6zx2@&0GUN^5HQaIYWKW3~6~wsB*geR) z(Yg@lE#s|FRyc`8yD#nHZlcHXW-M@v?ttA3@t}`Z)ToOe%tFWS9#m0W$b^|It$Nxt zPZB*mI**ndq@(Rh7ty%#O0UTXo;htxtXkq?NkVHqKD?W!6ISu+#4l?_2734+>?^pZ zFfSOY4D1`}Ga0_p0m&-$V{_D*flfEKr0c~2&2@(O2dczsaVlw9H6_R1SI9g{`=8bD z0&!S}Po6VGjz;-tJuHgPhvEc)OeYQu&fLqb&YHx9m=E@Ogat`3xG8U(hk9`LzFaiH zDRv90Tcz6yS&dnAUK+A#xsId<{dND^SeTFWg2oeQlSNr6kA! zCy*diDHfwvuiKdeGwqUKke?>8sS_&{%^(9up0>zo5oQrkUH7X~CRUu*Nn4ag5Yc^Q zW}Z3UUYTi-XecJEdH>yvqA;-4&WP3Os0y4E`afSM7z!zfJ3cZ9i8jRGog*J{n#F0! z#m%`Qsq5-{-M5wKe{k^Z}qD+D}=&a`a_b z9{Qs!PPu=%R)tkM(`%;D%4PWqsE;@1y>;JdUW(zg4?-8w=~rf8*=-$~O#)^NAh##1 z;9lK@Z;IQ@?LHJZv0t0Q7lLVB(oHyr_ew9M=!dJa)sz~IvY?8;PV=Cr?e~Ms;WE58 zOgMXHKK!lh*Pr(p(SrENu?{j#RwM1hb=|}UQ_lJlGIy_f*(xVc`&^m}`<@T8n;VB| zjYe?(evL@(IlWFPF4cX%0ihqx`Jw??`RNfQ9qL&dxHgwR8+8B8mJEE{x0?Xo&orx!Fkta^TmA895W>8>-r~ET5OXzXDY=Q%fEUk~D;m}*v#0C_ z`#bHr{psNvk9lea4jIE=KHY_&!_Tj=nwY0?+GUV3pO4NOoID5xctcd*}b} zD=?HX{ZAvuSXuSZnK54Y1e|IFzZ{UCld$5Obg63ol9b$z8;^rzY~vWuAXvix)W*hyX6uSxhdmPiuYckOlLsGYm&igLLl(T(befH-QP0Dsx*|k zmFLD_+Fy&7#2~D5)>0%uqqQj>LV7y+ZNTWeLL1)q{HooTF1G(piMkbygztl|)`8#AWl31a-*^P%6IumM5e=Ds(Atft`oVkoP!x>G1-f7PPmTlH z&w{=AHvSL;8lN1iqI=`mL^%yGQ&rnr^asv98T9vGQPV8r(J)gkKi5JA^?vQOk#&*F zn7aSJ4QU^j$tZE>E3=xMPF-?ks5&8oj)y`-##57CpnkS^zM!GZp77nL-D2U;EDMTe!EjmUlE)L1>K{}W`+ zW^e@kL&5Fs--1l$olos7uGE!Z#ycIlIqVmY)B5#uSe9Eq46S&nYz3?jvQw<{i^>K8dX3yfQN7KDKz#rORhks+})-jTDnEU>VU9pXaJ+ zjQ0|;>Z4~*jy22MuAXCVwxpSp|3TMZ6ZEdPnqzA9A#eds%yVg!Z;!{>DO<6C> zBha5?6OBE|cD<}Z(O*%w#$4Ua90r&LkNgYSxW|;jWxr9@gZI<8$w`rK_<*Gt0PJzl znLqN5f?BoLkTlO*bbh)JBX%#KY5rcay-J;MT9zN&`@PrB?8G%5ms}nLV(rK37+%Aq zxpJ?GAi_Udvu;jU#)`thBPmv$n}8Dx^CI(bjWd{eCHxERLORj3La%{hr5WiqBmCj= ztEfr(^w0#5p?rF%Q;*<3)oRjR<7Us--NV;dTz}T(l&tYf&VLQA)C?FZ? zYMA2RoFJ+kWYZt%2gyL_93)^3T6(RtZx{gi_)SNX!Ku?bHqGh$@rO91xYI-p>ElD% zawe^XFIiry-uqy(*-(EzHCICt=;XAbhONm$Na&yQHCF#h7x*uH@CyL3kMC7cU?-Iv z{u@e#t&C3A1F0u%uo~shTn9;4*E^8vY)$4U2cJ}Ds&%_`QVu$q*3Bs-i)eSIN`xQ8 zzVchG5offUZ8i`pn~H1b*C_!lclQ5)ooLq8{M&YZaA5x4KM+Y7Ji;m@Yk5G9t6bZh z?Ig)%7*wLP9)u+QbCDO3UNIT{!)#cx+*P$c05ihI;#{s@;JLz;0%}no2U_{e;S5m5>^lyjfpA<9i%^xH$_HzH{Y0)rnV+mG zBKLtr9A!u^zF|MT7mf_pY?cAf=JkvCdQiQkq*A|O|MO!o*SIO$Yt`7v>3{~dAr}-p zYs22*<^l^L^y?>?I$b&CT6w||`*6+OrT`s5*Ed9GP*zCUZxBfYJbZT!Qa0GPmG45% z0&Krb%tsmeEXlR%%0oM0aAnWVOp)|_lkgilN3V)-iTA=FaPk{wIba-a+}kN3U@m@ z=fu)Ac)q3$D{drcce)0*zEz(|QOb3X!#n2m$y4IWOrnko&SQ?qRFRVOr*vJh|2fBk zX5#(0GxyVhY3T2kk5LVki)*zOL$St`#sI2~1Nn9I?|0I9a@VSKs}U{!Zgz1q)0s|? z#lNv{x@blffD+swbYN!=fj5Fe=@x4DoS-$)1l>05?nm8-QhnS-GC9q4f3aG0`<`j} zR_{HT-d;GmGFD21_^w_`ci%fwYr>(-(VqE|=mz?u(47)LI9pCv*~dZV@PC_fMMSg@ zht!c~kbT&ALZY5hsS~6Db=cO%FE~yOzMoqup~Ud4d-4sJjz0>r@Ly=i*3&RBl_#g@ z{cJ0(=-%KU{qc8EYqza27Et>&Z+o5k&-o6dxHl3W+tNgIG#r#}(}TWUD1@UHMN}b} zNvk&ODKAWjm5bt-*C)0wuE-TB;aGT<%x(%{zI9Ydl2uv^azJo3S_8m~Ms z3*{lJJw>o?h-0a62v5|s4Ck>84ALkcXoKBa2GYV-pFF9PC^8?Ye z@!wdbgmPbWAoxm!w}gYPuo}oePN9*FE{#>jl>=fr-E!MRw5KE8d~s?fFi?b+#8^`8 zIxQ5PYZa#j^on2@JR(y=tDaG^`2`hPE2(*(<$$+`?&ja_?Y}Q?*Z&;5l?yUIe@Z%M z`ZvTJTlXhlDDA3#84ru0@@Or(-|;GayNu}TzAwgVL>tertZ!tZbacKUzc0E_1i3qZ zFQ=+pb|xk_pFN5tgxebvF2uTgiq&pJ-_cB&mEJKEzewUQJ`3AG2CjM=H3woNkSNfL z=|tp}?3n9703+|RLL6P=oN__7T&dxnH}DW31no>l4=Lj&S^&mlb+8cn3Y-!w&}H^l zP-e&o%W%hWC~=5sQE7#xb?RA_bh+-EGqpB)ac$2*crRTG9=PvbSW>9guB))s_kZW^ zmA>VO>gjKLZH8H5-WF@nm2b>+XI{%=3yV`)J-t*Z38f5YnFF0|xf=fuv~Y2(3@0bV zbLlFs6XO9%3AwB;=B*vCdb}^yI|oH9(18tqo{Xc!q~U4)h38r}_IWPZq^qZWo-4%l zIW19$mR0quWJ)6<5MIISHCBs(Mo<;=@r}$wCY#2}bhECU_@qpbMdD=m<{STH8z?$@ zE8EHRaQa$*)j>Y;*+aZW#=ShQ`2xrpmrm|45={8I>e5(>EX75Dpu6hgG~|F<3)A;l zk**TZKApVK&wkR7DEkdaHW})BgCu(yMuyS?Tj$sjVxEp~=dz*Pxw|@>Z0VM$N-`nYssVL6~rtGs1$wjnpuOn;dD5r%4zXOl~%K2lQLS2b1aO(B&nBkIOjP6Km zJUD1`h9$8H9D$Gx8h0jYAQiC`BZJG}m${#0;h zvJ4HPeOR3alhQ5$-u&tBO0u2MJ^;CSKT?mro+j@fu~;%Om6E=eqDMV@q+MYC z>h;}O@FR*((%03e|Dcb^s2-} z@Ib4@1GI=iC}$KjLS!B+2z&uG&I4SdT`3)e+-nDWfou}dVUpDpYtj9a-9%~cyoy*U zawu7wM2*e)Oyb%h8{hvs5Ar_d=!8oK%#w!_cA*}Xe2vYdhx>HRRqNr04m@Q}>Wy(2 z{{11*`fDzL^*}IO0Rf1by)6~1-_`=3wiGYL*RrD6gC=jiP>{0n51IRnVVW*7 z{H2$lr=|GNF~y}~XITMxUGp8-_RmFGnB*?$$HDPg?RxO;B~Y~A{yJ%R`PsilwD7~q z7~2@I$Kx*19jo-{(9v28WuATD#^~lAT6J+5)k$_w_}DBPuT|6L@-cb4Uw5mdjYXRc z4LVY4tp+_fdUl$V?%Bg?Fw9>n(=j{V(jD@|>PWZC<2^Xyf*mkBD4)lsp?6!Al>5HN zD4%+W9H0<9cy+A>jVygs1JE$LYgsEhyt?k!c&%Ps&NZ_}k-5>-a#4)@ViD$8Mww9L zz${%|vYR!bTo+V}bml;L1@8`jNn~0?l%!iJqJD-JtwsJ%|GxKvqTn3jv7m0EHi;_` zw>|}XMO1FT#QHG$(+zoz!q%gjt%9~#M3Uizxxugky9aJd|H(U!kLmHU9$eLVWSPVp zd&D~8VLVn850jjo`~IJq%Dlc8_K*8I4@U!M0F|z+KM+a?`n~IP%F)VU;y7Y4kDUV3 z`gh-c7EBAULOSNkZ#|yWf9>)b_0Gq&MsXr(K#_K~!_HBO>gX1>H{-SH;qGMKa5Gls zD(M|QBH7kcS)Ht+%CzETk@FB?fv%Pvusx;67EFvqWI>IE0R)wb)Nn^{Mng6%aZJ*^ zo`6Nd!Wu8is|bZ$_(Au0aJINym3cj_GEr5)RX=>?<1{=LcHIy_2QVymQs~*g7{fiX2!?rMc=kevbz5E;EdDyr6HN~3(}3c z@>c~~wEGiWC4RmJ_48-Q1+~9gGn=z;|8XtIV+Bqs;*uw6b$WPuO}dVP#{Ps}kAB41S8`0(_oTEJ*2ANl?MR@AdPGbt72+!4}9SJfR8B1WjQ8tXL0u z*YWag;2CT$U%%#JjiY)p!-AEM#+B5oL%#w5!zB+S3j4&vB9YZk^yJz8vF|%g^eq1y z31JRu(pWHlBsgwFoz)_Yz;IgkRL8{xa{H2h`V9_ zW8Gpr?vC^11Z(f0_Ou?K{C^#=HdYQTF@|+ojU*@k3nSxzNa%%RJm*T7fiu`D7bf!j zylI~Qw$>_|Xr}P1R&LPWC0S~s#8(^caWk$h)*1VLf0BW`PtCxj40^_in5%2HZI!~N!s1i zreiq^bKU6{m-EbWm(MN(%Fx~`I@E_B@H)lem1r;2-PAOE6NetBHE(Wz8qt((Et66Ik&Xz(JBz@9Os8=n_1fq=Pe8aB^F5@N2)ks;L z(B_f%#{$ML-)wd2xMi(+8Zb@Fuz|k&<01WGp$D~Z`o(D_W9JU5CEg-cO_;utIUK%o zPr5!H74Uvx*QlEsotHE%p((91-gqFS7D>m~xSk+n6*yZZ;${CVYF0S+0H?{o6*i9# z**=Yuxrb-%EL3&pGiVL|noZsK4V0XWx~NMpr$CbU%nQ&6cUI!6{nvZVYPc-fSt61p zKa%C*TBndg{R0aEb=h{SGG5e!w}pS6>^0||hpEkhp#Ox^5}iexn{gW}^D}MqogVB# zvChL9RCfRAT9Y1?CeaqaJt*#!YaN6`^HIPh#yD*3e|m(|Au2Frj(a_=e)+#~{Sk&oZ?4=^aDNl^G5KqpLh?*D9|;57$fSe>m_y zL1?sl>VTZB?1n|koEBuiRw~XAr%4ZA*yN9oYV5y*s6nsmjmvh`r2;lqf%L=1lHxqk$NoI!}m|$&{!%vag#s1$)?U z%Twx87kl-3GT$ma_>*0960GNBSyy#Z??nB9f@~ZVZmxuhX8O(+fFBQdMFZR@ z99w1p-IqyT<1Oak^vF!_tnEfYNJl}poEH-5ytLqM+B zS)J0M!%kDNQo<1h$uQB!;xI_O2*G?k|}D2 zkF^>E?lTb0Jyq$dczyR`FsyH3qUNx8c`{ZjCK^hp*hl4gU@y|c*RM>pC24SZD&&Q0 zUE1S8YhYN^P>v8#cD9rGZG>ZX-WaPCgieIWkBdi6hF6GzNWES7QDM4LqEOPn&-ZS3 zQU+nBjTkfkbr7osHzmv}u9tEH-(5ZAiTl|qll#Qc+c+}WRzQlY!;iN-R#C0qwL@|m zG0>bMozR!3h^6C!wh#746@%ilY~j0oa0h-n;)7DwfjO;}8%VH+w0d>il!U_KA3GHg zn7L3$vgD9lgAV;+nILzc0NMb3WQY4^7KesGbZ2x7fIQ|1uSOiTc`SE+fLa1um)4R5 zhn7d`XTRl}xg#>$#FK(=uKQ50Wm^-cf__yHsaQ-Vjl)LM9uODX3EyvRQK@}zJ6u)l zWceWROlMNkfQZYv$V^v@IWfx@>y3g+;z(MDNQ!K!fqs51;{3|rGLTlrOe3&b`&w}7 zWs?9HEMl)g53K#t4e`pp#mIt>3PJvE6CJ2B`$k5W+s)LG=znXX6`HsqMqrij$^_0y zu*?+Zcg%QoU;G?;Pki+CHv(;_#fcgeJa`LX|9p3hW;P7xJdq72I0XC!Rq zfE6FA)yXhy_7^?)6;7h(yBD~sJ}*D5?X7yt6zA8a1nu!zN>ZEu`%xvfif7D}z)QN+ zh+4mN05Cy>!NUJQ{1aklMPnFVMj)d?6Xp zJC-Sz&17Z1sQIGSTg_sbWdJ4Ope`ZW+|`*Vp6U~$SB4R5rz^`y*&$#cwj$C~*!TDn zr(Cr3L>YbMzpk=cBt8mLJl7Ri_iy@VF60%K9guFJ#&NDzFHYcH2e9=08T_U zoSJy`;juD;*g>X6H~TE%$I6i}WE&)6$`kRdr)z~{$l|~6H7k^Orc*7pDH}%PlhVO( zMU+OgcKO?CAcgh?;l)3frc2{>CijW0i$Z_gMNVYkv_26P=^QC>3SPP@3#z>|FIU|M zTJa>^ly-P210yiQ=_;Q;p01Aj17I$Krdlmors=aFxJ`SKG)RA3vR9R>o)Ms)*AuK| z(id>E>LHpPny)6ChR6Mb;FW0g(h^fqlI=&(zvU3ET%3_sN4%j2@8O=u#C!>0UtWbd z$4fH2?Fn*GNrl2P)00Hs&n(HTnQ z*J&Z|>iC2`SOhPbEU3IgpagO7myu?FXs%Eqjmhc*)U)o%MB?eOI>k1nSFnLo*5guf zBS}+orLnezBFJMQf#?v1A`*w*-78UcpkaUazlE_weovPQ24-vnTzvpOguT3S z(Mz|tsyGOF*K9O}6iMBSMF&{?9llI+VEYx&`~NF&Jx_DE+L3o@jYib=X)*jxL?qiX zIu$Ei)C8FErbKlQ`tB_CxT=~*WH5HHeTEn5LFdz%kYN6V6zAtwO_ni9%Js`(8Mo-U zG+cl0F7d0muRSCgKXaCz6LZPj+hY~sivQDrP2J{?6DKj@ll$4F*y6A8!SQe{gIQl%yOpDMK+=d9vkLnhf2OuG0Pc&PE;Z z`|i@%@Zu-EDx&%4XHrI3HDN6rYS(?FwdnpO@ia?sADOO0Mm-A98}{v&Er)obHP0qn z4^dO^cradwo+^EY=A@&J(`$-6LV*=*71Z4NUW^ zt&}OH{wv2=rFyW+*h)Rj`CdJZWexK>R2AQ<&qR7?o|jD-_S4^z zg{!vhLF_3P<C7>dkS8CGEv6Ru|>aTpz$-FlA^$1VVT1h?NTe$-BVu_pRn@L zkb)|8;ql2JuJ&3&eT4Z%(j7@RggKnPJ#KLpjx9c{B2e4sz!TBO_j91Z)B=m;uN|T_ z=;r1S{4i^)mRG5@a^}&~Ur4w)^JhW3`p=Jv*50EdOINj<5;c8vd*lI(0R(|>kjp!J zrc)y%2{#7=pZ6e%za?cQoLep0UBxYOP;cI4Rq6IuE7@tNA1i8IbnoNPh~0B+2ELoL z(<;pCwoUYTIq@N|%3e@zm7$*xba>w0rCK@d3ic$;uIhi)d5`MSSq_?X^*hVk)yw`$ z!xF(iPQ5&oy@XwvN&rsH_#x3cNG{%M9^E>+2F*;0!h?wxZ0audMc8*6mz_MKW zS$vymHiC~j%fPVkGfUE(l=u*Fhx?yRt)PqWKeEGg%7bC1oNhIe3$@GPmX8<#BZWup z&f8}3UV#=QrR99QD2?m+a57vJJNiat8wV?Qo?Xlt#y z@=QrgD)|@IG?%aET>Yd51_T>rzve^|f$2Z7Hp4mG_;#j6cOQQu4NmR#1%iIx&x2|| z>hu85&wC|0Y0x)Y`TjTU2!iCCho-Rl74a`4z&9^IWjg zo>(%a7+M^UDPXAX)MPtPda@>=pl1HDU2KJ5+=7Y@{gN)Hj!x;p+H;)-{5fN_CYohE zPBzJ_I4kflp5irPwXYD0>)B0f6p)7Il@|`88Ng^W)2#bvuR${QJ}Jl195&Gj$rF8> z(8b;}q?svK0sWb_2j%(N%K)Q4{9UR6VfiCtd4a*hg0e{(#IUKSq-#ap?@WY{@51A) zdLai0%e_T$5d5PL^=btZE{(O*t$b*jwVXFH8Ff{659Dl>yT`KV>zB*19e#4QT!_vK zu&eK)UKT&(ZY(hWtI3HXti(sUWZTGN`yyRNsB!hyl)5E{9_@Pr({Rk*rP56!SaP}J zihN1<*hJ%QNK_r9E6REfKso;b0i7Nb03dr(U#*fF*H&=~1SfsN_m#qSt8z5elSJiK z%1Mn*WvcX`F-VuG(Zk7xh_96mS-9;#7q>n|2BIaMEv^6 zeKhRJa{S;r%R6_zS8ash&9h_vjPhbvw~w9<*O_}B@D$zOwme&-yFK~}A8tB{#Rl)_ z!p|4>US6v%`zBEX%3qevw2OG)cJ1qK2CeMv9!G8e`=F(dZj06G!Cy6+jc&9t%|xG{ zlZ{2BIxiK)cc^Psim34-)gCFmmIWHXAZ5`@QeDTKPc*ZVzqA%&-BTsADV)3kliGeT zSRI2ljr-G;x;ti8!e#Ss-R=cO_{K+P#vt}C9a)p;(+%l*^89~Im(y5gAK7yb=TjYe zRI;{tE46*9;pyg7hQBVU6iiUNSmES_V*WOvH~e+}Q_?#Dv`L zZL@skj$})z@C=vZKRE)TuqP+=LA1M>CPd*Xw_7?6%&*1o7cTXz8eJLmG?ZpmK9==` z`%$LXq4slmGauK$x{e$$V*39%h+jlw3!aiui2%IZ_oHO3uFm+4v>LOpS3Nb=&ur#? zhDnWn`1et0od!Tr%lSt?zvDFs0VD`yu>Q19CF|3P_HKr$zE=|CKxdDWFQtFw@yPf@ zW2tBqiSiLd?+1G@(XcO|boa?iw06~;m5i`94<7Duj`RZ|ortF-%6l39qyH|Axdu>3 z?VIlAUV-WDLq6Al*Uh1q(*0-G!A$<^hf4d-!J|n0jV`C9Y`m>t1{BrfbbhIPwHmw~ zImT+&l^b=oul#tv$fA}@vvq<`tj~XUhg`|ot9c??;H+l#_&+3K>R-K86dE?cy_oO4 zoK5MWJvfb)r|u9u_g}gm^i@iquu|lxpO%2^%~#4Q%GIt5oCchLCohS05Lh_S;^&Kg z&9>;l;H%goV%Xz8%XO9kxhG2L`{zy53aMGxYtdcQh?NVSIxOjRQ$tK33Q5NaC(H!W z?J=8X)#&9PJr_fJUG$Rds?U+&r8_N_sl{qM2}t&z`YWyATK?E-qtW-(?B~t91a0hH zL(`qK_9(86w{_z@qqnB)s#PDJ2wMwkH4}z=b{&M{|GJ7flr2)L9_}5NY1QqfaX9_@ z2ZUIUJUqkd&K=8Ag6g28R^8C*6)`*vB3fYct@^I9N*qgy?DM_>FKTe@Bn{H9d^ppI5B@p4A&>nILD*M6m}?iQ^{MJuofrpzR#ZQ?ph>;?SWY6kGv?Hh{B)G0ZkoRzM0|JV; zuYbQtyLsKAg+dq*c9oHz_;cmqkd;siJnBuWXjZE~M)xuI>9ajzUV%*KQEoVtp7~|n zxtZwny=Y8+>DLtex5SF{;HQ38hi*PUDeuKhb#XfNsMlDlN;WGoRr{a*Sh%|T{o@`> zuKoar{Q39DR4CV&o6+&N{*pmke(~KbKKRxo*cCjyl$*q^lR4e|TIQT$TjjG&-n+%| z4b-X&i@A4YecGhwewkOL`*&ZdVJRFlDG|~6WX$?>qz6-aYUT0T?s!<2UTQ@GB_1Sw z?mYGy>}$+Qskh(F4TR^>#^wNZ_QXW(!JFG-fcW~)vT*iOM@icukYB#kbPA=#!Q9@} zNp*TCg~Dd(w~~x(?>;Oa9KB_jR;_a@=~f&_w?U2mkQ&GaU4+)0Erop2t=N%+B!^b> zN)$|)Isn&leWD}Q>h@Vt7FJnV0mGUzcg+e>Egk;(d9etKpd*oJ>?++rYX*{~x{6D- ze|eKVg~Q(x_I=?Caa5Rxj|2LUgv;yIA1;#Pn5L1cXukSWu z;gbCDKpa9urdomSzxQIgNl=;XvW5KA+#?5hbw;>w-}O+ma@w^yo_O2CTr7%#1^-_4 zgxpNjK3pbkhU=nCqv)4O^Fa0K2TK~&28(^UFYYg)WWKF&rcL7#&Aj&Ei8;>cLxpud zL%TVW#s~6IG!U(cG`^dmfBV*_v`!&FhuvLX<8ab|UbVa>(Tq1_^D0Ay2OTA9eI0PH?{kUTLP}yz%(fE2cC}XF z;Eb;alX~GOwO?AahMPhebE>3ks&AO{E?5ymY-Imf-mYlLvZLv>eh4j9>kKGT#6X*_ z01%vu@?{(P3#zPBPs_uV(o#dY_KQT(PDUit&IA&YA48B3gslX zehXQ`ZDM?W(7W?g^^kPLM5BWbMmx1+BFzz#D7fimtA&J#Gp#07IW8HTCTY*AyZ>?=K1D?TYJ6x#ND z-JaHJK|7B>p+PBkOyvcb(!wj+%jrrz@(x3lHgH>9F57>90is6PJuu&b<$s5GMWTyZ zu=d5%vbD@-BhNbK#(X9xd=4Rq5*T8;ZcA%y`+W22Q%;Vx@VHgw0Sz`gj~H0xVZX zrswfiqdds7^ZH|hAcUt-eLqT)eVr*=itEKSC}~7ooz^A}zeMYy@s=dKg0}0`tHGm5 zWnx}y3Utv+fY*3?zWjCA0r~EB_xIDP4J7NBm~EIlwYl&?c;eMs5o14Bil)ACa<&|4 zn+clxXy^Q3!o?|9amzVE%s3y~=q% zt81)!l2NX6+GygkonB(P``|kyxjw#>%wX?4k2`yFeIE4ZJP+w3K+?Pi``tC-eqk)4 zm+eD&j|s|NJNZhr`OLRF|Ko>Ciq!E+qJi=2X$=NS`8}~F zaR*z~23F8%#ZAOk$~l$jk}figtq&fO2T)^)7x4~g5xE2^LN4h*+yD};A%G*6 zI+;$-SCW}g)h|{gN1iD%uxXBmMMYFXL-xLf%&?9(OSW0K-(v9y1j$yfP<(a3uyXIu za*5YZ%BFO8K<{LztJ_|(YVGP%!mvv?T z);h##CmPKug^9v$27c8E7)IScD~Z(gpOv(!`}9b*7O0Ouoi5YOV;3QO?dh-3Q9s43 zcms(y6aow$sz;v!yWxA~kOV9mK3ToBN!^x)B9z$^t!gpK33C;8k0I-pmM*VSDw3sB zrtkx0_`^Lh!(pM;aW)3;0?42k*l--r%y(-GtX{Cb< zOT7cS;>)($$QiiOsUbLcFr94@j{EaHv#Qkb!=ywK@0iv=>CmW52R*4WtPZ+$I(7H_#zf~J;=vppzHbdiedAs^ z^6X2QQa$|SG7H{%bCU*WJrd8>icB0NuviG$?ezMIO7k;rq109F7Xo zDvq9>*ZaeD1-?4!(hNtlt`~R^WM8si>G|stA&UNY^Ee^@$UzB{dZngQa-F)}eT!$( z$%&NA;&_7|Yu3%nuhL2>H<{=Z31G@(4(0SA*;d*XPfJ(E&3LRs^j4=`T+kNlEZmtZ zHKO;Ptw%_^&sJv@G2SFzF6`eV9#$vCD5Z5CY!RCRGh>~v!OEzboNkq~ak%&SZ+Vc| zAKMabMKmEBxEwyd$g90+S>yWiO<7X!{P{>o3qP}r2O~eee3~9#!>!ta| ziYZi?#;f~lt?Gme!DsixYdAmr_uM8iASgnCQ{8x5JXTKH_x6f1mGk0+KbQ*vg*CO= zYGRx73M$nZKj&C8#vC<8crudaVEk=Xv+jRSTQ5EQZB(w7aP*&vLb4(UKA$KWEba#4 zSmCP~-N3#X5o@COYYe?|<5B-uy#$)LPk0xoRjwSQ`FgN?hLFPBXF8q27MZ5FE3N>P z>P%CfC!1M7?~~v`cgJ^@BHkmfox;yzjz&yhC7wEj(YnuM94@Z4!eWO_r;s@E%Ki=; zKk_eHR~opf&W_bE*=rD29klJ?W-y7^djHvp&OUkh7x9+Szou>7opP#IlsBBJ_3&}& z+v~0>gkw;(vUO_oUs5?m?BIer)v8YvIf8%ED$~WBwsocAZ4Md_17-^viB=@Wgvk1E z$2V3eiYE+We=STW&N`R{#NeH)3N`5Di=9G6Kc1JUE)?}W*CZ^NP8rIDXSZ$x-iB@j zG4X}v<4xx*L3f*SDrbknUs0>hXVN*1{BmKUgNDP6bfi$tcrutEnv~NjvRSn9D~`(4 z3p8mds`D4JE%WaYTxWR4%1o757s=Kh>Q__KKIw2%v^H5@NvLkv;I+!#q~WW(mT2|y z!XCvi&Zx_^Nd8RJktSsh)L6;4&&_I64<4$uNK7GHs0Xjzm#Ad&`%N!D7UOiTdzH(F z9F{Y>CYdSBheLcZiIFD3{kiQ$>cah#McvfjkCS}&=+`=E7xTlhCD3@y=*m1ex5xbh zgw#K|EC)Vh{*(<_t2`c$JSsvvPldYn!Wa@Tt7RH>vF5No1O&JxhKUyu^nQkz!x$k8K zsG?d8#X^UO6!yD5CO!S_mdkO~V7ZaJKw8qjS|CP5rcqo0Y2-lg3RjFGpJ<_%;S;qQ z>d*bTq*9>%CH&_e)Pfibdd-I>IOz;$L)gfS7Y&Hf5O8?Xoi0vX2JFT=i2ui1dyp~C zEFnnu?X$d8ysB5MP<30AHI6(L%oZnIi-8ys)zUnrNFX0%hrThfelFWpqfY9zJX8}K zyf!9+NS+-^kkuj%H88@x`ipF*!6s%>G5^@_GQ8A&QL@M4if9DxpeL+G2?uLM28!}q zGuYT=+nr`n@bmM(3luUC7eC7R;%T*7nLSn>PaVi=QB*-OpSwnWBt1ubPBLedp=e|#oS0j99RZ7GMv~govmDr&C$@yg3 z_3*!q6_xtt=hnpPg;2C+32U-F+?k15h6@d$@<#-yB%bp<N7{8qBw+Nwk~TI9N&&|ZKCN7uu<=Oj8xM9HE-cX(7XoF+oZ zfu~x>OHvA9b*G4|ioa&1^q0q!#j15>!<`Ha)cas+p}HZi#FpvQ<4S+-2~PCOrrhTS(zJUBZ{kU+x#s?@gScGJ}{GhQms6Yz53H1NVF51n!V5R za`m)+ocjky@^N!diqx{xtb!u-^Zx&Zo3T>*VRy5NWOgHi>CD~DiOybn zH22n7x_T<3wD1q^_}YPPCVe5*3I6Z%Asl7r)UBoJc3;X^?b&~W3+9S1k#7FDFX8cU z;^Uce25ZjNfUs%HnYdssPX?#!c6&K)?HiXZjB$8V{=wv^tIpr>_;TJK%uM=I_29FI zCCD0%KSzV-KHJPA{FQ?fN}(Q|IZmrF%(t$-xfme)u25^BJNsvVqB7|v2ZiI;_p%+d zgt(7E*@oSbtcdw^^ZYtt_tL{l&d40?8$Lp)l(flS$;6iB{LmvEQXNV&q1(-i;qLfnwMSx zz6bBO%YiNWG0S-^J}KWn{Owk&j-Fg!E+dO+i6_&$qjzsWNQ9p~X#tZ{+5so!og~7| zeP<}B9G%k5b9MXu_pD}W>W+u@gLy9`T5uk{ew)DLZ^ugvB>L{?WRt00nX@9pY|Rb9 z0#h#9Z!K^a{BT{C170vzgR1@KlSPH-FWk+62UAoh z(9PeD6bAlgqReIv-)i8LmGsl_w|)79bQ7-2`Qu{Ev;gf+R{KpaN^WcT=>qxnf-xjhkw;@`r-1|vs~%5CucfTdv@=}(dy^l<;sa8o+#SMgsZJK z7-uh8eD9o&42-t>gh+1sG!YG>uy;(tK8%3WHyly)TUDA@{X-T5A=;VyO5wfV*0P-m zr=QA=LEylt`8h)q2IHo_!fHW{o~rqVa@lRwaK5|r_JS&X(Y}|G{eM*~S*okk>*Wx< zdt^32v|t)4rr&aOwqCbS_bW{0!z7Qh&y6R_S^Ra6A%)biE?EZ0Pc@+pbK$HCDmq^g zSWuQOaw?h9P4bpdQ9-D-NzBgPwajUx6lU`FK>cVfOlH5gAyLH1R=tP&?3+?HZvOO9 zMXSDW!2_`t5*pS*i~bwT64L!|7!HUpb6yj7U|--l5ce7HTctA!N7phW=S@)rgSiU} zQu-g66|o{6x`Y1xjzc9mHCTCcx>Qce>ZDa^FAg<${XVabkn!StLfJPZ8Ibj|M=ZAb zh5;Ugb8qCdf;XoygoN<&9a+eI`4e1Mup-$oLN}L{TAcq6E3`mB6*=i%cAwUPd+av? zVja4Jc=$h>&O1Dcvitk9I-?U6y#r zAn{chb=4**C9kWeoEj2v57Vv9twtM-TPIJpGfD4?A68Y?(33tn=cv{nW+zJNwKAUR z6hpt4NsGhRMC$tQgz69{*QYBJ?$^3mcyPAgf|GI?S(tV6j2^c3yt7syR^YBY9~wWm zh${c#GOb&UyDD0SD0L>=X~Hx5xhS87YX$WJO>OtQ*q3NyZg?D@4(k5N*8@&6ooSj= z|1N7)t}uhcSag3D=1Vzm52GFWpPo1BvAd^@beoyGI;YUBhs#eW)o89f$i;Wap0Ku6 z_3y#KP!{z!I%N8L0D3BFzLt{6+t*+RL^XDgByDIR`_0H6vFia$l&?tW zAJBsP+sIB4slOLJKri(q8v!Ec_SwT{k; z6Y=L_t&5)038(-px!om7yM$|TqNJg`$tDUoUe)V1GC&q}Yh_0}jl{I;B~aj#1j=W58x<%udz{mp0^nCdJ`grI0*Q#Ldq zk{3?&TPQMcns-ej8l}heAM7DJ&<~-GzBfBi)kMf!)rYK*nJAI#N zxD)H}lPMF%Ro;Xb>~c~^ z)BS+5#5G0+K%LyTMmKLa=_7GS(eYZncs6GBG3sS?nne|CE`k-kFJtfFya447mHaw3 zhYmNIP$#cHqG642OnY@JzOYtNx6Bc>8@}t?r}g#XFr`+&;Wrz}*anC&BF{v4zA*Bcrav}w5!S!%e#Y#swRPbJ(Go%6d{ zeW2d-_udH(o87Uh0~sw%H~n<0Sq>J#Hg-mjdJhz$ymcz%i@&QVRFHoUaiFBM(c& zOWkrkoIb_0hN$(=``rwYUuZYeOLvXYfvNnZzuO@`Ex!;hxYNuIP$zwkki0kFM&|z5 zo=dl_-Q))r+$S^7ayxeeK>71K1TUG7^mni9O_(qGN?A?niiitVE2WSd~L;ND_4 zTUhg^Geo_hfT@Z;eGb-Cx;~$ufLq`AfVPQGsaD{-dMhz~@gGMOT1nu^R&(pisv8s4 zH2vQw1E;uZMY!pz+hjt&_Ov3paY}tIqyz{&c4)_RE|C@AXa;E}Q)ZuUv@%}w{;jSDbkroy zg(D{Ed(42APBrd8D6#%KUKNMD2+NPZ+ph;7??e%mi3i)5+_%OM!aFCmo`_U?KNe^A zsGDE%EjgfY$-z1<^4!Vu3^ zyU<1N&&9}mc+x}C8x@~ChtqIkXcH74X8MQrwIk(%f85Fo#h?8p%O1V==G4aOd&}?- zmRzU7_HSyC7ej0W2dn5bYXlwmZ<&grZrs9makEOWp6mZGdci$g`m4|L-hUE}=FR%j zt<%Hr$A~k8)yuVsP?b6A)-$B}12VDfJ(y5Igtq*&#g#h!ayd7q_jFIQSy#{4R^#}% zY7yAH-{lakxnJ{Nf;gxiPj7@tU_S<0Q&GQ4Pj(mc25SSC@*E^fVqd|%PC5M&8P;X# zHY#e|$$3w=zL5rMZ}ycwn&ao5T%R7id#K$&H~#KsW_NYj&TdnxAqj^?$8ASfQg#53 z4Su?QO|N>vU9JW4YeO+sH{rFmk zAaUULq0S%3bg8_C=;9|6pQtP=fh=u zyb)LK;!Z4eIR7ki2=k9G_J}N{nSwZPpL`(BaE?FzwVu4y^fQd$fYq5qH``AaU~Q1> z(q2N4wi;6nDY!R2ZK7yYVtedNcyJsy8-{%MxEw^9 zeKSY2I(KssmbcFq`D~uyXT|85dbv9GS*?NF*h6f}^3x1!QmR~LU!B?+Hj3+u!)<=^ zql-i>S#$nZ+o!&{zZ>exxPwG3Pb&Hfki=)?TXY5F+jcn*Z(w~qtiX5QHFJ=!;e>n_ zSV_aQYKGq~fVlC-orM=anQhlo7PAX*+J{4Uj#K}n(F~zKH1e>-$9rR6ogdD^?BObr zsOhx1p7`T&kW>QCtor6ZF3NxG!{X7`)BOo_fB%axz+V0Hgh#Ja&IC>?V>C|?6=Fo? zq7`6&Z;{1O!eu)e@g;ir*=7yuFIh?Du5G6TBKE;=(vL97%#3EH>5@G5ytzR-%`a-< zf}G>uHG0rr(}vlNs`7)$ly&^omAP`s6WDc06#ofiJh#j@%B#c!GP=`jBwT02!%BXA z6D5woh$(nXxd=rOPuglX>E7q%ZZ#-D3)i%$1n%wP50rf8&p`~5gpJ0%Tv1k3*r0ZV zolUh4N+3gLzmT)QO8!77<=>98u=E?Ptz<>(L6N;z`n#M@&M1cBlnUzC+`+Zw>bD&( zcQgO^0(NfN-uak`mqMYLeyV5eZee`6?<>=CyLB7aw5i2wkz>5_0_y&w7NZrz%zYzJ z-;d%mCr17ZHKzu%%5dPEe01Lf)8s?q+7Fa1sl-^CCe)lChRBwf8!7R;J8g;uT zxsnGGS?OZOw^PzG3@PnZJXL2_3{UDZ4#{6mL6qYnX3BX3h-zEE;`BW zNXDDjwxS}VEl+QrOOC!<+?vq~Cs9(qxZ zwmjjnTUci?H?{YINfmU|xCONk7Xlx};pW-C1AW3;Q`MPtJ7% z_+m+JRct`DT(1lxklT!y%TDHH9bls!tBu1t>bd_ z-~;R{xVdO5qnmc|_a^6BO3svn1wEtOXeZ`6`v!4<&wjy&WhT6eYx7ACwI09T;bugO z7@c%T{?Z>tQ|i~`TT|(sE7Pj8!OZS0Sv}KAsvp>Kx5`d+WyL z^-=~bO8|Dkn}nVzz5npE#sy8>ADj_An);K?BhPtD>tcV}i*~mlk8}!;;uA#YjlUmO zf-PK>`Hbfn+KlJ!mZjqY3n4pI#2-(^I-jx58i0{fPCnE|t^Ib9+ow8<%=&SunlcC& z&uq4Xk}7EIC%uP_y7R|Q1%&EDRd)HEcs7>Dxo8C@G}Wu)6OwzJgkVZwjEH=Bq?nkV z1%7WSYt=2;rxjg#*FYfN!CLzVCE~3AiMe;&*`9lltC#jLwIwD@(PCrxYxA{jlWZw#$HFzPx0(xvoWfX;9(RAzD@^ zSDeRF*lf1@y0Y<0GuT;uqgQBr#%5koIpZ6{+m}6gU%M8d*W(DG;@?{AKGCrJxYf7L z&B`s(^{_P7^psOsiHLp<4;!2?n3yuvw=*y9efJOIO}5Ui76;95V$xud+aYe2?1Lng$+XrqY` z`*NeYI@Pi(r&g+wfXfWVO@IfiFODv?A}v3p z2$Q|B5wXMKx-GggmPI}i!)lRulR3U{+7V>B#s_vMNL_bPCDnsJhUI!ChAzN~B%o>} z!%k5Hsi(9Q&NmxSQzsvq&jJp51suT;e<$0{Z!wx#r~1ia+OKtMkwKzQ4PrB>)0H2) z#Q7&}Q&p#Kh)UpL8~?3sSGyn7dckA3&u-Pd2I)BoPq`iy7ya3$)k(I)uPNozv5=?% z^3Ut(U#L!UQ!QExS#BHFUAutSK{BbYk@0ASyl)PIEb+=kWM>w3@diYPerL%OX=h$y zAj~U1VTHj~*=~Do>K@9xG&kC41Rv5yLm}_b2+@l3~a}%L|@|u2JnJHcr5q zwLa?L*JEsccik~sm~_q@ek@K$^u5_JO0|BhsGF&-oN6>vhy0=rxyQ;B_`;V*`Y`X$ z9~<2m(XN5HK=Kp_BUawXl#8oVK#aaTA;0*N{4nNn_l?MyU&G^ab? zNvFVIzp11++w@=|tVV_7%)>FP#DG5JfBQ~BYxmxu(2>%IRidgE4M7~8b3Q4y>B{-1 zla;jAnSHe)(IiRdEyC7%=g%kk4ohiB;00?m%*WJD-_n)7cLb~D>#q;y6&XnLj$GZs zsR))NtaB!GVA+!1pV!@*C{JRk1ysX31MMdnH+V`1R1?>e)(IA<@Ba^ zh`RJIBSW|1XPa|1s`II-tYq`&+h#OGJ?D2LtBXiN4>C&F3~$Oj*P+><8iDavPMzJW zPI$|udesp0KU4}F8}y%=IGgP-5jIweBQw+nmZgH+34 z5!bg)6=m}NlWzA0Pdw?bu7pV;ca?|4)-94SPgYNct2X*vz^@~r2U37kQfq)JR1RU0 z@T$9Kx2X#sr^h)NPyOQ_3Xq?V;D^Gme_(>5rd*uwIcCi@NitLUL@b3MqZ8NnT_>kV z%w~6{x_01@m?J*?NVwBTgPcI(Z+AJ zw#taRA?BbpVeHNHMNs)|kPiWeLX@o>kn*Y$4SKX}XUQv2lS9mV_kmpG)$@TQc?<{g z0(cS&b>XTVr?7630jv$@iD4@;c@A;Sk4q?-jpZkDEUQ=Smql z{PF~xzP=585`I6@<}Dw*-$szut#Dzv_*M=V-@Y5TSl=wsvebV6HiNYK)L^4CnG9}v zY-XYZe*ceKr&_kzcrbVt&zA-2-vs`|2&=zzabM>BWQ3gQhP!3;q%wX4ybvUmvQS-g zNe+=Oe^5fU;QH$s@LS#j>saR+Ft;@i$S^g&!|WmV@XF^#FMwy)?u=Bc!6|0X-mJ(u zsVc4fZ8k2_qg6Fszv>Nq>pkq{d1pIss(221l>!k zqzQt3-fC1ARu&=3Y3JH4^i^Do_KzPr5Gxm+Ka_mbp$Uwmcf~bpbhToWs3^a*T08jq zce$^Np4K4Jq`hpE>z^Ph@1!bkn(g)U^ch(Hvxr8&>0LO(*{C7L(aZ0cAd>y?oZYQkPw6r^Xbl!X zTJP^%ffFoQ!UMyxJzAR{T(`Mkf%H^f)v7*yC%P=&WiVo|9R7sgB~L2^Z1KGkjphtH zq_$aYKZl!i8n?lC#J~3!{L=W{jhxh*wZV265N-{FNGI)e6u0o2P! zx+s}P4zexaUYo(HxX^CXt;BA2KpzjTKiRyKG!(>%!0K1h8%6KQaCo0f!q|BK{U#T& z5OTKLh?Gpkwesd{p(XHz$#R*sZxU+K|8e;0pME*zGJ+eZK5W*O{y5n~rT zd56*9=-z!sZJjdNEN2b%%w;^&`qbbv!IA$dH0i;e%|5?)+iZT9`!ISy2K&h3q~T-h zjXLtb+n?@2x#0rJXJvjcI=QIG>^)m|y0@|W)Oe-YmIi&~M~dd+#iV zJ(S{AMmM(jiI1U|^4RNq(RpU6(J)<)whcw+7tr^7lvG*y z6%4X7_a?)+h-BPV$feSIu-{DAYyTCL$yOmS;f({_Cf#Y{!{-?tJ>1%MTp?J7YSejkYU#dNAgG?n0?KA@3xWsdw!$BSGAqM#IGCShhocWJ#_?jtWybmwv4ArjrhK72#MvLvrgnquC=zG2d_3y>Yg$ zaP_Oi@>us(i*pwac#U-ao%b3sztHrxY>z=VBg^6G5h4^%e%^10zzvrakIZUwmc zpi)E1egiN~>aJrnG|H1#OLMd`<1D+LDX^2x)&XkzDZ~}wEHvuYpwY!%QEyrc7<2(F zX5!dTQd6Nlv$%2*>(!mzpDXm?8BAt) zVf=^^ss7w7xRKV~bB($kl2Plj!xP z+vyPOUswDX#~UI&VKvsnSgEQY~ce+ zU*y96+b*&@b!Y!~sVfC1EU8aqN!Vp1J>(@6(UtxV5X@Oo*asD|9(#+y)P>H7QcsS&#R1(5&Ly3Wb9D6tF@Tcl`WrQ z8^iyuwNV!XI(VLU&(8(8W@B9ufjV`yRKb*@v{Q?f?kl-e-MVtm=__bG8+B=As~{i5 zNcw|#g->h}hjr4ywl>e7sPu2f0tQ`c%7)4fI;?G2%3%(7ym%PR+WE9{lZ3mwWQw zKLMI}Wgq%*;+E(0HG1^iHD%?hzQ2!OI^GOUTwOysWX`=MFoh$I^jnh74}UBZ@{gEp zXZ85i&CFPolm`$zc$an!1&GN$m+?63q(lqCETN~11OF@!#)GXK`%nTcpIj}8R0K45XQ=QZw$)&cW%J)+Tl4aArwG(@2IKF z{9tbHftuD7*^PSwW8)NthCZ*giCW0RqMQ0K4$jQS{EQk5H0x)uz>yJnlLA*-czwij zUc)J0m50O|rW@t^urf!J=o4?29;sw_+}gV4K4Caa-Zr1fvmE~?Hux>l?w#qRM+6te}Xd)Q!a&A_Q zrkmZ9h0JaP+4Fu{&4zBoG#GgVmP(miPSb`GJUBN|zO)BpVLd!O-$J%v8s#uO|74Wt zqD5j|0p9^#-90er9rSW7*rdz8-PEfd(wysN*sB-26HI-Ci5^^p8xsx<47dADdT{T5 zr1{gUiiG!^_HGTnU%fl3%E^CaR|^G1B5%FXZr0YU5V}llo<6YwkWza&y&1xKV(s2pk_77nr(~7N+mE9(YWn} zF-CX5HrA0>FeXV>x=s&|9R}=PlIPD$1oBa%YcK;h2iW+XZ@-LoRGurx)Z(G6NUNLg zw4+o!Fp(vOdl)4f9k#*_sbm~d<*B>=QRpqXc73ELX4#F&u&uZzQ6s^C-Nq=0UF<5c zcqi4DNm4{}R({6yg>x6>GxEwBO7z=j#hAj>F0B3jA`R-S{EXhqeP482ROfuN`+88) z+cZz2qkKIzpYPBCVeeLWCpzPwJgoJp;6X>1-XWQoaBCK?jts@Bf+cKYf===2YZDU~ zmxp&O!1M3!W;R!-@84uYk?;3J&EX{!>eOI`*-$H{+wT=K;&-!zvTaEs%hrg=3|6#j?$D*RIAQRQ$IoUKn~IQaRGf8DaEMl z26}S~EaZK5OTK{w*Zpo<4_{pE_Q(y<$zokwQMZr!+TW513-9?*>nZsLo%-l>qHYFD zyGek~tg@6r71`-(*Nr}!)u_vH6yw0!c2@Q-PqgVl#~7_y*uB`4^3sWN(Z(`@Gwv9- z3oP^#$e5%uWjxC9HqTD0Q!f|yHCS`ya0ghF2Hc443WbawZrAFz=PQF9z=d zIG8Nh9ItSAydv%{cp-y9Q|@?QTo;aI$0?^QQ7y4RzDHir$PQpQXRNG0{{Pl(*rlb- zbPsl-j0tRw%z^ad4bjjI`#xIe!JRm~kwFgS4zuns@$U;E>u}4+%I!4KZ>PoYnH+}W zo%gh^4K0-oaz~Ooml&EEnI5yJUPxv`lkRP}P9^{3#3move5?_F#`@|utpg;~G&L~i zC4Uw{cI-VWWRB-f@%u^!q@Fe$g7i*39C5tQFU{JQHVx+v5?b_E`~e{bX>K-YsiTfY z;c`4VO|U8tXCMDyDfLj3E}~NRzd;LG8a&i((w(P2!9{s;zRb@Mv=X`!)Y)xG#X9)f zM13mW5fu>hACG47(oZoF9Hw(2y1KvLl?n$zOJ`xFrkDN!dfiaZTSZl;h*cvnAYB(i zs5~w9%Qa4N#Wi-PgsIXvCt?=^+E(QwCx~gE9v7~|)lvp*Ya=sfx4ONw1DW|YlAE8E zn%|oD;tf<~wHXgporfx-75ZKG-K@2#cl?hpIA44%kYPw1=8Pv5IwZEhSnJ;5Y!M6xX#(1WA@gf0TPhK)zDPC@1l?a5@u`w7 z(YS)K+u3yhcU&yq(jm=SogRNuT-%{;SZRAKFNt$~I@hm}KEAa=pR2BxVkO?W=76G{ z61*Yh(4WL~KGw)}BaB*$c-v^H=)L!0UJU&OiIQC8S|wkx7A)ht^8CXYyR6BoZ*RzX zlvyc2tMv9;WT$U9Oy+XKEuqnlaXDfKE&XD;vPM^SZxQzW`H-@#+A+qg-bd}-O6yP1 zKN09ra$TNxHtOW3@1O8UL%x}j?HA3sO#S6gje|^~tCQ06+FCA!K%un4Y}($EJq(8~ z%vFnu=XK(KM;Y-{u$~_Ft7(#LHEA{&IdFE3a=V#1MvV`w(C4TdHR(Vn4A)aNF_)=rkPu0!Cokd1ao8FG8oE_0vpB^}m1a*HHOhEV6XZ z&$ZS1w7o;SL4EsWK-N@cgxTzf`;Esy002wisL&6AsqaC~&m^MQ5^5cy1Ef_iI$?$jWot%hZS)9D&pD~~fr&;e=p~w`6K`oXrC@}A`Mm;8 z2**DJUQ};CQ6+`T<+da_M*?8&07)>%L;8H)=av-C8}SV4JS=ZqQ;x#7`R*MzX&F6= z+KY(QKmWMskntZ&uFCoLW66kxM;#@o8?6_hV?_=m_4Co`#aIqw>xsCsT>P>(5KwF1 zzjHMb?Q`_Vy+o_mqd`y0- zO!1uw8QfT6bsvt{w7m-zN4~GMB>9)4Dl;q{T5e=BNz$L!C0g}x*bt2mjA#l0XD0N&v zc@kd{i@C%M^xleH)-m*7~uSgr}-eUHt*FP6m#`7aq3NCcY0SG^x&A?2J14 z7cJD4VN|=qUjHe%8OI$mQgOLT% znp5dr6EzarxV#QNZJp$rOV#>S=b}x5J2ukEsz&#kHT5FlNM^XnWCms8NJKGy#x-h~ z0Uq-!wn#zm^_30_<1E}(>!$m!aRn?Xlxf{J8LoZ;Y%Y>=xpoOKv3EG5WKyV`a771< zl|G30-y3S{RbGZHiuLxtZapwD{g7T_G}~g=;7X&nB1y*if=aC3HFsej_`A$KA}_^s zs%L4 zowpD=cO9WMOV*rby=xDht*BPH+d*~jGF#9+9a>-Rl~}UtG{05+z+$f+ANa3Sdr5uf z>shtg4k2+0-Ci+ZKBsBD09LjRR!DArkg%&u8U0S;hfTN>$QN<jX&(JB2%w5+{e z3|xHUk9ISAh`SA?DoJ|m>Pqe?HBakGa*Is~$T;XXXeVW!9%%lE2PRXht3L|Zy8h8T zGO_vtvuA*mgfMu-Hznumh;6hwS({Ux#8RA-fN6{!{W>~M3nf_9dv>7IRbv7JF>gN@ zOF1xQR2#HbBT_-5?42d-XFs}n{3@-S&VXv0SHFEXn8#W1e7-?)PSoYC2Y#*N;!zcD zqj<>qKvbO%2T>AZo+14Au^f!P8@S8!z_yKDNJFL+MUO-ghXgZk$RjLoHgM_Qs?|mf znYlM_D0N(D#GK;NKAPY@WPNlEp&os*Hvo9Aqpq!;PlPZ5X za}%u$?(AOl)L^CAxeyOE3&GlVtgP0frdx&A9^GS6qB`aEhholwhr8KSxs^!k@$O5j z+6klFKuDcOWJi5fS|(1$HY1k$`b1WY2CI%}2~g;0>Jvl}XG@vUoROrb#xpoy$SDTD zekd{<4LJr|ABc*^4FJA9+*nQ9UJ5p`Q zM01kL&F*k?V7Zip_d85Bhj9KvW^}As>M5Bu4eFHsHoX4$2yPZHV0N?mSfhYfNd-wE zA>4YZ#xMOdzzhegr>+(sWy8u%x_<9?Kfz(sPr;RBLi3zVJppCsP5)cwDWYninxWAb zow8dQsT29W)W#dCv9zp8$kZamDa45kfvrmcuISJ|&mM%5@6ax8h%}3m|I>OvHOlJI z3zL2B<-_}oZeohlqg=0U9X-MB6ynd0)eVk1zHy4WMim3I}5rW_&VA5@t#eiLp2)kVW0 zQT9$A)qzdSDdLjn;jq_sHY}D_Ubi=2_v}CO&5{ly)vq?QTEtnIxh>Hm$wDogBu(;5 zs=bwN*jM~eQt(B5G6~NB%9&==!~geHujx}MmOJ0*cWkMu6*O27XnyLa?Xy|tuay9X*+KhTk3^n85C!-Rb zt3nMSYFdUE#z!2)6tx-;Sepe_9){5tN$CF}b zl&eq6ake1`34Mn9I9$PcrlfVJ)!-HHcul_an+k26?ar{<*=w-e=pdIq|BGZB z9@#60c9^sbUFZ#Hkc~XfO;6cyT{6hE3T5&EO8FJ72NcB_rnQqg@fRCTJFAmfUOIOs zn%T7a&7Bl>;+rZ?@_W_I+wq%G$BjlG1>L**=X-STk9(0==g}=@ABntxdk!Z3Zua$4 zha5zLv}d`G=@@-A^a~Fw&-YTse}j)ipM4{h%JTPQPkQ`TyH-v2W>uj>xArXM$j4q{ zWNqrdPJz=ueygNkoJ&3~aPFO{G{T2Jw;0unbf^Cld1(98?<8-YnC!;%MW4lQIG3`s zod%)XaVO%}Q!u~s;S*Y`9zOkr8&crfT&M??oDkaWrrDiP8}mTwvQFdF8Ec z4Fa?v$IHDroo|Gb>xwYziKB8oYH&?O^uUQ^xppAg zKFIT8yY~neKb_5W(SqMm;7ITLh@Te}OSq=DJS&^%!(Ani_FkFoHju09%D0nGzoO{r z*8UIY`oN%?tHpq%9WJ`kdT@-)XGB-EN-LdeRzD<{?($2Q9M5Z8?zJvAeK4Aq*1`99 z4d=4HvU2t0HHWr40E6*GnCHlgb5Sz9vHt$ic=zWHl?!@zj}rLMvTe1tq_W?u(q-%PEJvqA2h`g= zK;s^Zzy?>9!IW|3pIk*S;cj?Kd2LYM)5E{}@!xpEd?;!yyTvaDCTo)0${@o&J{on` zn+o;1)w`MZj}BW3Qz-l1UF!Fnzo9DB-+%k71kAtePdd_PUue|RCI0w<61*rA-pxg$ zyO%aHU2P6AyP|D3Rr#NiIM%&bF=iUoUftf=Lc>%tpqjv#M$%A?sB!}qe3&Y(+`W8_|Lv> zkI>wQ>wiAY0G!L>N214$#t!V(=VoVgCiwDuYJpQOy$^k>T;AhypC3Fw8}Oem?SQo~ zmti@qGyem@oKK(CILb2;;YQ=6QBhfPeX(h2t6c}v!XGg0+8Q-~u-(F%)RT|L&h+f0|Hr0AEiMqrbq_=k&%SGHB9_2WJ{F3}E{+hbK}_313a8C-hP8cR)_lke2M z!~QFk*0{O>y%KI?MkmpM-4BQdH9E4QC9jqruQexwffd6OP;67Jk6v5ZmgCy}|Iz7` z#~@Ga03DU&ch66>C#1>J>32wxOZ#W5aGoe} z<`)jF(6j1K3A+P3ynhb0u=sU9qlbpgb9qcYn?yWU@q@~}&lQoBa|AZXTYM1m70%va zhn7N*8VxklkEqf6X3Z=$+}~`Ri%(N-_v(>injIDDHvg2`q~|P~`jqdE5%$3vovWEM|WJx|9%L9|dAMEAoY$DQ)u5wWAq?6vMnq#yu z^i_VmA5&;yZPMYYH@>26PU&EX<`19XTA?xo4>5Z78l0N$r!>CZJjQ56IsTOuyB~L+ zE_hDfT~FuJV7B76zW?^xNS$yuXbT76famS}~)f8d2m+lC! zt=r|zyN9j`)c(!+K(}u6j5=QNd{pYOtc!e;9}Ui1=<}C}m*pBrI}Idy+uDGM%CwOg zNICrzAqeCN_%ht#O*xzuF7jJ}dK%q^u8f`>g&__n$Z|IL7MYGNTLL?KpS;PzoR^*? zSvtFoeLGj&Aa>ij;s!CHIwM;0M)(E zfVK!)9=fM$P#~r?Y}^;KcV-H0-Y4^^z#~^_LYn%lp2lQCx!KR0fqX5Lyy-y?rxWp}DaMtY+2NBT7&*-bb4b|+xp z!R?%pO;|Lpm(kKpG9G3+@nKOkrwjO`_1Uu0z~{Gjkzggs2h+?t2ZnQ=?U!#MWZywU zKUB>rI;!%h*}Fp$hu$NJ20tFJF*j^F#}JoIGx~N)mCFY2KzXRZdq&q6I`nwwglYf_s;1+|~7i`32?8vx;q^y<~LMIeQ+-%iL%~KUHQvVTz-^fOhF_;U zN1cm=MSDMk{ea;Fg(uu2Rpjg8z=JdZ8`slYKFUF`?V-C&N zC$0Z}JpwBcelpUoW14KwTqYS>hwdU5_RBMF+L{|e>TIz z8E|P3BJbot*8_+0o-l>mrYgg6;23Xw9CroXXjGSzw;GazAx90XZBi2#*sZ!!zEMky z^WdVGHq56E$CccbAT{4s(UMhXZI`q3VDPtiHdwM=jMCS~659^{#fL|?Hoz+J+hr~= zinp4b$B^WBFjrqPGv#TZ&!!;C;d4{4Sl0O;l%{9%2OIiO-J3Z{sfKQ)|IQGc;I_l-P{9yKgq%{;4HuO4l> zUDUs`5>u>bR*OXvUCH?QV;E@?ZgnBwr8kKvjaY~;cW1d&!0=lnqwMT@rwxPV?w3iA zU`+%|2XA#~8C}_bcQ+PEDAow)7O)xTJda%_tj%S>)H;QPetVKb1|RHircL$Xt4d4D zo_}04RGcxLLFxyuuBg{1En_FUsXp{FhD&TRX7K9|4d?JAc5RK;rOY&g@nTqV++)hr z-(ZC22UMp-=K-(~X}Or+l3OXJhTT7O-4V5rwL7Ao2yyI3ge{e=2%XrGixrUPFW=K5VRk5>F=PokZC#RHwTBIKP zWmT6-SW?3b)|_G==&}o>+9KJB?ox~r=~nwuMtY|tymV{A5iPAjl*!*n_3_@_?x$1{ zturH3_DzqJlEs6+HTtj{-9!0UP_fb^tbF4izgZNQ-KB%;?dEjbdbi;lF5n=-0cEd29C`qmCBX2foy@GrC8o z#T4?-N~R6)#P4p=>U1x|wzO1FGJ!34dk42kk6yiBoVqx7fZLl4Zus{K^sa;~Fi-Tf0tmA#$c0e-}h`F1s$Yo;ej_=%(HyOnC{ zG~=6By*ElO%HB}hqy9TZssQm5PZvaHM<42F1bEe$%CdVyqUApJAOJD-Zkt- z8i9^@ue6GC;oe4ujaUb)g|X1B8c#WGfZHijkc-4=wL{&zaV5$hvYf+=??w=v1+i4Den8;6y+UAI5j45rz1ht2un|(y`(K6CzgisDu{Xsmy@N zKzDxr!>F#2WQ+|LSoh;U^4=v^y}lrL-I-o3tR+FeHI$x~VRwNNlS)Y+bzvsj&K<=a?`s z$|1rv3kIlR#%y~;?4eEBByYwir{cj-FTVZ`!%3^w)n@P8)Hdw`9B}Pl$iC8X@1}tJ zvC+)`Rw$>d-(6t`slGBTtK4hW@0tuozLH1tq1G91D!l<*jp^n3@4tc|KfKTExm)Cx z>m;Uek?O|5f*KMHTAbs1m)9Cy{7R+`E+m}BN(WEZ`HhLzL}LIhxTu|~Gk5~lY)zzo@&Q_!h^IX=T^Ki5spWpwK>i`l;H z5T5T{eIiCVo^We{>)z!)zrBQpP_l|WT^Mh*|Vd1#vs2v>BQHZ1WUl& z^c?Aj?9{BK)rpg#K(wVTkC+t4`^e{0Kbq;CNSw;^PZnL6S zJ^2xKJFCI{W-}ai>PcEj1!~Rg^c&~*iR-{yAt30hW4{zHqPjtY!&l_Bki}&k@YMg= zO(G*BtREd#Wh z*MpVq2$$s2U?`$Xw_QU29M^<=dN>uIK1%~@@T#ewCl=diA0_Tnp^@##7rDI>jcctX zCjq@Ub-WP}#+QAbua>-U0UP(<6*hqx&7y*gYSe76L|yw=b6CDEy45*=du zT||A&p>8W!gA;rn{m>ppykjbmjnuCwewTQK@IE(&>cst!<{hQ`Kvaf=eyxL2od#W| zK$&EZPjyx#(#de22g(!8CAFNt1Rl8t5V1qqHeviC`p<#K`l^AI9KfXcxi~kVeBs{bvujEI4}| zl1e&4%ZO`W^c_Xj@Lxzuj4M0e31J0t0E4VmOWG4I6|-`*``9L=3k?NKR{Vbe2 zFrObXdiMbvFX6|MiNq6eHc?Lpnd?t8t*a{}jK{x{8&gc)EdK2;BV8^*yU|A0oLDFl z0knC!@4qvZ!Aja}d`)$BsZd@~_nZ#Ca4IUZ!%|uTg|v7d64(FCEq1C=pILXh2!!9I z#`l_;tdtO_La5;zX5YcO^4%>yjDO@Hq|X|(tKFza`Tg9ER99tX4YS$^$nx*FUl_%3 zbV*T|p|0-oA?cRa1|bc~_!9*aHC*y*A<|=ZCj~-pUe5Ysa2d-h7rPCN03BlV0e@O? zxi|>d4=jeXtQ|#u0e2`Q<@4(USQzqFEEehAHG$GZUj!9k&wx~vNr_O8SZFk`&HKA; zS7g=7ZGCE$X2PP`-1<#cOlyGCQP8hR56nmH10IcdM zH`~3bOeGpnIenHSOwf~d2-Mz2oO($G_M9MBUF=H+e?8J#86}k$e_f;L`aj#;$}zCg zn`-n=cV*L&8f;?*i&DMAkoc-U4&{&J|0sx!y#z_IPB9youy|^o(ThAkG1+Lzqymc< z!~Zs#_Z2NGEmmB!R<1_}J_5glhn$~>M_5coTL{J(cD4rpR0v8t3j3#id|V1BBkU_X~BdzXMMPpTGnhEBZUv4v^4x zTtq|1>>4!$)((IW*XRNZt#u(E7o``o;rd`y6V*DuM+#wia5#o0nrMF8*0v;hgTpo} zg(v&6o^J&N?QE?ahp>_tQZIEqJviz!pPxM9b^eGCAf7atcDG9eR%}RegYU?<%DU8f zN!eA3n`*R{0|{{uOn_sY;~bxSK!fA?BLxoxz0NV??Ox9D&JW8S-f6Vf=B1Uu?RBb5+G{haoL&G0`<3Zs;7ZDZT=;d*eX6#(- z)Rhy*tRZ|n8Af2`7Vb{wVg8J#R21C#UpGd8> z{>ogB<+n}z$5@Zg^uo#^*fIN7F)+rTV5P|kQ#pv5@X_K70@=vJ%QqC>Y)h+D^H9A)d zOAbMY9$R-I6~UP^vBJT)KTNwH5!N-Qu39=mVJ9m+}ul2^5kx?nv?$s{hw5~?aMjW5=V zA<|l2l=+k(jjp0tPV9E?bK>TP`>L*@N9FI?{NM`@=A0y{yN45Pl9N0j!OznR1;-Ot z^@*069TS@%u>TNXJkJg?0D}A)VH#gM+EUZdzg&0BP7jte$ zlG^2vR5IKa`h!fjhjoMlg`PJJwcAo%$wZGDzhh<&r+0UkvS#v3enYBzSi%B|@|i-b zIL}5M&CYGz2nC_wifZ-gZ){5qb~fXWQmy5@Eae57is-&gmy)!tY;k`l-vhqFO-4Pc z{InNy@a_Ifa-HNJ{;=Wywr@~M(SOPjHtXA>aM_55n-d7;XU`dpY%owp$)0HI)IFt4 z>b1ZT^YIFi;KmWL5Gf^~X#yhIk*QSMn&*4iXoqqKKe`E((<@_tFB@~2zvKII0p@hT!_SvnEy%XA6wF%^9m=;v=- zoM=#$tjPi!Z_y{nMto^LM=Ta?$^wbH;~GyrED3p|iJf*Y&d^WN*B@t=xgB6=pIJ!L zGwHiAO&SN2NpNDbm7a&2_wn1vXrC+9>v+tZB9~)MlQgb(_C}y^J{yYB^y+T*ds)=G zOgt_5MxaO6%_xQ5>$ZyZv8MG_)u?;_Po_YXCs}QY(m!|D4NT=t#PQtaZff7C|mKHrJ--1KW6TfE&}C3yVr$7*PR z2Ofb}qgUR;Qdq;6*qwTG%(`5tIz`hv43OLx4GUv??`HY-#ra&Xt~|5e=Tgpm8m;FY z_?1~tlCjC{OL~V6+J7`mQF#g|{<<~5x0_V!U9-U_A)U}V7~cak0+NrK?<3N$C(tk6 zgOBig@g?UNEe8FUpBYUfb??iGs5I-li8SW^x}%H1d~a)QyLwxTAEJH&h!R974;^I7 zHw^DkVC6=T##X&4rt&SV9$RfLeaGwb=+C=X@DoAvp>Cur;R;R@1_Hjs^JH=?xb@c+ zP3rL@j25__9fI|Hs2^07M#8cqxLK>eqO~UaD$|4+i(sU%Z-A(U@cY1yNnT!Bl~s;5 zyKwlPxZkLz7vlS%0AtR(B*)eD1b!btMo-(w@bV98J+--^5Q%7rQuwy0W#~S*lx_gs z+Jh|+nn4+#;0T@=a z#H?SWTe(AxHo6X$-$5hDj?=UrV)}>iX@6^T8)^Fbxu8(m)7Z!v#Y0c#UBUwf*(;FsQ$^3Nq^*LXc#bUr?Z^Xnpvx$=)7xp}9) zxI$64`H$VoYM$lb3CU|BP4Udj&E}ibb06d!(Qj==qfHCdG7Y2r>*r>$uc~feY^6px zTskYQ8~!re`>73^xG&|}o7@^eqk9GAJpM5-8ffl6@l2zaN#avZ_iNk#zn6R?PeVpQ9PguH)EFI<0=(W@)lTY!sWwh^bwqrD!Rc zV%Vivp;lc?>TtS+bBQ+8ozh_|wB%+{OjpO0hBfQYRD5mGip02*pQ{ z45xF;wfQ3aQFrH1ZatT*=~Q<Jliji zaO(eAZ*m}C{*bG{OMMmZvhD#F;hXic29`tQ3W^jO6NauXS|JAGO^f6XiM3>D&X=)t zO#(J{ieBVD9Msj3qwF@35-ouC>&4tYf1kLvz6&W|K(VXFl!WzX+K_IqY*&6rr1$BTc}Nl#fqPK&XxQ{xqS#OucL7hh z)>9mf8Uw0EmDDg4`qV$-x%Z!lOv|C6$Bg-(WWa&NU8MS4*>=9x6sy)FJ{JE9SlGHC znr+c7TXP|+vPwfJf4VC>*VvNYll zcq?-osCK_r4siF@c+GkAqI$%vrU~J-@kUm1@{)LUe_9qjo@3F|-X@*(zm*vl^;@G^ zN_(is?G75+M@*hH;bw_38|x1sOEIUQ1VN9x;IuQimkEN+{ybZ!11u)C&qXgKQ-nEw zN27Yjb#bbX zJ$Gdgo{q}_#1L78*pvV3I=a)|o1&&~dS{D7`qGo49M7DRa)E7@9Ta?w(KYz5Zf6u} z?i(@i-Ci);F}mJ^gOvvg<4yEP`1GbEF4AYcnujP$62@}u^Ii0cR)=?I?P1}^Vn2k> z^|za(f-2b=MFFfKWZ7(IkfNd`0!HQg%uw~O>!qBhV(rzi^id4)EL6h>6HTTb{PA-x zK?KeAQr6S&o&q>x$F?V?~tvhS4jCaQ6 z_D&O6S&MW0$8m!*xoR1=X`GhG3#bB+dt0Oat{#a1YhQm$|LCam=CTGxaxl`?7r32Tk8ToihdKOLUxTxZa*QvlO}Jy%&!&PUP$M}U1G%meFoJm>tI7Bj4N&Q+PEh<;{QL6BH*ASQMyHTYuD(?OU(myy=?z&az@?G2EMJY z6K!$o4-UxqKkuwwQo0>X-eRX!YNH$ehtOkg~xjM(Nd&lxQohm~y3RLMw-I z`DW^mc9ACAO1PQ3oE#sL}{QZGZGaW1^JQ~HxF1G366u-sfHgW+Ae3TQ7cUkaPnvnaO7k&MZHaN z9=8yI!Idj~|$_0tku&5PPu8WX;o{~@k#&_JTbw<(T z=ddLI$*HibckO>kee2I5dP?lWWIOY5E14}@Rm6dKOFppSPP{h13@dQndy1lj<8Hq1 zy=wlUymjwA7xNbfyfXib+N+XsDR_AO9sC7QET$iuw`j#*_@8s$sI+v9Z9FiKv;psV zk{^1fmCWX^u>Yp%@{tpsyDd^m`^~av_#a)2_qi?@Q z)Ae09O_dMkuD+JPjHCC@;@iq|?_IqUh43JodT%f95Z2Z=dHWXYbF*V_%>9 zDC@%wM}7J~tk>$Pz1yjkM~(X}ZazoDH^Z^K*7`g3u1s29dS9eGYK>d=EME;*jbF`Q z_z{mGf6Lj@KX01P4{)POApnlJ51X|-|A>5c!HTDN45Z|e6(%LuO^LBy&u{#nXFeP$ zN0?qRD|Dsf$#67@91+Xik{_JikcIsTQQzluq%(#hY z`eRE8ioh4$*tD`>xYiL3mM^@U^;=DId2uvYIsReDg10QxR#rR_t z$O-@Fax>Ju+l%ccQA!+(bpgErqIihUM>x#pwOpJhA$$lTS?9e*+z>R zli*gE!XJCH=0}wS-`>t~5Fe{!J^OwT8GGm6mpF{DSE&s_i{Iz#!R;HgM)5IBOZU^i zLY$x@XY=pG`&erdCQ7Msw;*Ir6aTt*Ol_%JdWhd(IFM1a-dy_#g#cFT(+gN*s4Hc{ zt-F8Dq@z~(OBSbR6+HKX{Ax58`;mv6WKtozN%M8O3X;z2rqm&QEX%udq zExqWBIWH$0#E5bE$%$G~<3<(!gI>PKY0g!AF81!;B2 zt6EuH^J%{P8gl$Kfts>4d!1T&x7>fN5X(3m%e&jjED1TL?A{zW@#}eVdy<4-ESbkbV z)cE-4Rp@unB8yBO*ytKjLQyx0c)Yci8m6fA^QDtGmKztD>8Ujwrhm=gg_i!1^%x&< zvd=rv49q$kj3I2LrJ_VO@0Ihv|8o-z{wOj-zO%O)XUTZsFq+6eemX{kar}9lN>JA8 zE_m~@5t&BDSDr&Z2JetJI^u}VLmP{~RHXLEXDNCf%Q&d-wVVp}O0rsXnU*GT)*W6I zj%|#3GY;M&Lfp9-;TiDB+J@?~`~K8MS%vWm=9`pL8}` zHAargG)uhC^rI-`l@SJfN9yR3&|;=2Aii5m=|PVvW~n%bS4Oxc%%hx{FT-R0|7~U) z&Od*4+jQlPwM^9XBLK;pq3hAGcRR&UL>I1=HJ4Tul<7B4Ue3vtOdQyvF8P3()oAeE zy-)CyKYx%xCfhe=8^tW7+UuRQkijZGmgO8~%^Dc0bzeau7y~G=x_y{w6HPh=ce(K6 zY)UtNJ2Bgl*A1-%AWFd=WqE&$-tc|tOvxS(mZ>)k$b>ZF@2y$fZQJhh@f)_#Fo)+1 zoC)%#R$MP!(EV&txP6XX%AqDw zG$056{n1J`aLrS?x+&v+r&y}Q)3IJkn)5BOF4$*wMuR7oo)33i`y{L#)OW*1!Y_3j zqyB(L)^JYBjU845CG^)2Ws5;;N6;jn4n%VqYx_P2`vg<_<=VtNOSUq_sW;_*xJcIt zuCxuzHP8oTpm)7rg?mNgUHSVotwLY^V_yypbHQxZy-P>%6X(vW7PjfgE>8tH z`I^z#tTpS-7>#bA%3Z~I7WibK9WZQmsQ4}6*N^6N%;hiHo^Ji6|H5YVUA>?~y`wl& z$E1V1Ad~UI49Uq6cF4eicaO1~qG+y32&Z`D4%B>Sq+Lxh$#ZgVS^0D;-Uu$JZAt7l z<8w25dV!-plV*LqG!sOP+ZMbCM+LvkTv(-!zP(act6H>D9rKR+u+>}ONt}!<`xniCBB$69<;UkOf2x! z^>YQY#@ucO;ugv5Z=+?GjMm^C@|&N&5c$U5Z>O2U)N3=G=v6!8X~JCxuFiAG+)T0| z>a4wTChX|He5KtYv04*(z2|{^+5O{7?IxitRU1)U*!yJb=Z)f_M(sf`h`<1X!k?8X z)w(-lMKSi)M%wjo#X=r}Az~t8GhYT};lznh)=TYxjs3*g+0H0|1VLeItB%|O8K@$( z);2|bAfvT$NoZfDo*JLNa*I*oiilZuhSsio(dV#V;Z|%=PL_P3x*?H+SgmE`b)xu? z7s*qzde+lX^wOLVvCwYJV^>EseDL!rkxq$h@K^%CnKEuLe~wc)Wq{nK z!Q1@lj_v6EwiiXkzowPz#icI*c7^BR z(uy(oCLn`n3)2z*x8We76IGO6ZGxs~3pd5B-UV)*1U!>z3bURwix{-m1zKbEAZ*rY zN3>2#TXM-_t_v)sI&|G@Ccpfpu~OIH+H-ZJAxgk8Z=XCpbuuc~yXWOg;Z$M)c5q2L z(kM~(g&ww{5IegI#6*1$tWeMBRa>O~W4oOaDF@{-(g=#aeJ|MQKWItt)BAiN9Kixi zpWX&(skg=BW7mP&)#j{o8xhY9ugPT5m}{2{xwQrwKVQzWvEik<1%@}PxCGQMQyMd3 z5#;5jYbk#C>sqKrM8~bkXE5ujTDY%U(u<|!R_YsT#n`+0=6vhE@7MESPIFP5n{`lFS#{Y_krGSDF)l){M)g1+i=d~OEV=7wYNWO#d=^&6nak@AXD@FRn2CL zSTt^%M59^Bu=-57uB6W~Ey>BiCuDTlw9~dVSwpv#Uo(dIx4DkIrQmaa*k?aj?HOn> zSlaxOUXkh7P3?gDw zkCv22VYt^hv7q|DZn+rR@F3>6T^9x1rlT)Fh~p7r2%BvXz>{JRr~e~KC@^NI&BBR0 zRqNq@?k7~h{69Fp@Z-t~^~n#+(tJ>>jwyPV!qVYed(5k=e_9DxWEbJ8EcDu>Vx8jhhtpVgPF3 z&<$He{%&6&J;5b5$e)`|N{||V_XQaSNCt^p8KTsZRrEIet9Z=BLf4ci0%S>!>bW10 zP!R62h#{s4@jfx`1SBc?Lzx7aI!YELG`XXD+n6qLHQh)s@fqU&DjlG|KNDB3?SO$@U z-jBtLd*sDM5shRwOBmDbh!jUSweLL1+u_G0T6(DazfD$0Q5I)$(nQ852&r{NbTBC) z;^9#u>yH7g*xuPzrmn6hVjP7McX56s<6RhMD&&q!0xeN|qS|dqvXjv`pVZRc@ku0x z9P>h8G#@HOBv2frhq0CY$f`BP>I~^AgI7P$P|xfoExZ1IUWsHX&2_}HGE-3k{x7g9 zY#6OMA7gEm=oEkm_Oqn$ACZG~YT|4JLk!s>32bqfG}1&_%2Q{!fkZ@;6;$ngps}@= z4^(>URm)J51SR;kHF9^Ro?AFOYRgo!B+*)^zIr7hZ(Y7q7Isqy>}0IyFWs)KsFJU! z?6JhI&nJ};2_j7uQR~J<6G&proK+&_mfKGDlB}2KzZb^P>0|Qj6Ea z=BYXWM#u+CBNpS%4O)#JoIC|ZKrjL!6lCd$Vt{#~pifdz&=z$FMcn(S(6nm0`t**6 zNX)8*JRP?NL;i}}?NSnsTD<(ESYs?w!Gz#40DzQ0rY4F@_6P>y+P?e*IL@@_e$^zq zj2L0S2^rttlW2~q{f}fU8WwJc$e}&j<=?+Ok-r@B$VR!N=65`kOyNQP3O5HM%Yhi< zj6R%Z@Yxh7AAVNFlbpGYtX}zGR6JFLFznG^R-Jpls z&V`-oDO=D(*8VwW6E|F^RFXa@HgzaE;lh$;-MeClS%J(BCcwM&a1!oQS0qzWXZiLi zB|KkUv9L+KYOLErr%A3ekcZu8`%&wYi9f|!i}m1GN@Fd02HJY39^q5U1DlDH7~kB} zfW$i|wi)BeC?_-BdOwE?*R^n~2-Jkg&KXEp9%P0)` zIBl8MsNUZ=utt4ys|}dHQ>?*{*VkovE00h{=1e%0XLf|g7b8MiITG+BU2rmu%n z>arcG@M1x#RiIcS>QF?MTytY>2an`y*-mDxijUtU--oiG4^*BCfb(pKs zgR}Z*4N*tUjG&TRd1D(`vuJY$+HWluu`?cMl=CjyZ-T~k`OMiZ(*(?XLi z#xbpEsvoJ=og2qu62U3L$1`UmbIRtS_ki8jiCeTzZp-bCx5nrSKd&10fO_$I?o6J# zzqVD~HqmsV&XeIad{}8bAf-itx860l@_P>yP#)N5r|7=;tIcA$dYr# z#fiE?^~TvrUw7_Z9IrW9_xkTfP?T|_bM06@`{U&lgS|C4-vQ(GZt_3nr)M&}_qu6A zBP{5+4WOhFNwd&!Ou5@R)!>A}WAj*`&<2qUMhI_AnTe>at=O| zC_h16Q+TjL{b@Pe?Hx%StkzH7w?ERP`(q}+H`Z}27)HOpE;CTW`_^kk!i9-2t{$70 zp^j%^qKsu0Y{^zd{ibe-2ums0X*cV^^`l{QXZbE3>aY1R8K5DPTDxkkO0+OOd-M=? z7uG!pN?9X@*uJbVkxr<$)Y%<;YdgdY{=3>Or8@WGWVtLQ>(D@j4%Hlgi-dmy~Av2bCr`bwc)CZDe~)IFnQfNVHy z2ph~Afm|aUF6Tiv zhM(S}=>m2KE7XTKgL@#8S&jmm4tK(MQm(JuvKT%Km+k>Ll-&~tdg^z}!IR*liI^d0 zAIr9L7k65`u9xmzGoi9feRLP0ui({w^CDp7@&oL9$$?B-_m&-ir<8vCK?c8LIhUbY z`pJq9qsR^5qn&tB`>60rcRUV`3~Bcg=ntR`8B{S=tMEtA32@bb1;d)6!sf zVWx!%DAOf~X3a`w*~!oza!<~Cau;Z!Jh3&?f-$`^m)8A($6#RZVa8)nv)Es{k$GqE z0#c%<9MRyA{)+UyQN~Wv;Q0rhB4E3JinL}{_RUE&6{ts^fU&H>$Fhji89hv7+3FE5 z?yDOYodz+z{Sz5mCitk83o_>&=yQ%-90Bt7O^F+Hyd8BKC98CGZ=-YgJ`L&GQx(_y z$o?}mL|!H$MhHZv3}d&;SQx~aHe0$Pcu;wZiCzGoRGRHk?~d6wM4I!^%n|LMo88cX zq`5qO&+A-%dHra+Jc{vjU!-0SUiy`zG46O4qYeW`ZjGQ{?2c$SY|zX|6AAwxrwi*%Dy3*1w-ic=D`nDNHo!9%_jBr9E!j2<`WQwBJp(p0^4d8WPseZOHC{n~n zH)NqoB)yPPtzriUt(B$`b)Gxm^4;M231*83z7}$yb35^p|2|{FMs?3-+9C$5iB6H? zH|&*611@SM=Y-vuEJO02g|ybXZZ=QfSgi5ev13tY&h|{?&SS7*?It~#-DpC^!%vWBGUa)aE?%A!B!3ipj%l|4VtVr ztMay+MK8m#CZxM=8k)j5aVMoH(eUsyFTl0NfFms2cx-#7482tjserIGX|;Wd^mhnG zUM!|MW+|kBcQaL7S$WE2@1x5#A9MQfut+NE98KK-ieZar^$aB9et{k;EAkQ2W!tB- z#8KsDI&W2YC#aW|Cz?-D-yNJRLa7{%TU;9+Q4U8Sk*-BFc9I6FprS~A`kfbC&@Hz)2FF-v)boz|^IyVwBsWDh42a8qq8G&Ob(=AivY zcS)^!`1`sn`^2QIpz!kKeYDCeGWMtb^KPtVkUBsC&U~lN47t72PZ;jJu69V-O^;-8 z%-6~G8SPWfE&4o1e(gK6ZQh2xh3Hv*=rI}%?tkh}k+d3cL$|LQoSrBi z#4Xt6xjIIrY#|!HZ{igZqEYW6)u`JtsW3b&8HEwxuHN*(t zEKYiQ_{BYLN_EskD~;1m-4AuKjHyNXeVtsA@dn1$7$QhT;{CZ$vhG=~mxu8P$WpM| z?4b3$OuK;1F&JJcgqgxm-FOT2%uNGe%3wtow^h_|+(TY2E5`!cTB#MqtnLsElum|f z&=pHZ4`VwaQTXFJx0HzL`ZYCb!A=Pup)E8Xzbeeu=>DPU2SJeuS_?olAnp*c{A>yY z!XI-zVoR%y2ohR379a9|t6>UU4dKp*R%RV;JK?Z!vuvje3N-agA_gxNW?J(uFJknn zl+{=x2IYW(ros%|F-xxLMy$m*D1m#+E>(s6q zQc$ME6Cn!at9i*l_g*i|D!3UfLgy2< z{?fxHEYcT0iFDY`!3a_KheNfEs&P!(<=$9F4)O3aG?wX`VAvp*nCa-= zc6pz*d=EB@@jzpSEgqL)jo1WQ8ya`>z)tnKU0RwJsP1IFBgkqUAXqs=<(^eNd+u5Hr25cZrn!FK43LeDmo%5`J2{C@b5Bv1V+ zl`Il#MysZIS}0bU^8GxRSXsGi8(r$eTX&w^1Bfc`^+P*5$6hy^u{570K|c2>*P(c9 zf1GA!{vkKnMsih@7TjWj2L7*ht8Uy_E4|P#K=OCRh7QuIBs6GNgFp|mN`i$2o_ftB zn~Ug?MrOgmB@zv3gsNg)5!V3Qu&&VW^GeeAE?vn*JHIT?mr`9eNQyYEx$89xOJ_u! z8@_(Q+gc0R^&fe;bL5#!Jr!eJ8zN;Ag3B3sUlbDX0Iis$iOW%mu1YhdWP+P!R#qMQ za-LSLJAWIY1!AbPNNd4HMk_TZ(9=hsv3dH=5epmCH@o2hF4-gIv9hHb!$H(wMX#C? zbxpTqeXNXFd8{!W(Pc~EROn2S=0Fl9fDac^s1mhyj~dMDf@{icOQKZqmQ$iZFkl;^ z4a;Oe(y9q^vktR9*{WN;k6>02uq$xXiIcK5s^2Pe-#~Ea9xPm+?{mLn1o~MV=@yBt z$kjA_YqJ4z{F+1*&OQS85#lrf$Q3^(^#1BVxpI#+MOmcvMz`Wfs5@_T(O@lYXBNtA zmuQ5sb(D1H4o+zSzHvLU4uMG~TOvHarCbnn-#uodU@8!xeD@4O;UAgDy|J67*=+Te zN%DSt_);v=(bArUI12FCa$+Pe8t570f%RrbM51KG5b2DpzcFBDNi}WUrZd_TvmgF^ z`T)zZZkavMQ73VYyr1ed^-_kY`%_uSw0!_sWN*@hbrD49#4Q=n@b!L#{_*L1^H6VF z6{~bUcX?~G^au0L=}G|U@zCwijm?AYDk@wXsY#qPip*WXh79EFdC2y4Px7Clr<0y6d?W>aaoJcHSmGMZQaejKfPx5edJ-{# zp<)MVeCy4@Nrkxlp4%y`@|+|^UozyonF&4D*2VQf;%K1;phAAeQsQkY6H<-B4uoOt zCW)iDby4EScSb6N8D(%1VH=>vzXNf_GTAK+zf`3pQGXsm*o{|4z{s*b*+#G+gnKZw z23D&x83v*=M}117z874N<_e5MFpPgf#%4iX6V--zrU;BU5v_!4N4xE@nmOkvR$yT^IXUoVgN5d#6j*{y_ixq-`z7Y-@@j_133g) z&1i6C*=a7{SodqPohu>T;ugWbFQ(_JX&$4PJjg zfVByY{`a{3?AtXOf0VBxkA*$!e9wXmSzQw?F1d5Plg>Ya;C zKbDdia$f&^XaPA;$h+<^x>=wcz3=Rr$bX35%TZKKKLm%i4Kbr{H zN}i}uEG#h8S=9xQhL=R^hF6V^J7>$Ia&%iiMzx2EPpyP3O#9 z$!@C|Xv4}nGj@O)x53?JPAU!j% zSRF`Lr@T|+cZ=c!T_bG0ZB(MFzxu$lZa`JzAsJADk*>A#?6K6KSpAPoEOEr}b@}Xn zWfqI_P@|hB8@tO5=e0$u#b+eY7Ax(}MWx@CXVXOUj^sGm#C`%9$i8fj^7?57p&H+i?;7$>KdDr?V#4cMo&LAVDuC(Kt{I;E zQlXuWdaL(5$jY(0C4abo&R-)%g3ejqvu&aVPR@ETSI%vzLzg4o&KvY92DsiDoCIhd zde#M7f>E`;x?sJy5IEa)d6B{J@rDn|Rq57^lL`X$-e>tI!J8yUZFJQj@(DX_r=%42 zh7b5ZN}fKA>0S}e<+;N-&Sk(MtxAI7d7VYr4d*xrMX`0C)d&DKs$CZgic3my*kc*axqW&jjJ1hM@%Ek7|F!o;-sI?Hg*y(+c?lu6D>)G(J;Y7OdJX)T26rvoxhEu z1};|AN1TQS*1r+aafRQ`M+9R#3(8b=sar3>KQkbFUn*gocq{SEF&C4E^nbLAFR6$) zK-^ZdjOzZ4OJFMONxNFIJS5mZ7=irsKLi*O<6GFKp3o8x;$+viOl4cdqewI?TA$>6 zi3L$U5sn;^@nXiw!Y@0ABKg68mlss4TL){P>2rr&L)faI8MPrMfwE&FemK#h)ojT+ z?-=6epK(Y!L%fn`I7@(vhi6H6*9iXg>1 zMp68P&o)=&Ldg`As<%978nMy=oSd_!*bW$OaSU8m^09raM>8O#QC7G=OY?4z(FWeg8Y=-x!tx~sDYNfHF6WBOv znvHm)hG#Bd11iTS@y*@Bk#k1dDVNQc=r zwH;o8?}0fYwH(ARZ<(;i!tGjzNQ_xe-FE3w54^AhVY_xqwD@lxs(ep!dcg+@GcO=m{2PY6xlu7p?qYk+}#a!4K<4d93Ux~RTeDi%`_df z%wp9VZ7UFcJE?7S`v%Sjr!^iHNsuD$48@-q>Viny^MQk9gaJX336s$14JTkk5b)xb zNYHi5wQ$PFi?y<-GosJ^5n%8Wn&$n1jAOV)QAb})EH73+NOaov!FX9p>7its?icM7 zQtcjr>I&Z-EL@0G$CV=8IW(^_t)8uLc4PuLcbs)C1zT0wzT{H*xxZ^vvPli!Or*~e zgg0UDj(Mz<{4M{s{#Kbq)He@~x1W;tyvm~lD~4fYqP6ZpERFun$$uWZL*y3wC9Zhbn?NB?mWkWh>{aNNI8N=q=Aq-bHuv9f((<*dj z<_Y}ijoXk_D8LwO29#&it1 zgG>WM^a#ssl{yh;_ar1OY*^r?Xgl|OvWaTaPsAp1zW8oir#kDgWGfXwIp}6UgJwEx zE}vqf-*#LD`TSq2;uZqE{#qLrSvJmX)0NpdxySGH^B0z?4-JnqrQ3P)izLEUdy^(G zvCORIim~aIQ`Y`q5>h<0v$kHHwH>V!e03>O>8+hIQ>g)v)X$d z>LYa4x=jG?TQ+d=>8f};0qw7U%@6J#^_rWOr^SPTdRXuVh!s3^Ix#)P{mTm_Jl1KK zbdK^{+-=sK!c}Gi6@D_xGpv0zpIIK<4srzFucs2gis)V3a`os1CW3VQrSXcMyz(?N zMX>pG2`Ku#yCl*lsAqoU2737V>2{;)e~~Dso5qgs;%S{J);HY94Cyk&P5Cx%HZ$B{ zidGNXTp_dij8%W&_S}KK0-d$5@=)*VQmIIHKHkVdE5`L^z+(Fj^i}xJ13))wh{v!~ zatPH7sUs1NgHy&?1Xv2AS@t=@Gs`)!Q<1V@+5e=eLhw~R?=`;c%Bfp}HzCbX@pcwr z%~Ajz4nxr99UVg;So=S_O*LYPU9n`f|%Znep&+)GaKX9MRZf@ zA(1~{8z?8eYF*N&p3>v@{_qRfgYk8%6v}y{{+Q5DQql?Lo*1P)MO;gtvm5bB-$p$B zy;bbW@3$1)xI}tU$rLu761mAaol>1reeM!QWE5VWX{UW$L2XKn zeHw44YhTrF6K-DrC#{-3+K<{^9yFSYY0v(5n>9cHE~*;4Zne{79(mfxO-TiyZq))l zzX^QuhVQWvyx9BseDshpcBvjL|4nlK{`h@D{>4)$%9#8EH#_cpf#>@x%W}ZSix+2z zuvI6#O3dLNS|=CAesFcn)1FC(mU&^4b`e7oX-4%#W^zo<(IJV_6O_q`RMD0iPBMIS zfyN?-^v`F9de0bKtoYQaS)&pFnlUxsGi4@8YSo{SXuMok?wp;iprG=zY(34NFU_?? zy}fTYL>wkq-U1E>;~TSWR7vc5%uyuBnLv8RoD^4)GX!k8XXT5?0Yf;KZ-Kdbcg z9qZ4yB)~gsFdf}m)=lc)t(nKgtEm;}ewAsEB)Wrlc-j=RRS!>F3}`B=Hs@RRtQ`#= z8Jm8BaGb6dl;{!8|La>5&6lg|oMb5}h$&_V)ssdBU@!cvvP0DdN`nP!+<$QX3Rl>X|w$=5;)ltDlU5|8S2WPnHEFM?~C2z4KZEWusMsgPX3n$kNhTi0Bh4kt%%XpZ-Dqf zvDiA+Loe9;`o%u+Vv;tQcT9x>k3qnaztUy>Lhx$cXzq;rL!#kVdtN9>>B<#D1~%&x zwofVn=tlKUHlySIhmI@hjKIz(eP5ufD~@KW$T$2;4)N6%as*Lj#nIkKb>P00U3Sqy4k(+f)~)J6CX{LUl9U9T&> zFNY!#YmhL6McI}x zP80nDQ(Bu&g*lw~P#D-7|60647ZWB|uZQy)1WD3)Sdra8GI~;?MORTGb&Nrb-D_6s zO3!)x0-jEWLW@MBt`ELuN~B(_G!#KNr&y>ld12h@C8{(BEA;yZ-|%{uQ-HOqM@Hek zZy&@BE`tlL-#$qOmIv7&P zm8+t&+-PJCI|0u-RzaXXR&lzz{=Ldlb;nQHQh0l&9pv!?-VVlnNd=3iB`n4Y40#Pw zI+NcuJ4E{xT@yv)j*X;+zYzZLou@%vtD{CM6Z0b8NSm6E=OsG;?tAl{hqp$Py!O?n z0Q!G5M|g41c~aFU`h@kb`UBrn+)pItbV4MMW6HAs<;RQPr2Mu|7|r#-uum(a&=TeBINdQqOCU(p*b3dxb-tFjaAkQQYkC`M8;slc)Ny?4%0Jry0`m3 zSvcan-?bXF?Q3ADQ8hhTrTdG|u{i_xOi~qR&KQ_hA39wc)I-Yz&6`*CkoNkIKE{gi zJyzWuX%pym0pONT>DNhLi()yUcrkwG-tRMzqhW#FSkfFZMDL2|J6}x1nqK>1yt%vT zl_qL>MOq2RV$~6mRL2((n}KhF5=eB*NEc~%=uW!{Ei|g2TB%M{nQ+yBq$TUdN(s?UD@d zUUG~Y8RtINXEJFafBM7j&f9XEzJvA{cA8&`Qtlk7D2fqVBcPccPRX>_v2AgrlaiK~ zGA;OlkBIsi_vN-CEaqf|*hLbg3XE$b2=$OEvx-YIUC5#L{0dr!bH<|n@Eu%^{^Lu{ z2HlC>f#A?{#cW4YZi<(8zoZ4+Q#PGJXa;87MQT6z(^DLdv-R?1oA8drxUr+MzGzT5 z(iyft2Qy-=!i6(e#(nOwRS&`d!RUAT&0|28?$7zwg=IQktZmT0jXztW=;6xKr8Q=C z!m3n*cM_=!(1stBwDx)a{FEvekgpXwp|^34gCz&ukUh!mF2(L6}qvlQ)4fa zXUCOubnnpHAe{JWguKG}?`RMu$PaETNP)ac|5J1D!rZ!i`|-h9nF`>4^-8i+>`2Xs zD#tZH6lsoH8yV9er+FgZg!; zt1v4xGk^vd-S>-?jM{OXC_dtI5r+Y^Q8Ohw;CtvUyP0bX#V&09;J@OX)H8P6lq)73 zaYMX=2Ug#dOEaJCGaDJ3O178w;M$aUJpqba3T&3Yw^QRx?i_`g>%F-q>xd3;`Nk5{ ztfSrX$#yE%aZ*GU`)BNwRFj4|eEZ&bx=i;*K3HI=!#=k?h~3M-OdWoy+a?ZxW}szq z+_Y*flH-V+nkZ+yWjbGd9Y2HZd!ucHz>hmD9ghm|JNm9|QQ0?dEszx)dJV}jcHiPs z5Pn6X;u<<_W-IH|r>_=tUA|YE%c7Mk%ajSd^mC&RsnzdIZB!3@gk5pqns_J8BbU7d z(D((RhM-tP%ha$n&CjV(TNkZsf^XNHg~&04!YgbiyfB z-C;SZmQF5_RrJ!U^oMrV01VdN$6Zi(<__!&Z*MZ=psoHW8}4~!#*hZk4Mwb`5DX4) zxo2Rx>b|Abb7U>?iavR}w5W($r`9!&I(oTQO=0UtW=pKN2yGSajn|edZldu*LLp}} zL(_jVp7KK9*WBtvjnYF z{cWZg_xdnAhjW1pp|Wt0zxW)xDcte7>7n8;($IoiLlm>|?Z_k$-rQ5%#CjUdGx z`o}%)A~xRUtiNYI5vt+$JE&T5qhW zQa}AH+bK!JYSF&&reU!T8MvG6;m^6wRbtfzC8apY z_n5^Jabo3S>X+ij249JFS-k{t2tS<>ZzW^ie}2};Ywu#{gI?;0(YFlv=>MXPPV2av z1^7Eo(R_&w!K}{An=|Asx?mf0TTnIhHE;IyB}i&Md&#{)()wiIfXME|&d8nxCR z`Y>Y6tLE2M?^*fM^Xlv1pG`ky5tEr6@g^z}&y)5Dsy{B#I$Zd)mfDXC;>{FM_b*Bo zVORO_jx+V3-{4%S_8bDRshji0bTUwh{fO`$(HTXV`kF!fs_q%DB zxCDm6RQA>2i$t9*K|QlVJ}J}PtSlTwX6EY)a-NtK39f+n@uzR*XkduAbz-blj}*n6 zlObYwc`K{OsG?X}S?A>IFd{3=DzVOB)bQiGTt%GgoFke(-Zn@~PK1ziup9GRYMt7G znflcp@?zyDBWM0zxfhM{zrH=}*m>LuAQX8$?B~apCUtz1qm>o< zruo0c%Lk~x-43F&NY22)km2-23#G6RPTS(9fb@T$36#Ri`L`8ZyRbs-=&Ge9{E|hs zgF_UB5z|FKd@<2Z5e!z5DT%ArOT0f>9&3t6nngw14$}IIVE&7R@S^2z=P5)N;w18hba|U|on4G`VJ8)E=x;9asQt#Nkr~LA#+2T` zE;g;nDffGy&VJ4*5nr5r4K7T7AXrT%K>{;akesqO+F;wv>G85NC6kfu)U9JDxSZdD z*D*R$MVyuYW}$76^Lv`N5S5c4s&eUHfPkvv2pBWpVW|Ov{4wk<&v2I1txaQ6-BXA&x|zBt179=$2CQCm)ro? zI4^zy2N~J3x7Dc&`s85i4JpZYDl>Pxr8M9`eq^{8)`fe!-42IuM36(rLX)#5eu8)< z$_v$pM&*r~H_tPXk55+>RH?mtm^^LUQj^DzSz;H(yf|BY^B{fl0+SG>4Z5KUluPPDCSbKEY{is zb{6&A0;c!ACBu>R=L+OWs9QnJl{{ zLLr0`!(GEvUDKwnbTf6tWV$8Mb?eS>{rtWgqSmOlFA?wz>djQFsBff*hwH>;i}F*- zX8c=2b{Fr>IQeFwr6)v**q#!pqebeInTi-Avy15Uz60E)DEdO^1PcNV2paAb5&9Z@ z)WRMIJ5>VseDaES;Zi;ruR*rf4|H4j^Qd%SBm$}dxjiqx3rdA#u>WmGevPzZyU8xN@Y=o!<3SVKt(6qsDP&_@r%o4Q8> zGJ=dq40j}ICgED$YBtikaoy^Yv_zw1Xm+HQJ1F^`$X4OcpY18|ECtYg7&h|BB>c|I? z1H3N~03}5|meGCwB8tY+#UQJ4!LM@d!5^{@0*WaI@-6?^Y~IoVXLx z9r$@dq?EznaK@M*;hd~)z1*$90h*UJsBn=Y!uW@);6~%c*X2eq0awa_jk$a02*WPf zs{}__*`p8c1dt(#DDaOSV2%ngDSy z&{1d?-BMeu9;hVs)Uzkvi?jCsgevJ5+)~wFmN3pmzfay4s`S-{kzT#6pj1Eb^H6ki z(AifWH+Yh1&?^7mtS6vmK1!%|nuzb5Mc7fbZ)Vyg#2_qga)2;<@|>ohp?X#?uEf9TIlV52NYl$1AY$My}O5bZ2S< z5woaKy)7wF7W*{Oass9aWiLanhx2HpT670Nr$!rT**%F^k~diq^Ox4#kuUu)2Vhr$d0f4%(pjoZ#Fq`z?{6})E z_^w`VBQW~EtP=HhzwvS;q!9e%T$S$JbqA{6@AY^-`uwkzF09j|r&-0ozCXH6y0>qL z*{KH?zln@k^FEaYmk%d(Rrx(Tw|W%w1AoF`l#`+L$oG-A%QBwskNC;u*X44-!g_~J z2vPr+edU)Zx_8ODS*V_T8h~MMoUs4sxP^}T{(ti@rf~&XNiMl1!is_mpdDYcFZN$OY zx0s^sv<6jvdq&gqpQ1d$J3ko@h)MQZ48I0iv0X}c(m}S)D52YIWa0N`XO|RlOG}MA z{6<-otkaEopI{-bOoRS@k~t!3P}8fSOdb3ivZ&nqg$e(DG&EZ*gFMAzDSRyFF%4s( z=)RX*8TJG5 zvQu!Kq;;Ls@-}rJ=RJ&*JM?}Kj(23zm$Zw*yS-65B{^-=M@Ncu=gMC)zV2QA1BCET zd!GWmQx+zhXx;mVBv1VFZlcYv&P#^e>xyt`O;x^3R9#E2L``argKut=x<2R5+q5*P z!E=ER>-HD(CBbuVG@GgY?NVEgb;q4c~gVG2-jSx$nE2j=oFM zC`M3Dkn>NIW$Et?D=1c%j?1R>p!@>4D#w;;b+!5JWb@P(6uwtA9mU6zJvF?oS4VIC zlUHm}*0l9W<+>#+|p`j@|M=PY_=Y5HBknKS+A-d-^}MVlLGtlAPcxAG&Sw z4c@(XfXm^$^FD{5{NEXHr}9(61wh{p;Kg9#zhzEZRidq0x1NpKHF`MWzZ~QLBk9`X zWUAl)nfjc3mT4LX$5`SlPG+SVgiWclI2l3{$yUliM?)?v(&SP{46`Wfk|rg`Wi&`F zsiu^UGTKdQx_q;JyB%t>D%y0hzTJNBXMX>9)$GiU@G9pF;D*BXn;)#@*q&^?L5)Cy5Z~MgJiNd-QW)Fw?%58wR03=ur|!;n8|2 zi5|EY7mEomUU-Wq=EZ3Z_Hgdj!SCYQKS@2w?S(R!)wyFkwk)_ayGhLxh2`e4kHfd5rP z-Tuxkvw$>4?#HT1;W;^ZdExg4K=Z>safs)xLwXw7$xp<3ZXe&G17j{9G$qZ}t~Q%6 zB>zpl0SUNqpdUCFn#o#mi4?h!I}^LF3F%tH%Kj;}QTyt&KVebEA0YSk} zcdAKjWVlPrA!2eEm#{Z4*MW8?wyR+b?3|@SOfP#RWuf`!7$6D<2z6i$ykD}xExG;( zM#E-U3Wm`{Ia`geXu05ZKfLC8w2lOt6A9;TDD2i5I2(${>DPBkj*Z(*3EZfxK}MQ& zf~0`)#U|8fb%`tRpaz*X=Gs3f8gyD}C23(ZLh4b+n;qV(S5Pf-427I?_4M&5YEXr; zWjEkX&Sx)+IRE6WRZ+J1%T$DCgoHfAT43S-dD+-f>I3w-%Nhy%+p)rJa#^mqSCa--q z-4Oz$y@5Cpo@&(nS@3+vo9Q<8^m`D%gf%g{B*|P`wiQG(58es@RyHT52uuuQYnjVr z2)t`At4j!d<=UG_<&!dn<|HX@QwtQqqfzFKG#4Hl>H(r$KaD_cNIznHQ3h|g4?c@0 zRG#zT6WE;b0JnaAdWyr+VhZOvuOeQ7U1p__4cGgGX?umw_RjNU=(lD9?I_2g@u7!F z|7a6tk=@|jLB&)Md*sY9$EnH$lYO^aiom~KHqwk1&LoYt*8@ccyQrNM#qbi}2m*>% zgnYd(%E2VYuXn6A1J)A5G+92&_FxT z2T~8LB^+!lhxxKuj?RbUbzv5u`W#b1vj$`vdT?cYRE1Cvo}aCyAB$xA4dns9>T{un4qqn&ni`bj}I6@(PwajcI81!RwzXfjqNT zaWKh*&Sv=k)3;xLC*r(~X)rEMY#SP6-4-L{2~4i=MYsppS+In(#a~J3V&JKWasyuhM5S_=Wms-Tu`}idg^xBrrdL`=9}SBN!8ikC&` zC?|9QVeQE$vp~`ItEVWesv<8SaCJHG#vbsG4lvuj0REHEPj1Biyt8Roz`ft8N;8~} z&0I%L-t4oBNqLpRj=CJ8h`^O z6pP}m&_&chZS?l==V8WxKnP|qJ1HkG^9g=W5Ci_7Ht}`sHJBJ$xWDQW(i3ldaJ61W z29FfJ)a%}K{?3vbL=>oRl0&qN;tXsh_9BWd%$%8a^2WV4`FB=-7eM8*;K%^z3zWv5>p4409wvnYNoNpVz5+O;)NAA0+Jz&o_ngE5C7{QU$lf? zU9z#X7mi1SD}5h<;9JY@gs=c_3yrlarBYNRWF>5fb$Y%D{x`1u9c&7#Q3bQ6!f}Tn zI1iGvTV~?Ful*g;BTT520)EtX^pjJTwDH z=srMFx{)3rF*wyZg`?OmKy6qzV5}E10%NYi4-iyiGy@oeBDf#B1Euf@rm<+Vzt~cuad#T5T6XzBxaU7yR_EuVV~@j72k8V4 zXLh|DKy3(&M@a0O3yXs6#l=-2RVxI^Tpsm*#kM#WRMwc-7Fyrk>6+uV~WMB9$ap%~fEdImLE@8QzM&I3>}+R!uj1R5OQx4wHp zG9b2Vt4;h*FGniFf^Sid4aQc{m|2e@t!F6`4IPP@+FC@8LSZkI3lWw559moQ%o|HX z1cCNa4dzzd*c&nfjYMq^aNAQA+`Vg3ypdbqPnIgKL%nndDHLD^HW|+)+!eumr#ed< zJsl@f@fbI*J1-lYwOgKTA{L1!3c9F_3ori<`ct@N1{mHw|5?^X&)yxxGn;af&;@nw zILlQZf(3C{IH1ZBS{i4+xTGqf7nsg|O zo6hSA+ESYvOJNkbz8!_J@aX*((@0w-_k(H>);Io&CDp_h6s%x+xuMyja^d~$)?ra^Dk8!uNA2XGFjcpMAM+YFS zak^!u=>Y@XH!cN!nEISrL7^V#hKkc>h+7x6FKS|k&Wko3A)4V5xuOHNb5`*SQjec(QKBPv;pQFr~^OKvZ zMkLw-!&(a_Kx-N1iMU4A1a$^!Uxl(UYycCGMHTY0gEeu-ro?M;93FhUwwf|Kh}j^u zd-_`f>(0JZl3Q;)RG2FlD#{!5LTWw5x`1@Xn2;)vDVwTCC;Eo~3vFvT8L8TwZ%jPp z>2Fijo@!4+c`bZuT%-{SqqU5mE6~pYwq<4BBAA8Y0hKF;d_oIP8Om5*#la(Fq}$Az zA~y{10yk-GG$MYu48pe2`^aaIv=&U5B>S&E81N*#miGEskXzWY5>}+~?G7o}8Qq}@ z(Fpf5oNJ(0T=P3MgEr{3a0h z1wHp8TJh)?a)p=8{xTIpGrk2Sgkr-6u3UJRj^j-Y)$xelwJJoZm0!=$49|uu$^4P3 zOA9hqk8*$~%qFrl%%m5%{6Alk!#8r6^N<`Yg=zCSSiqfuX2xRf3~h`>yU<*AVrhP37!?7Or2fVPg_-o1bG2v6WegTCT%|>(t~*Py{#TPZEY zJpk%D(09|LBJig_2FYDQz9VQTlvYVDZkrYX*xIhQA!9;oxet=D_ZFt?&V zV`h{u(ZPeOz5Q#p3^OreU{B>#2^A;cM9j?bGAML+kyea*dDI7F@6ZN3>bb zVQ5A#F+?F9JxEanxv?)B`BG_s-_*3hlSc08E6IiC-dm0Z=;Z2B))aA=x(w@jSh7)R zUHb+-0Vq&`E%6<|O0WP$gZv{^BRokZeU%+O_yFE%B^Huc5CXs_)r=q?BUNAyve;G! zinMr~b~o5_pDGG5JDvqsLFwSkSAC?%(B|JojFCB<1#H1k%)p<`8&dKbzdNbNiW_`( zIa~8zy$NNwZs9Qh-y(${2x!*!Qyj!VJO}T*O_z9Qim8d!TzGT78bo@smczh?J?DDm zz)0+PdS1kF+3~zX;W)@MawXIc2{#*s`q52NO-GCu{BQ*h2rfpOAjo9j`(wPCB0S^4 zrIbera?5`!CBP|8f+$v8uDyyYd#_iM^qY8utYNimkp@E?xNIg+GSX45mDw$oD!^*Z z@@%CS5&IVq%=xhtHRkVOUk`c7QdyAONs)l|v9=;OIETFsr4;BAwarnFM)?ulAiSJL zEH|^ggkB3{Z?Q3kjXeccf@v>R-%9ah$v>D59cKqt71Nl=cVjksJcgt-VtMmC&^|NU z!}L^syIZn4`66-&(8NDRQb5S#o5eI0J>wipAEQK@B_E}x61#r7WcQQ zR9UjYm2{C`x}mu^X9jIT#- zyUY*XfkP#N6Of*O900kc%#9SLj9XmkFt|uzSI?88kYFu?Cl)Rt6r|8o3_Fy!3uXlS zn2NIy%r0-MV8g001USWy(K}DuF!5&x7ZDstDo?LnW1T~RxSX%$c>jI5UP_ zGE(wmt8TYPMU)M;^H^BT*aaTS9G7a2`YyuSvCWlWA^3%Aq7V;;9Q?cirwnj{hPP&Q zmBIl`z$gQ?ozzWc##h+|%nNH6{cxdXQs7E%T@oSLozO)p8%roeuYbpOl7eoJ7CB5l zn$M8-%i~wcF?onv+mEJ%*?ad>ehZeKh*SU13y7J(^aOK#d={?@BvDayT~rdKkfeyC z3pLX<=A4#e4-$In^}foB@faHR4 z=}MBE;&_@_Lu4gRhXP{5f{){iNRLDIU~ss&-Nqx&dBCoB{8q{tBF42|2=et}fIl&$ zaBRbVDa|3TUs@)tlw;E=-KJJDDM8MfEG`9$Hf@gL5K1#=O>{XRh zj;D?S-{f1vX+M3F0-F4ajfSWns)I`ei3Dwsi_k+ToOp(cCAN>u*2C1F zyd%v$x8Co8rmh+*HQw%vc!ANv_xGqUmA{vpmU9#i48>%-b#Xv9Ea+;qIczJf=Y6dt zP77|esU6ouKkQe%ma_5Ka)5zj^B@z>%YOsTV6a1Egy~Ng<M zhK0H0xf{bT2Pqu+L>A2a@uYY)kPwqVQBL&adbOV0kN!`N1%!WO=T;<@riu<%dj3l* zK$MFZ`Bct5H|QBI{JLIEV++P@I6bFlyeh)WzZ#5#aWg%j^0l{KizhI@YKZ7^dt0lz z25=gy7xt{JLPF*5JUp+- za%3?o3-kFVq`i9N>nRd}(4^4%3JN~lBx4@8@x(Sc*@CSuqVcHC`WiEX;L~BTnkyd^ zCX6b-2Pw^}-Pu15Brz|*U#x#4I8yB+Eo&pldm+8i7e~Y}Fx!{UG0P*vNYa{YWK5j; z;y@SSd~vv=u%XWK8lTMk-4{YR<2M%pi|zf#(X!5r_QknT?5jD2y?0L>SL>N}fgGNI zwMeJ3wWt^#B-X-8TT9^VoF9sV79Rfq9N>ORBbc1_lT3lzk)PmeY#D;XweG$d=9it_ zfs@j-kI*p6+(WXv0A(2+vo1IKjnW&r{TB76YmcwiYY-2JxYHF^?j1D`34u^<1II5dYmE(HY2^niR= z-%O?xyyF)g(0oNVJd3e^zhohv<7CBptTAaPYMB1C$&4b^bKy9>nr&GU$FpplL|ui( z$$ud}?$w6mUV-_9xWos+Eaa)hM=CyUF@t(Koag|lrWY5geo$k`G&je?*sZ3TIE1Ti zQzO`!d0sE$_JgNr7KGdE6M8_qi2`}TRXH83{(2I@>0y6~IEGDYsH#9i&o%&J1IAO~ z30glURSqZ-Jm9b?f?Dkb&sm!_tk`;(rUAI~cgi&_Slv_=tiG#ihrwPvq}G%aJR*-m z-ElLouswe6Vgyr~8?#psSO~i&<7DvlEKX+3PD($x7Yj7T(we^nmE6p&E6!cPJlhHD z-9ufZU>h!s#fS`4HMCSg!HFZFLTyBm8o^#;c4l+jK76)Nc<`|7pMeG=23Bxilj!g& z`$|nH5r6t4J<6@j6r8Pd`ezXb_QyxyJZtZD0ASnKg+@BMo8|Oa8aL`!PX-JIFNW;`b$uxV`>q9=&-QX?Sf#(%^d7Th0D4X?f6=rH(6 zWq;~TTroOI0sOhmXJUdIlX~M3j5)JR3)K#bvYxNws z!#(gvD#DeD@nRD;{mrBKi2|=oxo{`?iy5!B*qVzF%9iFuHLTyybq>3GZz>F}F+Gm2 zw|tsL3ArWJxT#zD6vp>i;VU+HGz`lNNCFnYoO@Ny6tUl5fD~xj)ws30@f{4}vW}<@ zH)<{>1IwCwp`OM9(>>XwR~x4!JP|?`N*V~;AB9LdZ@f!mq>bx7G4YsB&NhJ#M_Ne@ z$TOJbuKk5+uwc(;m&Tizwo_IXVu0G;dXv|>?`$uRfm-Il@gzYfx&iDlP}0`u>rpQO z#KUfR9EDWdfoTuY^?*Dkc=4u`3VuDX{*=YO8&;?wymB`l**-E`4|8Sod^LxqxTAD~ zL(j!wiT>vcfQhEdNkr+!-#8_)K0(!B(?B0)>y`S-0;kR#ei@Ae}bEDaz zF36@EZDgT8b3c`BOscqMQOc$5^$;rOTNxEvwvLi($!iUJYcCc|KDG-|Bpf*%_j|Pm zFI!$7D_1-UA+`?G>$NLhjkR?9a1-N^ycs~+VHY?BpeqH@@te5_H4&qp$RgAD0%`+2 zG&Kfr1(p|{o&~lQLhU3CNu2K=0)n|e^ry4~#H+w0O*W`!zut#t&+OuO%W+#cAjM!0*!ETDjKqW!Euwt?HXe2jENvk^nfSfrGM^2`H( zCAY)#gqP#KB{c0W>5yojkH0TU>?oyL!9!~TL=ayQcA z0{7<01hQlyWMEXDMi9n*FS4`*uk-lo!f3=7m&I!fY6#n*g!s*h$DyB|s$feiN~;A+ zu0))pwuI^q2ilW7VV~O^ImT#PsS+Cq7aWBt0w~mDB(GWg(!D<$#q8d6g&5+gr-tLJ z>JeZUK~$L8cNRA-7H*eo?!%(OAc7b4K(-l~(sr4jAK;sE49z>z&6ly@z22UG`73{AfN#mk^XI#NN33KK&m-$L~;y2^S z+;d;WD>3k5LMn!CDVr%n6*?%^Ysw3?v#^=Db1NBIUT&PS_Xm3VMtI;-P!X>9?I$N1*$G+kNYBL3|| zqm#T&_2Pb>FvesLf{8*lNIk@F)bH6eL4B%{3)glpl--?sHH8Pon^$1!;(HMtJRbik z4nYu*z{H50)pF!s)ZI)3ZyNu;MBF-ST)|Wwy*VF+uh)xuKb^y?z~sWj<%P5@|07?G z)ztsRm&v@Ty^GtYN2vlT=Cg79`$~Ukyf+v|A}OEGJx~H_d3)+nn$?sWfe_ulW+Rzb zhzn8^P52(5X73^lXe@#*BKb4HAd8Lx=m}E-D9!lM(KRIYw7BKVT|1iwtS=mkz=W^lz(n*Iz6CyY z_dbIdM};3xWt107T=jyBtIF{(@L+K5zEdQWHabgI>h-XzE{rEgHK%Zm3+3b>^m|-D zdw~r5WeQO`XUdAw{N*Dzpq?xB6wO}4shTwfA0@|xyXDHRXuz8Y^b$_&NB-)SV?a)4 z##CUV(E2^uZNu;;8u<*8&6(C;cCI{L8+c0)1bf2^G?2wAD?^`)Wwl)H+P zU18kPCHudJDKpv&axG>rH4+OI8vb?{4fFXvgaMXibWdkphta40jS7jtY+sq#C!85eH7A@D$jD>cxe<}h?**6|k6|PNg zkea%~r~6BaV9r6b?F>&DHVQvOe0J9$ir=gwriKdZW)MA?(k+CTD zvo6~+z{3Il+zUHqpa;_5$)m@}Yl3QXE}4dBu_IMO>)EqIX_K`x=jxQ7*^A}OcCIDv zx!4kVL(wapN1IT7Rh2p}zh;yf<(3~RLPkuxbX1j;0<77-bLlq2coQOTj(H5Vl{3CWV&d#4l7%n6I|}rN zbkWTZe4=WEA#so`utKWt4?qscQ0!+%j4Xi?|JtGsQtj|nroim(a`I}JY}i|f0+r1N zf%=MYjIw-Fr=>tIVccDkhP1`On*b$X^OVNjKi28E%Ulh|3M)SwpjX6TpH5#$xdKfo zHVIn9%ZOf*i@4iHK@W26_5Y{<-y~Ey6d8;z<&K z3a=ucUw|{T+g&X}?5Y>X>#=CN1$F*gGasYZZzo65>3XvUF*&wVvSEizr;TWa+)0cg z(Aiw9_cauGD!B5%IXUWuy@|Jio1IE>cj}Nf>jk zQC^DR=6ky1tHl%#HsB4C`~N;F=UTJQ$eA*ypPaj$Ss%*P)BAe-R!#RJp|U+7|w zP5rE4_U3ZEn%wBTL-7fYgzTa@FqZ}P9~v?UO>5Q@2gAxTPOV01ouDB74_EEhItS-{ zJ^JQiK4Rvb3ukzu1u3>$^Q9km@&t%!$Q`nmeXT?8FCKv0g|&M7NK`{je;SV+M~VWY zBYsW-VU+EiKtRjPiaF#;gSvg(1#`HAY4)eR^@_OQwOZCs@lxL{Rm*!nn46V4y!ncfdf(%L~6-_O*v?3A(*Wmq3RKUB92%X{k2-b zl+|*$1GD~>tAWg2(=>(Z=$2HH38Kl z_cp>lFyCC%q*QlQnJ7xY2K~n&eLGL)sS$ zJ0%||7d!y$$qlB%4gXo{PfF zROZ1L)ZFS!+?`L8!$|QZE%`>FmZ^U;=toit^_ZI1NdzMwys55<^(`_LuQTwnS)K$i z=vy49amyuuN2j@pT}r`r9@wUN*-#2jJ#_z3QB82;-8L$iWOgk%FxKyhR1Fv2e+nuV zt~H(>zXj*J-QF}UG8*A^B1!j>)QH0H_LH)>|D;bu1GDO(E)W)izc6Y2&>%Z?rBsWj z`t|k{(BZ__daYOMnAz&7<@SVkWo0m{xmW~~3|WFc%V;Z9RcXF=T6!u9dMb!e>Ta_P zOPQ~LapPX`L(1^^TYJFx`}fPjrF_iV2_Opq3%1knGg1KPdS`#J!3(GUhzClbY8hY) zzCWTOzJ`mzzMx<#jUufd&{-jTHK#v~DQJf=1@Zg!3T6qiHi+VLGH=PCsnLfuDDI^ljgHG-0-8>Nbo6D zv}Nv-#kDuEyXr)(+yYj(->j4?BzE7ZEbdV9D`c7idN$~~riTY-25vwuQ6$?w*l8aIyqAr=Y_nie0qXrT($zV$w8OF=WVYniN9$?6Kxj0N``Y0f-b1 zkjet^GP;5VH|^^h`J~>%fyCWk1PsA8kwJq%%h4zYYuN@U@A&1i?p)A(*?M@SpVkR% z#h1{AxIGTS82dS%(>OX1wPIXZvr5NvJwIHs4X?`WsE3mTse%MTFr9zr;^l3O z%!U&FrW6xDBGfbtXA_zTEzIN6(3*2L33L&9VuXO%3BrH7O%OPMlHZn~dh<09DTp+GhSHBcPw0Yh3%BR|{0 z3}dc`*%uHF=tX(Qn|{zrxa4~=h?#CnbR=aj@l;ZTEft|SGzen7)EPg8?jxf98!;CSMb)ewjUEMG7M9p9W0+Fv1}}OU*r7e?$L*Yf@5C!mL|YM0kS$l2W1~0YP~jm+ z0mLTv?~gY!`zpCCMP{5@LpDaf5?f}*=L_#tRL@qvjcPKq*Zmx?C0k9;kz1-aBAIzS z59~g?ijL>>D)d1!;}f}Qs!zGtlP2E5$Y}e$$NH62BSZVR+JHeqZ`WDENSWV?ezs$} z#oY^j)*G0!M|NJtlo0Ax*FNhC*th$mw6Xj+X_ksG>GkDVTl*@*_ zkac~PZ9EqCnw-)7+*nd4Mwxa_4lY9vJXH~BFaJUd%j~W?%3_=qa-atjX3N$p1f#D} z1)t&dxSMJEn)|gYr7`n^|Di*BtXm|yzDyCMc<41i2H~#ls6v1E8rZ%@0OUuMLof4H zwuN>DC(^DUD1wwjL{k-Cpgq{b9rh^NNfw2mLYv66be_1^1WoR$lM+zXi15L}7uNlW zn<3^aW+)tlWxPH^_LTYRJHYf&_M$!$Rv0v zoiP5dYc`1Lhhl&_!b4IeIu4LEg6OTglOWf5{|%j@!o{&AEOU{hAbnk1Vpe;>cQ1LO zmyX(@N{)q@T^309<#k8LSF$#G1q! zUyQb(LwSO$kd#T;7;w>9O`tp(Z5zJI4jw#Om+|p3gv8oH2!xLhlU;rD)>}bI?S=%| zx(F_d_;FiN;+=^4U^LQiC?J8!pa;msR};*5SFT<|fdPrP^(sSO8d73m8pV(-_+jTl zfW7g=Ha$U{4mhwV#NLiFs8a-%&s7E4s-bxn8dZHX~W9u;l?R=V4 z0x#$vIe8F3ozZdYU#K$ypbb08C<&QCu2{S<3u>`tCW+@zoTOml{xmPH{hTMlh4Qh; zD%tnT(IGzfQaaF4zoQOfS1I~RokX(^y9ovgTu=12!BZRsNJY#Y zXKcL`pQ7=bPL!fJ`JDl>za3jvj)#D$uU2E*!PD`W*ByE3gLJ+)xioTH{Z>f zk#6s{B+0|Z;jJi?Z`M!(Qf#7>7AdEJmx(c$I1%zi!O(~)#_{O?HtK@UUkcW6pFFR+ zWL#tuD4`z!#sF0Ne1HUwp@BRiNNqw2v^DxM0VI@^m-(@nS}UYNpW%GRR@ zJO#Uy1bn#`9y|r+%g1UcxU52TPJenzHOsv&x}@?<&;dcEAbN2=m(!1-aC&O0i8(!F zXDda9q{^05F{BJ-xMYGNniuHf3eJz;54_ArXD-t|E-%&pD;z{dobi(u1m zHMknVL`sGt*9GmWy?7`N7V3`HP(&FjKZ^@wD8Z6cdUXRoDdEFZtswXoL&LcH-ll1? zR#Rcz#pDyPBZYUC7BumGFNopZSETx}e5hwpP-rv7LQ`H5E}{KW0peSkb7C!8vF3yCPs00NSQKDq=cjD1)o$(3k|-C> zHV5}wdp1hQ-zlBs92UB-+9)-Eaq7l{RN7zRcnG~N?dYwiCgL%!+|W*}Mw#sv6$a@G zF}();oD>|lZdr^+a<`tBLeF5pN!wJ8Yi@2zkWJc+W%6iC{0*$JxMWm&?%1f(Od2kh}6p1!x!WUi3aTpiA1l(BO2S%^( zY8$f_t-X6q!)x3-daYThGH=d91F1%~q>oeBkNpp@EfG*5RSD zb>Mp2Uzk)cwIh*!uO~QGI4~3Dg!1gHXFO$IW7&kQNFbb9S7)(%Hl_TCZY7J#*au6| zzQUBrvN8$B`h6C1`eZZwR@=1?1OORi44S%Op48BSY3*g>AlPlRT94}VVhmPA_vP1= zly|OLtk-hwY_VR3)sBc5A=oo+Hht~Aa*)Hh_BRu6ZXe3#5Gk4qIE!5ukCwY0uu^?lj~~8$K?D)7}yjYpAgv14yhT8^LH`r+kPD zb7LYTb#5%BaYvt&O~V3iR6&G?hMR!ny5jVggO|Aza*vNM?Wuj}%vQ zVQUwiYGj{07I(Py^grnTL1yR?ROe;8BTUz60bmSVU_yMZyr8fO?8Q6OG!3f|j78NG z1g7nltA``DzZ>KeX3xfboK`L3F6@UN%_gEG3=C_A9E&hzglzSMHY}x(kJfdz3ikbJ z?~Vj}pc_yE-^|CbujT_&LGE<|*|I`kthVIb`eg@AC^4LmagfHXiMY$$o^p66)&g8_ z)=TD%G;)+K z$8D`?*r*L@`cJtWf%7M)VfoaJCns9V$RW(q9y>f9Cc>D0_z?r~-^$}t(d5o<-y}7G zvR6q!9%uPd6?g4jOQSx)HsC?y_Dyo`ayH`nd=RUZ+me}M9c@FCd5i_KOuYZZKPmjA zwLcukFaLT<^-VOHu^iSU3m(YCkp%gYssrjz=&H?TFdP+_}Yx$65aifNI8(x8+73n|4HP zgc-U;;;oszMy|vg&TkYmT-ku7;a4LSpM-_uj+rVNUd2f7_SABFQBtaeX}WBJScAgA zGkKSwOmbirK0h}L9(iyo@XMWi7R;f=WuqGx_Wnb%*bF8prhzU7W?LP1;HnUT!mSHX*WhKYC`X!mwYYEM1U#>Dx+=ozMX-`^C|qjsb0u3vMYvk7 zfRQv`D5~V4-=ZjB)jUA*izRfuY^{SEs=ZYXV3FU-`mqS{FFDhaO^uo0?>8O;XF9{* ztV*(hBf;>_q>ei3y(bq}XV`v}10NSWQLNLVkxbg3?@~G7+2%x1Q;FkB9fr{3-}D8E z!~@-M2w+fzbB)Ea)r%=Rier6*!E$m6D&BSjxQvn+af><2Wo;y^&FcvJ*Nw)UC`1b) zj=R-Y(vUypu~Snj*$`c|F|2r-2~~b>jZ_mtCSp>)n(hfR-wQEZR}%AT+cyru;~P8C zfZ+u%j_^PzfBgxRvHo!K6<+&_&@vBrc*M~x9(0~B4@QfA3Z?fap9l& zdII&AwR)o`5W)_<+VPYc^@w8{!$0R zLsdy(_y}%Ke8DL{iY1nS&!wIS*RC6r!pq#ViWp|Xaej(pYLW|I z?9lC?`>XfQ1A-v9=eEQ{q_(k>hENIZ5^%T-ETDc7pS#=kt9Z`~Bt6OPuR2JvQcTI* z2ll}d7{CU^6@|U8E`=JNbTrPn^QnXGYwcP&)YgmJD7X%u{8W-%B~5`na=w58!`kT; zh%jG=2y0-ET8q-_FXURzetlZ1UdWZ%`)F7_EF0)#yjxbmg3j5u;6gaBd;&|W`xNFI zt^8ci5eL!)NGp%=pQzJ2xDOcypWjdwq}qM{AJ^qfaF!Rx@j_ z9Jq%I_C6Kh@yDK$uTLXjnOmf`(C*~!8s zLZj?lfnjK`ND*|V9G#rXq29f@7$QUg?TxGF0a2XCzW~5$TkBNY3+*`2Q@dI5aIB3x zgD(mno)aMxx2EIx;v?%-mjplzBR@nvg35(k;~KZ@HfV+(aTM`HUquTn>1rqeK|eSK znXy{^spBFm*5k|WvnTRV3^LyVonSN{siwL6iYNsUeEgz2LV+*2S-95o z;1?`T;ed~=gVJ%YF9IWjmGUmeDkcc^CSd}U*Se^-n+LqI4XA zUdn-7Hc)^*qZL#9a;%cs$K@InU@bh0ufs0G;Rt_~(I{MJ@sB#9G(F|aQ<$n5qDNdA zlXB?Z_@z#&432`{LT#i1=h1_cdzhvar&VEUP|NY1T6vEEMIk9tFzRl|*G zQxO}UK3or#`^jjn8Xbp!^{Jek<~2Us`yk?!Z}h;5X|_u&xYl=GAmz~caPuMr*#(O9 zLPB*HZA$R z@2U)%D5KAzHOZ?&yo3+M7}{tWt1Px)R;n6{e)i~LRIKcl-OE`|v(N}T5nWcyJ|QDh zf?i`iMk%1^GU7rP{1>?(izE4Og$co4lr(b)yw4OJQc6+{lAiAzGjYO$l%bs6A>h*1 z-j0wAs63P%8OHg=9=uDRKdT)6%*pzR!?R;A^XRX`H4rfx*R-}X861bl{g*$%qGzn zFwX?abeab7AzLki`m`-OGOSw~_y}_Y<P*NV7!>uGYCR~RohVaD%sGih_(4>yaT&=X~=TLQs!dyTypKGhrY4S}>*dHIN_HysnW7l&d*Axq?0!I~)=L zvrcayI|e@!&XweAxf||h8raZNf=8|PySe!WIIGPl9=CCV>~Qwqle$1|m1N;@ z7oG*rK&wgt%xt;xX)A zLomOX2`A(P2y*`*y@s?<7Wc2&4@Pxn9Ic8V@rhWE-Qb0E!-f_?9N3$Fl&=ED(ec=# zB!q&Bg`lzX{CYit`2j}&P1@A9*-CEz^Ha6~T|ys{aR6M42WT{7GJ+ff!zmm6Mv4iH zN)GAx>ef@hL~HE0ERvLikr-k|0^7dJ(GwB8xT%%ih_Q~S32Mo9+#)sj$#NI1%^W8R zS6;1VDDp+ZiEJhurf>0-9Phqh1D0W}EpEJ)PkChu<`G9rK;qfosZHE2c?$-zYju0r z6Ch+qVXrSuSz6(iNhWkX;tT15pAGPbsPWNe4{YC5+@f!D?vONJWRN@*q&85qcy#R+kj>}tj^(j;|Z)sa<2-{?29AGy= zPOalxaGGFwDm{K^w;CbhK;7(k8+|By8mIu-?YnEJ7#J~Rf{t{RM{_jJGMl2J1|(IQRF8@pcNS_jU`x<{&!K3JvK}P)(p|( zL4qt4rhAQaV-TGuFXc-8Fs)Rr;Jh|LlWqOnw79YMW7)clc_X65orR;PI4rVRvL7Sc z5TQ#9zCQhI37)R}C?wpyYYd7_Hauo(+=f!EMtp1AEC*djau^w2ghEp>%= zW6jhDMn&nQ3!BN9AJr&^3JhI*s=33)16q;NhNl|PMf{Twj4`;m`n~J^3 zje3;3JwJnoZ|s*VR-$I^W~tKe^Izg=BH5vNm&(W9!T`^g8uc)F%HViNidySQdt#d_ zG2r8~R{0rn;M+eBpbp*Q6knSFS!)MnB(AiXj2MewZk(;66$FrX0Z zIMFIz<11_H(NGBTfCwL{t1RrHKo%%qJsFiMFD39aIf(&Iir5d?I!*gApYa8_m}V_P z0B7N3v08)py8;r!GdY!EFMnK6GOeen3A84-fJ$o%OmkmE0yS*NA4K{R(@dk&_ia6c zbay)ud~p9HnjmZO7PyYnX#t(@JI6{D)~qyMOI~OexB6K;RVIumE_;&QrHckv7Vj@= zU|+6~s8MQ-AEuYmsXa82``x>G6SqM!d~&jTA;dN36|t70OSrn-_bU;2b7tN9YJ`2| zmEeEE_X2UWNBU$P3SU8!*gM|FePQ;BHJG>4kwQ@aZ))26y)+FQCJ8;_(p7kNipjyJ z)2{s#CGP{MqXfK=ilU76A2mS6lp18h!?Jb-g+WSfK5U)}En<&Ps5pv6$#}%qR0Iy6 zd;)i*SdMW#R#MH}0dnMF?${~-N4QSMl@RyJr?J3Ol5!XzwS6OWC9DJyIF&y}{S)u3 z$Fkyb?ujB3`2e`nJ+VXzVl3T)kEI~K)aS=SX#3c@s3(XSN8NCEu*_P^7mG;D*_t0?qm?;Hesz&?$J92BfhjpeJkyS6vL#<}fB6*0cua^oQ~Zlxre zOit1mDP_R~WHCROD@D6-;hrnS9Cp{whcczWjUNnk;zAreV#=mV5fc#_=G>aN;njw< z+v!2~uv`L0d8tt>D|n>!7^B)5$7&2-gn!}f>A3%qE>$rY-cs}p=IoQx`^Z-Y&bgzz z0TIc~ji3qpWIjjA37EY23)mp`4f7zm@W9jzh0#>>IEZrPO3cXr8@yv*@&F;j+2(4H zJHNap2Drd?!t1hTV5AgM#F=rPTEbB^gb9LY>T1~6XP^|d+B0!K6KpwwNa+iwV9$rb(5k$va<|+4lH; zNxPE^oxd3x1};Hv5&wi*Qmj`B^^7m&OoJIIIdF>?A%`11m4t#+0s)5(xohWbyqev5 zB@7>CAh2{9cRyag2w1Pf~+S9a0 zi{fc+uRQ_%0*jJthSA*)ixtebRSvac|1P9j7v<6O$X`9#4F6o80dCrl-a)7#Wb4pM zNj1d|w`%{vgIXJ|i#L&yQ5_2A7GmH%-m1c|?;%-@G(i?edjIGwxa7j$-$ivYN$l|y~<{Uliy9*)vj(1PInxb-mOXuCkL~#ACZICI%RE)Xbd~)h(ab3T z4z$s)s4<_`*@M$-KGKX)P*(PP*_k}?>ff)K29l>A!$UbnO?sHH{}tv9bK#e83fk)I zihK@}+w_#nm48;~kk>xrqzp)L)1Qcu!0NdRTuBh0CO0P^Kr(9y9tKtn$b-;Ayapq> zmP4Kp$<*=K!-tm&Y;g}1&N{uu&h$9G=p~>GFtCdA(&hJfqDbf~q+VX`4gGFi`yF+v z!(WkWe8MO>_Y8_hyns{d-bqkakZB;7_U1pj#*C42(~Zo)MA&LC9JsB-j?aD!x>7WP zvpY}3p`&h1K&D|~>-cza4;sT}i$m}~c84@H2Ubye!kG2q%9t1%kW6Tc73-zO%ZWj$ zO!K?ROFaOFRU1_c10mPv1p)@Kf#QrpKTOsYN}JfCgjvbl_HrdA^v@WFFvym+C{|(C zwZ)F!xomtk}I=)k+UPX{M&>McgN^|m_HU|(XVr!U>fQ%?b&Yz6%*qegnc1ROE66jYfu z^U8P`8j9LMJt>Xv>K0d~-2o+qaJ-1~nmF7H7cer+mHU!<%opo~vw+>9`$=oZE4k6| zmzX47n8JG({|14Ai!N7pU?2Ao%e+q2p(!P4%1&TsNxBtyP3SqMWvHlLct#GO?)s%i z@ao7wf-B%y=$vpLUXye61}Hx=`yEnvREM)k_OGP06Trq9cSyw>j%jBKWJu}Yv==BY zhV!NJ07Rwnbg=fbV6RaWibd2P7X?zmQ&Kt=2L`gbT&kWc9}T1Jd?T)`;_T+&I&-$)1{VUC*aN<#v_jffacN1AqOE9;`Tg?5K$-}>9+Hq>)ja=L7%hqr^+>M5`Af^W-bKV>e z<~8bn2SM!jZjln$Fxh{0Ho}yn#kD`O_iiyGz8Kd3dX*!4+u%ImvC5SLSf`cQFzGN* z#gUe$5?c@x?1-3*5-KKB`5YsI> z4ZVU$S}N_sKAB3c#EzH^gk2yJq-S*3Us zA+QH0gdiQ3gHy1FSgny3EaS#mOrN6o5xh_;9BL&8-k_|x3A{Nth}KB~s_JakdVvnw z4H=`m%$g?~<9zm|C4iLUQYd4Y<%K%w96 zQUlxyNP2=6cn!@lSmut;y^O?ejbE&xEJaZhv_9k?$stG%41FM`vhNl!DiGY%xYb!3 zn&!vWRp6y8U5Z1x5O&3>yxRc?rW|D0!Uqd+HME@FB3>6^X9o?f5zfgrL~nSt*vQ@Z z02shZ$7o%U^&NrW?@u6l55wXt z65;Gmr!4l=Xn>wQ=W=8nnf;mEFcM+^ln&))DUr;L(c)EQyzIq%rR$J zakZblbP?Fi7`R=n$EeU-bU)U$mpxn(fTRA6n!$@61f8_*yL71b`I}&)zSc2c%Z;H- z3?gOg;_Tdsxp)lQy#6o^I3IUsaYKKdUdxpozwU_eU46%u2f4GLQYtHfLpw=IB0suy zvKZy|T`NH=JZK)2d}JB?U}0>re;<31;}C^1UaGOyqg34Ml}qzrW;P&|1CqU9*3$1K zO!QGMm}%O6_tg<|-tsvcS=|q)`qO@ExzU3YD{dh>7c<`gv5XtWRul;wEw22Iecy@z z;`VmHP+?{QZU`KtKk(wlvgvqByYJgL6VMe1VKr<4b?smNhpIkhsm#ZCwM)8QS;D>A zJ#sTl!>@;^EAqvn~T}2hMM#CVn zn!EQe#ghqxZ<6Xk$zgMGap(GGaeQm{WU0EC*|zN7#kE@vy#bRLo)Te5e)196QG1~t zOrrewA+(#_Wj#jF_1`IBpuUSn&mf}4gJ`6b)kxkRH~;|_J6Y^M%Xa>kNZ9F67J%(} zTC@=-qrK3$B@RWI`FBwb>t*U?m|3^RYyfCKf68F5--EIc1in7ZC(u<^CM6NW`hePH zZN5ZG!0=nzP1F!Z7)zrtaMGs5jlF$R;QV_tcsk={B@WKBzE#suZzXVlo$F<57#bzU z)06fXk%!vof0LR-5!iE!O7Mac?<7%(Ruy{NdtF4F&z9yvrF*gHsU;-omTVMtUq7pO z3AU6*Dp+*~Qh0=TZMGg(!S}#gts`1+F7+C%{s`mDr@W?znEjDla{yx^?ou_BB5wni zYYz^@!z#aar|JLcbvrcH<#(F4Asj45;hS+-uAYs>$d^*Tt1C98z#~_b(EM5_@si4! z`=ab%>ei|OSupCYKQ1W;xBXNuMbTz|!x@yRpJ)SqQSNIKH<;79xS>Dzp9t~XZn1)E zBQBucY;FB@W*R2aNfE};uD)5n7sxOhgEa-THzG;z+{>J+WGp!lcK-qpvwp)CJ@oW- z?~BLQ`p`%Ab7g9y*SM^6-UH9_(c-{p_Sf+p7$N<)o)oNNZ8=IJwu|7D4SzuD#;uh-$G6_$OHk-IznaKhY7QH9A=*)g1 zN-o>MGljK&FI_}DY+sYF_8J#z>q;unL@_X%z%c6vc0<-B zR>+hlyQI&S(k3ycxj^jO+EUtBB|gx?6KOg^OtRERu9`}HR$f%g%0~) zzXT+~v`}=dG$x|U=o9yPwiI*8EmXw@b4Q=erj(D4L%cwDsf~l4sWy!M6&e72{3l+q z9xby0(D1-~tDOU;=V)nG`vkJ-zF3{KnYm`yTUBc3!AVnSE6;{YR%>=e{O%cxl7$$> zJ2KdlyC!)!6^{;pUoU>-VFgBfm_eM{EBM$y>D;19b>Tx0-(B;h!&AQ8o@mI^N1b?n z4BhKE$*Q3jX&rw8X_zthnLc$#s~=zO73#sV^R<#u(&{NX`sEa=Got_2QiVcC-B-@Y zDOIjWwBD-Q&(<3uHvpE=Ifzygo%7%eVwY&8-aDz~qpKsO%jKw-Y6`0KD06G37LXYGD1hHqfvVHS%J$v^Bp{=8K3~Eo4mRB{0Tp*^pDNoRKi!W|ZglR0}=w zt^u*ocg6;*CuSi+x%geDN>@(22ds&nOSHbPM;9noJ-+gT4n%rn@up(+?g>!bp7*UB z`MRg?G-~@HK9_RP;=Yq8J&7Zm0_+VC9?A1cp`yFh+8aqM`a6?g4Y zu5`uW6K5T9lywC^i_U&&seI+!56k(>@9@kz{xbhGu8kGP{r0b~<(m*_A%6u=t==HN ze#N0G{sRARk)Pc%ccDDxl}E1N4H)&K`JX%W`RnAvEuGeL=Pa0UwZk{V&vs;A^zlU- z`DU~ywpPni=QPtO&b{`zTKU3XXI#(M-LgCC<@qz6N94mHl`;|Mrl(i)AN!}HFOlcQ z@~+^oKq*S1;>(B3lJCXm+$*2;`0OHi`s<6bZHET_u2sg}M`kVmzqQTbFZ=s3H}OT~ zn)w|5=%*jJ4L`Ez)to~8hn@>!c{Hm2pVkt`o9h&_MNUa6xgEEi&$^&jk-WUelRaXl z9)3BDJ0wA7ojlqeGrX1`g$IY)d=c?j9MdUAzS*je14Hv=QxB|J#TOyr-7Ge0Jo{n3 zVHZ8l`lI;y8sA$xpe%;_^1(H%IQ(+MeB?h|JeOJrb6s6IzoQJlYYXqN|CzU%UxiN; z35Cyp>@ovY`M29(eis)Zr&jN`^lHBCzV_Y{UTYq=dJW%>PB8I+BmGLvFI4_4JSdel zCazW(4?b)i$D5FAD!@J)yG;K5?;sHV3lIgOSf0tA9j_tXbXZyEiXEoX# zM>-90|AEeOizZq$4>U%^i%Qho2d&aLzE@k!kK>x%Kz%Ccebm?$c@#waz&6&g=A}^hak^=^E7_!KYyJDSs&c1RmpFx zixtMBcQ2kS4@Tb`<4RM9`-IfLK7(e6Ck>1JUZ2Tekm zR((&^eDPMquUYw5GGJ`$`Y9|FBgJE)`72mMaK}@l!NkSwH}Xv7jqh1In#2;_ea%?1 z@C?-oQ#9jF1Oos~15Z<(D%jK=t51qGCi##5!iG z^9G(N;Y_t`DU}DmD;|cx{)G3FFz{o2uI3PTS}v+zp%u53S8_)yA^`~6ROK=$(G7zwX` z2<`!uYoACV7B8PD3xB^)swHk7YQG+#vj4m#sbu4eQVAX$Ur1}g@ZA^R5G&OKgt0ar zo%Q}4#6tN#Lzm#*Ye;r(*{QLyo$Bmn_2+$BGwrl>ARR!sQ5U^eBIj1Gheip)$lcbXtWVcL71l`(w$% zC|~qSu}_IkOCVLb_$5)Rhs2-qvC|~3ON!t4t=nxvn6uB8q5$GubQ))aClW?zX5238 zb1OVo&bvbkD9XD@?6y6dk&LWMTE?R#9hi-p8jiV4wEKUWwzyD#YG42i+;jtt0G*8}-nXje|O4jbXTP2F}nQOWF+xj3hE8?GdBIp zSwZCj18~8Tifh%_0U{TVXErWNuRFzX{#BiC{IMX zdfk_ZY1r#@wAvrCT6mrQkW&+!(3+(+_|8}q04+Fz<3m?lLR{w-4yuCC%q`uLOQW{TlWU<>_ukX&NC}yA`~PPChb&Ce;qg$jq-v ziPS2!M*VfQgRK7WxokArzd&n}v{VZ6w7+Sz5h)CtWtCE#Je$4r~MeclsGhGlOK0mnMe>Lr%9i2QE@>DeQowykr>V-y*uJD z$nnRvwIa?(Y)!Uut?sa7NK5X6WUAKeLeB7Epdv{g3pLz7G*P3g7Zz)*s8^F#uPb4{ z*`?}rQ~6;~vl}UK?>-eim;*jV!raP#9X;3Y603=mY?-drsGpzdw7{1qc5@9j&x1v6 zYc-br&pu8Vp1liFkr%L#r4#Rg^vY@1r)tGlv+Vp}#-VRVD$2SV<pZzQy)52-Zf^pQ_GZ+Zm=8llhS9i)9Vg0Gx-q|ApFE(kN)KUqNBmXmG~g$ zzWK=pJ!-g43US$RqPnxX-~xzGuG3?Ak1Q4uCH;r0Y(7P%B;Xc+>i(^hp`4wbk<4y~ zBOXbcBaa8q&lFOxy&ozDSr-hWoOBE90+SGC>l7ebdFa%Eh-ozN_Y^yS_*bu#y795u zhO@a%UXw&odr&kS1G)JWbf27pt8?b3l%?gdQtsbgW0lSzRAHFMbPsoNQ%;3=1Ea4S z!%tm@E{q+N%m(V_R=!TL&SIOHl+1Gkq2=5X5lsxz3W2G^Wdq3Dk!W6e~%ylKIw zOu`E}AL&!puD5ls;C(@liO}0D_#BiV`G?pALvBpec2n0qE{9;maN{vTr4te-4?zJ%1L|`9&WKcW zTNex=WYf^m>8mo(^TV^mV(eW=tVlxgdaYQU-y>Blk&|c3evv*rPZ5gTAx@j_ztfus zliiZaDs$F)#6J4)-E?a<57aDjg5&_jV(D+W`SMsL9qVs&eBC}~jaNbohd3IId^@f{ zoKZ)aLF-#AKKO6}KL{_l)pMDQt#8U#A6TPBI_{@zW5kCkg!!wU4y1a(ci>6eTC|Sr zt<+3lCsKB9p;1tqTbmcF6UR>qornypKKv`x*1x+U z*~A5bBdp4uc#hyg3t9&&Y@)_JyN_4H1TPrUl3v=Dv80-7;ZL5kb zcgJLf9^85c6pn&dQ?=rb87*Y#S~hIb^;Lr(k%hdtGtEPfJWWIB@9m=1h